renovate 44.237.2 → 44.238.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 (68) hide show
  1. package/dist/config/options/index.js +11 -1
  2. package/dist/config/options/index.js.map +1 -1
  3. package/dist/config/presets/internal/security.preset.js +14 -9
  4. package/dist/config/presets/internal/security.preset.js.map +1 -1
  5. package/dist/config/types.d.ts +1 -0
  6. package/dist/config/types.js.map +1 -1
  7. package/dist/global-config-option-defaults.generated.js +1 -1
  8. package/dist/global-config-option-defaults.generated.js.map +1 -1
  9. package/dist/modules/manager/cargo/artifacts.js +39 -10
  10. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  11. package/dist/modules/manager/cargo/extract.js +45 -28
  12. package/dist/modules/manager/cargo/extract.js.map +1 -1
  13. package/dist/modules/manager/cargo/index.js +10 -1
  14. package/dist/modules/manager/cargo/index.js.map +1 -1
  15. package/dist/modules/manager/cargo/locked-version.js +10 -4
  16. package/dist/modules/manager/cargo/locked-version.js.map +1 -1
  17. package/dist/modules/manager/cargo/minimum-release-age.js +216 -0
  18. package/dist/modules/manager/cargo/minimum-release-age.js.map +1 -0
  19. package/dist/modules/manager/cargo/schema.js +6 -1
  20. package/dist/modules/manager/cargo/schema.js.map +1 -1
  21. package/dist/modules/manager/cargo/utils.js +23 -1
  22. package/dist/modules/manager/cargo/utils.js.map +1 -1
  23. package/dist/modules/manager/fingerprint.generated.js +3 -3
  24. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  25. package/dist/modules/manager/npm/constants.js +3 -1
  26. package/dist/modules/manager/npm/constants.js.map +1 -1
  27. package/dist/modules/manager/npm/extract/index.js +1 -1
  28. package/dist/modules/manager/npm/extract/index.js.map +1 -1
  29. package/dist/modules/manager/npm/extract/npmrc.js +93 -0
  30. package/dist/modules/manager/npm/extract/npmrc.js.map +1 -0
  31. package/dist/modules/manager/npm/extract/pnpm-minimum-release-age.js +149 -0
  32. package/dist/modules/manager/npm/extract/pnpm-minimum-release-age.js.map +1 -0
  33. package/dist/modules/manager/npm/extract/pnpm.js +88 -2
  34. package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
  35. package/dist/modules/manager/npm/extract/post/index.js +7 -1
  36. package/dist/modules/manager/npm/extract/post/index.js.map +1 -1
  37. package/dist/modules/manager/npm/extract/utils.js +25 -1
  38. package/dist/modules/manager/npm/extract/utils.js.map +1 -1
  39. package/dist/modules/manager/npm/extract/yarn-minimum-release-age.js +181 -0
  40. package/dist/modules/manager/npm/extract/yarn-minimum-release-age.js.map +1 -0
  41. package/dist/modules/manager/npm/index.js +18 -4
  42. package/dist/modules/manager/npm/index.js.map +1 -1
  43. package/dist/modules/manager/npm/minimum-release-age.js +93 -0
  44. package/dist/modules/manager/npm/minimum-release-age.js.map +1 -0
  45. package/dist/modules/manager/npm/post-update/index.js +12 -3
  46. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  47. package/dist/modules/manager/npm/post-update/npm.js +89 -57
  48. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  49. package/dist/modules/manager/npm/post-update/pnpm.js +132 -90
  50. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  51. package/dist/modules/manager/npm/post-update/utils.js +7 -1
  52. package/dist/modules/manager/npm/post-update/utils.js.map +1 -1
  53. package/dist/modules/manager/npm/post-update/yarn.js +70 -3
  54. package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
  55. package/dist/modules/manager/npm/schema.js +21 -2
  56. package/dist/modules/manager/npm/schema.js.map +1 -1
  57. package/dist/modules/manager/types.d.ts +10 -3
  58. package/dist/modules/versioning/common.js +14 -2
  59. package/dist/modules/versioning/common.js.map +1 -1
  60. package/dist/modules/versioning/rust-release-channel/index.js +21 -0
  61. package/dist/modules/versioning/rust-release-channel/index.js.map +1 -1
  62. package/dist/util/minimum-release-age.js +20 -6
  63. package/dist/util/minimum-release-age.js.map +1 -1
  64. package/dist/util/schema-utils/index.js.map +1 -1
  65. package/dist/workers/repository/updates/flatten.js +1 -0
  66. package/dist/workers/repository/updates/flatten.js.map +1 -1
  67. package/package.json +3 -3
  68. package/renovate-schema.json +380 -2
