@gjsify/semver 0.3.12 → 0.3.14
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/lib/esm/index.js +355 -292
- package/package.json +3 -3
package/lib/esm/index.js
CHANGED
|
@@ -1,330 +1,393 @@
|
|
|
1
|
+
//#region src/index.ts
|
|
1
2
|
const NUM_RE = /^(0|[1-9]\d*)$/;
|
|
2
3
|
const SEMVER_RE = /^(\d+)\.(\d+)\.(\d+)(?:-((?:[0-9A-Za-z-]+)(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/;
|
|
3
4
|
function parse(version) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
try {
|
|
6
|
+
return new SemVer(version);
|
|
7
|
+
} catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
9
10
|
}
|
|
10
11
|
function valid(version) {
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
const v = parse(version);
|
|
13
|
+
return v ? v.version : null;
|
|
13
14
|
}
|
|
14
15
|
function compare(a, b) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const av = a instanceof SemVer ? a : new SemVer(a);
|
|
17
|
+
const bv = b instanceof SemVer ? b : new SemVer(b);
|
|
18
|
+
return av.compare(bv);
|
|
18
19
|
}
|
|
19
20
|
function satisfies(version, range) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
const r = range instanceof Range ? range : new Range(range);
|
|
22
|
+
const v = version instanceof SemVer ? version : parse(String(version));
|
|
23
|
+
if (!v) return false;
|
|
24
|
+
return r.test(v);
|
|
24
25
|
}
|
|
25
26
|
function maxSatisfying(versions, range) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
const r = range instanceof Range ? range : new Range(range);
|
|
28
|
+
let best = null;
|
|
29
|
+
for (const raw of versions) {
|
|
30
|
+
const v = parse(raw);
|
|
31
|
+
if (!v || !r.test(v)) continue;
|
|
32
|
+
if (best === null || v.compare(best) > 0) best = v;
|
|
33
|
+
}
|
|
34
|
+
return best ? best.version : null;
|
|
34
35
|
}
|
|
35
36
|
function minSatisfying(versions, range) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
const r = range instanceof Range ? range : new Range(range);
|
|
38
|
+
let best = null;
|
|
39
|
+
for (const raw of versions) {
|
|
40
|
+
const v = parse(raw);
|
|
41
|
+
if (!v || !r.test(v)) continue;
|
|
42
|
+
if (best === null || v.compare(best) < 0) best = v;
|
|
43
|
+
}
|
|
44
|
+
return best ? best.version : null;
|
|
44
45
|
}
|
|
45
46
|
function validRange(range) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
class SemVer {
|
|
53
|
-
major;
|
|
54
|
-
minor;
|
|
55
|
-
patch;
|
|
56
|
-
prerelease;
|
|
57
|
-
build;
|
|
58
|
-
version;
|
|
59
|
-
constructor(version) {
|
|
60
|
-
const trimmed = String(version).trim().replace(/^v/, "");
|
|
61
|
-
const m = SEMVER_RE.exec(trimmed);
|
|
62
|
-
if (!m) throw new TypeError(`Invalid Version: ${version}`);
|
|
63
|
-
this.major = Number(m[1]);
|
|
64
|
-
this.minor = Number(m[2]);
|
|
65
|
-
this.patch = Number(m[3]);
|
|
66
|
-
this.prerelease = m[4] ? m[4].split(".").map((id) => NUM_RE.test(id) ? Number(id) : id) : [];
|
|
67
|
-
this.build = m[5] ? m[5].split(".") : [];
|
|
68
|
-
this.version = `${this.major}.${this.minor}.${this.patch}` + (this.prerelease.length ? `-${this.prerelease.join(".")}` : "") + (this.build.length ? `+${this.build.join(".")}` : "");
|
|
69
|
-
}
|
|
70
|
-
compare(other) {
|
|
71
|
-
if (this.major !== other.major) return this.major < other.major ? -1 : 1;
|
|
72
|
-
if (this.minor !== other.minor) return this.minor < other.minor ? -1 : 1;
|
|
73
|
-
if (this.patch !== other.patch) return this.patch < other.patch ? -1 : 1;
|
|
74
|
-
return this.comparePre(other);
|
|
75
|
-
}
|
|
76
|
-
comparePre(other) {
|
|
77
|
-
const a = this.prerelease;
|
|
78
|
-
const b = other.prerelease;
|
|
79
|
-
if (a.length === 0 && b.length === 0) return 0;
|
|
80
|
-
if (a.length === 0) return 1;
|
|
81
|
-
if (b.length === 0) return -1;
|
|
82
|
-
for (let i = 0; ; i++) {
|
|
83
|
-
const x = a[i];
|
|
84
|
-
const y = b[i];
|
|
85
|
-
if (x === void 0 && y === void 0) return 0;
|
|
86
|
-
if (y === void 0) return 1;
|
|
87
|
-
if (x === void 0) return -1;
|
|
88
|
-
if (x === y) continue;
|
|
89
|
-
const xn = typeof x === "number";
|
|
90
|
-
const yn = typeof y === "number";
|
|
91
|
-
if (xn && !yn) return -1;
|
|
92
|
-
if (!xn && yn) return 1;
|
|
93
|
-
return x < y ? -1 : 1;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
toString() {
|
|
97
|
-
return this.version;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
class Range {
|
|
101
|
-
raw;
|
|
102
|
-
set;
|
|
103
|
-
constructor(range) {
|
|
104
|
-
if (range instanceof Range) {
|
|
105
|
-
this.raw = range.raw;
|
|
106
|
-
this.set = range.set;
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
this.raw = String(range).trim();
|
|
110
|
-
const sets = this.raw.split(/\s*\|\|\s*/);
|
|
111
|
-
const parsed = [];
|
|
112
|
-
for (const part of sets) {
|
|
113
|
-
const c = parseRangePart(part);
|
|
114
|
-
if (c.length === 0) {
|
|
115
|
-
throw new TypeError(`Invalid range: ${this.raw}`);
|
|
116
|
-
}
|
|
117
|
-
parsed.push(c);
|
|
118
|
-
}
|
|
119
|
-
if (parsed.length === 0) {
|
|
120
|
-
throw new TypeError(`Invalid range: ${this.raw}`);
|
|
121
|
-
}
|
|
122
|
-
this.set = parsed;
|
|
123
|
-
}
|
|
124
|
-
test(version) {
|
|
125
|
-
const v = version instanceof SemVer ? version : parse(String(version));
|
|
126
|
-
if (!v) return false;
|
|
127
|
-
for (const conj of this.set) {
|
|
128
|
-
if (conj.every((c) => testComparator(c, v))) {
|
|
129
|
-
if (v.prerelease.length > 0) {
|
|
130
|
-
const allowed = conj.some(
|
|
131
|
-
(c) => c.semver !== null && c.semver.prerelease.length > 0 && c.semver.major === v.major && c.semver.minor === v.minor && c.semver.patch === v.patch
|
|
132
|
-
);
|
|
133
|
-
if (!allowed) continue;
|
|
134
|
-
}
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
format() {
|
|
141
|
-
return this.set.map((c) => c.map(formatComparator).join(" ")).join(" || ");
|
|
142
|
-
}
|
|
143
|
-
toString() {
|
|
144
|
-
return this.format();
|
|
145
|
-
}
|
|
47
|
+
try {
|
|
48
|
+
return new Range(range).format();
|
|
49
|
+
} catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
146
52
|
}
|
|
53
|
+
var SemVer = class {
|
|
54
|
+
major;
|
|
55
|
+
minor;
|
|
56
|
+
patch;
|
|
57
|
+
prerelease;
|
|
58
|
+
build;
|
|
59
|
+
version;
|
|
60
|
+
constructor(version) {
|
|
61
|
+
const trimmed = String(version).trim().replace(/^v/, "");
|
|
62
|
+
const m = SEMVER_RE.exec(trimmed);
|
|
63
|
+
if (!m) throw new TypeError(`Invalid Version: ${version}`);
|
|
64
|
+
this.major = Number(m[1]);
|
|
65
|
+
this.minor = Number(m[2]);
|
|
66
|
+
this.patch = Number(m[3]);
|
|
67
|
+
this.prerelease = m[4] ? m[4].split(".").map((id) => NUM_RE.test(id) ? Number(id) : id) : [];
|
|
68
|
+
this.build = m[5] ? m[5].split(".") : [];
|
|
69
|
+
this.version = `${this.major}.${this.minor}.${this.patch}` + (this.prerelease.length ? `-${this.prerelease.join(".")}` : "") + (this.build.length ? `+${this.build.join(".")}` : "");
|
|
70
|
+
}
|
|
71
|
+
compare(other) {
|
|
72
|
+
if (this.major !== other.major) return this.major < other.major ? -1 : 1;
|
|
73
|
+
if (this.minor !== other.minor) return this.minor < other.minor ? -1 : 1;
|
|
74
|
+
if (this.patch !== other.patch) return this.patch < other.patch ? -1 : 1;
|
|
75
|
+
return this.comparePre(other);
|
|
76
|
+
}
|
|
77
|
+
comparePre(other) {
|
|
78
|
+
const a = this.prerelease;
|
|
79
|
+
const b = other.prerelease;
|
|
80
|
+
if (a.length === 0 && b.length === 0) return 0;
|
|
81
|
+
if (a.length === 0) return 1;
|
|
82
|
+
if (b.length === 0) return -1;
|
|
83
|
+
for (let i = 0;; i++) {
|
|
84
|
+
const x = a[i];
|
|
85
|
+
const y = b[i];
|
|
86
|
+
if (x === undefined && y === undefined) return 0;
|
|
87
|
+
if (y === undefined) return 1;
|
|
88
|
+
if (x === undefined) return -1;
|
|
89
|
+
if (x === y) continue;
|
|
90
|
+
const xn = typeof x === "number";
|
|
91
|
+
const yn = typeof y === "number";
|
|
92
|
+
if (xn && !yn) return -1;
|
|
93
|
+
if (!xn && yn) return 1;
|
|
94
|
+
return x < y ? -1 : 1;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
toString() {
|
|
98
|
+
return this.version;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
var Range = class Range {
|
|
102
|
+
raw;
|
|
103
|
+
set;
|
|
104
|
+
constructor(range) {
|
|
105
|
+
if (range instanceof Range) {
|
|
106
|
+
this.raw = range.raw;
|
|
107
|
+
this.set = range.set;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
this.raw = String(range).trim();
|
|
111
|
+
const sets = this.raw.split(/\s*\|\|\s*/);
|
|
112
|
+
const parsed = [];
|
|
113
|
+
for (const part of sets) {
|
|
114
|
+
const c = parseRangePart(part);
|
|
115
|
+
if (c.length === 0) {
|
|
116
|
+
throw new TypeError(`Invalid range: ${this.raw}`);
|
|
117
|
+
}
|
|
118
|
+
parsed.push(c);
|
|
119
|
+
}
|
|
120
|
+
if (parsed.length === 0) {
|
|
121
|
+
throw new TypeError(`Invalid range: ${this.raw}`);
|
|
122
|
+
}
|
|
123
|
+
this.set = parsed;
|
|
124
|
+
}
|
|
125
|
+
test(version) {
|
|
126
|
+
const v = version instanceof SemVer ? version : parse(String(version));
|
|
127
|
+
if (!v) return false;
|
|
128
|
+
for (const conj of this.set) {
|
|
129
|
+
if (conj.every((c) => testComparator(c, v))) {
|
|
130
|
+
if (v.prerelease.length > 0) {
|
|
131
|
+
const allowed = conj.some((c) => c.semver !== null && c.semver.prerelease.length > 0 && c.semver.major === v.major && c.semver.minor === v.minor && c.semver.patch === v.patch);
|
|
132
|
+
if (!allowed) continue;
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
format() {
|
|
140
|
+
return this.set.map((c) => c.map(formatComparator).join(" ")).join(" || ");
|
|
141
|
+
}
|
|
142
|
+
toString() {
|
|
143
|
+
return this.format();
|
|
144
|
+
}
|
|
145
|
+
};
|
|
147
146
|
function testComparator(c, v) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
case ">":
|
|
159
|
-
return cmp > 0;
|
|
160
|
-
case ">=":
|
|
161
|
-
return cmp >= 0;
|
|
162
|
-
}
|
|
147
|
+
if (c.semver === null) return true;
|
|
148
|
+
const cmp = v.compare(c.semver);
|
|
149
|
+
switch (c.operator) {
|
|
150
|
+
case "":
|
|
151
|
+
case "=": return cmp === 0;
|
|
152
|
+
case "<": return cmp < 0;
|
|
153
|
+
case "<=": return cmp <= 0;
|
|
154
|
+
case ">": return cmp > 0;
|
|
155
|
+
case ">=": return cmp >= 0;
|
|
156
|
+
}
|
|
163
157
|
}
|
|
164
158
|
function formatComparator(c) {
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
if (c.semver === null) return "*";
|
|
160
|
+
return `${c.operator}${c.semver.version}`;
|
|
167
161
|
}
|
|
168
162
|
function parseRangePart(part) {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
163
|
+
const trimmed = part.trim();
|
|
164
|
+
if (trimmed === "" || trimmed === "*" || trimmed.toLowerCase() === "latest") {
|
|
165
|
+
return [{
|
|
166
|
+
operator: ">=",
|
|
167
|
+
semver: new SemVer("0.0.0")
|
|
168
|
+
}];
|
|
169
|
+
}
|
|
170
|
+
const hyphen = trimmed.match(/^\s*(\S+)\s+-\s+(\S+)\s*$/);
|
|
171
|
+
if (hyphen) return hyphenRange(hyphen[1], hyphen[2]);
|
|
172
|
+
const tokens = trimmed.split(/\s+/);
|
|
173
|
+
const out = [];
|
|
174
|
+
for (const tok of tokens) out.push(...parseSimple(tok));
|
|
175
|
+
return out;
|
|
179
176
|
}
|
|
180
177
|
function parseSimple(tok) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
178
|
+
if (tok === "*" || tok === "" || tok.toLowerCase() === "latest") {
|
|
179
|
+
return [{
|
|
180
|
+
operator: ">=",
|
|
181
|
+
semver: new SemVer("0.0.0")
|
|
182
|
+
}];
|
|
183
|
+
}
|
|
184
|
+
if (tok.startsWith("^")) return caretRange(tok.slice(1));
|
|
185
|
+
if (tok.startsWith("~")) return tildeRange(tok.slice(1).replace(/^>/, ""));
|
|
186
|
+
const opMatch = tok.match(/^(<=|>=|<|>|=)\s*(.+)$/);
|
|
187
|
+
if (opMatch) {
|
|
188
|
+
const op = opMatch[1];
|
|
189
|
+
return primitiveRange(op, opMatch[2]);
|
|
190
|
+
}
|
|
191
|
+
return partialRange(tok);
|
|
192
192
|
}
|
|
193
193
|
function parsePartial(s) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
194
|
+
const trimmed = s.trim().replace(/^v/, "");
|
|
195
|
+
if (trimmed === "" || trimmed === "*") {
|
|
196
|
+
return {
|
|
197
|
+
major: null,
|
|
198
|
+
minor: null,
|
|
199
|
+
patch: null,
|
|
200
|
+
pre: "",
|
|
201
|
+
build: ""
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
let pre = "";
|
|
205
|
+
let build = "";
|
|
206
|
+
let core = trimmed;
|
|
207
|
+
const plus = core.indexOf("+");
|
|
208
|
+
if (plus >= 0) {
|
|
209
|
+
build = core.slice(plus + 1);
|
|
210
|
+
core = core.slice(0, plus);
|
|
211
|
+
}
|
|
212
|
+
const dash = core.indexOf("-");
|
|
213
|
+
if (dash >= 0) {
|
|
214
|
+
pre = core.slice(dash + 1);
|
|
215
|
+
core = core.slice(0, dash);
|
|
216
|
+
}
|
|
217
|
+
const parts = core.split(".");
|
|
218
|
+
const xr = (part) => {
|
|
219
|
+
if (part === undefined || part === "") return null;
|
|
220
|
+
if (part === "x" || part === "X" || part === "*") return null;
|
|
221
|
+
if (!/^\d+$/.test(part)) {
|
|
222
|
+
throw new TypeError(`Invalid partial version: ${s}`);
|
|
223
|
+
}
|
|
224
|
+
return Number(part);
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
major: xr(parts[0]),
|
|
228
|
+
minor: xr(parts[1]),
|
|
229
|
+
patch: xr(parts[2]),
|
|
230
|
+
pre,
|
|
231
|
+
build
|
|
232
|
+
};
|
|
227
233
|
}
|
|
228
234
|
function partialToVersion(p) {
|
|
229
|
-
|
|
235
|
+
return `${p.major ?? 0}.${p.minor ?? 0}.${p.patch ?? 0}${p.pre ? `-${p.pre}` : ""}${p.build ? `+${p.build}` : ""}`;
|
|
230
236
|
}
|
|
231
237
|
function partialRange(tok) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
238
|
+
const p = parsePartial(tok);
|
|
239
|
+
if (p.major === null) return [{
|
|
240
|
+
operator: ">=",
|
|
241
|
+
semver: new SemVer("0.0.0")
|
|
242
|
+
}];
|
|
243
|
+
if (p.minor === null) {
|
|
244
|
+
return [{
|
|
245
|
+
operator: ">=",
|
|
246
|
+
semver: new SemVer(`${p.major}.0.0`)
|
|
247
|
+
}, {
|
|
248
|
+
operator: "<",
|
|
249
|
+
semver: new SemVer(`${p.major + 1}.0.0`)
|
|
250
|
+
}];
|
|
251
|
+
}
|
|
252
|
+
if (p.patch === null) {
|
|
253
|
+
return [{
|
|
254
|
+
operator: ">=",
|
|
255
|
+
semver: new SemVer(`${p.major}.${p.minor}.0`)
|
|
256
|
+
}, {
|
|
257
|
+
operator: "<",
|
|
258
|
+
semver: new SemVer(`${p.major}.${p.minor + 1}.0`)
|
|
259
|
+
}];
|
|
260
|
+
}
|
|
261
|
+
return [{
|
|
262
|
+
operator: "=",
|
|
263
|
+
semver: new SemVer(partialToVersion(p))
|
|
264
|
+
}];
|
|
247
265
|
}
|
|
248
266
|
function caretRange(tok) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
267
|
+
const p = parsePartial(tok);
|
|
268
|
+
if (p.major === null) return [{
|
|
269
|
+
operator: ">=",
|
|
270
|
+
semver: new SemVer("0.0.0")
|
|
271
|
+
}];
|
|
272
|
+
const lower = `${p.major}.${p.minor ?? 0}.${p.patch ?? 0}${p.pre ? `-${p.pre}` : ""}`;
|
|
273
|
+
let upper;
|
|
274
|
+
if (p.major > 0 || p.minor === null) {
|
|
275
|
+
upper = `${p.major + 1}.0.0`;
|
|
276
|
+
} else if (p.minor > 0 || p.patch === null) {
|
|
277
|
+
upper = `0.${p.minor + 1}.0`;
|
|
278
|
+
} else {
|
|
279
|
+
upper = `0.0.${p.patch + 1}`;
|
|
280
|
+
}
|
|
281
|
+
return [{
|
|
282
|
+
operator: ">=",
|
|
283
|
+
semver: new SemVer(lower)
|
|
284
|
+
}, {
|
|
285
|
+
operator: "<",
|
|
286
|
+
semver: new SemVer(upper)
|
|
287
|
+
}];
|
|
264
288
|
}
|
|
265
289
|
function tildeRange(tok) {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
290
|
+
const p = parsePartial(tok);
|
|
291
|
+
if (p.major === null) return [{
|
|
292
|
+
operator: ">=",
|
|
293
|
+
semver: new SemVer("0.0.0")
|
|
294
|
+
}];
|
|
295
|
+
const lower = `${p.major}.${p.minor ?? 0}.${p.patch ?? 0}${p.pre ? `-${p.pre}` : ""}`;
|
|
296
|
+
const upper = p.minor === null ? `${p.major + 1}.0.0` : `${p.major}.${p.minor + 1}.0`;
|
|
297
|
+
return [{
|
|
298
|
+
operator: ">=",
|
|
299
|
+
semver: new SemVer(lower)
|
|
300
|
+
}, {
|
|
301
|
+
operator: "<",
|
|
302
|
+
semver: new SemVer(upper)
|
|
303
|
+
}];
|
|
274
304
|
}
|
|
275
305
|
function primitiveRange(op, rhs) {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
306
|
+
const p = parsePartial(rhs);
|
|
307
|
+
if (p.major === null) return [{
|
|
308
|
+
operator: ">=",
|
|
309
|
+
semver: new SemVer("0.0.0")
|
|
310
|
+
}];
|
|
311
|
+
if (op === "=" || op === "") return partialRange(rhs);
|
|
312
|
+
if (op === ">") {
|
|
313
|
+
if (p.minor === null) return [{
|
|
314
|
+
operator: ">=",
|
|
315
|
+
semver: new SemVer(`${p.major + 1}.0.0`)
|
|
316
|
+
}];
|
|
317
|
+
if (p.patch === null) return [{
|
|
318
|
+
operator: ">=",
|
|
319
|
+
semver: new SemVer(`${p.major}.${p.minor + 1}.0`)
|
|
320
|
+
}];
|
|
321
|
+
return [{
|
|
322
|
+
operator: ">",
|
|
323
|
+
semver: new SemVer(partialToVersion(p))
|
|
324
|
+
}];
|
|
325
|
+
}
|
|
326
|
+
if (op === "<") {
|
|
327
|
+
if (p.minor === null) return [{
|
|
328
|
+
operator: "<",
|
|
329
|
+
semver: new SemVer(`${p.major}.0.0`)
|
|
330
|
+
}];
|
|
331
|
+
if (p.patch === null) return [{
|
|
332
|
+
operator: "<",
|
|
333
|
+
semver: new SemVer(`${p.major}.${p.minor}.0`)
|
|
334
|
+
}];
|
|
335
|
+
return [{
|
|
336
|
+
operator: "<",
|
|
337
|
+
semver: new SemVer(partialToVersion(p))
|
|
338
|
+
}];
|
|
339
|
+
}
|
|
340
|
+
if (op === ">=") return [{
|
|
341
|
+
operator: ">=",
|
|
342
|
+
semver: new SemVer(partialToVersion(p))
|
|
343
|
+
}];
|
|
344
|
+
if (p.minor === null) return [{
|
|
345
|
+
operator: "<",
|
|
346
|
+
semver: new SemVer(`${p.major + 1}.0.0`)
|
|
347
|
+
}];
|
|
348
|
+
if (p.patch === null) return [{
|
|
349
|
+
operator: "<",
|
|
350
|
+
semver: new SemVer(`${p.major}.${p.minor + 1}.0`)
|
|
351
|
+
}];
|
|
352
|
+
return [{
|
|
353
|
+
operator: "<=",
|
|
354
|
+
semver: new SemVer(partialToVersion(p))
|
|
355
|
+
}];
|
|
293
356
|
}
|
|
294
357
|
function hyphenRange(left, right) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
358
|
+
const a = parsePartial(left);
|
|
359
|
+
const b = parsePartial(right);
|
|
360
|
+
const lower = a.major === null ? {
|
|
361
|
+
operator: ">=",
|
|
362
|
+
semver: new SemVer("0.0.0")
|
|
363
|
+
} : {
|
|
364
|
+
operator: ">=",
|
|
365
|
+
semver: new SemVer(`${a.major}.${a.minor ?? 0}.${a.patch ?? 0}${a.pre ? `-${a.pre}` : ""}`)
|
|
366
|
+
};
|
|
367
|
+
let upper;
|
|
368
|
+
if (b.major === null) {
|
|
369
|
+
upper = {
|
|
370
|
+
operator: ">=",
|
|
371
|
+
semver: new SemVer("0.0.0")
|
|
372
|
+
};
|
|
373
|
+
} else if (b.minor === null) {
|
|
374
|
+
upper = {
|
|
375
|
+
operator: "<",
|
|
376
|
+
semver: new SemVer(`${b.major + 1}.0.0`)
|
|
377
|
+
};
|
|
378
|
+
} else if (b.patch === null) {
|
|
379
|
+
upper = {
|
|
380
|
+
operator: "<",
|
|
381
|
+
semver: new SemVer(`${b.major}.${b.minor + 1}.0`)
|
|
382
|
+
};
|
|
383
|
+
} else {
|
|
384
|
+
upper = {
|
|
385
|
+
operator: "<=",
|
|
386
|
+
semver: new SemVer(`${b.major}.${b.minor}.${b.patch}${b.pre ? `-${b.pre}` : ""}`)
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
return [lower, upper];
|
|
319
390
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
compare,
|
|
324
|
-
maxSatisfying,
|
|
325
|
-
minSatisfying,
|
|
326
|
-
parse,
|
|
327
|
-
satisfies,
|
|
328
|
-
valid,
|
|
329
|
-
validRange
|
|
330
|
-
};
|
|
391
|
+
|
|
392
|
+
//#endregion
|
|
393
|
+
export { Range, SemVer, compare, maxSatisfying, minSatisfying, parse, satisfies, valid, validRange };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gjsify/semver",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.14",
|
|
4
4
|
"description": "Subset of node-semver for the gjsify install backend — cross-platform Node + GJS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "lib/esm/index.js",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
],
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@gjsify/cli": "^0.3.
|
|
37
|
-
"@gjsify/unit": "^0.3.
|
|
36
|
+
"@gjsify/cli": "^0.3.14",
|
|
37
|
+
"@gjsify/unit": "^0.3.14",
|
|
38
38
|
"typescript": "^6.0.3"
|
|
39
39
|
}
|
|
40
40
|
}
|