renovate 44.107.0 → 44.107.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/modules/manager/types.d.ts +9 -0
- package/dist/modules/versioning/gradle/compare.js +1 -1
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +25 -3
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/loose/index.js +21 -7
- package/dist/modules/versioning/loose/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +8 -7
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/maven/index.js +24 -3
- package/dist/modules/versioning/maven/index.js.map +1 -1
- package/dist/types/skip-reason.d.ts +7 -1
- package/dist/workers/repository/extract/extract-fingerprint-config.js +5 -0
- package/dist/workers/repository/extract/extract-fingerprint-config.js.map +1 -1
- package/dist/workers/repository/extract/index.js +3 -0
- package/dist/workers/repository/extract/index.js.map +1 -1
- package/dist/workers/repository/extract/vulnerability-alerts.js +18 -0
- package/dist/workers/repository/extract/vulnerability-alerts.js.map +1 -0
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -24,6 +24,15 @@ interface ExtractConfig extends CustomExtractConfig {
|
|
|
24
24
|
repository?: string;
|
|
25
25
|
currentDigest?: string;
|
|
26
26
|
newDigest?: string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Whether vulnerability remediation is active for this repository, regardless
|
|
29
|
+
* of where the vulnerability data comes from.
|
|
30
|
+
*
|
|
31
|
+
* Managers may use this to surface dependencies which are useless for routine
|
|
32
|
+
* updates, but which a vulnerability fix needs to be able to match, e.g.
|
|
33
|
+
* transitive dependencies which only exist in a lock file.
|
|
34
|
+
*/
|
|
35
|
+
hasVulnerabilityAlertsRules?: boolean;
|
|
27
36
|
}
|
|
28
37
|
/**
|
|
29
38
|
* The part of a manager config that `resolveToolConstraint()` reads. Managers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","names":[],"sources":["../../../../lib/modules/versioning/gradle/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\n\nexport const TokenType = {\n Number: 1,\n String: 2,\n};\n\ninterface Token {\n type: number;\n val: string | number;\n}\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isSeparator(char: string): boolean {\n return regEx(/^[-._+]$/i).test(char);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return !isSeparator(char) && !isDigit(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nexport function tokenize(versionStr: string): Token[] | null {\n let result: Token[] | null = [];\n let currentVal = '';\n\n function yieldToken(): void {\n if (result) {\n const val = currentVal;\n if (regEx(/^\\d+$/).test(val)) {\n result.push({\n type: TokenType.Number,\n val: parseInt(val, 10),\n });\n } else {\n result.push({\n type: TokenType.String,\n val,\n });\n }\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (isSeparator(nextChar)) {\n if (prevChar && !isSeparator(prevChar)) {\n yieldToken();\n currentVal = '';\n } else {\n result = null;\n }\n } else if (prevChar !== null && isTransition(prevChar, nextChar)) {\n yieldToken();\n currentVal = nextChar;\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n });\n\n return result;\n}\n\nexport const QualifierRank = {\n Dev: -1,\n Default: 0,\n RC: 1,\n Snapshot: 2,\n Final: 3,\n GA: 4,\n Release: 5,\n SP: 6,\n} as const;\n\nexport function qualifierRank(input: string): number {\n const val = input.toLowerCase();\n if (val === 'dev') {\n return QualifierRank.Dev;\n }\n if (val === 'rc' || val === 'cr') {\n return QualifierRank.RC;\n }\n if (val === 'snapshot') {\n return QualifierRank.Snapshot;\n }\n if (val === 'ga') {\n return QualifierRank.GA;\n }\n if (val === 'final') {\n return QualifierRank.Final;\n }\n if (val === 'release' || val === 'latest' || val === 'sr') {\n return QualifierRank.Release;\n }\n if (val === 'sp') {\n return QualifierRank.SP;\n }\n return QualifierRank.Default;\n}\n\nfunction stringTokenCmp(left: string, right: string): number {\n const leftRank = qualifierRank(left);\n const rightRank = qualifierRank(right);\n if (leftRank === 0 && rightRank === 0) {\n if (left < right) {\n return -1;\n }\n\n if (left > right) {\n return 1;\n }\n } else {\n if (leftRank < rightRank) {\n return -1;\n }\n if (leftRank > rightRank) {\n return 1;\n }\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token | null, right: Token | null): number {\n if (left === null) {\n if (right?.type === TokenType.String) {\n return 1;\n }\n return -1;\n }\n\n if (right === null) {\n if (left.type === TokenType.String) {\n return -1;\n }\n return 1;\n }\n\n if (left.type === TokenType.Number && right.type === TokenType.Number) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n if (isString(left.val) && isString(right.val)) {\n return stringTokenCmp(left.val, right.val);\n }\n\n // `Number` and `String` are the only token types, so exactly one side is a\n // number here, and a number sorts above a string\n return right.type === TokenType.Number ? -1 : 1;\n}\n\nexport function compare(left: string, right: string): number {\n const leftTokens = coerceArray(tokenize(left));\n const rightTokens = coerceArray(tokenize(right));\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || null;\n const rightToken = rightTokens[idx] || null;\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nexport function parse(input: string): Token[] | null {\n if (!input) {\n return null;\n }\n\n if (!regEx(/^[-._+a-zA-Z0-9]+$/i).test(input)) {\n return null;\n }\n\n if (regEx(/^latest\\.?/i).test(input)) {\n return null;\n }\n\n const tokens = tokenize(input);\n // istanbul ignore if: should not happen\n if (!tokens?.length) {\n return null;\n }\n return tokens;\n}\n\nexport function isVersion(input: string): boolean {\n return !!parse(input);\n}\n\ninterface PrefixRange {\n tokens: Token[];\n}\n\ntype RangeBound = 'inclusive' | 'exclusive';\n\ninterface MavenBasedRange {\n leftBound: RangeBound;\n leftBoundStr: string;\n leftVal: string | null;\n separator: string;\n rightBound: RangeBound;\n rightBoundStr: string;\n rightVal: string | null;\n // The existence of preferredVal implies the \"strictly\" keyword \"!!\"\n // leading up to preferredVal: \"!![preferred version]\"\n preferredVal: string | null;\n}\n\nexport function parsePrefixRange(input: string): PrefixRange | null {\n if (!input) {\n return null;\n }\n\n if (input.trim() === '+') {\n return { tokens: [] };\n }\n\n const postfixRegex = regEx(/[^-._+][-._]\\+$/);\n if (postfixRegex.test(input)) {\n const prefixValue = input.replace(regEx(/[-._]\\+$/), '');\n const tokens = tokenize(prefixValue);\n if (tokens) {\n return { tokens };\n }\n }\n\n return null;\n}\n\nconst mavenBasedRangeRegex = regEx(\n /^(?<leftBoundStr>[[\\](]\\s*)(?<leftVal>[-._+a-zA-Z0-9]*?)(?<separator>\\s*,\\s*)(?<rightVal>[-._+a-zA-Z0-9]*?)(?<rightBoundStr>\\s*[[\\])])(?:!!(?<preferredVal>[-._+a-zA-Z0-9]+))?$/,\n);\n\nexport function parseMavenBasedRange(input: string): MavenBasedRange | null {\n if (!input) {\n return null;\n }\n\n const matchGroups = mavenBasedRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { leftBoundStr, separator, rightBoundStr } = matchGroups;\n const leftVal = matchGroups.leftVal || null;\n const rightVal = matchGroups.rightVal || null;\n const preferredVal = matchGroups.preferredVal || null;\n const isVersionLeft = isString(leftVal) && isVersion(leftVal);\n const isVersionRight = isString(rightVal) && isVersion(rightVal);\n if (\n (leftVal !== null && !isVersionLeft) ||\n (rightVal !== null && !isVersionRight)\n ) {\n return null;\n }\n\n if (\n isVersionLeft &&\n isVersionRight &&\n leftVal &&\n rightVal &&\n compare(leftVal, rightVal) === 1\n ) {\n return null;\n }\n\n const leftBound = leftBoundStr.trim() === '[' ? 'inclusive' : 'exclusive';\n const rightBound = rightBoundStr.trim() === ']' ? 'inclusive' : 'exclusive';\n\n return {\n leftBound,\n leftBoundStr,\n leftVal,\n separator,\n rightBound,\n rightBoundStr,\n rightVal,\n preferredVal,\n };\n}\n\ninterface SingleVersionRange {\n val: string;\n}\n\nconst singleVersionRangeRegex = regEx(/^\\[\\s*(?<val>[-._+a-zA-Z0-9]*?)\\s*\\]$/);\n\nexport function parseSingleVersionRange(\n input: string,\n): SingleVersionRange | null {\n const matchGroups = singleVersionRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { val } = matchGroups;\n if (!isVersion(val)) {\n return null;\n }\n\n return { val };\n}\n\nexport function isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n\n return (\n isVersion(str) ||\n !!parsePrefixRange(str) ||\n !!parseMavenBasedRange(str) ||\n !!parseSingleVersionRange(str)\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compare.js","names":[],"sources":["../../../../lib/modules/versioning/gradle/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { coerceArray } from '../../../util/array.ts';\nimport { regEx } from '../../../util/regex.ts';\n\nexport const TokenType = {\n Number: 1,\n String: 2,\n};\n\ninterface Token {\n type: number;\n val: string | bigint;\n}\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isSeparator(char: string): boolean {\n return regEx(/^[-._+]$/i).test(char);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return !isSeparator(char) && !isDigit(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nexport function tokenize(versionStr: string): Token[] | null {\n let result: Token[] | null = [];\n let currentVal = '';\n\n function yieldToken(): void {\n if (result) {\n const val = currentVal;\n if (regEx(/^\\d+$/).test(val)) {\n result.push({\n type: TokenType.Number,\n val: BigInt(val),\n });\n } else {\n result.push({\n type: TokenType.String,\n val,\n });\n }\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (isSeparator(nextChar)) {\n if (prevChar && !isSeparator(prevChar)) {\n yieldToken();\n currentVal = '';\n } else {\n result = null;\n }\n } else if (prevChar !== null && isTransition(prevChar, nextChar)) {\n yieldToken();\n currentVal = nextChar;\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n });\n\n return result;\n}\n\nexport const QualifierRank = {\n Dev: -1,\n Default: 0,\n RC: 1,\n Snapshot: 2,\n Final: 3,\n GA: 4,\n Release: 5,\n SP: 6,\n} as const;\n\nexport function qualifierRank(input: string): number {\n const val = input.toLowerCase();\n if (val === 'dev') {\n return QualifierRank.Dev;\n }\n if (val === 'rc' || val === 'cr') {\n return QualifierRank.RC;\n }\n if (val === 'snapshot') {\n return QualifierRank.Snapshot;\n }\n if (val === 'ga') {\n return QualifierRank.GA;\n }\n if (val === 'final') {\n return QualifierRank.Final;\n }\n if (val === 'release' || val === 'latest' || val === 'sr') {\n return QualifierRank.Release;\n }\n if (val === 'sp') {\n return QualifierRank.SP;\n }\n return QualifierRank.Default;\n}\n\nfunction stringTokenCmp(left: string, right: string): number {\n const leftRank = qualifierRank(left);\n const rightRank = qualifierRank(right);\n if (leftRank === 0 && rightRank === 0) {\n if (left < right) {\n return -1;\n }\n\n if (left > right) {\n return 1;\n }\n } else {\n if (leftRank < rightRank) {\n return -1;\n }\n if (leftRank > rightRank) {\n return 1;\n }\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token | null, right: Token | null): number {\n if (left === null) {\n if (right?.type === TokenType.String) {\n return 1;\n }\n return -1;\n }\n\n if (right === null) {\n if (left.type === TokenType.String) {\n return -1;\n }\n return 1;\n }\n\n if (left.type === TokenType.Number && right.type === TokenType.Number) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n if (isString(left.val) && isString(right.val)) {\n return stringTokenCmp(left.val, right.val);\n }\n\n // `Number` and `String` are the only token types, so exactly one side is a\n // number here, and a number sorts above a string\n return right.type === TokenType.Number ? -1 : 1;\n}\n\nexport function compare(left: string, right: string): number {\n const leftTokens = coerceArray(tokenize(left));\n const rightTokens = coerceArray(tokenize(right));\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || null;\n const rightToken = rightTokens[idx] || null;\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nexport function parse(input: string): Token[] | null {\n if (!input) {\n return null;\n }\n\n if (!regEx(/^[-._+a-zA-Z0-9]+$/i).test(input)) {\n return null;\n }\n\n if (regEx(/^latest\\.?/i).test(input)) {\n return null;\n }\n\n const tokens = tokenize(input);\n // istanbul ignore if: should not happen\n if (!tokens?.length) {\n return null;\n }\n return tokens;\n}\n\nexport function isVersion(input: string): boolean {\n return !!parse(input);\n}\n\ninterface PrefixRange {\n tokens: Token[];\n}\n\ntype RangeBound = 'inclusive' | 'exclusive';\n\ninterface MavenBasedRange {\n leftBound: RangeBound;\n leftBoundStr: string;\n leftVal: string | null;\n separator: string;\n rightBound: RangeBound;\n rightBoundStr: string;\n rightVal: string | null;\n // The existence of preferredVal implies the \"strictly\" keyword \"!!\"\n // leading up to preferredVal: \"!![preferred version]\"\n preferredVal: string | null;\n}\n\nexport function parsePrefixRange(input: string): PrefixRange | null {\n if (!input) {\n return null;\n }\n\n if (input.trim() === '+') {\n return { tokens: [] };\n }\n\n const postfixRegex = regEx(/[^-._+][-._]\\+$/);\n if (postfixRegex.test(input)) {\n const prefixValue = input.replace(regEx(/[-._]\\+$/), '');\n const tokens = tokenize(prefixValue);\n if (tokens) {\n return { tokens };\n }\n }\n\n return null;\n}\n\nconst mavenBasedRangeRegex = regEx(\n /^(?<leftBoundStr>[[\\](]\\s*)(?<leftVal>[-._+a-zA-Z0-9]*?)(?<separator>\\s*,\\s*)(?<rightVal>[-._+a-zA-Z0-9]*?)(?<rightBoundStr>\\s*[[\\])])(?:!!(?<preferredVal>[-._+a-zA-Z0-9]+))?$/,\n);\n\nexport function parseMavenBasedRange(input: string): MavenBasedRange | null {\n if (!input) {\n return null;\n }\n\n const matchGroups = mavenBasedRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { leftBoundStr, separator, rightBoundStr } = matchGroups;\n const leftVal = matchGroups.leftVal || null;\n const rightVal = matchGroups.rightVal || null;\n const preferredVal = matchGroups.preferredVal || null;\n const isVersionLeft = isString(leftVal) && isVersion(leftVal);\n const isVersionRight = isString(rightVal) && isVersion(rightVal);\n if (\n (leftVal !== null && !isVersionLeft) ||\n (rightVal !== null && !isVersionRight)\n ) {\n return null;\n }\n\n if (\n isVersionLeft &&\n isVersionRight &&\n leftVal &&\n rightVal &&\n compare(leftVal, rightVal) === 1\n ) {\n return null;\n }\n\n const leftBound = leftBoundStr.trim() === '[' ? 'inclusive' : 'exclusive';\n const rightBound = rightBoundStr.trim() === ']' ? 'inclusive' : 'exclusive';\n\n return {\n leftBound,\n leftBoundStr,\n leftVal,\n separator,\n rightBound,\n rightBoundStr,\n rightVal,\n preferredVal,\n };\n}\n\ninterface SingleVersionRange {\n val: string;\n}\n\nconst singleVersionRangeRegex = regEx(/^\\[\\s*(?<val>[-._+a-zA-Z0-9]*?)\\s*\\]$/);\n\nexport function parseSingleVersionRange(\n input: string,\n): SingleVersionRange | null {\n const matchGroups = singleVersionRangeRegex.exec(input)?.groups;\n if (!matchGroups) {\n return null;\n }\n\n const { val } = matchGroups;\n if (!isVersion(val)) {\n return null;\n }\n\n return { val };\n}\n\nexport function isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n\n return (\n isVersion(str) ||\n !!parsePrefixRange(str) ||\n !!parseMavenBasedRange(str) ||\n !!parseSingleVersionRange(str)\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
2
|
import { api as api$1 } from "../maven/index.js";
|
|
3
3
|
import { TokenType, compare, isValid, isVersion, parse, parseMavenBasedRange, parsePrefixRange, parseSingleVersionRange } from "./compare.js";
|
|
4
|
+
import { isBigint } from "@sindresorhus/is";
|
|
4
5
|
//#region lib/modules/versioning/gradle/index.ts
|
|
5
6
|
const id = "gradle";
|
|
7
|
+
const sectionIndexes = {
|
|
8
|
+
major: 0,
|
|
9
|
+
minor: 1,
|
|
10
|
+
patch: 2
|
|
11
|
+
};
|
|
6
12
|
function equals(a, b) {
|
|
7
13
|
return compare(a, b) === 0;
|
|
8
14
|
}
|
|
@@ -10,7 +16,7 @@ function getMajor(version) {
|
|
|
10
16
|
const tokens = parse(version?.replace(regEx(/^v/i), ""));
|
|
11
17
|
if (tokens) {
|
|
12
18
|
const majorToken = tokens?.[0];
|
|
13
|
-
if (majorToken?.type === TokenType.Number) return majorToken.val;
|
|
19
|
+
if (majorToken?.type === TokenType.Number) return parseInt(majorToken.val.toString(), 10);
|
|
14
20
|
}
|
|
15
21
|
return null;
|
|
16
22
|
}
|
|
@@ -19,7 +25,7 @@ function getMinor(version) {
|
|
|
19
25
|
if (tokens) {
|
|
20
26
|
const majorToken = tokens[0];
|
|
21
27
|
const minorToken = tokens[1];
|
|
22
|
-
if (majorToken?.type === TokenType.Number && minorToken?.type === TokenType.Number) return minorToken.val;
|
|
28
|
+
if (majorToken?.type === TokenType.Number && minorToken?.type === TokenType.Number) return parseInt(minorToken.val.toString(), 10);
|
|
23
29
|
return 0;
|
|
24
30
|
}
|
|
25
31
|
return null;
|
|
@@ -30,7 +36,7 @@ function getPatch(version) {
|
|
|
30
36
|
const majorToken = tokens[0];
|
|
31
37
|
const minorToken = tokens[1];
|
|
32
38
|
const patchToken = tokens[2];
|
|
33
|
-
if (majorToken?.type === TokenType.Number && minorToken?.type === TokenType.Number && patchToken?.type === TokenType.Number) return patchToken.val;
|
|
39
|
+
if (majorToken?.type === TokenType.Number && minorToken?.type === TokenType.Number && patchToken?.type === TokenType.Number) return parseInt(patchToken.val.toString(), 10);
|
|
34
40
|
return 0;
|
|
35
41
|
}
|
|
36
42
|
return null;
|
|
@@ -38,6 +44,21 @@ function getPatch(version) {
|
|
|
38
44
|
function isGreaterThan(a, b) {
|
|
39
45
|
return compare(a, b) === 1;
|
|
40
46
|
}
|
|
47
|
+
function getExactSection(version, type) {
|
|
48
|
+
const tokens = parse(version.replace(regEx(/^v/i), ""));
|
|
49
|
+
if (!tokens) return null;
|
|
50
|
+
const sectionIndex = sectionIndexes[type];
|
|
51
|
+
if (sectionIndex === 0) {
|
|
52
|
+
const token = tokens[sectionIndex];
|
|
53
|
+
return token?.type === TokenType.Number && isBigint(token.val) ? token.val : null;
|
|
54
|
+
}
|
|
55
|
+
for (let index = 0; index <= sectionIndex; index += 1) if (tokens[index]?.type !== TokenType.Number) return 0n;
|
|
56
|
+
return BigInt(tokens[sectionIndex].val);
|
|
57
|
+
}
|
|
58
|
+
function isSame(type, a, b) {
|
|
59
|
+
if (!(isVersion(a) && isVersion(b))) return false;
|
|
60
|
+
return getExactSection(a, type) === getExactSection(b, type);
|
|
61
|
+
}
|
|
41
62
|
const unstable = /* @__PURE__ */ new Set([
|
|
42
63
|
"dev",
|
|
43
64
|
"a",
|
|
@@ -146,6 +167,7 @@ const api = {
|
|
|
146
167
|
isCompatible: isVersion,
|
|
147
168
|
isGreaterThan,
|
|
148
169
|
isSingleVersion: isVersion,
|
|
170
|
+
isSame,
|
|
149
171
|
isStable,
|
|
150
172
|
isValid,
|
|
151
173
|
isVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["mavenVersion"],"sources":["../../../../lib/modules/versioning/gradle/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport mavenVersion from '../maven/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport {\n TokenType,\n compare,\n isValid,\n isVersion,\n parse,\n parseMavenBasedRange,\n parsePrefixRange,\n parseSingleVersionRange,\n} from './compare.ts';\n\nexport const id = 'gradle';\nexport const displayName = 'Gradle';\nexport const urls = [\n '[Gradle version ordering](https://docs.gradle.org/current/userguide/single_versions.html#version_ordering)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['bump'];\n\nfunction equals(a: string, b: string): boolean {\n return compare(a, b) === 0;\n}\n\nfunction getMajor(version: string): number | null {\n const tokens = parse(version?.replace(regEx(/^v/i), ''));\n if (tokens) {\n const majorToken = tokens?.[0];\n if (majorToken?.type === TokenType.Number) {\n return majorToken.val as number;\n }\n }\n return null;\n}\n\nfunction getMinor(version: string): number | null {\n const tokens = parse(version?.replace(regEx(/^v/i), ''));\n if (tokens) {\n const majorToken = tokens[0];\n const minorToken = tokens[1];\n if (\n majorToken?.type === TokenType.Number &&\n minorToken?.type === TokenType.Number\n ) {\n return minorToken.val as number;\n }\n return 0;\n }\n return null;\n}\n\nfunction getPatch(version: string): number | null {\n const tokens = parse(version?.replace(regEx(/^v/i), ''));\n if (tokens) {\n const majorToken = tokens[0];\n const minorToken = tokens[1];\n const patchToken = tokens[2];\n if (\n majorToken?.type === TokenType.Number &&\n minorToken?.type === TokenType.Number &&\n patchToken?.type === TokenType.Number\n ) {\n return patchToken.val as number;\n }\n return 0;\n }\n return null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return compare(a, b) === 1;\n}\n\nconst unstable = new Set([\n 'dev',\n 'a',\n 'alpha',\n 'b',\n 'beta',\n 'm',\n 'mt',\n 'milestone',\n 'rc',\n 'cr',\n 'preview',\n 'snapshot',\n]);\n\nfunction isStable(version: string): boolean {\n const tokens = parse(version);\n if (tokens) {\n for (const token of tokens) {\n if (token.type === TokenType.String) {\n const val = token.val.toString().toLowerCase();\n if (unstable.has(val)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n}\n\nfunction matches(a: string, b: string): boolean {\n const versionTokens = parse(a);\n if (!a || !versionTokens || !b) {\n return false;\n }\n if (isVersion(b)) {\n return equals(a, b);\n }\n\n const singleVersionRange = parseSingleVersionRange(b);\n if (singleVersionRange) {\n const { val } = singleVersionRange;\n return equals(a, val);\n }\n\n const prefixRange = parsePrefixRange(b);\n if (prefixRange) {\n const tokens = prefixRange.tokens;\n if (tokens.length === 0) {\n return true;\n }\n const x = versionTokens\n .slice(0, tokens.length)\n .map(({ val }) => val)\n .join('.');\n const y = tokens.map(({ val }) => val).join('.');\n return equals(x, y);\n }\n\n const mavenBasedRange = parseMavenBasedRange(b);\n if (!mavenBasedRange) {\n return false;\n }\n\n const { leftBound, leftVal, rightBound, rightVal } = mavenBasedRange;\n let leftResult = true;\n let rightResult = true;\n\n if (leftVal) {\n leftResult =\n leftBound === 'exclusive'\n ? compare(leftVal, a) === -1\n : compare(leftVal, a) !== 1;\n }\n\n if (rightVal) {\n rightResult =\n rightBound === 'exclusive'\n ? compare(a, rightVal) === -1\n : compare(a, rightVal) !== 1;\n }\n\n return leftResult && rightResult;\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return versions.reduce((result: string | null, version) => {\n if (matches(version, range)) {\n if (!result) {\n return version;\n }\n if (isGreaterThan(version, result)) {\n return version;\n }\n }\n return result;\n }, null);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return versions.reduce((result: string | null, version) => {\n if (matches(version, range)) {\n if (!result) {\n return version;\n }\n if (compare(version, result) === -1) {\n return version;\n }\n }\n return result;\n }, null);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n newVersion,\n}: NewValueConfig): string | null {\n if (isVersion(currentValue)) {\n return newVersion;\n }\n\n // Check if our version is of the form \"1.2.+\"\n const prefixRange = parsePrefixRange(currentValue);\n const parsedNewVersion = parse(newVersion);\n if (prefixRange && parsedNewVersion) {\n if (prefixRange.tokens.length > 0) {\n if (prefixRange.tokens.length <= parsedNewVersion.length) {\n const newPrefixed = prefixRange.tokens\n .map((_, i) => parsedNewVersion[i].val)\n .join('.');\n\n return `${newPrefixed}.+`;\n }\n // our new version is shorter than our prefix range so drop our prefix range\n return newVersion;\n }\n // our version is already \"+\" which includes ever version\n return null;\n }\n\n const mavenRange = parseMavenBasedRange(currentValue);\n if (mavenRange?.preferredVal) {\n const { leftVal, rightVal, preferredVal } = mavenRange;\n const baseRange = currentValue.slice(\n 0,\n currentValue.lastIndexOf(`!!${preferredVal}`),\n );\n const newBaseRange = mavenVersion.getNewValue({\n currentValue: baseRange,\n rangeStrategy,\n newVersion,\n });\n // v8 ignore if: the implementation has a non-null return type\n if (newBaseRange === null) {\n return null;\n }\n\n const preferredIsBoundary =\n preferredVal === leftVal || preferredVal === rightVal;\n const newParsed = parseMavenBasedRange(newBaseRange);\n const preferredStillPresent =\n newParsed?.leftVal === preferredVal ||\n newParsed?.rightVal === preferredVal;\n const newPreferredVal =\n preferredIsBoundary && !preferredStillPresent ? newVersion : preferredVal;\n\n return `${newBaseRange}!!${newPreferredVal}`;\n }\n\n return mavenVersion.getNewValue({ currentValue, rangeStrategy, newVersion });\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isSingleVersion: isVersion,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions: compare,\n};\n\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["mavenVersion"],"sources":["../../../../lib/modules/versioning/gradle/index.ts"],"sourcesContent":["import { isBigint } from '@sindresorhus/is';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport mavenVersion from '../maven/index.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport {\n TokenType,\n compare,\n isValid,\n isVersion,\n parse,\n parseMavenBasedRange,\n parsePrefixRange,\n parseSingleVersionRange,\n} from './compare.ts';\n\nexport const id = 'gradle';\nexport const displayName = 'Gradle';\nexport const urls = [\n '[Gradle version ordering](https://docs.gradle.org/current/userguide/single_versions.html#version_ordering)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = ['bump'];\n\nconst sectionIndexes = {\n major: 0,\n minor: 1,\n patch: 2,\n} as const;\n\nfunction equals(a: string, b: string): boolean {\n return compare(a, b) === 0;\n}\n\nfunction getMajor(version: string): number | null {\n const tokens = parse(version?.replace(regEx(/^v/i), ''));\n if (tokens) {\n const majorToken = tokens?.[0];\n if (majorToken?.type === TokenType.Number) {\n return parseInt(majorToken.val.toString(), 10);\n }\n }\n return null;\n}\n\nfunction getMinor(version: string): number | null {\n const tokens = parse(version?.replace(regEx(/^v/i), ''));\n if (tokens) {\n const majorToken = tokens[0];\n const minorToken = tokens[1];\n if (\n majorToken?.type === TokenType.Number &&\n minorToken?.type === TokenType.Number\n ) {\n return parseInt(minorToken.val.toString(), 10);\n }\n return 0;\n }\n return null;\n}\n\nfunction getPatch(version: string): number | null {\n const tokens = parse(version?.replace(regEx(/^v/i), ''));\n if (tokens) {\n const majorToken = tokens[0];\n const minorToken = tokens[1];\n const patchToken = tokens[2];\n if (\n majorToken?.type === TokenType.Number &&\n minorToken?.type === TokenType.Number &&\n patchToken?.type === TokenType.Number\n ) {\n return parseInt(patchToken.val.toString(), 10);\n }\n return 0;\n }\n return null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return compare(a, b) === 1;\n}\n\nfunction getExactSection(\n version: string,\n type: keyof typeof sectionIndexes,\n): bigint | null {\n const tokens = parse(version.replace(regEx(/^v/i), ''));\n if (!tokens) {\n return null;\n }\n const sectionIndex = sectionIndexes[type];\n if (sectionIndex === 0) {\n const token = tokens[sectionIndex];\n return token?.type === TokenType.Number && isBigint(token.val)\n ? token.val\n : null;\n }\n\n for (let index = 0; index <= sectionIndex; index += 1) {\n if (tokens[index]?.type !== TokenType.Number) {\n return 0n;\n }\n }\n\n return BigInt(tokens[sectionIndex].val);\n}\n\nfunction isSame(\n type: keyof typeof sectionIndexes,\n a: string,\n b: string,\n): boolean {\n if (!(isVersion(a) && isVersion(b))) {\n return false;\n }\n return getExactSection(a, type) === getExactSection(b, type);\n}\n\nconst unstable = new Set([\n 'dev',\n 'a',\n 'alpha',\n 'b',\n 'beta',\n 'm',\n 'mt',\n 'milestone',\n 'rc',\n 'cr',\n 'preview',\n 'snapshot',\n]);\n\nfunction isStable(version: string): boolean {\n const tokens = parse(version);\n if (tokens) {\n for (const token of tokens) {\n if (token.type === TokenType.String) {\n const val = token.val.toString().toLowerCase();\n if (unstable.has(val)) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n}\n\nfunction matches(a: string, b: string): boolean {\n const versionTokens = parse(a);\n if (!a || !versionTokens || !b) {\n return false;\n }\n if (isVersion(b)) {\n return equals(a, b);\n }\n\n const singleVersionRange = parseSingleVersionRange(b);\n if (singleVersionRange) {\n const { val } = singleVersionRange;\n return equals(a, val);\n }\n\n const prefixRange = parsePrefixRange(b);\n if (prefixRange) {\n const tokens = prefixRange.tokens;\n if (tokens.length === 0) {\n return true;\n }\n const x = versionTokens\n .slice(0, tokens.length)\n .map(({ val }) => val)\n .join('.');\n const y = tokens.map(({ val }) => val).join('.');\n return equals(x, y);\n }\n\n const mavenBasedRange = parseMavenBasedRange(b);\n if (!mavenBasedRange) {\n return false;\n }\n\n const { leftBound, leftVal, rightBound, rightVal } = mavenBasedRange;\n let leftResult = true;\n let rightResult = true;\n\n if (leftVal) {\n leftResult =\n leftBound === 'exclusive'\n ? compare(leftVal, a) === -1\n : compare(leftVal, a) !== 1;\n }\n\n if (rightVal) {\n rightResult =\n rightBound === 'exclusive'\n ? compare(a, rightVal) === -1\n : compare(a, rightVal) !== 1;\n }\n\n return leftResult && rightResult;\n}\n\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return versions.reduce((result: string | null, version) => {\n if (matches(version, range)) {\n if (!result) {\n return version;\n }\n if (isGreaterThan(version, result)) {\n return version;\n }\n }\n return result;\n }, null);\n}\n\nfunction minSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return versions.reduce((result: string | null, version) => {\n if (matches(version, range)) {\n if (!result) {\n return version;\n }\n if (compare(version, result) === -1) {\n return version;\n }\n }\n return result;\n }, null);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n newVersion,\n}: NewValueConfig): string | null {\n if (isVersion(currentValue)) {\n return newVersion;\n }\n\n // Check if our version is of the form \"1.2.+\"\n const prefixRange = parsePrefixRange(currentValue);\n const parsedNewVersion = parse(newVersion);\n if (prefixRange && parsedNewVersion) {\n if (prefixRange.tokens.length > 0) {\n if (prefixRange.tokens.length <= parsedNewVersion.length) {\n const newPrefixed = prefixRange.tokens\n .map((_, i) => parsedNewVersion[i].val)\n .join('.');\n\n return `${newPrefixed}.+`;\n }\n // our new version is shorter than our prefix range so drop our prefix range\n return newVersion;\n }\n // our version is already \"+\" which includes ever version\n return null;\n }\n\n const mavenRange = parseMavenBasedRange(currentValue);\n if (mavenRange?.preferredVal) {\n const { leftVal, rightVal, preferredVal } = mavenRange;\n const baseRange = currentValue.slice(\n 0,\n currentValue.lastIndexOf(`!!${preferredVal}`),\n );\n const newBaseRange = mavenVersion.getNewValue({\n currentValue: baseRange,\n rangeStrategy,\n newVersion,\n });\n // v8 ignore if: the implementation has a non-null return type\n if (newBaseRange === null) {\n return null;\n }\n\n const preferredIsBoundary =\n preferredVal === leftVal || preferredVal === rightVal;\n const newParsed = parseMavenBasedRange(newBaseRange);\n const preferredStillPresent =\n newParsed?.leftVal === preferredVal ||\n newParsed?.rightVal === preferredVal;\n const newPreferredVal =\n preferredIsBoundary && !preferredStillPresent ? newVersion : preferredVal;\n\n return `${newBaseRange}!!${newPreferredVal}`;\n }\n\n return mavenVersion.getNewValue({ currentValue, rangeStrategy, newVersion });\n}\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isSingleVersion: isVersion,\n isSame,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion,\n getNewValue,\n sortVersions: compare,\n};\n\nexport default api;\n"],"mappings":"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"}
|
|
@@ -5,16 +5,23 @@ const id = "loose";
|
|
|
5
5
|
const versionPattern = regEx(/^[vV]?(?<prefix>\d+(?:\.\d+)*)(?<suffix>.*)$/);
|
|
6
6
|
const commitHashPattern = regEx(/^[a-f0-9]{7,40}$/);
|
|
7
7
|
const numericPattern = regEx(/^[0-9]+$/);
|
|
8
|
+
const sectionIndexes = {
|
|
9
|
+
major: 0,
|
|
10
|
+
minor: 1,
|
|
11
|
+
patch: 2
|
|
12
|
+
};
|
|
8
13
|
var LooseVersioningApi = class extends GenericVersioningApi {
|
|
9
14
|
_parse(version) {
|
|
10
15
|
if (commitHashPattern.test(version) && !numericPattern.test(version)) return null;
|
|
11
16
|
const matches = versionPattern.exec(version);
|
|
12
17
|
if (!matches) return null;
|
|
13
18
|
const { prefix, suffix } = matches.groups;
|
|
14
|
-
const
|
|
15
|
-
if (
|
|
19
|
+
const parts = prefix.split(".");
|
|
20
|
+
if (parts.length > 6) return null;
|
|
21
|
+
const releaseBig = parts.map((part) => BigInt(part));
|
|
16
22
|
return {
|
|
17
|
-
release,
|
|
23
|
+
release: releaseBig.map(Number),
|
|
24
|
+
releaseBig,
|
|
18
25
|
suffix: suffix || ""
|
|
19
26
|
};
|
|
20
27
|
}
|
|
@@ -23,13 +30,13 @@ var LooseVersioningApi = class extends GenericVersioningApi {
|
|
|
23
30
|
const parsed2 = this._parse(other);
|
|
24
31
|
// istanbul ignore if
|
|
25
32
|
if (!(parsed1 && parsed2)) return 1;
|
|
26
|
-
const length = Math.max(parsed1.
|
|
33
|
+
const length = Math.max(parsed1.releaseBig.length, parsed2.releaseBig.length);
|
|
27
34
|
for (let i = 0; i < length; i += 1) {
|
|
28
|
-
const part1 = parsed1.
|
|
29
|
-
const part2 = parsed2.
|
|
35
|
+
const part1 = parsed1.releaseBig[i];
|
|
36
|
+
const part2 = parsed2.releaseBig[i];
|
|
30
37
|
if (part1 === void 0) return -1;
|
|
31
38
|
if (part2 === void 0) return 1;
|
|
32
|
-
if (part1 !== part2) return part1 -
|
|
39
|
+
if (part1 !== part2) return part1 < part2 ? -1 : 1;
|
|
33
40
|
}
|
|
34
41
|
if (parsed1.suffix && parsed2.suffix) return parsed1.suffix.localeCompare(parsed2.suffix, void 0, { numeric: true });
|
|
35
42
|
if (parsed1.suffix) return -1;
|
|
@@ -37,6 +44,13 @@ var LooseVersioningApi = class extends GenericVersioningApi {
|
|
|
37
44
|
// istanbul ignore next
|
|
38
45
|
return 0;
|
|
39
46
|
}
|
|
47
|
+
isSame(type, a, b) {
|
|
48
|
+
const parsedA = this._parse(a);
|
|
49
|
+
const parsedB = this._parse(b);
|
|
50
|
+
if (!(parsedA && parsedB)) return false;
|
|
51
|
+
const sectionIndex = sectionIndexes[type];
|
|
52
|
+
return (parsedA.releaseBig[sectionIndex] ?? 0n) === (parsedB.releaseBig[sectionIndex] ?? 0n);
|
|
53
|
+
}
|
|
40
54
|
};
|
|
41
55
|
const api = new LooseVersioningApi();
|
|
42
56
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/loose/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'loose';\nexport const displayName = 'Loose';\nexport const urls = [];\nexport const supportsRanges = false;\n\nconst versionPattern = regEx(/^[vV]?(?<prefix>\\d+(?:\\.\\d+)*)(?<suffix>.*)$/);\nconst commitHashPattern = regEx(/^[a-f0-9]{7,40}$/);\nconst numericPattern = regEx(/^[0-9]+$/);\n\nclass LooseVersioningApi extends GenericVersioningApi {\n protected _parse(version: string):
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/loose/index.ts"],"sourcesContent":["import { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { GenericVersion, VersioningApi } from '../types.ts';\n\nexport const id = 'loose';\nexport const displayName = 'Loose';\nexport const urls = [];\nexport const supportsRanges = false;\n\nconst versionPattern = regEx(/^[vV]?(?<prefix>\\d+(?:\\.\\d+)*)(?<suffix>.*)$/);\nconst commitHashPattern = regEx(/^[a-f0-9]{7,40}$/);\nconst numericPattern = regEx(/^[0-9]+$/);\n\nconst sectionIndexes = {\n major: 0,\n minor: 1,\n patch: 2,\n} as const;\n\ninterface LooseVersion extends GenericVersion {\n /** Full-precision release parts, used for comparison to avoid float rounding */\n releaseBig: bigint[];\n}\n\nclass LooseVersioningApi extends GenericVersioningApi<LooseVersion> {\n protected _parse(version: string): LooseVersion | null {\n if (commitHashPattern.test(version) && !numericPattern.test(version)) {\n return null;\n }\n const matches = versionPattern.exec(version);\n if (!matches) {\n return null;\n }\n const { prefix, suffix } = matches.groups!;\n const parts = prefix.split('.');\n if (parts.length > 6) {\n return null;\n }\n const releaseBig = parts.map((part) => BigInt(part));\n const release = releaseBig.map(Number);\n return { release, releaseBig, suffix: suffix || '' };\n }\n\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n // istanbul ignore if\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n const length = Math.max(\n parsed1.releaseBig.length,\n parsed2.releaseBig.length,\n );\n for (let i = 0; i < length; i += 1) {\n const part1 = parsed1.releaseBig[i];\n const part2 = parsed2.releaseBig[i];\n // shorter is smaller 2.1 < 2.1.0\n if (part1 === undefined) {\n return -1;\n }\n if (part2 === undefined) {\n return 1;\n }\n if (part1 !== part2) {\n return part1 < part2 ? -1 : 1;\n }\n }\n\n if (parsed1.suffix && parsed2.suffix) {\n return parsed1.suffix.localeCompare(parsed2.suffix, undefined, {\n numeric: true,\n });\n }\n\n if (parsed1.suffix) {\n return -1;\n }\n\n if (parsed2.suffix) {\n return 1;\n }\n\n // istanbul ignore next\n return 0;\n }\n\n override isSame(\n type: keyof typeof sectionIndexes,\n a: string,\n b: string,\n ): boolean {\n const parsedA = this._parse(a);\n const parsedB = this._parse(b);\n if (!(parsedA && parsedB)) {\n return false;\n }\n\n const sectionIndex = sectionIndexes[type];\n return (\n // a missing section counts as zero, so `1` and `1.0` share a minor\n (parsedA.releaseBig[sectionIndex] ?? 0n) ===\n (parsedB.releaseBig[sectionIndex] ?? 0n)\n );\n }\n}\n\nexport const api: VersioningApi = new LooseVersioningApi();\n\nexport default api;\n"],"mappings":";;;AAIA,MAAa,KAAK;AAKlB,MAAM,iBAAiB,MAAM,8CAA8C;AAC3E,MAAM,oBAAoB,MAAM,kBAAkB;AAClD,MAAM,iBAAiB,MAAM,UAAU;AAEvC,MAAM,iBAAiB;CACrB,OAAO;CACP,OAAO;CACP,OAAO;AACT;AAOA,IAAM,qBAAN,cAAiC,qBAAmC;CAClE,OAAiB,SAAsC;EACrD,IAAI,kBAAkB,KAAK,OAAO,KAAK,CAAC,eAAe,KAAK,OAAO,GACjE,OAAO;EAET,MAAM,UAAU,eAAe,KAAK,OAAO;EAC3C,IAAI,CAAC,SACH,OAAO;EAET,MAAM,EAAE,QAAQ,WAAW,QAAQ;EACnC,MAAM,QAAQ,OAAO,MAAM,GAAG;EAC9B,IAAI,MAAM,SAAS,GACjB,OAAO;EAET,MAAM,aAAa,MAAM,KAAK,SAAS,OAAO,IAAI,CAAC;EAEnD,OAAO;GAAE,SADO,WAAW,IAAI,MAChB;GAAG;GAAY,QAAQ,UAAU;EAAG;CACrD;CAEA,SAA4B,SAAiB,OAAuB;EAClE,MAAM,UAAU,KAAK,OAAO,OAAO;EACnC,MAAM,UAAU,KAAK,OAAO,KAAK;;EAEjC,IAAI,EAAE,WAAW,UACf,OAAO;EAET,MAAM,SAAS,KAAK,IAClB,QAAQ,WAAW,QACnB,QAAQ,WAAW,MACrB;EACA,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;GAClC,MAAM,QAAQ,QAAQ,WAAW;GACjC,MAAM,QAAQ,QAAQ,WAAW;GAEjC,IAAI,UAAU,KAAA,GACZ,OAAO;GAET,IAAI,UAAU,KAAA,GACZ,OAAO;GAET,IAAI,UAAU,OACZ,OAAO,QAAQ,QAAQ,KAAK;EAEhC;EAEA,IAAI,QAAQ,UAAU,QAAQ,QAC5B,OAAO,QAAQ,OAAO,cAAc,QAAQ,QAAQ,KAAA,GAAW,EAC7D,SAAS,KACX,CAAC;EAGH,IAAI,QAAQ,QACV,OAAO;EAGT,IAAI,QAAQ,QACV,OAAO;;EAIT,OAAO;CACT;CAEA,OACE,MACA,GACA,GACS;EACT,MAAM,UAAU,KAAK,OAAO,CAAC;EAC7B,MAAM,UAAU,KAAK,OAAO,CAAC;EAC7B,IAAI,EAAE,WAAW,UACf,OAAO;EAGT,MAAM,eAAe,eAAe;EACpC,QAEG,QAAQ,WAAW,iBAAiB,SACpC,QAAQ,WAAW,iBAAiB;CAEzC;AACF;AAEA,MAAa,MAAqB,IAAI,mBAAmB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
|
-
import { isString } from "@sindresorhus/is";
|
|
2
|
+
import { isBigint, isString } from "@sindresorhus/is";
|
|
3
3
|
//#region lib/modules/versioning/maven/compare.ts
|
|
4
4
|
const PREFIX_DOT = "PREFIX_DOT";
|
|
5
5
|
const PREFIX_HYPHEN = "PREFIX_HYPHEN";
|
|
@@ -33,7 +33,7 @@ function iterateTokens(versionStr, cb) {
|
|
|
33
33
|
if (regEx(/^\d+$/).test(val)) cb({
|
|
34
34
|
prefix: currentPrefix,
|
|
35
35
|
type: TYPE_NUMBER,
|
|
36
|
-
val:
|
|
36
|
+
val: BigInt(val),
|
|
37
37
|
isTransition: transition
|
|
38
38
|
});
|
|
39
39
|
else cb({
|
|
@@ -66,7 +66,7 @@ function iterateTokens(versionStr, cb) {
|
|
|
66
66
|
}
|
|
67
67
|
function isNull$1(token) {
|
|
68
68
|
const val = token.val;
|
|
69
|
-
return val ===
|
|
69
|
+
return val === 0n || val === "" || val === "final" || val === "ga" || val === "release" || val === "latest" || val === "sr";
|
|
70
70
|
}
|
|
71
71
|
function tokenize(versionStr, preserveMinorZeroes = false) {
|
|
72
72
|
let buf = [];
|
|
@@ -90,7 +90,7 @@ function nullFor(token) {
|
|
|
90
90
|
return token.type === "TYPE_NUMBER" ? {
|
|
91
91
|
prefix: token.prefix,
|
|
92
92
|
type: TYPE_NUMBER,
|
|
93
|
-
val:
|
|
93
|
+
val: 0n
|
|
94
94
|
} : {
|
|
95
95
|
prefix: token.prefix,
|
|
96
96
|
type: TYPE_QUALIFIER,
|
|
@@ -307,8 +307,8 @@ function coerceRangeValue(prev, next) {
|
|
|
307
307
|
function incrementRangeValue(value) {
|
|
308
308
|
const tokens = tokenize(value);
|
|
309
309
|
const lastToken = tokens.at(-1);
|
|
310
|
-
if (
|
|
311
|
-
lastToken.val +=
|
|
310
|
+
if (isBigint(lastToken.val)) {
|
|
311
|
+
lastToken.val += 1n;
|
|
312
312
|
return coerceRangeValue(value, tokensToStr(tokens));
|
|
313
313
|
}
|
|
314
314
|
return value;
|
|
@@ -336,7 +336,8 @@ function autoExtendMavenRange(currentRepresentation, newValue) {
|
|
|
336
336
|
interval.rightValue = incrementRangeValue(interval.leftValue) + ALPHA_SUFFIX;
|
|
337
337
|
} else if (rightValue === null) interval.leftValue = coerceRangeValue(leftValue, newValue);
|
|
338
338
|
else if (interval.rightType === "INCLUDING_POINT") {
|
|
339
|
-
|
|
339
|
+
const lastToken = tokenize(rightValue).at(-1);
|
|
340
|
+
if (isBigint(lastToken.val)) interval.rightValue = coerceRangeValue(rightValue, newValue);
|
|
340
341
|
else interval.rightValue = newValue;
|
|
341
342
|
} else interval.rightValue = incrementRangeValue(coerceRangeValue(rightValue, newValue));
|
|
342
343
|
return rangeToStr(range);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare.js","names":["isNull"],"sources":["../../../../lib/modules/versioning/maven/compare.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { Range, Token } from './types.ts';\n\nconst PREFIX_DOT = 'PREFIX_DOT';\nconst PREFIX_HYPHEN = 'PREFIX_HYPHEN';\nconst ALPHA_SUFFIX = '-alpha';\n\nconst TYPE_NUMBER = 'TYPE_NUMBER';\nconst TYPE_QUALIFIER = 'TYPE_QUALIFIER';\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return regEx(/^[a-z_+]$/i).test(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nfunction iterateTokens(versionStr: string, cb: (token: Token) => void): void {\n let currentPrefix = '';\n let currentVal = '';\n\n function yieldToken(transition = false): void {\n const val = currentVal || '0';\n if (regEx(/^\\d+$/).test(val)) {\n cb({\n prefix: currentPrefix,\n type: TYPE_NUMBER,\n val: parseInt(val, 10),\n isTransition: transition,\n });\n } else {\n cb({\n prefix: currentPrefix,\n type: TYPE_QUALIFIER,\n val,\n isTransition: transition,\n });\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (nextChar === '-') {\n yieldToken();\n currentPrefix = PREFIX_HYPHEN;\n currentVal = '';\n } else if (nextChar === '.') {\n yieldToken();\n currentPrefix = PREFIX_DOT;\n currentVal = '';\n } else if (prevChar === null && (nextChar === 'v' || nextChar === 'V')) {\n currentPrefix = nextChar;\n } else {\n if (currentVal !== '' && isTransition(prevChar!, nextChar)) {\n yieldToken(true);\n currentPrefix = PREFIX_HYPHEN;\n currentVal = nextChar;\n } else if (\n currentVal === '' &&\n (currentPrefix === 'v' || currentPrefix === 'V') &&\n !isDigit(nextChar)\n ) {\n currentVal = currentVal.concat(currentPrefix, nextChar);\n currentPrefix = '';\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n }\n });\n}\n\nfunction isNull(token: Token): boolean {\n const val = token.val;\n return (\n val === 0 ||\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n );\n}\n\nfunction tokenize(versionStr: string, preserveMinorZeroes = false): Token[] {\n let buf: Token[] = [];\n let result: Token[] = [];\n let leadingZero = true;\n iterateTokens(versionStr.toLowerCase(), (token) => {\n if (token.prefix === PREFIX_HYPHEN || token.type === TYPE_QUALIFIER) {\n buf = [];\n }\n buf.push(token);\n if (!isNull(token)) {\n leadingZero = false;\n result = result.concat(buf);\n buf = [];\n } else if (leadingZero || preserveMinorZeroes) {\n result = result.concat(buf);\n buf = [];\n }\n });\n return result;\n}\n\nfunction nullFor(token: Token): Token {\n return token.type === TYPE_NUMBER\n ? {\n prefix: token.prefix,\n type: TYPE_NUMBER,\n val: 0,\n }\n : {\n prefix: token.prefix,\n type: TYPE_QUALIFIER,\n val: '',\n };\n}\n\nfunction commonOrder(token: Token): number {\n if (token.type === TYPE_QUALIFIER) {\n return 1;\n }\n if (token.prefix === PREFIX_HYPHEN && token.type === TYPE_NUMBER) {\n return 2;\n }\n return 3;\n}\n\nexport const QualifierTypes = {\n Alpha: 1,\n Beta: 2,\n Milestone: 3,\n RC: 4,\n Snapshot: 5,\n Release: 6,\n SP: 7,\n} as const;\n\nexport function qualifierType(token: Token): number | null {\n const val = token.val;\n if (val === 'alpha' || (token.isTransition && val === 'a')) {\n return QualifierTypes.Alpha;\n }\n if (val === 'beta' || (token.isTransition && val === 'b')) {\n return QualifierTypes.Beta;\n }\n if (val === 'milestone' || (token.isTransition && val === 'm')) {\n return QualifierTypes.Milestone;\n }\n if (val === 'rc' || val === 'cr' || val === 'preview') {\n return QualifierTypes.RC;\n }\n if (val === 'snapshot' || val === 'snap') {\n return QualifierTypes.Snapshot;\n }\n if (\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n ) {\n return QualifierTypes.Release;\n }\n if (val === 'sp') {\n return QualifierTypes.SP;\n }\n return null;\n}\n\nfunction qualifierCmp(left: Token, right: Token): number {\n const leftOrder = qualifierType(left);\n const rightOrder = qualifierType(right);\n if (leftOrder && rightOrder) {\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n return 0;\n }\n\n if (leftOrder && leftOrder < QualifierTypes.Release) {\n return -1;\n }\n if (rightOrder && rightOrder < QualifierTypes.Release) {\n return 1;\n }\n\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token, right: Token): number {\n const leftOrder = commonOrder(left);\n const rightOrder = commonOrder(right);\n\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n\n if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n return qualifierCmp(left, right);\n}\n\nfunction compare(left: string, right: string): number {\n const leftTokens = tokenize(left);\n const rightTokens = tokenize(right);\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || nullFor(rightTokens[idx]);\n const rightToken = rightTokens[idx] || nullFor(leftTokens[idx]);\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nfunction isVersion(version: unknown): version is string {\n if (!version || !isString(version)) {\n return false;\n }\n if (!regEx(/^[-.a-z_+0-9]+$/i).test(version)) {\n return false;\n }\n if (regEx(/^[.-]/).test(version)) {\n return false;\n }\n if (regEx(/[.-]$/).test(version)) {\n return false;\n }\n if (['latest', 'release'].includes(version.toLowerCase())) {\n return false;\n }\n const tokens = tokenize(version);\n return !!tokens.length;\n}\n\nconst INCLUDING_POINT = 'INCLUDING_POINT';\nconst EXCLUDING_POINT = 'EXCLUDING_POINT';\n\nfunction parseRange(rangeStr: string): Range[] | null {\n function emptyInterval(): Range {\n return {\n leftType: null,\n leftValue: null,\n leftBracket: null,\n rightType: null,\n rightValue: null,\n rightBracket: null,\n };\n }\n\n const commaSplit = rangeStr.split(regEx(/\\s*,\\s*/));\n let ranges: Range[] | null = [];\n let interval = emptyInterval();\n\n commaSplit.forEach((subStr) => {\n if (!ranges) {\n return;\n }\n if (interval.leftType === null) {\n if (regEx(/^\\[.*]$/).test(subStr)) {\n const ver = subStr.slice(1, -1);\n ranges.push({\n leftType: INCLUDING_POINT,\n leftValue: ver,\n leftBracket: '[',\n rightType: INCLUDING_POINT,\n rightValue: ver,\n rightBracket: ']',\n });\n interval = emptyInterval();\n } else if (subStr.startsWith('[')) {\n const ver = subStr.slice(1);\n interval.leftType = INCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = '[';\n } else if (subStr.startsWith('(') || subStr.startsWith(']')) {\n const ver = subStr.slice(1);\n interval.leftType = EXCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = subStr[0];\n } else {\n ranges = null;\n }\n } else if (subStr.endsWith(']')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = INCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = ']';\n ranges.push(interval);\n interval = emptyInterval();\n } else if (subStr.endsWith(')') || subStr.endsWith('[')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = EXCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = subStr.endsWith(')') ? ')' : '[';\n ranges.push(interval);\n interval = emptyInterval();\n } else {\n ranges = null;\n }\n });\n\n if (interval.leftType) {\n return null;\n } // something like '[1,2],[3'\n if (!ranges?.length) {\n return null;\n }\n\n const lastIdx = ranges.length - 1;\n let prevValue: string | null = null;\n const result: Range[] = [];\n for (let idx = 0; idx < ranges.length; idx += 1) {\n const range = ranges[idx];\n const { leftType, leftValue, rightType, rightValue } = range;\n\n if (idx === 0 && leftValue === '') {\n if (leftType === EXCLUDING_POINT && isVersion(rightValue)) {\n prevValue = rightValue;\n result.push({ ...range, leftValue: null });\n continue;\n }\n return null;\n }\n if (idx === lastIdx && rightValue === '') {\n if (rightType === EXCLUDING_POINT && isVersion(leftValue)) {\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n result.push({ ...range, rightValue: null });\n continue;\n }\n return null;\n }\n if (isVersion(leftValue) && isVersion(rightValue)) {\n if (compare(leftValue, rightValue) === 1) {\n return null;\n }\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n prevValue = rightValue;\n result.push(range);\n continue;\n }\n return null;\n }\n return result;\n}\n\nfunction isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n return isVersion(str) || !!parseRange(str);\n}\n\nfunction rangeToStr(fullRange: Range[] | null): string | null {\n if (fullRange === null) {\n return null;\n }\n\n function valToStr(val: string | null): string {\n return val ?? '';\n }\n\n if (fullRange.length === 1) {\n const { leftBracket, rightBracket, leftValue, rightValue } = fullRange[0];\n if (\n leftValue === rightValue &&\n leftBracket === '[' &&\n rightBracket === ']'\n ) {\n return `[${valToStr(leftValue)}]`;\n }\n }\n\n const intervals = fullRange.map((val) =>\n [\n val.leftBracket,\n valToStr(val.leftValue),\n ',',\n valToStr(val.rightValue),\n val.rightBracket,\n ].join(''),\n );\n return intervals.join(',');\n}\n\nfunction tokensToStr(tokens: Token[]): string {\n let isTransition: boolean | undefined = false;\n return tokens.reduce((result: string, token: Token) => {\n let prefix: string;\n if (token.prefix === PREFIX_DOT) {\n prefix = '.';\n } else if (token.prefix === PREFIX_HYPHEN) {\n prefix = isTransition === true ? '' : '-';\n } else {\n prefix = token.prefix;\n }\n isTransition = token.isTransition;\n return `${result}${prefix}${token.val}`;\n }, '');\n}\n\nfunction coerceRangeValue(prev: string, next: string): string {\n const prevTokens = tokenize(prev, true);\n const nextTokens = tokenize(next, true);\n const resultTokens = nextTokens.slice(0, prevTokens.length);\n const align = Math.max(0, prevTokens.length - nextTokens.length);\n if (align > 0) {\n resultTokens.push(...prevTokens.slice(prevTokens.length - align));\n }\n return tokensToStr(resultTokens);\n}\n\nfunction incrementRangeValue(value: string): string {\n const tokens = tokenize(value);\n const lastToken = tokens.at(-1)!;\n if (typeof lastToken.val === 'number') {\n lastToken.val += 1;\n return coerceRangeValue(value, tokensToStr(tokens));\n }\n return value;\n}\n\nfunction autoExtendMavenRange(\n currentRepresentation: string,\n newValue: string,\n): string | null {\n const range = parseRange(currentRepresentation);\n if (!range) {\n return currentRepresentation;\n }\n function isPoint(vals: Range[]): boolean {\n if (vals.length !== 1) {\n return false;\n }\n const { leftType, leftValue, rightType, rightValue } = vals[0];\n return (\n leftType === 'INCLUDING_POINT' &&\n leftType === rightType &&\n leftValue === rightValue\n );\n }\n if (isPoint(range)) {\n return `[${newValue}]`;\n }\n\n const interval = [...range].reverse().find((elem) => {\n const { rightType, rightValue } = elem;\n return (\n rightValue === null ||\n (rightType === INCLUDING_POINT && compare(rightValue, newValue) === -1) ||\n (rightType === EXCLUDING_POINT && compare(rightValue, newValue) !== 1)\n );\n });\n\n if (!interval) {\n return currentRepresentation;\n }\n\n const { leftValue, rightValue } = interval;\n if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) === rightValue\n ) {\n // if a range was detected where incrementing the lower value once results in the upper value\n // and the new version is outside the range, construct a new range that follows the same semantic\n // [1,2) / 4.3.2 => [4,5)\n //\n // the interval above is only picked when the new value is at or past the\n // upper bound, and here the upper bound is the lower one incremented, so\n // the new value can never sort below the lower bound\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue = incrementRangeValue(interval.leftValue);\n } else if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) + ALPHA_SUFFIX === rightValue\n ) {\n // same as last if, but properly considering Maven ordering specification documented at\n // https://maven.apache.org/pom.html#Version_Order_Specification\n // 4-alpha is smaller than 4.0.0 for example\n // while often people that intend to only match version 1.x use [1,2)\n // this is not correct as it matches various 2.x versions, mostly pre-versions\n // so the correct range definition would be [1,2-alpha) as nothing\n // starting with 2 can be lower than 2-alpha in Maven version ordering logic\n //\n // so this if handles the conceptually same case as the last if\n // just for the case when proper Maven ranges are used\n // [1,2-alpha) / 4.3.2 => [4,5-alpha)\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue =\n incrementRangeValue(interval.leftValue) + ALPHA_SUFFIX;\n } else if (rightValue === null) {\n // an interval never has both bounds open: the parser only nulls the left\n // bound when the right one is a version, and the right one when the left\n // is a version\n interval.leftValue = coerceRangeValue(leftValue!, newValue);\n } else {\n if (interval.rightType === INCLUDING_POINT) {\n const tokens = tokenize(rightValue);\n const lastToken = tokens.at(-1)!;\n if (typeof lastToken.val === 'number') {\n interval.rightValue = coerceRangeValue(rightValue, newValue);\n } else {\n interval.rightValue = newValue;\n }\n } else {\n interval.rightValue = incrementRangeValue(\n coerceRangeValue(rightValue, newValue),\n );\n }\n }\n\n return rangeToStr(range);\n}\n\nfunction isSubversion(majorVersion: string, minorVersion: string): boolean {\n const majorTokens = tokenize(majorVersion);\n const minorTokens = tokenize(minorVersion);\n\n let result = true;\n const len = majorTokens.length;\n for (let idx = 0; idx < len; idx += 1) {\n const major = majorTokens[idx];\n const minor = minorTokens[idx] || nullFor(majorTokens[idx]);\n const cmpResult = tokenCmp(major, minor);\n if (cmpResult !== 0) {\n result = false;\n break;\n }\n }\n return result;\n}\n\nexport {\n EXCLUDING_POINT,\n INCLUDING_POINT,\n PREFIX_DOT,\n PREFIX_HYPHEN,\n TYPE_NUMBER,\n TYPE_QUALIFIER,\n autoExtendMavenRange,\n compare,\n isSubversion,\n isValid,\n isVersion,\n isVersion as isSingleVersion,\n parseRange,\n rangeToStr,\n tokenize,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compare.js","names":["isNull"],"sources":["../../../../lib/modules/versioning/maven/compare.ts"],"sourcesContent":["import { isBigint, isString } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport type { Range, Token } from './types.ts';\n\nconst PREFIX_DOT = 'PREFIX_DOT';\nconst PREFIX_HYPHEN = 'PREFIX_HYPHEN';\nconst ALPHA_SUFFIX = '-alpha';\n\nconst TYPE_NUMBER = 'TYPE_NUMBER';\nconst TYPE_QUALIFIER = 'TYPE_QUALIFIER';\n\nfunction iterateChars(\n str: string,\n cb: (p: string | null, n: string | null) => void,\n): void {\n let prev = null;\n let next = null;\n for (let i = 0; i < str.length; i += 1) {\n next = str.charAt(i);\n cb(prev, next);\n prev = next;\n }\n cb(prev, null);\n}\n\nfunction isDigit(char: string): boolean {\n return regEx(/^\\d$/).test(char);\n}\n\nfunction isLetter(char: string): boolean {\n return regEx(/^[a-z_+]$/i).test(char);\n}\n\nfunction isTransition(prevChar: string, nextChar: string): boolean {\n return (\n (isDigit(prevChar) && isLetter(nextChar)) ||\n (isLetter(prevChar) && isDigit(nextChar))\n );\n}\n\nfunction iterateTokens(versionStr: string, cb: (token: Token) => void): void {\n let currentPrefix = '';\n let currentVal = '';\n\n function yieldToken(transition = false): void {\n const val = currentVal || '0';\n if (regEx(/^\\d+$/).test(val)) {\n cb({\n prefix: currentPrefix,\n type: TYPE_NUMBER,\n val: BigInt(val),\n isTransition: transition,\n });\n } else {\n cb({\n prefix: currentPrefix,\n type: TYPE_QUALIFIER,\n val,\n isTransition: transition,\n });\n }\n }\n\n iterateChars(versionStr, (prevChar, nextChar) => {\n if (nextChar === null) {\n yieldToken();\n } else if (nextChar === '-') {\n yieldToken();\n currentPrefix = PREFIX_HYPHEN;\n currentVal = '';\n } else if (nextChar === '.') {\n yieldToken();\n currentPrefix = PREFIX_DOT;\n currentVal = '';\n } else if (prevChar === null && (nextChar === 'v' || nextChar === 'V')) {\n currentPrefix = nextChar;\n } else {\n if (currentVal !== '' && isTransition(prevChar!, nextChar)) {\n yieldToken(true);\n currentPrefix = PREFIX_HYPHEN;\n currentVal = nextChar;\n } else if (\n currentVal === '' &&\n (currentPrefix === 'v' || currentPrefix === 'V') &&\n !isDigit(nextChar)\n ) {\n currentVal = currentVal.concat(currentPrefix, nextChar);\n currentPrefix = '';\n } else {\n currentVal = currentVal.concat(nextChar);\n }\n }\n });\n}\n\nfunction isNull(token: Token): boolean {\n const val = token.val;\n return (\n val === 0n ||\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n );\n}\n\nfunction tokenize(versionStr: string, preserveMinorZeroes = false): Token[] {\n let buf: Token[] = [];\n let result: Token[] = [];\n let leadingZero = true;\n iterateTokens(versionStr.toLowerCase(), (token) => {\n if (token.prefix === PREFIX_HYPHEN || token.type === TYPE_QUALIFIER) {\n buf = [];\n }\n buf.push(token);\n if (!isNull(token)) {\n leadingZero = false;\n result = result.concat(buf);\n buf = [];\n } else if (leadingZero || preserveMinorZeroes) {\n result = result.concat(buf);\n buf = [];\n }\n });\n return result;\n}\n\nfunction nullFor(token: Token): Token {\n return token.type === TYPE_NUMBER\n ? {\n prefix: token.prefix,\n type: TYPE_NUMBER,\n val: 0n,\n }\n : {\n prefix: token.prefix,\n type: TYPE_QUALIFIER,\n val: '',\n };\n}\n\nfunction commonOrder(token: Token): number {\n if (token.type === TYPE_QUALIFIER) {\n return 1;\n }\n if (token.prefix === PREFIX_HYPHEN && token.type === TYPE_NUMBER) {\n return 2;\n }\n return 3;\n}\n\nexport const QualifierTypes = {\n Alpha: 1,\n Beta: 2,\n Milestone: 3,\n RC: 4,\n Snapshot: 5,\n Release: 6,\n SP: 7,\n} as const;\n\nexport function qualifierType(token: Token): number | null {\n const val = token.val;\n if (val === 'alpha' || (token.isTransition && val === 'a')) {\n return QualifierTypes.Alpha;\n }\n if (val === 'beta' || (token.isTransition && val === 'b')) {\n return QualifierTypes.Beta;\n }\n if (val === 'milestone' || (token.isTransition && val === 'm')) {\n return QualifierTypes.Milestone;\n }\n if (val === 'rc' || val === 'cr' || val === 'preview') {\n return QualifierTypes.RC;\n }\n if (val === 'snapshot' || val === 'snap') {\n return QualifierTypes.Snapshot;\n }\n if (\n val === '' ||\n val === 'final' ||\n val === 'ga' ||\n val === 'release' ||\n val === 'latest' ||\n val === 'sr'\n ) {\n return QualifierTypes.Release;\n }\n if (val === 'sp') {\n return QualifierTypes.SP;\n }\n return null;\n}\n\nfunction qualifierCmp(left: Token, right: Token): number {\n const leftOrder = qualifierType(left);\n const rightOrder = qualifierType(right);\n if (leftOrder && rightOrder) {\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n return 0;\n }\n\n if (leftOrder && leftOrder < QualifierTypes.Release) {\n return -1;\n }\n if (rightOrder && rightOrder < QualifierTypes.Release) {\n return 1;\n }\n\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n}\n\nfunction tokenCmp(left: Token, right: Token): number {\n const leftOrder = commonOrder(left);\n const rightOrder = commonOrder(right);\n\n if (leftOrder < rightOrder) {\n return -1;\n }\n if (leftOrder > rightOrder) {\n return 1;\n }\n\n if (left.type === TYPE_NUMBER && right.type === TYPE_NUMBER) {\n if (left.val < right.val) {\n return -1;\n }\n if (left.val > right.val) {\n return 1;\n }\n return 0;\n }\n\n return qualifierCmp(left, right);\n}\n\nfunction compare(left: string, right: string): number {\n const leftTokens = tokenize(left);\n const rightTokens = tokenize(right);\n const length = Math.max(leftTokens.length, rightTokens.length);\n for (let idx = 0; idx < length; idx += 1) {\n const leftToken = leftTokens[idx] || nullFor(rightTokens[idx]);\n const rightToken = rightTokens[idx] || nullFor(leftTokens[idx]);\n const cmpResult = tokenCmp(leftToken, rightToken);\n if (cmpResult !== 0) {\n return cmpResult;\n }\n }\n return 0;\n}\n\nfunction isVersion(version: unknown): version is string {\n if (!version || !isString(version)) {\n return false;\n }\n if (!regEx(/^[-.a-z_+0-9]+$/i).test(version)) {\n return false;\n }\n if (regEx(/^[.-]/).test(version)) {\n return false;\n }\n if (regEx(/[.-]$/).test(version)) {\n return false;\n }\n if (['latest', 'release'].includes(version.toLowerCase())) {\n return false;\n }\n const tokens = tokenize(version);\n return !!tokens.length;\n}\n\nconst INCLUDING_POINT = 'INCLUDING_POINT';\nconst EXCLUDING_POINT = 'EXCLUDING_POINT';\n\nfunction parseRange(rangeStr: string): Range[] | null {\n function emptyInterval(): Range {\n return {\n leftType: null,\n leftValue: null,\n leftBracket: null,\n rightType: null,\n rightValue: null,\n rightBracket: null,\n };\n }\n\n const commaSplit = rangeStr.split(regEx(/\\s*,\\s*/));\n let ranges: Range[] | null = [];\n let interval = emptyInterval();\n\n commaSplit.forEach((subStr) => {\n if (!ranges) {\n return;\n }\n if (interval.leftType === null) {\n if (regEx(/^\\[.*]$/).test(subStr)) {\n const ver = subStr.slice(1, -1);\n ranges.push({\n leftType: INCLUDING_POINT,\n leftValue: ver,\n leftBracket: '[',\n rightType: INCLUDING_POINT,\n rightValue: ver,\n rightBracket: ']',\n });\n interval = emptyInterval();\n } else if (subStr.startsWith('[')) {\n const ver = subStr.slice(1);\n interval.leftType = INCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = '[';\n } else if (subStr.startsWith('(') || subStr.startsWith(']')) {\n const ver = subStr.slice(1);\n interval.leftType = EXCLUDING_POINT;\n interval.leftValue = ver;\n interval.leftBracket = subStr[0];\n } else {\n ranges = null;\n }\n } else if (subStr.endsWith(']')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = INCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = ']';\n ranges.push(interval);\n interval = emptyInterval();\n } else if (subStr.endsWith(')') || subStr.endsWith('[')) {\n const ver = subStr.slice(0, -1);\n interval.rightType = EXCLUDING_POINT;\n interval.rightValue = ver;\n interval.rightBracket = subStr.endsWith(')') ? ')' : '[';\n ranges.push(interval);\n interval = emptyInterval();\n } else {\n ranges = null;\n }\n });\n\n if (interval.leftType) {\n return null;\n } // something like '[1,2],[3'\n if (!ranges?.length) {\n return null;\n }\n\n const lastIdx = ranges.length - 1;\n let prevValue: string | null = null;\n const result: Range[] = [];\n for (let idx = 0; idx < ranges.length; idx += 1) {\n const range = ranges[idx];\n const { leftType, leftValue, rightType, rightValue } = range;\n\n if (idx === 0 && leftValue === '') {\n if (leftType === EXCLUDING_POINT && isVersion(rightValue)) {\n prevValue = rightValue;\n result.push({ ...range, leftValue: null });\n continue;\n }\n return null;\n }\n if (idx === lastIdx && rightValue === '') {\n if (rightType === EXCLUDING_POINT && isVersion(leftValue)) {\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n result.push({ ...range, rightValue: null });\n continue;\n }\n return null;\n }\n if (isVersion(leftValue) && isVersion(rightValue)) {\n if (compare(leftValue, rightValue) === 1) {\n return null;\n }\n if (prevValue && compare(prevValue, leftValue) === 1) {\n return null;\n }\n prevValue = rightValue;\n result.push(range);\n continue;\n }\n return null;\n }\n return result;\n}\n\nfunction isValid(str: string): boolean {\n if (!str) {\n return false;\n }\n return isVersion(str) || !!parseRange(str);\n}\n\nfunction rangeToStr(fullRange: Range[] | null): string | null {\n if (fullRange === null) {\n return null;\n }\n\n function valToStr(val: string | null): string {\n return val ?? '';\n }\n\n if (fullRange.length === 1) {\n const { leftBracket, rightBracket, leftValue, rightValue } = fullRange[0];\n if (\n leftValue === rightValue &&\n leftBracket === '[' &&\n rightBracket === ']'\n ) {\n return `[${valToStr(leftValue)}]`;\n }\n }\n\n const intervals = fullRange.map((val) =>\n [\n val.leftBracket,\n valToStr(val.leftValue),\n ',',\n valToStr(val.rightValue),\n val.rightBracket,\n ].join(''),\n );\n return intervals.join(',');\n}\n\nfunction tokensToStr(tokens: Token[]): string {\n let isTransition: boolean | undefined = false;\n return tokens.reduce((result: string, token: Token) => {\n let prefix: string;\n if (token.prefix === PREFIX_DOT) {\n prefix = '.';\n } else if (token.prefix === PREFIX_HYPHEN) {\n prefix = isTransition === true ? '' : '-';\n } else {\n prefix = token.prefix;\n }\n isTransition = token.isTransition;\n return `${result}${prefix}${token.val}`;\n }, '');\n}\n\nfunction coerceRangeValue(prev: string, next: string): string {\n const prevTokens = tokenize(prev, true);\n const nextTokens = tokenize(next, true);\n const resultTokens = nextTokens.slice(0, prevTokens.length);\n const align = Math.max(0, prevTokens.length - nextTokens.length);\n if (align > 0) {\n resultTokens.push(...prevTokens.slice(prevTokens.length - align));\n }\n return tokensToStr(resultTokens);\n}\n\nfunction incrementRangeValue(value: string): string {\n const tokens = tokenize(value);\n const lastToken = tokens.at(-1)!;\n if (isBigint(lastToken.val)) {\n lastToken.val += 1n;\n return coerceRangeValue(value, tokensToStr(tokens));\n }\n return value;\n}\n\nfunction autoExtendMavenRange(\n currentRepresentation: string,\n newValue: string,\n): string | null {\n const range = parseRange(currentRepresentation);\n if (!range) {\n return currentRepresentation;\n }\n function isPoint(vals: Range[]): boolean {\n if (vals.length !== 1) {\n return false;\n }\n const { leftType, leftValue, rightType, rightValue } = vals[0];\n return (\n leftType === 'INCLUDING_POINT' &&\n leftType === rightType &&\n leftValue === rightValue\n );\n }\n if (isPoint(range)) {\n return `[${newValue}]`;\n }\n\n const interval = [...range].reverse().find((elem) => {\n const { rightType, rightValue } = elem;\n return (\n rightValue === null ||\n (rightType === INCLUDING_POINT && compare(rightValue, newValue) === -1) ||\n (rightType === EXCLUDING_POINT && compare(rightValue, newValue) !== 1)\n );\n });\n\n if (!interval) {\n return currentRepresentation;\n }\n\n const { leftValue, rightValue } = interval;\n if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) === rightValue\n ) {\n // if a range was detected where incrementing the lower value once results in the upper value\n // and the new version is outside the range, construct a new range that follows the same semantic\n // [1,2) / 4.3.2 => [4,5)\n //\n // the interval above is only picked when the new value is at or past the\n // upper bound, and here the upper bound is the lower one incremented, so\n // the new value can never sort below the lower bound\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue = incrementRangeValue(interval.leftValue);\n } else if (\n leftValue !== null &&\n rightValue !== null &&\n incrementRangeValue(leftValue) + ALPHA_SUFFIX === rightValue\n ) {\n // same as last if, but properly considering Maven ordering specification documented at\n // https://maven.apache.org/pom.html#Version_Order_Specification\n // 4-alpha is smaller than 4.0.0 for example\n // while often people that intend to only match version 1.x use [1,2)\n // this is not correct as it matches various 2.x versions, mostly pre-versions\n // so the correct range definition would be [1,2-alpha) as nothing\n // starting with 2 can be lower than 2-alpha in Maven version ordering logic\n //\n // so this if handles the conceptually same case as the last if\n // just for the case when proper Maven ranges are used\n // [1,2-alpha) / 4.3.2 => [4,5-alpha)\n interval.leftValue = coerceRangeValue(leftValue, newValue);\n interval.rightValue =\n incrementRangeValue(interval.leftValue) + ALPHA_SUFFIX;\n } else if (rightValue === null) {\n // an interval never has both bounds open: the parser only nulls the left\n // bound when the right one is a version, and the right one when the left\n // is a version\n interval.leftValue = coerceRangeValue(leftValue!, newValue);\n } else {\n if (interval.rightType === INCLUDING_POINT) {\n const tokens = tokenize(rightValue);\n const lastToken = tokens.at(-1)!;\n if (isBigint(lastToken.val)) {\n interval.rightValue = coerceRangeValue(rightValue, newValue);\n } else {\n interval.rightValue = newValue;\n }\n } else {\n interval.rightValue = incrementRangeValue(\n coerceRangeValue(rightValue, newValue),\n );\n }\n }\n\n return rangeToStr(range);\n}\n\nfunction isSubversion(majorVersion: string, minorVersion: string): boolean {\n const majorTokens = tokenize(majorVersion);\n const minorTokens = tokenize(minorVersion);\n\n let result = true;\n const len = majorTokens.length;\n for (let idx = 0; idx < len; idx += 1) {\n const major = majorTokens[idx];\n const minor = minorTokens[idx] || nullFor(majorTokens[idx]);\n const cmpResult = tokenCmp(major, minor);\n if (cmpResult !== 0) {\n result = false;\n break;\n }\n }\n return result;\n}\n\nexport {\n EXCLUDING_POINT,\n INCLUDING_POINT,\n PREFIX_DOT,\n PREFIX_HYPHEN,\n TYPE_NUMBER,\n TYPE_QUALIFIER,\n autoExtendMavenRange,\n compare,\n isSubversion,\n isValid,\n isVersion,\n isVersion as isSingleVersion,\n parseRange,\n rangeToStr,\n tokenize,\n};\n"],"mappings":";;;AAIA,MAAM,aAAa;AACnB,MAAM,gBAAgB;AACtB,MAAM,eAAe;AAErB,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAEvB,SAAS,aACP,KACA,IACM;CACN,IAAI,OAAO;CACX,IAAI,OAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;EACtC,OAAO,IAAI,OAAO,CAAC;EACnB,GAAG,MAAM,IAAI;EACb,OAAO;CACT;CACA,GAAG,MAAM,IAAI;AACf;AAEA,SAAS,QAAQ,MAAuB;CACtC,OAAO,MAAM,MAAM,CAAC,CAAC,KAAK,IAAI;AAChC;AAEA,SAAS,SAAS,MAAuB;CACvC,OAAO,MAAM,YAAY,CAAC,CAAC,KAAK,IAAI;AACtC;AAEA,SAAS,aAAa,UAAkB,UAA2B;CACjE,OACG,QAAQ,QAAQ,KAAK,SAAS,QAAQ,KACtC,SAAS,QAAQ,KAAK,QAAQ,QAAQ;AAE3C;AAEA,SAAS,cAAc,YAAoB,IAAkC;CAC3E,IAAI,gBAAgB;CACpB,IAAI,aAAa;CAEjB,SAAS,WAAW,aAAa,OAAa;EAC5C,MAAM,MAAM,cAAc;EAC1B,IAAI,MAAM,OAAO,CAAC,CAAC,KAAK,GAAG,GACzB,GAAG;GACD,QAAQ;GACR,MAAM;GACN,KAAK,OAAO,GAAG;GACf,cAAc;EAChB,CAAC;OAED,GAAG;GACD,QAAQ;GACR,MAAM;GACN;GACA,cAAc;EAChB,CAAC;CAEL;CAEA,aAAa,aAAa,UAAU,aAAa;EAC/C,IAAI,aAAa,MACf,WAAW;OACN,IAAI,aAAa,KAAK;GAC3B,WAAW;GACX,gBAAgB;GAChB,aAAa;EACf,OAAO,IAAI,aAAa,KAAK;GAC3B,WAAW;GACX,gBAAgB;GAChB,aAAa;EACf,OAAO,IAAI,aAAa,SAAS,aAAa,OAAO,aAAa,MAChE,gBAAgB;OAEhB,IAAI,eAAe,MAAM,aAAa,UAAW,QAAQ,GAAG;GAC1D,WAAW,IAAI;GACf,gBAAgB;GAChB,aAAa;EACf,OAAO,IACL,eAAe,OACd,kBAAkB,OAAO,kBAAkB,QAC5C,CAAC,QAAQ,QAAQ,GACjB;GACA,aAAa,WAAW,OAAO,eAAe,QAAQ;GACtD,gBAAgB;EAClB,OACE,aAAa,WAAW,OAAO,QAAQ;CAG7C,CAAC;AACH;AAEA,SAASA,SAAO,OAAuB;CACrC,MAAM,MAAM,MAAM;CAClB,OACE,QAAQ,MACR,QAAQ,MACR,QAAQ,WACR,QAAQ,QACR,QAAQ,aACR,QAAQ,YACR,QAAQ;AAEZ;AAEA,SAAS,SAAS,YAAoB,sBAAsB,OAAgB;CAC1E,IAAI,MAAe,CAAC;CACpB,IAAI,SAAkB,CAAC;CACvB,IAAI,cAAc;CAClB,cAAc,WAAW,YAAY,IAAI,UAAU;EACjD,IAAI,MAAM,WAAA,mBAA4B,MAAM,SAAA,kBAC1C,MAAM,CAAC;EAET,IAAI,KAAK,KAAK;EACd,IAAI,CAACA,SAAO,KAAK,GAAG;GAClB,cAAc;GACd,SAAS,OAAO,OAAO,GAAG;GAC1B,MAAM,CAAC;EACT,OAAO,IAAI,eAAe,qBAAqB;GAC7C,SAAS,OAAO,OAAO,GAAG;GAC1B,MAAM,CAAC;EACT;CACF,CAAC;CACD,OAAO;AACT;AAEA,SAAS,QAAQ,OAAqB;CACpC,OAAO,MAAM,SAAA,gBACT;EACE,QAAQ,MAAM;EACd,MAAM;EACN,KAAK;CACP,IACA;EACE,QAAQ,MAAM;EACd,MAAM;EACN,KAAK;CACP;AACN;AAEA,SAAS,YAAY,OAAsB;CACzC,IAAI,MAAM,SAAA,kBACR,OAAO;CAET,IAAI,MAAM,WAAA,mBAA4B,MAAM,SAAA,eAC1C,OAAO;CAET,OAAO;AACT;AAEA,MAAa,iBAAiB;CAC5B,OAAO;CACP,MAAM;CACN,WAAW;CACX,IAAI;CACJ,UAAU;CACV,SAAS;CACT,IAAI;AACN;AAEA,SAAgB,cAAc,OAA6B;CACzD,MAAM,MAAM,MAAM;CAClB,IAAI,QAAQ,WAAY,MAAM,gBAAgB,QAAQ,KACpD,OAAO,eAAe;CAExB,IAAI,QAAQ,UAAW,MAAM,gBAAgB,QAAQ,KACnD,OAAO,eAAe;CAExB,IAAI,QAAQ,eAAgB,MAAM,gBAAgB,QAAQ,KACxD,OAAO,eAAe;CAExB,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,WAC1C,OAAO,eAAe;CAExB,IAAI,QAAQ,cAAc,QAAQ,QAChC,OAAO,eAAe;CAExB,IACE,QAAQ,MACR,QAAQ,WACR,QAAQ,QACR,QAAQ,aACR,QAAQ,YACR,QAAQ,MAER,OAAO,eAAe;CAExB,IAAI,QAAQ,MACV,OAAO,eAAe;CAExB,OAAO;AACT;AAEA,SAAS,aAAa,MAAa,OAAsB;CACvD,MAAM,YAAY,cAAc,IAAI;CACpC,MAAM,aAAa,cAAc,KAAK;CACtC,IAAI,aAAa,YAAY;EAC3B,IAAI,YAAY,YACd,OAAO;EAET,IAAI,YAAY,YACd,OAAO;EAET,OAAO;CACT;CAEA,IAAI,aAAa,YAAY,eAAe,SAC1C,OAAO;CAET,IAAI,cAAc,aAAa,eAAe,SAC5C,OAAO;CAGT,IAAI,KAAK,MAAM,MAAM,KACnB,OAAO;CAET,IAAI,KAAK,MAAM,MAAM,KACnB,OAAO;CAET,OAAO;AACT;AAEA,SAAS,SAAS,MAAa,OAAsB;CACnD,MAAM,YAAY,YAAY,IAAI;CAClC,MAAM,aAAa,YAAY,KAAK;CAEpC,IAAI,YAAY,YACd,OAAO;CAET,IAAI,YAAY,YACd,OAAO;CAGT,IAAI,KAAK,SAAA,iBAAwB,MAAM,SAAA,eAAsB;EAC3D,IAAI,KAAK,MAAM,MAAM,KACnB,OAAO;EAET,IAAI,KAAK,MAAM,MAAM,KACnB,OAAO;EAET,OAAO;CACT;CAEA,OAAO,aAAa,MAAM,KAAK;AACjC;AAEA,SAAS,QAAQ,MAAc,OAAuB;CACpD,MAAM,aAAa,SAAS,IAAI;CAChC,MAAM,cAAc,SAAS,KAAK;CAClC,MAAM,SAAS,KAAK,IAAI,WAAW,QAAQ,YAAY,MAAM;CAC7D,KAAK,IAAI,MAAM,GAAG,MAAM,QAAQ,OAAO,GAAG;EAGxC,MAAM,YAAY,SAFA,WAAW,QAAQ,QAAQ,YAAY,IAAI,GAC1C,YAAY,QAAQ,QAAQ,WAAW,IAAI,CACd;EAChD,IAAI,cAAc,GAChB,OAAO;CAEX;CACA,OAAO;AACT;AAEA,SAAS,UAAU,SAAqC;CACtD,IAAI,CAAC,WAAW,CAAC,SAAS,OAAO,GAC/B,OAAO;CAET,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC,KAAK,OAAO,GACzC,OAAO;CAET,IAAI,MAAM,OAAO,CAAC,CAAC,KAAK,OAAO,GAC7B,OAAO;CAET,IAAI,MAAM,OAAO,CAAC,CAAC,KAAK,OAAO,GAC7B,OAAO;CAET,IAAI,CAAC,UAAU,SAAS,CAAC,CAAC,SAAS,QAAQ,YAAY,CAAC,GACtD,OAAO;CAGT,OAAO,CAAC,CADO,SAAS,OACV,CAAC,CAAC;AAClB;AAEA,MAAM,kBAAkB;AACxB,MAAM,kBAAkB;AAExB,SAAS,WAAW,UAAkC;CACpD,SAAS,gBAAuB;EAC9B,OAAO;GACL,UAAU;GACV,WAAW;GACX,aAAa;GACb,WAAW;GACX,YAAY;GACZ,cAAc;EAChB;CACF;CAEA,MAAM,aAAa,SAAS,MAAM,MAAM,SAAS,CAAC;CAClD,IAAI,SAAyB,CAAC;CAC9B,IAAI,WAAW,cAAc;CAE7B,WAAW,SAAS,WAAW;EAC7B,IAAI,CAAC,QACH;EAEF,IAAI,SAAS,aAAa,MAAM;GAC9B,IAAI,MAAM,SAAS,CAAC,CAAC,KAAK,MAAM,GAAG;IACjC,MAAM,MAAM,OAAO,MAAM,GAAG,EAAE;IAC9B,OAAO,KAAK;KACV,UAAU;KACV,WAAW;KACX,aAAa;KACb,WAAW;KACX,YAAY;KACZ,cAAc;IAChB,CAAC;IACD,WAAW,cAAc;GAC3B,OAAO,IAAI,OAAO,WAAW,GAAG,GAAG;IACjC,MAAM,MAAM,OAAO,MAAM,CAAC;IAC1B,SAAS,WAAW;IACpB,SAAS,YAAY;IACrB,SAAS,cAAc;GACzB,OAAO,IAAI,OAAO,WAAW,GAAG,KAAK,OAAO,WAAW,GAAG,GAAG;IAC3D,MAAM,MAAM,OAAO,MAAM,CAAC;IAC1B,SAAS,WAAW;IACpB,SAAS,YAAY;IACrB,SAAS,cAAc,OAAO;GAChC,OACE,SAAS;EAEb,OAAO,IAAI,OAAO,SAAS,GAAG,GAAG;GAC/B,MAAM,MAAM,OAAO,MAAM,GAAG,EAAE;GAC9B,SAAS,YAAY;GACrB,SAAS,aAAa;GACtB,SAAS,eAAe;GACxB,OAAO,KAAK,QAAQ;GACpB,WAAW,cAAc;EAC3B,OAAO,IAAI,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,GAAG,GAAG;GACvD,MAAM,MAAM,OAAO,MAAM,GAAG,EAAE;GAC9B,SAAS,YAAY;GACrB,SAAS,aAAa;GACtB,SAAS,eAAe,OAAO,SAAS,GAAG,IAAI,MAAM;GACrD,OAAO,KAAK,QAAQ;GACpB,WAAW,cAAc;EAC3B,OACE,SAAS;CAEb,CAAC;CAED,IAAI,SAAS,UACX,OAAO;CAET,IAAI,CAAC,QAAQ,QACX,OAAO;CAGT,MAAM,UAAU,OAAO,SAAS;CAChC,IAAI,YAA2B;CAC/B,MAAM,SAAkB,CAAC;CACzB,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO,QAAQ,OAAO,GAAG;EAC/C,MAAM,QAAQ,OAAO;EACrB,MAAM,EAAE,UAAU,WAAW,WAAW,eAAe;EAEvD,IAAI,QAAQ,KAAK,cAAc,IAAI;GACjC,IAAI,aAAA,qBAAgC,UAAU,UAAU,GAAG;IACzD,YAAY;IACZ,OAAO,KAAK;KAAE,GAAG;KAAO,WAAW;IAAK,CAAC;IACzC;GACF;GACA,OAAO;EACT;EACA,IAAI,QAAQ,WAAW,eAAe,IAAI;GACxC,IAAI,cAAA,qBAAiC,UAAU,SAAS,GAAG;IACzD,IAAI,aAAa,QAAQ,WAAW,SAAS,MAAM,GACjD,OAAO;IAET,OAAO,KAAK;KAAE,GAAG;KAAO,YAAY;IAAK,CAAC;IAC1C;GACF;GACA,OAAO;EACT;EACA,IAAI,UAAU,SAAS,KAAK,UAAU,UAAU,GAAG;GACjD,IAAI,QAAQ,WAAW,UAAU,MAAM,GACrC,OAAO;GAET,IAAI,aAAa,QAAQ,WAAW,SAAS,MAAM,GACjD,OAAO;GAET,YAAY;GACZ,OAAO,KAAK,KAAK;GACjB;EACF;EACA,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAS,QAAQ,KAAsB;CACrC,IAAI,CAAC,KACH,OAAO;CAET,OAAO,UAAU,GAAG,KAAK,CAAC,CAAC,WAAW,GAAG;AAC3C;AAEA,SAAS,WAAW,WAA0C;CAC5D,IAAI,cAAc,MAChB,OAAO;CAGT,SAAS,SAAS,KAA4B;EAC5C,OAAO,OAAO;CAChB;CAEA,IAAI,UAAU,WAAW,GAAG;EAC1B,MAAM,EAAE,aAAa,cAAc,WAAW,eAAe,UAAU;EACvE,IACE,cAAc,cACd,gBAAgB,OAChB,iBAAiB,KAEjB,OAAO,IAAI,SAAS,SAAS,EAAE;CAEnC;CAWA,OATkB,UAAU,KAAK,QAC/B;EACE,IAAI;EACJ,SAAS,IAAI,SAAS;EACtB;EACA,SAAS,IAAI,UAAU;EACvB,IAAI;CACN,CAAC,CAAC,KAAK,EAAE,CAEI,CAAC,CAAC,KAAK,GAAG;AAC3B;AAEA,SAAS,YAAY,QAAyB;CAC5C,IAAI,eAAoC;CACxC,OAAO,OAAO,QAAQ,QAAgB,UAAiB;EACrD,IAAI;EACJ,IAAI,MAAM,WAAA,cACR,SAAS;OACJ,IAAI,MAAM,WAAA,iBACf,SAAS,iBAAiB,OAAO,KAAK;OAEtC,SAAS,MAAM;EAEjB,eAAe,MAAM;EACrB,OAAO,GAAG,SAAS,SAAS,MAAM;CACpC,GAAG,EAAE;AACP;AAEA,SAAS,iBAAiB,MAAc,MAAsB;CAC5D,MAAM,aAAa,SAAS,MAAM,IAAI;CACtC,MAAM,aAAa,SAAS,MAAM,IAAI;CACtC,MAAM,eAAe,WAAW,MAAM,GAAG,WAAW,MAAM;CAC1D,MAAM,QAAQ,KAAK,IAAI,GAAG,WAAW,SAAS,WAAW,MAAM;CAC/D,IAAI,QAAQ,GACV,aAAa,KAAK,GAAG,WAAW,MAAM,WAAW,SAAS,KAAK,CAAC;CAElE,OAAO,YAAY,YAAY;AACjC;AAEA,SAAS,oBAAoB,OAAuB;CAClD,MAAM,SAAS,SAAS,KAAK;CAC7B,MAAM,YAAY,OAAO,GAAG,EAAE;CAC9B,IAAI,SAAS,UAAU,GAAG,GAAG;EAC3B,UAAU,OAAO;EACjB,OAAO,iBAAiB,OAAO,YAAY,MAAM,CAAC;CACpD;CACA,OAAO;AACT;AAEA,SAAS,qBACP,uBACA,UACe;CACf,MAAM,QAAQ,WAAW,qBAAqB;CAC9C,IAAI,CAAC,OACH,OAAO;CAET,SAAS,QAAQ,MAAwB;EACvC,IAAI,KAAK,WAAW,GAClB,OAAO;EAET,MAAM,EAAE,UAAU,WAAW,WAAW,eAAe,KAAK;EAC5D,OACE,aAAa,qBACb,aAAa,aACb,cAAc;CAElB;CACA,IAAI,QAAQ,KAAK,GACf,OAAO,IAAI,SAAS;CAGtB,MAAM,WAAW,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,SAAS;EACnD,MAAM,EAAE,WAAW,eAAe;EAClC,OACE,eAAe,QACd,cAAA,qBAAiC,QAAQ,YAAY,QAAQ,MAAM,MACnE,cAAA,qBAAiC,QAAQ,YAAY,QAAQ,MAAM;CAExE,CAAC;CAED,IAAI,CAAC,UACH,OAAO;CAGT,MAAM,EAAE,WAAW,eAAe;CAClC,IACE,cAAc,QACd,eAAe,QACf,oBAAoB,SAAS,MAAM,YACnC;EAQA,SAAS,YAAY,iBAAiB,WAAW,QAAQ;EACzD,SAAS,aAAa,oBAAoB,SAAS,SAAS;CAC9D,OAAO,IACL,cAAc,QACd,eAAe,QACf,oBAAoB,SAAS,IAAI,iBAAiB,YAClD;EAYA,SAAS,YAAY,iBAAiB,WAAW,QAAQ;EACzD,SAAS,aACP,oBAAoB,SAAS,SAAS,IAAI;CAC9C,OAAO,IAAI,eAAe,MAIxB,SAAS,YAAY,iBAAiB,WAAY,QAAQ;MAE1D,IAAI,SAAS,cAAA,mBAA+B;EAE1C,MAAM,YADS,SAAS,UACD,CAAC,CAAC,GAAG,EAAE;EAC9B,IAAI,SAAS,UAAU,GAAG,GACxB,SAAS,aAAa,iBAAiB,YAAY,QAAQ;OAE3D,SAAS,aAAa;CAE1B,OACE,SAAS,aAAa,oBACpB,iBAAiB,YAAY,QAAQ,CACvC;CAIJ,OAAO,WAAW,KAAK;AACzB;AAEA,SAAS,aAAa,cAAsB,cAA+B;CACzE,MAAM,cAAc,SAAS,YAAY;CACzC,MAAM,cAAc,SAAS,YAAY;CAEzC,IAAI,SAAS;CACb,MAAM,MAAM,YAAY;CACxB,KAAK,IAAI,MAAM,GAAG,MAAM,KAAK,OAAO,GAAG;EACrC,MAAM,QAAQ,YAAY;EAG1B,IADkB,SAAS,OADb,YAAY,QAAQ,QAAQ,YAAY,IAAI,CAE9C,MAAM,GAAG;GACnB,SAAS;GACT;EACF;CACF;CACA,OAAO;AACT"}
|
|
@@ -2,6 +2,11 @@ import { coerceString } from "../../../util/string.js";
|
|
|
2
2
|
import { QualifierTypes, autoExtendMavenRange, compare, isSingleVersion as isVersion, isValid, parseRange, qualifierType, tokenize } from "./compare.js";
|
|
3
3
|
//#region lib/modules/versioning/maven/index.ts
|
|
4
4
|
const id = "maven";
|
|
5
|
+
const sectionIndexes = {
|
|
6
|
+
major: 0,
|
|
7
|
+
minor: 1,
|
|
8
|
+
patch: 2
|
|
9
|
+
};
|
|
5
10
|
function equals(a, b) {
|
|
6
11
|
return compare(a, b) === 0;
|
|
7
12
|
}
|
|
@@ -21,13 +26,16 @@ function matches(a, b) {
|
|
|
21
26
|
}, false);
|
|
22
27
|
}
|
|
23
28
|
function getMajor(version) {
|
|
24
|
-
if (isVersion(version))
|
|
29
|
+
if (isVersion(version)) {
|
|
30
|
+
const majorToken = tokenize(version)[0];
|
|
31
|
+
return parseInt(majorToken.val.toString(), 10);
|
|
32
|
+
}
|
|
25
33
|
return null;
|
|
26
34
|
}
|
|
27
35
|
function getMinor(version) {
|
|
28
36
|
if (isVersion(version)) {
|
|
29
37
|
const minorToken = tokenize(version)[1];
|
|
30
|
-
if (minorToken?.type === "TYPE_NUMBER") return
|
|
38
|
+
if (minorToken?.type === "TYPE_NUMBER") return parseInt(minorToken.val.toString(), 10);
|
|
31
39
|
return 0;
|
|
32
40
|
}
|
|
33
41
|
return null;
|
|
@@ -37,7 +45,7 @@ function getPatch(version) {
|
|
|
37
45
|
const tokens = tokenize(version);
|
|
38
46
|
const minorToken = tokens[1];
|
|
39
47
|
const patchToken = tokens[2];
|
|
40
|
-
if (patchToken && minorToken.type === "TYPE_NUMBER" && patchToken.type === "TYPE_NUMBER") return
|
|
48
|
+
if (patchToken && minorToken.type === "TYPE_NUMBER" && patchToken.type === "TYPE_NUMBER") return parseInt(patchToken.val.toString(), 10);
|
|
41
49
|
return 0;
|
|
42
50
|
}
|
|
43
51
|
return null;
|
|
@@ -45,6 +53,18 @@ function getPatch(version) {
|
|
|
45
53
|
function isGreaterThan(a, b) {
|
|
46
54
|
return compare(a, b) === 1;
|
|
47
55
|
}
|
|
56
|
+
function getExactSection(version, type) {
|
|
57
|
+
const tokens = tokenize(version);
|
|
58
|
+
const sectionIndex = sectionIndexes[type];
|
|
59
|
+
const token = tokens[sectionIndex];
|
|
60
|
+
if (sectionIndex === 0) return token?.type === "TYPE_NUMBER" ? token.val : null;
|
|
61
|
+
if (sectionIndex === 1) return token?.type === "TYPE_NUMBER" ? token.val : 0n;
|
|
62
|
+
return tokens[1]?.type === "TYPE_NUMBER" && token?.type === "TYPE_NUMBER" ? token.val : 0n;
|
|
63
|
+
}
|
|
64
|
+
function isSame(type, a, b) {
|
|
65
|
+
if (!(isVersion(a) && isVersion(b))) return false;
|
|
66
|
+
return getExactSection(a, type) === getExactSection(b, type);
|
|
67
|
+
}
|
|
48
68
|
function isStable(version) {
|
|
49
69
|
if (isVersion(version)) {
|
|
50
70
|
const tokens = tokenize(version);
|
|
@@ -78,6 +98,7 @@ const api = {
|
|
|
78
98
|
isCompatible: isVersion,
|
|
79
99
|
isGreaterThan,
|
|
80
100
|
isSingleVersion: isVersion,
|
|
101
|
+
isSame,
|
|
81
102
|
isStable,
|
|
82
103
|
isValid,
|
|
83
104
|
isVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/maven/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/versioning.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport {\n EXCLUDING_POINT,\n QualifierTypes,\n TYPE_NUMBER,\n TYPE_QUALIFIER,\n autoExtendMavenRange,\n compare,\n isSingleVersion,\n isValid,\n isVersion,\n parseRange,\n qualifierType,\n tokenize,\n} from './compare.ts';\n\nexport const id = 'maven';\nexport const displayName = 'Maven';\nexport const urls = [\n '[Maven POM - Dependency version requirements](https://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification)',\n '[Maven versioning explained](https://octopus.com/blog/maven-versioning-explained)',\n '[Maven Enforcer - Version ranges](https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'pin',\n 'replace',\n];\n\nfunction equals(a: string, b: string): boolean {\n return compare(a, b) === 0;\n}\n\nfunction matches(a: string, b: string): boolean {\n if (!b) {\n return false;\n }\n if (isVersion(b)) {\n return equals(a, b);\n }\n const ranges = parseRange(b);\n if (!ranges) {\n return false;\n }\n return ranges.reduce((result, range): any => {\n if (result) {\n return result;\n }\n\n const { leftType, leftValue, rightType, rightValue } = range;\n\n let leftResult = true;\n let rightResult = true;\n\n if (leftValue) {\n leftResult =\n leftType === EXCLUDING_POINT\n ? compare(leftValue, a) === -1\n : compare(leftValue, a) !== 1;\n }\n\n if (rightValue) {\n rightResult =\n rightType === EXCLUDING_POINT\n ? compare(a, rightValue) === -1\n : compare(a, rightValue) !== 1;\n }\n\n return leftResult && rightResult;\n }, false);\n}\n\nfunction getMajor(version: string): number | null {\n if (isVersion(version)) {\n const tokens = tokenize(version);\n const majorToken = tokens[0];\n return
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/maven/index.ts"],"sourcesContent":["import type { RangeStrategy } from '../../../types/versioning.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport {\n EXCLUDING_POINT,\n QualifierTypes,\n TYPE_NUMBER,\n TYPE_QUALIFIER,\n autoExtendMavenRange,\n compare,\n isSingleVersion,\n isValid,\n isVersion,\n parseRange,\n qualifierType,\n tokenize,\n} from './compare.ts';\n\nexport const id = 'maven';\nexport const displayName = 'Maven';\nexport const urls = [\n '[Maven POM - Dependency version requirements](https://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification)',\n '[Maven versioning explained](https://octopus.com/blog/maven-versioning-explained)',\n '[Maven Enforcer - Version ranges](https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'widen',\n 'pin',\n 'replace',\n];\n\nconst sectionIndexes = {\n major: 0,\n minor: 1,\n patch: 2,\n} as const;\n\nfunction equals(a: string, b: string): boolean {\n return compare(a, b) === 0;\n}\n\nfunction matches(a: string, b: string): boolean {\n if (!b) {\n return false;\n }\n if (isVersion(b)) {\n return equals(a, b);\n }\n const ranges = parseRange(b);\n if (!ranges) {\n return false;\n }\n return ranges.reduce((result, range): any => {\n if (result) {\n return result;\n }\n\n const { leftType, leftValue, rightType, rightValue } = range;\n\n let leftResult = true;\n let rightResult = true;\n\n if (leftValue) {\n leftResult =\n leftType === EXCLUDING_POINT\n ? compare(leftValue, a) === -1\n : compare(leftValue, a) !== 1;\n }\n\n if (rightValue) {\n rightResult =\n rightType === EXCLUDING_POINT\n ? compare(a, rightValue) === -1\n : compare(a, rightValue) !== 1;\n }\n\n return leftResult && rightResult;\n }, false);\n}\n\nfunction getMajor(version: string): number | null {\n if (isVersion(version)) {\n const tokens = tokenize(version);\n const majorToken = tokens[0];\n return parseInt(majorToken.val.toString(), 10);\n }\n return null;\n}\n\nfunction getMinor(version: string): number | null {\n if (isVersion(version)) {\n const tokens = tokenize(version);\n const minorToken = tokens[1];\n if (minorToken?.type === TYPE_NUMBER) {\n return parseInt(minorToken.val.toString(), 10);\n }\n return 0;\n }\n return null;\n}\n\nfunction getPatch(version: string): number | null {\n if (isVersion(version)) {\n const tokens = tokenize(version);\n const minorToken = tokens[1];\n const patchToken = tokens[2];\n if (\n patchToken &&\n minorToken.type === TYPE_NUMBER &&\n patchToken.type === TYPE_NUMBER\n ) {\n return parseInt(patchToken.val.toString(), 10);\n }\n return 0;\n }\n return null;\n}\n\nfunction isGreaterThan(a: string, b: string): boolean {\n return compare(a, b) === 1;\n}\n\nfunction getExactSection(\n version: string,\n type: keyof typeof sectionIndexes,\n): bigint | null {\n const tokens = tokenize(version);\n const sectionIndex = sectionIndexes[type];\n const token = tokens[sectionIndex];\n\n if (sectionIndex === 0) {\n return token?.type === TYPE_NUMBER ? token.val : null;\n }\n if (sectionIndex === 1) {\n return token?.type === TYPE_NUMBER ? token.val : 0n;\n }\n\n const minorToken = tokens[1];\n return minorToken?.type === TYPE_NUMBER && token?.type === TYPE_NUMBER\n ? token.val\n : 0n;\n}\n\nfunction isSame(\n type: keyof typeof sectionIndexes,\n a: string,\n b: string,\n): boolean {\n if (!(isVersion(a) && isVersion(b))) {\n return false;\n }\n\n const left = getExactSection(a, type);\n const right = getExactSection(b, type);\n return left === right;\n}\n\nfunction isStable(version: string): boolean {\n if (isVersion(version)) {\n const tokens = tokenize(version);\n for (const token of tokens) {\n if (token.type === TYPE_QUALIFIER) {\n const qualType = qualifierType(token);\n if (qualType && qualType < QualifierTypes.Release) {\n return false;\n }\n }\n }\n return true;\n }\n return false;\n}\n\n// istanbul ignore next\nfunction getSatisfyingVersion(\n versions: string[],\n range: string,\n): string | null {\n return versions.reduce((result: string | null, version) => {\n if (matches(version, range)) {\n if (!result) {\n return version;\n }\n if (isGreaterThan(version, result)) {\n return version;\n }\n }\n return result;\n }, null);\n}\n\nfunction getNewValue({\n currentValue,\n rangeStrategy,\n newVersion,\n}: NewValueConfig): string {\n if (isVersion(currentValue) || rangeStrategy === 'pin') {\n return newVersion;\n }\n return coerceString(\n autoExtendMavenRange(currentValue, newVersion),\n currentValue,\n );\n}\n\nexport { isValid };\n\nexport const api: VersioningApi = {\n equals,\n getMajor,\n getMinor,\n getPatch,\n isCompatible: isVersion,\n isGreaterThan,\n isSingleVersion,\n isSame,\n isStable,\n isValid,\n isVersion,\n matches,\n getSatisfyingVersion,\n minSatisfyingVersion: getSatisfyingVersion,\n getNewValue,\n sortVersions: compare,\n};\n\nexport default api;\n"],"mappings":"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"}
|
|
@@ -11,7 +11,13 @@ type SkipReason = 'contains-variable' | 'disabled' | 'empty' | 'file-dependency'
|
|
|
11
11
|
*
|
|
12
12
|
* Renovate will not propose any updates, and leave you on the version you are currently on, which is currently known as safe.
|
|
13
13
|
*/
|
|
14
|
-
'malicious-update-proposed'
|
|
14
|
+
'malicious-update-proposed' |
|
|
15
|
+
/**
|
|
16
|
+
* The dependency is not declared in any package file, and exists only in a lockfile.
|
|
17
|
+
*
|
|
18
|
+
* Renovate will not propose any routine updates: this reason is only removed to remediate a vulnerability, and only once a fixed version is known.
|
|
19
|
+
*/
|
|
20
|
+
'lockfile-only';
|
|
15
21
|
type StageName = 'current-timestamp' | 'datasource-merge' | 'extract' | 'lock-file-maintenance-merge' | 'lock-file-maintenance-merge-2' | 'lookup' | 'pre-lookup' | 'source-url' | 'update-type' | 'update-type-merge' |
|
|
16
22
|
/**
|
|
17
23
|
* The update was skipped during one of the Enrichment modules.
|
|
@@ -4,6 +4,7 @@ import { validMatchFields } from "../../../modules/manager/custom/utils.js";
|
|
|
4
4
|
import { isCustomManager } from "../../../modules/manager/custom/index.js";
|
|
5
5
|
import { getEnabledManagersList } from "../../../modules/manager/index.js";
|
|
6
6
|
import { getManagerConfig } from "../../../config/index.js";
|
|
7
|
+
import { hasVulnerabilityAlertsRules } from "./vulnerability-alerts.js";
|
|
7
8
|
//#region lib/workers/repository/extract/extract-fingerprint-config.ts
|
|
8
9
|
function getCustomManagerFields(config) {
|
|
9
10
|
const regexFields = {};
|
|
@@ -23,6 +24,7 @@ function getFilteredManagerConfig(config) {
|
|
|
23
24
|
npmrc: config.npmrc,
|
|
24
25
|
npmrcMerge: config.npmrcMerge,
|
|
25
26
|
enabled: config.enabled,
|
|
27
|
+
...config.hasVulnerabilityAlertsRules && { hasVulnerabilityAlertsRules: true },
|
|
26
28
|
ignorePaths: coerceArray(config.ignorePaths),
|
|
27
29
|
includePaths: coerceArray(config.includePaths),
|
|
28
30
|
skipInstalls: config.skipInstalls,
|
|
@@ -33,16 +35,19 @@ function getFilteredManagerConfig(config) {
|
|
|
33
35
|
function generateFingerprintConfig(config) {
|
|
34
36
|
const managerExtractConfigs = [];
|
|
35
37
|
const managerList = new Set(getEnabledManagersList(config.enabledManagers));
|
|
38
|
+
const hasAlertRules = hasVulnerabilityAlertsRules(config);
|
|
36
39
|
for (const manager of managerList) {
|
|
37
40
|
const managerConfig = getManagerConfig(config, manager);
|
|
38
41
|
if (isCustomManager(manager)) {
|
|
39
42
|
const filteredCustomManagers = coerceArray(config.customManagers).filter((mgr) => mgr.customType === manager);
|
|
40
43
|
for (const customManager of filteredCustomManagers) managerExtractConfigs.push({
|
|
41
44
|
...mergeChildConfig(managerConfig, customManager),
|
|
45
|
+
hasVulnerabilityAlertsRules: hasAlertRules,
|
|
42
46
|
fileList: []
|
|
43
47
|
});
|
|
44
48
|
} else managerExtractConfigs.push({
|
|
45
49
|
...managerConfig,
|
|
50
|
+
hasVulnerabilityAlertsRules: hasAlertRules,
|
|
46
51
|
fileList: []
|
|
47
52
|
});
|
|
48
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-fingerprint-config.js","names":[],"sources":["../../../../lib/workers/repository/extract/extract-fingerprint-config.ts"],"sourcesContent":["import { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport type { RegexManagerTemplates } from '../../../modules/manager/custom/regex/types.ts';\nimport type { CustomExtractConfig } from '../../../modules/manager/custom/types.ts';\nimport { validMatchFields } from '../../../modules/manager/custom/utils.ts';\nimport { getEnabledManagersList } from '../../../modules/manager/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { WorkerExtractConfig } from '../../types.ts';\n\nexport interface FingerprintExtractConfig {\n managerList: Set<string>;\n managers: WorkerExtractConfig[];\n}\n\n// checks for regex manager fields\nfunction getCustomManagerFields(\n config: WorkerExtractConfig,\n): CustomExtractConfig {\n const regexFields = {} as CustomExtractConfig;\n for (const field of validMatchFields.map(\n (f) => `${f}Template` as keyof RegexManagerTemplates,\n )) {\n if (config[field]) {\n regexFields[field] = config[field];\n }\n }\n\n return {\n autoReplaceStringTemplate: config.autoReplaceStringTemplate,\n matchStrings: config.matchStrings,\n matchStringsStrategy: config.matchStringsStrategy,\n ...regexFields,\n };\n}\n\nfunction getFilteredManagerConfig(\n config: WorkerExtractConfig,\n): WorkerExtractConfig {\n return {\n ...(isCustomManager(config.manager) && getCustomManagerFields(config)),\n manager: config.manager,\n managerFilePatterns: config.managerFilePatterns,\n npmrc: config.npmrc,\n npmrcMerge: config.npmrcMerge,\n enabled: config.enabled,\n ignorePaths: coerceArray(config.ignorePaths),\n includePaths: coerceArray(config.includePaths),\n skipInstalls: config.skipInstalls,\n registryAliases: config.registryAliases,\n fileList: [],\n };\n}\n\nexport function generateFingerprintConfig(\n config: RenovateConfig,\n): FingerprintExtractConfig {\n const managerExtractConfigs: WorkerExtractConfig[] = [];\n const managerList = new Set(getEnabledManagersList(config.enabledManagers));\n\n for (const manager of managerList) {\n const managerConfig = getManagerConfig(config, manager);\n if (isCustomManager(manager)) {\n const filteredCustomManagers = coerceArray(config.customManagers).filter(\n (mgr) => mgr.customType === manager,\n );\n for (const customManager of filteredCustomManagers) {\n managerExtractConfigs.push({\n ...mergeChildConfig(managerConfig, customManager),\n fileList: [],\n });\n }\n } else {\n managerExtractConfigs.push({
|
|
1
|
+
{"version":3,"file":"extract-fingerprint-config.js","names":[],"sources":["../../../../lib/workers/repository/extract/extract-fingerprint-config.ts"],"sourcesContent":["import { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport type { RegexManagerTemplates } from '../../../modules/manager/custom/regex/types.ts';\nimport type { CustomExtractConfig } from '../../../modules/manager/custom/types.ts';\nimport { validMatchFields } from '../../../modules/manager/custom/utils.ts';\nimport { getEnabledManagersList } from '../../../modules/manager/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { WorkerExtractConfig } from '../../types.ts';\nimport { hasVulnerabilityAlertsRules } from './vulnerability-alerts.ts';\n\nexport interface FingerprintExtractConfig {\n managerList: Set<string>;\n managers: WorkerExtractConfig[];\n}\n\n// checks for regex manager fields\nfunction getCustomManagerFields(\n config: WorkerExtractConfig,\n): CustomExtractConfig {\n const regexFields = {} as CustomExtractConfig;\n for (const field of validMatchFields.map(\n (f) => `${f}Template` as keyof RegexManagerTemplates,\n )) {\n if (config[field]) {\n regexFields[field] = config[field];\n }\n }\n\n return {\n autoReplaceStringTemplate: config.autoReplaceStringTemplate,\n matchStrings: config.matchStrings,\n matchStringsStrategy: config.matchStringsStrategy,\n ...regexFields,\n };\n}\n\nfunction getFilteredManagerConfig(\n config: WorkerExtractConfig,\n): WorkerExtractConfig {\n return {\n ...(isCustomManager(config.manager) && getCustomManagerFields(config)),\n manager: config.manager,\n managerFilePatterns: config.managerFilePatterns,\n npmrc: config.npmrc,\n npmrcMerge: config.npmrcMerge,\n enabled: config.enabled,\n // Omitted when false, so repos with no vulnerability alerts keep the config\n // hash they already have, and do not re-extract once on upgrade\n ...(config.hasVulnerabilityAlertsRules && {\n hasVulnerabilityAlertsRules: true,\n }),\n ignorePaths: coerceArray(config.ignorePaths),\n includePaths: coerceArray(config.includePaths),\n skipInstalls: config.skipInstalls,\n registryAliases: config.registryAliases,\n fileList: [],\n };\n}\n\nexport function generateFingerprintConfig(\n config: RenovateConfig,\n): FingerprintExtractConfig {\n const managerExtractConfigs: WorkerExtractConfig[] = [];\n const managerList = new Set(getEnabledManagersList(config.enabledManagers));\n const hasAlertRules = hasVulnerabilityAlertsRules(config);\n\n for (const manager of managerList) {\n const managerConfig = getManagerConfig(config, manager);\n if (isCustomManager(manager)) {\n const filteredCustomManagers = coerceArray(config.customManagers).filter(\n (mgr) => mgr.customType === manager,\n );\n for (const customManager of filteredCustomManagers) {\n managerExtractConfigs.push({\n ...mergeChildConfig(managerConfig, customManager),\n hasVulnerabilityAlertsRules: hasAlertRules,\n fileList: [],\n });\n }\n } else {\n managerExtractConfigs.push({\n ...managerConfig,\n hasVulnerabilityAlertsRules: hasAlertRules,\n fileList: [],\n });\n }\n }\n\n return {\n managerList,\n managers: managerExtractConfigs.map(getFilteredManagerConfig),\n };\n}\n"],"mappings":";;;;;;;;AAiBA,SAAS,uBACP,QACqB;CACrB,MAAM,cAAc,CAAC;CACrB,KAAK,MAAM,SAAS,iBAAiB,KAClC,MAAM,GAAG,EAAE,SACd,GACE,IAAI,OAAO,QACT,YAAY,SAAS,OAAO;CAIhC,OAAO;EACL,2BAA2B,OAAO;EAClC,cAAc,OAAO;EACrB,sBAAsB,OAAO;EAC7B,GAAG;CACL;AACF;AAEA,SAAS,yBACP,QACqB;CACrB,OAAO;EACL,GAAI,gBAAgB,OAAO,OAAO,KAAK,uBAAuB,MAAM;EACpE,SAAS,OAAO;EAChB,qBAAqB,OAAO;EAC5B,OAAO,OAAO;EACd,YAAY,OAAO;EACnB,SAAS,OAAO;EAGhB,GAAI,OAAO,+BAA+B,EACxC,6BAA6B,KAC/B;EACA,aAAa,YAAY,OAAO,WAAW;EAC3C,cAAc,YAAY,OAAO,YAAY;EAC7C,cAAc,OAAO;EACrB,iBAAiB,OAAO;EACxB,UAAU,CAAC;CACb;AACF;AAEA,SAAgB,0BACd,QAC0B;CAC1B,MAAM,wBAA+C,CAAC;CACtD,MAAM,cAAc,IAAI,IAAI,uBAAuB,OAAO,eAAe,CAAC;CAC1E,MAAM,gBAAgB,4BAA4B,MAAM;CAExD,KAAK,MAAM,WAAW,aAAa;EACjC,MAAM,gBAAgB,iBAAiB,QAAQ,OAAO;EACtD,IAAI,gBAAgB,OAAO,GAAG;GAC5B,MAAM,yBAAyB,YAAY,OAAO,cAAc,CAAC,CAAC,QAC/D,QAAQ,IAAI,eAAe,OAC9B;GACA,KAAK,MAAM,iBAAiB,wBAC1B,sBAAsB,KAAK;IACzB,GAAG,iBAAiB,eAAe,aAAa;IAChD,6BAA6B;IAC7B,UAAU,CAAC;GACb,CAAC;EAEL,OACE,sBAAsB,KAAK;GACzB,GAAG;GACH,6BAA6B;GAC7B,UAAU,CAAC;EACb,CAAC;CAEL;CAEA,OAAO;EACL;EACA,UAAU,sBAAsB,IAAI,wBAAwB;CAC9D;AACF"}
|
|
@@ -7,6 +7,7 @@ import { scm } from "../../../modules/platform/scm.js";
|
|
|
7
7
|
import { hashMap } from "../../../modules/manager/fingerprint.generated.js";
|
|
8
8
|
import { getEnabledManagersList } from "../../../modules/manager/index.js";
|
|
9
9
|
import { getManagerConfig } from "../../../config/index.js";
|
|
10
|
+
import { hasVulnerabilityAlertsRules } from "./vulnerability-alerts.js";
|
|
10
11
|
import { getMatchingFiles } from "./file-match.js";
|
|
11
12
|
import { getManagerPackageFiles } from "./manager-files.js";
|
|
12
13
|
import { processSupersedesManagers } from "./supersedes.js";
|
|
@@ -16,10 +17,12 @@ async function extractAllDependencies(config) {
|
|
|
16
17
|
const managerList = getEnabledManagersList(config.enabledManagers);
|
|
17
18
|
const extractList = [];
|
|
18
19
|
const fileList = await scm.getFileList();
|
|
20
|
+
const hasAlertRules = hasVulnerabilityAlertsRules(config);
|
|
19
21
|
function tryConfig(managerConfig) {
|
|
20
22
|
const matchingFileList = getMatchingFiles(managerConfig, fileList);
|
|
21
23
|
if (matchingFileList.length) extractList.push({
|
|
22
24
|
...managerConfig,
|
|
25
|
+
hasVulnerabilityAlertsRules: hasAlertRules,
|
|
23
26
|
fileList: matchingFileList
|
|
24
27
|
});
|
|
25
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/extract/index.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { ManagerConfig, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport {\n getEnabledManagersList,\n hashMap,\n} from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExtractResult, WorkerExtractConfig } from '../../types.ts';\nimport { getMatchingFiles } from './file-match.ts';\nimport { getManagerPackageFiles } from './manager-files.ts';\nimport { processSupersedesManagers } from './supersedes.ts';\n\nexport async function extractAllDependencies(\n config: RenovateConfig,\n): Promise<ExtractResult> {\n const managerList = getEnabledManagersList(config.enabledManagers);\n const extractList: WorkerExtractConfig[] = [];\n const fileList = await scm.getFileList();\n\n function tryConfig(managerConfig: ManagerConfig): void {\n const matchingFileList = getMatchingFiles(managerConfig, fileList);\n if (matchingFileList.length) {\n extractList.push({
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/workers/repository/extract/index.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport { getManagerConfig, mergeChildConfig } from '../../../config/index.ts';\nimport type { ManagerConfig, RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { isCustomManager } from '../../../modules/manager/custom/index.ts';\nimport {\n getEnabledManagersList,\n hashMap,\n} from '../../../modules/manager/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport type { ExtractResult, WorkerExtractConfig } from '../../types.ts';\nimport { getMatchingFiles } from './file-match.ts';\nimport { getManagerPackageFiles } from './manager-files.ts';\nimport { processSupersedesManagers } from './supersedes.ts';\nimport { hasVulnerabilityAlertsRules } from './vulnerability-alerts.ts';\n\nexport async function extractAllDependencies(\n config: RenovateConfig,\n): Promise<ExtractResult> {\n const managerList = getEnabledManagersList(config.enabledManagers);\n const extractList: WorkerExtractConfig[] = [];\n const fileList = await scm.getFileList();\n const hasAlertRules = hasVulnerabilityAlertsRules(config);\n\n function tryConfig(managerConfig: ManagerConfig): void {\n const matchingFileList = getMatchingFiles(managerConfig, fileList);\n if (matchingFileList.length) {\n extractList.push({\n ...managerConfig,\n hasVulnerabilityAlertsRules: hasAlertRules,\n fileList: matchingFileList,\n });\n }\n }\n\n instrument('filter packageFiles for managers', () => {\n for (const manager of managerList) {\n const managerConfig = getManagerConfig(config, manager);\n managerConfig.manager = manager;\n if (isCustomManager(manager)) {\n const filteredCustomManagers = coerceArray(\n config.customManagers,\n ).filter((mgr) => mgr.customType === manager);\n for (const customManager of filteredCustomManagers) {\n tryConfig(mergeChildConfig(managerConfig, customManager));\n }\n } else {\n tryConfig(managerConfig);\n }\n }\n });\n\n const extractResult: ExtractResult = {\n packageFiles: {},\n extractionFingerprints: {},\n };\n\n // Store the fingerprint of all managers which match any file (even if they do not find any dependencies)\n // The cached result needs to be invalidated if the fingerprint of any matching manager changes\n for (const { manager } of extractList) {\n extractResult.extractionFingerprints[manager] = hashMap.get(manager);\n }\n\n const extractDurations: Record<string, number> = {};\n const extractResults = await Promise.all(\n extractList.map(async (managerConfig) => {\n const start = Date.now();\n const packageFiles = await instrument(\n managerConfig.manager,\n async () => await getManagerPackageFiles(managerConfig),\n );\n const durationMs = Math.round(Date.now() - start);\n extractDurations[managerConfig.manager] = durationMs;\n return { manager: managerConfig.manager, packageFiles };\n }),\n );\n\n // De-duplicate results using supersedesManagers\n processSupersedesManagers(extractResults);\n\n // Sort alphabetically for stable log output. See #40091\n const sortedExtractDurations = Object.keys(extractDurations)\n .sort()\n .reduce<Record<string, number>>((acc, key) => {\n acc[key] = extractDurations[key];\n return acc;\n }, {});\n\n logger.debug(\n { managers: sortedExtractDurations },\n 'manager extract durations (ms)',\n );\n let fileCount = 0;\n for (const { manager, packageFiles } of extractResults) {\n if (packageFiles?.length) {\n fileCount += packageFiles.length;\n logger.debug(`Found ${manager} package files`);\n extractResult.packageFiles[manager] = (\n extractResult.packageFiles[manager] || []\n ).concat(packageFiles);\n }\n }\n logger.debug(`Found ${fileCount} package file(s)`);\n\n // If enabledManagers is non-empty, check that each of them has at least one extraction.\n // If not, log a warning to indicate possible misconfiguration.\n if (isNonEmptyArray(config.enabledManagers)) {\n for (const enabledManager of config.enabledManagers) {\n if (\n !(enabledManager.replace('custom.', '') in extractResult.packageFiles)\n ) {\n logger.debug(\n { manager: enabledManager },\n `Manager explicitly enabled in \"enabledManagers\" config, but found no results. Possible config error?`,\n );\n }\n }\n }\n\n return extractResult;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,eAAsB,uBACpB,QACwB;CACxB,MAAM,cAAc,uBAAuB,OAAO,eAAe;CACjE,MAAM,cAAqC,CAAC;CAC5C,MAAM,WAAW,MAAM,IAAI,YAAY;CACvC,MAAM,gBAAgB,4BAA4B,MAAM;CAExD,SAAS,UAAU,eAAoC;EACrD,MAAM,mBAAmB,iBAAiB,eAAe,QAAQ;EACjE,IAAI,iBAAiB,QACnB,YAAY,KAAK;GACf,GAAG;GACH,6BAA6B;GAC7B,UAAU;EACZ,CAAC;CAEL;CAEA,WAAW,0CAA0C;EACnD,KAAK,MAAM,WAAW,aAAa;GACjC,MAAM,gBAAgB,iBAAiB,QAAQ,OAAO;GACtD,cAAc,UAAU;GACxB,IAAI,gBAAgB,OAAO,GAAG;IAC5B,MAAM,yBAAyB,YAC7B,OAAO,cACT,CAAC,CAAC,QAAQ,QAAQ,IAAI,eAAe,OAAO;IAC5C,KAAK,MAAM,iBAAiB,wBAC1B,UAAU,iBAAiB,eAAe,aAAa,CAAC;GAE5D,OACE,UAAU,aAAa;EAE3B;CACF,CAAC;CAED,MAAM,gBAA+B;EACnC,cAAc,CAAC;EACf,wBAAwB,CAAC;CAC3B;CAIA,KAAK,MAAM,EAAE,aAAa,aACxB,cAAc,uBAAuB,WAAW,QAAQ,IAAI,OAAO;CAGrE,MAAM,mBAA2C,CAAC;CAClD,MAAM,iBAAiB,MAAM,QAAQ,IACnC,YAAY,IAAI,OAAO,kBAAkB;EACvC,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,eAAe,MAAM,WACzB,cAAc,SACd,YAAY,MAAM,uBAAuB,aAAa,CACxD;EACA,MAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK;EAChD,iBAAiB,cAAc,WAAW;EAC1C,OAAO;GAAE,SAAS,cAAc;GAAS;EAAa;CACxD,CAAC,CACH;CAGA,0BAA0B,cAAc;CAGxC,MAAM,yBAAyB,OAAO,KAAK,gBAAgB,CAAC,CACzD,KAAK,CAAC,CACN,QAAgC,KAAK,QAAQ;EAC5C,IAAI,OAAO,iBAAiB;EAC5B,OAAO;CACT,GAAG,CAAC,CAAC;CAEP,OAAO,MACL,EAAE,UAAU,uBAAuB,GACnC,gCACF;CACA,IAAI,YAAY;CAChB,KAAK,MAAM,EAAE,SAAS,kBAAkB,gBACtC,IAAI,cAAc,QAAQ;EACxB,aAAa,aAAa;EAC1B,OAAO,MAAM,SAAS,QAAQ,eAAe;EAC7C,cAAc,aAAa,YACzB,cAAc,aAAa,YAAY,CAAC,EAAA,CACxC,OAAO,YAAY;CACvB;CAEF,OAAO,MAAM,SAAS,UAAU,iBAAiB;CAIjD,IAAI,gBAAgB,OAAO,eAAe,GACnC;OAAA,MAAM,kBAAkB,OAAO,iBAClC,IACE,EAAE,eAAe,QAAQ,WAAW,EAAE,KAAK,cAAc,eAEzD,OAAO,MACL,EAAE,SAAS,eAAe,GAC1B,sGACF;CAAA;CAKN,OAAO;AACT"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { coerceArray } from "../../../util/array.js";
|
|
2
|
+
//#region lib/workers/repository/extract/vulnerability-alerts.ts
|
|
3
|
+
/**
|
|
4
|
+
* Whether vulnerability remediation is active for this repository, regardless
|
|
5
|
+
* of where the vulnerability data comes from.
|
|
6
|
+
*
|
|
7
|
+
* Managers may use this to surface dependencies which are useless for routine
|
|
8
|
+
* updates, but which a vulnerability fix needs to be able to match, e.g.
|
|
9
|
+
* transitive dependencies which only exist in a lock file.
|
|
10
|
+
*/
|
|
11
|
+
function hasVulnerabilityAlertsRules(config) {
|
|
12
|
+
if (config.osvVulnerabilityAlerts) return true;
|
|
13
|
+
return coerceArray(config.packageRules).some((rule) => rule.isVulnerabilityAlert === true);
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { hasVulnerabilityAlertsRules };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=vulnerability-alerts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vulnerability-alerts.js","names":[],"sources":["../../../../lib/workers/repository/extract/vulnerability-alerts.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../config/types.ts';\nimport { coerceArray } from '../../../util/array.ts';\n\n/**\n * Whether vulnerability remediation is active for this repository, regardless\n * of where the vulnerability data comes from.\n *\n * Managers may use this to surface dependencies which are useless for routine\n * updates, but which a vulnerability fix needs to be able to match, e.g.\n * transitive dependencies which only exist in a lock file.\n */\nexport function hasVulnerabilityAlertsRules(config: RenovateConfig): boolean {\n if (config.osvVulnerabilityAlerts) {\n return true;\n }\n\n // Platform alerts become `isVulnerabilityAlert` rules during init\n return coerceArray(config.packageRules).some(\n (rule) => rule.isVulnerabilityAlert === true,\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,4BAA4B,QAAiC;CAC3E,IAAI,OAAO,wBACT,OAAO;CAIT,OAAO,YAAY,OAAO,YAAY,CAAC,CAAC,MACrC,SAAS,KAAK,yBAAyB,IAC1C;AACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "44.107.
|
|
4
|
+
"version": "44.107.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"@renovatebot/good-enough-parser": "2.0.1",
|
|
123
123
|
"@renovatebot/osv-offline": "3.0.11",
|
|
124
124
|
"@renovatebot/pep440": "5.0.1",
|
|
125
|
-
"@renovatebot/pgp": "2.0.
|
|
125
|
+
"@renovatebot/pgp": "2.0.2",
|
|
126
126
|
"@renovatebot/ruby-semver": "5.0.0",
|
|
127
127
|
"@sindresorhus/is": "8.1.0",
|
|
128
128
|
"@yarnpkg/core": "4.9.1",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.107.
|
|
3
|
+
"title": "JSON schema for Renovate 44.107.2 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.107.
|
|
5
|
+
"x-renovate-version": "44.107.2",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|