renovate 43.271.0 → 43.271.2
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/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/util.js +3 -1
- package/dist/config/presets/util.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/logger/renovate-logger.js.map +1 -1
- package/dist/logger/with-sanitizer.js +2 -2
- package/dist/logger/with-sanitizer.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +3 -1
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/index.d.ts +2 -2
- package/dist/modules/datasource/index.js +6 -2
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js +9 -7
- package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
- package/dist/modules/datasource/sbt-package/index.js +5 -3
- package/dist/modules/datasource/sbt-package/index.js.map +1 -1
- package/dist/modules/datasource/sbt-plugin/index.js +2 -2
- package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +2 -2
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/custom/index.js.map +1 -1
- package/dist/modules/manager/deno/update.js +4 -2
- package/dist/modules/manager/deno/update.js.map +1 -1
- package/dist/modules/manager/deps-edn/parser.js +2 -2
- package/dist/modules/manager/deps-edn/parser.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +14 -14
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +3 -1
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/parser/assignments.js +22 -18
- package/dist/modules/manager/gradle/parser/assignments.js.map +1 -1
- package/dist/modules/manager/gradle/parser/common.js +12 -8
- package/dist/modules/manager/gradle/parser/common.js.map +1 -1
- package/dist/modules/manager/gradle/parser/objects.js +11 -9
- package/dist/modules/manager/gradle/parser/objects.js.map +1 -1
- package/dist/modules/manager/gradle/parser/registry-urls.js +6 -6
- package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
- package/dist/modules/manager/index.d.ts +2 -2
- package/dist/modules/manager/index.js +6 -2
- package/dist/modules/manager/index.js.map +1 -1
- package/dist/modules/manager/leiningen/extract.js +8 -4
- package/dist/modules/manager/leiningen/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js +13 -11
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js +3 -1
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/platform/azure/azure-helper.js +2 -2
- package/dist/modules/platform/azure/azure-helper.js.map +1 -1
- package/dist/modules/platform/bitbucket/comments.js +10 -4
- package/dist/modules/platform/bitbucket/comments.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +3 -1
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/index.js +13 -5
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/forgejo/forgejo-helper.js +3 -1
- package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
- package/dist/modules/platform/gitea/gitea-helper.js +3 -1
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/github/index.js +10 -4
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/massage-markdown-links.js +2 -2
- package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +10 -4
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/index.d.ts +1 -1
- package/dist/modules/platform/index.js +3 -1
- package/dist/modules/platform/index.js.map +1 -1
- package/dist/modules/versioning/cargo/index.js +15 -5
- package/dist/modules/versioning/cargo/index.js.map +1 -1
- package/dist/modules/versioning/go-mod-directive/index.js +9 -3
- package/dist/modules/versioning/go-mod-directive/index.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +17 -15
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/hex/index.js +6 -2
- package/dist/modules/versioning/hex/index.js.map +1 -1
- package/dist/modules/versioning/index.d.ts +2 -2
- package/dist/modules/versioning/index.js +6 -2
- package/dist/modules/versioning/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +5 -3
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/maven/index.js +23 -17
- package/dist/modules/versioning/maven/index.js.map +1 -1
- package/dist/modules/versioning/npm/index.js +6 -2
- package/dist/modules/versioning/npm/index.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +5 -3
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/ruby/index.js +39 -19
- package/dist/modules/versioning/ruby/index.js.map +1 -1
- package/dist/modules/versioning/ruby/operator.js +6 -2
- package/dist/modules/versioning/ruby/operator.js.map +1 -1
- package/dist/modules/versioning/ruby/range.js +4 -4
- package/dist/modules/versioning/ruby/range.js.map +1 -1
- package/dist/modules/versioning/ruby/version.js +35 -23
- package/dist/modules/versioning/ruby/version.js.map +1 -1
- package/dist/modules/versioning/semver/index.js +3 -1
- package/dist/modules/versioning/semver/index.js.map +1 -1
- package/dist/modules/versioning/semver-coerced/index.d.ts +1 -1
- package/dist/modules/versioning/semver-coerced/index.js +3 -1
- package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
- package/dist/modules/versioning/swift/index.js +6 -2
- package/dist/modules/versioning/swift/index.js.map +1 -1
- package/dist/util/cache/package/with-cache.js +4 -2
- package/dist/util/cache/package/with-cache.js.map +1 -1
- package/dist/util/exec/common.d.ts +1 -1
- package/dist/util/exec/common.js +3 -1
- package/dist/util/exec/common.js.map +1 -1
- package/dist/util/git/index.js +2 -2
- package/dist/util/git/index.js.map +1 -1
- package/dist/util/http/bitbucket-server.js +2 -2
- package/dist/util/http/bitbucket-server.js.map +1 -1
- package/dist/util/http/forgejo.js +2 -2
- package/dist/util/http/forgejo.js.map +1 -1
- package/dist/util/http/gitea.js +2 -2
- package/dist/util/http/gitea.js.map +1 -1
- package/dist/util/http/github.d.ts +1 -1
- package/dist/util/http/github.js +2 -2
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/gitlab.d.ts +1 -1
- package/dist/util/http/gitlab.js +2 -2
- package/dist/util/http/gitlab.js.map +1 -1
- package/dist/util/http/scm-manager.js +5 -3
- package/dist/util/http/scm-manager.js.map +1 -1
- package/dist/workers/repository/extract/index.js +2 -2
- package/dist/workers/repository/extract/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +3 -1
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +3 -1
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +3 -1
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["managers","customManagers"],"sources":["../../../lib/modules/manager/index.ts"],"sourcesContent":["import type { MaybePromise, RangeStrategy } from '../../types/index.ts';\nimport managers from './api.ts';\nimport customManagers from './custom/api.ts';\nimport { customManagerList, isCustomManager } from './custom/index.ts';\nimport type {\n ExtractConfig,\n GlobalManagerConfig,\n ManagerApi,\n PackageFile,\n PackageFileContent,\n RangeConfig,\n} from './types.ts';\n\nexport { hashMap } from './fingerprint.generated.ts';\n\nconst managerList = Array.from(managers.keys()); // does not include custom managers\nexport
|
|
1
|
+
{"version":3,"file":"index.js","names":["managers","customManagers"],"sources":["../../../lib/modules/manager/index.ts"],"sourcesContent":["import type { MaybePromise, RangeStrategy } from '../../types/index.ts';\nimport managers from './api.ts';\nimport customManagers from './custom/api.ts';\nimport { customManagerList, isCustomManager } from './custom/index.ts';\nimport type {\n ExtractConfig,\n GlobalManagerConfig,\n ManagerApi,\n PackageFile,\n PackageFileContent,\n RangeConfig,\n} from './types.ts';\n\nexport { hashMap } from './fingerprint.generated.ts';\n\nconst managerList = Array.from(managers.keys()); // does not include custom managers\nexport function getManagerList(): string[] {\n return managerList;\n}\nexport function getManagers(): Map<string, ManagerApi> {\n return managers;\n}\nexport const allManagersList = [...managerList, ...customManagerList];\n\nexport function get<T extends keyof ManagerApi>(\n manager: string,\n name: T,\n): ManagerApi[T] | undefined {\n return isCustomManager(manager)\n ? customManagers.get(manager)?.[name]\n : managers.get(manager)?.[name];\n}\n\nexport async function detectAllGlobalConfig(): Promise<GlobalManagerConfig> {\n let config: GlobalManagerConfig = {};\n for (const managerName of allManagersList) {\n const manager =\n managers.get(managerName)! ?? customManagers.get(managerName)!;\n if (manager.detectGlobalConfig) {\n // This should use mergeChildConfig once more than one manager is supported, but introduces a cyclic dependency\n config = { ...config, ...(await manager.detectGlobalConfig()) };\n }\n }\n return config;\n}\n\nexport async function extractAllPackageFiles(\n manager: string,\n config: ExtractConfig,\n files: string[],\n): Promise<PackageFile[] | null> {\n if (!managers.has(manager)) {\n return null;\n }\n const m = managers.get(manager)!;\n if (m.extractAllPackageFiles) {\n const res = await m.extractAllPackageFiles(config, files);\n // istanbul ignore if\n if (!res) {\n return null;\n }\n return res;\n }\n return null;\n}\n\nexport function extractPackageFile(\n manager: string,\n content: string,\n fileName: string,\n config: ExtractConfig,\n): MaybePromise<PackageFileContent | null> {\n const m = managers.get(manager)! ?? customManagers.get(manager)!;\n if (!m) {\n return null;\n }\n\n return m.extractPackageFile\n ? m.extractPackageFile(content, fileName, config)\n : null;\n}\n\nexport function getRangeStrategy(config: RangeConfig): RangeStrategy | null {\n const { manager, rangeStrategy } = config;\n if (!manager || !managers.has(manager)) {\n return null;\n }\n const m = managers.get(manager)!;\n if (m.getRangeStrategy) {\n // Use manager's own function if it exists\n const managerRangeStrategy = m.getRangeStrategy(config);\n if (managerRangeStrategy === 'in-range-only') {\n return 'update-lockfile';\n }\n return managerRangeStrategy;\n }\n if (rangeStrategy === 'auto') {\n if (m.updateLockedDependency) {\n return 'update-lockfile';\n }\n // default to 'replace' for auto\n return 'replace';\n }\n if (rangeStrategy === 'in-range-only') {\n return 'update-lockfile';\n }\n\n return config.rangeStrategy!;\n}\n\nexport function getPrettyDepType(\n manager: string,\n depType: string,\n): string | undefined {\n const m = managers.get(manager) ?? customManagers.get(manager);\n return m?.knownDepTypes?.find((meta) => meta.depType === depType)\n ?.prettyDepType;\n}\n\nexport function isKnownManager(mgr: string): boolean {\n return allManagersList.includes(mgr.replace('custom.', ''));\n}\n\n/**\n * Filter a list of managers based on enabled managers.\n *\n * If enabledManagers is provided, this function returns a subset of allManagersList\n * that matches the enabled manager names, including custom managers. If enabledManagers\n * is not provided or is an empty array, it returns the full list of managers.\n */\nexport function getEnabledManagersList(enabledManagers?: string[]): string[] {\n if (enabledManagers?.length) {\n return allManagersList.filter(\n (manager) =>\n enabledManagers.includes(manager) ||\n enabledManagers.includes(`custom.${manager}`),\n );\n }\n\n return allManagersList;\n}\n"],"mappings":";;;;;AAeA,MAAM,cAAc,MAAM,KAAKA,MAAS,KAAK,CAAC;AAC9C,SAAgB,iBAA2B;CACzC,OAAO;AACT;AACA,SAAgB,cAAuC;CACrD,OAAOA;AACT;AACA,MAAa,kBAAkB,CAAC,GAAG,aAAa,GAAG,iBAAiB;AAEpE,SAAgB,IACd,SACA,MAC2B;CAC3B,OAAO,gBAAgB,OAAO,IAC1BC,IAAe,IAAI,OAAO,CAAC,GAAG,QAC9BD,MAAS,IAAI,OAAO,CAAC,GAAG;AAC9B;AAEA,eAAsB,wBAAsD;CAC1E,IAAI,SAA8B,CAAC;CACnC,KAAK,MAAM,eAAe,iBAAiB;EACzC,MAAM,UACJA,MAAS,IAAI,WAAW,KAAMC,IAAe,IAAI,WAAW;EAC9D,IAAI,QAAQ,oBAEV,SAAS;GAAE,GAAG;GAAQ,GAAI,MAAM,QAAQ,mBAAmB;EAAG;CAElE;CACA,OAAO;AACT;AAEA,eAAsB,uBACpB,SACA,QACA,OAC+B;CAC/B,IAAI,CAACD,MAAS,IAAI,OAAO,GACvB,OAAO;CAET,MAAM,IAAIA,MAAS,IAAI,OAAO;CAC9B,IAAI,EAAE,wBAAwB;EAC5B,MAAM,MAAM,MAAM,EAAE,uBAAuB,QAAQ,KAAK;;EAExD,IAAI,CAAC,KACH,OAAO;EAET,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,mBACd,SACA,SACA,UACA,QACyC;CACzC,MAAM,IAAIA,MAAS,IAAI,OAAO,KAAMC,IAAe,IAAI,OAAO;CAC9D,IAAI,CAAC,GACH,OAAO;CAGT,OAAO,EAAE,qBACL,EAAE,mBAAmB,SAAS,UAAU,MAAM,IAC9C;AACN;AAEA,SAAgB,iBAAiB,QAA2C;CAC1E,MAAM,EAAE,SAAS,kBAAkB;CACnC,IAAI,CAAC,WAAW,CAACD,MAAS,IAAI,OAAO,GACnC,OAAO;CAET,MAAM,IAAIA,MAAS,IAAI,OAAO;CAC9B,IAAI,EAAE,kBAAkB;EAEtB,MAAM,uBAAuB,EAAE,iBAAiB,MAAM;EACtD,IAAI,yBAAyB,iBAC3B,OAAO;EAET,OAAO;CACT;CACA,IAAI,kBAAkB,QAAQ;EAC5B,IAAI,EAAE,wBACJ,OAAO;EAGT,OAAO;CACT;CACA,IAAI,kBAAkB,iBACpB,OAAO;CAGT,OAAO,OAAO;AAChB;AAEA,SAAgB,iBACd,SACA,SACoB;CAEpB,QADUA,MAAS,IAAI,OAAO,KAAKC,IAAe,IAAI,OAAO,EAAA,EACnD,eAAe,MAAM,SAAS,KAAK,YAAY,OAAO,CAAC,EAC7D;AACN;AAEA,SAAgB,eAAe,KAAsB;CACnD,OAAO,gBAAgB,SAAS,IAAI,QAAQ,WAAW,EAAE,CAAC;AAC5D;;;;;;;;AASA,SAAgB,uBAAuB,iBAAsC;CAC3E,IAAI,iBAAiB,QACnB,OAAO,gBAAgB,QACpB,YACC,gBAAgB,SAAS,OAAO,KAChC,gBAAgB,SAAS,UAAU,SAAS,CAChD;CAGF,OAAO;AACT"}
|
|
@@ -23,9 +23,13 @@ function extractFromVectors(str, ctx = {}, vars = {}, dimensions = 2) {
|
|
|
23
23
|
let artifactId = "";
|
|
24
24
|
let version = "";
|
|
25
25
|
let commentLevel = null;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
function isSpace(ch) {
|
|
27
|
+
return !!ch && regEx(/[\s,]/).test(ch);
|
|
28
|
+
}
|
|
29
|
+
function cleanStrLiteral(s) {
|
|
30
|
+
return s.replace(regEx(/^"/), "").replace(regEx(/"$/), "");
|
|
31
|
+
}
|
|
32
|
+
function yieldDep() {
|
|
29
33
|
if (!commentLevel && artifactId && version) {
|
|
30
34
|
const depName = expandDepName(cleanStrLiteral(artifactId));
|
|
31
35
|
if (version.startsWith("~")) {
|
|
@@ -47,7 +51,7 @@ function extractFromVectors(str, ctx = {}, vars = {}, dimensions = 2) {
|
|
|
47
51
|
}
|
|
48
52
|
artifactId = "";
|
|
49
53
|
version = "";
|
|
50
|
-
}
|
|
54
|
+
}
|
|
51
55
|
let prevChar = null;
|
|
52
56
|
while (idx < str.length) {
|
|
53
57
|
const char = str.charAt(idx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/leiningen/extract.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ClojureDatasource } from '../../datasource/clojure/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { ExtractContext, ExtractedVariables } from './types.ts';\n\nexport function trimAtKey(str: string, kwName: string): string | null {\n const regex = new RegExp(`:${kwName}(?=\\\\s)`); // TODO #12872 lookahead\n const keyOffset = str.search(regex);\n if (keyOffset < 0) {\n return null;\n }\n const withSpaces = str.slice(keyOffset + kwName.length + 1);\n const valueOffset = withSpaces.search(regEx(/[^\\s]/));\n if (valueOffset < 0) {\n return null;\n }\n return withSpaces.slice(valueOffset);\n}\n\nexport function expandDepName(name: string): string {\n return name.includes('/') ? name.replace('/', ':') : `${name}:${name}`;\n}\n\nexport function extractFromVectors(\n str: string,\n ctx: ExtractContext = {},\n vars: ExtractedVariables = {},\n dimensions: 1 | 2 = 2,\n): PackageDependency[] {\n if (!str.startsWith('[')) {\n return [];\n }\n let balance = 0;\n const result: PackageDependency[] = [];\n let idx = 0;\n let vecPos = 0;\n let artifactId = '';\n let version = '';\n // Are we currently parsing a comment? If so, at what depth?\n let commentLevel: number | null = null;\n\n const isSpace = (ch: string | null): boolean =>\n !!ch && regEx(/[\\s,]/).test(ch);\n\n const cleanStrLiteral = (s: string): string =>\n s.replace(regEx(/^\"/), '').replace(regEx(/\"$/), '');\n\n const yieldDep = (): void => {\n if (!commentLevel && artifactId && version) {\n const depName = expandDepName(cleanStrLiteral(artifactId));\n if (version.startsWith('~')) {\n const varName = version.replace(regEx(/^~\\s*/), '');\n const currentValue = vars[varName];\n if (currentValue) {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue,\n sharedVariableName: varName,\n });\n }\n } else {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue: cleanStrLiteral(version),\n });\n }\n }\n artifactId = '';\n version = '';\n };\n\n let prevChar: string | null = null;\n while (idx < str.length) {\n const char = str.charAt(idx);\n\n if (str.substring(idx).startsWith('#_[')) {\n commentLevel = balance;\n }\n\n if (char === '[') {\n balance += 1;\n if (balance === dimensions) {\n vecPos = 0;\n }\n } else if (char === ']') {\n balance -= 1;\n\n if (commentLevel === balance) {\n artifactId = '';\n version = '';\n commentLevel = null;\n }\n\n if (balance === dimensions - 1) {\n yieldDep();\n }\n\n if (balance === 0) {\n break;\n }\n } else if (balance === dimensions) {\n if (isSpace(char)) {\n if (!isSpace(prevChar)) {\n vecPos += 1;\n }\n } else if (vecPos === 0) {\n artifactId += char;\n } else if (vecPos === 1) {\n version += char;\n }\n }\n prevChar = char;\n idx += 1;\n }\n return result;\n}\n\nfunction extractLeinRepos(content: string): string[] {\n const result: string[] = [];\n\n const repoContent = trimAtKey(\n content.replace(/;;.*(?=[\\r\\n])/g, ''), // get rid of comments // TODO #12872 lookahead\n 'repositories',\n );\n\n if (repoContent) {\n let balance = 0;\n let endIdx = 0;\n for (let idx = 0; idx < repoContent.length; idx += 1) {\n const char = repoContent.charAt(idx);\n if (char === '[') {\n balance += 1;\n } else if (char === ']') {\n balance -= 1;\n if (balance <= 0) {\n endIdx = idx;\n break;\n }\n }\n }\n const repoSectionContent = repoContent.slice(0, endIdx);\n const matches = coerceArray(\n repoSectionContent.match(regEx(/\"https?:\\/\\/[^\"]*\"/g)),\n );\n const urls = matches.map((x) =>\n x.replace(regEx(/^\"/), '').replace(regEx(/\"$/), ''),\n );\n urls.forEach((url) => result.push(url));\n }\n\n return result;\n}\n\nconst defRegex = regEx(\n /^[\\s,]*\\([\\s,]*def[\\s,]+(?<varName>[-+*=<>.!?#$%&_|a-zA-Z][-+*=<>.!?#$%&_|a-zA-Z0-9']+)[\\s,]*\"(?<stringValue>[^\"]*)\"[\\s,]*\\)[\\s,]*$/,\n);\n\nexport function extractVariables(content: string): ExtractedVariables {\n const result: ExtractedVariables = {};\n const lines = content.split(newlineRegex);\n for (const line of lines) {\n const match = defRegex.exec(line);\n if (match?.groups) {\n const { varName: key, stringValue: val } = match.groups;\n result[key] = val;\n }\n }\n return result;\n}\n\ninterface CollectDepsOptions {\n nested: boolean;\n depType?: string;\n}\n\nfunction collectDeps(\n content: string,\n key: string,\n registryUrls: string[],\n vars: ExtractedVariables,\n options: CollectDepsOptions = {\n nested: true,\n },\n): PackageDependency[] {\n const ctx = {\n depType: options.depType ?? key,\n registryUrls,\n };\n // A vector like [[\"dep-1\" \"1.0.0\"] [\"dep-2\" \"0.0.0\"]] is nested\n // A vector like [\"dep-1\" \"1.0.0\"] is not\n const dimensions = options.nested ? 2 : 1;\n let result: PackageDependency[] = [];\n let restContent = trimAtKey(content, key);\n while (restContent) {\n result = [\n ...result,\n ...extractFromVectors(restContent, ctx, vars, dimensions),\n ];\n restContent = trimAtKey(restContent, key);\n }\n return result;\n}\n\nexport function extractPackageFile(content: string): PackageFileContent {\n const registryUrls = extractLeinRepos(content);\n const vars = extractVariables(content);\n\n const deps: PackageDependency[] = [\n ...collectDeps(content, 'dependencies', registryUrls, vars),\n ...collectDeps(content, 'managed-dependencies', registryUrls, vars),\n ...collectDeps(content, 'plugins', registryUrls, vars),\n ...collectDeps(content, 'pom-plugins', registryUrls, vars),\n // 'coords' is used in lein parent, and specifies zero or one\n // dependencies. These are not wrapped in a vector in the way other\n // dependencies are. The project.clj fragment looks like\n //\n // :parent-project {... :coords [\"parent\" \"version\"] ...}\n //\n // - https://github.com/achin/lein-parent\n ...collectDeps(content, 'coords', registryUrls, vars, {\n nested: false,\n // The top-level key is 'parent-project', but we skip directly to 'coords'.\n // So fix the dep type label\n depType: 'parent-project',\n }),\n ];\n\n return { deps };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/leiningen/extract.ts"],"sourcesContent":["import { coerceArray } from '../../../util/array.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { ClojureDatasource } from '../../datasource/clojure/index.ts';\nimport type { PackageDependency, PackageFileContent } from '../types.ts';\nimport type { ExtractContext, ExtractedVariables } from './types.ts';\n\nexport function trimAtKey(str: string, kwName: string): string | null {\n const regex = new RegExp(`:${kwName}(?=\\\\s)`); // TODO #12872 lookahead\n const keyOffset = str.search(regex);\n if (keyOffset < 0) {\n return null;\n }\n const withSpaces = str.slice(keyOffset + kwName.length + 1);\n const valueOffset = withSpaces.search(regEx(/[^\\s]/));\n if (valueOffset < 0) {\n return null;\n }\n return withSpaces.slice(valueOffset);\n}\n\nexport function expandDepName(name: string): string {\n return name.includes('/') ? name.replace('/', ':') : `${name}:${name}`;\n}\n\nexport function extractFromVectors(\n str: string,\n ctx: ExtractContext = {},\n vars: ExtractedVariables = {},\n dimensions: 1 | 2 = 2,\n): PackageDependency[] {\n if (!str.startsWith('[')) {\n return [];\n }\n let balance = 0;\n const result: PackageDependency[] = [];\n let idx = 0;\n let vecPos = 0;\n let artifactId = '';\n let version = '';\n // Are we currently parsing a comment? If so, at what depth?\n let commentLevel: number | null = null;\n\n function isSpace(ch: string | null): boolean {\n return !!ch && regEx(/[\\s,]/).test(ch);\n }\n\n function cleanStrLiteral(s: string): string {\n return s.replace(regEx(/^\"/), '').replace(regEx(/\"$/), '');\n }\n\n function yieldDep(): void {\n if (!commentLevel && artifactId && version) {\n const depName = expandDepName(cleanStrLiteral(artifactId));\n if (version.startsWith('~')) {\n const varName = version.replace(regEx(/^~\\s*/), '');\n const currentValue = vars[varName];\n if (currentValue) {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue,\n sharedVariableName: varName,\n });\n }\n } else {\n result.push({\n ...ctx,\n datasource: ClojureDatasource.id,\n depName,\n currentValue: cleanStrLiteral(version),\n });\n }\n }\n artifactId = '';\n version = '';\n }\n\n let prevChar: string | null = null;\n while (idx < str.length) {\n const char = str.charAt(idx);\n\n if (str.substring(idx).startsWith('#_[')) {\n commentLevel = balance;\n }\n\n if (char === '[') {\n balance += 1;\n if (balance === dimensions) {\n vecPos = 0;\n }\n } else if (char === ']') {\n balance -= 1;\n\n if (commentLevel === balance) {\n artifactId = '';\n version = '';\n commentLevel = null;\n }\n\n if (balance === dimensions - 1) {\n yieldDep();\n }\n\n if (balance === 0) {\n break;\n }\n } else if (balance === dimensions) {\n if (isSpace(char)) {\n if (!isSpace(prevChar)) {\n vecPos += 1;\n }\n } else if (vecPos === 0) {\n artifactId += char;\n } else if (vecPos === 1) {\n version += char;\n }\n }\n prevChar = char;\n idx += 1;\n }\n return result;\n}\n\nfunction extractLeinRepos(content: string): string[] {\n const result: string[] = [];\n\n const repoContent = trimAtKey(\n content.replace(/;;.*(?=[\\r\\n])/g, ''), // get rid of comments // TODO #12872 lookahead\n 'repositories',\n );\n\n if (repoContent) {\n let balance = 0;\n let endIdx = 0;\n for (let idx = 0; idx < repoContent.length; idx += 1) {\n const char = repoContent.charAt(idx);\n if (char === '[') {\n balance += 1;\n } else if (char === ']') {\n balance -= 1;\n if (balance <= 0) {\n endIdx = idx;\n break;\n }\n }\n }\n const repoSectionContent = repoContent.slice(0, endIdx);\n const matches = coerceArray(\n repoSectionContent.match(regEx(/\"https?:\\/\\/[^\"]*\"/g)),\n );\n const urls = matches.map((x) =>\n x.replace(regEx(/^\"/), '').replace(regEx(/\"$/), ''),\n );\n urls.forEach((url) => result.push(url));\n }\n\n return result;\n}\n\nconst defRegex = regEx(\n /^[\\s,]*\\([\\s,]*def[\\s,]+(?<varName>[-+*=<>.!?#$%&_|a-zA-Z][-+*=<>.!?#$%&_|a-zA-Z0-9']+)[\\s,]*\"(?<stringValue>[^\"]*)\"[\\s,]*\\)[\\s,]*$/,\n);\n\nexport function extractVariables(content: string): ExtractedVariables {\n const result: ExtractedVariables = {};\n const lines = content.split(newlineRegex);\n for (const line of lines) {\n const match = defRegex.exec(line);\n if (match?.groups) {\n const { varName: key, stringValue: val } = match.groups;\n result[key] = val;\n }\n }\n return result;\n}\n\ninterface CollectDepsOptions {\n nested: boolean;\n depType?: string;\n}\n\nfunction collectDeps(\n content: string,\n key: string,\n registryUrls: string[],\n vars: ExtractedVariables,\n options: CollectDepsOptions = {\n nested: true,\n },\n): PackageDependency[] {\n const ctx = {\n depType: options.depType ?? key,\n registryUrls,\n };\n // A vector like [[\"dep-1\" \"1.0.0\"] [\"dep-2\" \"0.0.0\"]] is nested\n // A vector like [\"dep-1\" \"1.0.0\"] is not\n const dimensions = options.nested ? 2 : 1;\n let result: PackageDependency[] = [];\n let restContent = trimAtKey(content, key);\n while (restContent) {\n result = [\n ...result,\n ...extractFromVectors(restContent, ctx, vars, dimensions),\n ];\n restContent = trimAtKey(restContent, key);\n }\n return result;\n}\n\nexport function extractPackageFile(content: string): PackageFileContent {\n const registryUrls = extractLeinRepos(content);\n const vars = extractVariables(content);\n\n const deps: PackageDependency[] = [\n ...collectDeps(content, 'dependencies', registryUrls, vars),\n ...collectDeps(content, 'managed-dependencies', registryUrls, vars),\n ...collectDeps(content, 'plugins', registryUrls, vars),\n ...collectDeps(content, 'pom-plugins', registryUrls, vars),\n // 'coords' is used in lein parent, and specifies zero or one\n // dependencies. These are not wrapped in a vector in the way other\n // dependencies are. The project.clj fragment looks like\n //\n // :parent-project {... :coords [\"parent\" \"version\"] ...}\n //\n // - https://github.com/achin/lein-parent\n ...collectDeps(content, 'coords', registryUrls, vars, {\n nested: false,\n // The top-level key is 'parent-project', but we skip directly to 'coords'.\n // So fix the dep type label\n depType: 'parent-project',\n }),\n ];\n\n return { deps };\n}\n"],"mappings":";;;;AAMA,SAAgB,UAAU,KAAa,QAA+B;CACpE,MAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,QAAQ;CAC5C,MAAM,YAAY,IAAI,OAAO,KAAK;CAClC,IAAI,YAAY,GACd,OAAO;CAET,MAAM,aAAa,IAAI,MAAM,YAAY,OAAO,SAAS,CAAC;CAC1D,MAAM,cAAc,WAAW,OAAO,MAAM,OAAO,CAAC;CACpD,IAAI,cAAc,GAChB,OAAO;CAET,OAAO,WAAW,MAAM,WAAW;AACrC;AAEA,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG;AAClE;AAEA,SAAgB,mBACd,KACA,MAAsB,CAAC,GACvB,OAA2B,CAAC,GAC5B,aAAoB,GACC;CACrB,IAAI,CAAC,IAAI,WAAW,GAAG,GACrB,OAAO,CAAC;CAEV,IAAI,UAAU;CACd,MAAM,SAA8B,CAAC;CACrC,IAAI,MAAM;CACV,IAAI,SAAS;CACb,IAAI,aAAa;CACjB,IAAI,UAAU;CAEd,IAAI,eAA8B;CAElC,SAAS,QAAQ,IAA4B;EAC3C,OAAO,CAAC,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE;CACvC;CAEA,SAAS,gBAAgB,GAAmB;EAC1C,OAAO,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,MAAM,IAAI,GAAG,EAAE;CAC3D;CAEA,SAAS,WAAiB;EACxB,IAAI,CAAC,gBAAgB,cAAc,SAAS;GAC1C,MAAM,UAAU,cAAc,gBAAgB,UAAU,CAAC;GACzD,IAAI,QAAQ,WAAW,GAAG,GAAG;IAC3B,MAAM,UAAU,QAAQ,QAAQ,MAAM,OAAO,GAAG,EAAE;IAClD,MAAM,eAAe,KAAK;IAC1B,IAAI,cACF,OAAO,KAAK;KACV,GAAG;KACH,YAAY,kBAAkB;KAC9B;KACA;KACA,oBAAoB;IACtB,CAAC;GAEL,OACE,OAAO,KAAK;IACV,GAAG;IACH,YAAY,kBAAkB;IAC9B;IACA,cAAc,gBAAgB,OAAO;GACvC,CAAC;EAEL;EACA,aAAa;EACb,UAAU;CACZ;CAEA,IAAI,WAA0B;CAC9B,OAAO,MAAM,IAAI,QAAQ;EACvB,MAAM,OAAO,IAAI,OAAO,GAAG;EAE3B,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC,WAAW,KAAK,GACrC,eAAe;EAGjB,IAAI,SAAS,KAAK;GAChB,WAAW;GACX,IAAI,YAAY,YACd,SAAS;EAEb,OAAO,IAAI,SAAS,KAAK;GACvB,WAAW;GAEX,IAAI,iBAAiB,SAAS;IAC5B,aAAa;IACb,UAAU;IACV,eAAe;GACjB;GAEA,IAAI,YAAY,aAAa,GAC3B,SAAS;GAGX,IAAI,YAAY,GACd;EAEJ,OAAO,IAAI,YAAY;OACjB,QAAQ,IAAI;QACV,CAAC,QAAQ,QAAQ,GACnB,UAAU;GAAA,OAEP,IAAI,WAAW,GACpB,cAAc;QACT,IAAI,WAAW,GACpB,WAAW;EAAA;EAGf,WAAW;EACX,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAS,iBAAiB,SAA2B;CACnD,MAAM,SAAmB,CAAC;CAE1B,MAAM,cAAc,UAClB,QAAQ,QAAQ,mBAAmB,EAAE,GACrC,cACF;CAEA,IAAI,aAAa;EACf,IAAI,UAAU;EACd,IAAI,SAAS;EACb,KAAK,IAAI,MAAM,GAAG,MAAM,YAAY,QAAQ,OAAO,GAAG;GACpD,MAAM,OAAO,YAAY,OAAO,GAAG;GACnC,IAAI,SAAS,KACX,WAAW;QACN,IAAI,SAAS,KAAK;IACvB,WAAW;IACX,IAAI,WAAW,GAAG;KAChB,SAAS;KACT;IACF;GACF;EACF;EAQA,YAP2B,YAAY,MAAM,GAAG,MAE7B,CAAC,CAAC,MAAM,MAAM,qBAAqB,CAAC,CAEpC,CAAC,CAAC,KAAK,MACxB,EAAE,QAAQ,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,MAAM,IAAI,GAAG,EAAE,CAEjD,CAAC,CAAC,SAAS,QAAQ,OAAO,KAAK,GAAG,CAAC;CACxC;CAEA,OAAO;AACT;AAEA,MAAM,WAAW,MACf,qIACF;AAEA,SAAgB,iBAAiB,SAAqC;CACpE,MAAM,SAA6B,CAAC;CACpC,MAAM,QAAQ,QAAQ,MAAM,YAAY;CACxC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,QAAQ,SAAS,KAAK,IAAI;EAChC,IAAI,OAAO,QAAQ;GACjB,MAAM,EAAE,SAAS,KAAK,aAAa,QAAQ,MAAM;GACjD,OAAO,OAAO;EAChB;CACF;CACA,OAAO;AACT;AAOA,SAAS,YACP,SACA,KACA,cACA,MACA,UAA8B,EAC5B,QAAQ,KACV,GACqB;CACrB,MAAM,MAAM;EACV,SAAS,QAAQ,WAAW;EAC5B;CACF;CAGA,MAAM,aAAa,QAAQ,SAAS,IAAI;CACxC,IAAI,SAA8B,CAAC;CACnC,IAAI,cAAc,UAAU,SAAS,GAAG;CACxC,OAAO,aAAa;EAClB,SAAS,CACP,GAAG,QACH,GAAG,mBAAmB,aAAa,KAAK,MAAM,UAAU,CAC1D;EACA,cAAc,UAAU,aAAa,GAAG;CAC1C;CACA,OAAO;AACT;AAEA,SAAgB,mBAAmB,SAAqC;CACtE,MAAM,eAAe,iBAAiB,OAAO;CAC7C,MAAM,OAAO,iBAAiB,OAAO;CAsBrC,OAAO,EAAE,MAAA;EAnBP,GAAG,YAAY,SAAS,gBAAgB,cAAc,IAAI;EAC1D,GAAG,YAAY,SAAS,wBAAwB,cAAc,IAAI;EAClE,GAAG,YAAY,SAAS,WAAW,cAAc,IAAI;EACrD,GAAG,YAAY,SAAS,eAAe,cAAc,IAAI;EAQzD,GAAG,YAAY,SAAS,UAAU,cAAc,MAAM;GACpD,QAAQ;GAGR,SAAS;EACX,CAAC;CAGS,EAAE;AAChB"}
|
|
@@ -146,17 +146,19 @@ function applyPropsInternal(dep, depPackageFile, props, previouslySeenProps) {
|
|
|
146
146
|
let anyChange = false;
|
|
147
147
|
let fatal = false;
|
|
148
148
|
const seenProps = /* @__PURE__ */ new Set();
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
149
|
+
function replaceAll(str) {
|
|
150
|
+
return str.replace(regEx(/\${[^}]*?}/g), (substr) => {
|
|
151
|
+
const propKey = substr.slice(2, -1).trim();
|
|
152
|
+
const propValue = props[propKey];
|
|
153
|
+
if (propValue) {
|
|
154
|
+
anyChange = true;
|
|
155
|
+
if (previouslySeenProps.has(propKey)) fatal = true;
|
|
156
|
+
else seenProps.add(propKey);
|
|
157
|
+
return propValue.val;
|
|
158
|
+
}
|
|
159
|
+
return substr;
|
|
160
|
+
});
|
|
161
|
+
}
|
|
160
162
|
let depName = dep.depName;
|
|
161
163
|
if (dep.depName) depName = replaceAll(dep.depName);
|
|
162
164
|
const registryUrls = dep.registryUrls.map((url) => replaceAll(url));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["getDockerDep","getBuildpackDep"],"sources":["../../../../lib/modules/manager/maven/extract.ts"],"sourcesContent":["import { isArray, isNonEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { MAVEN_REPO } from '../../datasource/maven/common.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport {\n BUILDPACK_REGISTRY_PREFIX,\n DOCKER_PREFIX,\n getDep as getBuildpackDep,\n isBuildpackRegistryRef,\n isDockerRef,\n} from '../buildpacks/extract.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n} from '../types.ts';\nimport type { MavenProp } from './types.ts';\n\nconst supportedNamespaces = [\n 'http://maven.apache.org/SETTINGS/1.0.0',\n 'http://maven.apache.org/SETTINGS/1.1.0',\n 'http://maven.apache.org/SETTINGS/1.2.0',\n];\n\nconst supportedExtensionsNamespaces = [\n 'http://maven.apache.org/EXTENSIONS/1.0.0',\n 'http://maven.apache.org/EXTENSIONS/1.1.0',\n 'http://maven.apache.org/EXTENSIONS/1.2.0',\n];\n\nfunction parsePom(raw: string, packageFile: string): XmlDocument | null {\n let project: XmlDocument;\n try {\n project = new XmlDocument(raw);\n if (raw.includes('\\r\\n')) {\n logger.warn(\n 'Your pom.xml contains windows line endings. This is not supported and may result in parsing issues.',\n );\n }\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = project;\n if (name !== 'project') {\n return null;\n }\n if (attr.xmlns === 'http://maven.apache.org/POM/4.0.0') {\n return project;\n }\n if (\n isNonEmptyArray(children) &&\n children.some((c: any) => c.name === 'modelVersion' && c.val === '4.0.0')\n ) {\n return project;\n }\n return null;\n}\n\nfunction parseExtensions(raw: string, packageFile: string): XmlDocument | null {\n let extensions: XmlDocument;\n try {\n extensions = new XmlDocument(raw);\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = extensions;\n if (name !== 'extensions') {\n return null;\n }\n if (!supportedExtensionsNamespaces.includes(attr.xmlns)) {\n return null;\n }\n if (!isNonEmptyArray(children)) {\n return null;\n }\n return extensions;\n}\n\nfunction containsPlaceholder(str: string | null | undefined): boolean {\n return (\n !!str &&\n (regEx(/\\${[^}]*?}/).test(str) || regEx(/\\{\\{[^}]*?\\}\\}/).test(str))\n );\n}\n\nfunction getCNBDependencies(\n nodes: XmlElement[],\n config: ExtractConfig,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const node of nodes) {\n const depString = node.val.trim();\n if (isDockerRef(depString)) {\n const dep = getDockerDep(\n depString.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n if (dep.currentValue || dep.currentDigest) {\n deps.push(dep);\n }\n } else if (isBuildpackRegistryRef(depString)) {\n const dep = getBuildpackDep(\n depString.replace(BUILDPACK_REGISTRY_PREFIX, ''),\n );\n\n if (dep?.currentValue) {\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n\nfunction getAllCNBDependencies(\n node: XmlDocument,\n config: ExtractConfig,\n): PackageDependency[] | null {\n const pluginNodes =\n node.childNamed('build')?.childNamed('plugins')?.childrenNamed('plugin') ??\n [];\n\n const pluginNode = pluginNodes.find((pluginNode) => {\n return (\n pluginNode.valueWithPath('groupId')?.trim() ===\n 'org.springframework.boot' &&\n pluginNode.valueWithPath('artifactId')?.trim() ===\n 'spring-boot-maven-plugin'\n );\n });\n if (!pluginNode) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n const imageNode = pluginNode.childNamed('configuration')?.childNamed('image');\n if (!imageNode) {\n return null;\n }\n const builder = getCNBDependencies(\n imageNode.childrenNamed('builder'),\n config,\n );\n const runImage = getCNBDependencies(\n imageNode.childrenNamed('runImage'),\n config,\n );\n const buildpacks = getCNBDependencies(\n imageNode.childNamed('buildpacks')?.childrenNamed('buildpack') ?? [],\n config,\n );\n deps.push(...builder, ...runImage, ...buildpacks);\n\n return deps.length ? deps : null;\n}\n\nfunction depFromNode(\n node: XmlElement,\n underBuildSettingsElement: boolean,\n): PackageDependency | null {\n if (!('valueWithPath' in node)) {\n return null;\n }\n let groupId = node.valueWithPath('groupId')?.trim();\n const artifactId = node.valueWithPath('artifactId')?.trim();\n const currentValue = node.valueWithPath('version')?.trim();\n let depType: string | undefined;\n\n if (!groupId && node.name === 'plugin') {\n groupId = 'org.apache.maven.plugins';\n }\n\n if (groupId && artifactId && currentValue) {\n const depName = `${groupId}:${artifactId}`;\n const versionNode = node.descendantWithPath('version')!;\n const fileReplacePosition = versionNode.position!; // TODO: should not be null\n const datasource = MavenDatasource.id;\n const result: PackageDependency = {\n datasource,\n depName,\n currentValue,\n fileReplacePosition,\n registryUrls: [],\n };\n\n switch (node.name) {\n case 'plugin':\n case 'extension':\n depType = 'build';\n break;\n case 'parent':\n depType = 'parent';\n break;\n case 'dependency':\n if (underBuildSettingsElement) {\n depType = 'build';\n } else if (node.valueWithPath('optional')?.trim() === 'true') {\n depType = 'optional';\n } else {\n depType = node.valueWithPath('scope')?.trim() ?? 'compile'; // maven default scope is compile\n }\n break;\n }\n\n if (depType) {\n result.depType = depType;\n }\n\n return result;\n }\n return null;\n}\n\nfunction deepExtract(\n node: XmlElement,\n result: PackageDependency[] = [],\n isRoot = true,\n underBuildSettingsElement = false,\n): PackageDependency[] {\n const dep = depFromNode(node, underBuildSettingsElement);\n if (dep && !isRoot) {\n result.push(dep);\n }\n if (node.children) {\n for (const child of node.children) {\n deepExtract(\n child as XmlElement,\n result,\n false,\n node.name === 'build' ||\n node.name === 'reporting' ||\n underBuildSettingsElement,\n );\n }\n }\n return result;\n}\n\nfunction applyProps(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n): PackageDependency {\n let result = dep;\n let anyChange = false;\n const alreadySeenProps = new Set<string>();\n\n do {\n const [returnedResult, returnedAnyChange, fatal] = applyPropsInternal(\n result,\n depPackageFile,\n props,\n alreadySeenProps,\n );\n if (fatal) {\n dep.skipReason = 'recursive-placeholder';\n return dep;\n }\n result = returnedResult;\n anyChange = returnedAnyChange;\n } while (anyChange);\n\n if (containsPlaceholder(result.depName)) {\n result.skipReason = 'name-placeholder';\n } else if (containsPlaceholder(result.currentValue)) {\n result.skipReason = 'version-placeholder';\n }\n\n return result;\n}\n\nfunction applyPropsInternal(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n previouslySeenProps: Set<string>,\n): [PackageDependency, boolean, boolean] {\n let anyChange = false;\n let fatal = false;\n\n const seenProps = new Set<string>();\n\n const replaceAll = (str: string): string =>\n str.replace(regEx(/\\${[^}]*?}/g), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n\n let depName = dep.depName;\n if (dep.depName) {\n depName = replaceAll(dep.depName);\n }\n\n const registryUrls = dep.registryUrls!.map((url) => replaceAll(url));\n\n let fileReplacePosition = dep.fileReplacePosition;\n let propSource = dep.propSource;\n let sharedVariableName: string | null = null;\n let currentValue: string | null = null;\n\n if (dep.currentValue) {\n currentValue = dep.currentValue.replace(regEx(/^\\${[^}]*?}$/), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n sharedVariableName ??= propKey;\n fileReplacePosition = propValue.fileReplacePosition;\n propSource =\n propValue.packageFile ??\n // istanbul ignore next\n undefined;\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n const result: PackageDependency = {\n ...dep,\n depName,\n registryUrls,\n fileReplacePosition,\n propSource,\n currentValue,\n };\n\n if (sharedVariableName) {\n result.sharedVariableName = sharedVariableName;\n }\n\n if (propSource && depPackageFile !== propSource) {\n result.editFile = propSource;\n }\n\n for (const prop of seenProps) {\n previouslySeenProps.add(prop);\n }\n return [result, anyChange, fatal];\n}\n\nfunction resolveParentFile(packageFile: string, parentPath: string): string {\n let parentFile = 'pom.xml';\n let parentDir = parentPath;\n const parentBasename = upath.basename(parentPath);\n if (parentBasename === 'pom.xml' || parentBasename.endsWith('.pom.xml')) {\n parentFile = parentBasename;\n parentDir = upath.dirname(parentPath);\n }\n const dir = upath.dirname(packageFile);\n return upath.normalize(upath.join(dir, parentDir, parentFile));\n}\n\ninterface MavenInterimPackageFile extends PackageFile {\n mavenProps?: Record<string, any>;\n parent?: string;\n}\n\nexport function extractPackage(\n rawContent: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const project = parsePom(rawContent, packageFile);\n if (!project) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(project);\n\n const CNBDependencies = getAllCNBDependencies(project, config);\n if (CNBDependencies) {\n result.deps.push(...CNBDependencies);\n }\n\n const propsNode = project.childNamed('properties');\n const props: Record<string, MavenProp> = {};\n if (propsNode?.children) {\n for (const propNode of propsNode.children as XmlElement[]) {\n const key = propNode.name;\n const val = propNode?.val?.trim();\n if (key && val && propNode.position) {\n const fileReplacePosition = propNode.position;\n props[key] = { val, fileReplacePosition, packageFile };\n }\n }\n }\n result.mavenProps = props;\n\n const repositories = project.childNamed('repositories');\n if (repositories?.children) {\n const repoUrls: string[] = [];\n for (const repo of repositories.childrenNamed('repository')) {\n const repoUrl = repo.valueWithPath('url')?.trim();\n if (repoUrl) {\n repoUrls.push(repoUrl);\n }\n }\n result.deps.forEach((dep) => {\n if (isArray(dep.registryUrls)) {\n repoUrls.forEach((url) => dep.registryUrls!.push(url));\n }\n });\n }\n\n if (packageFile && project.childNamed('parent')) {\n const parentPath =\n project.valueWithPath('parent.relativePath')?.trim() ?? '../pom.xml';\n result.parent = resolveParentFile(packageFile, parentPath);\n }\n\n if (project.childNamed('version')) {\n result.packageFileVersion = project.valueWithPath('version')!.trim();\n }\n\n return result;\n}\n\nexport function extractRegistries(rawContent: string): string[] {\n if (!rawContent) {\n return [];\n }\n\n const settings = parseSettings(rawContent);\n if (!settings) {\n return [];\n }\n\n const urls: string[] = [];\n\n const mirrorUrls = parseUrls(settings, 'mirrors');\n urls.push(...mirrorUrls);\n\n settings.childNamed('profiles')?.eachChild((profile) => {\n const repositoryUrls = parseUrls(profile, 'repositories');\n urls.push(...repositoryUrls);\n });\n\n // filter out duplicates\n return [...new Set(urls)];\n}\n\nfunction parseUrls(xmlNode: XmlElement, path: string): string[] {\n const children = xmlNode.descendantWithPath(path);\n const urls: string[] = [];\n if (children?.children) {\n children.eachChild((child) => {\n const url = child.valueWithPath('url');\n if (url) {\n urls.push(url);\n }\n });\n }\n return urls;\n}\n\nexport function parseSettings(raw: string): XmlDocument | null {\n let settings: XmlDocument;\n try {\n settings = new XmlDocument(raw);\n } catch {\n return null;\n }\n const { name, attr } = settings;\n if (name !== 'settings') {\n return null;\n }\n if (supportedNamespaces.includes(attr.xmlns)) {\n return settings;\n }\n return null;\n}\n\nexport function resolveParents(packages: PackageFile[]): PackageFile[] {\n const packageFileNames: string[] = [];\n const extractedPackages: Record<string, MavenInterimPackageFile> = {};\n const extractedDeps: Record<string, PackageDependency[]> = {};\n const extractedProps: Record<string, MavenProp> = {};\n const registryUrls: Record<string, Set<string>> = {};\n packages.forEach((pkg) => {\n const name = pkg.packageFile;\n packageFileNames.push(name);\n extractedPackages[name] = pkg;\n extractedDeps[name] = [];\n });\n\n // Construct package-specific prop scopes\n // and merge them in reverse order,\n // which allows inheritance/overriding.\n packageFileNames.forEach((name) => {\n registryUrls[name] = new Set();\n const propsHierarchy: Record<string, MavenProp>[] = [];\n const visitedPackages = new Set<string>();\n let pkg: MavenInterimPackageFile | null = extractedPackages[name];\n while (pkg) {\n propsHierarchy.unshift(pkg.mavenProps!);\n\n if (pkg.deps) {\n pkg.deps.forEach((dep) => {\n if (dep.registryUrls) {\n dep.registryUrls.forEach((url) => {\n registryUrls[name].add(url);\n });\n }\n });\n }\n\n if (pkg.parent && !visitedPackages.has(pkg.parent)) {\n visitedPackages.add(pkg.parent);\n pkg = extractedPackages[pkg.parent];\n } else {\n pkg = null;\n }\n }\n propsHierarchy.unshift({});\n extractedProps[name] = Object.assign.apply(null, propsHierarchy as any);\n });\n\n // Resolve registryUrls\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const urlsSet = new Set([\n ...(rawDep.registryUrls ?? []),\n ...registryUrls[name],\n ]);\n rawDep.registryUrls = [...urlsSet];\n });\n });\n\n const rootDeps = new Set<string>();\n // Resolve placeholders\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const dep = applyProps(rawDep, name, extractedProps[name]);\n if (dep.depType === 'parent') {\n const parentPkg = extractedPackages[pkg.parent!];\n const hasParentWithNoParent = parentPkg && !parentPkg.parent;\n const hasParentWithExternalParent =\n parentPkg && !packageFileNames.includes(parentPkg.parent!);\n if (hasParentWithNoParent || hasParentWithExternalParent) {\n rootDeps.add(dep.depName!);\n }\n }\n const sourceName = dep.propSource ?? name;\n extractedDeps[sourceName].push(dep);\n });\n });\n\n const packageFiles = packageFileNames.map((packageFile) => {\n const pkg = extractedPackages[packageFile];\n const deps = extractedDeps[packageFile];\n for (const dep of deps) {\n if (rootDeps.has(dep.depName!)) {\n dep.depType = 'parent-root';\n }\n }\n return { ...pkg, deps };\n });\n\n return packageFiles;\n}\n\nfunction cleanResult(packageFiles: MavenInterimPackageFile[]): PackageFile[] {\n packageFiles.forEach((packageFile) => {\n delete packageFile.mavenProps;\n delete packageFile.parent;\n packageFile.deps.forEach((dep) => {\n delete dep.propSource;\n //Add Registry From SuperPom\n if (dep.datasource === MavenDatasource.id) {\n dep.registryUrls!.push(MAVEN_REPO);\n }\n });\n });\n return packageFiles;\n}\n\nexport function extractExtensions(\n rawContent: string,\n packageFile: string,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const extensions = parseExtensions(rawContent, packageFile);\n if (!extensions) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(extensions);\n\n return result;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[]> {\n const packages: PackageFile[] = [];\n const additionalRegistryUrls: string[] = [];\n\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug({ packageFile }, 'packageFile has no content');\n continue;\n }\n if (packageFile.endsWith('settings.xml')) {\n const registries = extractRegistries(content);\n if (registries) {\n logger.debug(\n { registries, packageFile },\n 'Found registryUrls in settings.xml',\n );\n additionalRegistryUrls.push(...registries);\n }\n } else if (packageFile.endsWith('.mvn/extensions.xml')) {\n const extensions = extractExtensions(content, packageFile);\n if (extensions) {\n packages.push(extensions);\n } else {\n logger.trace({ packageFile }, 'can not read extensions');\n }\n } else {\n const pkg = extractPackage(content, packageFile, config);\n if (pkg) {\n packages.push(pkg);\n } else {\n logger.trace({ packageFile }, 'can not read dependencies');\n }\n }\n }\n if (additionalRegistryUrls) {\n for (const pkgFile of packages) {\n for (const dep of pkgFile.deps) {\n if (dep.registryUrls) {\n dep.registryUrls.unshift(...additionalRegistryUrls);\n }\n }\n }\n }\n return cleanResult(resolveParents(packages));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":["getDockerDep","getBuildpackDep"],"sources":["../../../../lib/modules/manager/maven/extract.ts"],"sourcesContent":["import { isArray, isNonEmptyArray } from '@sindresorhus/is';\nimport upath from 'upath';\nimport type { XmlElement } from 'xmldoc';\nimport { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { MAVEN_REPO } from '../../datasource/maven/common.ts';\nimport { MavenDatasource } from '../../datasource/maven/index.ts';\nimport {\n BUILDPACK_REGISTRY_PREFIX,\n DOCKER_PREFIX,\n getDep as getBuildpackDep,\n isBuildpackRegistryRef,\n isDockerRef,\n} from '../buildpacks/extract.ts';\nimport { getDep as getDockerDep } from '../dockerfile/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n} from '../types.ts';\nimport type { MavenProp } from './types.ts';\n\nconst supportedNamespaces = [\n 'http://maven.apache.org/SETTINGS/1.0.0',\n 'http://maven.apache.org/SETTINGS/1.1.0',\n 'http://maven.apache.org/SETTINGS/1.2.0',\n];\n\nconst supportedExtensionsNamespaces = [\n 'http://maven.apache.org/EXTENSIONS/1.0.0',\n 'http://maven.apache.org/EXTENSIONS/1.1.0',\n 'http://maven.apache.org/EXTENSIONS/1.2.0',\n];\n\nfunction parsePom(raw: string, packageFile: string): XmlDocument | null {\n let project: XmlDocument;\n try {\n project = new XmlDocument(raw);\n if (raw.includes('\\r\\n')) {\n logger.warn(\n 'Your pom.xml contains windows line endings. This is not supported and may result in parsing issues.',\n );\n }\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = project;\n if (name !== 'project') {\n return null;\n }\n if (attr.xmlns === 'http://maven.apache.org/POM/4.0.0') {\n return project;\n }\n if (\n isNonEmptyArray(children) &&\n children.some((c: any) => c.name === 'modelVersion' && c.val === '4.0.0')\n ) {\n return project;\n }\n return null;\n}\n\nfunction parseExtensions(raw: string, packageFile: string): XmlDocument | null {\n let extensions: XmlDocument;\n try {\n extensions = new XmlDocument(raw);\n } catch {\n logger.debug({ packageFile }, `Failed to parse as XML`);\n return null;\n }\n const { name, attr, children } = extensions;\n if (name !== 'extensions') {\n return null;\n }\n if (!supportedExtensionsNamespaces.includes(attr.xmlns)) {\n return null;\n }\n if (!isNonEmptyArray(children)) {\n return null;\n }\n return extensions;\n}\n\nfunction containsPlaceholder(str: string | null | undefined): boolean {\n return (\n !!str &&\n (regEx(/\\${[^}]*?}/).test(str) || regEx(/\\{\\{[^}]*?\\}\\}/).test(str))\n );\n}\n\nfunction getCNBDependencies(\n nodes: XmlElement[],\n config: ExtractConfig,\n): PackageDependency[] {\n const deps: PackageDependency[] = [];\n for (const node of nodes) {\n const depString = node.val.trim();\n if (isDockerRef(depString)) {\n const dep = getDockerDep(\n depString.replace(DOCKER_PREFIX, ''),\n true,\n config.registryAliases,\n );\n\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n if (dep.currentValue || dep.currentDigest) {\n deps.push(dep);\n }\n } else if (isBuildpackRegistryRef(depString)) {\n const dep = getBuildpackDep(\n depString.replace(BUILDPACK_REGISTRY_PREFIX, ''),\n );\n\n if (dep?.currentValue) {\n dep.fileReplacePosition = node.position!; // TODO: should not be null\n deps.push(dep);\n }\n }\n }\n return deps;\n}\n\nfunction getAllCNBDependencies(\n node: XmlDocument,\n config: ExtractConfig,\n): PackageDependency[] | null {\n const pluginNodes =\n node.childNamed('build')?.childNamed('plugins')?.childrenNamed('plugin') ??\n [];\n\n const pluginNode = pluginNodes.find((pluginNode) => {\n return (\n pluginNode.valueWithPath('groupId')?.trim() ===\n 'org.springframework.boot' &&\n pluginNode.valueWithPath('artifactId')?.trim() ===\n 'spring-boot-maven-plugin'\n );\n });\n if (!pluginNode) {\n return null;\n }\n\n const deps: PackageDependency[] = [];\n const imageNode = pluginNode.childNamed('configuration')?.childNamed('image');\n if (!imageNode) {\n return null;\n }\n const builder = getCNBDependencies(\n imageNode.childrenNamed('builder'),\n config,\n );\n const runImage = getCNBDependencies(\n imageNode.childrenNamed('runImage'),\n config,\n );\n const buildpacks = getCNBDependencies(\n imageNode.childNamed('buildpacks')?.childrenNamed('buildpack') ?? [],\n config,\n );\n deps.push(...builder, ...runImage, ...buildpacks);\n\n return deps.length ? deps : null;\n}\n\nfunction depFromNode(\n node: XmlElement,\n underBuildSettingsElement: boolean,\n): PackageDependency | null {\n if (!('valueWithPath' in node)) {\n return null;\n }\n let groupId = node.valueWithPath('groupId')?.trim();\n const artifactId = node.valueWithPath('artifactId')?.trim();\n const currentValue = node.valueWithPath('version')?.trim();\n let depType: string | undefined;\n\n if (!groupId && node.name === 'plugin') {\n groupId = 'org.apache.maven.plugins';\n }\n\n if (groupId && artifactId && currentValue) {\n const depName = `${groupId}:${artifactId}`;\n const versionNode = node.descendantWithPath('version')!;\n const fileReplacePosition = versionNode.position!; // TODO: should not be null\n const datasource = MavenDatasource.id;\n const result: PackageDependency = {\n datasource,\n depName,\n currentValue,\n fileReplacePosition,\n registryUrls: [],\n };\n\n switch (node.name) {\n case 'plugin':\n case 'extension':\n depType = 'build';\n break;\n case 'parent':\n depType = 'parent';\n break;\n case 'dependency':\n if (underBuildSettingsElement) {\n depType = 'build';\n } else if (node.valueWithPath('optional')?.trim() === 'true') {\n depType = 'optional';\n } else {\n depType = node.valueWithPath('scope')?.trim() ?? 'compile'; // maven default scope is compile\n }\n break;\n }\n\n if (depType) {\n result.depType = depType;\n }\n\n return result;\n }\n return null;\n}\n\nfunction deepExtract(\n node: XmlElement,\n result: PackageDependency[] = [],\n isRoot = true,\n underBuildSettingsElement = false,\n): PackageDependency[] {\n const dep = depFromNode(node, underBuildSettingsElement);\n if (dep && !isRoot) {\n result.push(dep);\n }\n if (node.children) {\n for (const child of node.children) {\n deepExtract(\n child as XmlElement,\n result,\n false,\n node.name === 'build' ||\n node.name === 'reporting' ||\n underBuildSettingsElement,\n );\n }\n }\n return result;\n}\n\nfunction applyProps(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n): PackageDependency {\n let result = dep;\n let anyChange = false;\n const alreadySeenProps = new Set<string>();\n\n do {\n const [returnedResult, returnedAnyChange, fatal] = applyPropsInternal(\n result,\n depPackageFile,\n props,\n alreadySeenProps,\n );\n if (fatal) {\n dep.skipReason = 'recursive-placeholder';\n return dep;\n }\n result = returnedResult;\n anyChange = returnedAnyChange;\n } while (anyChange);\n\n if (containsPlaceholder(result.depName)) {\n result.skipReason = 'name-placeholder';\n } else if (containsPlaceholder(result.currentValue)) {\n result.skipReason = 'version-placeholder';\n }\n\n return result;\n}\n\nfunction applyPropsInternal(\n dep: PackageDependency,\n depPackageFile: string,\n props: MavenProp,\n previouslySeenProps: Set<string>,\n): [PackageDependency, boolean, boolean] {\n let anyChange = false;\n let fatal = false;\n\n const seenProps = new Set<string>();\n\n function replaceAll(str: string): string {\n return str.replace(regEx(/\\${[^}]*?}/g), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n let depName = dep.depName;\n if (dep.depName) {\n depName = replaceAll(dep.depName);\n }\n\n const registryUrls = dep.registryUrls!.map((url) => replaceAll(url));\n\n let fileReplacePosition = dep.fileReplacePosition;\n let propSource = dep.propSource;\n let sharedVariableName: string | null = null;\n let currentValue: string | null = null;\n\n if (dep.currentValue) {\n currentValue = dep.currentValue.replace(regEx(/^\\${[^}]*?}$/), (substr) => {\n const propKey = substr.slice(2, -1).trim();\n // TODO: wrong types here, props is already `MavenProp`\n const propValue = (props as any)[propKey] as MavenProp;\n if (propValue) {\n sharedVariableName ??= propKey;\n fileReplacePosition = propValue.fileReplacePosition;\n propSource =\n propValue.packageFile ??\n // istanbul ignore next\n undefined;\n anyChange = true;\n if (previouslySeenProps.has(propKey)) {\n fatal = true;\n } else {\n seenProps.add(propKey);\n }\n return propValue.val;\n }\n return substr;\n });\n }\n\n const result: PackageDependency = {\n ...dep,\n depName,\n registryUrls,\n fileReplacePosition,\n propSource,\n currentValue,\n };\n\n if (sharedVariableName) {\n result.sharedVariableName = sharedVariableName;\n }\n\n if (propSource && depPackageFile !== propSource) {\n result.editFile = propSource;\n }\n\n for (const prop of seenProps) {\n previouslySeenProps.add(prop);\n }\n return [result, anyChange, fatal];\n}\n\nfunction resolveParentFile(packageFile: string, parentPath: string): string {\n let parentFile = 'pom.xml';\n let parentDir = parentPath;\n const parentBasename = upath.basename(parentPath);\n if (parentBasename === 'pom.xml' || parentBasename.endsWith('.pom.xml')) {\n parentFile = parentBasename;\n parentDir = upath.dirname(parentPath);\n }\n const dir = upath.dirname(packageFile);\n return upath.normalize(upath.join(dir, parentDir, parentFile));\n}\n\ninterface MavenInterimPackageFile extends PackageFile {\n mavenProps?: Record<string, any>;\n parent?: string;\n}\n\nexport function extractPackage(\n rawContent: string,\n packageFile: string,\n config: ExtractConfig,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const project = parsePom(rawContent, packageFile);\n if (!project) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(project);\n\n const CNBDependencies = getAllCNBDependencies(project, config);\n if (CNBDependencies) {\n result.deps.push(...CNBDependencies);\n }\n\n const propsNode = project.childNamed('properties');\n const props: Record<string, MavenProp> = {};\n if (propsNode?.children) {\n for (const propNode of propsNode.children as XmlElement[]) {\n const key = propNode.name;\n const val = propNode?.val?.trim();\n if (key && val && propNode.position) {\n const fileReplacePosition = propNode.position;\n props[key] = { val, fileReplacePosition, packageFile };\n }\n }\n }\n result.mavenProps = props;\n\n const repositories = project.childNamed('repositories');\n if (repositories?.children) {\n const repoUrls: string[] = [];\n for (const repo of repositories.childrenNamed('repository')) {\n const repoUrl = repo.valueWithPath('url')?.trim();\n if (repoUrl) {\n repoUrls.push(repoUrl);\n }\n }\n result.deps.forEach((dep) => {\n if (isArray(dep.registryUrls)) {\n repoUrls.forEach((url) => dep.registryUrls!.push(url));\n }\n });\n }\n\n if (packageFile && project.childNamed('parent')) {\n const parentPath =\n project.valueWithPath('parent.relativePath')?.trim() ?? '../pom.xml';\n result.parent = resolveParentFile(packageFile, parentPath);\n }\n\n if (project.childNamed('version')) {\n result.packageFileVersion = project.valueWithPath('version')!.trim();\n }\n\n return result;\n}\n\nexport function extractRegistries(rawContent: string): string[] {\n if (!rawContent) {\n return [];\n }\n\n const settings = parseSettings(rawContent);\n if (!settings) {\n return [];\n }\n\n const urls: string[] = [];\n\n const mirrorUrls = parseUrls(settings, 'mirrors');\n urls.push(...mirrorUrls);\n\n settings.childNamed('profiles')?.eachChild((profile) => {\n const repositoryUrls = parseUrls(profile, 'repositories');\n urls.push(...repositoryUrls);\n });\n\n // filter out duplicates\n return [...new Set(urls)];\n}\n\nfunction parseUrls(xmlNode: XmlElement, path: string): string[] {\n const children = xmlNode.descendantWithPath(path);\n const urls: string[] = [];\n if (children?.children) {\n children.eachChild((child) => {\n const url = child.valueWithPath('url');\n if (url) {\n urls.push(url);\n }\n });\n }\n return urls;\n}\n\nexport function parseSettings(raw: string): XmlDocument | null {\n let settings: XmlDocument;\n try {\n settings = new XmlDocument(raw);\n } catch {\n return null;\n }\n const { name, attr } = settings;\n if (name !== 'settings') {\n return null;\n }\n if (supportedNamespaces.includes(attr.xmlns)) {\n return settings;\n }\n return null;\n}\n\nexport function resolveParents(packages: PackageFile[]): PackageFile[] {\n const packageFileNames: string[] = [];\n const extractedPackages: Record<string, MavenInterimPackageFile> = {};\n const extractedDeps: Record<string, PackageDependency[]> = {};\n const extractedProps: Record<string, MavenProp> = {};\n const registryUrls: Record<string, Set<string>> = {};\n packages.forEach((pkg) => {\n const name = pkg.packageFile;\n packageFileNames.push(name);\n extractedPackages[name] = pkg;\n extractedDeps[name] = [];\n });\n\n // Construct package-specific prop scopes\n // and merge them in reverse order,\n // which allows inheritance/overriding.\n packageFileNames.forEach((name) => {\n registryUrls[name] = new Set();\n const propsHierarchy: Record<string, MavenProp>[] = [];\n const visitedPackages = new Set<string>();\n let pkg: MavenInterimPackageFile | null = extractedPackages[name];\n while (pkg) {\n propsHierarchy.unshift(pkg.mavenProps!);\n\n if (pkg.deps) {\n pkg.deps.forEach((dep) => {\n if (dep.registryUrls) {\n dep.registryUrls.forEach((url) => {\n registryUrls[name].add(url);\n });\n }\n });\n }\n\n if (pkg.parent && !visitedPackages.has(pkg.parent)) {\n visitedPackages.add(pkg.parent);\n pkg = extractedPackages[pkg.parent];\n } else {\n pkg = null;\n }\n }\n propsHierarchy.unshift({});\n extractedProps[name] = Object.assign.apply(null, propsHierarchy as any);\n });\n\n // Resolve registryUrls\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const urlsSet = new Set([\n ...(rawDep.registryUrls ?? []),\n ...registryUrls[name],\n ]);\n rawDep.registryUrls = [...urlsSet];\n });\n });\n\n const rootDeps = new Set<string>();\n // Resolve placeholders\n packageFileNames.forEach((name) => {\n const pkg = extractedPackages[name];\n pkg.deps.forEach((rawDep) => {\n const dep = applyProps(rawDep, name, extractedProps[name]);\n if (dep.depType === 'parent') {\n const parentPkg = extractedPackages[pkg.parent!];\n const hasParentWithNoParent = parentPkg && !parentPkg.parent;\n const hasParentWithExternalParent =\n parentPkg && !packageFileNames.includes(parentPkg.parent!);\n if (hasParentWithNoParent || hasParentWithExternalParent) {\n rootDeps.add(dep.depName!);\n }\n }\n const sourceName = dep.propSource ?? name;\n extractedDeps[sourceName].push(dep);\n });\n });\n\n const packageFiles = packageFileNames.map((packageFile) => {\n const pkg = extractedPackages[packageFile];\n const deps = extractedDeps[packageFile];\n for (const dep of deps) {\n if (rootDeps.has(dep.depName!)) {\n dep.depType = 'parent-root';\n }\n }\n return { ...pkg, deps };\n });\n\n return packageFiles;\n}\n\nfunction cleanResult(packageFiles: MavenInterimPackageFile[]): PackageFile[] {\n packageFiles.forEach((packageFile) => {\n delete packageFile.mavenProps;\n delete packageFile.parent;\n packageFile.deps.forEach((dep) => {\n delete dep.propSource;\n //Add Registry From SuperPom\n if (dep.datasource === MavenDatasource.id) {\n dep.registryUrls!.push(MAVEN_REPO);\n }\n });\n });\n return packageFiles;\n}\n\nexport function extractExtensions(\n rawContent: string,\n packageFile: string,\n): PackageFile | null {\n if (!rawContent) {\n return null;\n }\n\n const extensions = parseExtensions(rawContent, packageFile);\n if (!extensions) {\n return null;\n }\n\n const result: MavenInterimPackageFile = {\n datasource: MavenDatasource.id,\n packageFile,\n deps: [],\n };\n\n result.deps = deepExtract(extensions);\n\n return result;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile[]> {\n const packages: PackageFile[] = [];\n const additionalRegistryUrls: string[] = [];\n\n for (const packageFile of packageFiles) {\n const content = await readLocalFile(packageFile, 'utf8');\n if (!content) {\n logger.debug({ packageFile }, 'packageFile has no content');\n continue;\n }\n if (packageFile.endsWith('settings.xml')) {\n const registries = extractRegistries(content);\n if (registries) {\n logger.debug(\n { registries, packageFile },\n 'Found registryUrls in settings.xml',\n );\n additionalRegistryUrls.push(...registries);\n }\n } else if (packageFile.endsWith('.mvn/extensions.xml')) {\n const extensions = extractExtensions(content, packageFile);\n if (extensions) {\n packages.push(extensions);\n } else {\n logger.trace({ packageFile }, 'can not read extensions');\n }\n } else {\n const pkg = extractPackage(content, packageFile, config);\n if (pkg) {\n packages.push(pkg);\n } else {\n logger.trace({ packageFile }, 'can not read dependencies');\n }\n }\n }\n if (additionalRegistryUrls) {\n for (const pkgFile of packages) {\n for (const dep of pkgFile.deps) {\n if (dep.registryUrls) {\n dep.registryUrls.unshift(...additionalRegistryUrls);\n }\n }\n }\n }\n return cleanResult(resolveParents(packages));\n}\n"],"mappings":";;;;;;;;;;;AAwBA,MAAM,sBAAsB;CAC1B;CACA;CACA;AACF;AAEA,MAAM,gCAAgC;CACpC;CACA;CACA;AACF;AAEA,SAAS,SAAS,KAAa,aAAyC;CACtE,IAAI;CACJ,IAAI;EACF,UAAU,IAAI,YAAY,GAAG;EAC7B,IAAI,IAAI,SAAS,MAAM,GACrB,OAAO,KACL,qGACF;CAEJ,QAAQ;EACN,OAAO,MAAM,EAAE,YAAY,GAAG,wBAAwB;EACtD,OAAO;CACT;CACA,MAAM,EAAE,MAAM,MAAM,aAAa;CACjC,IAAI,SAAS,WACX,OAAO;CAET,IAAI,KAAK,UAAU,qCACjB,OAAO;CAET,IACE,gBAAgB,QAAQ,KACxB,SAAS,MAAM,MAAW,EAAE,SAAS,kBAAkB,EAAE,QAAQ,OAAO,GAExE,OAAO;CAET,OAAO;AACT;AAEA,SAAS,gBAAgB,KAAa,aAAyC;CAC7E,IAAI;CACJ,IAAI;EACF,aAAa,IAAI,YAAY,GAAG;CAClC,QAAQ;EACN,OAAO,MAAM,EAAE,YAAY,GAAG,wBAAwB;EACtD,OAAO;CACT;CACA,MAAM,EAAE,MAAM,MAAM,aAAa;CACjC,IAAI,SAAS,cACX,OAAO;CAET,IAAI,CAAC,8BAA8B,SAAS,KAAK,KAAK,GACpD,OAAO;CAET,IAAI,CAAC,gBAAgB,QAAQ,GAC3B,OAAO;CAET,OAAO;AACT;AAEA,SAAS,oBAAoB,KAAyC;CACpE,OACE,CAAC,CAAC,QACD,MAAM,YAAY,CAAC,CAAC,KAAK,GAAG,KAAK,MAAM,gBAAgB,CAAC,CAAC,KAAK,GAAG;AAEtE;AAEA,SAAS,mBACP,OACA,QACqB;CACrB,MAAM,OAA4B,CAAC;CACnC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,YAAY,KAAK,IAAI,KAAK;EAChC,IAAI,YAAY,SAAS,GAAG;GAC1B,MAAM,MAAMA,OACV,UAAU,QAAQ,eAAe,EAAE,GACnC,MACA,OAAO,eACT;GAEA,IAAI,sBAAsB,KAAK;GAC/B,IAAI,IAAI,gBAAgB,IAAI,eAC1B,KAAK,KAAK,GAAG;EAEjB,OAAO,IAAI,uBAAuB,SAAS,GAAG;GAC5C,MAAM,MAAMC,SACV,UAAU,QAAQ,2BAA2B,EAAE,CACjD;GAEA,IAAI,KAAK,cAAc;IACrB,IAAI,sBAAsB,KAAK;IAC/B,KAAK,KAAK,GAAG;GACf;EACF;CACF;CACA,OAAO;AACT;AAEA,SAAS,sBACP,MACA,QAC4B;CAK5B,MAAM,cAHJ,KAAK,WAAW,OAAO,CAAC,EAAE,WAAW,SAAS,CAAC,EAAE,cAAc,QAAQ,KACvE,CAAC,EAAA,CAE4B,MAAM,eAAe;EAClD,OACE,WAAW,cAAc,SAAS,CAAC,EAAE,KAAK,MACxC,8BACF,WAAW,cAAc,YAAY,CAAC,EAAE,KAAK,MAC3C;CAEN,CAAC;CACD,IAAI,CAAC,YACH,OAAO;CAGT,MAAM,OAA4B,CAAC;CACnC,MAAM,YAAY,WAAW,WAAW,eAAe,CAAC,EAAE,WAAW,OAAO;CAC5E,IAAI,CAAC,WACH,OAAO;CAET,MAAM,UAAU,mBACd,UAAU,cAAc,SAAS,GACjC,MACF;CACA,MAAM,WAAW,mBACf,UAAU,cAAc,UAAU,GAClC,MACF;CACA,MAAM,aAAa,mBACjB,UAAU,WAAW,YAAY,CAAC,EAAE,cAAc,WAAW,KAAK,CAAC,GACnE,MACF;CACA,KAAK,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU;CAEhD,OAAO,KAAK,SAAS,OAAO;AAC9B;AAEA,SAAS,YACP,MACA,2BAC0B;CAC1B,IAAI,EAAE,mBAAmB,OACvB,OAAO;CAET,IAAI,UAAU,KAAK,cAAc,SAAS,CAAC,EAAE,KAAK;CAClD,MAAM,aAAa,KAAK,cAAc,YAAY,CAAC,EAAE,KAAK;CAC1D,MAAM,eAAe,KAAK,cAAc,SAAS,CAAC,EAAE,KAAK;CACzD,IAAI;CAEJ,IAAI,CAAC,WAAW,KAAK,SAAS,UAC5B,UAAU;CAGZ,IAAI,WAAW,cAAc,cAAc;EACzC,MAAM,UAAU,GAAG,QAAQ,GAAG;EAE9B,MAAM,sBADc,KAAK,mBAAmB,SACN,CAAC,CAAC;EAExC,MAAM,SAA4B;GAChC,YAFiB,gBAAgB;GAGjC;GACA;GACA;GACA,cAAc,CAAC;EACjB;EAEA,QAAQ,KAAK,MAAb;GACE,KAAK;GACL,KAAK;IACH,UAAU;IACV;GACF,KAAK;IACH,UAAU;IACV;GACF,KAAK;IACH,IAAI,2BACF,UAAU;SACL,IAAI,KAAK,cAAc,UAAU,CAAC,EAAE,KAAK,MAAM,QACpD,UAAU;SAEV,UAAU,KAAK,cAAc,OAAO,CAAC,EAAE,KAAK,KAAK;IAEnD;EACJ;EAEA,IAAI,SACF,OAAO,UAAU;EAGnB,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAS,YACP,MACA,SAA8B,CAAC,GAC/B,SAAS,MACT,4BAA4B,OACP;CACrB,MAAM,MAAM,YAAY,MAAM,yBAAyB;CACvD,IAAI,OAAO,CAAC,QACV,OAAO,KAAK,GAAG;CAEjB,IAAI,KAAK,UACP,KAAK,MAAM,SAAS,KAAK,UACvB,YACE,OACA,QACA,OACA,KAAK,SAAS,WACZ,KAAK,SAAS,eACd,yBACJ;CAGJ,OAAO;AACT;AAEA,SAAS,WACP,KACA,gBACA,OACmB;CACnB,IAAI,SAAS;CACb,IAAI,YAAY;CAChB,MAAM,mCAAmB,IAAI,IAAY;CAEzC,GAAG;EACD,MAAM,CAAC,gBAAgB,mBAAmB,SAAS,mBACjD,QACA,gBACA,OACA,gBACF;EACA,IAAI,OAAO;GACT,IAAI,aAAa;GACjB,OAAO;EACT;EACA,SAAS;EACT,YAAY;CACd,SAAS;CAET,IAAI,oBAAoB,OAAO,OAAO,GACpC,OAAO,aAAa;MACf,IAAI,oBAAoB,OAAO,YAAY,GAChD,OAAO,aAAa;CAGtB,OAAO;AACT;AAEA,SAAS,mBACP,KACA,gBACA,OACA,qBACuC;CACvC,IAAI,YAAY;CAChB,IAAI,QAAQ;CAEZ,MAAM,4BAAY,IAAI,IAAY;CAElC,SAAS,WAAW,KAAqB;EACvC,OAAO,IAAI,QAAQ,MAAM,aAAa,IAAI,WAAW;GACnD,MAAM,UAAU,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;GAEzC,MAAM,YAAa,MAAc;GACjC,IAAI,WAAW;IACb,YAAY;IACZ,IAAI,oBAAoB,IAAI,OAAO,GACjC,QAAQ;SAER,UAAU,IAAI,OAAO;IAEvB,OAAO,UAAU;GACnB;GACA,OAAO;EACT,CAAC;CACH;CAEA,IAAI,UAAU,IAAI;CAClB,IAAI,IAAI,SACN,UAAU,WAAW,IAAI,OAAO;CAGlC,MAAM,eAAe,IAAI,aAAc,KAAK,QAAQ,WAAW,GAAG,CAAC;CAEnE,IAAI,sBAAsB,IAAI;CAC9B,IAAI,aAAa,IAAI;CACrB,IAAI,qBAAoC;CACxC,IAAI,eAA8B;CAElC,IAAI,IAAI,cACN,eAAe,IAAI,aAAa,QAAQ,MAAM,cAAc,IAAI,WAAW;EACzE,MAAM,UAAU,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;EAEzC,MAAM,YAAa,MAAc;EACjC,IAAI,WAAW;GACb,uBAAuB;GACvB,sBAAsB,UAAU;GAChC,aACE,UAAU,eAEV,KAAA;GACF,YAAY;GACZ,IAAI,oBAAoB,IAAI,OAAO,GACjC,QAAQ;QAER,UAAU,IAAI,OAAO;GAEvB,OAAO,UAAU;EACnB;EACA,OAAO;CACT,CAAC;CAGH,MAAM,SAA4B;EAChC,GAAG;EACH;EACA;EACA;EACA;EACA;CACF;CAEA,IAAI,oBACF,OAAO,qBAAqB;CAG9B,IAAI,cAAc,mBAAmB,YACnC,OAAO,WAAW;CAGpB,KAAK,MAAM,QAAQ,WACjB,oBAAoB,IAAI,IAAI;CAE9B,OAAO;EAAC;EAAQ;EAAW;CAAK;AAClC;AAEA,SAAS,kBAAkB,aAAqB,YAA4B;CAC1E,IAAI,aAAa;CACjB,IAAI,YAAY;CAChB,MAAM,iBAAiB,MAAM,SAAS,UAAU;CAChD,IAAI,mBAAmB,aAAa,eAAe,SAAS,UAAU,GAAG;EACvE,aAAa;EACb,YAAY,MAAM,QAAQ,UAAU;CACtC;CACA,MAAM,MAAM,MAAM,QAAQ,WAAW;CACrC,OAAO,MAAM,UAAU,MAAM,KAAK,KAAK,WAAW,UAAU,CAAC;AAC/D;AAOA,SAAgB,eACd,YACA,aACA,QACoB;CACpB,IAAI,CAAC,YACH,OAAO;CAGT,MAAM,UAAU,SAAS,YAAY,WAAW;CAChD,IAAI,CAAC,SACH,OAAO;CAGT,MAAM,SAAkC;EACtC,YAAY,gBAAgB;EAC5B;EACA,MAAM,CAAC;CACT;CAEA,OAAO,OAAO,YAAY,OAAO;CAEjC,MAAM,kBAAkB,sBAAsB,SAAS,MAAM;CAC7D,IAAI,iBACF,OAAO,KAAK,KAAK,GAAG,eAAe;CAGrC,MAAM,YAAY,QAAQ,WAAW,YAAY;CACjD,MAAM,QAAmC,CAAC;CAC1C,IAAI,WAAW,UACb,KAAK,MAAM,YAAY,UAAU,UAA0B;EACzD,MAAM,MAAM,SAAS;EACrB,MAAM,MAAM,UAAU,KAAK,KAAK;EAChC,IAAI,OAAO,OAAO,SAAS,UAEzB,MAAM,OAAO;GAAE;GAAK,qBADQ,SAAS;GACI;EAAY;CAEzD;CAEF,OAAO,aAAa;CAEpB,MAAM,eAAe,QAAQ,WAAW,cAAc;CACtD,IAAI,cAAc,UAAU;EAC1B,MAAM,WAAqB,CAAC;EAC5B,KAAK,MAAM,QAAQ,aAAa,cAAc,YAAY,GAAG;GAC3D,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAAE,KAAK;GAChD,IAAI,SACF,SAAS,KAAK,OAAO;EAEzB;EACA,OAAO,KAAK,SAAS,QAAQ;GAC3B,IAAI,QAAQ,IAAI,YAAY,GAC1B,SAAS,SAAS,QAAQ,IAAI,aAAc,KAAK,GAAG,CAAC;EAEzD,CAAC;CACH;CAEA,IAAI,eAAe,QAAQ,WAAW,QAAQ,GAG5C,OAAO,SAAS,kBAAkB,aADhC,QAAQ,cAAc,qBAAqB,CAAC,EAAE,KAAK,KAAK,YACD;CAG3D,IAAI,QAAQ,WAAW,SAAS,GAC9B,OAAO,qBAAqB,QAAQ,cAAc,SAAS,CAAC,CAAE,KAAK;CAGrE,OAAO;AACT;AAEA,SAAgB,kBAAkB,YAA8B;CAC9D,IAAI,CAAC,YACH,OAAO,CAAC;CAGV,MAAM,WAAW,cAAc,UAAU;CACzC,IAAI,CAAC,UACH,OAAO,CAAC;CAGV,MAAM,OAAiB,CAAC;CAExB,MAAM,aAAa,UAAU,UAAU,SAAS;CAChD,KAAK,KAAK,GAAG,UAAU;CAEvB,SAAS,WAAW,UAAU,CAAC,EAAE,WAAW,YAAY;EACtD,MAAM,iBAAiB,UAAU,SAAS,cAAc;EACxD,KAAK,KAAK,GAAG,cAAc;CAC7B,CAAC;CAGD,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;AAEA,SAAS,UAAU,SAAqB,MAAwB;CAC9D,MAAM,WAAW,QAAQ,mBAAmB,IAAI;CAChD,MAAM,OAAiB,CAAC;CACxB,IAAI,UAAU,UACZ,SAAS,WAAW,UAAU;EAC5B,MAAM,MAAM,MAAM,cAAc,KAAK;EACrC,IAAI,KACF,KAAK,KAAK,GAAG;CAEjB,CAAC;CAEH,OAAO;AACT;AAEA,SAAgB,cAAc,KAAiC;CAC7D,IAAI;CACJ,IAAI;EACF,WAAW,IAAI,YAAY,GAAG;CAChC,QAAQ;EACN,OAAO;CACT;CACA,MAAM,EAAE,MAAM,SAAS;CACvB,IAAI,SAAS,YACX,OAAO;CAET,IAAI,oBAAoB,SAAS,KAAK,KAAK,GACzC,OAAO;CAET,OAAO;AACT;AAEA,SAAgB,eAAe,UAAwC;CACrE,MAAM,mBAA6B,CAAC;CACpC,MAAM,oBAA6D,CAAC;CACpE,MAAM,gBAAqD,CAAC;CAC5D,MAAM,iBAA4C,CAAC;CACnD,MAAM,eAA4C,CAAC;CACnD,SAAS,SAAS,QAAQ;EACxB,MAAM,OAAO,IAAI;EACjB,iBAAiB,KAAK,IAAI;EAC1B,kBAAkB,QAAQ;EAC1B,cAAc,QAAQ,CAAC;CACzB,CAAC;CAKD,iBAAiB,SAAS,SAAS;EACjC,aAAa,wBAAQ,IAAI,IAAI;EAC7B,MAAM,iBAA8C,CAAC;EACrD,MAAM,kCAAkB,IAAI,IAAY;EACxC,IAAI,MAAsC,kBAAkB;EAC5D,OAAO,KAAK;GACV,eAAe,QAAQ,IAAI,UAAW;GAEtC,IAAI,IAAI,MACN,IAAI,KAAK,SAAS,QAAQ;IACxB,IAAI,IAAI,cACN,IAAI,aAAa,SAAS,QAAQ;KAChC,aAAa,KAAK,CAAC,IAAI,GAAG;IAC5B,CAAC;GAEL,CAAC;GAGH,IAAI,IAAI,UAAU,CAAC,gBAAgB,IAAI,IAAI,MAAM,GAAG;IAClD,gBAAgB,IAAI,IAAI,MAAM;IAC9B,MAAM,kBAAkB,IAAI;GAC9B,OACE,MAAM;EAEV;EACA,eAAe,QAAQ,CAAC,CAAC;EACzB,eAAe,QAAQ,OAAO,OAAO,MAAM,MAAM,cAAqB;CACxE,CAAC;CAGD,iBAAiB,SAAS,SAAS;EAEjC,kBAD8B,KAC3B,CAAC,KAAK,SAAS,WAAW;GAK3B,OAAO,eAAe,CAAC,mBAAG,IAJN,IAAI,CACtB,GAAI,OAAO,gBAAgB,CAAC,GAC5B,GAAG,aAAa,KAClB,CACgC,CAAC;EACnC,CAAC;CACH,CAAC;CAED,MAAM,2BAAW,IAAI,IAAY;CAEjC,iBAAiB,SAAS,SAAS;EACjC,MAAM,MAAM,kBAAkB;EAC9B,IAAI,KAAK,SAAS,WAAW;GAC3B,MAAM,MAAM,WAAW,QAAQ,MAAM,eAAe,KAAK;GACzD,IAAI,IAAI,YAAY,UAAU;IAC5B,MAAM,YAAY,kBAAkB,IAAI;IACxC,MAAM,wBAAwB,aAAa,CAAC,UAAU;IACtD,MAAM,8BACJ,aAAa,CAAC,iBAAiB,SAAS,UAAU,MAAO;IAC3D,IAAI,yBAAyB,6BAC3B,SAAS,IAAI,IAAI,OAAQ;GAE7B;GACA,MAAM,aAAa,IAAI,cAAc;GACrC,cAAc,WAAW,CAAC,KAAK,GAAG;EACpC,CAAC;CACH,CAAC;CAaD,OAXqB,iBAAiB,KAAK,gBAAgB;EACzD,MAAM,MAAM,kBAAkB;EAC9B,MAAM,OAAO,cAAc;EAC3B,KAAK,MAAM,OAAO,MAChB,IAAI,SAAS,IAAI,IAAI,OAAQ,GAC3B,IAAI,UAAU;EAGlB,OAAO;GAAE,GAAG;GAAK;EAAK;CACxB,CAEkB;AACpB;AAEA,SAAS,YAAY,cAAwD;CAC3E,aAAa,SAAS,gBAAgB;EACpC,OAAO,YAAY;EACnB,OAAO,YAAY;EACnB,YAAY,KAAK,SAAS,QAAQ;GAChC,OAAO,IAAI;GAEX,IAAI,IAAI,eAAe,gBAAgB,IACrC,IAAI,aAAc,KAAK,UAAU;EAErC,CAAC;CACH,CAAC;CACD,OAAO;AACT;AAEA,SAAgB,kBACd,YACA,aACoB;CACpB,IAAI,CAAC,YACH,OAAO;CAGT,MAAM,aAAa,gBAAgB,YAAY,WAAW;CAC1D,IAAI,CAAC,YACH,OAAO;CAGT,MAAM,SAAkC;EACtC,YAAY,gBAAgB;EAC5B;EACA,MAAM,CAAC;CACT;CAEA,OAAO,OAAO,YAAY,UAAU;CAEpC,OAAO;AACT;AAEA,eAAsB,uBACpB,QACA,cACwB;CACxB,MAAM,WAA0B,CAAC;CACjC,MAAM,yBAAmC,CAAC;CAE1C,KAAK,MAAM,eAAe,cAAc;EACtC,MAAM,UAAU,MAAM,cAAc,aAAa,MAAM;EACvD,IAAI,CAAC,SAAS;GACZ,OAAO,MAAM,EAAE,YAAY,GAAG,4BAA4B;GAC1D;EACF;EACA,IAAI,YAAY,SAAS,cAAc,GAAG;GACxC,MAAM,aAAa,kBAAkB,OAAO;GAC5C,IAAI,YAAY;IACd,OAAO,MACL;KAAE;KAAY;IAAY,GAC1B,oCACF;IACA,uBAAuB,KAAK,GAAG,UAAU;GAC3C;EACF,OAAO,IAAI,YAAY,SAAS,qBAAqB,GAAG;GACtD,MAAM,aAAa,kBAAkB,SAAS,WAAW;GACzD,IAAI,YACF,SAAS,KAAK,UAAU;QAExB,OAAO,MAAM,EAAE,YAAY,GAAG,yBAAyB;EAE3D,OAAO;GACL,MAAM,MAAM,eAAe,SAAS,aAAa,MAAM;GACvD,IAAI,KACF,SAAS,KAAK,GAAG;QAEjB,OAAO,MAAM,EAAE,YAAY,GAAG,2BAA2B;EAE7D;CACF;CACA,IAAI;OACG,MAAM,WAAW,UACpB,KAAK,MAAM,OAAO,QAAQ,MACxB,IAAI,IAAI,cACN,IAAI,aAAa,QAAQ,GAAG,sBAAsB;CAAA;CAK1D,OAAO,YAAY,eAAe,QAAQ,CAAC;AAC7C"}
|
|
@@ -20,7 +20,9 @@ import { isNonEmptyStringAndNotWhitespace, isString } from "@sindresorhus/is";
|
|
|
20
20
|
import upath from "upath";
|
|
21
21
|
import merge from "deepmerge";
|
|
22
22
|
//#region lib/modules/manager/npm/post-update/index.ts
|
|
23
|
-
|
|
23
|
+
function getDirs(arr) {
|
|
24
|
+
return Array.from(new Set(arr.filter(isString)));
|
|
25
|
+
}
|
|
24
26
|
function determineLockFileDirs(config, packageFiles) {
|
|
25
27
|
const npmLockDirs = [];
|
|
26
28
|
const yarnLockDirs = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n getNpmrcContent,\n parseLockFile,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nconst getDirs = (arr: (string | null | undefined)[]): string[] =>\n Array.from(new Set(arr.filter(isString)));\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmShrinkwrapDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmShrinkwrapDirs.push(upgrade.managerData?.pnpmShrinkwrap);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<PackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next 3 -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmShrinkwrapDirs.push(packageFile.managerData.pnpmShrinkwrap);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n if (\n isString(npmrc) &&\n (npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName)\n ) {\n try {\n await writeLocalFile(npmrcFilename, npmrc.replace(/\\n?$/, '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n for (const packageName of packageNames) {\n if (\n 'packages' in npmLockParsed &&\n (packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`))\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (\n !(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )\n ) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n yarnrcYml ??= (await getFile(yarnrcYmlFilename)) ?? undefined;\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (\n config.isLockFileMaintenance &&\n config.reuseExistingBranch &&\n (await scm.branchExists(config.branchName))\n ) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8');\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing\n stderr: res.stderr || res.stdout,\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next 7 -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n /* v8 ignore next 4 -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmShrinkwrap of dirs.pnpmShrinkwrapDirs) {\n const lockFileDir = upath.dirname(pnpmShrinkwrap);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmShrinkwrap === pnpmShrinkwrap,\n );\n const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmShrinkwrap,\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing\n stderr: res.stderr || res.stdout,\n });\n } else {\n const existingContent = await getFile(\n pnpmShrinkwrap,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmShrinkwrap,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["hostRules.find","npm.generateLockFile","deepmerge","yarn.fuzzyMatchAdditionalYarnrcYml","yarn.generateLockFile","yarn.isYarnUpdate","pnpm.generateLockFile"],"sources":["../../../../../lib/modules/manager/npm/post-update/index.ts"],"sourcesContent":["// TODO: types (#22198)\nimport { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport deepmerge from 'deepmerge';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getEnv } from '../../../../util/env.ts';\nimport {\n ensureCacheDir,\n getSiblingFileName,\n readLocalFile,\n writeLocalFile,\n} from '../../../../util/fs/index.ts';\nimport { getFile, getRepoStatus } from '../../../../util/git/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport * as hostRules from '../../../../util/host-rules.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../../util/url.ts';\nimport { dump, parseSingleYaml } from '../../../../util/yaml.ts';\nimport { NpmDatasource } from '../../../datasource/npm/index.ts';\nimport { scm } from '../../../platform/scm.ts';\nimport type {\n ArtifactError,\n ArtifactNotice,\n PackageFile,\n PostUpdateConfig,\n Upgrade,\n} from '../../types.ts';\nimport {\n NPM_CACHE_DIR,\n PNPM_CACHE_BASE_DIR,\n YARN_CACHE_DIR,\n YARN_GLOBAL_DIR,\n} from '../constants.ts';\nimport { getZeroInstallPaths } from '../extract/yarn.ts';\nimport type { NpmManagerData } from '../types.ts';\nimport {\n composeLockFile,\n getNpmrcContent,\n parseLockFile,\n resetNpmrcContent,\n updateNpmrcContent,\n} from '../utils.ts';\nimport * as npm from './npm.ts';\nimport * as pnpm from './pnpm.ts';\nimport { processHostRules } from './rules.ts';\nimport type {\n AdditionalPackageFiles,\n DetermineLockFileDirsResult,\n WriteExistingFilesResult,\n YarnRcYmlFile,\n} from './types.ts';\nimport * as yarn from './yarn.ts';\n\n// Strips empty values, deduplicates, and returns the directories from filenames\nfunction getDirs(arr: (string | null | undefined)[]): string[] {\n return Array.from(new Set(arr.filter(isString)));\n}\n\nexport function determineLockFileDirs(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): DetermineLockFileDirsResult {\n const npmLockDirs: (string | undefined)[] = [];\n const yarnLockDirs: (string | undefined)[] = [];\n const pnpmShrinkwrapDirs: (string | undefined)[] = [];\n\n for (const upgrade of config.upgrades) {\n // v8 ignore else -- TODO: add test #40625\n if (\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isRemediation === true ||\n upgrade.isLockfileUpdate === true\n ) {\n yarnLockDirs.push(upgrade.managerData?.yarnLock);\n npmLockDirs.push(upgrade.managerData?.npmLock);\n pnpmShrinkwrapDirs.push(upgrade.managerData?.pnpmShrinkwrap);\n }\n }\n\n if (\n config.upgrades.every(\n (upgrade: Upgrade) =>\n upgrade.updateType === 'lockFileMaintenance' ||\n upgrade.isLockfileUpdate,\n )\n ) {\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n }\n\n function getPackageFile(\n fileName: string,\n ): Partial<PackageFile<NpmManagerData>> {\n logger.trace(`Looking for packageFile: ${fileName}`);\n\n for (const packageFile of packageFiles.npm!) {\n if (packageFile.packageFile === fileName) {\n logger.trace({ packageFile }, 'Found packageFile');\n return packageFile;\n }\n logger.trace('No match');\n }\n return {};\n }\n\n // TODO #22198\n for (const p of config.updatedPackageFiles!) {\n logger.trace(`Checking ${String(p.path)} for lock files`);\n const packageFile = getPackageFile(p.path);\n /* v8 ignore next 3 -- needs test */\n if (!packageFile.managerData) {\n continue;\n }\n // push full lock file names and convert them later\n yarnLockDirs.push(packageFile.managerData.yarnLock);\n npmLockDirs.push(packageFile.managerData.npmLock);\n pnpmShrinkwrapDirs.push(packageFile.managerData.pnpmShrinkwrap);\n }\n\n return {\n yarnLockDirs: getDirs(yarnLockDirs),\n npmLockDirs: getDirs(npmLockDirs),\n pnpmShrinkwrapDirs: getDirs(pnpmShrinkwrapDirs),\n };\n}\n\nexport async function writeExistingFiles(\n config: PostUpdateConfig,\n packageFiles: AdditionalPackageFiles,\n): Promise<void> {\n if (!packageFiles.npm) {\n return;\n }\n const npmFiles = packageFiles.npm;\n logger.debug(\n { packageFiles: npmFiles.map((n) => n.packageFile) },\n 'Writing package.json files',\n );\n for (const packageFile of npmFiles) {\n /* v8 ignore if -- TODO: add test #40625 */\n if (!packageFile.managerData) {\n continue;\n }\n // TODO #22198\n const basedir = upath.dirname(packageFile.packageFile!);\n const npmrc = packageFile.npmrc;\n const npmrcFilename = upath.join(basedir, '.npmrc');\n // Write out the file unless the npmrc came from the workspace\n // npmrcFilename will be set whenever the file was read from disk during extract\n if (\n isString(npmrc) &&\n (npmrcFilename === packageFile.managerData.npmrcFileName ||\n !packageFile.managerData.npmrcFileName)\n ) {\n try {\n await writeLocalFile(npmrcFilename, npmrc.replace(/\\n?$/, '\\n'));\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ npmrcFilename, err }, 'Error writing .npmrc');\n }\n }\n const npmLock = packageFile.managerData.npmLock;\n if (npmLock) {\n const npmLockPath = npmLock;\n logger.debug(`Writing ${npmLock}`);\n let existingNpmLock: string;\n try {\n existingNpmLock = (await getFile(npmLock)) ?? '';\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error reading npm lock file');\n existingNpmLock = '';\n }\n const { detectedIndent, lockFileParsed: npmLockParsed } =\n parseLockFile(existingNpmLock);\n if (npmLockParsed) {\n const packageNames =\n 'packages' in npmLockParsed\n ? Object.keys(npmLockParsed.packages)\n : [];\n const widens: string[] = [];\n let lockFileChanged = false;\n for (const upgrade of config.upgrades) {\n if (upgrade.lockFiles && !upgrade.lockFiles.includes(npmLock)) {\n continue;\n }\n if (!upgrade.managerData) {\n continue;\n }\n if (\n upgrade.rangeStrategy === 'widen' &&\n upgrade.managerData.npmLock === npmLock\n ) {\n // TODO #22198\n widens.push(upgrade.depName!);\n }\n const { depName } = upgrade;\n for (const packageName of packageNames) {\n if (\n 'packages' in npmLockParsed &&\n (packageName === `node_modules/${depName}` ||\n packageName.startsWith(`node_modules/${depName}/`))\n ) {\n logger.trace({ packageName }, 'Massaging out package name');\n lockFileChanged = true;\n delete npmLockParsed.packages[packageName];\n }\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (widens.length) {\n logger.debug(\n `Removing ${String(widens)} from ${npmLock} to force an update`,\n );\n lockFileChanged = true;\n try {\n if ('dependencies' in npmLockParsed && npmLockParsed.dependencies) {\n widens.forEach((depName) => {\n // TODO #22198\n delete npmLockParsed.dependencies![depName];\n });\n }\n } catch /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn(\n { npmLock },\n 'Error massaging package-lock.json for widen',\n );\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (lockFileChanged) {\n logger.debug('Massaging npm lock file before writing to disk');\n existingNpmLock = composeLockFile(npmLockParsed, detectedIndent);\n }\n await writeLocalFile(npmLockPath, existingNpmLock);\n }\n }\n }\n}\n\nexport async function writeUpdatedPackageFiles(\n config: PostUpdateConfig,\n): Promise<void> {\n logger.trace({ config }, 'writeUpdatedPackageFiles');\n logger.debug('Writing any updated package files');\n if (!config.updatedPackageFiles) {\n logger.debug('No files found');\n return;\n }\n // prefer artifact content when it updates the same file (e.g. pnpm-workspace.yaml)\n const artifactContents = new Map<string, string>();\n if (config.updatedArtifacts) {\n for (const artifact of config.updatedArtifacts) {\n if (artifact.type === 'addition' && artifact.contents) {\n artifactContents.set(artifact.path, artifact.contents.toString());\n }\n }\n }\n const supportedLockFiles = ['package-lock.json', 'yarn.lock'];\n for (const packageFile of config.updatedPackageFiles) {\n if (packageFile.type !== 'addition') {\n continue;\n }\n if (\n supportedLockFiles.some((fileName) => packageFile.path.endsWith(fileName))\n ) {\n logger.debug(`Writing lock file: ${packageFile.path}`);\n // TODO #22198\n\n await writeLocalFile(packageFile.path, packageFile.contents!);\n continue;\n }\n if (\n !(\n packageFile.path.endsWith('package.json') ||\n packageFile.path.endsWith('pnpm-workspace.yaml') ||\n packageFile.path.endsWith('.yarnrc.yml')\n )\n ) {\n continue;\n }\n const contents =\n artifactContents.get(packageFile.path) ?? packageFile.contents!;\n logger.debug(`Writing ${packageFile.path}`);\n await writeLocalFile(packageFile.path, contents);\n }\n}\n\n/* v8 ignore next -- needs test */\nasync function updateYarnOffline(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n): Promise<void> {\n try {\n const resolvedPaths: string[] = [];\n const yarnrcYml = await getFile(upath.join(lockFileDir, '.yarnrc.yml'));\n const yarnrc = await getFile(upath.join(lockFileDir, '.yarnrc'));\n\n // As .yarnrc.yml overrides .yarnrc in Yarn 1 (https://git.io/JUcco)\n // both files may exist, so check for .yarnrc.yml first\n if (yarnrcYml) {\n // Yarn 2 (offline cache and zero-installs)\n const paths = getZeroInstallPaths(yarnrcYml);\n resolvedPaths.push(...paths.map((p) => upath.join(lockFileDir, p)));\n } else if (yarnrc) {\n // Yarn 1 (offline mirror)\n const mirrorLine = yarnrc\n .split(newlineRegex)\n .find((line) => line.startsWith('yarn-offline-mirror '));\n if (mirrorLine) {\n const mirrorPath = ensureTrailingSlash(\n mirrorLine.split(' ')[1].replace(regEx(/\"/g), ''),\n );\n resolvedPaths.push(upath.join(lockFileDir, mirrorPath));\n }\n }\n logger.debug({ resolvedPaths }, 'updateYarnOffline resolvedPaths');\n\n if (resolvedPaths.length) {\n const status = await getRepoStatus();\n for (const f of status.modified.concat(status.not_added)) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n });\n }\n }\n for (const f of status.deleted || []) {\n if (resolvedPaths.some((p) => f.startsWith(p))) {\n updatedArtifacts.push({ type: 'deletion', path: f });\n }\n }\n }\n } catch (err) {\n logger.error({ err }, 'Error updating yarn offline packages');\n }\n}\n\n// TODO: move to ./yarn.ts\n// exported for testing\nexport async function updateYarnBinary(\n lockFileDir: string,\n updatedArtifacts: FileChange[],\n existingYarnrcYmlContent: string | undefined | null,\n): Promise<string | undefined | null> {\n let yarnrcYml = existingYarnrcYmlContent;\n try {\n const yarnrcYmlFilename = upath.join(lockFileDir, '.yarnrc.yml');\n yarnrcYml ??= (await getFile(yarnrcYmlFilename)) ?? undefined;\n const newYarnrcYml = await readLocalFile(yarnrcYmlFilename, 'utf8');\n if (!isString(yarnrcYml) || !isString(newYarnrcYml)) {\n return existingYarnrcYmlContent;\n }\n\n // TODO: use schema (#9610)\n const oldYarnPath = parseSingleYaml<YarnRcYmlFile>(yarnrcYml)?.yarnPath;\n const newYarnPath = parseSingleYaml<YarnRcYmlFile>(newYarnrcYml)?.yarnPath;\n if (\n !isNonEmptyStringAndNotWhitespace(oldYarnPath) ||\n !isNonEmptyStringAndNotWhitespace(newYarnPath)\n ) {\n return existingYarnrcYmlContent;\n }\n\n const oldYarnFullPath = upath.join(lockFileDir, oldYarnPath);\n const newYarnFullPath = upath.join(lockFileDir, newYarnPath);\n logger.debug({ oldYarnPath, newYarnPath }, 'Found updated Yarn binary');\n\n yarnrcYml = yarnrcYml.replace(oldYarnPath, newYarnPath);\n updatedArtifacts.push(\n {\n type: 'addition',\n path: yarnrcYmlFilename,\n contents: yarnrcYml,\n },\n {\n type: 'deletion',\n path: oldYarnFullPath,\n },\n {\n type: 'addition',\n path: newYarnFullPath,\n contents: await readLocalFile(newYarnFullPath, 'utf8'),\n isExecutable: true,\n },\n );\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.error({ err }, 'Error updating Yarn binary');\n }\n return existingYarnrcYmlContent && yarnrcYml;\n}\n\nexport async function getAdditionalFiles(\n config: PostUpdateConfig<NpmManagerData>,\n packageFiles: AdditionalPackageFiles,\n): Promise<WriteExistingFilesResult> {\n logger.trace({ config }, 'getAdditionalFiles');\n const artifactErrors: ArtifactError[] = [];\n const artifactNotices: ArtifactNotice[] = [];\n const updatedArtifacts: FileChange[] = [];\n if (!packageFiles.npm?.length) {\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n if (config.skipArtifactsUpdate) {\n logger.debug('Skipping lock file generation');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n logger.debug('Getting updated lock files');\n if (\n config.isLockFileMaintenance &&\n config.reuseExistingBranch &&\n (await scm.branchExists(config.branchName))\n ) {\n logger.debug('Skipping lockFileMaintenance update');\n return { artifactErrors, artifactNotices, updatedArtifacts };\n }\n const dirs = determineLockFileDirs(config, packageFiles);\n logger.trace({ dirs }, 'lock file dirs');\n await writeExistingFiles(config, packageFiles);\n await writeUpdatedPackageFiles(config);\n\n const { additionalNpmrcContent, additionalYarnRcYml } = processHostRules();\n\n // This isn't passed directly to the child process, so no need to filter.\n // But pass custom env and user vars.\n const env = {\n ...getEnv(),\n NPM_CONFIG_CACHE: await ensureCacheDir(NPM_CACHE_DIR),\n YARN_CACHE_FOLDER: await ensureCacheDir(YARN_CACHE_DIR),\n YARN_GLOBAL_FOLDER: await ensureCacheDir(YARN_GLOBAL_DIR),\n npm_config_store: await ensureCacheDir(PNPM_CACHE_BASE_DIR),\n NODE_ENV: 'dev',\n };\n\n let token: string | undefined;\n try {\n ({ token } = hostRules.find({\n hostType: 'github',\n url: 'https://api.github.com/',\n }));\n // v8 ignore next -- TODO: add test #40625\n token = token ? `${token}@` : token;\n } catch (err) /* v8 ignore next -- TODO: add test #40625 */ {\n logger.warn({ err }, 'Error getting token for packageFile');\n }\n const tokenRe = regEx(`${token ?? ''}`, 'g', false);\n for (const npmLock of dirs.npmLockDirs) {\n const lockFileDir = upath.dirname(npmLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n const fileName = upath.basename(npmLock);\n logger.debug(`Generating ${fileName} for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.npmLock === npmLock,\n );\n const res = await npm.generateLockFile(\n lockFileDir,\n env,\n fileName,\n config,\n upgrades,\n npmrcContent,\n );\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes('No matching version found for')) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `No matching version found for ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'npm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n const err = new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(err, NpmDatasource.id);\n }\n }\n }\n\n artifactErrors.push({\n fileName: npmLock,\n stderr: res.stderr,\n });\n } else if (res.lockFile) {\n if (res.beforeFallback) {\n const message =\n 'npm `--before` could not be enforced because existing locked packages were published after the `minimumReleaseAge` cutoff. This will resolve after the next lock file maintenance run.';\n logger.warn({ npmLock }, message);\n artifactNotices.push({ file: npmLock, message });\n }\n const existingContent = await getFile(\n npmLock,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(`${npmLock} hasn't changed`);\n } else {\n logger.debug(`${npmLock} needs updating`);\n updatedArtifacts.push({\n type: 'addition',\n path: npmLock,\n // TODO: can this be undefined? (#22198)\n\n contents: res.lockFile.replace(tokenRe, ''),\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n for (const yarnLock of dirs.yarnLockDirs) {\n const lockFileDir = upath.dirname(yarnLock);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n let yarnRcYmlFilename: string | undefined;\n let existingYarnrcYmlContent: string | undefined | null;\n if (additionalYarnRcYml) {\n yarnRcYmlFilename = getSiblingFileName(yarnLock, '.yarnrc.yml');\n existingYarnrcYmlContent = await readLocalFile(yarnRcYmlFilename, 'utf8');\n // v8 ignore else -- TODO: add test #40625\n if (existingYarnrcYmlContent) {\n try {\n // TODO: use schema (#9610)\n const existingYarnrRcYml = parseSingleYaml<Record<string, unknown>>(\n existingYarnrcYmlContent,\n );\n\n const updatedYarnYrcYml = deepmerge(\n existingYarnrRcYml,\n yarn.fuzzyMatchAdditionalYarnrcYml(\n additionalYarnRcYml,\n existingYarnrRcYml,\n ),\n );\n\n await writeLocalFile(yarnRcYmlFilename, dump(updatedYarnYrcYml));\n logger.debug('Added authentication to .yarnrc.yml');\n } catch (err) {\n logger.warn({ err }, 'Error appending .yarnrc.yml content');\n }\n }\n }\n logger.debug(`Generating yarn.lock for ${lockFileDir}`);\n const lockFileName = upath.join(lockFileDir, 'yarn.lock');\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.yarnLock === yarnLock,\n );\n const res = await yarn.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stderr?.includes(`Couldn't find any versions for`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stderr.includes(\n `Couldn't find any versions for \\\\\"${upgrade.depName}\\\\\"`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'yarn' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n new Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: yarnLock,\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing\n stderr: res.stderr || res.stdout,\n });\n } else {\n const existingContent = await getFile(\n lockFileName,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"yarn.lock hasn't changed\");\n } else {\n logger.debug('yarn.lock needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: lockFileName,\n // TODO #22198\n contents: res.lockFile!,\n });\n await updateYarnOffline(lockFileDir, updatedArtifacts);\n }\n\n /* v8 ignore next 7 -- needs test */\n if (upgrades.some(yarn.isYarnUpdate)) {\n existingYarnrcYmlContent = await updateYarnBinary(\n lockFileDir,\n updatedArtifacts,\n existingYarnrcYmlContent,\n );\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n /* v8 ignore next 4 -- needs test */\n if (existingYarnrcYmlContent) {\n // TODO #22198\n await writeLocalFile(yarnRcYmlFilename!, existingYarnrcYmlContent);\n }\n }\n\n for (const pnpmShrinkwrap of dirs.pnpmShrinkwrapDirs) {\n const lockFileDir = upath.dirname(pnpmShrinkwrap);\n const npmrcContent = await getNpmrcContent(lockFileDir);\n await updateNpmrcContent(lockFileDir, npmrcContent, additionalNpmrcContent);\n logger.debug(`Generating pnpm-lock.yaml for ${lockFileDir}`);\n const upgrades = config.upgrades.filter(\n (upgrade) => upgrade.managerData?.pnpmShrinkwrap === pnpmShrinkwrap,\n );\n const res = await pnpm.generateLockFile(lockFileDir, env, config, upgrades);\n if (res.error) {\n /* v8 ignore next -- needs test */\n if (res.stdout?.includes(`No compatible version found:`)) {\n for (const upgrade of config.upgrades) {\n if (\n res.stdout.includes(\n `No compatible version found: ${upgrade.depName}`,\n )\n ) {\n logger.debug(\n { dependency: upgrade.depName, type: 'pnpm' },\n 'lock file failed for the dependency being updated - skipping branch creation',\n );\n throw new ExternalHostError(\n Error(\n 'lock file failed for the dependency being updated - skipping branch creation',\n ),\n NpmDatasource.id,\n );\n }\n }\n }\n\n artifactErrors.push({\n fileName: pnpmShrinkwrap,\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing\n stderr: res.stderr || res.stdout,\n });\n } else {\n const existingContent = await getFile(\n pnpmShrinkwrap,\n config.reuseExistingBranch ? config.branchName : config.baseBranch,\n );\n if (res.lockFile === existingContent) {\n logger.debug(\"pnpm-lock.yaml hasn't changed\");\n } else {\n logger.debug('pnpm-lock.yaml needs updating');\n updatedArtifacts.push({\n type: 'addition',\n path: pnpmShrinkwrap,\n // TODO: can be undefined? (#22198)\n contents: res.lockFile!,\n });\n }\n }\n await resetNpmrcContent(lockFileDir, npmrcContent);\n }\n\n return { artifactErrors, artifactNotices, updatedArtifacts };\n}\n"],"mappings":"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"}
|
|
@@ -13,12 +13,12 @@ const policyKeyByStrategy = {
|
|
|
13
13
|
};
|
|
14
14
|
async function getMergeMethod(repoId, project, branchRef, defaultBranch) {
|
|
15
15
|
logger.debug(`getMergeMethod(branchRef=${branchRef}, defaultBranch=${defaultBranch})`);
|
|
16
|
-
|
|
16
|
+
function isRelevantScope(scope) {
|
|
17
17
|
if (scope.matchKind === "DefaultBranch" && (!branchRef || branchRef === `refs/heads/${defaultBranch}`)) return true;
|
|
18
18
|
if (scope.repositoryId !== repoId && scope.repositoryId !== null) return false;
|
|
19
19
|
if (!branchRef) return true;
|
|
20
20
|
return scope.matchKind === "Exact" ? scope.refName === branchRef : branchRef.startsWith(scope.refName);
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
const policyConfigurations = (await (await policyApi()).getPolicyConfigurations(project, void 0, mergePolicyGuid)).filter((p) => p.settings.scope.some(isRelevantScope)).map((p) => p.settings)[0];
|
|
23
23
|
logger.debug({ policyConfigurations }, `getMergeMethod(branchRef=${branchRef}) determining mergeMethod from matched policy`);
|
|
24
24
|
for (const [key, policyKey] of Object.entries(policyKeyByStrategy)) if (policyConfigurations?.[policyKey] === true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azure-helper.js","names":["azureApi.policyApi","azureApi.coreApi"],"sources":["../../../../lib/modules/platform/azure/azure-helper.ts"],"sourcesContent":["import type { WebApiTeam } from 'azure-devops-node-api/interfaces/CoreInterfaces.js';\nimport type {\n GitCommit,\n GitRef,\n} from 'azure-devops-node-api/interfaces/GitInterfaces.js';\nimport { GitPullRequestMergeStrategy } from 'azure-devops-node-api/interfaces/GitInterfaces.js';\nimport type { PolicyConfiguration } from 'azure-devops-node-api/interfaces/PolicyInterfaces.js';\nimport { logger } from '../../../logger/index.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { getNewBranchName } from '../util.ts';\nimport * as azureApi from './azure-got-wrapper.ts';\nimport { WrappedException } from './schema.ts';\nimport {\n getBranchNameWithoutRefsPrefix,\n getBranchNameWithoutRefsheadsPrefix,\n} from './util.ts';\n\nconst mergePolicyGuid = 'fa4e907d-c16b-4a4c-9dfa-4916e5d171ab'; // Magic GUID for merge strategy policy configurations\n\nexport async function getRefs(\n repoId: string,\n branchName?: string,\n): Promise<GitRef[]> {\n logger.debug(`getRefs(${repoId}, ${branchName!})`);\n const azureApiGit = await azureApi.gitApi();\n const refs = await azureApiGit.getRefs(\n repoId,\n undefined,\n getBranchNameWithoutRefsPrefix(branchName),\n );\n return refs;\n}\n\nexport interface AzureBranchObj {\n name: string;\n oldObjectId: string;\n}\n\nexport async function getAzureBranchObj(\n repoId: string,\n branchName: string,\n from?: string,\n): Promise<AzureBranchObj> {\n const fromBranchName = getNewBranchName(from);\n const refs = await getRefs(repoId, fromBranchName);\n if (refs.length === 0) {\n logger.debug(`getAzureBranchObj without a valid from, so initial commit.`);\n // TODO: fix undefined\n return {\n name: getNewBranchName(branchName)!,\n oldObjectId: '0000000000000000000000000000000000000000',\n };\n }\n return {\n // TODO: fix undefined (#22198)\n name: getNewBranchName(branchName)!,\n oldObjectId: refs[0].objectId!,\n };\n}\n\n// if no branchName, look globally\nexport async function getFile(\n repoId: string,\n filePath: string,\n branchName: string,\n): Promise<string | null> {\n logger.trace(`getFile(filePath=${filePath}, branchName=${branchName})`);\n const azureApiGit = await azureApi.gitApi();\n const item = await azureApiGit.getItemText(\n repoId,\n filePath,\n undefined,\n undefined,\n 0, // because we look for 1 file\n false,\n false,\n true,\n {\n versionType: 0, // branch\n versionOptions: 0,\n version: getBranchNameWithoutRefsheadsPrefix(branchName),\n },\n );\n\n if (item?.readable) {\n const fileContent = await streamToString(item);\n try {\n const result = WrappedException.safeParse(fileContent);\n if (result.success) {\n if (result.data.typeKey === 'GitItemNotFoundException') {\n logger.warn({ filePath }, 'Unable to find file');\n return null;\n }\n // v8 ignore else -- TODO: add test #40625\n if (result.data.typeKey === 'GitUnresolvableToCommitException') {\n logger.warn({ branchName }, 'Unable to find branch');\n return null;\n }\n }\n } catch /* v8 ignore next */ {\n // it 's not a JSON, so I send the content directly with the line under\n }\n\n return fileContent;\n }\n\n return null; // no file found\n}\n\nexport async function getCommitDetails(\n commit: string,\n repoId: string,\n): Promise<GitCommit> {\n logger.debug(`getCommitDetails(${commit}, ${repoId})`);\n const azureApiGit = await azureApi.gitApi();\n const results = await azureApiGit.getCommit(commit, repoId);\n return results;\n}\n\ninterface MergeStrategyPolicyConfiguration {\n allowNoFastForward?: boolean;\n allowSquash?: boolean;\n allowRebase?: boolean;\n allowRebaseMerge?: boolean;\n}\n\nconst policyKeyByStrategy: Record<\n GitPullRequestMergeStrategy,\n keyof MergeStrategyPolicyConfiguration\n> = {\n [GitPullRequestMergeStrategy.NoFastForward]: 'allowNoFastForward',\n [GitPullRequestMergeStrategy.Squash]: 'allowSquash',\n [GitPullRequestMergeStrategy.Rebase]: 'allowRebase',\n [GitPullRequestMergeStrategy.RebaseMerge]: 'allowRebaseMerge',\n};\n\nexport async function getMergeMethod(\n repoId: string,\n project: string,\n branchRef?: string | null,\n defaultBranch?: string,\n): Promise<GitPullRequestMergeStrategy> {\n logger.debug(\n `getMergeMethod(branchRef=${branchRef}, defaultBranch=${defaultBranch})`,\n );\n interface Scope {\n repositoryId: string;\n refName?: string;\n matchKind: 'Prefix' | 'Exact' | 'DefaultBranch';\n }\n
|
|
1
|
+
{"version":3,"file":"azure-helper.js","names":["azureApi.policyApi","azureApi.coreApi"],"sources":["../../../../lib/modules/platform/azure/azure-helper.ts"],"sourcesContent":["import type { WebApiTeam } from 'azure-devops-node-api/interfaces/CoreInterfaces.js';\nimport type {\n GitCommit,\n GitRef,\n} from 'azure-devops-node-api/interfaces/GitInterfaces.js';\nimport { GitPullRequestMergeStrategy } from 'azure-devops-node-api/interfaces/GitInterfaces.js';\nimport type { PolicyConfiguration } from 'azure-devops-node-api/interfaces/PolicyInterfaces.js';\nimport { logger } from '../../../logger/index.ts';\nimport { streamToString } from '../../../util/streams.ts';\nimport { getNewBranchName } from '../util.ts';\nimport * as azureApi from './azure-got-wrapper.ts';\nimport { WrappedException } from './schema.ts';\nimport {\n getBranchNameWithoutRefsPrefix,\n getBranchNameWithoutRefsheadsPrefix,\n} from './util.ts';\n\nconst mergePolicyGuid = 'fa4e907d-c16b-4a4c-9dfa-4916e5d171ab'; // Magic GUID for merge strategy policy configurations\n\nexport async function getRefs(\n repoId: string,\n branchName?: string,\n): Promise<GitRef[]> {\n logger.debug(`getRefs(${repoId}, ${branchName!})`);\n const azureApiGit = await azureApi.gitApi();\n const refs = await azureApiGit.getRefs(\n repoId,\n undefined,\n getBranchNameWithoutRefsPrefix(branchName),\n );\n return refs;\n}\n\nexport interface AzureBranchObj {\n name: string;\n oldObjectId: string;\n}\n\nexport async function getAzureBranchObj(\n repoId: string,\n branchName: string,\n from?: string,\n): Promise<AzureBranchObj> {\n const fromBranchName = getNewBranchName(from);\n const refs = await getRefs(repoId, fromBranchName);\n if (refs.length === 0) {\n logger.debug(`getAzureBranchObj without a valid from, so initial commit.`);\n // TODO: fix undefined\n return {\n name: getNewBranchName(branchName)!,\n oldObjectId: '0000000000000000000000000000000000000000',\n };\n }\n return {\n // TODO: fix undefined (#22198)\n name: getNewBranchName(branchName)!,\n oldObjectId: refs[0].objectId!,\n };\n}\n\n// if no branchName, look globally\nexport async function getFile(\n repoId: string,\n filePath: string,\n branchName: string,\n): Promise<string | null> {\n logger.trace(`getFile(filePath=${filePath}, branchName=${branchName})`);\n const azureApiGit = await azureApi.gitApi();\n const item = await azureApiGit.getItemText(\n repoId,\n filePath,\n undefined,\n undefined,\n 0, // because we look for 1 file\n false,\n false,\n true,\n {\n versionType: 0, // branch\n versionOptions: 0,\n version: getBranchNameWithoutRefsheadsPrefix(branchName),\n },\n );\n\n if (item?.readable) {\n const fileContent = await streamToString(item);\n try {\n const result = WrappedException.safeParse(fileContent);\n if (result.success) {\n if (result.data.typeKey === 'GitItemNotFoundException') {\n logger.warn({ filePath }, 'Unable to find file');\n return null;\n }\n // v8 ignore else -- TODO: add test #40625\n if (result.data.typeKey === 'GitUnresolvableToCommitException') {\n logger.warn({ branchName }, 'Unable to find branch');\n return null;\n }\n }\n } catch /* v8 ignore next */ {\n // it 's not a JSON, so I send the content directly with the line under\n }\n\n return fileContent;\n }\n\n return null; // no file found\n}\n\nexport async function getCommitDetails(\n commit: string,\n repoId: string,\n): Promise<GitCommit> {\n logger.debug(`getCommitDetails(${commit}, ${repoId})`);\n const azureApiGit = await azureApi.gitApi();\n const results = await azureApiGit.getCommit(commit, repoId);\n return results;\n}\n\ninterface MergeStrategyPolicyConfiguration {\n allowNoFastForward?: boolean;\n allowSquash?: boolean;\n allowRebase?: boolean;\n allowRebaseMerge?: boolean;\n}\n\nconst policyKeyByStrategy: Record<\n GitPullRequestMergeStrategy,\n keyof MergeStrategyPolicyConfiguration\n> = {\n [GitPullRequestMergeStrategy.NoFastForward]: 'allowNoFastForward',\n [GitPullRequestMergeStrategy.Squash]: 'allowSquash',\n [GitPullRequestMergeStrategy.Rebase]: 'allowRebase',\n [GitPullRequestMergeStrategy.RebaseMerge]: 'allowRebaseMerge',\n};\n\nexport async function getMergeMethod(\n repoId: string,\n project: string,\n branchRef?: string | null,\n defaultBranch?: string,\n): Promise<GitPullRequestMergeStrategy> {\n logger.debug(\n `getMergeMethod(branchRef=${branchRef}, defaultBranch=${defaultBranch})`,\n );\n interface Scope {\n repositoryId: string;\n refName?: string;\n matchKind: 'Prefix' | 'Exact' | 'DefaultBranch';\n }\n function isRelevantScope(scope: Scope): boolean {\n if (\n scope.matchKind === 'DefaultBranch' &&\n // TODO: types (#22198)\n (!branchRef || branchRef === `refs/heads/${defaultBranch!}`)\n ) {\n return true;\n }\n if (scope.repositoryId !== repoId && scope.repositoryId !== null) {\n return false;\n }\n if (!branchRef) {\n return true;\n }\n // TODO #22198\n return scope.matchKind === 'Exact'\n ? scope.refName === branchRef\n : branchRef.startsWith(scope.refName!);\n }\n\n const policyConfigurations = (\n await (\n await azureApi.policyApi()\n ).getPolicyConfigurations(project, undefined, mergePolicyGuid)\n )\n .filter((p: PolicyConfiguration) => p.settings.scope.some(isRelevantScope))\n .map((p: PolicyConfiguration) => p.settings)[0];\n\n logger.debug(\n { policyConfigurations },\n // TODO: types (#22198)\n `getMergeMethod(branchRef=${branchRef!}) determining mergeMethod from matched policy`,\n );\n\n // Note that this will iterate in the order of GitPullRequestMergeStrategy\n for (const [key, policyKey] of Object.entries(policyKeyByStrategy)) {\n if (policyConfigurations?.[policyKey] === true) {\n const method = parseInt(key, 10) satisfies GitPullRequestMergeStrategy;\n logger.debug(\n { policyConfigurations },\n `getMergeMethod(branchRef=${branchRef!})=${GitPullRequestMergeStrategy[method]}`,\n );\n return method;\n }\n }\n\n logger.debug(\n { policyConfigurations },\n // TODO: types (#22198)\n `getMergeMethod(branchRef=${branchRef!})=${GitPullRequestMergeStrategy[GitPullRequestMergeStrategy.NoFastForward]}`,\n );\n return GitPullRequestMergeStrategy.NoFastForward;\n}\n\nexport async function getAllProjectTeams(\n projectId: string,\n): Promise<WebApiTeam[]> {\n const allTeams: WebApiTeam[] = [];\n const azureApiCore = await azureApi.coreApi();\n const top = 100;\n let skip = 0;\n let length = 0;\n\n do {\n const teams = await azureApiCore.getTeams(projectId, undefined, top, skip);\n length = teams.length;\n allTeams.push(...teams);\n skip += top;\n } while (top <= length);\n\n return allTeams;\n}\n"],"mappings":";;;;;;AAiBA,MAAM,kBAAkB;AA6GxB,MAAM,sBAGF;EACD,4BAA4B,gBAAgB;EAC5C,4BAA4B,SAAS;EACrC,4BAA4B,SAAS;EACrC,4BAA4B,cAAc;AAC7C;AAEA,eAAsB,eACpB,QACA,SACA,WACA,eACsC;CACtC,OAAO,MACL,4BAA4B,UAAU,kBAAkB,cAAc,EACxE;CAMA,SAAS,gBAAgB,OAAuB;EAC9C,IACE,MAAM,cAAc,oBAEnB,CAAC,aAAa,cAAc,cAAc,kBAE3C,OAAO;EAET,IAAI,MAAM,iBAAiB,UAAU,MAAM,iBAAiB,MAC1D,OAAO;EAET,IAAI,CAAC,WACH,OAAO;EAGT,OAAO,MAAM,cAAc,UACvB,MAAM,YAAY,YAClB,UAAU,WAAW,MAAM,OAAQ;CACzC;CAEA,MAAM,wBACJ,OACE,MAAMA,UAAmB,EAAA,CACzB,wBAAwB,SAAS,KAAA,GAAW,eAAe,EAAA,CAE5D,QAAQ,MAA2B,EAAE,SAAS,MAAM,KAAK,eAAe,CAAC,CAAC,CAC1E,KAAK,MAA2B,EAAE,QAAQ,CAAC,CAAC;CAE/C,OAAO,MACL,EAAE,qBAAqB,GAEvB,4BAA4B,UAAW,8CACzC;CAGA,KAAK,MAAM,CAAC,KAAK,cAAc,OAAO,QAAQ,mBAAmB,GAC/D,IAAI,uBAAuB,eAAe,MAAM;EAC9C,MAAM,SAAS,SAAS,KAAK,EAAE;EAC/B,OAAO,MACL,EAAE,qBAAqB,GACvB,4BAA4B,UAAW,IAAI,4BAA4B,SACzE;EACA,OAAO;CACT;CAGF,OAAO,MACL,EAAE,qBAAqB,GAEvB,4BAA4B,UAAW,IAAI,4BAA4B,4BAA4B,gBACrG;CACA,OAAO,4BAA4B;AACrC;AAEA,eAAsB,mBACpB,WACuB;CACvB,MAAM,WAAyB,CAAC;CAChC,MAAM,eAAe,MAAMC,QAAiB;CAC5C,MAAM,MAAM;CACZ,IAAI,OAAO;CACX,IAAI,SAAS;CAEb,GAAG;EACD,MAAM,QAAQ,MAAM,aAAa,SAAS,WAAW,KAAA,GAAW,KAAK,IAAI;EACzE,SAAS,MAAM;EACf,SAAS,KAAK,GAAG,KAAK;EACtB,QAAQ;CACV,SAAS,OAAO;CAEhB,OAAO;AACT"}
|
|
@@ -68,6 +68,12 @@ async function ensureComment({ config, number: prNo, topic, content }) {
|
|
|
68
68
|
async function reopenComments(config, prNo) {
|
|
69
69
|
return (await getComments(config, prNo)).filter((comment) => comment.content.raw.startsWith(REOPEN_PR_COMMENT_KEYWORD));
|
|
70
70
|
}
|
|
71
|
+
function byTopic(comment, topic) {
|
|
72
|
+
return comment.content.raw.startsWith(`### ${topic}\n\n`);
|
|
73
|
+
}
|
|
74
|
+
function byContent(comment, content) {
|
|
75
|
+
return comment.content.raw.trim() === content;
|
|
76
|
+
}
|
|
71
77
|
async function ensureCommentRemoval(config, deleteConfig) {
|
|
72
78
|
try {
|
|
73
79
|
const { number: prNo } = deleteConfig;
|
|
@@ -77,11 +83,11 @@ async function ensureCommentRemoval(config, deleteConfig) {
|
|
|
77
83
|
let commentId = void 0;
|
|
78
84
|
// v8 ignore else -- TODO: add test #40625
|
|
79
85
|
if (deleteConfig.type === "by-topic") {
|
|
80
|
-
const
|
|
81
|
-
commentId = comments.find(byTopic)?.id;
|
|
86
|
+
const topic = deleteConfig.topic;
|
|
87
|
+
commentId = comments.find((comment) => byTopic(comment, topic))?.id;
|
|
82
88
|
} else if (deleteConfig.type === "by-content") {
|
|
83
|
-
const
|
|
84
|
-
commentId = comments.find(byContent)?.id;
|
|
89
|
+
const content = deleteConfig.content;
|
|
90
|
+
commentId = comments.find((comment) => byContent(comment, content))?.id;
|
|
85
91
|
}
|
|
86
92
|
if (commentId) await deleteComment(config, prNo, commentId);
|
|
87
93
|
} catch (err) /* v8 ignore next */ {
|