renovate 44.71.2 → 44.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/config/global.js.map +1 -1
  2. package/dist/config/options/index.js +2 -0
  3. package/dist/config/options/index.js.map +1 -1
  4. package/dist/config/presets/internal/security.preset.js.map +1 -1
  5. package/dist/config/types.js.map +1 -1
  6. package/dist/config/validation.js.map +1 -1
  7. package/dist/logger/config-serializer.js +7 -7
  8. package/dist/logger/config-serializer.js.map +1 -1
  9. package/dist/modules/datasource/conan/schema.js.map +1 -1
  10. package/dist/modules/datasource/deb/index.js +1 -1
  11. package/dist/modules/datasource/deb/index.js.map +1 -1
  12. package/dist/modules/datasource/deb/packages.js +1 -1
  13. package/dist/modules/datasource/deb/packages.js.map +1 -1
  14. package/dist/modules/datasource/docker/schema.js +1 -1
  15. package/dist/modules/datasource/docker/schema.js.map +1 -1
  16. package/dist/modules/datasource/orb/schema.js.map +1 -1
  17. package/dist/modules/datasource/terraform-module/schema.js.map +1 -1
  18. package/dist/modules/datasource/terraform-provider/schema.js.map +1 -1
  19. package/dist/modules/manager/argocd/extract.js +17 -15
  20. package/dist/modules/manager/argocd/extract.js.map +1 -1
  21. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  22. package/dist/modules/manager/cargo/schema.js.map +1 -1
  23. package/dist/modules/manager/dockerfile/extract.js.map +1 -1
  24. package/dist/modules/manager/fingerprint.generated.js +10 -10
  25. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  26. package/dist/modules/manager/fleet/extract.js +16 -7
  27. package/dist/modules/manager/fleet/extract.js.map +1 -1
  28. package/dist/modules/manager/flux/extract.js +4 -8
  29. package/dist/modules/manager/flux/extract.js.map +1 -1
  30. package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
  31. package/dist/modules/manager/helmfile/extract.js +12 -12
  32. package/dist/modules/manager/helmfile/extract.js.map +1 -1
  33. package/dist/modules/manager/helmsman/extract.js +8 -10
  34. package/dist/modules/manager/helmsman/extract.js.map +1 -1
  35. package/dist/modules/manager/helmv3/oci.js +22 -1
  36. package/dist/modules/manager/helmv3/oci.js.map +1 -1
  37. package/dist/modules/manager/helmv3/utils.js +2 -7
  38. package/dist/modules/manager/helmv3/utils.js.map +1 -1
  39. package/dist/modules/manager/kustomize/extract.js +6 -10
  40. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  41. package/dist/modules/manager/mise/extract.js +1 -1
  42. package/dist/modules/manager/mise/extract.js.map +1 -1
  43. package/dist/modules/manager/nix/extract.js +2 -2
  44. package/dist/modules/manager/nix/extract.js.map +1 -1
  45. package/dist/modules/manager/npm/extract/index.js.map +1 -1
  46. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  47. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  48. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  49. package/dist/modules/manager/ocb/extract.js +2 -2
  50. package/dist/modules/manager/ocb/extract.js.map +1 -1
  51. package/dist/modules/manager/pep723/utils.js +1 -1
  52. package/dist/modules/manager/pep723/utils.js.map +1 -1
  53. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  54. package/dist/modules/manager/poetry/schema.js.map +1 -1
  55. package/dist/modules/manager/poetry/update-locked.js.map +1 -1
  56. package/dist/modules/manager/sveltos/extract.js +13 -19
  57. package/dist/modules/manager/sveltos/extract.js.map +1 -1
  58. package/dist/modules/manager/swift/artifacts.js +1 -1
  59. package/dist/modules/manager/swift/artifacts.js.map +1 -1
  60. package/dist/modules/manager/terraform/extractors/resources/helm-release.js +3 -10
  61. package/dist/modules/manager/terraform/extractors/resources/helm-release.js.map +1 -1
  62. package/dist/modules/manager/vendir/extract.js +3 -4
  63. package/dist/modules/manager/vendir/extract.js.map +1 -1
  64. package/dist/modules/platform/bitbucket/pr-cache.js.map +1 -1
  65. package/dist/modules/platform/forgejo/pr-cache.js.map +1 -1
  66. package/dist/modules/platform/gerrit/index.js.map +1 -1
  67. package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
  68. package/dist/modules/platform/github/schema.js +1 -1
  69. package/dist/modules/platform/github/schema.js.map +1 -1
  70. package/dist/modules/platform/scm-manager/index.js.map +1 -1
  71. package/dist/modules/versioning/ruby/range.js.map +1 -1
  72. package/dist/util/cache/package/impl/redis.js.map +1 -1
  73. package/dist/util/cache/package/impl/sqlite.js.map +1 -1
  74. package/dist/util/cache/package/namespaces.js.map +1 -1
  75. package/dist/util/exec/index.js.map +1 -1
  76. package/dist/util/package-rules/merge-confidence.js +5 -0
  77. package/dist/util/package-rules/merge-confidence.js.map +1 -1
  78. package/dist/util/result.js.map +1 -1
  79. package/dist/util/yaml.js +1 -1
  80. package/dist/util/yaml.js.map +1 -1
  81. package/dist/workers/global/config/parse/additional-config-file.js +1 -1
  82. package/dist/workers/global/config/parse/additional-config-file.js.map +1 -1
  83. package/dist/workers/global/config/parse/file.js +1 -1
  84. package/dist/workers/global/config/parse/file.js.map +1 -1
  85. package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
  86. package/dist/workers/repository/dependency-dashboard.js.map +1 -1
  87. package/dist/workers/repository/error.js +1 -1
  88. package/dist/workers/repository/error.js.map +1 -1
  89. package/dist/workers/repository/index.js +1 -1
  90. package/dist/workers/repository/index.js.map +1 -1
  91. package/dist/workers/repository/onboarding/branch/onboarding-branch-cache.js.map +1 -1
  92. package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
  93. package/dist/workers/repository/update/branch/index.js.map +1 -1
  94. package/package.json +7 -7
  95. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport { artifactErrorMessageFromExecError } from '../../util.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n getNpmrcContent,\n parseLockFile,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmLockFileDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmLockFileDirs.push(upgrade.managerData?.pnpmLockFile);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<PackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmLockFileDirs.push(packageFile.managerData.pnpmLockFile);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles = new Map<string, string>(),\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n if (\n isString(npmrc) &&\n (npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName)\n ) {\n try {\n if (!originalNpmrcFiles.has(npmrcFilename)) {\n const originalNpmrc = await readLocalFile(npmrcFilename, 'utf8');\n if (isString(originalNpmrc)) {\n originalNpmrcFiles.set(npmrcFilename, originalNpmrc);\n }\n }\n await writeLocalFile(npmrcFilename, npmrc.replace(regEx(/\\n?$/), '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n const oldVersion = upgrade.lockedVersion ?? upgrade.currentVersion;\n if ('packages' in npmLockParsed) {\n for (const packageName of packageNames) {\n if (\n packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`)\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n continue;\n }\n if (!depName || !oldVersion) {\n continue;\n }\n // Lockstep monorepo siblings (e.g. vue -> @vue/server-renderer)\n // pin the updated dep to its exact old version. Left in the lock\n // they cannot resolve against the new version and npm fails with\n // ERESOLVE, so massage them out too and let npm re-resolve them.\n const entry = npmLockParsed.packages[packageName];\n const pinned =\n entry?.peerDependencies?.[depName] === oldVersion ||\n entry?.dependencies?.[depName] === oldVersion ||\n entry?.optionalDependencies?.[depName] === oldVersion;\n if (pinned) {\n logger.trace(\n { packageName, depName, oldVersion },\n 'Massaging out lockstep sibling',\n );\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nasync function restoreNpmrcFiles(\n originalNpmrcFiles: Map<string, string>,\n): Promise<void> {\n for (const [npmrcFilename, originalNpmrc] of originalNpmrcFiles) {\n try {\n await writeLocalFile(npmrcFilename, originalNpmrc);\n } catch (err) {\n logger.warn({ npmrcFilename, err }, 'Error restoring .npmrc');\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (\n !(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )\n ) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n yarnrcYml ??= (await getFile(yarnrcYmlFilename)) ?? undefined;\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nasync function getAdditionalFilesInner(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles: Map<string, string>,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (\n config.isLockFileMaintenance &&\n config.reuseExistingBranch &&\n (await scm.branchExists(config.branchName))\n ) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles, originalNpmrcFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8');\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n /* v8 ignore next -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmLockFile of dirs.pnpmLockFileDirs) {\n const lockFileDir = upath.dirname(pnpmLockFile);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmLockFile === pnpmLockFile,\n );\n const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmLockFile,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n pnpmLockFile,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmLockFile,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n const originalNpmrcFiles = new Map<string, string>();\n try {\n return await getAdditionalFilesInner(\n config,\n packageFiles,\n originalNpmrcFiles,\n );\n } finally {\n await restoreNpmrcFiles(originalNpmrcFiles);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport { artifactErrorMessageFromExecError } from '../../util.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n getNpmrcContent,\n parseLockFile,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmLockFileDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmLockFileDirs.push(upgrade.managerData?.pnpmLockFile);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<PackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmLockFileDirs.push(packageFile.managerData.pnpmLockFile);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles = new Map<string, string>(),\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n if (\n isString(npmrc) &&\n (npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName)\n ) {\n try {\n if (!originalNpmrcFiles.has(npmrcFilename)) {\n const originalNpmrc = await readLocalFile(npmrcFilename, 'utf8');\n if (isString(originalNpmrc)) {\n originalNpmrcFiles.set(npmrcFilename, originalNpmrc);\n }\n }\n await writeLocalFile(npmrcFilename, npmrc.replace(regEx(/\\n?$/), '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n const oldVersion = upgrade.lockedVersion ?? upgrade.currentVersion;\n if ('packages' in npmLockParsed) {\n for (const packageName of packageNames) {\n if (\n packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`)\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n continue;\n }\n if (!depName || !oldVersion) {\n continue;\n }\n // Lockstep monorepo siblings (e.g. vue -> @vue/server-renderer)\n // pin the updated dep to its exact old version. Left in the lock\n // they cannot resolve against the new version and npm fails with\n // ERESOLVE, so massage them out too and let npm re-resolve them.\n const entry = npmLockParsed.packages[packageName];\n const pinned =\n entry?.peerDependencies?.[depName] === oldVersion ||\n entry?.dependencies?.[depName] === oldVersion ||\n entry?.optionalDependencies?.[depName] === oldVersion;\n if (pinned) {\n logger.trace(\n { packageName, depName, oldVersion },\n 'Massaging out lockstep sibling',\n );\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nasync function restoreNpmrcFiles(\n originalNpmrcFiles: Map<string, string>,\n): Promise<void> {\n for (const [npmrcFilename, originalNpmrc] of originalNpmrcFiles) {\n try {\n await writeLocalFile(npmrcFilename, originalNpmrc);\n } catch (err) {\n logger.warn({ npmrcFilename, err }, 'Error restoring .npmrc');\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (!(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n yarnrcYml ??= (await getFile(yarnrcYmlFilename)) ?? undefined;\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nasync function getAdditionalFilesInner(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles: Map<string, string>,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (\n config.isLockFileMaintenance &&\n config.reuseExistingBranch &&\n (await scm.branchExists(config.branchName))\n ) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles, originalNpmrcFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8');\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n /* v8 ignore next -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmLockFile of dirs.pnpmLockFileDirs) {\n const lockFileDir = upath.dirname(pnpmLockFile);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmLockFile === pnpmLockFile,\n );\n const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmLockFile,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n pnpmLockFile,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmLockFile,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n const originalNpmrcFiles = new Map<string, string>();\n try {\n return await getAdditionalFilesInner(\n config,\n packageFiles,\n originalNpmrcFiles,\n );\n } finally {\n await restoreNpmrcFiles(originalNpmrcFiles);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"npm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/npm.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyString, isNumber, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n} from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n localPathExists,\n readLocalFile,\n renameLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { minimatch } from '../../../../util/minimatch.ts';\nimport { toMs } from '../../../../util/pretty-time.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { trimSlashes } from '../../../../util/url.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { PackageLock } from '../schema.ts';\nimport { composeLockFile, parseLockFile } from '../utils.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, NpmrcCooldownResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport function parseNpmrcCooldownDate(\n npmrcContent: string | null,\n): NpmrcCooldownResult | null {\n if (!npmrcContent) {\n return null;\n }\n\n const parsed = ini.parse(npmrcContent);\n\n const before = parsed.before;\n if (isNonEmptyString(before)) {\n const dt = DateTime.fromISO(before, { zone: 'utc' });\n if (dt.isValid) {\n return { date: dt, source: 'before' };\n }\n logger.debug(`Invalid before date in .npmrc: ${before}, ignoring`);\n }\n\n const minReleaseAge = parsed['min-release-age'];\n if (isNonEmptyString(minReleaseAge)) {\n const days = parseInt(minReleaseAge, 10);\n if (isNumber(days) && days >= 0) {\n return {\n date: DateTime.now().minus({ days }).toUTC(),\n source: 'min-release-age',\n };\n }\n logger.debug(\n `Invalid min-release-age in .npmrc: ${minReleaseAge}, ignoring`,\n );\n }\n\n return null;\n}\n\nasync function getNpmConstraintFromPackageLock(\n lockFileDir: string,\n filename: string,\n): Promise<string | null> {\n const packageLockFileName = upath.join(lockFileDir, filename);\n const packageLockContents = await readLocalFile(packageLockFileName, 'utf8');\n const packageLockJson = Result.parse(\n packageLockContents,\n PackageLock,\n ).unwrapOrNull();\n if (!packageLockJson) {\n logger.debug(`Could not parse ${packageLockFileName}`);\n return null;\n }\n const { lockfileVersion } = packageLockJson;\n if (lockfileVersion === 1) {\n logger.debug(`Using npm constraint <7 for lockfileVersion=1`);\n return `<7`;\n }\n if (lockfileVersion === 2) {\n logger.debug(`Using npm constraint <9 for lockfileVersion=2`);\n return `<9`;\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n filename: string,\n config: Partial<PostUpdateConfig> = {},\n upgrades: Upgrade[] = [],\n npmrcContent: string | null = null,\n): Promise<GenerateLockFileResult> {\n // TODO: don't assume package-lock.json is in the same directory\n const lockFileName = upath.join(lockFileDir, filename);\n\n logger.debug(`Spawning npm install to create ${lockFileDir}/${filename}`);\n const { skipInstalls, postUpdateOptions } = config;\n\n let lockFile: string | null = null;\n let beforeFallback = false;\n try {\n const lazyPkgJson = lazyLoadPackageJson(lockFileDir);\n const npmToolConstraint: ToolConstraint = {\n toolName: 'npm',\n constraint:\n config.constraints?.npm ??\n getPackageManagerVersion('npm', await lazyPkgJson.getValue()) ??\n (await getNpmConstraintFromPackageLock(lockFileDir, filename)) ??\n null,\n };\n const supportsPreferDedupeFlag =\n !npmToolConstraint.constraint ||\n semver.intersects('>=7.0.0', npmToolConstraint.constraint);\n let commands: string[] = [];\n let cmdOptions = '';\n if (\n (postUpdateOptions?.includes('npmDedupe') === true &&\n !supportsPreferDedupeFlag) ||\n skipInstalls === false\n ) {\n logger.debug('Performing node_modules install');\n cmdOptions += '--no-audit';\n } else {\n logger.debug('Updating lock file only');\n cmdOptions += '--package-lock-only --no-audit';\n }\n\n if (postUpdateOptions?.includes('npmDedupe') && supportsPreferDedupeFlag) {\n logger.debug('Deduplicate dependencies on installation');\n cmdOptions += ' --prefer-dedupe';\n }\n\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n cmdOptions += ' --ignore-scripts';\n }\n\n let beforeFlag = '';\n if (config.minimumReleaseAge) {\n const ms = toMs(config.minimumReleaseAge);\n if (ms === null) {\n logger.debug(\n {\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Invalid minimumReleaseAge, skipping --before for npm install',\n );\n } else {\n const npmrcCooldown = parseNpmrcCooldownDate(npmrcContent);\n\n // npm rejects --before when min-release-age is set in .npmrc,\n // so let the .npmrc handle cooldown natively in that case\n if (npmrcCooldown?.source === 'min-release-age') {\n logger.debug(\n {\n npmrcMinReleaseAge: npmrcCooldown.date.toISO(),\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Skipping --before flag because .npmrc already contains min-release-age',\n );\n } else {\n let beforeDate = DateTime.now().minus(ms).toUTC();\n\n if (npmrcCooldown && npmrcCooldown.date < beforeDate) {\n logger.debug(\n {\n npmrcDate: npmrcCooldown.date.toISO(),\n beforeDate: beforeDate.toISO(),\n },\n 'Using stricter .npmrc cooldown date over minimumReleaseAge date',\n );\n beforeDate = npmrcCooldown.date;\n }\n\n const beforeISO = beforeDate.toISO();\n logger.debug(\n {\n beforeISO,\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Setting npm --before based on minimumReleaseAge',\n );\n beforeFlag = ` --before=${beforeISO}`;\n }\n }\n }\n\n const extraEnv: ExtraEnv = {\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n };\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPkgJson),\n ...(isNonEmptyString(npmToolConstraint.constraint)\n ? [npmToolConstraint]\n : []),\n ],\n docker: {},\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n if (!upgrades.every((upgrade) => upgrade.isLockfileUpdate)) {\n // This command updates the lock file based on package.json\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n // divide the deps in two categories: workspace and root\n const { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps } =\n divideWorkspaceAndRootDeps(lockFileDir, lockUpdates);\n\n if (workspaces.size && lockWorkspacesUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm-workspaces)');\n for (const workspace of workspaces) {\n const currentWorkspaceUpdates = lockWorkspacesUpdates\n .filter((update) => update.workspace === workspace)\n .map((update) => update.managerData?.packageKey)\n .filter((packageKey) => !rootDeps.has(packageKey));\n\n // v8 ignore else -- TODO: add test #40625\n if (currentWorkspaceUpdates.length) {\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} --workspace=${quote(workspace)} ${currentWorkspaceUpdates\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n }\n }\n\n if (lockRootUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm)');\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} ${lockRootUpdates\n .map((update) => update.managerData?.packageKey)\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n\n if (upgrades.some((upgrade) => upgrade.isRemediation)) {\n // We need to run twice to get the correct lock file\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // Lock file maintenance recreates the lock file from scratch, and a single\n // `npm install` can generate a lock file which is out of sync with\n // package.json, so we need to run the install a second time (#37531).\n // Skipped if `npmInstallTwice` is configured, as that doubles all install\n // commands already.\n if (\n upgrades.some((upgrade) => upgrade.isLockFileMaintenance) &&\n !postUpdateOptions?.includes('npmInstallTwice')\n ) {\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // postUpdateOptions\n if (\n config.postUpdateOptions?.includes('npmDedupe') &&\n !supportsPreferDedupeFlag\n ) {\n logger.debug('Performing npm dedupe after installation');\n commands.push('npm dedupe');\n }\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n try {\n await deleteLocalFile(lockFileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { err, lockFileName },\n 'Error removing `package-lock.json` for lock file maintenance',\n );\n }\n }\n\n if (postUpdateOptions?.includes('npmInstallTwice')) {\n logger.debug('Running npm install twice');\n // Run the install command twice to ensure the lock file is up to date\n // iterate through commands and if any command starts with `npm install`, add it again\n const existingCommands = [...commands];\n commands = [];\n for (const command of existingCommands) {\n commands.push(command);\n // v8 ignore else -- TODO: add test #40625\n if (command.startsWith('npm install')) {\n commands.push(command);\n }\n }\n }\n\n // Run the commands, retrying without --before on ETARGET if needed\n await exec(commands, execOptions).catch(async (err) => {\n if (beforeFlag && err.stderr?.includes('with a date before')) {\n logger.debug('npm --before caused ETARGET, retrying without --before');\n const commandsWithoutBefore = commands.map((cmd) =>\n cmd.replace(beforeFlag, ''),\n );\n beforeFallback = true;\n return exec(commandsWithoutBefore, execOptions);\n }\n throw err;\n });\n\n // massage to shrinkwrap if necessary\n if (\n filename === 'npm-shrinkwrap.json' &&\n (await localPathExists(upath.join(lockFileDir, 'package-lock.json')))\n ) {\n await renameLocalFile(\n upath.join(lockFileDir, 'package-lock.json'),\n upath.join(lockFileDir, 'npm-shrinkwrap.json'),\n );\n }\n\n // Read the result\n // TODO #22198\n lockFile = (await readLocalFile(\n upath.join(lockFileDir, filename),\n 'utf8',\n ))!;\n\n // Massage lockfile counterparts of package.json that were modified\n // because npm install was called with an explicit version for rangeStrategy=update-lockfile\n if (lockUpdates.length) {\n const { detectedIndent, lockFileParsed } = parseLockFile(lockFile);\n if (\n lockFileParsed?.lockfileVersion === 2 ||\n lockFileParsed?.lockfileVersion === 3\n ) {\n lockUpdates.forEach((lockUpdate) => {\n const depType = lockUpdate.depType as\n | 'dependencies'\n | 'optionalDependencies';\n\n // TODO #22198\n // v8 ignore else -- TODO: add test #40625\n if (\n lockFileParsed.packages?.['']?.[depType]?.[lockUpdate.packageName!]\n ) {\n lockFileParsed.packages[''][depType][lockUpdate.packageName!] =\n lockUpdate.newValue!;\n }\n });\n lockFile = composeLockFile(lockFileParsed, detectedIndent);\n }\n }\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n err,\n type: 'npm',\n },\n 'lock file error',\n );\n // v8 ignore if -- TODO: add test #40625\n if (err.stderr?.includes('ENOSPC: no space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n return { error: true, stderr: err.stderr };\n }\n return { error: !lockFile, lockFile, beforeFallback };\n}\n\nexport function divideWorkspaceAndRootDeps(\n lockFileDir: string,\n lockUpdates: Upgrade[],\n): {\n lockRootUpdates: Upgrade[];\n lockWorkspacesUpdates: Upgrade[];\n workspaces: Set<string>;\n rootDeps: Set<string>;\n} {\n const lockRootUpdates: Upgrade[] = []; // stores all upgrades which are present in root package.json\n const lockWorkspacesUpdates: Upgrade[] = []; // stores all upgrades which are present in workspaces package.json\n const workspaces = new Set<string>(); // name of all workspaces\n const rootDeps = new Set<string>(); // packageName of all upgrades in root package.json (makes it check duplicate deps in root)\n\n // divide the deps in two categories: workspace and root\n for (const upgrade of lockUpdates) {\n upgrade.managerData ??= {};\n upgrade.managerData.packageKey = generatePackageKey(\n upgrade.packageName!,\n upgrade.newVersion!,\n );\n if (\n upgrade.managerData.workspacesPackages?.length &&\n isString(upgrade.packageFile)\n ) {\n const workspacePatterns = upgrade.managerData.workspacesPackages; // glob pattern or directory name/path\n const packageFileDir = trimSlashes(\n upgrade.packageFile.replace('package.json', ''),\n );\n\n // workspaceDir = packageFileDir - lockFileDir\n const workspaceDir = trimSlashes(\n packageFileDir.startsWith(lockFileDir)\n ? packageFileDir.slice(lockFileDir.length)\n : packageFileDir,\n );\n\n if (isNonEmptyString(workspaceDir)) {\n let workspaceName: string | undefined;\n // compare workspaceDir to workspace patterns\n // stop when the first match is found and\n // add workspaceDir to workspaces set and upgrade object\n for (const workspacePattern of workspacePatterns) {\n const massagedPattern = (workspacePattern as string).replace(\n regEx(/^\\.\\//),\n '',\n );\n if (minimatch(massagedPattern).match(workspaceDir)) {\n workspaceName = workspaceDir;\n break;\n }\n }\n if (workspaceName) {\n // v8 ignore else -- TODO: add test #40625\n if (\n !rootDeps.has(upgrade.managerData.packageKey) // prevent same dep from existing in root and workspace\n ) {\n workspaces.add(workspaceName);\n upgrade.workspace = workspaceName;\n lockWorkspacesUpdates.push(upgrade);\n }\n } else {\n logger.warn(\n { workspacePatterns, workspaceDir },\n 'workspaceDir not found',\n );\n }\n continue;\n }\n }\n lockRootUpdates.push(upgrade);\n rootDeps.add(upgrade.managerData.packageKey);\n }\n\n return { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps };\n}\n\nfunction generatePackageKey(packageName: string, version: string): string {\n return `${packageName}@${version}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"npm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/npm.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyString, isNumber, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n} from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n localPathExists,\n readLocalFile,\n renameLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { minimatch } from '../../../../util/minimatch.ts';\nimport { toMs } from '../../../../util/pretty-time.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { trimSlashes } from '../../../../util/url.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { PackageLock } from '../schema.ts';\nimport { composeLockFile, parseLockFile } from '../utils.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, NpmrcCooldownResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport function parseNpmrcCooldownDate(\n npmrcContent: string | null,\n): NpmrcCooldownResult | null {\n if (!npmrcContent) {\n return null;\n }\n\n const parsed = ini.parse(npmrcContent);\n\n const before = parsed.before;\n if (isNonEmptyString(before)) {\n const dt = DateTime.fromISO(before, { zone: 'utc' });\n if (dt.isValid) {\n return { date: dt, source: 'before' };\n }\n logger.debug(`Invalid before date in .npmrc: ${before}, ignoring`);\n }\n\n const minReleaseAge = parsed['min-release-age'];\n if (isNonEmptyString(minReleaseAge)) {\n const days = parseInt(minReleaseAge, 10);\n if (isNumber(days) && days >= 0) {\n return {\n date: DateTime.now().minus({ days }).toUTC(),\n source: 'min-release-age',\n };\n }\n logger.debug(\n `Invalid min-release-age in .npmrc: ${minReleaseAge}, ignoring`,\n );\n }\n\n return null;\n}\n\nasync function getNpmConstraintFromPackageLock(\n lockFileDir: string,\n filename: string,\n): Promise<string | null> {\n const packageLockFileName = upath.join(lockFileDir, filename);\n const packageLockContents = await readLocalFile(packageLockFileName, 'utf8');\n const packageLockJson = Result.parse(\n packageLockContents,\n PackageLock,\n ).unwrapOrNull();\n if (!packageLockJson) {\n logger.debug(`Could not parse ${packageLockFileName}`);\n return null;\n }\n const { lockfileVersion } = packageLockJson;\n if (lockfileVersion === 1) {\n logger.debug(`Using npm constraint <7 for lockfileVersion=1`);\n return `<7`;\n }\n if (lockfileVersion === 2) {\n logger.debug(`Using npm constraint <9 for lockfileVersion=2`);\n return `<9`;\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n filename: string,\n config: Partial<PostUpdateConfig> = {},\n upgrades: Upgrade[] = [],\n npmrcContent: string | null = null,\n): Promise<GenerateLockFileResult> {\n // TODO: don't assume package-lock.json is in the same directory\n const lockFileName = upath.join(lockFileDir, filename);\n\n logger.debug(`Spawning npm install to create ${lockFileDir}/${filename}`);\n const { skipInstalls, postUpdateOptions } = config;\n\n let lockFile: string | null = null;\n let beforeFallback = false;\n try {\n const lazyPkgJson = lazyLoadPackageJson(lockFileDir);\n const npmToolConstraint: ToolConstraint = {\n toolName: 'npm',\n constraint:\n config.constraints?.npm ??\n getPackageManagerVersion('npm', await lazyPkgJson.getValue()) ??\n (await getNpmConstraintFromPackageLock(lockFileDir, filename)) ??\n null,\n };\n const supportsPreferDedupeFlag =\n !npmToolConstraint.constraint ||\n semver.intersects('>=7.0.0', npmToolConstraint.constraint);\n let commands: string[] = [];\n let cmdOptions = '';\n if (\n (postUpdateOptions?.includes('npmDedupe') === true &&\n !supportsPreferDedupeFlag) ||\n skipInstalls === false\n ) {\n logger.debug('Performing node_modules install');\n cmdOptions += '--no-audit';\n } else {\n logger.debug('Updating lock file only');\n cmdOptions += '--package-lock-only --no-audit';\n }\n\n if (postUpdateOptions?.includes('npmDedupe') && supportsPreferDedupeFlag) {\n logger.debug('Deduplicate dependencies on installation');\n cmdOptions += ' --prefer-dedupe';\n }\n\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n cmdOptions += ' --ignore-scripts';\n }\n\n let beforeFlag = '';\n if (config.minimumReleaseAge) {\n const ms = toMs(config.minimumReleaseAge);\n if (ms === null) {\n logger.debug(\n {\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Invalid minimumReleaseAge, skipping --before for npm install',\n );\n } else {\n const npmrcCooldown = parseNpmrcCooldownDate(npmrcContent);\n\n // npm rejects --before when min-release-age is set in .npmrc,\n // so let the .npmrc handle cooldown natively in that case\n if (npmrcCooldown?.source === 'min-release-age') {\n logger.debug(\n {\n npmrcMinReleaseAge: npmrcCooldown.date.toISO(),\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Skipping --before flag because .npmrc already contains min-release-age',\n );\n } else {\n let beforeDate = DateTime.now().minus(ms).toUTC();\n\n if (npmrcCooldown && npmrcCooldown.date < beforeDate) {\n logger.debug(\n {\n npmrcDate: npmrcCooldown.date.toISO(),\n beforeDate: beforeDate.toISO(),\n },\n 'Using stricter .npmrc cooldown date over minimumReleaseAge date',\n );\n beforeDate = npmrcCooldown.date;\n }\n\n const beforeISO = beforeDate.toISO();\n logger.debug(\n {\n beforeISO,\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Setting npm --before based on minimumReleaseAge',\n );\n beforeFlag = ` --before=${beforeISO}`;\n }\n }\n }\n\n const extraEnv: ExtraEnv = {\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n };\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPkgJson),\n ...(isNonEmptyString(npmToolConstraint.constraint)\n ? [npmToolConstraint]\n : []),\n ],\n docker: {},\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n if (!upgrades.every((upgrade) => upgrade.isLockfileUpdate)) {\n // This command updates the lock file based on package.json\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n // divide the deps in two categories: workspace and root\n const { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps } =\n divideWorkspaceAndRootDeps(lockFileDir, lockUpdates);\n\n if (workspaces.size && lockWorkspacesUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm-workspaces)');\n for (const workspace of workspaces) {\n const currentWorkspaceUpdates = lockWorkspacesUpdates\n .filter((update) => update.workspace === workspace)\n .map((update) => update.managerData?.packageKey)\n .filter((packageKey) => !rootDeps.has(packageKey));\n\n // v8 ignore else -- TODO: add test #40625\n if (currentWorkspaceUpdates.length) {\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} --workspace=${quote(workspace)} ${currentWorkspaceUpdates\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n }\n }\n\n if (lockRootUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm)');\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} ${lockRootUpdates\n .map((update) => update.managerData?.packageKey)\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n\n if (upgrades.some((upgrade) => upgrade.isRemediation)) {\n // We need to run twice to get the correct lock file\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // Lock file maintenance recreates the lock file from scratch, and a single\n // `npm install` can generate a lock file which is out of sync with\n // package.json, so we need to run the install a second time (#37531).\n // Skipped if `npmInstallTwice` is configured, as that doubles all install\n // commands already.\n if (\n upgrades.some((upgrade) => upgrade.isLockFileMaintenance) &&\n !postUpdateOptions?.includes('npmInstallTwice')\n ) {\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // postUpdateOptions\n if (\n config.postUpdateOptions?.includes('npmDedupe') &&\n !supportsPreferDedupeFlag\n ) {\n logger.debug('Performing npm dedupe after installation');\n commands.push('npm dedupe');\n }\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n try {\n await deleteLocalFile(lockFileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { err, lockFileName },\n 'Error removing `package-lock.json` for lock file maintenance',\n );\n }\n }\n\n if (postUpdateOptions?.includes('npmInstallTwice')) {\n logger.debug('Running npm install twice');\n // Run the install command twice to ensure the lock file is up to date\n // iterate through commands and if any command starts with `npm install`, add it again\n const existingCommands = [...commands];\n commands = [];\n for (const command of existingCommands) {\n commands.push(command);\n // v8 ignore else -- TODO: add test #40625\n if (command.startsWith('npm install')) {\n commands.push(command);\n }\n }\n }\n\n // Run the commands, retrying without --before on ETARGET if needed\n await exec(commands, execOptions).catch(async (err) => {\n if (beforeFlag && err.stderr?.includes('with a date before')) {\n logger.debug('npm --before caused ETARGET, retrying without --before');\n const commandsWithoutBefore = commands.map((cmd) =>\n cmd.replace(beforeFlag, ''),\n );\n beforeFallback = true;\n return exec(commandsWithoutBefore, execOptions);\n }\n throw err;\n });\n\n // massage to shrinkwrap if necessary\n if (\n filename === 'npm-shrinkwrap.json' &&\n (await localPathExists(upath.join(lockFileDir, 'package-lock.json')))\n ) {\n await renameLocalFile(\n upath.join(lockFileDir, 'package-lock.json'),\n upath.join(lockFileDir, 'npm-shrinkwrap.json'),\n );\n }\n\n // Read the result\n // TODO #22198\n lockFile = (await readLocalFile(\n upath.join(lockFileDir, filename),\n 'utf8',\n ))!;\n\n // Massage lockfile counterparts of package.json that were modified\n // because npm install was called with an explicit version for rangeStrategy=update-lockfile\n if (lockUpdates.length) {\n const { detectedIndent, lockFileParsed } = parseLockFile(lockFile);\n if (\n lockFileParsed?.lockfileVersion === 2 ||\n lockFileParsed?.lockfileVersion === 3\n ) {\n lockUpdates.forEach((lockUpdate) => {\n const depType = lockUpdate.depType as\n 'dependencies' | 'optionalDependencies';\n\n // TODO #22198\n // v8 ignore else -- TODO: add test #40625\n if (\n lockFileParsed.packages?.['']?.[depType]?.[lockUpdate.packageName!]\n ) {\n lockFileParsed.packages[''][depType][lockUpdate.packageName!] =\n lockUpdate.newValue!;\n }\n });\n lockFile = composeLockFile(lockFileParsed, detectedIndent);\n }\n }\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n err,\n type: 'npm',\n },\n 'lock file error',\n );\n // v8 ignore if -- TODO: add test #40625\n if (err.stderr?.includes('ENOSPC: no space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n return { error: true, stderr: err.stderr };\n }\n return { error: !lockFile, lockFile, beforeFallback };\n}\n\nexport function divideWorkspaceAndRootDeps(\n lockFileDir: string,\n lockUpdates: Upgrade[],\n): {\n lockRootUpdates: Upgrade[];\n lockWorkspacesUpdates: Upgrade[];\n workspaces: Set<string>;\n rootDeps: Set<string>;\n} {\n const lockRootUpdates: Upgrade[] = []; // stores all upgrades which are present in root package.json\n const lockWorkspacesUpdates: Upgrade[] = []; // stores all upgrades which are present in workspaces package.json\n const workspaces = new Set<string>(); // name of all workspaces\n const rootDeps = new Set<string>(); // packageName of all upgrades in root package.json (makes it check duplicate deps in root)\n\n // divide the deps in two categories: workspace and root\n for (const upgrade of lockUpdates) {\n upgrade.managerData ??= {};\n upgrade.managerData.packageKey = generatePackageKey(\n upgrade.packageName!,\n upgrade.newVersion!,\n );\n if (\n upgrade.managerData.workspacesPackages?.length &&\n isString(upgrade.packageFile)\n ) {\n const workspacePatterns = upgrade.managerData.workspacesPackages; // glob pattern or directory name/path\n const packageFileDir = trimSlashes(\n upgrade.packageFile.replace('package.json', ''),\n );\n\n // workspaceDir = packageFileDir - lockFileDir\n const workspaceDir = trimSlashes(\n packageFileDir.startsWith(lockFileDir)\n ? packageFileDir.slice(lockFileDir.length)\n : packageFileDir,\n );\n\n if (isNonEmptyString(workspaceDir)) {\n let workspaceName: string | undefined;\n // compare workspaceDir to workspace patterns\n // stop when the first match is found and\n // add workspaceDir to workspaces set and upgrade object\n for (const workspacePattern of workspacePatterns) {\n const massagedPattern = (workspacePattern as string).replace(\n regEx(/^\\.\\//),\n '',\n );\n if (minimatch(massagedPattern).match(workspaceDir)) {\n workspaceName = workspaceDir;\n break;\n }\n }\n if (workspaceName) {\n // v8 ignore else -- TODO: add test #40625\n if (\n !rootDeps.has(upgrade.managerData.packageKey) // prevent same dep from existing in root and workspace\n ) {\n workspaces.add(workspaceName);\n upgrade.workspace = workspaceName;\n lockWorkspacesUpdates.push(upgrade);\n }\n } else {\n logger.warn(\n { workspacePatterns, workspaceDir },\n 'workspaceDir not found',\n );\n }\n continue;\n }\n }\n lockRootUpdates.push(upgrade);\n rootDeps.add(upgrade.managerData.packageKey);\n }\n\n return { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps };\n}\n\nfunction generatePackageKey(packageName: string, version: string): string {\n return `${packageName}@${version}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,uBACd,cAC4B;CAC5B,IAAI,CAAC,cACH,OAAO;CAGT,MAAM,SAAS,IAAI,MAAM,YAAY;CAErC,MAAM,SAAS,OAAO;CACtB,IAAI,iBAAiB,MAAM,GAAG;EAC5B,MAAM,KAAK,SAAS,QAAQ,QAAQ,EAAE,MAAM,MAAM,CAAC;EACnD,IAAI,GAAG,SACL,OAAO;GAAE,MAAM;GAAI,QAAQ;EAAS;EAEtC,OAAO,MAAM,kCAAkC,OAAO,WAAW;CACnE;CAEA,MAAM,gBAAgB,OAAO;CAC7B,IAAI,iBAAiB,aAAa,GAAG;EACnC,MAAM,OAAO,SAAS,eAAe,EAAE;EACvC,IAAI,SAAS,IAAI,KAAK,QAAQ,GAC5B,OAAO;GACL,MAAM,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM;GAC3C,QAAQ;EACV;EAEF,OAAO,MACL,sCAAsC,cAAc,WACtD;CACF;CAEA,OAAO;AACT;AAEA,eAAe,gCACb,aACA,UACwB;CACxB,MAAM,sBAAsB,MAAM,KAAK,aAAa,QAAQ;CAC5D,MAAM,sBAAsB,MAAM,cAAc,qBAAqB,MAAM;CAC3E,MAAM,kBAAkB,OAAO,MAC7B,qBACA,WACF,CAAC,CAAC,aAAa;CACf,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,mBAAmB,qBAAqB;EACrD,OAAO;CACT;CACA,MAAM,EAAE,oBAAoB;CAC5B,IAAI,oBAAoB,GAAG;EACzB,OAAO,MAAM,+CAA+C;EAC5D,OAAO;CACT;CACA,IAAI,oBAAoB,GAAG;EACzB,OAAO,MAAM,+CAA+C;EAC5D,OAAO;CACT;CACA,OAAO;AACT;AAEA,eAAsB,iBACpB,aACA,KACA,UACA,SAAoC,CAAC,GACrC,WAAsB,CAAC,GACvB,eAA8B,MACG;CAEjC,MAAM,eAAe,MAAM,KAAK,aAAa,QAAQ;CAErD,OAAO,MAAM,kCAAkC,YAAY,GAAG,UAAU;CACxE,MAAM,EAAE,cAAc,sBAAsB;CAE5C,IAAI,WAA0B;CAC9B,IAAI,iBAAiB;CACrB,IAAI;EACF,MAAM,cAAc,oBAAoB,WAAW;EACnD,MAAM,oBAAoC;GACxC,UAAU;GACV,YACE,OAAO,aAAa,OACpB,yBAAyB,OAAO,MAAM,YAAY,SAAS,CAAC,KAC3D,MAAM,gCAAgC,aAAa,QAAQ,KAC5D;EACJ;EACA,MAAM,2BACJ,CAAC,kBAAkB,cACnB,OAAO,WAAW,WAAW,kBAAkB,UAAU;EAC3D,IAAI,WAAqB,CAAC;EAC1B,IAAI,aAAa;EACjB,IACG,mBAAmB,SAAS,WAAW,MAAM,QAC5C,CAAC,4BACH,iBAAiB,OACjB;GACA,OAAO,MAAM,iCAAiC;GAC9C,cAAc;EAChB,OAAO;GACL,OAAO,MAAM,yBAAyB;GACtC,cAAc;EAChB;EAEA,IAAI,mBAAmB,SAAS,WAAW,KAAK,0BAA0B;GACxE,OAAO,MAAM,0CAA0C;GACvD,cAAc;EAChB;EAEA,IAAI,CAAC,aAAa,IAAI,cAAc,KAAK,OAAO,eAC9C,cAAc;EAGhB,IAAI,aAAa;EACjB,IAAI,OAAO,mBAAmB;GAC5B,MAAM,KAAK,KAAK,OAAO,iBAAiB;GACxC,IAAI,OAAO,MACT,OAAO,MACL,EACE,mBAAmB,OAAO,kBAC5B,GACA,8DACF;QACK;IACL,MAAM,gBAAgB,uBAAuB,YAAY;IAIzD,IAAI,eAAe,WAAW,mBAC5B,OAAO,MACL;KACE,oBAAoB,cAAc,KAAK,MAAM;KAC7C,mBAAmB,OAAO;IAC5B,GACA,wEACF;SACK;KACL,IAAI,aAAa,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM;KAEhD,IAAI,iBAAiB,cAAc,OAAO,YAAY;MACpD,OAAO,MACL;OACE,WAAW,cAAc,KAAK,MAAM;OACpC,YAAY,WAAW,MAAM;MAC/B,GACA,iEACF;MACA,aAAa,cAAc;KAC7B;KAEA,MAAM,YAAY,WAAW,MAAM;KACnC,OAAO,MACL;MACE;MACA,mBAAmB,OAAO;KAC5B,GACA,iDACF;KACA,aAAa,aAAa;IAC5B;GACF;EACF;EAEA,MAAM,WAAqB;GACzB,kBAAkB,IAAI;GACtB,kBAAkB,IAAI;EACxB;EAEA,MAAM,EAAE,kBAAkB,uBAAuB,OAAO,YAAY;EACpE,IAAI,eACF,SAAS,eAAe,eAAe,aAAa;EAGtD,MAAM,cAA2B;GAC/B,SAAS;GACT;GACA,iBAAiB,CACf,MAAM,sBAAsB,QAAQ,UAAU,aAAa,WAAW,GACtE,GAAI,iBAAiB,kBAAkB,UAAU,IAC7C,CAAC,iBAAiB,IAClB,CAAC,CACP;GACA,QAAQ,CAAC;EACX;;EAEA,IAAI,aAAa,IAAI,cAAc,GAAG;GACpC,SAAS,WAAW,IAAI;GACxB,SAAS,YAAY,IAAI;EAC3B;EAEA,IAAI,CAAC,SAAS,OAAO,YAAY,QAAQ,gBAAgB,GAEvD,SAAS,KAAK,eAAe,aAAa,aAAa,KAAK,CAAC;EAI/D,MAAM,cAAc,SAAS,QAAQ,YAAY,QAAQ,gBAAgB;EAGzE,MAAM,EAAE,iBAAiB,uBAAuB,YAAY,aAC1D,2BAA2B,aAAa,WAAW;EAErD,IAAI,WAAW,QAAQ,sBAAsB,QAAQ;GACnD,OAAO,MAAM,4CAA4C;GACzD,KAAK,MAAM,aAAa,YAAY;IAClC,MAAM,0BAA0B,sBAC7B,QAAQ,WAAW,OAAO,cAAc,SAAS,CAAC,CAClD,KAAK,WAAW,OAAO,aAAa,UAAU,CAAC,CAC/C,QAAQ,eAAe,CAAC,SAAS,IAAI,UAAU,CAAC;;IAGnD,IAAI,wBAAwB,QAAQ;KAClC,MAAM,YAAY,eAAe,aAAa,WAAW,eAAe,MAAM,SAAS,EAAE,GAAG,wBACzF,IAAI,KAAK,CAAC,CACV,KAAK,GAAG;KACX,SAAS,KAAK,SAAS;IACzB;GACF;EACF;EAEA,IAAI,gBAAgB,QAAQ;GAC1B,OAAO,MAAM,iCAAiC;GAC9C,MAAM,YAAY,eAAe,aAAa,WAAW,GAAG,gBACzD,KAAK,WAAW,OAAO,aAAa,UAAU,CAAC,CAC/C,IAAI,KAAK,CAAC,CACV,KAAK,GAAG;GACX,SAAS,KAAK,SAAS;EACzB;EAEA,IAAI,SAAS,MAAM,YAAY,QAAQ,aAAa,GAElD,SAAS,KAAK,eAAe,aAAa,aAAa,KAAK,CAAC;EAQ/D,IACE,SAAS,MAAM,YAAY,QAAQ,qBAAqB,KACxD,CAAC,mBAAmB,SAAS,iBAAiB,GAE9C,SAAS,KAAK,eAAe,aAAa,aAAa,KAAK,CAAC;EAI/D,IACE,OAAO,mBAAmB,SAAS,WAAW,KAC9C,CAAC,0BACD;GACA,OAAO,MAAM,0CAA0C;GACvD,SAAS,KAAK,YAAY;EAC5B;EAEA,IAAI,SAAS,MAAM,YAAY,QAAQ,qBAAqB,GAAG;GAC7D,OAAO,MACL,YAAY,aAAa,4CAC3B;GACA,IAAI;IACF,MAAM,gBAAgB,YAAY;GACpC,SAAS,mDAAmD;IAC1D,OAAO,MACL;KAAE;KAAK;IAAa,GACpB,8DACF;GACF;EACF;EAEA,IAAI,mBAAmB,SAAS,iBAAiB,GAAG;GAClD,OAAO,MAAM,2BAA2B;GAGxC,MAAM,mBAAmB,CAAC,GAAG,QAAQ;GACrC,WAAW,CAAC;GACZ,KAAK,MAAM,WAAW,kBAAkB;IACtC,SAAS,KAAK,OAAO;;IAErB,IAAI,QAAQ,WAAW,aAAa,GAClC,SAAS,KAAK,OAAO;GAEzB;EACF;EAGA,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC,MAAM,OAAO,QAAQ;GACrD,IAAI,cAAc,IAAI,QAAQ,SAAS,oBAAoB,GAAG;IAC5D,OAAO,MAAM,wDAAwD;IACrE,MAAM,wBAAwB,SAAS,KAAK,QAC1C,IAAI,QAAQ,YAAY,EAAE,CAC5B;IACA,iBAAiB;IACjB,OAAO,KAAK,uBAAuB,WAAW;GAChD;GACA,MAAM;EACR,CAAC;EAGD,IACE,aAAa,yBACZ,MAAM,gBAAgB,MAAM,KAAK,aAAa,mBAAmB,CAAC,GAEnE,MAAM,gBACJ,MAAM,KAAK,aAAa,mBAAmB,GAC3C,MAAM,KAAK,aAAa,qBAAqB,CAC/C;EAKF,WAAY,MAAM,cAChB,MAAM,KAAK,aAAa,QAAQ,GAChC,MACF;EAIA,IAAI,YAAY,QAAQ;GACtB,MAAM,EAAE,gBAAgB,mBAAmB,cAAc,QAAQ;GACjE,IACE,gBAAgB,oBAAoB,KACpC,gBAAgB,oBAAoB,GACpC;IACA,YAAY,SAAS,eAAe;KAClC,MAAM,UAAU,WAAW;;KAK3B,IACE,eAAe,WAAW,GAAG,GAAG,QAAQ,GAAG,WAAW,cAEtD,eAAe,SAAS,GAAG,CAAC,QAAQ,CAAC,WAAW,eAC9C,WAAW;IAEjB,CAAC;IACD,WAAW,gBAAgB,gBAAgB,cAAc;GAC3D;EACF;CACF,SAAS,KAAK;;EAEZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,MACL;GACE;GACA,MAAM;EACR,GACA,iBACF;;EAEA,IAAI,IAAI,QAAQ,SAAS,iCAAiC,GACxD,MAAM,IAAI,MAAM,8BAA8B;EAEhD,OAAO;GAAE,OAAO;GAAM,QAAQ,IAAI;EAAO;CAC3C;CACA,OAAO;EAAE,OAAO,CAAC;EAAU;EAAU;CAAe;AACtD;AAEA,SAAgB,2BACd,aACA,aAMA;CACA,MAAM,kBAA6B,CAAC;CACpC,MAAM,wBAAmC,CAAC;CAC1C,MAAM,6BAAa,IAAI,IAAY;CACnC,MAAM,2BAAW,IAAI,IAAY;CAGjC,KAAK,MAAM,WAAW,aAAa;EACjC,QAAQ,gBAAgB,CAAC;EACzB,QAAQ,YAAY,aAAa,mBAC/B,QAAQ,aACR,QAAQ,UACV;EACA,IACE,QAAQ,YAAY,oBAAoB,UACxC,SAAS,QAAQ,WAAW,GAC5B;GACA,MAAM,oBAAoB,QAAQ,YAAY;GAC9C,MAAM,iBAAiB,YACrB,QAAQ,YAAY,QAAQ,gBAAgB,EAAE,CAChD;GAGA,MAAM,eAAe,YACnB,eAAe,WAAW,WAAW,IACjC,eAAe,MAAM,YAAY,MAAM,IACvC,cACN;GAEA,IAAI,iBAAiB,YAAY,GAAG;IAClC,IAAI;IAIJ,KAAK,MAAM,oBAAoB,mBAAmB;KAChD,MAAM,kBAAmB,iBAA4B,QACnD,MAAM,OAAO,GACb,EACF;KACA,IAAI,UAAU,eAAe,CAAC,CAAC,MAAM,YAAY,GAAG;MAClD,gBAAgB;MAChB;KACF;IACF;IACA,IAAI,eAGA;;SAAA,CAAC,SAAS,IAAI,QAAQ,YAAY,UAAU,GAC5C;MACA,WAAW,IAAI,aAAa;MAC5B,QAAQ,YAAY;MACpB,sBAAsB,KAAK,OAAO;KACpC;WAEA,OAAO,KACL;KAAE;KAAmB;IAAa,GAClC,wBACF;IAEF;GACF;EACF;EACA,gBAAgB,KAAK,OAAO;EAC5B,SAAS,IAAI,QAAQ,YAAY,UAAU;CAC7C;CAEA,OAAO;EAAE;EAAiB;EAAuB;EAAY;CAAS;AACxE;AAEA,SAAS,mBAAmB,aAAqB,SAAyB;CACxE,OAAO,GAAG,YAAY,GAAG;AAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../../lib/modules/manager/npm/update/dependency/index.ts"],"sourcesContent":["import { isArray, isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { logger } from '../../../../../logger/index.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { matchAt, replaceAt } from '../../../../../util/string.ts';\nimport type { UpdateDependencyConfig, Upgrade } from '../../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../../dep-types.ts';\nimport type {\n DependenciesMeta,\n NpmPackage,\n OverrideDependency,\n RecursiveOverride,\n} from '../../extract/types.ts';\nimport type { NpmDepType, NpmManagerData } from '../../types.ts';\nimport { getNewGitValue, getNewNpmAliasValue } from './common.ts';\nimport { updatePnpmWorkspaceDependency } from './pnpm.ts';\nimport { updateYarnrcCatalogDependency } from './yarn.ts';\n\nfunction renameObjKey(\n oldObj: DependenciesMeta,\n oldKey: string,\n newKey: string,\n): DependenciesMeta {\n const keys = Object.keys(oldObj);\n return keys.reduce((acc, key) => {\n if (key === oldKey) {\n acc[newKey] = oldObj[oldKey];\n } else {\n acc[key] = oldObj[key];\n }\n return acc;\n }, {} as DependenciesMeta);\n}\n\nfunction replaceAsString(\n parsedContents: NpmPackage,\n fileContent: string,\n depType:\n | NpmDepType\n | 'dependenciesMeta'\n | 'packageManager'\n | 'pnpm.overrides',\n depName: string,\n oldValue: string,\n newValue: string,\n parents?: string[],\n): string {\n if (depType === 'packageManager') {\n parsedContents[depType] = newValue;\n } else if (depType === 'pnpm.overrides') {\n parsedContents.pnpm!.overrides![depName] = newValue;\n } else if (depName === oldValue) {\n // The old value is the name of the dependency itself\n delete Object.assign(parsedContents[depType]!, {\n [newValue]: parsedContents[depType]![oldValue],\n })[oldValue];\n } else if (depType === 'dependenciesMeta') {\n // v8 ignore else -- TODO: add test #40625\n if (oldValue !== newValue) {\n parsedContents.dependenciesMeta = renameObjKey(\n // TODO #22198\n parsedContents.dependenciesMeta!,\n oldValue,\n newValue,\n );\n }\n } else if (parents && depType === 'overrides') {\n // there is an object as a value in overrides block\n const { depObjectReference, overrideDepName } = overrideDepPosition(\n parsedContents[depType]!,\n parents,\n depName,\n );\n // v8 ignore else -- TODO: add test #40625\n if (depObjectReference) {\n depObjectReference[overrideDepName] = newValue;\n }\n } else {\n // The old value is the version of the dependency\n parsedContents[depType]![depName] = newValue;\n }\n // Look for the old version number\n const searchString = `\"${oldValue}\"`;\n let newString = `\"${newValue}\"`;\n\n const escapedDepName = RegExp.escape(depName);\n const patchRe = regEx(`^(patch:${escapedDepName}@(npm:)?).*#`);\n const match = patchRe.exec(oldValue);\n if (match && depType === 'resolutions') {\n const patch = oldValue.replace(match[0], `${match[1]}${newValue}#`);\n parsedContents[depType]![depName] = patch;\n newString = `\"${patch}\"`;\n }\n\n // Skip ahead to depType section\n let searchIndex = fileContent.indexOf(`\"${depType}\"`) + depType.length;\n logger.trace(`Starting search at index ${searchIndex}`);\n // Iterate through the rest of the file\n for (; searchIndex < fileContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (matchAt(fileContent, searchIndex, searchString)) {\n logger.trace(`Found match at index ${searchIndex}`);\n // Now test if the result matches\n const testContent = replaceAt(\n fileContent,\n searchIndex,\n searchString,\n newString,\n );\n // Compare the parsed JSON structure of old and new\n if (dequal(parsedContents, JSON.parse(testContent))) {\n return testContent;\n }\n }\n }\n // v8 ignore next -- TODO: add test #40625\n throw new Error();\n}\n\nexport function updateDependency({\n fileContent,\n packageFile: packageFileName,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n if (\n upgrade.depType?.startsWith('pnpm.catalog') ||\n upgrade.depType === pnpmWorkspaceOverrides\n ) {\n return updatePnpmWorkspaceDependency({\n fileContent,\n packageFile: packageFileName,\n upgrade,\n });\n }\n if (upgrade.depType?.startsWith('yarn.catalog')) {\n return updateYarnrcCatalogDependency({\n fileContent,\n packageFile: packageFileName,\n upgrade,\n });\n }\n\n const { depType, managerData } = upgrade;\n const depName: string = managerData?.key ?? upgrade.depName;\n let { newValue } = upgrade;\n\n newValue = getNewGitValue(upgrade) ?? newValue;\n newValue = getNewNpmAliasValue(newValue, upgrade) ?? newValue;\n\n logger.debug(`npm.updateDependency(): ${depType}.${depName} = ${newValue}`);\n try {\n const parsedContents: NpmPackage = JSON.parse(fileContent);\n let overrideDepParents: string[] | undefined = undefined;\n // Save the old version\n let oldVersion: string | undefined;\n if (depType === 'packageManager') {\n oldVersion = parsedContents[depType];\n newValue = `${depName}@${newValue}`;\n } else if (isOverrideObject(upgrade)) {\n overrideDepParents = managerData?.parents;\n // v8 ignore else -- TODO: add test #40625\n if (overrideDepParents) {\n // old version when there is an object as a value in overrides block\n const { depObjectReference, overrideDepName } = overrideDepPosition(\n parsedContents.overrides!,\n overrideDepParents,\n depName,\n );\n // v8 ignore else -- TODO: add test #40625\n if (depObjectReference) {\n oldVersion = depObjectReference[overrideDepName]!;\n }\n }\n } else if (depType === 'pnpm.overrides') {\n oldVersion = parsedContents.pnpm?.overrides?.[depName];\n } else {\n oldVersion = parsedContents[depType as NpmDepType]![depName] as string;\n }\n if (\n oldVersion === newValue &&\n (!upgrade.newName || upgrade.newName === depName)\n ) {\n logger.trace('Version is already updated');\n return fileContent;\n }\n\n // TODO #22198\n let newFileContent: string;\n if (upgrade.newName && upgrade.replacementApproach === 'alias') {\n newFileContent = replaceAsString(\n parsedContents,\n fileContent,\n depType as NpmDepType,\n depName,\n oldVersion!,\n `npm:${upgrade.newName}@${newValue}`,\n overrideDepParents,\n );\n } else {\n newFileContent = replaceAsString(\n parsedContents,\n fileContent,\n depType as NpmDepType,\n depName,\n oldVersion!,\n newValue!,\n overrideDepParents,\n );\n if (upgrade.newName && upgrade.newName !== depName) {\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n depType as NpmDepType,\n depName,\n depName,\n upgrade.newName,\n overrideDepParents,\n );\n }\n }\n /* v8 ignore next -- needs test */\n if (!newFileContent) {\n logger.debug(\n { fileContent, parsedContents, depType, depName, newValue },\n 'Warning: updateDependency error',\n );\n return fileContent;\n }\n\n if (parsedContents?.resolutions) {\n let depKey: string | undefined;\n if (parsedContents.resolutions[depName]) {\n depKey = depName;\n } else if (parsedContents.resolutions[`**/${depName}`]) {\n depKey = `**/${depName}`;\n }\n if (depKey) {\n /* v8 ignore next -- needs test */\n if (parsedContents.resolutions[depKey] !== oldVersion) {\n logger.debug(\n {\n depName,\n depKey,\n oldVersion,\n resolutionsVersion: parsedContents.resolutions[depKey],\n },\n 'Upgraded dependency exists in yarn resolutions but is different version',\n );\n }\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n 'resolutions',\n depKey,\n // TODO #22198\n parsedContents.resolutions[depKey]!,\n // TODO #22198\n newValue!,\n );\n if (upgrade.newName && upgrade.newName !== depName) {\n if (depKey === `**/${depName}`) {\n // handles the case where a replacement is in a resolution\n upgrade.newName = `**/${upgrade.newName}`;\n }\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n 'resolutions',\n depKey,\n depKey,\n upgrade.newName,\n );\n }\n }\n }\n if (parsedContents?.dependenciesMeta) {\n for (const [depKey] of Object.entries(parsedContents.dependenciesMeta)) {\n if (depKey.startsWith(`${depName}@`)) {\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n 'dependenciesMeta',\n depName,\n depKey,\n // TODO: types (#22198)\n `${depName}@${newValue}`,\n );\n }\n }\n }\n return newFileContent;\n } catch (err) {\n logger.debug({ err }, 'updateDependency error');\n return null;\n }\n}\n\nfunction overrideDepPosition(\n overrideBlock: OverrideDependency,\n parents: string[],\n depName: string,\n): {\n depObjectReference: Record<string, string>;\n overrideDepName: string;\n} {\n // get override dep position when its nested in an object\n const lastParent = parents.at(-1);\n let overrideDep: OverrideDependency = overrideBlock;\n for (const parent of parents) {\n // v8 ignore else -- TODO: add test #40625\n if (overrideDep) {\n overrideDep = overrideDep[parent] as Record<string, RecursiveOverride>;\n }\n }\n const overrideDepName = depName === lastParent ? '.' : depName;\n const depObjectReference = overrideDep as Record<string, string>;\n return { depObjectReference, overrideDepName };\n}\n\nfunction isOverrideObject(upgrade: Upgrade<NpmManagerData>): boolean {\n return (\n isArray(upgrade.managerData?.parents, isNonEmptyStringAndNotWhitespace) &&\n upgrade.depType === 'overrides'\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../../lib/modules/manager/npm/update/dependency/index.ts"],"sourcesContent":["import { isArray, isNonEmptyStringAndNotWhitespace } from '@sindresorhus/is';\nimport { dequal } from 'dequal';\nimport { logger } from '../../../../../logger/index.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport { matchAt, replaceAt } from '../../../../../util/string.ts';\nimport type { UpdateDependencyConfig, Upgrade } from '../../../types.ts';\nimport { pnpmWorkspaceOverrides } from '../../dep-types.ts';\nimport type {\n DependenciesMeta,\n NpmPackage,\n OverrideDependency,\n RecursiveOverride,\n} from '../../extract/types.ts';\nimport type { NpmDepType, NpmManagerData } from '../../types.ts';\nimport { getNewGitValue, getNewNpmAliasValue } from './common.ts';\nimport { updatePnpmWorkspaceDependency } from './pnpm.ts';\nimport { updateYarnrcCatalogDependency } from './yarn.ts';\n\nfunction renameObjKey(\n oldObj: DependenciesMeta,\n oldKey: string,\n newKey: string,\n): DependenciesMeta {\n const keys = Object.keys(oldObj);\n return keys.reduce((acc, key) => {\n if (key === oldKey) {\n acc[newKey] = oldObj[oldKey];\n } else {\n acc[key] = oldObj[key];\n }\n return acc;\n }, {} as DependenciesMeta);\n}\n\nfunction replaceAsString(\n parsedContents: NpmPackage,\n fileContent: string,\n depType:\n NpmDepType | 'dependenciesMeta' | 'packageManager' | 'pnpm.overrides',\n depName: string,\n oldValue: string,\n newValue: string,\n parents?: string[],\n): string {\n if (depType === 'packageManager') {\n parsedContents[depType] = newValue;\n } else if (depType === 'pnpm.overrides') {\n parsedContents.pnpm!.overrides![depName] = newValue;\n } else if (depName === oldValue) {\n // The old value is the name of the dependency itself\n delete Object.assign(parsedContents[depType]!, {\n [newValue]: parsedContents[depType]![oldValue],\n })[oldValue];\n } else if (depType === 'dependenciesMeta') {\n // v8 ignore else -- TODO: add test #40625\n if (oldValue !== newValue) {\n parsedContents.dependenciesMeta = renameObjKey(\n // TODO #22198\n parsedContents.dependenciesMeta!,\n oldValue,\n newValue,\n );\n }\n } else if (parents && depType === 'overrides') {\n // there is an object as a value in overrides block\n const { depObjectReference, overrideDepName } = overrideDepPosition(\n parsedContents[depType]!,\n parents,\n depName,\n );\n // v8 ignore else -- TODO: add test #40625\n if (depObjectReference) {\n depObjectReference[overrideDepName] = newValue;\n }\n } else {\n // The old value is the version of the dependency\n parsedContents[depType]![depName] = newValue;\n }\n // Look for the old version number\n const searchString = `\"${oldValue}\"`;\n let newString = `\"${newValue}\"`;\n\n const escapedDepName = RegExp.escape(depName);\n const patchRe = regEx(`^(patch:${escapedDepName}@(npm:)?).*#`);\n const match = patchRe.exec(oldValue);\n if (match && depType === 'resolutions') {\n const patch = oldValue.replace(match[0], `${match[1]}${newValue}#`);\n parsedContents[depType]![depName] = patch;\n newString = `\"${patch}\"`;\n }\n\n // Skip ahead to depType section\n let searchIndex = fileContent.indexOf(`\"${depType}\"`) + depType.length;\n logger.trace(`Starting search at index ${searchIndex}`);\n // Iterate through the rest of the file\n for (; searchIndex < fileContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (matchAt(fileContent, searchIndex, searchString)) {\n logger.trace(`Found match at index ${searchIndex}`);\n // Now test if the result matches\n const testContent = replaceAt(\n fileContent,\n searchIndex,\n searchString,\n newString,\n );\n // Compare the parsed JSON structure of old and new\n if (dequal(parsedContents, JSON.parse(testContent))) {\n return testContent;\n }\n }\n }\n // v8 ignore next -- TODO: add test #40625\n throw new Error();\n}\n\nexport function updateDependency({\n fileContent,\n packageFile: packageFileName,\n upgrade,\n}: UpdateDependencyConfig): string | null {\n if (\n upgrade.depType?.startsWith('pnpm.catalog') ||\n upgrade.depType === pnpmWorkspaceOverrides\n ) {\n return updatePnpmWorkspaceDependency({\n fileContent,\n packageFile: packageFileName,\n upgrade,\n });\n }\n if (upgrade.depType?.startsWith('yarn.catalog')) {\n return updateYarnrcCatalogDependency({\n fileContent,\n packageFile: packageFileName,\n upgrade,\n });\n }\n\n const { depType, managerData } = upgrade;\n const depName: string = managerData?.key ?? upgrade.depName;\n let { newValue } = upgrade;\n\n newValue = getNewGitValue(upgrade) ?? newValue;\n newValue = getNewNpmAliasValue(newValue, upgrade) ?? newValue;\n\n logger.debug(`npm.updateDependency(): ${depType}.${depName} = ${newValue}`);\n try {\n const parsedContents: NpmPackage = JSON.parse(fileContent);\n let overrideDepParents: string[] | undefined = undefined;\n // Save the old version\n let oldVersion: string | undefined;\n if (depType === 'packageManager') {\n oldVersion = parsedContents[depType];\n newValue = `${depName}@${newValue}`;\n } else if (isOverrideObject(upgrade)) {\n overrideDepParents = managerData?.parents;\n // v8 ignore else -- TODO: add test #40625\n if (overrideDepParents) {\n // old version when there is an object as a value in overrides block\n const { depObjectReference, overrideDepName } = overrideDepPosition(\n parsedContents.overrides!,\n overrideDepParents,\n depName,\n );\n // v8 ignore else -- TODO: add test #40625\n if (depObjectReference) {\n oldVersion = depObjectReference[overrideDepName]!;\n }\n }\n } else if (depType === 'pnpm.overrides') {\n oldVersion = parsedContents.pnpm?.overrides?.[depName];\n } else {\n oldVersion = parsedContents[depType as NpmDepType]![depName] as string;\n }\n if (\n oldVersion === newValue &&\n (!upgrade.newName || upgrade.newName === depName)\n ) {\n logger.trace('Version is already updated');\n return fileContent;\n }\n\n // TODO #22198\n let newFileContent: string;\n if (upgrade.newName && upgrade.replacementApproach === 'alias') {\n newFileContent = replaceAsString(\n parsedContents,\n fileContent,\n depType as NpmDepType,\n depName,\n oldVersion!,\n `npm:${upgrade.newName}@${newValue}`,\n overrideDepParents,\n );\n } else {\n newFileContent = replaceAsString(\n parsedContents,\n fileContent,\n depType as NpmDepType,\n depName,\n oldVersion!,\n newValue!,\n overrideDepParents,\n );\n if (upgrade.newName && upgrade.newName !== depName) {\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n depType as NpmDepType,\n depName,\n depName,\n upgrade.newName,\n overrideDepParents,\n );\n }\n }\n /* v8 ignore next -- needs test */\n if (!newFileContent) {\n logger.debug(\n { fileContent, parsedContents, depType, depName, newValue },\n 'Warning: updateDependency error',\n );\n return fileContent;\n }\n\n if (parsedContents?.resolutions) {\n let depKey: string | undefined;\n if (parsedContents.resolutions[depName]) {\n depKey = depName;\n } else if (parsedContents.resolutions[`**/${depName}`]) {\n depKey = `**/${depName}`;\n }\n if (depKey) {\n /* v8 ignore next -- needs test */\n if (parsedContents.resolutions[depKey] !== oldVersion) {\n logger.debug(\n {\n depName,\n depKey,\n oldVersion,\n resolutionsVersion: parsedContents.resolutions[depKey],\n },\n 'Upgraded dependency exists in yarn resolutions but is different version',\n );\n }\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n 'resolutions',\n depKey,\n // TODO #22198\n parsedContents.resolutions[depKey]!,\n // TODO #22198\n newValue!,\n );\n if (upgrade.newName && upgrade.newName !== depName) {\n if (depKey === `**/${depName}`) {\n // handles the case where a replacement is in a resolution\n upgrade.newName = `**/${upgrade.newName}`;\n }\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n 'resolutions',\n depKey,\n depKey,\n upgrade.newName,\n );\n }\n }\n }\n if (parsedContents?.dependenciesMeta) {\n for (const [depKey] of Object.entries(parsedContents.dependenciesMeta)) {\n if (depKey.startsWith(`${depName}@`)) {\n newFileContent = replaceAsString(\n parsedContents,\n newFileContent,\n 'dependenciesMeta',\n depName,\n depKey,\n // TODO: types (#22198)\n `${depName}@${newValue}`,\n );\n }\n }\n }\n return newFileContent;\n } catch (err) {\n logger.debug({ err }, 'updateDependency error');\n return null;\n }\n}\n\nfunction overrideDepPosition(\n overrideBlock: OverrideDependency,\n parents: string[],\n depName: string,\n): {\n depObjectReference: Record<string, string>;\n overrideDepName: string;\n} {\n // get override dep position when its nested in an object\n const lastParent = parents.at(-1);\n let overrideDep: OverrideDependency = overrideBlock;\n for (const parent of parents) {\n // v8 ignore else -- TODO: add test #40625\n if (overrideDep) {\n overrideDep = overrideDep[parent] as Record<string, RecursiveOverride>;\n }\n }\n const overrideDepName = depName === lastParent ? '.' : depName;\n const depObjectReference = overrideDep as Record<string, string>;\n return { depObjectReference, overrideDepName };\n}\n\nfunction isOverrideObject(upgrade: Upgrade<NpmManagerData>): boolean {\n return (\n isArray(upgrade.managerData?.parents, isNonEmptyStringAndNotWhitespace) &&\n upgrade.depType === 'overrides'\n );\n}\n"],"mappings":"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"}
@@ -13,7 +13,7 @@ function extractPackageFile(content, packageFile, _config) {
13
13
  if (!parsed.success) {
14
14
  logger.trace({
15
15
  packageFile,
16
- error: parsed.error
16
+ err: parsed.error
17
17
  }, "Failed to parse OCB schema");
18
18
  return null;
19
19
  }
@@ -21,7 +21,7 @@ function extractPackageFile(content, packageFile, _config) {
21
21
  } catch (error) {
22
22
  logger.debug({
23
23
  packageFile,
24
- error
24
+ err: error
25
25
  }, "OCB manager failed to parse file as YAML");
26
26
  return null;
27
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ocb/extract.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { type Module, OCBConfig } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n _config?: ExtractConfig,\n): PackageFileContent | null {\n let definition: OCBConfig | null = null;\n try {\n const yaml = parseSingleYaml(content);\n const parsed = OCBConfig.safeParse(yaml);\n if (!parsed.success) {\n logger.trace(\n { packageFile, error: parsed.error },\n 'Failed to parse OCB schema',\n );\n return null;\n }\n\n definition = parsed.data;\n } catch (error) {\n logger.debug(\n { packageFile, error },\n 'OCB manager failed to parse file as YAML',\n );\n return null;\n }\n\n const deps: PackageDependency[] = [];\n if (definition.dist.otelcol_version) {\n deps.push({\n datasource: GoDatasource.id,\n depType: 'collector',\n depName: 'go.opentelemetry.io/collector',\n currentValue: definition.dist.otelcol_version,\n extractVersion: '^v(?<version>\\\\S+)',\n });\n }\n\n deps.push(...processModule(definition.connectors, 'connectors'));\n deps.push(...processModule(definition.exporters, 'exports'));\n deps.push(...processModule(definition.extensions, 'extensions'));\n deps.push(...processModule(definition.processors, 'processors'));\n deps.push(...processModule(definition.providers, 'providers'));\n deps.push(...processModule(definition.receivers, 'receivers'));\n\n return {\n packageFileVersion: definition.dist.version,\n deps,\n };\n}\n\nexport function processModule(\n module: Module,\n depType: string,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n if (isNullOrUndefined(module)) {\n return deps;\n }\n\n for (const element of module) {\n const [depName, currentValue] = element.gomod.trim().split(regEx(/\\s+/));\n deps.push({\n datasource: GoDatasource.id,\n depType,\n depName,\n currentValue,\n });\n }\n\n return deps;\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,mBACd,SACA,aACA,SAC2B;CAC3B,IAAI,aAA+B;CACnC,IAAI;EACF,MAAM,OAAO,gBAAgB,OAAO;EACpC,MAAM,SAAS,UAAU,UAAU,IAAI;EACvC,IAAI,CAAC,OAAO,SAAS;GACnB,OAAO,MACL;IAAE;IAAa,OAAO,OAAO;GAAM,GACnC,4BACF;GACA,OAAO;EACT;EAEA,aAAa,OAAO;CACtB,SAAS,OAAO;EACd,OAAO,MACL;GAAE;GAAa;EAAM,GACrB,0CACF;EACA,OAAO;CACT;CAEA,MAAM,OAA4B,CAAC;CACnC,IAAI,WAAW,KAAK,iBAClB,KAAK,KAAK;EACR,YAAY,aAAa;EACzB,SAAS;EACT,SAAS;EACT,cAAc,WAAW,KAAK;EAC9B,gBAAgB;CAClB,CAAC;CAGH,KAAK,KAAK,GAAG,cAAc,WAAW,YAAY,YAAY,CAAC;CAC/D,KAAK,KAAK,GAAG,cAAc,WAAW,WAAW,SAAS,CAAC;CAC3D,KAAK,KAAK,GAAG,cAAc,WAAW,YAAY,YAAY,CAAC;CAC/D,KAAK,KAAK,GAAG,cAAc,WAAW,YAAY,YAAY,CAAC;CAC/D,KAAK,KAAK,GAAG,cAAc,WAAW,WAAW,WAAW,CAAC;CAC7D,KAAK,KAAK,GAAG,cAAc,WAAW,WAAW,WAAW,CAAC;CAE7D,OAAO;EACL,oBAAoB,WAAW,KAAK;EACpC;CACF;AACF;AAEA,SAAgB,cACd,QACA,SACqB;CACrB,MAAM,OAA4B,CAAC;CACnC,IAAI,kBAAkB,MAAM,GAC1B,OAAO;CAGT,KAAK,MAAM,WAAW,QAAQ;EAC5B,MAAM,CAAC,SAAS,gBAAgB,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,MAAM,KAAK,CAAC;EACvE,KAAK,KAAK;GACR,YAAY,aAAa;GACzB;GACA;GACA;EACF,CAAC;CACH;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/ocb/extract.ts"],"sourcesContent":["import { isNullOrUndefined } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { type Module, OCBConfig } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n _config?: ExtractConfig,\n): PackageFileContent | null {\n let definition: OCBConfig | null = null;\n try {\n const yaml = parseSingleYaml(content);\n const parsed = OCBConfig.safeParse(yaml);\n if (!parsed.success) {\n logger.trace(\n { packageFile, err: parsed.error },\n 'Failed to parse OCB schema',\n );\n return null;\n }\n\n definition = parsed.data;\n } catch (error) {\n logger.debug(\n { packageFile, err: error },\n 'OCB manager failed to parse file as YAML',\n );\n return null;\n }\n\n const deps: PackageDependency[] = [];\n if (definition.dist.otelcol_version) {\n deps.push({\n datasource: GoDatasource.id,\n depType: 'collector',\n depName: 'go.opentelemetry.io/collector',\n currentValue: definition.dist.otelcol_version,\n extractVersion: '^v(?<version>\\\\S+)',\n });\n }\n\n deps.push(...processModule(definition.connectors, 'connectors'));\n deps.push(...processModule(definition.exporters, 'exports'));\n deps.push(...processModule(definition.extensions, 'extensions'));\n deps.push(...processModule(definition.processors, 'processors'));\n deps.push(...processModule(definition.providers, 'providers'));\n deps.push(...processModule(definition.receivers, 'receivers'));\n\n return {\n packageFileVersion: definition.dist.version,\n deps,\n };\n}\n\nexport function processModule(\n module: Module,\n depType: string,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n if (isNullOrUndefined(module)) {\n return deps;\n }\n\n for (const element of module) {\n const [depName, currentValue] = element.gomod.trim().split(regEx(/\\s+/));\n deps.push({\n datasource: GoDatasource.id,\n depType,\n depName,\n currentValue,\n });\n }\n\n return deps;\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,mBACd,SACA,aACA,SAC2B;CAC3B,IAAI,aAA+B;CACnC,IAAI;EACF,MAAM,OAAO,gBAAgB,OAAO;EACpC,MAAM,SAAS,UAAU,UAAU,IAAI;EACvC,IAAI,CAAC,OAAO,SAAS;GACnB,OAAO,MACL;IAAE;IAAa,KAAK,OAAO;GAAM,GACjC,4BACF;GACA,OAAO;EACT;EAEA,aAAa,OAAO;CACtB,SAAS,OAAO;EACd,OAAO,MACL;GAAE;GAAa,KAAK;EAAM,GAC1B,0CACF;EACA,OAAO;CACT;CAEA,MAAM,OAA4B,CAAC;CACnC,IAAI,WAAW,KAAK,iBAClB,KAAK,KAAK;EACR,YAAY,aAAa;EACzB,SAAS;EACT,SAAS;EACT,cAAc,WAAW,KAAK;EAC9B,gBAAgB;CAClB,CAAC;CAGH,KAAK,KAAK,GAAG,cAAc,WAAW,YAAY,YAAY,CAAC;CAC/D,KAAK,KAAK,GAAG,cAAc,WAAW,WAAW,SAAS,CAAC;CAC3D,KAAK,KAAK,GAAG,cAAc,WAAW,YAAY,YAAY,CAAC;CAC/D,KAAK,KAAK,GAAG,cAAc,WAAW,YAAY,YAAY,CAAC;CAC/D,KAAK,KAAK,GAAG,cAAc,WAAW,WAAW,WAAW,CAAC;CAC7D,KAAK,KAAK,GAAG,cAAc,WAAW,WAAW,WAAW,CAAC;CAE7D,OAAO;EACL,oBAAoB,WAAW,KAAK;EACpC;CACF;AACF;AAEA,SAAgB,cACd,QACA,SACqB;CACrB,MAAM,OAA4B,CAAC;CACnC,IAAI,kBAAkB,MAAM,GAC1B,OAAO;CAGT,KAAK,MAAM,WAAW,QAAQ;EAC5B,MAAM,CAAC,SAAS,gBAAgB,QAAQ,MAAM,KAAK,CAAC,CAAC,MAAM,MAAM,KAAK,CAAC;EACvE,KAAK,KAAK;GACR,YAAY,aAAa;GACzB;GACA;GACA;EACF,CAAC;CACH;CAEA,OAAO;AACT"}
@@ -11,7 +11,7 @@ function extractPep723(content, packageFile) {
11
11
  if (error) {
12
12
  logger.debug({
13
13
  packageFile,
14
- error
14
+ err: error
15
15
  }, `Error parsing PEP 723 inline script metadata`);
16
16
  return null;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/pep723/utils.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { PackageFileContent } from '../types.ts';\nimport { Pep723 } from './schema.ts';\n\n// Adapted regex from the Python reference implementation: https://packaging.python.org/en/latest/specifications/inline-script-metadata/#reference-implementation\nconst regex = regEx(\n /^# \\/\\/\\/ (?<type>[a-zA-Z0-9-]+)$\\s(?<content>(?:^#(?:| .*)$\\s)+)^# \\/\\/\\/$/,\n 'm',\n);\n\nexport function extractPep723(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n const match = regex.exec(content);\n const matchedContent = match?.groups?.content;\n\n if (!matchedContent) {\n return null;\n }\n\n // Adapted code from the Python reference implementation: https://packaging.python.org/en/latest/specifications/inline-script-metadata/#reference-implementation\n const parsedToml = matchedContent\n .split(newlineRegex)\n .map((line) => line.substring(line.startsWith('# ') ? 2 : 1))\n .join('\\n');\n\n const { data: res, error } = Pep723.safeParse(parsedToml);\n\n if (error) {\n logger.debug(\n { packageFile, error },\n `Error parsing PEP 723 inline script metadata`,\n );\n return null;\n }\n\n return res.deps.length ? res : null;\n}\n"],"mappings":";;;;AAMA,MAAM,QAAQ,MACZ,+EACA,GACF;AAEA,SAAgB,cACd,SACA,aAC2B;CAE3B,MAAM,iBADQ,MAAM,KAAK,OACE,CAAC,EAAE,QAAQ;CAEtC,IAAI,CAAC,gBACH,OAAO;CAIT,MAAM,aAAa,eAChB,MAAM,YAAY,CAAC,CACnB,KAAK,SAAS,KAAK,UAAU,KAAK,WAAW,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAC5D,KAAK,IAAI;CAEZ,MAAM,EAAE,MAAM,KAAK,UAAU,OAAO,UAAU,UAAU;CAExD,IAAI,OAAO;EACT,OAAO,MACL;GAAE;GAAa;EAAM,GACrB,8CACF;EACA,OAAO;CACT;CAEA,OAAO,IAAI,KAAK,SAAS,MAAM;AACjC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../lib/modules/manager/pep723/utils.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport type { PackageFileContent } from '../types.ts';\nimport { Pep723 } from './schema.ts';\n\n// Adapted regex from the Python reference implementation: https://packaging.python.org/en/latest/specifications/inline-script-metadata/#reference-implementation\nconst regex = regEx(\n /^# \\/\\/\\/ (?<type>[a-zA-Z0-9-]+)$\\s(?<content>(?:^#(?:| .*)$\\s)+)^# \\/\\/\\/$/,\n 'm',\n);\n\nexport function extractPep723(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n const match = regex.exec(content);\n const matchedContent = match?.groups?.content;\n\n if (!matchedContent) {\n return null;\n }\n\n // Adapted code from the Python reference implementation: https://packaging.python.org/en/latest/specifications/inline-script-metadata/#reference-implementation\n const parsedToml = matchedContent\n .split(newlineRegex)\n .map((line) => line.substring(line.startsWith('# ') ? 2 : 1))\n .join('\\n');\n\n const { data: res, error } = Pep723.safeParse(parsedToml);\n\n if (error) {\n logger.debug(\n { packageFile, err: error },\n `Error parsing PEP 723 inline script metadata`,\n );\n return null;\n }\n\n return res.deps.length ? res : null;\n}\n"],"mappings":";;;;AAMA,MAAM,QAAQ,MACZ,+EACA,GACF;AAEA,SAAgB,cACd,SACA,aAC2B;CAE3B,MAAM,iBADQ,MAAM,KAAK,OACE,CAAC,EAAE,QAAQ;CAEtC,IAAI,CAAC,gBACH,OAAO;CAIT,MAAM,aAAa,eAChB,MAAM,YAAY,CAAC,CACnB,KAAK,SAAS,KAAK,UAAU,KAAK,WAAW,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAC5D,KAAK,IAAI;CAEZ,MAAM,EAAE,MAAM,KAAK,UAAU,OAAO,UAAU,UAAU;CAExD,IAAI,OAAO;EACT,OAAO,MACL;GAAE;GAAa,KAAK;EAAM,GAC1B,8CACF;EACA,OAAO;CACT;CAEA,OAAO,IAAI,KAAK,SAAS,MAAM;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":["rangePattern","parseToml","pipenvDetect"],"sources":["../../../../lib/modules/manager/pipenv/extract.ts"],"sourcesContent":["import { pipenv as pipenvDetect } from '@renovatebot/detect-tools';\nimport { RANGE_PATTERN } from '@renovatebot/pep440';\nimport { isArray, isObject, isString, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { SkipReason } from '../../../types/index.ts';\nimport type { ConstraintName } from '../../../util/exec/types.ts';\nimport { getParentDir, localPathExists } from '../../../util/fs/index.ts';\nimport { ensureLocalPath } from '../../../util/fs/util.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parse as parseToml } from '../../../util/toml.ts';\nimport { normalizePythonDepName } from '../../datasource/pypi/common.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { PipFile, PipRequirement, PipSource } from './types.ts';\n\n// based on https://www.python.org/dev/peps/pep-0508/#names\nexport const packagePattern = '[A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9]';\nexport const extrasPattern = '(?:\\\\s*\\\\[[^\\\\]]+\\\\])*';\nconst packageRegex = regEx(`^(${packagePattern})(${extrasPattern})$`, 'i');\n\nconst rangePattern: string = RANGE_PATTERN;\n\nconst specifierPartPattern = `\\\\s*${rangePattern.replace(\n regEx(/\\?<\\w+>/g),\n '?:',\n)}\\\\s*`;\nconst specifierPattern = `${specifierPartPattern}(?:,${specifierPartPattern})*`;\nconst specifierRegex = regEx(`^${specifierPattern}$`);\nfunction extractFromSection(\n sectionName: string,\n pipfileSection: Record<string, PipRequirement>,\n sources?: PipSource[],\n): PackageDependency[] {\n const deps = Object.entries(pipfileSection)\n .map((x) => {\n const [packageNameString, requirements] = x;\n let depName = packageNameString;\n\n let currentValue: string | undefined;\n let nestedVersion = false;\n let skipReason: SkipReason | undefined;\n if (isObject(requirements)) {\n if (requirements.git) {\n skipReason = 'git-dependency';\n } else if (requirements.file) {\n skipReason = 'file-dependency';\n } else if (requirements.path) {\n skipReason = 'local-dependency';\n } else if (requirements.version) {\n currentValue = requirements.version;\n nestedVersion = true;\n } else {\n skipReason = 'unspecified-version';\n }\n } else {\n currentValue = requirements;\n }\n if (currentValue === '*') {\n skipReason = 'unspecified-version';\n }\n if (!skipReason) {\n const packageMatches = packageRegex.exec(packageNameString);\n if (packageMatches) {\n depName = packageMatches[1];\n } else {\n logger.debug(\n `Skipping dependency with malformed package name \"${packageNameString}\".`,\n );\n skipReason = 'invalid-name';\n }\n // validated above\n const specifierMatches = specifierRegex.exec(currentValue!);\n if (!specifierMatches) {\n logger.debug(\n `Skipping dependency with malformed version specifier \"${currentValue!}\".`,\n );\n skipReason = 'invalid-version';\n }\n }\n const dep: PackageDependency = {\n depType: sectionName,\n depName,\n packageName: normalizePythonDepName(depName),\n managerData: {},\n };\n if (currentValue) {\n dep.currentValue = currentValue;\n }\n if (skipReason) {\n dep.skipReason = skipReason;\n } else {\n dep.datasource = PypiDatasource.id;\n }\n if (!skipReason && currentValue?.startsWith('==')) {\n dep.currentVersion = currentValue.replace(regEx(/^==\\s*/), '');\n }\n if (nestedVersion) {\n // TODO #22198\n dep.managerData!.nestedVersion = nestedVersion;\n }\n if (sources && isObject(requirements) && requirements.index) {\n const source = sources.find((item) => item.name === requirements.index);\n if (source) {\n dep.registryUrls = [source.url];\n }\n }\n return dep;\n })\n .filter(isTruthy);\n return deps;\n}\n\nfunction isPipRequirements(\n section?:\n | Record<string, PipRequirement>\n | Record<string, string>\n | PipSource[],\n): section is Record<string, PipRequirement> {\n return (\n !isArray(section) &&\n isObject(section) &&\n !Object.values(section).some((dep) => !isObject(dep) && !isString(dep))\n );\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n): Promise<PackageFileContent | null> {\n logger.trace(`pipenv.extractPackageFile(${packageFile})`);\n\n let pipfile: PipFile;\n try {\n // TODO: fix type (#9610)\n pipfile = parseToml(content) as any;\n } catch (err) {\n logger.debug({ err, packageFile }, 'Error parsing Pipfile');\n return null;\n }\n const res: PackageFileContent = { deps: [] };\n\n const sources = pipfile?.source;\n\n if (sources) {\n res.registryUrls = sources.map((source) => source.url);\n }\n\n res.deps = Object.entries(pipfile)\n .map(([category, section]) => {\n if (\n category === 'source' ||\n category === 'requires' ||\n !isPipRequirements(section)\n ) {\n return [];\n }\n\n return extractFromSection(category, section, sources);\n })\n .flat();\n\n if (!res.deps.length) {\n return null;\n }\n\n const extractedConstraints: Partial<Record<ConstraintName, string>> = {};\n\n const pipfileDir = getParentDir(ensureLocalPath(packageFile));\n\n const pythonConstraint = await pipenvDetect.getPythonConstraint(pipfileDir);\n if (pythonConstraint) {\n extractedConstraints.python = pythonConstraint;\n }\n\n const pipenvConstraint = await pipenvDetect.getPipenvConstraint(pipfileDir);\n if (pipenvConstraint) {\n extractedConstraints.pipenv = pipenvConstraint;\n }\n\n const lockFileName = `${packageFile}.lock`;\n if (await localPathExists(lockFileName)) {\n res.lockFiles = [lockFileName];\n }\n\n res.extractedConstraints = extractedConstraints;\n return res;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","names":["rangePattern","parseToml","pipenvDetect"],"sources":["../../../../lib/modules/manager/pipenv/extract.ts"],"sourcesContent":["import { pipenv as pipenvDetect } from '@renovatebot/detect-tools';\nimport { RANGE_PATTERN } from '@renovatebot/pep440';\nimport { isArray, isObject, isString, isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { SkipReason } from '../../../types/index.ts';\nimport type { ConstraintName } from '../../../util/exec/types.ts';\nimport { getParentDir, localPathExists } from '../../../util/fs/index.ts';\nimport { ensureLocalPath } from '../../../util/fs/util.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parse as parseToml } from '../../../util/toml.ts';\nimport { normalizePythonDepName } from '../../datasource/pypi/common.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { PipFile, PipRequirement, PipSource } from './types.ts';\n\n// based on https://www.python.org/dev/peps/pep-0508/#names\nexport const packagePattern = '[A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9]';\nexport const extrasPattern = '(?:\\\\s*\\\\[[^\\\\]]+\\\\])*';\nconst packageRegex = regEx(`^(${packagePattern})(${extrasPattern})$`, 'i');\n\nconst rangePattern: string = RANGE_PATTERN;\n\nconst specifierPartPattern = `\\\\s*${rangePattern.replace(\n regEx(/\\?<\\w+>/g),\n '?:',\n)}\\\\s*`;\nconst specifierPattern = `${specifierPartPattern}(?:,${specifierPartPattern})*`;\nconst specifierRegex = regEx(`^${specifierPattern}$`);\nfunction extractFromSection(\n sectionName: string,\n pipfileSection: Record<string, PipRequirement>,\n sources?: PipSource[],\n): PackageDependency[] {\n const deps = Object.entries(pipfileSection)\n .map((x) => {\n const [packageNameString, requirements] = x;\n let depName = packageNameString;\n\n let currentValue: string | undefined;\n let nestedVersion = false;\n let skipReason: SkipReason | undefined;\n if (isObject(requirements)) {\n if (requirements.git) {\n skipReason = 'git-dependency';\n } else if (requirements.file) {\n skipReason = 'file-dependency';\n } else if (requirements.path) {\n skipReason = 'local-dependency';\n } else if (requirements.version) {\n currentValue = requirements.version;\n nestedVersion = true;\n } else {\n skipReason = 'unspecified-version';\n }\n } else {\n currentValue = requirements;\n }\n if (currentValue === '*') {\n skipReason = 'unspecified-version';\n }\n if (!skipReason) {\n const packageMatches = packageRegex.exec(packageNameString);\n if (packageMatches) {\n depName = packageMatches[1];\n } else {\n logger.debug(\n `Skipping dependency with malformed package name \"${packageNameString}\".`,\n );\n skipReason = 'invalid-name';\n }\n // validated above\n const specifierMatches = specifierRegex.exec(currentValue!);\n if (!specifierMatches) {\n logger.debug(\n `Skipping dependency with malformed version specifier \"${currentValue!}\".`,\n );\n skipReason = 'invalid-version';\n }\n }\n const dep: PackageDependency = {\n depType: sectionName,\n depName,\n packageName: normalizePythonDepName(depName),\n managerData: {},\n };\n if (currentValue) {\n dep.currentValue = currentValue;\n }\n if (skipReason) {\n dep.skipReason = skipReason;\n } else {\n dep.datasource = PypiDatasource.id;\n }\n if (!skipReason && currentValue?.startsWith('==')) {\n dep.currentVersion = currentValue.replace(regEx(/^==\\s*/), '');\n }\n if (nestedVersion) {\n // TODO #22198\n dep.managerData!.nestedVersion = nestedVersion;\n }\n if (sources && isObject(requirements) && requirements.index) {\n const source = sources.find((item) => item.name === requirements.index);\n if (source) {\n dep.registryUrls = [source.url];\n }\n }\n return dep;\n })\n .filter(isTruthy);\n return deps;\n}\n\nfunction isPipRequirements(\n section?:\n Record<string, PipRequirement> | Record<string, string> | PipSource[],\n): section is Record<string, PipRequirement> {\n return (\n !isArray(section) &&\n isObject(section) &&\n !Object.values(section).some((dep) => !isObject(dep) && !isString(dep))\n );\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n): Promise<PackageFileContent | null> {\n logger.trace(`pipenv.extractPackageFile(${packageFile})`);\n\n let pipfile: PipFile;\n try {\n // TODO: fix type (#9610)\n pipfile = parseToml(content) as any;\n } catch (err) {\n logger.debug({ err, packageFile }, 'Error parsing Pipfile');\n return null;\n }\n const res: PackageFileContent = { deps: [] };\n\n const sources = pipfile?.source;\n\n if (sources) {\n res.registryUrls = sources.map((source) => source.url);\n }\n\n res.deps = Object.entries(pipfile)\n .map(([category, section]) => {\n if (\n category === 'source' ||\n category === 'requires' ||\n !isPipRequirements(section)\n ) {\n return [];\n }\n\n return extractFromSection(category, section, sources);\n })\n .flat();\n\n if (!res.deps.length) {\n return null;\n }\n\n const extractedConstraints: Partial<Record<ConstraintName, string>> = {};\n\n const pipfileDir = getParentDir(ensureLocalPath(packageFile));\n\n const pythonConstraint = await pipenvDetect.getPythonConstraint(pipfileDir);\n if (pythonConstraint) {\n extractedConstraints.python = pythonConstraint;\n }\n\n const pipenvConstraint = await pipenvDetect.getPipenvConstraint(pipfileDir);\n if (pipenvConstraint) {\n extractedConstraints.pipenv = pipenvConstraint;\n }\n\n const lockFileName = `${packageFile}.lock`;\n if (await localPathExists(lockFileName)) {\n res.lockFiles = [lockFileName];\n }\n\n res.extractedConstraints = extractedConstraints;\n return res;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":["pep440Versioning.isValid","pep440Versioning.id","poetryVersioning.isValid","poetryVersioning.id","deepmerge"],"sources":["../../../../lib/modules/manager/poetry/schema.ts"],"sourcesContent":["import deepmerge from 'deepmerge';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport {\n LooseArray,\n LooseRecord,\n Toml,\n withDepType,\n} from '../../../util/schema-utils/index.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { normalizePythonDepName } from '../../datasource/pypi/common.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport * as gitVersioning from '../../versioning/git/index.ts';\nimport * as pep440Versioning from '../../versioning/pep440/index.ts';\nimport * as poetryVersioning from '../../versioning/poetry/index.ts';\nimport { DependencyGroup, ProjectSection } from '../pep621/schema.ts';\nimport { depTypes, pep508ToPackageDependency } from '../pep621/utils.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\n\nconst PoetryOptionalDependencyMixin = z\n .object({\n optional: z.boolean().optional().catch(false),\n })\n .transform(\n ({ optional }): PackageDependency =>\n optional ? { depType: 'extras' } : {},\n );\n\nconst PoetryPathDependency = z\n .object({\n path: z.string(),\n version: z.string().optional().catch(undefined),\n })\n .transform(({ version }): PackageDependency => {\n const dep: PackageDependency = {\n datasource: PypiDatasource.id,\n skipReason: 'path-dependency',\n };\n\n if (version) {\n dep.currentValue = version;\n }\n\n return dep;\n })\n .and(PoetryOptionalDependencyMixin);\n\nconst PoetryGitDependency = z\n .object({\n git: z.string(),\n tag: z.string().optional().catch(undefined),\n version: z.string().optional().catch(undefined),\n branch: z.string().optional().catch(undefined),\n rev: z.string().optional().catch(undefined),\n })\n .transform(({ git, tag, version, branch, rev }): PackageDependency => {\n if (tag) {\n const { source, owner, name } = parseGitUrl(git);\n const repo = `${owner}/${name}`;\n if (source === 'github.com') {\n return {\n datasource: GithubTagsDatasource.id,\n currentValue: tag,\n packageName: repo,\n };\n }\n if (source === 'gitlab.com') {\n return {\n datasource: GitlabTagsDatasource.id,\n currentValue: tag,\n packageName: repo,\n };\n }\n return {\n datasource: GitTagsDatasource.id,\n currentValue: tag,\n packageName: git,\n };\n }\n\n if (rev) {\n return {\n datasource: GitRefsDatasource.id,\n currentValue: branch,\n currentDigest: rev,\n replaceString: rev,\n packageName: git,\n };\n }\n\n return {\n datasource: GitRefsDatasource.id,\n currentValue: version,\n packageName: git,\n skipReason: 'git-dependency',\n };\n })\n .and(PoetryOptionalDependencyMixin);\n\nconst PoetryPypiDependency = z.union([\n z\n .object({ version: z.string().optional(), source: z.string().optional() })\n .transform(({ version: currentValue, source }): PackageDependency => {\n const managerData = source ? { sourceName: source.toLowerCase() } : {};\n\n if (!currentValue) {\n return { datasource: PypiDatasource.id, managerData };\n }\n\n return {\n datasource: PypiDatasource.id,\n managerData: { ...managerData, nestedVersion: true },\n currentValue,\n };\n })\n .and(PoetryOptionalDependencyMixin),\n z.string().transform(\n (version): PackageDependency => ({\n datasource: PypiDatasource.id,\n currentValue: version,\n managerData: { nestedVersion: false },\n }),\n ),\n]);\n\nconst PoetryArrayDependency = z.array(z.unknown()).transform(\n (): PackageDependency => ({\n datasource: PypiDatasource.id,\n skipReason: 'multiple-constraint-dep',\n }),\n);\n\nconst PoetryDependency = z.union([\n PoetryPathDependency,\n PoetryGitDependency,\n PoetryPypiDependency,\n PoetryArrayDependency,\n]);\n\nexport const PoetryDependencies = LooseRecord(\n z.string(),\n PoetryDependency.transform((dep) => {\n if (dep.skipReason) {\n return dep;\n }\n\n if (dep.datasource === GitRefsDatasource.id && dep.currentDigest) {\n dep.versioning = gitVersioning.id;\n return dep;\n }\n\n // istanbul ignore if: normaly should not happen\n if (!dep.currentValue) {\n dep.skipReason = 'unspecified-version';\n return dep;\n }\n\n if (pep440Versioning.isValid(dep.currentValue)) {\n dep.versioning = pep440Versioning.id;\n return dep;\n }\n\n if (poetryVersioning.isValid(dep.currentValue)) {\n dep.versioning = poetryVersioning.id;\n return dep;\n }\n\n dep.skipReason = 'invalid-version';\n return dep;\n }),\n).transform((record) => {\n const deps: PackageDependency[] = [];\n for (const [depName, dep] of Object.entries(record)) {\n dep.depName = depName;\n if (!dep.packageName) {\n const packageName = normalizePythonDepName(depName);\n if (depName !== packageName) {\n dep.packageName = packageName;\n }\n }\n deps.push(dep);\n }\n return deps;\n});\n\nexport const PoetryGroupDependencies = LooseRecord(\n z.string(),\n z\n .object({ dependencies: PoetryDependencies })\n .transform(({ dependencies }) => dependencies),\n).transform((record) => {\n const deps: PackageDependency[] = [];\n for (const [name, val] of Object.entries(record)) {\n for (const dep of Object.values(val)) {\n dep.depType = name;\n deps.push(dep);\n }\n }\n return deps;\n});\n\nconst PoetrySourceOrder = [\n 'default',\n 'primary',\n 'secondary',\n 'supplemental',\n 'explicit',\n] as const;\n\nexport const PoetrySource = z.object({\n name: z.string().toLowerCase(),\n url: z.string().optional(),\n priority: z.enum(PoetrySourceOrder).default('primary'),\n});\nexport type PoetrySource = z.infer<typeof PoetrySource>;\n\nexport const PoetrySources = LooseArray(PoetrySource, {\n onError: ({ error: err }) => {\n logger.debug({ err }, 'Poetry: error parsing sources array');\n },\n})\n .transform((sources) => {\n const pypiUrl = getEnv().PIP_INDEX_URL ?? 'https://pypi.org/pypi/';\n const result: PoetrySource[] = [];\n\n let overridesPyPi = false;\n let hasDefaultSource = false;\n let hasPrimarySource = false;\n for (const source of sources) {\n if (source.name === 'pypi') {\n source.url = pypiUrl;\n overridesPyPi = true;\n }\n\n if (!source.url) {\n continue;\n }\n\n if (source.priority === 'default') {\n hasDefaultSource = true;\n } else if (source.priority === 'primary') {\n hasPrimarySource = true;\n }\n\n result.push(source);\n }\n\n if (sources.length && !hasDefaultSource && !overridesPyPi) {\n result.push({\n name: 'pypi',\n priority: hasPrimarySource ? 'secondary' : 'default',\n url: pypiUrl,\n });\n }\n\n result.sort(\n (a, b) =>\n PoetrySourceOrder.indexOf(a.priority) -\n PoetrySourceOrder.indexOf(b.priority),\n );\n\n return result;\n })\n .catch([]);\n\nexport const PoetrySection = z.object({\n version: z.string().optional().catch(undefined),\n dependencies: withDepType(\n PoetryDependencies,\n 'dependencies',\n false,\n ).optional(),\n 'dev-dependencies': withDepType(\n PoetryDependencies,\n 'dev-dependencies',\n ).optional(),\n group: PoetryGroupDependencies.optional(),\n source: PoetrySources,\n});\n\nexport type PoetrySection = z.infer<typeof PoetrySection>;\n\nconst BuildSystemRequires = LooseArray(\n z\n .string()\n .nonempty()\n .transform((val) =>\n pep508ToPackageDependency(depTypes.buildSystemRequires, val),\n )\n .refine((dep) => dep !== null),\n).catch([]);\n\nexport const PoetryPyProject = Toml.pipe(\n z\n .object({\n project: ProjectSection.optional().catch(undefined),\n tool: z.object({ poetry: PoetrySection }).optional().catch(undefined),\n 'dependency-groups': DependencyGroup(depTypes.dependencyGroups).catch([]),\n 'build-system': z\n .object({\n 'build-backend': z.string().refine(\n // https://python-poetry.org/docs/pyproject/#poetry-and-pep-517\n (buildBackend) =>\n buildBackend === 'poetry.masonry.api' ||\n buildBackend === 'poetry.core.masonry.api',\n ),\n requires: BuildSystemRequires,\n })\n .transform(({ requires }) => {\n const req = requires.find(\n ({ depName }) =>\n depName === 'poetry' ||\n depName === 'poetry_core' ||\n depName === 'poetry-core',\n );\n return {\n poetryRequirement: req?.currentValue,\n requires,\n };\n })\n .optional()\n .catch(undefined),\n })\n .transform((pyproject) => {\n const {\n project,\n tool,\n 'build-system': buildSystem,\n 'dependency-groups': dependencyGroups,\n } = pyproject;\n\n const deps: PackageDependency[] = [];\n const projectDependencies = coerceArray(project?.dependencies);\n const projectOptionalDependencies = coerceArray(\n project?.['optional-dependencies'],\n );\n\n const projectDepsByName: Record<string, PackageDependency> = {};\n for (const dep of [\n ...projectDependencies,\n ...dependencyGroups,\n ...projectOptionalDependencies,\n ]) {\n projectDepsByName[dep.depName!] = dep;\n }\n\n if (buildSystem?.requires) {\n deps.push(...buildSystem.requires);\n }\n\n const poetryDependencies = coerceArray(tool?.poetry?.dependencies);\n\n const poetryDevDependencies = coerceArray(\n tool?.poetry?.['dev-dependencies'],\n );\n\n const poetryGroupDependencies = coerceArray(tool?.poetry?.group);\n\n for (const poetryDep of [\n ...poetryDependencies,\n ...poetryDevDependencies,\n ...poetryGroupDependencies,\n ]) {\n const depName = poetryDep.depName;\n const projectDep = depName && projectDepsByName[depName];\n // When the same dep exists in project.dependencies or dependency-groups,\n // Poetry just uses the Poetry dep to enrich the project dependency.\n if (projectDep) {\n const mergedDep = deepmerge<PackageDependency>(poetryDep, projectDep);\n // Poetry supports specifying the version in project.dependencies and\n // tool.poetry.dependencies *at the same time* and only errors if both\n // are not compatible - we require a single constraint per dependency.\n if (projectDep.currentValue && poetryDep.currentValue) {\n mergedDep.skipReason = 'invalid-dependency-specification';\n }\n // When a skipReason is 'unspecified-version', we defer to the other skipReason,\n // so that 'unspecified-version' only persists if both deps have no version.\n if (mergedDep.skipReason === 'unspecified-version') {\n if (poetryDep.skipReason === 'unspecified-version') {\n mergedDep.skipReason = projectDep.skipReason;\n } else {\n mergedDep.skipReason = poetryDep.skipReason;\n }\n }\n projectDepsByName[depName] = mergedDep;\n } else {\n deps.push(poetryDep);\n }\n }\n\n deps.push(...Object.values(projectDepsByName));\n\n const packageFileVersion = tool?.poetry?.version;\n const packageFileContent: PackageFileContent = {\n deps,\n packageFileVersion,\n };\n\n const sourceUrls = tool?.poetry?.source;\n if (sourceUrls) {\n for (const dep of deps) {\n if (dep.managerData?.sourceName) {\n const sourceUrl = sourceUrls.find(\n ({ name }) => name === dep.managerData?.sourceName,\n );\n if (sourceUrl?.url) {\n dep.registryUrls = [sourceUrl.url];\n }\n }\n }\n\n const sourceUrlsFiltered = sourceUrls.filter(\n ({ priority }) => priority !== 'explicit',\n );\n if (sourceUrlsFiltered.length) {\n packageFileContent.registryUrls = uniq(\n sourceUrlsFiltered.map(({ url }) => url!),\n );\n }\n }\n\n return {\n packageFileContent,\n poetryRequirement: buildSystem?.poetryRequirement,\n };\n }),\n);\n\nexport type PoetryPyProject = z.infer<typeof PoetryPyProject>;\n\nconst poetryConstraint: Record<string, string> = {\n '1.0': '<1.1.0',\n '1.1': '<1.3.0',\n '2.0': '>=1.3.0 <1.4.0', // 1.4.0 introduced embedding of the poetry version in lock file header\n};\n\nexport const Lockfile = Toml.pipe(\n z.object({\n package: LooseArray(\n z\n .object({\n name: z.string(),\n version: z.string(),\n })\n .transform(({ name, version }): [string, string] => [name, version]),\n )\n .transform((entries) => Object.fromEntries(entries))\n .catch({}),\n metadata: z\n .object({\n 'lock-version': z\n .string()\n .transform((lockVersion) => poetryConstraint[lockVersion])\n .optional()\n .catch(undefined),\n 'python-versions': z.string().optional().catch(undefined),\n })\n .transform(\n ({\n 'lock-version': poetryConstraint,\n 'python-versions': pythonVersions,\n }) => ({\n poetryConstraint,\n pythonVersions,\n }),\n )\n .catch({\n poetryConstraint: undefined,\n pythonVersions: undefined,\n }),\n }),\n).transform(\n ({ package: lock, metadata: { poetryConstraint, pythonVersions } }) => ({\n lock,\n poetryConstraint,\n pythonVersions,\n }),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","names":["pep440Versioning.isValid","pep440Versioning.id","poetryVersioning.isValid","poetryVersioning.id","deepmerge"],"sources":["../../../../lib/modules/manager/poetry/schema.ts"],"sourcesContent":["import deepmerge from 'deepmerge';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { parseGitUrl } from '../../../util/git/url.ts';\nimport {\n LooseArray,\n LooseRecord,\n Toml,\n withDepType,\n} from '../../../util/schema-utils/index.ts';\nimport { uniq } from '../../../util/uniq.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { normalizePythonDepName } from '../../datasource/pypi/common.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport * as gitVersioning from '../../versioning/git/index.ts';\nimport * as pep440Versioning from '../../versioning/pep440/index.ts';\nimport * as poetryVersioning from '../../versioning/poetry/index.ts';\nimport { DependencyGroup, ProjectSection } from '../pep621/schema.ts';\nimport { depTypes, pep508ToPackageDependency } from '../pep621/utils.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\n\nconst PoetryOptionalDependencyMixin = z\n .object({\n optional: z.boolean().optional().catch(false),\n })\n .transform(({ optional }): PackageDependency =>\n optional ? { depType: 'extras' } : {},\n );\n\nconst PoetryPathDependency = z\n .object({\n path: z.string(),\n version: z.string().optional().catch(undefined),\n })\n .transform(({ version }): PackageDependency => {\n const dep: PackageDependency = {\n datasource: PypiDatasource.id,\n skipReason: 'path-dependency',\n };\n\n if (version) {\n dep.currentValue = version;\n }\n\n return dep;\n })\n .and(PoetryOptionalDependencyMixin);\n\nconst PoetryGitDependency = z\n .object({\n git: z.string(),\n tag: z.string().optional().catch(undefined),\n version: z.string().optional().catch(undefined),\n branch: z.string().optional().catch(undefined),\n rev: z.string().optional().catch(undefined),\n })\n .transform(({ git, tag, version, branch, rev }): PackageDependency => {\n if (tag) {\n const { source, owner, name } = parseGitUrl(git);\n const repo = `${owner}/${name}`;\n if (source === 'github.com') {\n return {\n datasource: GithubTagsDatasource.id,\n currentValue: tag,\n packageName: repo,\n };\n }\n if (source === 'gitlab.com') {\n return {\n datasource: GitlabTagsDatasource.id,\n currentValue: tag,\n packageName: repo,\n };\n }\n return {\n datasource: GitTagsDatasource.id,\n currentValue: tag,\n packageName: git,\n };\n }\n\n if (rev) {\n return {\n datasource: GitRefsDatasource.id,\n currentValue: branch,\n currentDigest: rev,\n replaceString: rev,\n packageName: git,\n };\n }\n\n return {\n datasource: GitRefsDatasource.id,\n currentValue: version,\n packageName: git,\n skipReason: 'git-dependency',\n };\n })\n .and(PoetryOptionalDependencyMixin);\n\nconst PoetryPypiDependency = z.union([\n z\n .object({ version: z.string().optional(), source: z.string().optional() })\n .transform(({ version: currentValue, source }): PackageDependency => {\n const managerData = source ? { sourceName: source.toLowerCase() } : {};\n\n if (!currentValue) {\n return { datasource: PypiDatasource.id, managerData };\n }\n\n return {\n datasource: PypiDatasource.id,\n managerData: { ...managerData, nestedVersion: true },\n currentValue,\n };\n })\n .and(PoetryOptionalDependencyMixin),\n z.string().transform((version): PackageDependency => ({\n datasource: PypiDatasource.id,\n currentValue: version,\n managerData: { nestedVersion: false },\n })),\n]);\n\nconst PoetryArrayDependency = z\n .array(z.unknown())\n .transform((): PackageDependency => ({\n datasource: PypiDatasource.id,\n skipReason: 'multiple-constraint-dep',\n }));\n\nconst PoetryDependency = z.union([\n PoetryPathDependency,\n PoetryGitDependency,\n PoetryPypiDependency,\n PoetryArrayDependency,\n]);\n\nexport const PoetryDependencies = LooseRecord(\n z.string(),\n PoetryDependency.transform((dep) => {\n if (dep.skipReason) {\n return dep;\n }\n\n if (dep.datasource === GitRefsDatasource.id && dep.currentDigest) {\n dep.versioning = gitVersioning.id;\n return dep;\n }\n\n // istanbul ignore if: normaly should not happen\n if (!dep.currentValue) {\n dep.skipReason = 'unspecified-version';\n return dep;\n }\n\n if (pep440Versioning.isValid(dep.currentValue)) {\n dep.versioning = pep440Versioning.id;\n return dep;\n }\n\n if (poetryVersioning.isValid(dep.currentValue)) {\n dep.versioning = poetryVersioning.id;\n return dep;\n }\n\n dep.skipReason = 'invalid-version';\n return dep;\n }),\n).transform((record) => {\n const deps: PackageDependency[] = [];\n for (const [depName, dep] of Object.entries(record)) {\n dep.depName = depName;\n if (!dep.packageName) {\n const packageName = normalizePythonDepName(depName);\n if (depName !== packageName) {\n dep.packageName = packageName;\n }\n }\n deps.push(dep);\n }\n return deps;\n});\n\nexport const PoetryGroupDependencies = LooseRecord(\n z.string(),\n z\n .object({ dependencies: PoetryDependencies })\n .transform(({ dependencies }) => dependencies),\n).transform((record) => {\n const deps: PackageDependency[] = [];\n for (const [name, val] of Object.entries(record)) {\n for (const dep of Object.values(val)) {\n dep.depType = name;\n deps.push(dep);\n }\n }\n return deps;\n});\n\nconst PoetrySourceOrder = [\n 'default',\n 'primary',\n 'secondary',\n 'supplemental',\n 'explicit',\n] as const;\n\nexport const PoetrySource = z.object({\n name: z.string().toLowerCase(),\n url: z.string().optional(),\n priority: z.enum(PoetrySourceOrder).default('primary'),\n});\nexport type PoetrySource = z.infer<typeof PoetrySource>;\n\nexport const PoetrySources = LooseArray(PoetrySource, {\n onError: ({ error: err }) => {\n logger.debug({ err }, 'Poetry: error parsing sources array');\n },\n})\n .transform((sources) => {\n const pypiUrl = getEnv().PIP_INDEX_URL ?? 'https://pypi.org/pypi/';\n const result: PoetrySource[] = [];\n\n let overridesPyPi = false;\n let hasDefaultSource = false;\n let hasPrimarySource = false;\n for (const source of sources) {\n if (source.name === 'pypi') {\n source.url = pypiUrl;\n overridesPyPi = true;\n }\n\n if (!source.url) {\n continue;\n }\n\n if (source.priority === 'default') {\n hasDefaultSource = true;\n } else if (source.priority === 'primary') {\n hasPrimarySource = true;\n }\n\n result.push(source);\n }\n\n if (sources.length && !hasDefaultSource && !overridesPyPi) {\n result.push({\n name: 'pypi',\n priority: hasPrimarySource ? 'secondary' : 'default',\n url: pypiUrl,\n });\n }\n\n result.sort(\n (a, b) =>\n PoetrySourceOrder.indexOf(a.priority) -\n PoetrySourceOrder.indexOf(b.priority),\n );\n\n return result;\n })\n .catch([]);\n\nexport const PoetrySection = z.object({\n version: z.string().optional().catch(undefined),\n dependencies: withDepType(\n PoetryDependencies,\n 'dependencies',\n false,\n ).optional(),\n 'dev-dependencies': withDepType(\n PoetryDependencies,\n 'dev-dependencies',\n ).optional(),\n group: PoetryGroupDependencies.optional(),\n source: PoetrySources,\n});\n\nexport type PoetrySection = z.infer<typeof PoetrySection>;\n\nconst BuildSystemRequires = LooseArray(\n z\n .string()\n .nonempty()\n .transform((val) =>\n pep508ToPackageDependency(depTypes.buildSystemRequires, val),\n )\n .refine((dep) => dep !== null),\n).catch([]);\n\nexport const PoetryPyProject = Toml.pipe(\n z\n .object({\n project: ProjectSection.optional().catch(undefined),\n tool: z.object({ poetry: PoetrySection }).optional().catch(undefined),\n 'dependency-groups': DependencyGroup(depTypes.dependencyGroups).catch([]),\n 'build-system': z\n .object({\n 'build-backend': z.string().refine(\n // https://python-poetry.org/docs/pyproject/#poetry-and-pep-517\n (buildBackend) =>\n buildBackend === 'poetry.masonry.api' ||\n buildBackend === 'poetry.core.masonry.api',\n ),\n requires: BuildSystemRequires,\n })\n .transform(({ requires }) => {\n const req = requires.find(\n ({ depName }) =>\n depName === 'poetry' ||\n depName === 'poetry_core' ||\n depName === 'poetry-core',\n );\n return {\n poetryRequirement: req?.currentValue,\n requires,\n };\n })\n .optional()\n .catch(undefined),\n })\n .transform((pyproject) => {\n const {\n project,\n tool,\n 'build-system': buildSystem,\n 'dependency-groups': dependencyGroups,\n } = pyproject;\n\n const deps: PackageDependency[] = [];\n const projectDependencies = coerceArray(project?.dependencies);\n const projectOptionalDependencies = coerceArray(\n project?.['optional-dependencies'],\n );\n\n const projectDepsByName: Record<string, PackageDependency> = {};\n for (const dep of [\n ...projectDependencies,\n ...dependencyGroups,\n ...projectOptionalDependencies,\n ]) {\n projectDepsByName[dep.depName!] = dep;\n }\n\n if (buildSystem?.requires) {\n deps.push(...buildSystem.requires);\n }\n\n const poetryDependencies = coerceArray(tool?.poetry?.dependencies);\n\n const poetryDevDependencies = coerceArray(\n tool?.poetry?.['dev-dependencies'],\n );\n\n const poetryGroupDependencies = coerceArray(tool?.poetry?.group);\n\n for (const poetryDep of [\n ...poetryDependencies,\n ...poetryDevDependencies,\n ...poetryGroupDependencies,\n ]) {\n const depName = poetryDep.depName;\n const projectDep = depName && projectDepsByName[depName];\n // When the same dep exists in project.dependencies or dependency-groups,\n // Poetry just uses the Poetry dep to enrich the project dependency.\n if (projectDep) {\n const mergedDep = deepmerge<PackageDependency>(poetryDep, projectDep);\n // Poetry supports specifying the version in project.dependencies and\n // tool.poetry.dependencies *at the same time* and only errors if both\n // are not compatible - we require a single constraint per dependency.\n if (projectDep.currentValue && poetryDep.currentValue) {\n mergedDep.skipReason = 'invalid-dependency-specification';\n }\n // When a skipReason is 'unspecified-version', we defer to the other skipReason,\n // so that 'unspecified-version' only persists if both deps have no version.\n if (mergedDep.skipReason === 'unspecified-version') {\n if (poetryDep.skipReason === 'unspecified-version') {\n mergedDep.skipReason = projectDep.skipReason;\n } else {\n mergedDep.skipReason = poetryDep.skipReason;\n }\n }\n projectDepsByName[depName] = mergedDep;\n } else {\n deps.push(poetryDep);\n }\n }\n\n deps.push(...Object.values(projectDepsByName));\n\n const packageFileVersion = tool?.poetry?.version;\n const packageFileContent: PackageFileContent = {\n deps,\n packageFileVersion,\n };\n\n const sourceUrls = tool?.poetry?.source;\n if (sourceUrls) {\n for (const dep of deps) {\n if (dep.managerData?.sourceName) {\n const sourceUrl = sourceUrls.find(\n ({ name }) => name === dep.managerData?.sourceName,\n );\n if (sourceUrl?.url) {\n dep.registryUrls = [sourceUrl.url];\n }\n }\n }\n\n const sourceUrlsFiltered = sourceUrls.filter(\n ({ priority }) => priority !== 'explicit',\n );\n if (sourceUrlsFiltered.length) {\n packageFileContent.registryUrls = uniq(\n sourceUrlsFiltered.map(({ url }) => url!),\n );\n }\n }\n\n return {\n packageFileContent,\n poetryRequirement: buildSystem?.poetryRequirement,\n };\n }),\n);\n\nexport type PoetryPyProject = z.infer<typeof PoetryPyProject>;\n\nconst poetryConstraint: Record<string, string> = {\n '1.0': '<1.1.0',\n '1.1': '<1.3.0',\n '2.0': '>=1.3.0 <1.4.0', // 1.4.0 introduced embedding of the poetry version in lock file header\n};\n\nexport const Lockfile = Toml.pipe(\n z.object({\n package: LooseArray(\n z\n .object({\n name: z.string(),\n version: z.string(),\n })\n .transform(({ name, version }): [string, string] => [name, version]),\n )\n .transform((entries) => Object.fromEntries(entries))\n .catch({}),\n metadata: z\n .object({\n 'lock-version': z\n .string()\n .transform((lockVersion) => poetryConstraint[lockVersion])\n .optional()\n .catch(undefined),\n 'python-versions': z.string().optional().catch(undefined),\n })\n .transform(\n ({\n 'lock-version': poetryConstraint,\n 'python-versions': pythonVersions,\n }) => ({\n poetryConstraint,\n pythonVersions,\n }),\n )\n .catch({\n poetryConstraint: undefined,\n pythonVersions: undefined,\n }),\n }),\n).transform(\n ({ package: lock, metadata: { poetryConstraint, pythonVersions } }) => ({\n lock,\n poetryConstraint,\n pythonVersions,\n }),\n);\n"],"mappings":"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"}