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
@@ -0,0 +1,93 @@
1
+ import { logger } from "../../../logger/index.js";
2
+ import { calculateMinimumReleaseAgeMs, calculatePackageManagerMinimumReleaseAgeMs } from "../../../util/minimum-release-age.js";
3
+ import { coerceObject } from "../../../util/object.js";
4
+ import { intersectsWith, isSubsetOf } from "../../versioning/common.js";
5
+ import { api } from "../../versioning/npm/index.js";
6
+ import { resolveToolConstraint } from "../util.js";
7
+ import { MINUTE_MS } from "./constants.js";
8
+ import { isNpmrcOfLockFile, parseNpmrcCooldown } from "./extract/npmrc.js";
9
+ import { getPnpmMinimumReleaseAgeMinutes } from "./extract/pnpm-minimum-release-age.js";
10
+ import { getYarnMinimalAgeGateMinutes, getYarnScopeMinimalAgeGateMinutes, yarnScopeMinimalAgeGateRange } from "./extract/yarn-minimum-release-age.js";
11
+ import { isTruthy } from "@sindresorhus/is";
12
+ import upath from "upath";
13
+ // lib/modules/manager/npm/minimum-release-age.ts
14
+ const minReleaseAgeNpmRange = ">=11.10.0";
15
+ const minimumReleaseAgePnpmRange = ">=10.16.0";
16
+ const minimumReleaseAgeEnforcedPnpmRange = ">=10.17.0 <11.0.0 || >=11.0.4 <12.0.0 || >=12.3.0";
17
+ const minimumReleaseAgeYarnRange = ">=4.10.0";
18
+ /**
19
+ * The minimum release age which Renovate passes to npm or pnpm for the update in `config`.
20
+ */
21
+ function getPassedMinimumReleaseAgeMs(config, lockFile) {
22
+ return calculatePackageManagerMinimumReleaseAgeMs({
23
+ config,
24
+ manager: "npm",
25
+ packageFile: upath.join(upath.dirname(lockFile), "package.json"),
26
+ upgrades: [config]
27
+ }) ?? 0;
28
+ }
29
+ async function npmEnforcesMinimumReleaseAge(config, npmLock) {
30
+ const npmrcCooldown = isNpmrcOfLockFile(config) ? parseNpmrcCooldown(config.npmrc) : null;
31
+ const minimumReleaseAgeMs = getPassedMinimumReleaseAgeMs(config, npmLock);
32
+ if (npmrcCooldown?.source !== "min-release-age") return npmrcCooldown?.source === "before" || minimumReleaseAgeMs > 0;
33
+ if (minimumReleaseAgeMs > npmrcCooldown.days * 864e5) {
34
+ logger.debug(`${npmLock}: min-release-age in .npmrc is shorter than minimumReleaseAge`);
35
+ return false;
36
+ }
37
+ const constraint = await resolveToolConstraint(config, "npm");
38
+ return isSubsetOf(api, constraint, minReleaseAgeNpmRange);
39
+ }
40
+ async function pnpmEnforcesMinimumReleaseAge(config, pnpmLockFile) {
41
+ const settings = coerceObject(config.managerData?.pnpmMinimumReleaseAge);
42
+ const constraint = await resolveToolConstraint(config, "pnpm", () => settings.pnpmConstraint);
43
+ if (!isSubsetOf(api, constraint, ">=10.17.0 <11.0.0 || >=11.0.4 <12.0.0 || >=12.3.0")) return false;
44
+ if (settings.minimumReleaseAgeStrict === false) {
45
+ logger.debug(`${pnpmLockFile}: minimumReleaseAgeStrict=false lets pnpm install versions which are too new`);
46
+ return false;
47
+ }
48
+ if (settings.hasMinimumReleaseAgeExclude) {
49
+ logger.debug(`${pnpmLockFile}: minimumReleaseAgeExclude lets pnpm install versions which are too new`);
50
+ return false;
51
+ }
52
+ const pnpmMinutes = getPnpmMinimumReleaseAgeMinutes(settings, settings.npmrcMinimumReleaseAge, constraint) ?? 0;
53
+ return Math.max(getPassedMinimumReleaseAgeMs(config, pnpmLockFile), pnpmMinutes * MINUTE_MS) > 0;
54
+ }
55
+ async function yarnEnforcesMinimumReleaseAge(config, yarnLock) {
56
+ const settings = coerceObject(config.managerData?.yarnMinimalAgeGate);
57
+ const constraint = await resolveToolConstraint(config, "yarn", () => settings.yarnConstraint);
58
+ if (!isSubsetOf(api, constraint, ">=4.10.0")) return false;
59
+ if (settings.hasNpmPreapprovedPackages) {
60
+ logger.debug(`${yarnLock}: npmPreapprovedPackages lets Yarn install versions which are too new`);
61
+ return false;
62
+ }
63
+ const lockFileMaintenanceAgeMs = calculateMinimumReleaseAgeMs({ minimumReleaseAge: config.minimumReleaseAge });
64
+ const scopeMinutes = getYarnScopeMinimalAgeGateMinutes(settings, intersectsWith(api, constraint, yarnScopeMinimalAgeGateRange));
65
+ for (const [scope, minutes] of Object.entries(scopeMinutes)) if (!minutes || minutes * 6e4 < lockFileMaintenanceAgeMs) {
66
+ logger.debug(`${yarnLock}: the npmMinimalAgeGate of scope ${scope} is 0 or smaller than the minimumReleaseAge of lock file maintenance, and takes precedence over the age which Renovate passes`);
67
+ return false;
68
+ }
69
+ const yarnMinutes = getYarnMinimalAgeGateMinutes(settings, isSubsetOf(api, constraint, ">=4.15.0")) ?? 0;
70
+ return Math.max(getPassedMinimumReleaseAgeMs(config, yarnLock), yarnMinutes * MINUTE_MS) > 0;
71
+ }
72
+ /**
73
+ * Whether npm, pnpm or Yarn enforces the minimum release age when it regenerates the lock file of the package file in `config`, or the package file has no lock file which lock file maintenance could update.
74
+ */
75
+ async function enforcesMinimumReleaseAge(config) {
76
+ const { npmLock, pnpmLockFile, yarnLock } = coerceObject(config.managerData);
77
+ const lockFiles = [
78
+ npmLock,
79
+ pnpmLockFile,
80
+ yarnLock
81
+ ].filter(isTruthy);
82
+ if (!lockFiles.length) {
83
+ logger.debug(`${config.packageFile}: no lock file, so lock file maintenance changes nothing`);
84
+ return true;
85
+ }
86
+ if (lockFiles.length > 1) return false;
87
+ if (yarnLock) return await yarnEnforcesMinimumReleaseAge(config, yarnLock);
88
+ if (npmLock) return await npmEnforcesMinimumReleaseAge(config, npmLock);
89
+ return await pnpmEnforcesMinimumReleaseAge(config, pnpmLockFile);
90
+ }
91
+ export { enforcesMinimumReleaseAge, minReleaseAgeNpmRange, minimumReleaseAgeEnforcedPnpmRange, minimumReleaseAgePnpmRange, minimumReleaseAgeYarnRange };
92
+
93
+ //# sourceMappingURL=minimum-release-age.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimum-release-age.js","names":["npmVersioning"],"sources":["../../../../lib/modules/manager/npm/minimum-release-age.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport {\n calculateMinimumReleaseAgeMs,\n calculatePackageManagerMinimumReleaseAgeMs,\n} from '../../../util/minimum-release-age.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { intersectsWith, isSubsetOf } from '../../versioning/common.ts';\nimport { api as npmVersioning } from '../../versioning/npm/index.ts';\nimport type { UpdateArtifactsConfig } from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { DAY_MS, MINUTE_MS } from './constants.ts';\nimport { isNpmrcOfLockFile, parseNpmrcCooldown } from './extract/npmrc.ts';\nimport { getPnpmMinimumReleaseAgeMinutes } from './extract/pnpm-minimum-release-age.ts';\nimport {\n getYarnMinimalAgeGateMinutes,\n getYarnScopeMinimalAgeGateMinutes,\n yarnDefaultMinimalAgeGateRange,\n yarnScopeMinimalAgeGateRange,\n} from './extract/yarn-minimum-release-age.ts';\nimport type { NpmManagerData } from './types.ts';\n\n// npm supports `min-release-age` since v11.10.0\n// https://github.com/npm/cli/releases/tag/v11.10.0\nexport const minReleaseAgeNpmRange = '>=11.10.0';\n\n// pnpm supports `minimumReleaseAge` since v10.16.0\n// https://github.com/pnpm/pnpm/releases/tag/v10.16.0\nexport const minimumReleaseAgePnpmRange = '>=10.16.0';\n\n// pnpm v10.16.0 skips the check for an exact version from the metadata cache,\n// fixed in v10.17.0: https://github.com/pnpm/pnpm/releases/tag/v10.17.0\n// pnpm v11.0.0 to v11.0.3 fall back to a version which is too new, unless\n// `minimumReleaseAgeStrict` is set. Since v11.0.4, an explicit\n// `minimumReleaseAge` turns on `minimumReleaseAgeStrict`.\n// https://github.com/pnpm/pnpm/releases/tag/v11.0.4\n// pnpm v12.0.0 to v12.2.x treat an explicit `minimumReleaseAge` as not strict\n// again, fixed in v12.3.0.\nexport const minimumReleaseAgeEnforcedPnpmRange =\n '>=10.17.0 <11.0.0 || >=11.0.4 <12.0.0 || >=12.3.0';\n\n// Yarn supports `npmMinimalAgeGate` and `npmPreapprovedPackages` since v4.10.0\n// https://github.com/yarnpkg/berry/releases/tag/%40yarnpkg%2Fcli%2F4.10.0\nexport const minimumReleaseAgeYarnRange = '>=4.10.0';\n\ninterface NpmEnforcesMinimumReleaseAgeConfig extends UpdateArtifactsConfig {\n managerData?: NpmManagerData;\n npmrc?: string;\n packageFile?: string;\n}\n\n/**\n * The minimum release age which Renovate passes to npm or pnpm for the update in `config`.\n */\nfunction getPassedMinimumReleaseAgeMs(\n config: NpmEnforcesMinimumReleaseAgeConfig,\n lockFile: string,\n): number {\n return (\n calculatePackageManagerMinimumReleaseAgeMs({\n config,\n manager: 'npm',\n packageFile: upath.join(upath.dirname(lockFile), 'package.json'),\n upgrades: [config],\n }) ?? 0\n );\n}\n\nasync function npmEnforcesMinimumReleaseAge(\n config: NpmEnforcesMinimumReleaseAgeConfig,\n npmLock: string,\n): Promise<boolean> {\n // the lock file generation ignores an `.npmrc` of a parent directory\n const npmrcCooldown = isNpmrcOfLockFile(config)\n ? parseNpmrcCooldown(config.npmrc)\n : null;\n // the value which Renovate passes as `--before` to npm\n const minimumReleaseAgeMs = getPassedMinimumReleaseAgeMs(config, npmLock);\n\n if (npmrcCooldown?.source !== 'min-release-age') {\n // npm applies a `before` from the `.npmrc` itself, and Renovate passes\n // `--before` for `minimumReleaseAge`, which every npm version supports\n return npmrcCooldown?.source === 'before' || minimumReleaseAgeMs > 0;\n }\n\n // Renovate does not pass `--before` next to a `min-release-age`, so npm\n // only enforces the `min-release-age`\n if (minimumReleaseAgeMs > npmrcCooldown.days * DAY_MS) {\n logger.debug(\n `${npmLock}: min-release-age in .npmrc is shorter than minimumReleaseAge`,\n );\n return false;\n }\n\n // the status checks run before the base branch is checked out, so the\n // constraint is not derived from the package.json in the working tree\n const constraint = await resolveToolConstraint(config, 'npm');\n return isSubsetOf(npmVersioning, constraint, minReleaseAgeNpmRange);\n}\n\nasync function pnpmEnforcesMinimumReleaseAge(\n config: NpmEnforcesMinimumReleaseAgeConfig,\n pnpmLockFile: string,\n): Promise<boolean> {\n // the status checks run before the base branch is checked out, so the pnpm\n // constraint and settings of the lock file come from the extraction, which\n // copies them to every package file of the lock file\n const settings = coerceObject(config.managerData?.pnpmMinimumReleaseAge);\n const constraint = await resolveToolConstraint(\n config,\n 'pnpm',\n () => settings.pnpmConstraint,\n );\n if (\n !isSubsetOf(npmVersioning, constraint, minimumReleaseAgeEnforcedPnpmRange)\n ) {\n return false;\n }\n\n if (settings.minimumReleaseAgeStrict === false) {\n logger.debug(\n `${pnpmLockFile}: minimumReleaseAgeStrict=false lets pnpm install versions which are too new`,\n );\n return false;\n }\n if (settings.hasMinimumReleaseAgeExclude) {\n logger.debug(\n `${pnpmLockFile}: minimumReleaseAgeExclude lets pnpm install versions which are too new`,\n );\n return false;\n }\n\n // Renovate passes the larger of its own value and the pnpm value,\n // otherwise pnpm applies its own value. The pnpm v11 default does not\n // count, as pnpm does not apply it strictly.\n const pnpmMinutes =\n getPnpmMinimumReleaseAgeMinutes(\n settings,\n settings.npmrcMinimumReleaseAge,\n constraint,\n ) ?? 0;\n return (\n Math.max(\n getPassedMinimumReleaseAgeMs(config, pnpmLockFile),\n pnpmMinutes * MINUTE_MS,\n ) > 0\n );\n}\n\nasync function yarnEnforcesMinimumReleaseAge(\n config: NpmEnforcesMinimumReleaseAgeConfig,\n yarnLock: string,\n): Promise<boolean> {\n // the status checks run before the base branch is checked out, so the Yarn\n // constraint and settings of the lock file come from the extraction, which\n // copies them to every package file of the lock file\n const settings = coerceObject(config.managerData?.yarnMinimalAgeGate);\n const constraint = await resolveToolConstraint(\n config,\n 'yarn',\n () => settings.yarnConstraint,\n );\n if (!isSubsetOf(npmVersioning, constraint, minimumReleaseAgeYarnRange)) {\n return false;\n }\n\n // lock file maintenance keeps the `npmPreapprovedPackages` of the\n // .yarnrc.yml, which Yarn installs without a minimum release age\n if (settings.hasNpmPreapprovedPackages) {\n logger.debug(\n `${yarnLock}: npmPreapprovedPackages lets Yarn install versions which are too new`,\n );\n return false;\n }\n // the age which Renovate would wait for, `minimumReleaseAgePackageManager`\n // only raises what it passes\n const lockFileMaintenanceAgeMs = calculateMinimumReleaseAgeMs({\n minimumReleaseAge: config.minimumReleaseAge,\n });\n // a scope without its own age may get the Yarn default\n const scopeMinutes = getYarnScopeMinimalAgeGateMinutes(\n settings,\n intersectsWith(npmVersioning, constraint, yarnScopeMinimalAgeGateRange),\n );\n for (const [scope, minutes] of Object.entries(scopeMinutes)) {\n if (!minutes || minutes * MINUTE_MS < lockFileMaintenanceAgeMs) {\n logger.debug(\n `${yarnLock}: the npmMinimalAgeGate of scope ${scope} is 0 or smaller than the minimumReleaseAge of lock file maintenance, and takes precedence over the age which Renovate passes`,\n );\n return false;\n }\n }\n\n // Renovate passes the larger of its own value and the Yarn value, otherwise\n // Yarn applies its own value. The Yarn default counts only if every allowed\n // Yarn version has it.\n const yarnMinutes =\n getYarnMinimalAgeGateMinutes(\n settings,\n isSubsetOf(npmVersioning, constraint, yarnDefaultMinimalAgeGateRange),\n ) ?? 0;\n return (\n Math.max(\n getPassedMinimumReleaseAgeMs(config, yarnLock),\n yarnMinutes * MINUTE_MS,\n ) > 0\n );\n}\n\n/**\n * Whether npm, pnpm or Yarn enforces the minimum release age when it regenerates the lock file of the package file in `config`, or the package file has no lock file which lock file maintenance could update.\n */\nexport async function enforcesMinimumReleaseAge(\n config: NpmEnforcesMinimumReleaseAgeConfig,\n): Promise<boolean> {\n const { npmLock, pnpmLockFile, yarnLock } = coerceObject(config.managerData);\n const lockFiles = [npmLock, pnpmLockFile, yarnLock].filter(isTruthy);\n if (!lockFiles.length) {\n logger.debug(\n `${config.packageFile}: no lock file, so lock file maintenance changes nothing`,\n );\n return true;\n }\n if (lockFiles.length > 1) {\n return false;\n }\n if (yarnLock) {\n return await yarnEnforcesMinimumReleaseAge(config, yarnLock);\n }\n if (npmLock) {\n return await npmEnforcesMinimumReleaseAge(config, npmLock);\n }\n return await pnpmEnforcesMinimumReleaseAge(config, pnpmLockFile!);\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,MAAa,wBAAwB;AAIrC,MAAa,6BAA6B;AAU1C,MAAa,qCACX;AAIF,MAAa,6BAA6B;;;;AAW1C,SAAS,6BACP,QACA,UACQ;CACR,OACE,2CAA2C;EACzC;EACA,SAAS;EACT,aAAa,MAAM,KAAK,MAAM,QAAQ,QAAQ,GAAG,cAAc;EAC/D,UAAU,CAAC,MAAM;CACnB,CAAC,KAAK;AAEV;AAEA,eAAe,6BACb,QACA,SACkB;CAElB,MAAM,gBAAgB,kBAAkB,MAAM,IAC1C,mBAAmB,OAAO,KAAK,IAC/B;CAEJ,MAAM,sBAAsB,6BAA6B,QAAQ,OAAO;CAExE,IAAI,eAAe,WAAW,mBAG5B,OAAO,eAAe,WAAW,YAAY,sBAAsB;CAKrE,IAAI,sBAAsB,cAAc,OAAA,OAAe;EACrD,OAAO,MACL,GAAG,QAAQ,8DACb;EACA,OAAO;CACT;CAIA,MAAM,aAAa,MAAM,sBAAsB,QAAQ,KAAK;CAC5D,OAAO,WAAWA,KAAe,YAAY,qBAAqB;AACpE;AAEA,eAAe,8BACb,QACA,cACkB;CAIlB,MAAM,WAAW,aAAa,OAAO,aAAa,qBAAqB;CACvE,MAAM,aAAa,MAAM,sBACvB,QACA,cACM,SAAS,cACjB;CACA,IACE,CAAC,WAAWA,KAAe,YAAA,mDAA8C,GAEzE,OAAO;CAGT,IAAI,SAAS,4BAA4B,OAAO;EAC9C,OAAO,MACL,GAAG,aAAa,6EAClB;EACA,OAAO;CACT;CACA,IAAI,SAAS,6BAA6B;EACxC,OAAO,MACL,GAAG,aAAa,wEAClB;EACA,OAAO;CACT;CAKA,MAAM,cACJ,gCACE,UACA,SAAS,wBACT,UACF,KAAK;CACP,OACE,KAAK,IACH,6BAA6B,QAAQ,YAAY,GACjD,cAAc,SAChB,IAAI;AAER;AAEA,eAAe,8BACb,QACA,UACkB;CAIlB,MAAM,WAAW,aAAa,OAAO,aAAa,kBAAkB;CACpE,MAAM,aAAa,MAAM,sBACvB,QACA,cACM,SAAS,cACjB;CACA,IAAI,CAAC,WAAWA,KAAe,YAAA,UAAsC,GACnE,OAAO;CAKT,IAAI,SAAS,2BAA2B;EACtC,OAAO,MACL,GAAG,SAAS,sEACd;EACA,OAAO;CACT;CAGA,MAAM,2BAA2B,6BAA6B,EAC5D,mBAAmB,OAAO,kBAC5B,CAAC;CAED,MAAM,eAAe,kCACnB,UACA,eAAeA,KAAe,YAAY,4BAA4B,CACxE;CACA,KAAK,MAAM,CAAC,OAAO,YAAY,OAAO,QAAQ,YAAY,GACxD,IAAI,CAAC,WAAW,UAAA,MAAsB,0BAA0B;EAC9D,OAAO,MACL,GAAG,SAAS,mCAAmC,MAAM,8HACvD;EACA,OAAO;CACT;CAMF,MAAM,cACJ,6BACE,UACA,WAAWA,KAAe,YAAA,UAA0C,CACtE,KAAK;CACP,OACE,KAAK,IACH,6BAA6B,QAAQ,QAAQ,GAC7C,cAAc,SAChB,IAAI;AAER;;;;AAKA,eAAsB,0BACpB,QACkB;CAClB,MAAM,EAAE,SAAS,cAAc,aAAa,aAAa,OAAO,WAAW;CAC3E,MAAM,YAAY;EAAC;EAAS;EAAc;CAAQ,CAAC,CAAC,OAAO,QAAQ;CACnE,IAAI,CAAC,UAAU,QAAQ;EACrB,OAAO,MACL,GAAG,OAAO,YAAY,yDACxB;EACA,OAAO;CACT;CACA,IAAI,UAAU,SAAS,GACrB,OAAO;CAET,IAAI,UACF,OAAO,MAAM,8BAA8B,QAAQ,QAAQ;CAE7D,IAAI,SACF,OAAO,MAAM,6BAA6B,QAAQ,OAAO;CAE3D,OAAO,MAAM,8BAA8B,QAAQ,YAAa;AAClE"}
@@ -333,6 +333,10 @@ async function getAdditionalFilesInner(config, packageFiles, originalNpmrcFiles)
333
333
  stderr: res.stderr
