renovate 44.217.0 → 44.218.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":"extract.js","names":[],"sources":["../../../../lib/modules/manager/mise/extract.ts"],"sourcesContent":["import {\n isArray,\n isFunction,\n isNonEmptyString,\n isObject,\n} from '@sindresorhus/is';\nimport javaLtsVersions from '../../../data/java-version-lts.json' with { type: 'json' };\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { JavaVersionDatasource } from '../../datasource/java-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport type { StaticTooling } from '../asdf/types.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport {\n createAquaToolConfig,\n createCargoToolConfig,\n createCondaToolConfig,\n createDotnetToolConfig,\n createGemToolConfig,\n createGithubToolConfig,\n createGitlabToolConfig,\n createGoToolConfig,\n createNpmToolConfig,\n createPipxToolConfig,\n createPypiToolConfig,\n createSpmToolConfig,\n createUbiToolConfig,\n} from './backends.ts';\nimport { extractGitReference } from './git-reference.ts';\nimport { extractInclude } from './include.ts';\nimport { getLockFileName, getLockedVersion } from './lockfile.ts';\nimport type { MiseTool, MiseToolOptions, MiseToolValue } from './schema.ts';\nimport { MiseLockFile } from './schema.ts';\nimport type { BackendToolingConfig, ToolingDefinition } from './types.ts';\nimport {\n asdfTooling,\n getOrderedMiseRegistryBackends,\n miseTooling,\n} from './upgradeable-tooling.ts';\nimport { parseTomlFile } from './utils.ts';\n\n// Tool names can have options in the tool name\n// e.g. ubi:tamasfe/taplo[matching=full,exe=taplo]\nconst optionInToolNameRegex = regEx(/^(?<name>.+?)(?:\\[(?<options>.+)\\])?$/);\nconst nonVersionSelectorRegex = regEx(/^(?:ref:|path:|sub-\\d+(?::|$))/);\nconst partialSelectorRegex = regEx(\n /^(?<prefix>[^\\d]*)(?<major>\\d+)(?:\\.(?<minor>\\d+))?$/,\n);\nconst versionPrefixRegex = regEx(/^(?<prefix>[^\\d]*)\\d/);\n\ntype MiseDependency = PackageDependency & { depName: string };\n\ninterface MiseSelectorConfig {\n allowedVersions?: string;\n ignoreUnstable?: boolean;\n}\n\n/**\n * Extracts mise tool dependencies from a mise configuration file.\n * Supports various backends (core, asdf, aqua, cargo, etc.) and\n * extracts locked versions when a corresponding lock file exists.\n */\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n): Promise<PackageFileContent | null> {\n logger.trace(`mise.extractPackageFile(${packageFile})`);\n\n const misefile = parseTomlFile(content, packageFile);\n if (!misefile) {\n return null;\n }\n\n const toolEntries: [string, MiseTool, string][] = [];\n\n for (const [name, toolData] of Object.entries(misefile.tools)) {\n toolEntries.push([name, toolData, 'tools']);\n }\n\n for (const [taskName, taskData] of Object.entries(misefile.tasks)) {\n for (const [name, toolData] of Object.entries(\n coerceObject(taskData.tools),\n )) {\n toolEntries.push([name, toolData, `task-${taskName}-tools`]);\n }\n }\n\n const taskFileDeps: PackageDependency[] = [];\n for (const [taskName, taskData] of Object.entries(misefile.tasks)) {\n if (taskData.file) {\n // local paths and plain http(s) urls have no version\n const dep = extractGitReference(\n taskData.file.trim(),\n content,\n `task-${taskName}-file`,\n );\n if (dep) {\n taskFileDeps.push(dep);\n }\n }\n }\n\n const includeDeps = misefile.include.map((include) =>\n extractInclude(include, content),\n );\n\n if (!toolEntries.length && !taskFileDeps.length && !includeDeps.length) {\n return null;\n }\n\n const lockFileName = getLockFileName(packageFile);\n const lockFileContent = await readLocalFile(lockFileName, 'utf8');\n let lockFileData: MiseLockFile | undefined;\n if (lockFileContent) {\n const lockFileParsed = MiseLockFile.safeParse(lockFileContent);\n if (lockFileParsed.success) {\n lockFileData = lockFileParsed.data;\n } else {\n logger.debug(\n { lockFileName, err: lockFileParsed.error },\n 'Failed to parse mise lock file',\n );\n }\n }\n\n const deps = [\n ...toolEntries.map(([name, toolData, depType]) =>\n extractToolEntry(name, toolData, depType, lockFileData),\n ),\n ...taskFileDeps,\n ...includeDeps,\n ];\n const result: PackageFileContent = { deps };\n\n if (lockFileData) {\n result.lockFiles = [lockFileName];\n }\n\n return result;\n}\n\n/**\n * Returns the primary tool entry. For arrays only the first entry is managed,\n * e.g. 'erlang = [\"23.3\", \"24.0\"]' or\n * 'rust = [{ version = \"1.98.1\", profile = \"minimal\" }, { version = \"nightly\" }]'.\n */\nfunction getPrimaryToolValue(toolData: MiseTool): MiseToolValue | null {\n if (isArray(toolData)) {\n return toolData.length ? toolData[0] : null;\n }\n return toolData;\n}\n\nfunction parseVersion(toolValue: MiseToolValue | null): string | null {\n if (isNonEmptyString(toolValue)) {\n // Handle the string case\n // e.g. 'erlang = \"23.3\"'\n return toolValue;\n }\n if (isObject(toolValue) && isNonEmptyString(toolValue.version)) {\n // Handle the object case with a string version\n // e.g. 'python = { version = \"3.11.2\" }'\n return toolValue.version;\n }\n return null; // Return null if no version is found\n}\n\nfunction parseOptions(\n optionsInName: string,\n toolOptions: MiseToolOptions,\n): MiseToolOptions {\n const options = isNonEmptyString(optionsInName)\n ? Object.fromEntries(\n optionsInName.split(',').map((option) => option.split('=', 2)),\n )\n : {};\n // Options in toolOptions will override options in the tool name\n return {\n ...options,\n ...toolOptions,\n };\n}\n\nfunction getToolConfig(\n backend: string,\n toolName: string,\n version: string,\n toolOptions: MiseToolOptions,\n): StaticTooling | BackendToolingConfig | null {\n switch (backend) {\n case '': {\n // If the tool name does not specify a backend, it should be a short name or an alias defined by users\n const staticResult = getRegistryToolConfig(toolName, version);\n if (staticResult) {\n return staticResult;\n }\n\n // Otherwise, see if we have any known short tool names that are in the `mise-registry.json` data file\n const backends = getOrderedMiseRegistryBackends(toolName);\n\n // prioritise the github backend as the best source for data\n if (backends.github) {\n const result = getToolConfig(\n 'github',\n backends.github,\n version,\n toolOptions,\n );\n // v8 ignore else -- TODO: add test #40625\n if (result !== null) {\n return result;\n }\n }\n\n for (const [backendType, backendName] of Object.entries(backends)) {\n const result = getToolConfig(\n backendType,\n backendName,\n version,\n toolOptions,\n );\n // v8 ignore else -- TODO: add test #40625\n if (result !== null) {\n return result;\n }\n }\n return null;\n }\n // We can specify core, asdf, vfox, aqua backends for tools in the default registry\n // e.g. 'core:rust', 'asdf:rust', 'vfox:clang', 'aqua:act'\n case 'core':\n return getConfigFromTooling(miseTooling, toolName, version);\n case 'asdf':\n return getConfigFromTooling(asdfTooling, toolName, version);\n case 'vfox':\n return getRegistryToolConfig(toolName, version);\n case 'aqua':\n return (\n getRegistryToolConfig(toolName, version) ??\n createAquaToolConfig(toolName, version)\n );\n case 'cargo':\n return createCargoToolConfig(toolName, version);\n case 'conda':\n return createCondaToolConfig(toolName);\n case 'dotnet':\n return createDotnetToolConfig(toolName);\n case 'gem':\n return createGemToolConfig(toolName);\n case 'github':\n return createGithubToolConfig(toolName, version, toolOptions);\n case 'gitlab':\n return createGitlabToolConfig(toolName, version, toolOptions);\n case 'go':\n return createGoToolConfig(toolName);\n case 'npm':\n return createNpmToolConfig(toolName);\n case 'pipx':\n return createPipxToolConfig(toolName);\n case 'pypi':\n return createPypiToolConfig(toolName);\n case 'spm':\n return createSpmToolConfig(toolName);\n case 'ubi':\n return createUbiToolConfig(toolName, version, toolOptions);\n default:\n // Unsupported backend\n return null;\n }\n}\n\n/**\n * Get the tooling config for a short name defined in the default registry\n * @link https://mise.jdx.dev/registry.html\n */\nfunction getRegistryToolConfig(\n short: string,\n version: string,\n): StaticTooling | null {\n // Try to get the config from miseTooling first, then asdfTooling\n return (\n getConfigFromTooling(miseTooling, short, version) ??\n getConfigFromTooling(asdfTooling, short, version)\n );\n}\n\nfunction getConfigFromTooling(\n toolingSource: Record<string, ToolingDefinition>,\n name: string,\n version: string,\n): StaticTooling | null {\n const toolDefinition = toolingSource[name];\n if (!toolDefinition) {\n return null;\n } // Return null if no toolDefinition is found\n\n return (\n (isFunction(toolDefinition.config)\n ? toolDefinition.config(version)\n : toolDefinition.config) ?? null\n ); // Ensure null is returned instead of undefined\n}\n\nfunction getLtsDatasource(\n backend: string,\n toolName: string,\n datasource: string | undefined,\n): string | undefined {\n if (datasource) {\n return datasource;\n }\n const isCoreBackend = backend === '' || backend === 'core';\n if (isCoreBackend && toolName === 'java') {\n return JavaVersionDatasource.id;\n }\n return undefined;\n}\n\nfunction getSelectorConfig(\n version: string,\n backend: string,\n toolName: string,\n datasource: string | undefined,\n lockedVersion: string,\n): MiseSelectorConfig | null {\n if (version === 'latest') {\n return {};\n }\n\n if (version === 'lts') {\n const ltsDatasource = getLtsDatasource(backend, toolName, datasource);\n if (ltsDatasource === NodeVersionDatasource.id) {\n return { ignoreUnstable: true };\n }\n if (ltsDatasource === JavaVersionDatasource.id) {\n return {\n allowedVersions: `/^(?:${javaLtsVersions.join('|')})(?:\\\\.|-|\\\\+|$)/`,\n ignoreUnstable: true,\n };\n }\n return null;\n }\n\n if (nonVersionSelectorRegex.test(version)) {\n return null;\n }\n\n const match = partialSelectorRegex.exec(version);\n if (!match?.groups || lockedVersion === version) {\n return null;\n }\n\n const { prefix, major, minor } = match.groups;\n const lockedPrefix = versionPrefixRegex.exec(lockedVersion)?.groups?.prefix;\n const effectivePrefix = prefix || lockedPrefix;\n let prefixPattern = '';\n if (effectivePrefix) {\n prefixPattern = `(?:${RegExp.escape(effectivePrefix)})?`;\n } else if (\n datasource === GithubReleasesDatasource.id ||\n datasource === NodeVersionDatasource.id\n ) {\n prefixPattern = `(?:${RegExp.escape('v')})?`;\n }\n const precisionPattern = minor\n ? `\\\\.${minor}(?:\\\\.|-|\\\\+|$)`\n : `(?:\\\\.|-|\\\\+|$)`;\n return {\n allowedVersions: `/^${prefixPattern}${major}${precisionPattern}/`,\n };\n}\n\nfunction extractSelectorLockedDependency(\n depName: string,\n version: string,\n backend: string,\n toolName: string,\n options: MiseToolOptions,\n toolConfig: StaticTooling | BackendToolingConfig | null,\n lockedVersion: string,\n depType: string,\n): PackageDependency | null {\n const selectorConfig = getSelectorConfig(\n version,\n backend,\n toolName,\n toolConfig?.datasource,\n lockedVersion,\n );\n if (!selectorConfig) {\n return null;\n }\n\n const resolvedToolConfig = getToolConfig(\n backend,\n toolName,\n lockedVersion,\n options,\n );\n if (!resolvedToolConfig) {\n return null;\n }\n\n const comparableLockedVersion =\n resolvedToolConfig.currentValue ?? lockedVersion;\n return {\n ...createDependency(depName, version, resolvedToolConfig, depType),\n currentValue: version,\n lockedVersion: comparableLockedVersion,\n rangeStrategy: 'update-lockfile',\n isLockfileOnly: true,\n ...selectorConfig,\n };\n}\n\nfunction extractToolEntry(\n name: string,\n toolData: MiseTool,\n depType: string,\n lockFileData?: MiseLockFile,\n): PackageDependency {\n const toolValue = getPrimaryToolValue(toolData);\n const version = parseVersion(toolValue);\n const { name: depName, options: optionsInName } = optionInToolNameRegex.exec(\n name.trim(),\n )!.groups!;\n const delimiterIndex = depName.indexOf(':');\n const backend = depName.substring(0, delimiterIndex);\n const toolName = depName.substring(delimiterIndex + 1);\n const options = parseOptions(\n optionsInName,\n isObject(toolValue) ? toolValue : {},\n );\n const toolConfig =\n version === null\n ? null\n : getToolConfig(backend, toolName, version, options);\n const dependency = createDependency(depName, version, toolConfig, depType);\n const lockedVersion = lockFileData\n ? getLockedVersion(lockFileData, dependency.depName)\n : undefined;\n\n if (version !== null && lockedVersion) {\n const selectorDependency = extractSelectorLockedDependency(\n depName,\n version,\n backend,\n toolName,\n options,\n toolConfig,\n lockedVersion,\n depType,\n );\n if (selectorDependency) {\n return selectorDependency;\n }\n }\n\n if (lockedVersion) {\n return { ...dependency, lockedVersion };\n }\n return dependency;\n}\n\nfunction getConfiguredDepName(\n config: StaticTooling | BackendToolingConfig,\n): string | undefined {\n if ('depName' in config) {\n return config.depName;\n }\n return undefined;\n}\n\nfunction createDependency(\n name: string,\n version: string | null,\n config: StaticTooling | BackendToolingConfig | null,\n depType: string,\n): MiseDependency {\n if (version === null) {\n return {\n depName: name,\n depType,\n skipReason: 'unspecified-version',\n };\n }\n if (config === null) {\n return {\n depName: name,\n depType,\n skipReason: 'unsupported-datasource',\n };\n }\n\n return {\n depType,\n currentValue: version,\n ...config,\n // Allow tooling definitions to override the parsed mise tool name.\n depName: getConfiguredDepName(config) ?? name,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA8CA,MAAM,wBAAwB,MAAM,uCAAuC;AAC3E,MAAM,0BAA0B,MAAM,gCAAgC;AACtE,MAAM,uBAAuB,MAC3B,sDACF;AACA,MAAM,qBAAqB,MAAM,sBAAsB;;;;;;AAcvD,eAAsB,mBACpB,SACA,aACoC;CACpC,OAAO,MAAM,2BAA2B,YAAY,EAAE;CAEtD,MAAM,WAAW,cAAc,SAAS,WAAW;CACnD,IAAI,CAAC,UACH,OAAO;CAGT,MAAM,cAA4C,CAAC;CAEnD,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,SAAS,KAAK,GAC1D,YAAY,KAAK;EAAC;EAAM;EAAU;CAAO,CAAC;CAG5C,KAAK,MAAM,CAAC,UAAU,aAAa,OAAO,QAAQ,SAAS,KAAK,GAC9D,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QACpC,aAAa,SAAS,KAAK,CAC7B,GACE,YAAY,KAAK;EAAC;EAAM;EAAU,QAAQ,SAAS;CAAO,CAAC;CAI/D,MAAM,eAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,UAAU,aAAa,OAAO,QAAQ,SAAS,KAAK,GAC9D,IAAI,SAAS,MAAM;EAEjB,MAAM,MAAM,oBACV,SAAS,KAAK,KAAK,GACnB,SACA,QAAQ,SAAS,MACnB;EACA,IAAI,KACF,aAAa,KAAK,GAAG;CAEzB;CAGF,MAAM,cAAc,SAAS,QAAQ,KAAK,YACxC,eAAe,SAAS,OAAO,CACjC;CAEA,IAAI,CAAC,YAAY,UAAU,CAAC,aAAa,UAAU,CAAC,YAAY,QAC9D,OAAO;CAGT,MAAM,eAAe,gBAAgB,WAAW;CAChD,MAAM,kBAAkB,MAAM,cAAc,cAAc,MAAM;CAChE,IAAI;CACJ,IAAI,iBAAiB;EACnB,MAAM,iBAAiB,aAAa,UAAU,eAAe;EAC7D,IAAI,eAAe,SACjB,eAAe,eAAe;OAE9B,OAAO,MACL;GAAE;GAAc,KAAK,eAAe;EAAM,GAC1C,gCACF;CAEJ;CASA,MAAM,SAA6B,EAAE,MAAA;EANnC,GAAG,YAAY,KAAK,CAAC,MAAM,UAAU,aACnC,iBAAiB,MAAM,UAAU,SAAS,YAAY,CACxD;EACA,GAAG;EACH,GAAG;CAEmC,EAAE;CAE1C,IAAI,cACF,OAAO,YAAY,CAAC,YAAY;CAGlC,OAAO;AACT;;;;;;AAOA,SAAS,oBAAoB,UAA0C;CACrE,IAAI,QAAQ,QAAQ,GAClB,OAAO,SAAS,SAAS,SAAS,KAAK;CAEzC,OAAO;AACT;AAEA,SAAS,aAAa,WAAgD;CACpE,IAAI,iBAAiB,SAAS,GAG5B,OAAO;CAET,IAAI,SAAS,SAAS,KAAK,iBAAiB,UAAU,OAAO,GAG3D,OAAO,UAAU;CAEnB,OAAO;AACT;AAEA,SAAS,aACP,eACA,aACiB;CAOjB,OAAO;EACL,GAPc,iBAAiB,aAAa,IAC1C,OAAO,YACL,cAAc,MAAM,GAAG,CAAC,CAAC,KAAK,WAAW,OAAO,MAAM,KAAK,CAAC,CAAC,CAC/D,IACA,CAAC;EAIH,GAAG;CACL;AACF;AAEA,SAAS,cACP,SACA,UACA,SACA,aAC6C;CAC7C,QAAQ,SAAR;EACE,KAAK,IAAI;GAEP,MAAM,eAAe,sBAAsB,UAAU,OAAO;GAC5D,IAAI,cACF,OAAO;GAIT,MAAM,WAAW,+BAA+B,QAAQ;GAGxD,IAAI,SAAS,QAAQ;IACnB,MAAM,SAAS,cACb,UACA,SAAS,QACT,SACA,WACF;;IAEA,IAAI,WAAW,MACb,OAAO;GAEX;GAEA,KAAK,MAAM,CAAC,aAAa,gBAAgB,OAAO,QAAQ,QAAQ,GAAG;IACjE,MAAM,SAAS,cACb,aACA,aACA,SACA,WACF;;IAEA,IAAI,WAAW,MACb,OAAO;GAEX;GACA,OAAO;EACT;EAGA,KAAK,QACH,OAAO,qBAAqB,aAAa,UAAU,OAAO;EAC5D,KAAK,QACH,OAAO,qBAAqB,aAAa,UAAU,OAAO;EAC5D,KAAK,QACH,OAAO,sBAAsB,UAAU,OAAO;EAChD,KAAK,QACH,OACE,sBAAsB,UAAU,OAAO,KACvC,qBAAqB,UAAU,OAAO;EAE1C,KAAK,SACH,OAAO,sBAAsB,UAAU,OAAO;EAChD,KAAK,SACH,OAAO,sBAAsB,QAAQ;EACvC,KAAK,UACH,OAAO,uBAAuB,QAAQ;EACxC,KAAK,OACH,OAAO,oBAAoB,QAAQ;EACrC,KAAK,UACH,OAAO,uBAAuB,UAAU,SAAS,WAAW;EAC9D,KAAK,UACH,OAAO,uBAAuB,UAAU,SAAS,WAAW;EAC9D,KAAK,MACH,OAAO,mBAAmB,QAAQ;EACpC,KAAK,OACH,OAAO,oBAAoB,QAAQ;EACrC,KAAK,QACH,OAAO,qBAAqB,QAAQ;EACtC,KAAK,QACH,OAAO,qBAAqB,QAAQ;EACtC,KAAK,OACH,OAAO,oBAAoB,QAAQ;EACrC,KAAK,OACH,OAAO,oBAAoB,UAAU,SAAS,WAAW;EAC3D,SAEE,OAAO;CACX;AACF;;;;;AAMA,SAAS,sBACP,OACA,SACsB;CAEtB,OACE,qBAAqB,aAAa,OAAO,OAAO,KAChD,qBAAqB,aAAa,OAAO,OAAO;AAEpD;AAEA,SAAS,qBACP,eACA,MACA,SACsB;CACtB,MAAM,iBAAiB,cAAc;CACrC,IAAI,CAAC,gBACH,OAAO;CAGT,QACG,WAAW,eAAe,MAAM,IAC7B,eAAe,OAAO,OAAO,IAC7B,eAAe,WAAW;AAElC;AAEA,SAAS,iBACP,SACA,UACA,YACoB;CACpB,IAAI,YACF,OAAO;CAGT,KADsB,YAAY,MAAM,YAAY,WAC/B,aAAa,QAChC,OAAO,sBAAsB;AAGjC;AAEA,SAAS,kBACP,SACA,SACA,UACA,YACA,eAC2B;CAC3B,IAAI,YAAY,UACd,OAAO,CAAC;CAGV,IAAI,YAAY,OAAO;EACrB,MAAM,gBAAgB,iBAAiB,SAAS,UAAU,UAAU;EACpE,IAAI,kBAAkB,sBAAsB,IAC1C,OAAO,EAAE,gBAAgB,KAAK;EAEhC,IAAI,kBAAkB,sBAAsB,IAC1C,OAAO;GACL,iBAAiB,QAAA,yBAAwB,KAAK,GAAG,EAAE;GACnD,gBAAgB;EAClB;EAEF,OAAO;CACT;CAEA,IAAI,wBAAwB,KAAK,OAAO,GACtC,OAAO;CAGT,MAAM,QAAQ,qBAAqB,KAAK,OAAO;CAC/C,IAAI,CAAC,OAAO,UAAU,kBAAkB,SACtC,OAAO;CAGT,MAAM,EAAE,QAAQ,OAAO,UAAU,MAAM;CACvC,MAAM,eAAe,mBAAmB,KAAK,aAAa,CAAC,EAAE,QAAQ;CACrE,MAAM,kBAAkB,UAAU;CAClC,IAAI,gBAAgB;CACpB,IAAI,iBACF,gBAAgB,MAAM,OAAO,OAAO,eAAe,EAAE;MAChD,IACL,eAAe,yBAAyB,MACxC,eAAe,sBAAsB,IAErC,gBAAgB,MAAM,OAAO,OAAO,GAAG,EAAE;CAE3C,MAAM,mBAAmB,QACrB,MAAM,MAAM,mBACZ;CACJ,OAAO,EACL,iBAAiB,KAAK,gBAAgB,QAAQ,iBAAiB,GACjE;AACF;AAEA,SAAS,gCACP,SACA,SACA,SACA,UACA,SACA,YACA,eACA,SAC0B;CAC1B,MAAM,iBAAiB,kBACrB,SACA,SACA,UACA,YAAY,YACZ,aACF;CACA,IAAI,CAAC,gBACH,OAAO;CAGT,MAAM,qBAAqB,cACzB,SACA,UACA,eACA,OACF;CACA,IAAI,CAAC,oBACH,OAAO;CAGT,MAAM,0BACJ,mBAAmB,gBAAgB;CACrC,OAAO;EACL,GAAG,iBAAiB,SAAS,SAAS,oBAAoB,OAAO;EACjE,cAAc;EACd,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,GAAG;CACL;AACF;AAEA,SAAS,iBACP,MACA,UACA,SACA,cACmB;CACnB,MAAM,YAAY,oBAAoB,QAAQ;CAC9C,MAAM,UAAU,aAAa,SAAS;CACtC,MAAM,EAAE,MAAM,SAAS,SAAS,kBAAkB,sBAAsB,KACtE,KAAK,KAAK,CACZ,CAAC,CAAE;CACH,MAAM,iBAAiB,QAAQ,QAAQ,GAAG;CAC1C,MAAM,UAAU,QAAQ,UAAU,GAAG,cAAc;CACnD,MAAM,WAAW,QAAQ,UAAU,iBAAiB,CAAC;CACrD,MAAM,UAAU,aACd,eACA,SAAS,SAAS,IAAI,YAAY,CAAC,CACrC;CACA,MAAM,aACJ,YAAY,OACR,OACA,cAAc,SAAS,UAAU,SAAS,OAAO;CACvD,MAAM,aAAa,iBAAiB,SAAS,SAAS,YAAY,OAAO;CACzE,MAAM,gBAAgB,eAClB,iBAAiB,cAAc,WAAW,OAAO,IACjD,KAAA;CAEJ,IAAI,YAAY,QAAQ,eAAe;EACrC,MAAM,qBAAqB,gCACzB,SACA,SACA,SACA,UACA,SACA,YACA,eACA,OACF;EACA,IAAI,oBACF,OAAO;CAEX;CAEA,IAAI,eACF,OAAO;EAAE,GAAG;EAAY;CAAc;CAExC,OAAO;AACT;AAEA,SAAS,qBACP,QACoB;CACpB,IAAI,aAAa,QACf,OAAO,OAAO;AAGlB;AAEA,SAAS,iBACP,MACA,SACA,QACA,SACgB;CAChB,IAAI,YAAY,MACd,OAAO;EACL,SAAS;EACT;EACA,YAAY;CACd;CAEF,IAAI,WAAW,MACb,OAAO;EACL,SAAS;EACT;EACA,YAAY;CACd;CAGF,OAAO;EACL;EACA,cAAc;EACd,GAAG;EAEH,SAAS,qBAAqB,MAAM,KAAK;CAC3C;AACF"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/mise/extract.ts"],"sourcesContent":["import {\n isArray,\n isFunction,\n isNonEmptyObject,\n isNonEmptyString,\n isObject,\n} from '@sindresorhus/is';\nimport javaLtsVersions from '../../../data/java-version-lts.json' with { type: 'json' };\nimport { logger } from '../../../logger/index.ts';\nimport type { ConstraintName, ToolName } from '../../../util/exec/types.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { JavaVersionDatasource } from '../../datasource/java-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport type { StaticTooling } from '../asdf/types.ts';\nimport type {\n PackageDependency,\n PackageFileContent,\n SharedConstraint,\n} from '../types.ts';\nimport {\n createAquaToolConfig,\n createCargoToolConfig,\n createCondaToolConfig,\n createDotnetToolConfig,\n createGemToolConfig,\n createGithubToolConfig,\n createGitlabToolConfig,\n createGoToolConfig,\n createNpmToolConfig,\n createPipxToolConfig,\n createPypiToolConfig,\n createSpmToolConfig,\n createUbiToolConfig,\n} from './backends.ts';\nimport {\n getConstraintName,\n getConstraintValue,\n getSharedConstraintsScope,\n isLockedVersionOf,\n} from './constraints.ts';\nimport { extractGitReference } from './git-reference.ts';\nimport { extractInclude } from './include.ts';\nimport { getLockFileName, getLockedVersion } from './lockfile.ts';\nimport type { MiseTool, MiseToolOptions, MiseToolValue } from './schema.ts';\nimport { MiseLockFile } from './schema.ts';\nimport type { BackendToolingConfig, ToolingDefinition } from './types.ts';\nimport {\n asdfTooling,\n getOrderedMiseRegistryBackends,\n miseTooling,\n} from './upgradeable-tooling.ts';\nimport { parseTomlFile } from './utils.ts';\n\n// Tool names can have options in the tool name\n// e.g. ubi:tamasfe/taplo[matching=full,exe=taplo]\nconst optionInToolNameRegex = regEx(/^(?<name>.+?)(?:\\[(?<options>.+)\\])?$/);\nconst nonVersionSelectorRegex = regEx(/^(?:ref:|path:|sub-\\d+(?::|$))/);\nconst partialSelectorRegex = regEx(\n /^(?<prefix>[^\\d]*)(?<major>\\d+)(?:\\.(?<minor>\\d+))?$/,\n);\nconst versionPrefixRegex = regEx(/^(?<prefix>[^\\d]*)\\d/);\n\ntype MiseDependency = PackageDependency & { depName: string };\n\ninterface MiseSelectorConfig {\n allowedVersions?: string;\n ignoreUnstable?: boolean;\n}\n\n/**\n * Extracts mise tool dependencies from a mise configuration file.\n * Supports various backends (core, asdf, aqua, cargo, etc.) and\n * extracts locked versions when a corresponding lock file exists.\n */\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n): Promise<PackageFileContent | null> {\n logger.trace(`mise.extractPackageFile(${packageFile})`);\n\n const misefile = parseTomlFile(content, packageFile);\n if (!misefile) {\n return null;\n }\n\n const toolEntries: [string, MiseTool, string][] = [];\n\n for (const [name, toolData] of Object.entries(misefile.tools)) {\n toolEntries.push([name, toolData, 'tools']);\n }\n\n for (const [taskName, taskData] of Object.entries(misefile.tasks)) {\n for (const [name, toolData] of Object.entries(\n coerceObject(taskData.tools),\n )) {\n toolEntries.push([name, toolData, `task-${taskName}-tools`]);\n }\n }\n\n const taskFileDeps: PackageDependency[] = [];\n for (const [taskName, taskData] of Object.entries(misefile.tasks)) {\n if (taskData.file) {\n // local paths and plain http(s) urls have no version\n const dep = extractGitReference(\n taskData.file.trim(),\n content,\n `task-${taskName}-file`,\n );\n if (dep) {\n taskFileDeps.push(dep);\n }\n }\n }\n\n const includeDeps = misefile.include.map((include) =>\n extractInclude(include, content),\n );\n\n if (!toolEntries.length && !taskFileDeps.length && !includeDeps.length) {\n return null;\n }\n\n const lockFileName = getLockFileName(packageFile);\n const lockFileContent = await readLocalFile(lockFileName, 'utf8');\n let lockFileData: MiseLockFile | undefined;\n if (lockFileContent) {\n const lockFileParsed = MiseLockFile.safeParse(lockFileContent);\n if (lockFileParsed.success) {\n lockFileData = lockFileParsed.data;\n } else {\n logger.debug(\n { lockFileName, err: lockFileParsed.error },\n 'Failed to parse mise lock file',\n );\n }\n }\n\n const toolDeps = toolEntries.map(([name, toolData, depType]) =>\n extractToolEntry(name, toolData, depType, lockFileData),\n );\n const deps = [...toolDeps, ...taskFileDeps, ...includeDeps];\n const result: PackageFileContent = { deps };\n\n if (lockFileData) {\n result.lockFiles = [lockFileName];\n }\n\n const scope = getSharedConstraintsScope(packageFile);\n if (scope) {\n const constraints = extractToolConstraints(\n misefile.tools,\n toolDeps,\n lockFileData,\n );\n if (isNonEmptyObject(constraints)) {\n result.sharedConstraintsScope = { ...scope, constraints };\n }\n }\n\n return result;\n}\n\n/**\n * Returns the versions of the tools which are Containerbase tools, preferring the locked version, which is the one mise installs, or `null` for a version which is no constraint, like `lts`.\n */\nfunction extractToolConstraints(\n tools: Record<string, MiseTool>,\n toolDeps: MiseDependency[],\n lockFileData: MiseLockFile | undefined,\n): Partial<Record<ConstraintName, SharedConstraint>> {\n const constraints: Partial<Record<ConstraintName, SharedConstraint>> = {};\n // the top level tools come first in `toolDeps`\n const constraintTools = Object.entries(tools).flatMap(\n ([name, toolData], index) => {\n const depName = optionInToolNameRegex.exec(name.trim())!.groups!.name;\n const constraintName = getConstraintName(depName);\n const dep = toolDeps[index];\n return constraintName ? [{ depName, constraintName, toolData, dep }] : [];\n },\n );\n for (const { depName, constraintName, toolData, dep } of constraintTools) {\n constraints[constraintName] = {\n depName: dep.depName,\n value: getConstraintValue(\n constraintName,\n getInstalledVersion(lockFileData, depName, constraintName, toolData),\n ),\n };\n }\n return constraints;\n}\n\n/**\n * Returns the version of a tool which mise installs, which is the locked version unless it does not match the configured version number.\n */\nfunction getInstalledVersion(\n lockFileData: MiseLockFile | undefined,\n depName: string,\n constraintName: ToolName,\n toolData: MiseTool,\n): string | null {\n const version = parseVersion(getPrimaryToolValue(toolData));\n // mise locks an alias like `nodejs` under the name of the tool\n const lockedVersion = lockFileData\n ? (getLockedVersion(lockFileData, depName) ??\n getLockedVersion(lockFileData, constraintName))\n : undefined;\n return lockedVersion && isLockedVersionOf(lockedVersion, version)\n ? lockedVersion\n : version;\n}\n\n/**\n * Returns the primary tool entry. For arrays only the first entry is managed,\n * e.g. 'erlang = [\"23.3\", \"24.0\"]' or\n * 'rust = [{ version = \"1.98.1\", profile = \"minimal\" }, { version = \"nightly\" }]'.\n */\nfunction getPrimaryToolValue(toolData: MiseTool): MiseToolValue | null {\n if (isArray(toolData)) {\n return toolData.length ? toolData[0] : null;\n }\n return toolData;\n}\n\nfunction parseVersion(toolValue: MiseToolValue | null): string | null {\n if (isNonEmptyString(toolValue)) {\n // Handle the string case\n // e.g. 'erlang = \"23.3\"'\n return toolValue;\n }\n if (isObject(toolValue) && isNonEmptyString(toolValue.version)) {\n // Handle the object case with a string version\n // e.g. 'python = { version = \"3.11.2\" }'\n return toolValue.version;\n }\n return null; // Return null if no version is found\n}\n\nfunction parseOptions(\n optionsInName: string,\n toolOptions: MiseToolOptions,\n): MiseToolOptions {\n const options = isNonEmptyString(optionsInName)\n ? Object.fromEntries(\n optionsInName.split(',').map((option) => option.split('=', 2)),\n )\n : {};\n // Options in toolOptions will override options in the tool name\n return {\n ...options,\n ...toolOptions,\n };\n}\n\nfunction getToolConfig(\n backend: string,\n toolName: string,\n version: string,\n toolOptions: MiseToolOptions,\n): StaticTooling | BackendToolingConfig | null {\n switch (backend) {\n case '': {\n // If the tool name does not specify a backend, it should be a short name or an alias defined by users\n const staticResult = getRegistryToolConfig(toolName, version);\n if (staticResult) {\n return staticResult;\n }\n\n // Otherwise, see if we have any known short tool names that are in the `mise-registry.json` data file\n const backends = getOrderedMiseRegistryBackends(toolName);\n\n // prioritise the github backend as the best source for data\n if (backends.github) {\n const result = getToolConfig(\n 'github',\n backends.github,\n version,\n toolOptions,\n );\n // v8 ignore else -- TODO: add test #40625\n if (result !== null) {\n return result;\n }\n }\n\n for (const [backendType, backendName] of Object.entries(backends)) {\n const result = getToolConfig(\n backendType,\n backendName,\n version,\n toolOptions,\n );\n // v8 ignore else -- TODO: add test #40625\n if (result !== null) {\n return result;\n }\n }\n return null;\n }\n // We can specify core, asdf, vfox, aqua backends for tools in the default registry\n // e.g. 'core:rust', 'asdf:rust', 'vfox:clang', 'aqua:act'\n case 'core':\n return getConfigFromTooling(miseTooling, toolName, version);\n case 'asdf':\n return getConfigFromTooling(asdfTooling, toolName, version);\n case 'vfox':\n return getRegistryToolConfig(toolName, version);\n case 'aqua':\n return (\n getRegistryToolConfig(toolName, version) ??\n createAquaToolConfig(toolName, version)\n );\n case 'cargo':\n return createCargoToolConfig(toolName, version);\n case 'conda':\n return createCondaToolConfig(toolName);\n case 'dotnet':\n return createDotnetToolConfig(toolName);\n case 'gem':\n return createGemToolConfig(toolName);\n case 'github':\n return createGithubToolConfig(toolName, version, toolOptions);\n case 'gitlab':\n return createGitlabToolConfig(toolName, version, toolOptions);\n case 'go':\n return createGoToolConfig(toolName);\n case 'npm':\n return createNpmToolConfig(toolName);\n case 'pipx':\n return createPipxToolConfig(toolName);\n case 'pypi':\n return createPypiToolConfig(toolName);\n case 'spm':\n return createSpmToolConfig(toolName);\n case 'ubi':\n return createUbiToolConfig(toolName, version, toolOptions);\n default:\n // Unsupported backend\n return null;\n }\n}\n\n/**\n * Get the tooling config for a short name defined in the default registry\n * @link https://mise.jdx.dev/registry.html\n */\nfunction getRegistryToolConfig(\n short: string,\n version: string,\n): StaticTooling | null {\n // Try to get the config from miseTooling first, then asdfTooling\n return (\n getConfigFromTooling(miseTooling, short, version) ??\n getConfigFromTooling(asdfTooling, short, version)\n );\n}\n\nfunction getConfigFromTooling(\n toolingSource: Record<string, ToolingDefinition>,\n name: string,\n version: string,\n): StaticTooling | null {\n const toolDefinition = toolingSource[name];\n if (!toolDefinition) {\n return null;\n } // Return null if no toolDefinition is found\n\n return (\n (isFunction(toolDefinition.config)\n ? toolDefinition.config(version)\n : toolDefinition.config) ?? null\n ); // Ensure null is returned instead of undefined\n}\n\nfunction getLtsDatasource(\n backend: string,\n toolName: string,\n datasource: string | undefined,\n): string | undefined {\n if (datasource) {\n return datasource;\n }\n const isCoreBackend = backend === '' || backend === 'core';\n if (isCoreBackend && toolName === 'java') {\n return JavaVersionDatasource.id;\n }\n return undefined;\n}\n\nfunction getSelectorConfig(\n version: string,\n backend: string,\n toolName: string,\n datasource: string | undefined,\n lockedVersion: string,\n): MiseSelectorConfig | null {\n if (version === 'latest') {\n return {};\n }\n\n if (version === 'lts') {\n const ltsDatasource = getLtsDatasource(backend, toolName, datasource);\n if (ltsDatasource === NodeVersionDatasource.id) {\n return { ignoreUnstable: true };\n }\n if (ltsDatasource === JavaVersionDatasource.id) {\n return {\n allowedVersions: `/^(?:${javaLtsVersions.join('|')})(?:\\\\.|-|\\\\+|$)/`,\n ignoreUnstable: true,\n };\n }\n return null;\n }\n\n if (nonVersionSelectorRegex.test(version)) {\n return null;\n }\n\n const match = partialSelectorRegex.exec(version);\n if (!match?.groups || lockedVersion === version) {\n return null;\n }\n\n const { prefix, major, minor } = match.groups;\n const lockedPrefix = versionPrefixRegex.exec(lockedVersion)?.groups?.prefix;\n const effectivePrefix = prefix || lockedPrefix;\n let prefixPattern = '';\n if (effectivePrefix) {\n prefixPattern = `(?:${RegExp.escape(effectivePrefix)})?`;\n } else if (\n datasource === GithubReleasesDatasource.id ||\n datasource === NodeVersionDatasource.id\n ) {\n prefixPattern = `(?:${RegExp.escape('v')})?`;\n }\n const precisionPattern = minor\n ? `\\\\.${minor}(?:\\\\.|-|\\\\+|$)`\n : `(?:\\\\.|-|\\\\+|$)`;\n return {\n allowedVersions: `/^${prefixPattern}${major}${precisionPattern}/`,\n };\n}\n\nfunction extractSelectorLockedDependency(\n depName: string,\n version: string,\n backend: string,\n toolName: string,\n options: MiseToolOptions,\n toolConfig: StaticTooling | BackendToolingConfig | null,\n lockedVersion: string,\n depType: string,\n): MiseDependency | null {\n const selectorConfig = getSelectorConfig(\n version,\n backend,\n toolName,\n toolConfig?.datasource,\n lockedVersion,\n );\n if (!selectorConfig) {\n return null;\n }\n\n const resolvedToolConfig = getToolConfig(\n backend,\n toolName,\n lockedVersion,\n options,\n );\n if (!resolvedToolConfig) {\n return null;\n }\n\n const comparableLockedVersion =\n resolvedToolConfig.currentValue ?? lockedVersion;\n return {\n ...createDependency(depName, version, resolvedToolConfig, depType),\n currentValue: version,\n lockedVersion: comparableLockedVersion,\n rangeStrategy: 'update-lockfile',\n isLockfileOnly: true,\n ...selectorConfig,\n };\n}\n\nfunction extractToolEntry(\n name: string,\n toolData: MiseTool,\n depType: string,\n lockFileData?: MiseLockFile,\n): MiseDependency {\n const toolValue = getPrimaryToolValue(toolData);\n const version = parseVersion(toolValue);\n const { name: depName, options: optionsInName } = optionInToolNameRegex.exec(\n name.trim(),\n )!.groups!;\n const delimiterIndex = depName.indexOf(':');\n const backend = depName.substring(0, delimiterIndex);\n const toolName = depName.substring(delimiterIndex + 1);\n const options = parseOptions(\n optionsInName,\n isObject(toolValue) ? toolValue : {},\n );\n const toolConfig =\n version === null\n ? null\n : getToolConfig(backend, toolName, version, options);\n const dependency = createDependency(depName, version, toolConfig, depType);\n const lockedVersion = lockFileData\n ? getLockedVersion(lockFileData, dependency.depName)\n : undefined;\n\n if (version !== null && lockedVersion) {\n const selectorDependency = extractSelectorLockedDependency(\n depName,\n version,\n backend,\n toolName,\n options,\n toolConfig,\n lockedVersion,\n depType,\n );\n if (selectorDependency) {\n return selectorDependency;\n }\n }\n\n if (lockedVersion) {\n return { ...dependency, lockedVersion };\n }\n return dependency;\n}\n\nfunction getConfiguredDepName(\n config: StaticTooling | BackendToolingConfig,\n): string | undefined {\n if ('depName' in config) {\n return config.depName;\n }\n return undefined;\n}\n\nfunction createDependency(\n name: string,\n version: string | null,\n config: StaticTooling | BackendToolingConfig | null,\n depType: string,\n): MiseDependency {\n if (version === null) {\n return {\n depName: name,\n depType,\n skipReason: 'unspecified-version',\n };\n }\n if (config === null) {\n return {\n depName: name,\n depType,\n skipReason: 'unsupported-datasource',\n };\n }\n\n return {\n depType,\n currentValue: version,\n ...config,\n // Allow tooling definitions to override the parsed mise tool name.\n depName: getConfiguredDepName(config) ?? name,\n };\n}\n"],"mappings":"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"}
@@ -21,6 +21,7 @@ import { RubyVersionDatasource } from "../../datasource/ruby-version/index.js";
21
21
  import { RubygemsDatasource } from "../../datasource/rubygems/index.js";
