renovate 44.69.10 → 44.69.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,8 +1,110 @@
|
|
|
1
1
|
import { regEx } from "../../../util/regex.js";
|
|
2
|
+
import { logger } from "../../../logger/index.js";
|
|
2
3
|
import { GenericVersioningApi } from "../generic.js";
|
|
3
4
|
import { isTruthy } from "@sindresorhus/is";
|
|
5
|
+
/**
|
|
6
|
+
* APK constraint operators, as the bitmask `apk` builds them into.
|
|
7
|
+
*
|
|
8
|
+
* `apk` ORs one flag per operator character, so the characters may appear in any order and may repeat - `~`, `=~` and `~=` all mean the same thing.
|
|
9
|
+
*
|
|
10
|
+
* Based on `GPL-2.0` code in https://gitlab.alpinelinux.org/alpine/apk-tools/-/blob/master/src/version.c
|
|
11
|
+
*/
|
|
12
|
+
const OP_LESS = 1;
|
|
13
|
+
const OP_GREATER = 2;
|
|
14
|
+
const OP_EQUAL = 4;
|
|
15
|
+
const OP_FUZZY = 8;
|
|
16
|
+
/** A prefix match, e.g. `~1.6` - `apk` treats `~` as fuzzy /and/ equal */
|
|
17
|
+
const OP_PREFIX = 12;
|
|
18
|
+
/** `><` constrains a package to an identity hash rather than to a version */
|
|
19
|
+
const OP_CHECKSUM = 3;
|
|
20
|
+
const constraintRegex = regEx(/^(?<operator>[<>=~]*)(?<version>[^<>=~].*)$/);
|
|
21
|
+
function operatorMask(operator) {
|
|
22
|
+
let mask = 0;
|
|
23
|
+
for (const char of operator) if (char === "<") mask |= OP_LESS;
|
|
24
|
+
else if (char === ">") mask |= OP_GREATER;
|
|
25
|
+
else if (char === "=") mask |= OP_EQUAL;
|
|
26
|
+
else mask |= OP_PREFIX;
|
|
27
|
+
if (mask === 0) return OP_EQUAL;
|
|
28
|
+
return mask === OP_CHECKSUM ? null : mask;
|
|
29
|
+
}
|
|
30
|
+
/** Splits a constraint such as `~8.12.1` into its operator and version */
|
|
31
|
+
function parseConstraint(input) {
|
|
32
|
+
if (!input) return null;
|
|
33
|
+
const groups = constraintRegex.exec(input)?.groups;
|
|
34
|
+
if (!groups) return null;
|
|
35
|
+
const mask = operatorMask(groups.operator);
|
|
36
|
+
if (mask === null) return null;
|
|
37
|
+
return {
|
|
38
|
+
operator: groups.operator,
|
|
39
|
+
mask,
|
|
40
|
+
version: groups.version
|
|
41
|
+
};
|
|
42
|
+
}
|
|
4
43
|
const versionRegex = regEx(/^v?(?<major>[0-9]+)(?:\.(?<minor>[0-9]+))?(?:\.(?<patch>[0-9]+))?(?<extra>(?:\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/);
|
|
5
44
|
const alphaNumRegex = regEx(/(?:[a-zA-Z]+)|(?:\d+)/g);
|
|
45
|
+
const revisionRegex = regEx(/-r\d+$/);
|
|
46
|
+
/**
|
|
47
|
+
* The kinds of token an APK version is made of, in the order `apk` reads them.
|
|
48
|
+
*
|
|
49
|
+
* A prefix match compares tokens pairwise, so a token's kind has to be part of the comparison - `1.6_rc1` is not a prefix of `1.6.0`, even though both start with `1.6`.
|
|
50
|
+
*/
|
|
51
|
+
const TOKEN_DIGIT = 0;
|
|
52
|
+
const TOKEN_LETTER = 1;
|
|
53
|
+
const TOKEN_PRERELEASE = 2;
|
|
54
|
+
const TOKEN_PACKAGE_FIX = 3;
|
|
55
|
+
const TOKEN_REVISION = 4;
|
|
56
|
+
/** The numeric components of a version, e.g. `[1, 6, 0]` for `1.6.0_pre1` */
|
|
57
|
+
function numericParts(groups) {
|
|
58
|
+
const { major, minor, patch, extra } = groups;
|
|
59
|
+
const parts = [parseInt(major, 10)];
|
|
60
|
+
for (const part of [minor, patch]) if (part) parts.push(parseInt(part, 10));
|
|
61
|
+
if (extra) parts.push(...extra.substring(1).split(".").filter(isTruthy).map(Number));
|
|
62
|
+
return parts;
|
|
63
|
+
}
|
|
64
|
+
function tokenize(groups) {
|
|
65
|
+
const { letter, prereleaseType, prereleaseNum, packageFixType, packageFixNum, releaseNum } = groups;
|
|
66
|
+
const tokens = numericParts(groups).map((value) => ({
|
|
67
|
+
kind: TOKEN_DIGIT,
|
|
68
|
+
value
|
|
69
|
+
}));
|
|
70
|
+
if (letter) tokens.push({
|
|
71
|
+
kind: TOKEN_LETTER,
|
|
72
|
+
value: letter
|
|
73
|
+
});
|
|
74
|
+
if (prereleaseType) tokens.push({
|
|
75
|
+
kind: TOKEN_PRERELEASE,
|
|
76
|
+
value: prereleaseType + prereleaseNum
|
|
77
|
+
});
|
|
78
|
+
if (packageFixType) tokens.push({
|
|
79
|
+
kind: TOKEN_PACKAGE_FIX,
|
|
80
|
+
value: packageFixType + packageFixNum
|
|
81
|
+
});
|
|
82
|
+
if (releaseNum) tokens.push({
|
|
83
|
+
kind: TOKEN_REVISION,
|
|
84
|
+
value: parseInt(releaseNum, 10)
|
|
85
|
+
});
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Whether `constraintVersion` is a token-wise prefix of `version`, which is what `apk` calls a fuzzy match.
|
|
90
|
+
*
|
|
91
|
+
* `~1.6` matches `1.6`, `1.6.0_pre1`, `1.6.0`, `1.6.5` and `1.6.9_p1`, but not `1.60` - the comparison is per token, not on the raw string.
|
|
92
|
+
*/
|
|
93
|
+
function isPrefixMatch(version, constraintVersion) {
|
|
94
|
+
const versionGroups = versionRegex.exec(version)?.groups;
|
|
95
|
+
const constraintGroups = versionRegex.exec(constraintVersion)?.groups;
|
|
96
|
+
/* v8 ignore next -- `matches` parses both versions before calling this */
|
|
97
|
+
if (!versionGroups || !constraintGroups) return false;
|
|
98
|
+
const versionTokens = tokenize(versionGroups);
|
|
99
|
+
const constraintTokens = tokenize(constraintGroups);
|
|
100
|
+
if (constraintTokens.length > versionTokens.length) return false;
|
|
101
|
+
return constraintTokens.every((token, i) => token.kind === versionTokens[i].kind && token.value === versionTokens[i].value);
|
|
102
|
+
}
|
|
103
|
+
/** Drops the revision when the constraint was written without one */
|
|
104
|
+
function withConstraintRevision(newVersion, constraintVersion) {
|
|
105
|
+
if (revisionRegex.test(constraintVersion)) return newVersion;
|
|
106
|
+
return newVersion.replace(revisionRegex, "");
|
|
107
|
+
}
|
|
6
108
|
var ApkVersioningApi = class extends GenericVersioningApi {
|
|
7
109
|
/**
|
|
8
110
|
* Parse APK version format using apko's version parsing patterns
|
|
@@ -85,68 +187,87 @@ var ApkVersioningApi = class extends GenericVersioningApi {
|
|
|
85
187
|
}
|
|
86
188
|
return 0;
|
|
87
189
|
}
|
|
88
|
-
isValid(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return this._parse(cleanVersion) !== null;
|
|
190
|
+
isValid(input) {
|
|
191
|
+
const constraint = parseConstraint(input);
|
|
192
|
+
return !!constraint && this._parse(constraint.version) !== null;
|
|
92
193
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return this.
|
|
194
|
+
/** A constraint is not itself a version, however valid it is */
|
|
195
|
+
isVersion(input) {
|
|
196
|
+
const constraint = parseConstraint(input);
|
|
197
|
+
return !!constraint && constraint.operator === "" && this._parse(constraint.version) !== null;
|
|
97
198
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
199
|
+
isSingleVersion(input) {
|
|
200
|
+
const constraint = parseConstraint(input);
|
|
201
|
+
return !!constraint && constraint.mask === OP_EQUAL && this._parse(constraint.version) !== null;
|
|
202
|
+
}
|
|
203
|
+
isStable(input) {
|
|
204
|
+
const constraint = parseConstraint(input);
|
|
205
|
+
if (!constraint) return false;
|
|
206
|
+
const parsed = this._parse(constraint.version);
|
|
207
|
+
return !!parsed && !parsed.prerelease;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Whether `version` satisfies the constraint, following `apk_version_match`: compare the two, fuzzily when the operator asks for it, then check the result against the operator's mask.
|
|
211
|
+
*/
|
|
212
|
+
matches(version, range) {
|
|
213
|
+
const constraint = parseConstraint(range);
|
|
214
|
+
if (!constraint || !this._parse(version) || !this._parse(constraint.version)) return false;
|
|
215
|
+
if ((constraint.mask & OP_FUZZY) !== 0 && isPrefixMatch(version, constraint.version)) return (constraint.mask & OP_EQUAL) !== 0;
|
|
216
|
+
const compared = this._compare(version, constraint.version);
|
|
217
|
+
if (compared < 0) return (constraint.mask & OP_LESS) !== 0;
|
|
218
|
+
if (compared > 0) return (constraint.mask & OP_GREATER) !== 0;
|
|
219
|
+
return (constraint.mask & OP_EQUAL) !== 0;
|
|
220
|
+
}
|
|
221
|
+
isLessThanRange(version, range) {
|
|
222
|
+
const constraint = parseConstraint(range);
|
|
223
|
+
if (!constraint || !this._parse(version) || !this._parse(constraint.version)) return false;
|
|
224
|
+
if ((constraint.mask & OP_LESS) !== 0) return false;
|
|
225
|
+
if ((constraint.mask & OP_FUZZY) !== 0 && isPrefixMatch(version, constraint.version)) return false;
|
|
226
|
+
const compared = this._compare(version, constraint.version);
|
|
227
|
+
if (compared !== 0) return compared < 0;
|
|
228
|
+
return (constraint.mask & OP_EQUAL) === 0;
|
|
104
229
|
}
|
|
105
230
|
getSatisfyingVersion(versions, range) {
|
|
106
|
-
const
|
|
107
|
-
if (!
|
|
108
|
-
|
|
109
|
-
const satisfyingVersions = versions.filter((version) => {
|
|
110
|
-
if (!this.isValid(version) || !this.isValid(targetVersion)) return false;
|
|
111
|
-
switch (operator) {
|
|
112
|
-
case ">": return this.isGreaterThan(version, targetVersion);
|
|
113
|
-
case ">=": return this.isGreaterThan(version, targetVersion) || this.equals(version, targetVersion);
|
|
114
|
-
case "<": return this.isLessThanRange(version, targetVersion);
|
|
115
|
-
case "<=": return this.isLessThanRange(version, targetVersion) || this.equals(version, targetVersion);
|
|
116
|
-
case "=":
|
|
117
|
-
case "==": return this.equals(version, targetVersion);
|
|
118
|
-
case "~": {
|
|
119
|
-
const targetParsed = this._parse(targetVersion);
|
|
120
|
-
const versionParsed = this._parse(version);
|
|
121
|
-
if (targetParsed.release[0] !== versionParsed.release[0] || targetParsed.release[1] !== versionParsed.release[1]) return false;
|
|
122
|
-
return this.isGreaterThan(version, targetVersion) || this.equals(version, targetVersion);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return false;
|
|
126
|
-
});
|
|
127
|
-
if (satisfyingVersions.length === 0) return null;
|
|
128
|
-
return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];
|
|
129
|
-
}
|
|
130
|
-
getMajor(version) {
|
|
131
|
-
if (!version) return null;
|
|
132
|
-
const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
|
|
133
|
-
return this._parse(cleanVersion)?.release[0] ?? null;
|
|
134
|
-
}
|
|
135
|
-
getMinor(version) {
|
|
136
|
-
if (!version) return null;
|
|
137
|
-
const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
|
|
138
|
-
return this._parse(cleanVersion)?.release[1] ?? null;
|
|
139
|
-
}
|
|
140
|
-
getPatch(version) {
|
|
141
|
-
if (!version) return null;
|
|
142
|
-
const cleanVersion = version.replace(regEx(/^[=><~][=]?/), "");
|
|
143
|
-
const parsed = this._parse(cleanVersion);
|
|
144
|
-
if (!parsed) return null;
|
|
145
|
-
return parsed.release[2] ?? null;
|
|
231
|
+
const satisfying = versions.filter((version) => this.matches(version, range));
|
|
232
|
+
if (!satisfying.length) return null;
|
|
233
|
+
return satisfying.sort((a, b) => this.sortVersions(b, a))[0];
|
|
146
234
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return
|
|
235
|
+
minSatisfyingVersion(versions, range) {
|
|
236
|
+
const satisfying = versions.filter((version) => this.matches(version, range));
|
|
237
|
+
if (!satisfying.length) return null;
|
|
238
|
+
return satisfying.sort((a, b) => this.sortVersions(a, b))[0];
|
|
239
|
+
}
|
|
240
|
+
getMajor(input) {
|
|
241
|
+
const constraint = parseConstraint(input);
|
|
242
|
+
return constraint ? this._parse(constraint.version)?.release[0] ?? null : null;
|
|
243
|
+
}
|
|
244
|
+
getMinor(input) {
|
|
245
|
+
const constraint = parseConstraint(input);
|
|
246
|
+
return constraint ? this._parse(constraint.version)?.release[1] ?? null : null;
|
|
247
|
+
}
|
|
248
|
+
getPatch(input) {
|
|
249
|
+
const constraint = parseConstraint(input);
|
|
250
|
+
return constraint ? this._parse(constraint.version)?.release[2] ?? null : null;
|
|
251
|
+
}
|
|
252
|
+
getNewValue({ currentValue, rangeStrategy, newVersion }) {
|
|
253
|
+
const constraint = parseConstraint(currentValue);
|
|
254
|
+
if (!constraint) return null;
|
|
255
|
+
const { operator, mask, version } = constraint;
|
|
256
|
+
const parsed = this._parse(version);
|
|
257
|
+
if (!parsed) return null;
|
|
258
|
+
if (rangeStrategy === "pin") return newVersion;
|
|
259
|
+
if (mask === OP_EQUAL) return `${operator}${withConstraintRevision(newVersion, version)}`;
|
|
260
|
+
if (rangeStrategy === "bump" && (mask & OP_GREATER) !== 0 && (mask & OP_EQUAL) !== 0) return `${operator}${newVersion}`;
|
|
261
|
+
if (mask === OP_PREFIX) {
|
|
262
|
+
const currentParts = parsed.release;
|
|
263
|
+
const newParts = this._parse(newVersion)?.release;
|
|
264
|
+
/* v8 ignore next -- newVersion comes from the datasource, so it parses */
|
|
265
|
+
if (!newParts) return null;
|
|
266
|
+
if (currentParts.length < newParts.length) return `${operator}${newParts.slice(0, currentParts.length).join(".")}`;
|
|
267
|
+
return `${operator}${withConstraintRevision(newVersion, version)}`;
|
|
268
|
+
}
|
|
269
|
+
if (rangeStrategy === "bump") logger.debug(`Unsupported range type for rangeStrategy=bump: ${currentValue}`);
|
|
270
|
+
return null;
|
|
150
271
|
}
|
|
151
272
|
sortVersions(a, b) {
|
|
152
273
|
const cleanA = a.replace(regEx(/^=/), "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { VersioningApi } from '../types.ts';\nimport type { ApkVersion } from './types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = false;\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/(?:[a-zA-Z]+)|(?:\\d+)/g);\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n if (!matchv2 || !regEx(/^\\d+$/).test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n return 1;\n }\n if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before validation\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed !== null;\n }\n\n override isSingleVersion(version: string): boolean {\n if (!version) {\n return false;\n }\n // Range constraints (>, >=, <, <=, ~) are not single versions\n if (regEx(/^[><~]/).test(version)) {\n return false;\n }\n // Exact versions (starting with = or no operator) are single versions\n return this.isValid(version);\n }\n\n override isStable(version: string): boolean {\n if (!version) {\n return false;\n }\n // Strip any operators (=, >, <, ~) before checking stability\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return false;\n }\n // Consider versions without prerelease identifiers as stable\n return !parsed.prerelease;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n // Handle range expressions like >5.2.37-r0, <5.2.37-r0, ~5.2.37-r0, etc.\n const rangeMatch = regEx(/^(?<operator>[><=~]+)(?<targetVersion>.+)$/).exec(\n range,\n );\n if (!rangeMatch) {\n // If no range operator, look for exact match\n return versions.find((v) => this.equals(v, range)) ?? null;\n }\n\n const { operator, targetVersion } = rangeMatch.groups!;\n\n // Filter versions that satisfy the range\n const satisfyingVersions = versions.filter((version) => {\n if (!this.isValid(version) || !this.isValid(targetVersion)) {\n return false;\n }\n\n switch (operator) {\n case '>':\n return this.isGreaterThan(version, targetVersion);\n case '>=':\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '<':\n return this.isLessThanRange(version, targetVersion);\n case '<=':\n return (\n this.isLessThanRange(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n case '=':\n case '==':\n return this.equals(version, targetVersion);\n case '~': {\n const targetParsed = this._parse(targetVersion)!;\n const versionParsed = this._parse(version)!;\n\n // Must have same major and minor versions\n if (\n targetParsed.release[0] !== versionParsed.release[0] ||\n targetParsed.release[1] !== versionParsed.release[1]\n ) {\n return false;\n }\n\n // Version must be >= target\n return (\n this.isGreaterThan(version, targetVersion) ||\n this.equals(version, targetVersion)\n );\n }\n }\n // Fallback for unhandled operator combinations like >>, <>, ><, ~~~\n // These match the regex but aren't semantically valid APK range operators\n return false;\n });\n\n if (satisfyingVersions.length === 0) {\n return null;\n }\n\n // Return the highest satisfying version\n return satisfyingVersions.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override getMajor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[0] ?? null;\n }\n\n override getMinor(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n return parsed?.release[1] ?? null;\n }\n\n override getPatch(version: string): number | null {\n if (!version) {\n return null;\n }\n // Strip any operators (=, >, <, ~) before parsing\n const cleanVersion = version.replace(regEx(/^[=><~][=]?/), '');\n const parsed = this._parse(cleanVersion);\n if (!parsed) {\n return null;\n }\n return parsed.release[2] ?? null;\n }\n\n override getNewValue({\n currentValue,\n newVersion,\n }: {\n currentValue: string;\n rangeStrategy?: string;\n currentVersion?: string;\n newVersion: string;\n }): string | null {\n // APK packages in apko.yaml only use exact versions\n // currentValue is stored without the = operator for cleaner PR display\n const hasRevision = regEx(/-r\\d+$/).test(currentValue);\n\n // If current version has no revision, strip revision from newVersion\n // This ensures both newValue and the displayed version are clean\n if (!hasRevision) {\n return newVersion.replace(regEx(/-r\\d+$/), '');\n }\n\n // If current version has revision, keep revision in newVersion\n return newVersion;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(regEx(/^=/), '');\n const cleanB = b.replace(regEx(/^=/), '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/versioning/apk/index.ts"],"sourcesContent":["import { isTruthy } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport type { RangeStrategy } from '../../../types/versioning.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GenericVersioningApi } from '../generic.ts';\nimport type { NewValueConfig, VersioningApi } from '../types.ts';\nimport type { ApkVersion } from './types.ts';\n\nexport const id = 'apk';\nexport const displayName = 'Alpine Package Keeper (APK)';\nexport const urls = [\n '[Alpine Linux package policies](https://wiki.alpinelinux.org/wiki/Package_policies)',\n '[Alpine Package Keeper - Package pinning](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper#Package_pinning)',\n];\nexport const supportsRanges = true;\nexport const supportedRangeStrategies: RangeStrategy[] = [\n 'bump',\n 'pin',\n 'replace',\n];\n\n/**\n * APK constraint operators, as the bitmask `apk` builds them into.\n *\n * `apk` ORs one flag per operator character, so the characters may appear in any order and may repeat - `~`, `=~` and `~=` all mean the same thing.\n *\n * Based on `GPL-2.0` code in https://gitlab.alpinelinux.org/alpine/apk-tools/-/blob/master/src/version.c\n */\nconst OP_LESS = 1;\nconst OP_GREATER = 2;\nconst OP_EQUAL = 4;\nconst OP_FUZZY = 8;\n\n/** A prefix match, e.g. `~1.6` - `apk` treats `~` as fuzzy /and/ equal */\nconst OP_PREFIX = OP_FUZZY | OP_EQUAL;\n\n/** `><` constrains a package to an identity hash rather than to a version */\nconst OP_CHECKSUM = OP_LESS | OP_GREATER;\n\ninterface ApkConstraint {\n /** the operator as written, so that an update can spell it the same way */\n operator: string;\n mask: number;\n version: string;\n}\n\nconst constraintRegex = regEx(/^(?<operator>[<>=~]*)(?<version>[^<>=~].*)$/);\n\nfunction operatorMask(operator: string): number | null {\n let mask = 0;\n for (const char of operator) {\n if (char === '<') {\n mask |= OP_LESS;\n } else if (char === '>') {\n mask |= OP_GREATER;\n } else if (char === '=') {\n mask |= OP_EQUAL;\n } else {\n mask |= OP_PREFIX;\n }\n }\n // an absent operator constrains to an exact version, the same as `=`\n if (mask === 0) {\n return OP_EQUAL;\n }\n // an identity hash is not a version, so there is nothing to look up\n return mask === OP_CHECKSUM ? null : mask;\n}\n\n/** Splits a constraint such as `~8.12.1` into its operator and version */\nfunction parseConstraint(input: string): ApkConstraint | null {\n if (!input) {\n return null;\n }\n const groups = constraintRegex.exec(input)?.groups;\n if (!groups) {\n return null;\n }\n const mask = operatorMask(groups.operator);\n if (mask === null) {\n return null;\n }\n return { operator: groups.operator, mask, version: groups.version };\n}\n\n// Regex with named capture groups for APK version parsing\nconst versionRegex = regEx(\n /^v?(?<major>[0-9]+)(?:\\.(?<minor>[0-9]+))?(?:\\.(?<patch>[0-9]+))?(?<extra>(?:\\.[0-9]+)*)(?<letter>[a-z])?(?:(?<prereleaseType>_alpha|_beta|_pre|_rc)(?<prereleaseNum>[0-9]*))?(?:(?<packageFixType>_cvs|_svn|_git|_hg|_p)(?<packageFixNum>[0-9]*))?(?:-r(?<releaseNum>[0-9]+))?$/,\n);\n\n// Regex for splitting version strings into alphanumeric parts\nconst alphaNumRegex = regEx(/(?:[a-zA-Z]+)|(?:\\d+)/g);\n\nconst revisionRegex = regEx(/-r\\d+$/);\n\n/**\n * The kinds of token an APK version is made of, in the order `apk` reads them.\n *\n * A prefix match compares tokens pairwise, so a token's kind has to be part of the comparison - `1.6_rc1` is not a prefix of `1.6.0`, even though both start with `1.6`.\n */\nconst TOKEN_DIGIT = 0;\nconst TOKEN_LETTER = 1;\nconst TOKEN_PRERELEASE = 2;\nconst TOKEN_PACKAGE_FIX = 3;\nconst TOKEN_REVISION = 4;\n\ninterface ApkToken {\n kind: number;\n value: string | number;\n}\n\n/** The numeric components of a version, e.g. `[1, 6, 0]` for `1.6.0_pre1` */\nfunction numericParts(groups: Record<string, string>): number[] {\n const { major, minor, patch, extra } = groups;\n const parts = [parseInt(major, 10)];\n for (const part of [minor, patch]) {\n if (part) {\n parts.push(parseInt(part, 10));\n }\n }\n if (extra) {\n parts.push(...extra.substring(1).split('.').filter(isTruthy).map(Number));\n }\n return parts;\n}\n\nfunction tokenize(groups: Record<string, string>): ApkToken[] {\n const {\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = groups;\n\n const tokens: ApkToken[] = numericParts(groups).map((value) => ({\n kind: TOKEN_DIGIT,\n value,\n }));\n if (letter) {\n tokens.push({ kind: TOKEN_LETTER, value: letter });\n }\n if (prereleaseType) {\n tokens.push({\n kind: TOKEN_PRERELEASE,\n value: prereleaseType + prereleaseNum,\n });\n }\n if (packageFixType) {\n tokens.push({\n kind: TOKEN_PACKAGE_FIX,\n value: packageFixType + packageFixNum,\n });\n }\n if (releaseNum) {\n tokens.push({ kind: TOKEN_REVISION, value: parseInt(releaseNum, 10) });\n }\n return tokens;\n}\n\n/**\n * Whether `constraintVersion` is a token-wise prefix of `version`, which is what `apk` calls a fuzzy match.\n *\n * `~1.6` matches `1.6`, `1.6.0_pre1`, `1.6.0`, `1.6.5` and `1.6.9_p1`, but not `1.60` - the comparison is per token, not on the raw string.\n */\nfunction isPrefixMatch(version: string, constraintVersion: string): boolean {\n const versionGroups = versionRegex.exec(version)?.groups;\n const constraintGroups = versionRegex.exec(constraintVersion)?.groups;\n /* v8 ignore next -- `matches` parses both versions before calling this */\n if (!versionGroups || !constraintGroups) {\n return false;\n }\n const versionTokens = tokenize(versionGroups);\n const constraintTokens = tokenize(constraintGroups);\n // a constraint with more tokens than the version cannot be its prefix\n if (constraintTokens.length > versionTokens.length) {\n return false;\n }\n return constraintTokens.every(\n (token, i) =>\n token.kind === versionTokens[i].kind &&\n token.value === versionTokens[i].value,\n );\n}\n\n/** Drops the revision when the constraint was written without one */\nfunction withConstraintRevision(\n newVersion: string,\n constraintVersion: string,\n): string {\n if (revisionRegex.test(constraintVersion)) {\n return newVersion;\n }\n return newVersion.replace(revisionRegex, '');\n}\n\nclass ApkVersioningApi extends GenericVersioningApi {\n /**\n * Parse APK version format using apko's version parsing patterns\n * Based on `Apache-2.0` code in https://github.com/chainguard-dev/apko/blob/v0.30.35/pkg/apk/apk/version.go\n */\n protected _parse(version: string): ApkVersion | null {\n const match = versionRegex.exec(version);\n if (!match?.groups) {\n return null;\n }\n\n const {\n major,\n minor,\n patch,\n extra,\n letter,\n prereleaseType,\n prereleaseNum,\n packageFixType,\n packageFixNum,\n releaseNum,\n } = match.groups;\n\n const packageFixFull = packageFixType ? packageFixType + packageFixNum : '';\n\n const minorPatchStr =\n (minor ? `.${minor}` : '') + (patch ? `.${patch}` : '') + extra;\n\n // For version comparison, we only include the base version + package fix, not prerelease\n const versionStr = major + minorPatchStr + (letter ?? '') + packageFixFull;\n\n let prerelease: string | undefined;\n if (prereleaseType) {\n prerelease = prereleaseType.substring(1) + prereleaseNum;\n }\n\n // Extract numeric parts for major/minor/patch/extra\n const release = [parseInt(major, 10)];\n if (minor) {\n release.push(parseInt(minor, 10));\n }\n if (patch) {\n release.push(parseInt(patch, 10));\n }\n // Handle any additional version parts (e.g., 1.2.3.4.5)\n if (extra) {\n const extraParts = extra\n .substring(1)\n .split('.')\n .filter(isTruthy)\n .map(Number);\n release.push(...extraParts);\n }\n\n // Extract release string (just the number part)\n const releaseString = releaseNum ?? '';\n\n return {\n version: versionStr,\n releaseString,\n release,\n prerelease,\n };\n }\n\n /**\n * Compare two APK versions according to Alpine Linux rules\n */\n protected override _compare(version: string, other: string): number {\n const parsed1 = this._parse(version);\n const parsed2 = this._parse(other);\n\n if (!(parsed1 && parsed2)) {\n return 1;\n }\n\n // Compare version parts (without release number)\n const versionCompare = this._compareVersionParts(\n parsed1.version,\n parsed2.version,\n );\n if (versionCompare !== 0) {\n return versionCompare;\n }\n\n // Compare prerelease identifiers\n const prerelease1 = parsed1.prerelease;\n const prerelease2 = parsed2.prerelease;\n\n if (prerelease1 || prerelease2) {\n if (!prerelease1) {\n return -1; // Version without prerelease < version with prerelease (APK-specific)\n }\n if (!prerelease2) {\n return 1; // Version with prerelease > version without (APK-specific)\n }\n // Both have prerelease identifiers, compare them\n const prereleaseCompare = prerelease1.localeCompare(prerelease2);\n if (prereleaseCompare !== 0) {\n return prereleaseCompare;\n }\n }\n\n // Compare release numbers\n const release1 = parsed1.releaseString || '';\n const release2 = parsed2.releaseString || '';\n\n // If one has a release number and the other doesn't, the one with release number is greater\n if (release1 && !release2) {\n return 1;\n }\n if (!release1 && release2) {\n return -1;\n }\n\n // If both have release numbers or neither has release numbers, compare them\n const releaseCompare = this._compareVersionParts(\n release1 || '0',\n release2 || '0',\n );\n return releaseCompare;\n }\n\n /**\n * Compare version parts using APK's version comparison rules\n */\n private _compareVersionParts(v1: string, v2: string): number {\n if (v1 === v2) {\n return 0;\n }\n const matchesv1 = v1.match(alphaNumRegex)!;\n const matchesv2 = v2.match(alphaNumRegex)!;\n const matches = Math.min(matchesv1.length, matchesv2.length);\n\n for (let i = 0; i < matches; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n if (!matchv2 || !regEx(/^\\d+$/).test(matchv2)) {\n return 1;\n }\n const num1 = parseInt(matchv1, 10);\n const num2 = parseInt(matchv2, 10);\n if (num1 !== num2) {\n return num1 - num2;\n }\n } else if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n } else if (matchv1 !== matchv2) {\n return matchv1.localeCompare(matchv2);\n }\n }\n\n if (matchesv1.length !== matchesv2.length) {\n const maxLength = Math.max(matchesv1.length, matchesv2.length);\n for (let i = matches; i < maxLength; i++) {\n const matchv1 = matchesv1[i];\n const matchv2 = matchesv2[i];\n\n if (matchv1 && regEx(/^\\d+$/).test(matchv1)) {\n return 1;\n }\n if (matchv2 && regEx(/^\\d+$/).test(matchv2)) {\n return -1;\n }\n if (matchv1) {\n return -1;\n }\n return 1;\n }\n }\n\n return 0;\n }\n\n override isValid(input: string): boolean {\n const constraint = parseConstraint(input);\n return !!constraint && this._parse(constraint.version) !== null;\n }\n\n /** A constraint is not itself a version, however valid it is */\n override isVersion(input: string): boolean {\n const constraint = parseConstraint(input);\n return (\n !!constraint &&\n constraint.operator === '' &&\n this._parse(constraint.version) !== null\n );\n }\n\n override isSingleVersion(input: string): boolean {\n const constraint = parseConstraint(input);\n return (\n !!constraint &&\n constraint.mask === OP_EQUAL &&\n this._parse(constraint.version) !== null\n );\n }\n\n override isStable(input: string): boolean {\n const constraint = parseConstraint(input);\n if (!constraint) {\n return false;\n }\n const parsed = this._parse(constraint.version);\n // Consider versions without prerelease identifiers as stable\n return !!parsed && !parsed.prerelease;\n }\n\n /**\n * Whether `version` satisfies the constraint, following `apk_version_match`: compare the two, fuzzily when the operator asks for it, then check the result against the operator's mask.\n */\n override matches(version: string, range: string): boolean {\n const constraint = parseConstraint(range);\n if (\n !constraint ||\n !this._parse(version) ||\n !this._parse(constraint.version)\n ) {\n return false;\n }\n\n if (\n (constraint.mask & OP_FUZZY) !== 0 &&\n isPrefixMatch(version, constraint.version)\n ) {\n return (constraint.mask & OP_EQUAL) !== 0;\n }\n\n const compared = this._compare(version, constraint.version);\n if (compared < 0) {\n return (constraint.mask & OP_LESS) !== 0;\n }\n if (compared > 0) {\n return (constraint.mask & OP_GREATER) !== 0;\n }\n return (constraint.mask & OP_EQUAL) !== 0;\n }\n\n override isLessThanRange(version: string, range: string): boolean {\n const constraint = parseConstraint(range);\n if (\n !constraint ||\n !this._parse(version) ||\n !this._parse(constraint.version)\n ) {\n return false;\n }\n // a range with no lower bound has nothing below it\n if ((constraint.mask & OP_LESS) !== 0) {\n return false;\n }\n // a fuzzy match satisfies the constraint, so it cannot be below it, even though `_compare` ranks `2.39.0_git20240101` below `2.39.0`\n if (\n (constraint.mask & OP_FUZZY) !== 0 &&\n isPrefixMatch(version, constraint.version)\n ) {\n return false;\n }\n\n const compared = this._compare(version, constraint.version);\n if (compared !== 0) {\n return compared < 0;\n }\n // equal to the boundary, so below the range only when it is excluded\n return (constraint.mask & OP_EQUAL) === 0;\n }\n\n override getSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n const satisfying = versions.filter((version) =>\n this.matches(version, range),\n );\n if (!satisfying.length) {\n return null;\n }\n return satisfying.sort((a, b) => this.sortVersions(b, a))[0];\n }\n\n override minSatisfyingVersion(\n versions: string[],\n range: string,\n ): string | null {\n const satisfying = versions.filter((version) =>\n this.matches(version, range),\n );\n if (!satisfying.length) {\n return null;\n }\n return satisfying.sort((a, b) => this.sortVersions(a, b))[0];\n }\n\n override getMajor(input: string): number | null {\n const constraint = parseConstraint(input);\n return constraint\n ? (this._parse(constraint.version)?.release[0] ?? null)\n : null;\n }\n\n override getMinor(input: string): number | null {\n const constraint = parseConstraint(input);\n return constraint\n ? (this._parse(constraint.version)?.release[1] ?? null)\n : null;\n }\n\n override getPatch(input: string): number | null {\n const constraint = parseConstraint(input);\n return constraint\n ? (this._parse(constraint.version)?.release[2] ?? null)\n : null;\n }\n\n override getNewValue({\n currentValue,\n rangeStrategy,\n newVersion,\n }: NewValueConfig): string | null {\n const constraint = parseConstraint(currentValue);\n if (!constraint) {\n return null;\n }\n\n const { operator, mask, version } = constraint;\n\n // a constraint we cannot parse the version of is one we cannot rewrite\n const parsed = this._parse(version);\n if (!parsed) {\n return null;\n }\n\n if (rangeStrategy === 'pin') {\n return newVersion;\n }\n\n // an exact constraint identifies one version, so only the revision is written to the precision the user chose\n if (mask === OP_EQUAL) {\n return `${operator}${withConstraintRevision(newVersion, version)}`;\n }\n\n // `bump` raises a lower bound to the new version, which only makes sense when the bound includes its boundary - bumping `>8.12.1` to `>8.13.0` would exclude the very version it was bumped to\n if (\n rangeStrategy === 'bump' &&\n (mask & OP_GREATER) !== 0 &&\n (mask & OP_EQUAL) !== 0\n ) {\n // the whole point of the bump is to raise the bound, so unlike a prefix constraint we write `newVersion` in full rather than to the precision it was written with\n return `${operator}${newVersion}`;\n }\n\n // a prefix constraint keeps the precision it was written with, so `~8.12.1` becomes `~8.13.0` rather than `~8.13.0-r0`, and stays revision-agnostic\n if (mask === OP_PREFIX) {\n const currentParts = parsed.release;\n const newParts = this._parse(newVersion)?.release;\n /* v8 ignore next -- newVersion comes from the datasource, so it parses */\n if (!newParts) {\n return null;\n }\n if (currentParts.length < newParts.length) {\n return `${operator}${newParts.slice(0, currentParts.length).join('.')}`;\n }\n return `${operator}${withConstraintRevision(newVersion, version)}`;\n }\n\n // `>` cannot be bumped, and an upper bound is not a bound to bump\n if (rangeStrategy === 'bump') {\n logger.debug(\n `Unsupported range type for rangeStrategy=bump: ${currentValue}`,\n );\n }\n\n // there is no single obvious replacement for `>`, `>=`, `<`, `<=`, `>~` or `<~`, and a bound which already admits the new version needs no change\n return null;\n }\n\n // Override to provide clean version for PR titles and display\n override sortVersions(a: string, b: string): number {\n // Strip = prefix if present for comparison\n const cleanA = a.replace(regEx(/^=/), '');\n const cleanB = b.replace(regEx(/^=/), '');\n return super.sortVersions(cleanA, cleanB);\n }\n}\n\nexport const api: VersioningApi = new ApkVersioningApi();\n\nexport default api;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "44.69.
|
|
4
|
+
"version": "44.69.11",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -222,7 +222,7 @@
|
|
|
222
222
|
"@hyrious/marshal": "0.3.4",
|
|
223
223
|
"@ls-lint/ls-lint": "2.3.1",
|
|
224
224
|
"@openpgp/web-stream-tools": "0.3.1",
|
|
225
|
-
"@oxlint/plugins": "1.
|
|
225
|
+
"@oxlint/plugins": "1.81.0",
|
|
226
226
|
"@semantic-release/exec": "7.1.0",
|
|
227
227
|
"@smithy/util-stream": "4.8.2",
|
|
228
228
|
"@types/adm-zip": "0.5.8",
|
|
@@ -280,7 +280,7 @@
|
|
|
280
280
|
"nock": "14.0.17",
|
|
281
281
|
"npm-run-all2": "9.0.3",
|
|
282
282
|
"nyc": "18.0.0",
|
|
283
|
-
"oxlint": "1.
|
|
283
|
+
"oxlint": "1.81.0",
|
|
284
284
|
"oxlint-tsgolint": "7.0.2001",
|
|
285
285
|
"rimraf": "6.1.3",
|
|
286
286
|
"semantic-release": "25.0.9",
|
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.69.
|
|
3
|
+
"title": "JSON schema for Renovate 44.69.11 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.69.
|
|
5
|
+
"x-renovate-version": "44.69.11",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|