334
334
  });
335
335
  } else if (res.lockFile) {
336
+ if (res.minimumReleaseAgeNotice) artifactNotices.push({
337
+ file: npmLock,
338
+ message: res.minimumReleaseAgeNotice
339
+ });
336
340
  if (res.beforeFallback) {
337
341
  const message = "npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.";
338
342
  logger.warn({ npmLock }, message);
@@ -412,10 +416,14 @@ async function getAdditionalFilesInner(config, packageFiles, originalNpmrcFiles)
412
416
  }
413
417
  for (const pnpmLockFile of dirs.pnpmLockFileDirs) {
414
418
  const lockFileDir = upath.dirname(pnpmLockFile);
415
- await withNpmrcHostRules(lockFileDir, additionalNpmrcContent, async () => {
419
+ await withNpmrcHostRules(lockFileDir, additionalNpmrcContent, async (npmrcContent) => {
416
420
  logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);
417
421
  const upgrades = config.upgrades.filter((upgrade) => upgrade.managerData?.pnpmLockFile === pnpmLockFile);
418
- const res = await generateLockFile$1(lockFileDir, env, config, upgrades);
422
+ const res = await generateLockFile$1(lockFileDir, env, config, upgrades, npmrcContent);
423
+ if (res.minimumReleaseAgeNotice && !res.error) artifactNotices.push({
424
+ file: pnpmLockFile,
425
+ message: res.minimumReleaseAgeNotice
426
+ });
419
427
  if (res.error) {
420
428
  /* v8 ignore next -- needs test */
421
429
  if (res.stdout?.includes(`No compatible version found:`)) {
@@ -427,9 +435,10 @@ async function getAdditionalFilesInner(config, packageFiles, originalNpmrcFiles)
427
435
  throw new ExternalHostError(Error("lock file failed for the dependency being updated - skipping branch creation"), NpmDatasource.id);
428
436
  }
429
437
  }
438
+ const stderr = artifactErrorMessageFromExecError(res, "");
430
439
  artifactErrors.push({
431
440
  fileName: pnpmLockFile,
432
- stderr: artifactErrorMessageFromExecError(res, "")
441
+ stderr: res.minimumReleaseAgeNotice ? `${res.minimumReleaseAgeNotice}\n\n${stderr}` : stderr
433
442
  });
434
443
  } else {
435
444
  const existingContent = await getFile(pnpmLockFile, config.reuseExistingBranch ? config.branchName : config.baseBranch);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport {\n isNonEmptyStringAndNotWhitespace,\n isNullOrUndefined,\n isString,\n} from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n NpmrcPackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport { artifactErrorMessageFromExecError } from '../../util.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n parseLockFile,\n withNpmrcHostRules,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmLockFileDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmLockFileDirs.push(upgrade.managerData?.pnpmLockFile);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<NpmrcPackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmLockFileDirs.push(packageFile.managerData.pnpmLockFile);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles = new Map<string, string>(),\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n const isNpmrcOwnFile =\n npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName;\n if (isString(npmrc) && isNpmrcOwnFile) {\n try {\n if (!originalNpmrcFiles.has(npmrcFilename)) {\n const originalNpmrc = await readLocalFile(npmrcFilename, 'utf8');\n if (isString(originalNpmrc)) {\n originalNpmrcFiles.set(npmrcFilename, originalNpmrc);\n }\n }\n await writeLocalFile(npmrcFilename, npmrc.replace(regEx(/\\n?$/), '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n const oldVersion = upgrade.lockedVersion ?? upgrade.currentVersion;\n if ('packages' in npmLockParsed) {\n for (const packageName of packageNames) {\n if (\n packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`)\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n continue;\n }\n if (\n !depName ||\n !oldVersion ||\n // Workspace entries (e.g. `packages/app`) and the root entry\n // are link targets: `node_modules/<name>` points at them with\n // `link: true`, so deleting one breaks npm with EMISSINGTARGET.\n !packageName.startsWith('node_modules/')\n ) {\n continue;\n }\n // Lockstep monorepo siblings (e.g. vue -> @vue/server-renderer)\n // pin the updated dep to its exact old version. Left in the lock\n // they cannot resolve against the new version and npm fails with\n // ERESOLVE, so massage them out too and let npm re-resolve them.\n const entry = npmLockParsed.packages[packageName];\n const pinned =\n entry?.peerDependencies?.[depName] === oldVersion ||\n entry?.dependencies?.[depName] === oldVersion ||\n entry?.optionalDependencies?.[depName] === oldVersion;\n if (pinned) {\n logger.trace(\n { packageName, depName, oldVersion },\n 'Massaging out lockstep sibling',\n );\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nasync function restoreNpmrcFiles(\n originalNpmrcFiles: Map<string, string>,\n): Promise<void> {\n for (const [npmrcFilename, originalNpmrc] of originalNpmrcFiles) {\n try {\n await writeLocalFile(npmrcFilename, originalNpmrc);\n } catch (err) {\n logger.warn({ npmrcFilename, err }, 'Error restoring .npmrc');\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (!(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n if (isNullOrUndefined(yarnrcYml)) {\n yarnrcYml = (await getFile(yarnrcYmlFilename)) ?? undefined;\n }\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nasync function getAdditionalFilesInner(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles: Map<string, string>,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (config.isLockFileMaintenance && config.reuseExistingBranch) {\n const branchExists = await scm.branchExists(config.branchName);\n if (branchExists) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles, originalNpmrcFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n await withNpmrcHostRules(\n lockFileDir,\n additionalNpmrcContent,\n async (npmrcContent) => {\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n },\n );\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n await withNpmrcHostRules(lockFileDir, additionalNpmrcContent, async () => {\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(\n yarnRcYmlFilename,\n 'utf8',\n );\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(\n lockFileDir,\n env,\n config,\n upgrades,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n });\n /* v8 ignore next -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmLockFile of dirs.pnpmLockFileDirs) {\n const lockFileDir = upath.dirname(pnpmLockFile);\n await withNpmrcHostRules(lockFileDir, additionalNpmrcContent, async () => {\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmLockFile === pnpmLockFile,\n );\n const res = await pnpm.generateLockFile(\n lockFileDir,\n env,\n config,\n upgrades,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmLockFile,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n pnpmLockFile,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmLockFile,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n });\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n const originalNpmrcFiles = new Map<string, string>();\n try {\n return await getAdditionalFilesInner(\n // The branch config carries the manager data of every upgrade untyped; the npm post-update only reads the optional npm fields of it.\n config as PostUpdateConfig<NpmManagerData>,\n packageFiles,\n originalNpmrcFiles,\n );\n } finally {\n await restoreNpmrcFiles(originalNpmrcFiles);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport {\n isNonEmptyStringAndNotWhitespace,\n isNullOrUndefined,\n isString,\n} from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n NpmrcPackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport { artifactErrorMessageFromExecError } from '../../util.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n parseLockFile,\n withNpmrcHostRules,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmLockFileDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmLockFileDirs.push(upgrade.managerData?.pnpmLockFile);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<NpmrcPackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmLockFileDirs.push(packageFile.managerData.pnpmLockFile);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmLockFileDirs: getDirs(pnpmLockFileDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles = new Map<string, string>(),\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n const isNpmrcOwnFile =\n npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName;\n if (isString(npmrc) && isNpmrcOwnFile) {\n try {\n if (!originalNpmrcFiles.has(npmrcFilename)) {\n const originalNpmrc = await readLocalFile(npmrcFilename, 'utf8');\n if (isString(originalNpmrc)) {\n originalNpmrcFiles.set(npmrcFilename, originalNpmrc);\n }\n }\n await writeLocalFile(npmrcFilename, npmrc.replace(regEx(/\\n?$/), '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n const oldVersion = upgrade.lockedVersion ?? upgrade.currentVersion;\n if ('packages' in npmLockParsed) {\n for (const packageName of packageNames) {\n if (\n packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`)\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n continue;\n }\n if (\n !depName ||\n !oldVersion ||\n // Workspace entries (e.g. `packages/app`) and the root entry\n // are link targets: `node_modules/<name>` points at them with\n // `link: true`, so deleting one breaks npm with EMISSINGTARGET.\n !packageName.startsWith('node_modules/')\n ) {\n continue;\n }\n // Lockstep monorepo siblings (e.g. vue -> @vue/server-renderer)\n // pin the updated dep to its exact old version. Left in the lock\n // they cannot resolve against the new version and npm fails with\n // ERESOLVE, so massage them out too and let npm re-resolve them.\n const entry = npmLockParsed.packages[packageName];\n const pinned =\n entry?.peerDependencies?.[depName] === oldVersion ||\n entry?.dependencies?.[depName] === oldVersion ||\n entry?.optionalDependencies?.[depName] === oldVersion;\n if (pinned) {\n logger.trace(\n { packageName, depName, oldVersion },\n 'Massaging out lockstep sibling',\n );\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nasync function restoreNpmrcFiles(\n originalNpmrcFiles: Map<string, string>,\n): Promise<void> {\n for (const [npmrcFilename, originalNpmrc] of originalNpmrcFiles) {\n try {\n await writeLocalFile(npmrcFilename, originalNpmrc);\n } catch (err) {\n logger.warn({ npmrcFilename, err }, 'Error restoring .npmrc');\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (!(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n if (isNullOrUndefined(yarnrcYml)) {\n yarnrcYml = (await getFile(yarnrcYmlFilename)) ?? undefined;\n }\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nasync function getAdditionalFilesInner(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n originalNpmrcFiles: Map<string, string>,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (config.isLockFileMaintenance && config.reuseExistingBranch) {\n const branchExists = await scm.branchExists(config.branchName);\n if (branchExists) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles, originalNpmrcFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n await withNpmrcHostRules(\n lockFileDir,\n additionalNpmrcContent,\n async (npmrcContent) => {\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.minimumReleaseAgeNotice) {\n artifactNotices.push({\n file: npmLock,\n message: res.minimumReleaseAgeNotice,\n });\n }\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n },\n );\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n await withNpmrcHostRules(lockFileDir, additionalNpmrcContent, async () => {\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(\n yarnRcYmlFilename,\n 'utf8',\n );\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(\n lockFileDir,\n env,\n config,\n upgrades,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n });\n /* v8 ignore next -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmLockFile of dirs.pnpmLockFileDirs) {\n const lockFileDir = upath.dirname(pnpmLockFile);\n await withNpmrcHostRules(\n lockFileDir,\n additionalNpmrcContent,\n async (npmrcContent) => {\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmLockFile === pnpmLockFile,\n );\n const res = await pnpm.generateLockFile(\n lockFileDir,\n env,\n config,\n upgrades,\n npmrcContent,\n );\n // Renovate shows artifact notices only if there are no artifact\n // errors, so a failed pnpm run reports the notice with its error\n if (res.minimumReleaseAgeNotice && !res.error) {\n artifactNotices.push({\n file: pnpmLockFile,\n message: res.minimumReleaseAgeNotice,\n });\n }\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n const stderr = artifactErrorMessageFromExecError(res, '');\n artifactErrors.push({\n fileName: pnpmLockFile,\n stderr: res.minimumReleaseAgeNotice\n ? `${res.minimumReleaseAgeNotice}\\n\\n${stderr}`\n : stderr,\n });\n } else {\n const existingContent = await getFile(\n pnpmLockFile,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmLockFile,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n },\n );\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n const originalNpmrcFiles = new Map<string, string>();\n try {\n return await getAdditionalFilesInner(\n // The branch config carries the manager data of every upgrade untyped; the npm post-update only reads the optional npm fields of it.\n config as PostUpdateConfig<NpmManagerData>,\n packageFiles,\n originalNpmrcFiles,\n );\n } finally {\n await restoreNpmrcFiles(originalNpmrcFiles);\n }\n}\n"],"mappings":"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"}
@@ -4,44 +4,24 @@ import { logger } from "../../../../logger/index.js";
4
4
  import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
5
5
  import { deleteLocalFile, localPathExists, readLocalFile, renameLocalFile } from "../../../../util/fs/index.js";
6
6
  import { minimatch } from "../../../../util/minimatch.js";
7
+ import { calculatePackageManagerMinimumReleaseAgeMs, getMinimumReleaseAgeExemption } from "../../../../util/minimum-release-age.js";
7
8
  import { toMs } from "../../../../util/pretty-time.js";
8
9
  import { regEx } from "../../../../util/regex.js";
9
10
  import { Result } from "../../../../util/result.js";
10
11
  import { trimSlashes } from "../../../../util/url.js";
12
+ import { NpmDatasource } from "../../../datasource/npm/index.js";
11
13
  import { resolveToolConstraint } from "../../util.js";
12
- import { NpmrcCooldown, PackageLock } from "../schema.js";
14
+ import { parseNpmrcCooldown } from "../extract/npmrc.js";
15
+ import { PackageLock } from "../schema.js";
13
16
  import { composeLockFile, parseLockFile } from "../utils.js";
14
17
  import { getNodeToolConstraint } from "./node-version.js";
15
18
  import { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
16
- import { isNonEmptyString, isNullOrUndefined, isNumber, isString } from "@sindresorhus/is";
17
- import { DateTime } from "luxon";
19
+ import { isNonEmptyString, isNullOrUndefined, isString } from "@sindresorhus/is";
20
+ import { DateTime, Duration } from "luxon";
18
21
  import { quote } from "shlex";
19
22
  import upath from "upath";
20
23
  import semver from "semver";
21
24
  // lib/modules/manager/npm/post-update/npm.ts
22
- function parseNpmrcCooldownDate(npmrcContent) {
23
- if (!npmrcContent) return null;
24
- const parsed = NpmrcCooldown.parse(npmrcContent);
25
- const before = parsed.before;
26
- if (isNonEmptyString(before)) {
27
- const dt = DateTime.fromISO(before, { zone: "utc" });
28
- if (dt.isValid) return {
29
- date: dt,
30
- source: "before"
31
- };
32
- logger.debug(`Invalid before date in .npmrc: ${before}, ignoring`);
33
- }
34
- const minReleaseAge = parsed["min-release-age"];
35
- if (isNonEmptyString(minReleaseAge)) {
36
- const days = parseInt(minReleaseAge, 10);
37
- if (isNumber(days) && days >= 0) return {
38
- date: DateTime.now().minus({ days }).toUTC(),
39
- source: "min-release-age"
40
- };
41
- logger.debug(`Invalid min-release-age in .npmrc: ${minReleaseAge}, ignoring`);
42
- }
43
- return null;
44
- }
45
25
  async function getNpmConstraintFromPackageLock(lockFileDir, filename) {
46
26
  const packageLockFileName = upath.join(lockFileDir, filename);
47
27
  const packageLockContents = await readLocalFile(packageLockFileName, "utf8");
@@ -61,12 +41,78 @@ async function getNpmConstraintFromPackageLock(lockFileDir, filename) {
61
41
  }
62
42
  return null;
63
43
  }
44
+ function toHuman(durationMs) {
45
+ return Duration.fromMillis(durationMs).rescale().toHuman();
46
+ }
47
+ /**
48
+ * Whether the `before` date of the `.npmrc` is older than a minimum release age of `ageMs`, where `0` means none.
49
+ */
50
+ function isNpmrcBeforeOlder(npmrcDate, ageMs) {
51
+ if (!npmrcDate) return false;
52
+ return !ageMs || npmrcDate < DateTime.now().minus(ageMs);
53
+ }
54
+ /**
55
+ * Describes the minimum release age which npm checks with a lowered age of `ageMs` and the `before` date of the `.npmrc`.
56
+ */
57
+ function getCheckedMinimumReleaseAge(npmrcDate, ageMs) {
58
+ if (isNpmrcBeforeOlder(npmrcDate, ageMs)) return `the \`before\` date ${npmrcDate.toISO()} of the \`.npmrc\``;
59
+ return ageMs ? `a minimum release age of ${toHuman(ageMs)}` : "no minimum release age";
60
+ }
61
+ /**
62
+ * 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.
63
+ */
64
+ function getBeforeFlag(minimumReleaseAgeMs, npmrcCooldown, upgrades) {
65
+ if (npmrcCooldown?.source === "min-release-age") {
66
+ logger.debug(`Skipping --before flag because .npmrc already contains min-release-age=${npmrcCooldown.days}`);
67
+ return { flag: "" };
68
+ }
69
+ const exemption = getMinimumReleaseAgeExemption(upgrades, "npm", NpmDatasource.id, minimumReleaseAgeMs);
70
+ const npmrcDate = npmrcCooldown?.date;
71
+ let notice;
72
+ let ageMs = minimumReleaseAgeMs;
73
+ if (exemption && !isNpmrcBeforeOlder(npmrcDate, minimumReleaseAgeMs)) {
74
+ ageMs = exemption.ageMs;
75
+ const checked = getCheckedMinimumReleaseAge(npmrcDate, ageMs);
76
+ logger.debug(`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`);
77
+ const packages = exemption.depNames.map((name) => `\`${name}\``).join(", ");
78
+ 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\`.`;
79
+ if (!ageMs) return {
80
+ flag: "",
81
+ notice
82
+ };
83
+ }
84
+ let beforeDate = DateTime.now().minus(ageMs).toUTC();
85
+ if (npmrcDate && npmrcDate < beforeDate) {
86
+ logger.debug({
87
+ npmrcDate: npmrcDate.toISO(),
88
+ beforeDate: beforeDate.toISO()
89
+ }, "Using stricter .npmrc cooldown date over minimumReleaseAge date");
90
+ beforeDate = npmrcDate;
91
+ }
92
+ const beforeISO = beforeDate.toISO();
93
+ logger.debug(`Setting npm --before=${beforeISO} based on minimumReleaseAge`);
94
+ return {
95
+ flag: ` --before=${beforeISO}`,
96
+ notice
97
+ };
98
+ }
99
+ /**
100
+ * Returns the minimum release age for `--before`, or `null` for none: `syncAgeMs` with `minimumReleaseAgePackageManagerSync`, else the `minimumReleaseAge` of `config`.
101
+ */
102
+ function getBeforeAgeMs(config, syncAgeMs) {
103
+ if (syncAgeMs !== null) return syncAgeMs || null;
104
+ if (!config.minimumReleaseAge) return null;
105
+ const ms = toMs(config.minimumReleaseAge);
106
+ if (ms === null) logger.debug(`Invalid minimumReleaseAge ${config.minimumReleaseAge}, skipping --before for npm install`);
107
+ return ms;
108
+ }
64
109
  async function generateLockFile(lockFileDir, env, filename, config = {}, upgrades = [], npmrcContent = null) {
65
110
  const lockFileName = upath.join(lockFileDir, filename);
66
111
  logger.debug(`Spawning npm install to create ${lockFileDir}/${filename}`);
67
112
  const { skipInstalls, postUpdateOptions } = config;
68
113
  let lockFile = null;
69
114
  let beforeFallback = false;
115
+ let minimumReleaseAgeNotice;
70
116
  try {
71
117
  const lazyPkgJson = lazyLoadPackageJson(lockFileDir);
72
118
  const npmToolConstraint = {
@@ -92,34 +138,18 @@ async function generateLockFile(lockFileDir, env, filename, config = {}, upgrade
92
138
  cmdOptions += " --prefer-dedupe";
93
139
  }
94
140
  if (!GlobalConfig.get("allowScripts") || config.ignoreScripts) cmdOptions += " --ignore-scripts";
95
- let beforeFlag = "";
96
- if (config.minimumReleaseAge) {
97
- const ms = toMs(config.minimumReleaseAge);
98
- if (ms === null) logger.debug({ minimumReleaseAge: config.minimumReleaseAge }, "Invalid minimumReleaseAge, skipping --before for npm install");
99
- else {
100
- const npmrcCooldown = parseNpmrcCooldownDate(npmrcContent);
101
- if (npmrcCooldown?.source === "min-release-age") logger.debug({
102
- npmrcMinReleaseAge: npmrcCooldown.date.toISO(),
103
- minimumReleaseAge: config.minimumReleaseAge
104
- }, "Skipping --before flag because .npmrc already contains min-release-age");
105
- else {
106
- let beforeDate = DateTime.now().minus(ms).toUTC();
107
- if (npmrcCooldown && npmrcCooldown.date < beforeDate) {
108
- logger.debug({
109
- npmrcDate: npmrcCooldown.date.toISO(),
110
- beforeDate: beforeDate.toISO()
111
- }, "Using stricter .npmrc cooldown date over minimumReleaseAge date");
112
- beforeDate = npmrcCooldown.date;
113
- }
114
- const beforeISO = beforeDate.toISO();
115
- logger.debug({
116
- beforeISO,
117
- minimumReleaseAge: config.minimumReleaseAge
118
- }, "Setting npm --before based on minimumReleaseAge");
119
- beforeFlag = ` --before=${beforeISO}`;
120
- }
121
- }
122
- }
141
+ const minimumReleaseAgeOptions = {
142
+ config,
143
+ manager: "npm",
144
+ packageFile: upath.join(lockFileDir, "package.json"),
145
+ upgrades
146
+ };
147
+ const syncAgeMs = calculatePackageManagerMinimumReleaseAgeMs(minimumReleaseAgeOptions);
148
+ const isSyncEnabled = syncAgeMs !== null;
149
+ const beforeAgeMs = getBeforeAgeMs(config, syncAgeMs);
150
+ const before = beforeAgeMs === null ? { flag: "" } : getBeforeFlag(beforeAgeMs, parseNpmrcCooldown(npmrcContent, !isSyncEnabled), isSyncEnabled ? upgrades : []);
151
+ const beforeFlag = before.flag;
152
+ minimumReleaseAgeNotice = before.notice;
123
153
  const extraEnv = {
124
154
  NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,
125
155
  npm_config_store: env.npm_config_store
@@ -183,8 +213,9 @@ async function generateLockFile(lockFileDir, env, filename, config = {}, upgrade
183
213
  if (command.startsWith("npm install")) commands.push(command);
184
214
  }
185
215
  }
216
+ const skipsBeforeRetry = isSyncEnabled && upgrades.some((upgrade) => upgrade.isLockFileMaintenance);
186
217
  await exec(commands, execOptions).catch(async (err) => {
187
- if (beforeFlag && err.stderr?.includes("with a date before")) {
218
+ if (beforeFlag && !skipsBeforeRetry && err.stderr?.includes("with a date before")) {
188
219
  logger.debug("npm --before caused ETARGET, retrying without --before");
189
220
  const commandsWithoutBefore = commands.map((cmd) => cmd.replace(beforeFlag, ""));
190
221
  beforeFallback = true;
@@ -224,7 +255,8 @@ async function generateLockFile(lockFileDir, env, filename, config = {}, upgrade
224
255
  return {
225
256
  error: !lockFile,
226
257
  lockFile,
227
- beforeFallback
258
+ beforeFallback,
259
+ minimumReleaseAgeNotice
228
260
  };
229
261
  }
230
262
  function divideWorkspaceAndRootDeps(lockFileDir, lockUpdates) {
@@ -275,6 +307,6 @@ function divideWorkspaceAndRootDeps(lockFileDir, lockUpdates) {
275
307
  function generatePackageKey(packageName, version) {
276
308
  return `${packageName}@${version}`;
277
309
  }
278
- export { divideWorkspaceAndRootDeps, generateLockFile, parseNpmrcCooldownDate };
310
+ export { divideWorkspaceAndRootDeps, generateLockFile };
279
311
 
280
312
  //# sourceMappingURL=npm.js.map