@@ -1 +1 @@
1
- {"version":3,"file":"npm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/npm.ts"],"sourcesContent":["// TODO: types (#22198)\nimport {\n isNonEmptyString,\n isNullOrUndefined,\n isNumber,\n isString,\n} from '@sindresorhus/is';\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 { NpmrcCooldown, PackageLock } from '../schema.ts';\nimport type { NpmManagerData } from '../types.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 = NpmrcCooldown.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<NpmManagerData>> = {},\n upgrades: Upgrade<NpmManagerData>[] = [],\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(config, 'npm', async () => {\n let npmVersion = getPackageManagerVersion(\n 'npm',\n await lazyPkgJson.getValue(),\n );\n if (isNullOrUndefined(npmVersion)) {\n npmVersion = await getNpmConstraintFromPackageLock(\n lockFileDir,\n filename,\n );\n }\n return npmVersion;\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 const needsDedupeWithoutFlag =\n postUpdateOptions?.includes('npmDedupe') === true &&\n !supportsPreferDedupeFlag;\n if (needsDedupeWithoutFlag || skipInstalls === false) {\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(isString)\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 .filter(isString)\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 (filename === 'npm-shrinkwrap.json') {\n const lockExists = await localPathExists(\n upath.join(lockFileDir, 'package-lock.json'),\n );\n if (lockExists) {\n await renameLocalFile(\n upath.join(lockFileDir, 'package-lock.json'),\n upath.join(lockFileDir, 'npm-shrinkwrap.json'),\n );\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<NpmManagerData>[],\n): {\n lockRootUpdates: Upgrade<NpmManagerData>[];\n lockWorkspacesUpdates: Upgrade<NpmManagerData>[];\n workspaces: Set<string>;\n rootDeps: Set<string>;\n} {\n const lockRootUpdates: Upgrade<NpmManagerData>[] = []; // stores all upgrades which are present in root package.json\n const lockWorkspacesUpdates: Upgrade<NpmManagerData>[] = []; // 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.replace(regEx(/^\\.\\//), '');\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 {\n isNonEmptyString,\n isNullOrUndefined,\n isString,\n} from '@sindresorhus/is';\nimport { DateTime, Duration } 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 {\n calculatePackageManagerMinimumReleaseAgeMs,\n getMinimumReleaseAgeExemption,\n} from '../../../../util/minimum-release-age.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 { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { parseNpmrcCooldown } from '../extract/npmrc.ts';\nimport type { NpmrcCooldown } from '../extract/types.ts';\nimport { PackageLock } from '../schema.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { composeLockFile, parseLockFile } from '../utils.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\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\nfunction toHuman(durationMs: number): string {\n return Duration.fromMillis(durationMs).rescale().toHuman();\n}\n\ninterface BeforeFlag {\n flag: string;\n notice?: string;\n}\n\n/**\n * Whether the `before` date of the `.npmrc` is older than a minimum release age of `ageMs`, where `0` means none.\n */\nfunction isNpmrcBeforeOlder(\n npmrcDate: DateTime | undefined,\n ageMs: number,\n): npmrcDate is DateTime {\n if (!npmrcDate) {\n return false;\n }\n return !ageMs || npmrcDate < DateTime.now().minus(ageMs);\n}\n\n/**\n * Describes the minimum release age which npm checks with a lowered age of `ageMs` and the `before` date of the `.npmrc`.\n */\nfunction getCheckedMinimumReleaseAge(\n npmrcDate: DateTime | undefined,\n ageMs: number,\n): string {\n if (isNpmrcBeforeOlder(npmrcDate, ageMs)) {\n return `the \\`before\\` date ${npmrcDate.toISO()} of the \\`.npmrc\\``;\n }\n return ageMs\n ? `a minimum release age of ${toHuman(ageMs)}`\n : 'no minimum release age';\n}\n\n/**\n * Returns the `--before` flag for `minimumReleaseAgeMs` and the `.npmrc`, lowered to the smaller `minimumReleaseAge` of exempted updates in `upgrades`, and the notice for such a lowering.\n */\nfunction getBeforeFlag(\n minimumReleaseAgeMs: number,\n npmrcCooldown: NpmrcCooldown | null,\n upgrades: Upgrade<NpmManagerData>[],\n): BeforeFlag {\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 `Skipping --before flag because .npmrc already contains min-release-age=${npmrcCooldown.days}`,\n );\n return { flag: '' };\n }\n\n const exemption = getMinimumReleaseAgeExemption(\n upgrades,\n 'npm',\n NpmDatasource.id,\n minimumReleaseAgeMs,\n );\n const npmrcDate = npmrcCooldown?.date;\n let notice: string | undefined;\n let ageMs = minimumReleaseAgeMs;\n // npm applies an older `before` of the `.npmrc` anyway, so lowering would change nothing\n if (exemption && !isNpmrcBeforeOlder(npmrcDate, minimumReleaseAgeMs)) {\n ageMs = exemption.ageMs;\n const checked = getCheckedMinimumReleaseAge(npmrcDate, ageMs);\n logger.debug(\n `npm checks ${checked} instead of ${toHuman(minimumReleaseAgeMs)}, as the minimumReleaseAge of ${exemption.depNames.join(', ')} is smaller and their release is younger or has no timestamp`,\n );\n const packages = exemption.depNames.map((name) => `\\`${name}\\``).join(', ');\n notice = `npm checked ${checked} instead of ${toHuman(minimumReleaseAgeMs)} for this update, because the \\`minimumReleaseAge\\` of ${packages} is smaller. npm has no per-package exclude for \\`--before\\`.`;\n if (!ageMs) {\n return { flag: '', notice };\n }\n }\n\n let beforeDate = DateTime.now().minus(ageMs).toUTC();\n\n if (npmrcDate && npmrcDate < beforeDate) {\n logger.debug(\n {\n npmrcDate: npmrcDate.toISO(),\n beforeDate: beforeDate.toISO(),\n },\n 'Using stricter .npmrc cooldown date over minimumReleaseAge date',\n );\n beforeDate = npmrcDate;\n }\n\n const beforeISO = beforeDate.toISO();\n logger.debug(`Setting npm --before=${beforeISO} based on minimumReleaseAge`);\n return { flag: ` --before=${beforeISO}`, notice };\n}\n\n/**\n * Returns the minimum release age for `--before`, or `null` for none: `syncAgeMs` with `minimumReleaseAgePackageManagerSync`, else the `minimumReleaseAge` of `config`.\n */\nfunction getBeforeAgeMs(\n config: Partial<PostUpdateConfig>,\n syncAgeMs: number | null,\n): number | null {\n if (syncAgeMs !== null) {\n return syncAgeMs || null;\n }\n if (!config.minimumReleaseAge) {\n return null;\n }\n const ms = toMs(config.minimumReleaseAge);\n if (ms === null) {\n logger.debug(\n `Invalid minimumReleaseAge ${config.minimumReleaseAge}, skipping --before for npm install`,\n );\n }\n return ms;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n filename: string,\n config: Partial<PostUpdateConfig<NpmManagerData>> = {},\n upgrades: Upgrade<NpmManagerData>[] = [],\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 let minimumReleaseAgeNotice: string | undefined;\n try {\n const lazyPkgJson = lazyLoadPackageJson(lockFileDir);\n const npmToolConstraint: ToolConstraint = {\n toolName: 'npm',\n constraint:\n (await resolveToolConstraint(config, 'npm', async () => {\n let npmVersion = getPackageManagerVersion(\n 'npm',\n await lazyPkgJson.getValue(),\n );\n if (isNullOrUndefined(npmVersion)) {\n npmVersion = await getNpmConstraintFromPackageLock(\n lockFileDir,\n filename,\n );\n }\n return npmVersion;\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 const needsDedupeWithoutFlag =\n postUpdateOptions?.includes('npmDedupe') === true &&\n !supportsPreferDedupeFlag;\n if (needsDedupeWithoutFlag || skipInstalls === false) {\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 const minimumReleaseAgeOptions = {\n config,\n manager: 'npm',\n packageFile: upath.join(lockFileDir, 'package.json'),\n upgrades,\n };\n const syncAgeMs = calculatePackageManagerMinimumReleaseAgeMs(\n minimumReleaseAgeOptions,\n );\n const isSyncEnabled = syncAgeMs !== null;\n const beforeAgeMs = getBeforeAgeMs(config, syncAgeMs);\n // without minimumReleaseAgePackageManagerSync, the .npmrc is parsed\n // leniently and no update lowers --before, as before the flag existed\n const before =\n beforeAgeMs === null\n ? { flag: '' }\n : getBeforeFlag(\n beforeAgeMs,\n parseNpmrcCooldown(npmrcContent, !isSyncEnabled),\n isSyncEnabled ? upgrades : [],\n );\n const beforeFlag = before.flag;\n minimumReleaseAgeNotice = before.notice;\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(isString)\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 .filter(isString)\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 // With minimumReleaseAgePackageManagerSync, lock file maintenance does not\n // retry, as it relies on --before to enforce the minimum release age.\n const skipsBeforeRetry =\n isSyncEnabled &&\n upgrades.some((upgrade) => upgrade.isLockFileMaintenance);\n await exec(commands, execOptions).catch(async (err) => {\n if (\n beforeFlag &&\n !skipsBeforeRetry &&\n err.stderr?.includes('with a date before')\n ) {\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 (filename === 'npm-shrinkwrap.json') {\n const lockExists = await localPathExists(\n upath.join(lockFileDir, 'package-lock.json'),\n );\n if (lockExists) {\n await renameLocalFile(\n upath.join(lockFileDir, 'package-lock.json'),\n upath.join(lockFileDir, 'npm-shrinkwrap.json'),\n );\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 {\n error: !lockFile,\n lockFile,\n beforeFallback,\n minimumReleaseAgeNotice,\n };\n}\n\nexport function divideWorkspaceAndRootDeps(\n lockFileDir: string,\n lockUpdates: Upgrade<NpmManagerData>[],\n): {\n lockRootUpdates: Upgrade<NpmManagerData>[];\n lockWorkspacesUpdates: Upgrade<NpmManagerData>[];\n workspaces: Set<string>;\n rootDeps: Set<string>;\n} {\n const lockRootUpdates: Upgrade<NpmManagerData>[] = []; // stores all upgrades which are present in root package.json\n const lockWorkspacesUpdates: Upgrade<NpmManagerData>[] = []; // 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.replace(regEx(/^\\.\\//), '');\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,15 +1,26 @@
1
1
  import { GlobalConfig } from "../../../../config/global.js";
2
2
  import "../../../../constants/error-messages.js";
3
3
  import { logger } from "../../../../logger/index.js";
4
+ import { coerceArray } from "../../../../util/array.js";
4
5
  import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
5
6
  import { deleteLocalFile, ensureCacheDir, getSiblingFileName, localPathExists, readLocalFile } from "../../../../util/fs/index.js";
7
+ import { calculatePackageManagerMinimumReleaseAgeMs, getMinimumReleaseAgeExemption, isReleaseOldEnough } from "../../../../util/minimum-release-age.js";
8
+ import { coerceNumber } from "../../../../util/number.js";
9
+ import { regEx } from "../../../../util/regex.js";
6
10
  import { uniqueStrings } from "../../../../util/string.js";
7
11
  import { parseSingleYaml } from "../../../../util/yaml.js";
8
- import { resolveToolConstraint } from "../../util.js";
9
- import { PNPM_CACHE_DIR, PNPM_STORE_DIR } from "../constants.js";
12
+ import { NpmDatasource } from "../../../datasource/npm/index.js";
13
+ import { intersectsWith } from "../../../versioning/common.js";
14
+ import { api } from "../../../versioning/npm/index.js";
15
+ import { artifactErrorMessageFromExecError } from "../../util.js";
16
+ import { MINUTE_MS, PNPM_CACHE_DIR, PNPM_STORE_DIR } from "../constants.js";
17
+ import { parseNpmrcPnpmMinimumReleaseAge } from "../extract/npmrc.js";
18
+ import { resolvePnpmConstraint } from "../extract/pnpm.js";
19
+ import { getPnpmMinimumReleaseAgeMinutes, getPnpmWorkspaceMinimumReleaseAge, isPnpmMinimumReleaseAgeExcluded, parsePnpmMinimumReleaseAgeExclude } from "../extract/pnpm-minimum-release-age.js";
20
+ import "../minimum-release-age.js";
10
21
  import { getNodeToolConstraint } from "./node-version.js";
11
- import { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
12
- import { isNullOrUndefined, isNumber, isNumericString } from "@sindresorhus/is";
22
+ import { getInstalledPackageName, getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
23
+ import { isNonEmptyString, isNullOrUndefined } from "@sindresorhus/is";
13
24
  import { quote } from "shlex";
14
25
  import upath from "upath";
15
26
  // lib/modules/manager/npm/post-update/pnpm.ts
@@ -17,19 +28,97 @@ function getPnpmConstraintFromUpgrades(upgrades) {
17
28
  for (const upgrade of upgrades) if (upgrade.depName === "pnpm" && upgrade.newVersion) return upgrade.newVersion;
18
29
  return null;
19
30
  }
20
- async function generateLockFile(lockFileDir, env, config, upgrades = []) {
31
+ const pnpmExactVersionExcludeRange = ">=10.19.0";
32
+ /**
33
+ * Whether Renovate may install a pnpm version which supports exact versions in `minimumReleaseAgeExclude`, where an unknown or invalid constraint counts as the latest pnpm.
34
+ */
35
+ function supportsExactVersionExclude(pnpmConstraint) {
36
+ return !(isNonEmptyString(pnpmConstraint) && api.isValid(pnpmConstraint)) || intersectsWith(api, pnpmConstraint, pnpmExactVersionExcludeRange);
37
+ }
38
+ /**
39
+ * Returns the `minimumReleaseAgeExclude` entries of the `pnpm-workspace.yaml`, followed by the updated versions of npm packages whose release is at least as old as the minimum release age of `pnpmMinutes` which pnpm configures itself, with a single entry repeated, or none without such versions.
40
+ */
41
+ function getMinimumReleaseAgeExcludes(upgrades, workspaceExclude, exclude, pnpmMinutes) {
42
+ const updated = [];
43
+ for (const upgrade of upgrades) {
44
+ const packageName = getInstalledPackageName(upgrade);
45
+ if (upgrade.datasource === NpmDatasource.id && packageName && upgrade.newVersion && !isPnpmMinimumReleaseAgeExcluded(exclude, packageName, upgrade.newVersion) && isReleaseOldEnough(upgrade, pnpmMinutes * 6e4)) updated.push(`${packageName}@${upgrade.newVersion}`);
46
+ }
47
+ if (!updated.length) return [];
48
+ const entries = [...coerceArray(workspaceExclude), ...updated].filter(uniqueStrings);
49
+ return entries.length === 1 ? [entries[0], entries[0]] : entries;
50
+ }
51
+ /**
52
+ * Whether `minimumReleaseAgeExclude` does not exclude the version which Renovate proposes for `upgrade`.
53
+ */
54
+ function isNotExcludedByPnpm(upgrade, exclude) {
55
+ const packageName = getInstalledPackageName(upgrade);
56
+ return !(packageName && isPnpmMinimumReleaseAgeExcluded(exclude, packageName, upgrade.newVersion));
57
+ }
58
+ /**
59
+ * Returns the `--config.minimum-release-age` flag in minutes for the larger of `minimumReleaseAgeMs` and the pnpm value, with `--config.minimum-release-age-exclude` flags for the updated versions if pnpm supports exact versions there, or else lowered to the smaller own minimum release age of exempted updates, but not below the pnpm value, with a notice.
60
+ */
61
+ function getMinimumReleaseAgeArgs(minimumReleaseAgeMs, upgrades, npmrcContent, pnpmConstraint, workspace) {
62
+ if (!minimumReleaseAgeMs) return null;
63
+ const pnpmMinutes = getPnpmMinimumReleaseAgeMinutes(workspace, parseNpmrcPnpmMinimumReleaseAge(npmrcContent), pnpmConstraint, true);
64
+ const configMinutes = pnpmMinutes ?? 0;
65
+ const minutes = Math.max(Math.ceil(minimumReleaseAgeMs / MINUTE_MS), configMinutes);
66
+ logger.debug(`Passing a minimum release age of ${minutes} minutes to pnpm, for a minimumReleaseAge of ${minimumReleaseAgeMs} ms and a pnpm minimumReleaseAge of ${pnpmMinutes ?? "none"}`);
67
+ const result = {
68
+ args: `--config.minimum-release-age=${minutes}`,
69
+ minutes
70
+ };
71
+ if (upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) return result;
72
+ const exclude = parsePnpmMinimumReleaseAgeExclude(workspace.minimumReleaseAgeExclude);
73
+ if (supportsExactVersionExclude(pnpmConstraint)) {
74
+ for (const entry of getMinimumReleaseAgeExcludes(upgrades, workspace.minimumReleaseAgeExclude, exclude, configMinutes)) result.args += ` ${quote(`--config.minimum-release-age-exclude=${entry}`)}`;
75
+ return result;
76
+ }
77
+ if (!intersectsWith(api, pnpmConstraint, ">=10.16.0")) return result;
78
+ const exemption = getMinimumReleaseAgeExemption(upgrades.filter((upgrade) => isNotExcludedByPnpm(upgrade, exclude)), "npm", NpmDatasource.id, minutes * MINUTE_MS);
79
+ const loweredMinutes = Math.max(Math.floor(coerceNumber(exemption?.ageMs) / MINUTE_MS), configMinutes);
80
+ if (!exemption || loweredMinutes >= minutes) return result;
81
+ logger.debug(`Lowering the pnpm minimum release age from ${minutes} to ${loweredMinutes} minutes, as the minimumReleaseAge of ${exemption.depNames.join(", ")} is smaller and their release is younger or has no timestamp`);
82
+ const packages = exemption.depNames.map((name) => `\`${name}\``).join(", ");
83
+ return {
84
+ args: `--config.minimum-release-age=${loweredMinutes}`,
85
+ minutes: loweredMinutes,
86
+ notice: `pnpm checked a minimum release age of ${loweredMinutes} minutes instead of ${minutes} for this update, because the \`minimumReleaseAge\` of ${packages} is smaller. pnpm supports exact versions in \`minimumReleaseAgeExclude\` only since v10.19.0.`
87
+ };
88
+ }
89
+ const immatureVersionRegex = regEx(/Version (?<version>\S+) \(released [^)]*\) of (?<name>\S+) does not meet the minimumReleaseAge constraint/g);
90
+ const immatureListRegex = regEx(/not meet the minimumReleaseAge constraint:\r?\n(?<list>(?:[ \t]+\S+@\S+.*(?:\r?\n|$))+)/g);
91
+ const immatureListEntryRegex = regEx(/^[ \t]+(?<pkg>\S+@\S+)/gm);
92
+ const noMatureVersionRegex = regEx(/No matching version found for (?<pkg>\S+) published by /g);
93
+ /**
94
+ * The packages which pnpm reports with `ERR_PNPM_NO_MATURE_MATCHING_VERSION`, as `name@version` or `name@range`.
95
+ */
96
+ function getImmaturePackages(output) {
97
+ if (!output.includes("ERR_PNPM_NO_MATURE_MATCHING_VERSION")) return [];
98
+ const packages = [];
99
+ for (const match of output.matchAll(immatureVersionRegex)) packages.push(`${match.groups.name}@${match.groups.version}`);
100
+ for (const match of output.matchAll(immatureListRegex)) for (const entry of match.groups.list.matchAll(immatureListEntryRegex)) packages.push(entry.groups.pkg);
101
+ for (const match of output.matchAll(noMatureVersionRegex)) packages.push(match.groups.pkg);
102
+ return packages.filter(uniqueStrings);
103
+ }
104
+ async function generateLockFile(lockFileDir, env, config, upgrades = [], npmrcContent = null) {
21
105
  const lockFileName = upath.join(lockFileDir, "pnpm-lock.yaml");
22
106
  logger.debug(`Spawning pnpm install to create ${lockFileName}`);
23
107
  let lockFile = null;
24
108
  const commands = [];
109
+ let minimumReleaseAgeNotice;
110
+ let minimumReleaseAgeMinutes;
111
+ const syncAgeMs = calculatePackageManagerMinimumReleaseAgeMs({
112
+ config,
113
+ manager: "npm",
114
+ packageFile: upath.join(lockFileDir, "package.json"),
115
+ upgrades
116
+ });
117
+ const isSyncEnabled = syncAgeMs !== null;
25
118
  try {
26
119
  const lazyPgkJson = lazyLoadPackageJson(lockFileDir);
27
120
  let pnpmConstraint = getPnpmConstraintFromUpgrades(upgrades);
28
- if (isNullOrUndefined(pnpmConstraint)) pnpmConstraint = await resolveToolConstraint(config, "pnpm", async () => {
29
- let pnpmVersion = getPackageManagerVersion("pnpm", await lazyPgkJson.getValue());
30
- if (isNullOrUndefined(pnpmVersion)) pnpmVersion = await getConstraintFromLockFile(lockFileName);
31
- return pnpmVersion;
32
- });
121
+ if (isNullOrUndefined(pnpmConstraint)) pnpmConstraint = await resolvePnpmConstraint(config, lockFileName, async () => getPackageManagerVersion("pnpm", await lazyPgkJson.getValue()));
33
122
  const pnpmToolConstraint = {
34
123
  toolName: "pnpm",
35
124
  constraint: pnpmConstraint
@@ -59,8 +148,9 @@ async function generateLockFile(lockFileDir, env, config, upgrades = []) {
59
148
  }
60
149
  const pnpmWorkspaceFilePath = getSiblingFileName(lockFileName, "pnpm-workspace.yaml");
61
150
  let args = "--lockfile-only";
151
+ let pnpmWorkspace = null;
62
152
  if (await localPathExists(pnpmWorkspaceFilePath)) {
63
- const pnpmWorkspace = parseSingleYaml(await readLocalFile(pnpmWorkspaceFilePath, "utf8"));
153
+ pnpmWorkspace = parseSingleYaml(await readLocalFile(pnpmWorkspaceFilePath, "utf8"));
64
154
  if (pnpmWorkspace?.packages?.length) {
65
155
  logger.debug(`Found pnpm workspace with ${pnpmWorkspace.packages.length} package definitions`);
66
156
  args += " --recursive";
@@ -70,6 +160,12 @@ async function generateLockFile(lockFileDir, env, config, upgrades = []) {
70
160
  args += " --ignore-scripts";
71
161
  args += " --ignore-pnpmfile";
72
162
  } else if (config.ignoreScripts) args += " --ignore-scripts";
163
+ const minimumReleaseAgeArgs = isSyncEnabled ? getMinimumReleaseAgeArgs(syncAgeMs, upgrades, npmrcContent, pnpmToolConstraint.constraint, getPnpmWorkspaceMinimumReleaseAge(pnpmWorkspace)) : null;
164
+ if (minimumReleaseAgeArgs) {
165
+ args += ` ${minimumReleaseAgeArgs.args}`;
166
+ minimumReleaseAgeMinutes = minimumReleaseAgeArgs.minutes;
167
+ minimumReleaseAgeNotice = minimumReleaseAgeArgs.notice;
168
+ }
73
169
  logger.trace({ args }, "pnpm command options");
74
170
  const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);
75
171
  if (lockUpdates.length !== upgrades.length) commands.push(`pnpm install ${args} --no-frozen-lockfile`);
@@ -78,7 +174,7 @@ async function generateLockFile(lockFileDir, env, config, upgrades = []) {
78
174
  commands.push(`pnpm update --no-save ${lockUpdates.map((update) => `${update.packageName}@${update.newVersion}`).filter(uniqueStrings).map(quote).join(" ")} ${args}`);
79
175
  }
80
176
  if (config.postUpdateOptions?.includes("pnpmDedupe")) commands.push(`pnpm dedupe ${args.replace(" --recursive", "")}`);
81
- if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {
177
+ if (upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {
82
178
  logger.debug(`Removing ${lockFileName} first due to lock file maintenance upgrade`);
83
179
  try {
84
180
  await deleteLocalFile(lockFileName);
@@ -101,89 +197,35 @@ async function generateLockFile(lockFileDir, env, config, upgrades = []) {
101
197
  stderr: err.stderr,
102
198
  type: "pnpm"
103
199
  }, "lock file error");
104
- return {
200
+ const output = `${err.stdout ?? ""}\n${err.stderr ?? ""}`;
201
+ const immaturePackages = isSyncEnabled ? getImmaturePackages(output) : [];
202
+ if (immaturePackages.length) return withNotice({
203
+ error: true,
204
+ stderr: `pnpm found no version old enough for the minimum release age: ${immaturePackages.map((pkg) => `\`${pkg}\``).join(", ")}\n\n${artifactErrorMessageFromExecError(err, "")}`,
205
+ stdout: err.stdout
206
+ }, minimumReleaseAgeNotice);
207
+ if (minimumReleaseAgeMinutes && output.includes("ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION")) return withNotice({
208
+ error: true,
209
+ stderr: `${getViolationHint(minimumReleaseAgeMinutes)}\n\n${artifactErrorMessageFromExecError(err, "")}`,
210
+ stdout: err.stdout
211
+ }, minimumReleaseAgeNotice);
212
+ return withNotice({
105
213
  error: true,
106
214
  stderr: err.stderr,
107
215
  stdout: err.stdout
108
- };
216
+ }, minimumReleaseAgeNotice);
109
217
  }
110
- return { lockFile };
218
+ return withNotice({ lockFile }, minimumReleaseAgeNotice);
111
219
  }
112
- async function getConstraintFromLockFile(lockFileName) {
113
- let constraint = null;
114
- try {
115
- const lockfileContent = await readLocalFile(lockFileName, "utf8");
116
- if (!lockfileContent) {
117
- logger.trace(`Empty pnpm lock file: ${lockFileName}`);
118
- return null;
119
- }
120
- const pnpmLock = parseSingleYaml(lockfileContent);
121
- if (!isNumber(pnpmLock?.lockfileVersion) && !isNumericString(pnpmLock?.lockfileVersion)) {
122
- logger.trace(`Invalid pnpm lockfile version: ${lockFileName}`);
123
- return null;
124
- }
125
- const { lowerConstraint, upperConstraint } = lockToPnpmVersionMapping.find((m) => m.lockfileVersion === pnpmLock.lockfileVersion) ?? {
126
- lockfileVersion: 5,
127
- lowerConstraint: ">=3",
128
- upperConstraint: "<3.5.0"
129
- };
130
- constraint = lowerConstraint;
131
- if (upperConstraint) constraint += ` ${upperConstraint}`;
132
- } catch (err) {
133
- logger.warn({ err }, "Error getting pnpm constraints from lock file");
134
- }
135
- return constraint;
220
+ function getViolationHint(minutes) {
221
+ return `The \`pnpm-lock.yaml\` contains packages younger than the minimum release age of ${minutes} minutes which Renovate passes to pnpm. Raise \`minimumReleaseAge\` in the \`pnpm-workspace.yaml\` to ${minutes}, or set \`trustLockfile: true\` there (pnpm v11.3.0 or later) to skip this check.`;
136
222
  }
137
- /**
138
- * pnpm lockfiles have corresponding version numbers called "lockfileVersion"
139
- * each lockfileVersion can only be generated by a certain pnpm version range
140
- * eg. lockfileVersion: 5.4 can only be generated by pnpm version >=7 && <8
141
- * official list can be found here : https://github.com/pnpm/spec/tree/master/lockfile
142
- * we use the mapping present below to find the compatible pnpm version range for a given lockfileVersion
143
- *
144
- * the various terms used in the mapping are explained below:
145
- * lowerConstraint : lowest pnpm version that can generate the lockfileVersion
146
- * upperConstraint : highest pnpm version that can generate the lockfileVersion
147
- * lowerBound : highest pnpm version that is less than the lowerConstraint
148
- * upperBound : lowest pnpm version that is greater than the upperConstraint
149
- *
150
- * To handle future lockfileVersions, we need to:
151
- * 1. add a upperBound and upperConstraint to the current latest lockfileVersion
152
- * 2. add an object for the new lockfileVersion with lowerBound and lowerConstraint
153
- *
154
- * lockfileVersion from v6 on are strings
155
- */
156
- const lockToPnpmVersionMapping = [
157
- {
158
- lockfileVersion: "9.0",
159
- lowerConstraint: ">=9"
160
- },
161
- {
162
- lockfileVersion: "6.0",
163
- lowerConstraint: ">=7.24.2",
164
- upperConstraint: "<9"
165
- },
166
- {
167
- lockfileVersion: 5.4,
168
- lowerConstraint: ">=7",
169
- upperConstraint: "<8"
170
- },
171
- {
172
- lockfileVersion: 5.3,
173
- lowerConstraint: ">=6",
174
- upperConstraint: "<7"
175
- },
176
- {
177
- lockfileVersion: 5.2,
178
- lowerConstraint: ">=5.10.0",
179
- upperConstraint: "<6"
180
- },
181
- {
182
- lockfileVersion: 5.1,
183
- lowerConstraint: ">=3.5.0",
184
- upperConstraint: "<5.9.3"
185
- }
186
- ];
187
- export { generateLockFile, getConstraintFromLockFile };
223
+ function withNotice(result, minimumReleaseAgeNotice) {
224
+ return minimumReleaseAgeNotice ? {
225
+ ...result,
226
+ minimumReleaseAgeNotice
227
+ } : result;
228
+ }
229
+ export { generateLockFile, getImmaturePackages };
188
230
 
189
231
  //# sourceMappingURL=pnpm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/pnpm.ts"],"sourcesContent":["import { isNullOrUndefined, 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 // if pnpm is being upgraded, it comes first\n let pnpmConstraint: string | null | undefined =\n getPnpmConstraintFromUpgrades(upgrades);\n if (isNullOrUndefined(pnpmConstraint)) {\n pnpmConstraint = await resolveToolConstraint(config, 'pnpm', async () => {\n // look in package.json > packageManager or engines\n let pnpmVersion = getPackageManagerVersion(\n 'pnpm',\n await lazyPgkJson.getValue(),\n );\n // use lockfileVersion to find pnpm version range\n if (isNullOrUndefined(pnpmVersion)) {\n pnpmVersion = await getConstraintFromLockFile(lockFileName);\n }\n return pnpmVersion;\n });\n }\n const pnpmToolConstraint: ToolConstraint = {\n toolName: 'pnpm',\n constraint: pnpmConstraint,\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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"}
1
+ {"version":3,"file":"pnpm.js","names":["npmVersioning"],"sources":["../../../../../lib/modules/manager/npm/post-update/pnpm.ts"],"sourcesContent":["import { isNonEmptyString, isNullOrUndefined } 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 { coerceArray } from '../../../../util/array.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 {\n calculatePackageManagerMinimumReleaseAgeMs,\n getMinimumReleaseAgeExemption,\n isReleaseOldEnough,\n} from '../../../../util/minimum-release-age.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { intersectsWith } from '../../../versioning/common.ts';\nimport { api as npmVersioning } from '../../../versioning/npm/index.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { artifactErrorMessageFromExecError } from '../../util.ts';\nimport { MINUTE_MS, PNPM_CACHE_DIR, PNPM_STORE_DIR } from '../constants.ts';\nimport { parseNpmrcPnpmMinimumReleaseAge } from '../extract/npmrc.ts';\nimport { resolvePnpmConstraint } from '../extract/pnpm.ts';\nimport {\n getPnpmMinimumReleaseAgeMinutes,\n getPnpmWorkspaceMinimumReleaseAge,\n isPnpmMinimumReleaseAgeExcluded,\n parsePnpmMinimumReleaseAgeExclude,\n} from '../extract/pnpm-minimum-release-age.ts';\nimport type {\n PnpmMinimumReleaseAgeExclude,\n PnpmWorkspaceFile,\n} from '../extract/types.ts';\nimport { minimumReleaseAgePnpmRange } from '../minimum-release-age.ts';\nimport type { PnpmWorkspaceMinimumReleaseAge } from '../schema.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult } from './types.ts';\nimport {\n getInstalledPackageName,\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\n// pnpm supports exact versions in `minimumReleaseAgeExclude` since v10.19.0\n// https://github.com/pnpm/pnpm/releases/tag/v10.19.0\nconst pnpmExactVersionExcludeRange = '>=10.19.0';\n\ninterface MinimumReleaseAgeArgs {\n args: string;\n minutes: number;\n notice?: string;\n}\n\n/**\n * Whether Renovate may install a pnpm version which supports exact versions in `minimumReleaseAgeExclude`, where an unknown or invalid constraint counts as the latest pnpm.\n */\nfunction supportsExactVersionExclude(\n pnpmConstraint: string | null | undefined,\n): boolean {\n const isKnownVersion =\n isNonEmptyString(pnpmConstraint) && npmVersioning.isValid(pnpmConstraint);\n return (\n !isKnownVersion ||\n intersectsWith(npmVersioning, pnpmConstraint, pnpmExactVersionExcludeRange)\n );\n}\n\n/**\n * Returns the `minimumReleaseAgeExclude` entries of the `pnpm-workspace.yaml`, followed by the updated versions of npm packages whose release is at least as old as the minimum release age of `pnpmMinutes` which pnpm configures itself, with a single entry repeated, or none without such versions.\n */\nfunction getMinimumReleaseAgeExcludes(\n upgrades: Upgrade[],\n workspaceExclude: string[] | undefined,\n exclude: PnpmMinimumReleaseAgeExclude,\n pnpmMinutes: number,\n): string[] {\n const updated: string[] = [];\n for (const upgrade of upgrades) {\n const packageName = getInstalledPackageName(upgrade);\n if (\n upgrade.datasource === NpmDatasource.id &&\n packageName &&\n upgrade.newVersion &&\n !isPnpmMinimumReleaseAgeExcluded(\n exclude,\n packageName,\n upgrade.newVersion,\n ) &&\n isReleaseOldEnough(upgrade, pnpmMinutes * MINUTE_MS)\n ) {\n updated.push(`${packageName}@${upgrade.newVersion}`);\n }\n }\n if (!updated.length) {\n return [];\n }\n const entries = [...coerceArray(workspaceExclude), ...updated].filter(\n uniqueStrings,\n );\n return entries.length === 1 ? [entries[0], entries[0]] : entries;\n}\n\n/**\n * Whether `minimumReleaseAgeExclude` does not exclude the version which Renovate proposes for `upgrade`.\n */\nfunction isNotExcludedByPnpm(\n upgrade: Upgrade,\n exclude: PnpmMinimumReleaseAgeExclude,\n): boolean {\n const packageName = getInstalledPackageName(upgrade);\n return !(\n packageName &&\n isPnpmMinimumReleaseAgeExcluded(exclude, packageName, upgrade.newVersion)\n );\n}\n\n/**\n * Returns the `--config.minimum-release-age` flag in minutes for the larger of `minimumReleaseAgeMs` and the pnpm value, with `--config.minimum-release-age-exclude` flags for the updated versions if pnpm supports exact versions there, or else lowered to the smaller own minimum release age of exempted updates, but not below the pnpm value, with a notice.\n */\nfunction getMinimumReleaseAgeArgs(\n minimumReleaseAgeMs: number,\n upgrades: Upgrade[],\n npmrcContent: string | null,\n pnpmConstraint: string | null | undefined,\n workspace: PnpmWorkspaceMinimumReleaseAge,\n): MinimumReleaseAgeArgs | null {\n // the pnpm value is added below, as it depends on the pnpm version\n if (!minimumReleaseAgeMs) {\n return null;\n }\n const pnpmMinutes = getPnpmMinimumReleaseAgeMinutes(\n workspace,\n parseNpmrcPnpmMinimumReleaseAge(npmrcContent),\n pnpmConstraint,\n true,\n );\n const configMinutes = pnpmMinutes ?? 0;\n const minutes = Math.max(\n Math.ceil(minimumReleaseAgeMs / MINUTE_MS),\n configMinutes,\n );\n logger.debug(\n `Passing a minimum release age of ${minutes} minutes to pnpm, for a minimumReleaseAge of ${minimumReleaseAgeMs} ms and a pnpm minimumReleaseAge of ${pnpmMinutes ?? 'none'}`,\n );\n const result: MinimumReleaseAgeArgs = {\n args: `--config.minimum-release-age=${minutes}`,\n minutes,\n };\n\n // lock file maintenance has no own updates which pnpm may reject\n if (upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {\n return result;\n }\n const exclude = parsePnpmMinimumReleaseAgeExclude(\n workspace.minimumReleaseAgeExclude,\n );\n if (supportsExactVersionExclude(pnpmConstraint)) {\n for (const entry of getMinimumReleaseAgeExcludes(\n upgrades,\n workspace.minimumReleaseAgeExclude,\n exclude,\n configMinutes,\n )) {\n result.args += ` ${quote(`--config.minimum-release-age-exclude=${entry}`)}`;\n }\n return result;\n }\n // pnpm ignores the minimum release age before v10.16.0\n if (\n !intersectsWith(npmVersioning, pnpmConstraint, minimumReleaseAgePnpmRange)\n ) {\n return result;\n }\n const exemption = getMinimumReleaseAgeExemption(\n upgrades.filter((upgrade) => isNotExcludedByPnpm(upgrade, exclude)),\n 'npm',\n NpmDatasource.id,\n minutes * MINUTE_MS,\n );\n // rounds down, so that pnpm accepts the releases of the exempted updates, but never below the pnpm value\n const loweredMinutes = Math.max(\n Math.floor(coerceNumber(exemption?.ageMs) / MINUTE_MS),\n configMinutes,\n );\n if (!exemption || loweredMinutes >= minutes) {\n return result;\n }\n logger.debug(\n `Lowering the pnpm minimum release age from ${minutes} to ${loweredMinutes} minutes, as the minimumReleaseAge of ${exemption.depNames.join(', ')} is smaller and their release is younger or has no timestamp`,\n );\n const packages = exemption.depNames.map((name) => `\\`${name}\\``).join(', ');\n return {\n args: `--config.minimum-release-age=${loweredMinutes}`,\n minutes: loweredMinutes,\n notice: `pnpm checked a minimum release age of ${loweredMinutes} minutes instead of ${minutes} for this update, because the \\`minimumReleaseAge\\` of ${packages} is smaller. pnpm supports exact versions in \\`minimumReleaseAgeExclude\\` only since v10.19.0.`,\n };\n}\n\nconst immatureVersionRegex = regEx(\n /Version (?<version>\\S+) \\(released [^)]*\\) of (?<name>\\S+) does not meet the minimumReleaseAge constraint/g,\n);\nconst immatureListRegex = regEx(\n /not meet the minimumReleaseAge constraint:\\r?\\n(?<list>(?:[ \\t]+\\S+@\\S+.*(?:\\r?\\n|$))+)/g,\n);\nconst immatureListEntryRegex = regEx(/^[ \\t]+(?<pkg>\\S+@\\S+)/gm);\nconst noMatureVersionRegex = regEx(\n /No matching version found for (?<pkg>\\S+) published by /g,\n);\n\n/**\n * The packages which pnpm reports with `ERR_PNPM_NO_MATURE_MATCHING_VERSION`, as `name@version` or `name@range`.\n */\nexport function getImmaturePackages(output: string): string[] {\n if (!output.includes('ERR_PNPM_NO_MATURE_MATCHING_VERSION')) {\n return [];\n }\n const packages: string[] = [];\n for (const match of output.matchAll(immatureVersionRegex)) {\n packages.push(`${match.groups!.name}@${match.groups!.version}`);\n }\n for (const match of output.matchAll(immatureListRegex)) {\n for (const entry of match.groups!.list.matchAll(immatureListEntryRegex)) {\n packages.push(entry.groups!.pkg);\n }\n }\n for (const match of output.matchAll(noMatureVersionRegex)) {\n packages.push(match.groups!.pkg);\n }\n return packages.filter(uniqueStrings);\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: PostUpdateConfig,\n upgrades: Upgrade[] = [],\n npmrcContent: string | null = null,\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 let minimumReleaseAgeNotice: string | undefined;\n let minimumReleaseAgeMinutes: number | undefined;\n const syncAgeMs = calculatePackageManagerMinimumReleaseAgeMs({\n config,\n manager: 'npm',\n packageFile: upath.join(lockFileDir, 'package.json'),\n upgrades,\n });\n const isSyncEnabled = syncAgeMs !== null;\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n // if pnpm is being upgraded, it comes first\n let pnpmConstraint: string | null | undefined =\n getPnpmConstraintFromUpgrades(upgrades);\n if (isNullOrUndefined(pnpmConstraint)) {\n pnpmConstraint = await resolvePnpmConstraint(\n config,\n lockFileName,\n // look in package.json > packageManager or engines, then use the lockfileVersion\n async () =>\n getPackageManagerVersion('pnpm', await lazyPgkJson.getValue()),\n );\n }\n const pnpmToolConstraint: ToolConstraint = {\n toolName: 'pnpm',\n constraint: pnpmConstraint,\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 let pnpmWorkspace: PnpmWorkspaceFile | null = null;\n if (await localPathExists(pnpmWorkspaceFilePath)) {\n 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 // without minimumReleaseAgePackageManagerSync, pnpm applies its own config\n const minimumReleaseAgeArgs = isSyncEnabled\n ? getMinimumReleaseAgeArgs(\n syncAgeMs,\n upgrades,\n npmrcContent,\n pnpmToolConstraint.constraint,\n getPnpmWorkspaceMinimumReleaseAge(pnpmWorkspace),\n )\n : null;\n if (minimumReleaseAgeArgs) {\n args += ` ${minimumReleaseAgeArgs.args}`;\n minimumReleaseAgeMinutes = minimumReleaseAgeArgs.minutes;\n minimumReleaseAgeNotice = minimumReleaseAgeArgs.notice;\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 const isLockFileMaintenance = upgrades.some(\n (upgrade) => upgrade.isLockFileMaintenance,\n );\n if (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 const output = `${err.stdout ?? ''}\\n${err.stderr ?? ''}`;\n const immaturePackages = isSyncEnabled ? getImmaturePackages(output) : [];\n if (immaturePackages.length) {\n const packages = immaturePackages.map((pkg) => `\\`${pkg}\\``).join(', ');\n return withNotice(\n {\n error: true,\n stderr: `pnpm found no version old enough for the minimum release age: ${packages}\\n\\n${artifactErrorMessageFromExecError(err, '')}`,\n stdout: err.stdout,\n },\n minimumReleaseAgeNotice,\n );\n }\n if (\n minimumReleaseAgeMinutes &&\n output.includes('ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION')\n ) {\n return withNotice(\n {\n error: true,\n stderr: `${getViolationHint(minimumReleaseAgeMinutes)}\\n\\n${artifactErrorMessageFromExecError(err, '')}`,\n stdout: err.stdout,\n },\n minimumReleaseAgeNotice,\n );\n }\n return withNotice(\n { error: true, stderr: err.stderr, stdout: err.stdout },\n minimumReleaseAgeNotice,\n );\n }\n return withNotice({ lockFile }, minimumReleaseAgeNotice);\n}\n\n// pnpm skips the verification of the lock file with `trustLockfile` since v11.3.0\n// https://github.com/pnpm/pnpm/releases/tag/v11.3.0\nfunction getViolationHint(minutes: number): string {\n return `The \\`pnpm-lock.yaml\\` contains packages younger than the minimum release age of ${minutes} minutes which Renovate passes to pnpm. Raise \\`minimumReleaseAge\\` in the \\`pnpm-workspace.yaml\\` to ${minutes}, or set \\`trustLockfile: true\\` there (pnpm v11.3.0 or later) to skip this check.`;\n}\n\nfunction withNotice(\n result: GenerateLockFileResult,\n minimumReleaseAgeNotice: string | undefined,\n): GenerateLockFileResult {\n return minimumReleaseAgeNotice\n ? { ...result, minimumReleaseAgeNotice }\n : result;\n}\n"],"mappings":"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"}
@@ -37,6 +37,12 @@ function getPackageManagerVersion(name, pkg) {
37
37
  function getNodeOptions(nodeMaxMemory) {
38
38
  return `--max-old-space-size=${nodeMaxMemory}`;
39
39
  }
40
- export { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson };
40
+ /**
41
+ * Returns the name of the npm package whose `newVersion` the package manager installs for `upgrade`.
42
+ */
43
+ function getInstalledPackageName(upgrade) {
44
+ return upgrade.newName ?? upgrade.packageName ?? upgrade.depName;
45
+ }
46
+ export { getInstalledPackageName, getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson };
41
47
 
42
48
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/utils.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { logger } from '../../../../logger/index.ts';\nimport { Lazy } from '../../../../util/lazy.ts';\nimport type { PackageJson } from '../schema.ts';\nimport { loadPackageJson } from '../utils.ts';\n\nexport function lazyLoadPackageJson(\n lockFileDir: string,\n): Lazy<Promise<PackageJson>> {\n return new Lazy(() => loadPackageJson(lockFileDir));\n}\n\nexport function getPackageManagerVersion(\n name: string,\n pkg: PackageJson,\n): string | null {\n if (pkg.devEngines?.packageManager) {\n const packageManagers = isArray(pkg.devEngines.packageManager)\n ? pkg.devEngines.packageManager\n : [pkg.devEngines.packageManager];\n const packageMgr = packageManagers.find((pm) => pm.name === name);\n const version = packageMgr?.version;\n // v8 ignore else -- TODO: add test #40625\n if (version) {\n logger.debug(\n `Found ${name} constraint in package.json devEngines: ${version}`,\n );\n return version;\n }\n }\n if (pkg.volta?.[name]) {\n const version = pkg.volta[name];\n logger.debug(`Found ${name} constraint in package.json volta: ${version}`);\n\n return version;\n }\n if (pkg.packageManager?.name === name) {\n const version = pkg.packageManager.version;\n logger.debug(\n `Found ${name} constraint in package.json packageManager: ${version}`,\n );\n if (semver.valid(version)) {\n return version;\n }\n return null;\n }\n if (pkg.engines?.[name]) {\n const version = pkg.engines[name];\n logger.debug(\n `Found ${name} constraint in package.json engines: ${version}`,\n );\n return version;\n }\n return null;\n}\n\nexport function getNodeOptions(nodeMaxMemory: number): string {\n return `--max-old-space-size=${nodeMaxMemory}`;\n}\n"],"mappings":";;;;;;AAOA,SAAgB,oBACd,aAC4B;CAC5B,OAAO,IAAI,WAAW,gBAAgB,WAAW,CAAC;AACpD;AAEA,SAAgB,yBACd,MACA,KACe;CACf,IAAI,IAAI,YAAY,gBAAgB;EAKlC,MAAM,WAJkB,QAAQ,IAAI,WAAW,cAAc,IACzD,IAAI,WAAW,iBACf,CAAC,IAAI,WAAW,cAAc,EAAA,CACC,MAAM,OAAO,GAAG,SAAS,IACnC,CAAC,EAAE;;EAE5B,IAAI,SAAS;GACX,OAAO,MACL,SAAS,KAAK,0CAA0C,SAC1D;GACA,OAAO;EACT;CACF;CACA,IAAI,IAAI,QAAQ,OAAO;EACrB,MAAM,UAAU,IAAI,MAAM;EAC1B,OAAO,MAAM,SAAS,KAAK,qCAAqC,SAAS;EAEzE,OAAO;CACT;CACA,IAAI,IAAI,gBAAgB,SAAS,MAAM;EACrC,MAAM,UAAU,IAAI,eAAe;EACnC,OAAO,MACL,SAAS,KAAK,8CAA8C,SAC9D;EACA,IAAI,OAAO,MAAM,OAAO,GACtB,OAAO;EAET,OAAO;CACT;CACA,IAAI,IAAI,UAAU,OAAO;EACvB,MAAM,UAAU,IAAI,QAAQ;EAC5B,OAAO,MACL,SAAS,KAAK,uCAAuC,SACvD;EACA,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,eAA+B;CAC5D,OAAO,wBAAwB;AACjC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/utils.ts"],"sourcesContent":["import { isArray } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { logger } from '../../../../logger/index.ts';\nimport { Lazy } from '../../../../util/lazy.ts';\nimport type { Upgrade } from '../../types.ts';\nimport type { PackageJson } from '../schema.ts';\nimport { loadPackageJson } from '../utils.ts';\n\nexport function lazyLoadPackageJson(\n lockFileDir: string,\n): Lazy<Promise<PackageJson>> {\n return new Lazy(() => loadPackageJson(lockFileDir));\n}\n\nexport function getPackageManagerVersion(\n name: string,\n pkg: PackageJson,\n): string | null {\n if (pkg.devEngines?.packageManager) {\n const packageManagers = isArray(pkg.devEngines.packageManager)\n ? pkg.devEngines.packageManager\n : [pkg.devEngines.packageManager];\n const packageMgr = packageManagers.find((pm) => pm.name === name);\n const version = packageMgr?.version;\n // v8 ignore else -- TODO: add test #40625\n if (version) {\n logger.debug(\n `Found ${name} constraint in package.json devEngines: ${version}`,\n );\n return version;\n }\n }\n if (pkg.volta?.[name]) {\n const version = pkg.volta[name];\n logger.debug(`Found ${name} constraint in package.json volta: ${version}`);\n\n return version;\n }\n if (pkg.packageManager?.name === name) {\n const version = pkg.packageManager.version;\n logger.debug(\n `Found ${name} constraint in package.json packageManager: ${version}`,\n );\n if (semver.valid(version)) {\n return version;\n }\n return null;\n }\n if (pkg.engines?.[name]) {\n const version = pkg.engines[name];\n logger.debug(\n `Found ${name} constraint in package.json engines: ${version}`,\n );\n return version;\n }\n return null;\n}\n\nexport function getNodeOptions(nodeMaxMemory: number): string {\n return `--max-old-space-size=${nodeMaxMemory}`;\n}\n\n/**\n * Returns the name of the npm package whose `newVersion` the package manager installs for `upgrade`.\n */\nexport function getInstalledPackageName(upgrade: Upgrade): string | undefined {\n // a replacement installs `newName`, and the packageName of an alias or of\n // an override with a selector is the installed package\n return upgrade.newName ?? upgrade.packageName ?? upgrade.depName;\n}\n"],"mappings":";;;;;;AAQA,SAAgB,oBACd,aAC4B;CAC5B,OAAO,IAAI,WAAW,gBAAgB,WAAW,CAAC;AACpD;AAEA,SAAgB,yBACd,MACA,KACe;CACf,IAAI,IAAI,YAAY,gBAAgB;EAKlC,MAAM,WAJkB,QAAQ,IAAI,WAAW,cAAc,IACzD,IAAI,WAAW,iBACf,CAAC,IAAI,WAAW,cAAc,EAAA,CACC,MAAM,OAAO,GAAG,SAAS,IACnC,CAAC,EAAE;;EAE5B,IAAI,SAAS;GACX,OAAO,MACL,SAAS,KAAK,0CAA0C,SAC1D;GACA,OAAO;EACT;CACF;CACA,IAAI,IAAI,QAAQ,OAAO;EACrB,MAAM,UAAU,IAAI,MAAM;EAC1B,OAAO,MAAM,SAAS,KAAK,qCAAqC,SAAS;EAEzE,OAAO;CACT;CACA,IAAI,IAAI,gBAAgB,SAAS,MAAM;EACrC,MAAM,UAAU,IAAI,eAAe;EACnC,OAAO,MACL,SAAS,KAAK,8CAA8C,SAC9D;EACA,IAAI,OAAO,MAAM,OAAO,GACtB,OAAO;EAET,OAAO;CACT;CACA,IAAI,IAAI,UAAU,OAAO;EACvB,MAAM,UAAU,IAAI,QAAQ;EAC5B,OAAO,MACL,SAAS,KAAK,uCAAuC,SACvD;EACA,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,eAAe,eAA+B;CAC5D,OAAO,wBAAwB;AACjC;;;;AAKA,SAAgB,wBAAwB,SAAsC;CAG5E,OAAO,QAAQ,WAAW,QAAQ,eAAe,QAAQ;AAC3D"}