renovate 44.85.1 → 44.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/manager/apm/artifacts.js +2 -1
- package/dist/modules/manager/apm/artifacts.js.map +1 -1
- package/dist/modules/manager/bazel-module/artifacts.js +2 -1
- package/dist/modules/manager/bazel-module/artifacts.js.map +1 -1
- package/dist/modules/manager/bazelisk/artifacts.js +2 -1
- package/dist/modules/manager/bazelisk/artifacts.js.map +1 -1
- package/dist/modules/manager/bun/artifacts.js +2 -1
- package/dist/modules/manager/bun/artifacts.js.map +1 -1
- package/dist/modules/manager/bundler/artifacts.js +1 -1
- package/dist/modules/manager/bundler/artifacts.js.map +1 -1
- package/dist/modules/manager/bundler/common.js +11 -16
- package/dist/modules/manager/bundler/common.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +5 -3
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/artifacts.js +6 -7
- package/dist/modules/manager/composer/artifacts.js.map +1 -1
- package/dist/modules/manager/composer/utils.js +1 -10
- package/dist/modules/manager/composer/utils.js.map +1 -1
- package/dist/modules/manager/conan/artifacts.js +2 -1
- package/dist/modules/manager/conan/artifacts.js.map +1 -1
- package/dist/modules/manager/copier/artifacts.js +3 -3
- package/dist/modules/manager/copier/artifacts.js.map +1 -1
- package/dist/modules/manager/deno/artifacts.js +2 -1
- package/dist/modules/manager/deno/artifacts.js.map +1 -1
- package/dist/modules/manager/devbox/artifacts.js +8 -5
- package/dist/modules/manager/devbox/artifacts.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +34 -34
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/github-actions/artifacts.js +6 -4
- package/dist/modules/manager/github-actions/artifacts.js.map +1 -1
- package/dist/modules/manager/gleam/artifacts.js +2 -1
- package/dist/modules/manager/gleam/artifacts.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +8 -6
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/artifacts.js +2 -1
- package/dist/modules/manager/gradle/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/artifacts.js +2 -1
- package/dist/modules/manager/gradle-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/helmfile/artifacts.js +4 -3
- package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
- package/dist/modules/manager/helmv3/artifacts.js +2 -1
- package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
- package/dist/modules/manager/jsonnet-bundler/artifacts.js +2 -1
- package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
- package/dist/modules/manager/kustomize/artifacts.js +4 -2
- package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
- package/dist/modules/manager/kustomize/common.js +2 -2
- package/dist/modules/manager/kustomize/common.js.map +1 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js +2 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/artifacts.js +13 -11
- package/dist/modules/manager/mise/artifacts.js.map +1 -1
- package/dist/modules/manager/mix/artifacts.js +3 -2
- package/dist/modules/manager/mix/artifacts.js.map +1 -1
- package/dist/modules/manager/nix/artifacts.js +2 -1
- package/dist/modules/manager/nix/artifacts.js.map +1 -1
- package/dist/modules/manager/npm/artifacts.js +2 -1
- package/dist/modules/manager/npm/artifacts.js.map +1 -1
- package/dist/modules/manager/npm/post-update/node-version.js +2 -1
- package/dist/modules/manager/npm/post-update/node-version.js.map +1 -1
- package/dist/modules/manager/npm/post-update/npm.js +2 -1
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/pnpm.js +2 -1
- package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/yarn.js +5 -3
- package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
- package/dist/modules/manager/nuget/artifacts.js +2 -1
- package/dist/modules/manager/nuget/artifacts.js.map +1 -1
- package/dist/modules/manager/pep621/processors/pdm.js +3 -2
- package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
- package/dist/modules/manager/pep621/processors/pixi.js +4 -3
- package/dist/modules/manager/pep621/processors/pixi.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +3 -3
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pip-compile/common.js +14 -36
- package/dist/modules/manager/pip-compile/common.js.map +1 -1
- package/dist/modules/manager/pip_requirements/artifacts.js +3 -2
- package/dist/modules/manager/pip_requirements/artifacts.js.map +1 -1
- package/dist/modules/manager/pipenv/artifacts.js +3 -2
- package/dist/modules/manager/pipenv/artifacts.js.map +1 -1
- package/dist/modules/manager/pixi/artifacts.js +2 -1
- package/dist/modules/manager/pixi/artifacts.js.map +1 -1
- package/dist/modules/manager/poetry/artifacts.js +3 -2
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/pub/artifacts.js +11 -10
- package/dist/modules/manager/pub/artifacts.js.map +1 -1
- package/dist/modules/manager/types.d.ts +23 -3
- package/dist/modules/manager/util.js +28 -1
- package/dist/modules/manager/util.js.map +1 -1
- package/dist/modules/manager/vendir/artifacts.js +3 -2
- package/dist/modules/manager/vendir/artifacts.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +11 -4
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
- package/dist/modules/manager/copier/utils.js +0 -24
- package/dist/modules/manager/copier/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-version.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/node-version.ts"],"sourcesContent":["import semver from 'semver';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport type { ToolConstraint } from '../../../../util/exec/types.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport type { LazyPackageJson } from './types.ts';\n\nasync function getNodeFile(filename: string): Promise<string | null> {\n try {\n // TODO #22198\n const constraint = (await readLocalFile(filename, 'utf8'))!\n .split(newlineRegex)[0]\n .replace(regEx(/^v/), '');\n if (semver.validRange(constraint)) {\n logger.debug(`Using node constraint \"${constraint}\" from ${filename}`);\n return constraint;\n }\n } catch {\n // do nothing\n }\n return null;\n}\n\nasync function getPackageJsonConstraint(\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const pkgJson = await pkg.getValue();\n if (pkgJson.volta?.node) {\n const constraint = pkgJson.volta.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json volta`,\n );\n return constraint;\n }\n }\n if (pkgJson.engines?.node) {\n const constraint = pkgJson.engines.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json engines`,\n );\n return constraint;\n }\n }\n return null;\n}\n\n// export only for testing\nexport async function getNodeConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const constraint =\n getNodeUpdate(upgrades) ??\n config
|
|
1
|
+
{"version":3,"file":"node-version.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/node-version.ts"],"sourcesContent":["import semver from 'semver';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport type { ToolConstraint } from '../../../../util/exec/types.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport type { LazyPackageJson } from './types.ts';\n\nasync function getNodeFile(filename: string): Promise<string | null> {\n try {\n // TODO #22198\n const constraint = (await readLocalFile(filename, 'utf8'))!\n .split(newlineRegex)[0]\n .replace(regEx(/^v/), '');\n if (semver.validRange(constraint)) {\n logger.debug(`Using node constraint \"${constraint}\" from ${filename}`);\n return constraint;\n }\n } catch {\n // do nothing\n }\n return null;\n}\n\nasync function getPackageJsonConstraint(\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const pkgJson = await pkg.getValue();\n if (pkgJson.volta?.node) {\n const constraint = pkgJson.volta.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json volta`,\n );\n return constraint;\n }\n }\n if (pkgJson.engines?.node) {\n const constraint = pkgJson.engines.node;\n // v8 ignore else -- TODO: add test #40625\n if (semver.validRange(constraint)) {\n logger.debug(\n `Using node constraint \"${constraint}\" from package.json engines`,\n );\n return constraint;\n }\n }\n return null;\n}\n\n// export only for testing\nexport async function getNodeConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<string | null> {\n const constraint =\n getNodeUpdate(upgrades) ??\n (await resolveToolConstraint(\n config,\n 'node',\n async () =>\n (await getNodeFile(upath.join(lockFileDir, '.nvmrc'))) ??\n (await getNodeFile(upath.join(lockFileDir, '.node-version'))) ??\n (await getPackageJsonConstraint(pkg)),\n )) ??\n null;\n if (!constraint) {\n logger.debug('No node constraint found - using latest');\n }\n return constraint;\n}\n\nexport function getNodeUpdate(upgrades: Upgrade[]): string | undefined {\n return upgrades.find((u) => u.depName === 'node')?.newValue;\n}\n\nexport async function getNodeToolConstraint(\n config: Partial<PostUpdateConfig>,\n upgrades: Upgrade[],\n lockFileDir: string,\n pkg: LazyPackageJson,\n): Promise<ToolConstraint> {\n const constraint = await getNodeConstraint(\n config,\n upgrades,\n lockFileDir,\n pkg,\n );\n\n return {\n toolName: 'node',\n constraint,\n };\n}\n"],"mappings":";;;;;;;AAUA,eAAe,YAAY,UAA0C;CACnE,IAAI;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU,MAAM,EAAA,CACrD,MAAM,YAAY,CAAC,CAAC,EAAE,CACtB,QAAQ,MAAM,IAAI,GAAG,EAAE;EAC1B,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MAAM,0BAA0B,WAAW,SAAS,UAAU;GACrE,OAAO;EACT;CACF,QAAQ,CAER;CACA,OAAO;AACT;AAEA,eAAe,yBACb,KACwB;CACxB,MAAM,UAAU,MAAM,IAAI,SAAS;CACnC,IAAI,QAAQ,OAAO,MAAM;EACvB,MAAM,aAAa,QAAQ,MAAM;;EAEjC,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MACL,0BAA0B,WAAW,0BACvC;GACA,OAAO;EACT;CACF;CACA,IAAI,QAAQ,SAAS,MAAM;EACzB,MAAM,aAAa,QAAQ,QAAQ;;EAEnC,IAAI,OAAO,WAAW,UAAU,GAAG;GACjC,OAAO,MACL,0BAA0B,WAAW,4BACvC;GACA,OAAO;EACT;CACF;CACA,OAAO;AACT;AAGA,eAAsB,kBACpB,QACA,UACA,aACA,KACwB;CACxB,MAAM,aACJ,cAAc,QAAQ,KACrB,MAAM,sBACL,QACA,QACA,YACG,MAAM,YAAY,MAAM,KAAK,aAAa,QAAQ,CAAC,KACnD,MAAM,YAAY,MAAM,KAAK,aAAa,eAAe,CAAC,KAC1D,MAAM,yBAAyB,GAAG,CACvC,KACA;CACF,IAAI,CAAC,YACH,OAAO,MAAM,yCAAyC;CAExD,OAAO;AACT;AAEA,SAAgB,cAAc,UAAyC;CACrE,OAAO,SAAS,MAAM,MAAM,EAAE,YAAY,MAAM,CAAC,EAAE;AACrD;AAEA,eAAsB,sBACpB,QACA,UACA,aACA,KACyB;CAQzB,OAAO;EACL,UAAU;EACV,YAAA,MATuB,kBACvB,QACA,UACA,aACA,GACF;CAKA;AACF"}
|
|
@@ -8,6 +8,7 @@ import { trimSlashes } from "../../../../util/url.js";
|
|
|
8
8
|
import { deleteLocalFile, localPathExists, readLocalFile, renameLocalFile } from "../../../../util/fs/index.js";
|
|
9
9
|
import { Result } from "../../../../util/result.js";
|
|
10
10
|
import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
|
|
11
|
+
import { resolveToolConstraint } from "../../util.js";
|
|
11
12
|
import { getNodeToolConstraint } from "./node-version.js";
|
|
12
13
|
import { PackageLock } from "../schema.js";
|
|
13
14
|
import { composeLockFile, parseLockFile } from "../utils.js";
|
|
@@ -71,7 +72,7 @@ async function generateLockFile(lockFileDir, env, filename, config = {}, upgrade
|
|
|
71
72
|
const lazyPkgJson = lazyLoadPackageJson(lockFileDir);
|
|
72
73
|
const npmToolConstraint = {
|
|
73
74
|
toolName: "npm",
|
|
74
|
-
constraint: config
|
|
75
|
+
constraint: await resolveToolConstraint(config, "npm", async () => getPackageManagerVersion("npm", await lazyPkgJson.getValue()) ?? await getNpmConstraintFromPackageLock(lockFileDir, filename)) ?? null
|
|
75
76
|
};
|
|
76
77
|
const supportsPreferDedupeFlag = !npmToolConstraint.constraint || semver.intersects(">=7.0.0", npmToolConstraint.constraint);
|
|
77
78
|
let commands = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/npm.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyString, isNumber, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n} from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n localPathExists,\n readLocalFile,\n renameLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { minimatch } from '../../../../util/minimatch.ts';\nimport { toMs } from '../../../../util/pretty-time.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { trimSlashes } from '../../../../util/url.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { PackageLock } from '../schema.ts';\nimport { composeLockFile, parseLockFile } from '../utils.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, NpmrcCooldownResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport function parseNpmrcCooldownDate(\n npmrcContent: string | null,\n): NpmrcCooldownResult | null {\n if (!npmrcContent) {\n return null;\n }\n\n const parsed = ini.parse(npmrcContent);\n\n const before = parsed.before;\n if (isNonEmptyString(before)) {\n const dt = DateTime.fromISO(before, { zone: 'utc' });\n if (dt.isValid) {\n return { date: dt, source: 'before' };\n }\n logger.debug(`Invalid before date in .npmrc: ${before}, ignoring`);\n }\n\n const minReleaseAge = parsed['min-release-age'];\n if (isNonEmptyString(minReleaseAge)) {\n const days = parseInt(minReleaseAge, 10);\n if (isNumber(days) && days >= 0) {\n return {\n date: DateTime.now().minus({ days }).toUTC(),\n source: 'min-release-age',\n };\n }\n logger.debug(\n `Invalid min-release-age in .npmrc: ${minReleaseAge}, ignoring`,\n );\n }\n\n return null;\n}\n\nasync function getNpmConstraintFromPackageLock(\n lockFileDir: string,\n filename: string,\n): Promise<string | null> {\n const packageLockFileName = upath.join(lockFileDir, filename);\n const packageLockContents = await readLocalFile(packageLockFileName, 'utf8');\n const packageLockJson = Result.parse(\n packageLockContents,\n PackageLock,\n ).unwrapOrNull();\n if (!packageLockJson) {\n logger.debug(`Could not parse ${packageLockFileName}`);\n return null;\n }\n const { lockfileVersion } = packageLockJson;\n if (lockfileVersion === 1) {\n logger.debug(`Using npm constraint <7 for lockfileVersion=1`);\n return `<7`;\n }\n if (lockfileVersion === 2) {\n logger.debug(`Using npm constraint <9 for lockfileVersion=2`);\n return `<9`;\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n filename: string,\n config: Partial<PostUpdateConfig> = {},\n upgrades: Upgrade[] = [],\n npmrcContent: string | null = null,\n): Promise<GenerateLockFileResult> {\n // TODO: don't assume package-lock.json is in the same directory\n const lockFileName = upath.join(lockFileDir, filename);\n\n logger.debug(`Spawning npm install to create ${lockFileDir}/${filename}`);\n const { skipInstalls, postUpdateOptions } = config;\n\n let lockFile: string | null = null;\n let beforeFallback = false;\n try {\n const lazyPkgJson = lazyLoadPackageJson(lockFileDir);\n const npmToolConstraint: ToolConstraint = {\n toolName: 'npm',\n constraint:\n config.constraints?.npm ??\n getPackageManagerVersion('npm', await lazyPkgJson.getValue()) ??\n (await getNpmConstraintFromPackageLock(lockFileDir, filename)) ??\n null,\n };\n const supportsPreferDedupeFlag =\n !npmToolConstraint.constraint ||\n semver.intersects('>=7.0.0', npmToolConstraint.constraint);\n let commands: string[] = [];\n let cmdOptions = '';\n if (\n (postUpdateOptions?.includes('npmDedupe') === true &&\n !supportsPreferDedupeFlag) ||\n skipInstalls === false\n ) {\n logger.debug('Performing node_modules install');\n cmdOptions += '--no-audit';\n } else {\n logger.debug('Updating lock file only');\n cmdOptions += '--package-lock-only --no-audit';\n }\n\n if (postUpdateOptions?.includes('npmDedupe') && supportsPreferDedupeFlag) {\n logger.debug('Deduplicate dependencies on installation');\n cmdOptions += ' --prefer-dedupe';\n }\n\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n cmdOptions += ' --ignore-scripts';\n }\n\n let beforeFlag = '';\n if (config.minimumReleaseAge) {\n const ms = toMs(config.minimumReleaseAge);\n if (ms === null) {\n logger.debug(\n {\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Invalid minimumReleaseAge, skipping --before for npm install',\n );\n } else {\n const npmrcCooldown = parseNpmrcCooldownDate(npmrcContent);\n\n // npm rejects --before when min-release-age is set in .npmrc,\n // so let the .npmrc handle cooldown natively in that case\n if (npmrcCooldown?.source === 'min-release-age') {\n logger.debug(\n {\n npmrcMinReleaseAge: npmrcCooldown.date.toISO(),\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Skipping --before flag because .npmrc already contains min-release-age',\n );\n } else {\n let beforeDate = DateTime.now().minus(ms).toUTC();\n\n if (npmrcCooldown && npmrcCooldown.date < beforeDate) {\n logger.debug(\n {\n npmrcDate: npmrcCooldown.date.toISO(),\n beforeDate: beforeDate.toISO(),\n },\n 'Using stricter .npmrc cooldown date over minimumReleaseAge date',\n );\n beforeDate = npmrcCooldown.date;\n }\n\n const beforeISO = beforeDate.toISO();\n logger.debug(\n {\n beforeISO,\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Setting npm --before based on minimumReleaseAge',\n );\n beforeFlag = ` --before=${beforeISO}`;\n }\n }\n }\n\n const extraEnv: ExtraEnv = {\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n };\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPkgJson),\n ...(isNonEmptyString(npmToolConstraint.constraint)\n ? [npmToolConstraint]\n : []),\n ],\n docker: {},\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n if (!upgrades.every((upgrade) => upgrade.isLockfileUpdate)) {\n // This command updates the lock file based on package.json\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n // divide the deps in two categories: workspace and root\n const { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps } =\n divideWorkspaceAndRootDeps(lockFileDir, lockUpdates);\n\n if (workspaces.size && lockWorkspacesUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm-workspaces)');\n for (const workspace of workspaces) {\n const currentWorkspaceUpdates = lockWorkspacesUpdates\n .filter((update) => update.workspace === workspace)\n .map((update) => update.managerData?.packageKey)\n .filter((packageKey) => !rootDeps.has(packageKey));\n\n // v8 ignore else -- TODO: add test #40625\n if (currentWorkspaceUpdates.length) {\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} --workspace=${quote(workspace)} ${currentWorkspaceUpdates\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n }\n }\n\n if (lockRootUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm)');\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} ${lockRootUpdates\n .map((update) => update.managerData?.packageKey)\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n\n if (upgrades.some((upgrade) => upgrade.isRemediation)) {\n // We need to run twice to get the correct lock file\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // Lock file maintenance recreates the lock file from scratch, and a single\n // `npm install` can generate a lock file which is out of sync with\n // package.json, so we need to run the install a second time (#37531).\n // Skipped if `npmInstallTwice` is configured, as that doubles all install\n // commands already.\n if (\n upgrades.some((upgrade) => upgrade.isLockFileMaintenance) &&\n !postUpdateOptions?.includes('npmInstallTwice')\n ) {\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // postUpdateOptions\n if (\n config.postUpdateOptions?.includes('npmDedupe') &&\n !supportsPreferDedupeFlag\n ) {\n logger.debug('Performing npm dedupe after installation');\n commands.push('npm dedupe');\n }\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n try {\n await deleteLocalFile(lockFileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { err, lockFileName },\n 'Error removing `package-lock.json` for lock file maintenance',\n );\n }\n }\n\n if (postUpdateOptions?.includes('npmInstallTwice')) {\n logger.debug('Running npm install twice');\n // Run the install command twice to ensure the lock file is up to date\n // iterate through commands and if any command starts with `npm install`, add it again\n const existingCommands = [...commands];\n commands = [];\n for (const command of existingCommands) {\n commands.push(command);\n // v8 ignore else -- TODO: add test #40625\n if (command.startsWith('npm install')) {\n commands.push(command);\n }\n }\n }\n\n // Run the commands, retrying without --before on ETARGET if needed\n await exec(commands, execOptions).catch(async (err) => {\n if (beforeFlag && err.stderr?.includes('with a date before')) {\n logger.debug('npm --before caused ETARGET, retrying without --before');\n const commandsWithoutBefore = commands.map((cmd) =>\n cmd.replace(beforeFlag, ''),\n );\n beforeFallback = true;\n return exec(commandsWithoutBefore, execOptions);\n }\n throw err;\n });\n\n // massage to shrinkwrap if necessary\n if (\n filename === 'npm-shrinkwrap.json' &&\n (await localPathExists(upath.join(lockFileDir, 'package-lock.json')))\n ) {\n await renameLocalFile(\n upath.join(lockFileDir, 'package-lock.json'),\n upath.join(lockFileDir, 'npm-shrinkwrap.json'),\n );\n }\n\n // Read the result\n // TODO #22198\n lockFile = (await readLocalFile(\n upath.join(lockFileDir, filename),\n 'utf8',\n ))!;\n\n // Massage lockfile counterparts of package.json that were modified\n // because npm install was called with an explicit version for rangeStrategy=update-lockfile\n if (lockUpdates.length) {\n const { detectedIndent, lockFileParsed } = parseLockFile(lockFile);\n if (\n lockFileParsed?.lockfileVersion === 2 ||\n lockFileParsed?.lockfileVersion === 3\n ) {\n lockUpdates.forEach((lockUpdate) => {\n const depType = lockUpdate.depType as\n 'dependencies' | 'optionalDependencies';\n\n // TODO #22198\n // v8 ignore else -- TODO: add test #40625\n if (\n lockFileParsed.packages?.['']?.[depType]?.[lockUpdate.packageName!]\n ) {\n lockFileParsed.packages[''][depType][lockUpdate.packageName!] =\n lockUpdate.newValue!;\n }\n });\n lockFile = composeLockFile(lockFileParsed, detectedIndent);\n }\n }\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n err,\n type: 'npm',\n },\n 'lock file error',\n );\n // v8 ignore if -- TODO: add test #40625\n if (err.stderr?.includes('ENOSPC: no space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n return { error: true, stderr: err.stderr };\n }\n return { error: !lockFile, lockFile, beforeFallback };\n}\n\nexport function divideWorkspaceAndRootDeps(\n lockFileDir: string,\n lockUpdates: Upgrade[],\n): {\n lockRootUpdates: Upgrade[];\n lockWorkspacesUpdates: Upgrade[];\n workspaces: Set<string>;\n rootDeps: Set<string>;\n} {\n const lockRootUpdates: Upgrade[] = []; // stores all upgrades which are present in root package.json\n const lockWorkspacesUpdates: Upgrade[] = []; // stores all upgrades which are present in workspaces package.json\n const workspaces = new Set<string>(); // name of all workspaces\n const rootDeps = new Set<string>(); // packageName of all upgrades in root package.json (makes it check duplicate deps in root)\n\n // divide the deps in two categories: workspace and root\n for (const upgrade of lockUpdates) {\n upgrade.managerData ??= {};\n upgrade.managerData.packageKey = generatePackageKey(\n upgrade.packageName!,\n upgrade.newVersion!,\n );\n if (\n upgrade.managerData.workspacesPackages?.length &&\n isString(upgrade.packageFile)\n ) {\n const workspacePatterns = upgrade.managerData.workspacesPackages; // glob pattern or directory name/path\n const packageFileDir = trimSlashes(\n upgrade.packageFile.replace('package.json', ''),\n );\n\n // workspaceDir = packageFileDir - lockFileDir\n const workspaceDir = trimSlashes(\n packageFileDir.startsWith(lockFileDir)\n ? packageFileDir.slice(lockFileDir.length)\n : packageFileDir,\n );\n\n if (isNonEmptyString(workspaceDir)) {\n let workspaceName: string | undefined;\n // compare workspaceDir to workspace patterns\n // stop when the first match is found and\n // add workspaceDir to workspaces set and upgrade object\n for (const workspacePattern of workspacePatterns) {\n const massagedPattern = (workspacePattern as string).replace(\n regEx(/^\\.\\//),\n '',\n );\n if (minimatch(massagedPattern).match(workspaceDir)) {\n workspaceName = workspaceDir;\n break;\n }\n }\n if (workspaceName) {\n // v8 ignore else -- TODO: add test #40625\n if (\n !rootDeps.has(upgrade.managerData.packageKey) // prevent same dep from existing in root and workspace\n ) {\n workspaces.add(workspaceName);\n upgrade.workspace = workspaceName;\n lockWorkspacesUpdates.push(upgrade);\n }\n } else {\n logger.warn(\n { workspacePatterns, workspaceDir },\n 'workspaceDir not found',\n );\n }\n continue;\n }\n }\n lockRootUpdates.push(upgrade);\n rootDeps.add(upgrade.managerData.packageKey);\n }\n\n return { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps };\n}\n\nfunction generatePackageKey(packageName: string, version: string): string {\n return `${packageName}@${version}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"npm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/npm.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyString, isNumber, isString } from '@sindresorhus/is';\nimport ini from 'ini';\nimport { DateTime } from 'luxon';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n} from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n localPathExists,\n readLocalFile,\n renameLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { minimatch } from '../../../../util/minimatch.ts';\nimport { toMs } from '../../../../util/pretty-time.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { trimSlashes } from '../../../../util/url.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { PackageLock } from '../schema.ts';\nimport { composeLockFile, parseLockFile } from '../utils.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, NpmrcCooldownResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport function parseNpmrcCooldownDate(\n npmrcContent: string | null,\n): NpmrcCooldownResult | null {\n if (!npmrcContent) {\n return null;\n }\n\n const parsed = ini.parse(npmrcContent);\n\n const before = parsed.before;\n if (isNonEmptyString(before)) {\n const dt = DateTime.fromISO(before, { zone: 'utc' });\n if (dt.isValid) {\n return { date: dt, source: 'before' };\n }\n logger.debug(`Invalid before date in .npmrc: ${before}, ignoring`);\n }\n\n const minReleaseAge = parsed['min-release-age'];\n if (isNonEmptyString(minReleaseAge)) {\n const days = parseInt(minReleaseAge, 10);\n if (isNumber(days) && days >= 0) {\n return {\n date: DateTime.now().minus({ days }).toUTC(),\n source: 'min-release-age',\n };\n }\n logger.debug(\n `Invalid min-release-age in .npmrc: ${minReleaseAge}, ignoring`,\n );\n }\n\n return null;\n}\n\nasync function getNpmConstraintFromPackageLock(\n lockFileDir: string,\n filename: string,\n): Promise<string | null> {\n const packageLockFileName = upath.join(lockFileDir, filename);\n const packageLockContents = await readLocalFile(packageLockFileName, 'utf8');\n const packageLockJson = Result.parse(\n packageLockContents,\n PackageLock,\n ).unwrapOrNull();\n if (!packageLockJson) {\n logger.debug(`Could not parse ${packageLockFileName}`);\n return null;\n }\n const { lockfileVersion } = packageLockJson;\n if (lockfileVersion === 1) {\n logger.debug(`Using npm constraint <7 for lockfileVersion=1`);\n return `<7`;\n }\n if (lockfileVersion === 2) {\n logger.debug(`Using npm constraint <9 for lockfileVersion=2`);\n return `<9`;\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n filename: string,\n config: Partial<PostUpdateConfig> = {},\n upgrades: Upgrade[] = [],\n npmrcContent: string | null = null,\n): Promise<GenerateLockFileResult> {\n // TODO: don't assume package-lock.json is in the same directory\n const lockFileName = upath.join(lockFileDir, filename);\n\n logger.debug(`Spawning npm install to create ${lockFileDir}/${filename}`);\n const { skipInstalls, postUpdateOptions } = config;\n\n let lockFile: string | null = null;\n let beforeFallback = false;\n try {\n const lazyPkgJson = lazyLoadPackageJson(lockFileDir);\n const npmToolConstraint: ToolConstraint = {\n toolName: 'npm',\n constraint:\n (await resolveToolConstraint(\n config,\n 'npm',\n async () =>\n getPackageManagerVersion('npm', await lazyPkgJson.getValue()) ??\n (await getNpmConstraintFromPackageLock(lockFileDir, filename)),\n )) ?? null,\n };\n const supportsPreferDedupeFlag =\n !npmToolConstraint.constraint ||\n semver.intersects('>=7.0.0', npmToolConstraint.constraint);\n let commands: string[] = [];\n let cmdOptions = '';\n if (\n (postUpdateOptions?.includes('npmDedupe') === true &&\n !supportsPreferDedupeFlag) ||\n skipInstalls === false\n ) {\n logger.debug('Performing node_modules install');\n cmdOptions += '--no-audit';\n } else {\n logger.debug('Updating lock file only');\n cmdOptions += '--package-lock-only --no-audit';\n }\n\n if (postUpdateOptions?.includes('npmDedupe') && supportsPreferDedupeFlag) {\n logger.debug('Deduplicate dependencies on installation');\n cmdOptions += ' --prefer-dedupe';\n }\n\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n cmdOptions += ' --ignore-scripts';\n }\n\n let beforeFlag = '';\n if (config.minimumReleaseAge) {\n const ms = toMs(config.minimumReleaseAge);\n if (ms === null) {\n logger.debug(\n {\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Invalid minimumReleaseAge, skipping --before for npm install',\n );\n } else {\n const npmrcCooldown = parseNpmrcCooldownDate(npmrcContent);\n\n // npm rejects --before when min-release-age is set in .npmrc,\n // so let the .npmrc handle cooldown natively in that case\n if (npmrcCooldown?.source === 'min-release-age') {\n logger.debug(\n {\n npmrcMinReleaseAge: npmrcCooldown.date.toISO(),\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Skipping --before flag because .npmrc already contains min-release-age',\n );\n } else {\n let beforeDate = DateTime.now().minus(ms).toUTC();\n\n if (npmrcCooldown && npmrcCooldown.date < beforeDate) {\n logger.debug(\n {\n npmrcDate: npmrcCooldown.date.toISO(),\n beforeDate: beforeDate.toISO(),\n },\n 'Using stricter .npmrc cooldown date over minimumReleaseAge date',\n );\n beforeDate = npmrcCooldown.date;\n }\n\n const beforeISO = beforeDate.toISO();\n logger.debug(\n {\n beforeISO,\n minimumReleaseAge: config.minimumReleaseAge,\n },\n 'Setting npm --before based on minimumReleaseAge',\n );\n beforeFlag = ` --before=${beforeISO}`;\n }\n }\n }\n\n const extraEnv: ExtraEnv = {\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n };\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPkgJson),\n ...(isNonEmptyString(npmToolConstraint.constraint)\n ? [npmToolConstraint]\n : []),\n ],\n docker: {},\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n if (!upgrades.every((upgrade) => upgrade.isLockfileUpdate)) {\n // This command updates the lock file based on package.json\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n // divide the deps in two categories: workspace and root\n const { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps } =\n divideWorkspaceAndRootDeps(lockFileDir, lockUpdates);\n\n if (workspaces.size && lockWorkspacesUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm-workspaces)');\n for (const workspace of workspaces) {\n const currentWorkspaceUpdates = lockWorkspacesUpdates\n .filter((update) => update.workspace === workspace)\n .map((update) => update.managerData?.packageKey)\n .filter((packageKey) => !rootDeps.has(packageKey));\n\n // v8 ignore else -- TODO: add test #40625\n if (currentWorkspaceUpdates.length) {\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} --workspace=${quote(workspace)} ${currentWorkspaceUpdates\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n }\n }\n\n if (lockRootUpdates.length) {\n logger.debug('Performing lockfileUpdate (npm)');\n const updateCmd = `npm install ${cmdOptions}${beforeFlag} ${lockRootUpdates\n .map((update) => update.managerData?.packageKey)\n .map(quote)\n .join(' ')}`;\n commands.push(updateCmd);\n }\n\n if (upgrades.some((upgrade) => upgrade.isRemediation)) {\n // We need to run twice to get the correct lock file\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // Lock file maintenance recreates the lock file from scratch, and a single\n // `npm install` can generate a lock file which is out of sync with\n // package.json, so we need to run the install a second time (#37531).\n // Skipped if `npmInstallTwice` is configured, as that doubles all install\n // commands already.\n if (\n upgrades.some((upgrade) => upgrade.isLockFileMaintenance) &&\n !postUpdateOptions?.includes('npmInstallTwice')\n ) {\n commands.push(`npm install ${cmdOptions}${beforeFlag}`.trim());\n }\n\n // postUpdateOptions\n if (\n config.postUpdateOptions?.includes('npmDedupe') &&\n !supportsPreferDedupeFlag\n ) {\n logger.debug('Performing npm dedupe after installation');\n commands.push('npm dedupe');\n }\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n try {\n await deleteLocalFile(lockFileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { err, lockFileName },\n 'Error removing `package-lock.json` for lock file maintenance',\n );\n }\n }\n\n if (postUpdateOptions?.includes('npmInstallTwice')) {\n logger.debug('Running npm install twice');\n // Run the install command twice to ensure the lock file is up to date\n // iterate through commands and if any command starts with `npm install`, add it again\n const existingCommands = [...commands];\n commands = [];\n for (const command of existingCommands) {\n commands.push(command);\n // v8 ignore else -- TODO: add test #40625\n if (command.startsWith('npm install')) {\n commands.push(command);\n }\n }\n }\n\n // Run the commands, retrying without --before on ETARGET if needed\n await exec(commands, execOptions).catch(async (err) => {\n if (beforeFlag && err.stderr?.includes('with a date before')) {\n logger.debug('npm --before caused ETARGET, retrying without --before');\n const commandsWithoutBefore = commands.map((cmd) =>\n cmd.replace(beforeFlag, ''),\n );\n beforeFallback = true;\n return exec(commandsWithoutBefore, execOptions);\n }\n throw err;\n });\n\n // massage to shrinkwrap if necessary\n if (\n filename === 'npm-shrinkwrap.json' &&\n (await localPathExists(upath.join(lockFileDir, 'package-lock.json')))\n ) {\n await renameLocalFile(\n upath.join(lockFileDir, 'package-lock.json'),\n upath.join(lockFileDir, 'npm-shrinkwrap.json'),\n );\n }\n\n // Read the result\n // TODO #22198\n lockFile = (await readLocalFile(\n upath.join(lockFileDir, filename),\n 'utf8',\n ))!;\n\n // Massage lockfile counterparts of package.json that were modified\n // because npm install was called with an explicit version for rangeStrategy=update-lockfile\n if (lockUpdates.length) {\n const { detectedIndent, lockFileParsed } = parseLockFile(lockFile);\n if (\n lockFileParsed?.lockfileVersion === 2 ||\n lockFileParsed?.lockfileVersion === 3\n ) {\n lockUpdates.forEach((lockUpdate) => {\n const depType = lockUpdate.depType as\n 'dependencies' | 'optionalDependencies';\n\n // TODO #22198\n // v8 ignore else -- TODO: add test #40625\n if (\n lockFileParsed.packages?.['']?.[depType]?.[lockUpdate.packageName!]\n ) {\n lockFileParsed.packages[''][depType][lockUpdate.packageName!] =\n lockUpdate.newValue!;\n }\n });\n lockFile = composeLockFile(lockFileParsed, detectedIndent);\n }\n }\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n err,\n type: 'npm',\n },\n 'lock file error',\n );\n // v8 ignore if -- TODO: add test #40625\n if (err.stderr?.includes('ENOSPC: no space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n return { error: true, stderr: err.stderr };\n }\n return { error: !lockFile, lockFile, beforeFallback };\n}\n\nexport function divideWorkspaceAndRootDeps(\n lockFileDir: string,\n lockUpdates: Upgrade[],\n): {\n lockRootUpdates: Upgrade[];\n lockWorkspacesUpdates: Upgrade[];\n workspaces: Set<string>;\n rootDeps: Set<string>;\n} {\n const lockRootUpdates: Upgrade[] = []; // stores all upgrades which are present in root package.json\n const lockWorkspacesUpdates: Upgrade[] = []; // stores all upgrades which are present in workspaces package.json\n const workspaces = new Set<string>(); // name of all workspaces\n const rootDeps = new Set<string>(); // packageName of all upgrades in root package.json (makes it check duplicate deps in root)\n\n // divide the deps in two categories: workspace and root\n for (const upgrade of lockUpdates) {\n upgrade.managerData ??= {};\n upgrade.managerData.packageKey = generatePackageKey(\n upgrade.packageName!,\n upgrade.newVersion!,\n );\n if (\n upgrade.managerData.workspacesPackages?.length &&\n isString(upgrade.packageFile)\n ) {\n const workspacePatterns = upgrade.managerData.workspacesPackages; // glob pattern or directory name/path\n const packageFileDir = trimSlashes(\n upgrade.packageFile.replace('package.json', ''),\n );\n\n // workspaceDir = packageFileDir - lockFileDir\n const workspaceDir = trimSlashes(\n packageFileDir.startsWith(lockFileDir)\n ? packageFileDir.slice(lockFileDir.length)\n : packageFileDir,\n );\n\n if (isNonEmptyString(workspaceDir)) {\n let workspaceName: string | undefined;\n // compare workspaceDir to workspace patterns\n // stop when the first match is found and\n // add workspaceDir to workspaces set and upgrade object\n for (const workspacePattern of workspacePatterns) {\n const massagedPattern = (workspacePattern as string).replace(\n regEx(/^\\.\\//),\n '',\n );\n if (minimatch(massagedPattern).match(workspaceDir)) {\n workspaceName = workspaceDir;\n break;\n }\n }\n if (workspaceName) {\n // v8 ignore else -- TODO: add test #40625\n if (\n !rootDeps.has(upgrade.managerData.packageKey) // prevent same dep from existing in root and workspace\n ) {\n workspaces.add(workspaceName);\n upgrade.workspace = workspaceName;\n lockWorkspacesUpdates.push(upgrade);\n }\n } else {\n logger.warn(\n { workspacePatterns, workspaceDir },\n 'workspaceDir not found',\n );\n }\n continue;\n }\n }\n lockRootUpdates.push(upgrade);\n rootDeps.add(upgrade.managerData.packageKey);\n }\n\n return { lockRootUpdates, lockWorkspacesUpdates, workspaces, rootDeps };\n}\n\nfunction generatePackageKey(packageName: string, version: string): string {\n return `${packageName}@${version}`;\n}\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { logger } from "../../../../logger/index.js";
|
|
|
5
5
|
import { parseSingleYaml } from "../../../../util/yaml.js";
|
|
6
6
|
import { deleteLocalFile, ensureCacheDir, getSiblingFileName, localPathExists, readLocalFile } from "../../../../util/fs/index.js";
|
|
7
7
|
import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
|
|
8
|
+
import { resolveToolConstraint } from "../../util.js";
|
|
8
9
|
import { PNPM_CACHE_DIR, PNPM_STORE_DIR } from "../constants.js";
|
|
9
10
|
import { getNodeToolConstraint } from "./node-version.js";
|
|
10
11
|
import { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
|
|
@@ -25,7 +26,7 @@ async function generateLockFile(lockFileDir, env, config, upgrades = []) {
|
|
|
25
26
|
const lazyPgkJson = lazyLoadPackageJson(lockFileDir);
|
|
26
27
|
const pnpmToolConstraint = {
|
|
27
28
|
toolName: "pnpm",
|
|
28
|
-
constraint: getPnpmConstraintFromUpgrades(upgrades) ?? config
|
|
29
|
+
constraint: getPnpmConstraintFromUpgrades(upgrades) ?? await resolveToolConstraint(config, "pnpm", async () => getPackageManagerVersion("pnpm", await lazyPgkJson.getValue()) ?? await getConstraintFromLockFile(lockFileName))
|
|
29
30
|
};
|
|
30
31
|
const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);
|
|
31
32
|
const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/pnpm.ts"],"sourcesContent":["import { isNumber, isNumericString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n ensureCacheDir,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { PNPM_CACHE_DIR, PNPM_STORE_DIR } from '../constants.ts';\nimport type { PnpmWorkspaceFile } from '../extract/types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, PnpmLockFile } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nfunction getPnpmConstraintFromUpgrades(upgrades: Upgrade[]): string | null {\n for (const upgrade of upgrades) {\n if (upgrade.depName === 'pnpm' && upgrade.newVersion) {\n return upgrade.newVersion;\n }\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: PostUpdateConfig,\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'pnpm-lock.yaml');\n logger.debug(`Spawning pnpm install to create ${lockFileName}`);\n let lockFile: string | null = null;\n const commands: string[] = [];\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const pnpmToolConstraint: ToolConstraint = {\n toolName: 'pnpm',\n constraint:\n getPnpmConstraintFromUpgrades(upgrades) ?? // if pnpm is being upgraded, it comes first\n config.constraints?.pnpm ?? // from user config or extraction\n getPackageManagerVersion('pnpm', await lazyPgkJson.getValue()) ?? // look in package.json > packageManager or engines\n (await getConstraintFromLockFile(lockFileName)), // use lockfileVersion to find pnpm version range\n };\n\n const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);\n const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);\n const extraEnv: ExtraEnv = {\n // those arwe no longer working and it's unclear if they ever worked\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n // these are used by pnpm v5 to v10. Maybe earlier versions too\n npm_config_cache_dir: pnpmConfigCacheDir,\n npm_config_store_dir: pnpmConfigStoreDir,\n // pnpm stops reading npm_config_* env vars since v11\n pnpm_config_cache_dir: pnpmConfigCacheDir,\n pnpm_config_store_dir: pnpmConfigStoreDir,\n };\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n docker: {},\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n pnpmToolConstraint,\n ],\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n const pnpmWorkspaceFilePath = getSiblingFileName(\n lockFileName,\n 'pnpm-workspace.yaml',\n );\n\n let args = '--lockfile-only';\n\n // If it's not a workspaces project/monorepo, but single project with unrelated other npm project in source tree (for example, a git submodule),\n // `--recursive` will install un-wanted project.\n // we should avoid this.\n if (await localPathExists(pnpmWorkspaceFilePath)) {\n const pnpmWorkspace = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(pnpmWorkspaceFilePath, 'utf8'))!,\n );\n if (pnpmWorkspace?.packages?.length) {\n logger.debug(\n `Found pnpm workspace with ${pnpmWorkspace.packages.length} package definitions`,\n );\n // we are in a monorepo, 'pnpm update' needs the '--recursive' flag contrary to 'pnpm install'\n args += ' --recursive';\n }\n }\n if (!GlobalConfig.get('allowScripts')) {\n // If the admin disallows scripts, then neither scripts nor the pnpmfile should be run\n args += ' --ignore-scripts';\n args += ' --ignore-pnpmfile';\n } else if (config.ignoreScripts) {\n // If the admin allows scripts then always allow the pnpmfile\n args += ' --ignore-scripts';\n }\n\n logger.trace({ args }, 'pnpm command options');\n\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n if (lockUpdates.length !== upgrades.length) {\n // This command updates the lock file based on package.json.\n // Pass `--no-frozen-lockfile` to ensure the lockfile is updated\n commands.push(`pnpm install ${args} --no-frozen-lockfile`);\n }\n\n // rangeStrategy = update-lockfile\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (pnpm)');\n commands.push(\n `pnpm update --no-save ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.packageName!}@${update.newVersion!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')} ${args}`,\n );\n }\n\n // postUpdateOptions\n if (config.postUpdateOptions?.includes('pnpmDedupe')) {\n commands.push(`pnpm dedupe ${args.replace(' --recursive', '')}`);\n }\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n try {\n await deleteLocalFile(lockFileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { err, lockFileName },\n 'Error removing `pnpm-lock.yaml` for lock file maintenance',\n );\n }\n }\n\n await exec(commands, execOptions);\n lockFile = await readLocalFile(lockFileName, 'utf8');\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n commands,\n err,\n stdout: err.stdout,\n stderr: err.stderr,\n type: 'pnpm',\n },\n 'lock file error',\n );\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport async function getConstraintFromLockFile(\n lockFileName: string,\n): Promise<string | null> {\n let constraint: string | null = null;\n try {\n const lockfileContent = await readLocalFile(lockFileName, 'utf8');\n if (!lockfileContent) {\n logger.trace(`Empty pnpm lock file: ${lockFileName}`);\n return null;\n }\n // TODO: use schema (#9610)\n const pnpmLock = parseSingleYaml<PnpmLockFile>(lockfileContent);\n if (\n !isNumber(pnpmLock?.lockfileVersion) &&\n !isNumericString(pnpmLock?.lockfileVersion)\n ) {\n logger.trace(`Invalid pnpm lockfile version: ${lockFileName}`);\n return null;\n }\n // find matching lockfileVersion and use its constraints\n // if no match found use lockfileVersion 5\n // lockfileVersion 5 is the minimum version required to generate the pnpm-lock.yaml file\n const { lowerConstraint, upperConstraint } = lockToPnpmVersionMapping.find(\n (m) => m.lockfileVersion === pnpmLock.lockfileVersion,\n ) ?? {\n lockfileVersion: 5.0,\n lowerConstraint: '>=3',\n upperConstraint: '<3.5.0',\n };\n constraint = lowerConstraint;\n if (upperConstraint) {\n constraint += ` ${upperConstraint}`;\n }\n } catch (err) {\n logger.warn({ err }, 'Error getting pnpm constraints from lock file');\n }\n return constraint;\n}\n\n/**\n * pnpm lockfiles have corresponding version numbers called \"lockfileVersion\"\n * each lockfileVersion can only be generated by a certain pnpm version range\n * eg. lockfileVersion: 5.4 can only be generated by pnpm version >=7 && <8\n * official list can be found here : https://github.com/pnpm/spec/tree/master/lockfile\n * we use the mapping present below to find the compatible pnpm version range for a given lockfileVersion\n *\n * the various terms used in the mapping are explained below:\n * lowerConstraint : lowest pnpm version that can generate the lockfileVersion\n * upperConstraint : highest pnpm version that can generate the lockfileVersion\n * lowerBound : highest pnpm version that is less than the lowerConstraint\n * upperBound : lowest pnpm version that is greater than the upperConstraint\n *\n * To handle future lockfileVersions, we need to:\n * 1. add a upperBound and upperConstraint to the current latest lockfileVersion\n * 2. add an object for the new lockfileVersion with lowerBound and lowerConstraint\n *\n * lockfileVersion from v6 on are strings\n */\nconst lockToPnpmVersionMapping: LockToPnpmVersionMapping[] = [\n { lockfileVersion: '9.0', lowerConstraint: '>=9' },\n {\n lockfileVersion: '6.0',\n lowerConstraint: '>=7.24.2',\n upperConstraint: '<9',\n },\n {\n lockfileVersion: 5.4,\n lowerConstraint: '>=7',\n upperConstraint: '<8',\n },\n {\n lockfileVersion: 5.3,\n lowerConstraint: '>=6',\n upperConstraint: '<7',\n },\n {\n lockfileVersion: 5.2,\n lowerConstraint: '>=5.10.0',\n upperConstraint: '<6',\n },\n {\n lockfileVersion: 5.1,\n lowerConstraint: '>=3.5.0',\n upperConstraint: '<5.9.3',\n },\n];\n\ninterface LockToPnpmVersionMapping {\n lockfileVersion: string | number;\n lowerConstraint: string;\n upperConstraint?: string;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pnpm.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/pnpm.ts"],"sourcesContent":["import { isNumber, isNumericString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n deleteLocalFile,\n ensureCacheDir,\n getSiblingFileName,\n localPathExists,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { parseSingleYaml } from '../../../../util/yaml.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { PNPM_CACHE_DIR, PNPM_STORE_DIR } from '../constants.ts';\nimport type { PnpmWorkspaceFile } from '../extract/types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult, PnpmLockFile } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nfunction getPnpmConstraintFromUpgrades(upgrades: Upgrade[]): string | null {\n for (const upgrade of upgrades) {\n if (upgrade.depName === 'pnpm' && upgrade.newVersion) {\n return upgrade.newVersion;\n }\n }\n return null;\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: PostUpdateConfig,\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'pnpm-lock.yaml');\n logger.debug(`Spawning pnpm install to create ${lockFileName}`);\n let lockFile: string | null = null;\n const commands: string[] = [];\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const pnpmToolConstraint: ToolConstraint = {\n toolName: 'pnpm',\n constraint:\n getPnpmConstraintFromUpgrades(upgrades) ?? // if pnpm is being upgraded, it comes first\n (await resolveToolConstraint(\n config,\n 'pnpm',\n async () =>\n getPackageManagerVersion('pnpm', await lazyPgkJson.getValue()) ?? // look in package.json > packageManager or engines\n (await getConstraintFromLockFile(lockFileName)), // use lockfileVersion to find pnpm version range\n )),\n };\n\n const pnpmConfigCacheDir = await ensureCacheDir(PNPM_CACHE_DIR);\n const pnpmConfigStoreDir = await ensureCacheDir(PNPM_STORE_DIR);\n const extraEnv: ExtraEnv = {\n // those arwe no longer working and it's unclear if they ever worked\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n // these are used by pnpm v5 to v10. Maybe earlier versions too\n npm_config_cache_dir: pnpmConfigCacheDir,\n npm_config_store_dir: pnpmConfigStoreDir,\n // pnpm stops reading npm_config_* env vars since v11\n pnpm_config_cache_dir: pnpmConfigCacheDir,\n pnpm_config_store_dir: pnpmConfigStoreDir,\n };\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n docker: {},\n toolConstraints: [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n pnpmToolConstraint,\n ],\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n const pnpmWorkspaceFilePath = getSiblingFileName(\n lockFileName,\n 'pnpm-workspace.yaml',\n );\n\n let args = '--lockfile-only';\n\n // If it's not a workspaces project/monorepo, but single project with unrelated other npm project in source tree (for example, a git submodule),\n // `--recursive` will install un-wanted project.\n // we should avoid this.\n if (await localPathExists(pnpmWorkspaceFilePath)) {\n const pnpmWorkspace = parseSingleYaml<PnpmWorkspaceFile>(\n (await readLocalFile(pnpmWorkspaceFilePath, 'utf8'))!,\n );\n if (pnpmWorkspace?.packages?.length) {\n logger.debug(\n `Found pnpm workspace with ${pnpmWorkspace.packages.length} package definitions`,\n );\n // we are in a monorepo, 'pnpm update' needs the '--recursive' flag contrary to 'pnpm install'\n args += ' --recursive';\n }\n }\n if (!GlobalConfig.get('allowScripts')) {\n // If the admin disallows scripts, then neither scripts nor the pnpmfile should be run\n args += ' --ignore-scripts';\n args += ' --ignore-pnpmfile';\n } else if (config.ignoreScripts) {\n // If the admin allows scripts then always allow the pnpmfile\n args += ' --ignore-scripts';\n }\n\n logger.trace({ args }, 'pnpm command options');\n\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n\n if (lockUpdates.length !== upgrades.length) {\n // This command updates the lock file based on package.json.\n // Pass `--no-frozen-lockfile` to ensure the lockfile is updated\n commands.push(`pnpm install ${args} --no-frozen-lockfile`);\n }\n\n // rangeStrategy = update-lockfile\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (pnpm)');\n commands.push(\n `pnpm update --no-save ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.packageName!}@${update.newVersion!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')} ${args}`,\n );\n }\n\n // postUpdateOptions\n if (config.postUpdateOptions?.includes('pnpmDedupe')) {\n commands.push(`pnpm dedupe ${args.replace(' --recursive', '')}`);\n }\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n try {\n await deleteLocalFile(lockFileName);\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.debug(\n { err, lockFileName },\n 'Error removing `pnpm-lock.yaml` for lock file maintenance',\n );\n }\n }\n\n await exec(commands, execOptions);\n lockFile = await readLocalFile(lockFileName, 'utf8');\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n commands,\n err,\n stdout: err.stdout,\n stderr: err.stderr,\n type: 'pnpm',\n },\n 'lock file error',\n );\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport async function getConstraintFromLockFile(\n lockFileName: string,\n): Promise<string | null> {\n let constraint: string | null = null;\n try {\n const lockfileContent = await readLocalFile(lockFileName, 'utf8');\n if (!lockfileContent) {\n logger.trace(`Empty pnpm lock file: ${lockFileName}`);\n return null;\n }\n // TODO: use schema (#9610)\n const pnpmLock = parseSingleYaml<PnpmLockFile>(lockfileContent);\n if (\n !isNumber(pnpmLock?.lockfileVersion) &&\n !isNumericString(pnpmLock?.lockfileVersion)\n ) {\n logger.trace(`Invalid pnpm lockfile version: ${lockFileName}`);\n return null;\n }\n // find matching lockfileVersion and use its constraints\n // if no match found use lockfileVersion 5\n // lockfileVersion 5 is the minimum version required to generate the pnpm-lock.yaml file\n const { lowerConstraint, upperConstraint } = lockToPnpmVersionMapping.find(\n (m) => m.lockfileVersion === pnpmLock.lockfileVersion,\n ) ?? {\n lockfileVersion: 5.0,\n lowerConstraint: '>=3',\n upperConstraint: '<3.5.0',\n };\n constraint = lowerConstraint;\n if (upperConstraint) {\n constraint += ` ${upperConstraint}`;\n }\n } catch (err) {\n logger.warn({ err }, 'Error getting pnpm constraints from lock file');\n }\n return constraint;\n}\n\n/**\n * pnpm lockfiles have corresponding version numbers called \"lockfileVersion\"\n * each lockfileVersion can only be generated by a certain pnpm version range\n * eg. lockfileVersion: 5.4 can only be generated by pnpm version >=7 && <8\n * official list can be found here : https://github.com/pnpm/spec/tree/master/lockfile\n * we use the mapping present below to find the compatible pnpm version range for a given lockfileVersion\n *\n * the various terms used in the mapping are explained below:\n * lowerConstraint : lowest pnpm version that can generate the lockfileVersion\n * upperConstraint : highest pnpm version that can generate the lockfileVersion\n * lowerBound : highest pnpm version that is less than the lowerConstraint\n * upperBound : lowest pnpm version that is greater than the upperConstraint\n *\n * To handle future lockfileVersions, we need to:\n * 1. add a upperBound and upperConstraint to the current latest lockfileVersion\n * 2. add an object for the new lockfileVersion with lowerBound and lowerConstraint\n *\n * lockfileVersion from v6 on are strings\n */\nconst lockToPnpmVersionMapping: LockToPnpmVersionMapping[] = [\n { lockfileVersion: '9.0', lowerConstraint: '>=9' },\n {\n lockfileVersion: '6.0',\n lowerConstraint: '>=7.24.2',\n upperConstraint: '<9',\n },\n {\n lockfileVersion: 5.4,\n lowerConstraint: '>=7',\n upperConstraint: '<8',\n },\n {\n lockfileVersion: 5.3,\n lowerConstraint: '>=6',\n upperConstraint: '<7',\n },\n {\n lockfileVersion: 5.2,\n lowerConstraint: '>=5.10.0',\n upperConstraint: '<6',\n },\n {\n lockfileVersion: 5.1,\n lowerConstraint: '>=3.5.0',\n upperConstraint: '<5.9.3',\n },\n];\n\ninterface LockToPnpmVersionMapping {\n lockfileVersion: string | number;\n lowerConstraint: string;\n upperConstraint?: string;\n}\n"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { ExternalHostError } from "../../../../types/errors/external-host-error.
|
|
|
9
9
|
import { localPathIsFile, readLocalFile, writeLocalFile } from "../../../../util/fs/index.js";
|
|
10
10
|
import { exec, getToolSettingsOptions } from "../../../../util/exec/index.js";
|
|
11
11
|
import { NpmDatasource } from "../../../datasource/npm/index.js";
|
|
12
|
+
import { resolveToolConstraint } from "../../util.js";
|
|
12
13
|
import { getNodeToolConstraint } from "./node-version.js";
|
|
13
14
|
import { getNodeOptions, getPackageManagerVersion, lazyLoadPackageJson } from "./utils.js";
|
|
14
15
|
import { getYarnLock, getYarnVersionFromLock } from "../extract/yarn.js";
|
|
@@ -63,8 +64,9 @@ async function generateLockFile(lockFileDir, env, config = {}, upgrades = []) {
|
|
|
63
64
|
const lazyPgkJson = lazyLoadPackageJson(lockFileDir);
|
|
64
65
|
const toolConstraints = [await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson)];
|
|
65
66
|
const yarnUpdate = upgrades.find(isYarnUpdate);
|
|
66
|
-
const yarnCompatibility =
|
|
67
|
-
const
|
|
67
|
+
const yarnCompatibility = yarnUpdate?.newValue ?? await resolveToolConstraint(config, "yarn", async () => getPackageManagerVersion("yarn", await lazyPgkJson.getValue()) ?? getYarnVersionFromLock(await getYarnLock(lockFileName)));
|
|
68
|
+
const yarnRange = semver.validRange(yarnCompatibility);
|
|
69
|
+
const minYarnVersion = yarnRange && semver.minVersion(yarnRange);
|
|
68
70
|
const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;
|
|
69
71
|
const isYarnDedupeAvailable = minYarnVersion && semver.gte(minYarnVersion, "2.2.0");
|
|
70
72
|
const isYarnModeAvailable = minYarnVersion && semver.gte(minYarnVersion, "3.0.0");
|
|
@@ -75,7 +77,7 @@ async function generateLockFile(lockFileDir, env, config = {}, upgrades = []) {
|
|
|
75
77
|
const hasPackageManager = !!config.managerData?.hasPackageManager || !!upgrades[0]?.managerData?.hasPackageManager;
|
|
76
78
|
if (!isYarn1 && hasPackageManager) toolConstraints.push({
|
|
77
79
|
toolName: "corepack",
|
|
78
|
-
constraint: config
|
|
80
|
+
constraint: await resolveToolConstraint(config, "corepack")
|
|
79
81
|
});
|
|
80
82
|
else {
|
|
81
83
|
toolConstraints.push(yarnTool);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yarn.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/yarn.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n} from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n CommandWithOptions,\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n localPathIsFile,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { coerceObject } from '../../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { getYarnLock, getYarnVersionFromLock } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport async function checkYarnrc(\n lockFileDir: string,\n): Promise<{ offlineMirror: boolean; yarnPath: string | null }> {\n let offlineMirror = false;\n let yarnPath: string | null = null;\n try {\n const yarnrc = await readLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n 'utf8',\n );\n if (isString(yarnrc)) {\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n offlineMirror = !!mirrorLine;\n const pathLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-path '));\n if (pathLine) {\n yarnPath = pathLine.replace(\n regEx(/^yarn-path\\s+\"?(?<path>.+?)\"?$/),\n '$<path>',\n );\n }\n if (yarnPath) {\n // resolve binary relative to `yarnrc`\n yarnPath = upath.join(lockFileDir, yarnPath);\n }\n const yarnBinaryExists = yarnPath\n ? await localPathIsFile(yarnPath)\n : false;\n let scrubbedYarnrc = yarnrc\n .replace('--install.pure-lockfile true', '')\n .replace('--install.frozen-lockfile true', '');\n if (!yarnBinaryExists) {\n scrubbedYarnrc = scrubbedYarnrc.replace(\n regEx(/^yarn-path\\s+\"?.+?\"?$/gm),\n '',\n );\n yarnPath = null;\n }\n if (yarnrc !== scrubbedYarnrc) {\n logger.debug(`Writing scrubbed .yarnrc to ${lockFileDir}`);\n await writeLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n scrubbedYarnrc,\n );\n }\n }\n /* v8 ignore next -- needs test */\n } catch {\n // not found\n }\n return { offlineMirror, yarnPath };\n}\n\nexport function getOptimizeCommand(fileName: string): string[] {\n return ['sed', '-i', 's/ steps,/ steps.slice(0,1),/', fileName];\n}\n\nexport function isYarnUpdate(upgrade: Upgrade): boolean {\n return upgrade.depType === 'packageManager' && upgrade.depName === 'yarn';\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: Partial<PostUpdateConfig<NpmManagerData>> = {},\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n logger.debug(`Spawning yarn install to create ${lockFileName}`);\n let lockFile: string | null = null;\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const toolConstraints: ToolConstraint[] = [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n ];\n const yarnUpdate = upgrades.find(isYarnUpdate);\n const yarnCompatibility =\n (yarnUpdate ? yarnUpdate.newValue : config.constraints?.yarn) ??\n getPackageManagerVersion('yarn', await lazyPgkJson.getValue()) ??\n getYarnVersionFromLock(await getYarnLock(lockFileName));\n const minYarnVersion =\n semver.validRange(yarnCompatibility) &&\n semver.minVersion(yarnCompatibility);\n const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;\n const isYarnDedupeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '2.2.0');\n const isYarnModeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '3.0.0');\n\n const yarnTool: ToolConstraint = {\n toolName: 'yarn',\n constraint: '^1.22.18', // needs to be a v1 yarn, otherwise v2 will be installed\n };\n\n // check first upgrade, see #17786\n const hasPackageManager =\n !!config.managerData?.hasPackageManager ||\n !!upgrades[0]?.managerData?.hasPackageManager;\n\n if (!isYarn1 && hasPackageManager) {\n toolConstraints.push({\n toolName: 'corepack',\n constraint: config.constraints?.corepack,\n });\n } else {\n toolConstraints.push(yarnTool);\n if (isYarn1 && minYarnVersion) {\n yarnTool.constraint = yarnCompatibility;\n }\n }\n\n const extraEnv: ExtraEnv = {\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n };\n\n const commands: (string | CommandWithOptions)[] = [];\n let cmdOptions = ''; // should have a leading space\n if (config.skipInstalls !== false) {\n if (isYarn1) {\n const { offlineMirror, yarnPath } = await checkYarnrc(lockFileDir);\n // v8 ignore else -- TODO: add test #40625\n if (!offlineMirror) {\n logger.debug('Updating yarn.lock only - skipping node_modules');\n // The following change causes Yarn 1.x to exit gracefully after updating the lock file but without installing node_modules\n yarnTool.toolName = 'yarn-slim';\n if (yarnPath) {\n commands.push({\n command: getOptimizeCommand(yarnPath),\n ignoreFailure: true,\n });\n }\n }\n } else if (isYarnModeAvailable) {\n // Don't run the link step and only fetch what's necessary to compute an updated lockfile\n cmdOptions += ' --mode=update-lockfile';\n }\n }\n\n if (isYarn1) {\n cmdOptions +=\n ' --ignore-engines --ignore-platform --network-timeout 100000';\n extraEnv.YARN_CACHE_FOLDER = env.YARN_CACHE_FOLDER;\n } else {\n extraEnv.YARN_ENABLE_IMMUTABLE_INSTALLS = 'false';\n extraEnv.YARN_HTTP_TIMEOUT = '100000';\n extraEnv.YARN_GLOBAL_FOLDER = env.YARN_GLOBAL_FOLDER;\n if (!config.managerData?.yarnZeroInstall) {\n logger.debug('Enabling global cache as zero-install is not detected');\n extraEnv.YARN_ENABLE_GLOBAL_CACHE = '1';\n }\n }\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n if (isYarn1) {\n cmdOptions += ' --ignore-scripts';\n } else if (isYarnModeAvailable) {\n if (config.skipInstalls === false) {\n // Don't run the build scripts\n cmdOptions += ' --mode=skip-build';\n }\n } else {\n extraEnv.YARN_ENABLE_SCRIPTS = '0';\n }\n }\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n docker: {},\n toolConstraints,\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n if (yarnUpdate && !isYarn1) {\n logger.debug('Updating Yarn binary');\n // TODO: types (#22198)\n commands.push(`yarn set version ${quote(yarnUpdate.newValue!)}`);\n }\n\n const allEnv = getEnv();\n if (allEnv.RENOVATE_X_YARN_PROXY) {\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTP_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpProxy');\n commands.push(\n `yarn config set --home httpProxy ${quote(allEnv.HTTP_PROXY)}`,\n );\n }\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTPS_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpsProxy');\n commands.push(\n `yarn config set --home httpsProxy ${quote(allEnv.HTTPS_PROXY)}`,\n );\n }\n }\n\n // This command updates the lock file based on package.json\n commands.push(`yarn install${cmdOptions}`);\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (yarn)');\n if (isYarn1) {\n // `yarn upgrade` updates based on the version range specified in the package file\n // note - this can hit a yarn bug, see https://github.com/yarnpkg/yarn/issues/8236\n commands.push(\n `yarn upgrade ${lockUpdates\n .map((update) => update.depName)\n .filter(isString)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n } else {\n // `yarn up -R` updates to the latest release in each range\n commands.push(\n `yarn up -R ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.depName!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n }\n }\n\n // postUpdateOptions\n ['fewer', 'highest'].forEach((s) => {\n if (\n config.postUpdateOptions?.includes(\n `yarnDedupe${s.charAt(0).toUpperCase()}${s.slice(1)}`,\n )\n ) {\n logger.debug(`Performing yarn dedupe ${s}`);\n if (isYarn1) {\n commands.push(`npx yarn-deduplicate --strategy ${s}`);\n // Run yarn again in case any changes are necessary\n commands.push(`yarn install${cmdOptions}`);\n } else if (isYarnDedupeAvailable && s === 'highest') {\n commands.push(`yarn dedupe --strategy ${s}${cmdOptions}`);\n } else {\n logger.debug(`yarn dedupe ${s} not available`);\n }\n }\n });\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n\n // Note: Instead of just deleting the `yarn.lock` file, we just wipe it\n // and keep an empty lock file. Deleting the lock file could result in different\n // Yarn semantics. e.g. Yarn 2+ will error when `yarn install` is executed in\n // a subdirectory which is not part of a Yarn workspace. Yarn suggests to create\n // an empty lock file if a subdirectory should be treated as its own workspace.\n // https://github.com/yarnpkg/berry/blob/20612e82d26ead5928cc27bf482bb8d62dde87d3/packages/yarnpkg-core/sources/Project.ts#L284.\n try {\n await writeLocalFile(lockFileName, '');\n } catch (err) {\n // v8 ignore next -- TODO: add test #40625\n logger.debug(\n { err, lockFileName },\n 'Error clearing `yarn.lock` for lock file maintenance',\n );\n }\n }\n\n // Run the commands\n await exec(commands, execOptions);\n\n // Read the result\n lockFile = await readLocalFile(lockFileName, 'utf8');\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n err,\n type: 'yarn',\n },\n 'lock file error',\n );\n const stdouterr = String(err.stdout) + String(err.stderr);\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('ENOSPC: no space left on device') ||\n stdouterr.includes('Out of diskspace')\n ) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('The registry may be down.') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.yarnpkg.com') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.npmjs.org')\n ) {\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport function fuzzyMatchAdditionalYarnrcYml<\n T extends { npmRegistries?: Record<string, unknown> },\n>(additionalYarnRcYml: T, existingYarnrRcYml: T): T {\n const keys = new Map(\n Object.keys(coerceObject(existingYarnrRcYml.npmRegistries)).map((x) => [\n x.replace(regEx(/\\/$/), '').replace(regEx(/^https?:/), ''),\n x,\n ]),\n );\n\n return {\n ...additionalYarnRcYml,\n npmRegistries: Object.entries(\n coerceObject(additionalYarnRcYml.npmRegistries),\n )\n .map(([k, v]) => {\n const key = keys.get(k.replace(regEx(/\\/$/), '')) ?? k;\n return { [key]: v };\n })\n .reduce((acc, cur) => ({ ...acc, ...cur }), {}),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yarn.js","names":[],"sources":["../../../../../lib/modules/manager/npm/post-update/yarn.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n} from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport { exec, getToolSettingsOptions } from '../../../../util/exec/index.ts';\nimport type {\n CommandWithOptions,\n ExecOptions,\n ExtraEnv,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n localPathIsFile,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { coerceObject } from '../../../../util/object.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { uniqueStrings } from '../../../../util/string.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport type { PostUpdateConfig, Upgrade } from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { getYarnLock, getYarnVersionFromLock } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport { getNodeToolConstraint } from './node-version.ts';\nimport type { GenerateLockFileResult } from './types.ts';\nimport {\n getNodeOptions,\n getPackageManagerVersion,\n lazyLoadPackageJson,\n} from './utils.ts';\n\nexport async function checkYarnrc(\n lockFileDir: string,\n): Promise<{ offlineMirror: boolean; yarnPath: string | null }> {\n let offlineMirror = false;\n let yarnPath: string | null = null;\n try {\n const yarnrc = await readLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n 'utf8',\n );\n if (isString(yarnrc)) {\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n offlineMirror = !!mirrorLine;\n const pathLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-path '));\n if (pathLine) {\n yarnPath = pathLine.replace(\n regEx(/^yarn-path\\s+\"?(?<path>.+?)\"?$/),\n '$<path>',\n );\n }\n if (yarnPath) {\n // resolve binary relative to `yarnrc`\n yarnPath = upath.join(lockFileDir, yarnPath);\n }\n const yarnBinaryExists = yarnPath\n ? await localPathIsFile(yarnPath)\n : false;\n let scrubbedYarnrc = yarnrc\n .replace('--install.pure-lockfile true', '')\n .replace('--install.frozen-lockfile true', '');\n if (!yarnBinaryExists) {\n scrubbedYarnrc = scrubbedYarnrc.replace(\n regEx(/^yarn-path\\s+\"?.+?\"?$/gm),\n '',\n );\n yarnPath = null;\n }\n if (yarnrc !== scrubbedYarnrc) {\n logger.debug(`Writing scrubbed .yarnrc to ${lockFileDir}`);\n await writeLocalFile(\n upath.join(lockFileDir, '.yarnrc'),\n scrubbedYarnrc,\n );\n }\n }\n /* v8 ignore next -- needs test */\n } catch {\n // not found\n }\n return { offlineMirror, yarnPath };\n}\n\nexport function getOptimizeCommand(fileName: string): string[] {\n return ['sed', '-i', 's/ steps,/ steps.slice(0,1),/', fileName];\n}\n\nexport function isYarnUpdate(upgrade: Upgrade): boolean {\n return upgrade.depType === 'packageManager' && upgrade.depName === 'yarn';\n}\n\nexport async function generateLockFile(\n lockFileDir: string,\n env: NodeJS.ProcessEnv,\n config: Partial<PostUpdateConfig<NpmManagerData>> = {},\n upgrades: Upgrade[] = [],\n): Promise<GenerateLockFileResult> {\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n logger.debug(`Spawning yarn install to create ${lockFileName}`);\n let lockFile: string | null = null;\n try {\n const lazyPgkJson = lazyLoadPackageJson(lockFileDir);\n const toolConstraints: ToolConstraint[] = [\n await getNodeToolConstraint(config, upgrades, lockFileDir, lazyPgkJson),\n ];\n const yarnUpdate = upgrades.find(isYarnUpdate);\n const yarnCompatibility =\n yarnUpdate?.newValue ??\n (await resolveToolConstraint(\n config,\n 'yarn',\n async () =>\n getPackageManagerVersion('yarn', await lazyPgkJson.getValue()) ??\n getYarnVersionFromLock(await getYarnLock(lockFileName)),\n ));\n const yarnRange = semver.validRange(yarnCompatibility);\n const minYarnVersion = yarnRange && semver.minVersion(yarnRange);\n const isYarn1 = !minYarnVersion || minYarnVersion.major === 1;\n const isYarnDedupeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '2.2.0');\n const isYarnModeAvailable =\n minYarnVersion && semver.gte(minYarnVersion, '3.0.0');\n\n const yarnTool: ToolConstraint = {\n toolName: 'yarn',\n constraint: '^1.22.18', // needs to be a v1 yarn, otherwise v2 will be installed\n };\n\n // check first upgrade, see #17786\n const hasPackageManager =\n !!config.managerData?.hasPackageManager ||\n !!upgrades[0]?.managerData?.hasPackageManager;\n\n if (!isYarn1 && hasPackageManager) {\n toolConstraints.push({\n toolName: 'corepack',\n constraint: await resolveToolConstraint(config, 'corepack'),\n });\n } else {\n toolConstraints.push(yarnTool);\n if (isYarn1 && minYarnVersion) {\n yarnTool.constraint = yarnCompatibility;\n }\n }\n\n const extraEnv: ExtraEnv = {\n NPM_CONFIG_CACHE: env.NPM_CONFIG_CACHE,\n npm_config_store: env.npm_config_store,\n };\n\n const commands: (string | CommandWithOptions)[] = [];\n let cmdOptions = ''; // should have a leading space\n if (config.skipInstalls !== false) {\n if (isYarn1) {\n const { offlineMirror, yarnPath } = await checkYarnrc(lockFileDir);\n // v8 ignore else -- TODO: add test #40625\n if (!offlineMirror) {\n logger.debug('Updating yarn.lock only - skipping node_modules');\n // The following change causes Yarn 1.x to exit gracefully after updating the lock file but without installing node_modules\n yarnTool.toolName = 'yarn-slim';\n if (yarnPath) {\n commands.push({\n command: getOptimizeCommand(yarnPath),\n ignoreFailure: true,\n });\n }\n }\n } else if (isYarnModeAvailable) {\n // Don't run the link step and only fetch what's necessary to compute an updated lockfile\n cmdOptions += ' --mode=update-lockfile';\n }\n }\n\n if (isYarn1) {\n cmdOptions +=\n ' --ignore-engines --ignore-platform --network-timeout 100000';\n extraEnv.YARN_CACHE_FOLDER = env.YARN_CACHE_FOLDER;\n } else {\n extraEnv.YARN_ENABLE_IMMUTABLE_INSTALLS = 'false';\n extraEnv.YARN_HTTP_TIMEOUT = '100000';\n extraEnv.YARN_GLOBAL_FOLDER = env.YARN_GLOBAL_FOLDER;\n if (!config.managerData?.yarnZeroInstall) {\n logger.debug('Enabling global cache as zero-install is not detected');\n extraEnv.YARN_ENABLE_GLOBAL_CACHE = '1';\n }\n }\n if (!GlobalConfig.get('allowScripts') || config.ignoreScripts) {\n if (isYarn1) {\n cmdOptions += ' --ignore-scripts';\n } else if (isYarnModeAvailable) {\n if (config.skipInstalls === false) {\n // Don't run the build scripts\n cmdOptions += ' --mode=skip-build';\n }\n } else {\n extraEnv.YARN_ENABLE_SCRIPTS = '0';\n }\n }\n\n const { nodeMaxMemory } = getToolSettingsOptions(config.toolSettings);\n if (nodeMaxMemory) {\n extraEnv.NODE_OPTIONS = getNodeOptions(nodeMaxMemory);\n }\n\n const execOptions: ExecOptions = {\n cwdFile: lockFileName,\n extraEnv,\n docker: {},\n toolConstraints,\n };\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('exposeAllEnv')) {\n extraEnv.NPM_AUTH = env.NPM_AUTH;\n extraEnv.NPM_EMAIL = env.NPM_EMAIL;\n }\n\n if (yarnUpdate && !isYarn1) {\n logger.debug('Updating Yarn binary');\n // TODO: types (#22198)\n commands.push(`yarn set version ${quote(yarnUpdate.newValue!)}`);\n }\n\n const allEnv = getEnv();\n if (allEnv.RENOVATE_X_YARN_PROXY) {\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTP_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpProxy');\n commands.push(\n `yarn config set --home httpProxy ${quote(allEnv.HTTP_PROXY)}`,\n );\n }\n // v8 ignore else -- TODO: add test #40625\n if (allEnv.HTTPS_PROXY && !isYarn1) {\n commands.push('yarn config unset --home httpsProxy');\n commands.push(\n `yarn config set --home httpsProxy ${quote(allEnv.HTTPS_PROXY)}`,\n );\n }\n }\n\n // This command updates the lock file based on package.json\n commands.push(`yarn install${cmdOptions}`);\n\n // rangeStrategy = update-lockfile\n const lockUpdates = upgrades.filter((upgrade) => upgrade.isLockfileUpdate);\n if (lockUpdates.length) {\n logger.debug('Performing lockfileUpdate (yarn)');\n if (isYarn1) {\n // `yarn upgrade` updates based on the version range specified in the package file\n // note - this can hit a yarn bug, see https://github.com/yarnpkg/yarn/issues/8236\n commands.push(\n `yarn upgrade ${lockUpdates\n .map((update) => update.depName)\n .filter(isString)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n } else {\n // `yarn up -R` updates to the latest release in each range\n commands.push(\n `yarn up -R ${lockUpdates\n // TODO: types (#22198)\n .map((update) => `${update.depName!}`)\n .filter(uniqueStrings)\n .map(quote)\n .join(' ')}${cmdOptions}`,\n );\n }\n }\n\n // postUpdateOptions\n ['fewer', 'highest'].forEach((s) => {\n if (\n config.postUpdateOptions?.includes(\n `yarnDedupe${s.charAt(0).toUpperCase()}${s.slice(1)}`,\n )\n ) {\n logger.debug(`Performing yarn dedupe ${s}`);\n if (isYarn1) {\n commands.push(`npx yarn-deduplicate --strategy ${s}`);\n // Run yarn again in case any changes are necessary\n commands.push(`yarn install${cmdOptions}`);\n } else if (isYarnDedupeAvailable && s === 'highest') {\n commands.push(`yarn dedupe --strategy ${s}${cmdOptions}`);\n } else {\n logger.debug(`yarn dedupe ${s} not available`);\n }\n }\n });\n\n if (upgrades.find((upgrade) => upgrade.isLockFileMaintenance)) {\n logger.debug(\n `Removing ${lockFileName} first due to lock file maintenance upgrade`,\n );\n\n // Note: Instead of just deleting the `yarn.lock` file, we just wipe it\n // and keep an empty lock file. Deleting the lock file could result in different\n // Yarn semantics. e.g. Yarn 2+ will error when `yarn install` is executed in\n // a subdirectory which is not part of a Yarn workspace. Yarn suggests to create\n // an empty lock file if a subdirectory should be treated as its own workspace.\n // https://github.com/yarnpkg/berry/blob/20612e82d26ead5928cc27bf482bb8d62dde87d3/packages/yarnpkg-core/sources/Project.ts#L284.\n try {\n await writeLocalFile(lockFileName, '');\n } catch (err) {\n // v8 ignore next -- TODO: add test #40625\n logger.debug(\n { err, lockFileName },\n 'Error clearing `yarn.lock` for lock file maintenance',\n );\n }\n }\n\n // Run the commands\n await exec(commands, execOptions);\n\n // Read the result\n lockFile = await readLocalFile(lockFileName, 'utf8');\n } catch (err) {\n // v8 ignore if -- TODO: add test #40625\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug(\n {\n err,\n type: 'yarn',\n },\n 'lock file error',\n );\n const stdouterr = String(err.stdout) + String(err.stderr);\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('ENOSPC: no space left on device') ||\n stdouterr.includes('Out of diskspace')\n ) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n // v8 ignore if -- TODO: add test #40625\n if (\n stdouterr.includes('The registry may be down.') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.yarnpkg.com') ||\n stdouterr.includes('getaddrinfo ENOTFOUND registry.npmjs.org')\n ) {\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n return { error: true, stderr: err.stderr, stdout: err.stdout };\n }\n return { lockFile };\n}\n\nexport function fuzzyMatchAdditionalYarnrcYml<\n T extends { npmRegistries?: Record<string, unknown> },\n>(additionalYarnRcYml: T, existingYarnrRcYml: T): T {\n const keys = new Map(\n Object.keys(coerceObject(existingYarnrRcYml.npmRegistries)).map((x) => [\n x.replace(regEx(/\\/$/), '').replace(regEx(/^https?:/), ''),\n x,\n ]),\n );\n\n return {\n ...additionalYarnRcYml,\n npmRegistries: Object.entries(\n coerceObject(additionalYarnRcYml.npmRegistries),\n )\n .map(([k, v]) => {\n const key = keys.get(k.replace(regEx(/\\/$/), '')) ?? k;\n return { [key]: v };\n })\n .reduce((acc, cur) => ({ ...acc, ...cur }), {}),\n };\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { ensureDir, getLocalFiles, getSiblingFileName, outputCacheFile, privateC
|
|
|
6
6
|
import { exec } from "../../../util/exec/index.js";
|
|
7
7
|
import { getFiles } from "../../../util/git/index.js";
|
|
8
8
|
import { findGlobalJson, getConfiguredRegistries, getDefaultRegistries } from "./util.js";
|
|
9
|
+
import { resolveToolConstraint } from "../util.js";
|
|
9
10
|
import { createNuGetConfigXml } from "./config-formatter.js";
|
|
10
11
|
import { GLOBAL_JSON, getDependentPackageFiles } from "./package-tree.js";
|
|
11
12
|
import { isNonEmptyString } from "@sindresorhus/is";
|
|
@@ -25,7 +26,7 @@ async function createCachedNuGetConfigFile(nugetCacheDir, packageFileName, updat
|
|
|
25
26
|
async function runDotnetRestore(packageFileName, dependentPackageFileNames, config, updatedDeps) {
|
|
26
27
|
const nugetCacheDir = upath.join(privateCacheDir(), "nuget");
|
|
27
28
|
const nugetConfigFile = await createCachedNuGetConfigFile(nugetCacheDir, packageFileName, updatedDeps);
|
|
28
|
-
const dotnetVersion = config
|
|
29
|
+
const dotnetVersion = await resolveToolConstraint(config, "dotnet", async () => (await findGlobalJson(packageFileName))?.sdk?.version);
|
|
29
30
|
const execOptions = {
|
|
30
31
|
docker: {},
|
|
31
32
|
extraEnv: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/nuget/artifacts.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n ensureDir,\n getLocalFiles,\n getSiblingFileName,\n outputCacheFile,\n privateCacheDir,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getFiles } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { createNuGetConfigXml } from './config-formatter.ts';\nimport {\n DIRECTORY_BUILD_PROPS,\n GLOBAL_JSON,\n MSBUILD_CENTRAL_FILE,\n NUGET_CENTRAL_FILE,\n getDependentPackageFiles,\n} from './package-tree.ts';\nimport type { Registry } from './types.ts';\nimport {\n findGlobalJson,\n getConfiguredRegistries,\n getDefaultRegistries,\n} from './util.ts';\n\nasync function createCachedNuGetConfigFile(\n nugetCacheDir: string,\n packageFileName: string,\n updatedDeps: Upgrade[],\n): Promise<string> {\n const registries =\n (await getConfiguredRegistries(packageFileName)) ?? getDefaultRegistries();\n\n const updatedDepsRegistries: Registry[] = Array.from(\n new Set(\n updatedDeps\n .flatMap((dep) => coerceArray(dep.registryUrls))\n .filter(isNonEmptyString),\n ),\n (url) => ({ url }),\n );\n\n const combinedRegistries = [...registries, ...updatedDepsRegistries];\n\n const contents = createNuGetConfigXml(combinedRegistries);\n\n const cachedNugetConfigFile = upath.join(nugetCacheDir, `nuget.config`);\n await ensureDir(nugetCacheDir);\n await outputCacheFile(cachedNugetConfigFile, contents);\n\n return cachedNugetConfigFile;\n}\n\nasync function runDotnetRestore(\n packageFileName: string,\n dependentPackageFileNames: string[],\n config: UpdateArtifactsConfig,\n updatedDeps: Upgrade[],\n): Promise<void> {\n const nugetCacheDir = upath.join(privateCacheDir(), 'nuget');\n\n const nugetConfigFile = await createCachedNuGetConfigFile(\n nugetCacheDir,\n packageFileName,\n updatedDeps,\n );\n\n const dotnetVersion
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":[],"sources":["../../../../lib/modules/manager/nuget/artifacts.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { exec } from '../../../util/exec/index.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport {\n ensureDir,\n getLocalFiles,\n getSiblingFileName,\n outputCacheFile,\n privateCacheDir,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { getFiles } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport type {\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport { createNuGetConfigXml } from './config-formatter.ts';\nimport {\n DIRECTORY_BUILD_PROPS,\n GLOBAL_JSON,\n MSBUILD_CENTRAL_FILE,\n NUGET_CENTRAL_FILE,\n getDependentPackageFiles,\n} from './package-tree.ts';\nimport type { Registry } from './types.ts';\nimport {\n findGlobalJson,\n getConfiguredRegistries,\n getDefaultRegistries,\n} from './util.ts';\n\nasync function createCachedNuGetConfigFile(\n nugetCacheDir: string,\n packageFileName: string,\n updatedDeps: Upgrade[],\n): Promise<string> {\n const registries =\n (await getConfiguredRegistries(packageFileName)) ?? getDefaultRegistries();\n\n const updatedDepsRegistries: Registry[] = Array.from(\n new Set(\n updatedDeps\n .flatMap((dep) => coerceArray(dep.registryUrls))\n .filter(isNonEmptyString),\n ),\n (url) => ({ url }),\n );\n\n const combinedRegistries = [...registries, ...updatedDepsRegistries];\n\n const contents = createNuGetConfigXml(combinedRegistries);\n\n const cachedNugetConfigFile = upath.join(nugetCacheDir, `nuget.config`);\n await ensureDir(nugetCacheDir);\n await outputCacheFile(cachedNugetConfigFile, contents);\n\n return cachedNugetConfigFile;\n}\n\nasync function runDotnetRestore(\n packageFileName: string,\n dependentPackageFileNames: string[],\n config: UpdateArtifactsConfig,\n updatedDeps: Upgrade[],\n): Promise<void> {\n const nugetCacheDir = upath.join(privateCacheDir(), 'nuget');\n\n const nugetConfigFile = await createCachedNuGetConfigFile(\n nugetCacheDir,\n packageFileName,\n updatedDeps,\n );\n\n const dotnetVersion = await resolveToolConstraint(\n config,\n 'dotnet',\n async () => (await findGlobalJson(packageFileName))?.sdk?.version,\n );\n const execOptions: ExecOptions = {\n docker: {},\n extraEnv: {\n NUGET_PACKAGES: upath.join(nugetCacheDir, 'packages'),\n MSBUILDDISABLENODEREUSE: '1',\n },\n toolConstraints: [{ toolName: 'dotnet', constraint: dotnetVersion }],\n };\n\n const cmds = dependentPackageFileNames.map(\n (fileName) =>\n `dotnet restore ${quote(\n fileName,\n )} --force-evaluate --configfile ${quote(nugetConfigFile)}`,\n );\n\n if (config.postUpdateOptions?.includes('dotnetWorkloadRestore')) {\n cmds.unshift(\n `dotnet workload restore --configfile ${quote(nugetConfigFile)}`,\n );\n }\n\n await exec(cmds, execOptions);\n}\n\nexport async function updateArtifacts({\n packageFileName,\n newPackageFileContent,\n config,\n updatedDeps,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`nuget.updateArtifacts(${packageFileName})`);\n\n // https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions\n // https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions\n const isCentralManagement =\n packageFileName === NUGET_CENTRAL_FILE ||\n packageFileName === MSBUILD_CENTRAL_FILE ||\n packageFileName.endsWith(`/${NUGET_CENTRAL_FILE}`) ||\n packageFileName.endsWith(`/${MSBUILD_CENTRAL_FILE}`);\n\n const isGlobalJson = packageFileName === GLOBAL_JSON;\n\n const isDirectoryBuildProps =\n packageFileName === DIRECTORY_BUILD_PROPS ||\n packageFileName.endsWith(`/${DIRECTORY_BUILD_PROPS}`);\n\n if (\n !isCentralManagement &&\n !isGlobalJson &&\n !isDirectoryBuildProps &&\n !regEx(/(?:cs|vb|fs)proj$/i).test(packageFileName)\n ) {\n // This could be implemented in the future if necessary.\n // It's not that easy though because the questions which\n // project file to restore how to determine which lock files\n // have been changed in such cases.\n logger.debug(\n { packageFileName },\n 'Not updating lock file for non project files',\n );\n return null;\n }\n\n const deps = await getDependentPackageFiles(\n packageFileName,\n isCentralManagement || isDirectoryBuildProps,\n isGlobalJson,\n );\n const packageFiles = deps.filter((d) => d.isLeaf).map((d) => d.name);\n\n logger.trace(\n { packageFiles },\n `Found ${packageFiles.length} dependent package files`,\n );\n\n const lockFileNames = deps.map((f) =>\n getSiblingFileName(f.name, 'packages.lock.json'),\n );\n\n const existingLockFileContentMap = await getFiles(lockFileNames);\n\n const hasLockFileContent = Object.values(existingLockFileContentMap).some(\n (val) => !!val,\n );\n if (!hasLockFileContent) {\n logger.debug(\n { packageFileName },\n 'No lock file found for package or dependents',\n );\n return null;\n }\n\n try {\n if (updatedDeps.length === 0 && config.isLockFileMaintenance !== true) {\n logger.debug(\n `Not updating lock file because no deps changed and no lock file maintenance.`,\n );\n return null;\n }\n\n await writeLocalFile(packageFileName, newPackageFileContent);\n\n await runDotnetRestore(packageFileName, packageFiles, config, updatedDeps);\n\n const newLockFileContentMap = await getLocalFiles(lockFileNames);\n\n const retArray: UpdateArtifactsResult[] = [];\n for (const lockFileName of lockFileNames) {\n if (\n existingLockFileContentMap[lockFileName] ===\n newLockFileContentMap[lockFileName]\n ) {\n logger.trace(`Lock file ${lockFileName} is unchanged`);\n } else if (newLockFileContentMap[lockFileName]) {\n retArray.push({\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockFileContentMap[lockFileName],\n },\n });\n }\n // TODO: else should we return an artifact error if new content is missing?\n }\n\n return retArray.length > 0 ? retArray : null;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to generate lock file');\n return [\n {\n artifactError: {\n fileName: lockFileNames.join(', '),\n // error is written to stdout\n stderr: err.stdout ?? err.message,\n },\n },\n ];\n }\n}\n"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { logger } from "../../../../logger/index.js";
|
|
|
3
3
|
import { getSiblingFileName, readLocalFile } from "../../../../util/fs/index.js";
|
|
4
4
|
import { Result } from "../../../../util/result.js";
|
|
5
5
|
import { PypiDatasource } from "../../../datasource/pypi/index.js";
|
|
6
|
+
import { resolveToolConstraint } from "../../util.js";
|
|
6
7
|
import { withGitEnvironment } from "../../../../util/git/exec.js";
|
|
7
8
|
import { BasePyProjectProcessor } from "./abstract.js";
|
|
8
9
|
import { depTypes } from "../utils.js";
|
|
@@ -50,10 +51,10 @@ var PdmProcessor = class extends BasePyProjectProcessor {
|
|
|
50
51
|
docker: {},
|
|
51
52
|
toolConstraints: [{
|
|
52
53
|
toolName: "python",
|
|
53
|
-
constraint: config
|
|
54
|
+
constraint: await resolveToolConstraint(config, "python", () => project.project?.["requires-python"])
|
|
54
55
|
}, {
|
|
55
56
|
toolName: "pdm",
|
|
56
|
-
constraint: config
|
|
57
|
+
constraint: await resolveToolConstraint(config, "pdm")
|
|
57
58
|
}]
|
|
58
59
|
};
|
|
59
60
|
const cmds = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdm.js","names":[],"sources":["../../../../../lib/modules/manager/pep621/processors/pdm.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type {\n ExecOptions,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n getSiblingFileName,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../../util/git/exec.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { PypiDatasource } from '../../../datasource/pypi/index.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../../types.ts';\nimport { PdmLockfile, type PyProject } from '../schema.ts';\nimport type { Pep621ManagerData } from '../types.ts';\nimport { depTypes } from '../utils.ts';\nimport { BasePyProjectProcessor } from './abstract.ts';\n\nconst pdmUpdateCMD = 'pdm update --no-sync --update-eager';\nconst gitExec = withGitEnvironment(['pep621']);\n\nexport class PdmProcessor extends BasePyProjectProcessor {\n override lockfileName = 'pdm.lock';\n\n process(\n project: PyProject,\n deps: PackageDependency[],\n ): PackageDependency<Pep621ManagerData>[] {\n const devDependencies = project.tool?.pdm?.devDependencies;\n if (devDependencies) {\n deps.push(...devDependencies);\n }\n\n const registryUrls = project.tool?.pdm?.registryUrls;\n if (registryUrls) {\n for (const dep of deps) {\n if (dep.datasource === PypiDatasource.id) {\n dep.registryUrls = registryUrls;\n }\n }\n }\n\n return deps;\n }\n\n async extractLockedVersions(\n project: PyProject,\n deps: PackageDependency[],\n packageFile: string,\n ): Promise<PackageDependency[]> {\n if (\n !project.tool?.pdm &&\n project['build-system']?.['build-backend'] !== 'pdm.backend'\n ) {\n return Promise.resolve(deps);\n }\n\n const lockFileName = getSiblingFileName(packageFile, 'pdm.lock');\n const lockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (lockFileContent) {\n const lockFileMapping = Result.parse(\n lockFileContent,\n PdmLockfile.transform(({ lock }) => lock),\n ).unwrapOr({});\n\n for (const dep of deps) {\n const packageName = dep.packageName;\n if (packageName && packageName in lockFileMapping) {\n dep.lockedVersion = lockFileMapping[packageName];\n }\n }\n }\n\n return Promise.resolve(deps);\n }\n\n async updateArtifacts(\n updateArtifact: UpdateArtifact,\n project: PyProject,\n ): Promise<UpdateArtifactsResult[] | null> {\n const { config, updatedDeps, packageFileName } = updateArtifact;\n\n const { isLockFileMaintenance } = config;\n\n // abort if no lockfile is defined\n const lockFileName = getSiblingFileName(packageFileName, this.lockfileName);\n try {\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('No pdm.lock found');\n return null;\n }\n\n const pythonConstraint: ToolConstraint = {\n toolName: 'python',\n constraint
|
|
1
|
+
{"version":3,"file":"pdm.js","names":[],"sources":["../../../../../lib/modules/manager/pep621/processors/pdm.ts"],"sourcesContent":["import { quote } from 'shlex';\nimport { TEMPORARY_ERROR } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type {\n ExecOptions,\n ToolConstraint,\n} from '../../../../util/exec/types.ts';\nimport {\n getSiblingFileName,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../../util/git/exec.ts';\nimport { Result } from '../../../../util/result.ts';\nimport { PypiDatasource } from '../../../datasource/pypi/index.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n Upgrade,\n} from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport { PdmLockfile, type PyProject } from '../schema.ts';\nimport type { Pep621ManagerData } from '../types.ts';\nimport { depTypes } from '../utils.ts';\nimport { BasePyProjectProcessor } from './abstract.ts';\n\nconst pdmUpdateCMD = 'pdm update --no-sync --update-eager';\nconst gitExec = withGitEnvironment(['pep621']);\n\nexport class PdmProcessor extends BasePyProjectProcessor {\n override lockfileName = 'pdm.lock';\n\n process(\n project: PyProject,\n deps: PackageDependency[],\n ): PackageDependency<Pep621ManagerData>[] {\n const devDependencies = project.tool?.pdm?.devDependencies;\n if (devDependencies) {\n deps.push(...devDependencies);\n }\n\n const registryUrls = project.tool?.pdm?.registryUrls;\n if (registryUrls) {\n for (const dep of deps) {\n if (dep.datasource === PypiDatasource.id) {\n dep.registryUrls = registryUrls;\n }\n }\n }\n\n return deps;\n }\n\n async extractLockedVersions(\n project: PyProject,\n deps: PackageDependency[],\n packageFile: string,\n ): Promise<PackageDependency[]> {\n if (\n !project.tool?.pdm &&\n project['build-system']?.['build-backend'] !== 'pdm.backend'\n ) {\n return Promise.resolve(deps);\n }\n\n const lockFileName = getSiblingFileName(packageFile, 'pdm.lock');\n const lockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (lockFileContent) {\n const lockFileMapping = Result.parse(\n lockFileContent,\n PdmLockfile.transform(({ lock }) => lock),\n ).unwrapOr({});\n\n for (const dep of deps) {\n const packageName = dep.packageName;\n if (packageName && packageName in lockFileMapping) {\n dep.lockedVersion = lockFileMapping[packageName];\n }\n }\n }\n\n return Promise.resolve(deps);\n }\n\n async updateArtifacts(\n updateArtifact: UpdateArtifact,\n project: PyProject,\n ): Promise<UpdateArtifactsResult[] | null> {\n const { config, updatedDeps, packageFileName } = updateArtifact;\n\n const { isLockFileMaintenance } = config;\n\n // abort if no lockfile is defined\n const lockFileName = getSiblingFileName(packageFileName, this.lockfileName);\n try {\n const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');\n if (!existingLockFileContent) {\n logger.debug('No pdm.lock found');\n return null;\n }\n\n const pythonConstraint: ToolConstraint = {\n toolName: 'python',\n constraint: await resolveToolConstraint(\n config,\n 'python',\n () => project.project?.['requires-python'],\n ),\n };\n const pdmConstraint: ToolConstraint = {\n toolName: 'pdm',\n constraint: await resolveToolConstraint(config, 'pdm'),\n };\n\n const execOptions: ExecOptions = {\n cwdFile: packageFileName,\n docker: {},\n toolConstraints: [pythonConstraint, pdmConstraint],\n };\n\n // on lockFileMaintenance do not specify any packages and update the complete lock file\n // else only update specific packages\n const cmds: string[] = [];\n if (isLockFileMaintenance) {\n cmds.push(pdmUpdateCMD);\n } else {\n cmds.push(...generateCMDs(updatedDeps));\n }\n await gitExec(cmds, execOptions);\n\n // check for changes\n const fileChanges: UpdateArtifactsResult[] = [];\n const newLockContent = await readLocalFile(lockFileName, 'utf8');\n const isLockFileChanged = existingLockFileContent !== newLockContent;\n if (isLockFileChanged) {\n fileChanges.push({\n file: {\n type: 'addition',\n path: lockFileName,\n contents: newLockContent,\n },\n });\n } else {\n logger.debug('pdm.lock is unchanged');\n }\n\n return fileChanges.length ? fileChanges : null;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update PDM lock file');\n return [\n {\n artifactError: {\n fileName: lockFileName,\n stderr: err.message,\n },\n },\n ];\n }\n }\n}\n\nfunction generateCMDs(updatedDeps: Upgrade<Pep621ManagerData>[]): string[] {\n const cmds: string[] = [];\n const packagesByCMD: Record<string, string[]> = {};\n for (const dep of updatedDeps) {\n switch (dep.depType) {\n case depTypes.optionalDependencies: {\n if (!dep.managerData?.depGroup) {\n logger.once.warn(\n { dep: dep.depName },\n 'Unexpected optional dependency without group',\n );\n continue;\n }\n addPackageToCMDRecord(\n packagesByCMD,\n `${pdmUpdateCMD} -G ${quote(dep.managerData.depGroup)}`,\n dep.packageName!,\n );\n break;\n }\n case depTypes.dependencyGroups:\n case depTypes.pdmDevDependencies: {\n if (!dep.managerData?.depGroup) {\n logger.once.warn(\n { dep: dep.depName },\n 'Unexpected dev dependency without group',\n );\n continue;\n }\n addPackageToCMDRecord(\n packagesByCMD,\n `${pdmUpdateCMD} -dG ${quote(dep.managerData.depGroup)}`,\n dep.packageName!,\n );\n break;\n }\n case depTypes.buildSystemRequires:\n // build requirements are not locked in the lock files, no need to update.\n // Reference: https://github.com/pdm-project/pdm/discussions/2869\n break;\n default: {\n addPackageToCMDRecord(packagesByCMD, pdmUpdateCMD, dep.packageName!);\n }\n }\n }\n\n for (const commandPrefix in packagesByCMD) {\n const packageList = packagesByCMD[commandPrefix].map(quote).join(' ');\n const cmd = `${commandPrefix} ${packageList}`;\n cmds.push(cmd);\n }\n\n return cmds;\n}\n\nfunction addPackageToCMDRecord(\n packagesByCMD: Record<string, string[]>,\n commandPrefix: string,\n packageName: string,\n): void {\n if (!packagesByCMD[commandPrefix]) {\n packagesByCMD[commandPrefix] = [];\n }\n packagesByCMD[commandPrefix].push(packageName);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from "../../../../logger/index.js";
|
|
2
2
|
import { getSiblingFileName, localPathExists } from "../../../../util/fs/index.js";
|
|
3
|
+
import { resolveToolConstraint } from "../../util.js";
|
|
3
4
|
import { BasePyProjectProcessor } from "./abstract.js";
|
|
4
5
|
import { updatePixiLockfile } from "../../pixi/lockfile.js";
|
|
5
6
|
//#region lib/modules/manager/pep621/processors/pixi.ts
|
|
@@ -16,9 +17,9 @@ var PixiProcessor = class extends BasePyProjectProcessor {
|
|
|
16
17
|
logger.debug({ packageFile }, "No pixi.lock found");
|
|
17
18
|
return [];
|
|
18
19
|
}
|
|
19
|
-
updateArtifacts({ config, updatedDeps, packageFileName }, project) {
|
|
20
|
-
const constraint = config
|
|
21
|
-
return updatePixiLockfile({
|
|
20
|
+
async updateArtifacts({ config, updatedDeps, packageFileName }, project) {
|
|
21
|
+
const constraint = await resolveToolConstraint(config, "pixi", () => project.tool?.pixi?.["requires-pixi"]);
|
|
22
|
+
return await updatePixiLockfile({
|
|
22
23
|
packageFileName,
|
|
23
24
|
updatedDeps,
|
|
24
25
|
isLockFileMaintenance: config.isLockFileMaintenance,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pixi.js","names":[],"sources":["../../../../../lib/modules/manager/pep621/processors/pixi.ts"],"sourcesContent":["import { logger } from '../../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n} from '../../../../util/fs/index.ts';\nimport { updatePixiLockfile } from '../../pixi/lockfile.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n} from '../../types.ts';\nimport type { PyProject } from '../schema.ts';\nimport { BasePyProjectProcessor } from './abstract.ts';\n\nexport class PixiProcessor extends BasePyProjectProcessor {\n process(_project: PyProject, deps: PackageDependency[]): PackageDependency[] {\n return deps;\n }\n\n extractLockedVersions(\n _project: PyProject,\n deps: PackageDependency[],\n _packageFile: string,\n ): Promise<PackageDependency[]> {\n return Promise.resolve(deps);\n }\n\n override async getLockfiles(\n _project: PyProject,\n packageFile: string,\n ): Promise<string[]> {\n const lockfileName = getSiblingFileName(packageFile, 'pixi.lock');\n if (await localPathExists(lockfileName)) {\n return [lockfileName];\n }\n logger.debug({ packageFile }, 'No pixi.lock found');\n return [];\n }\n\n updateArtifacts(\n { config, updatedDeps, packageFileName }: UpdateArtifact,\n project: PyProject,\n ): Promise<UpdateArtifactsResult[] | null> {\n const constraint
|
|
1
|
+
{"version":3,"file":"pixi.js","names":[],"sources":["../../../../../lib/modules/manager/pep621/processors/pixi.ts"],"sourcesContent":["import { logger } from '../../../../logger/index.ts';\nimport {\n getSiblingFileName,\n localPathExists,\n} from '../../../../util/fs/index.ts';\nimport { updatePixiLockfile } from '../../pixi/lockfile.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsResult,\n} from '../../types.ts';\nimport { resolveToolConstraint } from '../../util.ts';\nimport type { PyProject } from '../schema.ts';\nimport { BasePyProjectProcessor } from './abstract.ts';\n\nexport class PixiProcessor extends BasePyProjectProcessor {\n process(_project: PyProject, deps: PackageDependency[]): PackageDependency[] {\n return deps;\n }\n\n extractLockedVersions(\n _project: PyProject,\n deps: PackageDependency[],\n _packageFile: string,\n ): Promise<PackageDependency[]> {\n return Promise.resolve(deps);\n }\n\n override async getLockfiles(\n _project: PyProject,\n packageFile: string,\n ): Promise<string[]> {\n const lockfileName = getSiblingFileName(packageFile, 'pixi.lock');\n if (await localPathExists(lockfileName)) {\n return [lockfileName];\n }\n logger.debug({ packageFile }, 'No pixi.lock found');\n return [];\n }\n\n async updateArtifacts(\n { config, updatedDeps, packageFileName }: UpdateArtifact,\n project: PyProject,\n ): Promise<UpdateArtifactsResult[] | null> {\n const constraint = await resolveToolConstraint(\n config,\n 'pixi',\n () => project.tool?.pixi?.['requires-pixi'],\n );\n\n // The `pep621` manager has already written the updated package file, so\n // `newPackageFileContent` is intentionally left unset here.\n return await updatePixiLockfile({\n packageFileName,\n updatedDeps,\n isLockFileMaintenance: config.isLockFileMaintenance,\n constraint,\n });\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,gBAAb,cAAmC,uBAAuB;CACxD,QAAQ,UAAqB,MAAgD;EAC3E,OAAO;CACT;CAEA,sBACE,UACA,MACA,cAC8B;EAC9B,OAAO,QAAQ,QAAQ,IAAI;CAC7B;CAEA,MAAe,aACb,UACA,aACmB;EACnB,MAAM,eAAe,mBAAmB,aAAa,WAAW;EAChE,IAAI,MAAM,gBAAgB,YAAY,GACpC,OAAO,CAAC,YAAY;EAEtB,OAAO,MAAM,EAAE,YAAY,GAAG,oBAAoB;EAClD,OAAO,CAAC;CACV;CAEA,MAAM,gBACJ,EAAE,QAAQ,aAAa,mBACvB,SACyC;EACzC,MAAM,aAAa,MAAM,sBACvB,QACA,cACM,QAAQ,MAAM,OAAO,gBAC7B;EAIA,OAAO,MAAM,mBAAmB;GAC9B;GACA;GACA,uBAAuB,OAAO;GAC9B;EACF,CAAC;CACH;AACF"}
|
|
@@ -8,7 +8,7 @@ import { findLocalSiblingOrParent, readLocalFile } from "../../../../util/fs/ind
|
|
|
8
8
|
import { Result } from "../../../../util/result.js";
|
|
9
9
|
import { getGoogleAuthHostRule } from "../../../datasource/util.js";
|
|
10
10
|
import { PypiDatasource } from "../../../datasource/pypi/index.js";
|
|
11
|
-
import { applyGitSource } from "../../util.js";
|
|
11
|
+
import { applyGitSource, resolveToolConstraint } from "../../util.js";
|
|
12
12
|
import { withGitEnvironment } from "../../../../util/git/exec.js";
|
|
13
13
|
import { BasePyProjectProcessor } from "./abstract.js";
|
|
14
14
|
import { depTypes } from "../utils.js";
|
|
@@ -96,11 +96,11 @@ var UvProcessor = class extends BasePyProjectProcessor {
|
|
|
96
96
|
}
|
|
97
97
|
const pythonConstraint = {
|
|
98
98
|
toolName: "python",
|
|
99
|
-
constraint: config
|
|
99
|
+
constraint: await resolveToolConstraint(config, "python", () => project.project?.["requires-python"])
|
|
100
100
|
};
|
|
101
101
|
const uvConstraint = {
|
|
102
102
|
toolName: "uv",
|
|
103
|
-
constraint: config
|
|
103
|
+
constraint: await resolveToolConstraint(config, "uv", () => project.tool?.uv?.["required-version"])
|
|
104
104
|
};
|
|
105
105
|
const execOptions = {
|
|
106
106
|
cwdFile: packageFileName,
|