auix 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,1851 @@
1
+ #!/usr/bin/env node
2
+ import { formatWithOptions } from "node:util";
3
+ import { dirname, join, resolve, sep } from "node:path";
4
+ import g$1 from "node:process";
5
+ import * as tty from "node:tty";
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { homedir } from "node:os";
8
+ import { execSync } from "node:child_process";
9
+ import { createInterface } from "node:readline/promises";
10
+
11
+ //#region ../../node_modules/consola/dist/core.mjs
12
+ const LogLevels = {
13
+ silent: Number.NEGATIVE_INFINITY,
14
+ fatal: 0,
15
+ error: 0,
16
+ warn: 1,
17
+ log: 2,
18
+ info: 3,
19
+ success: 3,
20
+ fail: 3,
21
+ ready: 3,
22
+ start: 3,
23
+ box: 3,
24
+ debug: 4,
25
+ trace: 5,
26
+ verbose: Number.POSITIVE_INFINITY
27
+ };
28
+ const LogTypes = {
29
+ silent: { level: -1 },
30
+ fatal: { level: LogLevels.fatal },
31
+ error: { level: LogLevels.error },
32
+ warn: { level: LogLevels.warn },
33
+ log: { level: LogLevels.log },
34
+ info: { level: LogLevels.info },
35
+ success: { level: LogLevels.success },
36
+ fail: { level: LogLevels.fail },
37
+ ready: { level: LogLevels.info },
38
+ start: { level: LogLevels.info },
39
+ box: { level: LogLevels.info },
40
+ debug: { level: LogLevels.debug },
41
+ trace: { level: LogLevels.trace },
42
+ verbose: { level: LogLevels.verbose }
43
+ };
44
+ function isPlainObject$1(value) {
45
+ if (value === null || typeof value !== "object") return false;
46
+ const prototype = Object.getPrototypeOf(value);
47
+ if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) return false;
48
+ if (Symbol.iterator in value) return false;
49
+ if (Symbol.toStringTag in value) return Object.prototype.toString.call(value) === "[object Module]";
50
+ return true;
51
+ }
52
+ function _defu(baseObject, defaults, namespace = ".", merger) {
53
+ if (!isPlainObject$1(defaults)) return _defu(baseObject, {}, namespace, merger);
54
+ const object = Object.assign({}, defaults);
55
+ for (const key in baseObject) {
56
+ if (key === "__proto__" || key === "constructor") continue;
57
+ const value = baseObject[key];
58
+ if (value === null || value === void 0) continue;
59
+ if (merger && merger(object, key, value, namespace)) continue;
60
+ if (Array.isArray(value) && Array.isArray(object[key])) object[key] = [...value, ...object[key]];
61
+ else if (isPlainObject$1(value) && isPlainObject$1(object[key])) object[key] = _defu(value, object[key], (namespace ? `${namespace}.` : "") + key.toString(), merger);
62
+ else object[key] = value;
63
+ }
64
+ return object;
65
+ }
66
+ function createDefu(merger) {
67
+ return (...arguments_) => arguments_.reduce((p, c) => _defu(p, c, "", merger), {});
68
+ }
69
+ const defu = createDefu();
70
+ function isPlainObject(obj) {
71
+ return Object.prototype.toString.call(obj) === "[object Object]";
72
+ }
73
+ function isLogObj(arg) {
74
+ if (!isPlainObject(arg)) return false;
75
+ if (!arg.message && !arg.args) return false;
76
+ if (arg.stack) return false;
77
+ return true;
78
+ }
79
+ let paused = false;
80
+ const queue = [];
81
+ var Consola = class Consola {
82
+ options;
83
+ _lastLog;
84
+ _mockFn;
85
+ /**
86
+ * Creates an instance of Consola with specified options or defaults.
87
+ *
88
+ * @param {Partial<ConsolaOptions>} [options={}] - Configuration options for the Consola instance.
89
+ */
90
+ constructor(options = {}) {
91
+ const types = options.types || LogTypes;
92
+ this.options = defu({
93
+ ...options,
94
+ defaults: { ...options.defaults },
95
+ level: _normalizeLogLevel(options.level, types),
96
+ reporters: [...options.reporters || []]
97
+ }, {
98
+ types: LogTypes,
99
+ throttle: 1e3,
100
+ throttleMin: 5,
101
+ formatOptions: {
102
+ date: true,
103
+ colors: false,
104
+ compact: true
105
+ }
106
+ });
107
+ for (const type in types) {
108
+ const defaults = {
109
+ type,
110
+ ...this.options.defaults,
111
+ ...types[type]
112
+ };
113
+ this[type] = this._wrapLogFn(defaults);
114
+ this[type].raw = this._wrapLogFn(defaults, true);
115
+ }
116
+ if (this.options.mockFn) this.mockTypes();
117
+ this._lastLog = {};
118
+ }
119
+ /**
120
+ * Gets the current log level of the Consola instance.
121
+ *
122
+ * @returns {number} The current log level.
123
+ */
124
+ get level() {
125
+ return this.options.level;
126
+ }
127
+ /**
128
+ * Sets the minimum log level that will be output by the instance.
129
+ *
130
+ * @param {number} level - The new log level to set.
131
+ */
132
+ set level(level) {
133
+ this.options.level = _normalizeLogLevel(level, this.options.types, this.options.level);
134
+ }
135
+ /**
136
+ * Displays a prompt to the user and returns the response.
137
+ * Throw an error if `prompt` is not supported by the current configuration.
138
+ *
139
+ * @template T
140
+ * @param {string} message - The message to display in the prompt.
141
+ * @param {T} [opts] - Optional options for the prompt. See {@link PromptOptions}.
142
+ * @returns {promise<T>} A promise that infer with the prompt options. See {@link PromptOptions}.
143
+ */
144
+ prompt(message, opts) {
145
+ if (!this.options.prompt) throw new Error("prompt is not supported!");
146
+ return this.options.prompt(message, opts);
147
+ }
148
+ /**
149
+ * Creates a new instance of Consola, inheriting options from the current instance, with possible overrides.
150
+ *
151
+ * @param {Partial<ConsolaOptions>} options - Optional overrides for the new instance. See {@link ConsolaOptions}.
152
+ * @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.
153
+ */
154
+ create(options) {
155
+ const instance = new Consola({
156
+ ...this.options,
157
+ ...options
158
+ });
159
+ if (this._mockFn) instance.mockTypes(this._mockFn);
160
+ return instance;
161
+ }
162
+ /**
163
+ * Creates a new Consola instance with the specified default log object properties.
164
+ *
165
+ * @param {InputLogObject} defaults - Default properties to include in any log from the new instance. See {@link InputLogObject}.
166
+ * @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.
167
+ */
168
+ withDefaults(defaults) {
169
+ return this.create({
170
+ ...this.options,
171
+ defaults: {
172
+ ...this.options.defaults,
173
+ ...defaults
174
+ }
175
+ });
176
+ }
177
+ /**
178
+ * Creates a new Consola instance with a specified tag, which will be included in every log.
179
+ *
180
+ * @param {string} tag - The tag to include in each log of the new instance.
181
+ * @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.
182
+ */
183
+ withTag(tag) {
184
+ return this.withDefaults({ tag: this.options.defaults.tag ? this.options.defaults.tag + ":" + tag : tag });
185
+ }
186
+ /**
187
+ * Adds a custom reporter to the Consola instance.
188
+ * Reporters will be called for each log message, depending on their implementation and log level.
189
+ *
190
+ * @param {ConsolaReporter} reporter - The reporter to add. See {@link ConsolaReporter}.
191
+ * @returns {Consola} The current Consola instance.
192
+ */
193
+ addReporter(reporter) {
194
+ this.options.reporters.push(reporter);
195
+ return this;
196
+ }
197
+ /**
198
+ * Removes a custom reporter from the Consola instance.
199
+ * If no reporter is specified, all reporters will be removed.
200
+ *
201
+ * @param {ConsolaReporter} reporter - The reporter to remove. See {@link ConsolaReporter}.
202
+ * @returns {Consola} The current Consola instance.
203
+ */
204
+ removeReporter(reporter) {
205
+ if (reporter) {
206
+ const i = this.options.reporters.indexOf(reporter);
207
+ if (i !== -1) return this.options.reporters.splice(i, 1);
208
+ } else this.options.reporters.splice(0);
209
+ return this;
210
+ }
211
+ /**
212
+ * Replaces all reporters of the Consola instance with the specified array of reporters.
213
+ *
214
+ * @param {ConsolaReporter[]} reporters - The new reporters to set. See {@link ConsolaReporter}.
215
+ * @returns {Consola} The current Consola instance.
216
+ */
217
+ setReporters(reporters) {
218
+ this.options.reporters = Array.isArray(reporters) ? reporters : [reporters];
219
+ return this;
220
+ }
221
+ wrapAll() {
222
+ this.wrapConsole();
223
+ this.wrapStd();
224
+ }
225
+ restoreAll() {
226
+ this.restoreConsole();
227
+ this.restoreStd();
228
+ }
229
+ /**
230
+ * Overrides console methods with Consola logging methods for consistent logging.
231
+ */
232
+ wrapConsole() {
233
+ for (const type in this.options.types) {
234
+ if (!console["__" + type]) console["__" + type] = console[type];
235
+ console[type] = this[type].raw;
236
+ }
237
+ }
238
+ /**
239
+ * Restores the original console methods, removing Consola overrides.
240
+ */
241
+ restoreConsole() {
242
+ for (const type in this.options.types) if (console["__" + type]) {
243
+ console[type] = console["__" + type];
244
+ delete console["__" + type];
245
+ }
246
+ }
247
+ /**
248
+ * Overrides standard output and error streams to redirect them through Consola.
249
+ */
250
+ wrapStd() {
251
+ this._wrapStream(this.options.stdout, "log");
252
+ this._wrapStream(this.options.stderr, "log");
253
+ }
254
+ _wrapStream(stream, type) {
255
+ if (!stream) return;
256
+ if (!stream.__write) stream.__write = stream.write;
257
+ stream.write = (data) => {
258
+ this[type].raw(String(data).trim());
259
+ };
260
+ }
261
+ /**
262
+ * Restores the original standard output and error streams, removing the Consola redirection.
263
+ */
264
+ restoreStd() {
265
+ this._restoreStream(this.options.stdout);
266
+ this._restoreStream(this.options.stderr);
267
+ }
268
+ _restoreStream(stream) {
269
+ if (!stream) return;
270
+ if (stream.__write) {
271
+ stream.write = stream.__write;
272
+ delete stream.__write;
273
+ }
274
+ }
275
+ /**
276
+ * Pauses logging, queues incoming logs until resumed.
277
+ */
278
+ pauseLogs() {
279
+ paused = true;
280
+ }
281
+ /**
282
+ * Resumes logging, processing any queued logs.
283
+ */
284
+ resumeLogs() {
285
+ paused = false;
286
+ const _queue = queue.splice(0);
287
+ for (const item of _queue) item[0]._logFn(item[1], item[2]);
288
+ }
289
+ /**
290
+ * Replaces logging methods with mocks if a mock function is provided.
291
+ *
292
+ * @param {ConsolaOptions["mockFn"]} mockFn - The function to use for mocking logging methods. See {@link ConsolaOptions["mockFn"]}.
293
+ */
294
+ mockTypes(mockFn) {
295
+ const _mockFn = mockFn || this.options.mockFn;
296
+ this._mockFn = _mockFn;
297
+ if (typeof _mockFn !== "function") return;
298
+ for (const type in this.options.types) {
299
+ this[type] = _mockFn(type, this.options.types[type]) || this[type];
300
+ this[type].raw = this[type];
301
+ }
302
+ }
303
+ _wrapLogFn(defaults, isRaw) {
304
+ return (...args) => {
305
+ if (paused) {
306
+ queue.push([
307
+ this,
308
+ defaults,
309
+ args,
310
+ isRaw
311
+ ]);
312
+ return;
313
+ }
314
+ return this._logFn(defaults, args, isRaw);
315
+ };
316
+ }
317
+ _logFn(defaults, args, isRaw) {
318
+ if ((defaults.level || 0) > this.level) return false;
319
+ const logObj = {
320
+ date: /* @__PURE__ */ new Date(),
321
+ args: [],
322
+ ...defaults,
323
+ level: _normalizeLogLevel(defaults.level, this.options.types)
324
+ };
325
+ if (!isRaw && args.length === 1 && isLogObj(args[0])) Object.assign(logObj, args[0]);
326
+ else logObj.args = [...args];
327
+ if (logObj.message) {
328
+ logObj.args.unshift(logObj.message);
329
+ delete logObj.message;
330
+ }
331
+ if (logObj.additional) {
332
+ if (!Array.isArray(logObj.additional)) logObj.additional = logObj.additional.split("\n");
333
+ logObj.args.push("\n" + logObj.additional.join("\n"));
334
+ delete logObj.additional;
335
+ }
336
+ logObj.type = typeof logObj.type === "string" ? logObj.type.toLowerCase() : "log";
337
+ logObj.tag = typeof logObj.tag === "string" ? logObj.tag : "";
338
+ const resolveLog = (newLog = false) => {
339
+ const repeated = (this._lastLog.count || 0) - this.options.throttleMin;
340
+ if (this._lastLog.object && repeated > 0) {
341
+ const args2 = [...this._lastLog.object.args];
342
+ if (repeated > 1) args2.push(`(repeated ${repeated} times)`);
343
+ this._log({
344
+ ...this._lastLog.object,
345
+ args: args2
346
+ });
347
+ this._lastLog.count = 1;
348
+ }
349
+ if (newLog) {
350
+ this._lastLog.object = logObj;
351
+ this._log(logObj);
352
+ }
353
+ };
354
+ clearTimeout(this._lastLog.timeout);
355
+ const diffTime = this._lastLog.time && logObj.date ? logObj.date.getTime() - this._lastLog.time.getTime() : 0;
356
+ this._lastLog.time = logObj.date;
357
+ if (diffTime < this.options.throttle) try {
358
+ const serializedLog = JSON.stringify([
359
+ logObj.type,
360
+ logObj.tag,
361
+ logObj.args
362
+ ]);
363
+ const isSameLog = this._lastLog.serialized === serializedLog;
364
+ this._lastLog.serialized = serializedLog;
365
+ if (isSameLog) {
366
+ this._lastLog.count = (this._lastLog.count || 0) + 1;
367
+ if (this._lastLog.count > this.options.throttleMin) {
368
+ this._lastLog.timeout = setTimeout(resolveLog, this.options.throttle);
369
+ return;
370
+ }
371
+ }
372
+ } catch {}
373
+ resolveLog(true);
374
+ }
375
+ _log(logObj) {
376
+ for (const reporter of this.options.reporters) reporter.log(logObj, { options: this.options });
377
+ }
378
+ };
379
+ function _normalizeLogLevel(input, types = {}, defaultLevel = 3) {
380
+ if (input === void 0) return defaultLevel;
381
+ if (typeof input === "number") return input;
382
+ if (types[input] && types[input].level !== void 0) return types[input].level;
383
+ return defaultLevel;
384
+ }
385
+ Consola.prototype.add = Consola.prototype.addReporter;
386
+ Consola.prototype.remove = Consola.prototype.removeReporter;
387
+ Consola.prototype.clear = Consola.prototype.removeReporter;
388
+ Consola.prototype.withScope = Consola.prototype.withTag;
389
+ Consola.prototype.mock = Consola.prototype.mockTypes;
390
+ Consola.prototype.pause = Consola.prototype.pauseLogs;
391
+ Consola.prototype.resume = Consola.prototype.resumeLogs;
392
+ function createConsola$1(options = {}) {
393
+ return new Consola(options);
394
+ }
395
+
396
+ //#endregion
397
+ //#region ../../node_modules/consola/dist/shared/consola.DRwqZj3T.mjs
398
+ function parseStack(stack, message) {
399
+ const cwd = process.cwd() + sep;
400
+ return stack.split("\n").splice(message.split("\n").length).map((l) => l.trim().replace("file://", "").replace(cwd, ""));
401
+ }
402
+ function writeStream(data, stream) {
403
+ return (stream.__write || stream.write).call(stream, data);
404
+ }
405
+ const bracket = (x) => x ? `[${x}]` : "";
406
+ var BasicReporter = class {
407
+ formatStack(stack, message, opts) {
408
+ const indent = " ".repeat((opts?.errorLevel || 0) + 1);
409
+ return indent + parseStack(stack, message).join(`
410
+ ${indent}`);
411
+ }
412
+ formatError(err, opts) {
413
+ const message = err.message ?? formatWithOptions(opts, err);
414
+ const stack = err.stack ? this.formatStack(err.stack, message, opts) : "";
415
+ const level = opts?.errorLevel || 0;
416
+ const causedPrefix = level > 0 ? `${" ".repeat(level)}[cause]: ` : "";
417
+ const causedError = err.cause ? "\n\n" + this.formatError(err.cause, {
418
+ ...opts,
419
+ errorLevel: level + 1
420
+ }) : "";
421
+ return causedPrefix + message + "\n" + stack + causedError;
422
+ }
423
+ formatArgs(args, opts) {
424
+ return formatWithOptions(opts, ...args.map((arg) => {
425
+ if (arg && typeof arg.stack === "string") return this.formatError(arg, opts);
426
+ return arg;
427
+ }));
428
+ }
429
+ formatDate(date, opts) {
430
+ return opts.date ? date.toLocaleTimeString() : "";
431
+ }
432
+ filterAndJoin(arr) {
433
+ return arr.filter(Boolean).join(" ");
434
+ }
435
+ formatLogObj(logObj, opts) {
436
+ const message = this.formatArgs(logObj.args, opts);
437
+ if (logObj.type === "box") return "\n" + [
438
+ bracket(logObj.tag),
439
+ logObj.title && logObj.title,
440
+ ...message.split("\n")
441
+ ].filter(Boolean).map((l) => " > " + l).join("\n") + "\n";
442
+ return this.filterAndJoin([
443
+ bracket(logObj.type),
444
+ bracket(logObj.tag),
445
+ message
446
+ ]);
447
+ }
448
+ log(logObj, ctx) {
449
+ return writeStream(this.formatLogObj(logObj, {
450
+ columns: ctx.options.stdout.columns || 0,
451
+ ...ctx.options.formatOptions
452
+ }) + "\n", logObj.level < 2 ? ctx.options.stderr || process.stderr : ctx.options.stdout || process.stdout);
453
+ }
454
+ };
455
+
456
+ //#endregion
457
+ //#region ../../node_modules/consola/dist/shared/consola.DXBYu-KD.mjs
458
+ const { env = {}, argv = [], platform = "" } = typeof process === "undefined" ? {} : process;
459
+ const isDisabled = "NO_COLOR" in env || argv.includes("--no-color");
460
+ const isForced = "FORCE_COLOR" in env || argv.includes("--color");
461
+ const isWindows = platform === "win32";
462
+ const isDumbTerminal = env.TERM === "dumb";
463
+ const isCompatibleTerminal = tty && tty.isatty && tty.isatty(1) && env.TERM && !isDumbTerminal;
464
+ const isCI = "CI" in env && ("GITHUB_ACTIONS" in env || "GITLAB_CI" in env || "CIRCLECI" in env);
465
+ const isColorSupported = !isDisabled && (isForced || isWindows && !isDumbTerminal || isCompatibleTerminal || isCI);
466
+ function replaceClose(index, string, close, replace, head = string.slice(0, Math.max(0, index)) + replace, tail = string.slice(Math.max(0, index + close.length)), next = tail.indexOf(close)) {
467
+ return head + (next < 0 ? tail : replaceClose(next, tail, close, replace));
468
+ }
469
+ function clearBleed(index, string, open, close, replace) {
470
+ return index < 0 ? open + string + close : open + replaceClose(index, string, close, replace) + close;
471
+ }
472
+ function filterEmpty(open, close, replace = open, at = open.length + 1) {
473
+ return (string) => string || !(string === "" || string === void 0) ? clearBleed(("" + string).indexOf(close, at), string, open, close, replace) : "";
474
+ }
475
+ function init(open, close, replace) {
476
+ return filterEmpty(`\x1B[${open}m`, `\x1B[${close}m`, replace);
477
+ }
478
+ const colorDefs = {
479
+ reset: init(0, 0),
480
+ bold: init(1, 22, "\x1B[22m\x1B[1m"),
481
+ dim: init(2, 22, "\x1B[22m\x1B[2m"),
482
+ italic: init(3, 23),
483
+ underline: init(4, 24),
484
+ inverse: init(7, 27),
485
+ hidden: init(8, 28),
486
+ strikethrough: init(9, 29),
487
+ black: init(30, 39),
488
+ red: init(31, 39),
489
+ green: init(32, 39),
490
+ yellow: init(33, 39),
491
+ blue: init(34, 39),
492
+ magenta: init(35, 39),
493
+ cyan: init(36, 39),
494
+ white: init(37, 39),
495
+ gray: init(90, 39),
496
+ bgBlack: init(40, 49),
497
+ bgRed: init(41, 49),
498
+ bgGreen: init(42, 49),
499
+ bgYellow: init(43, 49),
500
+ bgBlue: init(44, 49),
501
+ bgMagenta: init(45, 49),
502
+ bgCyan: init(46, 49),
503
+ bgWhite: init(47, 49),
504
+ blackBright: init(90, 39),
505
+ redBright: init(91, 39),
506
+ greenBright: init(92, 39),
507
+ yellowBright: init(93, 39),
508
+ blueBright: init(94, 39),
509
+ magentaBright: init(95, 39),
510
+ cyanBright: init(96, 39),
511
+ whiteBright: init(97, 39),
512
+ bgBlackBright: init(100, 49),
513
+ bgRedBright: init(101, 49),
514
+ bgGreenBright: init(102, 49),
515
+ bgYellowBright: init(103, 49),
516
+ bgBlueBright: init(104, 49),
517
+ bgMagentaBright: init(105, 49),
518
+ bgCyanBright: init(106, 49),
519
+ bgWhiteBright: init(107, 49)
520
+ };
521
+ function createColors(useColor = isColorSupported) {
522
+ return useColor ? colorDefs : Object.fromEntries(Object.keys(colorDefs).map((key) => [key, String]));
523
+ }
524
+ const colors = createColors();
525
+ function getColor$1(color, fallback = "reset") {
526
+ return colors[color] || colors[fallback];
527
+ }
528
+ const ansiRegex$1 = [String.raw`[\u001B\u009B][[\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\d\/#&.:=?%@~_]+)*|[a-zA-Z\d]+(?:;[-a-zA-Z\d\/#&.:=?%@~_]*)*)?\u0007)`, String.raw`(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))`].join("|");
529
+ function stripAnsi$1(text) {
530
+ return text.replace(new RegExp(ansiRegex$1, "g"), "");
531
+ }
532
+ const boxStylePresets = {
533
+ solid: {
534
+ tl: "┌",
535
+ tr: "┐",
536
+ bl: "└",
537
+ br: "┘",
538
+ h: "─",
539
+ v: "│"
540
+ },
541
+ double: {
542
+ tl: "╔",
543
+ tr: "╗",
544
+ bl: "╚",
545
+ br: "╝",
546
+ h: "═",
547
+ v: "║"
548
+ },
549
+ doubleSingle: {
550
+ tl: "╓",
551
+ tr: "╖",
552
+ bl: "╙",
553
+ br: "╜",
554
+ h: "─",
555
+ v: "║"
556
+ },
557
+ doubleSingleRounded: {
558
+ tl: "╭",
559
+ tr: "╮",
560
+ bl: "╰",
561
+ br: "╯",
562
+ h: "─",
563
+ v: "║"
564
+ },
565
+ singleThick: {
566
+ tl: "┏",
567
+ tr: "┓",
568
+ bl: "┗",
569
+ br: "┛",
570
+ h: "━",
571
+ v: "┃"
572
+ },
573
+ singleDouble: {
574
+ tl: "╒",
575
+ tr: "╕",
576
+ bl: "╘",
577
+ br: "╛",
578
+ h: "═",
579
+ v: "│"
580
+ },
581
+ singleDoubleRounded: {
582
+ tl: "╭",
583
+ tr: "╮",
584
+ bl: "╰",
585
+ br: "╯",
586
+ h: "═",
587
+ v: "│"
588
+ },
589
+ rounded: {
590
+ tl: "╭",
591
+ tr: "╮",
592
+ bl: "╰",
593
+ br: "╯",
594
+ h: "─",
595
+ v: "│"
596
+ }
597
+ };
598
+ const defaultStyle = {
599
+ borderColor: "white",
600
+ borderStyle: "rounded",
601
+ valign: "center",
602
+ padding: 2,
603
+ marginLeft: 1,
604
+ marginTop: 1,
605
+ marginBottom: 1
606
+ };
607
+ function box(text, _opts = {}) {
608
+ const opts = {
609
+ ..._opts,
610
+ style: {
611
+ ...defaultStyle,
612
+ ..._opts.style
613
+ }
614
+ };
615
+ const textLines = text.split("\n");
616
+ const boxLines = [];
617
+ const _color = getColor$1(opts.style.borderColor);
618
+ const borderStyle = { ...typeof opts.style.borderStyle === "string" ? boxStylePresets[opts.style.borderStyle] || boxStylePresets.solid : opts.style.borderStyle };
619
+ if (_color) for (const key in borderStyle) borderStyle[key] = _color(borderStyle[key]);
620
+ const paddingOffset = opts.style.padding % 2 === 0 ? opts.style.padding : opts.style.padding + 1;
621
+ const height = textLines.length + paddingOffset;
622
+ const width = Math.max(...textLines.map((line) => stripAnsi$1(line).length), opts.title ? stripAnsi$1(opts.title).length : 0) + paddingOffset;
623
+ const widthOffset = width + paddingOffset;
624
+ const leftSpace = opts.style.marginLeft > 0 ? " ".repeat(opts.style.marginLeft) : "";
625
+ if (opts.style.marginTop > 0) boxLines.push("".repeat(opts.style.marginTop));
626
+ if (opts.title) {
627
+ const title = _color ? _color(opts.title) : opts.title;
628
+ const left = borderStyle.h.repeat(Math.floor((width - stripAnsi$1(opts.title).length) / 2));
629
+ const right = borderStyle.h.repeat(width - stripAnsi$1(opts.title).length - stripAnsi$1(left).length + paddingOffset);
630
+ boxLines.push(`${leftSpace}${borderStyle.tl}${left}${title}${right}${borderStyle.tr}`);
631
+ } else boxLines.push(`${leftSpace}${borderStyle.tl}${borderStyle.h.repeat(widthOffset)}${borderStyle.tr}`);
632
+ const valignOffset = opts.style.valign === "center" ? Math.floor((height - textLines.length) / 2) : opts.style.valign === "top" ? height - textLines.length - paddingOffset : height - textLines.length;
633
+ for (let i = 0; i < height; i++) if (i < valignOffset || i >= valignOffset + textLines.length) boxLines.push(`${leftSpace}${borderStyle.v}${" ".repeat(widthOffset)}${borderStyle.v}`);
634
+ else {
635
+ const line = textLines[i - valignOffset];
636
+ const left = " ".repeat(paddingOffset);
637
+ const right = " ".repeat(width - stripAnsi$1(line).length);
638
+ boxLines.push(`${leftSpace}${borderStyle.v}${left}${line}${right}${borderStyle.v}`);
639
+ }
640
+ boxLines.push(`${leftSpace}${borderStyle.bl}${borderStyle.h.repeat(widthOffset)}${borderStyle.br}`);
641
+ if (opts.style.marginBottom > 0) boxLines.push("".repeat(opts.style.marginBottom));
642
+ return boxLines.join("\n");
643
+ }
644
+
645
+ //#endregion
646
+ //#region ../../node_modules/consola/dist/index.mjs
647
+ const r = Object.create(null), i = (e) => globalThis.process?.env || import.meta.env || globalThis.Deno?.env.toObject() || globalThis.__env__ || (e ? r : globalThis), o = new Proxy(r, {
648
+ get(e, s) {
649
+ return i()[s] ?? r[s];
650
+ },
651
+ has(e, s) {
652
+ return s in i() || s in r;
653
+ },
654
+ set(e, s, E) {
655
+ const B = i(true);
656
+ return B[s] = E, true;
657
+ },
658
+ deleteProperty(e, s) {
659
+ if (!s) return false;
660
+ const E = i(true);
661
+ return delete E[s], true;
662
+ },
663
+ ownKeys() {
664
+ const e = i(true);
665
+ return Object.keys(e);
666
+ }
667
+ }), t = typeof process < "u" && process.env && process.env.NODE_ENV || "", f = [
668
+ ["APPVEYOR"],
669
+ [
670
+ "AWS_AMPLIFY",
671
+ "AWS_APP_ID",
672
+ { ci: true }
673
+ ],
674
+ ["AZURE_PIPELINES", "SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"],
675
+ ["AZURE_STATIC", "INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN"],
676
+ ["APPCIRCLE", "AC_APPCIRCLE"],
677
+ ["BAMBOO", "bamboo_planKey"],
678
+ ["BITBUCKET", "BITBUCKET_COMMIT"],
679
+ ["BITRISE", "BITRISE_IO"],
680
+ ["BUDDY", "BUDDY_WORKSPACE_ID"],
681
+ ["BUILDKITE"],
682
+ ["CIRCLE", "CIRCLECI"],
683
+ ["CIRRUS", "CIRRUS_CI"],
684
+ [
685
+ "CLOUDFLARE_PAGES",
686
+ "CF_PAGES",
687
+ { ci: true }
688
+ ],
689
+ ["CODEBUILD", "CODEBUILD_BUILD_ARN"],
690
+ ["CODEFRESH", "CF_BUILD_ID"],
691
+ ["DRONE"],
692
+ ["DRONE", "DRONE_BUILD_EVENT"],
693
+ ["DSARI"],
694
+ ["GITHUB_ACTIONS"],
695
+ ["GITLAB", "GITLAB_CI"],
696
+ ["GITLAB", "CI_MERGE_REQUEST_ID"],
697
+ ["GOCD", "GO_PIPELINE_LABEL"],
698
+ ["LAYERCI"],
699
+ ["HUDSON", "HUDSON_URL"],
700
+ ["JENKINS", "JENKINS_URL"],
701
+ ["MAGNUM"],
702
+ ["NETLIFY"],
703
+ [
704
+ "NETLIFY",
705
+ "NETLIFY_LOCAL",
706
+ { ci: false }
707
+ ],
708
+ ["NEVERCODE"],
709
+ ["RENDER"],
710
+ ["SAIL", "SAILCI"],
711
+ ["SEMAPHORE"],
712
+ ["SCREWDRIVER"],
713
+ ["SHIPPABLE"],
714
+ ["SOLANO", "TDDIUM"],
715
+ ["STRIDER"],
716
+ ["TEAMCITY", "TEAMCITY_VERSION"],
717
+ ["TRAVIS"],
718
+ ["VERCEL", "NOW_BUILDER"],
719
+ [
720
+ "VERCEL",
721
+ "VERCEL",
722
+ { ci: false }
723
+ ],
724
+ [
725
+ "VERCEL",
726
+ "VERCEL_ENV",
727
+ { ci: false }
728
+ ],
729
+ ["APPCENTER", "APPCENTER_BUILD_ID"],
730
+ [
731
+ "CODESANDBOX",
732
+ "CODESANDBOX_SSE",
733
+ { ci: false }
734
+ ],
735
+ [
736
+ "CODESANDBOX",
737
+ "CODESANDBOX_HOST",
738
+ { ci: false }
739
+ ],
740
+ ["STACKBLITZ"],
741
+ ["STORMKIT"],
742
+ ["CLEAVR"],
743
+ ["ZEABUR"],
744
+ [
745
+ "CODESPHERE",
746
+ "CODESPHERE_APP_ID",
747
+ { ci: true }
748
+ ],
749
+ ["RAILWAY", "RAILWAY_PROJECT_ID"],
750
+ ["RAILWAY", "RAILWAY_SERVICE_ID"],
751
+ ["DENO-DEPLOY", "DENO_DEPLOYMENT_ID"],
752
+ [
753
+ "FIREBASE_APP_HOSTING",
754
+ "FIREBASE_APP_HOSTING",
755
+ { ci: true }
756
+ ]
757
+ ];
758
+ function b() {
759
+ if (globalThis.process?.env) for (const e of f) {
760
+ const s = e[1] || e[0];
761
+ if (globalThis.process?.env[s]) return {
762
+ name: e[0].toLowerCase(),
763
+ ...e[2]
764
+ };
765
+ }
766
+ return globalThis.process?.env?.SHELL === "/bin/jsh" && globalThis.process?.versions?.webcontainer ? {
767
+ name: "stackblitz",
768
+ ci: false
769
+ } : {
770
+ name: "",
771
+ ci: false
772
+ };
773
+ }
774
+ const l = b();
775
+ l.name;
776
+ function n(e) {
777
+ return e ? e !== "false" : false;
778
+ }
779
+ const I = globalThis.process?.platform || "", T = n(o.CI) || l.ci !== false, a = n(globalThis.process?.stdout && globalThis.process?.stdout.isTTY), g = n(o.DEBUG), R = t === "test" || n(o.TEST);
780
+ n(o.MINIMAL);
781
+ const A = /^win/i.test(I);
782
+ !n(o.NO_COLOR) && (n(o.FORCE_COLOR) || (a || A) && o.TERM);
783
+ const C = (globalThis.process?.versions?.node || "").replace(/^v/, "") || null;
784
+ Number(C?.split(".")[0]);
785
+ const y = globalThis.process || Object.create(null), _ = { versions: {} };
786
+ new Proxy(y, { get(e, s) {
787
+ if (s === "env") return o;
788
+ if (s in e) return e[s];
789
+ if (s in _) return _[s];
790
+ } });
791
+ const c = globalThis.process?.release?.name === "node", O = !!globalThis.Bun || !!globalThis.process?.versions?.bun, D = !!globalThis.Deno, L = !!globalThis.fastly, S = !!globalThis.Netlify, u = !!globalThis.EdgeRuntime, N = globalThis.navigator?.userAgent === "Cloudflare-Workers", F = [
792
+ [S, "netlify"],
793
+ [u, "edge-light"],
794
+ [N, "workerd"],
795
+ [L, "fastly"],
796
+ [D, "deno"],
797
+ [O, "bun"],
798
+ [c, "node"]
799
+ ];
800
+ function G() {
801
+ const e = F.find((s) => s[0]);
802
+ if (e) return { name: e[1] };
803
+ }
804
+ G()?.name;
805
+ function ansiRegex({ onlyFirst = false } = {}) {
806
+ const pattern = [`[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))`, "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");
807
+ return new RegExp(pattern, onlyFirst ? void 0 : "g");
808
+ }
809
+ const regex = ansiRegex();
810
+ function stripAnsi(string) {
811
+ if (typeof string !== "string") throw new TypeError(`Expected a \`string\`, got \`${typeof string}\``);
812
+ return string.replace(regex, "");
813
+ }
814
+ function isAmbiguous(x) {
815
+ return x === 161 || x === 164 || x === 167 || x === 168 || x === 170 || x === 173 || x === 174 || x >= 176 && x <= 180 || x >= 182 && x <= 186 || x >= 188 && x <= 191 || x === 198 || x === 208 || x === 215 || x === 216 || x >= 222 && x <= 225 || x === 230 || x >= 232 && x <= 234 || x === 236 || x === 237 || x === 240 || x === 242 || x === 243 || x >= 247 && x <= 250 || x === 252 || x === 254 || x === 257 || x === 273 || x === 275 || x === 283 || x === 294 || x === 295 || x === 299 || x >= 305 && x <= 307 || x === 312 || x >= 319 && x <= 322 || x === 324 || x >= 328 && x <= 331 || x === 333 || x === 338 || x === 339 || x === 358 || x === 359 || x === 363 || x === 462 || x === 464 || x === 466 || x === 468 || x === 470 || x === 472 || x === 474 || x === 476 || x === 593 || x === 609 || x === 708 || x === 711 || x >= 713 && x <= 715 || x === 717 || x === 720 || x >= 728 && x <= 731 || x === 733 || x === 735 || x >= 768 && x <= 879 || x >= 913 && x <= 929 || x >= 931 && x <= 937 || x >= 945 && x <= 961 || x >= 963 && x <= 969 || x === 1025 || x >= 1040 && x <= 1103 || x === 1105 || x === 8208 || x >= 8211 && x <= 8214 || x === 8216 || x === 8217 || x === 8220 || x === 8221 || x >= 8224 && x <= 8226 || x >= 8228 && x <= 8231 || x === 8240 || x === 8242 || x === 8243 || x === 8245 || x === 8251 || x === 8254 || x === 8308 || x === 8319 || x >= 8321 && x <= 8324 || x === 8364 || x === 8451 || x === 8453 || x === 8457 || x === 8467 || x === 8470 || x === 8481 || x === 8482 || x === 8486 || x === 8491 || x === 8531 || x === 8532 || x >= 8539 && x <= 8542 || x >= 8544 && x <= 8555 || x >= 8560 && x <= 8569 || x === 8585 || x >= 8592 && x <= 8601 || x === 8632 || x === 8633 || x === 8658 || x === 8660 || x === 8679 || x === 8704 || x === 8706 || x === 8707 || x === 8711 || x === 8712 || x === 8715 || x === 8719 || x === 8721 || x === 8725 || x === 8730 || x >= 8733 && x <= 8736 || x === 8739 || x === 8741 || x >= 8743 && x <= 8748 || x === 8750 || x >= 8756 && x <= 8759 || x === 8764 || x === 8765 || x === 8776 || x === 8780 || x === 8786 || x === 8800 || x === 8801 || x >= 8804 && x <= 8807 || x === 8810 || x === 8811 || x === 8814 || x === 8815 || x === 8834 || x === 8835 || x === 8838 || x === 8839 || x === 8853 || x === 8857 || x === 8869 || x === 8895 || x === 8978 || x >= 9312 && x <= 9449 || x >= 9451 && x <= 9547 || x >= 9552 && x <= 9587 || x >= 9600 && x <= 9615 || x >= 9618 && x <= 9621 || x === 9632 || x === 9633 || x >= 9635 && x <= 9641 || x === 9650 || x === 9651 || x === 9654 || x === 9655 || x === 9660 || x === 9661 || x === 9664 || x === 9665 || x >= 9670 && x <= 9672 || x === 9675 || x >= 9678 && x <= 9681 || x >= 9698 && x <= 9701 || x === 9711 || x === 9733 || x === 9734 || x === 9737 || x === 9742 || x === 9743 || x === 9756 || x === 9758 || x === 9792 || x === 9794 || x === 9824 || x === 9825 || x >= 9827 && x <= 9829 || x >= 9831 && x <= 9834 || x === 9836 || x === 9837 || x === 9839 || x === 9886 || x === 9887 || x === 9919 || x >= 9926 && x <= 9933 || x >= 9935 && x <= 9939 || x >= 9941 && x <= 9953 || x === 9955 || x === 9960 || x === 9961 || x >= 9963 && x <= 9969 || x === 9972 || x >= 9974 && x <= 9977 || x === 9979 || x === 9980 || x === 9982 || x === 9983 || x === 10045 || x >= 10102 && x <= 10111 || x >= 11094 && x <= 11097 || x >= 12872 && x <= 12879 || x >= 57344 && x <= 63743 || x >= 65024 && x <= 65039 || x === 65533 || x >= 127232 && x <= 127242 || x >= 127248 && x <= 127277 || x >= 127280 && x <= 127337 || x >= 127344 && x <= 127373 || x === 127375 || x === 127376 || x >= 127387 && x <= 127404 || x >= 917760 && x <= 917999 || x >= 983040 && x <= 1048573 || x >= 1048576 && x <= 1114109;
816
+ }
817
+ function isFullWidth(x) {
818
+ return x === 12288 || x >= 65281 && x <= 65376 || x >= 65504 && x <= 65510;
819
+ }
820
+ function isWide(x) {
821
+ return x >= 4352 && x <= 4447 || x === 8986 || x === 8987 || x === 9001 || x === 9002 || x >= 9193 && x <= 9196 || x === 9200 || x === 9203 || x === 9725 || x === 9726 || x === 9748 || x === 9749 || x >= 9776 && x <= 9783 || x >= 9800 && x <= 9811 || x === 9855 || x >= 9866 && x <= 9871 || x === 9875 || x === 9889 || x === 9898 || x === 9899 || x === 9917 || x === 9918 || x === 9924 || x === 9925 || x === 9934 || x === 9940 || x === 9962 || x === 9970 || x === 9971 || x === 9973 || x === 9978 || x === 9981 || x === 9989 || x === 9994 || x === 9995 || x === 10024 || x === 10060 || x === 10062 || x >= 10067 && x <= 10069 || x === 10071 || x >= 10133 && x <= 10135 || x === 10160 || x === 10175 || x === 11035 || x === 11036 || x === 11088 || x === 11093 || x >= 11904 && x <= 11929 || x >= 11931 && x <= 12019 || x >= 12032 && x <= 12245 || x >= 12272 && x <= 12287 || x >= 12289 && x <= 12350 || x >= 12353 && x <= 12438 || x >= 12441 && x <= 12543 || x >= 12549 && x <= 12591 || x >= 12593 && x <= 12686 || x >= 12688 && x <= 12773 || x >= 12783 && x <= 12830 || x >= 12832 && x <= 12871 || x >= 12880 && x <= 42124 || x >= 42128 && x <= 42182 || x >= 43360 && x <= 43388 || x >= 44032 && x <= 55203 || x >= 63744 && x <= 64255 || x >= 65040 && x <= 65049 || x >= 65072 && x <= 65106 || x >= 65108 && x <= 65126 || x >= 65128 && x <= 65131 || x >= 94176 && x <= 94180 || x === 94192 || x === 94193 || x >= 94208 && x <= 100343 || x >= 100352 && x <= 101589 || x >= 101631 && x <= 101640 || x >= 110576 && x <= 110579 || x >= 110581 && x <= 110587 || x === 110589 || x === 110590 || x >= 110592 && x <= 110882 || x === 110898 || x >= 110928 && x <= 110930 || x === 110933 || x >= 110948 && x <= 110951 || x >= 110960 && x <= 111355 || x >= 119552 && x <= 119638 || x >= 119648 && x <= 119670 || x === 126980 || x === 127183 || x === 127374 || x >= 127377 && x <= 127386 || x >= 127488 && x <= 127490 || x >= 127504 && x <= 127547 || x >= 127552 && x <= 127560 || x === 127568 || x === 127569 || x >= 127584 && x <= 127589 || x >= 127744 && x <= 127776 || x >= 127789 && x <= 127797 || x >= 127799 && x <= 127868 || x >= 127870 && x <= 127891 || x >= 127904 && x <= 127946 || x >= 127951 && x <= 127955 || x >= 127968 && x <= 127984 || x === 127988 || x >= 127992 && x <= 128062 || x === 128064 || x >= 128066 && x <= 128252 || x >= 128255 && x <= 128317 || x >= 128331 && x <= 128334 || x >= 128336 && x <= 128359 || x === 128378 || x === 128405 || x === 128406 || x === 128420 || x >= 128507 && x <= 128591 || x >= 128640 && x <= 128709 || x === 128716 || x >= 128720 && x <= 128722 || x >= 128725 && x <= 128727 || x >= 128732 && x <= 128735 || x === 128747 || x === 128748 || x >= 128756 && x <= 128764 || x >= 128992 && x <= 129003 || x === 129008 || x >= 129292 && x <= 129338 || x >= 129340 && x <= 129349 || x >= 129351 && x <= 129535 || x >= 129648 && x <= 129660 || x >= 129664 && x <= 129673 || x >= 129679 && x <= 129734 || x >= 129742 && x <= 129756 || x >= 129759 && x <= 129769 || x >= 129776 && x <= 129784 || x >= 131072 && x <= 196605 || x >= 196608 && x <= 262141;
822
+ }
823
+ function validate(codePoint) {
824
+ if (!Number.isSafeInteger(codePoint)) throw new TypeError(`Expected a code point, got \`${typeof codePoint}\`.`);
825
+ }
826
+ function eastAsianWidth(codePoint, { ambiguousAsWide = false } = {}) {
827
+ validate(codePoint);
828
+ if (isFullWidth(codePoint) || isWide(codePoint) || ambiguousAsWide && isAmbiguous(codePoint)) return 2;
829
+ return 1;
830
+ }
831
+ const emojiRegex = () => {
832
+ return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC2\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
833
+ };
834
+ const segmenter = globalThis.Intl?.Segmenter ? new Intl.Segmenter() : { segment: (str) => str.split("") };
835
+ const defaultIgnorableCodePointRegex = /^\p{Default_Ignorable_Code_Point}$/u;
836
+ function stringWidth$1(string, options = {}) {
837
+ if (typeof string !== "string" || string.length === 0) return 0;
838
+ const { ambiguousIsNarrow = true, countAnsiEscapeCodes = false } = options;
839
+ if (!countAnsiEscapeCodes) string = stripAnsi(string);
840
+ if (string.length === 0) return 0;
841
+ let width = 0;
842
+ const eastAsianWidthOptions = { ambiguousAsWide: !ambiguousIsNarrow };
843
+ for (const { segment: character } of segmenter.segment(string)) {
844
+ const codePoint = character.codePointAt(0);
845
+ if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) continue;
846
+ if (codePoint >= 8203 && codePoint <= 8207 || codePoint === 65279) continue;
847
+ if (codePoint >= 768 && codePoint <= 879 || codePoint >= 6832 && codePoint <= 6911 || codePoint >= 7616 && codePoint <= 7679 || codePoint >= 8400 && codePoint <= 8447 || codePoint >= 65056 && codePoint <= 65071) continue;
848
+ if (codePoint >= 55296 && codePoint <= 57343) continue;
849
+ if (codePoint >= 65024 && codePoint <= 65039) continue;
850
+ if (defaultIgnorableCodePointRegex.test(character)) continue;
851
+ if (emojiRegex().test(character)) {
852
+ width += 2;
853
+ continue;
854
+ }
855
+ width += eastAsianWidth(codePoint, eastAsianWidthOptions);
856
+ }
857
+ return width;
858
+ }
859
+ function isUnicodeSupported() {
860
+ const { env } = g$1;
861
+ const { TERM, TERM_PROGRAM } = env;
862
+ if (g$1.platform !== "win32") return TERM !== "linux";
863
+ return Boolean(env.WT_SESSION) || Boolean(env.TERMINUS_SUBLIME) || env.ConEmuTask === "{cmd::Cmder}" || TERM_PROGRAM === "Terminus-Sublime" || TERM_PROGRAM === "vscode" || TERM === "xterm-256color" || TERM === "alacritty" || TERM === "rxvt-unicode" || TERM === "rxvt-unicode-256color" || env.TERMINAL_EMULATOR === "JetBrains-JediTerm";
864
+ }
865
+ const TYPE_COLOR_MAP = {
866
+ info: "cyan",
867
+ fail: "red",
868
+ success: "green",
869
+ ready: "green",
870
+ start: "magenta"
871
+ };
872
+ const LEVEL_COLOR_MAP = {
873
+ 0: "red",
874
+ 1: "yellow"
875
+ };
876
+ const unicode = isUnicodeSupported();
877
+ const s = (c, fallback) => unicode ? c : fallback;
878
+ const TYPE_ICONS = {
879
+ error: s("✖", "×"),
880
+ fatal: s("✖", "×"),
881
+ ready: s("✔", "√"),
882
+ warn: s("⚠", "‼"),
883
+ info: s("ℹ", "i"),
884
+ success: s("✔", "√"),
885
+ debug: s("⚙", "D"),
886
+ trace: s("→", "→"),
887
+ fail: s("✖", "×"),
888
+ start: s("◐", "o"),
889
+ log: ""
890
+ };
891
+ function stringWidth(str) {
892
+ if (!(typeof Intl === "object") || !Intl.Segmenter) return stripAnsi$1(str).length;
893
+ return stringWidth$1(str);
894
+ }
895
+ var FancyReporter = class extends BasicReporter {
896
+ formatStack(stack, message, opts) {
897
+ const indent = " ".repeat((opts?.errorLevel || 0) + 1);
898
+ return `
899
+ ${indent}` + parseStack(stack, message).map((line) => " " + line.replace(/^at +/, (m) => colors.gray(m)).replace(/\((.+)\)/, (_, m) => `(${colors.cyan(m)})`)).join(`
900
+ ${indent}`);
901
+ }
902
+ formatType(logObj, isBadge, opts) {
903
+ const typeColor = TYPE_COLOR_MAP[logObj.type] || LEVEL_COLOR_MAP[logObj.level] || "gray";
904
+ if (isBadge) return getBgColor(typeColor)(colors.black(` ${logObj.type.toUpperCase()} `));
905
+ const _type = typeof TYPE_ICONS[logObj.type] === "string" ? TYPE_ICONS[logObj.type] : logObj.icon || logObj.type;
906
+ return _type ? getColor(typeColor)(_type) : "";
907
+ }
908
+ formatLogObj(logObj, opts) {
909
+ const [message, ...additional] = this.formatArgs(logObj.args, opts).split("\n");
910
+ if (logObj.type === "box") return box(characterFormat(message + (additional.length > 0 ? "\n" + additional.join("\n") : "")), {
911
+ title: logObj.title ? characterFormat(logObj.title) : void 0,
912
+ style: logObj.style
913
+ });
914
+ const date = this.formatDate(logObj.date, opts);
915
+ const coloredDate = date && colors.gray(date);
916
+ const isBadge = logObj.badge ?? logObj.level < 2;
917
+ const type = this.formatType(logObj, isBadge, opts);
918
+ const tag = logObj.tag ? colors.gray(logObj.tag) : "";
919
+ let line;
920
+ const left = this.filterAndJoin([type, characterFormat(message)]);
921
+ const right = this.filterAndJoin(opts.columns ? [tag, coloredDate] : [tag]);
922
+ const space = (opts.columns || 0) - stringWidth(left) - stringWidth(right) - 2;
923
+ line = space > 0 && (opts.columns || 0) >= 80 ? left + " ".repeat(space) + right : (right ? `${colors.gray(`[${right}]`)} ` : "") + left;
924
+ line += characterFormat(additional.length > 0 ? "\n" + additional.join("\n") : "");
925
+ if (logObj.type === "trace") {
926
+ const _err = /* @__PURE__ */ new Error("Trace: " + logObj.message);
927
+ line += this.formatStack(_err.stack || "", _err.message);
928
+ }
929
+ return isBadge ? "\n" + line + "\n" : line;
930
+ }
931
+ };
932
+ function characterFormat(str) {
933
+ return str.replace(/`([^`]+)`/gm, (_, m) => colors.cyan(m)).replace(/\s+_([^_]+)_\s+/gm, (_, m) => ` ${colors.underline(m)} `);
934
+ }
935
+ function getColor(color = "white") {
936
+ return colors[color] || colors.white;
937
+ }
938
+ function getBgColor(color = "bgWhite") {
939
+ return colors[`bg${color[0].toUpperCase()}${color.slice(1)}`] || colors.bgWhite;
940
+ }
941
+ function createConsola(options = {}) {
942
+ let level = _getDefaultLogLevel();
943
+ if (process.env.CONSOLA_LEVEL) level = Number.parseInt(process.env.CONSOLA_LEVEL) ?? level;
944
+ return createConsola$1({
945
+ level,
946
+ defaults: { level },
947
+ stdout: process.stdout,
948
+ stderr: process.stderr,
949
+ prompt: (...args) => import("./prompt-ugNMxPnj.js").then((m) => m.prompt(...args)),
950
+ reporters: options.reporters || [options.fancy ?? !(T || R) ? new FancyReporter() : new BasicReporter()],
951
+ ...options
952
+ });
953
+ }
954
+ function _getDefaultLogLevel() {
955
+ if (g) return LogLevels.debug;
956
+ if (R) return LogLevels.warn;
957
+ return LogLevels.info;
958
+ }
959
+ const consola = createConsola();
960
+
961
+ //#endregion
962
+ //#region node_modules/citty/dist/index.mjs
963
+ function toArray(val) {
964
+ if (Array.isArray(val)) return val;
965
+ return val === void 0 ? [] : [val];
966
+ }
967
+ function formatLineColumns(lines, linePrefix = "") {
968
+ const maxLengh = [];
969
+ for (const line of lines) for (const [i, element] of line.entries()) maxLengh[i] = Math.max(maxLengh[i] || 0, element.length);
970
+ return lines.map((l) => l.map((c, i) => linePrefix + c[i === 0 ? "padStart" : "padEnd"](maxLengh[i])).join(" ")).join("\n");
971
+ }
972
+ function resolveValue(input) {
973
+ return typeof input === "function" ? input() : input;
974
+ }
975
+ var CLIError = class extends Error {
976
+ constructor(message, code) {
977
+ super(message);
978
+ this.code = code;
979
+ this.name = "CLIError";
980
+ }
981
+ };
982
+ const NUMBER_CHAR_RE = /\d/;
983
+ const STR_SPLITTERS = [
984
+ "-",
985
+ "_",
986
+ "/",
987
+ "."
988
+ ];
989
+ function isUppercase(char = "") {
990
+ if (NUMBER_CHAR_RE.test(char)) return;
991
+ return char !== char.toLowerCase();
992
+ }
993
+ function splitByCase(str, separators) {
994
+ const splitters = separators ?? STR_SPLITTERS;
995
+ const parts = [];
996
+ if (!str || typeof str !== "string") return parts;
997
+ let buff = "";
998
+ let previousUpper;
999
+ let previousSplitter;
1000
+ for (const char of str) {
1001
+ const isSplitter = splitters.includes(char);
1002
+ if (isSplitter === true) {
1003
+ parts.push(buff);
1004
+ buff = "";
1005
+ previousUpper = void 0;
1006
+ continue;
1007
+ }
1008
+ const isUpper = isUppercase(char);
1009
+ if (previousSplitter === false) {
1010
+ if (previousUpper === false && isUpper === true) {
1011
+ parts.push(buff);
1012
+ buff = char;
1013
+ previousUpper = isUpper;
1014
+ continue;
1015
+ }
1016
+ if (previousUpper === true && isUpper === false && buff.length > 1) {
1017
+ const lastChar = buff.at(-1);
1018
+ parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
1019
+ buff = lastChar + char;
1020
+ previousUpper = isUpper;
1021
+ continue;
1022
+ }
1023
+ }
1024
+ buff += char;
1025
+ previousUpper = isUpper;
1026
+ previousSplitter = isSplitter;
1027
+ }
1028
+ parts.push(buff);
1029
+ return parts;
1030
+ }
1031
+ function upperFirst(str) {
1032
+ return str ? str[0].toUpperCase() + str.slice(1) : "";
1033
+ }
1034
+ function lowerFirst(str) {
1035
+ return str ? str[0].toLowerCase() + str.slice(1) : "";
1036
+ }
1037
+ function pascalCase(str, opts) {
1038
+ return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join("") : "";
1039
+ }
1040
+ function camelCase(str, opts) {
1041
+ return lowerFirst(pascalCase(str || "", opts));
1042
+ }
1043
+ function kebabCase(str, joiner) {
1044
+ return str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? "-") : "";
1045
+ }
1046
+ function toArr(any) {
1047
+ return any == void 0 ? [] : Array.isArray(any) ? any : [any];
1048
+ }
1049
+ function toVal(out, key, val, opts) {
1050
+ let x;
1051
+ const old = out[key];
1052
+ const nxt = ~opts.string.indexOf(key) ? val == void 0 || val === true ? "" : String(val) : typeof val === "boolean" ? val : ~opts.boolean.indexOf(key) ? val === "false" ? false : val === "true" || (out._.push((x = +val, x * 0 === 0) ? x : val), !!val) : (x = +val, x * 0 === 0) ? x : val;
1053
+ out[key] = old == void 0 ? nxt : Array.isArray(old) ? old.concat(nxt) : [old, nxt];
1054
+ }
1055
+ function parseRawArgs(args = [], opts = {}) {
1056
+ let k;
1057
+ let arr;
1058
+ let arg;
1059
+ let name;
1060
+ let val;
1061
+ const out = { _: [] };
1062
+ let i = 0;
1063
+ let j = 0;
1064
+ let idx = 0;
1065
+ const len = args.length;
1066
+ const alibi = opts.alias !== void 0;
1067
+ const strict = opts.unknown !== void 0;
1068
+ const defaults = opts.default !== void 0;
1069
+ opts.alias = opts.alias || {};
1070
+ opts.string = toArr(opts.string);
1071
+ opts.boolean = toArr(opts.boolean);
1072
+ if (alibi) for (k in opts.alias) {
1073
+ arr = opts.alias[k] = toArr(opts.alias[k]);
1074
+ for (i = 0; i < arr.length; i++) (opts.alias[arr[i]] = arr.concat(k)).splice(i, 1);
1075
+ }
1076
+ for (i = opts.boolean.length; i-- > 0;) {
1077
+ arr = opts.alias[opts.boolean[i]] || [];
1078
+ for (j = arr.length; j-- > 0;) opts.boolean.push(arr[j]);
1079
+ }
1080
+ for (i = opts.string.length; i-- > 0;) {
1081
+ arr = opts.alias[opts.string[i]] || [];
1082
+ for (j = arr.length; j-- > 0;) opts.string.push(arr[j]);
1083
+ }
1084
+ if (defaults) for (k in opts.default) {
1085
+ name = typeof opts.default[k];
1086
+ arr = opts.alias[k] = opts.alias[k] || [];
1087
+ if (opts[name] !== void 0) {
1088
+ opts[name].push(k);
1089
+ for (i = 0; i < arr.length; i++) opts[name].push(arr[i]);
1090
+ }
1091
+ }
1092
+ const keys = strict ? Object.keys(opts.alias) : [];
1093
+ for (i = 0; i < len; i++) {
1094
+ arg = args[i];
1095
+ if (arg === "--") {
1096
+ out._ = out._.concat(args.slice(++i));
1097
+ break;
1098
+ }
1099
+ for (j = 0; j < arg.length; j++) if (arg.charCodeAt(j) !== 45) break;
1100
+ if (j === 0) out._.push(arg);
1101
+ else if (arg.substring(j, j + 3) === "no-") {
1102
+ name = arg.slice(Math.max(0, j + 3));
1103
+ if (strict && !~keys.indexOf(name)) return opts.unknown(arg);
1104
+ out[name] = false;
1105
+ } else {
1106
+ for (idx = j + 1; idx < arg.length; idx++) if (arg.charCodeAt(idx) === 61) break;
1107
+ name = arg.substring(j, idx);
1108
+ val = arg.slice(Math.max(0, ++idx)) || i + 1 === len || ("" + args[i + 1]).charCodeAt(0) === 45 || args[++i];
1109
+ arr = j === 2 ? [name] : name;
1110
+ for (idx = 0; idx < arr.length; idx++) {
1111
+ name = arr[idx];
1112
+ if (strict && !~keys.indexOf(name)) return opts.unknown("-".repeat(j) + name);
1113
+ toVal(out, name, idx + 1 < arr.length || val, opts);
1114
+ }
1115
+ }
1116
+ }
1117
+ if (defaults) {
1118
+ for (k in opts.default) if (out[k] === void 0) out[k] = opts.default[k];
1119
+ }
1120
+ if (alibi) for (k in out) {
1121
+ arr = opts.alias[k] || [];
1122
+ while (arr.length > 0) out[arr.shift()] = out[k];
1123
+ }
1124
+ return out;
1125
+ }
1126
+ function parseArgs(rawArgs, argsDef) {
1127
+ const parseOptions = {
1128
+ boolean: [],
1129
+ string: [],
1130
+ mixed: [],
1131
+ alias: {},
1132
+ default: {}
1133
+ };
1134
+ const args = resolveArgs(argsDef);
1135
+ for (const arg of args) {
1136
+ if (arg.type === "positional") continue;
1137
+ if (arg.type === "string") parseOptions.string.push(arg.name);
1138
+ else if (arg.type === "boolean") parseOptions.boolean.push(arg.name);
1139
+ if (arg.default !== void 0) parseOptions.default[arg.name] = arg.default;
1140
+ if (arg.alias) parseOptions.alias[arg.name] = arg.alias;
1141
+ }
1142
+ const parsed = parseRawArgs(rawArgs, parseOptions);
1143
+ const [ ...positionalArguments] = parsed._;
1144
+ const parsedArgsProxy = new Proxy(parsed, { get(target, prop) {
1145
+ return target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];
1146
+ } });
1147
+ for (const [, arg] of args.entries()) if (arg.type === "positional") {
1148
+ const nextPositionalArgument = positionalArguments.shift();
1149
+ if (nextPositionalArgument !== void 0) parsedArgsProxy[arg.name] = nextPositionalArgument;
1150
+ else if (arg.default === void 0 && arg.required !== false) throw new CLIError(`Missing required positional argument: ${arg.name.toUpperCase()}`, "EARG");
1151
+ else parsedArgsProxy[arg.name] = arg.default;
1152
+ } else if (arg.required && parsedArgsProxy[arg.name] === void 0) throw new CLIError(`Missing required argument: --${arg.name}`, "EARG");
1153
+ return parsedArgsProxy;
1154
+ }
1155
+ function resolveArgs(argsDef) {
1156
+ const args = [];
1157
+ for (const [name, argDef] of Object.entries(argsDef || {})) args.push({
1158
+ ...argDef,
1159
+ name,
1160
+ alias: toArray(argDef.alias)
1161
+ });
1162
+ return args;
1163
+ }
1164
+ function defineCommand(def) {
1165
+ return def;
1166
+ }
1167
+ async function runCommand(cmd, opts) {
1168
+ const cmdArgs = await resolveValue(cmd.args || {});
1169
+ const parsedArgs = parseArgs(opts.rawArgs, cmdArgs);
1170
+ const context = {
1171
+ rawArgs: opts.rawArgs,
1172
+ args: parsedArgs,
1173
+ data: opts.data,
1174
+ cmd
1175
+ };
1176
+ if (typeof cmd.setup === "function") await cmd.setup(context);
1177
+ let result;
1178
+ try {
1179
+ const subCommands = await resolveValue(cmd.subCommands);
1180
+ if (subCommands && Object.keys(subCommands).length > 0) {
1181
+ const subCommandArgIndex = opts.rawArgs.findIndex((arg) => !arg.startsWith("-"));
1182
+ const subCommandName = opts.rawArgs[subCommandArgIndex];
1183
+ if (subCommandName) {
1184
+ if (!subCommands[subCommandName]) throw new CLIError(`Unknown command \`${subCommandName}\``, "E_UNKNOWN_COMMAND");
1185
+ const subCommand = await resolveValue(subCommands[subCommandName]);
1186
+ if (subCommand) await runCommand(subCommand, { rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1) });
1187
+ } else if (!cmd.run) throw new CLIError(`No command specified.`, "E_NO_COMMAND");
1188
+ }
1189
+ if (typeof cmd.run === "function") result = await cmd.run(context);
1190
+ } finally {
1191
+ if (typeof cmd.cleanup === "function") await cmd.cleanup(context);
1192
+ }
1193
+ return { result };
1194
+ }
1195
+ async function resolveSubCommand(cmd, rawArgs, parent) {
1196
+ const subCommands = await resolveValue(cmd.subCommands);
1197
+ if (subCommands && Object.keys(subCommands).length > 0) {
1198
+ const subCommandArgIndex = rawArgs.findIndex((arg) => !arg.startsWith("-"));
1199
+ const subCommandName = rawArgs[subCommandArgIndex];
1200
+ const subCommand = await resolveValue(subCommands[subCommandName]);
1201
+ if (subCommand) return resolveSubCommand(subCommand, rawArgs.slice(subCommandArgIndex + 1), cmd);
1202
+ }
1203
+ return [cmd, parent];
1204
+ }
1205
+ async function showUsage(cmd, parent) {
1206
+ try {
1207
+ consola.log(await renderUsage(cmd, parent) + "\n");
1208
+ } catch (error) {
1209
+ consola.error(error);
1210
+ }
1211
+ }
1212
+ async function renderUsage(cmd, parent) {
1213
+ const cmdMeta = await resolveValue(cmd.meta || {});
1214
+ const cmdArgs = resolveArgs(await resolveValue(cmd.args || {}));
1215
+ const parentMeta = await resolveValue(parent?.meta || {});
1216
+ const commandName = `${parentMeta.name ? `${parentMeta.name} ` : ""}` + (cmdMeta.name || process.argv[1]);
1217
+ const argLines = [];
1218
+ const posLines = [];
1219
+ const commandsLines = [];
1220
+ const usageLine = [];
1221
+ for (const arg of cmdArgs) if (arg.type === "positional") {
1222
+ const name = arg.name.toUpperCase();
1223
+ const isRequired = arg.required !== false && arg.default === void 0;
1224
+ const defaultHint = arg.default ? `="${arg.default}"` : "";
1225
+ posLines.push([
1226
+ "`" + name + defaultHint + "`",
1227
+ arg.description || "",
1228
+ arg.valueHint ? `<${arg.valueHint}>` : ""
1229
+ ]);
1230
+ usageLine.push(isRequired ? `<${name}>` : `[${name}]`);
1231
+ } else {
1232
+ const isRequired = arg.required === true && arg.default === void 0;
1233
+ const argStr = (arg.type === "boolean" && arg.default === true ? [...(arg.alias || []).map((a) => `--no-${a}`), `--no-${arg.name}`].join(", ") : [...(arg.alias || []).map((a) => `-${a}`), `--${arg.name}`].join(", ")) + (arg.type === "string" && (arg.valueHint || arg.default) ? `=${arg.valueHint ? `<${arg.valueHint}>` : `"${arg.default || ""}"`}` : "");
1234
+ argLines.push(["`" + argStr + (isRequired ? " (required)" : "") + "`", arg.description || ""]);
1235
+ if (isRequired) usageLine.push(argStr);
1236
+ }
1237
+ if (cmd.subCommands) {
1238
+ const commandNames = [];
1239
+ const subCommands = await resolveValue(cmd.subCommands);
1240
+ for (const [name, sub] of Object.entries(subCommands)) {
1241
+ const meta = await resolveValue((await resolveValue(sub))?.meta);
1242
+ commandsLines.push([`\`${name}\``, meta?.description || ""]);
1243
+ commandNames.push(name);
1244
+ }
1245
+ usageLine.push(commandNames.join("|"));
1246
+ }
1247
+ const usageLines = [];
1248
+ const version = cmdMeta.version || parentMeta.version;
1249
+ usageLines.push(colors.gray(`${cmdMeta.description} (${commandName + (version ? ` v${version}` : "")})`), "");
1250
+ const hasOptions = argLines.length > 0 || posLines.length > 0;
1251
+ usageLines.push(`${colors.underline(colors.bold("USAGE"))} \`${commandName}${hasOptions ? " [OPTIONS]" : ""} ${usageLine.join(" ")}\``, "");
1252
+ if (posLines.length > 0) {
1253
+ usageLines.push(colors.underline(colors.bold("ARGUMENTS")), "");
1254
+ usageLines.push(formatLineColumns(posLines, " "));
1255
+ usageLines.push("");
1256
+ }
1257
+ if (argLines.length > 0) {
1258
+ usageLines.push(colors.underline(colors.bold("OPTIONS")), "");
1259
+ usageLines.push(formatLineColumns(argLines, " "));
1260
+ usageLines.push("");
1261
+ }
1262
+ if (commandsLines.length > 0) {
1263
+ usageLines.push(colors.underline(colors.bold("COMMANDS")), "");
1264
+ usageLines.push(formatLineColumns(commandsLines, " "));
1265
+ usageLines.push("", `Use \`${commandName} <command> --help\` for more information about a command.`);
1266
+ }
1267
+ return usageLines.filter((l) => typeof l === "string").join("\n");
1268
+ }
1269
+ async function runMain(cmd, opts = {}) {
1270
+ const rawArgs = opts.rawArgs || process.argv.slice(2);
1271
+ const showUsage$1 = opts.showUsage || showUsage;
1272
+ try {
1273
+ if (rawArgs.includes("--help") || rawArgs.includes("-h")) {
1274
+ await showUsage$1(...await resolveSubCommand(cmd, rawArgs));
1275
+ process.exit(0);
1276
+ } else if (rawArgs.length === 1 && rawArgs[0] === "--version") {
1277
+ const meta = typeof cmd.meta === "function" ? await cmd.meta() : await cmd.meta;
1278
+ if (!meta?.version) throw new CLIError("No version specified", "E_NO_VERSION");
1279
+ consola.log(meta.version);
1280
+ } else await runCommand(cmd, { rawArgs });
1281
+ } catch (error) {
1282
+ const isCLIError = error instanceof CLIError;
1283
+ if (!isCLIError) consola.error(error, "\n");
1284
+ if (isCLIError) await showUsage$1(...await resolveSubCommand(cmd, rawArgs));
1285
+ consola.error(error.message);
1286
+ process.exit(1);
1287
+ }
1288
+ }
1289
+
1290
+ //#endregion
1291
+ //#region ../env/dist/index.js
1292
+ function formatEnvString(vars) {
1293
+ return Object.entries(vars).map(([key, value]) => {
1294
+ return `${key}=${value.includes(" ") || value.includes("#") || value.includes("\n") ? `"${value}"` : value}`;
1295
+ }).join("\n");
1296
+ }
1297
+
1298
+ //#endregion
1299
+ //#region src/config.ts
1300
+ const CONFIG_DIR = join(homedir(), ".auix");
1301
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
1302
+ const PROJECT_FILE = ".auixrc";
1303
+ const DEFAULT_BASE_URL = "https://api.auix.dev";
1304
+ const DEFAULT_APP_URL = "https://app.auix.dev";
1305
+ function loadGlobalConfig() {
1306
+ if (!existsSync(CONFIG_FILE)) return {};
1307
+ try {
1308
+ return JSON.parse(readFileSync(CONFIG_FILE, "utf-8"));
1309
+ } catch {
1310
+ return {};
1311
+ }
1312
+ }
1313
+ function saveGlobalConfig(config) {
1314
+ mkdirSync(CONFIG_DIR, { recursive: true });
1315
+ writeFileSync(CONFIG_FILE, `${JSON.stringify(config, null, 2)}\n`);
1316
+ }
1317
+ function loadProjectConfig() {
1318
+ let dir = process.cwd();
1319
+ while (true) {
1320
+ const file = join(dir, PROJECT_FILE);
1321
+ if (existsSync(file)) try {
1322
+ return JSON.parse(readFileSync(file, "utf-8"));
1323
+ } catch {
1324
+ return {};
1325
+ }
1326
+ const parent = dirname(dir);
1327
+ if (parent === dir) break;
1328
+ dir = parent;
1329
+ }
1330
+ return {};
1331
+ }
1332
+ function resolveApp() {
1333
+ const project = loadProjectConfig();
1334
+ if (!project.apps) return void 0;
1335
+ const cwd = process.cwd();
1336
+ for (const [dir, app] of Object.entries(project.apps)) {
1337
+ const full = resolve(dir);
1338
+ if (cwd === full || cwd.startsWith(`${full}/`)) return app;
1339
+ }
1340
+ }
1341
+ function getApiKey() {
1342
+ const envKey = process.env.AUIX_API_KEY;
1343
+ if (envKey) return envKey;
1344
+ const config = loadGlobalConfig();
1345
+ if (config.apiKey) return config.apiKey;
1346
+ throw new Error("No API key found. Run `auix login` or set AUIX_API_KEY.");
1347
+ }
1348
+ function getBaseUrl() {
1349
+ return process.env.AUIX_BASE_URL ?? loadGlobalConfig().baseUrl ?? DEFAULT_BASE_URL;
1350
+ }
1351
+ function getAppUrl() {
1352
+ return process.env.AUIX_APP_URL ?? loadGlobalConfig().appUrl ?? DEFAULT_APP_URL;
1353
+ }
1354
+
1355
+ //#endregion
1356
+ //#region src/utils.ts
1357
+ async function apiRequest(path, body) {
1358
+ const baseUrl = getBaseUrl().replace(/\/$/, "");
1359
+ return fetch(`${baseUrl}${path}`, {
1360
+ method: "POST",
1361
+ headers: {
1362
+ "Content-Type": "application/json",
1363
+ Authorization: `Bearer ${getApiKey()}`
1364
+ },
1365
+ body: JSON.stringify(body)
1366
+ });
1367
+ }
1368
+ function logError(message) {
1369
+ console.error(`Error: ${message}`);
1370
+ process.exit(1);
1371
+ }
1372
+ function maskValue(value) {
1373
+ if (value.length <= 4) return "****";
1374
+ return `${value.slice(0, 2)}****${value.slice(-2)}`;
1375
+ }
1376
+
1377
+ //#endregion
1378
+ //#region src/commands/diff.ts
1379
+ const diffCommand = defineCommand({
1380
+ meta: {
1381
+ name: "diff",
1382
+ description: "Compare variables between two environments"
1383
+ },
1384
+ args: {
1385
+ env1: {
1386
+ type: "positional",
1387
+ description: "First environment",
1388
+ required: true
1389
+ },
1390
+ env2: {
1391
+ type: "positional",
1392
+ description: "Second environment",
1393
+ required: true
1394
+ },
1395
+ app: {
1396
+ type: "string",
1397
+ description: "App name"
1398
+ },
1399
+ project: {
1400
+ type: "string",
1401
+ description: "Project slug"
1402
+ },
1403
+ "show-values": {
1404
+ type: "boolean",
1405
+ description: "Show unmasked values",
1406
+ default: false
1407
+ }
1408
+ },
1409
+ async run({ args }) {
1410
+ const projectConfig = loadProjectConfig();
1411
+ const project = args.project ?? projectConfig.project;
1412
+ const app = args.app ?? resolveApp();
1413
+ const [res1, res2] = await Promise.all([apiRequest("/v1/env/resolve", {
1414
+ project,
1415
+ environment: args.env1,
1416
+ app
1417
+ }), apiRequest("/v1/env/resolve", {
1418
+ project,
1419
+ environment: args.env2,
1420
+ app
1421
+ })]);
1422
+ if (!res1.ok) {
1423
+ const text = await res1.text().catch(() => "");
1424
+ logError(`Failed to resolve ${args.env1} (${res1.status}): ${text}`);
1425
+ }
1426
+ if (!res2.ok) {
1427
+ const text = await res2.text().catch(() => "");
1428
+ logError(`Failed to resolve ${args.env2} (${res2.status}): ${text}`);
1429
+ }
1430
+ const d1 = await res1.json();
1431
+ const d2 = await res2.json();
1432
+ const v1 = d1.variables;
1433
+ const v2 = d2.variables;
1434
+ const allKeys = [...new Set([...Object.keys(v1), ...Object.keys(v2)])].sort();
1435
+ const showValues = args["show-values"];
1436
+ let added = 0;
1437
+ let removed = 0;
1438
+ let changed = 0;
1439
+ for (const key of allKeys) {
1440
+ const in1 = key in v1;
1441
+ const in2 = key in v2;
1442
+ if (in1 && !in2) {
1443
+ const val = showValues ? v1[key] : maskValue(v1[key]);
1444
+ console.log(`- ${key}=${val} (only in ${args.env1})`);
1445
+ removed++;
1446
+ } else if (!in1 && in2) {
1447
+ const val = showValues ? v2[key] : maskValue(v2[key]);
1448
+ console.log(`+ ${key}=${val} (only in ${args.env2})`);
1449
+ added++;
1450
+ } else if (v1[key] !== v2[key]) {
1451
+ if (showValues) console.log(`~ ${key}: ${v1[key]} → ${v2[key]}`);
1452
+ else console.log(`~ ${key}: ${maskValue(v1[key])} → ${maskValue(v2[key])}`);
1453
+ changed++;
1454
+ }
1455
+ }
1456
+ if (added + removed + changed === 0) console.log("No differences found.");
1457
+ else console.log(`\n${added} added, ${removed} removed, ${changed} changed`);
1458
+ }
1459
+ });
1460
+
1461
+ //#endregion
1462
+ //#region src/commands/list.ts
1463
+ const listCommand = defineCommand({
1464
+ meta: {
1465
+ name: "list",
1466
+ description: "List environment variables (values masked)"
1467
+ },
1468
+ args: {
1469
+ env: {
1470
+ type: "string",
1471
+ description: "Environment (development, staging, production)",
1472
+ default: "development"
1473
+ },
1474
+ app: {
1475
+ type: "string",
1476
+ description: "App name"
1477
+ },
1478
+ project: {
1479
+ type: "string",
1480
+ description: "Project slug"
1481
+ },
1482
+ "show-values": {
1483
+ type: "boolean",
1484
+ description: "Show unmasked values",
1485
+ default: false
1486
+ }
1487
+ },
1488
+ async run({ args }) {
1489
+ const projectConfig = loadProjectConfig();
1490
+ const project = args.project ?? projectConfig.project;
1491
+ const app = args.app ?? resolveApp();
1492
+ const res = await apiRequest("/v1/env/resolve", {
1493
+ project,
1494
+ environment: args.env,
1495
+ app
1496
+ });
1497
+ if (!res.ok) {
1498
+ const text = await res.text().catch(() => "");
1499
+ logError(`Failed to resolve env (${res.status}): ${text}`);
1500
+ }
1501
+ const data = await res.json();
1502
+ const entries = Object.entries(data.variables);
1503
+ if (entries.length === 0) {
1504
+ console.log("No variables found.");
1505
+ return;
1506
+ }
1507
+ const showValues = args["show-values"];
1508
+ for (const [key, value] of entries) {
1509
+ const display = showValues ? value : maskValue(value);
1510
+ console.log(`${key}=${display}`);
1511
+ }
1512
+ console.log(`\n${entries.length} variables`);
1513
+ }
1514
+ });
1515
+
1516
+ //#endregion
1517
+ //#region src/commands/login.ts
1518
+ const CLIENT_ID = "auix-cli";
1519
+ const POLL_INTERVAL_MS = 5e3;
1520
+ function openBrowser(url) {
1521
+ try {
1522
+ execSync(`${process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open"} ${JSON.stringify(url)}`, { stdio: "ignore" });
1523
+ } catch {}
1524
+ }
1525
+ async function deviceFlow(appUrl) {
1526
+ const base = appUrl.replace(/\/$/, "");
1527
+ const codeRes = await fetch(`${base}/api/auth/device/code`, {
1528
+ method: "POST",
1529
+ headers: { "Content-Type": "application/json" },
1530
+ body: JSON.stringify({ client_id: CLIENT_ID })
1531
+ });
1532
+ if (!codeRes.ok) {
1533
+ const text = await codeRes.text().catch(() => "");
1534
+ logError(`Failed to start device flow (${codeRes.status}): ${text}`);
1535
+ }
1536
+ const codeData = await codeRes.json();
1537
+ console.log("Opening browser for authentication...");
1538
+ console.log(`If the browser doesn't open, visit: ${codeData.verification_uri_complete}`);
1539
+ console.log(`Enter code: ${codeData.user_code}\n`);
1540
+ openBrowser(codeData.verification_uri_complete);
1541
+ const deadline = Date.now() + codeData.expires_in * 1e3;
1542
+ const interval = Math.max((codeData.interval || 5) * 1e3, POLL_INTERVAL_MS);
1543
+ while (Date.now() < deadline) {
1544
+ await new Promise((r) => setTimeout(r, interval));
1545
+ const tokenRes = await fetch(`${base}/api/auth/device/token`, {
1546
+ method: "POST",
1547
+ headers: { "Content-Type": "application/json" },
1548
+ body: JSON.stringify({
1549
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
1550
+ device_code: codeData.device_code,
1551
+ client_id: CLIENT_ID
1552
+ })
1553
+ });
1554
+ if (tokenRes.ok) return (await tokenRes.json()).access_token;
1555
+ const err = await tokenRes.json().catch(() => ({}));
1556
+ if (err.error === "authorization_pending") continue;
1557
+ if (err.error === "slow_down") continue;
1558
+ if (err.error === "expired_token") logError("Device code expired.");
1559
+ if (err.error === "access_denied") logError("Access denied.");
1560
+ logError(`Unexpected error: ${err.error ?? tokenRes.status}`);
1561
+ }
1562
+ logError("Device code expired. Please try again.");
1563
+ return "";
1564
+ }
1565
+ async function selectOrganization(appUrl, token) {
1566
+ const base = appUrl.replace(/\/$/, "");
1567
+ const res = await fetch(`${base}/api/auth/organization/list`, { headers: { Authorization: `Bearer ${token}` } });
1568
+ if (!res.ok) logError(`Failed to list organizations (${res.status}).`);
1569
+ const orgs = await res.json();
1570
+ if (orgs.length === 0) logError("No organizations found. Create one at the web dashboard.");
1571
+ if (orgs.length === 1) {
1572
+ console.log(`Organization: ${orgs[0].name} (${orgs[0].slug})`);
1573
+ return orgs[0];
1574
+ }
1575
+ console.log("Select organization:");
1576
+ for (let i = 0; i < orgs.length; i++) console.log(` ${i + 1}) ${orgs[i].name} (${orgs[i].slug})`);
1577
+ const rl = createInterface({
1578
+ input: process.stdin,
1579
+ output: process.stdout
1580
+ });
1581
+ const answer = await rl.question("Choice: ");
1582
+ rl.close();
1583
+ const idx = Number.parseInt(answer, 10) - 1;
1584
+ if (Number.isNaN(idx) || idx < 0 || idx >= orgs.length) logError("Invalid selection.");
1585
+ return orgs[idx];
1586
+ }
1587
+ async function createApiKey(appUrl, token, organizationId) {
1588
+ const base = appUrl.replace(/\/$/, "");
1589
+ const res = await fetch(`${base}/api/cli/create-key`, {
1590
+ method: "POST",
1591
+ headers: {
1592
+ "Content-Type": "application/json",
1593
+ Authorization: `Bearer ${token}`
1594
+ },
1595
+ body: JSON.stringify({ organizationId })
1596
+ });
1597
+ if (!res.ok) {
1598
+ const text = await res.text().catch(() => "");
1599
+ logError(`Failed to create API key (${res.status}): ${text}`);
1600
+ }
1601
+ return (await res.json()).key;
1602
+ }
1603
+ const loginCommand = defineCommand({
1604
+ meta: {
1605
+ name: "login",
1606
+ description: "Authenticate with auix"
1607
+ },
1608
+ args: {
1609
+ key: {
1610
+ type: "string",
1611
+ description: "API key (at_xxx...) for non-interactive login"
1612
+ },
1613
+ url: {
1614
+ type: "string",
1615
+ description: "Custom API base URL"
1616
+ },
1617
+ "app-url": {
1618
+ type: "string",
1619
+ description: "Custom web app URL"
1620
+ }
1621
+ },
1622
+ async run({ args }) {
1623
+ const baseUrl = args.url ?? getBaseUrl();
1624
+ const appUrl = args["app-url"] ?? getAppUrl();
1625
+ if (args.key) {
1626
+ if (!args.key.startsWith("at_")) logError("Invalid API key format. Keys start with 'at_'.");
1627
+ const res = await fetch(`${baseUrl.replace(/\/$/, "")}/v1/env/resolve`, {
1628
+ method: "POST",
1629
+ headers: {
1630
+ "Content-Type": "application/json",
1631
+ Authorization: `Bearer ${args.key}`
1632
+ },
1633
+ body: "{}"
1634
+ });
1635
+ if (!res.ok) logError(`Authentication failed (${res.status}).`);
1636
+ saveGlobalConfig({
1637
+ apiKey: args.key,
1638
+ baseUrl,
1639
+ appUrl
1640
+ });
1641
+ console.log("Logged in successfully.");
1642
+ return;
1643
+ }
1644
+ const token = await deviceFlow(appUrl);
1645
+ console.log("Authenticated.\n");
1646
+ const org = await selectOrganization(appUrl, token);
1647
+ saveGlobalConfig({
1648
+ apiKey: await createApiKey(appUrl, token, org.id),
1649
+ baseUrl,
1650
+ appUrl
1651
+ });
1652
+ console.log(`\nLogged in to ${org.name}.`);
1653
+ }
1654
+ });
1655
+
1656
+ //#endregion
1657
+ //#region src/commands/pull.ts
1658
+ const pullCommand = defineCommand({
1659
+ meta: {
1660
+ name: "pull",
1661
+ description: "Pull environment variables to a local file"
1662
+ },
1663
+ args: {
1664
+ env: {
1665
+ type: "string",
1666
+ description: "Environment (development, staging, production)",
1667
+ default: "development"
1668
+ },
1669
+ app: {
1670
+ type: "string",
1671
+ description: "App name"
1672
+ },
1673
+ project: {
1674
+ type: "string",
1675
+ description: "Project slug"
1676
+ },
1677
+ out: {
1678
+ type: "string",
1679
+ description: "Output file path",
1680
+ default: ".env.local"
1681
+ }
1682
+ },
1683
+ async run({ args }) {
1684
+ const projectConfig = loadProjectConfig();
1685
+ const project = args.project ?? projectConfig.project;
1686
+ const app = args.app ?? resolveApp();
1687
+ const res = await apiRequest("/v1/env/resolve", {
1688
+ project,
1689
+ environment: args.env,
1690
+ app
1691
+ });
1692
+ if (!res.ok) {
1693
+ const text = await res.text().catch(() => "");
1694
+ logError(`Failed to resolve env (${res.status}): ${text}`);
1695
+ }
1696
+ const data = await res.json();
1697
+ const count = Object.keys(data.variables).length;
1698
+ if (count === 0) {
1699
+ console.log("No variables found.");
1700
+ return;
1701
+ }
1702
+ const content = formatEnvString(data.variables);
1703
+ writeFileSync(args.out, `${content}\n`);
1704
+ console.log(`Pulled ${count} variables → ${args.out}`);
1705
+ }
1706
+ });
1707
+
1708
+ //#endregion
1709
+ //#region src/commands/push.ts
1710
+ const pushCommand = defineCommand({
1711
+ meta: {
1712
+ name: "push",
1713
+ description: "Push a local env file to remote"
1714
+ },
1715
+ args: {
1716
+ file: {
1717
+ type: "positional",
1718
+ description: "File to push",
1719
+ default: ".env.local"
1720
+ },
1721
+ env: {
1722
+ type: "string",
1723
+ description: "Environment (development, staging, production)",
1724
+ default: "development"
1725
+ },
1726
+ app: {
1727
+ type: "string",
1728
+ description: "App name"
1729
+ },
1730
+ project: {
1731
+ type: "string",
1732
+ description: "Project slug"
1733
+ },
1734
+ overwrite: {
1735
+ type: "boolean",
1736
+ description: "Overwrite existing variables",
1737
+ default: false
1738
+ }
1739
+ },
1740
+ async run({ args }) {
1741
+ const projectConfig = loadProjectConfig();
1742
+ const project = args.project ?? projectConfig.project;
1743
+ const app = args.app ?? resolveApp();
1744
+ let content;
1745
+ try {
1746
+ content = readFileSync(args.file, "utf-8");
1747
+ } catch {
1748
+ logError(`Cannot read file: ${args.file}`);
1749
+ return;
1750
+ }
1751
+ const res = await apiRequest("/v1/env/import", {
1752
+ content,
1753
+ project,
1754
+ environment: args.env,
1755
+ app,
1756
+ overwrite: args.overwrite
1757
+ });
1758
+ if (!res.ok) {
1759
+ const text = await res.text().catch(() => "");
1760
+ logError(`Failed to import env (${res.status}): ${text}`);
1761
+ }
1762
+ const data = await res.json();
1763
+ console.log(`Pushed: ${data.created} created, ${data.updated} updated, ${data.skipped} skipped`);
1764
+ }
1765
+ });
1766
+
1767
+ //#endregion
1768
+ //#region src/commands/set.ts
1769
+ const setCommand = defineCommand({
1770
+ meta: {
1771
+ name: "set",
1772
+ description: "Set a single environment variable"
1773
+ },
1774
+ args: {
1775
+ pair: {
1776
+ type: "positional",
1777
+ description: "KEY=VALUE pair",
1778
+ required: true
1779
+ },
1780
+ env: {
1781
+ type: "string",
1782
+ description: "Environment (development, staging, production)",
1783
+ default: "development"
1784
+ },
1785
+ app: {
1786
+ type: "string",
1787
+ description: "App name"
1788
+ },
1789
+ project: {
1790
+ type: "string",
1791
+ description: "Project slug"
1792
+ },
1793
+ secret: {
1794
+ type: "boolean",
1795
+ description: "Mark as secret",
1796
+ default: true
1797
+ }
1798
+ },
1799
+ async run({ args }) {
1800
+ const eqIndex = args.pair.indexOf("=");
1801
+ if (eqIndex === -1) logError("Expected KEY=VALUE format.");
1802
+ const key = args.pair.slice(0, eqIndex);
1803
+ const value = args.pair.slice(eqIndex + 1);
1804
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) logError("Invalid key. Use uppercase letters, digits, and underscores.");
1805
+ const projectConfig = loadProjectConfig();
1806
+ const project = args.project ?? projectConfig.project;
1807
+ const app = args.app ?? resolveApp();
1808
+ const res = await apiRequest("/v1/env/set", {
1809
+ key,
1810
+ value,
1811
+ project,
1812
+ environment: args.env,
1813
+ app,
1814
+ isSecret: args.secret
1815
+ });
1816
+ if (!res.ok) {
1817
+ const text = await res.text().catch(() => "");
1818
+ logError(`Failed to set variable (${res.status}): ${text}`);
1819
+ }
1820
+ console.log(`Set ${key}`);
1821
+ }
1822
+ });
1823
+
1824
+ //#endregion
1825
+ //#region src/index.ts
1826
+ runMain(defineCommand({
1827
+ meta: {
1828
+ name: "auix",
1829
+ version: "0.0.0",
1830
+ description: "AUIX CLI"
1831
+ },
1832
+ subCommands: {
1833
+ login: loginCommand,
1834
+ env: defineCommand({
1835
+ meta: {
1836
+ name: "env",
1837
+ description: "Manage environment variables"
1838
+ },
1839
+ subCommands: {
1840
+ pull: pullCommand,
1841
+ push: pushCommand,
1842
+ list: listCommand,
1843
+ set: setCommand,
1844
+ diff: diffCommand
1845
+ }
1846
+ })
1847
+ }
1848
+ }));
1849
+
1850
+ //#endregion
1851
+ export { };