renovate 44.23.2 → 44.24.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n getNpmrcContent,\n parseLockFile,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmShrinkwrapDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmShrinkwrapDirs.push(upgrade.managerData?.pnpmShrinkwrap);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<PackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next 3 -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmShrinkwrapDirs.push(packageFile.managerData.pnpmShrinkwrap);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n if (\n isString(npmrc) &&\n (npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName)\n ) {\n try {\n await writeLocalFile(npmrcFilename, npmrc.replace(/\\n?$/, '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n for (const packageName of packageNames) {\n if (\n 'packages' in npmLockParsed &&\n (packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`))\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (\n !(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )\n ) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n yarnrcYml ??= (await getFile(yarnrcYmlFilename)) ?? undefined;\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (\n config.isLockFileMaintenance &&\n config.reuseExistingBranch &&\n (await scm.branchExists(config.branchName))\n ) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8');\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing\n stderr: res.stderr || res.stdout,\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next 7 -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n /* v8 ignore next 4 -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmShrinkwrap of dirs.pnpmShrinkwrapDirs) {\n const lockFileDir = upath.dirname(pnpmShrinkwrap);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmShrinkwrap === pnpmShrinkwrap,\n );\n const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmShrinkwrap,\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing\n stderr: res.stderr || res.stdout,\n });\n } else {\n const existingContent = await getFile(\n pnpmShrinkwrap,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmShrinkwrap,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport { artifactErrorMessageFromExecError } from '../../util.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n getNpmrcContent,\n parseLockFile,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmShrinkwrapDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmShrinkwrapDirs.push(upgrade.managerData?.pnpmShrinkwrap);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<PackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next 3 -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmShrinkwrapDirs.push(packageFile.managerData.pnpmShrinkwrap);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n if (\n isString(npmrc) &&\n (npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName)\n ) {\n try {\n await writeLocalFile(npmrcFilename, npmrc.replace(/\\n?$/, '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n for (const packageName of packageNames) {\n if (\n 'packages' in npmLockParsed &&\n (packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`))\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (\n !(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )\n ) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n yarnrcYml ??= (await getFile(yarnrcYmlFilename)) ?? undefined;\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (\n config.isLockFileMaintenance &&\n config.reuseExistingBranch &&\n (await scm.branchExists(config.branchName))\n ) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8');\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next 7 -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n /* v8 ignore next 4 -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmShrinkwrap of dirs.pnpmShrinkwrapDirs) {\n const lockFileDir = upath.dirname(pnpmShrinkwrap);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmShrinkwrap === pnpmShrinkwrap,\n );\n const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmShrinkwrap,\n stderr: artifactErrorMessageFromExecError(res, ''),\n });\n } else {\n const existingContent = await getFile(\n pnpmShrinkwrap,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmShrinkwrap,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ const PackageResolvedPin = DeepNullish(z.object({
6
6
  kind: z.string(),
7
7
  location: z.string(),
8
8
  state: z.object({
9
- revision: z.string(),
9
+ revision: z.string().optional(),
10
10
  version: z.string().optional(),
11
11
  branch: z.string().optional()
12
12
  })
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/swift/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { DeepNullish, Json } from '../../../util/schema-utils/index.ts';\n\nconst PackageResolvedPin = DeepNullish(\n z.object({\n identity: z.string(),\n kind: z.string(),\n location: z.string(),\n state: z.object({\n revision: z.string(),\n version: z.string().optional(),\n branch: z.string().optional(),\n }),\n }),\n);\n\nexport type PackageResolvedPin = z.infer<typeof PackageResolvedPin>;\n\nexport const PackageResolvedJson = Json.pipe(\n z.object({\n pins: z.array(PackageResolvedPin),\n version: z.number().int().min(2),\n originHash: z.string().optional(),\n }),\n);\n\nexport type PackageResolvedJson = z.infer<typeof PackageResolvedJson>;\n"],"mappings":";;;AAGA,MAAM,qBAAqB,YACzB,EAAE,OAAO;CACP,UAAU,EAAE,OAAO;CACnB,MAAM,EAAE,OAAO;CACf,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,OAAO;EACd,UAAU,EAAE,OAAO;EACnB,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;EAC7B,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,CAAC;AACH,CAAC,CACH;AAIA,MAAa,sBAAsB,KAAK,KACtC,EAAE,OAAO;CACP,MAAM,EAAE,MAAM,kBAAkB;CAChC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAC/B,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;AAClC,CAAC,CACH"}
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/swift/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { DeepNullish, Json } from '../../../util/schema-utils/index.ts';\n\nconst PackageResolvedPin = DeepNullish(\n z.object({\n identity: z.string(),\n kind: z.string(),\n location: z.string(),\n state: z.object({\n // `revision` is required for source-control pins (kind: \"remoteSourceControl\"),\n // but absent for SwiftPM Package Registry pins (kind: \"registry\") per SE-0292:\n // registry packages are identified by version alone, not by a commit SHA. A\n // Package.resolved file mixing both kinds fails validation if we require\n // `revision` unconditionally.\n revision: z.string().optional(),\n version: z.string().optional(),\n branch: z.string().optional(),\n }),\n }),\n);\n\nexport type PackageResolvedPin = z.infer<typeof PackageResolvedPin>;\n\nexport const PackageResolvedJson = Json.pipe(\n z.object({\n pins: z.array(PackageResolvedPin),\n version: z.number().int().min(2),\n originHash: z.string().optional(),\n }),\n);\n\nexport type PackageResolvedJson = z.infer<typeof PackageResolvedJson>;\n"],"mappings":";;;AAGA,MAAM,qBAAqB,YACzB,EAAE,OAAO;CACP,UAAU,EAAE,OAAO;CACnB,MAAM,EAAE,OAAO;CACf,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,OAAO;EAMd,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;EAC9B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;EAC7B,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,CAAC;AACH,CAAC,CACH;AAIA,MAAa,sBAAsB,KAAK,KACtC,EAAE,OAAO;CACP,MAAM,EAAE,MAAM,kBAAkB;CAChC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAC/B,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;AAClC,CAAC,CACH"}
@@ -32,7 +32,18 @@ function applyGitSource(dep, git, rev, tag, branch) {
32
32
  dep.skipReason = branch ? "git-dependency" : "unspecified-version";
33
33
  }
34
34
  }
35
+ /**
36
+ * Given an {@link ExecError}, retrieve the message which will be used for an {@link ArtifactError}.
37
+ *
38
+ * An `ExecError` always carries a `stderr` property, so nullish coalescing would keep an empty string and render an artifact error with no message at all.
39
+ *
40
+ */
41
+ function artifactErrorMessageFromExecError(err, message) {
42
+ if (err.stderr?.trim()) return err.stderr;
43
+ if (err.stdout?.trim()) return err.stdout;
44
+ return message;
45
+ }
35
46
  //#endregion
36
- export { applyGitSource };
47
+ export { applyGitSource, artifactErrorMessageFromExecError };
37
48
 
38
49
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../../../lib/modules/manager/util.ts"],"sourcesContent":["import { detectPlatform } from '../../util/common.ts';\nimport { parseGitUrl } from '../../util/git/url.ts';\nimport { GitRefsDatasource } from '../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency } from './types.ts';\n\nexport function applyGitSource(\n dep: PackageDependency,\n git: string,\n rev: string | undefined,\n tag: string | undefined,\n branch: string | undefined,\n): void {\n if (tag) {\n const platform = detectPlatform(git);\n if (platform === 'github' || platform === 'gitlab') {\n dep.datasource =\n platform === 'github'\n ? GithubTagsDatasource.id\n : GitlabTagsDatasource.id;\n const { host, full_name } = parseGitUrl(git);\n\n // Always use HTTPS for GitHub/GitLab API endpoints, even if the git URL protocol is SSH.\n dep.registryUrls = [`https://${host}`];\n dep.packageName = full_name;\n } else {\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = git;\n }\n dep.currentValue = tag;\n dep.skipReason = undefined;\n } else if (rev) {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentDigest = rev;\n dep.replaceString = rev;\n dep.skipReason = undefined;\n } else {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentValue = branch;\n dep.skipReason = branch ? 'git-dependency' : 'unspecified-version';\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,eACd,KACA,KACA,KACA,KACA,QACM;CACN,IAAI,KAAK;EACP,MAAM,WAAW,eAAe,GAAG;EACnC,IAAI,aAAa,YAAY,aAAa,UAAU;GAClD,IAAI,aACF,aAAa,WACT,qBAAqB,KACrB,qBAAqB;GAC3B,MAAM,EAAE,MAAM,cAAc,YAAY,GAAG;GAG3C,IAAI,eAAe,CAAC,WAAW,MAAM;GACrC,IAAI,cAAc;EACpB,OAAO;GACL,IAAI,aAAa,kBAAkB;GACnC,IAAI,cAAc;EACpB;EACA,IAAI,eAAe;EACnB,IAAI,aAAa,KAAA;CACnB,OAAO,IAAI,KAAK;EACd,IAAI,aAAa,kBAAkB;EACnC,IAAI,cAAc;EAClB,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;EACpB,IAAI,aAAa,KAAA;CACnB,OAAO;EACL,IAAI,aAAa,kBAAkB;EACnC,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,aAAa,SAAS,mBAAmB;CAC/C;AACF"}
1
+ {"version":3,"file":"util.js","names":[],"sources":["../../../lib/modules/manager/util.ts"],"sourcesContent":["import { detectPlatform } from '../../util/common.ts';\nimport type { ExecError } from '../../util/exec/exec-error.ts';\nimport { parseGitUrl } from '../../util/git/url.ts';\nimport { GitRefsDatasource } from '../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../datasource/gitlab-tags/index.ts';\nimport type { PackageDependency } from './types.ts';\n\nexport function applyGitSource(\n dep: PackageDependency,\n git: string,\n rev: string | undefined,\n tag: string | undefined,\n branch: string | undefined,\n): void {\n if (tag) {\n const platform = detectPlatform(git);\n if (platform === 'github' || platform === 'gitlab') {\n dep.datasource =\n platform === 'github'\n ? GithubTagsDatasource.id\n : GitlabTagsDatasource.id;\n const { host, full_name } = parseGitUrl(git);\n\n // Always use HTTPS for GitHub/GitLab API endpoints, even if the git URL protocol is SSH.\n dep.registryUrls = [`https://${host}`];\n dep.packageName = full_name;\n } else {\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = git;\n }\n dep.currentValue = tag;\n dep.skipReason = undefined;\n } else if (rev) {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentDigest = rev;\n dep.replaceString = rev;\n dep.skipReason = undefined;\n } else {\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = git;\n dep.currentValue = branch;\n dep.skipReason = branch ? 'git-dependency' : 'unspecified-version';\n }\n}\n\n/**\n * Given an {@link ExecError}, retrieve the message which will be used for an {@link ArtifactError}.\n *\n * An `ExecError` always carries a `stderr` property, so nullish coalescing would keep an empty string and render an artifact error with no message at all.\n *\n */\nexport function artifactErrorMessageFromExecError(\n err: Partial<ExecError>,\n message: string,\n): string {\n if (err.stderr?.trim()) {\n return err.stderr;\n }\n\n if (err.stdout?.trim()) {\n return err.stdout;\n }\n\n return message;\n}\n"],"mappings":";;;;;;;AASA,SAAgB,eACd,KACA,KACA,KACA,KACA,QACM;CACN,IAAI,KAAK;EACP,MAAM,WAAW,eAAe,GAAG;EACnC,IAAI,aAAa,YAAY,aAAa,UAAU;GAClD,IAAI,aACF,aAAa,WACT,qBAAqB,KACrB,qBAAqB;GAC3B,MAAM,EAAE,MAAM,cAAc,YAAY,GAAG;GAG3C,IAAI,eAAe,CAAC,WAAW,MAAM;GACrC,IAAI,cAAc;EACpB,OAAO;GACL,IAAI,aAAa,kBAAkB;GACnC,IAAI,cAAc;EACpB;EACA,IAAI,eAAe;EACnB,IAAI,aAAa,KAAA;CACnB,OAAO,IAAI,KAAK;EACd,IAAI,aAAa,kBAAkB;EACnC,IAAI,cAAc;EAClB,IAAI,gBAAgB;EACpB,IAAI,gBAAgB;EACpB,IAAI,aAAa,KAAA;CACnB,OAAO;EACL,IAAI,aAAa,kBAAkB;EACnC,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,IAAI,aAAa,SAAS,mBAAmB;CAC/C;AACF;;;;;;;AAQA,SAAgB,kCACd,KACA,SACQ;CACR,IAAI,IAAI,QAAQ,KAAK,GACnB,OAAO,IAAI;CAGb,IAAI,IAAI,QAAQ,KAAK,GACnB,OAAO,IAAI;CAGb,OAAO;AACT"}
@@ -117,6 +117,11 @@ declare function isToolName(value: unknown): value is ToolName;
117
117
  * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports, with optional description.
118
118
  */
119
119
  declare const additionalConstraintDefinitions: [{
120
+ readonly name: 'ghActionsLock';
121
+ readonly description: `Used in the \`github-actions\` manager to specify a release tag for the [\`github/gh-actions-lock\`](https://github.com/github/gh-actions-lock) \`gh\` CLI extension, which regenerates \`.github/workflows/actions.lock\`.
122
+
123
+ Must be a full release tag, prefixed with \`v\`, such as \`v0.1.7\`. Set it to an empty string to always install the latest release.`;
124
+ }, {
120
125
  readonly name: 'go';
121
126
  readonly description: `Used in the \`gomod\` manager to specify the version of the Go toolchain to use.
122
127
 
@@ -67,6 +67,12 @@ function isToolName(value) {
67
67
  * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports, with optional description.
68
68
  */
69
69
  const additionalConstraintDefinitions = [
70
+ {
71
+ name: "ghActionsLock",
72
+ description: `Used in the \`github-actions\` manager to specify a release tag for the [\`github/gh-actions-lock\`](https://github.com/github/gh-actions-lock) \`gh\` CLI extension, which regenerates \`.github/workflows/actions.lock\`.
73
+
74
+ Must be a full release tag, prefixed with \`v\`, such as \`v0.1.7\`. Set it to an empty string to always install the latest release.`
75
+ },
70
76
  (
71
77
  /**
72
78
  * @deprecated TODO remove in #42600
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../lib/util/exec/types.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport type { Options as ExecaOptions } from 'execa';\nimport type { VersioningName } from '../../versioning-list.generated.ts';\n\nexport interface ConstraintDefinition {\n name: string;\n description?: string;\n}\n\n/**\n * A `tool` that Containerbase supports.\n *\n * TODO #41849 replace with upstream types\n */\nexport const toolDefinitions = [\n {\n name: 'bazelisk',\n },\n {\n name: 'bun',\n },\n {\n name: 'bundler',\n },\n {\n name: 'cocoapods',\n },\n {\n name: 'composer',\n },\n {\n name: 'conan',\n },\n {\n name: 'copier',\n },\n {\n name: 'corepack',\n },\n {\n name: 'deno',\n },\n {\n name: 'devbox',\n },\n {\n name: 'dotnet',\n },\n {\n name: 'erlang',\n },\n {\n name: 'elixir',\n },\n {\n name: 'flux',\n },\n {\n name: 'gh',\n },\n {\n name: 'gleam',\n },\n {\n name: 'golang',\n },\n {\n name: 'gradle',\n },\n {\n name: 'hashin',\n },\n {\n name: 'helm',\n },\n {\n name: 'helmfile',\n },\n {\n name: 'java',\n },\n {\n name: 'java-maven',\n },\n {\n name: 'jb',\n },\n {\n name: 'kustomize',\n },\n {\n name: 'maven',\n },\n {\n name: 'mise',\n },\n {\n name: 'nix',\n },\n {\n name: 'node',\n },\n {\n name: 'npm',\n },\n {\n name: 'pdm',\n },\n {\n name: 'php',\n },\n {\n name: 'pip-tools',\n },\n {\n name: 'pipenv',\n },\n {\n name: 'pnpm',\n },\n {\n name: 'pixi',\n },\n {\n name: 'poetry',\n },\n {\n name: 'python',\n },\n {\n name: 'ruby',\n description: 'Also used in the `rubygems` Datasource',\n },\n {\n name: 'rust',\n },\n {\n name: 'uv',\n },\n {\n name: 'yarn',\n },\n {\n name: 'yarn-slim',\n },\n {\n name: 'dart',\n },\n {\n name: 'flutter',\n },\n {\n name: 'vendir',\n },\n] as const satisfies ConstraintDefinition[];\n\n/**\n * A `tool` that Containerbase supports.\n */\nexport type ToolName = (typeof toolDefinitions)[number]['name'];\n\n/**\n * A `tool` that Containerbase supports.\n */\nexport const toolNames: ToolName[] = toolDefinitions.map((t) => t.name);\n\nexport function isToolName(value: unknown): value is ToolName {\n return isString(value) && (toolNames as readonly string[]).includes(value);\n}\n\n/**\n * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports, with optional description.\n */\nexport const additionalConstraintDefinitions = [\n /**\n * @deprecated TODO remove in #42600\n */\n {\n name: 'go',\n description: `Used in the \\`gomod\\` manager to specify the version of the Go toolchain to use.\n\nIn precedence order:\n\n1. config: \\`constraints.go\\`\n1. \\`go.mod\\`: \\`toolchain\\` directive\n1. \\`go.mod\\`: \\`go\\` directive\n\nNOTE that the \\`constraints.golang\\` is not used (https://github.com/renovatebot/renovate/issues/42601)\n `,\n },\n {\n name: 'gomodMod',\n description: `Used in the \\`gomod\\` manager to specify a tag for [\\`github.com/marwan-at-work/mod\\`](https://github.com/marwan-at-work/mod).\n\nMust be prefixed with \\`v\\`.`,\n },\n {\n name: 'jenkins',\n description:\n 'Used in the `jenkins-plugins` datasource to specify a minimum version of Jenkins that a plugin must support.',\n },\n {\n name: 'pipTools',\n description:\n 'Used in the `pip-compile` manager to specify a version of `pip-tools` to use. @deprecated TODO remove in #42599',\n },\n {\n name: 'platform',\n description:\n 'Used in the `rubygems` datasource to specify the `platform` that the Gem dependency supports.',\n },\n {\n name: 'rubygems',\n description:\n 'Used in the `rubygems` datasource to specify the version of the `rubygems` tool that is needed to use this Gem.',\n },\n {\n name: 'vscode',\n description:\n 'Used in the `npm` manager to track the version of VSCode that the package is compatible with.',\n },\n {\n name: 'dotnet-sdk',\n description:\n 'Used in the `nuget` manager to track .NET SDK version required.',\n },\n {\n name: 'perl',\n description:\n 'Used in the `cpanfile` manager to track Perl version required.',\n },\n {\n name: '%goMod',\n description:\n 'Used in the `gomod` manager to determine the [minimum version of Go required to use this module](https://go.dev/ref/mod#go-mod-file-go).\\n\\nNote that this is prefixed with a `%` to explicitly note that this is not a tool that Containerbase knows.',\n },\n] as const satisfies ConstraintDefinition[];\n\n/**\n * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports.\n */\nexport type AdditionalConstraintName =\n (typeof additionalConstraintDefinitions)[number]['name'];\n\n/**\n * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports.\n */\nexport const additionalConstraintNames: AdditionalConstraintName[] =\n additionalConstraintDefinitions.map((c) => c.name);\n\nexport function isAdditionalConstraintName(\n value: unknown,\n): value is AdditionalConstraintName {\n return (\n isString(value) &&\n (additionalConstraintNames as readonly string[]).includes(value)\n );\n}\n\n/**\n * A name usable as a key in a `constraints` record, which may be tools that Containerbase supports.\n */\nexport type ConstraintName = ToolName | AdditionalConstraintName;\n\nexport function isConstraintName(value: unknown): value is ConstraintName {\n return isToolName(value) || isAdditionalConstraintName(value);\n}\n\nexport interface ToolConstraint {\n toolName: ToolName;\n constraint?: string | null;\n}\n\nexport interface ToolConfig {\n datasource: string;\n extractVersion?: string;\n packageName: string;\n versioning: VersioningName;\n}\n\nexport type Opt<T> = T | null | undefined;\n\nexport type VolumesPair = [string, string];\nexport type VolumeOption = Opt<string | VolumesPair>;\n\nexport interface DockerOptions {\n volumes?: Opt<VolumeOption[]>;\n envVars?: Opt<Opt<string>[]>;\n cwd?: Opt<string>;\n}\n\nexport type DataListener = (chunk: any) => void;\nexport interface OutputListeners {\n stdout?: DataListener[];\n stderr?: DataListener[];\n}\n\nexport interface OutputWriter {\n write(chunk: Buffer): void;\n toString(): string;\n}\n\nexport interface OutputWriters {\n stdout?: OutputWriter;\n stderr?: OutputWriter;\n}\n\nexport interface RawExecOptions extends ExecaOptions {\n maxBuffer?: number | undefined;\n cwd?: string;\n outputListeners?: OutputListeners;\n outputWriters?: OutputWriters;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n /**\n * The process' exit code in the case of a failure.\n *\n * This is only set if using `ignoreFailure` when executing a command\n *\n */\n exitCode?: number;\n}\n\nexport type ExtraEnv<T = unknown> = Record<string, T>;\n\nexport interface ExecOptions {\n cwd?: string;\n cwdFile?: string;\n env?: Opt<ExtraEnv>;\n extraEnv?: Opt<ExtraEnv>;\n docker?: Opt<DockerOptions>;\n toolConstraints?: Opt<ToolConstraint[]>;\n preCommands?: Opt<string[]>;\n ignoreStdout?: boolean;\n // Following are pass-through to child process\n maxBuffer?: number | undefined;\n timeout?: number | undefined;\n shell?: boolean | string | undefined;\n}\n\n/**\n * configuration that can be configured on a per-command basis, that doesn't make sense to be on the `RawExecOptions`\n */\nexport interface CommandWithOptions {\n command: string[];\n\n /** do not throw errors when a command fails, but do log that an error occurred */\n ignoreFailure?: boolean;\n\n /**\n * Execute the `command` within a shell\n *\n * WARNING this can result in security issues if this includes user-controlled commands\n * **/\n shell?: boolean | string;\n}\n"],"mappings":";;;;;;;AAcA,MAAa,kBAAkB;CAC7B,EACE,MAAM,WACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,UACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,WACR;CACA,EACE,MAAM,QACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,WACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,KACR;CACA,EACE,MAAM,QACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,WACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,aACR;CACA,EACE,MAAM,KACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,QACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA;EACE,MAAM;EACN,aAAa;CACf;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,KACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,UACR;CACA,EACE,MAAM,SACR;AACF;;;;AAUA,MAAa,YAAwB,gBAAgB,KAAK,MAAM,EAAE,IAAI;AAEtE,SAAgB,WAAW,OAAmC;CAC5D,OAAO,SAAS,KAAK,KAAM,UAAgC,SAAS,KAAK;AAC3E;;;;AAKA,MAAa,kCAAkC;;;;;CAI7C;EACE,MAAM;EACN,aAAa;;;;;;;;;;CAUf;CACA;EACE,MAAM;EACN,aAAa;;;CAGf;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;AACF;;;;AAWA,MAAa,4BACX,gCAAgC,KAAK,MAAM,EAAE,IAAI;AAEnD,SAAgB,2BACd,OACmC;CACnC,OACE,SAAS,KAAK,KACb,0BAAgD,SAAS,KAAK;AAEnE;AAOA,SAAgB,iBAAiB,OAAyC;CACxE,OAAO,WAAW,KAAK,KAAK,2BAA2B,KAAK;AAC9D"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../lib/util/exec/types.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport type { Options as ExecaOptions } from 'execa';\nimport type { VersioningName } from '../../versioning-list.generated.ts';\n\nexport interface ConstraintDefinition {\n name: string;\n description?: string;\n}\n\n/**\n * A `tool` that Containerbase supports.\n *\n * TODO #41849 replace with upstream types\n */\nexport const toolDefinitions = [\n {\n name: 'bazelisk',\n },\n {\n name: 'bun',\n },\n {\n name: 'bundler',\n },\n {\n name: 'cocoapods',\n },\n {\n name: 'composer',\n },\n {\n name: 'conan',\n },\n {\n name: 'copier',\n },\n {\n name: 'corepack',\n },\n {\n name: 'deno',\n },\n {\n name: 'devbox',\n },\n {\n name: 'dotnet',\n },\n {\n name: 'erlang',\n },\n {\n name: 'elixir',\n },\n {\n name: 'flux',\n },\n {\n name: 'gh',\n },\n {\n name: 'gleam',\n },\n {\n name: 'golang',\n },\n {\n name: 'gradle',\n },\n {\n name: 'hashin',\n },\n {\n name: 'helm',\n },\n {\n name: 'helmfile',\n },\n {\n name: 'java',\n },\n {\n name: 'java-maven',\n },\n {\n name: 'jb',\n },\n {\n name: 'kustomize',\n },\n {\n name: 'maven',\n },\n {\n name: 'mise',\n },\n {\n name: 'nix',\n },\n {\n name: 'node',\n },\n {\n name: 'npm',\n },\n {\n name: 'pdm',\n },\n {\n name: 'php',\n },\n {\n name: 'pip-tools',\n },\n {\n name: 'pipenv',\n },\n {\n name: 'pnpm',\n },\n {\n name: 'pixi',\n },\n {\n name: 'poetry',\n },\n {\n name: 'python',\n },\n {\n name: 'ruby',\n description: 'Also used in the `rubygems` Datasource',\n },\n {\n name: 'rust',\n },\n {\n name: 'uv',\n },\n {\n name: 'yarn',\n },\n {\n name: 'yarn-slim',\n },\n {\n name: 'dart',\n },\n {\n name: 'flutter',\n },\n {\n name: 'vendir',\n },\n] as const satisfies ConstraintDefinition[];\n\n/**\n * A `tool` that Containerbase supports.\n */\nexport type ToolName = (typeof toolDefinitions)[number]['name'];\n\n/**\n * A `tool` that Containerbase supports.\n */\nexport const toolNames: ToolName[] = toolDefinitions.map((t) => t.name);\n\nexport function isToolName(value: unknown): value is ToolName {\n return isString(value) && (toolNames as readonly string[]).includes(value);\n}\n\n/**\n * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports, with optional description.\n */\nexport const additionalConstraintDefinitions = [\n {\n name: 'ghActionsLock',\n description: `Used in the \\`github-actions\\` manager to specify a release tag for the [\\`github/gh-actions-lock\\`](https://github.com/github/gh-actions-lock) \\`gh\\` CLI extension, which regenerates \\`.github/workflows/actions.lock\\`.\n\nMust be a full release tag, prefixed with \\`v\\`, such as \\`v0.1.7\\`. Set it to an empty string to always install the latest release.`,\n },\n /**\n * @deprecated TODO remove in #42600\n */\n {\n name: 'go',\n description: `Used in the \\`gomod\\` manager to specify the version of the Go toolchain to use.\n\nIn precedence order:\n\n1. config: \\`constraints.go\\`\n1. \\`go.mod\\`: \\`toolchain\\` directive\n1. \\`go.mod\\`: \\`go\\` directive\n\nNOTE that the \\`constraints.golang\\` is not used (https://github.com/renovatebot/renovate/issues/42601)\n `,\n },\n {\n name: 'gomodMod',\n description: `Used in the \\`gomod\\` manager to specify a tag for [\\`github.com/marwan-at-work/mod\\`](https://github.com/marwan-at-work/mod).\n\nMust be prefixed with \\`v\\`.`,\n },\n {\n name: 'jenkins',\n description:\n 'Used in the `jenkins-plugins` datasource to specify a minimum version of Jenkins that a plugin must support.',\n },\n {\n name: 'pipTools',\n description:\n 'Used in the `pip-compile` manager to specify a version of `pip-tools` to use. @deprecated TODO remove in #42599',\n },\n {\n name: 'platform',\n description:\n 'Used in the `rubygems` datasource to specify the `platform` that the Gem dependency supports.',\n },\n {\n name: 'rubygems',\n description:\n 'Used in the `rubygems` datasource to specify the version of the `rubygems` tool that is needed to use this Gem.',\n },\n {\n name: 'vscode',\n description:\n 'Used in the `npm` manager to track the version of VSCode that the package is compatible with.',\n },\n {\n name: 'dotnet-sdk',\n description:\n 'Used in the `nuget` manager to track .NET SDK version required.',\n },\n {\n name: 'perl',\n description:\n 'Used in the `cpanfile` manager to track Perl version required.',\n },\n {\n name: '%goMod',\n description:\n 'Used in the `gomod` manager to determine the [minimum version of Go required to use this module](https://go.dev/ref/mod#go-mod-file-go).\\n\\nNote that this is prefixed with a `%` to explicitly note that this is not a tool that Containerbase knows.',\n },\n] as const satisfies ConstraintDefinition[];\n\n/**\n * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports.\n */\nexport type AdditionalConstraintName =\n (typeof additionalConstraintDefinitions)[number]['name'];\n\n/**\n * Additional constraints that can be specified for some Managers, but are **not** tools that Containerbase supports.\n */\nexport const additionalConstraintNames: AdditionalConstraintName[] =\n additionalConstraintDefinitions.map((c) => c.name);\n\nexport function isAdditionalConstraintName(\n value: unknown,\n): value is AdditionalConstraintName {\n return (\n isString(value) &&\n (additionalConstraintNames as readonly string[]).includes(value)\n );\n}\n\n/**\n * A name usable as a key in a `constraints` record, which may be tools that Containerbase supports.\n */\nexport type ConstraintName = ToolName | AdditionalConstraintName;\n\nexport function isConstraintName(value: unknown): value is ConstraintName {\n return isToolName(value) || isAdditionalConstraintName(value);\n}\n\nexport interface ToolConstraint {\n toolName: ToolName;\n constraint?: string | null;\n}\n\nexport interface ToolConfig {\n datasource: string;\n extractVersion?: string;\n packageName: string;\n versioning: VersioningName;\n}\n\nexport type Opt<T> = T | null | undefined;\n\nexport type VolumesPair = [string, string];\nexport type VolumeOption = Opt<string | VolumesPair>;\n\nexport interface DockerOptions {\n volumes?: Opt<VolumeOption[]>;\n envVars?: Opt<Opt<string>[]>;\n cwd?: Opt<string>;\n}\n\nexport type DataListener = (chunk: any) => void;\nexport interface OutputListeners {\n stdout?: DataListener[];\n stderr?: DataListener[];\n}\n\nexport interface OutputWriter {\n write(chunk: Buffer): void;\n toString(): string;\n}\n\nexport interface OutputWriters {\n stdout?: OutputWriter;\n stderr?: OutputWriter;\n}\n\nexport interface RawExecOptions extends ExecaOptions {\n maxBuffer?: number | undefined;\n cwd?: string;\n outputListeners?: OutputListeners;\n outputWriters?: OutputWriters;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n /**\n * The process' exit code in the case of a failure.\n *\n * This is only set if using `ignoreFailure` when executing a command\n *\n */\n exitCode?: number;\n}\n\nexport type ExtraEnv<T = unknown> = Record<string, T>;\n\nexport interface ExecOptions {\n cwd?: string;\n cwdFile?: string;\n env?: Opt<ExtraEnv>;\n extraEnv?: Opt<ExtraEnv>;\n docker?: Opt<DockerOptions>;\n toolConstraints?: Opt<ToolConstraint[]>;\n preCommands?: Opt<string[]>;\n ignoreStdout?: boolean;\n // Following are pass-through to child process\n maxBuffer?: number | undefined;\n timeout?: number | undefined;\n shell?: boolean | string | undefined;\n}\n\n/**\n * configuration that can be configured on a per-command basis, that doesn't make sense to be on the `RawExecOptions`\n */\nexport interface CommandWithOptions {\n command: string[];\n\n /** do not throw errors when a command fails, but do log that an error occurred */\n ignoreFailure?: boolean;\n\n /**\n * Execute the `command` within a shell\n *\n * WARNING this can result in security issues if this includes user-controlled commands\n * **/\n shell?: boolean | string;\n}\n"],"mappings":";;;;;;;AAcA,MAAa,kBAAkB;CAC7B,EACE,MAAM,WACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,UACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,WACR;CACA,EACE,MAAM,QACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,WACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,KACR;CACA,EACE,MAAM,QACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,WACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,aACR;CACA,EACE,MAAM,KACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,QACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,MACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,SACR;CACA,EACE,MAAM,SACR;CACA;EACE,MAAM;EACN,aAAa;CACf;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,KACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,YACR;CACA,EACE,MAAM,OACR;CACA,EACE,MAAM,UACR;CACA,EACE,MAAM,SACR;AACF;;;;AAUA,MAAa,YAAwB,gBAAgB,KAAK,MAAM,EAAE,IAAI;AAEtE,SAAgB,WAAW,OAAmC;CAC5D,OAAO,SAAS,KAAK,KAAM,UAAgC,SAAS,KAAK;AAC3E;;;;AAKA,MAAa,kCAAkC;CAC7C;EACE,MAAM;EACN,aAAa;;;CAGf;;;;;CAIA;EACE,MAAM;EACN,aAAa;;;;;;;;;;CAUf;CACA;EACE,MAAM;EACN,aAAa;;;CAGf;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;CACA;EACE,MAAM;EACN,aACE;CACJ;AACF;;;;AAWA,MAAa,4BACX,gCAAgC,KAAK,MAAM,EAAE,IAAI;AAEnD,SAAgB,2BACd,OACmC;CACnC,OACE,SAAS,KAAK,KACb,0BAAgD,SAAS,KAAK;AAEnE;AAOA,SAAgB,iBAAiB,OAAyC;CACxE,OAAO,WAAW,KAAK,KAAK,2BAA2B,KAAK;AAC9D"}
@@ -17,6 +17,7 @@ import { embedChangelogs } from "../../changelog/index.js";
17
17
  import { getMergeConfidenceLevel, isActiveConfidenceLevel, satisfiesConfidenceLevel } from "../../../../util/merge-confidence/index.js";
18
18
  import { setConfidence, setStability } from "./status-checks.js";
19
19
  import { ensurePr, getPlatformPrOptions } from "../pr/index.js";
20
+ import { updateActionsLockfile } from "../../../../modules/manager/github-actions/artifacts.js";
20
21
  import { getAdditionalFiles } from "../../../../modules/manager/npm/post-update/index.js";
21
22
  import { checkAutoMerge } from "../pr/automerge.js";
22
23
  import { setArtifactErrorStatus } from "./artifacts.js";
@@ -382,6 +383,9 @@ async function processBranch(branchConfig, forceRebase = false) {
382
383
  config.artifactErrors = (config.artifactErrors ?? []).concat(additionalFiles.artifactErrors);
383
384
  config.artifactNotices = (config.artifactNotices ?? []).concat(additionalFiles.artifactNotices ?? []);
384
385
  config.updatedArtifacts = (config.updatedArtifacts ?? []).concat(additionalFiles.updatedArtifacts);
386
+ const actionsLockfile = await updateActionsLockfile(config, branchConfig.packageFiles);
387
+ config.artifactErrors = config.artifactErrors.concat(actionsLockfile.artifactErrors);
388
+ config.updatedArtifacts = config.updatedArtifacts.concat(actionsLockfile.updatedArtifacts);
385
389
  if (config.updatedArtifacts?.length) {
386
390
  logger.debug({ updatedArtifacts: config.updatedArtifacts.map((f) => f.type === "deletion" ? `${f.path} (delete)` : f.path) }, `Updated ${config.updatedArtifacts.length} lock files`);
387
391
  if (config.reuseExistingBranch && !forceRebase) {