22
22
  import { RustVersionDatasource } from "../../datasource/rust-version/index.js";
23
23
  import { supportedDatasources as supportedDatasources$1 } from "../asdf/index.js";
24
+ import { configFileLocations, getConfigFilePattern } from "./config-files.js";
24
25
  import { updateArtifacts } from "./artifacts.js";
25
26
  import { knownDepTypes, supportsDynamicDepTypesNote } from "./dep-types.js";
26
27
  import { extractPackageFile } from "./extract.js";
@@ -48,14 +49,7 @@ const lockFileNames = ["mise.lock"];
48
49
  const url = "https://mise.jdx.dev";
49
50
  const minimumReleaseAgeSupport = { mise: { note: "mise has its own `minimum_release_age` setting, which Renovate does not read yet." } };
50
51
  const defaultConfig = {
51
- managerFilePatterns: [
52
- "**/{,.}mise{,.*}.toml",
53
- "**/{,.}mise/config{,.*}.toml",
54
- "**/.config/mise{,.*}.toml",
55
- "**/.config/mise/{mise,config}{,.*}.toml",
56
- "**/.config/mise/conf.d/*.toml",
57
- "**/.rtx{,.*}.toml"
58
- ],
52
+ managerFilePatterns: configFileLocations.map(getConfigFilePattern),
59
53
  pinDigests: false
60
54
  };
