{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.merger/index.ts"],
  "sourcesContent": ["import type {\n  LockfileObject,\n  PackageSnapshot,\n  PackageSnapshots,\n} from '../lockfile.types/index.ts';\nimport type { DepPath, ProjectId } from '../types/index.ts';\nimport comverToSemver from 'comver-to-semver';\nimport semver from 'semver';\n\nexport function mergeLockfileChanges(\n  ours: LockfileObject,\n  theirs: LockfileObject\n): LockfileObject {\n  const newLockfile: LockfileObject = {\n    importers: {},\n    lockfileVersion: semver.gt(\n      comverToSemver(theirs.lockfileVersion.toString()),\n      comverToSemver(ours.lockfileVersion.toString())\n    )\n      ? theirs.lockfileVersion\n      : ours.lockfileVersion,\n  };\n\n  const pnpmfileChecksum = ours.pnpmfileChecksum ?? theirs.pnpmfileChecksum; // Install should automatically detect change later\n\n  if (typeof pnpmfileChecksum === 'string') {\n    newLockfile.pnpmfileChecksum = pnpmfileChecksum;\n  }\n\n  const ignoredOptionalDependencies = [\n    ...new Set([\n      ...(ours.ignoredOptionalDependencies ?? []),\n      ...(theirs.ignoredOptionalDependencies ?? []),\n    ]),\n  ];\n\n  if (ignoredOptionalDependencies.length) {\n    newLockfile.ignoredOptionalDependencies = ignoredOptionalDependencies;\n  }\n\n  for (const importerId of Array.from(\n    new Set([\n      ...Object.keys(ours.importers ?? {}),\n      ...Object.keys(theirs.importers ?? {}),\n    ] as ProjectId[])\n  )) {\n    if (typeof newLockfile.importers === 'undefined') {\n      newLockfile.importers = {};\n    }\n\n    newLockfile.importers[importerId] = {\n      specifiers: {},\n    };\n\n    for (const key of [\n      'dependencies',\n      'devDependencies',\n      'optionalDependencies',\n    ] as const) {\n      newLockfile.importers[importerId][key] = mergeDict(\n        ours.importers?.[importerId]?.[key] ?? {},\n        theirs.importers?.[importerId]?.[key] ?? {},\n        mergeVersions\n      );\n\n      if (Object.keys(newLockfile.importers[importerId][key]).length === 0) {\n        delete newLockfile.importers[importerId][key];\n      }\n    }\n\n    newLockfile.importers[importerId].specifiers = mergeDict(\n      ours.importers?.[importerId]?.specifiers ?? {},\n      theirs.importers?.[importerId]?.specifiers ?? {},\n      takeChangedValue\n    );\n  }\n\n  const packages: PackageSnapshots = {};\n\n  for (const depPath of Array.from(\n    new Set([\n      ...Object.keys(ours.packages ?? {}),\n      ...Object.keys(theirs.packages ?? {}),\n    ])\n  ) as DepPath[]) {\n    const ourPkg = ours.packages?.[depPath];\n\n    const theirPkg = theirs.packages?.[depPath];\n\n    const pkg = {\n      ...ourPkg,\n      ...theirPkg,\n    };\n\n    for (const key of ['dependencies', 'optionalDependencies'] as const) {\n      pkg[key] = mergeDict(\n        ourPkg?.[key] ?? {},\n        theirPkg?.[key] ?? {},\n        mergeVersions\n      );\n\n      if (Object.keys(pkg[key] ?? {}).length === 0) {\n        delete pkg[key];\n      }\n    }\n\n    packages[depPath] = pkg as PackageSnapshot;\n  }\n\n  newLockfile.packages = packages;\n\n  return newLockfile;\n}\n\ntype ValueMerger<T> = (ourValue: T, theirValue: T) => T;\n\nfunction mergeDict<T>(\n  ourDict: Record<string, T>,\n  theirDict: Record<string, T>,\n  valueMerger: ValueMerger<T>\n): Record<string, T> {\n  const newDict: Record<string, T> = {};\n\n  for (const key of Object.keys(ourDict).concat(Object.keys(theirDict))) {\n    const value = ourDict[key];\n\n    const theirValue = theirDict[key];\n\n    if (typeof value === 'undefined' || typeof theirValue === 'undefined') {\n      continue;\n    }\n\n    const changedValue = valueMerger(value, theirValue);\n\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (changedValue) {\n      newDict[key] = changedValue;\n    }\n  }\n\n  return newDict;\n}\n\nfunction takeChangedValue<T>(ourValue: T, theirValue: T): T {\n  if (ourValue === theirValue || theirValue == null) {\n    return ourValue;\n  }\n\n  return theirValue;\n}\n\nfunction mergeVersions(ourValue: string, theirValue: string): string {\n  if (ourValue === theirValue || !theirValue) {\n    return ourValue;\n  }\n\n  if (!ourValue) {\n    return theirValue;\n  }\n\n  const [ourVersion] = ourValue.split('(');\n\n  const [theirVersion] = theirValue.split('(');\n\n  if (\n    typeof ourVersion === 'undefined' ||\n    typeof theirVersion === 'undefined'\n  ) {\n    return theirValue;\n  }\n\n  if (semver.gt(ourVersion, theirVersion)) {\n    return ourValue;\n  }\n\n  return theirValue;\n}\n"],
  "mappings": "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",
  "names": []
}
