{
  "version": 3,
  "sources": ["../../../../src/packages/dedupe.check/dedupeDiffCheck.ts"],
  "sourcesContent": ["import type {\n  ResolutionChangesByAlias,\n  DedupeCheckIssues,\n  SnapshotsChanges,\n} from '../dedupe.types/index.ts';\nimport type {\n  LockfileObject,\n  ResolvedDependencies,\n} from '../lockfile.types/index.ts';\nimport { type DepPath, DEPENDENCIES_FIELDS } from '../types/index.ts';\nimport { DedupeCheckIssuesError } from './DedupeCheckIssuesError.ts';\n\nconst PACKAGE_SNAPSHOT_DEP_FIELDS = [\n  'dependencies',\n  'optionalDependencies',\n] as const;\n\nexport function dedupeDiffCheck(\n  prev: LockfileObject,\n  next: LockfileObject\n): void {\n  const issues: DedupeCheckIssues = {\n    importerIssuesByImporterId: diffSnapshots(\n      prev.importers ?? {},\n      next.importers ?? {},\n      DEPENDENCIES_FIELDS\n    ),\n    packageIssuesByDepPath: diffSnapshots(\n      prev.packages ?? {},\n      next.packages ?? {},\n      PACKAGE_SNAPSHOT_DEP_FIELDS\n    ),\n  };\n\n  const changesCount =\n    countChangedSnapshots(issues.importerIssuesByImporterId) +\n    countChangedSnapshots(issues.packageIssuesByDepPath);\n\n  if (changesCount > 0) {\n    throw new DedupeCheckIssuesError(issues);\n  }\n}\n\n/**\n * Get all the keys of an object T where the value extends some type U.\n */\ntype KeysOfValue<T, U> = KeyValueMatch<T, keyof T, U>;\ntype KeyValueMatch<T, K, U> = K extends keyof T\n  ? T[K] extends U\n    ? K\n    : never\n  : never;\n\n/**\n * Given a PackageSnapshot or ProjectSnapshot, returns the keys where values\n * match ResolvedDependencies.\n *\n * Unfortunately the ResolvedDependencies interface is just\n * Record<string,string> so this also matches the \"engines\" and \"specifiers\"\n * block.\n */\ntype PossiblyResolvedDependenciesKeys<TSnapshot> = KeysOfValue<\n  TSnapshot,\n  ResolvedDependencies | undefined\n>;\n\nfunction diffSnapshots<TSnapshot>(\n  prev: Record<DepPath, TSnapshot>,\n  next: Record<DepPath, TSnapshot>,\n  fields: ReadonlyArray<PossiblyResolvedDependenciesKeys<TSnapshot>>\n): SnapshotsChanges {\n  const removed: string[] = [];\n  const updated: Record<string, ResolutionChangesByAlias> = {};\n\n  for (const [id, prevSnapshot] of Object.entries(prev)) {\n    const nextSnapshot = next[id as DepPath];\n\n    if (nextSnapshot == null) {\n      removed.push(id);\n      continue;\n    }\n\n    const updates = fields.reduce(\n      (\n        acc: ResolutionChangesByAlias,\n        dependencyField: KeyValueMatch<\n          TSnapshot,\n          keyof TSnapshot,\n          ResolvedDependencies | undefined\n        >\n      ) => {\n        return Object.assign(acc, {\n          ...getResolutionUpdates(\n            prevSnapshot[dependencyField] ?? {},\n            nextSnapshot[dependencyField] ?? {}\n          ),\n        });\n      },\n      {}\n    );\n\n    if (Object.keys(updates).length > 0) {\n      updated[id] = updates;\n    }\n  }\n\n  const added = (Object.keys(next) as DepPath[]).filter(\n    (id) => prev[id] == null\n  );\n\n  return { added, removed, updated };\n}\n\nfunction getResolutionUpdates(\n  prev: ResolvedDependencies,\n  next: ResolvedDependencies\n): ResolutionChangesByAlias {\n  const updates: ResolutionChangesByAlias = {};\n\n  for (const [alias, prevResolution] of Object.entries(prev)) {\n    const nextResolution = next[alias];\n\n    if (prevResolution === nextResolution) {\n      continue;\n    }\n\n    updates[alias] =\n      nextResolution == null\n        ? { type: 'removed', prev: prevResolution }\n        : { type: 'updated', prev: prevResolution, next: nextResolution };\n  }\n\n  const newAliases = Object.entries(next).filter(\n    ([alias]) => prev[alias] == null\n  );\n  for (const [alias, nextResolution] of newAliases) {\n    updates[alias] = { type: 'added', next: nextResolution };\n  }\n\n  return updates;\n}\n\nexport function countChangedSnapshots(\n  snapshotChanges: SnapshotsChanges\n): number {\n  return (\n    snapshotChanges.added.length +\n    snapshotChanges.removed.length +\n    Object.keys(snapshotChanges.updated).length\n  );\n}\n"],
  "mappings": "AASA,SAAuB,2BAA2B;AAClD,SAAS,8BAA8B;AAEvC,MAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AACF;AAEO,SAAS,gBACd,MACA,MACM;AACN,QAAM,SAA4B;AAAA,IAChC,4BAA4B;AAAA,MAC1B,KAAK,aAAa,CAAC;AAAA,MACnB,KAAK,aAAa,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,IACA,wBAAwB;AAAA,MACtB,KAAK,YAAY,CAAC;AAAA,MAClB,KAAK,YAAY,CAAC;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eACJ,sBAAsB,OAAO,0BAA0B,IACvD,sBAAsB,OAAO,sBAAsB;AAErD,MAAI,eAAe,GAAG;AACpB,UAAM,IAAI,uBAAuB,MAAM;AAAA,EACzC;AACF;AAyBA,SAAS,cACP,MACA,MACA,QACkB;AAClB,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoD,CAAC;AAE3D,aAAW,CAAC,IAAI,YAAY,KAAK,OAAO,QAAQ,IAAI,GAAG;AACrD,UAAM,eAAe,KAAK,EAAa;AAEvC,QAAI,gBAAgB,MAAM;AACxB,cAAQ,KAAK,EAAE;AACf;AAAA,IACF;AAEA,UAAM,UAAU,OAAO;AAAA,MACrB,CACE,KACA,oBAKG;AACH,eAAO,OAAO,OAAO,KAAK;AAAA,UACxB,GAAG;AAAA,YACD,aAAa,eAAe,KAAK,CAAC;AAAA,YAClC,aAAa,eAAe,KAAK,CAAC;AAAA,UACpC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,cAAQ,EAAE,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,QAAS,OAAO,KAAK,IAAI,EAAgB;AAAA,IAC7C,CAAC,OAAO,KAAK,EAAE,KAAK;AAAA,EACtB;AAEA,SAAO,EAAE,OAAO,SAAS,QAAQ;AACnC;AAEA,SAAS,qBACP,MACA,MAC0B;AAC1B,QAAM,UAAoC,CAAC;AAE3C,aAAW,CAAC,OAAO,cAAc,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC1D,UAAM,iBAAiB,KAAK,KAAK;AAEjC,QAAI,mBAAmB,gBAAgB;AACrC;AAAA,IACF;AAEA,YAAQ,KAAK,IACX,kBAAkB,OACd,EAAE,MAAM,WAAW,MAAM,eAAe,IACxC,EAAE,MAAM,WAAW,MAAM,gBAAgB,MAAM,eAAe;AAAA,EACtE;AAEA,QAAM,aAAa,OAAO,QAAQ,IAAI,EAAE;AAAA,IACtC,CAAC,CAAC,KAAK,MAAM,KAAK,KAAK,KAAK;AAAA,EAC9B;AACA,aAAW,CAAC,OAAO,cAAc,KAAK,YAAY;AAChD,YAAQ,KAAK,IAAI,EAAE,MAAM,SAAS,MAAM,eAAe;AAAA,EACzD;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,iBACQ;AACR,SACE,gBAAgB,MAAM,SACtB,gBAAgB,QAAQ,SACxB,OAAO,KAAK,gBAAgB,OAAO,EAAE;AAEzC;",
  "names": []
}
