{
  "version": 3,
  "sources": ["../../../../src/packages/resolve-dependencies/updateProjectManifest.ts"],
  "sourcesContent": ["import {\n  createVersionSpec,\n  getPrefix,\n  type PackageSpecObject,\n  type PinnedVersion,\n  updateProjectManifestObject,\n} from '../manifest-utils/index.ts';\nimport versionSelectorType from 'version-selector-type';\nimport semver from 'semver';\nimport { isGitHostedPkgUrl } from '../pick-fetcher/index.ts';\nimport type { TarballResolution } from '../resolver-base/index.ts';\nimport type { ProjectManifest } from '../types/index.ts';\nimport type { ResolvedDirectDependency } from './resolveDependencyTree.ts';\nimport type { ImporterToResolve } from './index.ts';\n\nexport async function updateProjectManifest(\n  importer: ImporterToResolve,\n  opts: {\n    directDependencies: ResolvedDirectDependency[];\n    preserveWorkspaceProtocol: boolean;\n    saveWorkspaceProtocol: boolean | 'rolling';\n  }\n): Promise<Array<ProjectManifest | undefined>> {\n  if (typeof importer.manifest === 'undefined') {\n    throw new Error('Cannot save because no package.json found');\n  }\n\n  const specsToUpsert = opts.directDependencies\n    .filter((_rdd, index: number): boolean => {\n      return importer.wantedDependencies[index]?.updateSpec === true;\n    })\n    .map((rdd: ResolvedDirectDependency, index: number) => {\n      const wantedDep = importer.wantedDependencies[index];\n\n      if (!wantedDep) {\n        return undefined;\n      }\n\n      return resolvedDirectDepToSpecObject(\n        {\n          ...rdd,\n          isNew: wantedDep.isNew,\n          specRaw: wantedDep.raw,\n          preserveNonSemverVersionSpec: wantedDep.preserveNonSemverVersionSpec,\n          // For git-protocol dependencies that are already installed locally, there is no normalizedPref unless do force resolve,\n          // so we use pref in wantedDependency here.\n          normalizedPref:\n            rdd.normalizedPref ??\n            (isGitHostedPkgUrl(\n              (rdd.resolution as TarballResolution).tarball ?? ''\n            )\n              ? wantedDep.pref\n              : undefined),\n        },\n        importer,\n        {\n          nodeExecPath: wantedDep.nodeExecPath,\n          pinnedVersion:\n            wantedDep.pinnedVersion ?? importer.pinnedVersion ?? 'major',\n          preserveWorkspaceProtocol: opts.preserveWorkspaceProtocol,\n          saveWorkspaceProtocol: opts.saveWorkspaceProtocol,\n        }\n      );\n    })\n    .filter(Boolean);\n\n  for (const pkgToInstall of importer.wantedDependencies) {\n    if (\n      pkgToInstall.updateSpec === true &&\n      typeof pkgToInstall.alias === 'string' &&\n      !specsToUpsert.some(({ alias }) => alias === pkgToInstall.alias)\n    ) {\n      specsToUpsert.push({\n        alias: pkgToInstall.alias,\n        nodeExecPath: pkgToInstall.nodeExecPath,\n        peer: importer.peer,\n        saveType: importer.targetDependenciesField,\n      });\n    }\n  }\n\n  const hookedManifest = await updateProjectManifestObject(\n    importer.rootDir,\n    importer.manifest,\n    specsToUpsert\n  );\n\n  const originalManifest =\n    importer.originalManifest != null\n      ? await updateProjectManifestObject(\n          importer.rootDir,\n          importer.originalManifest,\n          specsToUpsert\n        )\n      : undefined;\n\n  return [hookedManifest, originalManifest];\n}\n\nfunction resolvedDirectDepToSpecObject(\n  {\n    alias,\n    catalogLookup,\n    isNew,\n    name,\n    normalizedPref,\n    resolution,\n    specRaw,\n    version,\n    preserveNonSemverVersionSpec,\n  }: ResolvedDirectDependency & {\n    isNew?: boolean | undefined;\n    specRaw?: string | undefined;\n    preserveNonSemverVersionSpec?: boolean | undefined;\n  },\n  importer: ImporterToResolve,\n  opts: {\n    nodeExecPath?: string | undefined;\n    pinnedVersion: PinnedVersion;\n    preserveWorkspaceProtocol: boolean;\n    saveWorkspaceProtocol: boolean | 'rolling';\n  }\n): PackageSpecObject {\n  let pref: string | undefined;\n\n  if (catalogLookup) {\n    pref = catalogLookup.userSpecifiedPref;\n  } else if (typeof normalizedPref === 'string') {\n    pref = normalizedPref;\n  } else {\n    const shouldUseWorkspaceProtocol =\n      typeof resolution !== 'undefined' &&\n      'type' in resolution &&\n      resolution.type === 'directory' &&\n      (Boolean(opts.saveWorkspaceProtocol) ||\n        (opts.preserveWorkspaceProtocol &&\n          specRaw?.includes('@workspace:') === true)) &&\n      opts.pinnedVersion !== 'none';\n\n    pref =\n      isNew === true\n        ? getPrefPreferSpecifiedSpec({\n            alias,\n            name,\n            pinnedVersion: opts.pinnedVersion,\n            specRaw,\n            version,\n            rolling:\n              shouldUseWorkspaceProtocol === true &&\n              opts.saveWorkspaceProtocol === 'rolling',\n          })\n        : getPrefPreferSpecifiedExoticSpec({\n            alias,\n            name,\n            pinnedVersion: opts.pinnedVersion,\n            specRaw,\n            version,\n            rolling:\n              shouldUseWorkspaceProtocol &&\n              opts.saveWorkspaceProtocol === 'rolling',\n            preserveNonSemverVersionSpec,\n          });\n\n    if (shouldUseWorkspaceProtocol && !pref.startsWith('workspace:')) {\n      pref = pref.replace(/^npm:/, '');\n\n      pref = `workspace:${pref}`;\n    }\n  }\n\n  return {\n    alias,\n    nodeExecPath: opts.nodeExecPath,\n    peer: importer.peer,\n    pref,\n    saveType: importer.targetDependenciesField,\n  };\n}\n\nfunction getPrefPreferSpecifiedSpec(opts: {\n  alias: string;\n  name: string;\n  version: string;\n  specRaw?: string | undefined;\n  pinnedVersion?: PinnedVersion | undefined;\n  rolling: boolean;\n}): string {\n  const prefix = getPrefix(opts.alias, opts.name);\n\n  if (opts.specRaw?.startsWith(`${opts.alias}@${prefix}`) === true) {\n    const range = opts.specRaw.slice(`${opts.alias}@${prefix}`.length);\n\n    if (range) {\n      const selector = versionSelectorType(range);\n\n      if (\n        selector != null &&\n        (selector.type === 'version' || selector.type === 'range')\n      ) {\n        return opts.specRaw.slice(opts.alias.length + 1);\n      }\n    }\n  }\n\n  // A prerelease version is always added as an exact version\n  if (typeof semver.parse(opts.version)?.prerelease.length === 'number') {\n    return `${prefix}${opts.version}`;\n  }\n\n  return `${prefix}${createVersionSpec(opts.version, { pinnedVersion: opts.pinnedVersion, rolling: opts.rolling })}`;\n}\n\nfunction getPrefPreferSpecifiedExoticSpec(opts: {\n  alias: string;\n  name: string;\n  version: string;\n  specRaw?: string | undefined;\n  pinnedVersion: PinnedVersion;\n  rolling: boolean;\n  preserveNonSemverVersionSpec?: boolean | undefined;\n}): string {\n  const prefix = getPrefix(opts.alias, opts.name);\n\n  if (opts.specRaw?.startsWith(`${opts.alias}@${prefix}`) === true) {\n    let specWithoutName = opts.specRaw.slice(`${opts.alias}@${prefix}`.length);\n\n    if (specWithoutName.startsWith('workspace:')) {\n      specWithoutName = specWithoutName.slice(10);\n\n      if (\n        specWithoutName === '*' ||\n        specWithoutName === '^' ||\n        specWithoutName === '~'\n      ) {\n        return specWithoutName;\n      }\n    }\n\n    const selector = versionSelectorType(specWithoutName);\n\n    if (\n      (selector == null ||\n        (selector.type !== 'version' && selector.type !== 'range')) &&\n      opts.preserveNonSemverVersionSpec === true\n    ) {\n      return opts.specRaw.slice(opts.alias.length + 1);\n    }\n  }\n\n  // A prerelease version is always added as an exact version\n  if (typeof semver.parse(opts.version)?.prerelease.length === 'number') {\n    return `${prefix}${opts.version}`;\n  }\n\n  return `${prefix}${createVersionSpec(opts.version, { pinnedVersion: opts.pinnedVersion, rolling: opts.rolling })}`;\n}\n"],
  "mappings": "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",
  "names": []
}
