renovate 44.175.1 → 44.175.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/manager/bun/extract.js +1 -1
- package/dist/modules/manager/bun/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +4 -4
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/kustomize/extract.js +5 -4
- package/dist/modules/manager/kustomize/extract.js.map +1 -1
- package/dist/modules/manager/npm/extract/index.js +1 -1
- package/dist/modules/manager/npm/extract/index.js.map +1 -1
- package/dist/modules/manager/npm/npmrc.js +1 -1
- package/dist/modules/manager/npm/npmrc.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js +5 -4
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/process/lookup/digest.js +6 -0
- package/dist/workers/repository/process/lookup/digest.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/bun/extract.ts"],"sourcesContent":["import { isArray, isObject, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport {\n getParentDir,\n getSiblingFileName,\n readLocalFile,\n} from '../../../util/fs/index.ts';\n\nimport { extractPackageJson } from '../npm/extract/common/package-file.ts';\nimport type { NpmPackage } from '../npm/extract/types.ts';\nimport { resolveNpmrc } from '../npm/npmrc.ts';\nimport type { NpmManagerData } from '../npm/types.ts';\nimport type { ExtractConfig, NpmrcPackageFile } from '../types.ts';\nimport { filesMatchingWorkspaces } from './utils.ts';\n\nfunction matchesFileName(fileNameWithPath: string, fileName: string): boolean {\n return (\n fileNameWithPath === fileName || fileNameWithPath.endsWith(`/${fileName}`)\n );\n}\n\nexport async function processPackageFile(\n packageFile: string,\n config: ExtractConfig,\n): Promise<NpmrcPackageFile<NpmManagerData> | null> {\n const fileContent = await readLocalFile(packageFile, 'utf8');\n if (!fileContent) {\n logger.warn({ fileName: packageFile }, 'Could not read file content');\n return null;\n }\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(fileContent);\n } catch (err) {\n logger.debug({ err }, 'Error parsing package.json');\n return null;\n }\n const result = extractPackageJson(packageJson, packageFile);\n if (!result) {\n logger.debug({ packageFile }, 'No dependencies found');\n return null;\n }\n\n const { npmrc, npmrcFileName, repoNpmrc } = await resolveNpmrc(\n packageFile,\n config,\n );\n\n return {\n ...result,\n packageFile,\n npmrc,\n managerData: {\n ...result.managerData,\n // store npmrc file name so that a repository `.npmrc` which is not cached is read from disk again\n npmrcFileName,\n // stored instead of `npmrc` in the repository cache, from which `npmrc` is rebuilt\n ...(repoNpmrc && { repoNpmrc }),\n },\n };\n}\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n matchedFiles: string[],\n): Promise<NpmrcPackageFile<NpmManagerData>[]> {\n const packageFiles: NpmrcPackageFile<NpmManagerData>[] = [];\n const allLockFiles = matchedFiles.filter(\n (file) =>\n matchesFileName(file, 'bun.lock') || matchesFileName(file, 'bun.lockb'),\n );\n if (allLockFiles.length === 0) {\n logger.debug('No bun lockfiles found');\n return packageFiles;\n }\n const allPackageJson = matchedFiles.filter((file) =>\n matchesFileName(file, 'package.json'),\n );\n for (const lockFile of allLockFiles) {\n const packageFile = getSiblingFileName(lockFile, 'package.json');\n const res = await processPackageFile(packageFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n // Check if package.json contains workspaces\n let workspaces = res?.managerData?.workspaces;\n\n // Check for nested packages property https://bun.com/docs/pm/catalogs#1-define-catalogs-in-root-package-json\n if (isObject(workspaces) && 'packages' in workspaces) {\n workspaces = workspaces.packages;\n }\n\n if (!isArray(workspaces, isString)) {\n continue;\n }\n\n logger.debug(`Found bun workspaces in ${packageFile}`);\n const pwd = getParentDir(packageFile);\n const workspacePackageFiles = filesMatchingWorkspaces(\n pwd,\n allPackageJson,\n workspaces,\n );\n if (workspacePackageFiles.length) {\n logger.debug({ workspacePackageFiles }, 'Found bun workspace files');\n for (const workspaceFile of workspacePackageFiles) {\n const res = await processPackageFile(workspaceFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n }\n }\n }\n\n return packageFiles;\n}\n"],"mappings":";;;;;;;AAeA,SAAS,gBAAgB,kBAA0B,UAA2B;CAC5E,OACE,qBAAqB,YAAY,iBAAiB,SAAS,IAAI,UAAU;AAE7E;AAEA,eAAsB,mBACpB,aACA,QACkD;CAClD,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;CAC3D,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,EAAE,UAAU,YAAY,GAAG,6BAA6B;EACpE,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,WAAW;CACtC,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;EAClD,OAAO;CACT;CACA,MAAM,SAAS,mBAAmB,aAAa,WAAW;CAC1D,IAAI,CAAC,QAAQ;EACX,OAAO,MAAM,EAAE,YAAY,GAAG,uBAAuB;EACrD,OAAO;CACT;CAEA,MAAM,EAAE,OAAO,eAAe,cAAc,MAAM,aAChD,aACA,MACF;CAEA,OAAO;EACL,GAAG;EACH;EACA;
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/bun/extract.ts"],"sourcesContent":["import { isArray, isObject, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport {\n getParentDir,\n getSiblingFileName,\n readLocalFile,\n} from '../../../util/fs/index.ts';\n\nimport { extractPackageJson } from '../npm/extract/common/package-file.ts';\nimport type { NpmPackage } from '../npm/extract/types.ts';\nimport { resolveNpmrc } from '../npm/npmrc.ts';\nimport type { NpmManagerData } from '../npm/types.ts';\nimport type { ExtractConfig, NpmrcPackageFile } from '../types.ts';\nimport { filesMatchingWorkspaces } from './utils.ts';\n\nfunction matchesFileName(fileNameWithPath: string, fileName: string): boolean {\n return (\n fileNameWithPath === fileName || fileNameWithPath.endsWith(`/${fileName}`)\n );\n}\n\nexport async function processPackageFile(\n packageFile: string,\n config: ExtractConfig,\n): Promise<NpmrcPackageFile<NpmManagerData> | null> {\n const fileContent = await readLocalFile(packageFile, 'utf8');\n if (!fileContent) {\n logger.warn({ fileName: packageFile }, 'Could not read file content');\n return null;\n }\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(fileContent);\n } catch (err) {\n logger.debug({ err }, 'Error parsing package.json');\n return null;\n }\n const result = extractPackageJson(packageJson, packageFile);\n if (!result) {\n logger.debug({ packageFile }, 'No dependencies found');\n return null;\n }\n\n const { npmrc, npmrcFileName, repoNpmrc } = await resolveNpmrc(\n packageFile,\n config,\n );\n\n return {\n ...result,\n packageFile,\n ...(isString(npmrc) && { npmrc }),\n managerData: {\n ...result.managerData,\n // store npmrc file name so that a repository `.npmrc` which is not cached is read from disk again\n npmrcFileName,\n // stored instead of `npmrc` in the repository cache, from which `npmrc` is rebuilt\n ...(repoNpmrc && { repoNpmrc }),\n },\n };\n}\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n matchedFiles: string[],\n): Promise<NpmrcPackageFile<NpmManagerData>[]> {\n const packageFiles: NpmrcPackageFile<NpmManagerData>[] = [];\n const allLockFiles = matchedFiles.filter(\n (file) =>\n matchesFileName(file, 'bun.lock') || matchesFileName(file, 'bun.lockb'),\n );\n if (allLockFiles.length === 0) {\n logger.debug('No bun lockfiles found');\n return packageFiles;\n }\n const allPackageJson = matchedFiles.filter((file) =>\n matchesFileName(file, 'package.json'),\n );\n for (const lockFile of allLockFiles) {\n const packageFile = getSiblingFileName(lockFile, 'package.json');\n const res = await processPackageFile(packageFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n // Check if package.json contains workspaces\n let workspaces = res?.managerData?.workspaces;\n\n // Check for nested packages property https://bun.com/docs/pm/catalogs#1-define-catalogs-in-root-package-json\n if (isObject(workspaces) && 'packages' in workspaces) {\n workspaces = workspaces.packages;\n }\n\n if (!isArray(workspaces, isString)) {\n continue;\n }\n\n logger.debug(`Found bun workspaces in ${packageFile}`);\n const pwd = getParentDir(packageFile);\n const workspacePackageFiles = filesMatchingWorkspaces(\n pwd,\n allPackageJson,\n workspaces,\n );\n if (workspacePackageFiles.length) {\n logger.debug({ workspacePackageFiles }, 'Found bun workspace files');\n for (const workspaceFile of workspacePackageFiles) {\n const res = await processPackageFile(workspaceFile, config);\n if (res) {\n packageFiles.push({ ...res, lockFiles: [lockFile] });\n }\n }\n }\n }\n\n return packageFiles;\n}\n"],"mappings":";;;;;;;AAeA,SAAS,gBAAgB,kBAA0B,UAA2B;CAC5E,OACE,qBAAqB,YAAY,iBAAiB,SAAS,IAAI,UAAU;AAE7E;AAEA,eAAsB,mBACpB,aACA,QACkD;CAClD,MAAM,cAAc,MAAM,cAAc,aAAa,MAAM;CAC3D,IAAI,CAAC,aAAa;EAChB,OAAO,KAAK,EAAE,UAAU,YAAY,GAAG,6BAA6B;EACpE,OAAO;CACT;CACA,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,WAAW;CACtC,SAAS,KAAK;EACZ,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;EAClD,OAAO;CACT;CACA,MAAM,SAAS,mBAAmB,aAAa,WAAW;CAC1D,IAAI,CAAC,QAAQ;EACX,OAAO,MAAM,EAAE,YAAY,GAAG,uBAAuB;EACrD,OAAO;CACT;CAEA,MAAM,EAAE,OAAO,eAAe,cAAc,MAAM,aAChD,aACA,MACF;CAEA,OAAO;EACL,GAAG;EACH;EACA,GAAI,SAAS,KAAK,KAAK,EAAE,MAAM;EAC/B,aAAa;GACX,GAAG,OAAO;GAEV;GAEA,GAAI,aAAa,EAAE,UAAU;EAC/B;CACF;AACF;AACA,eAAsB,uBACpB,QACA,cAC6C;CAC7C,MAAM,eAAmD,CAAC;CAC1D,MAAM,eAAe,aAAa,QAC/B,SACC,gBAAgB,MAAM,UAAU,KAAK,gBAAgB,MAAM,WAAW,CAC1E;CACA,IAAI,aAAa,WAAW,GAAG;EAC7B,OAAO,MAAM,wBAAwB;EACrC,OAAO;CACT;CACA,MAAM,iBAAiB,aAAa,QAAQ,SAC1C,gBAAgB,MAAM,cAAc,CACtC;CACA,KAAK,MAAM,YAAY,cAAc;EACnC,MAAM,cAAc,mBAAmB,UAAU,cAAc;EAC/D,MAAM,MAAM,MAAM,mBAAmB,aAAa,MAAM;EACxD,IAAI,KACF,aAAa,KAAK;GAAE,GAAG;GAAK,WAAW,CAAC,QAAQ;EAAE,CAAC;EAGrD,IAAI,aAAa,KAAK,aAAa;EAGnC,IAAI,SAAS,UAAU,KAAK,cAAc,YACxC,aAAa,WAAW;EAG1B,IAAI,CAAC,QAAQ,YAAY,QAAQ,GAC/B;EAGF,OAAO,MAAM,2BAA2B,aAAa;EACrD,MAAM,MAAM,aAAa,WAAW;EACpC,MAAM,wBAAwB,wBAC5B,KACA,gBACA,UACF;EACA,IAAI,sBAAsB,QAAQ;GAChC,OAAO,MAAM,EAAE,sBAAsB,GAAG,2BAA2B;GACnE,KAAK,MAAM,iBAAiB,uBAAuB;IACjD,MAAM,MAAM,MAAM,mBAAmB,eAAe,MAAM;IAC1D,IAAI,KACF,aAAa,KAAK;KAAE,GAAG;KAAK,WAAW,CAAC,QAAQ;IAAE,CAAC;GAEvD;EACF;CACF;CAEA,OAAO;AACT"}
|
|
@@ -17,7 +17,7 @@ hashMap.set("bitbucket-pipelines", "59c0503494ab1442b127914503c01b97ac17b6742b19
|
|
|
17
17
|
hashMap.set("bitrise", "478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42");
|
|
18
18
|
hashMap.set("buildkite", "b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c");
|
|
19
19
|
hashMap.set("buildpacks", "6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f");
|
|
20
|
-
hashMap.set("bun", "
|
|
20
|
+
hashMap.set("bun", "77a06471b8aec434457bcbde14a7473bc1c20a5fbe203ecc188bcc7a4fec1718");
|
|
21
21
|
hashMap.set("bun-version", "df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4");
|
|
22
22
|
hashMap.set("bundler", "6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5");
|
|
23
23
|
hashMap.set("cake", "9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad");
|
|
@@ -43,7 +43,7 @@ hashMap.set("fleet", "ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6
|
|
|
43
43
|
hashMap.set("flux", "0e9d00a108f6e828ad207ee0213d56ecd64475df9bd87c23b0c2b2f80e00a392");
|
|
44
44
|
hashMap.set("fvm", "9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90");
|
|
45
45
|
hashMap.set("git-submodules", "f4e2c6ddf2fa93241665c5176faafb358eecfcb701e7478790c4d58853ed827a");
|
|
46
|
-
hashMap.set("github-actions", "
|
|
46
|
+
hashMap.set("github-actions", "2ef680275a8370f5c3761513e50c135718234459a657c94bc3d5369aef9daada");
|
|
47
47
|
hashMap.set("gitlabci", "a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672");
|
|
48
48
|
hashMap.set("gitlabci-include", "8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351");
|
|
49
49
|
hashMap.set("glasskube", "93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30");
|
|
@@ -65,7 +65,7 @@ hashMap.set("jenkins", "7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075
|
|
|
65
65
|
hashMap.set("jsonnet-bundler", "4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d");
|
|
66
66
|
hashMap.set("kotlin-script", "95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564");
|
|
67
67
|
hashMap.set("kubernetes", "321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de");
|
|
68
|
-
hashMap.set("kustomize", "
|
|
68
|
+
hashMap.set("kustomize", "d3f24fa8a647979d7e4ce5ba963e4c53a36a5992a2d4e3b331a9a512f213e181");
|
|
69
69
|
hashMap.set("leiningen", "c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2");
|
|
70
70
|
hashMap.set("maven", "c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d");
|
|
71
71
|
hashMap.set("maven-wrapper", "6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0");
|
|
@@ -75,7 +75,7 @@ hashMap.set("mise", "59c691024c34cb4be4d9b4f811019ae9b22410df0da54977cdcecea261f
|
|
|
75
75
|
hashMap.set("mix", "0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872");
|
|
76
76
|
hashMap.set("nix", "9cbd96a29fe96e3df7418e422256380202f07970cf7f00b08388c181224a2b85");
|
|
77
77
|
hashMap.set("nodenv", "ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8");
|
|
78
|
-
hashMap.set("npm", "
|
|
78
|
+
hashMap.set("npm", "4b606e97e80101b866e2f9fe05546b09faafa8e7793549b35a438d76649aefbb");
|
|
79
79
|
hashMap.set("nuget", "fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f");
|
|
80
80
|
hashMap.set("nvm", "3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322");
|
|
81
81
|
hashMap.set("ocb", "032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','66c207983960b1a1f49b972f77efe3bfd3097e19b0ee4034ccf9ac6c0d13e05b');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4d4f1d9a6519ba552b316b396db13ff0654a2663d8ed976188899a2d57d306a2');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','320097d7b876bebd71a3a1df5d31572bc72c1d53f3a687cbe3bcfab866373c1d');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','d354b54fee207cabab9fcff67fea1ca3292c7f37a4ef9537c7bb4cab41a35610');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','3976117beb9adeade088187965929d42f21f5da12c4614fd22aa92cad1083b19');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','a0678cc1eec36301328780966eec215c6e18748ea80c98873c8e13291a684cfa');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','41e6a8b7b8bae08f07b3e4b69c8c095db5da984bb23c004cd1ebf755a6317794');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','b5faeb8f31d238e0d05a4aeebf9a837273687908ab8078b34e738bb0e369c80c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6427c97');\nhashMap.set('flux','0e9d00a108f6e828ad207ee0213d56ecd64475df9bd87c23b0c2b2f80e00a392');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','f4e2c6ddf2fa93241665c5176faafb358eecfcb701e7478790c4d58853ed827a');\nhashMap.set('github-actions','763dc8e3db3a25641cbcff127df79f79face1a6ead05758b1bbb0ebbdb0eec97');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','b70bcb736679e5660cf4d075a663629d0ddab4e854ce78d6336844138f2cbc82');\nhashMap.set('gradle','14ffeecba62452d47d3796e68753da745de2614b6e5ecc346da4f0067ed4bc6e');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','22f61344565f87ca3512c0ba8fac32627fde8ee919b7badae07b2116e285f049');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','ab63e5bc2bb381939a6b75911947e3fc79d31827423ded07f61ea1c98d95a542');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','927798e082caf46a0da703389ba07e9e61fa73ef571ab551301b8fc6b06957d1');\nhashMap.set('hermit','abf066a64be5e5112e4da68896cf14583691e817d8bf2fc5ec65aebcc0fde53b');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','4a4321595a55de36669f3bcc6fb54236ad81c8f80ec9cbd3888f49a45fbe70e7');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','59c691024c34cb4be4d9b4f811019ae9b22410df0da54977cdcecea261fbbbf5');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','9cbd96a29fe96e3df7418e422256380202f07970cf7f00b08388c181224a2b85');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','c2049f645aaa42a227d84ccd81f7156cc05ab41cc645f6e6a492df7e64e5ec87');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','02ba97d9d2bbd696417ea0ea26c0ed27f4e8cf296f1afdbb27ec07bcc3bd987c');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','9b8ac4f9432f2789f60847c80582966d5ed4f735d2f678c82416d0eb9548b4fa');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','2c74e8e94c484c8bfc93ba1272078d531a52e4faaa978fc90ddb654064bb85bc');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','40927b98dd2bac45dba60e66b5fd0e6b84b61d02db8be536fda7b14546a4feb7');\nhashMap.set('renovate-config','dfaf3f03ddaf70c332f7916106648f36dbfa6a36dd76d15dd27fa116ab3c174c');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','cdf063debdbf36888523ff8cec6d2d1b0ec6f49b37b2fbcd80b0d4f6a31114e1');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','6788a8569ba9c50c763ffa2bed952a4314ae8e696c29f93d3eb7c4a12d99ce20');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','30774cd456c443be2cd236fd5b8cd1cb821f1437c6309842e34960832df3557f');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','8e11293c8f61b4cbae77a3b1634a47213031c59df2c9833d89db65bf4e6edc64');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','66c207983960b1a1f49b972f77efe3bfd3097e19b0ee4034ccf9ac6c0d13e05b');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','04a13dec4e08ba21004961c718072fde976226d65809fa3c838bf66ba93e5d5a');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','4d4f1d9a6519ba552b316b396db13ff0654a2663d8ed976188899a2d57d306a2');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','77a06471b8aec434457bcbde14a7473bc1c20a5fbe203ecc188bcc7a4fec1718');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','d354b54fee207cabab9fcff67fea1ca3292c7f37a4ef9537c7bb4cab41a35610');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','3976117beb9adeade088187965929d42f21f5da12c4614fd22aa92cad1083b19');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','a0678cc1eec36301328780966eec215c6e18748ea80c98873c8e13291a684cfa');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','41e6a8b7b8bae08f07b3e4b69c8c095db5da984bb23c004cd1ebf755a6317794');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','b5faeb8f31d238e0d05a4aeebf9a837273687908ab8078b34e738bb0e369c80c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','ffa222820f72c4eb4cdc4c229ae8c50433bee96f3b974f0633d5a7d1f6427c97');\nhashMap.set('flux','0e9d00a108f6e828ad207ee0213d56ecd64475df9bd87c23b0c2b2f80e00a392');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','f4e2c6ddf2fa93241665c5176faafb358eecfcb701e7478790c4d58853ed827a');\nhashMap.set('github-actions','2ef680275a8370f5c3761513e50c135718234459a657c94bc3d5369aef9daada');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','b70bcb736679e5660cf4d075a663629d0ddab4e854ce78d6336844138f2cbc82');\nhashMap.set('gradle','14ffeecba62452d47d3796e68753da745de2614b6e5ecc346da4f0067ed4bc6e');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','22f61344565f87ca3512c0ba8fac32627fde8ee919b7badae07b2116e285f049');\nhashMap.set('helm-values','0aa79bb0257d0d72e54dfd2653e59bfef63b97e46c035b7443593bdf6e6382aa');\nhashMap.set('helmfile','ab63e5bc2bb381939a6b75911947e3fc79d31827423ded07f61ea1c98d95a542');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','927798e082caf46a0da703389ba07e9e61fa73ef571ab551301b8fc6b06957d1');\nhashMap.set('hermit','abf066a64be5e5112e4da68896cf14583691e817d8bf2fc5ec65aebcc0fde53b');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','d3f24fa8a647979d7e4ce5ba963e4c53a36a5992a2d4e3b331a9a512f213e181');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','59c691024c34cb4be4d9b4f811019ae9b22410df0da54977cdcecea261fbbbf5');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','9cbd96a29fe96e3df7418e422256380202f07970cf7f00b08388c181224a2b85');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','4b606e97e80101b866e2f9fe05546b09faafa8e7793549b35a438d76649aefbb');\nhashMap.set('nuget','fb02247c67a198ffe414a44d23c7894bd114dcc53803334f82e39479e7b27f6f');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','02ba97d9d2bbd696417ea0ea26c0ed27f4e8cf296f1afdbb27ec07bcc3bd987c');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','a98dc76a002e1dc21662237f009ff8fea36236bb4e24cb82ee30c6a78f57271f');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','9b8ac4f9432f2789f60847c80582966d5ed4f735d2f678c82416d0eb9548b4fa');\nhashMap.set('pixi','e31c397982ffa34222b061f23f3b3683f42523dd5dca45ecce2448b0ebc55ea2');\nhashMap.set('poetry','2c74e8e94c484c8bfc93ba1272078d531a52e4faaa978fc90ddb654064bb85bc');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','40927b98dd2bac45dba60e66b5fd0e6b84b61d02db8be536fda7b14546a4feb7');\nhashMap.set('renovate-config','dfaf3f03ddaf70c332f7916106648f36dbfa6a36dd76d15dd27fa116ab3c174c');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','cdf063debdbf36888523ff8cec6d2d1b0ec6f49b37b2fbcd80b0d4f6a31114e1');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','6788a8569ba9c50c763ffa2bed952a4314ae8e696c29f93d3eb7c4a12d99ce20');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','300f8fb3c09667654412d2f5dd8ab4882e0f5d1d7a8bc39794993d2e7e58d1b7');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','30774cd456c443be2cd236fd5b8cd1cb821f1437c6309842e34960832df3557f');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { GithubTagsDatasource } from "../../datasource/github-tags/index.js";
|
|
|
7
7
|
import { HelmDatasource } from "../../datasource/helm/index.js";
|
|
8
8
|
import { getDep } from "../dockerfile/extract.js";
|
|
9
9
|
import { getOciChartDep, isOCIRegistry } from "../helmv3/oci.js";
|
|
10
|
-
import { isString } from "@sindresorhus/is";
|
|
10
|
+
import { isNonEmptyString, isString } from "@sindresorhus/is";
|
|
11
11
|
import querystring from "node:querystring";
|
|
12
12
|
//#region lib/modules/manager/kustomize/extract.ts
|
|
13
13
|
const gitUrl = regEx(/^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\/\/)?(?:.*@)?)?(?<path>(?:[^:/\s]+(?::[0-9]+)?[:/])?(?<project>[^/\s]+\/[^/\s]+)))(?<subdir>[^?\s]*)\?(?<queryString>.+)$/);
|
|
@@ -99,15 +99,16 @@ function extractImage(image, aliases) {
|
|
|
99
99
|
}
|
|
100
100
|
function extractHelmChart(helmChart, aliases) {
|
|
101
101
|
if (!helmChart.name) return null;
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
const { repo } = helmChart;
|
|
103
|
+
if (isNonEmptyString(repo) && isOCIRegistry(repo)) return {
|
|
104
|
+
...getOciChartDep(repo, helmChart.name, aliases),
|
|
104
105
|
depName: helmChart.name,
|
|
105
106
|
currentValue: helmChart.version
|
|
106
107
|
};
|
|
107
108
|
return {
|
|
108
109
|
depName: helmChart.name,
|
|
109
110
|
currentValue: helmChart.version,
|
|
110
|
-
registryUrls: [
|
|
111
|
+
...isNonEmptyString(repo) && { registryUrls: [repo] },
|
|
111
112
|
datasource: HelmDatasource.id
|
|
112
113
|
};
|
|
113
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/kustomize/extract.ts"],"sourcesContent":["import querystring from 'node:querystring';\nimport { isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { getOciChartDep, isOCIRegistry } from '../helmv3/oci.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport type { HelmChart, Image, Kustomize } from './types.ts';\n\n// URL specifications should follow the hashicorp URL format\n// https://github.com/hashicorp/go-getter#url-format\nconst gitUrl = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])?(?<project>[^/\\s]+\\/[^/\\s]+)))(?<subdir>[^?\\s]*)\\?(?<queryString>.+)$/,\n);\n// regex to match URLs with \".git\" delimiter\nconst dotGitRegex = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])?(?<project>[^?\\s]*(?:\\.git))))(?<subdir>[^?\\s]*)\\?(?<queryString>.+)$/,\n);\n// regex to match URLs with \"_git\" delimiter\nconst underscoreGitRegex = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])?(?<project>[^?\\s]*)(?:_git\\/[^/\\s]+)))(?<subdir>[^?\\s]*)\\?(?<queryString>.+)$/,\n);\n// regex to match URLs having an extra \"//\"\nconst gitUrlWithPath = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])(?<project>[^?\\s]+)))(?:\\/\\/)(?<subdir>[^?\\s]+)\\?(?<queryString>.+)$/,\n);\n\nexport function extractResource(base: string): PackageDependency | null {\n let match: RegExpExecArray | null;\n\n if (base.includes('_git')) {\n match = underscoreGitRegex.exec(base);\n } else if (base.includes('.git')) {\n match = dotGitRegex.exec(base);\n } else if (gitUrlWithPath.test(base)) {\n match = gitUrlWithPath.exec(base);\n } else {\n match = gitUrl.exec(base);\n }\n\n if (!match?.groups) {\n return null;\n }\n\n const { path, queryString } = match.groups;\n const params = querystring.parse(queryString);\n const refParam = Array.isArray(params.ref) ? params.ref[0] : params.ref;\n const versionParam = Array.isArray(params.version)\n ? params.version[0]\n : params.version;\n const currentValue = refParam ?? versionParam;\n if (!currentValue) {\n return null;\n }\n\n if (regEx(/(?:github\\.com)(?::|\\/)/).test(path)) {\n return {\n currentValue,\n datasource: GithubTagsDatasource.id,\n depName: match.groups.project.replace('.git', ''),\n };\n }\n\n return {\n datasource: GitTagsDatasource.id,\n depName: path.replace('.git', ''),\n packageName: match.groups.url,\n currentValue,\n };\n}\n\nexport function extractImage<T = never>(\n image: Image,\n aliases?: Record<string, string>,\n): PackageDependency<T> | null {\n if (!image.name) {\n return null;\n }\n const nameToSplit = image.newName ?? image.name;\n if (!isString(nameToSplit)) {\n logger.debug({ image }, 'Invalid image name');\n return null;\n }\n const nameDep = getDep(nameToSplit, {\n specifyReplaceString: false,\n registryAliases: aliases,\n });\n const { depName } = nameDep;\n const { digest, newTag } = image;\n if (digest && newTag) {\n logger.debug(\n { newTag, digest },\n 'Kustomize ignores newTag when digest is provided. Pick one, or use `newTag: tag@digest`',\n );\n return {\n depName,\n currentValue: newTag,\n currentDigest: digest,\n skipReason: 'invalid-dependency-specification',\n };\n }\n\n if (digest) {\n if (!isString(digest) || !digest.startsWith('sha256:')) {\n return {\n depName,\n currentValue: digest,\n skipReason: 'invalid-value',\n };\n }\n\n return {\n ...nameDep,\n currentDigest: digest,\n replaceString: digest,\n };\n }\n\n if (newTag) {\n if (!isString(newTag) || newTag.startsWith('sha256:')) {\n return {\n depName,\n currentValue: newTag,\n skipReason: 'invalid-value',\n };\n }\n\n const dep = getDep(`${depName}:${newTag}`, {\n specifyReplaceString: false,\n registryAliases: aliases,\n });\n return {\n ...dep,\n replaceString: newTag,\n autoReplaceStringTemplate:\n '{{newValue}}{{#if newDigest}}@{{newDigest}}{{/if}}',\n };\n }\n\n if (image.newName) {\n return {\n ...nameDep,\n replaceString: image.newName,\n };\n }\n\n return null;\n}\n\nexport function extractHelmChart(\n helmChart: HelmChart,\n aliases?: Record<string, string>,\n): PackageDependency | null {\n if (!helmChart.name) {\n return null;\n }\n\n if (isOCIRegistry(helmChart.repo)) {\n return {\n ...getOciChartDep(helmChart.repo, helmChart.name, aliases),\n depName: helmChart.name,\n currentValue: helmChart.version,\n };\n }\n\n return {\n depName: helmChart.name,\n currentValue: helmChart.version,\n registryUrls: [helmChart.repo],\n datasource: HelmDatasource.id,\n };\n}\n\nexport function parseKustomize(\n content: string,\n packageFile?: string,\n): Kustomize | null {\n let pkg: Kustomize | null = null;\n try {\n // TODO: use schema (#9610)\n pkg = parseSingleYaml(content);\n } catch /* istanbul ignore next */ {\n logger.debug({ packageFile }, 'Error parsing kustomize file');\n return null;\n }\n\n if (!pkg || isString(pkg)) {\n return null;\n }\n\n pkg.kind ??= 'Kustomization';\n\n if (!['Kustomization', 'Component'].includes(pkg.kind)) {\n return null;\n }\n\n return pkg;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`kustomize.extractPackageFile(${packageFile})`);\n const deps: PackageDependency[] = [];\n\n const pkg = parseKustomize(content, packageFile);\n if (!pkg) {\n return null;\n }\n\n // grab the remote bases\n for (const base of coerceArray(pkg.bases).filter(isString)) {\n const dep = extractResource(base);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the remote resources\n for (const resource of coerceArray(pkg.resources).filter(isString)) {\n const dep = extractResource(resource);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the remote components\n for (const component of coerceArray(pkg.components).filter(isString)) {\n const dep = extractResource(component);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the image tags\n for (const image of coerceArray(pkg.images)) {\n const dep = extractImage(image, config.registryAliases);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the helm charts\n for (const helmChart of coerceArray(pkg.helmCharts)) {\n const dep = extractHelmChart(helmChart, config.registryAliases);\n if (dep) {\n deps.push({\n ...dep,\n depType: 'HelmChart',\n });\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":";;;;;;;;;;;;AAoBA,MAAM,SAAS,MACb,uKACF;AAEA,MAAM,cAAc,MAClB,uKACF;AAEA,MAAM,qBAAqB,MACzB,+KACF;AAEA,MAAM,iBAAiB,MACrB,qKACF;AAEA,SAAgB,gBAAgB,MAAwC;CACtE,IAAI;CAEJ,IAAI,KAAK,SAAS,MAAM,GACtB,QAAQ,mBAAmB,KAAK,IAAI;MAC/B,IAAI,KAAK,SAAS,MAAM,GAC7B,QAAQ,YAAY,KAAK,IAAI;MACxB,IAAI,eAAe,KAAK,IAAI,GACjC,QAAQ,eAAe,KAAK,IAAI;MAEhC,QAAQ,OAAO,KAAK,IAAI;CAG1B,IAAI,CAAC,OAAO,QACV,OAAO;CAGT,MAAM,EAAE,MAAM,gBAAgB,MAAM;CACpC,MAAM,SAAS,YAAY,MAAM,WAAW;CAC5C,MAAM,WAAW,MAAM,QAAQ,OAAO,GAAG,IAAI,OAAO,IAAI,KAAK,OAAO;CACpE,MAAM,eAAe,MAAM,QAAQ,OAAO,OAAO,IAC7C,OAAO,QAAQ,KACf,OAAO;CACX,MAAM,eAAe,YAAY;CACjC,IAAI,CAAC,cACH,OAAO;CAGT,IAAI,MAAM,yBAAyB,CAAC,CAAC,KAAK,IAAI,GAC5C,OAAO;EACL;EACA,YAAY,qBAAqB;EACjC,SAAS,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE;CAClD;CAGF,OAAO;EACL,YAAY,kBAAkB;EAC9B,SAAS,KAAK,QAAQ,QAAQ,EAAE;EAChC,aAAa,MAAM,OAAO;EAC1B;CACF;AACF;AAEA,SAAgB,aACd,OACA,SAC6B;CAC7B,IAAI,CAAC,MAAM,MACT,OAAO;CAET,MAAM,cAAc,MAAM,WAAW,MAAM;CAC3C,IAAI,CAAC,SAAS,WAAW,GAAG;EAC1B,OAAO,MAAM,EAAE,MAAM,GAAG,oBAAoB;EAC5C,OAAO;CACT;CACA,MAAM,UAAU,OAAO,aAAa;EAClC,sBAAsB;EACtB,iBAAiB;CACnB,CAAC;CACD,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,QAAQ,WAAW;CAC3B,IAAI,UAAU,QAAQ;EACpB,OAAO,MACL;GAAE;GAAQ;EAAO,GACjB,yFACF;EACA,OAAO;GACL;GACA,cAAc;GACd,eAAe;GACf,YAAY;EACd;CACF;CAEA,IAAI,QAAQ;EACV,IAAI,CAAC,SAAS,MAAM,KAAK,CAAC,OAAO,WAAW,SAAS,GACnD,OAAO;GACL;GACA,cAAc;GACd,YAAY;EACd;EAGF,OAAO;GACL,GAAG;GACH,eAAe;GACf,eAAe;EACjB;CACF;CAEA,IAAI,QAAQ;EACV,IAAI,CAAC,SAAS,MAAM,KAAK,OAAO,WAAW,SAAS,GAClD,OAAO;GACL;GACA,cAAc;GACd,YAAY;EACd;EAOF,OAAO;GACL,GALU,OAAO,GAAG,QAAQ,GAAG,UAAU;IACzC,sBAAsB;IACtB,iBAAiB;GACnB,CAEO;GACL,eAAe;GACf,2BACE;EACJ;CACF;CAEA,IAAI,MAAM,SACR,OAAO;EACL,GAAG;EACH,eAAe,MAAM;CACvB;CAGF,OAAO;AACT;AAEA,SAAgB,iBACd,WACA,SAC0B;CAC1B,IAAI,CAAC,UAAU,MACb,OAAO;CAGT,IAAI,cAAc,UAAU,IAAI,GAC9B,OAAO;EACL,GAAG,eAAe,UAAU,MAAM,UAAU,MAAM,OAAO;EACzD,SAAS,UAAU;EACnB,cAAc,UAAU;CAC1B;CAGF,OAAO;EACL,SAAS,UAAU;EACnB,cAAc,UAAU;EACxB,cAAc,CAAC,UAAU,IAAI;EAC7B,YAAY,eAAe;CAC7B;AACF;AAEA,SAAgB,eACd,SACA,aACkB;CAClB,IAAI,MAAwB;CAC5B,IAAI;EAEF,MAAM,gBAAgB,OAAO;CAC/B,mCAAmC;EACjC,OAAO,MAAM,EAAE,YAAY,GAAG,8BAA8B;EAC5D,OAAO;CACT;CAEA,IAAI,CAAC,OAAO,SAAS,GAAG,GACtB,OAAO;CAGT,IAAI,SAAS;CAEb,IAAI,CAAC,CAAC,iBAAiB,WAAW,CAAC,CAAC,SAAS,IAAI,IAAI,GACnD,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,aACA,QAC2B;CAC3B,OAAO,MAAM,gCAAgC,YAAY,EAAE;CAC3D,MAAM,OAA4B,CAAC;CAEnC,MAAM,MAAM,eAAe,SAAS,WAAW;CAC/C,IAAI,CAAC,KACH,OAAO;CAIT,KAAK,MAAM,QAAQ,YAAY,IAAI,KAAK,CAAC,CAAC,OAAO,QAAQ,GAAG;EAC1D,MAAM,MAAM,gBAAgB,IAAI;EAChC,IAAI,KACF,KAAK,KAAK;GACR,GAAG;GACH,SAAS,IAAI;EACf,CAAC;CAEL;CAGA,KAAK,MAAM,YAAY,YAAY,IAAI,SAAS,CAAC,CAAC,OAAO,QAAQ,GAAG;EAClE,MAAM,MAAM,gBAAgB,QAAQ;EACpC,IAAI,KACF,KAAK,KAAK;GACR,GAAG;GACH,SAAS,IAAI;EACf,CAAC;CAEL;CAGA,KAAK,MAAM,aAAa,YAAY,IAAI,UAAU,CAAC,CAAC,OAAO,QAAQ,GAAG;EACpE,MAAM,MAAM,gBAAgB,SAAS;EACrC,IAAI,KACF,KAAK,KAAK;GACR,GAAG;GACH,SAAS,IAAI;EACf,CAAC;CAEL;CAGA,KAAK,MAAM,SAAS,YAAY,IAAI,MAAM,GAAG;EAC3C,MAAM,MAAM,aAAa,OAAO,OAAO,eAAe;EACtD,IAAI,KACF,KAAK,KAAK;GACR,GAAG;GACH,SAAS,IAAI;EACf,CAAC;CAEL;CAGA,KAAK,MAAM,aAAa,YAAY,IAAI,UAAU,GAAG;EACnD,MAAM,MAAM,iBAAiB,WAAW,OAAO,eAAe;EAC9D,IAAI,KACF,KAAK,KAAK;GACR,GAAG;GACH,SAAS;EACX,CAAC;CAEL;CAEA,IAAI,CAAC,KAAK,QACR,OAAO;CAET,OAAO,EAAE,KAAK;AAChB"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/kustomize/extract.ts"],"sourcesContent":["import querystring from 'node:querystring';\nimport { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseSingleYaml } from '../../../util/yaml.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { getOciChartDep, isOCIRegistry } from '../helmv3/oci.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport type { HelmChart, Image, Kustomize } from './types.ts';\n\n// URL specifications should follow the hashicorp URL format\n// https://github.com/hashicorp/go-getter#url-format\nconst gitUrl = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])?(?<project>[^/\\s]+\\/[^/\\s]+)))(?<subdir>[^?\\s]*)\\?(?<queryString>.+)$/,\n);\n// regex to match URLs with \".git\" delimiter\nconst dotGitRegex = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])?(?<project>[^?\\s]*(?:\\.git))))(?<subdir>[^?\\s]*)\\?(?<queryString>.+)$/,\n);\n// regex to match URLs with \"_git\" delimiter\nconst underscoreGitRegex = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])?(?<project>[^?\\s]*)(?:_git\\/[^/\\s]+)))(?<subdir>[^?\\s]*)\\?(?<queryString>.+)$/,\n);\n// regex to match URLs having an extra \"//\"\nconst gitUrlWithPath = regEx(\n /^(?:git::)?(?<url>(?:(?:(?:http|https|ssh):\\/\\/)?(?:.*@)?)?(?<path>(?:[^:/\\s]+(?::[0-9]+)?[:/])(?<project>[^?\\s]+)))(?:\\/\\/)(?<subdir>[^?\\s]+)\\?(?<queryString>.+)$/,\n);\n\nexport function extractResource(base: string): PackageDependency | null {\n let match: RegExpExecArray | null;\n\n if (base.includes('_git')) {\n match = underscoreGitRegex.exec(base);\n } else if (base.includes('.git')) {\n match = dotGitRegex.exec(base);\n } else if (gitUrlWithPath.test(base)) {\n match = gitUrlWithPath.exec(base);\n } else {\n match = gitUrl.exec(base);\n }\n\n if (!match?.groups) {\n return null;\n }\n\n const { path, queryString } = match.groups;\n const params = querystring.parse(queryString);\n const refParam = Array.isArray(params.ref) ? params.ref[0] : params.ref;\n const versionParam = Array.isArray(params.version)\n ? params.version[0]\n : params.version;\n const currentValue = refParam ?? versionParam;\n if (!currentValue) {\n return null;\n }\n\n if (regEx(/(?:github\\.com)(?::|\\/)/).test(path)) {\n return {\n currentValue,\n datasource: GithubTagsDatasource.id,\n depName: match.groups.project.replace('.git', ''),\n };\n }\n\n return {\n datasource: GitTagsDatasource.id,\n depName: path.replace('.git', ''),\n packageName: match.groups.url,\n currentValue,\n };\n}\n\nexport function extractImage<T = never>(\n image: Image,\n aliases?: Record<string, string>,\n): PackageDependency<T> | null {\n if (!image.name) {\n return null;\n }\n const nameToSplit = image.newName ?? image.name;\n if (!isString(nameToSplit)) {\n logger.debug({ image }, 'Invalid image name');\n return null;\n }\n const nameDep = getDep(nameToSplit, {\n specifyReplaceString: false,\n registryAliases: aliases,\n });\n const { depName } = nameDep;\n const { digest, newTag } = image;\n if (digest && newTag) {\n logger.debug(\n { newTag, digest },\n 'Kustomize ignores newTag when digest is provided. Pick one, or use `newTag: tag@digest`',\n );\n return {\n depName,\n currentValue: newTag,\n currentDigest: digest,\n skipReason: 'invalid-dependency-specification',\n };\n }\n\n if (digest) {\n if (!isString(digest) || !digest.startsWith('sha256:')) {\n return {\n depName,\n currentValue: digest,\n skipReason: 'invalid-value',\n };\n }\n\n return {\n ...nameDep,\n currentDigest: digest,\n replaceString: digest,\n };\n }\n\n if (newTag) {\n if (!isString(newTag) || newTag.startsWith('sha256:')) {\n return {\n depName,\n currentValue: newTag,\n skipReason: 'invalid-value',\n };\n }\n\n const dep = getDep(`${depName}:${newTag}`, {\n specifyReplaceString: false,\n registryAliases: aliases,\n });\n return {\n ...dep,\n replaceString: newTag,\n autoReplaceStringTemplate:\n '{{newValue}}{{#if newDigest}}@{{newDigest}}{{/if}}',\n };\n }\n\n if (image.newName) {\n return {\n ...nameDep,\n replaceString: image.newName,\n };\n }\n\n return null;\n}\n\nexport function extractHelmChart(\n helmChart: HelmChart,\n aliases?: Record<string, string>,\n): PackageDependency | null {\n if (!helmChart.name) {\n return null;\n }\n\n const { repo } = helmChart;\n if (isNonEmptyString(repo) && isOCIRegistry(repo)) {\n return {\n ...getOciChartDep(repo, helmChart.name, aliases),\n depName: helmChart.name,\n currentValue: helmChart.version,\n };\n }\n\n return {\n depName: helmChart.name,\n currentValue: helmChart.version,\n ...(isNonEmptyString(repo) && { registryUrls: [repo] }),\n datasource: HelmDatasource.id,\n };\n}\n\nexport function parseKustomize(\n content: string,\n packageFile?: string,\n): Kustomize | null {\n let pkg: Kustomize | null = null;\n try {\n // TODO: use schema (#9610)\n pkg = parseSingleYaml(content);\n } catch /* istanbul ignore next */ {\n logger.debug({ packageFile }, 'Error parsing kustomize file');\n return null;\n }\n\n if (!pkg || isString(pkg)) {\n return null;\n }\n\n pkg.kind ??= 'Kustomization';\n\n if (!['Kustomization', 'Component'].includes(pkg.kind)) {\n return null;\n }\n\n return pkg;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n logger.trace(`kustomize.extractPackageFile(${packageFile})`);\n const deps: PackageDependency[] = [];\n\n const pkg = parseKustomize(content, packageFile);\n if (!pkg) {\n return null;\n }\n\n // grab the remote bases\n for (const base of coerceArray(pkg.bases).filter(isString)) {\n const dep = extractResource(base);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the remote resources\n for (const resource of coerceArray(pkg.resources).filter(isString)) {\n const dep = extractResource(resource);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the remote components\n for (const component of coerceArray(pkg.components).filter(isString)) {\n const dep = extractResource(component);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the image tags\n for (const image of coerceArray(pkg.images)) {\n const dep = extractImage(image, config.registryAliases);\n if (dep) {\n deps.push({\n ...dep,\n depType: pkg.kind,\n });\n }\n }\n\n // grab the helm charts\n for (const helmChart of coerceArray(pkg.helmCharts)) {\n const dep = extractHelmChart(helmChart, config.registryAliases);\n if (dep) {\n deps.push({\n ...dep,\n depType: 'HelmChart',\n });\n }\n }\n\n if (!deps.length) {\n return null;\n }\n return { deps };\n}\n"],"mappings":"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"}
|
|
@@ -94,7 +94,7 @@ async function extractPackageFile(content, packageFile, config) {
|
|
|
94
94
|
applyPnpmWorkspaceRegistries(res.deps, pnpmWorkspaceRegistries, pnpmWorkspaceRegistry);
|
|
95
95
|
return {
|
|
96
96
|
...res,
|
|
97
|
-
npmrc,
|
|
97
|
+
...isString(npmrc) && { npmrc },
|
|
98
98
|
managerData: {
|
|
99
99
|
...res.managerData,
|
|
100
100
|
...lockFiles,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/index.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\n\nimport type {\n ExtractConfig,\n NpmrcPackageFile,\n NpmrcPackageFileContent,\n} from '../../types.ts';\nimport { resolveNpmrc } from '../npmrc.ts';\nimport { PnpmWorkspaceFile, type YarnConfig } from '../schema.ts';\nimport type { NpmLockFiles, NpmManagerData } from '../types.ts';\nimport { getExtractedConstraints } from './common/dependency.ts';\nimport {\n extractPackageJson,\n hasDevEnginesPackageManager,\n hasPackageManager,\n} from './common/package-file.ts';\nimport {\n applyPnpmWorkspaceRegistries,\n extractPnpmWorkspaceFile,\n} from './pnpm.ts';\nimport { postExtract } from './post/index.ts';\nimport type { NpmPackage } from './types.ts';\nimport { extractYarnCatalogs, isZeroInstall } from './yarn.ts';\nimport {\n loadConfigFromLegacyYarnrc,\n loadConfigFromYarnrcYml,\n resolveRegistryUrl,\n} from './yarnrc.ts';\n\nfunction hasMultipleLockFiles(lockFiles: NpmLockFiles): boolean {\n return Object.values(lockFiles).filter(isString).length > 1;\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): Promise<NpmrcPackageFileContent<NpmManagerData> | null> {\n logger.trace(`npm.extractPackageFile(${packageFile})`);\n logger.trace({ content });\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(content);\n } catch {\n logger.debug({ packageFile }, `Invalid JSON`);\n return null;\n }\n\n const res = extractPackageJson(packageJson, packageFile);\n if (!res) {\n return null;\n }\n\n let workspacesPackages: string[] | undefined;\n if (isArray(packageJson.workspaces)) {\n workspacesPackages = packageJson.workspaces;\n } else {\n workspacesPackages = packageJson.workspaces?.packages;\n }\n\n const lockFiles: NpmLockFiles = {\n yarnLock: 'yarn.lock',\n packageLock: 'package-lock.json',\n shrinkwrapJson: 'npm-shrinkwrap.json',\n pnpmLockFile: 'pnpm-lock.yaml',\n };\n\n for (const [key, val] of Object.entries(lockFiles) as [\n 'yarnLock' | 'packageLock' | 'shrinkwrapJson' | 'pnpmLockFile',\n string,\n ][]) {\n const filePath = getSiblingFileName(packageFile, val);\n if (await readLocalFile(filePath, 'utf8')) {\n lockFiles[key] = filePath;\n } else {\n lockFiles[key] = undefined;\n }\n }\n lockFiles.npmLock = lockFiles.packageLock ?? lockFiles.shrinkwrapJson;\n delete lockFiles.packageLock;\n delete lockFiles.shrinkwrapJson;\n\n if (hasMultipleLockFiles(lockFiles)) {\n logger.warn(\n 'Updating multiple npm lock files is deprecated and support will be removed in future versions.',\n );\n }\n\n const { npmrc, npmrcFileName, repoNpmrc } = await resolveNpmrc(\n packageFile,\n config,\n );\n\n const yarnrcYmlFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc.yml',\n );\n const yarnZeroInstall = yarnrcYmlFileName\n ? await isZeroInstall(yarnrcYmlFileName)\n : false;\n\n let yarnrcConfig: YarnConfig | null = null;\n const repoYarnrcYml = yarnrcYmlFileName\n ? await readLocalFile(yarnrcYmlFileName, 'utf8')\n : null;\n if (isString(repoYarnrcYml) && repoYarnrcYml.trim().length > 0) {\n yarnrcConfig = loadConfigFromYarnrcYml(repoYarnrcYml);\n }\n\n const legacyYarnrcFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc',\n );\n const repoLegacyYarnrc = legacyYarnrcFileName\n ? await readLocalFile(legacyYarnrcFileName, 'utf8')\n : null;\n if (isString(repoLegacyYarnrc) && repoLegacyYarnrc.trim().length > 0) {\n yarnrcConfig = loadConfigFromLegacyYarnrc(repoLegacyYarnrc);\n }\n\n let pnpmWorkspaceRegistry: string | undefined;\n let pnpmWorkspaceRegistries: Record<string, string> | undefined;\n const pnpmWorkspaceYamlFileName = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n const repoPnpmWorkspaceYaml = pnpmWorkspaceYamlFileName\n ? await readLocalFile(pnpmWorkspaceYamlFileName, 'utf8')\n : null;\n if (isNonEmptyStringAndNotWhitespace(repoPnpmWorkspaceYaml)) {\n const parsed = await PnpmWorkspaceFile.safeParseAsync(\n repoPnpmWorkspaceYaml,\n );\n if (parsed.success) {\n pnpmWorkspaceRegistry = parsed.data.registry;\n pnpmWorkspaceRegistries = parsed.data.registries;\n } else {\n logger.debug(\n { packageFile: pnpmWorkspaceYamlFileName, err: parsed.error },\n 'Failed to parse pnpm-workspace.yaml',\n );\n }\n }\n\n if (res.deps.length === 0) {\n logger.debug('Package file has no deps');\n if (!(\n !!res.managerData?.packageJsonName ||\n !!res.packageFileVersion ||\n !!npmrc ||\n workspacesPackages\n )) {\n logger.debug('Skipping file');\n return null;\n }\n }\n let skipInstalls = config.skipInstalls;\n if (skipInstalls === null) {\n const hasFancyRefs = !!res.deps.some(\n (dep) =>\n !!dep.currentValue?.startsWith('file:') ||\n !!dep.currentValue?.startsWith('npm:'),\n );\n if ((hasFancyRefs && !!lockFiles.npmLock) || yarnZeroInstall) {\n // https://github.com/npm/cli/issues/1432\n // Explanation:\n // - npm install --package-lock-only is buggy for transitive deps in file: and npm: references\n // - So we set skipInstalls to false if file: or npm: refs are found *and* the user hasn't explicitly set the value already\n // - Also, do not skip install if Yarn zero-install is used\n logger.debug('Automatically setting skipInstalls to false');\n skipInstalls = false;\n } else {\n skipInstalls = true;\n }\n }\n\n const extractedConstraints = getExtractedConstraints(res.deps);\n\n if (yarnrcConfig) {\n for (const dep of res.deps) {\n // v8 ignore else -- TODO: add tests #40625\n if (dep.depName) {\n const registryUrlFromYarnrcConfig = resolveRegistryUrl(\n dep.packageName ?? dep.depName,\n yarnrcConfig,\n );\n if (\n registryUrlFromYarnrcConfig &&\n dep.datasource === NpmDatasource.id\n ) {\n dep.registryUrls = [registryUrlFromYarnrcConfig];\n }\n }\n }\n }\n\n // Applied after the yarnrc resolution so pnpm-workspace.yaml wins in pnpm repos\n applyPnpmWorkspaceRegistries(\n res.deps,\n pnpmWorkspaceRegistries,\n pnpmWorkspaceRegistry,\n );\n\n return {\n ...res,\n npmrc,\n managerData: {\n ...res.managerData,\n ...lockFiles,\n yarnZeroInstall,\n hasPackageManager:\n isNonEmptyStringAndNotWhitespace(packageJson.packageManager) ||\n hasDevEnginesPackageManager(packageJson),\n workspacesPackages,\n npmrcFileName, // store npmrc file name so we can later tell if it came from the workspace or not\n repoNpmrc, // stored instead of `npmrc` in the repository cache, from which `npmrc` is rebuilt\n },\n skipInstalls,\n extractedConstraints,\n };\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<NpmrcPackageFile<NpmManagerData>[]> {\n const npmFiles: NpmrcPackageFile<NpmManagerData>[] = [];\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (content) {\n // pnpm workspace files are their own package file, defined via managerFilePatterns.\n if (packageFile.endsWith('pnpm-workspace.yaml')) {\n logger.trace(\n { packageFile },\n `Extracting as a pnpm-workspace.yaml file`,\n );\n const parsedPnpmWorkspaceYaml =\n await PnpmWorkspaceFile.safeParseAsync(content);\n if (parsedPnpmWorkspaceYaml.success) {\n logger.trace(\n { packageFile },\n `Extracting file as a pnpm workspace YAML file`,\n );\n const deps = await extractPnpmWorkspaceFile(\n parsedPnpmWorkspaceYaml.data,\n packageFile,\n );\n // v8 ignore else -- TODO: add test #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.warn(\n { packageFile, err: parsedPnpmWorkspaceYaml.error },\n `Failed to parse pnpm-workspace.yaml file`,\n );\n }\n } else {\n if (packageFile.endsWith('json')) {\n logger.trace({ packageFile }, `Extracting as a package.json file`);\n\n const deps = await extractPackageFile(content, packageFile, config);\n // v8 ignore else -- TODO: add tests #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.trace({ packageFile }, `Extracting as a .yarnrc.yml file`);\n\n const yarnConfig = loadConfigFromYarnrcYml(content);\n\n // v8 ignore else -- TODO: add tests #40625\n if (yarnConfig?.catalogs || yarnConfig?.catalog) {\n const hasPackageManagerResult = await hasPackageManager(\n upath.dirname(packageFile),\n );\n const catalogsDeps = await extractYarnCatalogs(\n { catalog: yarnConfig.catalog, catalogs: yarnConfig.catalogs },\n packageFile,\n hasPackageManagerResult,\n );\n // v8 ignore else -- TODO: add tests #40625\n if (catalogsDeps) {\n npmFiles.push({\n ...catalogsDeps,\n packageFile,\n });\n }\n }\n }\n }\n } else {\n logger.debug({ packageFile }, `No content found`);\n }\n }\n\n await postExtract(npmFiles);\n return npmFiles;\n}\n"],"mappings":";;;;;;;;;;;;;;AAyCA,SAAS,qBAAqB,WAAkC;CAC9D,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,SAAS;AAC5D;AAEA,eAAsB,mBACpB,SACA,aACA,QACyD;CACzD,OAAO,MAAM,0BAA0B,YAAY,EAAE;CACrD,OAAO,MAAM,EAAE,QAAQ,CAAC;CACxB,IAAI;CACJ,IAAI;EACF,cAAc,KAAK,MAAM,OAAO;CAClC,QAAQ;EACN,OAAO,MAAM,EAAE,YAAY,GAAG,cAAc;EAC5C,OAAO;CACT;CAEA,MAAM,MAAM,mBAAmB,aAAa,WAAW;CACvD,IAAI,CAAC,KACH,OAAO;CAGT,IAAI;CACJ,IAAI,QAAQ,YAAY,UAAU,GAChC,qBAAqB,YAAY;MAEjC,qBAAqB,YAAY,YAAY;CAG/C,MAAM,YAA0B;EAC9B,UAAU;EACV,aAAa;EACb,gBAAgB;EAChB,cAAc;CAChB;CAEA,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,SAAS,GAG5C;EACH,MAAM,WAAW,mBAAmB,aAAa,GAAG;EACpD,IAAI,MAAM,cAAc,UAAU,MAAM,GACtC,UAAU,OAAO;OAEjB,UAAU,OAAO,KAAA;CAErB;CACA,UAAU,UAAU,UAAU,eAAe,UAAU;CACvD,OAAO,UAAU;CACjB,OAAO,UAAU;CAEjB,IAAI,qBAAqB,SAAS,GAChC,OAAO,KACL,gGACF;CAGF,MAAM,EAAE,OAAO,eAAe,cAAc,MAAM,aAChD,aACA,MACF;CAEA,MAAM,oBAAoB,MAAM,yBAC9B,aACA,aACF;CACA,MAAM,kBAAkB,oBACpB,MAAM,cAAc,iBAAiB,IACrC;CAEJ,IAAI,eAAkC;CACtC,MAAM,gBAAgB,oBAClB,MAAM,cAAc,mBAAmB,MAAM,IAC7C;CACJ,IAAI,SAAS,aAAa,KAAK,cAAc,KAAK,CAAC,CAAC,SAAS,GAC3D,eAAe,wBAAwB,aAAa;CAGtD,MAAM,uBAAuB,MAAM,yBACjC,aACA,SACF;CACA,MAAM,mBAAmB,uBACrB,MAAM,cAAc,sBAAsB,MAAM,IAChD;CACJ,IAAI,SAAS,gBAAgB,KAAK,iBAAiB,KAAK,CAAC,CAAC,SAAS,GACjE,eAAe,2BAA2B,gBAAgB;CAG5D,IAAI;CACJ,IAAI;CACJ,MAAM,4BAA4B,MAAM,yBACtC,aACA,qBACF;CACA,MAAM,wBAAwB,4BAC1B,MAAM,cAAc,2BAA2B,MAAM,IACrD;CACJ,IAAI,iCAAiC,qBAAqB,GAAG;EAC3D,MAAM,SAAS,MAAM,kBAAkB,eACrC,qBACF;EACA,IAAI,OAAO,SAAS;GAClB,wBAAwB,OAAO,KAAK;GACpC,0BAA0B,OAAO,KAAK;EACxC,OACE,OAAO,MACL;GAAE,aAAa;GAA2B,KAAK,OAAO;EAAM,GAC5D,qCACF;CAEJ;CAEA,IAAI,IAAI,KAAK,WAAW,GAAG;EACzB,OAAO,MAAM,0BAA0B;EACvC,IAAI,EACF,CAAC,CAAC,IAAI,aAAa,mBACnB,CAAC,CAAC,IAAI,sBACN,CAAC,CAAC,SACF,qBACC;GACD,OAAO,MAAM,eAAe;GAC5B,OAAO;EACT;CACF;CACA,IAAI,eAAe,OAAO;CAC1B,IAAI,iBAAiB,MAAM;EAMzB,IAAK,CALiB,CAAC,IAAI,KAAK,MAC7B,QACC,CAAC,CAAC,IAAI,cAAc,WAAW,OAAO,KACtC,CAAC,CAAC,IAAI,cAAc,WAAW,MAAM,CACzC,KACqB,CAAC,CAAC,UAAU,WAAY,iBAAiB;GAM5D,OAAO,MAAM,6CAA6C;GAC1D,eAAe;EACjB,OACE,eAAe;CAEnB;CAEA,MAAM,uBAAuB,wBAAwB,IAAI,IAAI;CAE7D,IAAI,cACG;OAAA,MAAM,OAAO,IAAI;;EAEpB,IAAI,IAAI,SAAS;GACf,MAAM,8BAA8B,mBAClC,IAAI,eAAe,IAAI,SACvB,YACF;GACA,IACE,+BACA,IAAI,eAAe,cAAc,IAEjC,IAAI,eAAe,CAAC,2BAA2B;EAEnD;;CAKJ,6BACE,IAAI,MACJ,yBACA,qBACF;CAEA,OAAO;EACL,GAAG;EACH;EACA,aAAa;GACX,GAAG,IAAI;GACP,GAAG;GACH;GACA,mBACE,iCAAiC,YAAY,cAAc,KAC3D,4BAA4B,WAAW;GACzC;GACA;GACA;EACF;EACA;EACA;CACF;AACF;AAEA,eAAsB,uBACpB,QACA,cAC6C;CAC7C,MAAM,WAA+C,CAAC;CACtD,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,UAAU,MAAM,cAAc,aAAa,MAAM;EACvD,IAAI,SAAS;GAEX,IAAI,YAAY,SAAS,qBAAqB,GAAG;IAC/C,OAAO,MACL,EAAE,YAAY,GACd,0CACF;IACA,MAAM,0BACJ,MAAM,kBAAkB,eAAe,OAAO;IAChD,IAAI,wBAAwB,SAAS;KACnC,OAAO,MACL,EAAE,YAAY,GACd,+CACF;KACA,MAAM,OAAO,MAAM,yBACjB,wBAAwB,MACxB,WACF;;KAEA,IAAI,MACF,SAAS,KAAK;MACZ,GAAG;MACH;KACF,CAAC;IAEL,OACE,OAAO,KACL;KAAE;KAAa,KAAK,wBAAwB;IAAM,GAClD,0CACF;GAEJ,OACE,IAAI,YAAY,SAAS,MAAM,GAAG;IAChC,OAAO,MAAM,EAAE,YAAY,GAAG,mCAAmC;IAEjE,MAAM,OAAO,MAAM,mBAAmB,SAAS,aAAa,MAAM;;IAElE,IAAI,MACF,SAAS,KAAK;KACZ,GAAG;KACH;IACF,CAAC;GAEL,OAAO;IACL,OAAO,MAAM,EAAE,YAAY,GAAG,kCAAkC;IAEhE,MAAM,aAAa,wBAAwB,OAAO;;IAGlD,IAAI,YAAY,YAAY,YAAY,SAAS;KAC/C,MAAM,0BAA0B,MAAM,kBACpC,MAAM,QAAQ,WAAW,CAC3B;KACA,MAAM,eAAe,MAAM,oBACzB;MAAE,SAAS,WAAW;MAAS,UAAU,WAAW;KAAS,GAC7D,aACA,uBACF;;KAEA,IAAI,cACF,SAAS,KAAK;MACZ,GAAG;MACH;KACF,CAAC;IAEL;GACF;EAEJ,OACE,OAAO,MAAM,EAAE,YAAY,GAAG,kBAAkB;CAEpD;CAEA,MAAM,YAAY,QAAQ;CAC1B,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/modules/manager/npm/extract/index.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n getSiblingFileName,\n readLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\n\nimport type {\n ExtractConfig,\n NpmrcPackageFile,\n NpmrcPackageFileContent,\n} from '../../types.ts';\nimport { resolveNpmrc } from '../npmrc.ts';\nimport { PnpmWorkspaceFile, type YarnConfig } from '../schema.ts';\nimport type { NpmLockFiles, NpmManagerData } from '../types.ts';\nimport { getExtractedConstraints } from './common/dependency.ts';\nimport {\n extractPackageJson,\n hasDevEnginesPackageManager,\n hasPackageManager,\n} from './common/package-file.ts';\nimport {\n applyPnpmWorkspaceRegistries,\n extractPnpmWorkspaceFile,\n} from './pnpm.ts';\nimport { postExtract } from './post/index.ts';\nimport type { NpmPackage } from './types.ts';\nimport { extractYarnCatalogs, isZeroInstall } from './yarn.ts';\nimport {\n loadConfigFromLegacyYarnrc,\n loadConfigFromYarnrcYml,\n resolveRegistryUrl,\n} from './yarnrc.ts';\n\nfunction hasMultipleLockFiles(lockFiles: NpmLockFiles): boolean {\n return Object.values(lockFiles).filter(isString).length > 1;\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n config: ExtractConfig,\n): Promise<NpmrcPackageFileContent<NpmManagerData> | null> {\n logger.trace(`npm.extractPackageFile(${packageFile})`);\n logger.trace({ content });\n let packageJson: NpmPackage;\n try {\n packageJson = JSON.parse(content);\n } catch {\n logger.debug({ packageFile }, `Invalid JSON`);\n return null;\n }\n\n const res = extractPackageJson(packageJson, packageFile);\n if (!res) {\n return null;\n }\n\n let workspacesPackages: string[] | undefined;\n if (isArray(packageJson.workspaces)) {\n workspacesPackages = packageJson.workspaces;\n } else {\n workspacesPackages = packageJson.workspaces?.packages;\n }\n\n const lockFiles: NpmLockFiles = {\n yarnLock: 'yarn.lock',\n packageLock: 'package-lock.json',\n shrinkwrapJson: 'npm-shrinkwrap.json',\n pnpmLockFile: 'pnpm-lock.yaml',\n };\n\n for (const [key, val] of Object.entries(lockFiles) as [\n 'yarnLock' | 'packageLock' | 'shrinkwrapJson' | 'pnpmLockFile',\n string,\n ][]) {\n const filePath = getSiblingFileName(packageFile, val);\n if (await readLocalFile(filePath, 'utf8')) {\n lockFiles[key] = filePath;\n } else {\n lockFiles[key] = undefined;\n }\n }\n lockFiles.npmLock = lockFiles.packageLock ?? lockFiles.shrinkwrapJson;\n delete lockFiles.packageLock;\n delete lockFiles.shrinkwrapJson;\n\n if (hasMultipleLockFiles(lockFiles)) {\n logger.warn(\n 'Updating multiple npm lock files is deprecated and support will be removed in future versions.',\n );\n }\n\n const { npmrc, npmrcFileName, repoNpmrc } = await resolveNpmrc(\n packageFile,\n config,\n );\n\n const yarnrcYmlFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc.yml',\n );\n const yarnZeroInstall = yarnrcYmlFileName\n ? await isZeroInstall(yarnrcYmlFileName)\n : false;\n\n let yarnrcConfig: YarnConfig | null = null;\n const repoYarnrcYml = yarnrcYmlFileName\n ? await readLocalFile(yarnrcYmlFileName, 'utf8')\n : null;\n if (isString(repoYarnrcYml) && repoYarnrcYml.trim().length > 0) {\n yarnrcConfig = loadConfigFromYarnrcYml(repoYarnrcYml);\n }\n\n const legacyYarnrcFileName = await findLocalSiblingOrParent(\n packageFile,\n '.yarnrc',\n );\n const repoLegacyYarnrc = legacyYarnrcFileName\n ? await readLocalFile(legacyYarnrcFileName, 'utf8')\n : null;\n if (isString(repoLegacyYarnrc) && repoLegacyYarnrc.trim().length > 0) {\n yarnrcConfig = loadConfigFromLegacyYarnrc(repoLegacyYarnrc);\n }\n\n let pnpmWorkspaceRegistry: string | undefined;\n let pnpmWorkspaceRegistries: Record<string, string> | undefined;\n const pnpmWorkspaceYamlFileName = await findLocalSiblingOrParent(\n packageFile,\n 'pnpm-workspace.yaml',\n );\n const repoPnpmWorkspaceYaml = pnpmWorkspaceYamlFileName\n ? await readLocalFile(pnpmWorkspaceYamlFileName, 'utf8')\n : null;\n if (isNonEmptyStringAndNotWhitespace(repoPnpmWorkspaceYaml)) {\n const parsed = await PnpmWorkspaceFile.safeParseAsync(\n repoPnpmWorkspaceYaml,\n );\n if (parsed.success) {\n pnpmWorkspaceRegistry = parsed.data.registry;\n pnpmWorkspaceRegistries = parsed.data.registries;\n } else {\n logger.debug(\n { packageFile: pnpmWorkspaceYamlFileName, err: parsed.error },\n 'Failed to parse pnpm-workspace.yaml',\n );\n }\n }\n\n if (res.deps.length === 0) {\n logger.debug('Package file has no deps');\n if (!(\n !!res.managerData?.packageJsonName ||\n !!res.packageFileVersion ||\n !!npmrc ||\n workspacesPackages\n )) {\n logger.debug('Skipping file');\n return null;\n }\n }\n let skipInstalls = config.skipInstalls;\n if (skipInstalls === null) {\n const hasFancyRefs = !!res.deps.some(\n (dep) =>\n !!dep.currentValue?.startsWith('file:') ||\n !!dep.currentValue?.startsWith('npm:'),\n );\n if ((hasFancyRefs && !!lockFiles.npmLock) || yarnZeroInstall) {\n // https://github.com/npm/cli/issues/1432\n // Explanation:\n // - npm install --package-lock-only is buggy for transitive deps in file: and npm: references\n // - So we set skipInstalls to false if file: or npm: refs are found *and* the user hasn't explicitly set the value already\n // - Also, do not skip install if Yarn zero-install is used\n logger.debug('Automatically setting skipInstalls to false');\n skipInstalls = false;\n } else {\n skipInstalls = true;\n }\n }\n\n const extractedConstraints = getExtractedConstraints(res.deps);\n\n if (yarnrcConfig) {\n for (const dep of res.deps) {\n // v8 ignore else -- TODO: add tests #40625\n if (dep.depName) {\n const registryUrlFromYarnrcConfig = resolveRegistryUrl(\n dep.packageName ?? dep.depName,\n yarnrcConfig,\n );\n if (\n registryUrlFromYarnrcConfig &&\n dep.datasource === NpmDatasource.id\n ) {\n dep.registryUrls = [registryUrlFromYarnrcConfig];\n }\n }\n }\n }\n\n // Applied after the yarnrc resolution so pnpm-workspace.yaml wins in pnpm repos\n applyPnpmWorkspaceRegistries(\n res.deps,\n pnpmWorkspaceRegistries,\n pnpmWorkspaceRegistry,\n );\n\n return {\n ...res,\n ...(isString(npmrc) && { npmrc }),\n managerData: {\n ...res.managerData,\n ...lockFiles,\n yarnZeroInstall,\n hasPackageManager:\n isNonEmptyStringAndNotWhitespace(packageJson.packageManager) ||\n hasDevEnginesPackageManager(packageJson),\n workspacesPackages,\n npmrcFileName, // store npmrc file name so we can later tell if it came from the workspace or not\n repoNpmrc, // stored instead of `npmrc` in the repository cache, from which `npmrc` is rebuilt\n },\n skipInstalls,\n extractedConstraints,\n };\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<NpmrcPackageFile<NpmManagerData>[]> {\n const npmFiles: NpmrcPackageFile<NpmManagerData>[] = [];\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (content) {\n // pnpm workspace files are their own package file, defined via managerFilePatterns.\n if (packageFile.endsWith('pnpm-workspace.yaml')) {\n logger.trace(\n { packageFile },\n `Extracting as a pnpm-workspace.yaml file`,\n );\n const parsedPnpmWorkspaceYaml =\n await PnpmWorkspaceFile.safeParseAsync(content);\n if (parsedPnpmWorkspaceYaml.success) {\n logger.trace(\n { packageFile },\n `Extracting file as a pnpm workspace YAML file`,\n );\n const deps = await extractPnpmWorkspaceFile(\n parsedPnpmWorkspaceYaml.data,\n packageFile,\n );\n // v8 ignore else -- TODO: add test #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.warn(\n { packageFile, err: parsedPnpmWorkspaceYaml.error },\n `Failed to parse pnpm-workspace.yaml file`,\n );\n }\n } else {\n if (packageFile.endsWith('json')) {\n logger.trace({ packageFile }, `Extracting as a package.json file`);\n\n const deps = await extractPackageFile(content, packageFile, config);\n // v8 ignore else -- TODO: add tests #40625\n if (deps) {\n npmFiles.push({\n ...deps,\n packageFile,\n });\n }\n } else {\n logger.trace({ packageFile }, `Extracting as a .yarnrc.yml file`);\n\n const yarnConfig = loadConfigFromYarnrcYml(content);\n\n // v8 ignore else -- TODO: add tests #40625\n if (yarnConfig?.catalogs || yarnConfig?.catalog) {\n const hasPackageManagerResult = await hasPackageManager(\n upath.dirname(packageFile),\n );\n const catalogsDeps = await extractYarnCatalogs(\n { catalog: yarnConfig.catalog, catalogs: yarnConfig.catalogs },\n packageFile,\n hasPackageManagerResult,\n );\n // v8 ignore else -- TODO: add tests #40625\n if (catalogsDeps) {\n npmFiles.push({\n ...catalogsDeps,\n packageFile,\n });\n }\n }\n }\n }\n } else {\n logger.debug({ packageFile }, `No content found`);\n }\n }\n\n await postExtract(npmFiles);\n return npmFiles;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npmrc.js","names":[],"sources":["../../../../lib/modules/manager/npm/npmrc.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { hasUrlCredentials } from '../../../util/url.ts';\nimport type { NpmrcPackageFile } from '../types.ts';\nimport { parseNpmrc, renderNpmrc } from './npmrc-parser.ts';\nimport type {\n NpmManagerData,\n NpmrcConfig,\n NpmrcLine,\n NpmrcLineEnding,\n NpmrcResult,\n NpmrcSettingLine,\n SanitizedRepoNpmrc,\n} from './types.ts';\n\n/**\n * Mirrors npm's environment-reference grammar. Escape handling remains\n * procedural because RE2 does not support lookbehind.\n */\nconst environmentVariableReferenceRegex = regEx(\n // oxlint-disable-next-line prefer-named-capture-group -- Only the full match and its position are used.\n /\\$\\{([^${}?]+)(\\?)?\\}/g,\n);\n\nfunction containsEnvironmentVariableReference(value: unknown): boolean {\n if (!isString(value)) {\n return false;\n }\n\n for (const match of value.matchAll(environmentVariableReferenceRegex)) {\n let escapeCount = 0;\n let escapeIndex = match.index - 1;\n while (value[escapeIndex] === '\\\\') {\n escapeCount += 1;\n escapeIndex -= 1;\n }\n\n if (escapeCount % 2 === 0) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasEnvironmentVariableReference(line: NpmrcSettingLine): boolean {\n return (\n containsEnvironmentVariableReference(line.key) ||\n containsEnvironmentVariableReference(line.value)\n );\n}\n\nfunction sanitizeRepoNpmrc(\n repoNpmrc: string,\n npmrcFileName: string,\n): SanitizedRepoNpmrc {\n const document = parseNpmrc(repoNpmrc);\n const retainedLines: NpmrcLine[] = [];\n const allowEnvironmentVariableReferences = GlobalConfig.get('exposeAllEnv');\n let removedEnvironmentVariableReferenceLine = false;\n let removedPackageLockSetting = false;\n\n for (const line of document.lines) {\n if (line.type !== 'setting' || line.section !== null) {\n retainedLines.push(line);\n continue;\n }\n\n if (line.key === 'package-lock') {\n removedPackageLockSetting = true;\n continue;\n }\n\n if (\n !allowEnvironmentVariableReferences &&\n hasEnvironmentVariableReference(line)\n ) {\n removedEnvironmentVariableReferenceLine = true;\n continue;\n }\n\n retainedLines.push(line);\n }\n\n if (removedPackageLockSetting) {\n logger.debug('Stripping package-lock setting from .npmrc');\n }\n\n if (removedEnvironmentVariableReferenceLine) {\n logger.debug(\n { npmrcFileName },\n 'Stripping .npmrc file of lines with variables',\n );\n }\n\n return {\n fileName: npmrcFileName,\n content: renderNpmrc(retainedLines),\n detectedLineEnding: document.detectedLineEnding,\n };\n}\n\nfunction mergeNpmrcDocuments(\n configNpmrc: string | undefined,\n sanitizedRepoNpmrc: SanitizedRepoNpmrc,\n): string {\n if (!configNpmrc) {\n return sanitizedRepoNpmrc.content;\n }\n\n const configDocument = parseNpmrc(configNpmrc);\n if (configDocument.trailingLineEnding) {\n return `${configNpmrc}${sanitizedRepoNpmrc.content}`;\n }\n\n const separator: Exclude<NpmrcLineEnding, ''> =\n configDocument.detectedLineEnding ??\n sanitizedRepoNpmrc.detectedLineEnding ??\n '\\n';\n\n return `${configNpmrc}${separator}${sanitizedRepoNpmrc.content}`;\n}\n\n/**\n * Whether the repository `.npmrc` is ignored in favour of a configured `npmrc` without `npmrcMerge`.\n */\nfunction isRepoNpmrcIgnored(config: NpmrcConfig): boolean {\n return isString(config.npmrc) && !config.npmrcMerge;\n}\n\n/**\n * Combines the configured `npmrc` with the sanitized repository `.npmrc`, honouring `npmrcMerge`.\n *\n * @returns the `npmrc` to use for the package file, or `undefined` when there is neither\n */\nexport function applyConfigNpmrc(\n config: NpmrcConfig,\n repoNpmrc: SanitizedRepoNpmrc | undefined,\n): string | undefined {\n if (!repoNpmrc) {\n return isString(config.npmrc) ? config.npmrc : undefined;\n }\n\n if (isRepoNpmrcIgnored(config)) {\n logger.info(\n { npmrcFileName: repoNpmrc.fileName },\n 'Repo .npmrc file is ignored due to config.npmrc with config.npmrcMerge=false',\n );\n\n return config.npmrc;\n }\n\n return mergeNpmrcDocuments(config.npmrc, repoNpmrc);\n}\n\n/**\n * The npm settings holding a secret: the auth settings, and `key` with an inline client key; `username`, `email`, `cert`, `certfile` and `keyfile` are not.\n *\n * @see https://docs.npmjs.com/cli/configuring-npm/npmrc#auth-related-configuration\n */\nconst credentialKeyRegex = regEx(/(?:^|:)(?:_auth|_authToken|_password|key)$/i);\n\nconst singleEnvironmentVariableReferenceRegex = regEx(\n /^\\$\\{[a-z_][a-z\\d_]*\\}$/i,\n);\n\n/**\n * Whether `value` is exactly one `${NAME}` environment variable reference.\n */\nfunction isSingleEnvironmentVariableReference(value: unknown): boolean {\n return isString(value) && singleEnvironmentVariableReferenceRegex.test(value);\n}\n\nfunction hasRegistryUrlCredentials(value: unknown): boolean {\n if (!isString(value)) {\n return false;\n }\n // a protocol-relative registry URL is given a scheme, which `hasUrlCredentials()` looks for\n return hasUrlCredentials(value.startsWith('//') ? `https:${value}` : value);\n}\n\n/**\n * Whether the registry URL of a `//host/:setting` or `https://host/:setting` key, the part before its last `:`, carries credentials.\n */\nfunction hasKeyUrlCredentials(key: string): boolean {\n const separatorIndex = key.lastIndexOf(':');\n if (separatorIndex === -1) {\n return false;\n }\n return hasRegistryUrlCredentials(key.slice(0, separatorIndex));\n}\n\n/**\n * Whether the sanitized repository `.npmrc` carries credentials: an `_auth`, `_authToken`, `_password` or `key` setting other than exactly one `${NAME}` reference, or a URL with credentials in its userinfo, in a setting's key or value.\n */\nexport function hasNpmrcCredentials(repoNpmrc: SanitizedRepoNpmrc): boolean {\n const settings = parseNpmrc(repoNpmrc.content).lines.filter(\n (line): line is NpmrcSettingLine => line.type === 'setting',\n );\n for (const line of settings) {\n if (hasKeyUrlCredentials(line.key)) {\n return true;\n }\n // an environment variable reference is only replaced when the `.npmrc` is used, so the stored value is not a credential\n if (isSingleEnvironmentVariableReference(line.value)) {\n continue;\n }\n if (\n credentialKeyRegex.test(line.key) ||\n hasRegistryUrlCredentials(line.value)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Matches the characters which start a comment in an `.npmrc`, at the start of a line or inline.\n */\nconst npmrcCommentRegex = regEx(/[#;]/);\n\n/**\n * Whether the repository `.npmrc` has content `hasNpmrcCredentials()` does not read: a `#` or `;` anywhere, which may start a comment, or a non-blank line which is neither a setting nor a section.\n */\nfunction hasUnreadContent(repoNpmrc: SanitizedRepoNpmrc): boolean {\n return (\n npmrcCommentRegex.test(repoNpmrc.content) ||\n parseNpmrc(repoNpmrc.content).lines.some(\n (line) => line.type === 'other' && !!line.raw.trim(),\n )\n );\n}\n\n/**\n * Why a repository `.npmrc` is not cached: it carries credentials, or has content which is not checked for credentials.\n */\ntype UncachedNpmrcReason = 'credentials' | 'unread-content';\n\n/**\n * Returns why `repoNpmrc` is not cached, or `null` when it is cached.\n */\nfunction getUncachedNpmrcReason(\n repoNpmrc: SanitizedRepoNpmrc,\n): UncachedNpmrcReason | null {\n if (hasNpmrcCredentials(repoNpmrc)) {\n return 'credentials';\n }\n if (hasUnreadContent(repoNpmrc)) {\n return 'unread-content';\n }\n return null;\n}\n\n/**\n * Returns shallow copies of the package files without their `npmrc`, as they are put into the repository cache.\n *\n * A repository `.npmrc` carrying credentials, or with a comment or another line which is not checked for credentials, is dropped as well and the copy is marked with its `uncachedNpmrcFileName`. So is a copy of a package file with an `npmrcFileName` but without `npmrc`, whose repository `.npmrc` cannot be read.\n */\nexport function stripNpmrc(\n packageFiles: NpmrcPackageFile<NpmManagerData>[],\n): NpmrcPackageFile<NpmManagerData>[] {\n const result: NpmrcPackageFile<NpmManagerData>[] = [];\n // the workspaces of a monorepo share one `.npmrc`, which is classified once\n const reasonByContent = new Map<string, UncachedNpmrcReason | null>();\n for (const packageFile of packageFiles) {\n const copy = { ...packageFile };\n delete copy.npmrc;\n // read from disk again, so that the configured `npmrc` is not used in its place when the package file is restored\n const npmrcFileName = copy.managerData?.npmrcFileName;\n if (npmrcFileName && !isString(packageFile.npmrc)) {\n copy.managerData = {\n ...copy.managerData,\n uncachedNpmrcFileName: npmrcFileName,\n };\n }\n const repoNpmrc = copy.managerData?.repoNpmrc;\n if (repoNpmrc) {\n let reason = reasonByContent.get(repoNpmrc.content);\n if (reason === undefined) {\n reason = getUncachedNpmrcReason(repoNpmrc);\n reasonByContent.set(repoNpmrc.content, reason);\n }\n if (reason === 'credentials') {\n logger.once.warn(\n { npmrcFileName: repoNpmrc.fileName },\n 'A repository .npmrc contains credentials, which are not cached: configure them through hostRules or the npmrc option instead',\n );\n } else if (reason === 'unread-content') {\n logger.once.debug(\n { npmrcFileName: repoNpmrc.fileName },\n 'A repository .npmrc contains comments or lines which are not settings, so it is not cached',\n );\n }\n if (reason) {\n copy.managerData = {\n ...copy.managerData,\n uncachedNpmrcFileName: repoNpmrc.fileName,\n };\n delete copy.managerData.repoNpmrc;\n }\n }\n result.push(copy);\n }\n return result;\n}\n\n/**\n * Whether `packageFile` was extracted with an `npmrc` from `resolveNpmrc()`, which also sets its `npmrcFileName`, `null` without a repository `.npmrc`.\n */\nfunction hasResolvedNpmrc(\n packageFile: NpmrcPackageFile<NpmManagerData>,\n): boolean {\n return !isUndefined(packageFile.managerData?.npmrcFileName);\n}\n\n/**\n * Returns shallow copies of cached package files with their `npmrc` rebuilt from the cached repository `.npmrc` and the config, or read from disk again for a file with an `uncachedNpmrcFileName`.\n * A package file extracted without `npmrc`, such as a `pnpm-workspace.yaml` or `.yarnrc.yml` catalog, is copied without one.\n */\nexport async function restoreNpmrc(\n packageFiles: NpmrcPackageFile<NpmManagerData>[],\n config: NpmrcConfig,\n): Promise<NpmrcPackageFile<NpmManagerData>[]> {\n const result: NpmrcPackageFile<NpmManagerData>[] = [];\n // the workspaces of a monorepo share one `.npmrc`, which is read once\n const npmrcByFileName = new Map<string, string | undefined>();\n for (const packageFile of packageFiles) {\n if (!hasResolvedNpmrc(packageFile)) {\n result.push({ ...packageFile });\n continue;\n }\n let npmrc: string | undefined;\n const uncachedNpmrcFileName =\n packageFile.managerData?.uncachedNpmrcFileName;\n if (uncachedNpmrcFileName) {\n if (!npmrcByFileName.has(uncachedNpmrcFileName)) {\n const read = await readRepoNpmrc(uncachedNpmrcFileName, config);\n npmrcByFileName.set(uncachedNpmrcFileName, read.npmrc);\n }\n npmrc = npmrcByFileName.get(uncachedNpmrcFileName);\n } else {\n npmrc = applyConfigNpmrc(config, packageFile.managerData?.repoNpmrc);\n }\n result.push({ ...packageFile, npmrc });\n }\n return result;\n}\n\n/**\n * Whether any of the cached package files has an `uncachedNpmrcFileName`.\n */\nexport function hasUncachedNpmrc(\n packageFiles: NpmrcPackageFile<NpmManagerData>[],\n): boolean {\n return packageFiles.some(\n (packageFile) => !!packageFile.managerData?.uncachedNpmrcFileName,\n );\n}\n\n/**\n * Reads and sanitizes the repository `.npmrc` and combines it with the configured `npmrc`.\n *\n * @returns the `npmrc` to use, `undefined` when the repository `.npmrc` cannot be read, and the sanitized repository `.npmrc` when it is readable and not ignored\n */\nasync function readRepoNpmrc(\n npmrcFileName: string,\n config: NpmrcConfig,\n): Promise<Omit<NpmrcResult, 'npmrcFileName'>> {\n const content = await readLocalFile(npmrcFileName, 'utf8');\n if (!isString(content)) {\n return { npmrc: undefined };\n }\n\n const repoNpmrc = sanitizeRepoNpmrc(content, npmrcFileName);\n const npmrc = applyConfigNpmrc(config, repoNpmrc);\n if (isRepoNpmrcIgnored(config)) {\n return { npmrc };\n }\n return { npmrc, repoNpmrc };\n}\n\nexport async function resolveNpmrc(\n packageFile: string,\n config: NpmrcConfig,\n): Promise<NpmrcResult> {\n const npmrcFileName = await findLocalSiblingOrParent(packageFile, '.npmrc');\n if (!npmrcFileName) {\n return {\n npmrc: applyConfigNpmrc(config, undefined),\n npmrcFileName,\n };\n }\n\n return { ...(await readRepoNpmrc(npmrcFileName, config)), npmrcFileName };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"npmrc.js","names":[],"sources":["../../../../lib/modules/manager/npm/npmrc.ts"],"sourcesContent":["import { isString, isUndefined } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { hasUrlCredentials } from '../../../util/url.ts';\nimport type { NpmrcPackageFile } from '../types.ts';\nimport { parseNpmrc, renderNpmrc } from './npmrc-parser.ts';\nimport type {\n NpmManagerData,\n NpmrcConfig,\n NpmrcLine,\n NpmrcLineEnding,\n NpmrcResult,\n NpmrcSettingLine,\n SanitizedRepoNpmrc,\n} from './types.ts';\n\n/**\n * Mirrors npm's environment-reference grammar. Escape handling remains\n * procedural because RE2 does not support lookbehind.\n */\nconst environmentVariableReferenceRegex = regEx(\n // oxlint-disable-next-line prefer-named-capture-group -- Only the full match and its position are used.\n /\\$\\{([^${}?]+)(\\?)?\\}/g,\n);\n\nfunction containsEnvironmentVariableReference(value: unknown): boolean {\n if (!isString(value)) {\n return false;\n }\n\n for (const match of value.matchAll(environmentVariableReferenceRegex)) {\n let escapeCount = 0;\n let escapeIndex = match.index - 1;\n while (value[escapeIndex] === '\\\\') {\n escapeCount += 1;\n escapeIndex -= 1;\n }\n\n if (escapeCount % 2 === 0) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasEnvironmentVariableReference(line: NpmrcSettingLine): boolean {\n return (\n containsEnvironmentVariableReference(line.key) ||\n containsEnvironmentVariableReference(line.value)\n );\n}\n\nfunction sanitizeRepoNpmrc(\n repoNpmrc: string,\n npmrcFileName: string,\n): SanitizedRepoNpmrc {\n const document = parseNpmrc(repoNpmrc);\n const retainedLines: NpmrcLine[] = [];\n const allowEnvironmentVariableReferences = GlobalConfig.get('exposeAllEnv');\n let removedEnvironmentVariableReferenceLine = false;\n let removedPackageLockSetting = false;\n\n for (const line of document.lines) {\n if (line.type !== 'setting' || line.section !== null) {\n retainedLines.push(line);\n continue;\n }\n\n if (line.key === 'package-lock') {\n removedPackageLockSetting = true;\n continue;\n }\n\n if (\n !allowEnvironmentVariableReferences &&\n hasEnvironmentVariableReference(line)\n ) {\n removedEnvironmentVariableReferenceLine = true;\n continue;\n }\n\n retainedLines.push(line);\n }\n\n if (removedPackageLockSetting) {\n logger.debug('Stripping package-lock setting from .npmrc');\n }\n\n if (removedEnvironmentVariableReferenceLine) {\n logger.debug(\n { npmrcFileName },\n 'Stripping .npmrc file of lines with variables',\n );\n }\n\n return {\n fileName: npmrcFileName,\n content: renderNpmrc(retainedLines),\n detectedLineEnding: document.detectedLineEnding,\n };\n}\n\nfunction mergeNpmrcDocuments(\n configNpmrc: string | undefined,\n sanitizedRepoNpmrc: SanitizedRepoNpmrc,\n): string {\n if (!configNpmrc) {\n return sanitizedRepoNpmrc.content;\n }\n\n const configDocument = parseNpmrc(configNpmrc);\n if (configDocument.trailingLineEnding) {\n return `${configNpmrc}${sanitizedRepoNpmrc.content}`;\n }\n\n const separator: Exclude<NpmrcLineEnding, ''> =\n configDocument.detectedLineEnding ??\n sanitizedRepoNpmrc.detectedLineEnding ??\n '\\n';\n\n return `${configNpmrc}${separator}${sanitizedRepoNpmrc.content}`;\n}\n\n/**\n * Whether the repository `.npmrc` is ignored in favour of a configured `npmrc` without `npmrcMerge`.\n */\nfunction isRepoNpmrcIgnored(config: NpmrcConfig): boolean {\n return isString(config.npmrc) && !config.npmrcMerge;\n}\n\n/**\n * Combines the configured `npmrc` with the sanitized repository `.npmrc`, honouring `npmrcMerge`.\n *\n * @returns the `npmrc` to use for the package file, or `undefined` when there is neither\n */\nexport function applyConfigNpmrc(\n config: NpmrcConfig,\n repoNpmrc: SanitizedRepoNpmrc | undefined,\n): string | undefined {\n if (!repoNpmrc) {\n return isString(config.npmrc) ? config.npmrc : undefined;\n }\n\n if (isRepoNpmrcIgnored(config)) {\n logger.info(\n { npmrcFileName: repoNpmrc.fileName },\n 'Repo .npmrc file is ignored due to config.npmrc with config.npmrcMerge=false',\n );\n\n return config.npmrc;\n }\n\n return mergeNpmrcDocuments(config.npmrc, repoNpmrc);\n}\n\n/**\n * The npm settings holding a secret: the auth settings, and `key` with an inline client key; `username`, `email`, `cert`, `certfile` and `keyfile` are not.\n *\n * @see https://docs.npmjs.com/cli/configuring-npm/npmrc#auth-related-configuration\n */\nconst credentialKeyRegex = regEx(/(?:^|:)(?:_auth|_authToken|_password|key)$/i);\n\nconst singleEnvironmentVariableReferenceRegex = regEx(\n /^\\$\\{[a-z_][a-z\\d_]*\\}$/i,\n);\n\n/**\n * Whether `value` is exactly one `${NAME}` environment variable reference.\n */\nfunction isSingleEnvironmentVariableReference(value: unknown): boolean {\n return isString(value) && singleEnvironmentVariableReferenceRegex.test(value);\n}\n\nfunction hasRegistryUrlCredentials(value: unknown): boolean {\n if (!isString(value)) {\n return false;\n }\n // a protocol-relative registry URL is given a scheme, which `hasUrlCredentials()` looks for\n return hasUrlCredentials(value.startsWith('//') ? `https:${value}` : value);\n}\n\n/**\n * Whether the registry URL of a `//host/:setting` or `https://host/:setting` key, the part before its last `:`, carries credentials.\n */\nfunction hasKeyUrlCredentials(key: string): boolean {\n const separatorIndex = key.lastIndexOf(':');\n if (separatorIndex === -1) {\n return false;\n }\n return hasRegistryUrlCredentials(key.slice(0, separatorIndex));\n}\n\n/**\n * Whether the sanitized repository `.npmrc` carries credentials: an `_auth`, `_authToken`, `_password` or `key` setting other than exactly one `${NAME}` reference, or a URL with credentials in its userinfo, in a setting's key or value.\n */\nexport function hasNpmrcCredentials(repoNpmrc: SanitizedRepoNpmrc): boolean {\n const settings = parseNpmrc(repoNpmrc.content).lines.filter(\n (line): line is NpmrcSettingLine => line.type === 'setting',\n );\n for (const line of settings) {\n if (hasKeyUrlCredentials(line.key)) {\n return true;\n }\n // an environment variable reference is only replaced when the `.npmrc` is used, so the stored value is not a credential\n if (isSingleEnvironmentVariableReference(line.value)) {\n continue;\n }\n if (\n credentialKeyRegex.test(line.key) ||\n hasRegistryUrlCredentials(line.value)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Matches the characters which start a comment in an `.npmrc`, at the start of a line or inline.\n */\nconst npmrcCommentRegex = regEx(/[#;]/);\n\n/**\n * Whether the repository `.npmrc` has content `hasNpmrcCredentials()` does not read: a `#` or `;` anywhere, which may start a comment, or a non-blank line which is neither a setting nor a section.\n */\nfunction hasUnreadContent(repoNpmrc: SanitizedRepoNpmrc): boolean {\n return (\n npmrcCommentRegex.test(repoNpmrc.content) ||\n parseNpmrc(repoNpmrc.content).lines.some(\n (line) => line.type === 'other' && !!line.raw.trim(),\n )\n );\n}\n\n/**\n * Why a repository `.npmrc` is not cached: it carries credentials, or has content which is not checked for credentials.\n */\ntype UncachedNpmrcReason = 'credentials' | 'unread-content';\n\n/**\n * Returns why `repoNpmrc` is not cached, or `null` when it is cached.\n */\nfunction getUncachedNpmrcReason(\n repoNpmrc: SanitizedRepoNpmrc,\n): UncachedNpmrcReason | null {\n if (hasNpmrcCredentials(repoNpmrc)) {\n return 'credentials';\n }\n if (hasUnreadContent(repoNpmrc)) {\n return 'unread-content';\n }\n return null;\n}\n\n/**\n * Returns shallow copies of the package files without their `npmrc`, as they are put into the repository cache.\n *\n * A repository `.npmrc` carrying credentials, or with a comment or another line which is not checked for credentials, is dropped as well and the copy is marked with its `uncachedNpmrcFileName`. So is a copy of a package file with an `npmrcFileName` but without `npmrc`, whose repository `.npmrc` cannot be read.\n */\nexport function stripNpmrc(\n packageFiles: NpmrcPackageFile<NpmManagerData>[],\n): NpmrcPackageFile<NpmManagerData>[] {\n const result: NpmrcPackageFile<NpmManagerData>[] = [];\n // the workspaces of a monorepo share one `.npmrc`, which is classified once\n const reasonByContent = new Map<string, UncachedNpmrcReason | null>();\n for (const packageFile of packageFiles) {\n const copy = { ...packageFile };\n delete copy.npmrc;\n // read from disk again, so that the configured `npmrc` is not used in its place when the package file is restored\n const npmrcFileName = copy.managerData?.npmrcFileName;\n if (npmrcFileName && !isString(packageFile.npmrc)) {\n copy.managerData = {\n ...copy.managerData,\n uncachedNpmrcFileName: npmrcFileName,\n };\n }\n const repoNpmrc = copy.managerData?.repoNpmrc;\n if (repoNpmrc) {\n let reason = reasonByContent.get(repoNpmrc.content);\n if (reason === undefined) {\n reason = getUncachedNpmrcReason(repoNpmrc);\n reasonByContent.set(repoNpmrc.content, reason);\n }\n if (reason === 'credentials') {\n logger.once.warn(\n { npmrcFileName: repoNpmrc.fileName },\n 'A repository .npmrc contains credentials, which are not cached: configure them through hostRules or the npmrc option instead',\n );\n } else if (reason === 'unread-content') {\n logger.once.debug(\n { npmrcFileName: repoNpmrc.fileName },\n 'A repository .npmrc contains comments or lines which are not settings, so it is not cached',\n );\n }\n if (reason) {\n copy.managerData = {\n ...copy.managerData,\n uncachedNpmrcFileName: repoNpmrc.fileName,\n };\n delete copy.managerData.repoNpmrc;\n }\n }\n result.push(copy);\n }\n return result;\n}\n\n/**\n * Whether `packageFile` was extracted with an `npmrc` from `resolveNpmrc()`, which also sets its `npmrcFileName`, `null` without a repository `.npmrc`.\n */\nfunction hasResolvedNpmrc(\n packageFile: NpmrcPackageFile<NpmManagerData>,\n): boolean {\n return !isUndefined(packageFile.managerData?.npmrcFileName);\n}\n\n/**\n * Returns shallow copies of cached package files with their `npmrc` rebuilt from the cached repository `.npmrc` and the config, or read from disk again for a file with an `uncachedNpmrcFileName`.\n * A package file extracted without `npmrc`, such as a `pnpm-workspace.yaml` or `.yarnrc.yml` catalog, is copied without one.\n */\nexport async function restoreNpmrc(\n packageFiles: NpmrcPackageFile<NpmManagerData>[],\n config: NpmrcConfig,\n): Promise<NpmrcPackageFile<NpmManagerData>[]> {\n const result: NpmrcPackageFile<NpmManagerData>[] = [];\n // the workspaces of a monorepo share one `.npmrc`, which is read once\n const npmrcByFileName = new Map<string, string | undefined>();\n for (const packageFile of packageFiles) {\n if (!hasResolvedNpmrc(packageFile)) {\n result.push({ ...packageFile });\n continue;\n }\n let npmrc: string | undefined;\n const uncachedNpmrcFileName =\n packageFile.managerData?.uncachedNpmrcFileName;\n if (uncachedNpmrcFileName) {\n if (!npmrcByFileName.has(uncachedNpmrcFileName)) {\n const read = await readRepoNpmrc(uncachedNpmrcFileName, config);\n npmrcByFileName.set(uncachedNpmrcFileName, read.npmrc);\n }\n npmrc = npmrcByFileName.get(uncachedNpmrcFileName);\n } else {\n npmrc = applyConfigNpmrc(config, packageFile.managerData?.repoNpmrc);\n }\n result.push({ ...packageFile, ...(isString(npmrc) && { npmrc }) });\n }\n return result;\n}\n\n/**\n * Whether any of the cached package files has an `uncachedNpmrcFileName`.\n */\nexport function hasUncachedNpmrc(\n packageFiles: NpmrcPackageFile<NpmManagerData>[],\n): boolean {\n return packageFiles.some(\n (packageFile) => !!packageFile.managerData?.uncachedNpmrcFileName,\n );\n}\n\n/**\n * Reads and sanitizes the repository `.npmrc` and combines it with the configured `npmrc`.\n *\n * @returns the `npmrc` to use, `undefined` when the repository `.npmrc` cannot be read, and the sanitized repository `.npmrc` when it is readable and not ignored\n */\nasync function readRepoNpmrc(\n npmrcFileName: string,\n config: NpmrcConfig,\n): Promise<Omit<NpmrcResult, 'npmrcFileName'>> {\n const content = await readLocalFile(npmrcFileName, 'utf8');\n if (!isString(content)) {\n return { npmrc: undefined };\n }\n\n const repoNpmrc = sanitizeRepoNpmrc(content, npmrcFileName);\n const npmrc = applyConfigNpmrc(config, repoNpmrc);\n if (isRepoNpmrcIgnored(config)) {\n return { npmrc };\n }\n return { npmrc, repoNpmrc };\n}\n\nexport async function resolveNpmrc(\n packageFile: string,\n config: NpmrcConfig,\n): Promise<NpmrcResult> {\n const npmrcFileName = await findLocalSiblingOrParent(packageFile, '.npmrc');\n if (!npmrcFileName) {\n return {\n npmrc: applyConfigNpmrc(config, undefined),\n npmrcFileName,\n };\n }\n\n return { ...(await readRepoNpmrc(npmrcFileName, config)), npmrcFileName };\n}\n"],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ import { fetchUpdates } from "./fetch.js";
|
|
|
22
22
|
import { calculateLibYears } from "./libyear.js";
|
|
23
23
|
import { sortBranches } from "./sort.js";
|
|
24
24
|
import { writeUpdates } from "./write.js";
|
|
25
|
-
import { isNonEmptyArray, isTruthy } from "@sindresorhus/is";
|
|
25
|
+
import { isArray, isNonEmptyArray, isString, isTruthy } from "@sindresorhus/is";
|
|
26
26
|
// istanbul ignore next
|
|
27
27
|
function extractStats(packageFiles) {
|
|
28
28
|
if (!packageFiles) return null;
|
|
@@ -146,14 +146,15 @@ function customRegistryDatasources(deps) {
|
|
|
146
146
|
function detachRegistryUrlCredentials(packageFiles) {
|
|
147
147
|
let hadCredentials = false;
|
|
148
148
|
function detach(url, hostTypes) {
|
|
149
|
+
if (!isString(url)) return url;
|
|
149
150
|
hadCredentials ||= hostTypes.length > 0 && hasUrlCredentials(url);
|
|
150
151
|
return detachUrlCredentials(url, hostTypes);
|
|
151
152
|
}
|
|
152
153
|
for (const files of Object.values(coerceObject(packageFiles))) for (const file of files) {
|
|
153
154
|
const hostTypes = datasourceHostTypes(customRegistryDatasources([{ datasource: file.datasource }, ...file.deps]));
|
|
154
|
-
file.registryUrls = file.registryUrls
|
|
155
|
-
file.additionalRegistryUrls = file.additionalRegistryUrls
|
|
156
|
-
for (const dep of file.deps) dep.registryUrls = dep.registryUrls
|
|
155
|
+
if (isArray(file.registryUrls)) file.registryUrls = file.registryUrls.map((url) => detach(url, hostTypes));
|
|
156
|
+
if (isArray(file.additionalRegistryUrls)) file.additionalRegistryUrls = file.additionalRegistryUrls.map((url) => detach(url, hostTypes));
|
|
157
|
+
for (const dep of file.deps) if (isArray(dep.registryUrls)) dep.registryUrls = dep.registryUrls.map((url) => detach(url, datasourceHostTypes(customRegistryDatasources([dep]))));
|
|
157
158
|
}
|
|
158
159
|
return hadCredentials;
|
|
159
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-update.js","names":[],"sources":["../../../../lib/workers/repository/process/extract-update.ts"],"sourcesContent":["import { isNonEmptyArray, isTruthy } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n getDatasourceFor,\n getDatasourceHostType,\n} from '../../../modules/datasource/common.ts';\nimport { hashMap } from '../../../modules/manager/index.ts';\nimport {\n needsNpmrcFromDisk,\n withNpmrc,\n withoutNpmrc,\n} from '../../../modules/manager/npmrc.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { isNotNullOrUndefined } from '../../../util/array.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { BaseBranchCache } from '../../../util/cache/repository/types.ts';\nimport { checkGithubToken as ensureGithubToken } from '../../../util/check-token.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { fingerprint } from '../../../util/fingerprint.ts';\nimport { detachUrlCredentials } from '../../../util/host-rules.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport {\n containsUrlCredentials,\n hasUrlCredentials,\n} from '../../../util/url.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport { generateFingerprintConfig } from '../extract/extract-fingerprint-config.ts';\nimport { extractAllDependencies } from '../extract/index.ts';\nimport { branchifyUpgrades } from '../updates/branchify.ts';\nimport { fetchUpdates } from './fetch.ts';\nimport { calculateLibYears } from './libyear.ts';\nimport { sortBranches } from './sort.ts';\nimport { Vulnerabilities } from './vulnerabilities.ts';\nimport type { WriteUpdateResult } from './write.ts';\nimport { writeUpdates } from './write.ts';\n\n// Increment this if needing to cache bust ALL extract caches\nexport const EXTRACT_CACHE_REVISION = 1;\n\nexport interface ExtractResult {\n branches: BranchConfig[];\n branchList: string[];\n packageFiles: Record<string, PackageFile[]>;\n}\n\nexport interface StatsResult {\n fileCount: number;\n depCount: number;\n}\n\nexport interface Stats {\n managers: Record<string, StatsResult>;\n total: StatsResult;\n}\n\n// istanbul ignore next\nfunction extractStats(\n packageFiles: Record<string, PackageFile[]>,\n): Stats | null {\n if (!packageFiles) {\n return null;\n }\n const stats: Stats = {\n managers: {},\n total: {\n fileCount: 0,\n depCount: 0,\n },\n };\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n const fileCount = managerPackageFiles.length;\n let depCount = 0;\n for (const file of managerPackageFiles) {\n depCount += file.deps.length;\n }\n stats.managers[manager] = {\n fileCount,\n depCount,\n };\n stats.total.fileCount += fileCount;\n stats.total.depCount += depCount;\n }\n return stats;\n}\n\nexport function isCacheExtractValid(\n baseBranchSha: string,\n configHash: string,\n cachedExtract?: BaseBranchCache,\n): boolean {\n if (!cachedExtract) {\n return false;\n }\n\n if (!cachedExtract.revision) {\n logger.debug('Cached extract is missing revision, so cannot be used');\n return false;\n }\n\n if (cachedExtract.revision !== EXTRACT_CACHE_REVISION) {\n logger.debug(\n `Extract cache revision has changed (old=${cachedExtract.revision}, new=${EXTRACT_CACHE_REVISION})`,\n );\n return false;\n }\n\n if (!(cachedExtract.sha && cachedExtract.configHash)) {\n return false;\n }\n if (cachedExtract.sha !== baseBranchSha) {\n logger.debug(\n `Cached extract result cannot be used due to base branch SHA change (old=${cachedExtract.sha}, new=${baseBranchSha})`,\n );\n return false;\n }\n if (cachedExtract.configHash !== configHash) {\n logger.debug('Cached extract result cannot be used due to config change');\n return false;\n }\n if (!cachedExtract.extractionFingerprints) {\n logger.debug(\n 'Cached extract is missing extractionFingerprints, so cannot be used',\n );\n return false;\n }\n const changedManagers = new Set();\n for (const [manager, fingerprint] of Object.entries(\n cachedExtract.extractionFingerprints,\n )) {\n if (fingerprint !== hashMap.get(manager)) {\n changedManagers.add(manager);\n }\n }\n if (changedManagers.size > 0) {\n logger.debug(\n { changedManagers: [...changedManagers] },\n 'Manager fingerprint(s) have changed, extract cache cannot be reused',\n );\n return false;\n }\n if (containsUrlCredentials(cachedExtract.packageFiles)) {\n logger.debug('Cached extract has URLs with credentials, so cannot be used');\n return false;\n }\n logger.debug(\n `Cached extract for sha=${baseBranchSha} is valid and can be used`,\n );\n return true;\n}\n\nexport async function extract(\n config: RenovateConfig,\n overwriteCache = true,\n): Promise<Record<string, PackageFile[]>> {\n logger.debug('extract()');\n const { baseBranch } = config;\n const baseBranchSha = await scm.getBranchCommit(baseBranch!);\n let packageFiles: Record<string, PackageFile[]>;\n const cache = getCache();\n cache.scan ??= {};\n const cachedExtract = cache.scan[baseBranch!];\n const configHash = instrument('fingerprint', () =>\n fingerprint(generateFingerprintConfig(config)),\n );\n if (\n overwriteCache &&\n isCacheExtractValid(baseBranchSha!, configHash, cachedExtract)\n ) {\n if (needsNpmrcFromDisk(cachedExtract.packageFiles)) {\n // a repository `.npmrc` with credentials is not cached, so it is read from the base branch again\n await instrument(\n 'checkoutBranch',\n async () => await scm.checkoutBranch(baseBranch!),\n );\n }\n // the merged `npmrc` is not cached, so it is rebuilt from the cached repository `.npmrc` and the config\n packageFiles = await withNpmrc(clone(cachedExtract.packageFiles), config);\n } else {\n await instrument(\n 'checkoutBranch',\n async () => await scm.checkoutBranch(baseBranch!),\n );\n const extractResult = await instrument(\n 'extractAllDependencies',\n async () => (await extractAllDependencies(config)) || {},\n );\n packageFiles = extractResult.packageFiles;\n const { extractionFingerprints } = extractResult;\n // before caching, as the host rules for the credentials are registered for this run only, and the cache keeps copies of the package files\n const registryUrlsHadCredentials =\n detachRegistryUrlCredentials(packageFiles);\n // the merged `npmrc` carries the configured one, which may hold credentials\n const cachedPackageFiles = overwriteCache\n ? withoutNpmrc(packageFiles)\n : undefined;\n // the registry URLs held their credentials before they were detached, the other strings are checked on what would be cached\n const hasUrlCredentials =\n overwriteCache &&\n (registryUrlsHadCredentials ||\n containsUrlCredentials(cachedPackageFiles));\n\n if (hasUrlCredentials) {\n logger.once.warn(\n { baseBranch },\n 'The package files contain URLs with credentials, so the extract result is not cached: configure the credentials through hostRules instead',\n );\n delete cache.scan[baseBranch!];\n } else if (cachedPackageFiles) {\n // TODO: fix types (#22198)\n cache.scan[baseBranch!] = {\n revision: EXTRACT_CACHE_REVISION,\n sha: baseBranchSha!,\n configHash,\n extractionFingerprints,\n // a deep copy, as `withoutNpmrc()` copies the package files shallowly and the lookup adds its results to the deps\n packageFiles: clone(cachedPackageFiles),\n };\n }\n\n // Clean up cached branch extracts\n const baseBranches = isNonEmptyArray(config.baseBranches)\n ? config.baseBranches\n : [baseBranch];\n Object.keys(cache.scan).forEach((branchName) => {\n if (!baseBranches.includes(branchName)) {\n delete cache.scan![branchName];\n }\n });\n }\n const stats = extractStats(packageFiles);\n logger.info(\n { baseBranch: config.baseBranch, stats },\n `Dependency extraction complete`,\n );\n logger.trace({ config: packageFiles }, 'packageFiles');\n ensureGithubToken(packageFiles);\n return packageFiles;\n}\n\n/**\n * Returns the host types the known datasources among `datasources` request with, such as `custom` for `custom.<name>`.\n */\nfunction datasourceHostTypes(datasources: (string | undefined)[]): string[] {\n const hostTypes = datasources\n .filter(isTruthy)\n .map((datasource) => getDatasourceHostType(datasource))\n .filter(isTruthy);\n return [...new Set(hostTypes)];\n}\n\n/**\n * Returns the datasources of `deps` which support custom registry URLs for their package.\n */\nfunction customRegistryDatasources(\n deps: Pick<\n PackageFile['deps'][number],\n 'datasource' | 'packageName' | 'depName'\n >[],\n): string[] {\n return deps\n .filter(({ datasource, packageName, depName }) =>\n getDatasourceFor(datasource ?? '')?.supportsCustomRegistry(\n packageName ?? depName ?? '',\n ),\n )\n .map(({ datasource }) => datasource!);\n}\n\n/**\n * Moves the credentials of every extracted registry URL into host rules for the current run, for the datasources which support custom registry URLs; the URLs of other datasources lose their credentials.\n *\n * @returns whether a registry URL of a datasource which supports custom registry URLs held credentials according to `hasUrlCredentials()`\n */\nfunction detachRegistryUrlCredentials(\n packageFiles: Record<string, PackageFile[]>,\n): boolean {\n let hadCredentials = false;\n\n function detach(url: string, hostTypes: string[]): string {\n hadCredentials ||= hostTypes.length > 0 && hasUrlCredentials(url);\n return detachUrlCredentials(url, hostTypes);\n }\n\n // `extractAllDependencies` may have yielded nothing\n for (const files of Object.values(coerceObject(packageFiles))) {\n for (const file of files) {\n // the URLs of a package file are requested with the datasources of its dependencies\n const hostTypes = datasourceHostTypes(\n customRegistryDatasources([\n { datasource: file.datasource },\n ...file.deps,\n ]),\n );\n file.registryUrls = file.registryUrls?.map((url) =>\n detach(url, hostTypes),\n );\n file.additionalRegistryUrls = file.additionalRegistryUrls?.map((url) =>\n detach(url, hostTypes),\n );\n for (const dep of file.deps) {\n dep.registryUrls = dep.registryUrls?.map((url) =>\n detach(url, datasourceHostTypes(customRegistryDatasources([dep]))),\n );\n }\n }\n }\n return hadCredentials;\n}\n\nasync function fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<void> {\n if (config.osvVulnerabilityAlerts) {\n logger.debug('fetchVulnerabilities() - osvVulnerabilityAlerts=true');\n try {\n const vulnerabilities = await Vulnerabilities.create();\n await vulnerabilities.appendVulnerabilityPackageRules(\n config,\n packageFiles,\n );\n } catch (err) {\n logger.warn({ err }, 'Unable to read vulnerability information');\n }\n }\n}\n\nexport async function lookup(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<ExtractResult> {\n await fetchVulnerabilities(config, packageFiles);\n await fetchUpdates(config, packageFiles);\n // call this twice, as the second time, the updates will be availalbe for malicious package checks\n // TODO: this will be refactored as part of #42423\n await fetchVulnerabilities(config, packageFiles);\n memCache.cleanDatasourceKeys();\n calculateLibYears(config, packageFiles);\n const { branches, branchList } = await branchifyUpgrades(\n config,\n packageFiles,\n );\n reportMaliciousSkippedDependencies(packageFiles);\n logger.debug(\n { baseBranch: config.baseBranch, config: packageFiles },\n 'packageFiles with updates',\n );\n sortBranches(branches);\n return { branches, branchList, packageFiles };\n}\n\nexport function reportMaliciousSkippedDependencies(\n allPackageFiles: Record<string, PackageFile[]>,\n): void {\n if (allPackageFiles === undefined) {\n return;\n }\n\n for (const [manager, packageFiles] of Object.entries(allPackageFiles)) {\n for (const packageFile of packageFiles) {\n for (const dep of packageFile.deps) {\n if (dep.skipReason === 'malicious-version-in-use') {\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n },\n 'Dependency is currently using a malicious version',\n );\n\n // and make sure that it then gets updates proposed in the update phase\n delete dep.skipReason;\n delete dep.skipStage;\n } else if (dep.skipReason === 'malicious-update-proposed') {\n const newVersions = dep.updates\n ?.map((u) => u.newVersion ?? u.newValue)\n .filter(isNotNullOrUndefined);\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n newVersions,\n },\n 'Dependency has update(s) proposed which would update you to a malicious version - skipping',\n );\n }\n }\n }\n }\n}\n\nexport function update(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n return writeUpdates(config, branches);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract-update.js","names":[],"sources":["../../../../lib/workers/repository/process/extract-update.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isString, isTruthy } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport {\n getDatasourceFor,\n getDatasourceHostType,\n} from '../../../modules/datasource/common.ts';\nimport { hashMap } from '../../../modules/manager/index.ts';\nimport {\n needsNpmrcFromDisk,\n withNpmrc,\n withoutNpmrc,\n} from '../../../modules/manager/npmrc.ts';\nimport type { PackageFile } from '../../../modules/manager/types.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { isNotNullOrUndefined } from '../../../util/array.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { BaseBranchCache } from '../../../util/cache/repository/types.ts';\nimport { checkGithubToken as ensureGithubToken } from '../../../util/check-token.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { fingerprint } from '../../../util/fingerprint.ts';\nimport { detachUrlCredentials } from '../../../util/host-rules.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport {\n containsUrlCredentials,\n hasUrlCredentials,\n} from '../../../util/url.ts';\nimport type { BranchConfig } from '../../types.ts';\nimport { generateFingerprintConfig } from '../extract/extract-fingerprint-config.ts';\nimport { extractAllDependencies } from '../extract/index.ts';\nimport { branchifyUpgrades } from '../updates/branchify.ts';\nimport { fetchUpdates } from './fetch.ts';\nimport { calculateLibYears } from './libyear.ts';\nimport { sortBranches } from './sort.ts';\nimport { Vulnerabilities } from './vulnerabilities.ts';\nimport type { WriteUpdateResult } from './write.ts';\nimport { writeUpdates } from './write.ts';\n\n// Increment this if needing to cache bust ALL extract caches\nexport const EXTRACT_CACHE_REVISION = 1;\n\nexport interface ExtractResult {\n branches: BranchConfig[];\n branchList: string[];\n packageFiles: Record<string, PackageFile[]>;\n}\n\nexport interface StatsResult {\n fileCount: number;\n depCount: number;\n}\n\nexport interface Stats {\n managers: Record<string, StatsResult>;\n total: StatsResult;\n}\n\n// istanbul ignore next\nfunction extractStats(\n packageFiles: Record<string, PackageFile[]>,\n): Stats | null {\n if (!packageFiles) {\n return null;\n }\n const stats: Stats = {\n managers: {},\n total: {\n fileCount: 0,\n depCount: 0,\n },\n };\n for (const [manager, managerPackageFiles] of Object.entries(packageFiles)) {\n const fileCount = managerPackageFiles.length;\n let depCount = 0;\n for (const file of managerPackageFiles) {\n depCount += file.deps.length;\n }\n stats.managers[manager] = {\n fileCount,\n depCount,\n };\n stats.total.fileCount += fileCount;\n stats.total.depCount += depCount;\n }\n return stats;\n}\n\nexport function isCacheExtractValid(\n baseBranchSha: string,\n configHash: string,\n cachedExtract?: BaseBranchCache,\n): boolean {\n if (!cachedExtract) {\n return false;\n }\n\n if (!cachedExtract.revision) {\n logger.debug('Cached extract is missing revision, so cannot be used');\n return false;\n }\n\n if (cachedExtract.revision !== EXTRACT_CACHE_REVISION) {\n logger.debug(\n `Extract cache revision has changed (old=${cachedExtract.revision}, new=${EXTRACT_CACHE_REVISION})`,\n );\n return false;\n }\n\n if (!(cachedExtract.sha && cachedExtract.configHash)) {\n return false;\n }\n if (cachedExtract.sha !== baseBranchSha) {\n logger.debug(\n `Cached extract result cannot be used due to base branch SHA change (old=${cachedExtract.sha}, new=${baseBranchSha})`,\n );\n return false;\n }\n if (cachedExtract.configHash !== configHash) {\n logger.debug('Cached extract result cannot be used due to config change');\n return false;\n }\n if (!cachedExtract.extractionFingerprints) {\n logger.debug(\n 'Cached extract is missing extractionFingerprints, so cannot be used',\n );\n return false;\n }\n const changedManagers = new Set();\n for (const [manager, fingerprint] of Object.entries(\n cachedExtract.extractionFingerprints,\n )) {\n if (fingerprint !== hashMap.get(manager)) {\n changedManagers.add(manager);\n }\n }\n if (changedManagers.size > 0) {\n logger.debug(\n { changedManagers: [...changedManagers] },\n 'Manager fingerprint(s) have changed, extract cache cannot be reused',\n );\n return false;\n }\n if (containsUrlCredentials(cachedExtract.packageFiles)) {\n logger.debug('Cached extract has URLs with credentials, so cannot be used');\n return false;\n }\n logger.debug(\n `Cached extract for sha=${baseBranchSha} is valid and can be used`,\n );\n return true;\n}\n\nexport async function extract(\n config: RenovateConfig,\n overwriteCache = true,\n): Promise<Record<string, PackageFile[]>> {\n logger.debug('extract()');\n const { baseBranch } = config;\n const baseBranchSha = await scm.getBranchCommit(baseBranch!);\n let packageFiles: Record<string, PackageFile[]>;\n const cache = getCache();\n cache.scan ??= {};\n const cachedExtract = cache.scan[baseBranch!];\n const configHash = instrument('fingerprint', () =>\n fingerprint(generateFingerprintConfig(config)),\n );\n if (\n overwriteCache &&\n isCacheExtractValid(baseBranchSha!, configHash, cachedExtract)\n ) {\n if (needsNpmrcFromDisk(cachedExtract.packageFiles)) {\n // a repository `.npmrc` with credentials is not cached, so it is read from the base branch again\n await instrument(\n 'checkoutBranch',\n async () => await scm.checkoutBranch(baseBranch!),\n );\n }\n // the merged `npmrc` is not cached, so it is rebuilt from the cached repository `.npmrc` and the config\n packageFiles = await withNpmrc(clone(cachedExtract.packageFiles), config);\n } else {\n await instrument(\n 'checkoutBranch',\n async () => await scm.checkoutBranch(baseBranch!),\n );\n const extractResult = await instrument(\n 'extractAllDependencies',\n async () => (await extractAllDependencies(config)) || {},\n );\n packageFiles = extractResult.packageFiles;\n const { extractionFingerprints } = extractResult;\n // before caching, as the host rules for the credentials are registered for this run only, and the cache keeps copies of the package files\n const registryUrlsHadCredentials =\n detachRegistryUrlCredentials(packageFiles);\n // the merged `npmrc` carries the configured one, which may hold credentials\n const cachedPackageFiles = overwriteCache\n ? withoutNpmrc(packageFiles)\n : undefined;\n // the registry URLs held their credentials before they were detached, the other strings are checked on what would be cached\n const hasUrlCredentials =\n overwriteCache &&\n (registryUrlsHadCredentials ||\n containsUrlCredentials(cachedPackageFiles));\n\n if (hasUrlCredentials) {\n logger.once.warn(\n { baseBranch },\n 'The package files contain URLs with credentials, so the extract result is not cached: configure the credentials through hostRules instead',\n );\n delete cache.scan[baseBranch!];\n } else if (cachedPackageFiles) {\n // TODO: fix types (#22198)\n cache.scan[baseBranch!] = {\n revision: EXTRACT_CACHE_REVISION,\n sha: baseBranchSha!,\n configHash,\n extractionFingerprints,\n // a deep copy, as `withoutNpmrc()` copies the package files shallowly and the lookup adds its results to the deps\n packageFiles: clone(cachedPackageFiles),\n };\n }\n\n // Clean up cached branch extracts\n const baseBranches = isNonEmptyArray(config.baseBranches)\n ? config.baseBranches\n : [baseBranch];\n Object.keys(cache.scan).forEach((branchName) => {\n if (!baseBranches.includes(branchName)) {\n delete cache.scan![branchName];\n }\n });\n }\n const stats = extractStats(packageFiles);\n logger.info(\n { baseBranch: config.baseBranch, stats },\n `Dependency extraction complete`,\n );\n logger.trace({ config: packageFiles }, 'packageFiles');\n ensureGithubToken(packageFiles);\n return packageFiles;\n}\n\n/**\n * Returns the host types the known datasources among `datasources` request with, such as `custom` for `custom.<name>`.\n */\nfunction datasourceHostTypes(datasources: (string | undefined)[]): string[] {\n const hostTypes = datasources\n .filter(isTruthy)\n .map((datasource) => getDatasourceHostType(datasource))\n .filter(isTruthy);\n return [...new Set(hostTypes)];\n}\n\n/**\n * Returns the datasources of `deps` which support custom registry URLs for their package.\n */\nfunction customRegistryDatasources(\n deps: Pick<\n PackageFile['deps'][number],\n 'datasource' | 'packageName' | 'depName'\n >[],\n): string[] {\n return deps\n .filter(({ datasource, packageName, depName }) =>\n getDatasourceFor(datasource ?? '')?.supportsCustomRegistry(\n packageName ?? depName ?? '',\n ),\n )\n .map(({ datasource }) => datasource!);\n}\n\n/**\n * Moves the credentials of every extracted registry URL into host rules for the current run, for the datasources which support custom registry URLs; the URLs of other datasources lose their credentials.\n *\n * @returns whether a registry URL of a datasource which supports custom registry URLs held credentials according to `hasUrlCredentials()`\n */\nfunction detachRegistryUrlCredentials(\n packageFiles: Record<string, PackageFile[]>,\n): boolean {\n let hadCredentials = false;\n\n function detach(url: string, hostTypes: string[]): string {\n // managers may yield non-string entries despite the type\n if (!isString(url)) {\n return url;\n }\n hadCredentials ||= hostTypes.length > 0 && hasUrlCredentials(url);\n return detachUrlCredentials(url, hostTypes);\n }\n\n // `extractAllDependencies` may have yielded nothing\n for (const files of Object.values(coerceObject(packageFiles))) {\n for (const file of files) {\n // the URLs of a package file are requested with the datasources of its dependencies\n const hostTypes = datasourceHostTypes(\n customRegistryDatasources([\n { datasource: file.datasource },\n ...file.deps,\n ]),\n );\n // absent fields stay absent, so they don't override configured ones\n if (isArray(file.registryUrls)) {\n file.registryUrls = file.registryUrls.map((url) =>\n detach(url, hostTypes),\n );\n }\n if (isArray(file.additionalRegistryUrls)) {\n file.additionalRegistryUrls = file.additionalRegistryUrls.map((url) =>\n detach(url, hostTypes),\n );\n }\n for (const dep of file.deps) {\n if (isArray(dep.registryUrls)) {\n dep.registryUrls = dep.registryUrls.map((url) =>\n detach(url, datasourceHostTypes(customRegistryDatasources([dep]))),\n );\n }\n }\n }\n }\n return hadCredentials;\n}\n\nasync function fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<void> {\n if (config.osvVulnerabilityAlerts) {\n logger.debug('fetchVulnerabilities() - osvVulnerabilityAlerts=true');\n try {\n const vulnerabilities = await Vulnerabilities.create();\n await vulnerabilities.appendVulnerabilityPackageRules(\n config,\n packageFiles,\n );\n } catch (err) {\n logger.warn({ err }, 'Unable to read vulnerability information');\n }\n }\n}\n\nexport async function lookup(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n): Promise<ExtractResult> {\n await fetchVulnerabilities(config, packageFiles);\n await fetchUpdates(config, packageFiles);\n // call this twice, as the second time, the updates will be availalbe for malicious package checks\n // TODO: this will be refactored as part of #42423\n await fetchVulnerabilities(config, packageFiles);\n memCache.cleanDatasourceKeys();\n calculateLibYears(config, packageFiles);\n const { branches, branchList } = await branchifyUpgrades(\n config,\n packageFiles,\n );\n reportMaliciousSkippedDependencies(packageFiles);\n logger.debug(\n { baseBranch: config.baseBranch, config: packageFiles },\n 'packageFiles with updates',\n );\n sortBranches(branches);\n return { branches, branchList, packageFiles };\n}\n\nexport function reportMaliciousSkippedDependencies(\n allPackageFiles: Record<string, PackageFile[]>,\n): void {\n if (allPackageFiles === undefined) {\n return;\n }\n\n for (const [manager, packageFiles] of Object.entries(allPackageFiles)) {\n for (const packageFile of packageFiles) {\n for (const dep of packageFile.deps) {\n if (dep.skipReason === 'malicious-version-in-use') {\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n },\n 'Dependency is currently using a malicious version',\n );\n\n // and make sure that it then gets updates proposed in the update phase\n delete dep.skipReason;\n delete dep.skipStage;\n } else if (dep.skipReason === 'malicious-update-proposed') {\n const newVersions = dep.updates\n ?.map((u) => u.newVersion ?? u.newValue)\n .filter(isNotNullOrUndefined);\n logger.warn(\n {\n packageFile: packageFile.packageFile,\n depName: dep.depName,\n packageName: dep.packageName,\n manager: manager,\n datasource: dep.datasource,\n newVersions,\n },\n 'Dependency has update(s) proposed which would update you to a malicious version - skipping',\n );\n }\n }\n }\n }\n}\n\nexport function update(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n return writeUpdates(config, branches);\n}\n"],"mappings":"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"}
|
|
@@ -74,6 +74,12 @@ async function resolveUpdateDigest(config, res, dependency, update) {
|
|
|
74
74
|
newValue: update.newValue,
|
|
75
75
|
bucket: update.bucket
|
|
76
76
|
}, "Could not determine new digest for update.");
|
|
77
|
+
if (update.newValue && dependency?.releases.some((r) => r.version === `v${update.newValue}`)) logger.warn({
|
|
78
|
+
packageName: config.packageName,
|
|
79
|
+
datasource: config.datasource,
|
|
80
|
+
newValue: update.newValue,
|
|
81
|
+
suggestedValue: `v${update.newValue}`
|
|
82
|
+
}, "Could not determine new digest for update. Check the tag in the `newValue` - did you maybe mean the `suggestedValue`, with a `v` prefix?");
|
|
77
83
|
if (config.currentDigest) {
|
|
78
84
|
const packageName = withoutUrlCredentials(config.packageName);
|
|
79
85
|
res.warnings.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digest.js","names":[],"sources":["../../../../../lib/workers/repository/process/lookup/digest.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { mergeChildConfig } from '../../../../config/index.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type {\n GetDigestInputConfig,\n ReleaseResult,\n} from '../../../../modules/datasource/index.ts';\nimport { getDigest } from '../../../../modules/datasource/index.ts';\nimport type { LookupUpdate } from '../../../../modules/manager/types.ts';\nimport { checkMinimumReleaseAge } from '../../../../util/minimum-release-age.ts';\nimport type { Timestamp } from '../../../../util/timestamp.ts';\nimport { withoutUrlCredentials } from '../../../../util/url.ts';\nimport {\n missingReleaseTimestampWarning,\n resolveUpdateTypeConfig,\n} from './filter-checks.ts';\nimport type { LookupUpdateConfig, UpdateResult } from './types.ts';\n\n/** The only two `updateType`s that `applyMinimumReleaseAgeToDigestUpdate()` can be called with */\nexport type DigestLikeUpdate = LookupUpdate & {\n updateType: 'digest' | 'pinDigest';\n};\n\n/**\n * A helper function to allow a short-circuit for `minimumReleaseAge` functionality if a package may have config that applies it.\n *\n * Allows avoiding unnecessary calls to more expensive checks like merge + `applyPackageRules()` and `getTimestamp()`.\n */\nexport function couldApplyMinimumReleaseAgeToDigest(\n config: LookupUpdateConfig,\n updateType: DigestLikeUpdate['updateType'],\n): boolean {\n // Match filterInternalChecks(): under `none` the user opted out of internal\n // checks entirely, so do no merging, no package rules, no age check and no\n // logging claiming an age check ran.\n if (config.internalChecksFilter === 'none') {\n return false;\n }\n\n return (\n isNonEmptyString(config.minimumReleaseAge) ||\n isNonEmptyString(config[updateType]?.minimumReleaseAge) ||\n !!config.packageRules?.some((rule) =>\n isNonEmptyString(rule.minimumReleaseAge),\n )\n );\n}\n\n/**\n * Ensure `minimumReleaseAge`/`internalChecksFilter` applies to digest/pinDigest updates, as they don't currently get run through `filterInternalChecks()`.\n */\nexport async function applyMinimumReleaseAgeToDigestUpdate(\n update: DigestLikeUpdate,\n config: LookupUpdateConfig,\n res: UpdateResult,\n currentVersionWasResolved: boolean,\n newestMatchingVersionTimestamp: Timestamp | null | undefined,\n): Promise<void> {\n if (!couldApplyMinimumReleaseAgeToDigest(config, update.updateType)) {\n return;\n }\n\n if (update.updateType === 'pinDigest' && !currentVersionWasResolved) {\n // Not `!res.currentVersion` - that's force-set to lockedVersion further down regardless of timestamp resolution.\n // `pinDigest` doesn't repoint anywhere, unlike `digest` - it just freezes whatever the ref already resolves to.\n // An unversioned tag (e.g. `latest`) has no versioned release to age against, and holding the pin would only\n // prolong the less-pinned (less safe) state, so skip the check entirely rather than treating the missing\n // timestamp as pending.\n logger.once.debug(\n { depName: config.depName, updateType: update.updateType },\n `Skipping minimumReleaseAge check for ${update.updateType} update of ${config.depName}, as its current value does not resolve to a versioned release`,\n );\n return;\n }\n\n const releaseConfig = await resolveUpdateTypeConfig(\n mergeChildConfig(config, res),\n update.updateType,\n );\n\n // Not update.releaseTimestamp - that field means \"age of the new release\" elsewhere (generate.ts, libyear.ts).\n // Not res.currentVersionTimestamp either - that tracks whatever rangeStrategy resolves currentVersion to (e.g.\n // the oldest matching release under `bump`), whereas both `digest` and `pinDigest` reflect whatever the current\n // value's ref actually resolves to *right now*, which is always the newest matching version.\n const ageCheck = checkMinimumReleaseAge(\n releaseConfig,\n newestMatchingVersionTimestamp,\n );\n\n // Mirror filterInternalChecks()'s logging so a held/passed digest update is diagnosable.\n if (ageCheck.minimumReleaseAgeMs && !ageCheck.hasTimestamp) {\n if (releaseConfig.minimumReleaseAgeBehaviour === 'timestamp-optional') {\n logger.once.warn(missingReleaseTimestampWarning);\n }\n\n logger.once.debug(\n {\n depName: config.depName,\n updateType: update.updateType,\n minimumReleaseAgeBehaviour: releaseConfig.minimumReleaseAgeBehaviour,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update of ${config.depName} has no releaseTimestamp to age against`,\n );\n }\n if (ageCheck.isPending) {\n logger.trace(\n {\n depName: config.depName,\n updateType: update.updateType,\n releaseTimestamp: newestMatchingVersionTimestamp,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update is pending minimumReleaseAge status checks`,\n );\n\n // internalChecksFilter is read from the unmerged top-level config, like filterInternalChecks().\n if (config.internalChecksFilter === 'strict') {\n update.pendingChecks = true;\n }\n }\n}\n\nfunction getDigestInputConfig(\n config: LookupUpdateConfig,\n res: UpdateResult,\n update: LookupUpdate,\n): GetDigestInputConfig {\n const getDigestConfig: GetDigestInputConfig = {\n ...config,\n registryUrl: update.registryUrl ?? res.registryUrl,\n lookupName: res.lookupName,\n };\n\n // #20304 only pass it for replacement updates, otherwise we get wrong or invalid digest\n if (update.updateType !== 'replacement') {\n delete getDigestConfig.replacementName;\n }\n\n // #20304 don't use lookupName and currentDigest when we replace image name\n if (\n update.updateType === 'replacement' &&\n update.newName !== config.packageName\n ) {\n delete getDigestConfig.lookupName;\n delete getDigestConfig.currentDigest;\n getDigestConfig.replacementName = update.newName;\n }\n\n return getDigestConfig;\n}\n\nasync function resolveUpdateDigest(\n config: LookupUpdateConfig,\n res: UpdateResult,\n dependency: ReleaseResult | null,\n update: LookupUpdate,\n): Promise<void> {\n // Don't use current releases if replacement changes name, otherwise we use the wrong new digest.\n // This happens on datasources which return the digest in release info like `github-tags`.\n // We can still use it when only version is changing.\n if (\n update.updateType !== 'replacement' ||\n update.newName === config.packageName\n ) {\n update.newDigest ??= dependency?.releases.find(\n (r) => r.version === update.newValue,\n )?.newDigest;\n }\n\n update.newDigest ??= await getDigest(\n getDigestInputConfig(config, res, update),\n update.newValue,\n );\n\n // If the digest could not be determined, report this as otherwise the\n // update will be omitted later on without notice.\n if (update.newDigest === null) {\n logger.debug(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n datasource: config.datasource,\n newValue: update.newValue,\n bucket: update.bucket,\n },\n 'Could not determine new digest for update.',\n );\n\n // Only report a warning if there is a current digest.\n // Context: https://github.com/renovatebot/renovate/pull/20175#discussion_r1102615059.\n if (config.currentDigest) {\n const packageName = withoutUrlCredentials(config.packageName);\n res.warnings.push({\n message: `Could not determine new digest for update (${config.datasource} package ${packageName})`,\n topic: packageName,\n });\n }\n }\n}\n\n/**\n * Fill in `newDigest` (and, where a release came from another registry,\n * `registryUrl`) for every update.\n */\nexport async function resolveUpdateDigests(\n config: LookupUpdateConfig,\n res: UpdateResult,\n dependency: ReleaseResult | null,\n): Promise<void> {\n for (const update of res.updates) {\n // only update the digest in the package file if it's managed by us\n if (\n (config.pinDigests === true && !config.digestManagedExternally) ||\n config.currentDigest\n ) {\n await resolveUpdateDigest(config, res, dependency, update);\n } else {\n delete update.newDigest;\n }\n\n if (update.newVersion) {\n const registryUrl = dependency?.releases?.find(\n (release) => release.version === update.newVersion,\n )?.registryUrl;\n if (registryUrl && registryUrl !== res.registryUrl) {\n update.registryUrl = registryUrl;\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"digest.js","names":[],"sources":["../../../../../lib/workers/repository/process/lookup/digest.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { mergeChildConfig } from '../../../../config/index.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type {\n GetDigestInputConfig,\n ReleaseResult,\n} from '../../../../modules/datasource/index.ts';\nimport { getDigest } from '../../../../modules/datasource/index.ts';\nimport type { LookupUpdate } from '../../../../modules/manager/types.ts';\nimport { checkMinimumReleaseAge } from '../../../../util/minimum-release-age.ts';\nimport type { Timestamp } from '../../../../util/timestamp.ts';\nimport { withoutUrlCredentials } from '../../../../util/url.ts';\nimport {\n missingReleaseTimestampWarning,\n resolveUpdateTypeConfig,\n} from './filter-checks.ts';\nimport type { LookupUpdateConfig, UpdateResult } from './types.ts';\n\n/** The only two `updateType`s that `applyMinimumReleaseAgeToDigestUpdate()` can be called with */\nexport type DigestLikeUpdate = LookupUpdate & {\n updateType: 'digest' | 'pinDigest';\n};\n\n/**\n * A helper function to allow a short-circuit for `minimumReleaseAge` functionality if a package may have config that applies it.\n *\n * Allows avoiding unnecessary calls to more expensive checks like merge + `applyPackageRules()` and `getTimestamp()`.\n */\nexport function couldApplyMinimumReleaseAgeToDigest(\n config: LookupUpdateConfig,\n updateType: DigestLikeUpdate['updateType'],\n): boolean {\n // Match filterInternalChecks(): under `none` the user opted out of internal\n // checks entirely, so do no merging, no package rules, no age check and no\n // logging claiming an age check ran.\n if (config.internalChecksFilter === 'none') {\n return false;\n }\n\n return (\n isNonEmptyString(config.minimumReleaseAge) ||\n isNonEmptyString(config[updateType]?.minimumReleaseAge) ||\n !!config.packageRules?.some((rule) =>\n isNonEmptyString(rule.minimumReleaseAge),\n )\n );\n}\n\n/**\n * Ensure `minimumReleaseAge`/`internalChecksFilter` applies to digest/pinDigest updates, as they don't currently get run through `filterInternalChecks()`.\n */\nexport async function applyMinimumReleaseAgeToDigestUpdate(\n update: DigestLikeUpdate,\n config: LookupUpdateConfig,\n res: UpdateResult,\n currentVersionWasResolved: boolean,\n newestMatchingVersionTimestamp: Timestamp | null | undefined,\n): Promise<void> {\n if (!couldApplyMinimumReleaseAgeToDigest(config, update.updateType)) {\n return;\n }\n\n if (update.updateType === 'pinDigest' && !currentVersionWasResolved) {\n // Not `!res.currentVersion` - that's force-set to lockedVersion further down regardless of timestamp resolution.\n // `pinDigest` doesn't repoint anywhere, unlike `digest` - it just freezes whatever the ref already resolves to.\n // An unversioned tag (e.g. `latest`) has no versioned release to age against, and holding the pin would only\n // prolong the less-pinned (less safe) state, so skip the check entirely rather than treating the missing\n // timestamp as pending.\n logger.once.debug(\n { depName: config.depName, updateType: update.updateType },\n `Skipping minimumReleaseAge check for ${update.updateType} update of ${config.depName}, as its current value does not resolve to a versioned release`,\n );\n return;\n }\n\n const releaseConfig = await resolveUpdateTypeConfig(\n mergeChildConfig(config, res),\n update.updateType,\n );\n\n // Not update.releaseTimestamp - that field means \"age of the new release\" elsewhere (generate.ts, libyear.ts).\n // Not res.currentVersionTimestamp either - that tracks whatever rangeStrategy resolves currentVersion to (e.g.\n // the oldest matching release under `bump`), whereas both `digest` and `pinDigest` reflect whatever the current\n // value's ref actually resolves to *right now*, which is always the newest matching version.\n const ageCheck = checkMinimumReleaseAge(\n releaseConfig,\n newestMatchingVersionTimestamp,\n );\n\n // Mirror filterInternalChecks()'s logging so a held/passed digest update is diagnosable.\n if (ageCheck.minimumReleaseAgeMs && !ageCheck.hasTimestamp) {\n if (releaseConfig.minimumReleaseAgeBehaviour === 'timestamp-optional') {\n logger.once.warn(missingReleaseTimestampWarning);\n }\n\n logger.once.debug(\n {\n depName: config.depName,\n updateType: update.updateType,\n minimumReleaseAgeBehaviour: releaseConfig.minimumReleaseAgeBehaviour,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update of ${config.depName} has no releaseTimestamp to age against`,\n );\n }\n if (ageCheck.isPending) {\n logger.trace(\n {\n depName: config.depName,\n updateType: update.updateType,\n releaseTimestamp: newestMatchingVersionTimestamp,\n check: 'minimumReleaseAge',\n },\n `${update.updateType} update is pending minimumReleaseAge status checks`,\n );\n\n // internalChecksFilter is read from the unmerged top-level config, like filterInternalChecks().\n if (config.internalChecksFilter === 'strict') {\n update.pendingChecks = true;\n }\n }\n}\n\nfunction getDigestInputConfig(\n config: LookupUpdateConfig,\n res: UpdateResult,\n update: LookupUpdate,\n): GetDigestInputConfig {\n const getDigestConfig: GetDigestInputConfig = {\n ...config,\n registryUrl: update.registryUrl ?? res.registryUrl,\n lookupName: res.lookupName,\n };\n\n // #20304 only pass it for replacement updates, otherwise we get wrong or invalid digest\n if (update.updateType !== 'replacement') {\n delete getDigestConfig.replacementName;\n }\n\n // #20304 don't use lookupName and currentDigest when we replace image name\n if (\n update.updateType === 'replacement' &&\n update.newName !== config.packageName\n ) {\n delete getDigestConfig.lookupName;\n delete getDigestConfig.currentDigest;\n getDigestConfig.replacementName = update.newName;\n }\n\n return getDigestConfig;\n}\n\nasync function resolveUpdateDigest(\n config: LookupUpdateConfig,\n res: UpdateResult,\n dependency: ReleaseResult | null,\n update: LookupUpdate,\n): Promise<void> {\n // Don't use current releases if replacement changes name, otherwise we use the wrong new digest.\n // This happens on datasources which return the digest in release info like `github-tags`.\n // We can still use it when only version is changing.\n if (\n update.updateType !== 'replacement' ||\n update.newName === config.packageName\n ) {\n update.newDigest ??= dependency?.releases.find(\n (r) => r.version === update.newValue,\n )?.newDigest;\n }\n\n update.newDigest ??= await getDigest(\n getDigestInputConfig(config, res, update),\n update.newValue,\n );\n\n // If the digest could not be determined, report this as otherwise the\n // update will be omitted later on without notice.\n if (update.newDigest === null) {\n logger.debug(\n {\n packageName: config.packageName,\n currentValue: config.currentValue,\n datasource: config.datasource,\n newValue: update.newValue,\n bucket: update.bucket,\n },\n 'Could not determine new digest for update.',\n );\n\n // A tag such as `v1.2.3` is commonly referenced without its `v` prefix, which we treat as a misconfiguration rather than silently retrying with the prefix\n if (\n update.newValue &&\n dependency?.releases.some((r) => r.version === `v${update.newValue}`)\n ) {\n logger.warn(\n {\n packageName: config.packageName,\n datasource: config.datasource,\n newValue: update.newValue,\n suggestedValue: `v${update.newValue}`,\n },\n 'Could not determine new digest for update. Check the tag in the `newValue` - did you maybe mean the `suggestedValue`, with a `v` prefix?',\n );\n }\n\n // Only report a warning if there is a current digest.\n // Context: https://github.com/renovatebot/renovate/pull/20175#discussion_r1102615059.\n if (config.currentDigest) {\n const packageName = withoutUrlCredentials(config.packageName);\n res.warnings.push({\n message: `Could not determine new digest for update (${config.datasource} package ${packageName})`,\n topic: packageName,\n });\n }\n }\n}\n\n/**\n * Fill in `newDigest` (and, where a release came from another registry,\n * `registryUrl`) for every update.\n */\nexport async function resolveUpdateDigests(\n config: LookupUpdateConfig,\n res: UpdateResult,\n dependency: ReleaseResult | null,\n): Promise<void> {\n for (const update of res.updates) {\n // only update the digest in the package file if it's managed by us\n if (\n (config.pinDigests === true && !config.digestManagedExternally) ||\n config.currentDigest\n ) {\n await resolveUpdateDigest(config, res, dependency, update);\n } else {\n delete update.newDigest;\n }\n\n if (update.newVersion) {\n const registryUrl = dependency?.releases?.find(\n (release) => release.version === update.newVersion,\n )?.registryUrl;\n if (registryUrl && registryUrl !== res.registryUrl) {\n update.registryUrl = registryUrl;\n }\n }\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.175.
|
|
3
|
+
"title": "JSON schema for Renovate 44.175.3 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.175.
|
|
5
|
+
"x-renovate-version": "44.175.3",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|