{
  "version": 3,
  "sources": ["../../../../src/packages/hooks.read-package-hook/createVersionsOverrider.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport semver from 'semver';\nimport partition from 'ramda/src/partition';\nimport type {\n  Dependencies,\n  GlobalPkgDir,\n  LockFileDir,\n  PackageManifest,\n  ProjectRootDir,\n  ProjectRootDirRealPath,\n  ReadPackageHook,\n  WorkspaceDir,\n} from '../types/index.ts';\nimport type {\n  PackageSelector,\n  VersionOverride as VersionOverrideBase,\n} from '../parse-overrides/index.ts';\nimport { isValidPeerRange } from '../semver.peer-range/index.ts';\nimport normalizePath from 'normalize-path';\nimport { isIntersectingRange } from './isIntersectingRange.ts';\n\nexport type VersionOverrideWithoutRawSelector = Omit<\n  VersionOverrideBase,\n  'selector'\n>;\n\nexport function createVersionsOverrider(\n  overrides: (\n    | {\n        parentPkg: PackageSelector;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n    | {\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n  )[],\n  rootDir:\n    | ProjectRootDir\n    | ProjectRootDirRealPath\n    | GlobalPkgDir\n    | WorkspaceDir\n    | LockFileDir\n): ReadPackageHook {\n  const [versionOverrides, genericVersionOverrides] = partition.default(\n    ({\n      parentPkg,\n    }: {\n      localTarget: LocalTarget | undefined;\n      parentPkg?: PackageSelector | undefined;\n      targetPkg: PackageSelector;\n      newPref: string;\n    }): boolean => {\n      return parentPkg != null;\n    },\n    overrides.map(\n      (\n        override:\n          | {\n              parentPkg: PackageSelector;\n              targetPkg: PackageSelector;\n              selector: string;\n              newPref: string;\n            }\n          | {\n              targetPkg: PackageSelector;\n              selector: string;\n              newPref: string;\n            }\n      ):\n        | {\n            localTarget: LocalTarget | undefined;\n            parentPkg: PackageSelector;\n            targetPkg: PackageSelector;\n            selector: string;\n            newPref: string;\n          }\n        | {\n            localTarget: LocalTarget | undefined;\n            targetPkg: PackageSelector;\n            selector: string;\n            newPref: string;\n          } => {\n        return {\n          ...override,\n          localTarget: createLocalTarget(override, rootDir),\n        };\n      }\n    )\n  ); // as [VersionOverrideWithParent[], VersionOverride[]];\n\n  return (\n    manifest: PackageManifest,\n    dir?: string | undefined\n  ): PackageManifest => {\n    const versionOverridesWithParent = versionOverrides.filter(\n      (\n        versionOverride:\n          | {\n              localTarget: LocalTarget | undefined;\n              parentPkg: PackageSelector;\n              targetPkg: PackageSelector;\n              selector: string;\n              newPref: string;\n            }\n          | {\n              localTarget: LocalTarget | undefined;\n              targetPkg: PackageSelector;\n              selector: string;\n              newPref: string;\n            }\n      ): boolean => {\n        return (\n          'parentPkg' in versionOverride &&\n          versionOverride.parentPkg.name === manifest.name &&\n          (typeof versionOverride.parentPkg.pref === 'undefined' ||\n            semver.satisfies(manifest.version, versionOverride.parentPkg.pref))\n        );\n      }\n    );\n\n    overrideDepsOfPkg(\n      { manifest, dir },\n      versionOverridesWithParent,\n      genericVersionOverrides\n    );\n\n    return manifest;\n  };\n}\n\ninterface LocalTarget {\n  protocol: LocalProtocol;\n  absolutePath: string;\n  specifiedViaRelativePath: boolean;\n}\n\ntype LocalProtocol = 'link:' | 'file:';\n\nfunction createLocalTarget(\n  override:\n    | {\n        parentPkg: PackageSelector;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n    | {\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      },\n  rootDir:\n    | ProjectRootDir\n    | ProjectRootDirRealPath\n    | GlobalPkgDir\n    | WorkspaceDir\n    | LockFileDir\n): LocalTarget | undefined {\n  let protocol: LocalProtocol | undefined;\n\n  if (override.newPref.startsWith('file:')) {\n    protocol = 'file:';\n  } else if (override.newPref.startsWith('link:')) {\n    protocol = 'link:';\n  } else {\n    return undefined;\n  }\n\n  const pkgPath = override.newPref.substring(protocol.length);\n\n  const specifiedViaRelativePath = !path.isAbsolute(pkgPath);\n\n  const absolutePath = specifiedViaRelativePath\n    ? path.join(rootDir, pkgPath)\n    : pkgPath;\n\n  return { absolutePath, specifiedViaRelativePath, protocol };\n}\n\n// interface VersionOverride extends VersionOverrideBase {\n//   localTarget?: LocalTarget | undefined;\n// }\n\n// interface VersionOverrideWithParent extends VersionOverride {\n//   parentPkg: PackageSelector;\n// }\n\nfunction overrideDepsOfPkg(\n  { manifest, dir }: { manifest: PackageManifest; dir: string | undefined },\n  versionOverrides: (\n    | {\n        localTarget: LocalTarget | undefined;\n        parentPkg: PackageSelector;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n    | {\n        localTarget: LocalTarget | undefined;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n  )[],\n  genericVersionOverrides: (\n    | {\n        localTarget: LocalTarget | undefined;\n        parentPkg: PackageSelector;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n    | {\n        localTarget: LocalTarget | undefined;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n  )[]\n): void {\n  const {\n    dependencies,\n    optionalDependencies,\n    devDependencies,\n    peerDependencies,\n  } = manifest;\n\n  const _overrideDeps = overrideDeps.bind(null, {\n    versionOverrides,\n    genericVersionOverrides,\n    dir,\n  });\n\n  for (const deps of [dependencies, optionalDependencies, devDependencies]) {\n    if (deps) {\n      _overrideDeps(deps, undefined);\n    }\n  }\n\n  if (peerDependencies) {\n    if (!manifest.dependencies) manifest.dependencies = {};\n    _overrideDeps(manifest.dependencies, peerDependencies);\n  }\n}\n\nfunction overrideDeps(\n  {\n    versionOverrides,\n    genericVersionOverrides,\n    dir,\n  }: {\n    versionOverrides: (\n      | {\n          localTarget: LocalTarget | undefined;\n          parentPkg: PackageSelector;\n          targetPkg: PackageSelector;\n          selector: string;\n          newPref: string;\n        }\n      | {\n          localTarget: LocalTarget | undefined;\n          targetPkg: PackageSelector;\n          selector: string;\n          newPref: string;\n        }\n    )[];\n    genericVersionOverrides: (\n      | {\n          localTarget: LocalTarget | undefined;\n          parentPkg: PackageSelector;\n          targetPkg: PackageSelector;\n          selector: string;\n          newPref: string;\n        }\n      | {\n          localTarget: LocalTarget | undefined;\n          targetPkg: PackageSelector;\n          selector: string;\n          newPref: string;\n        }\n    )[];\n    dir: string | undefined;\n  },\n  deps: Dependencies,\n  peerDeps: Dependencies | undefined\n): void {\n  for (const [name, pref] of Object.entries(peerDeps ?? deps)) {\n    const versionOverride =\n      pickMostSpecificVersionOverride(\n        versionOverrides.filter(\n          ({\n            targetPkg,\n          }:\n            | {\n                localTarget: LocalTarget | undefined;\n                parentPkg: PackageSelector;\n                targetPkg: PackageSelector;\n                selector: string;\n                newPref: string;\n              }\n            | {\n                localTarget: LocalTarget | undefined;\n                targetPkg: PackageSelector;\n                selector: string;\n                newPref: string;\n              }): boolean => {\n            return (\n              targetPkg.name === name &&\n              isIntersectingRange(targetPkg.pref, pref)\n            );\n          }\n        )\n      ) ??\n      pickMostSpecificVersionOverride(\n        genericVersionOverrides.filter(\n          ({\n            targetPkg,\n          }:\n            | {\n                localTarget: LocalTarget | undefined;\n                parentPkg: PackageSelector;\n                targetPkg: PackageSelector;\n                selector: string;\n                newPref: string;\n              }\n            | {\n                localTarget: LocalTarget | undefined;\n                targetPkg: PackageSelector;\n                selector: string;\n                newPref: string;\n              }): boolean => {\n            return (\n              targetPkg.name === name &&\n              isIntersectingRange(targetPkg.pref, pref)\n            );\n          }\n        )\n      );\n\n    if (typeof versionOverride === 'undefined') {\n      continue;\n    }\n\n    if (versionOverride.newPref === '-') {\n      if (typeof peerDeps === 'undefined') {\n        delete deps[versionOverride.targetPkg.name];\n      } else {\n        delete peerDeps[versionOverride.targetPkg.name];\n      }\n\n      continue;\n    }\n\n    const newPref = versionOverride.localTarget\n      ? `${versionOverride.localTarget.protocol}${resolveLocalOverride(versionOverride.localTarget, dir)}`\n      : versionOverride.newPref;\n\n    if (peerDeps == null || !isValidPeerRange(newPref)) {\n      deps[versionOverride.targetPkg.name] = newPref;\n    } else if (isValidPeerRange(newPref)) {\n      peerDeps[versionOverride.targetPkg.name] = newPref;\n    }\n  }\n}\n\nfunction resolveLocalOverride(\n  { specifiedViaRelativePath, absolutePath }: LocalTarget,\n  pkgDir?: string\n): string {\n  return specifiedViaRelativePath && typeof pkgDir === 'string'\n    ? normalizePath(path.relative(pkgDir, absolutePath))\n    : absolutePath;\n}\n\nfunction pickMostSpecificVersionOverride(\n  versionOverrides: (\n    | {\n        localTarget: LocalTarget | undefined;\n        parentPkg: PackageSelector;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n    | {\n        localTarget: LocalTarget | undefined;\n        targetPkg: PackageSelector;\n        selector: string;\n        newPref: string;\n      }\n  )[]\n):\n  | {\n      localTarget: LocalTarget | undefined;\n      parentPkg: PackageSelector;\n      targetPkg: PackageSelector;\n      selector: string;\n      newPref: string;\n    }\n  | {\n      localTarget: LocalTarget | undefined;\n      targetPkg: PackageSelector;\n      selector: string;\n      newPref: string;\n    }\n  | undefined {\n  return versionOverrides.sort(\n    (\n      a:\n        | {\n            localTarget: LocalTarget | undefined;\n            parentPkg: PackageSelector;\n            targetPkg: PackageSelector;\n            selector: string;\n            newPref: string;\n          }\n        | {\n            localTarget: LocalTarget | undefined;\n            targetPkg: PackageSelector;\n            selector: string;\n            newPref: string;\n          },\n      b:\n        | {\n            localTarget: LocalTarget | undefined;\n            parentPkg: PackageSelector;\n            targetPkg: PackageSelector;\n            selector: string;\n            newPref: string;\n          }\n        | {\n            localTarget: LocalTarget | undefined;\n            targetPkg: PackageSelector;\n            selector: string;\n            newPref: string;\n          }\n    ): 1 | -1 => {\n      return isIntersectingRange(b.targetPkg.pref ?? '', a.targetPkg.pref ?? '')\n        ? -1\n        : 1;\n    }\n  )[0];\n}\n"],
  "mappings": "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",
  "names": []
}