61
55
  const backendDatasources = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["asdfSupportedDatasources"],"sources":["../../../../lib/modules/manager/mise/index.ts"],"sourcesContent":["import { deduplicateArray } from '../../../util/array.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { CondaDatasource } from '../../datasource/conda/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubDigestDatasource } from '../../datasource/github-digest/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport { JavaVersionDatasource } from '../../datasource/java-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { NugetDatasource } from '../../datasource/nuget/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RubygemsDatasource } from '../../datasource/rubygems/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport { supportedDatasources as asdfSupportedDatasources } from '../asdf/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const displayName = 'mise-en-place';\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['mise.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\nexport const url = 'https://mise.jdx.dev';\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n mise: {\n note: 'mise has its own `minimum_release_age` setting, which Renovate does not read yet.',\n },\n};\n\nexport const defaultConfig = {\n managerFilePatterns: [\n '**/{,.}mise{,.*}.toml',\n '**/{,.}mise/config{,.*}.toml',\n '**/.config/mise{,.*}.toml',\n '**/.config/mise/{mise,config}{,.*}.toml',\n '**/.config/mise/conf.d/*.toml',\n '**/.rtx{,.*}.toml',\n ],\n pinDigests: false,\n};\n\nconst backendDatasources = {\n core: [\n GithubReleasesDatasource.id,\n GithubTagsDatasource.id,\n JavaVersionDatasource.id,\n NodeVersionDatasource.id,\n RubyVersionDatasource.id,\n RustVersionDatasource.id,\n ],\n // Re-use the asdf datasources, as mise and asdf support the same plugins.\n asdf: asdfSupportedDatasources,\n aqua: [GithubTagsDatasource.id],\n cargo: [CrateDatasource.id, GitTagsDatasource.id, GitRefsDatasource.id],\n conda: [CondaDatasource.id],\n dotnet: [NugetDatasource.id],\n gem: [RubygemsDatasource.id],\n github: [GithubReleasesDatasource.id],\n gitlab: [GitlabReleasesDatasource.id],\n go: [GoDatasource.id],\n npm: [NpmDatasource.id],\n pipx: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n pypi: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n spm: [GithubReleasesDatasource.id],\n ubi: [GithubReleasesDatasource.id],\n // not supported\n vfox: [],\n};\n\n// datasources of remote `include` entries and git task files\nconst remoteReferenceDatasources = [\n BitbucketTagsDatasource.id,\n DockerDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n GithubDigestDatasource.id,\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n];\n\n/**\n * Backends that are definitely supported out-of-the-box with Renovate.\n */\nexport const supportedBackendDatasources = new Set(\n Object.keys(backendDatasources).filter((key) => key !== 'vfox'),\n);\n\n/**\n * Backends that may require some additional work for users to configure Renovate to update them.\n */\nexport const maybeSupportedBackendDatasources = new Set<string>(\n Object.keys(backendDatasources).filter(\n (key) => key === 'vfox' || key === 'aqua',\n ),\n);\n\nexport const supportedDatasources = deduplicateArray([\n ...Object.values(backendDatasources).flat(),\n ...remoteReferenceDatasources,\n]).sort();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAa,cAAc;AAE3B,MAAa,gBAAgB,CAAC,WAAW;AAEzC,MAAa,MAAM;AAEnB,MAAa,2BAAqD,EAChE,MAAM,EACJ,MAAM,oFACR,EACF;AAEA,MAAa,gBAAgB;CAC3B,qBAAqB;EACnB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,YAAY;AACd;AAEA,MAAM,qBAAqB;CACzB,MAAM;EACJ,yBAAyB;EACzB,qBAAqB;EACrB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CAEA,MAAMA;CACN,MAAM,CAAC,qBAAqB,EAAE;CAC9B,OAAO;EAAC,gBAAgB;EAAI,kBAAkB;EAAI,kBAAkB;CAAE;CACtE,OAAO,CAAC,gBAAgB,EAAE;CAC1B,QAAQ,CAAC,gBAAgB,EAAE;CAC3B,KAAK,CAAC,mBAAmB,EAAE;CAC3B,QAAQ,CAAC,yBAAyB,EAAE;CACpC,QAAQ,CAAC,yBAAyB,EAAE;CACpC,IAAI,CAAC,aAAa,EAAE;CACpB,KAAK,CAAC,cAAc,EAAE;CACtB,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,KAAK,CAAC,yBAAyB,EAAE;CACjC,KAAK,CAAC,yBAAyB,EAAE;CAEjC,MAAM,CAAC;AACT;AAGA,MAAM,6BAA6B;CACjC,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,qBAAqB;CACrB,qBAAqB;AACvB;;;;AAKA,MAAa,8BAA8B,IAAI,IAC7C,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAAQ,QAAQ,QAAQ,MAAM,CAChE;;;;AAKA,MAAa,mCAAmC,IAAI,IAClD,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAC7B,QAAQ,QAAQ,UAAU,QAAQ,MACrC,CACF;AAEA,MAAa,uBAAuB,iBAAiB,CACnD,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,KAAK,GAC1C,GAAG,0BACL,CAAC,CAAC,CAAC,KAAK"}
