@lionad/safe-npx 0.2.2 → 0.3.0

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.
Files changed (4) hide show
  1. package/README.md +113 -35
  2. package/dist/index.js +1899 -0
  3. package/package.json +14 -4
  4. package/snpx.js +0 -427
package/dist/index.js ADDED
@@ -0,0 +1,1899 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "child_process";
3
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
4
+ import { dirname, join } from "path";
5
+ import { fileURLToPath } from "url";
6
+ import { homedir } from "os";
7
+ //#region \0rolldown/runtime.js
8
+ var __create = Object.create;
9
+ var __defProp = Object.defineProperty;
10
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
11
+ var __getOwnPropNames = Object.getOwnPropertyNames;
12
+ var __getProtoOf = Object.getPrototypeOf;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
15
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
16
+ var __exportAll = (all, no_symbols) => {
17
+ let target = {};
18
+ for (var name in all) __defProp(target, name, {
19
+ get: all[name],
20
+ enumerable: true
21
+ });
22
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
23
+ return target;
24
+ };
25
+ var __copyProps = (to, from, except, desc) => {
26
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
27
+ key = keys[i];
28
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
29
+ get: ((k) => from[k]).bind(null, key),
30
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
31
+ });
32
+ }
33
+ return to;
34
+ };
35
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
36
+ value: mod,
37
+ enumerable: true
38
+ }) : target, mod));
39
+ //#endregion
40
+ //#region src/constants.ts
41
+ var constants_exports = /* @__PURE__ */ __exportAll({
42
+ CACHE_DIR: () => CACHE_DIR,
43
+ DEFAULT_FALLBACK_STRATEGY: () => DEFAULT_FALLBACK_STRATEGY,
44
+ DEFAULT_TIME_HOURS: () => 24,
45
+ HELP_TEXT: () => HELP_TEXT,
46
+ MS_PER_HOUR: () => MS_PER_HOUR,
47
+ NPX_PREFIX_FLAGS: () => NPX_PREFIX_FLAGS,
48
+ NPX_PREFIX_FLAGS_WITH_VALUE: () => NPX_PREFIX_FLAGS_WITH_VALUE,
49
+ PKG_NAME: () => PKG_NAME,
50
+ REGISTRY: () => REGISTRY,
51
+ VERSION: () => VERSION,
52
+ colors: () => colors,
53
+ isTty: () => isTty
54
+ });
55
+ var __dirname, VERSION, CACHE_DIR, REGISTRY, PKG_NAME, DEFAULT_TIME_HOURS, DEFAULT_FALLBACK_STRATEGY, MS_PER_HOUR, isTty, colors, HELP_TEXT, NPX_PREFIX_FLAGS, NPX_PREFIX_FLAGS_WITH_VALUE;
56
+ var init_constants = __esmMin((() => {
57
+ __dirname = dirname(fileURLToPath(import.meta.url));
58
+ try {
59
+ VERSION = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf8")).version;
60
+ } catch {
61
+ VERSION = "0.2.3";
62
+ }
63
+ CACHE_DIR = join(homedir(), ".cache", "snpx");
64
+ REGISTRY = "https://registry.npmjs.org";
65
+ PKG_NAME = "@lionad/safe-npx";
66
+ DEFAULT_TIME_HOURS = 24;
67
+ DEFAULT_FALLBACK_STRATEGY = "patch,minor,major";
68
+ MS_PER_HOUR = 3600 * 1e3;
69
+ isTty = process.stdout.isTTY && !process.env.NO_COLOR;
70
+ colors = {
71
+ bold: (s) => isTty ? `\x1b[1m${s}\x1b[22m` : s,
72
+ dim: (s) => isTty ? `\x1b[2m${s}\x1b[22m` : s,
73
+ green: (s) => isTty ? `\x1b[32m${s}\x1b[39m` : s,
74
+ cyan: (s) => isTty ? `\x1b[36m${s}\x1b[39m` : s,
75
+ yellow: (s) => isTty ? `\x1b[33m${s}\x1b[39m` : s
76
+ };
77
+ HELP_TEXT = `
78
+ ${colors.bold(colors.cyan("safe-npx (snpx)"))} — Safe npx wrapper with configurable fallback strategy
79
+
80
+ ${colors.bold("Usage:")}
81
+ ${colors.green("snpx")} [options] <package>@latest [args...]
82
+ ${colors.green("snpx")} [options] <package> [args...]
83
+ ${colors.green("snpx")} [options] <command>
84
+
85
+ ${colors.bold("Options:")}
86
+ ${colors.yellow("-h, --help")} Show this help message
87
+ ${colors.yellow("--time")} ${colors.dim("<hours>")} Safety window in hours (default: 24)
88
+ ${colors.yellow("--fallback-strategy")} ${colors.dim("<str>")} Comma-separated fallback order.
89
+ Default: patch,minor,major
90
+ Left-to-right: first matching safe version wins.
91
+ ${colors.dim("patch")} = version immediately before latest
92
+ ${colors.dim("minor")} = most recently published version of previous minor line
93
+ ${colors.dim("major")} = most recently published version of previous major line
94
+ ${colors.yellow("--show-version")} Print resolved version and exit (no execution)
95
+ ${colors.yellow("--version")} Print snpx version and exit
96
+ ${colors.yellow("--self-update")} Check for snpx updates (safe mode, default 24h)
97
+ ${colors.yellow("--unsafe-self-update")} Allow immediate snpx updates without safety window
98
+
99
+ ${colors.bold("Environment Variables:")}
100
+ ${colors.green("SNPX_TIME")} Default for --time
101
+ ${colors.green("SNPX_FALLBACK_STRATEGY")} Default for --fallback-strategy
102
+
103
+ ${colors.bold("Examples:")}
104
+ ${colors.green("snpx")} -y cowsay@latest "Hello World"
105
+ ${colors.green("snpx")} --time 48 --fallback-strategy patch,minor cowsay@latest
106
+ ${colors.green("snpx")} --show-version cowsay@latest
107
+ ${colors.green("snpx")} cowsay@latest --version ${colors.dim("# passes --version to cowsay")}
108
+ `.trim();
109
+ NPX_PREFIX_FLAGS = new Set([
110
+ "-y",
111
+ "--yes",
112
+ "--no",
113
+ "--no-save",
114
+ "--legacy-peer-deps",
115
+ "--force",
116
+ "--call",
117
+ "-c",
118
+ "--offline",
119
+ "--prefer-offline",
120
+ "--prefer-online",
121
+ "--workspaces",
122
+ "--ws",
123
+ "--include-workspace-root",
124
+ "--silent",
125
+ "--quiet",
126
+ "-q"
127
+ ]);
128
+ NPX_PREFIX_FLAGS_WITH_VALUE = new Set([
129
+ "-p",
130
+ "--package",
131
+ "-w",
132
+ "--workspace",
133
+ "--script-shell",
134
+ "--loglevel",
135
+ "--registry"
136
+ ]);
137
+ }));
138
+ //#endregion
139
+ //#region src/cli.ts
140
+ init_constants();
141
+ /**
142
+ * Extract package name from spec.
143
+ * @example 'cowsay@1.5.0' → 'cowsay'
144
+ * @example '@vue/cli@latest' → '@vue/cli'
145
+ */
146
+ function extractPackageName(pkgSpec) {
147
+ if (!pkgSpec) return null;
148
+ if (pkgSpec.startsWith("@")) {
149
+ const secondAt = pkgSpec.indexOf("@", 1);
150
+ return secondAt === -1 ? pkgSpec : pkgSpec.slice(0, secondAt);
151
+ }
152
+ const atIndex = pkgSpec.indexOf("@");
153
+ return atIndex === -1 ? pkgSpec : pkgSpec.slice(0, atIndex);
154
+ }
155
+ /**
156
+ * Parse CLI arguments using two-phase parsing:
157
+ *
158
+ * Phase 1 (before package): Only snpx flags accepted.
159
+ * Unknown --flags → error. Single-dash flags (-y) → npx passthrough.
160
+ * Phase 2 (after package): Everything is passthrough to the executed tool.
161
+ *
162
+ * snpx [snpx-flags] [--] <package> [tool-args...]
163
+ * snpx [snpx-flags] (--help, --self-update, etc.)
164
+ */
165
+ function parseArgs(argv) {
166
+ const args = argv.slice(2);
167
+ const snpxFlags = {
168
+ help: false,
169
+ version: false,
170
+ showVersion: false,
171
+ selfUpdate: false,
172
+ unsafeSelfUpdate: false,
173
+ time: null,
174
+ fallbackStrategy: null
175
+ };
176
+ let pkgSpec = null;
177
+ let pkgName = null;
178
+ const npxPrefixArgs = [];
179
+ const restArgs = [];
180
+ let foundPackage = false;
181
+ let endOfOptions = false;
182
+ for (let i = 0; i < args.length; i++) {
183
+ const arg = args[i];
184
+ if (foundPackage) {
185
+ restArgs.push(arg);
186
+ continue;
187
+ }
188
+ if (arg === "--" && !endOfOptions) {
189
+ endOfOptions = true;
190
+ continue;
191
+ }
192
+ if (endOfOptions) {
193
+ pkgSpec = arg;
194
+ pkgName = extractPackageName(arg);
195
+ foundPackage = true;
196
+ continue;
197
+ }
198
+ if (arg === "-h" || arg === "--help") snpxFlags.help = true;
199
+ else if (arg === "--version") snpxFlags.version = true;
200
+ else if (arg === "--show-version") snpxFlags.showVersion = true;
201
+ else if (arg === "--self-update") snpxFlags.selfUpdate = true;
202
+ else if (arg === "--unsafe-self-update") snpxFlags.unsafeSelfUpdate = true;
203
+ else if (arg === "--time") {
204
+ if (i + 1 >= args.length) throw new Error("Missing value for --time");
205
+ snpxFlags.time = args[++i];
206
+ } else if (arg.startsWith("--time=")) snpxFlags.time = arg.slice(7);
207
+ else if (arg === "--fallback-strategy") {
208
+ if (i + 1 >= args.length) throw new Error("Missing value for --fallback-strategy");
209
+ snpxFlags.fallbackStrategy = args[++i];
210
+ } else if (arg.startsWith("--fallback-strategy=")) snpxFlags.fallbackStrategy = arg.slice(20);
211
+ else if (NPX_PREFIX_FLAGS.has(arg)) npxPrefixArgs.push(arg);
212
+ else if (NPX_PREFIX_FLAGS_WITH_VALUE.has(arg)) {
213
+ if (i + 1 >= args.length) throw new Error(`Missing value for ${arg}`);
214
+ npxPrefixArgs.push(arg, args[++i]);
215
+ } else if (arg.startsWith("--package=") || arg.startsWith("--workspace=") || arg.startsWith("--loglevel=") || arg.startsWith("--registry=") || arg.startsWith("--script-shell=")) npxPrefixArgs.push(arg);
216
+ else if (arg.startsWith("--")) throw new Error(`Unknown flag: ${arg}. Run 'snpx --help' for available options.`);
217
+ else if (arg.startsWith("-")) if (NPX_PREFIX_FLAGS.has(arg)) npxPrefixArgs.push(arg);
218
+ else if (NPX_PREFIX_FLAGS_WITH_VALUE.has(arg)) {
219
+ if (i + 1 >= args.length) throw new Error(`Missing value for ${arg}`);
220
+ npxPrefixArgs.push(arg, args[++i]);
221
+ } else restArgs.push(arg);
222
+ else {
223
+ pkgSpec = arg;
224
+ pkgName = extractPackageName(arg);
225
+ foundPackage = true;
226
+ }
227
+ }
228
+ return {
229
+ snpxFlags,
230
+ pkgSpec,
231
+ pkgName,
232
+ npxPrefixArgs,
233
+ restArgs,
234
+ isLatest: !!(pkgSpec && pkgSpec.includes("@latest"))
235
+ };
236
+ }
237
+ /**
238
+ * Build effective execution options from CLI flags and environment variables.
239
+ */
240
+ function buildOptions(snpxFlags) {
241
+ const envTime = process.env.SNPX_TIME;
242
+ const envStrategy = process.env.SNPX_FALLBACK_STRATEGY;
243
+ const timeHours = snpxFlags.time ?? envTime ?? 24;
244
+ const parsedHours = parseFloat(timeHours);
245
+ if (!Number.isFinite(parsedHours) || parsedHours < 0) {
246
+ console.error(`[snpx] Invalid --time value: ${timeHours}`);
247
+ process.exit(1);
248
+ }
249
+ return {
250
+ timeHours,
251
+ timeMs: parsedHours * MS_PER_HOUR,
252
+ strategy: (snpxFlags.fallbackStrategy ?? envStrategy ?? "patch,minor,major").split(",").map((s) => s.trim()).filter(Boolean)
253
+ };
254
+ }
255
+ //#endregion
256
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/constants.js
257
+ var require_constants = /* @__PURE__ */ __commonJSMin(((exports, module) => {
258
+ var SEMVER_SPEC_VERSION = "2.0.0";
259
+ var MAX_LENGTH = 256;
260
+ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
261
+ module.exports = {
262
+ MAX_LENGTH,
263
+ MAX_SAFE_COMPONENT_LENGTH: 16,
264
+ MAX_SAFE_BUILD_LENGTH: MAX_LENGTH - 6,
265
+ MAX_SAFE_INTEGER,
266
+ RELEASE_TYPES: [
267
+ "major",
268
+ "premajor",
269
+ "minor",
270
+ "preminor",
271
+ "patch",
272
+ "prepatch",
273
+ "prerelease"
274
+ ],
275
+ SEMVER_SPEC_VERSION,
276
+ FLAG_INCLUDE_PRERELEASE: 1,
277
+ FLAG_LOOSE: 2
278
+ };
279
+ }));
280
+ //#endregion
281
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/debug.js
282
+ var require_debug = /* @__PURE__ */ __commonJSMin(((exports, module) => {
283
+ module.exports = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {};
284
+ }));
285
+ //#endregion
286
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/re.js
287
+ var require_re = /* @__PURE__ */ __commonJSMin(((exports, module) => {
288
+ var { MAX_SAFE_COMPONENT_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_LENGTH } = require_constants();
289
+ var debug = require_debug();
290
+ exports = module.exports = {};
291
+ var re = exports.re = [];
292
+ var safeRe = exports.safeRe = [];
293
+ var src = exports.src = [];
294
+ var safeSrc = exports.safeSrc = [];
295
+ var t = exports.t = {};
296
+ var R = 0;
297
+ var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
298
+ var safeRegexReplacements = [
299
+ ["\\s", 1],
300
+ ["\\d", MAX_LENGTH],
301
+ [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH]
302
+ ];
303
+ var makeSafeRegex = (value) => {
304
+ for (const [token, max] of safeRegexReplacements) value = value.split(`${token}*`).join(`${token}{0,${max}}`).split(`${token}+`).join(`${token}{1,${max}}`);
305
+ return value;
306
+ };
307
+ var createToken = (name, value, isGlobal) => {
308
+ const safe = makeSafeRegex(value);
309
+ const index = R++;
310
+ debug(name, index, value);
311
+ t[name] = index;
312
+ src[index] = value;
313
+ safeSrc[index] = safe;
314
+ re[index] = new RegExp(value, isGlobal ? "g" : void 0);
315
+ safeRe[index] = new RegExp(safe, isGlobal ? "g" : void 0);
316
+ };
317
+ createToken("NUMERICIDENTIFIER", "0|[1-9]\\d*");
318
+ createToken("NUMERICIDENTIFIERLOOSE", "\\d+");
319
+ createToken("NONNUMERICIDENTIFIER", `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`);
320
+ createToken("MAINVERSION", `(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})\\.(${src[t.NUMERICIDENTIFIER]})`);
321
+ createToken("MAINVERSIONLOOSE", `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})\\.(${src[t.NUMERICIDENTIFIERLOOSE]})`);
322
+ createToken("PRERELEASEIDENTIFIER", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIER]})`);
323
+ createToken("PRERELEASEIDENTIFIERLOOSE", `(?:${src[t.NONNUMERICIDENTIFIER]}|${src[t.NUMERICIDENTIFIERLOOSE]})`);
324
+ createToken("PRERELEASE", `(?:-(${src[t.PRERELEASEIDENTIFIER]}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`);
325
+ createToken("PRERELEASELOOSE", `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`);
326
+ createToken("BUILDIDENTIFIER", `${LETTERDASHNUMBER}+`);
327
+ createToken("BUILD", `(?:\\+(${src[t.BUILDIDENTIFIER]}(?:\\.${src[t.BUILDIDENTIFIER]})*))`);
328
+ createToken("FULLPLAIN", `v?${src[t.MAINVERSION]}${src[t.PRERELEASE]}?${src[t.BUILD]}?`);
329
+ createToken("FULL", `^${src[t.FULLPLAIN]}$`);
330
+ createToken("LOOSEPLAIN", `[v=\\s]*${src[t.MAINVERSIONLOOSE]}${src[t.PRERELEASELOOSE]}?${src[t.BUILD]}?`);
331
+ createToken("LOOSE", `^${src[t.LOOSEPLAIN]}$`);
332
+ createToken("GTLT", "((?:<|>)?=?)");
333
+ createToken("XRANGEIDENTIFIERLOOSE", `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);
334
+ createToken("XRANGEIDENTIFIER", `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`);
335
+ createToken("XRANGEPLAIN", `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:\\.(${src[t.XRANGEIDENTIFIER]})(?:${src[t.PRERELEASE]})?${src[t.BUILD]}?)?)?`);
336
+ createToken("XRANGEPLAINLOOSE", `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})(?:${src[t.PRERELEASELOOSE]})?${src[t.BUILD]}?)?)?`);
337
+ createToken("XRANGE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`);
338
+ createToken("XRANGELOOSE", `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`);
339
+ createToken("COERCEPLAIN", `(^|[^\\d])(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`);
340
+ createToken("COERCE", `${src[t.COERCEPLAIN]}(?:$|[^\\d])`);
341
+ createToken("COERCEFULL", src[t.COERCEPLAIN] + `(?:${src[t.PRERELEASE]})?(?:${src[t.BUILD]})?(?:$|[^\\d])`);
342
+ createToken("COERCERTL", src[t.COERCE], true);
343
+ createToken("COERCERTLFULL", src[t.COERCEFULL], true);
344
+ createToken("LONETILDE", "(?:~>?)");
345
+ createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
346
+ exports.tildeTrimReplace = "$1~";
347
+ createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
348
+ createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
349
+ createToken("LONECARET", "(?:\\^)");
350
+ createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
351
+ exports.caretTrimReplace = "$1^";
352
+ createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
353
+ createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
354
+ createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
355
+ createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
356
+ createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
357
+ exports.comparatorTrimReplace = "$1$2$3";
358
+ createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);
359
+ createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);
360
+ createToken("STAR", "(<|>)?=?\\s*\\*");
361
+ createToken("GTE0", "^\\s*>=\\s*0\\.0\\.0\\s*$");
362
+ createToken("GTE0PRE", "^\\s*>=\\s*0\\.0\\.0-0\\s*$");
363
+ }));
364
+ //#endregion
365
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/parse-options.js
366
+ var require_parse_options = /* @__PURE__ */ __commonJSMin(((exports, module) => {
367
+ var looseOption = Object.freeze({ loose: true });
368
+ var emptyOpts = Object.freeze({});
369
+ var parseOptions = (options) => {
370
+ if (!options) return emptyOpts;
371
+ if (typeof options !== "object") return looseOption;
372
+ return options;
373
+ };
374
+ module.exports = parseOptions;
375
+ }));
376
+ //#endregion
377
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/identifiers.js
378
+ var require_identifiers = /* @__PURE__ */ __commonJSMin(((exports, module) => {
379
+ var numeric = /^[0-9]+$/;
380
+ var compareIdentifiers = (a, b) => {
381
+ if (typeof a === "number" && typeof b === "number") return a === b ? 0 : a < b ? -1 : 1;
382
+ const anum = numeric.test(a);
383
+ const bnum = numeric.test(b);
384
+ if (anum && bnum) {
385
+ a = +a;
386
+ b = +b;
387
+ }
388
+ return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
389
+ };
390
+ var rcompareIdentifiers = (a, b) => compareIdentifiers(b, a);
391
+ module.exports = {
392
+ compareIdentifiers,
393
+ rcompareIdentifiers
394
+ };
395
+ }));
396
+ //#endregion
397
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/semver.js
398
+ var require_semver$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
399
+ var debug = require_debug();
400
+ var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
401
+ var { safeRe: re, t } = require_re();
402
+ var parseOptions = require_parse_options();
403
+ var { compareIdentifiers } = require_identifiers();
404
+ module.exports = class SemVer {
405
+ constructor(version, options) {
406
+ options = parseOptions(options);
407
+ if (version instanceof SemVer) if (version.loose === !!options.loose && version.includePrerelease === !!options.includePrerelease) return version;
408
+ else version = version.version;
409
+ else if (typeof version !== "string") throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`);
410
+ if (version.length > MAX_LENGTH) throw new TypeError(`version is longer than ${MAX_LENGTH} characters`);
411
+ debug("SemVer", version, options);
412
+ this.options = options;
413
+ this.loose = !!options.loose;
414
+ this.includePrerelease = !!options.includePrerelease;
415
+ const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]);
416
+ if (!m) throw new TypeError(`Invalid Version: ${version}`);
417
+ this.raw = version;
418
+ this.major = +m[1];
419
+ this.minor = +m[2];
420
+ this.patch = +m[3];
421
+ if (this.major > MAX_SAFE_INTEGER || this.major < 0) throw new TypeError("Invalid major version");
422
+ if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) throw new TypeError("Invalid minor version");
423
+ if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) throw new TypeError("Invalid patch version");
424
+ if (!m[4]) this.prerelease = [];
425
+ else this.prerelease = m[4].split(".").map((id) => {
426
+ if (/^[0-9]+$/.test(id)) {
427
+ const num = +id;
428
+ if (num >= 0 && num < MAX_SAFE_INTEGER) return num;
429
+ }
430
+ return id;
431
+ });
432
+ this.build = m[5] ? m[5].split(".") : [];
433
+ this.format();
434
+ }
435
+ format() {
436
+ this.version = `${this.major}.${this.minor}.${this.patch}`;
437
+ if (this.prerelease.length) this.version += `-${this.prerelease.join(".")}`;
438
+ return this.version;
439
+ }
440
+ toString() {
441
+ return this.version;
442
+ }
443
+ compare(other) {
444
+ debug("SemVer.compare", this.version, this.options, other);
445
+ if (!(other instanceof SemVer)) {
446
+ if (typeof other === "string" && other === this.version) return 0;
447
+ other = new SemVer(other, this.options);
448
+ }
449
+ if (other.version === this.version) return 0;
450
+ return this.compareMain(other) || this.comparePre(other);
451
+ }
452
+ compareMain(other) {
453
+ if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
454
+ if (this.major < other.major) return -1;
455
+ if (this.major > other.major) return 1;
456
+ if (this.minor < other.minor) return -1;
457
+ if (this.minor > other.minor) return 1;
458
+ if (this.patch < other.patch) return -1;
459
+ if (this.patch > other.patch) return 1;
460
+ return 0;
461
+ }
462
+ comparePre(other) {
463
+ if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
464
+ if (this.prerelease.length && !other.prerelease.length) return -1;
465
+ else if (!this.prerelease.length && other.prerelease.length) return 1;
466
+ else if (!this.prerelease.length && !other.prerelease.length) return 0;
467
+ let i = 0;
468
+ do {
469
+ const a = this.prerelease[i];
470
+ const b = other.prerelease[i];
471
+ debug("prerelease compare", i, a, b);
472
+ if (a === void 0 && b === void 0) return 0;
473
+ else if (b === void 0) return 1;
474
+ else if (a === void 0) return -1;
475
+ else if (a === b) continue;
476
+ else return compareIdentifiers(a, b);
477
+ } while (++i);
478
+ }
479
+ compareBuild(other) {
480
+ if (!(other instanceof SemVer)) other = new SemVer(other, this.options);
481
+ let i = 0;
482
+ do {
483
+ const a = this.build[i];
484
+ const b = other.build[i];
485
+ debug("build compare", i, a, b);
486
+ if (a === void 0 && b === void 0) return 0;
487
+ else if (b === void 0) return 1;
488
+ else if (a === void 0) return -1;
489
+ else if (a === b) continue;
490
+ else return compareIdentifiers(a, b);
491
+ } while (++i);
492
+ }
493
+ inc(release, identifier, identifierBase) {
494
+ if (release.startsWith("pre")) {
495
+ if (!identifier && identifierBase === false) throw new Error("invalid increment argument: identifier is empty");
496
+ if (identifier) {
497
+ const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE]);
498
+ if (!match || match[1] !== identifier) throw new Error(`invalid identifier: ${identifier}`);
499
+ }
500
+ }
501
+ switch (release) {
502
+ case "premajor":
503
+ this.prerelease.length = 0;
504
+ this.patch = 0;
505
+ this.minor = 0;
506
+ this.major++;
507
+ this.inc("pre", identifier, identifierBase);
508
+ break;
509
+ case "preminor":
510
+ this.prerelease.length = 0;
511
+ this.patch = 0;
512
+ this.minor++;
513
+ this.inc("pre", identifier, identifierBase);
514
+ break;
515
+ case "prepatch":
516
+ this.prerelease.length = 0;
517
+ this.inc("patch", identifier, identifierBase);
518
+ this.inc("pre", identifier, identifierBase);
519
+ break;
520
+ case "prerelease":
521
+ if (this.prerelease.length === 0) this.inc("patch", identifier, identifierBase);
522
+ this.inc("pre", identifier, identifierBase);
523
+ break;
524
+ case "release":
525
+ if (this.prerelease.length === 0) throw new Error(`version ${this.raw} is not a prerelease`);
526
+ this.prerelease.length = 0;
527
+ break;
528
+ case "major":
529
+ if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) this.major++;
530
+ this.minor = 0;
531
+ this.patch = 0;
532
+ this.prerelease = [];
533
+ break;
534
+ case "minor":
535
+ if (this.patch !== 0 || this.prerelease.length === 0) this.minor++;
536
+ this.patch = 0;
537
+ this.prerelease = [];
538
+ break;
539
+ case "patch":
540
+ if (this.prerelease.length === 0) this.patch++;
541
+ this.prerelease = [];
542
+ break;
543
+ case "pre": {
544
+ const base = Number(identifierBase) ? 1 : 0;
545
+ if (this.prerelease.length === 0) this.prerelease = [base];
546
+ else {
547
+ let i = this.prerelease.length;
548
+ while (--i >= 0) if (typeof this.prerelease[i] === "number") {
549
+ this.prerelease[i]++;
550
+ i = -2;
551
+ }
552
+ if (i === -1) {
553
+ if (identifier === this.prerelease.join(".") && identifierBase === false) throw new Error("invalid increment argument: identifier already exists");
554
+ this.prerelease.push(base);
555
+ }
556
+ }
557
+ if (identifier) {
558
+ let prerelease = [identifier, base];
559
+ if (identifierBase === false) prerelease = [identifier];
560
+ if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
561
+ if (isNaN(this.prerelease[1])) this.prerelease = prerelease;
562
+ } else this.prerelease = prerelease;
563
+ }
564
+ break;
565
+ }
566
+ default: throw new Error(`invalid increment argument: ${release}`);
567
+ }
568
+ this.raw = this.format();
569
+ if (this.build.length) this.raw += `+${this.build.join(".")}`;
570
+ return this;
571
+ }
572
+ };
573
+ }));
574
+ //#endregion
575
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/parse.js
576
+ var require_parse = /* @__PURE__ */ __commonJSMin(((exports, module) => {
577
+ var SemVer = require_semver$1();
578
+ var parse = (version, options, throwErrors = false) => {
579
+ if (version instanceof SemVer) return version;
580
+ try {
581
+ return new SemVer(version, options);
582
+ } catch (er) {
583
+ if (!throwErrors) return null;
584
+ throw er;
585
+ }
586
+ };
587
+ module.exports = parse;
588
+ }));
589
+ //#endregion
590
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/valid.js
591
+ var require_valid$1 = /* @__PURE__ */ __commonJSMin(((exports, module) => {
592
+ var parse = require_parse();
593
+ var valid = (version, options) => {
594
+ const v = parse(version, options);
595
+ return v ? v.version : null;
596
+ };
597
+ module.exports = valid;
598
+ }));
599
+ //#endregion
600
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/clean.js
601
+ var require_clean = /* @__PURE__ */ __commonJSMin(((exports, module) => {
602
+ var parse = require_parse();
603
+ var clean = (version, options) => {
604
+ const s = parse(version.trim().replace(/^[=v]+/, ""), options);
605
+ return s ? s.version : null;
606
+ };
607
+ module.exports = clean;
608
+ }));
609
+ //#endregion
610
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/inc.js
611
+ var require_inc = /* @__PURE__ */ __commonJSMin(((exports, module) => {
612
+ var SemVer = require_semver$1();
613
+ var inc = (version, release, options, identifier, identifierBase) => {
614
+ if (typeof options === "string") {
615
+ identifierBase = identifier;
616
+ identifier = options;
617
+ options = void 0;
618
+ }
619
+ try {
620
+ return new SemVer(version instanceof SemVer ? version.version : version, options).inc(release, identifier, identifierBase).version;
621
+ } catch (er) {
622
+ return null;
623
+ }
624
+ };
625
+ module.exports = inc;
626
+ }));
627
+ //#endregion
628
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/diff.js
629
+ var require_diff = /* @__PURE__ */ __commonJSMin(((exports, module) => {
630
+ var parse = require_parse();
631
+ var diff = (version1, version2) => {
632
+ const v1 = parse(version1, null, true);
633
+ const v2 = parse(version2, null, true);
634
+ const comparison = v1.compare(v2);
635
+ if (comparison === 0) return null;
636
+ const v1Higher = comparison > 0;
637
+ const highVersion = v1Higher ? v1 : v2;
638
+ const lowVersion = v1Higher ? v2 : v1;
639
+ const highHasPre = !!highVersion.prerelease.length;
640
+ if (!!lowVersion.prerelease.length && !highHasPre) {
641
+ if (!lowVersion.patch && !lowVersion.minor) return "major";
642
+ if (lowVersion.compareMain(highVersion) === 0) {
643
+ if (lowVersion.minor && !lowVersion.patch) return "minor";
644
+ return "patch";
645
+ }
646
+ }
647
+ const prefix = highHasPre ? "pre" : "";
648
+ if (v1.major !== v2.major) return prefix + "major";
649
+ if (v1.minor !== v2.minor) return prefix + "minor";
650
+ if (v1.patch !== v2.patch) return prefix + "patch";
651
+ return "prerelease";
652
+ };
653
+ module.exports = diff;
654
+ }));
655
+ //#endregion
656
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/major.js
657
+ var require_major = /* @__PURE__ */ __commonJSMin(((exports, module) => {
658
+ var SemVer = require_semver$1();
659
+ var major = (a, loose) => new SemVer(a, loose).major;
660
+ module.exports = major;
661
+ }));
662
+ //#endregion
663
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/minor.js
664
+ var require_minor = /* @__PURE__ */ __commonJSMin(((exports, module) => {
665
+ var SemVer = require_semver$1();
666
+ var minor = (a, loose) => new SemVer(a, loose).minor;
667
+ module.exports = minor;
668
+ }));
669
+ //#endregion
670
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/patch.js
671
+ var require_patch = /* @__PURE__ */ __commonJSMin(((exports, module) => {
672
+ var SemVer = require_semver$1();
673
+ var patch = (a, loose) => new SemVer(a, loose).patch;
674
+ module.exports = patch;
675
+ }));
676
+ //#endregion
677
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/prerelease.js
678
+ var require_prerelease = /* @__PURE__ */ __commonJSMin(((exports, module) => {
679
+ var parse = require_parse();
680
+ var prerelease = (version, options) => {
681
+ const parsed = parse(version, options);
682
+ return parsed && parsed.prerelease.length ? parsed.prerelease : null;
683
+ };
684
+ module.exports = prerelease;
685
+ }));
686
+ //#endregion
687
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare.js
688
+ var require_compare = /* @__PURE__ */ __commonJSMin(((exports, module) => {
689
+ var SemVer = require_semver$1();
690
+ var compare = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
691
+ module.exports = compare;
692
+ }));
693
+ //#endregion
694
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rcompare.js
695
+ var require_rcompare = /* @__PURE__ */ __commonJSMin(((exports, module) => {
696
+ var compare = require_compare();
697
+ var rcompare = (a, b, loose) => compare(b, a, loose);
698
+ module.exports = rcompare;
699
+ }));
700
+ //#endregion
701
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare-loose.js
702
+ var require_compare_loose = /* @__PURE__ */ __commonJSMin(((exports, module) => {
703
+ var compare = require_compare();
704
+ var compareLoose = (a, b) => compare(a, b, true);
705
+ module.exports = compareLoose;
706
+ }));
707
+ //#endregion
708
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare-build.js
709
+ var require_compare_build = /* @__PURE__ */ __commonJSMin(((exports, module) => {
710
+ var SemVer = require_semver$1();
711
+ var compareBuild = (a, b, loose) => {
712
+ const versionA = new SemVer(a, loose);
713
+ const versionB = new SemVer(b, loose);
714
+ return versionA.compare(versionB) || versionA.compareBuild(versionB);
715
+ };
716
+ module.exports = compareBuild;
717
+ }));
718
+ //#endregion
719
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/sort.js
720
+ var require_sort = /* @__PURE__ */ __commonJSMin(((exports, module) => {
721
+ var compareBuild = require_compare_build();
722
+ var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
723
+ module.exports = sort;
724
+ }));
725
+ //#endregion
726
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rsort.js
727
+ var require_rsort = /* @__PURE__ */ __commonJSMin(((exports, module) => {
728
+ var compareBuild = require_compare_build();
729
+ var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
730
+ module.exports = rsort;
731
+ }));
732
+ //#endregion
733
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/gt.js
734
+ var require_gt = /* @__PURE__ */ __commonJSMin(((exports, module) => {
735
+ var compare = require_compare();
736
+ var gt = (a, b, loose) => compare(a, b, loose) > 0;
737
+ module.exports = gt;
738
+ }));
739
+ //#endregion
740
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/lt.js
741
+ var require_lt = /* @__PURE__ */ __commonJSMin(((exports, module) => {
742
+ var compare = require_compare();
743
+ var lt = (a, b, loose) => compare(a, b, loose) < 0;
744
+ module.exports = lt;
745
+ }));
746
+ //#endregion
747
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/eq.js
748
+ var require_eq = /* @__PURE__ */ __commonJSMin(((exports, module) => {
749
+ var compare = require_compare();
750
+ var eq = (a, b, loose) => compare(a, b, loose) === 0;
751
+ module.exports = eq;
752
+ }));
753
+ //#endregion
754
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/neq.js
755
+ var require_neq = /* @__PURE__ */ __commonJSMin(((exports, module) => {
756
+ var compare = require_compare();
757
+ var neq = (a, b, loose) => compare(a, b, loose) !== 0;
758
+ module.exports = neq;
759
+ }));
760
+ //#endregion
761
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/gte.js
762
+ var require_gte = /* @__PURE__ */ __commonJSMin(((exports, module) => {
763
+ var compare = require_compare();
764
+ var gte = (a, b, loose) => compare(a, b, loose) >= 0;
765
+ module.exports = gte;
766
+ }));
767
+ //#endregion
768
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/lte.js
769
+ var require_lte = /* @__PURE__ */ __commonJSMin(((exports, module) => {
770
+ var compare = require_compare();
771
+ var lte = (a, b, loose) => compare(a, b, loose) <= 0;
772
+ module.exports = lte;
773
+ }));
774
+ //#endregion
775
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/cmp.js
776
+ var require_cmp = /* @__PURE__ */ __commonJSMin(((exports, module) => {
777
+ var eq = require_eq();
778
+ var neq = require_neq();
779
+ var gt = require_gt();
780
+ var gte = require_gte();
781
+ var lt = require_lt();
782
+ var lte = require_lte();
783
+ var cmp = (a, op, b, loose) => {
784
+ switch (op) {
785
+ case "===":
786
+ if (typeof a === "object") a = a.version;
787
+ if (typeof b === "object") b = b.version;
788
+ return a === b;
789
+ case "!==":
790
+ if (typeof a === "object") a = a.version;
791
+ if (typeof b === "object") b = b.version;
792
+ return a !== b;
793
+ case "":
794
+ case "=":
795
+ case "==": return eq(a, b, loose);
796
+ case "!=": return neq(a, b, loose);
797
+ case ">": return gt(a, b, loose);
798
+ case ">=": return gte(a, b, loose);
799
+ case "<": return lt(a, b, loose);
800
+ case "<=": return lte(a, b, loose);
801
+ default: throw new TypeError(`Invalid operator: ${op}`);
802
+ }
803
+ };
804
+ module.exports = cmp;
805
+ }));
806
+ //#endregion
807
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/coerce.js
808
+ var require_coerce = /* @__PURE__ */ __commonJSMin(((exports, module) => {
809
+ var SemVer = require_semver$1();
810
+ var parse = require_parse();
811
+ var { safeRe: re, t } = require_re();
812
+ var coerce = (version, options) => {
813
+ if (version instanceof SemVer) return version;
814
+ if (typeof version === "number") version = String(version);
815
+ if (typeof version !== "string") return null;
816
+ options = options || {};
817
+ let match = null;
818
+ if (!options.rtl) match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]);
819
+ else {
820
+ const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL];
821
+ let next;
822
+ while ((next = coerceRtlRegex.exec(version)) && (!match || match.index + match[0].length !== version.length)) {
823
+ if (!match || next.index + next[0].length !== match.index + match[0].length) match = next;
824
+ coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length;
825
+ }
826
+ coerceRtlRegex.lastIndex = -1;
827
+ }
828
+ if (match === null) return null;
829
+ const major = match[2];
830
+ return parse(`${major}.${match[3] || "0"}.${match[4] || "0"}${options.includePrerelease && match[5] ? `-${match[5]}` : ""}${options.includePrerelease && match[6] ? `+${match[6]}` : ""}`, options);
831
+ };
832
+ module.exports = coerce;
833
+ }));
834
+ //#endregion
835
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/lrucache.js
836
+ var require_lrucache = /* @__PURE__ */ __commonJSMin(((exports, module) => {
837
+ var LRUCache = class {
838
+ constructor() {
839
+ this.max = 1e3;
840
+ this.map = /* @__PURE__ */ new Map();
841
+ }
842
+ get(key) {
843
+ const value = this.map.get(key);
844
+ if (value === void 0) return;
845
+ else {
846
+ this.map.delete(key);
847
+ this.map.set(key, value);
848
+ return value;
849
+ }
850
+ }
851
+ delete(key) {
852
+ return this.map.delete(key);
853
+ }
854
+ set(key, value) {
855
+ if (!this.delete(key) && value !== void 0) {
856
+ if (this.map.size >= this.max) {
857
+ const firstKey = this.map.keys().next().value;
858
+ this.delete(firstKey);
859
+ }
860
+ this.map.set(key, value);
861
+ }
862
+ return this;
863
+ }
864
+ };
865
+ module.exports = LRUCache;
866
+ }));
867
+ //#endregion
868
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/range.js
869
+ var require_range = /* @__PURE__ */ __commonJSMin(((exports, module) => {
870
+ var SPACE_CHARACTERS = /\s+/g;
871
+ module.exports = class Range {
872
+ constructor(range, options) {
873
+ options = parseOptions(options);
874
+ if (range instanceof Range) if (range.loose === !!options.loose && range.includePrerelease === !!options.includePrerelease) return range;
875
+ else return new Range(range.raw, options);
876
+ if (range instanceof Comparator) {
877
+ this.raw = range.value;
878
+ this.set = [[range]];
879
+ this.formatted = void 0;
880
+ return this;
881
+ }
882
+ this.options = options;
883
+ this.loose = !!options.loose;
884
+ this.includePrerelease = !!options.includePrerelease;
885
+ this.raw = range.trim().replace(SPACE_CHARACTERS, " ");
886
+ this.set = this.raw.split("||").map((r) => this.parseRange(r.trim())).filter((c) => c.length);
887
+ if (!this.set.length) throw new TypeError(`Invalid SemVer Range: ${this.raw}`);
888
+ if (this.set.length > 1) {
889
+ const first = this.set[0];
890
+ this.set = this.set.filter((c) => !isNullSet(c[0]));
891
+ if (this.set.length === 0) this.set = [first];
892
+ else if (this.set.length > 1) {
893
+ for (const c of this.set) if (c.length === 1 && isAny(c[0])) {
894
+ this.set = [c];
895
+ break;
896
+ }
897
+ }
898
+ }
899
+ this.formatted = void 0;
900
+ }
901
+ get range() {
902
+ if (this.formatted === void 0) {
903
+ this.formatted = "";
904
+ for (let i = 0; i < this.set.length; i++) {
905
+ if (i > 0) this.formatted += "||";
906
+ const comps = this.set[i];
907
+ for (let k = 0; k < comps.length; k++) {
908
+ if (k > 0) this.formatted += " ";
909
+ this.formatted += comps[k].toString().trim();
910
+ }
911
+ }
912
+ }
913
+ return this.formatted;
914
+ }
915
+ format() {
916
+ return this.range;
917
+ }
918
+ toString() {
919
+ return this.range;
920
+ }
921
+ parseRange(range) {
922
+ const memoKey = ((this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE)) + ":" + range;
923
+ const cached = cache.get(memoKey);
924
+ if (cached) return cached;
925
+ const loose = this.options.loose;
926
+ const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE];
927
+ range = range.replace(hr, hyphenReplace(this.options.includePrerelease));
928
+ debug("hyphen replace", range);
929
+ range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace);
930
+ debug("comparator trim", range);
931
+ range = range.replace(re[t.TILDETRIM], tildeTrimReplace);
932
+ debug("tilde trim", range);
933
+ range = range.replace(re[t.CARETTRIM], caretTrimReplace);
934
+ debug("caret trim", range);
935
+ let rangeList = range.split(" ").map((comp) => parseComparator(comp, this.options)).join(" ").split(/\s+/).map((comp) => replaceGTE0(comp, this.options));
936
+ if (loose) rangeList = rangeList.filter((comp) => {
937
+ debug("loose invalid filter", comp, this.options);
938
+ return !!comp.match(re[t.COMPARATORLOOSE]);
939
+ });
940
+ debug("range list", rangeList);
941
+ const rangeMap = /* @__PURE__ */ new Map();
942
+ const comparators = rangeList.map((comp) => new Comparator(comp, this.options));
943
+ for (const comp of comparators) {
944
+ if (isNullSet(comp)) return [comp];
945
+ rangeMap.set(comp.value, comp);
946
+ }
947
+ if (rangeMap.size > 1 && rangeMap.has("")) rangeMap.delete("");
948
+ const result = [...rangeMap.values()];
949
+ cache.set(memoKey, result);
950
+ return result;
951
+ }
952
+ intersects(range, options) {
953
+ if (!(range instanceof Range)) throw new TypeError("a Range is required");
954
+ return this.set.some((thisComparators) => {
955
+ return isSatisfiable(thisComparators, options) && range.set.some((rangeComparators) => {
956
+ return isSatisfiable(rangeComparators, options) && thisComparators.every((thisComparator) => {
957
+ return rangeComparators.every((rangeComparator) => {
958
+ return thisComparator.intersects(rangeComparator, options);
959
+ });
960
+ });
961
+ });
962
+ });
963
+ }
964
+ test(version) {
965
+ if (!version) return false;
966
+ if (typeof version === "string") try {
967
+ version = new SemVer(version, this.options);
968
+ } catch (er) {
969
+ return false;
970
+ }
971
+ for (let i = 0; i < this.set.length; i++) if (testSet(this.set[i], version, this.options)) return true;
972
+ return false;
973
+ }
974
+ };
975
+ var cache = new (require_lrucache())();
976
+ var parseOptions = require_parse_options();
977
+ var Comparator = require_comparator();
978
+ var debug = require_debug();
979
+ var SemVer = require_semver$1();
980
+ var { safeRe: re, t, comparatorTrimReplace, tildeTrimReplace, caretTrimReplace } = require_re();
981
+ var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
982
+ var isNullSet = (c) => c.value === "<0.0.0-0";
983
+ var isAny = (c) => c.value === "";
984
+ var isSatisfiable = (comparators, options) => {
985
+ let result = true;
986
+ const remainingComparators = comparators.slice();
987
+ let testComparator = remainingComparators.pop();
988
+ while (result && remainingComparators.length) {
989
+ result = remainingComparators.every((otherComparator) => {
990
+ return testComparator.intersects(otherComparator, options);
991
+ });
992
+ testComparator = remainingComparators.pop();
993
+ }
994
+ return result;
995
+ };
996
+ var parseComparator = (comp, options) => {
997
+ comp = comp.replace(re[t.BUILD], "");
998
+ debug("comp", comp, options);
999
+ comp = replaceCarets(comp, options);
1000
+ debug("caret", comp);
1001
+ comp = replaceTildes(comp, options);
1002
+ debug("tildes", comp);
1003
+ comp = replaceXRanges(comp, options);
1004
+ debug("xrange", comp);
1005
+ comp = replaceStars(comp, options);
1006
+ debug("stars", comp);
1007
+ return comp;
1008
+ };
1009
+ var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
1010
+ var replaceTildes = (comp, options) => {
1011
+ return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options)).join(" ");
1012
+ };
1013
+ var replaceTilde = (comp, options) => {
1014
+ const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
1015
+ return comp.replace(r, (_, M, m, p, pr) => {
1016
+ debug("tilde", comp, _, M, m, p, pr);
1017
+ let ret;
1018
+ if (isX(M)) ret = "";
1019
+ else if (isX(m)) ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
1020
+ else if (isX(p)) ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
1021
+ else if (pr) {
1022
+ debug("replaceTilde pr", pr);
1023
+ ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
1024
+ } else ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
1025
+ debug("tilde return", ret);
1026
+ return ret;
1027
+ });
1028
+ };
1029
+ var replaceCarets = (comp, options) => {
1030
+ return comp.trim().split(/\s+/).map((c) => replaceCaret(c, options)).join(" ");
1031
+ };
1032
+ var replaceCaret = (comp, options) => {
1033
+ debug("caret", comp, options);
1034
+ const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET];
1035
+ const z = options.includePrerelease ? "-0" : "";
1036
+ return comp.replace(r, (_, M, m, p, pr) => {
1037
+ debug("caret", comp, _, M, m, p, pr);
1038
+ let ret;
1039
+ if (isX(M)) ret = "";
1040
+ else if (isX(m)) ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
1041
+ else if (isX(p)) if (M === "0") ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
1042
+ else ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`;
1043
+ else if (pr) {
1044
+ debug("replaceCaret pr", pr);
1045
+ if (M === "0") if (m === "0") ret = `>=${M}.${m}.${p}-${pr} <${M}.${m}.${+p + 1}-0`;
1046
+ else ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
1047
+ else ret = `>=${M}.${m}.${p}-${pr} <${+M + 1}.0.0-0`;
1048
+ } else {
1049
+ debug("no pr");
1050
+ if (M === "0") if (m === "0") ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
1051
+ else ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
1052
+ else ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
1053
+ }
1054
+ debug("caret return", ret);
1055
+ return ret;
1056
+ });
1057
+ };
1058
+ var replaceXRanges = (comp, options) => {
1059
+ debug("replaceXRanges", comp, options);
1060
+ return comp.split(/\s+/).map((c) => replaceXRange(c, options)).join(" ");
1061
+ };
1062
+ var replaceXRange = (comp, options) => {
1063
+ comp = comp.trim();
1064
+ const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
1065
+ return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
1066
+ debug("xRange", comp, ret, gtlt, M, m, p, pr);
1067
+ const xM = isX(M);
1068
+ const xm = xM || isX(m);
1069
+ const xp = xm || isX(p);
1070
+ const anyX = xp;
1071
+ if (gtlt === "=" && anyX) gtlt = "";
1072
+ pr = options.includePrerelease ? "-0" : "";
1073
+ if (xM) if (gtlt === ">" || gtlt === "<") ret = "<0.0.0-0";
1074
+ else ret = "*";
1075
+ else if (gtlt && anyX) {
1076
+ if (xm) m = 0;
1077
+ p = 0;
1078
+ if (gtlt === ">") {
1079
+ gtlt = ">=";
1080
+ if (xm) {
1081
+ M = +M + 1;
1082
+ m = 0;
1083
+ p = 0;
1084
+ } else {
1085
+ m = +m + 1;
1086
+ p = 0;
1087
+ }
1088
+ } else if (gtlt === "<=") {
1089
+ gtlt = "<";
1090
+ if (xm) M = +M + 1;
1091
+ else m = +m + 1;
1092
+ }
1093
+ if (gtlt === "<") pr = "-0";
1094
+ ret = `${gtlt + M}.${m}.${p}${pr}`;
1095
+ } else if (xm) ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`;
1096
+ else if (xp) ret = `>=${M}.${m}.0${pr} <${M}.${+m + 1}.0-0`;
1097
+ debug("xRange return", ret);
1098
+ return ret;
1099
+ });
1100
+ };
1101
+ var replaceStars = (comp, options) => {
1102
+ debug("replaceStars", comp, options);
1103
+ return comp.trim().replace(re[t.STAR], "");
1104
+ };
1105
+ var replaceGTE0 = (comp, options) => {
1106
+ debug("replaceGTE0", comp, options);
1107
+ return comp.trim().replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], "");
1108
+ };
1109
+ var hyphenReplace = (incPr) => ($0, from, fM, fm, fp, fpr, fb, to, tM, tm, tp, tpr) => {
1110
+ if (isX(fM)) from = "";
1111
+ else if (isX(fm)) from = `>=${fM}.0.0${incPr ? "-0" : ""}`;
1112
+ else if (isX(fp)) from = `>=${fM}.${fm}.0${incPr ? "-0" : ""}`;
1113
+ else if (fpr) from = `>=${from}`;
1114
+ else from = `>=${from}${incPr ? "-0" : ""}`;
1115
+ if (isX(tM)) to = "";
1116
+ else if (isX(tm)) to = `<${+tM + 1}.0.0-0`;
1117
+ else if (isX(tp)) to = `<${tM}.${+tm + 1}.0-0`;
1118
+ else if (tpr) to = `<=${tM}.${tm}.${tp}-${tpr}`;
1119
+ else if (incPr) to = `<${tM}.${tm}.${+tp + 1}-0`;
1120
+ else to = `<=${to}`;
1121
+ return `${from} ${to}`.trim();
1122
+ };
1123
+ var testSet = (set, version, options) => {
1124
+ for (let i = 0; i < set.length; i++) if (!set[i].test(version)) return false;
1125
+ if (version.prerelease.length && !options.includePrerelease) {
1126
+ for (let i = 0; i < set.length; i++) {
1127
+ debug(set[i].semver);
1128
+ if (set[i].semver === Comparator.ANY) continue;
1129
+ if (set[i].semver.prerelease.length > 0) {
1130
+ const allowed = set[i].semver;
1131
+ if (allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch) return true;
1132
+ }
1133
+ }
1134
+ return false;
1135
+ }
1136
+ return true;
1137
+ };
1138
+ }));
1139
+ //#endregion
1140
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/comparator.js
1141
+ var require_comparator = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1142
+ var ANY = Symbol("SemVer ANY");
1143
+ module.exports = class Comparator {
1144
+ static get ANY() {
1145
+ return ANY;
1146
+ }
1147
+ constructor(comp, options) {
1148
+ options = parseOptions(options);
1149
+ if (comp instanceof Comparator) if (comp.loose === !!options.loose) return comp;
1150
+ else comp = comp.value;
1151
+ comp = comp.trim().split(/\s+/).join(" ");
1152
+ debug("comparator", comp, options);
1153
+ this.options = options;
1154
+ this.loose = !!options.loose;
1155
+ this.parse(comp);
1156
+ if (this.semver === ANY) this.value = "";
1157
+ else this.value = this.operator + this.semver.version;
1158
+ debug("comp", this);
1159
+ }
1160
+ parse(comp) {
1161
+ const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR];
1162
+ const m = comp.match(r);
1163
+ if (!m) throw new TypeError(`Invalid comparator: ${comp}`);
1164
+ this.operator = m[1] !== void 0 ? m[1] : "";
1165
+ if (this.operator === "=") this.operator = "";
1166
+ if (!m[2]) this.semver = ANY;
1167
+ else this.semver = new SemVer(m[2], this.options.loose);
1168
+ }
1169
+ toString() {
1170
+ return this.value;
1171
+ }
1172
+ test(version) {
1173
+ debug("Comparator.test", version, this.options.loose);
1174
+ if (this.semver === ANY || version === ANY) return true;
1175
+ if (typeof version === "string") try {
1176
+ version = new SemVer(version, this.options);
1177
+ } catch (er) {
1178
+ return false;
1179
+ }
1180
+ return cmp(version, this.operator, this.semver, this.options);
1181
+ }
1182
+ intersects(comp, options) {
1183
+ if (!(comp instanceof Comparator)) throw new TypeError("a Comparator is required");
1184
+ if (this.operator === "") {
1185
+ if (this.value === "") return true;
1186
+ return new Range(comp.value, options).test(this.value);
1187
+ } else if (comp.operator === "") {
1188
+ if (comp.value === "") return true;
1189
+ return new Range(this.value, options).test(comp.semver);
1190
+ }
1191
+ options = parseOptions(options);
1192
+ if (options.includePrerelease && (this.value === "<0.0.0-0" || comp.value === "<0.0.0-0")) return false;
1193
+ if (!options.includePrerelease && (this.value.startsWith("<0.0.0") || comp.value.startsWith("<0.0.0"))) return false;
1194
+ if (this.operator.startsWith(">") && comp.operator.startsWith(">")) return true;
1195
+ if (this.operator.startsWith("<") && comp.operator.startsWith("<")) return true;
1196
+ if (this.semver.version === comp.semver.version && this.operator.includes("=") && comp.operator.includes("=")) return true;
1197
+ if (cmp(this.semver, "<", comp.semver, options) && this.operator.startsWith(">") && comp.operator.startsWith("<")) return true;
1198
+ if (cmp(this.semver, ">", comp.semver, options) && this.operator.startsWith("<") && comp.operator.startsWith(">")) return true;
1199
+ return false;
1200
+ }
1201
+ };
1202
+ var parseOptions = require_parse_options();
1203
+ var { safeRe: re, t } = require_re();
1204
+ var cmp = require_cmp();
1205
+ var debug = require_debug();
1206
+ var SemVer = require_semver$1();
1207
+ var Range = require_range();
1208
+ }));
1209
+ //#endregion
1210
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/satisfies.js
1211
+ var require_satisfies = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1212
+ var Range = require_range();
1213
+ var satisfies = (version, range, options) => {
1214
+ try {
1215
+ range = new Range(range, options);
1216
+ } catch (er) {
1217
+ return false;
1218
+ }
1219
+ return range.test(version);
1220
+ };
1221
+ module.exports = satisfies;
1222
+ }));
1223
+ //#endregion
1224
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/to-comparators.js
1225
+ var require_to_comparators = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1226
+ var Range = require_range();
1227
+ var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
1228
+ module.exports = toComparators;
1229
+ }));
1230
+ //#endregion
1231
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/max-satisfying.js
1232
+ var require_max_satisfying = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1233
+ var SemVer = require_semver$1();
1234
+ var Range = require_range();
1235
+ var maxSatisfying = (versions, range, options) => {
1236
+ let max = null;
1237
+ let maxSV = null;
1238
+ let rangeObj = null;
1239
+ try {
1240
+ rangeObj = new Range(range, options);
1241
+ } catch (er) {
1242
+ return null;
1243
+ }
1244
+ versions.forEach((v) => {
1245
+ if (rangeObj.test(v)) {
1246
+ if (!max || maxSV.compare(v) === -1) {
1247
+ max = v;
1248
+ maxSV = new SemVer(max, options);
1249
+ }
1250
+ }
1251
+ });
1252
+ return max;
1253
+ };
1254
+ module.exports = maxSatisfying;
1255
+ }));
1256
+ //#endregion
1257
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/min-satisfying.js
1258
+ var require_min_satisfying = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1259
+ var SemVer = require_semver$1();
1260
+ var Range = require_range();
1261
+ var minSatisfying = (versions, range, options) => {
1262
+ let min = null;
1263
+ let minSV = null;
1264
+ let rangeObj = null;
1265
+ try {
1266
+ rangeObj = new Range(range, options);
1267
+ } catch (er) {
1268
+ return null;
1269
+ }
1270
+ versions.forEach((v) => {
1271
+ if (rangeObj.test(v)) {
1272
+ if (!min || minSV.compare(v) === 1) {
1273
+ min = v;
1274
+ minSV = new SemVer(min, options);
1275
+ }
1276
+ }
1277
+ });
1278
+ return min;
1279
+ };
1280
+ module.exports = minSatisfying;
1281
+ }));
1282
+ //#endregion
1283
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/min-version.js
1284
+ var require_min_version = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1285
+ var SemVer = require_semver$1();
1286
+ var Range = require_range();
1287
+ var gt = require_gt();
1288
+ var minVersion = (range, loose) => {
1289
+ range = new Range(range, loose);
1290
+ let minver = new SemVer("0.0.0");
1291
+ if (range.test(minver)) return minver;
1292
+ minver = new SemVer("0.0.0-0");
1293
+ if (range.test(minver)) return minver;
1294
+ minver = null;
1295
+ for (let i = 0; i < range.set.length; ++i) {
1296
+ const comparators = range.set[i];
1297
+ let setMin = null;
1298
+ comparators.forEach((comparator) => {
1299
+ const compver = new SemVer(comparator.semver.version);
1300
+ switch (comparator.operator) {
1301
+ case ">":
1302
+ if (compver.prerelease.length === 0) compver.patch++;
1303
+ else compver.prerelease.push(0);
1304
+ compver.raw = compver.format();
1305
+ case "":
1306
+ case ">=":
1307
+ if (!setMin || gt(compver, setMin)) setMin = compver;
1308
+ break;
1309
+ case "<":
1310
+ case "<=": break;
1311
+ default: throw new Error(`Unexpected operation: ${comparator.operator}`);
1312
+ }
1313
+ });
1314
+ if (setMin && (!minver || gt(minver, setMin))) minver = setMin;
1315
+ }
1316
+ if (minver && range.test(minver)) return minver;
1317
+ return null;
1318
+ };
1319
+ module.exports = minVersion;
1320
+ }));
1321
+ //#endregion
1322
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/valid.js
1323
+ var require_valid = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1324
+ var Range = require_range();
1325
+ var validRange = (range, options) => {
1326
+ try {
1327
+ return new Range(range, options).range || "*";
1328
+ } catch (er) {
1329
+ return null;
1330
+ }
1331
+ };
1332
+ module.exports = validRange;
1333
+ }));
1334
+ //#endregion
1335
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/outside.js
1336
+ var require_outside = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1337
+ var SemVer = require_semver$1();
1338
+ var Comparator = require_comparator();
1339
+ var { ANY } = Comparator;
1340
+ var Range = require_range();
1341
+ var satisfies = require_satisfies();
1342
+ var gt = require_gt();
1343
+ var lt = require_lt();
1344
+ var lte = require_lte();
1345
+ var gte = require_gte();
1346
+ var outside = (version, range, hilo, options) => {
1347
+ version = new SemVer(version, options);
1348
+ range = new Range(range, options);
1349
+ let gtfn, ltefn, ltfn, comp, ecomp;
1350
+ switch (hilo) {
1351
+ case ">":
1352
+ gtfn = gt;
1353
+ ltefn = lte;
1354
+ ltfn = lt;
1355
+ comp = ">";
1356
+ ecomp = ">=";
1357
+ break;
1358
+ case "<":
1359
+ gtfn = lt;
1360
+ ltefn = gte;
1361
+ ltfn = gt;
1362
+ comp = "<";
1363
+ ecomp = "<=";
1364
+ break;
1365
+ default: throw new TypeError("Must provide a hilo val of \"<\" or \">\"");
1366
+ }
1367
+ if (satisfies(version, range, options)) return false;
1368
+ for (let i = 0; i < range.set.length; ++i) {
1369
+ const comparators = range.set[i];
1370
+ let high = null;
1371
+ let low = null;
1372
+ comparators.forEach((comparator) => {
1373
+ if (comparator.semver === ANY) comparator = new Comparator(">=0.0.0");
1374
+ high = high || comparator;
1375
+ low = low || comparator;
1376
+ if (gtfn(comparator.semver, high.semver, options)) high = comparator;
1377
+ else if (ltfn(comparator.semver, low.semver, options)) low = comparator;
1378
+ });
1379
+ if (high.operator === comp || high.operator === ecomp) return false;
1380
+ if ((!low.operator || low.operator === comp) && ltefn(version, low.semver)) return false;
1381
+ else if (low.operator === ecomp && ltfn(version, low.semver)) return false;
1382
+ }
1383
+ return true;
1384
+ };
1385
+ module.exports = outside;
1386
+ }));
1387
+ //#endregion
1388
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/gtr.js
1389
+ var require_gtr = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1390
+ var outside = require_outside();
1391
+ var gtr = (version, range, options) => outside(version, range, ">", options);
1392
+ module.exports = gtr;
1393
+ }));
1394
+ //#endregion
1395
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/ltr.js
1396
+ var require_ltr = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1397
+ var outside = require_outside();
1398
+ var ltr = (version, range, options) => outside(version, range, "<", options);
1399
+ module.exports = ltr;
1400
+ }));
1401
+ //#endregion
1402
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/intersects.js
1403
+ var require_intersects = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1404
+ var Range = require_range();
1405
+ var intersects = (r1, r2, options) => {
1406
+ r1 = new Range(r1, options);
1407
+ r2 = new Range(r2, options);
1408
+ return r1.intersects(r2, options);
1409
+ };
1410
+ module.exports = intersects;
1411
+ }));
1412
+ //#endregion
1413
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/simplify.js
1414
+ var require_simplify = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1415
+ var satisfies = require_satisfies();
1416
+ var compare = require_compare();
1417
+ module.exports = (versions, range, options) => {
1418
+ const set = [];
1419
+ let first = null;
1420
+ let prev = null;
1421
+ const v = versions.sort((a, b) => compare(a, b, options));
1422
+ for (const version of v) if (satisfies(version, range, options)) {
1423
+ prev = version;
1424
+ if (!first) first = version;
1425
+ } else {
1426
+ if (prev) set.push([first, prev]);
1427
+ prev = null;
1428
+ first = null;
1429
+ }
1430
+ if (first) set.push([first, null]);
1431
+ const ranges = [];
1432
+ for (const [min, max] of set) if (min === max) ranges.push(min);
1433
+ else if (!max && min === v[0]) ranges.push("*");
1434
+ else if (!max) ranges.push(`>=${min}`);
1435
+ else if (min === v[0]) ranges.push(`<=${max}`);
1436
+ else ranges.push(`${min} - ${max}`);
1437
+ const simplified = ranges.join(" || ");
1438
+ const original = typeof range.raw === "string" ? range.raw : String(range);
1439
+ return simplified.length < original.length ? simplified : range;
1440
+ };
1441
+ }));
1442
+ //#endregion
1443
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/subset.js
1444
+ var require_subset = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1445
+ var Range = require_range();
1446
+ var Comparator = require_comparator();
1447
+ var { ANY } = Comparator;
1448
+ var satisfies = require_satisfies();
1449
+ var compare = require_compare();
1450
+ var subset = (sub, dom, options = {}) => {
1451
+ if (sub === dom) return true;
1452
+ sub = new Range(sub, options);
1453
+ dom = new Range(dom, options);
1454
+ let sawNonNull = false;
1455
+ OUTER: for (const simpleSub of sub.set) {
1456
+ for (const simpleDom of dom.set) {
1457
+ const isSub = simpleSubset(simpleSub, simpleDom, options);
1458
+ sawNonNull = sawNonNull || isSub !== null;
1459
+ if (isSub) continue OUTER;
1460
+ }
1461
+ if (sawNonNull) return false;
1462
+ }
1463
+ return true;
1464
+ };
1465
+ var minimumVersionWithPreRelease = [new Comparator(">=0.0.0-0")];
1466
+ var minimumVersion = [new Comparator(">=0.0.0")];
1467
+ var simpleSubset = (sub, dom, options) => {
1468
+ if (sub === dom) return true;
1469
+ if (sub.length === 1 && sub[0].semver === ANY) if (dom.length === 1 && dom[0].semver === ANY) return true;
1470
+ else if (options.includePrerelease) sub = minimumVersionWithPreRelease;
1471
+ else sub = minimumVersion;
1472
+ if (dom.length === 1 && dom[0].semver === ANY) if (options.includePrerelease) return true;
1473
+ else dom = minimumVersion;
1474
+ const eqSet = /* @__PURE__ */ new Set();
1475
+ let gt, lt;
1476
+ for (const c of sub) if (c.operator === ">" || c.operator === ">=") gt = higherGT(gt, c, options);
1477
+ else if (c.operator === "<" || c.operator === "<=") lt = lowerLT(lt, c, options);
1478
+ else eqSet.add(c.semver);
1479
+ if (eqSet.size > 1) return null;
1480
+ let gtltComp;
1481
+ if (gt && lt) {
1482
+ gtltComp = compare(gt.semver, lt.semver, options);
1483
+ if (gtltComp > 0) return null;
1484
+ else if (gtltComp === 0 && (gt.operator !== ">=" || lt.operator !== "<=")) return null;
1485
+ }
1486
+ for (const eq of eqSet) {
1487
+ if (gt && !satisfies(eq, String(gt), options)) return null;
1488
+ if (lt && !satisfies(eq, String(lt), options)) return null;
1489
+ for (const c of dom) if (!satisfies(eq, String(c), options)) return false;
1490
+ return true;
1491
+ }
1492
+ let higher, lower;
1493
+ let hasDomLT, hasDomGT;
1494
+ let needDomLTPre = lt && !options.includePrerelease && lt.semver.prerelease.length ? lt.semver : false;
1495
+ let needDomGTPre = gt && !options.includePrerelease && gt.semver.prerelease.length ? gt.semver : false;
1496
+ if (needDomLTPre && needDomLTPre.prerelease.length === 1 && lt.operator === "<" && needDomLTPre.prerelease[0] === 0) needDomLTPre = false;
1497
+ for (const c of dom) {
1498
+ hasDomGT = hasDomGT || c.operator === ">" || c.operator === ">=";
1499
+ hasDomLT = hasDomLT || c.operator === "<" || c.operator === "<=";
1500
+ if (gt) {
1501
+ if (needDomGTPre) {
1502
+ if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomGTPre.major && c.semver.minor === needDomGTPre.minor && c.semver.patch === needDomGTPre.patch) needDomGTPre = false;
1503
+ }
1504
+ if (c.operator === ">" || c.operator === ">=") {
1505
+ higher = higherGT(gt, c, options);
1506
+ if (higher === c && higher !== gt) return false;
1507
+ } else if (gt.operator === ">=" && !satisfies(gt.semver, String(c), options)) return false;
1508
+ }
1509
+ if (lt) {
1510
+ if (needDomLTPre) {
1511
+ if (c.semver.prerelease && c.semver.prerelease.length && c.semver.major === needDomLTPre.major && c.semver.minor === needDomLTPre.minor && c.semver.patch === needDomLTPre.patch) needDomLTPre = false;
1512
+ }
1513
+ if (c.operator === "<" || c.operator === "<=") {
1514
+ lower = lowerLT(lt, c, options);
1515
+ if (lower === c && lower !== lt) return false;
1516
+ } else if (lt.operator === "<=" && !satisfies(lt.semver, String(c), options)) return false;
1517
+ }
1518
+ if (!c.operator && (lt || gt) && gtltComp !== 0) return false;
1519
+ }
1520
+ if (gt && hasDomLT && !lt && gtltComp !== 0) return false;
1521
+ if (lt && hasDomGT && !gt && gtltComp !== 0) return false;
1522
+ if (needDomGTPre || needDomLTPre) return false;
1523
+ return true;
1524
+ };
1525
+ var higherGT = (a, b, options) => {
1526
+ if (!a) return b;
1527
+ const comp = compare(a.semver, b.semver, options);
1528
+ return comp > 0 ? a : comp < 0 ? b : b.operator === ">" && a.operator === ">=" ? b : a;
1529
+ };
1530
+ var lowerLT = (a, b, options) => {
1531
+ if (!a) return b;
1532
+ const comp = compare(a.semver, b.semver, options);
1533
+ return comp < 0 ? a : comp > 0 ? b : b.operator === "<" && a.operator === "<=" ? b : a;
1534
+ };
1535
+ module.exports = subset;
1536
+ }));
1537
+ //#endregion
1538
+ //#region node_modules/.pnpm/semver@7.7.4/node_modules/semver/index.js
1539
+ var require_semver = /* @__PURE__ */ __commonJSMin(((exports, module) => {
1540
+ var internalRe = require_re();
1541
+ var constants = require_constants();
1542
+ var SemVer = require_semver$1();
1543
+ var identifiers = require_identifiers();
1544
+ module.exports = {
1545
+ parse: require_parse(),
1546
+ valid: require_valid$1(),
1547
+ clean: require_clean(),
1548
+ inc: require_inc(),
1549
+ diff: require_diff(),
1550
+ major: require_major(),
1551
+ minor: require_minor(),
1552
+ patch: require_patch(),
1553
+ prerelease: require_prerelease(),
1554
+ compare: require_compare(),
1555
+ rcompare: require_rcompare(),
1556
+ compareLoose: require_compare_loose(),
1557
+ compareBuild: require_compare_build(),
1558
+ sort: require_sort(),
1559
+ rsort: require_rsort(),
1560
+ gt: require_gt(),
1561
+ lt: require_lt(),
1562
+ eq: require_eq(),
1563
+ neq: require_neq(),
1564
+ gte: require_gte(),
1565
+ lte: require_lte(),
1566
+ cmp: require_cmp(),
1567
+ coerce: require_coerce(),
1568
+ Comparator: require_comparator(),
1569
+ Range: require_range(),
1570
+ satisfies: require_satisfies(),
1571
+ toComparators: require_to_comparators(),
1572
+ maxSatisfying: require_max_satisfying(),
1573
+ minSatisfying: require_min_satisfying(),
1574
+ minVersion: require_min_version(),
1575
+ validRange: require_valid(),
1576
+ outside: require_outside(),
1577
+ gtr: require_gtr(),
1578
+ ltr: require_ltr(),
1579
+ intersects: require_intersects(),
1580
+ simplifyRange: require_simplify(),
1581
+ subset: require_subset(),
1582
+ SemVer,
1583
+ re: internalRe.re,
1584
+ src: internalRe.src,
1585
+ tokens: internalRe.t,
1586
+ SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
1587
+ RELEASE_TYPES: constants.RELEASE_TYPES,
1588
+ compareIdentifiers: identifiers.compareIdentifiers,
1589
+ rcompareIdentifiers: identifiers.rcompareIdentifiers
1590
+ };
1591
+ }));
1592
+ //#endregion
1593
+ //#region src/registry.ts
1594
+ var registry_exports = /* @__PURE__ */ __exportAll({
1595
+ buildVersionList: () => buildVersionList,
1596
+ fetchPackageMetadata: () => fetchPackageMetadata
1597
+ });
1598
+ /**
1599
+ * Fetch package metadata from registry with retry logic.
1600
+ */
1601
+ async function fetchPackageMetadata(pkgName, options = {}) {
1602
+ const maxRetries = options.maxRetries ?? 3;
1603
+ const baseDelay = options.baseDelay ?? 1e3;
1604
+ const maxDelay = options.maxDelay ?? 1e4;
1605
+ const timeout = options.timeout ?? 1e4;
1606
+ let lastError;
1607
+ for (let attempt = 0; attempt < maxRetries; attempt++) try {
1608
+ const url = `${REGISTRY}/${encodeURIComponent(pkgName)}`;
1609
+ const res = await fetch(url, {
1610
+ headers: { accept: "application/json" },
1611
+ signal: AbortSignal.timeout(timeout)
1612
+ });
1613
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
1614
+ return res.json();
1615
+ } catch (err) {
1616
+ lastError = err;
1617
+ if (attempt < maxRetries - 1) {
1618
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
1619
+ await new Promise((r) => setTimeout(r, delay));
1620
+ }
1621
+ }
1622
+ throw new Error(`Failed after ${maxRetries} attempts: ${lastError?.message}`);
1623
+ }
1624
+ /**
1625
+ * Build version list from registry data.
1626
+ */
1627
+ function buildVersionList(data) {
1628
+ return Object.entries(data.time || {}).filter(([v]) => v !== "created" && v !== "modified").map(([v, t]) => ({
1629
+ version: v,
1630
+ time: new Date(t).getTime()
1631
+ })).filter((v) => !Number.isNaN(v.time)).sort((a, b) => b.time - a.time);
1632
+ }
1633
+ var init_registry = __esmMin((() => {
1634
+ init_constants();
1635
+ }));
1636
+ //#endregion
1637
+ //#region src/version.ts
1638
+ var import_semver = /* @__PURE__ */ __toESM(require_semver(), 1);
1639
+ init_registry();
1640
+ init_constants();
1641
+ /**
1642
+ * Parse a simple semver string into components.
1643
+ * Returns null for invalid or complex prerelease strings.
1644
+ */
1645
+ function parseSemver(version) {
1646
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/);
1647
+ if (!match) return null;
1648
+ return {
1649
+ major: parseInt(match[1], 10),
1650
+ minor: parseInt(match[2], 10),
1651
+ patch: parseInt(match[3], 10),
1652
+ prerelease: match[4] || null,
1653
+ build: match[5] || null,
1654
+ raw: version
1655
+ };
1656
+ }
1657
+ /**
1658
+ * Determine if snpx should intercept version resolution based on package spec.
1659
+ * - Exact version (1.5.0) → do not intercept (user knows what they're doing)
1660
+ * - Range (^1.0.0, >=1.5) → intercept (uncertainty needs protection)
1661
+ * - latest → intercept
1662
+ * - No version → intercept
1663
+ */
1664
+ function shouldIntercept(pkgSpec) {
1665
+ if (!pkgSpec) return false;
1666
+ let versionPart;
1667
+ if (pkgSpec.startsWith("@")) {
1668
+ const secondAt = pkgSpec.indexOf("@", 1);
1669
+ versionPart = secondAt === -1 ? null : pkgSpec.slice(secondAt + 1);
1670
+ } else {
1671
+ const atIndex = pkgSpec.indexOf("@");
1672
+ versionPart = atIndex === -1 ? null : pkgSpec.slice(atIndex + 1);
1673
+ }
1674
+ if (!versionPart) return true;
1675
+ if (versionPart === "latest") return true;
1676
+ if (import_semver.default.valid(versionPart)) return false;
1677
+ if (import_semver.default.validRange(versionPart)) return true;
1678
+ return true;
1679
+ }
1680
+ /**
1681
+ * Find patch fallback version (immediately before latest).
1682
+ */
1683
+ function findPatchFallback(versions, latestVersion) {
1684
+ const idx = versions.findIndex((v) => v.version === latestVersion);
1685
+ if (idx === -1 || idx + 1 >= versions.length) return null;
1686
+ return versions[idx + 1];
1687
+ }
1688
+ /**
1689
+ * Find minor fallback version (previous minor line).
1690
+ */
1691
+ function findMinorFallback(versions, latestParsed) {
1692
+ for (const v of versions) {
1693
+ const p = parseSemver(v.version);
1694
+ if (p && p.major === latestParsed.major && p.minor < latestParsed.minor) return v;
1695
+ }
1696
+ return null;
1697
+ }
1698
+ /**
1699
+ * Find major fallback version (previous major line).
1700
+ */
1701
+ function findMajorFallback(versions, latestParsed) {
1702
+ for (const v of versions) {
1703
+ const p = parseSemver(v.version);
1704
+ if (p && p.major < latestParsed.major) return v;
1705
+ }
1706
+ return null;
1707
+ }
1708
+ /**
1709
+ * Resolve a safe version for the package.
1710
+ *
1711
+ * @param pkgName - Package name
1712
+ * @param options - Resolution options
1713
+ * @param options.timeMs - Safety window in milliseconds (default: 24h)
1714
+ * @param options.strategy - Fallback order, e.g. ['patch','minor','major']
1715
+ */
1716
+ async function resolveSafeVersion(pkgName, options = {}) {
1717
+ const timeMs = options.timeMs ?? 24 * 36e5;
1718
+ const strategy = options.strategy ?? "patch,minor,major".split(",").map((s) => s.trim());
1719
+ const data = await fetchPackageMetadata(pkgName);
1720
+ const latestVersion = data["dist-tags"]?.latest;
1721
+ if (!latestVersion) throw new Error("No latest tag found");
1722
+ const latestTimeStr = data.time?.[latestVersion];
1723
+ const latestTime = latestTimeStr ? new Date(latestTimeStr).getTime() : null;
1724
+ if (!latestTime) throw new Error(`Registry did not provide a publish time for ${pkgName}@${latestVersion}. Cannot verify safety window.`);
1725
+ if (Date.now() - latestTime >= timeMs) return latestVersion;
1726
+ const versions = buildVersionList(data);
1727
+ const latestParsed = parseSemver(latestVersion);
1728
+ if (!latestParsed) throw new Error(`Unable to parse latest version ${latestVersion}`);
1729
+ for (const strat of strategy) {
1730
+ let candidate = null;
1731
+ if (strat === "patch") candidate = findPatchFallback(versions, latestVersion);
1732
+ else if (strat === "minor") candidate = findMinorFallback(versions, latestParsed);
1733
+ else if (strat === "major") candidate = findMajorFallback(versions, latestParsed);
1734
+ if (candidate && Date.now() - candidate.time >= timeMs) return candidate.version;
1735
+ }
1736
+ throw new Error(`Could not find a safe version for ${pkgName} within strategy [${strategy.join(",")}] and time window ${Math.floor(timeMs / MS_PER_HOUR)}h`);
1737
+ }
1738
+ /**
1739
+ * Check if snpx itself has an update available.
1740
+ * Returns { hasUpdate: boolean, currentVersion: string, latestVersion: string|null }
1741
+ */
1742
+ async function checkSelfUpdate() {
1743
+ try {
1744
+ const latest = (await fetchPackageMetadata(PKG_NAME))["dist-tags"]?.latest;
1745
+ if (!latest) return {
1746
+ hasUpdate: false,
1747
+ currentVersion: VERSION,
1748
+ latestVersion: null
1749
+ };
1750
+ return {
1751
+ hasUpdate: latest !== VERSION,
1752
+ currentVersion: VERSION,
1753
+ latestVersion: latest
1754
+ };
1755
+ } catch {
1756
+ return {
1757
+ hasUpdate: false,
1758
+ currentVersion: VERSION,
1759
+ latestVersion: null
1760
+ };
1761
+ }
1762
+ }
1763
+ //#endregion
1764
+ //#region src/cache.ts
1765
+ init_constants();
1766
+ /**
1767
+ * Read cached version if valid.
1768
+ * Cache TTL now follows the safety window (timeMs).
1769
+ */
1770
+ function getCachedVersion(pkgName, ttlMs = 24 * MS_PER_HOUR) {
1771
+ const cacheFile = join(CACHE_DIR, `${pkgName.replaceAll("/", "--")}.json`);
1772
+ if (!existsSync(cacheFile)) return null;
1773
+ try {
1774
+ const data = JSON.parse(readFileSync(cacheFile, "utf8"));
1775
+ if (Date.now() - (data.resolvedAt || 0) > ttlMs) return null;
1776
+ return data.version;
1777
+ } catch {
1778
+ return null;
1779
+ }
1780
+ }
1781
+ /**
1782
+ * Write version to cache atomically to prevent corruption during concurrent writes.
1783
+ */
1784
+ function setCachedVersion(pkgName, version) {
1785
+ mkdirSync(CACHE_DIR, { recursive: true });
1786
+ const cacheFile = join(CACHE_DIR, `${pkgName.replaceAll("/", "--")}.json`);
1787
+ const tmpFile = `${cacheFile}.${process.pid}.${Date.now()}.tmp`;
1788
+ writeFileSync(tmpFile, JSON.stringify({
1789
+ version,
1790
+ resolvedAt: Date.now()
1791
+ }));
1792
+ renameSync(tmpFile, cacheFile);
1793
+ }
1794
+ //#endregion
1795
+ //#region src/index.ts
1796
+ /**
1797
+ * safe-npx (snpx) - Safe npx wrapper with configurable fallback strategy
1798
+ */
1799
+ init_constants();
1800
+ init_registry();
1801
+ /**
1802
+ * Run npx with proper exit code handling.
1803
+ */
1804
+ function runNpx(args) {
1805
+ return new Promise((resolve, reject) => {
1806
+ const child = spawn("npx", args, { stdio: "inherit" });
1807
+ child.on("close", (code) => {
1808
+ process.exitCode = code ?? 0;
1809
+ resolve();
1810
+ });
1811
+ child.on("error", reject);
1812
+ });
1813
+ }
1814
+ /**
1815
+ * Main entry
1816
+ */
1817
+ async function main() {
1818
+ const { snpxFlags, pkgSpec, pkgName, npxPrefixArgs, restArgs } = parseArgs(process.argv);
1819
+ if (snpxFlags.help) {
1820
+ console.log(HELP_TEXT);
1821
+ return;
1822
+ }
1823
+ if (snpxFlags.version) {
1824
+ console.log(VERSION);
1825
+ return;
1826
+ }
1827
+ const { timeHours, timeMs, strategy } = buildOptions(snpxFlags);
1828
+ const selfUpdate = snpxFlags.selfUpdate;
1829
+ const unsafeSelfUpdate = snpxFlags.unsafeSelfUpdate;
1830
+ if (selfUpdate || unsafeSelfUpdate) {
1831
+ const unsafe = unsafeSelfUpdate;
1832
+ console.error(`[snpx] Checking for updates${unsafe ? " (unsafe mode)" : ""}...`);
1833
+ try {
1834
+ const { hasUpdate, currentVersion, latestVersion } = await checkSelfUpdate();
1835
+ if (!latestVersion) {
1836
+ console.error("[snpx] Could not check for updates. Try again later.");
1837
+ process.exit(1);
1838
+ }
1839
+ if (hasUpdate) {
1840
+ console.error(`[snpx] Update available: ${currentVersion} → ${latestVersion}`);
1841
+ console.error("[snpx] Run: npm update -g @lionad/safe-npx");
1842
+ if (!unsafe) {
1843
+ const { fetchPackageMetadata } = await Promise.resolve().then(() => (init_registry(), registry_exports));
1844
+ const { REGISTRY } = await Promise.resolve().then(() => (init_constants(), constants_exports));
1845
+ const latestTime = ((await fetchPackageMetadata("@lionad/safe-npx")).time || {})[latestVersion];
1846
+ if (latestTime) {
1847
+ const age = Date.now() - new Date(latestTime).getTime();
1848
+ if (age < timeMs) {
1849
+ console.error(`[snpx] Warning: Latest version is only ${Math.floor(age / MS_PER_HOUR)}h old. Waiting for ${timeHours}h safety window.`);
1850
+ console.error("[snpx] Use --unsafe-self-update to bypass (not recommended)");
1851
+ }
1852
+ }
1853
+ }
1854
+ } else console.error(`[snpx] Already up to date (${currentVersion})`);
1855
+ } catch (err) {
1856
+ console.error(`[snpx] Error checking for updates: ${err.message}`);
1857
+ process.exit(1);
1858
+ }
1859
+ return;
1860
+ }
1861
+ if (!pkgSpec || !pkgName) {
1862
+ await runNpx([...npxPrefixArgs, ...restArgs]);
1863
+ return;
1864
+ }
1865
+ if (!shouldIntercept(pkgSpec)) {
1866
+ await runNpx([
1867
+ ...npxPrefixArgs,
1868
+ pkgSpec,
1869
+ ...restArgs
1870
+ ]);
1871
+ return;
1872
+ }
1873
+ let version = getCachedVersion(pkgName, timeMs);
1874
+ if (!version) {
1875
+ console.error(`[snpx] Resolving safe version for ${pkgName}...`);
1876
+ try {
1877
+ version = await resolveSafeVersion(pkgName, {
1878
+ timeMs,
1879
+ strategy
1880
+ });
1881
+ setCachedVersion(pkgName, version);
1882
+ console.error(`[snpx] Using ${pkgName}@${version} (strategy: ${strategy.join(",")}, window: ${timeHours}h)`);
1883
+ } catch (err) {
1884
+ console.error(`[snpx] Error: ${err.message}`);
1885
+ process.exit(1);
1886
+ }
1887
+ } else console.error(`[snpx] Using cached ${pkgName}@${version}`);
1888
+ if (snpxFlags.showVersion) {
1889
+ console.log(version);
1890
+ return;
1891
+ }
1892
+ await runNpx([`${pkgName}@${version}`, ...restArgs]);
1893
+ }
1894
+ main().catch((err) => {
1895
+ console.error(`[snpx] Fatal: ${err.message}`);
1896
+ process.exit(1);
1897
+ });
1898
+ //#endregion
1899
+ export { CACHE_DIR, DEFAULT_FALLBACK_STRATEGY, DEFAULT_TIME_HOURS, HELP_TEXT, MS_PER_HOUR, PKG_NAME, REGISTRY, VERSION, buildOptions, buildVersionList, checkSelfUpdate, fetchPackageMetadata, findMajorFallback, findMinorFallback, findPatchFallback, getCachedVersion, parseArgs, parseSemver, resolveSafeVersion, setCachedVersion, shouldIntercept };