renovate 44.85.0 → 44.86.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 (106) hide show
  1. package/dist/constants/error-messages.d.ts +3 -2
  2. package/dist/constants/error-messages.js +3 -1
  3. package/dist/constants/error-messages.js.map +1 -1
  4. package/dist/modules/manager/apm/artifacts.js +2 -1
  5. package/dist/modules/manager/apm/artifacts.js.map +1 -1
  6. package/dist/modules/manager/bazel-module/artifacts.js +2 -1
  7. package/dist/modules/manager/bazel-module/artifacts.js.map +1 -1
  8. package/dist/modules/manager/bazelisk/artifacts.js +2 -1
  9. package/dist/modules/manager/bazelisk/artifacts.js.map +1 -1
  10. package/dist/modules/manager/bun/artifacts.js +2 -1
  11. package/dist/modules/manager/bun/artifacts.js.map +1 -1
  12. package/dist/modules/manager/bundler/artifacts.js +1 -1
  13. package/dist/modules/manager/bundler/artifacts.js.map +1 -1
  14. package/dist/modules/manager/bundler/common.js +11 -16
  15. package/dist/modules/manager/bundler/common.js.map +1 -1
  16. package/dist/modules/manager/cargo/artifacts.js +5 -3
  17. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  18. package/dist/modules/manager/composer/artifacts.js +6 -7
  19. package/dist/modules/manager/composer/artifacts.js.map +1 -1
  20. package/dist/modules/manager/composer/utils.js +1 -10
  21. package/dist/modules/manager/composer/utils.js.map +1 -1
  22. package/dist/modules/manager/conan/artifacts.js +2 -1
  23. package/dist/modules/manager/conan/artifacts.js.map +1 -1
  24. package/dist/modules/manager/copier/artifacts.js +3 -3
  25. package/dist/modules/manager/copier/artifacts.js.map +1 -1
  26. package/dist/modules/manager/deno/artifacts.js +2 -1
  27. package/dist/modules/manager/deno/artifacts.js.map +1 -1
  28. package/dist/modules/manager/devbox/artifacts.js +8 -5
  29. package/dist/modules/manager/devbox/artifacts.js.map +1 -1
  30. package/dist/modules/manager/fingerprint.generated.js +34 -34
  31. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  32. package/dist/modules/manager/github-actions/artifacts.js +6 -4
  33. package/dist/modules/manager/github-actions/artifacts.js.map +1 -1
  34. package/dist/modules/manager/gleam/artifacts.js +2 -1
  35. package/dist/modules/manager/gleam/artifacts.js.map +1 -1
  36. package/dist/modules/manager/gomod/artifacts.js +8 -6
  37. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  38. package/dist/modules/manager/gradle/artifacts.js +2 -1
  39. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  40. package/dist/modules/manager/gradle-wrapper/artifacts.js +2 -1
  41. package/dist/modules/manager/gradle-wrapper/artifacts.js.map +1 -1
  42. package/dist/modules/manager/helmfile/artifacts.js +4 -3
  43. package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
  44. package/dist/modules/manager/helmv3/artifacts.js +2 -1
  45. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  46. package/dist/modules/manager/jsonnet-bundler/artifacts.js +2 -1
  47. package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
  48. package/dist/modules/manager/kustomize/artifacts.js +4 -2
  49. package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
  50. package/dist/modules/manager/kustomize/common.js +2 -2
  51. package/dist/modules/manager/kustomize/common.js.map +1 -1
  52. package/dist/modules/manager/maven-wrapper/artifacts.js +2 -1
  53. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  54. package/dist/modules/manager/mise/artifacts.js +13 -11
  55. package/dist/modules/manager/mise/artifacts.js.map +1 -1
  56. package/dist/modules/manager/mix/artifacts.js +3 -2
  57. package/dist/modules/manager/mix/artifacts.js.map +1 -1
  58. package/dist/modules/manager/nix/artifacts.js +2 -1
  59. package/dist/modules/manager/nix/artifacts.js.map +1 -1
  60. package/dist/modules/manager/npm/artifacts.js +2 -1
  61. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  62. package/dist/modules/manager/npm/post-update/node-version.js +2 -1
  63. package/dist/modules/manager/npm/post-update/node-version.js.map +1 -1
  64. package/dist/modules/manager/npm/post-update/npm.js +2 -1
  65. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  66. package/dist/modules/manager/npm/post-update/pnpm.js +2 -1
  67. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  68. package/dist/modules/manager/npm/post-update/yarn.js +5 -3
  69. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  70. package/dist/modules/manager/nuget/artifacts.js +2 -1
  71. package/dist/modules/manager/nuget/artifacts.js.map +1 -1
  72. package/dist/modules/manager/pep621/processors/pdm.js +3 -2
  73. package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
  74. package/dist/modules/manager/pep621/processors/pixi.js +4 -3
  75. package/dist/modules/manager/pep621/processors/pixi.js.map +1 -1
  76. package/dist/modules/manager/pep621/processors/uv.js +3 -3
  77. package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
  78. package/dist/modules/manager/pip-compile/common.js +14 -36
  79. package/dist/modules/manager/pip-compile/common.js.map +1 -1
  80. package/dist/modules/manager/pip_requirements/artifacts.js +3 -2
  81. package/dist/modules/manager/pip_requirements/artifacts.js.map +1 -1
  82. package/dist/modules/manager/pipenv/artifacts.js +3 -2
  83. package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
  84. package/dist/modules/manager/pixi/artifacts.js +2 -1
  85. package/dist/modules/manager/pixi/artifacts.js.map +1 -1
  86. package/dist/modules/manager/poetry/artifacts.js +3 -2
  87. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  88. package/dist/modules/manager/pub/artifacts.js +11 -10
  89. package/dist/modules/manager/pub/artifacts.js.map +1 -1
  90. package/dist/modules/manager/types.d.ts +23 -3
  91. package/dist/modules/manager/util.js +28 -1
  92. package/dist/modules/manager/util.js.map +1 -1
  93. package/dist/modules/manager/vendir/artifacts.js +3 -2
  94. package/dist/modules/manager/vendir/artifacts.js.map +1 -1
  95. package/dist/modules/platform/gitlab/index.js +11 -3
  96. package/dist/modules/platform/gitlab/index.js.map +1 -1
  97. package/dist/workers/repository/error.js +5 -0
  98. package/dist/workers/repository/error.js.map +1 -1
  99. package/dist/workers/repository/process/lookup/index.js +2 -2
  100. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  101. package/dist/workers/repository/updates/generate.js +11 -4
  102. package/dist/workers/repository/updates/generate.js.map +1 -1
  103. package/package.json +1 -1
  104. package/renovate-schema.json +2 -2
  105. package/dist/modules/manager/copier/utils.js +0 -24
  106. package/dist/modules/manager/copier/utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/npm/artifacts.ts"],"sourcesContent":["import { isEmptyArray, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport type { Scalar, YAMLSeq } from 'yaml';\nimport { isScalar, isSeq, parseDocument } from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n ensureCacheDir,\n localPathExists,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { matchRegexOrGlob } from '../../../util/string-match.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport { PNPM_CACHE_DIR, PNPM_STORE_DIR } from './constants.ts';\nimport { getNodeToolConstraint } from './post-update/node-version.ts';\nimport { processHostRules } from './post-update/rules.ts';\nimport { lazyLoadPackageJson } from './post-update/utils.ts';\nimport {\n getNpmrcContent,\n resetNpmrcContent,\n updateNpmrcContent,\n} from './utils.ts';\n\n// eg. 8.15.5+sha256.4b4efa12490e5055d59b9b9fc9438b7d581a6b7af3b5675eb5c5f447cee1a589\nconst versionWithHashRegString = '^(?<version>.*)\\\\+(?<hash>.*)';\n\n// Execute 'corepack use' command for npm manager updates\n// This step is necessary because Corepack recommends attaching a hash after the version\n// The hash is generated only after running 'corepack use' and cannot be fetched from the npm registry\nexport async function updateArtifacts(\n updateArtifactsConfig: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`npm.updateArtifacts(${updateArtifactsConfig.packageFileName})`);\n let res: UpdateArtifactsResult[] = [];\n res.push(\n coerceObject(await handlePackageManagerUpdates(updateArtifactsConfig)),\n );\n res.push(coerceObject(await updatePnpmWorkspace(updateArtifactsConfig)));\n\n res = res.filter(isNonEmptyObject);\n if (res.length === 0) {\n return null;\n }\n\n return res;\n}\n\nasync function handlePackageManagerUpdates(\n updateArtifactsConfig: UpdateArtifact,\n): Promise<UpdateArtifactsResult | null> {\n const {\n packageFileName,\n config,\n updatedDeps,\n newPackageFileContent: existingPackageFileContent,\n } = updateArtifactsConfig;\n const packageManagerUpdate = updatedDeps.find(\n (dep) => dep.depType === 'packageManager',\n );\n\n if (!packageManagerUpdate) {\n logger.debug('No packageManager updates - returning null');\n return null;\n }\n\n const { currentValue, depName, newVersion } = packageManagerUpdate;\n\n // Execute 'corepack use' command only if the currentValue already has hash in it\n if (!currentValue || !regEx(versionWithHashRegString).test(currentValue)) {\n return null;\n }\n\n // write old updates before executing corepack update so that they are not removed from package file\n await writeLocalFile(packageFileName, existingPackageFileContent);\n\n // Asumming that corepack only needs to modify the package.json file in the root folder\n // As it should not be regular practice to have different package managers in different workspaces\n const pkgFileDir = upath.dirname(packageFileName);\n const { additionalNpmrcContent } = processHostRules();\n const npmrcContent = await getNpmrcContent(pkgFileDir);\n const lazyPkgJson = lazyLoadPackageJson(pkgFileDir);\n const cmd = `corepack use ${quote(`${depName}@${newVersion}`)}`;\n\n const nodeConstraints = await getNodeToolConstraint(\n config,\n updatedDeps,\n pkgFileDir,\n lazyPkgJson,\n );\n\n const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);\n const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n extraEnv: {\n // To make sure pnpm store location is consistent between \"corepack use\"\n // here and the pnpm commands in ./post-update/pnpm.ts. Check\n // ./post-update/pnpm.ts for more details.\n npm_config_cache_dir: pnpmConfigCacheDir,\n npm_config_store_dir: pnpmConfigStoreDir,\n pnpm_config_cache_dir: pnpmConfigCacheDir,\n pnpm_config_store_dir: pnpmConfigStoreDir,\n },\n toolConstraints: [\n nodeConstraints,\n {\n toolName: 'corepack',\n constraint: config.constraints?.corepack,\n },\n ],\n docker: {},\n };\n\n await updateNpmrcContent(pkgFileDir, npmrcContent, additionalNpmrcContent);\n try {\n await exec(cmd, execOptions);\n await resetNpmrcContent(pkgFileDir, npmrcContent);\n const newPackageFileContent = await readLocalFile(packageFileName, 'utf8');\n if (\n !newPackageFileContent ||\n existingPackageFileContent === newPackageFileContent\n ) {\n return null;\n }\n logger.debug('Returning updated package.json');\n return {\n file: {\n type: 'addition',\n path: packageFileName,\n contents: newPackageFileContent,\n },\n };\n } catch (err) {\n logger.warn({ err }, 'Error updating package.json');\n await resetNpmrcContent(pkgFileDir, npmrcContent);\n return {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n };\n }\n}\n\n/**\n * Update the minimumReleaseAgeExclude setting in pnpm-workspace.yaml if needed\n */\nasync function updatePnpmWorkspace(\n updateArtifactsConfig: UpdateArtifact,\n): Promise<UpdateArtifactsResult | null> {\n const upgrades = updateArtifactsConfig.updatedDeps.filter(\n (u) => u.isVulnerabilityAlert,\n );\n // return early if no security updates are present\n if (isEmptyArray(upgrades)) {\n return null;\n }\n\n const pnpmLockFile = upgrades[0].managerData?.pnpmLockFile;\n if (!isString(pnpmLockFile)) {\n logger.debug(\n 'No pnpm shrinkwrap found, not attempting to update pnpm-workspace.yaml',\n );\n return null;\n }\n const lockFileDir = upath.dirname(pnpmLockFile);\n const pnpmWorkspaceFilePath = upath.join(lockFileDir, 'pnpm-workspace.yaml');\n\n if (!(await localPathExists(pnpmWorkspaceFilePath))) {\n return null;\n }\n\n // use already-updated content when updating the workspace file itself\n const packageFileContent =\n updateArtifactsConfig.packageFileName === pnpmWorkspaceFilePath\n ? updateArtifactsConfig.newPackageFileContent\n : (await readLocalFile(pnpmWorkspaceFilePath, 'utf8'))!;\n const doc = parseDocument(packageFileContent);\n\n if (!doc.get('minimumReleaseAge')) {\n return null;\n }\n\n let updated = false;\n\n for (const upgrade of upgrades) {\n let excludeNode = doc.getIn(['minimumReleaseAgeExclude']) as YAMLSeq | null;\n // v8 ignore next -- TODO: add test #40625\n const newVersion = upgrade.newVersion ?? upgrade.newValue;\n // For pnpm overrides with range selectors (e.g. \"pkg@<=1.0.0\"), depName contains\n // the full key including the selector. Use packageName (bare package name) for\n // minimumReleaseAgeExclude entries which require exact versions only.\n const excludeDepName = upgrade.packageName ?? upgrade.depName;\n\n /* v8 ignore if -- should not happen, adding for type narrowing*/\n if (excludeNode && !isSeq(excludeNode)) {\n return null;\n }\n\n if (!excludeNode) {\n logger.debug('Adding new exclude block');\n excludeNode = doc.createNode([]);\n const newItem = doc.createNode(`${excludeDepName}@${newVersion}`);\n newItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n excludeNode.items.push(newItem);\n doc.set('minimumReleaseAgeExclude', excludeNode);\n updated = true;\n continue;\n }\n\n const {\n item: matchedItem,\n allExcluded,\n malformed,\n } = getMatchedItem(excludeDepName!, excludeNode.items);\n\n if (allExcluded) {\n // still clean up any malformed entries even when a wildcard covers the package\n } else if (malformed && isScalar<string>(matchedItem)) {\n logger.debug(\n { entry: matchedItem.value, excludeDepName, newVersion },\n 'Replacing malformed minimumReleaseAgeExclude entry',\n );\n matchedItem.value = `${excludeDepName}@${newVersion}`;\n matchedItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n updated = true;\n } else if (isScalar<string>(matchedItem)) {\n // if we have a comment before the list, which includes the dependency\n if (excludeNode?.commentBefore?.includes(`${excludeDepName}@`)) {\n // and it doesn't already have the version included in it\n if (\n !minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n excludeNode.commentBefore,\n excludeDepName,\n newVersion,\n )\n ) {\n // then append it\n\n // normalize value (no quote handling needed)\n excludeNode.commentBefore = `${excludeNode.commentBefore} || ${newVersion}`;\n updated = true;\n }\n }\n // otherwise, if it's in our matched item's comment\n else if (matchedItem.commentBefore) {\n // add it\n if (\n !minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n matchedItem.commentBefore,\n excludeDepName,\n newVersion,\n )\n ) {\n // normalize value (no quote handling needed)\n matchedItem.commentBefore = `${matchedItem.commentBefore} || ${newVersion}`;\n updated = true;\n }\n } else {\n matchedItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n updated = true;\n }\n\n if (\n !minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n matchedItem.value,\n excludeDepName,\n newVersion,\n )\n ) {\n matchedItem.value = `${matchedItem.value} || ${newVersion}`;\n updated = true;\n }\n } else {\n // add new entry\n const newItem = doc.createNode(`${excludeDepName}@${newVersion}`);\n newItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n\n excludeNode.items.push(newItem);\n updated = true;\n }\n\n // Remove any malformed entries for the same package left over from the prior bug\n for (let i = excludeNode.items.length - 1; i >= 0; i--) {\n const item = excludeNode.items[i];\n if (\n item !== matchedItem &&\n isScalar(item) &&\n isString(item.value) &&\n item.value.startsWith(`${excludeDepName}@`) &&\n !isValidMinimumReleaseAgeExcludeEntry(item.value, excludeDepName!)\n ) {\n excludeNode.items.splice(i, 1);\n updated = true;\n }\n }\n }\n\n if (!updated) {\n return null;\n }\n\n const newContent = doc.toString();\n await writeLocalFile(pnpmWorkspaceFilePath, newContent);\n\n return {\n file: {\n type: 'addition',\n path: pnpmWorkspaceFilePath,\n contents: newContent,\n },\n };\n}\n\nfunction getMatchedItem(\n depName: string,\n items: unknown[],\n): {\n item: Scalar | null;\n allExcluded: boolean;\n malformed?: boolean;\n} {\n let malformedItem: Scalar | null = null;\n\n for (const item of items) {\n /* v8 ignore if -- should not happen */\n if (!isScalar(item) || !isString(item.value)) {\n continue;\n }\n\n if (item.value.startsWith(`${depName}@`)) {\n if (isValidMinimumReleaseAgeExcludeEntry(item.value, depName)) {\n return {\n allExcluded: false,\n item,\n };\n }\n malformedItem ??= item;\n continue;\n }\n\n if (item.value === depName || matchRegexOrGlob(depName, item.value)) {\n return {\n allExcluded: true,\n item,\n };\n }\n }\n\n if (malformedItem) {\n return {\n allExcluded: false,\n item: malformedItem,\n malformed: true,\n };\n }\n\n return {\n item: null,\n allExcluded: false,\n };\n}\n\n/** pnpm requires package@version entries without range selectors or extra @ in the version part */\nfunction isValidMinimumReleaseAgeExcludeEntry(\n value: string,\n packageName: string,\n): boolean {\n return !value.slice(`${packageName}@`.length).includes('@');\n}\n\n/** determine whether a comment or a list item contains the depName at a given newVersion */\nfunction minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n line: string,\n depName: string | undefined,\n newVersion: string | undefined,\n): boolean {\n if (line.includes(`${depName}@${newVersion}`)) {\n return true;\n }\n\n if (line.includes(`|| ${newVersion}`)) {\n return true;\n }\n\n return false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/npm/artifacts.ts"],"sourcesContent":["import { isEmptyArray, isNonEmptyObject, isString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport type { Scalar, YAMLSeq } from 'yaml';\nimport { isScalar, isSeq, parseDocument } from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n ensureCacheDir,\n localPathExists,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { matchRegexOrGlob } from '../../../util/string-match.ts';\nimport type { UpdateArtifact, UpdateArtifactsResult } from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { PNPM_CACHE_DIR, PNPM_STORE_DIR } from './constants.ts';\nimport { getNodeToolConstraint } from './post-update/node-version.ts';\nimport { processHostRules } from './post-update/rules.ts';\nimport { lazyLoadPackageJson } from './post-update/utils.ts';\nimport {\n getNpmrcContent,\n resetNpmrcContent,\n updateNpmrcContent,\n} from './utils.ts';\n\n// eg. 8.15.5+sha256.4b4efa12490e5055d59b9b9fc9438b7d581a6b7af3b5675eb5c5f447cee1a589\nconst versionWithHashRegString = '^(?<version>.*)\\\\+(?<hash>.*)';\n\n// Execute 'corepack use' command for npm manager updates\n// This step is necessary because Corepack recommends attaching a hash after the version\n// The hash is generated only after running 'corepack use' and cannot be fetched from the npm registry\nexport async function updateArtifacts(\n updateArtifactsConfig: UpdateArtifact,\n): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`npm.updateArtifacts(${updateArtifactsConfig.packageFileName})`);\n let res: UpdateArtifactsResult[] = [];\n res.push(\n coerceObject(await handlePackageManagerUpdates(updateArtifactsConfig)),\n );\n res.push(coerceObject(await updatePnpmWorkspace(updateArtifactsConfig)));\n\n res = res.filter(isNonEmptyObject);\n if (res.length === 0) {\n return null;\n }\n\n return res;\n}\n\nasync function handlePackageManagerUpdates(\n updateArtifactsConfig: UpdateArtifact,\n): Promise<UpdateArtifactsResult | null> {\n const {\n packageFileName,\n config,\n updatedDeps,\n newPackageFileContent: existingPackageFileContent,\n } = updateArtifactsConfig;\n const packageManagerUpdate = updatedDeps.find(\n (dep) => dep.depType === 'packageManager',\n );\n\n if (!packageManagerUpdate) {\n logger.debug('No packageManager updates - returning null');\n return null;\n }\n\n const { currentValue, depName, newVersion } = packageManagerUpdate;\n\n // Execute 'corepack use' command only if the currentValue already has hash in it\n if (!currentValue || !regEx(versionWithHashRegString).test(currentValue)) {\n return null;\n }\n\n // write old updates before executing corepack update so that they are not removed from package file\n await writeLocalFile(packageFileName, existingPackageFileContent);\n\n // Asumming that corepack only needs to modify the package.json file in the root folder\n // As it should not be regular practice to have different package managers in different workspaces\n const pkgFileDir = upath.dirname(packageFileName);\n const { additionalNpmrcContent } = processHostRules();\n const npmrcContent = await getNpmrcContent(pkgFileDir);\n const lazyPkgJson = lazyLoadPackageJson(pkgFileDir);\n const cmd = `corepack use ${quote(`${depName}@${newVersion}`)}`;\n\n const nodeConstraints = await getNodeToolConstraint(\n config,\n updatedDeps,\n pkgFileDir,\n lazyPkgJson,\n );\n\n const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);\n const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n extraEnv: {\n // To make sure pnpm store location is consistent between \"corepack use\"\n // here and the pnpm commands in ./post-update/pnpm.ts. Check\n // ./post-update/pnpm.ts for more details.\n npm_config_cache_dir: pnpmConfigCacheDir,\n npm_config_store_dir: pnpmConfigStoreDir,\n pnpm_config_cache_dir: pnpmConfigCacheDir,\n pnpm_config_store_dir: pnpmConfigStoreDir,\n },\n toolConstraints: [\n nodeConstraints,\n {\n toolName: 'corepack',\n constraint: await resolveToolConstraint(config, 'corepack'),\n },\n ],\n docker: {},\n };\n\n await updateNpmrcContent(pkgFileDir, npmrcContent, additionalNpmrcContent);\n try {\n await exec(cmd, execOptions);\n await resetNpmrcContent(pkgFileDir, npmrcContent);\n const newPackageFileContent = await readLocalFile(packageFileName, 'utf8');\n if (\n !newPackageFileContent ||\n existingPackageFileContent === newPackageFileContent\n ) {\n return null;\n }\n logger.debug('Returning updated package.json');\n return {\n file: {\n type: 'addition',\n path: packageFileName,\n contents: newPackageFileContent,\n },\n };\n } catch (err) {\n logger.warn({ err }, 'Error updating package.json');\n await resetNpmrcContent(pkgFileDir, npmrcContent);\n return {\n artifactError: {\n fileName: packageFileName,\n stderr: err.message,\n },\n };\n }\n}\n\n/**\n * Update the minimumReleaseAgeExclude setting in pnpm-workspace.yaml if needed\n */\nasync function updatePnpmWorkspace(\n updateArtifactsConfig: UpdateArtifact,\n): Promise<UpdateArtifactsResult | null> {\n const upgrades = updateArtifactsConfig.updatedDeps.filter(\n (u) => u.isVulnerabilityAlert,\n );\n // return early if no security updates are present\n if (isEmptyArray(upgrades)) {\n return null;\n }\n\n const pnpmLockFile = upgrades[0].managerData?.pnpmLockFile;\n if (!isString(pnpmLockFile)) {\n logger.debug(\n 'No pnpm shrinkwrap found, not attempting to update pnpm-workspace.yaml',\n );\n return null;\n }\n const lockFileDir = upath.dirname(pnpmLockFile);\n const pnpmWorkspaceFilePath = upath.join(lockFileDir, 'pnpm-workspace.yaml');\n\n if (!(await localPathExists(pnpmWorkspaceFilePath))) {\n return null;\n }\n\n // use already-updated content when updating the workspace file itself\n const packageFileContent =\n updateArtifactsConfig.packageFileName === pnpmWorkspaceFilePath\n ? updateArtifactsConfig.newPackageFileContent\n : (await readLocalFile(pnpmWorkspaceFilePath, 'utf8'))!;\n const doc = parseDocument(packageFileContent);\n\n if (!doc.get('minimumReleaseAge')) {\n return null;\n }\n\n let updated = false;\n\n for (const upgrade of upgrades) {\n let excludeNode = doc.getIn(['minimumReleaseAgeExclude']) as YAMLSeq | null;\n // v8 ignore next -- TODO: add test #40625\n const newVersion = upgrade.newVersion ?? upgrade.newValue;\n // For pnpm overrides with range selectors (e.g. \"pkg@<=1.0.0\"), depName contains\n // the full key including the selector. Use packageName (bare package name) for\n // minimumReleaseAgeExclude entries which require exact versions only.\n const excludeDepName = upgrade.packageName ?? upgrade.depName;\n\n /* v8 ignore if -- should not happen, adding for type narrowing*/\n if (excludeNode && !isSeq(excludeNode)) {\n return null;\n }\n\n if (!excludeNode) {\n logger.debug('Adding new exclude block');\n excludeNode = doc.createNode([]);\n const newItem = doc.createNode(`${excludeDepName}@${newVersion}`);\n newItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n excludeNode.items.push(newItem);\n doc.set('minimumReleaseAgeExclude', excludeNode);\n updated = true;\n continue;\n }\n\n const {\n item: matchedItem,\n allExcluded,\n malformed,\n } = getMatchedItem(excludeDepName!, excludeNode.items);\n\n if (allExcluded) {\n // still clean up any malformed entries even when a wildcard covers the package\n } else if (malformed && isScalar<string>(matchedItem)) {\n logger.debug(\n { entry: matchedItem.value, excludeDepName, newVersion },\n 'Replacing malformed minimumReleaseAgeExclude entry',\n );\n matchedItem.value = `${excludeDepName}@${newVersion}`;\n matchedItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n updated = true;\n } else if (isScalar<string>(matchedItem)) {\n // if we have a comment before the list, which includes the dependency\n if (excludeNode?.commentBefore?.includes(`${excludeDepName}@`)) {\n // and it doesn't already have the version included in it\n if (\n !minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n excludeNode.commentBefore,\n excludeDepName,\n newVersion,\n )\n ) {\n // then append it\n\n // normalize value (no quote handling needed)\n excludeNode.commentBefore = `${excludeNode.commentBefore} || ${newVersion}`;\n updated = true;\n }\n }\n // otherwise, if it's in our matched item's comment\n else if (matchedItem.commentBefore) {\n // add it\n if (\n !minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n matchedItem.commentBefore,\n excludeDepName,\n newVersion,\n )\n ) {\n // normalize value (no quote handling needed)\n matchedItem.commentBefore = `${matchedItem.commentBefore} || ${newVersion}`;\n updated = true;\n }\n } else {\n matchedItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n updated = true;\n }\n\n if (\n !minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n matchedItem.value,\n excludeDepName,\n newVersion,\n )\n ) {\n matchedItem.value = `${matchedItem.value} || ${newVersion}`;\n updated = true;\n }\n } else {\n // add new entry\n const newItem = doc.createNode(`${excludeDepName}@${newVersion}`);\n newItem.commentBefore = ` Renovate security update: ${excludeDepName}@${newVersion}`;\n\n excludeNode.items.push(newItem);\n updated = true;\n }\n\n // Remove any malformed entries for the same package left over from the prior bug\n for (let i = excludeNode.items.length - 1; i >= 0; i--) {\n const item = excludeNode.items[i];\n if (\n item !== matchedItem &&\n isScalar(item) &&\n isString(item.value) &&\n item.value.startsWith(`${excludeDepName}@`) &&\n !isValidMinimumReleaseAgeExcludeEntry(item.value, excludeDepName!)\n ) {\n excludeNode.items.splice(i, 1);\n updated = true;\n }\n }\n }\n\n if (!updated) {\n return null;\n }\n\n const newContent = doc.toString();\n await writeLocalFile(pnpmWorkspaceFilePath, newContent);\n\n return {\n file: {\n type: 'addition',\n path: pnpmWorkspaceFilePath,\n contents: newContent,\n },\n };\n}\n\nfunction getMatchedItem(\n depName: string,\n items: unknown[],\n): {\n item: Scalar | null;\n allExcluded: boolean;\n malformed?: boolean;\n} {\n let malformedItem: Scalar | null = null;\n\n for (const item of items) {\n /* v8 ignore if -- should not happen */\n if (!isScalar(item) || !isString(item.value)) {\n continue;\n }\n\n if (item.value.startsWith(`${depName}@`)) {\n if (isValidMinimumReleaseAgeExcludeEntry(item.value, depName)) {\n return {\n allExcluded: false,\n item,\n };\n }\n malformedItem ??= item;\n continue;\n }\n\n if (item.value === depName || matchRegexOrGlob(depName, item.value)) {\n return {\n allExcluded: true,\n item,\n };\n }\n }\n\n if (malformedItem) {\n return {\n allExcluded: false,\n item: malformedItem,\n malformed: true,\n };\n }\n\n return {\n item: null,\n allExcluded: false,\n };\n}\n\n/** pnpm requires package@version entries without range selectors or extra @ in the version part */\nfunction isValidMinimumReleaseAgeExcludeEntry(\n value: string,\n packageName: string,\n): boolean {\n return !value.slice(`${packageName}@`.length).includes('@');\n}\n\n/** determine whether a comment or a list item contains the depName at a given newVersion */\nfunction minimumReleaseAgeExcludeIncludesDepNameAndVersion(\n line: string,\n depName: string | undefined,\n newVersion: string | undefined,\n): boolean {\n if (line.includes(`${depName}@${newVersion}`)) {\n return true;\n }\n\n if (line.includes(`|| ${newVersion}`)) {\n return true;\n }\n\n return false;\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { newlineRegex, regEx } from "../../../../util/regex.js";
2
2
  import { logger } from "../../../../logger/index.js";
3
3
  import { readLocalFile } from "../../../../util/fs/index.js";
4
+ import { resolveToolConstraint } from "../../util.js";
4
5
  import upath from "upath";
5
6
  import semver from "semver";
6
7
  //#region lib/modules/manager/npm/post-update/node-version.ts
@@ -35,7 +36,7 @@ async function getPackageJsonConstraint(pkg) {
35
36
  return null;
36
37
  }
37
38
  async function getNodeConstraint(config, upgrades, lockFileDir, pkg) {
38
- const constraint = getNodeUpdate(upgrades) ?? config.constraints?.node ?? await getNodeFile(upath.join(lockFileDir, ".nvmrc")) ?? await getNodeFile(upath.join(lockFileDir, ".node-version")) ?? await getPackageJsonConstraint(pkg);
39
+ const constraint = getNodeUpdate(upgrades) ?? await resolveToolConstraint(config, "node", async () => await getNodeFile(upath.join(lockFileDir, ".nvmrc")) ?? await getNodeFile(upath.join(lockFileDir, ".node-version")) ?? await getPackageJsonConstraint(pkg)) ?? null;
39
40
  if (!constraint) logger.debug("No node constraint found - using latest");
40
41
  return constraint;
41
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"node-version.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/node-version.ts"],"sourcesContent":["import semver from 'semver';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport type { ToolConstraint } from '../../../../util/exec/types.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport type { LazyPackageJson } from './types.ts';\n\nasync function getNodeFile(filename: string): Promise<string | null> {\n try {\n // TODO #22198\n const constraint = (await readLocalFile(filename, 'utf8'))!\n .split(newlineRegex)[0]\n .replace(regEx(/^v/), '');\n if (semver.validRange(constraint)) {\n logger.debug(`Using node constraint \"${constraint}\" from ${filename}`);\n return constraint;\n }\n } catch {\n // do nothing\n }\n return null;\n}\n\nasync function getPackageJsonConstraint(\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const pkgJson = await pkg.getValue();\n if (pkgJson.volta?.node) {\n const constraint = pkgJson.volta.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json volta`,\n );\n return constraint;\n }\n }\n if (pkgJson.engines?.node) {\n const constraint = pkgJson.engines.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json engines`,\n );\n return constraint;\n }\n }\n return null;\n}\n\n// export only for testing\nexport async function getNodeConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const constraint =\n getNodeUpdate(upgrades) ??\n config.constraints?.node ??\n (await getNodeFile(upath.join(lockFileDir, '.nvmrc'))) ??\n (await getNodeFile(upath.join(lockFileDir, '.node-version'))) ??\n (await getPackageJsonConstraint(pkg));\n if (!constraint) {\n logger.debug('No node constraint found - using latest');\n }\n return constraint;\n}\n\nexport function getNodeUpdate(upgrades: Upgrade[]): string | undefined {\n return upgrades.find((u) => u.depName === 'node')?.newValue;\n}\n\nexport async function getNodeToolConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<ToolConstraint> {\n const constraint = await getNodeConstraint(\n config,\n upgrades,\n lockFileDir,\n pkg,\n );\n\n return {\n toolName: 'node',\n constraint,\n };\n}\n"],"mappings":";;;;;;AASA,eAAe,YAAY,UAA0C;CACnE,IAAI;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM,EAAA,CACrD,MAAM,YAAY,CAAC,CAAC,EAAE,CACtB,QAAQ,MAAM,IAAI,GAAG,EAAE;EAC1B,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MAAM,0BAA0B,WAAW,SAAS,UAAU;GACrE,OAAO;EACT;CACF,QAAQ,CAER;CACA,OAAO;AACT;AAEA,eAAe,yBACb,KACwB;CACxB,MAAM,UAAU,MAAM,IAAI,SAAS;CACnC,IAAI,QAAQ,OAAO,MAAM;EACvB,MAAM,aAAa,QAAQ,MAAM;;EAEjC,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MACL,0BAA0B,WAAW,0BACvC;GACA,OAAO;EACT;CACF;CACA,IAAI,QAAQ,SAAS,MAAM;EACzB,MAAM,aAAa,QAAQ,QAAQ;;EAEnC,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MACL,0BAA0B,WAAW,4BACvC;GACA,OAAO;EACT;CACF;CACA,OAAO;AACT;AAGA,eAAsB,kBACpB,QACA,UACA,aACA,KACwB;CACxB,MAAM,aACJ,cAAc,QAAQ,KACtB,OAAO,aAAa,QACnB,MAAM,YAAY,MAAM,KAAK,aAAa,QAAQ,CAAC,KACnD,MAAM,YAAY,MAAM,KAAK,aAAa,eAAe,CAAC,KAC1D,MAAM,yBAAyB,GAAG;CACrC,IAAI,CAAC,YACH,OAAO,MAAM,yCAAyC;CAExD,OAAO;AACT;AAEA,SAAgB,cAAc,UAAyC;CACrE,OAAO,SAAS,MAAM,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE;AACrD;AAEA,eAAsB,sBACpB,QACA,UACA,aACA,KACyB;CAQzB,OAAO;EACL,UAAU;EACV,YAAA,MATuB,kBACvB,QACA,UACA,aACA,GACF;CAKA;AACF"}
1
+ {"version":3,"file":"node-version.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/node-version.ts"],"sourcesContent":["import semver from 'semver';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport type { ToolConstraint } from '../../../../util/exec/types.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport type { LazyPackageJson } from './types.ts';\n\nasync function getNodeFile(filename: string): Promise<string | null> {\n try {\n // TODO #22198\n const constraint = (await readLocalFile(filename, 'utf8'))!\n .split(newlineRegex)[0]\n .replace(regEx(/^v/), '');\n if (semver.validRange(constraint)) {\n logger.debug(`Using node constraint \"${constraint}\" from ${filename}`);\n return constraint;\n }\n } catch {\n // do nothing\n }\n return null;\n}\n\nasync function getPackageJsonConstraint(\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const pkgJson = await pkg.getValue();\n if (pkgJson.volta?.node) {\n const constraint = pkgJson.volta.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json volta`,\n );\n return constraint;\n }\n }\n if (pkgJson.engines?.node) {\n const constraint = pkgJson.engines.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json engines`,\n );\n return constraint;\n }\n }\n return null;\n}\n\n// export only for testing\nexport async function getNodeConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const constraint =\n getNodeUpdate(upgrades) ??\n (await resolveToolConstraint(\n config,\n 'node',\n async () =>\n (await getNodeFile(upath.join(lockFileDir, '.nvmrc'))) ??\n (await getNodeFile(upath.join(lockFileDir, '.node-version'))) ??\n (await getPackageJsonConstraint(pkg)),\n )) ??\n null;\n if (!constraint) {\n logger.debug('No node constraint found - using latest');\n }\n return constraint;\n}\n\nexport function getNodeUpdate(upgrades: Upgrade[]): string | undefined {\n return upgrades.find((u) => u.depName === 'node')?.newValue;\n}\n\nexport async function getNodeToolConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<ToolConstraint> {\n const constraint = await getNodeConstraint(\n config,\n upgrades,\n lockFileDir,\n pkg,\n );\n\n return {\n toolName: 'node',\n constraint,\n };\n}\n"],"mappings":";;;;;;;AAUA,eAAe,YAAY,UAA0C;CACnE,IAAI;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM,EAAA,CACrD,MAAM,YAAY,CAAC,CAAC,EAAE,CACtB,QAAQ,MAAM,IAAI,GAAG,EAAE;EAC1B,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MAAM,0BAA0B,WAAW,SAAS,UAAU;GACrE,OAAO;EACT;CACF,QAAQ,CAER;CACA,OAAO;AACT;AAEA,eAAe,yBACb,KACwB;CACxB,MAAM,UAAU,MAAM,IAAI,SAAS;CACnC,IAAI,QAAQ,OAAO,MAAM;EACvB,MAAM,aAAa,QAAQ,MAAM;;EAEjC,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MACL,0BAA0B,WAAW,0BACvC;GACA,OAAO;EACT;CACF;CACA,IAAI,QAAQ,SAAS,MAAM;EACzB,MAAM,aAAa,QAAQ,QAAQ;;EAEnC,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MACL,0BAA0B,WAAW,4BACvC;GACA,OAAO;EACT;CACF;CACA,OAAO;AACT;AAGA,eAAsB,kBACpB,QACA,UACA,aACA,KACwB;CACxB,MAAM,aACJ,cAAc,QAAQ,KACrB,MAAM,sBACL,QACA,QACA,YACG,MAAM,YAAY,MAAM,KAAK,aAAa,QAAQ,CAAC,KACnD,MAAM,YAAY,MAAM,KAAK,aAAa,eAAe,CAAC,KAC1D,MAAM,yBAAyB,GAAG,CACvC,KACA;CACF,IAAI,CAAC,YACH,OAAO,MAAM,yCAAyC;CAExD,OAAO;AACT;AAEA,SAAgB,cAAc,UAAyC;CACrE,OAAO,SAAS,MAAM,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE;AACrD;AAEA,eAAsB,sBACpB,QACA,UACA,aACA,KACyB;CAQzB,OAAO;EACL,UAAU;EACV,YAAA,MATuB,kBACvB,QACA,UACA,aACA,GACF;CAKA;AACF"}
@@ -8,6 +8,7 @@ import { trimSlashes } from "../../../../util/url.js";
8
8
  import { deleteLocalFile, localPathExists, readLocalFile, renameLocalFile } from "../../../../util/fs/index.js";