1
+ {"version":3,"file":"index.js","names":["asdfSupportedDatasources"],"sources":["../../../../lib/modules/manager/mise/index.ts"],"sourcesContent":["import { deduplicateArray } from '../../../util/array.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { CondaDatasource } from '../../datasource/conda/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubDigestDatasource } from '../../datasource/github-digest/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabReleasesDatasource } from '../../datasource/gitlab-releases/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { GoDatasource } from '../../datasource/go/index.ts';\nimport { JavaVersionDatasource } from '../../datasource/java-version/index.ts';\nimport { NodeVersionDatasource } from '../../datasource/node-version/index.ts';\nimport { NpmDatasource } from '../../datasource/npm/index.ts';\nimport { NugetDatasource } from '../../datasource/nuget/index.ts';\nimport { PypiDatasource } from '../../datasource/pypi/index.ts';\nimport { RubyVersionDatasource } from '../../datasource/ruby-version/index.ts';\nimport { RubygemsDatasource } from '../../datasource/rubygems/index.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport { supportedDatasources as asdfSupportedDatasources } from '../asdf/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\nimport { configFileLocations, getConfigFilePattern } from './config-files.ts';\n\nexport { updateArtifacts } from './artifacts.ts';\nexport { knownDepTypes, supportsDynamicDepTypesNote } from './dep-types.ts';\nexport { extractPackageFile } from './extract.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const displayName = 'mise-en-place';\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['mise.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\nexport const url = 'https://mise.jdx.dev';\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n mise: {\n note: 'mise has its own `minimum_release_age` setting, which Renovate does not read yet.',\n },\n};\n\nexport const defaultConfig = {\n managerFilePatterns: configFileLocations.map(getConfigFilePattern),\n pinDigests: false,\n};\n\nconst backendDatasources = {\n core: [\n GithubReleasesDatasource.id,\n GithubTagsDatasource.id,\n JavaVersionDatasource.id,\n NodeVersionDatasource.id,\n RubyVersionDatasource.id,\n RustVersionDatasource.id,\n ],\n // Re-use the asdf datasources, as mise and asdf support the same plugins.\n asdf: asdfSupportedDatasources,\n aqua: [GithubTagsDatasource.id],\n cargo: [CrateDatasource.id, GitTagsDatasource.id, GitRefsDatasource.id],\n conda: [CondaDatasource.id],\n dotnet: [NugetDatasource.id],\n gem: [RubygemsDatasource.id],\n github: [GithubReleasesDatasource.id],\n gitlab: [GitlabReleasesDatasource.id],\n go: [GoDatasource.id],\n npm: [NpmDatasource.id],\n pipx: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n pypi: [PypiDatasource.id, GithubTagsDatasource.id, GitRefsDatasource.id],\n spm: [GithubReleasesDatasource.id],\n ubi: [GithubReleasesDatasource.id],\n // not supported\n vfox: [],\n};\n\n// datasources of remote `include` entries and git task files\nconst remoteReferenceDatasources = [\n BitbucketTagsDatasource.id,\n DockerDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n GithubDigestDatasource.id,\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n];\n\n/**\n * Backends that are definitely supported out-of-the-box with Renovate.\n */\nexport const supportedBackendDatasources = new Set(\n Object.keys(backendDatasources).filter((key) => key !== 'vfox'),\n);\n\n/**\n * Backends that may require some additional work for users to configure Renovate to update them.\n */\nexport const maybeSupportedBackendDatasources = new Set<string>(\n Object.keys(backendDatasources).filter(\n (key) => key === 'vfox' || key === 'aqua',\n ),\n);\n\nexport const supportedDatasources = deduplicateArray([\n ...Object.values(backendDatasources).flat(),\n ...remoteReferenceDatasources,\n]).sort();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAa,cAAc;AAE3B,MAAa,gBAAgB,CAAC,WAAW;AAEzC,MAAa,MAAM;AAEnB,MAAa,2BAAqD,EAChE,MAAM,EACJ,MAAM,oFACR,EACF;AAEA,MAAa,gBAAgB;CAC3B,qBAAqB,oBAAoB,IAAI,oBAAoB;CACjE,YAAY;AACd;AAEA,MAAM,qBAAqB;CACzB,MAAM;EACJ,yBAAyB;EACzB,qBAAqB;EACrB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CAEA,MAAMA;CACN,MAAM,CAAC,qBAAqB,EAAE;CAC9B,OAAO;EAAC,gBAAgB;EAAI,kBAAkB;EAAI,kBAAkB;CAAE;CACtE,OAAO,CAAC,gBAAgB,EAAE;CAC1B,QAAQ,CAAC,gBAAgB,EAAE;CAC3B,KAAK,CAAC,mBAAmB,EAAE;CAC3B,QAAQ,CAAC,yBAAyB,EAAE;CACpC,QAAQ,CAAC,yBAAyB,EAAE;CACpC,IAAI,CAAC,aAAa,EAAE;CACpB,KAAK,CAAC,cAAc,EAAE;CACtB,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,MAAM;EAAC,eAAe;EAAI,qBAAqB;EAAI,kBAAkB;CAAE;CACvE,KAAK,CAAC,yBAAyB,EAAE;CACjC,KAAK,CAAC,yBAAyB,EAAE;CAEjC,MAAM,CAAC;AACT;AAGA,MAAM,6BAA6B;CACjC,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,uBAAuB;CACvB,qBAAqB;CACrB,qBAAqB;AACvB;;;;AAKA,MAAa,8BAA8B,IAAI,IAC7C,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAAQ,QAAQ,QAAQ,MAAM,CAChE;;;;AAKA,MAAa,mCAAmC,IAAI,IAClD,OAAO,KAAK,kBAAkB,CAAC,CAAC,QAC7B,QAAQ,QAAQ,UAAU,QAAQ,MACrC,CACF;AAEA,MAAa,uBAAuB,iBAAiB,CACnD,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,KAAK,GAC1C,GAAG,0BACL,CAAC,CAAC,CAAC,KAAK"}
@@ -12,8 +12,8 @@ import { NpmDatasource } from "../../datasource/npm/index.js";
12
12
  import { RubyVersionDatasource } from "../../datasource/ruby-version/index.js";
13
13
  import { RustVersionDatasource } from "../../datasource/rust-version/index.js";
14
14
  import { upgradeableTooling } from "../asdf/upgradeable-tooling.js";
15
- import { MiseRegistryJson } from "./schema.js";
16
15
  import mise_registry_default from "../../../data/mise-registry.js";
16
+ import { MiseRegistryJson } from "./schema.js";
17
17
  // lib/modules/manager/mise/upgradeable-tooling.ts
18
18
  const asdfTooling = upgradeableTooling;
19
19
  function shortJavaVersioning(version) {
@@ -1,28 +1,37 @@
1
1
  import { newlineRegex } from "../../../util/regex.js";
2
2
  import { logger } from "../../../logger/index.js";
3
+ import { getParentDir } from "../../../util/fs/index.js";
4
+ import { parse } from "../../versioning/rust-release-channel/parse.js";
3
5
  import { api } from "../../versioning/rust-release-channel/index.js";
4
6
  import { RustVersionDatasource } from "../../datasource/rust-version/index.js";
5
7
  import { RustToolchain } from "./schema.js";
6
- import { isNonEmptyString } from "@sindresorhus/is";
8
+ import { isNonEmptyString, isString } from "@sindresorhus/is";
9
+ import upath from "upath";
7
10
  // lib/modules/manager/rust-toolchain/extract.ts
8
11
  function extractPackageFile(content, packageFile) {
9
12
  logger.trace(`rust-toolchain.extractPackageFile(${packageFile})`);
10
13
  const parsedResult = RustToolchain.safeParse(content);
11
14
  if (parsedResult.success) {
12
15
  const { channel, path } = parsedResult.data.toolchain;
13
- if (isNonEmptyString(channel)) return { deps: [createDependency(channel)] };
16
+ if (isNonEmptyString(channel)) return createPackageFileContent(channel, packageFile);
14
17
  if (isNonEmptyString(path)) {
15
18
  logger.debug(`rust-toolchain.toml file at ${packageFile} uses a local path toolchain, which cannot be updated`);
16
- return { deps: [{
17
- ...baseDependency(),
18
- skipReason: "path-dependency"
19
- }] };
19
+ return {
20
+ deps: [{
21
+ ...baseDependency(),
22
+ skipReason: "path-dependency"
23
+ }],
24
+ sharedConstraintsScope: getSharedConstraintsScope(null, packageFile)
25
+ };
20
26
  }
21
27
  logger.debug(`rust-toolchain.toml file at ${packageFile} has no toolchain channel or path specified`);
22
- return { deps: [{
23
- ...baseDependency(),
24
- skipReason: "unspecified-version"
25
- }] };
28
+ return {
29
+ deps: [{
30
+ ...baseDependency(),
31
+ skipReason: "unspecified-version"
32
+ }],
33
+ sharedConstraintsScope: getSharedConstraintsScope(null, packageFile)
34
+ };
26
35
  }
27
36
  if (packageFile.endsWith(".toml")) {
28
37
  logger.debug({
@@ -37,7 +46,35 @@ function extractPackageFile(content, packageFile) {
37
46
  logger.debug({ packageFile }, "rust-toolchain file is empty or contains multiple lines");
38
47
  return null;
39
48
  }
40
- return { deps: [createDependency(lines[0])] };
49
+ return createPackageFileContent(lines[0], packageFile);
50
+ }
51
+ function createPackageFileContent(channel, packageFile) {
52
+ return {
53
+ deps: [createDependency(channel)],
54
+ sharedConstraintsScope: getSharedConstraintsScope(getConstraintValue(channel), packageFile)
55
+ };
56
+ }
57
+ /**
58
+ * Returns the toolchain channel as a constraint if it is a Rust version like `1.100.0` or `1.100`, else `null`, as other managers cannot use a channel like `stable` or `nightly`.
59
+ */
60
+ function getConstraintValue(channel) {
61
+ const toolchain = parse(channel);
62
+ if (!toolchain || isString(toolchain.channel)) return null;
63
+ const { channel: version, date, host } = toolchain;
64
+ return !version.prerelease && !date && !host ? channel : null;
65
+ }
66
+ /**
67
+ * Shares the Rust version of a toolchain file, or `null` for a toolchain which is no Rust version, so that the toolchain file of a parent directory does not apply, like with `rustup`.
68
+ */
69
+ function getSharedConstraintsScope(version, packageFile) {
70
+ return {
71
+ directory: getParentDir(packageFile),
72
+ precedence: upath.basename(packageFile) === "rust-toolchain" ? 1 : 0,
73
+ constraints: { rust: {
74
+ depName: "rust",
75
+ value: version
76
+ } }
77
+ };
41
78
  }
42
79
  function baseDependency() {
43
80
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/rust-toolchain/extract.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex } from '../../../util/regex.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport * as rustVersioning from '../../versioning/rust-release-channel/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport { RustToolchain } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n logger.trace(`rust-toolchain.extractPackageFile(${packageFile})`);\n\n // Try TOML parsing first\n const parsedResult = RustToolchain.safeParse(content);\n if (parsedResult.success) {\n const { channel, path } = parsedResult.data.toolchain;\n if (isNonEmptyString(channel)) {\n return { deps: [createDependency(channel)] };\n }\n if (isNonEmptyString(path)) {\n logger.debug(\n `rust-toolchain.toml file at ${packageFile} uses a local path toolchain, which cannot be updated`,\n );\n return {\n deps: [{ ...baseDependency(), skipReason: 'path-dependency' }],\n };\n }\n logger.debug(\n `rust-toolchain.toml file at ${packageFile} has no toolchain channel or path specified`,\n );\n return {\n deps: [{ ...baseDependency(), skipReason: 'unspecified-version' }],\n };\n }\n\n // For .toml files, TOML parsing must succeed\n if (packageFile.endsWith('.toml')) {\n logger.debug(\n { err: parsedResult.error, packageFile },\n 'Failed to parse rust-toolchain.toml file',\n );\n return null;\n }\n\n // Fall back to legacy format for files without .toml extension\n logger.trace({ packageFile }, 'TOML parsing failed, trying legacy format');\n\n const lines = content\n .split(newlineRegex)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length !== 1) {\n logger.debug(\n { packageFile },\n 'rust-toolchain file is empty or contains multiple lines',\n );\n return null;\n }\n\n return { deps: [createDependency(lines[0])] };\n}\n\nfunction baseDependency(): PackageDependency {\n return {\n depName: 'rust',\n depType: 'toolchain',\n datasource: RustVersionDatasource.id,\n };\n}\n\nfunction createDependency(channel: string): PackageDependency {\n const dep: PackageDependency = {\n ...baseDependency(),\n currentValue: channel,\n };\n\n if (!rustVersioning.api.isValid(channel)) {\n logger.debug(`Unsupported rust-toolchain channel value \"${channel}\"`);\n dep.skipReason = 'invalid-version';\n }\n\n return dep;\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,qCAAqC,YAAY,EAAE;CAGhE,MAAM,eAAe,cAAc,UAAU,OAAO;CACpD,IAAI,aAAa,SAAS;EACxB,MAAM,EAAE,SAAS,SAAS,aAAa,KAAK;EAC5C,IAAI,iBAAiB,OAAO,GAC1B,OAAO,EAAE,MAAM,CAAC,iBAAiB,OAAO,CAAC,EAAE;EAE7C,IAAI,iBAAiB,IAAI,GAAG;GAC1B,OAAO,MACL,+BAA+B,YAAY,sDAC7C;GACA,OAAO,EACL,MAAM,CAAC;IAAE,GAAG,eAAe;IAAG,YAAY;GAAkB,CAAC,EAC/D;EACF;EACA,OAAO,MACL,+BAA+B,YAAY,4CAC7C;EACA,OAAO,EACL,MAAM,CAAC;GAAE,GAAG,eAAe;GAAG,YAAY;EAAsB,CAAC,EACnE;CACF;CAGA,IAAI,YAAY,SAAS,OAAO,GAAG;EACjC,OAAO,MACL;GAAE,KAAK,aAAa;GAAO;EAAY,GACvC,0CACF;EACA,OAAO;CACT;CAGA,OAAO,MAAM,EAAE,YAAY,GAAG,2CAA2C;CAEzE,MAAM,QAAQ,QACX,MAAM,YAAY,CAAC,CACnB,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CACpB,QAAQ,MAAM,EAAE,SAAS,CAAC;CAE7B,IAAI,MAAM,WAAW,GAAG;EACtB,OAAO,MACL,EAAE,YAAY,GACd,yDACF;EACA,OAAO;CACT;CAEA,OAAO,EAAE,MAAM,CAAC,iBAAiB,MAAM,EAAE,CAAC,EAAE;AAC9C;AAEA,SAAS,iBAAoC;CAC3C,OAAO;EACL,SAAS;EACT,SAAS;EACT,YAAY,sBAAsB;CACpC;AACF;AAEA,SAAS,iBAAiB,SAAoC;CAC5D,MAAM,MAAyB;EAC7B,GAAG,eAAe;EAClB,cAAc;CAChB;CAEA,IAAI,CAAA,IAAoB,QAAQ,OAAO,GAAG;EACxC,OAAO,MAAM,6CAA6C,QAAQ,EAAE;EACpE,IAAI,aAAa;CACnB;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/rust-toolchain/extract.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../logger/index.ts';\nimport { getParentDir } from '../../../util/fs/index.ts';\nimport { newlineRegex } from '../../../util/regex.ts';\nimport { RustVersionDatasource } from '../../datasource/rust-version/index.ts';\nimport * as rustVersioning from '../../versioning/rust-release-channel/index.ts';\nimport { parse } from '../../versioning/rust-release-channel/parse.ts';\nimport type {\n PackageDependency,\n PackageFileContent,\n SharedConstraintsScope,\n} from '../types.ts';\nimport { RustToolchain } from './schema.ts';\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n): PackageFileContent | null {\n logger.trace(`rust-toolchain.extractPackageFile(${packageFile})`);\n\n // Try TOML parsing first\n const parsedResult = RustToolchain.safeParse(content);\n if (parsedResult.success) {\n const { channel, path } = parsedResult.data.toolchain;\n if (isNonEmptyString(channel)) {\n return createPackageFileContent(channel, packageFile);\n }\n if (isNonEmptyString(path)) {\n logger.debug(\n `rust-toolchain.toml file at ${packageFile} uses a local path toolchain, which cannot be updated`,\n );\n return {\n deps: [{ ...baseDependency(), skipReason: 'path-dependency' }],\n sharedConstraintsScope: getSharedConstraintsScope(null, packageFile),\n };\n }\n logger.debug(\n `rust-toolchain.toml file at ${packageFile} has no toolchain channel or path specified`,\n );\n return {\n deps: [{ ...baseDependency(), skipReason: 'unspecified-version' }],\n sharedConstraintsScope: getSharedConstraintsScope(null, packageFile),\n };\n }\n\n // For .toml files, TOML parsing must succeed\n if (packageFile.endsWith('.toml')) {\n logger.debug(\n { err: parsedResult.error, packageFile },\n 'Failed to parse rust-toolchain.toml file',\n );\n return null;\n }\n\n // Fall back to legacy format for files without .toml extension\n logger.trace({ packageFile }, 'TOML parsing failed, trying legacy format');\n\n const lines = content\n .split(newlineRegex)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length !== 1) {\n logger.debug(\n { packageFile },\n 'rust-toolchain file is empty or contains multiple lines',\n );\n return null;\n }\n\n return createPackageFileContent(lines[0], packageFile);\n}\n\nfunction createPackageFileContent(\n channel: string,\n packageFile: string,\n): PackageFileContent {\n return {\n deps: [createDependency(channel)],\n sharedConstraintsScope: getSharedConstraintsScope(\n getConstraintValue(channel),\n packageFile,\n ),\n };\n}\n\n/**\n * Returns the toolchain channel as a constraint if it is a Rust version like `1.100.0` or `1.100`, else `null`, as other managers cannot use a channel like `stable` or `nightly`.\n */\nfunction getConstraintValue(channel: string): string | null {\n const toolchain = parse(channel);\n if (!toolchain || isString(toolchain.channel)) {\n return null;\n }\n // a pre-release, a date or a host like `1.100.0-x86_64-unknown-linux-gnu` is no version Containerbase installs\n const { channel: version, date, host } = toolchain;\n return !version.prerelease && !date && !host ? channel : null;\n}\n\n/**\n * Shares the Rust version of a toolchain file, or `null` for a toolchain which is no Rust version, so that the toolchain file of a parent directory does not apply, like with `rustup`.\n */\nfunction getSharedConstraintsScope(\n version: string | null,\n packageFile: string,\n): SharedConstraintsScope {\n return {\n directory: getParentDir(packageFile),\n // rustup prefers the legacy file over the TOML one in the same directory\n precedence: upath.basename(packageFile) === 'rust-toolchain' ? 1 : 0,\n constraints: { rust: { depName: 'rust', value: version } },\n };\n}\n\nfunction baseDependency(): PackageDependency {\n return {\n depName: 'rust',\n depType: 'toolchain',\n datasource: RustVersionDatasource.id,\n };\n}\n\nfunction createDependency(channel: string): PackageDependency {\n const dep: PackageDependency = {\n ...baseDependency(),\n currentValue: channel,\n };\n\n if (!rustVersioning.api.isValid(channel)) {\n logger.debug(`Unsupported rust-toolchain channel value \"${channel}\"`);\n dep.skipReason = 'invalid-version';\n }\n\n return dep;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,mBACd,SACA,aAC2B;CAC3B,OAAO,MAAM,qCAAqC,YAAY,EAAE;CAGhE,MAAM,eAAe,cAAc,UAAU,OAAO;CACpD,IAAI,aAAa,SAAS;EACxB,MAAM,EAAE,SAAS,SAAS,aAAa,KAAK;EAC5C,IAAI,iBAAiB,OAAO,GAC1B,OAAO,yBAAyB,SAAS,WAAW;EAEtD,IAAI,iBAAiB,IAAI,GAAG;GAC1B,OAAO,MACL,+BAA+B,YAAY,sDAC7C;GACA,OAAO;IACL,MAAM,CAAC;KAAE,GAAG,eAAe;KAAG,YAAY;IAAkB,CAAC;IAC7D,wBAAwB,0BAA0B,MAAM,WAAW;GACrE;EACF;EACA,OAAO,MACL,+BAA+B,YAAY,4CAC7C;EACA,OAAO;GACL,MAAM,CAAC;IAAE,GAAG,eAAe;IAAG,YAAY;GAAsB,CAAC;GACjE,wBAAwB,0BAA0B,MAAM,WAAW;EACrE;CACF;CAGA,IAAI,YAAY,SAAS,OAAO,GAAG;EACjC,OAAO,MACL;GAAE,KAAK,aAAa;GAAO;EAAY,GACvC,0CACF;EACA,OAAO;CACT;CAGA,OAAO,MAAM,EAAE,YAAY,GAAG,2CAA2C;CAEzE,MAAM,QAAQ,QACX,MAAM,YAAY,CAAC,CACnB,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CACpB,QAAQ,MAAM,EAAE,SAAS,CAAC;CAE7B,IAAI,MAAM,WAAW,GAAG;EACtB,OAAO,MACL,EAAE,YAAY,GACd,yDACF;EACA,OAAO;CACT;CAEA,OAAO,yBAAyB,MAAM,IAAI,WAAW;AACvD;AAEA,SAAS,yBACP,SACA,aACoB;CACpB,OAAO;EACL,MAAM,CAAC,iBAAiB,OAAO,CAAC;EAChC,wBAAwB,0BACtB,mBAAmB,OAAO,GAC1B,WACF;CACF;AACF;;;;AAKA,SAAS,mBAAmB,SAAgC;CAC1D,MAAM,YAAY,MAAM,OAAO;CAC/B,IAAI,CAAC,aAAa,SAAS,UAAU,OAAO,GAC1C,OAAO;CAGT,MAAM,EAAE,SAAS,SAAS,MAAM,SAAS;CACzC,OAAO,CAAC,QAAQ,cAAc,CAAC,QAAQ,CAAC,OAAO,UAAU;AAC3D;;;;AAKA,SAAS,0BACP,SACA,aACwB;CACxB,OAAO;EACL,WAAW,aAAa,WAAW;EAEnC,YAAY,MAAM,SAAS,WAAW,MAAM,mBAAmB,IAAI;EACnE,aAAa,EAAE,MAAM;GAAE,SAAS;GAAQ,OAAO;EAAQ,EAAE;CAC3D;AACF;AAEA,SAAS,iBAAoC;CAC3C,OAAO;EACL,SAAS;EACT,SAAS;EACT,YAAY,sBAAsB;CACpC;AACF;AAEA,SAAS,iBAAiB,SAAoC;CAC5D,MAAM,MAAyB;EAC7B,GAAG,eAAe;EAClB,cAAc;CAChB;CAEA,IAAI,CAAA,IAAoB,QAAQ,OAAO,GAAG;EACxC,OAAO,MAAM,6CAA6C,QAAQ,EAAE;EACpE,IAAI,aAAa;CACnB;CAEA,OAAO;AACT"}
@@ -6,7 +6,6 @@ import { clone } from "../../../util/clone.js";
6
6
  import { mergeChildConfig } from "../../../config/utils.js";
7
7
  import { ATTR_RENOVATE_SPLIT } from "../../../instrumentation/types.js";
8
8
  import { instrument } from "../../../instrumentation/index.js";
9
- import { parseJson } from "../../../util/common.js";
10
9
  import { ExternalHostError } from "../../../types/errors/external-host-error.js";
11
10
  import { resolveConfigPresets } from "../../../config/presets/index.js";
12
11
  import { getCache } from "../../../util/cache/repository/index.js";
@@ -16,6 +15,7 @@ import { platform } from "../../../modules/platform/index.js";
16
15
  import "../../../config/index.js";
17
16
  import { addSplit } from "../../../util/split.js";
18
17
  import { migrateAndValidate } from "../../../config/migrate-validate.js";
18
+ import { parseFileConfig } from "../../../config/parse.js";
19
19
  import { readDashboardBody } from "../dependency-dashboard.js";
20
20
  import { extract, lookup, update } from "./extract-update.js";
21
21
  // lib/workers/repository/process/index.ts
@@ -51,7 +51,15 @@ async function getBaseBranchConfig(baseBranch, config) {
51
51
  error.validationMessage = `Error fetching config file \`${configFileName}\` from branch \`${baseBranch}\``;
52
52
  throw error;
53
53
  }
54
- baseBranchConfig = parseJson(configFileRaw.length ? configFileRaw : "{}", configFileName);
54
+ const parseResult = parseFileConfig(configFileName, configFileRaw.length ? configFileRaw : "{}");
55
+ if (!parseResult.success) {
56
+ const error = new Error(CONFIG_VALIDATION);
57
+ error.validationSource = configFileName;
58
+ error.validationError = `The renovate configuration file of branch ${baseBranch} could not be parsed: ${parseResult.validationError}`;
59
+ error.validationMessage = parseResult.validationMessage;
60
+ throw error;
61
+ }
62
+ baseBranchConfig = parseResult.parsedContents;
55
63
  logger.debug({ config: baseBranchConfig }, "Base branch config raw");
56
64
  baseBranchConfig = await migrateAndValidate(config, baseBranchConfig);
57
65
  if (baseBranchConfig.errors?.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/process/index.ts"],"sourcesContent":["// TODO #22198\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { migrateAndValidate } from '../../../config/migrate-validate.ts';\nimport { resolveConfigPresets } from '../../../config/presets/index.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n PlatformErrors,\n TemporaryErrors,\n} from '../../../constants/error-messages.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { ATTR_RENOVATE_SPLIT } from '../../../instrumentation/types.ts';\nimport { addMeta, logger, removeMeta } from '../../../logger/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getBranchList } from '../../../util/git/index.ts';\nimport { addSplit } from '../../../util/split.ts';\nimport { getRegexPredicate } from '../../../util/string-match.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport { readDashboardBody } from '../dependency-dashboard.ts';\nimport type { ExtractResult } from './extract-update.ts';\nimport { extract, lookup, update } from './extract-update.ts';\nimport type { WriteUpdateResult } from './write.ts';\n\nfunction isPlatformOrTemporaryError(message: unknown): boolean {\n return (\n (PlatformErrors as readonly unknown[]).includes(message) ||\n (TemporaryErrors as readonly unknown[]).includes(message)\n );\n}\n\nexport async function getBaseBranchConfig(\n baseBranch: string,\n config: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.debug(`baseBranch: ${baseBranch}`);\n\n let baseBranchConfig: RenovateConfig = clone(config);\n\n if (\n config.useBaseBranchConfig === 'merge' &&\n baseBranch !== config.defaultBranch\n ) {\n logger.debug(\n { baseBranch },\n `Merging config from base branch because useBaseBranchConfig=merge`,\n );\n\n // Retrieve config file name autodetected for this repo\n const cache = getCache();\n // TODO: types (#22198)\n const configFileName = cache.configFileName!;\n\n let configFileRaw: string | null;\n try {\n configFileRaw = await platform.getRawFile(\n configFileName,\n config.repository,\n baseBranch,\n );\n } catch (err) {\n if (\n err instanceof ExternalHostError ||\n isPlatformOrTemporaryError(err.message)\n ) {\n throw err;\n }\n\n logger.debug(\n { configFileName, baseBranch, err },\n 'Error fetching config file from base branch',\n );\n configFileRaw = null;\n }\n\n if (configFileRaw === null) {\n logger.error(\n { configFileName, baseBranch },\n `Error fetching config file from base branch - possible config name mismatch between branches?`,\n );\n\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = 'Error fetching config file';\n error.validationMessage = `Error fetching config file \\`${configFileName}\\` from branch \\`${baseBranch}\\``;\n throw error;\n }\n\n baseBranchConfig = parseJson(\n configFileRaw.length ? configFileRaw : '{}',\n configFileName,\n ) as RenovateConfig;\n logger.debug({ config: baseBranchConfig }, 'Base branch config raw');\n\n baseBranchConfig = await migrateAndValidate(config, baseBranchConfig);\n if (baseBranchConfig.errors?.length) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = configFileName;\n error.validationError = `The renovate configuration file of branch ${baseBranch} contains some invalid settings`;\n error.validationMessage = baseBranchConfig.errors\n .map((e) => e.message)\n .join(', ');\n throw error;\n }\n\n ({ config: baseBranchConfig } = await resolveConfigPresets(\n baseBranchConfig,\n config,\n ));\n baseBranchConfig = mergeChildConfig(config, baseBranchConfig);\n\n // istanbul ignore if\n if (config.printConfig) {\n logger.info(\n { config: baseBranchConfig },\n 'Base branch config after merge',\n );\n }\n\n // baseBranches value should be based off the default branch\n baseBranchConfig.baseBranchPatterns = config.baseBranchPatterns;\n baseBranchConfig.baseBranches = config.baseBranches;\n }\n\n if (isMultiBaseBranch(config)) {\n baseBranchConfig.branchPrefix += `${baseBranch}-`;\n baseBranchConfig.hasBaseBranches = true;\n }\n\n baseBranchConfig = mergeChildConfig(baseBranchConfig, { baseBranch });\n\n return baseBranchConfig;\n}\n\nfunction unfoldBaseBranches(\n defaultBranch: string,\n baseBranchPatterns: string[],\n): string[] {\n const unfoldedList: string[] = [];\n\n const allBranches = getBranchList();\n for (const baseBranchPattern of baseBranchPatterns) {\n const isAllowedPred = getRegexPredicate(baseBranchPattern);\n if (isAllowedPred) {\n const matchingBranches = allBranches.filter(isAllowedPred);\n logger.debug(\n `baseBranchPatterns regex \"${baseBranchPattern}\" matches [${matchingBranches.join()}]`,\n );\n unfoldedList.push(...matchingBranches);\n } else if (baseBranchPattern === '$default') {\n logger.debug(`baseBranchPatterns \"$default\" matches \"${defaultBranch}\"`);\n unfoldedList.push(defaultBranch);\n } else {\n unfoldedList.push(baseBranchPattern);\n }\n }\n\n return [...new Set(unfoldedList)];\n}\n\nexport function isMultiBaseBranch(config: RenovateConfig): boolean {\n if (!config.baseBranchPatterns?.length) {\n return false;\n }\n\n return (\n config.baseBranchPatterns.length > 1 ||\n config.baseBranchPatterns[0].startsWith('/')\n );\n}\n\nexport async function extractDependencies(\n config: RenovateConfig,\n overwriteCache = true,\n): Promise<ExtractResult> {\n await readDashboardBody(config);\n let res: ExtractResult = {\n branches: [],\n branchList: [],\n packageFiles: {},\n };\n if (\n GlobalConfig.get('platform') !== 'local' &&\n config.baseBranchPatterns?.length\n ) {\n config.baseBranches = unfoldBaseBranches(\n config.defaultBranch!,\n config.baseBranchPatterns,\n );\n logger.debug({ baseBranches: config.baseBranches }, 'baseBranches');\n const extracted: Record<string, Record<string, PackageFile[]>> = {};\n await instrument(\n 'extract',\n async () => {\n for (const baseBranch of config.baseBranches!) {\n addMeta({ baseBranch });\n\n if (scm.syncForkWithUpstream) {\n await scm.syncForkWithUpstream(baseBranch);\n }\n if (await scm.branchExists(baseBranch)) {\n const baseBranchConfig = await getBaseBranchConfig(\n baseBranch,\n config,\n );\n extracted[baseBranch] = await extract(\n baseBranchConfig,\n overwriteCache,\n );\n } else {\n logger.warn(\n { baseBranch },\n 'Base branch does not exist - skipping',\n );\n }\n }\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'extract',\n },\n },\n );\n addSplit('extract');\n await instrument(\n 'lookup',\n async () => {\n for (const baseBranch of config.baseBranches!) {\n if (await scm.branchExists(baseBranch)) {\n addMeta({ baseBranch });\n const baseBranchConfig = await getBaseBranchConfig(\n baseBranch,\n config,\n );\n const packageFiles = extracted[baseBranch];\n const baseBranchRes = await lookup(baseBranchConfig, packageFiles);\n res.branches = res.branches.concat(baseBranchRes?.branches);\n res.branchList = res.branchList.concat(baseBranchRes?.branchList);\n if (!res.packageFiles || !Object.keys(res.packageFiles).length) {\n // Use the first branch\n res.packageFiles = baseBranchRes?.packageFiles;\n }\n }\n }\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'lookup',\n },\n },\n );\n removeMeta(['baseBranch']);\n } else {\n logger.debug('No baseBranches');\n const packageFiles = await instrument(\n 'extract',\n async () => await extract(config, overwriteCache),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'extract',\n },\n },\n );\n addSplit('extract');\n if (GlobalConfig.get('dryRun') === 'extract') {\n res.packageFiles = packageFiles;\n logger.info({ packageFiles }, 'Extracted dependencies');\n return res;\n }\n res = await instrument(\n 'lookup',\n async () => await lookup(config, packageFiles),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'lookup',\n },\n },\n );\n }\n addSplit('lookup');\n return res;\n}\n\nexport function updateRepo(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n logger.debug('processRepo()');\n\n return update(config, branches);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/process/index.ts"],"sourcesContent":["// TODO #22198\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { mergeChildConfig } from '../../../config/index.ts';\nimport { migrateAndValidate } from '../../../config/migrate-validate.ts';\nimport { parseFileConfig } from '../../../config/parse.ts';\nimport { resolveConfigPresets } from '../../../config/presets/index.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n PlatformErrors,\n TemporaryErrors,\n} from '../../../constants/error-messages.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { ATTR_RENOVATE_SPLIT } from '../../../instrumentation/types.ts';\nimport { addMeta, logger, removeMeta } from '../../../logger/index.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { getBranchList } from '../../../util/git/index.ts';\nimport { addSplit } from '../../../util/split.ts';\nimport { getRegexPredicate } from '../../../util/string-match.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport { readDashboardBody } from '../dependency-dashboard.ts';\nimport type { ExtractResult } from './extract-update.ts';\nimport { extract, lookup, update } from './extract-update.ts';\nimport type { WriteUpdateResult } from './write.ts';\n\nfunction isPlatformOrTemporaryError(message: unknown): boolean {\n return (\n (PlatformErrors as readonly unknown[]).includes(message) ||\n (TemporaryErrors as readonly unknown[]).includes(message)\n );\n}\n\nexport async function getBaseBranchConfig(\n baseBranch: string,\n config: RenovateConfig,\n): Promise<RenovateConfig> {\n logger.debug(`baseBranch: ${baseBranch}`);\n\n let baseBranchConfig: RenovateConfig = clone(config);\n\n if (\n config.useBaseBranchConfig === 'merge' &&\n baseBranch !== config.defaultBranch\n ) {\n logger.debug(\n { baseBranch },\n `Merging config from base branch because useBaseBranchConfig=merge`,\n );\n\n // Retrieve config file name autodetected for this repo\n const cache = getCache();\n // TODO: types (#22198)\n const configFileName = cache.configFileName!;\n\n let configFileRaw: string | null;\n try {\n configFileRaw = await platform.getRawFile(\n configFileName,\n config.repository,\n baseBranch,\n );\n } catch (err) {\n if (\n err instanceof ExternalHostError ||\n isPlatformOrTemporaryError(err.message)\n ) {\n throw err;\n }\n\n logger.debug(\n { configFileName, baseBranch, err },\n 'Error fetching config file from base branch',\n );\n configFileRaw = null;\n }\n\n if (configFileRaw === null) {\n logger.error(\n { configFileName, baseBranch },\n `Error fetching config file from base branch - possible config name mismatch between branches?`,\n );\n\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = 'config';\n error.validationError = 'Error fetching config file';\n error.validationMessage = `Error fetching config file \\`${configFileName}\\` from branch \\`${baseBranch}\\``;\n throw error;\n }\n\n const parseResult = parseFileConfig(\n configFileName,\n configFileRaw.length ? configFileRaw : '{}',\n );\n if (!parseResult.success) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = configFileName;\n error.validationError = `The renovate configuration file of branch ${baseBranch} could not be parsed: ${parseResult.validationError}`;\n error.validationMessage = parseResult.validationMessage;\n throw error;\n }\n baseBranchConfig = parseResult.parsedContents as RenovateConfig;\n logger.debug({ config: baseBranchConfig }, 'Base branch config raw');\n\n baseBranchConfig = await migrateAndValidate(config, baseBranchConfig);\n if (baseBranchConfig.errors?.length) {\n const error = new Error(CONFIG_VALIDATION);\n error.validationSource = configFileName;\n error.validationError = `The renovate configuration file of branch ${baseBranch} contains some invalid settings`;\n error.validationMessage = baseBranchConfig.errors\n .map((e) => e.message)\n .join(', ');\n throw error;\n }\n\n ({ config: baseBranchConfig } = await resolveConfigPresets(\n baseBranchConfig,\n config,\n ));\n baseBranchConfig = mergeChildConfig(config, baseBranchConfig);\n\n // istanbul ignore if\n if (config.printConfig) {\n logger.info(\n { config: baseBranchConfig },\n 'Base branch config after merge',\n );\n }\n\n // baseBranches value should be based off the default branch\n baseBranchConfig.baseBranchPatterns = config.baseBranchPatterns;\n baseBranchConfig.baseBranches = config.baseBranches;\n }\n\n if (isMultiBaseBranch(config)) {\n baseBranchConfig.branchPrefix += `${baseBranch}-`;\n baseBranchConfig.hasBaseBranches = true;\n }\n\n baseBranchConfig = mergeChildConfig(baseBranchConfig, { baseBranch });\n\n return baseBranchConfig;\n}\n\nfunction unfoldBaseBranches(\n defaultBranch: string,\n baseBranchPatterns: string[],\n): string[] {\n const unfoldedList: string[] = [];\n\n const allBranches = getBranchList();\n for (const baseBranchPattern of baseBranchPatterns) {\n const isAllowedPred = getRegexPredicate(baseBranchPattern);\n if (isAllowedPred) {\n const matchingBranches = allBranches.filter(isAllowedPred);\n logger.debug(\n `baseBranchPatterns regex \"${baseBranchPattern}\" matches [${matchingBranches.join()}]`,\n );\n unfoldedList.push(...matchingBranches);\n } else if (baseBranchPattern === '$default') {\n logger.debug(`baseBranchPatterns \"$default\" matches \"${defaultBranch}\"`);\n unfoldedList.push(defaultBranch);\n } else {\n unfoldedList.push(baseBranchPattern);\n }\n }\n\n return [...new Set(unfoldedList)];\n}\n\nexport function isMultiBaseBranch(config: RenovateConfig): boolean {\n if (!config.baseBranchPatterns?.length) {\n return false;\n }\n\n return (\n config.baseBranchPatterns.length > 1 ||\n config.baseBranchPatterns[0].startsWith('/')\n );\n}\n\nexport async function extractDependencies(\n config: RenovateConfig,\n overwriteCache = true,\n): Promise<ExtractResult> {\n await readDashboardBody(config);\n let res: ExtractResult = {\n branches: [],\n branchList: [],\n packageFiles: {},\n };\n if (\n GlobalConfig.get('platform') !== 'local' &&\n config.baseBranchPatterns?.length\n ) {\n config.baseBranches = unfoldBaseBranches(\n config.defaultBranch!,\n config.baseBranchPatterns,\n );\n logger.debug({ baseBranches: config.baseBranches }, 'baseBranches');\n const extracted: Record<string, Record<string, PackageFile[]>> = {};\n await instrument(\n 'extract',\n async () => {\n for (const baseBranch of config.baseBranches!) {\n addMeta({ baseBranch });\n\n if (scm.syncForkWithUpstream) {\n await scm.syncForkWithUpstream(baseBranch);\n }\n if (await scm.branchExists(baseBranch)) {\n const baseBranchConfig = await getBaseBranchConfig(\n baseBranch,\n config,\n );\n extracted[baseBranch] = await extract(\n baseBranchConfig,\n overwriteCache,\n );\n } else {\n logger.warn(\n { baseBranch },\n 'Base branch does not exist - skipping',\n );\n }\n }\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'extract',\n },\n },\n );\n addSplit('extract');\n await instrument(\n 'lookup',\n async () => {\n for (const baseBranch of config.baseBranches!) {\n if (await scm.branchExists(baseBranch)) {\n addMeta({ baseBranch });\n const baseBranchConfig = await getBaseBranchConfig(\n baseBranch,\n config,\n );\n const packageFiles = extracted[baseBranch];\n const baseBranchRes = await lookup(baseBranchConfig, packageFiles);\n res.branches = res.branches.concat(baseBranchRes?.branches);\n res.branchList = res.branchList.concat(baseBranchRes?.branchList);\n if (!res.packageFiles || !Object.keys(res.packageFiles).length) {\n // Use the first branch\n res.packageFiles = baseBranchRes?.packageFiles;\n }\n }\n }\n },\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'lookup',\n },\n },\n );\n removeMeta(['baseBranch']);\n } else {\n logger.debug('No baseBranches');\n const packageFiles = await instrument(\n 'extract',\n async () => await extract(config, overwriteCache),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'extract',\n },\n },\n );\n addSplit('extract');\n if (GlobalConfig.get('dryRun') === 'extract') {\n res.packageFiles = packageFiles;\n logger.info({ packageFiles }, 'Extracted dependencies');\n return res;\n }\n res = await instrument(\n 'lookup',\n async () => await lookup(config, packageFiles),\n {\n attributes: {\n [ATTR_RENOVATE_SPLIT]: 'lookup',\n },\n },\n );\n }\n addSplit('lookup');\n return res;\n}\n\nexport function updateRepo(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n logger.debug('processRepo()');\n\n return update(config, branches);\n}\n"],"mappings":"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"}
@@ -187,7 +187,7 @@ async function ensurePr(prConfig) {
187
187
  > :exclamation: **Important**
188
188
  >
189
189
  > Release Notes retrieval for this PR were skipped because no github.com credentials were available.
190
- > If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).
190
+ > If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/main/docs/usage/getting-started/running.md#githubcom-token-for-changelogs-and-tools).
191
191
  `));
192
192
  }
193
193
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyArray,\n isNumber,\n isUndefined,\n} from '@sindresorhus/is';\nimport { codeBlock } from 'common-tags';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { emojify, stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { isPrAlreadyExistsError } from '../../../../util/http/github.ts';\nimport { isBadGateway } from '../../../../util/http/status.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const isPrOrBranchAutomerge =\n config.automergeType === 'pr' || config.automergeType === 'branch';\n const usePlatformAutomerge = Boolean(\n config.automerge && isPrOrBranchAutomerge && config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeCommitMessage: config.commitMessage,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n currentReleaseHasAttestation: boolean | undefined,\n): void {\n const { packageName, currentVersion, newVersion } = upgrade;\n\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n newRelease &&\n currentReleaseHasAttestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n emojify(\n codeBlock`\n > :stop_sign: **Caution**\n >\n > ${packageName} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.\n > Verify that release ${newVersion} was published by the expected author.\n `,\n ),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n hasAttestation: currentReleaseHasAttestation,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n const dependencyDashboardApproved =\n dependencyDashboardCheck === 'approvePr' ||\n dependencyDashboardCheck === 'unpend';\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n // skip cache when autoApprove is set, since new commits may have\n // reset platform approvals (e.g. GitLab's \"Remove all approvals\" setting)\n if (validatePrCache(prCache, prBodyFingerprint) && !config.autoApprove) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardApproved) {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n !dependencyDashboardApproved\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n const isStabilityPending =\n !!config.stabilityStatus && config.stabilityStatus !== 'yellow';\n const isWithinNotPendingHours =\n isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours;\n const isAwaitingTests = isStabilityPending || isWithinNotPendingHours;\n if (!dependencyDashboardCheck && isAwaitingTests) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n // fetch changelogs for matching upgrades.\n await embedChangelogs({\n upgrades: upgrades,\n stage: 'pr',\n });\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (isUndefined(logJSON.error)) {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n const shared = !logJSON.perDependencyNotes;\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !(\n shared &&\n commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n )\n ) {\n if (shared) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n }\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n emojify(\n codeBlock`\n > :exclamation: **Important**\n >\n > Release Notes retrieval for this PR were skipped because no github.com credentials were available.\n > If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).\n `,\n ),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(\n upgrade,\n currentReleaseHasAttestation,\n );\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n if (upgrade.logJSON?.perDependencyNotes) {\n continue;\n }\n\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const configuredLabels = prepareLabels(config);\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n configuredLabels, // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate &&\n !config.autoApprove\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (config.autoApprove) {\n logger.debug({ prTitle }, 'PR approval required');\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n }\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { labels: configuredLabels },\n `DRY-RUN: Would create PR: ${prTitle}`,\n );\n pr = { number: 0 } as never;\n } else {\n try {\n // for a vulnerability alert this checks the VulnerabilityConcurrentPRs count\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig)\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: configuredLabels,\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue(\n config.isVulnerabilityAlert\n ? 'VulnerabilityConcurrentPRs'\n : 'ConcurrentPRs',\n );\n incCountValue('HourlyPRs');\n logger.info(\n { pr: pr?.number, prTitle, labels: pr?.labels },\n 'PR created',\n );\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (isPrAlreadyExistsError(err)) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (isBadGateway(err)) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n if (\n config.branchAutomergeFailureMessage ===\n 'automerge aborted - merge queue'\n ) {\n content +=\n '\\n___\\n * The base branch only accepts changes through its merge queue and rejected the direct push, so branch automerge is not possible. Please set `automergeType=pr` instead, or allow Renovate to bypass the merge queue.';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n // oxlint-disable-next-line typescript/prefer-optional-chain -- instanceof is not a null guard\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyArray,\n isNumber,\n isUndefined,\n} from '@sindresorhus/is';\nimport { codeBlock } from 'common-tags';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { emojify, stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { isPrAlreadyExistsError } from '../../../../util/http/github.ts';\nimport { isBadGateway } from '../../../../util/http/status.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const isPrOrBranchAutomerge =\n config.automergeType === 'pr' || config.automergeType === 'branch';\n const usePlatformAutomerge = Boolean(\n config.automerge && isPrOrBranchAutomerge && config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeCommitMessage: config.commitMessage,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n currentReleaseHasAttestation: boolean | undefined,\n): void {\n const { packageName, currentVersion, newVersion } = upgrade;\n\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n newRelease &&\n currentReleaseHasAttestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n emojify(\n codeBlock`\n > :stop_sign: **Caution**\n >\n > ${packageName} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.\n > Verify that release ${newVersion} was published by the expected author.\n `,\n ),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n hasAttestation: currentReleaseHasAttestation,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n const dependencyDashboardApproved =\n dependencyDashboardCheck === 'approvePr' ||\n dependencyDashboardCheck === 'unpend';\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n // skip cache when autoApprove is set, since new commits may have\n // reset platform approvals (e.g. GitLab's \"Remove all approvals\" setting)\n if (validatePrCache(prCache, prBodyFingerprint) && !config.autoApprove) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardApproved) {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n !dependencyDashboardApproved\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n const isStabilityPending =\n !!config.stabilityStatus && config.stabilityStatus !== 'yellow';\n const isWithinNotPendingHours =\n isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours;\n const isAwaitingTests = isStabilityPending || isWithinNotPendingHours;\n if (!dependencyDashboardCheck && isAwaitingTests) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n // fetch changelogs for matching upgrades.\n await embedChangelogs({\n upgrades: upgrades,\n stage: 'pr',\n });\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (isUndefined(logJSON.error)) {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n const shared = !logJSON.perDependencyNotes;\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !(\n shared &&\n commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n )\n ) {\n if (shared) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n }\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n emojify(\n codeBlock`\n > :exclamation: **Important**\n >\n > Release Notes retrieval for this PR were skipped because no github.com credentials were available.\n > If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/main/docs/usage/getting-started/running.md#githubcom-token-for-changelogs-and-tools).\n `,\n ),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(\n upgrade,\n currentReleaseHasAttestation,\n );\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n if (upgrade.logJSON?.perDependencyNotes) {\n continue;\n }\n\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const configuredLabels = prepareLabels(config);\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n configuredLabels, // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate &&\n !config.autoApprove\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (config.autoApprove) {\n logger.debug({ prTitle }, 'PR approval required');\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n }\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { labels: configuredLabels },\n `DRY-RUN: Would create PR: ${prTitle}`,\n );\n pr = { number: 0 } as never;\n } else {\n try {\n // for a vulnerability alert this checks the VulnerabilityConcurrentPRs count\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig)\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: configuredLabels,\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue(\n config.isVulnerabilityAlert\n ? 'VulnerabilityConcurrentPRs'\n : 'ConcurrentPRs',\n );\n incCountValue('HourlyPRs');\n logger.info(\n { pr: pr?.number, prTitle, labels: pr?.labels },\n 'PR created',\n );\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (isPrAlreadyExistsError(err)) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (isBadGateway(err)) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n if (\n config.branchAutomergeFailureMessage ===\n 'automerge aborted - merge queue'\n ) {\n content +=\n '\\n___\\n * The base branch only accepts changes through its merge queue and rejected the direct push, so branch automerge is not possible. Please set `automergeType=pr` instead, or allow Renovate to bypass the merge queue.';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n // oxlint-disable-next-line typescript/prefer-optional-chain -- instanceof is not a null guard\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "44.217.0",
4
+ "version": "44.218.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -117,7 +117,7 @@
117
117
  "@opentelemetry/semantic-conventions": "1.44.0",
118
118
  "@pnpm/parse-overrides": "1001.0.4",
119
119
  "@qnighy/marshal": "0.1.3",
120
- "@redis/client": "6.3.0",
120
+ "@redis/client": "6.3.1",
121
121
  "@renovatebot/base-image": "13.160.4",
122
122
  "@renovatebot/detect-tools": "5.0.0",
123
123
  "@renovatebot/good-enough-parser": "4.0.3",