@vltpkg/semver 0.0.0-0.1730239248325
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/LICENSE +15 -0
- package/README.md +152 -0
- package/dist/esm/comparator.d.ts +76 -0
- package/dist/esm/comparator.d.ts.map +1 -0
- package/dist/esm/comparator.js +515 -0
- package/dist/esm/comparator.js.map +1 -0
- package/dist/esm/index.d.ts +246 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +400 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/range.d.ts +34 -0
- package/dist/esm/range.d.ts.map +1 -0
- package/dist/esm/range.js +72 -0
- package/dist/esm/range.js.map +1 -0
- package/dist/esm/version.d.ts +79 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +302 -0
- package/dist/esm/version.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
// TODO: it might be faster to not have Version objects in the
|
|
2
|
+
// comparator tuples, and instead just keep the parsed number arrays?
|
|
3
|
+
import { syntaxError } from '@vltpkg/error-cause';
|
|
4
|
+
import { fastSplit } from '@vltpkg/fast-split';
|
|
5
|
+
import { Version } from './version.js';
|
|
6
|
+
const isOperator = (o) => !!o &&
|
|
7
|
+
(o === '>' ||
|
|
8
|
+
o === '<' ||
|
|
9
|
+
o === '>=' ||
|
|
10
|
+
o === '<=' ||
|
|
11
|
+
o === '' ||
|
|
12
|
+
o === '~' ||
|
|
13
|
+
o === '^' ||
|
|
14
|
+
o === '~>');
|
|
15
|
+
const preJunk = new Set('=v \t');
|
|
16
|
+
const invalidComp = (c, message) => syntaxError(`invalid comparator: '${c}' ${message}`, { found: c }, Comparator);
|
|
17
|
+
const assertNumber = (value, c, field) => {
|
|
18
|
+
const n = Number(value);
|
|
19
|
+
if (n !== n) {
|
|
20
|
+
throw invalidComp(c, `${field} must be numeric or 'x', got: '${value}'`);
|
|
21
|
+
}
|
|
22
|
+
return n;
|
|
23
|
+
};
|
|
24
|
+
const assertVersion = (v, comp) => {
|
|
25
|
+
if (!v) {
|
|
26
|
+
throw invalidComp(comp, 'no value provided for operator');
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const assertMissing = (value, c, field) => {
|
|
30
|
+
if (value && !isX(value)) {
|
|
31
|
+
throw invalidComp(c, `cannot omit '${field}' and include subsequent fields`);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const MAJOR = 0;
|
|
35
|
+
const MINOR = 1;
|
|
36
|
+
const PATCH = 2;
|
|
37
|
+
const isX = (c) => !c || c === 'X' || c === 'x' || c === '*';
|
|
38
|
+
const isFullVersion = (parsed) => undefined !== parsed[PATCH];
|
|
39
|
+
const isXPatch = (parsed) => undefined !== parsed[MINOR] && undefined === parsed[PATCH];
|
|
40
|
+
const isXMinor = (parsed) => undefined !== parsed[MAJOR] && undefined === parsed[MINOR];
|
|
41
|
+
const isXMajor = (parsed) => undefined === parsed[MAJOR];
|
|
42
|
+
/**
|
|
43
|
+
* Class used to parse the `||` separated portions
|
|
44
|
+
* of a range, and evaluate versions against it.
|
|
45
|
+
*
|
|
46
|
+
* This does most of the heavy lifting of range testing, and provides
|
|
47
|
+
* little affordance for improperly formatted strings. It should be
|
|
48
|
+
* considered an internal class, and usually not accessed directly.
|
|
49
|
+
*/
|
|
50
|
+
export class Comparator {
|
|
51
|
+
/**
|
|
52
|
+
* does this range include prereleases, even when they do not
|
|
53
|
+
* match the tuple in the comparator?
|
|
54
|
+
*/
|
|
55
|
+
includePrerelease;
|
|
56
|
+
/** raw string used to create this comparator */
|
|
57
|
+
raw;
|
|
58
|
+
/** tokens extracted from the raw string input */
|
|
59
|
+
tokens;
|
|
60
|
+
/**
|
|
61
|
+
* Either the `any` comparator, the `none` comparator, or an operator
|
|
62
|
+
* and a {@link ParsedXRange}
|
|
63
|
+
*/
|
|
64
|
+
tuples = [];
|
|
65
|
+
/** true if this comparator can not match anything */
|
|
66
|
+
isNone = false;
|
|
67
|
+
/**
|
|
68
|
+
* true if this comparator is a `'*'` type of range.
|
|
69
|
+
*
|
|
70
|
+
* Note that it still will not match versions with a prerelease value,
|
|
71
|
+
* unless the tuple in the version matches the tuple provided to the
|
|
72
|
+
* comparator, and the comparator version also has a prerelease value,
|
|
73
|
+
* unless `includePrerelease` is set.
|
|
74
|
+
*/
|
|
75
|
+
isAny = false;
|
|
76
|
+
/** the canonical strict simplified parsed form of this constructor */
|
|
77
|
+
toString() {
|
|
78
|
+
return (this.isNone ? '<0.0.0-0'
|
|
79
|
+
: this.isAny ? '*'
|
|
80
|
+
: /* c8 ignore next */
|
|
81
|
+
this.tuples.map(c => (isAny(c) ? '*' : c.join(''))).join(' '));
|
|
82
|
+
}
|
|
83
|
+
constructor(comp, includePrerelease = false) {
|
|
84
|
+
this.includePrerelease = includePrerelease;
|
|
85
|
+
comp = comp.trim();
|
|
86
|
+
this.raw = comp;
|
|
87
|
+
let hyphen = false;
|
|
88
|
+
const rawComps = fastSplit(comp, ' ', -1, (part, parts, i) => {
|
|
89
|
+
if (part === '-') {
|
|
90
|
+
if (hyphen) {
|
|
91
|
+
throw invalidComp(comp, 'multiple hyphen ranges not allowed');
|
|
92
|
+
}
|
|
93
|
+
if (parts.length !== 1 || i === -1) {
|
|
94
|
+
throw invalidComp(comp, 'hyphen must be between two versions');
|
|
95
|
+
}
|
|
96
|
+
hyphen = true;
|
|
97
|
+
}
|
|
98
|
+
else if (hyphen && parts.length !== 2) {
|
|
99
|
+
throw invalidComp(comp, 'hyphen range must be alone');
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// remove excess spaces, `> 1 2` => `>1 2`
|
|
103
|
+
const comps = [];
|
|
104
|
+
let followingOperator = false;
|
|
105
|
+
let l = 0;
|
|
106
|
+
for (const c of rawComps) {
|
|
107
|
+
if (c === '')
|
|
108
|
+
continue;
|
|
109
|
+
if (!followingOperator) {
|
|
110
|
+
followingOperator = isOperator(c);
|
|
111
|
+
comps.push(c);
|
|
112
|
+
l++;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// we know this is not undefined since followingOperator guards that
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
117
|
+
comps[l - 1] += c;
|
|
118
|
+
followingOperator = false;
|
|
119
|
+
}
|
|
120
|
+
// TS mistakenly thinks hyphen is always false here
|
|
121
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
122
|
+
if (hyphen) {
|
|
123
|
+
const [min, _, max] = comps;
|
|
124
|
+
/* c8 ignore start - defense in depth for TS, already guaranteed */
|
|
125
|
+
if (!min || !max) {
|
|
126
|
+
throw invalidComp(comp, 'hyphen must be between two versions');
|
|
127
|
+
}
|
|
128
|
+
/* c8 ignore stop */
|
|
129
|
+
this.#parseHyphenRange(min, max);
|
|
130
|
+
}
|
|
131
|
+
else if (!comps.length ||
|
|
132
|
+
(comps.length === 1 && isX(comps[0]))) {
|
|
133
|
+
this.tuples.push(this.#getComparatorAny());
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
for (const c of comps) {
|
|
137
|
+
this.#parse(c);
|
|
138
|
+
if (this.isNone)
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
this.tokens = comps;
|
|
143
|
+
this.isAny = true;
|
|
144
|
+
for (const c of this.tuples) {
|
|
145
|
+
if (Array.isArray(c) || !c.isAny) {
|
|
146
|
+
this.isAny = false;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// inclusive min
|
|
152
|
+
#xInclusiveMin(raw) {
|
|
153
|
+
const z = this.includePrerelease ? '0' : undefined;
|
|
154
|
+
const [M, m = 0, p = 0, pr = z, build] = this.#parseX(raw);
|
|
155
|
+
return M === undefined ?
|
|
156
|
+
this.#getComparatorAny()
|
|
157
|
+
: ['>=', new Version(raw, M, m, p, pr, build)];
|
|
158
|
+
}
|
|
159
|
+
// exclusive min
|
|
160
|
+
#xExclusiveMin(raw) {
|
|
161
|
+
const parsed = this.#parseX(raw);
|
|
162
|
+
if (isFullVersion(parsed)) {
|
|
163
|
+
return ['>', new Version(raw, ...parsed)];
|
|
164
|
+
}
|
|
165
|
+
const z = this.includePrerelease ? '0' : undefined;
|
|
166
|
+
if (isXPatch(parsed)) {
|
|
167
|
+
// >1.2 => >=1.3.0
|
|
168
|
+
return [
|
|
169
|
+
'>=',
|
|
170
|
+
new Version(raw, parsed[MAJOR], parsed[MINOR] + 1, 0, z, undefined),
|
|
171
|
+
];
|
|
172
|
+
}
|
|
173
|
+
if (isXMinor(parsed)) {
|
|
174
|
+
// >1 => >=2.0.0
|
|
175
|
+
return [
|
|
176
|
+
'>=',
|
|
177
|
+
new Version(raw, parsed[MAJOR] + 1, 0, 0, z, undefined),
|
|
178
|
+
];
|
|
179
|
+
}
|
|
180
|
+
this.isNone = true;
|
|
181
|
+
this.tuples.length = 0;
|
|
182
|
+
return comparatorNone;
|
|
183
|
+
}
|
|
184
|
+
#xInclusiveMax(raw) {
|
|
185
|
+
const parsed = this.#parseX(raw);
|
|
186
|
+
return (isFullVersion(parsed) ? ['<=', new Version(raw, ...parsed)]
|
|
187
|
+
: isXPatch(parsed) ?
|
|
188
|
+
[
|
|
189
|
+
'<',
|
|
190
|
+
new Version(raw, parsed[MAJOR], parsed[MINOR] + 1, 0, '0', undefined),
|
|
191
|
+
]
|
|
192
|
+
: isXMinor(parsed) ?
|
|
193
|
+
[
|
|
194
|
+
'<',
|
|
195
|
+
new Version(raw, parsed[MAJOR] + 1, 0, 0, '0', undefined),
|
|
196
|
+
]
|
|
197
|
+
: this.#getComparatorAny());
|
|
198
|
+
}
|
|
199
|
+
#xExclusiveMax(raw) {
|
|
200
|
+
const z = this.includePrerelease ? '0' : undefined;
|
|
201
|
+
const [M = 0, m = 0, p = 0, pr = z, build] = this.#parseX(raw);
|
|
202
|
+
if (M === 0 && m === 0 && p === 0 && pr === '0') {
|
|
203
|
+
this.isNone = true;
|
|
204
|
+
this.tuples.length = 0;
|
|
205
|
+
return comparatorNone;
|
|
206
|
+
}
|
|
207
|
+
return ['<', new Version(raw, M, m, p, pr, build)];
|
|
208
|
+
}
|
|
209
|
+
#validXM(raw, m, p) {
|
|
210
|
+
assertMissing(m, raw, 'major');
|
|
211
|
+
assertMissing(p, raw, 'major');
|
|
212
|
+
if (m === '' || p === '') {
|
|
213
|
+
throw invalidComp(raw, `(Did you mean '*'?)`);
|
|
214
|
+
}
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
#validXm(raw, M, m, p) {
|
|
218
|
+
assertMissing(p, raw, 'major');
|
|
219
|
+
if (m === '' || p === '') {
|
|
220
|
+
throw invalidComp(raw, `(Did you mean '${M}'?)`);
|
|
221
|
+
}
|
|
222
|
+
return [assertNumber(M, raw, 'major')];
|
|
223
|
+
}
|
|
224
|
+
#validXp(raw, M, m, p) {
|
|
225
|
+
if (p === '') {
|
|
226
|
+
throw invalidComp(raw, `(Did you mean '${M}.${m}'?)`);
|
|
227
|
+
}
|
|
228
|
+
return [
|
|
229
|
+
assertNumber(M, raw, 'major'),
|
|
230
|
+
assertNumber(m, raw, 'minor'),
|
|
231
|
+
];
|
|
232
|
+
}
|
|
233
|
+
#validTuple(raw, M, m, p) {
|
|
234
|
+
return [
|
|
235
|
+
assertNumber(M, raw, 'major'),
|
|
236
|
+
assertNumber(m, raw, 'minor'),
|
|
237
|
+
assertNumber(p, raw, 'patch'),
|
|
238
|
+
];
|
|
239
|
+
}
|
|
240
|
+
#validXbuild(raw, M, m, p, pl) {
|
|
241
|
+
// build, no prerelease
|
|
242
|
+
const patch = p.substring(0, pl);
|
|
243
|
+
const build = p.substring(pl + 1);
|
|
244
|
+
if (!patch) {
|
|
245
|
+
throw invalidComp(raw, 'cannot specify build without patch');
|
|
246
|
+
}
|
|
247
|
+
if (!build) {
|
|
248
|
+
throw invalidComp(raw, `encountered '+', but no build value`);
|
|
249
|
+
}
|
|
250
|
+
return [
|
|
251
|
+
assertNumber(M, raw, 'major'),
|
|
252
|
+
assertNumber(m, raw, 'minor'),
|
|
253
|
+
assertNumber(patch, raw, 'patch'),
|
|
254
|
+
undefined,
|
|
255
|
+
build,
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
#validXpr(raw, M, m, p, hy) {
|
|
259
|
+
{
|
|
260
|
+
// prerelease, no build
|
|
261
|
+
const patch = p.substring(0, hy);
|
|
262
|
+
const pr = p.substring(hy + 1);
|
|
263
|
+
if (!patch) {
|
|
264
|
+
throw invalidComp(raw, 'cannot specify prerelease without patch');
|
|
265
|
+
}
|
|
266
|
+
if (!pr) {
|
|
267
|
+
throw invalidComp(raw, `encountered '-', but no prerelease value`);
|
|
268
|
+
}
|
|
269
|
+
return [
|
|
270
|
+
assertNumber(M, raw, 'major'),
|
|
271
|
+
assertNumber(m, raw, 'minor'),
|
|
272
|
+
assertNumber(patch, raw, 'patch'),
|
|
273
|
+
pr,
|
|
274
|
+
undefined,
|
|
275
|
+
];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
#validXprbuild(raw, M, m, p, hy, pl) {
|
|
279
|
+
// both prerelease and build
|
|
280
|
+
const patch = p.substring(0, hy);
|
|
281
|
+
const pr = p.substring(hy + 1, pl);
|
|
282
|
+
const build = p.substring(pl + 1);
|
|
283
|
+
if (!patch) {
|
|
284
|
+
throw invalidComp(raw, 'cannot specify prerelease without patch');
|
|
285
|
+
}
|
|
286
|
+
if (!pr) {
|
|
287
|
+
throw invalidComp(raw, `encountered '-', but no prerelease value`);
|
|
288
|
+
}
|
|
289
|
+
if (!build) {
|
|
290
|
+
throw invalidComp(raw, `encountered '+', but no build value`);
|
|
291
|
+
}
|
|
292
|
+
return [
|
|
293
|
+
assertNumber(M, raw, 'major'),
|
|
294
|
+
assertNumber(m, raw, 'minor'),
|
|
295
|
+
assertNumber(patch, raw, 'patch'),
|
|
296
|
+
pr,
|
|
297
|
+
build,
|
|
298
|
+
];
|
|
299
|
+
}
|
|
300
|
+
// pull the relevant values out of an X-range or version
|
|
301
|
+
// return the fields for creating a Version object.
|
|
302
|
+
// only call once operator is stripped off
|
|
303
|
+
#parseX(raw) {
|
|
304
|
+
let [M, m, p] = fastSplit(raw, '.', 3);
|
|
305
|
+
let prune = 0;
|
|
306
|
+
while (M && preJunk.has(M.charAt(prune)))
|
|
307
|
+
prune++;
|
|
308
|
+
if (M !== undefined && prune !== 0)
|
|
309
|
+
M = M.substring(prune);
|
|
310
|
+
// the `|| !M` is so TS knows we've handled undefined
|
|
311
|
+
if (!M || isX(M))
|
|
312
|
+
return this.#validXM(raw, m, p);
|
|
313
|
+
if (!m || isX(m))
|
|
314
|
+
return this.#validXm(raw, M, m, p);
|
|
315
|
+
if (!p || isX(p))
|
|
316
|
+
return this.#validXp(raw, M, m, p);
|
|
317
|
+
const hy = p.indexOf('-');
|
|
318
|
+
const pl = p.indexOf('+');
|
|
319
|
+
if (pl === -1 && hy === -1)
|
|
320
|
+
return this.#validTuple(raw, M, m, p);
|
|
321
|
+
if (pl === -1)
|
|
322
|
+
return this.#validXpr(raw, M, m, p, hy);
|
|
323
|
+
if (hy === -1)
|
|
324
|
+
return this.#validXbuild(raw, M, m, p, pl);
|
|
325
|
+
return this.#validXprbuild(raw, M, m, p, hy, pl);
|
|
326
|
+
}
|
|
327
|
+
#parseHyphenRange(min, max) {
|
|
328
|
+
const minv = this.#xInclusiveMin(min);
|
|
329
|
+
const maxv = this.#xInclusiveMax(max);
|
|
330
|
+
const minAny = isAny(minv);
|
|
331
|
+
const maxAny = isAny(maxv);
|
|
332
|
+
if (minAny && maxAny)
|
|
333
|
+
this.tuples.push(this.#getComparatorAny());
|
|
334
|
+
else if (minAny)
|
|
335
|
+
this.tuples.push(maxv);
|
|
336
|
+
else if (maxAny)
|
|
337
|
+
this.tuples.push(minv);
|
|
338
|
+
else
|
|
339
|
+
this.tuples.push(minv, maxv);
|
|
340
|
+
}
|
|
341
|
+
#parse(comp) {
|
|
342
|
+
const first = comp.charAt(0);
|
|
343
|
+
const first2 = comp.substring(0, 2);
|
|
344
|
+
const v1 = comp.substring(1);
|
|
345
|
+
const v2 = comp.substring(2);
|
|
346
|
+
switch (first2) {
|
|
347
|
+
case '~>':
|
|
348
|
+
assertVersion(v2, comp);
|
|
349
|
+
return this.#parseTilde(v2);
|
|
350
|
+
case '>=':
|
|
351
|
+
assertVersion(v2, comp);
|
|
352
|
+
return this.tuples.push(this.#xInclusiveMin(v2));
|
|
353
|
+
case '<=':
|
|
354
|
+
assertVersion(v2, comp);
|
|
355
|
+
return this.tuples.push(this.#xInclusiveMax(v2));
|
|
356
|
+
}
|
|
357
|
+
switch (first) {
|
|
358
|
+
case '~':
|
|
359
|
+
assertVersion(v1, comp);
|
|
360
|
+
return this.#parseTilde(v1);
|
|
361
|
+
case '^':
|
|
362
|
+
assertVersion(v1, comp);
|
|
363
|
+
return this.#parseCaret(v1);
|
|
364
|
+
case '>':
|
|
365
|
+
assertVersion(v1, comp);
|
|
366
|
+
return this.tuples.push(this.#xExclusiveMin(v1));
|
|
367
|
+
case '<':
|
|
368
|
+
assertVersion(v1, comp);
|
|
369
|
+
return this.tuples.push(this.#xExclusiveMax(v1));
|
|
370
|
+
}
|
|
371
|
+
return this.#parseEq(comp);
|
|
372
|
+
}
|
|
373
|
+
#parseTilde(comp) {
|
|
374
|
+
const parsed = this.#parseX(comp);
|
|
375
|
+
if (isXMajor(parsed)) {
|
|
376
|
+
this.tuples.push(this.#getComparatorAny());
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const z = this.includePrerelease ? '0' : undefined;
|
|
380
|
+
if (isXMinor(parsed)) {
|
|
381
|
+
const [M] = parsed;
|
|
382
|
+
this.tuples.push(['>=', new Version(comp, M, 0, 0, z, undefined)], ['<', new Version(comp, M + 1, 0, 0, '0', undefined)]);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if (isXPatch(parsed)) {
|
|
386
|
+
const [M, m] = parsed;
|
|
387
|
+
const z = this.includePrerelease ? '0' : undefined;
|
|
388
|
+
this.tuples.push(['>=', new Version(comp, M, m, 0, z, undefined)], ['<', new Version(comp, M, m + 1, 0, '0', undefined)]);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const [M, m, p, pr = z, build] = parsed;
|
|
392
|
+
this.tuples.push(['>=', new Version(comp, M, m, p, pr, build)], ['<', new Version(comp, M, m + 1, 0, '0', build)]);
|
|
393
|
+
}
|
|
394
|
+
#parseCaret(comp) {
|
|
395
|
+
const min = this.#xInclusiveMin(comp);
|
|
396
|
+
if (isAny(min)) {
|
|
397
|
+
this.tuples.push(min);
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const minv = min[1];
|
|
401
|
+
if (minv.major !== 0) {
|
|
402
|
+
this.tuples.push(min, [
|
|
403
|
+
'<',
|
|
404
|
+
new Version(comp, minv.major + 1, 0, 0, '0', undefined),
|
|
405
|
+
]);
|
|
406
|
+
}
|
|
407
|
+
else if (minv.minor !== 0) {
|
|
408
|
+
this.tuples.push(min, [
|
|
409
|
+
'<',
|
|
410
|
+
new Version(comp, minv.major, minv.minor + 1, 0, '0', undefined),
|
|
411
|
+
]);
|
|
412
|
+
}
|
|
413
|
+
else if (!minv.prerelease?.length) {
|
|
414
|
+
this.tuples.push(['', minv]);
|
|
415
|
+
}
|
|
416
|
+
else {
|
|
417
|
+
this.tuples.push(min, [
|
|
418
|
+
'<',
|
|
419
|
+
new Version(comp, minv.major, minv.minor, minv.patch + 1, '0', undefined),
|
|
420
|
+
]);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
#parseEq(comp) {
|
|
424
|
+
const parsed = this.#parseX(comp);
|
|
425
|
+
const z = this.includePrerelease ? '0' : undefined;
|
|
426
|
+
if (isFullVersion(parsed)) {
|
|
427
|
+
this.tuples.push(['', new Version(comp, ...parsed)]);
|
|
428
|
+
}
|
|
429
|
+
else if (isXMajor(parsed)) {
|
|
430
|
+
this.tuples.push(this.#getComparatorAny());
|
|
431
|
+
}
|
|
432
|
+
else if (isXMinor(parsed)) {
|
|
433
|
+
this.tuples.push([
|
|
434
|
+
'>=',
|
|
435
|
+
new Version(comp, parsed[MAJOR], 0, 0, z, undefined),
|
|
436
|
+
]);
|
|
437
|
+
this.tuples.push([
|
|
438
|
+
'<',
|
|
439
|
+
new Version(comp, parsed[MAJOR] + 1, 0, 0, '0', undefined),
|
|
440
|
+
]);
|
|
441
|
+
}
|
|
442
|
+
else if (isXPatch(parsed)) {
|
|
443
|
+
this.tuples.push([
|
|
444
|
+
'>=',
|
|
445
|
+
new Version(comp, parsed[MAJOR], parsed[MINOR], 0, z, undefined),
|
|
446
|
+
], [
|
|
447
|
+
'<',
|
|
448
|
+
new Version(comp, parsed[MAJOR], parsed[MINOR] + 1, 0, '0', undefined),
|
|
449
|
+
]);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
/** return true if the version is a match for this comparator */
|
|
453
|
+
test(v) {
|
|
454
|
+
if (this.isNone)
|
|
455
|
+
return false;
|
|
456
|
+
const ip = this.includePrerelease;
|
|
457
|
+
const hasPR = !!v.prerelease?.length;
|
|
458
|
+
let prOK = ip || !hasPR;
|
|
459
|
+
for (const c of this.tuples) {
|
|
460
|
+
if (isAny(c)) {
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
const [op, cv] = c;
|
|
464
|
+
prOK ||= !!cv.prerelease?.length && v.tupleEquals(cv);
|
|
465
|
+
switch (op) {
|
|
466
|
+
case '':
|
|
467
|
+
if (!v.equals(cv))
|
|
468
|
+
return false;
|
|
469
|
+
continue;
|
|
470
|
+
case '>':
|
|
471
|
+
if (!v.greaterThan(cv))
|
|
472
|
+
return false;
|
|
473
|
+
continue;
|
|
474
|
+
case '>=':
|
|
475
|
+
if (!v.greaterThanEqual(cv))
|
|
476
|
+
return false;
|
|
477
|
+
continue;
|
|
478
|
+
case '<':
|
|
479
|
+
if (!v.lessThan(cv))
|
|
480
|
+
return false;
|
|
481
|
+
continue;
|
|
482
|
+
case '<=':
|
|
483
|
+
if (!v.lessThanEqual(cv))
|
|
484
|
+
return false;
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
// they all passed, so it can only fail for having a prerelease
|
|
489
|
+
// if we allow prereleases, or saw a matching tuple, that's ok.
|
|
490
|
+
return prOK;
|
|
491
|
+
}
|
|
492
|
+
#getComparatorAny() {
|
|
493
|
+
return this.includePrerelease ? comparatorAnyPR : comparatorAny;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
const isAny = (c) => c === comparatorAny || c === comparatorAnyPR;
|
|
497
|
+
const comparatorAny = {
|
|
498
|
+
isAny: true,
|
|
499
|
+
toString: () => '*',
|
|
500
|
+
includePrerelease: false,
|
|
501
|
+
test: (v) => !v.prerelease?.length,
|
|
502
|
+
};
|
|
503
|
+
const comparatorAnyPR = {
|
|
504
|
+
isAny: true,
|
|
505
|
+
toString: () => '*',
|
|
506
|
+
includePrerelease: true,
|
|
507
|
+
test: (_) => true,
|
|
508
|
+
};
|
|
509
|
+
const comparatorNone = {
|
|
510
|
+
isNone: true,
|
|
511
|
+
toString: () => '<0.0.0-0',
|
|
512
|
+
includePrerelease: false,
|
|
513
|
+
test: (_) => false,
|
|
514
|
+
};
|
|
515
|
+
//# sourceMappingURL=comparator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparator.js","sourceRoot":"","sources":["../../src/comparator.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO: it might be faster to not have Version objects in the\n// comparator tuples, and instead just keep the parsed number arrays?\nimport { syntaxError } from '@vltpkg/error-cause'\nimport { fastSplit } from '@vltpkg/fast-split'\nimport { Version } from './version.js'\n\n/** all comparators are expressed in terms of these operators */\nexport type SimpleOperator = '' | '<' | '<=' | '>' | '>='\n/** operators that are expanded to simpler forms */\nexport type ComplexOperator = '^' | '~' | '~>'\n\nconst isOperator = (\n o?: string,\n): o is ComplexOperator | SimpleOperator =>\n !!o &&\n (o === '>' ||\n o === '<' ||\n o === '>=' ||\n o === '<=' ||\n o === '' ||\n o === '~' ||\n o === '^' ||\n o === '~>')\n\n/** comparator expressed as a [operator,version] tuple */\nexport type OVTuple = [SimpleOperator, Version]\n\nconst preJunk = new Set('=v \\t')\n\nconst invalidComp = (c: string, message: string): SyntaxError =>\n syntaxError(\n `invalid comparator: '${c}' ${message}`,\n { found: c },\n Comparator,\n )\n\nconst assertNumber = (value: string, c: string, field: string) => {\n const n = Number(value)\n if (n !== n) {\n throw invalidComp(\n c,\n `${field} must be numeric or 'x', got: '${value}'`,\n )\n }\n return n\n}\n\nconst assertVersion = (v: string, comp: string) => {\n if (!v) {\n throw invalidComp(comp, 'no value provided for operator')\n }\n}\n\nconst assertMissing = (\n value: string | undefined,\n c: string,\n field: string,\n) => {\n if (value && !isX(value)) {\n throw invalidComp(\n c,\n `cannot omit '${field}' and include subsequent fields`,\n )\n }\n}\n\nconst MAJOR = 0\nconst MINOR = 1\nconst PATCH = 2\n\nconst isX = (c?: string) => !c || c === 'X' || c === 'x' || c === '*'\n\n/**\n * The result of parsing a version value that might be either a full\n * version like `1.2.3` or an X-Range like `1.2.x`\n */\nexport type ParsedXRange =\n | ParsedXMajor\n | ParsedXMinor\n | ParsedXPatch\n | ParsedXVersion\n/**\n * a {@link ParsedXRange} that is just a `*`\n */\nexport type ParsedXMajor = []\n/**\n * a {@link ParsedXRange} that is just a major version\n */\nexport type ParsedXMinor = [number]\n/**\n * a {@link ParsedXRange} that is just a major and minor version\n */\nexport type ParsedXPatch = [number, number]\n/**\n * a {@link ParsedXRange} that is a full version\n */\nexport type ParsedXVersion = [\n M: number,\n m: number,\n p: number,\n pr?: string | undefined,\n b?: string | undefined,\n]\n\nconst isFullVersion = (\n parsed: ParsedXRange,\n): parsed is ParsedXVersion => undefined !== parsed[PATCH]\nconst isXPatch = (parsed: ParsedXRange): parsed is ParsedXPatch =>\n undefined !== parsed[MINOR] && undefined === parsed[PATCH]\nconst isXMinor = (parsed: ParsedXRange): parsed is ParsedXMinor =>\n undefined !== parsed[MAJOR] && undefined === parsed[MINOR]\nconst isXMajor = (parsed: ParsedXRange): parsed is ParsedXMajor =>\n undefined === parsed[MAJOR]\n\n/**\n * Class used to parse the `||` separated portions\n * of a range, and evaluate versions against it.\n *\n * This does most of the heavy lifting of range testing, and provides\n * little affordance for improperly formatted strings. It should be\n * considered an internal class, and usually not accessed directly.\n */\nexport class Comparator {\n /**\n * does this range include prereleases, even when they do not\n * match the tuple in the comparator?\n */\n includePrerelease: boolean\n /** raw string used to create this comparator */\n raw: string\n /** tokens extracted from the raw string input */\n tokens: string[]\n /**\n * Either the `any` comparator, the `none` comparator, or an operator\n * and a {@link ParsedXRange}\n */\n tuples: (Comparator | OVTuple)[] = []\n /** true if this comparator can not match anything */\n isNone = false\n /**\n * true if this comparator is a `'*'` type of range.\n *\n * Note that it still will not match versions with a prerelease value,\n * unless the tuple in the version matches the tuple provided to the\n * comparator, and the comparator version also has a prerelease value,\n * unless `includePrerelease` is set.\n */\n isAny = false\n\n /** the canonical strict simplified parsed form of this constructor */\n toString() {\n return (\n this.isNone ? '<0.0.0-0'\n : this.isAny ? '*'\n : /* c8 ignore next */\n this.tuples.map(c => (isAny(c) ? '*' : c.join(''))).join(' ')\n )\n }\n\n constructor(comp: string, includePrerelease = false) {\n this.includePrerelease = includePrerelease\n comp = comp.trim()\n this.raw = comp\n let hyphen = false\n const rawComps = fastSplit(comp, ' ', -1, (part, parts, i) => {\n if (part === '-') {\n if (hyphen) {\n throw invalidComp(\n comp,\n 'multiple hyphen ranges not allowed',\n )\n }\n if (parts.length !== 1 || i === -1) {\n throw invalidComp(\n comp,\n 'hyphen must be between two versions',\n )\n }\n hyphen = true\n } else if (hyphen && parts.length !== 2) {\n throw invalidComp(comp, 'hyphen range must be alone')\n }\n })\n\n // remove excess spaces, `> 1 2` => `>1 2`\n const comps: string[] = []\n let followingOperator = false\n\n let l = 0\n for (const c of rawComps) {\n if (c === '') continue\n if (!followingOperator) {\n followingOperator = isOperator(c)\n comps.push(c)\n l++\n continue\n }\n // we know this is not undefined since followingOperator guards that\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n comps[l - 1]! += c\n followingOperator = false\n }\n\n // TS mistakenly thinks hyphen is always false here\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (hyphen) {\n const [min, _, max] = comps\n /* c8 ignore start - defense in depth for TS, already guaranteed */\n if (!min || !max) {\n throw invalidComp(comp, 'hyphen must be between two versions')\n }\n /* c8 ignore stop */\n this.#parseHyphenRange(min, max)\n } else if (\n !comps.length ||\n (comps.length === 1 && isX(comps[0]))\n ) {\n this.tuples.push(this.#getComparatorAny())\n } else {\n for (const c of comps) {\n this.#parse(c)\n if (this.isNone) break\n }\n }\n this.tokens = comps\n this.isAny = true\n for (const c of this.tuples) {\n if (Array.isArray(c) || !c.isAny) {\n this.isAny = false\n break\n }\n }\n }\n\n // inclusive min\n #xInclusiveMin(raw: string): Comparator | OVTuple {\n const z = this.includePrerelease ? '0' : undefined\n const [M, m = 0, p = 0, pr = z, build] = this.#parseX(raw)\n return M === undefined ?\n this.#getComparatorAny()\n : ['>=', new Version(raw, M, m, p, pr, build)]\n }\n\n // exclusive min\n #xExclusiveMin(raw: string): Comparator | OVTuple {\n const parsed = this.#parseX(raw)\n if (isFullVersion(parsed)) {\n return ['>', new Version(raw, ...parsed)]\n }\n const z = this.includePrerelease ? '0' : undefined\n if (isXPatch(parsed)) {\n // >1.2 => >=1.3.0\n return [\n '>=',\n new Version(\n raw,\n parsed[MAJOR],\n parsed[MINOR] + 1,\n 0,\n z,\n undefined,\n ),\n ]\n }\n if (isXMinor(parsed)) {\n // >1 => >=2.0.0\n return [\n '>=',\n new Version(raw, parsed[MAJOR] + 1, 0, 0, z, undefined),\n ]\n }\n this.isNone = true\n this.tuples.length = 0\n return comparatorNone\n }\n\n #xInclusiveMax(raw: string): Comparator | OVTuple {\n const parsed = this.#parseX(raw)\n return (\n isFullVersion(parsed) ? ['<=', new Version(raw, ...parsed)]\n : isXPatch(parsed) ?\n [\n '<',\n new Version(\n raw,\n parsed[MAJOR],\n parsed[MINOR] + 1,\n 0,\n '0',\n undefined,\n ),\n ]\n : isXMinor(parsed) ?\n [\n '<',\n new Version(raw, parsed[MAJOR] + 1, 0, 0, '0', undefined),\n ]\n : this.#getComparatorAny()\n )\n }\n\n #xExclusiveMax(raw: string): Comparator | OVTuple {\n const z = this.includePrerelease ? '0' : undefined\n const [M = 0, m = 0, p = 0, pr = z, build] = this.#parseX(raw)\n if (M === 0 && m === 0 && p === 0 && pr === '0') {\n this.isNone = true\n this.tuples.length = 0\n return comparatorNone\n }\n return ['<', new Version(raw, M, m, p, pr, build)]\n }\n\n #validXM(raw: string, m?: string, p?: string): ParsedXMajor {\n assertMissing(m, raw, 'major')\n assertMissing(p, raw, 'major')\n if (m === '' || p === '') {\n throw invalidComp(raw, `(Did you mean '*'?)`)\n }\n return []\n }\n #validXm(\n raw: string,\n M: string,\n m?: string,\n p?: string,\n ): ParsedXMinor {\n assertMissing(p, raw, 'major')\n if (m === '' || p === '') {\n throw invalidComp(raw, `(Did you mean '${M}'?)`)\n }\n return [assertNumber(M, raw, 'major')]\n }\n #validXp(\n raw: string,\n M: string,\n m: string,\n p?: string,\n ): ParsedXPatch {\n if (p === '') {\n throw invalidComp(raw, `(Did you mean '${M}.${m}'?)`)\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n ]\n }\n #validTuple(\n raw: string,\n M: string,\n m: string,\n p: string,\n ): ParsedXVersion {\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(p, raw, 'patch'),\n ]\n }\n #validXbuild(\n raw: string,\n M: string,\n m: string,\n p: string,\n pl: number,\n ): ParsedXVersion {\n // build, no prerelease\n const patch = p.substring(0, pl)\n const build = p.substring(pl + 1)\n if (!patch) {\n throw invalidComp(raw, 'cannot specify build without patch')\n }\n if (!build) {\n throw invalidComp(raw, `encountered '+', but no build value`)\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(patch, raw, 'patch'),\n undefined,\n build,\n ]\n }\n\n #validXpr(\n raw: string,\n M: string,\n m: string,\n p: string,\n hy: number,\n ): ParsedXVersion {\n {\n // prerelease, no build\n const patch = p.substring(0, hy)\n const pr = p.substring(hy + 1)\n if (!patch) {\n throw invalidComp(\n raw,\n 'cannot specify prerelease without patch',\n )\n }\n if (!pr) {\n throw invalidComp(\n raw,\n `encountered '-', but no prerelease value`,\n )\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(patch, raw, 'patch'),\n pr,\n undefined,\n ]\n }\n }\n #validXprbuild(\n raw: string,\n M: string,\n m: string,\n p: string,\n hy: number,\n pl: number,\n ): ParsedXVersion {\n // both prerelease and build\n const patch = p.substring(0, hy)\n const pr = p.substring(hy + 1, pl)\n const build = p.substring(pl + 1)\n if (!patch) {\n throw invalidComp(\n raw,\n 'cannot specify prerelease without patch',\n )\n }\n if (!pr) {\n throw invalidComp(\n raw,\n `encountered '-', but no prerelease value`,\n )\n }\n if (!build) {\n throw invalidComp(raw, `encountered '+', but no build value`)\n }\n return [\n assertNumber(M, raw, 'major'),\n assertNumber(m, raw, 'minor'),\n assertNumber(patch, raw, 'patch'),\n pr,\n build,\n ]\n }\n\n // pull the relevant values out of an X-range or version\n // return the fields for creating a Version object.\n // only call once operator is stripped off\n #parseX(raw: string): ParsedXRange {\n let [M, m, p] = fastSplit(raw, '.', 3)\n let prune = 0\n while (M && preJunk.has(M.charAt(prune))) prune++\n if (M !== undefined && prune !== 0) M = M.substring(prune)\n // the `|| !M` is so TS knows we've handled undefined\n if (!M || isX(M)) return this.#validXM(raw, m, p)\n if (!m || isX(m)) return this.#validXm(raw, M, m, p)\n if (!p || isX(p)) return this.#validXp(raw, M, m, p)\n\n const hy = p.indexOf('-')\n const pl = p.indexOf('+')\n if (pl === -1 && hy === -1) return this.#validTuple(raw, M, m, p)\n if (pl === -1) return this.#validXpr(raw, M, m, p, hy)\n if (hy === -1) return this.#validXbuild(raw, M, m, p, pl)\n return this.#validXprbuild(raw, M, m, p, hy, pl)\n }\n\n #parseHyphenRange(min: string, max: string) {\n const minv = this.#xInclusiveMin(min)\n const maxv = this.#xInclusiveMax(max)\n const minAny = isAny(minv)\n const maxAny = isAny(maxv)\n if (minAny && maxAny) this.tuples.push(this.#getComparatorAny())\n else if (minAny) this.tuples.push(maxv)\n else if (maxAny) this.tuples.push(minv)\n else this.tuples.push(minv, maxv)\n }\n\n #parse(comp: string) {\n const first = comp.charAt(0)\n const first2 = comp.substring(0, 2)\n const v1 = comp.substring(1)\n const v2 = comp.substring(2)\n switch (first2) {\n case '~>':\n assertVersion(v2, comp)\n return this.#parseTilde(v2)\n case '>=':\n assertVersion(v2, comp)\n return this.tuples.push(this.#xInclusiveMin(v2))\n case '<=':\n assertVersion(v2, comp)\n return this.tuples.push(this.#xInclusiveMax(v2))\n }\n switch (first) {\n case '~':\n assertVersion(v1, comp)\n return this.#parseTilde(v1)\n case '^':\n assertVersion(v1, comp)\n return this.#parseCaret(v1)\n case '>':\n assertVersion(v1, comp)\n return this.tuples.push(this.#xExclusiveMin(v1))\n case '<':\n assertVersion(v1, comp)\n return this.tuples.push(this.#xExclusiveMax(v1))\n }\n return this.#parseEq(comp)\n }\n\n #parseTilde(comp: string) {\n const parsed = this.#parseX(comp)\n if (isXMajor(parsed)) {\n this.tuples.push(this.#getComparatorAny())\n return\n }\n const z = this.includePrerelease ? '0' : undefined\n if (isXMinor(parsed)) {\n const [M] = parsed\n this.tuples.push(\n ['>=', new Version(comp, M, 0, 0, z, undefined)],\n ['<', new Version(comp, M + 1, 0, 0, '0', undefined)],\n )\n return\n }\n if (isXPatch(parsed)) {\n const [M, m] = parsed\n const z = this.includePrerelease ? '0' : undefined\n this.tuples.push(\n ['>=', new Version(comp, M, m, 0, z, undefined)],\n ['<', new Version(comp, M, m + 1, 0, '0', undefined)],\n )\n return\n }\n const [M, m, p, pr = z, build] = parsed\n this.tuples.push(\n ['>=', new Version(comp, M, m, p, pr, build)],\n ['<', new Version(comp, M, m + 1, 0, '0', build)],\n )\n }\n\n #parseCaret(comp: string) {\n const min = this.#xInclusiveMin(comp)\n if (isAny(min)) {\n this.tuples.push(min)\n return\n }\n const minv = min[1]\n if (minv.major !== 0) {\n this.tuples.push(min, [\n '<',\n new Version(comp, minv.major + 1, 0, 0, '0', undefined),\n ])\n } else if (minv.minor !== 0) {\n this.tuples.push(min, [\n '<',\n new Version(\n comp,\n minv.major,\n minv.minor + 1,\n 0,\n '0',\n undefined,\n ),\n ])\n } else if (!minv.prerelease?.length) {\n this.tuples.push(['', minv])\n } else {\n this.tuples.push(min, [\n '<',\n new Version(\n comp,\n minv.major,\n minv.minor,\n minv.patch + 1,\n '0',\n undefined,\n ),\n ])\n }\n }\n\n #parseEq(comp: string) {\n const parsed = this.#parseX(comp)\n const z = this.includePrerelease ? '0' : undefined\n if (isFullVersion(parsed)) {\n this.tuples.push(['', new Version(comp, ...parsed)])\n } else if (isXMajor(parsed)) {\n this.tuples.push(this.#getComparatorAny())\n } else if (isXMinor(parsed)) {\n this.tuples.push([\n '>=',\n new Version(comp, parsed[MAJOR], 0, 0, z, undefined),\n ])\n this.tuples.push([\n '<',\n new Version(comp, parsed[MAJOR] + 1, 0, 0, '0', undefined),\n ])\n } else if (isXPatch(parsed)) {\n this.tuples.push(\n [\n '>=',\n new Version(\n comp,\n parsed[MAJOR],\n parsed[MINOR],\n 0,\n z,\n undefined,\n ),\n ],\n [\n '<',\n new Version(\n comp,\n parsed[MAJOR],\n parsed[MINOR] + 1,\n 0,\n '0',\n undefined,\n ),\n ],\n )\n }\n }\n\n /** return true if the version is a match for this comparator */\n test(v: Version) {\n if (this.isNone) return false\n const ip = this.includePrerelease\n const hasPR = !!v.prerelease?.length\n let prOK = ip || !hasPR\n for (const c of this.tuples) {\n if (isAny(c)) {\n continue\n }\n const [op, cv] = c\n prOK ||= !!cv.prerelease?.length && v.tupleEquals(cv)\n switch (op) {\n case '':\n if (!v.equals(cv)) return false\n continue\n case '>':\n if (!v.greaterThan(cv)) return false\n continue\n case '>=':\n if (!v.greaterThanEqual(cv)) return false\n continue\n case '<':\n if (!v.lessThan(cv)) return false\n continue\n case '<=':\n if (!v.lessThanEqual(cv)) return false\n continue\n }\n }\n // they all passed, so it can only fail for having a prerelease\n // if we allow prereleases, or saw a matching tuple, that's ok.\n return prOK\n }\n\n #getComparatorAny() {\n return this.includePrerelease ? comparatorAnyPR : comparatorAny\n }\n}\n\nconst isAny = (c: Comparator | OVTuple): c is Comparator =>\n c === comparatorAny || c === comparatorAnyPR\nconst comparatorAny = {\n isAny: true,\n toString: () => '*',\n includePrerelease: false,\n test: (v: Version) => !v.prerelease?.length,\n} as Comparator\nconst comparatorAnyPR = {\n isAny: true,\n toString: () => '*',\n includePrerelease: true,\n test: (_: Version) => true,\n} as Comparator\nconst comparatorNone = {\n isNone: true,\n toString: () => '<0.0.0-0',\n includePrerelease: false,\n test: (_: Version) => false,\n} as unknown as Comparator\n"]}
|