9
9
  import { Result } from "../../../../util/result.js";
10
10
  import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
11
+ import { resolveToolConstraint } from "../../util.js";
11
12
  import { getNodeToolConstraint } from "./node-version.js";
12
13
  import { PackageLock } from "../schema.js";
13
14
  import { composeLockFile, parseLockFile } from "../utils.js";
@@ -71,7 +72,7 @@ async function generateLockFile(lockFileDir, env, filename, config = {}, upgrade
71
72
  const lazyPkgJson = lazyLoadPackageJson(lockFileDir);
72
73
  const npmToolConstraint = {
73
74
  toolName: "npm",
74
- constraint: config.constraints?.npm ?? getPackageManagerVersion("npm", await lazyPkgJson.getValue()) ?? await getNpmConstraintFromPackageLock(lockFileDir, filename) ?? null
75
+ constraint: await resolveToolConstraint(config, "npm", async () => getPackageManagerVersion("npm", await lazyPkgJson.getValue()) ?? await getNpmConstraintFromPackageLock(lockFileDir, filename)) ?? null
75
76
  };
76
77
  const supportsPreferDedupeFlag = !npmToolConstraint.constraint || semver.intersects(">=7.0.0", npmToolConstraint.constraint);
77
78
  let commands = [];
@@ -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' | '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 { resolveToolConstraint } from '../../util.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 (await resolveToolConstraint(\n config,\n 'npm',\n async () =>\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":"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"}
@@ -5,6 +5,7 @@ import { logger } from "../../../../logger/index.js";
5
5
  import { parseSingleYaml } from "../../../../util/yaml.js";
6
6
  import { deleteLocalFile, ensureCacheDir, getSiblingFileName, localPathExists, readLocalFile } from "../../../../util/fs/index.js";
7
7
  import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
8
+ import { resolveToolConstraint } from "../../util.js";
8
9
  import { PNPM_CACHE_DIR, PNPM_STORE_DIR } from "../constants.js";
9
10
  import { getNodeToolConstraint } from "./node-version.js";
10
11
  import { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
@@ -25,7 +26,7 @@ async function generateLockFile(lockFileDir, env, config, upgrades = []) {
25
26
  const lazyPgkJson = lazyLoadPackageJson(lockFileDir);
26
27
  const pnpmToolConstraint = {
27
28
  toolName: "pnpm",
28
- constraint: getPnpmConstraintFromUpgrades(upgrades) ?? config.constraints?.pnpm ?? getPackageManagerVersion("pnpm", await lazyPgkJson.getValue()) ?? await getConstraintFromLockFile(lockFileName)
29
+ constraint: getPnpmConstraintFromUpgrades(upgrades) ?? await resolveToolConstraint(config, "pnpm", async () => getPackageManagerVersion("pnpm", await lazyPgkJson.getValue()) ?? await getConstraintFromLockFile(lockFileName))
29
30
  };
30
31
  const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);
31
32
  const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);
@@ -1 +1 @@
1
- {"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/pnpm.ts"],"sourcesContent":["import { isNumber, isNumericString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { TEMPORARY_ERROR } 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 ensureCacheDir,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { PNPM_CACHE_DIR, PNPM_STORE_DIR } from '../constants.ts';\nimport type { PnpmWorkspaceFile } from '../extract/types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, PnpmLockFile } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nfunction getPnpmConstraintFromUpgrades(upgrades: Upgrade[]): string | null {\n for (const upgrade of upgrades) {\n if (upgrade.depName === 'pnpm' && upgrade.newVersion) {\n return upgrade.newVersion;\n }\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: PostUpdateConfig,\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'pnpm-lock.yaml');\n logger.debug(`Spawning pnpm install to create ${lockFileName}`);\n let lockFile: string | null = null;\n const commands: string[] = [];\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const pnpmToolConstraint: ToolConstraint = {\n toolName: 'pnpm',\n constraint:\n getPnpmConstraintFromUpgrades(upgrades) ?? // if pnpm is being upgraded, it comes first\n config.constraints?.pnpm ?? // from user config or extraction\n getPackageManagerVersion('pnpm', await lazyPgkJson.getValue()) ?? // look in package.json > packageManager or engines\n (await getConstraintFromLockFile(lockFileName)), // use lockfileVersion to find pnpm version range\n };\n\n const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);\n const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);\n const extraEnv: ExtraEnv = {\n // those arwe no longer working and it's unclear if they ever worked\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n // these are used by pnpm v5 to v10. Maybe earlier versions too\n npm_config_cache_dir: pnpmConfigCacheDir,\n npm_config_store_dir: pnpmConfigStoreDir,\n // pnpm stops reading npm_config_* env vars since v11\n pnpm_config_cache_dir: pnpmConfigCacheDir,\n pnpm_config_store_dir: pnpmConfigStoreDir,\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 docker: {},\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n pnpmToolConstraint,\n ],\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 const pnpmWorkspaceFilePath = getSiblingFileName(\n lockFileName,\n 'pnpm-workspace.yaml',\n );\n\n let args = '--lockfile-only';\n\n // If it's not a workspaces project/monorepo, but single project with unrelated other npm project in source tree (for example, a git submodule),\n // `--recursive` will install un-wanted project.\n // we should avoid this.\n if (await localPathExists(pnpmWorkspaceFilePath)) {\n const pnpmWorkspace = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(pnpmWorkspaceFilePath, 'utf8'))!,\n );\n if (pnpmWorkspace?.packages?.length) {\n logger.debug(\n `Found pnpm workspace with ${pnpmWorkspace.packages.length} package definitions`,\n );\n // we are in a monorepo, 'pnpm update' needs the '--recursive' flag contrary to 'pnpm install'\n args += ' --recursive';\n }\n }\n if (!GlobalConfig.get('allowScripts')) {\n // If the admin disallows scripts, then neither scripts nor the pnpmfile should be run\n args += ' --ignore-scripts';\n args += ' --ignore-pnpmfile';\n } else if (config.ignoreScripts) {\n // If the admin allows scripts then always allow the pnpmfile\n args += ' --ignore-scripts';\n }\n\n logger.trace({ args }, 'pnpm command options');\n\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n if (lockUpdates.length !== upgrades.length) {\n // This command updates the lock file based on package.json.\n // Pass `--no-frozen-lockfile` to ensure the lockfile is updated\n commands.push(`pnpm install ${args} --no-frozen-lockfile`);\n }\n\n // rangeStrategy = update-lockfile\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (pnpm)');\n commands.push(\n `pnpm update --no-save ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.packageName!}@${update.newVersion!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')} ${args}`,\n );\n }\n\n // postUpdateOptions\n if (config.postUpdateOptions?.includes('pnpmDedupe')) {\n commands.push(`pnpm dedupe ${args.replace(' --recursive', '')}`);\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 `pnpm-lock.yaml` for lock file maintenance',\n );\n }\n }\n\n await exec(commands, execOptions);\n lockFile = await readLocalFile(lockFileName, 'utf8');\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 commands,\n err,\n stdout: err.stdout,\n stderr: err.stderr,\n type: 'pnpm',\n },\n 'lock file error',\n );\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport async function getConstraintFromLockFile(\n lockFileName: string,\n): Promise<string | null> {\n let constraint: string | null = null;\n try {\n const lockfileContent = await readLocalFile(lockFileName, 'utf8');\n if (!lockfileContent) {\n logger.trace(`Empty pnpm lock file: ${lockFileName}`);\n return null;\n }\n // TODO: use schema (#9610)\n const pnpmLock = parseSingleYaml<PnpmLockFile>(lockfileContent);\n if (\n !isNumber(pnpmLock?.lockfileVersion) &&\n !isNumericString(pnpmLock?.lockfileVersion)\n ) {\n logger.trace(`Invalid pnpm lockfile version: ${lockFileName}`);\n return null;\n }\n // find matching lockfileVersion and use its constraints\n // if no match found use lockfileVersion 5\n // lockfileVersion 5 is the minimum version required to generate the pnpm-lock.yaml file\n const { lowerConstraint, upperConstraint } = lockToPnpmVersionMapping.find(\n (m) => m.lockfileVersion === pnpmLock.lockfileVersion,\n ) ?? {\n lockfileVersion: 5.0,\n lowerConstraint: '>=3',\n upperConstraint: '<3.5.0',\n };\n constraint = lowerConstraint;\n if (upperConstraint) {\n constraint += ` ${upperConstraint}`;\n }\n } catch (err) {\n logger.warn({ err }, 'Error getting pnpm constraints from lock file');\n }\n return constraint;\n}\n\n/**\n * pnpm lockfiles have corresponding version numbers called \"lockfileVersion\"\n * each lockfileVersion can only be generated by a certain pnpm version range\n * eg. lockfileVersion: 5.4 can only be generated by pnpm version >=7 && <8\n * official list can be found here : https://github.com/pnpm/spec/tree/master/lockfile\n * we use the mapping present below to find the compatible pnpm version range for a given lockfileVersion\n *\n * the various terms used in the mapping are explained below:\n * lowerConstraint : lowest pnpm version that can generate the lockfileVersion\n * upperConstraint : highest pnpm version that can generate the lockfileVersion\n * lowerBound : highest pnpm version that is less than the lowerConstraint\n * upperBound : lowest pnpm version that is greater than the upperConstraint\n *\n * To handle future lockfileVersions, we need to:\n * 1. add a upperBound and upperConstraint to the current latest lockfileVersion\n * 2. add an object for the new lockfileVersion with lowerBound and lowerConstraint\n *\n * lockfileVersion from v6 on are strings\n */\nconst lockToPnpmVersionMapping: LockToPnpmVersionMapping[] = [\n { lockfileVersion: '9.0', lowerConstraint: '>=9' },\n {\n lockfileVersion: '6.0',\n lowerConstraint: '>=7.24.2',\n upperConstraint: '<9',\n },\n {\n lockfileVersion: 5.4,\n lowerConstraint: '>=7',\n upperConstraint: '<8',\n },\n {\n lockfileVersion: 5.3,\n lowerConstraint: '>=6',\n upperConstraint: '<7',\n },\n {\n lockfileVersion: 5.2,\n lowerConstraint: '>=5.10.0',\n upperConstraint: '<6',\n },\n {\n lockfileVersion: 5.1,\n lowerConstraint: '>=3.5.0',\n upperConstraint: '<5.9.3',\n },\n];\n\ninterface LockToPnpmVersionMapping {\n lockfileVersion: string | number;\n lowerConstraint: string;\n upperConstraint?: string;\n}\n"],"mappings":";;;;;;;;;;;;;;AAgCA,SAAS,8BAA8B,UAAoC;CACzE,KAAK,MAAM,WAAW,UACpB,IAAI,QAAQ,YAAY,UAAU,QAAQ,YACxC,OAAO,QAAQ;CAGnB,OAAO;AACT;AAEA,eAAsB,iBACpB,aACA,KACA,QACA,WAAsB,CAAC,GACU;CACjC,MAAM,eAAe,MAAM,KAAK,aAAa,gBAAgB;CAC7D,OAAO,MAAM,mCAAmC,cAAc;CAC9D,IAAI,WAA0B;CAC9B,MAAM,WAAqB,CAAC;CAC5B,IAAI;EACF,MAAM,cAAc,oBAAoB,WAAW;EACnD,MAAM,qBAAqC;GACzC,UAAU;GACV,YACE,8BAA8B,QAAQ,KACtC,OAAO,aAAa,QACpB,yBAAyB,QAAQ,MAAM,YAAY,SAAS,CAAC,KAC5D,MAAM,0BAA0B,YAAY;EACjD;EAEA,MAAM,qBAAqB,MAAM,eAAe,cAAc;EAC9D,MAAM,qBAAqB,MAAM,eAAe,cAAc;EAC9D,MAAM,WAAqB;GAEzB,kBAAkB,IAAI;GACtB,kBAAkB,IAAI;GAEtB,sBAAsB;GACtB,sBAAsB;GAEtB,uBAAuB;GACvB,uBAAuB;EACzB;EAEA,MAAM,EAAE,kBAAkB,uBAAuB,OAAO,YAAY;EACpE,IAAI,eACF,SAAS,eAAe,eAAe,aAAa;EAGtD,MAAM,cAA2B;GAC/B,SAAS;GACT;GACA,QAAQ,CAAC;GACT,iBAAiB,CACf,MAAM,sBAAsB,QAAQ,UAAU,aAAa,WAAW,GACtE,kBACF;EACF;;EAEA,IAAI,aAAa,IAAI,cAAc,GAAG;GACpC,SAAS,WAAW,IAAI;GACxB,SAAS,YAAY,IAAI;EAC3B;EAEA,MAAM,wBAAwB,mBAC5B,cACA,qBACF;EAEA,IAAI,OAAO;EAKX,IAAI,MAAM,gBAAgB,qBAAqB,GAAG;GAChD,MAAM,gBAAgB,gBACnB,MAAM,cAAc,uBAAuB,MAAM,CACpD;GACA,IAAI,eAAe,UAAU,QAAQ;IACnC,OAAO,MACL,6BAA6B,cAAc,SAAS,OAAO,qBAC7D;IAEA,QAAQ;GACV;EACF;EACA,IAAI,CAAC,aAAa,IAAI,cAAc,GAAG;GAErC,QAAQ;GACR,QAAQ;EACV,OAAO,IAAI,OAAO,eAEhB,QAAQ;EAGV,OAAO,MAAM,EAAE,KAAK,GAAG,sBAAsB;EAE7C,MAAM,cAAc,SAAS,QAAQ,YAAY,QAAQ,gBAAgB;EAEzE,IAAI,YAAY,WAAW,SAAS,QAGlC,SAAS,KAAK,gBAAgB,KAAK,sBAAsB;EAI3D,IAAI,YAAY,QAAQ;GACtB,OAAO,MAAM,kCAAkC;GAC/C,SAAS,KACP,yBAAyB,YAEtB,KAAK,WAAW,GAAG,OAAO,YAAa,GAAG,OAAO,YAAa,CAAC,CAC/D,OAAO,aAAa,CAAC,CACrB,IAAI,KAAK,CAAC,CACV,KAAK,GAAG,EAAE,GAAG,MAClB;EACF;EAGA,IAAI,OAAO,mBAAmB,SAAS,YAAY,GACjD,SAAS,KAAK,eAAe,KAAK,QAAQ,gBAAgB,EAAE,GAAG;EAGjE,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,2DACF;GACF;EACF;EAEA,MAAM,KAAK,UAAU,WAAW;EAChC,WAAW,MAAM,cAAc,cAAc,MAAM;CACrD,SAAS,KAAK;;EAEZ,IAAI,IAAI,YAAA,mBACN,MAAM;EAER,OAAO,MACL;GACE;GACA;GACA,QAAQ,IAAI;GACZ,QAAQ,IAAI;GACZ,MAAM;EACR,GACA,iBACF;EACA,OAAO;GAAE,OAAO;GAAM,QAAQ,IAAI;GAAQ,QAAQ,IAAI;EAAO;CAC/D;CACA,OAAO,EAAE,SAAS;AACpB;AAEA,eAAsB,0BACpB,cACwB;CACxB,IAAI,aAA4B;CAChC,IAAI;EACF,MAAM,kBAAkB,MAAM,cAAc,cAAc,MAAM;EAChE,IAAI,CAAC,iBAAiB;GACpB,OAAO,MAAM,yBAAyB,cAAc;GACpD,OAAO;EACT;EAEA,MAAM,WAAW,gBAA8B,eAAe;EAC9D,IACE,CAAC,SAAS,UAAU,eAAe,KACnC,CAAC,gBAAgB,UAAU,eAAe,GAC1C;GACA,OAAO,MAAM,kCAAkC,cAAc;GAC7D,OAAO;EACT;EAIA,MAAM,EAAE,iBAAiB,oBAAoB,yBAAyB,MACnE,MAAM,EAAE,oBAAoB,SAAS,eACxC,KAAK;GACH,iBAAiB;GACjB,iBAAiB;GACjB,iBAAiB;EACnB;EACA,aAAa;EACb,IAAI,iBACF,cAAc,IAAI;CAEtB,SAAS,KAAK;EACZ,OAAO,KAAK,EAAE,IAAI,GAAG,+CAA+C;CACtE;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;AAqBA,MAAM,2BAAuD;CAC3D;EAAE,iBAAiB;EAAO,iBAAiB;CAAM;CACjD;EACE,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;CACnB;CACA;EACE,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;CACnB;CACA;EACE,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;CACnB;CACA;EACE,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;CACnB;CACA;EACE,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;CACnB;AACF"}
1
+ {"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/pnpm.ts"],"sourcesContent":["import { isNumber, isNumericString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { TEMPORARY_ERROR } 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 ensureCacheDir,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { PNPM_CACHE_DIR, PNPM_STORE_DIR } from '../constants.ts';\nimport type { PnpmWorkspaceFile } from '../extract/types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, PnpmLockFile } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nfunction getPnpmConstraintFromUpgrades(upgrades: Upgrade[]): string | null {\n for (const upgrade of upgrades) {\n if (upgrade.depName === 'pnpm' && upgrade.newVersion) {\n return upgrade.newVersion;\n }\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: PostUpdateConfig,\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'pnpm-lock.yaml');\n logger.debug(`Spawning pnpm install to create ${lockFileName}`);\n let lockFile: string | null = null;\n const commands: string[] = [];\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const pnpmToolConstraint: ToolConstraint = {\n toolName: 'pnpm',\n constraint:\n getPnpmConstraintFromUpgrades(upgrades) ?? // if pnpm is being upgraded, it comes first\n (await resolveToolConstraint(\n config,\n 'pnpm',\n async () =>\n getPackageManagerVersion('pnpm', await lazyPgkJson.getValue()) ?? // look in package.json > packageManager or engines\n (await getConstraintFromLockFile(lockFileName)), // use lockfileVersion to find pnpm version range\n )),\n };\n\n const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);\n const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);\n const extraEnv: ExtraEnv = {\n // those arwe no longer working and it's unclear if they ever worked\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n // these are used by pnpm v5 to v10. Maybe earlier versions too\n npm_config_cache_dir: pnpmConfigCacheDir,\n npm_config_store_dir: pnpmConfigStoreDir,\n // pnpm stops reading npm_config_* env vars since v11\n pnpm_config_cache_dir: pnpmConfigCacheDir,\n pnpm_config_store_dir: pnpmConfigStoreDir,\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 docker: {},\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n pnpmToolConstraint,\n ],\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 const pnpmWorkspaceFilePath = getSiblingFileName(\n lockFileName,\n 'pnpm-workspace.yaml',\n );\n\n let args = '--lockfile-only';\n\n // If it's not a workspaces project/monorepo, but single project with unrelated other npm project in source tree (for example, a git submodule),\n // `--recursive` will install un-wanted project.\n // we should avoid this.\n if (await localPathExists(pnpmWorkspaceFilePath)) {\n const pnpmWorkspace = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(pnpmWorkspaceFilePath, 'utf8'))!,\n );\n if (pnpmWorkspace?.packages?.length) {\n logger.debug(\n `Found pnpm workspace with ${pnpmWorkspace.packages.length} package definitions`,\n );\n // we are in a monorepo, 'pnpm update' needs the '--recursive' flag contrary to 'pnpm install'\n args += ' --recursive';\n }\n }\n if (!GlobalConfig.get('allowScripts')) {\n // If the admin disallows scripts, then neither scripts nor the pnpmfile should be run\n args += ' --ignore-scripts';\n args += ' --ignore-pnpmfile';\n } else if (config.ignoreScripts) {\n // If the admin allows scripts then always allow the pnpmfile\n args += ' --ignore-scripts';\n }\n\n logger.trace({ args }, 'pnpm command options');\n\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n if (lockUpdates.length !== upgrades.length) {\n // This command updates the lock file based on package.json.\n // Pass `--no-frozen-lockfile` to ensure the lockfile is updated\n commands.push(`pnpm install ${args} --no-frozen-lockfile`);\n }\n\n // rangeStrategy = update-lockfile\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (pnpm)');\n commands.push(\n `pnpm update --no-save ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.packageName!}@${update.newVersion!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')} ${args}`,\n );\n }\n\n // postUpdateOptions\n if (config.postUpdateOptions?.includes('pnpmDedupe')) {\n commands.push(`pnpm dedupe ${args.replace(' --recursive', '')}`);\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 `pnpm-lock.yaml` for lock file maintenance',\n );\n }\n }\n\n await exec(commands, execOptions);\n lockFile = await readLocalFile(lockFileName, 'utf8');\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 commands,\n err,\n stdout: err.stdout,\n stderr: err.stderr,\n type: 'pnpm',\n },\n 'lock file error',\n );\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport async function getConstraintFromLockFile(\n lockFileName: string,\n): Promise<string | null> {\n let constraint: string | null = null;\n try {\n const lockfileContent = await readLocalFile(lockFileName, 'utf8');\n if (!lockfileContent) {\n logger.trace(`Empty pnpm lock file: ${lockFileName}`);\n return null;\n }\n // TODO: use schema (#9610)\n const pnpmLock = parseSingleYaml<PnpmLockFile>(lockfileContent);\n if (\n !isNumber(pnpmLock?.lockfileVersion) &&\n !isNumericString(pnpmLock?.lockfileVersion)\n ) {\n logger.trace(`Invalid pnpm lockfile version: ${lockFileName}`);\n return null;\n }\n // find matching lockfileVersion and use its constraints\n // if no match found use lockfileVersion 5\n // lockfileVersion 5 is the minimum version required to generate the pnpm-lock.yaml file\n const { lowerConstraint, upperConstraint } = lockToPnpmVersionMapping.find(\n (m) => m.lockfileVersion === pnpmLock.lockfileVersion,\n ) ?? {\n lockfileVersion: 5.0,\n lowerConstraint: '>=3',\n upperConstraint: '<3.5.0',\n };\n constraint = lowerConstraint;\n if (upperConstraint) {\n constraint += ` ${upperConstraint}`;\n }\n } catch (err) {\n logger.warn({ err }, 'Error getting pnpm constraints from lock file');\n }\n return constraint;\n}\n\n/**\n * pnpm lockfiles have corresponding version numbers called \"lockfileVersion\"\n * each lockfileVersion can only be generated by a certain pnpm version range\n * eg. lockfileVersion: 5.4 can only be generated by pnpm version >=7 && <8\n * official list can be found here : https://github.com/pnpm/spec/tree/master/lockfile\n * we use the mapping present below to find the compatible pnpm version range for a given lockfileVersion\n *\n * the various terms used in the mapping are explained below:\n * lowerConstraint : lowest pnpm version that can generate the lockfileVersion\n * upperConstraint : highest pnpm version that can generate the lockfileVersion\n * lowerBound : highest pnpm version that is less than the lowerConstraint\n * upperBound : lowest pnpm version that is greater than the upperConstraint\n *\n * To handle future lockfileVersions, we need to:\n * 1. add a upperBound and upperConstraint to the current latest lockfileVersion\n * 2. add an object for the new lockfileVersion with lowerBound and lowerConstraint\n *\n * lockfileVersion from v6 on are strings\n */\nconst lockToPnpmVersionMapping: LockToPnpmVersionMapping[] = [\n { lockfileVersion: '9.0', lowerConstraint: '>=9' },\n {\n lockfileVersion: '6.0',\n lowerConstraint: '>=7.24.2',\n upperConstraint: '<9',\n },\n {\n lockfileVersion: 5.4,\n lowerConstraint: '>=7',\n upperConstraint: '<8',\n },\n {\n lockfileVersion: 5.3,\n lowerConstraint: '>=6',\n upperConstraint: '<7',\n },\n {\n lockfileVersion: 5.2,\n lowerConstraint: '>=5.10.0',\n upperConstraint: '<6',\n },\n {\n lockfileVersion: 5.1,\n lowerConstraint: '>=3.5.0',\n upperConstraint: '<5.9.3',\n },\n];\n\ninterface LockToPnpmVersionMapping {\n lockfileVersion: string | number;\n lowerConstraint: string;\n upperConstraint?: string;\n}\n"],"mappings":"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"}
@@ -9,6 +9,7 @@ import { ExternalHostError } from "../../../../types/errors/external-host-error.
9
9
  import { localPathIsFile, readLocalFile, writeLocalFile } from "../../../../util/fs/index.js";
10
10
  import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
11
11
  import { NpmDatasource } from "../../../datasource/npm/index.js";
12
+ import { resolveToolConstraint } from "../../util.js";
12
13
  import { getNodeToolConstraint } from "./node-version.js";
13
14
  import { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
14
15
  import { getYarnLock, getYarnVersionFromLock } from "../extract/yarn.js";
@@ -63,8 +64,9 @@ async function generateLockFile(lockFileDir, env, config = {}, upgrades = []) {
63
64
  const lazyPgkJson = lazyLoadPackageJson(lockFileDir);
64
65
  const toolConstraints = [await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson)];
65
66
  const yarnUpdate = upgrades.find(isYarnUpdate);
66
- const yarnCompatibility = (yarnUpdate ? yarnUpdate.newValue : config.constraints?.yarn) ?? getPackageManagerVersion("yarn", await lazyPgkJson.getValue()) ?? getYarnVersionFromLock(await getYarnLock(lockFileName));
67
- const minYarnVersion = semver.validRange(yarnCompatibility) && semver.minVersion(yarnCompatibility);
67
+ const yarnCompatibility = yarnUpdate?.newValue ?? await resolveToolConstraint(config, "yarn", async () => getPackageManagerVersion("yarn", await lazyPgkJson.getValue()) ?? getYarnVersionFromLock(await getYarnLock(lockFileName)));
68
+ const yarnRange = semver.validRange(yarnCompatibility);
69
+ const minYarnVersion = yarnRange && semver.minVersion(yarnRange);
68
70
  const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;
69
71
  const isYarnDedupeAvailable = minYarnVersion && semver.gte(minYarnVersion, "2.2.0");
70
72
  const isYarnModeAvailable = minYarnVersion && semver.gte(minYarnVersion, "3.0.0");
@@ -75,7 +77,7 @@ async function generateLockFile(lockFileDir, env, config = {}, upgrades = []) {
75
77
  const hasPackageManager = !!config.managerData?.hasPackageManager || !!upgrades[0]?.managerData?.hasPackageManager;
76
78
  if (!isYarn1 && hasPackageManager) toolConstraints.push({
77
79
  toolName: "corepack",
78
- constraint: config.constraints?.corepack
80
+ constraint: await resolveToolConstraint(config, "corepack")
79
81
  });
80
82
  else {
81
83
  toolConstraints.push(yarnTool);
@@ -1 +1 @@
1
- {"version":3,"file":"yarn.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/yarn.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\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 { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n CommandWithOptions,\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n localPathIsFile,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { coerceObject } from '../../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { getYarnLock, getYarnVersionFromLock } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport async function checkYarnrc(\n lockFileDir: string,\n): Promise<{ offlineMirror: boolean; yarnPath: string | null }> {\n let offlineMirror = false;\n let yarnPath: string | null = null;\n try {\n const yarnrc = await readLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n 'utf8',\n );\n if (isString(yarnrc)) {\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n offlineMirror = !!mirrorLine;\n const pathLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-path '));\n if (pathLine) {\n yarnPath = pathLine.replace(\n regEx(/^yarn-path\\s+\"?(?<path>.+?)\"?$/),\n '$<path>',\n );\n }\n if (yarnPath) {\n // resolve binary relative to `yarnrc`\n yarnPath = upath.join(lockFileDir, yarnPath);\n }\n const yarnBinaryExists = yarnPath\n ? await localPathIsFile(yarnPath)\n : false;\n let scrubbedYarnrc = yarnrc\n .replace('--install.pure-lockfile true', '')\n .replace('--install.frozen-lockfile true', '');\n if (!yarnBinaryExists) {\n scrubbedYarnrc = scrubbedYarnrc.replace(\n regEx(/^yarn-path\\s+\"?.+?\"?$/gm),\n '',\n );\n yarnPath = null;\n }\n if (yarnrc !== scrubbedYarnrc) {\n logger.debug(`Writing scrubbed .yarnrc to ${lockFileDir}`);\n await writeLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n scrubbedYarnrc,\n );\n }\n }\n /* v8 ignore next -- needs test */\n } catch {\n // not found\n }\n return { offlineMirror, yarnPath };\n}\n\nexport function getOptimizeCommand(fileName: string): string[] {\n return ['sed', '-i', 's/ steps,/ steps.slice(0,1),/', fileName];\n}\n\nexport function isYarnUpdate(upgrade: Upgrade): boolean {\n return upgrade.depType === 'packageManager' && upgrade.depName === 'yarn';\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: Partial<PostUpdateConfig<NpmManagerData>> = {},\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n logger.debug(`Spawning yarn install to create ${lockFileName}`);\n let lockFile: string | null = null;\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const toolConstraints: ToolConstraint[] = [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n ];\n const yarnUpdate = upgrades.find(isYarnUpdate);\n const yarnCompatibility =\n (yarnUpdate ? yarnUpdate.newValue : config.constraints?.yarn) ??\n getPackageManagerVersion('yarn', await lazyPgkJson.getValue()) ??\n getYarnVersionFromLock(await getYarnLock(lockFileName));\n const minYarnVersion =\n semver.validRange(yarnCompatibility) &&\n semver.minVersion(yarnCompatibility);\n const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;\n const isYarnDedupeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '2.2.0');\n const isYarnModeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '3.0.0');\n\n const yarnTool: ToolConstraint = {\n toolName: 'yarn',\n constraint: '^1.22.18', // needs to be a v1 yarn, otherwise v2 will be installed\n };\n\n // check first upgrade, see #17786\n const hasPackageManager =\n !!config.managerData?.hasPackageManager ||\n !!upgrades[0]?.managerData?.hasPackageManager;\n\n if (!isYarn1 && hasPackageManager) {\n toolConstraints.push({\n toolName: 'corepack',\n constraint: config.constraints?.corepack,\n });\n } else {\n toolConstraints.push(yarnTool);\n if (isYarn1 && minYarnVersion) {\n yarnTool.constraint = yarnCompatibility;\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 commands: (string | CommandWithOptions)[] = [];\n let cmdOptions = ''; // should have a leading space\n if (config.skipInstalls !== false) {\n if (isYarn1) {\n const { offlineMirror, yarnPath } = await checkYarnrc(lockFileDir);\n // v8 ignore else -- TODO: add test #40625\n if (!offlineMirror) {\n logger.debug('Updating yarn.lock only - skipping node_modules');\n // The following change causes Yarn 1.x to exit gracefully after updating the lock file but without installing node_modules\n yarnTool.toolName = 'yarn-slim';\n if (yarnPath) {\n commands.push({\n command: getOptimizeCommand(yarnPath),\n ignoreFailure: true,\n });\n }\n }\n } else if (isYarnModeAvailable) {\n // Don't run the link step and only fetch what's necessary to compute an updated lockfile\n cmdOptions += ' --mode=update-lockfile';\n }\n }\n\n if (isYarn1) {\n cmdOptions +=\n ' --ignore-engines --ignore-platform --network-timeout 100000';\n extraEnv.YARN_CACHE_FOLDER = env.YARN_CACHE_FOLDER;\n } else {\n extraEnv.YARN_ENABLE_IMMUTABLE_INSTALLS = 'false';\n extraEnv.YARN_HTTP_TIMEOUT = '100000';\n extraEnv.YARN_GLOBAL_FOLDER = env.YARN_GLOBAL_FOLDER;\n if (!config.managerData?.yarnZeroInstall) {\n logger.debug('Enabling global cache as zero-install is not detected');\n extraEnv.YARN_ENABLE_GLOBAL_CACHE = '1';\n }\n }\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n if (isYarn1) {\n cmdOptions += ' --ignore-scripts';\n } else if (isYarnModeAvailable) {\n if (config.skipInstalls === false) {\n // Don't run the build scripts\n cmdOptions += ' --mode=skip-build';\n }\n } else {\n extraEnv.YARN_ENABLE_SCRIPTS = '0';\n }\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 docker: {},\n toolConstraints,\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 (yarnUpdate && !isYarn1) {\n logger.debug('Updating Yarn binary');\n // TODO: types (#22198)\n commands.push(`yarn set version ${quote(yarnUpdate.newValue!)}`);\n }\n\n const allEnv = getEnv();\n if (allEnv.RENOVATE_X_YARN_PROXY) {\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTP_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpProxy');\n commands.push(\n `yarn config set --home httpProxy ${quote(allEnv.HTTP_PROXY)}`,\n );\n }\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTPS_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpsProxy');\n commands.push(\n `yarn config set --home httpsProxy ${quote(allEnv.HTTPS_PROXY)}`,\n );\n }\n }\n\n // This command updates the lock file based on package.json\n commands.push(`yarn install${cmdOptions}`);\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (yarn)');\n if (isYarn1) {\n // `yarn upgrade` updates based on the version range specified in the package file\n // note - this can hit a yarn bug, see https://github.com/yarnpkg/yarn/issues/8236\n commands.push(\n `yarn upgrade ${lockUpdates\n .map((update) => update.depName)\n .filter(isString)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n } else {\n // `yarn up -R` updates to the latest release in each range\n commands.push(\n `yarn up -R ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.depName!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n }\n }\n\n // postUpdateOptions\n ['fewer', 'highest'].forEach((s) => {\n if (\n config.postUpdateOptions?.includes(\n `yarnDedupe${s.charAt(0).toUpperCase()}${s.slice(1)}`,\n )\n ) {\n logger.debug(`Performing yarn dedupe ${s}`);\n if (isYarn1) {\n commands.push(`npx yarn-deduplicate --strategy ${s}`);\n // Run yarn again in case any changes are necessary\n commands.push(`yarn install${cmdOptions}`);\n } else if (isYarnDedupeAvailable && s === 'highest') {\n commands.push(`yarn dedupe --strategy ${s}${cmdOptions}`);\n } else {\n logger.debug(`yarn dedupe ${s} not available`);\n }\n }\n });\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n\n // Note: Instead of just deleting the `yarn.lock` file, we just wipe it\n // and keep an empty lock file. Deleting the lock file could result in different\n // Yarn semantics. e.g. Yarn 2+ will error when `yarn install` is executed in\n // a subdirectory which is not part of a Yarn workspace. Yarn suggests to create\n // an empty lock file if a subdirectory should be treated as its own workspace.\n // https://github.com/yarnpkg/berry/blob/20612e82d26ead5928cc27bf482bb8d62dde87d3/packages/yarnpkg-core/sources/Project.ts#L284.\n try {\n await writeLocalFile(lockFileName, '');\n } catch (err) {\n // v8 ignore next -- TODO: add test #40625\n logger.debug(\n { err, lockFileName },\n 'Error clearing `yarn.lock` for lock file maintenance',\n );\n }\n }\n\n // Run the commands\n await exec(commands, execOptions);\n\n // Read the result\n lockFile = await readLocalFile(lockFileName, 'utf8');\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: 'yarn',\n },\n 'lock file error',\n );\n const stdouterr = String(err.stdout) + String(err.stderr);\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('ENOSPC: no space left on device') ||\n stdouterr.includes('Out of diskspace')\n ) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('The registry may be down.') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.yarnpkg.com') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.npmjs.org')\n ) {\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport function fuzzyMatchAdditionalYarnrcYml<\n T extends { npmRegistries?: Record<string, unknown> },\n>(additionalYarnRcYml: T, existingYarnrRcYml: T): T {\n const keys = new Map(\n Object.keys(coerceObject(existingYarnrRcYml.npmRegistries)).map((x) => [\n x.replace(regEx(/\\/$/), '').replace(regEx(/^https?:/), ''),\n x,\n ]),\n );\n\n return {\n ...additionalYarnRcYml,\n npmRegistries: Object.entries(\n coerceObject(additionalYarnRcYml.npmRegistries),\n )\n .map(([k, v]) => {\n const key = keys.get(k.replace(regEx(/\\/$/), '')) ?? k;\n return { [key]: v };\n })\n .reduce((acc, cur) => ({ ...acc, ...cur }), {}),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"yarn.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/yarn.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\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 { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n CommandWithOptions,\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n localPathIsFile,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { coerceObject } from '../../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { getYarnLock, getYarnVersionFromLock } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport async function checkYarnrc(\n lockFileDir: string,\n): Promise<{ offlineMirror: boolean; yarnPath: string | null }> {\n let offlineMirror = false;\n let yarnPath: string | null = null;\n try {\n const yarnrc = await readLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n 'utf8',\n );\n if (isString(yarnrc)) {\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n offlineMirror = !!mirrorLine;\n const pathLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-path '));\n if (pathLine) {\n yarnPath = pathLine.replace(\n regEx(/^yarn-path\\s+\"?(?<path>.+?)\"?$/),\n '$<path>',\n );\n }\n if (yarnPath) {\n // resolve binary relative to `yarnrc`\n yarnPath = upath.join(lockFileDir, yarnPath);\n }\n const yarnBinaryExists = yarnPath\n ? await localPathIsFile(yarnPath)\n : false;\n let scrubbedYarnrc = yarnrc\n .replace('--install.pure-lockfile true', '')\n .replace('--install.frozen-lockfile true', '');\n if (!yarnBinaryExists) {\n scrubbedYarnrc = scrubbedYarnrc.replace(\n regEx(/^yarn-path\\s+\"?.+?\"?$/gm),\n '',\n );\n yarnPath = null;\n }\n if (yarnrc !== scrubbedYarnrc) {\n logger.debug(`Writing scrubbed .yarnrc to ${lockFileDir}`);\n await writeLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n scrubbedYarnrc,\n );\n }\n }\n /* v8 ignore next -- needs test */\n } catch {\n // not found\n }\n return { offlineMirror, yarnPath };\n}\n\nexport function getOptimizeCommand(fileName: string): string[] {\n return ['sed', '-i', 's/ steps,/ steps.slice(0,1),/', fileName];\n}\n\nexport function isYarnUpdate(upgrade: Upgrade): boolean {\n return upgrade.depType === 'packageManager' && upgrade.depName === 'yarn';\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: Partial<PostUpdateConfig<NpmManagerData>> = {},\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n logger.debug(`Spawning yarn install to create ${lockFileName}`);\n let lockFile: string | null = null;\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const toolConstraints: ToolConstraint[] = [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n ];\n const yarnUpdate = upgrades.find(isYarnUpdate);\n const yarnCompatibility =\n yarnUpdate?.newValue ??\n (await resolveToolConstraint(\n config,\n 'yarn',\n async () =>\n getPackageManagerVersion('yarn', await lazyPgkJson.getValue()) ??\n getYarnVersionFromLock(await getYarnLock(lockFileName)),\n ));\n const yarnRange = semver.validRange(yarnCompatibility);\n const minYarnVersion = yarnRange && semver.minVersion(yarnRange);\n const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;\n const isYarnDedupeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '2.2.0');\n const isYarnModeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '3.0.0');\n\n const yarnTool: ToolConstraint = {\n toolName: 'yarn',\n constraint: '^1.22.18', // needs to be a v1 yarn, otherwise v2 will be installed\n };\n\n // check first upgrade, see #17786\n const hasPackageManager =\n !!config.managerData?.hasPackageManager ||\n !!upgrades[0]?.managerData?.hasPackageManager;\n\n if (!isYarn1 && hasPackageManager) {\n toolConstraints.push({\n toolName: 'corepack',\n constraint: await resolveToolConstraint(config, 'corepack'),\n });\n } else {\n toolConstraints.push(yarnTool);\n if (isYarn1 && minYarnVersion) {\n yarnTool.constraint = yarnCompatibility;\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 commands: (string | CommandWithOptions)[] = [];\n let cmdOptions = ''; // should have a leading space\n if (config.skipInstalls !== false) {\n if (isYarn1) {\n const { offlineMirror, yarnPath } = await checkYarnrc(lockFileDir);\n // v8 ignore else -- TODO: add test #40625\n if (!offlineMirror) {\n logger.debug('Updating yarn.lock only - skipping node_modules');\n // The following change causes Yarn 1.x to exit gracefully after updating the lock file but without installing node_modules\n yarnTool.toolName = 'yarn-slim';\n if (yarnPath) {\n commands.push({\n command: getOptimizeCommand(yarnPath),\n ignoreFailure: true,\n });\n }\n }\n } else if (isYarnModeAvailable) {\n // Don't run the link step and only fetch what's necessary to compute an updated lockfile\n cmdOptions += ' --mode=update-lockfile';\n }\n }\n\n if (isYarn1) {\n cmdOptions +=\n ' --ignore-engines --ignore-platform --network-timeout 100000';\n extraEnv.YARN_CACHE_FOLDER = env.YARN_CACHE_FOLDER;\n } else {\n extraEnv.YARN_ENABLE_IMMUTABLE_INSTALLS = 'false';\n extraEnv.YARN_HTTP_TIMEOUT = '100000';\n extraEnv.YARN_GLOBAL_FOLDER = env.YARN_GLOBAL_FOLDER;\n if (!config.managerData?.yarnZeroInstall) {\n logger.debug('Enabling global cache as zero-install is not detected');\n extraEnv.YARN_ENABLE_GLOBAL_CACHE = '1';\n }\n }\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n if (isYarn1) {\n cmdOptions += ' --ignore-scripts';\n } else if (isYarnModeAvailable) {\n if (config.skipInstalls === false) {\n // Don't run the build scripts\n cmdOptions += ' --mode=skip-build';\n }\n } else {\n extraEnv.YARN_ENABLE_SCRIPTS = '0';\n }\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 docker: {},\n toolConstraints,\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 (yarnUpdate && !isYarn1) {\n logger.debug('Updating Yarn binary');\n // TODO: types (#22198)\n commands.push(`yarn set version ${quote(yarnUpdate.newValue!)}`);\n }\n\n const allEnv = getEnv();\n if (allEnv.RENOVATE_X_YARN_PROXY) {\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTP_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpProxy');\n commands.push(\n `yarn config set --home httpProxy ${quote(allEnv.HTTP_PROXY)}`,\n );\n }\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTPS_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpsProxy');\n commands.push(\n `yarn config set --home httpsProxy ${quote(allEnv.HTTPS_PROXY)}`,\n );\n }\n }\n\n // This command updates the lock file based on package.json\n commands.push(`yarn install${cmdOptions}`);\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (yarn)');\n if (isYarn1) {\n // `yarn upgrade` updates based on the version range specified in the package file\n // note - this can hit a yarn bug, see https://github.com/yarnpkg/yarn/issues/8236\n commands.push(\n `yarn upgrade ${lockUpdates\n .map((update) => update.depName)\n .filter(isString)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n } else {\n // `yarn up -R` updates to the latest release in each range\n commands.push(\n `yarn up -R ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.depName!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n }\n }\n\n // postUpdateOptions\n ['fewer', 'highest'].forEach((s) => {\n if (\n config.postUpdateOptions?.includes(\n `yarnDedupe${s.charAt(0).toUpperCase()}${s.slice(1)}`,\n )\n ) {\n logger.debug(`Performing yarn dedupe ${s}`);\n if (isYarn1) {\n commands.push(`npx yarn-deduplicate --strategy ${s}`);\n // Run yarn again in case any changes are necessary\n commands.push(`yarn install${cmdOptions}`);\n } else if (isYarnDedupeAvailable && s === 'highest') {\n commands.push(`yarn dedupe --strategy ${s}${cmdOptions}`);\n } else {\n logger.debug(`yarn dedupe ${s} not available`);\n }\n }\n });\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n\n // Note: Instead of just deleting the `yarn.lock` file, we just wipe it\n // and keep an empty lock file. Deleting the lock file could result in different\n // Yarn semantics. e.g. Yarn 2+ will error when `yarn install` is executed in\n // a subdirectory which is not part of a Yarn workspace. Yarn suggests to create\n // an empty lock file if a subdirectory should be treated as its own workspace.\n // https://github.com/yarnpkg/berry/blob/20612e82d26ead5928cc27bf482bb8d62dde87d3/packages/yarnpkg-core/sources/Project.ts#L284.\n try {\n await writeLocalFile(lockFileName, '');\n } catch (err) {\n // v8 ignore next -- TODO: add test #40625\n logger.debug(\n { err, lockFileName },\n 'Error clearing `yarn.lock` for lock file maintenance',\n );\n }\n }\n\n // Run the commands\n await exec(commands, execOptions);\n\n // Read the result\n lockFile = await readLocalFile(lockFileName, 'utf8');\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: 'yarn',\n },\n 'lock file error',\n );\n const stdouterr = String(err.stdout) + String(err.stderr);\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('ENOSPC: no space left on device') ||\n stdouterr.includes('Out of diskspace')\n ) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('The registry may be down.') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.yarnpkg.com') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.npmjs.org')\n ) {\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport function fuzzyMatchAdditionalYarnrcYml<\n T extends { npmRegistries?: Record<string, unknown> },\n>(additionalYarnRcYml: T, existingYarnrRcYml: T): T {\n const keys = new Map(\n Object.keys(coerceObject(existingYarnrRcYml.npmRegistries)).map((x) => [\n x.replace(regEx(/\\/$/), '').replace(regEx(/^https?:/), ''),\n x,\n ]),\n );\n\n return {\n ...additionalYarnRcYml,\n npmRegistries: Object.entries(\n coerceObject(additionalYarnRcYml.npmRegistries),\n )\n .map(([k, v]) => {\n const key = keys.get(k.replace(regEx(/\\/$/), '')) ?? k;\n return { [key]: v };\n })\n .reduce((acc, cur) => ({ ...acc, ...cur }), {}),\n };\n}\n"],"mappings":"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"}
@@ -6,6 +6,7 @@ import { ensureDir, getLocalFiles, getSiblingFileName, outputCacheFile, privateC
6
6
  import { exec } from "../../../util/exec/index.js";
7
7
  import { getFiles } from "../../../util/git/index.js";
8
8
  import { findGlobalJson, getConfiguredRegistries, getDefaultRegistries } from "./util.js";
9
+ import { resolveToolConstraint } from "../util.js";
9
10
  import { createNuGetConfigXml } from "./config-formatter.js";
10
11
  import { GLOBAL_JSON, getDependentPackageFiles } from "./package-tree.js";
11
12
  import { isNonEmptyString } from "@sindresorhus/is";
@@ -25,7 +26,7 @@ async function createCachedNuGetConfigFile(nugetCacheDir, packageFileName, updat
25
26
  async function runDotnetRestore(packageFileName, dependentPackageFileNames, config, updatedDeps) {
26
27
  const nugetCacheDir = upath.join(privateCacheDir(), "nuget");
27
28
  const nugetConfigFile = await createCachedNuGetConfigFile(nugetCacheDir, packageFileName, updatedDeps);
28
- const dotnetVersion = config.constraints?.dotnet ?? (await findGlobalJson(packageFileName))?.sdk?.version;
29
+ const dotnetVersion = await resolveToolConstraint(config, "dotnet", async () => (await findGlobalJson(packageFileName))?.sdk?.version);
29
30
  const execOptions = {
30
31
  docker: {},
31
32
  extraEnv: {
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/nuget/artifacts.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n ensureDir,\n getLocalFiles,\n getSiblingFileName,\n outputCacheFile,\n privateCacheDir,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getFiles } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { createNuGetConfigXml } from './config-formatter.ts';\nimport {\n DIRECTORY_BUILD_PROPS,\n GLOBAL_JSON,\n MSBUILD_CENTRAL_FILE,\n NUGET_CENTRAL_FILE,\n getDependentPackageFiles,\n} from './package-tree.ts';\nimport type { Registry } from './types.ts';\nimport {\n findGlobalJson,\n getConfiguredRegistries,\n getDefaultRegistries,\n} from './util.ts';\n\nasync function createCachedNuGetConfigFile(\n nugetCacheDir: string,\n packageFileName: string,\n updatedDeps: Upgrade[],\n): Promise<string> {\n const registries =\n (await getConfiguredRegistries(packageFileName)) ?? getDefaultRegistries();\n\n const updatedDepsRegistries: Registry[] = Array.from(\n new Set(\n updatedDeps\n .flatMap((dep) => coerceArray(dep.registryUrls))\n .filter(isNonEmptyString),\n ),\n (url) => ({ url }),\n );\n\n const combinedRegistries = [...registries, ...updatedDepsRegistries];\n\n const contents = createNuGetConfigXml(combinedRegistries);\n\n const cachedNugetConfigFile = upath.join(nugetCacheDir, `nuget.config`);\n await ensureDir(nugetCacheDir);\n await outputCacheFile(cachedNugetConfigFile, contents);\n\n return cachedNugetConfigFile;\n}\n\nasync function runDotnetRestore(\n packageFileName: string,\n dependentPackageFileNames: string[],\n config: UpdateArtifactsConfig,\n updatedDeps: Upgrade[],\n): Promise<void> {\n const nugetCacheDir = upath.join(privateCacheDir(), 'nuget');\n\n const nugetConfigFile = await createCachedNuGetConfigFile(\n nugetCacheDir,\n packageFileName,\n updatedDeps,\n );\n\n const dotnetVersion =\n config.constraints?.dotnet ??\n (await findGlobalJson(packageFileName))?.sdk?.version;\n const execOptions: ExecOptions = {\n docker: {},\n extraEnv: {\n NUGET_PACKAGES: upath.join(nugetCacheDir, 'packages'),\n MSBUILDDISABLENODEREUSE: '1',\n },\n toolConstraints: [{ toolName: 'dotnet', constraint: dotnetVersion }],\n };\n\n const cmds = dependentPackageFileNames.map(\n (fileName) =>\n `dotnet restore ${quote(\n fileName,\n )} --force-evaluate --configfile ${quote(nugetConfigFile)}`,\n );\n\n if (config.postUpdateOptions?.includes('dotnetWorkloadRestore')) {\n cmds.unshift(\n `dotnet workload restore --configfile ${quote(nugetConfigFile)}`,\n );\n }\n\n await exec(cmds, execOptions);\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n config,\n updatedDeps,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`nuget.updateArtifacts(${packageFileName})`);\n\n // https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions\n // https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions\n const isCentralManagement =\n packageFileName === NUGET_CENTRAL_FILE ||\n packageFileName === MSBUILD_CENTRAL_FILE ||\n packageFileName.endsWith(`/${NUGET_CENTRAL_FILE}`) ||\n packageFileName.endsWith(`/${MSBUILD_CENTRAL_FILE}`);\n\n const isGlobalJson = packageFileName === GLOBAL_JSON;\n\n const isDirectoryBuildProps =\n packageFileName === DIRECTORY_BUILD_PROPS ||\n packageFileName.endsWith(`/${DIRECTORY_BUILD_PROPS}`);\n\n if (\n !isCentralManagement &&\n !isGlobalJson &&\n !isDirectoryBuildProps &&\n !regEx(/(?:cs|vb|fs)proj$/i).test(packageFileName)\n ) {\n // This could be implemented in the future if necessary.\n // It's not that easy though because the questions which\n // project file to restore how to determine which lock files\n // have been changed in such cases.\n logger.debug(\n { packageFileName },\n 'Not updating lock file for non project files',\n );\n return null;\n }\n\n const deps = await getDependentPackageFiles(\n packageFileName,\n isCentralManagement || isDirectoryBuildProps,\n isGlobalJson,\n );\n const packageFiles = deps.filter((d) => d.isLeaf).map((d) => d.name);\n\n logger.trace(\n { packageFiles },\n `Found ${packageFiles.length} dependent package files`,\n );\n\n const lockFileNames = deps.map((f) =>\n getSiblingFileName(f.name, 'packages.lock.json'),\n );\n\n const existingLockFileContentMap = await getFiles(lockFileNames);\n\n const hasLockFileContent = Object.values(existingLockFileContentMap).some(\n (val) => !!val,\n );\n if (!hasLockFileContent) {\n logger.debug(\n { packageFileName },\n 'No lock file found for package or dependents',\n );\n return null;\n }\n\n try {\n if (updatedDeps.length === 0 && config.isLockFileMaintenance !== true) {\n logger.debug(\n `Not updating lock file because no deps changed and no lock file maintenance.`,\n );\n return null;\n }\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n await runDotnetRestore(packageFileName, packageFiles, config, updatedDeps);\n\n const newLockFileContentMap = await getLocalFiles(lockFileNames);\n\n const retArray: UpdateArtifactsResult[] = [];\n for (const lockFileName of lockFileNames) {\n if (\n existingLockFileContentMap[lockFileName] ===\n newLockFileContentMap[lockFileName]\n ) {\n logger.trace(`Lock file ${lockFileName} is unchanged`);\n } else if (newLockFileContentMap[lockFileName]) {\n retArray.push({\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockFileContentMap[lockFileName],\n },\n });\n }\n // TODO: else should we return an artifact error if new content is missing?\n }\n\n return retArray.length > 0 ? retArray : null;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to generate lock file');\n return [\n {\n artifactError: {\n fileName: lockFileNames.join(', '),\n // error is written to stdout\n stderr: err.stdout ?? err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/nuget/artifacts.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n ensureDir,\n getLocalFiles,\n getSiblingFileName,\n outputCacheFile,\n privateCacheDir,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getFiles } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { createNuGetConfigXml } from './config-formatter.ts';\nimport {\n DIRECTORY_BUILD_PROPS,\n GLOBAL_JSON,\n MSBUILD_CENTRAL_FILE,\n NUGET_CENTRAL_FILE,\n getDependentPackageFiles,\n} from './package-tree.ts';\nimport type { Registry } from './types.ts';\nimport {\n findGlobalJson,\n getConfiguredRegistries,\n getDefaultRegistries,\n} from './util.ts';\n\nasync function createCachedNuGetConfigFile(\n nugetCacheDir: string,\n packageFileName: string,\n updatedDeps: Upgrade[],\n): Promise<string> {\n const registries =\n (await getConfiguredRegistries(packageFileName)) ?? getDefaultRegistries();\n\n const updatedDepsRegistries: Registry[] = Array.from(\n new Set(\n updatedDeps\n .flatMap((dep) => coerceArray(dep.registryUrls))\n .filter(isNonEmptyString),\n ),\n (url) => ({ url }),\n );\n\n const combinedRegistries = [...registries, ...updatedDepsRegistries];\n\n const contents = createNuGetConfigXml(combinedRegistries);\n\n const cachedNugetConfigFile = upath.join(nugetCacheDir, `nuget.config`);\n await ensureDir(nugetCacheDir);\n await outputCacheFile(cachedNugetConfigFile, contents);\n\n return cachedNugetConfigFile;\n}\n\nasync function runDotnetRestore(\n packageFileName: string,\n dependentPackageFileNames: string[],\n config: UpdateArtifactsConfig,\n updatedDeps: Upgrade[],\n): Promise<void> {\n const nugetCacheDir = upath.join(privateCacheDir(), 'nuget');\n\n const nugetConfigFile = await createCachedNuGetConfigFile(\n nugetCacheDir,\n packageFileName,\n updatedDeps,\n );\n\n const dotnetVersion = await resolveToolConstraint(\n config,\n 'dotnet',\n async () => (await findGlobalJson(packageFileName))?.sdk?.version,\n );\n const execOptions: ExecOptions = {\n docker: {},\n extraEnv: {\n NUGET_PACKAGES: upath.join(nugetCacheDir, 'packages'),\n MSBUILDDISABLENODEREUSE: '1',\n },\n toolConstraints: [{ toolName: 'dotnet', constraint: dotnetVersion }],\n };\n\n const cmds = dependentPackageFileNames.map(\n (fileName) =>\n `dotnet restore ${quote(\n fileName,\n )} --force-evaluate --configfile ${quote(nugetConfigFile)}`,\n );\n\n if (config.postUpdateOptions?.includes('dotnetWorkloadRestore')) {\n cmds.unshift(\n `dotnet workload restore --configfile ${quote(nugetConfigFile)}`,\n );\n }\n\n await exec(cmds, execOptions);\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n config,\n updatedDeps,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`nuget.updateArtifacts(${packageFileName})`);\n\n // https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions\n // https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions\n const isCentralManagement =\n packageFileName === NUGET_CENTRAL_FILE ||\n packageFileName === MSBUILD_CENTRAL_FILE ||\n packageFileName.endsWith(`/${NUGET_CENTRAL_FILE}`) ||\n packageFileName.endsWith(`/${MSBUILD_CENTRAL_FILE}`);\n\n const isGlobalJson = packageFileName === GLOBAL_JSON;\n\n const isDirectoryBuildProps =\n packageFileName === DIRECTORY_BUILD_PROPS ||\n packageFileName.endsWith(`/${DIRECTORY_BUILD_PROPS}`);\n\n if (\n !isCentralManagement &&\n !isGlobalJson &&\n !isDirectoryBuildProps &&\n !regEx(/(?:cs|vb|fs)proj$/i).test(packageFileName)\n ) {\n // This could be implemented in the future if necessary.\n // It's not that easy though because the questions which\n // project file to restore how to determine which lock files\n // have been changed in such cases.\n logger.debug(\n { packageFileName },\n 'Not updating lock file for non project files',\n );\n return null;\n }\n\n const deps = await getDependentPackageFiles(\n packageFileName,\n isCentralManagement || isDirectoryBuildProps,\n isGlobalJson,\n );\n const packageFiles = deps.filter((d) => d.isLeaf).map((d) => d.name);\n\n logger.trace(\n { packageFiles },\n `Found ${packageFiles.length} dependent package files`,\n );\n\n const lockFileNames = deps.map((f) =>\n getSiblingFileName(f.name, 'packages.lock.json'),\n );\n\n const existingLockFileContentMap = await getFiles(lockFileNames);\n\n const hasLockFileContent = Object.values(existingLockFileContentMap).some(\n (val) => !!val,\n );\n if (!hasLockFileContent) {\n logger.debug(\n { packageFileName },\n 'No lock file found for package or dependents',\n );\n return null;\n }\n\n try {\n if (updatedDeps.length === 0 && config.isLockFileMaintenance !== true) {\n logger.debug(\n `Not updating lock file because no deps changed and no lock file maintenance.`,\n );\n return null;\n }\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n await runDotnetRestore(packageFileName, packageFiles, config, updatedDeps);\n\n const newLockFileContentMap = await getLocalFiles(lockFileNames);\n\n const retArray: UpdateArtifactsResult[] = [];\n for (const lockFileName of lockFileNames) {\n if (\n existingLockFileContentMap[lockFileName] ===\n newLockFileContentMap[lockFileName]\n ) {\n logger.trace(`Lock file ${lockFileName} is unchanged`);\n } else if (newLockFileContentMap[lockFileName]) {\n retArray.push({\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockFileContentMap[lockFileName],\n },\n });\n }\n // TODO: else should we return an artifact error if new content is missing?\n }\n\n return retArray.length > 0 ? retArray : null;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to generate lock file');\n return [\n {\n artifactError: {\n fileName: lockFileNames.join(', '),\n // error is written to stdout\n stderr: err.stdout ?? err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { logger } from "../../../../logger/index.js";
3
3
  import { getSiblingFileName, readLocalFile } from "../../../../util/fs/index.js";
4
4
  import { Result } from "../../../../util/result.js";
5
5
  import { PypiDatasource } from "../../../datasource/pypi/index.js";
6
+ import { resolveToolConstraint } from "../../util.js";
6
7
  import { withGitEnvironment } from "../../../../util/git/exec.js";
7
8
  import { BasePyProjectProcessor } from "./abstract.js";
8
9
  import { depTypes } from "../utils.js";
@@ -50,10 +51,10 @@ var PdmProcessor = class extends BasePyProjectProcessor {
50
51
  docker: {},
51
52
  toolConstraints: [{
52
53
  toolName: "python",
53
- constraint: config.constraints?.python ?? project.project?.["requires-python"]
54
+ constraint: await resolveToolConstraint(config, "python", () => project.project?.["requires-python"])
54
55
  }, {
55
56
  toolName: "pdm",
56
- constraint: config.constraints?.pdm
57
+ constraint: await resolveToolConstraint(config, "pdm")
57
58
  }]
58
59
  };
59
60
  const cmds = [];