[gjs/ewlsh/nova-repl] Add cliffy lib
- From: Evan Welsh <ewlsh src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs/ewlsh/nova-repl] Add cliffy lib
- Date: Wed, 1 Sep 2021 05:36:03 +0000 (UTC)
commit 8dce52ff89ad761b12dc30c7cc9b29a607539eb9
Author: Evan Welsh <contact evanwelsh com>
Date: Sun Aug 29 23:24:12 2021 -0700
Add cliffy lib
modules/esm/_cliffy.js | 5755 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 5755 insertions(+)
---
diff --git a/modules/esm/_cliffy.js b/modules/esm/_cliffy.js
new file mode 100644
index 00000000..78868d82
--- /dev/null
+++ b/modules/esm/_cliffy.js
@@ -0,0 +1,5755 @@
+const base64abc = [
+ "A",
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z",
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "+",
+ "/"
+];
+function encode(data) {
+ const uint8 = typeof data === "string" ? new TextEncoder().encode(data) : data instanceof Uint8Array ?
data : new Uint8Array(data);
+ let result = "", i;
+ const l = uint8.length;
+ for(i = 2; i < l; i += 3){
+ result += base64abc[uint8[i - 2] >> 2];
+ result += base64abc[(uint8[i - 2] & 3) << 4 | uint8[i - 1] >> 4];
+ result += base64abc[(uint8[i - 1] & 15) << 2 | uint8[i] >> 6];
+ result += base64abc[uint8[i] & 63];
+ }
+ if (i === l + 1) {
+ result += base64abc[uint8[i - 2] >> 2];
+ result += base64abc[(uint8[i - 2] & 3) << 4];
+ result += "==";
+ }
+ if (i === l) {
+ result += base64abc[uint8[i - 2] >> 2];
+ result += base64abc[(uint8[i - 2] & 3) << 4 | uint8[i - 1] >> 4];
+ result += base64abc[(uint8[i - 1] & 15) << 2];
+ result += "=";
+ }
+ return result;
+}
+const ESC = "\x1B";
+const CSI = `${ESC}[`;
+const OSC = `${ESC}]`;
+const SEP = ";";
+const bel1 = "\u0007";
+const cursorPosition1 = `${CSI}6n`;
+function cursorTo1(x, y) {
+ if (typeof y !== "number") {
+ return `${CSI}${x}G`;
+ }
+ return `${CSI}${y};${x}H`;
+}
+function cursorMove1(x, y) {
+ let ret = "";
+ if (x < 0) {
+ ret += `${CSI}${-x}D`;
+ } else if (x > 0) {
+ ret += `${CSI}${x}C`;
+ }
+ if (y < 0) {
+ ret += `${CSI}${-y}A`;
+ } else if (y > 0) {
+ ret += `${CSI}${y}B`;
+ }
+ return ret;
+}
+function cursorUp1(count = 1) {
+ return `${CSI}${count}A`;
+}
+function cursorDown1(count = 1) {
+ return `${CSI}${count}B`;
+}
+function cursorForward1(count = 1) {
+ return `${CSI}${count}C`;
+}
+function cursorBackward1(count = 1) {
+ return `${CSI}${count}D`;
+}
+function cursorNextLine1(count = 1) {
+ return `${CSI}E`.repeat(count);
+}
+function cursorPrevLine1(count = 1) {
+ return `${CSI}F`.repeat(count);
+}
+const cursorLeft1 = `${CSI}G`;
+const cursorHide1 = `${CSI}?25l`;
+const cursorShow1 = `${CSI}?25h`;
+const cursorSave1 = `${ESC}7`;
+const cursorRestore1 = `${ESC}8`;
+function scrollUp1(count = 1) {
+ return `${CSI}S`.repeat(count);
+}
+function scrollDown1(count = 1) {
+ return `${CSI}T`.repeat(count);
+}
+const eraseScreen1 = `${CSI}2J`;
+function eraseUp1(count = 1) {
+ return `${CSI}1J`.repeat(count);
+}
+function eraseDown1(count = 1) {
+ return `${CSI}0J`.repeat(count);
+}
+const eraseLine1 = `${CSI}2K`;
+const eraseLineEnd1 = `${CSI}0K`;
+const eraseLineStart1 = `${CSI}1K`;
+function eraseLines1(count) {
+ let clear = "";
+ for(let i = 0; i < count; i++){
+ clear += eraseLine1 + (i < count - 1 ? cursorUp1() : "");
+ }
+ clear += cursorLeft1;
+ return clear;
+}
+const clearScreen1 = "\u001Bc";
+const clearTerminal1 = Deno.build.os === "windows" ? `${eraseScreen1}${CSI}0f` :
`${eraseScreen1}${CSI}3J${CSI}H`;
+function link1(text, url) {
+ return [
+ OSC,
+ "8",
+ SEP,
+ SEP,
+ url,
+ bel1,
+ text,
+ OSC,
+ "8",
+ SEP,
+ SEP,
+ bel1,
+ ].join("");
+}
+function image1(buffer, options) {
+ let ret = `${OSC}1337;File=inline=1`;
+ if (options?.width) {
+ ret += `;width=${options.width}`;
+ }
+ if (options?.height) {
+ ret += `;height=${options.height}`;
+ }
+ if (options?.preserveAspectRatio === false) {
+ ret += ";preserveAspectRatio=0";
+ }
+ return ret + ":" + encode(buffer) + bel1;
+}
+export { bel1 as bel };
+export { cursorPosition1 as cursorPosition };
+export { cursorTo1 as cursorTo };
+export { cursorMove1 as cursorMove };
+export { cursorUp1 as cursorUp };
+export { cursorDown1 as cursorDown };
+export { cursorForward1 as cursorForward };
+export { cursorBackward1 as cursorBackward };
+export { cursorNextLine1 as cursorNextLine };
+export { cursorPrevLine1 as cursorPrevLine };
+export { cursorLeft1 as cursorLeft };
+export { cursorHide1 as cursorHide };
+export { cursorShow1 as cursorShow };
+export { cursorSave1 as cursorSave };
+export { cursorRestore1 as cursorRestore };
+export { scrollUp1 as scrollUp };
+export { scrollDown1 as scrollDown };
+export { eraseScreen1 as eraseScreen };
+export { eraseUp1 as eraseUp };
+export { eraseDown1 as eraseDown };
+export { eraseLine1 as eraseLine };
+export { eraseLineEnd1 as eraseLineEnd };
+export { eraseLineStart1 as eraseLineStart };
+export { eraseLines1 as eraseLines };
+export { clearScreen1 as clearScreen };
+export { clearTerminal1 as clearTerminal };
+export { link1 as link };
+export { image1 as image };
+const mod = function() {
+ return {
+ bel: bel1,
+ cursorPosition: cursorPosition1,
+ cursorTo: cursorTo1,
+ cursorMove: cursorMove1,
+ cursorUp: cursorUp1,
+ cursorDown: cursorDown1,
+ cursorForward: cursorForward1,
+ cursorBackward: cursorBackward1,
+ cursorNextLine: cursorNextLine1,
+ cursorPrevLine: cursorPrevLine1,
+ cursorLeft: cursorLeft1,
+ cursorHide: cursorHide1,
+ cursorShow: cursorShow1,
+ cursorSave: cursorSave1,
+ cursorRestore: cursorRestore1,
+ scrollUp: scrollUp1,
+ scrollDown: scrollDown1,
+ eraseScreen: eraseScreen1,
+ eraseUp: eraseUp1,
+ eraseDown: eraseDown1,
+ eraseLine: eraseLine1,
+ eraseLineEnd: eraseLineEnd1,
+ eraseLineStart: eraseLineStart1,
+ eraseLines: eraseLines1,
+ clearScreen: clearScreen1,
+ clearTerminal: clearTerminal1,
+ link: link1,
+ image: image1
+ };
+}();
+const ansi1 = factory1();
+function factory1() {
+ let result = [];
+ let stack = [];
+ const ansi1 = function(...args) {
+ if (this) {
+ if (args.length) {
+ update(args);
+ return this;
+ }
+ return this.toString();
+ }
+ return factory1();
+ };
+ ansi1.text = function(text) {
+ stack.push([
+ text,
+ []
+ ]);
+ return this;
+ };
+ ansi1.toString = function() {
+ update();
+ const str = result.join("");
+ result = [];
+ return str;
+ };
+ ansi1.toBuffer = function() {
+ return new TextEncoder().encode(this.toString());
+ };
+ const methodList = Object.entries(mod);
+ for (const [name, method] of methodList){
+ Object.defineProperty(ansi1, name, {
+ get () {
+ stack.push([
+ method,
+ []
+ ]);
+ return this;
+ }
+ });
+ }
+ return ansi1;
+ function update(args) {
+ if (!stack.length) {
+ return;
+ }
+ if (args) {
+ stack[stack.length - 1][1] = args;
+ }
+ result.push(...stack.map(([prop, args1])=>typeof prop === "string" ? prop : prop.call(ansi1,
...args1)
+ ));
+ stack = [];
+ }
+}
+export { ansi1 as ansi };
+const { Deno: Deno1 } = globalThis;
+const noColor = typeof Deno1?.noColor === "boolean" ? Deno1.noColor : true;
+let enabled = !noColor;
+function setColorEnabled(value) {
+ if (noColor) {
+ return;
+ }
+ enabled = value;
+}
+function getColorEnabled() {
+ return enabled;
+}
+function code(open, close) {
+ return {
+ open: `\x1b[${open.join(";")}m`,
+ close: `\x1b[${close}m`,
+ regexp: new RegExp(`\\x1b\\[${close}m`, "g")
+ };
+}
+function run1(str, code1) {
+ return enabled ? `${code1.open}${str.replace(code1.regexp, code1.open)}${code1.close}` : str;
+}
+function reset(str) {
+ return run1(str, code([
+ 0
+ ], 0));
+}
+function bold(str) {
+ return run1(str, code([
+ 1
+ ], 22));
+}
+function dim(str) {
+ return run1(str, code([
+ 2
+ ], 22));
+}
+function italic(str) {
+ return run1(str, code([
+ 3
+ ], 23));
+}
+function underline(str) {
+ return run1(str, code([
+ 4
+ ], 24));
+}
+function inverse(str) {
+ return run1(str, code([
+ 7
+ ], 27));
+}
+function hidden1(str) {
+ return run1(str, code([
+ 8
+ ], 28));
+}
+function strikethrough(str) {
+ return run1(str, code([
+ 9
+ ], 29));
+}
+function black(str) {
+ return run1(str, code([
+ 30
+ ], 39));
+}
+function red(str) {
+ return run1(str, code([
+ 31
+ ], 39));
+}
+function green(str) {
+ return run1(str, code([
+ 32
+ ], 39));
+}
+function yellow(str) {
+ return run1(str, code([
+ 33
+ ], 39));
+}
+function blue(str) {
+ return run1(str, code([
+ 34
+ ], 39));
+}
+function magenta(str) {
+ return run1(str, code([
+ 35
+ ], 39));
+}
+function cyan(str) {
+ return run1(str, code([
+ 36
+ ], 39));
+}
+function white(str) {
+ return run1(str, code([
+ 37
+ ], 39));
+}
+function gray(str) {
+ return brightBlack(str);
+}
+function brightBlack(str) {
+ return run1(str, code([
+ 90
+ ], 39));
+}
+function brightRed(str) {
+ return run1(str, code([
+ 91
+ ], 39));
+}
+function brightGreen(str) {
+ return run1(str, code([
+ 92
+ ], 39));
+}
+function brightYellow(str) {
+ return run1(str, code([
+ 93
+ ], 39));
+}
+function brightBlue(str) {
+ return run1(str, code([
+ 94
+ ], 39));
+}
+function brightMagenta(str) {
+ return run1(str, code([
+ 95
+ ], 39));
+}
+function brightCyan(str) {
+ return run1(str, code([
+ 96
+ ], 39));
+}
+function brightWhite(str) {
+ return run1(str, code([
+ 97
+ ], 39));
+}
+function bgBlack(str) {
+ return run1(str, code([
+ 40
+ ], 49));
+}
+function bgRed(str) {
+ return run1(str, code([
+ 41
+ ], 49));
+}
+function bgGreen(str) {
+ return run1(str, code([
+ 42
+ ], 49));
+}
+function bgYellow(str) {
+ return run1(str, code([
+ 43
+ ], 49));
+}
+function bgBlue(str) {
+ return run1(str, code([
+ 44
+ ], 49));
+}
+function bgMagenta(str) {
+ return run1(str, code([
+ 45
+ ], 49));
+}
+function bgCyan(str) {
+ return run1(str, code([
+ 46
+ ], 49));
+}
+function bgWhite(str) {
+ return run1(str, code([
+ 47
+ ], 49));
+}
+function bgBrightBlack(str) {
+ return run1(str, code([
+ 100
+ ], 49));
+}
+function bgBrightRed(str) {
+ return run1(str, code([
+ 101
+ ], 49));
+}
+function bgBrightGreen(str) {
+ return run1(str, code([
+ 102
+ ], 49));
+}
+function bgBrightYellow(str) {
+ return run1(str, code([
+ 103
+ ], 49));
+}
+function bgBrightBlue(str) {
+ return run1(str, code([
+ 104
+ ], 49));
+}
+function bgBrightMagenta(str) {
+ return run1(str, code([
+ 105
+ ], 49));
+}
+function bgBrightCyan(str) {
+ return run1(str, code([
+ 106
+ ], 49));
+}
+function bgBrightWhite(str) {
+ return run1(str, code([
+ 107
+ ], 49));
+}
+function clampAndTruncate(n, max = 255, min = 0) {
+ return Math.trunc(Math.max(Math.min(n, max), min));
+}
+function rgb8(str, color) {
+ return run1(str, code([
+ 38,
+ 5,
+ clampAndTruncate(color)
+ ], 39));
+}
+function bgRgb8(str, color) {
+ return run1(str, code([
+ 48,
+ 5,
+ clampAndTruncate(color)
+ ], 49));
+}
+function rgb24(str, color) {
+ if (typeof color === "number") {
+ return run1(str, code([
+ 38,
+ 2,
+ color >> 16 & 255,
+ color >> 8 & 255,
+ color & 255
+ ], 39));
+ }
+ return run1(str, code([
+ 38,
+ 2,
+ clampAndTruncate(color.r),
+ clampAndTruncate(color.g),
+ clampAndTruncate(color.b),
+ ], 39));
+}
+function bgRgb24(str, color) {
+ if (typeof color === "number") {
+ return run1(str, code([
+ 48,
+ 2,
+ color >> 16 & 255,
+ color >> 8 & 255,
+ color & 255
+ ], 49));
+ }
+ return run1(str, code([
+ 48,
+ 2,
+ clampAndTruncate(color.r),
+ clampAndTruncate(color.g),
+ clampAndTruncate(color.b),
+ ], 49));
+}
+const ANSI_PATTERN = new RegExp([
+ "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
+ "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
+].join("|"), "g");
+function stripColor(string) {
+ return string.replace(ANSI_PATTERN, "");
+}
+const mod1 = function() {
+ return {
+ setColorEnabled: setColorEnabled,
+ getColorEnabled: getColorEnabled,
+ reset: reset,
+ bold: bold,
+ dim: dim,
+ italic: italic,
+ underline: underline,
+ inverse: inverse,
+ hidden: hidden1,
+ strikethrough: strikethrough,
+ black: black,
+ red: red,
+ green: green,
+ yellow: yellow,
+ blue: blue,
+ magenta: magenta,
+ cyan: cyan,
+ white: white,
+ gray: gray,
+ brightBlack: brightBlack,
+ brightRed: brightRed,
+ brightGreen: brightGreen,
+ brightYellow: brightYellow,
+ brightBlue: brightBlue,
+ brightMagenta: brightMagenta,
+ brightCyan: brightCyan,
+ brightWhite: brightWhite,
+ bgBlack: bgBlack,
+ bgRed: bgRed,
+ bgGreen: bgGreen,
+ bgYellow: bgYellow,
+ bgBlue: bgBlue,
+ bgMagenta: bgMagenta,
+ bgCyan: bgCyan,
+ bgWhite: bgWhite,
+ bgBrightBlack: bgBrightBlack,
+ bgBrightRed: bgBrightRed,
+ bgBrightGreen: bgBrightGreen,
+ bgBrightYellow: bgBrightYellow,
+ bgBrightBlue: bgBrightBlue,
+ bgBrightMagenta: bgBrightMagenta,
+ bgBrightCyan: bgBrightCyan,
+ bgBrightWhite: bgBrightWhite,
+ rgb8: rgb8,
+ bgRgb8: bgRgb8,
+ rgb24: rgb24,
+ bgRgb24: bgRgb24,
+ stripColor: stripColor
+ };
+}();
+const proto = Object.create(null);
+const methodNames = Object.keys(mod1);
+for (const name18 of methodNames){
+ if (name18 === "setColorEnabled" || name18 === "getColorEnabled") {
+ continue;
+ }
+ Object.defineProperty(proto, name18, {
+ get () {
+ return factory2([
+ ...this._stack,
+ name18
+ ]);
+ }
+ });
+}
+const colors1 = factory2();
+function factory2(stack = []) {
+ const colors1 = function(str, ...args) {
+ if (str) {
+ const lastIndex = stack.length - 1;
+ return stack.reduce((str1, name1, index)=>index === lastIndex ? mod1[name1](str1, ...args) :
mod1[name1](str1)
+ , str);
+ }
+ const tmp = stack.slice();
+ stack = [];
+ return factory2(tmp);
+ };
+ Object.setPrototypeOf(colors1, proto);
+ colors1._stack = stack;
+ return colors1;
+}
+export { colors1 as colors };
+function getCursorPosition1({ stdin =Deno.stdin , stdout =Deno.stdout } = {
+}) {
+ const data = new Uint8Array(8);
+ Deno.setRaw(stdin.rid, true);
+ stdout.writeSync(new TextEncoder().encode(cursorPosition1));
+ stdin.readSync(data);
+ Deno.setRaw(stdin.rid, false);
+ const [y, x] = new TextDecoder().decode(data).match(/\[(\d+);(\d+)R/)?.slice(1, 3).map(Number) ?? [
+ 0,
+ 0
+ ];
+ return {
+ x,
+ y
+ };
+}
+export { getCursorPosition1 as getCursorPosition };
+const tty1 = factory3();
+function factory3(options) {
+ let result = "";
+ let stack = [];
+ const stdout = options?.stdout ?? Deno.stdout;
+ const stdin = options?.stdin ?? Deno.stdin;
+ const tty1 = function(...args) {
+ if (this) {
+ update(args);
+ stdout.writeSync(new TextEncoder().encode(result));
+ return this;
+ }
+ return factory3(args[0] ?? options);
+ };
+ tty1.text = function(text) {
+ stack.push([
+ text,
+ []
+ ]);
+ update();
+ stdout.writeSync(new TextEncoder().encode(result));
+ return this;
+ };
+ tty1.getCursorPosition = ()=>getCursorPosition1({
+ stdout,
+ stdin
+ })
+ ;
+ const methodList = Object.entries(mod);
+ for (const [name1, method] of methodList){
+ if (name1 === "cursorPosition") {
+ continue;
+ }
+ Object.defineProperty(tty1, name1, {
+ get () {
+ stack.push([
+ method,
+ []
+ ]);
+ return this;
+ }
+ });
+ }
+ return tty1;
+ function update(args) {
+ if (!stack.length) {
+ return;
+ }
+ if (args) {
+ stack[stack.length - 1][1] = args;
+ }
+ result = stack.reduce((prev, [cur, args1])=>prev + (typeof cur === "string" ? cur : cur.call(tty1,
...args1))
+ , "");
+ stack = [];
+ }
+}
+export { tty1 as tty };
+function distance(a, b) {
+ if (a.length == 0) {
+ return b.length;
+ }
+ if (b.length == 0) {
+ return a.length;
+ }
+ const matrix = [];
+ for(let i = 0; i <= b.length; i++){
+ matrix[i] = [
+ i
+ ];
+ }
+ for(let j = 0; j <= a.length; j++){
+ matrix[0][j] = j;
+ }
+ for(let i1 = 1; i1 <= b.length; i1++){
+ for(let j1 = 1; j1 <= a.length; j1++){
+ if (b.charAt(i1 - 1) == a.charAt(j1 - 1)) {
+ matrix[i1][j1] = matrix[i1 - 1][j1 - 1];
+ } else {
+ matrix[i1][j1] = Math.min(matrix[i1 - 1][j1 - 1] + 1, Math.min(matrix[i1][j1 - 1] + 1,
matrix[i1 - 1][j1] + 1));
+ }
+ }
+ }
+ return matrix[b.length][a.length];
+}
+function paramCaseToCamelCase(str) {
+ return str.replace(/-([a-z])/g, (g)=>g[1].toUpperCase()
+ );
+}
+function underscoreToCamelCase(str) {
+ return str.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/_([a-z])/g, (g)=>g[1].toUpperCase()
+ );
+}
+function getOption(flags, name1) {
+ while(name1[0] === "-"){
+ name1 = name1.slice(1);
+ }
+ for (const flag of flags){
+ if (isOption(flag, name1)) {
+ return flag;
+ }
+ }
+ return;
+}
+function didYouMeanOption(option, options) {
+ const optionNames = options.map((option1)=>[
+ option1.name,
+ ...option1.aliases ?? []
+ ]
+ ).flat().map((option1)=>getFlag(option1)
+ );
+ return didYouMean(" Did you mean option", getFlag(option), optionNames);
+}
+function didYouMeanType(type, types) {
+ return didYouMean(" Did you mean type", type, types);
+}
+function didYouMean(message, type, types) {
+ const match = closest(type, types);
+ return match ? `${message} "${match}"?` : "";
+}
+function getFlag(name1) {
+ if (name1.startsWith("-")) {
+ return name1;
+ }
+ if (name1.length > 1) {
+ return `--${name1}`;
+ }
+ return `-${name1}`;
+}
+function isOption(option, name1) {
+ return option.name === name1 || option.aliases && option.aliases.indexOf(name1) !== -1;
+}
+function closest(str, arr) {
+ let minDistance = Infinity;
+ let minIndex = 0;
+ for(let i = 0; i < arr.length; i++){
+ const dist = distance(str, arr[i]);
+ if (dist < minDistance) {
+ minDistance = dist;
+ minIndex = i;
+ }
+ }
+ return arr[minIndex];
+}
+function getDefaultValue(option) {
+ return typeof option.default === "function" ? option.default() : option.default;
+}
+class FlagsError extends Error {
+ constructor(message){
+ super(message);
+ Object.setPrototypeOf(this, FlagsError.prototype);
+ }
+}
+class UnknownRequiredOption extends FlagsError {
+ constructor(option10, options4){
+ super(`Unknown required option "${getFlag(option10)}".${didYouMeanOption(option10, options4)}`);
+ Object.setPrototypeOf(this, UnknownRequiredOption.prototype);
+ }
+}
+class UnknownConflictingOption extends FlagsError {
+ constructor(option1, options1){
+ super(`Unknown conflicting option "${getFlag(option1)}".${didYouMeanOption(option1, options1)}`);
+ Object.setPrototypeOf(this, UnknownConflictingOption.prototype);
+ }
+}
+class UnknownType extends FlagsError {
+ constructor(type2, types1){
+ super(`Unknown type "${type2}".${didYouMeanType(type2, types1)}`);
+ Object.setPrototypeOf(this, UnknownType.prototype);
+ }
+}
+class ValidationError2 extends FlagsError {
+ constructor(message1){
+ super(message1);
+ Object.setPrototypeOf(this, ValidationError2.prototype);
+ }
+}
+class DuplicateOption extends ValidationError2 {
+ constructor(name1){
+ super(`Option "${getFlag(name1).replace(/^--no-/, "--")}" can only occur once, but was found several
times.`);
+ Object.setPrototypeOf(this, DuplicateOption.prototype);
+ }
+}
+class InvalidOption extends ValidationError2 {
+ constructor(option2, options2){
+ super(`Invalid option "${getFlag(option2)}".${didYouMeanOption(option2, options2)}`);
+ Object.setPrototypeOf(this, InvalidOption.prototype);
+ }
+}
+class UnknownOption extends ValidationError2 {
+ constructor(option3, options3){
+ super(`Unknown option "${getFlag(option3)}".${didYouMeanOption(option3, options3)}`);
+ Object.setPrototypeOf(this, UnknownOption.prototype);
+ }
+}
+class MissingOptionValue extends ValidationError2 {
+ constructor(option4){
+ super(`Missing value for option "${getFlag(option4)}".`);
+ Object.setPrototypeOf(this, MissingOptionValue.prototype);
+ }
+}
+class InvalidOptionValue extends ValidationError2 {
+ constructor(option5, expected, value2){
+ super(`Option "${getFlag(option5)}" must be of type "${expected}", but got "${value2}".`);
+ Object.setPrototypeOf(this, InvalidOptionValue.prototype);
+ }
+}
+class OptionNotCombinable extends ValidationError2 {
+ constructor(option6){
+ super(`Option "${getFlag(option6)}" cannot be combined with other options.`);
+ Object.setPrototypeOf(this, OptionNotCombinable.prototype);
+ }
+}
+class ConflictingOption extends ValidationError2 {
+ constructor(option7, conflictingOption){
+ super(`Option "${getFlag(option7)}" conflicts with option "${getFlag(conflictingOption)}".`);
+ Object.setPrototypeOf(this, ConflictingOption.prototype);
+ }
+}
+class DependingOption extends ValidationError2 {
+ constructor(option8, dependingOption){
+ super(`Option "${getFlag(option8)}" depends on option "${getFlag(dependingOption)}".`);
+ Object.setPrototypeOf(this, DependingOption.prototype);
+ }
+}
+class MissingRequiredOption extends ValidationError2 {
+ constructor(option9){
+ super(`Missing required option "${getFlag(option9)}".`);
+ Object.setPrototypeOf(this, MissingRequiredOption.prototype);
+ }
+}
+class RequiredArgumentFollowsOptionalArgument extends ValidationError2 {
+ constructor(arg3){
+ super(`An required argument cannot follow an optional argument, but "${arg3}" is defined as
required.`);
+ Object.setPrototypeOf(this, RequiredArgumentFollowsOptionalArgument.prototype);
+ }
+}
+class ArgumentFollowsVariadicArgument extends ValidationError2 {
+ constructor(arg1){
+ super(`An argument cannot follow an variadic argument, but got "${arg1}".`);
+ Object.setPrototypeOf(this, ArgumentFollowsVariadicArgument.prototype);
+ }
+}
+class NoArguments extends ValidationError2 {
+ constructor(){
+ super(`No arguments.`);
+ Object.setPrototypeOf(this, NoArguments.prototype);
+ }
+}
+class InvalidTypeError extends ValidationError2 {
+ constructor({ label: label1 , name: name2 , value: value1 , type: type1 }, expected1){
+ super(`${label1} "${name2}" must be of type "${type1}", but got "${value1}".` + (expected1 ? `
Expected values: ${expected1.map((value2)=>`"${value2}"`
+ ).join(", ")}` : ""));
+ Object.setPrototypeOf(this, MissingOptionValue.prototype);
+ }
+}
+var OptionType1;
+(function(OptionType1) {
+ OptionType1["STRING"] = "string";
+ OptionType1["NUMBER"] = "number";
+ OptionType1["INTEGER"] = "integer";
+ OptionType1["BOOLEAN"] = "boolean";
+})(OptionType1 || (OptionType1 = {
+}));
+function didYouMeanCommand(command, commands, excludes = []) {
+ const commandNames = commands.map((command1)=>command1.getName()
+ ).filter((command1)=>!excludes.includes(command1)
+ );
+ return didYouMean(" Did you mean command", command, commandNames);
+}
+const ARGUMENT_REGEX = /^[<\[].+[\]>]$/;
+const ARGUMENT_DETAILS_REGEX = /[<\[:>\]]/;
+function splitArguments(args) {
+ const parts = args.trim().split(/[, =] */g);
+ const typeParts = [];
+ while(parts[parts.length - 1] && ARGUMENT_REGEX.test(parts[parts.length - 1])){
+ typeParts.unshift(parts.pop());
+ }
+ const typeDefinition = typeParts.join(" ");
+ return {
+ flags: parts,
+ typeDefinition
+ };
+}
+function parseArgumentsDefinition(argsDefinition) {
+ const argumentDetails = [];
+ let hasOptional = false;
+ let hasVariadic = false;
+ const parts = argsDefinition.split(/ +/);
+ for (const arg2 of parts){
+ if (hasVariadic) {
+ throw new ArgumentFollowsVariadicArgument(arg2);
+ }
+ const parts1 = arg2.split(ARGUMENT_DETAILS_REGEX);
+ const type2 = parts1[2] || OptionType1.STRING;
+ const details = {
+ optionalValue: arg2[0] !== "<",
+ name: parts1[1],
+ action: parts1[3] || type2,
+ variadic: false,
+ list: type2 ? arg2.indexOf(type2 + "[]") !== -1 : false,
+ type: type2
+ };
+ if (!details.optionalValue && hasOptional) {
+ throw new RequiredArgumentFollowsOptionalArgument(details.name);
+ }
+ if (arg2[0] === "[") {
+ hasOptional = true;
+ }
+ if (details.name.length > 3) {
+ const istVariadicLeft = details.name.slice(0, 3) === "...";
+ const istVariadicRight = details.name.slice(-3) === "...";
+ hasVariadic = details.variadic = istVariadicLeft || istVariadicRight;
+ if (istVariadicLeft) {
+ details.name = details.name.slice(3);
+ } else if (istVariadicRight) {
+ details.name = details.name.slice(0, -3);
+ }
+ }
+ if (details.name) {
+ argumentDetails.push(details);
+ }
+ }
+ return argumentDetails;
+}
+class CommandError extends Error {
+ constructor(message2){
+ super(message2);
+ Object.setPrototypeOf(this, CommandError.prototype);
+ }
+}
+class ValidationError1 extends CommandError {
+ exitCode;
+ constructor(message3, { exitCode } = {
+ }){
+ super(message3);
+ Object.setPrototypeOf(this, ValidationError1.prototype);
+ this.exitCode = exitCode ?? 1;
+ }
+}
+class DuplicateOptionName extends CommandError {
+ constructor(name3){
+ super(`Option with name "${getFlag(name3)}" already exists.`);
+ Object.setPrototypeOf(this, DuplicateOptionName.prototype);
+ }
+}
+class MissingCommandName extends CommandError {
+ constructor(){
+ super("Missing command name.");
+ Object.setPrototypeOf(this, MissingCommandName.prototype);
+ }
+}
+class DuplicateCommandName extends CommandError {
+ constructor(name4){
+ super(`Duplicate command name "${name4}".`);
+ Object.setPrototypeOf(this, DuplicateCommandName.prototype);
+ }
+}
+class DuplicateCommandAlias extends CommandError {
+ constructor(alias1){
+ super(`Duplicate command alias "${alias1}".`);
+ Object.setPrototypeOf(this, DuplicateCommandAlias.prototype);
+ }
+}
+class CommandNotFound extends CommandError {
+ constructor(name5, commands4, excluded){
+ super(`Unknown command "${name5}".${didYouMeanCommand(name5, commands4, excluded)}`);
+ Object.setPrototypeOf(this, UnknownCommand.prototype);
+ }
+}
+class DuplicateType extends CommandError {
+ constructor(name6){
+ super(`Type with name "${name6}" already exists.`);
+ Object.setPrototypeOf(this, DuplicateType.prototype);
+ }
+}
+class DuplicateCompletion extends CommandError {
+ constructor(name7){
+ super(`Completion with name "${name7}" already exists.`);
+ Object.setPrototypeOf(this, DuplicateCompletion.prototype);
+ }
+}
+class DuplicateExample extends CommandError {
+ constructor(name8){
+ super(`Example with name "${name8}" already exists.`);
+ Object.setPrototypeOf(this, DuplicateExample.prototype);
+ }
+}
+class DuplicateEnvironmentVariable extends CommandError {
+ constructor(name9){
+ super(`Environment variable with name "${name9}" already exists.`);
+ Object.setPrototypeOf(this, DuplicateEnvironmentVariable.prototype);
+ }
+}
+class MissingRequiredEnvVar extends ValidationError1 {
+ constructor(envVar){
+ super(`Missing required environment variable "${envVar.names[0]}".`);
+ Object.setPrototypeOf(this, MissingRequiredEnvVar.prototype);
+ }
+}
+class EnvironmentVariableSingleValue extends CommandError {
+ constructor(name10){
+ super(`An environment variable can only have one value, but "${name10}" has more than one.`);
+ Object.setPrototypeOf(this, EnvironmentVariableSingleValue.prototype);
+ }
+}
+class EnvironmentVariableOptionalValue extends CommandError {
+ constructor(name11){
+ super(`An environment variable cannot have an optional value, but "${name11}" is defined as
optional.`);
+ Object.setPrototypeOf(this, EnvironmentVariableOptionalValue.prototype);
+ }
+}
+class EnvironmentVariableVariadicValue extends CommandError {
+ constructor(name12){
+ super(`An environment variable cannot have an variadic value, but "${name12}" is defined as
variadic.`);
+ Object.setPrototypeOf(this, EnvironmentVariableVariadicValue.prototype);
+ }
+}
+class DefaultCommandNotFound extends CommandError {
+ constructor(name13, commands1){
+ super(`Default command "${name13}" not found.${didYouMeanCommand(name13, commands1)}`);
+ Object.setPrototypeOf(this, DefaultCommandNotFound.prototype);
+ }
+}
+class CommandExecutableNotFound extends CommandError {
+ constructor(name14){
+ super(`Command executable not found: ${name14}`);
+ Object.setPrototypeOf(this, CommandExecutableNotFound.prototype);
+ }
+}
+class UnknownCompletionCommand extends CommandError {
+ constructor(name15, commands2){
+ super(`Auto-completion failed. Unknown command "${name15}".${didYouMeanCommand(name15, commands2)}`);
+ Object.setPrototypeOf(this, UnknownCompletionCommand.prototype);
+ }
+}
+class UnknownCommand extends ValidationError1 {
+ constructor(name16, commands3, excluded1){
+ super(`Unknown command "${name16}".${didYouMeanCommand(name16, commands3, excluded1)}`);
+ Object.setPrototypeOf(this, UnknownCommand.prototype);
+ }
+}
+class NoArgumentsAllowed extends ValidationError1 {
+ constructor(name17){
+ super(`No arguments allowed for command "${name17}".`);
+ Object.setPrototypeOf(this, NoArgumentsAllowed.prototype);
+ }
+}
+class MissingArguments extends ValidationError1 {
+ constructor(args2){
+ super("Missing argument(s): " + args2.join(", "));
+ Object.setPrototypeOf(this, MissingArguments.prototype);
+ }
+}
+class MissingArgument extends ValidationError1 {
+ constructor(arg2){
+ super(`Missing argument "${arg2}".`);
+ Object.setPrototypeOf(this, MissingArgument.prototype);
+ }
+}
+class TooManyArguments extends ValidationError1 {
+ constructor(args1){
+ super(`Too many arguments: ${args1.join(" ")}`);
+ Object.setPrototypeOf(this, TooManyArguments.prototype);
+ }
+}
+const __boolean = (type2)=>{
+ if (~[
+ "1",
+ "true"
+ ].indexOf(type2.value)) {
+ return true;
+ }
+ if (~[
+ "0",
+ "false"
+ ].indexOf(type2.value)) {
+ return false;
+ }
+ throw new InvalidTypeError(type2);
+};
+const number1 = (type2)=>{
+ const value2 = Number(type2.value);
+ if (Number.isFinite(value2)) {
+ return value2;
+ }
+ throw new InvalidTypeError(type2);
+};
+const string1 = ({ value: value2 })=>{
+ return value2;
+};
+function validateFlags1(flags, values, _knownFlaks, allowEmpty, optionNames = {
+}) {
+ const defaultValues = {
+ };
+ for (const option10 of flags){
+ let name18;
+ let defaultValue = undefined;
+ if (option10.name.startsWith("no-")) {
+ const propName = option10.name.replace(/^no-/, "");
+ if (propName in values) {
+ continue;
+ }
+ const positiveOption = getOption(flags, propName);
+ if (positiveOption) {
+ continue;
+ }
+ name18 = paramCaseToCamelCase(propName);
+ defaultValue = true;
+ }
+ if (!name18) {
+ name18 = paramCaseToCamelCase(option10.name);
+ }
+ if (!(name18 in optionNames)) {
+ optionNames[name18] = option10.name;
+ }
+ const hasDefaultValue = typeof values[name18] === "undefined" && (typeof option10.default !==
"undefined" || typeof defaultValue !== "undefined");
+ if (hasDefaultValue) {
+ values[name18] = getDefaultValue(option10) ?? defaultValue;
+ defaultValues[option10.name] = true;
+ if (typeof option10.value === "function") {
+ values[name18] = option10.value(values[name18]);
+ }
+ }
+ }
+ const keys = Object.keys(values);
+ if (keys.length === 0 && allowEmpty) {
+ return;
+ }
+ const options4 = keys.map((name18)=>({
+ name: name18,
+ option: getOption(flags, optionNames[name18])
+ })
+ );
+ for (const { name: name18 , option: option11 } of options4){
+ if (!option11) {
+ throw new UnknownOption(name18, flags);
+ }
+ if (option11.standalone) {
+ if (keys.length > 1) {
+ if (options4.every(({ option: opt })=>opt && (option11 === opt || defaultValues[opt.name])
+ )) {
+ return;
+ }
+ throw new OptionNotCombinable(option11.name);
+ }
+ return;
+ }
+ option11.conflicts?.forEach((flag)=>{
+ if (isset(flag, values)) {
+ throw new ConflictingOption(option11.name, flag);
+ }
+ });
+ option11.depends?.forEach((flag)=>{
+ if (!isset(flag, values) && !defaultValues[option11.name]) {
+ throw new DependingOption(option11.name, flag);
+ }
+ });
+ const isArray = (option11.args?.length || 0) > 1;
+ option11.args?.forEach((arg3, i)=>{
+ if (arg3.requiredValue && (typeof values[name18] === "undefined" || isArray && typeof
values[name18][i] === "undefined")) {
+ throw new MissingOptionValue(option11.name);
+ }
+ });
+ }
+ for (const option12 of flags){
+ if (option12.required && !(paramCaseToCamelCase(option12.name) in values)) {
+ if ((!option12.conflicts || !option12.conflicts.find((flag)=>!!values[flag]
+ )) && !options4.find((opt)=>opt.option?.conflicts?.find((flag)=>flag === option12.name
+ )
+ )) {
+ throw new MissingRequiredOption(option12.name);
+ }
+ }
+ }
+ if (keys.length === 0 && !allowEmpty) {
+ throw new NoArguments();
+ }
+}
+function isset(flag, values) {
+ const name18 = paramCaseToCamelCase(flag);
+ return typeof values[name18] !== "undefined";
+}
+const integer = (type2)=>{
+ const value2 = Number(type2.value);
+ if (Number.isInteger(value2)) {
+ return value2;
+ }
+ throw new InvalidTypeError(type2);
+};
+const Types = {
+ [OptionType1.STRING]: string1,
+ [OptionType1.NUMBER]: number1,
+ [OptionType1.INTEGER]: integer,
+ [OptionType1.BOOLEAN]: __boolean
+};
+function parseFlags1(args2, opts = {
+}) {
+ args2 = args2.slice();
+ !opts.flags && (opts.flags = []);
+ let inLiteral = false;
+ let negate = false;
+ const flags = {
+ };
+ const optionNames = {
+ };
+ let literal = [];
+ let unknown = [];
+ let stopEarly = null;
+ opts.flags.forEach((opt)=>{
+ opt.depends?.forEach((flag)=>{
+ if (!opts.flags || !getOption(opts.flags, flag)) {
+ throw new UnknownRequiredOption(flag, opts.flags ?? []);
+ }
+ });
+ opt.conflicts?.forEach((flag)=>{
+ if (!opts.flags || !getOption(opts.flags, flag)) {
+ throw new UnknownConflictingOption(flag, opts.flags ?? []);
+ }
+ });
+ });
+ for(let argsIndex = 0; argsIndex < args2.length; argsIndex++){
+ let option10;
+ let optionArgs;
+ let current = args2[argsIndex];
+ let currentValue;
+ if (inLiteral) {
+ literal.push(current);
+ continue;
+ }
+ if (current === "--") {
+ inLiteral = true;
+ continue;
+ }
+ const isFlag = current.length > 1 && current[0] === "-";
+ const next = ()=>currentValue ?? args2[argsIndex + 1]
+ ;
+ if (isFlag) {
+ const isShort = current[1] !== "-";
+ const isLong = isShort ? false : current.length > 3 && current[2] !== "-";
+ if (!isShort && !isLong) {
+ throw new InvalidOption(current, opts.flags);
+ }
+ const equalSignIndex = current.indexOf("=");
+ if (equalSignIndex > -1) {
+ currentValue = current.slice(equalSignIndex + 1) || undefined;
+ current = current.slice(0, equalSignIndex);
+ }
+ if (isShort && current.length > 2 && current[2] !== ".") {
+ args2.splice(argsIndex, 1, ...splitFlags(current));
+ current = args2[argsIndex];
+ } else if (isLong && current.startsWith("--no-")) {
+ negate = true;
+ }
+ option10 = getOption(opts.flags, current);
+ if (!option10) {
+ if (opts.flags.length) {
+ throw new UnknownOption(current, opts.flags);
+ }
+ option10 = {
+ name: current.replace(/^-+/, ""),
+ optionalValue: true,
+ type: OptionType1.STRING
+ };
+ }
+ const positiveName = negate ? option10.name.replace(/^no-?/, "") : option10.name;
+ const propName = paramCaseToCamelCase(positiveName);
+ if (typeof flags[propName] !== "undefined") {
+ if (!opts.flags.length) {
+ option10.collect = true;
+ } else if (!option10.collect) {
+ throw new DuplicateOption(current);
+ }
+ }
+ optionArgs = option10.args?.length ? option10.args : [
+ {
+ type: option10.type,
+ requiredValue: option10.requiredValue,
+ optionalValue: option10.optionalValue,
+ variadic: option10.variadic,
+ list: option10.list,
+ separator: option10.separator
+ }
+ ];
+ let optionArgsIndex = 0;
+ let inOptionalArg = false;
+ const previous = flags[propName];
+ parseNext(option10, optionArgs);
+ if (typeof flags[propName] === "undefined") {
+ if (optionArgs[optionArgsIndex].requiredValue) {
+ throw new MissingOptionValue(option10.name);
+ } else if (typeof option10.default !== "undefined") {
+ flags[propName] = getDefaultValue(option10);
+ } else {
+ flags[propName] = true;
+ }
+ }
+ if (option10.value) {
+ flags[propName] = option10.value(flags[propName], previous);
+ } else if (option10.collect) {
+ const value2 = typeof previous !== "undefined" ? Array.isArray(previous) ? previous : [
+ previous
+ ] : [];
+ value2.push(flags[propName]);
+ flags[propName] = value2;
+ }
+ optionNames[propName] = option10.name;
+ opts.option?.(option10, flags[propName]);
+ function parseNext(option11, optionArgs1) {
+ const arg3 = optionArgs1[optionArgsIndex];
+ if (!arg3) {
+ const flag = next();
+ throw new UnknownOption(flag, opts.flags ?? []);
+ }
+ if (!arg3.type) {
+ arg3.type = OptionType1.BOOLEAN;
+ }
+ if (option11.args?.length) {
+ if ((typeof arg3.optionalValue === "undefined" || arg3.optionalValue === false) &&
typeof arg3.requiredValue === "undefined") {
+ arg3.requiredValue = true;
+ }
+ } else {
+ if (arg3.type !== OptionType1.BOOLEAN && (typeof arg3.optionalValue === "undefined" ||
arg3.optionalValue === false) && typeof arg3.requiredValue === "undefined") {
+ arg3.requiredValue = true;
+ }
+ }
+ if (arg3.requiredValue) {
+ if (inOptionalArg) {
+ throw new RequiredArgumentFollowsOptionalArgument(option11.name);
+ }
+ } else {
+ inOptionalArg = true;
+ }
+ if (negate) {
+ flags[propName] = false;
+ return;
+ }
+ let result;
+ let increase = false;
+ if (arg3.list && hasNext(arg3)) {
+ const parsed = next().split(arg3.separator || ",").map((nextValue)=>{
+ const value2 = parseValue(option11, arg3, nextValue);
+ if (typeof value2 === "undefined") {
+ throw new InvalidOptionValue(option11.name, arg3.type ?? "?", nextValue);
+ }
+ return value2;
+ });
+ if (parsed?.length) {
+ result = parsed;
+ }
+ } else {
+ if (hasNext(arg3)) {
+ result = parseValue(option11, arg3, next());
+ } else if (arg3.optionalValue && arg3.type === OptionType1.BOOLEAN) {
+ result = true;
+ }
+ }
+ if (increase && typeof currentValue === "undefined") {
+ argsIndex++;
+ if (!arg3.variadic) {
+ optionArgsIndex++;
+ } else if (optionArgs1[optionArgsIndex + 1]) {
+ throw new ArgumentFollowsVariadicArgument(next());
+ }
+ }
+ if (typeof result !== "undefined" && (optionArgs1.length > 1 || arg3.variadic)) {
+ if (!flags[propName]) {
+ flags[propName] = [];
+ }
+ flags[propName].push(result);
+ if (hasNext(arg3)) {
+ parseNext(option11, optionArgs1);
+ }
+ } else {
+ flags[propName] = result;
+ }
+ function hasNext(arg4) {
+ const nextValue = currentValue ?? args2[argsIndex + 1];
+ if (!currentValue && !nextValue) {
+ return false;
+ }
+ if (arg4.requiredValue) {
+ return true;
+ }
+ if (arg4.optionalValue || arg4.variadic) {
+ return nextValue[0] !== "-" || arg4.type === OptionType1.NUMBER &&
!isNaN(Number(nextValue));
+ }
+ return false;
+ }
+ function parseValue(option12, arg4, value2) {
+ const type2 = arg4.type || OptionType1.STRING;
+ const result1 = opts.parse ? opts.parse({
+ label: "Option",
+ type: type2,
+ name: `--${option12.name}`,
+ value: value2
+ }) : parseFlagValue(option12, arg4, value2);
+ if (typeof result1 !== "undefined") {
+ increase = true;
+ }
+ return result1;
+ }
+ }
+ } else {
+ if (opts.stopEarly) {
+ stopEarly = current;
+ break;
+ }
+ unknown.push(current);
+ }
+ }
+ if (stopEarly) {
+ const stopEarlyArgIndex = args2.indexOf(stopEarly);
+ if (stopEarlyArgIndex !== -1) {
+ const doubleDashIndex = args2.indexOf("--");
+ unknown = args2.slice(stopEarlyArgIndex, doubleDashIndex === -1 ? undefined : doubleDashIndex);
+ if (doubleDashIndex !== -1) {
+ literal = args2.slice(doubleDashIndex + 1);
+ }
+ }
+ }
+ if (opts.flags?.length) {
+ validateFlags1(opts.flags, flags, opts.knownFlaks, opts.allowEmpty, optionNames);
+ }
+ const result = Object.keys(flags).reduce((result1, key)=>{
+ if (~key.indexOf(".")) {
+ key.split(".").reduce((result2, subKey, index, parts)=>{
+ if (index === parts.length - 1) {
+ result2[subKey] = flags[key];
+ } else {
+ result2[subKey] = result2[subKey] ?? {
+ };
+ }
+ return result2[subKey];
+ }, result1);
+ } else {
+ result1[key] = flags[key];
+ }
+ return result1;
+ }, {
+ });
+ return {
+ flags: result,
+ unknown,
+ literal
+ };
+}
+function splitFlags(flag) {
+ const normalized = [];
+ const flags = flag.slice(1).split("");
+ if (isNaN(Number(flag[flag.length - 1]))) {
+ flags.forEach((val)=>normalized.push(`-${val}`)
+ );
+ } else {
+ normalized.push(`-${flags.shift()}`);
+ if (flags.length) {
+ normalized.push(flags.join(""));
+ }
+ }
+ return normalized;
+}
+function parseFlagValue(option10, arg3, value2) {
+ const type2 = arg3.type || OptionType1.STRING;
+ const parseType = Types[type2];
+ if (!parseType) {
+ throw new UnknownType(type2, Object.keys(Types));
+ }
+ return parseType({
+ label: "Option",
+ type: type2,
+ name: `--${option10.name}`,
+ value: value2
+ });
+}
+class Type1 {
+}
+export { Type1 as Type };
+class BooleanType1 extends Type1 {
+ parse(type) {
+ return __boolean(type);
+ }
+ complete() {
+ return [
+ "true",
+ "false"
+ ];
+ }
+}
+export { BooleanType1 as BooleanType };
+class NumberType1 extends Type1 {
+ parse(type) {
+ return number1(type);
+ }
+}
+export { NumberType1 as NumberType };
+class StringType1 extends Type1 {
+ parse(type) {
+ return string1(type);
+ }
+}
+export { StringType1 as StringType };
+const border = {
+ top: "─",
+ topMid: "┬",
+ topLeft: "┌",
+ topRight: "┐",
+ bottom: "─",
+ bottomMid: "┴",
+ bottomLeft: "└",
+ bottomRight: "┘",
+ left: "│",
+ leftMid: "├",
+ mid: "─",
+ midMid: "┼",
+ right: "│",
+ rightMid: "┤",
+ middle: "│"
+};
+class Cell1 {
+ value;
+ options = {
+ };
+ get length() {
+ return this.toString().length;
+ }
+ static from(value) {
+ const cell = new this(value);
+ if (value instanceof Cell1) {
+ cell.options = {
+ ...value.options
+ };
+ }
+ return cell;
+ }
+ constructor(value3){
+ this.value = value3;
+ }
+ toString() {
+ return this.value.toString();
+ }
+ setValue(value) {
+ this.value = value;
+ return this;
+ }
+ clone(value) {
+ const cell = new Cell1(value ?? this);
+ cell.options = {
+ ...this.options
+ };
+ return cell;
+ }
+ border(enable, override = true) {
+ if (override || typeof this.options.border === "undefined") {
+ this.options.border = enable;
+ }
+ return this;
+ }
+ colSpan(span, override = true) {
+ if (override || typeof this.options.colSpan === "undefined") {
+ this.options.colSpan = span;
+ }
+ return this;
+ }
+ rowSpan(span, override = true) {
+ if (override || typeof this.options.rowSpan === "undefined") {
+ this.options.rowSpan = span;
+ }
+ return this;
+ }
+ align(direction, override = true) {
+ if (override || typeof this.options.align === "undefined") {
+ this.options.align = direction;
+ }
+ return this;
+ }
+ getBorder() {
+ return this.options.border === true;
+ }
+ getColSpan() {
+ return typeof this.options.colSpan === "number" && this.options.colSpan > 0 ? this.options.colSpan :
1;
+ }
+ getRowSpan() {
+ return typeof this.options.rowSpan === "number" && this.options.rowSpan > 0 ? this.options.rowSpan :
1;
+ }
+ getAlign() {
+ return this.options.align ?? "left";
+ }
+}
+export { Cell1 as Cell };
+class Row1 extends Array {
+ options = {
+ };
+ static from(cells) {
+ const row = new this(...cells);
+ if (cells instanceof Row1) {
+ row.options = {
+ ...cells.options
+ };
+ }
+ return row;
+ }
+ clone() {
+ const row = new Row1(...this.map((cell)=>cell instanceof Cell1 ? cell.clone() : cell
+ ));
+ row.options = {
+ ...this.options
+ };
+ return row;
+ }
+ border(enable, override = true) {
+ if (override || typeof this.options.border === "undefined") {
+ this.options.border = enable;
+ }
+ return this;
+ }
+ align(direction, override = true) {
+ if (override || typeof this.options.align === "undefined") {
+ this.options.align = direction;
+ }
+ return this;
+ }
+ getBorder() {
+ return this.options.border === true;
+ }
+ hasBorder() {
+ return this.getBorder() || this.some((cell)=>cell instanceof Cell1 && cell.getBorder()
+ );
+ }
+ getAlign() {
+ return this.options.align ?? "left";
+ }
+}
+export { Row1 as Row };
+function consumeWords(length, content) {
+ let consumed = "";
+ const words = content.split(/ /g);
+ for(let i = 0; i < words.length; i++){
+ let word = words[i];
+ const hasLineBreak = word.indexOf("\n") !== -1;
+ if (hasLineBreak) {
+ word = word.split("\n").shift();
+ }
+ if (consumed) {
+ const nextLength = stripColor(word).length;
+ const consumedLength = stripColor(consumed).length;
+ if (consumedLength + nextLength >= length) {
+ break;
+ }
+ }
+ consumed += (i > 0 ? " " : "") + word;
+ if (hasLineBreak) {
+ break;
+ }
+ }
+ return consumed;
+}
+function longest(index, rows, maxWidth) {
+ return Math.max(...rows.map((row)=>(row[index] instanceof Cell1 && row[index].getColSpan() > 1 ? "" :
row[index]?.toString() || "").split("\n").map((r)=>{
+ const str = typeof maxWidth === "undefined" ? r : consumeWords(maxWidth, r);
+ return stripColor(str).length || 0;
+ })
+ ).flat());
+}
+class TableLayout {
+ table;
+ options;
+ constructor(table, options5){
+ this.table = table;
+ this.options = options5;
+ }
+ toString() {
+ const opts = this.createLayout();
+ return opts.rows.length ? this.renderRows(opts) : "";
+ }
+ createLayout() {
+ Object.keys(this.options.chars).forEach((key)=>{
+ if (typeof this.options.chars[key] !== "string") {
+ this.options.chars[key] = "";
+ }
+ });
+ const hasBodyBorder = this.table.getBorder() || this.table.hasBodyBorder();
+ const hasHeaderBorder = this.table.hasHeaderBorder();
+ const hasBorder = hasHeaderBorder || hasBodyBorder;
+ const header = this.table.getHeader();
+ const rows = this.spanRows(header ? [
+ header,
+ ...this.table
+ ] : this.table.slice());
+ const columns = Math.max(...rows.map((row)=>row.length
+ ));
+ for (const row of rows){
+ const length = row.length;
+ if (length < columns) {
+ const diff = columns - length;
+ for(let i = 0; i < diff; i++){
+ row.push(this.createCell(null, row));
+ }
+ }
+ }
+ const padding = [];
+ const width = [];
+ for(let colIndex = 0; colIndex < columns; colIndex++){
+ const minColWidth = Array.isArray(this.options.minColWidth) ? this.options.minColWidth[colIndex]
: this.options.minColWidth;
+ const maxColWidth = Array.isArray(this.options.maxColWidth) ? this.options.maxColWidth[colIndex]
: this.options.maxColWidth;
+ const colWidth = longest(colIndex, rows, maxColWidth);
+ width[colIndex] = Math.min(maxColWidth, Math.max(minColWidth, colWidth));
+ padding[colIndex] = Array.isArray(this.options.padding) ? this.options.padding[colIndex] :
this.options.padding;
+ }
+ return {
+ padding,
+ width,
+ rows,
+ columns,
+ hasBorder,
+ hasBodyBorder,
+ hasHeaderBorder
+ };
+ }
+ spanRows(_rows, rowIndex = 0, colIndex = 0, rowSpan = [], colSpan = 1) {
+ const rows = _rows;
+ if (rowIndex >= rows.length && rowSpan.every((span)=>span === 1
+ )) {
+ return rows;
+ } else if (rows[rowIndex] && colIndex >= rows[rowIndex].length && colIndex >= rowSpan.length &&
colSpan === 1) {
+ return this.spanRows(rows, ++rowIndex, 0, rowSpan, 1);
+ }
+ if (colSpan > 1) {
+ colSpan--;
+ rowSpan[colIndex] = rowSpan[colIndex - 1];
+ rows[rowIndex].splice(colIndex - 1, 0, rows[rowIndex][colIndex - 1]);
+ return this.spanRows(rows, rowIndex, ++colIndex, rowSpan, colSpan);
+ }
+ if (colIndex === 0) {
+ rows[rowIndex] = this.createRow(rows[rowIndex] || []);
+ }
+ if (rowSpan[colIndex] > 1) {
+ rowSpan[colIndex]--;
+ rows[rowIndex].splice(colIndex, 0, rows[rowIndex - 1][colIndex]);
+ return this.spanRows(rows, rowIndex, ++colIndex, rowSpan, colSpan);
+ }
+ rows[rowIndex][colIndex] = this.createCell(rows[rowIndex][colIndex] || null, rows[rowIndex]);
+ colSpan = rows[rowIndex][colIndex].getColSpan();
+ rowSpan[colIndex] = rows[rowIndex][colIndex].getRowSpan();
+ return this.spanRows(rows, rowIndex, ++colIndex, rowSpan, colSpan);
+ }
+ createRow(row) {
+ return Row1.from(row).border(this.table.getBorder(), false).align(this.table.getAlign(), false);
+ }
+ createCell(cell, row) {
+ return Cell1.from(cell ?? "").border(row.getBorder(), false).align(row.getAlign(), false);
+ }
+ renderRows(opts) {
+ let result = "";
+ const rowSpan = new Array(opts.columns).fill(1);
+ for(let rowIndex = 0; rowIndex < opts.rows.length; rowIndex++){
+ result += this.renderRow(rowSpan, rowIndex, opts);
+ }
+ return result.slice(0, -1);
+ }
+ renderRow(rowSpan, rowIndex, opts, isMultiline) {
+ const row = opts.rows[rowIndex];
+ const prevRow = opts.rows[rowIndex - 1];
+ const nextRow = opts.rows[rowIndex + 1];
+ let result = "";
+ let colSpan = 1;
+ if (!isMultiline && rowIndex === 0 && row.hasBorder()) {
+ result += this.renderBorderRow(undefined, row, rowSpan, opts);
+ }
+ let isMultilineRow = false;
+ result += " ".repeat(this.options.indent || 0);
+ for(let colIndex = 0; colIndex < opts.columns; colIndex++){
+ if (colSpan > 1) {
+ colSpan--;
+ rowSpan[colIndex] = rowSpan[colIndex - 1];
+ continue;
+ }
+ result += this.renderCell(colIndex, row, opts);
+ if (rowSpan[colIndex] > 1) {
+ if (!isMultiline) {
+ rowSpan[colIndex]--;
+ }
+ } else if (!prevRow || prevRow[colIndex] !== row[colIndex]) {
+ rowSpan[colIndex] = row[colIndex].getRowSpan();
+ }
+ colSpan = row[colIndex].getColSpan();
+ if (rowSpan[colIndex] === 1 && row[colIndex].length) {
+ isMultilineRow = true;
+ }
+ }
+ if (opts.columns > 0) {
+ if (row[opts.columns - 1].getBorder()) {
+ result += this.options.chars.right;
+ } else if (opts.hasBorder) {
+ result += " ";
+ }
+ }
+ result += "\n";
+ if (isMultilineRow) {
+ return result + this.renderRow(rowSpan, rowIndex, opts, isMultilineRow);
+ }
+ if (rowIndex === 0 && opts.hasHeaderBorder || rowIndex < opts.rows.length - 1 && opts.hasBodyBorder)
{
+ result += this.renderBorderRow(row, nextRow, rowSpan, opts);
+ }
+ if (rowIndex === opts.rows.length - 1 && row.hasBorder()) {
+ result += this.renderBorderRow(row, undefined, rowSpan, opts);
+ }
+ return result;
+ }
+ renderCell(colIndex, row, opts, noBorder) {
+ let result = "";
+ const prevCell = row[colIndex - 1];
+ const cell = row[colIndex];
+ if (!noBorder) {
+ if (colIndex === 0) {
+ if (cell.getBorder()) {
+ result += this.options.chars.left;
+ } else if (opts.hasBorder) {
+ result += " ";
+ }
+ } else {
+ if (cell.getBorder() || prevCell?.getBorder()) {
+ result += this.options.chars.middle;
+ } else if (opts.hasBorder) {
+ result += " ";
+ }
+ }
+ }
+ let maxLength = opts.width[colIndex];
+ const colSpan = cell.getColSpan();
+ if (colSpan > 1) {
+ for(let o = 1; o < colSpan; o++){
+ maxLength += opts.width[colIndex + o] + opts.padding[colIndex + o];
+ if (opts.hasBorder) {
+ maxLength += opts.padding[colIndex + o] + 1;
+ }
+ }
+ }
+ const { current , next } = this.renderCellValue(cell, maxLength);
+ row[colIndex].setValue(next);
+ if (opts.hasBorder) {
+ result += " ".repeat(opts.padding[colIndex]);
+ }
+ result += current;
+ if (opts.hasBorder || colIndex < opts.columns - 1) {
+ result += " ".repeat(opts.padding[colIndex]);
+ }
+ return result;
+ }
+ renderCellValue(cell, maxLength) {
+ const length = Math.min(maxLength, stripColor(cell.toString()).length);
+ let words = consumeWords(length, cell.toString());
+ const breakWord = stripColor(words).length > length;
+ if (breakWord) {
+ words = words.slice(0, length);
+ }
+ const next = cell.toString().slice(words.length + (breakWord ? 0 : 1));
+ const fillLength = maxLength - stripColor(words).length;
+ const align = cell.getAlign();
+ let current;
+ if (fillLength === 0) {
+ current = words;
+ } else if (align === "left") {
+ current = words + " ".repeat(fillLength);
+ } else if (align === "center") {
+ current = " ".repeat(Math.floor(fillLength / 2)) + words + " ".repeat(Math.ceil(fillLength / 2));
+ } else if (align === "right") {
+ current = " ".repeat(fillLength) + words;
+ } else {
+ throw new Error("Unknown direction: " + align);
+ }
+ return {
+ current,
+ next: cell.clone(next)
+ };
+ }
+ renderBorderRow(prevRow, nextRow, rowSpan, opts) {
+ let result = "";
+ let colSpan = 1;
+ for(let colIndex = 0; colIndex < opts.columns; colIndex++){
+ if (rowSpan[colIndex] > 1) {
+ if (!nextRow) {
+ throw new Error("invalid layout");
+ }
+ if (colSpan > 1) {
+ colSpan--;
+ continue;
+ }
+ }
+ result += this.renderBorderCell(colIndex, prevRow, nextRow, rowSpan, opts);
+ colSpan = nextRow?.[colIndex].getColSpan() ?? 1;
+ }
+ return result.length ? " ".repeat(this.options.indent) + result + "\n" : "";
+ }
+ renderBorderCell(colIndex, prevRow, nextRow, rowSpan, opts) {
+ const a1 = prevRow?.[colIndex - 1];
+ const a2 = nextRow?.[colIndex - 1];
+ const b1 = prevRow?.[colIndex];
+ const b2 = nextRow?.[colIndex];
+ const a1Border = !!a1?.getBorder();
+ const a2Border = !!a2?.getBorder();
+ const b1Border = !!b1?.getBorder();
+ const b2Border = !!b2?.getBorder();
+ const hasColSpan = (cell)=>(cell?.getColSpan() ?? 1) > 1
+ ;
+ const hasRowSpan = (cell)=>(cell?.getRowSpan() ?? 1) > 1
+ ;
+ let result = "";
+ if (colIndex === 0) {
+ if (rowSpan[colIndex] > 1) {
+ if (b1Border) {
+ result += this.options.chars.left;
+ } else {
+ result += " ";
+ }
+ } else if (b1Border && b2Border) {
+ result += this.options.chars.leftMid;
+ } else if (b1Border) {
+ result += this.options.chars.bottomLeft;
+ } else if (b2Border) {
+ result += this.options.chars.topLeft;
+ } else {
+ result += " ";
+ }
+ } else if (colIndex < opts.columns) {
+ if (a1Border && b2Border || b1Border && a2Border) {
+ const a1ColSpan = hasColSpan(a1);
+ const a2ColSpan = hasColSpan(a2);
+ const b1ColSpan = hasColSpan(b1);
+ const b2ColSpan = hasColSpan(b2);
+ const a1RowSpan = hasRowSpan(a1);
+ const a2RowSpan = hasRowSpan(a2);
+ const b1RowSpan = hasRowSpan(b1);
+ const b2RowSpan = hasRowSpan(b2);
+ const hasAllBorder = a1Border && b2Border && b1Border && a2Border;
+ const hasAllRowSpan = a1RowSpan && b1RowSpan && a2RowSpan && b2RowSpan;
+ const hasAllColSpan = a1ColSpan && b1ColSpan && a2ColSpan && b2ColSpan;
+ if (hasAllRowSpan && hasAllBorder) {
+ result += this.options.chars.middle;
+ } else if (hasAllColSpan && hasAllBorder && a1 === b1 && a2 === b2) {
+ result += this.options.chars.mid;
+ } else if (a1ColSpan && b1ColSpan && a1 === b1) {
+ result += this.options.chars.topMid;
+ } else if (a2ColSpan && b2ColSpan && a2 === b2) {
+ result += this.options.chars.bottomMid;
+ } else if (a1RowSpan && a2RowSpan && a1 === a2) {
+ result += this.options.chars.leftMid;
+ } else if (b1RowSpan && b2RowSpan && b1 === b2) {
+ result += this.options.chars.rightMid;
+ } else {
+ result += this.options.chars.midMid;
+ }
+ } else if (a1Border && b1Border) {
+ if (hasColSpan(a1) && hasColSpan(b1) && a1 === b1) {
+ result += this.options.chars.bottom;
+ } else {
+ result += this.options.chars.bottomMid;
+ }
+ } else if (b1Border && b2Border) {
+ if (rowSpan[colIndex] > 1) {
+ result += this.options.chars.left;
+ } else {
+ result += this.options.chars.leftMid;
+ }
+ } else if (b2Border && a2Border) {
+ if (hasColSpan(a2) && hasColSpan(b2) && a2 === b2) {
+ result += this.options.chars.top;
+ } else {
+ result += this.options.chars.topMid;
+ }
+ } else if (a1Border && a2Border) {
+ if (hasRowSpan(a1) && a1 === a2) {
+ result += this.options.chars.right;
+ } else {
+ result += this.options.chars.rightMid;
+ }
+ } else if (a1Border) {
+ result += this.options.chars.bottomRight;
+ } else if (b1Border) {
+ result += this.options.chars.bottomLeft;
+ } else if (a2Border) {
+ result += this.options.chars.topRight;
+ } else if (b2Border) {
+ result += this.options.chars.topLeft;
+ } else {
+ result += " ";
+ }
+ }
+ const length = opts.padding[colIndex] + opts.width[colIndex] + opts.padding[colIndex];
+ if (rowSpan[colIndex] > 1 && nextRow) {
+ result += this.renderCell(colIndex, nextRow, opts, true);
+ if (nextRow[colIndex] === nextRow[nextRow.length - 1]) {
+ if (b1Border) {
+ result += this.options.chars.right;
+ } else {
+ result += " ";
+ }
+ return result;
+ }
+ } else if (b1Border && b2Border) {
+ result += this.options.chars.mid.repeat(length);
+ } else if (b1Border) {
+ result += this.options.chars.bottom.repeat(length);
+ } else if (b2Border) {
+ result += this.options.chars.top.repeat(length);
+ } else {
+ result += " ".repeat(length);
+ }
+ if (colIndex === opts.columns - 1) {
+ if (b1Border && b2Border) {
+ result += this.options.chars.rightMid;
+ } else if (b1Border) {
+ result += this.options.chars.bottomRight;
+ } else if (b2Border) {
+ result += this.options.chars.topRight;
+ } else {
+ result += " ";
+ }
+ }
+ return result;
+ }
+}
+class Table1 extends Array {
+ static _chars = {
+ ...border
+ };
+ options = {
+ indent: 0,
+ border: false,
+ maxColWidth: Infinity,
+ minColWidth: 0,
+ padding: 1,
+ chars: {
+ ...Table1._chars
+ }
+ };
+ headerRow;
+ static from(rows) {
+ const table1 = new this(...rows);
+ if (rows instanceof Table1) {
+ table1.options = {
+ ...rows.options
+ };
+ table1.headerRow = rows.headerRow ? Row1.from(rows.headerRow) : undefined;
+ }
+ return table1;
+ }
+ static fromJson(rows) {
+ return new this().fromJson(rows);
+ }
+ static chars(chars) {
+ Object.assign(this._chars, chars);
+ return this;
+ }
+ static render(rows) {
+ Table1.from(rows).render();
+ }
+ fromJson(rows) {
+ this.header(Object.keys(rows[0]));
+ this.body(rows.map((row)=>Object.values(row)
+ ));
+ return this;
+ }
+ header(header) {
+ this.headerRow = header instanceof Row1 ? header : Row1.from(header);
+ return this;
+ }
+ body(rows) {
+ this.length = 0;
+ this.push(...rows);
+ return this;
+ }
+ clone() {
+ const table1 = new Table1(...this.map((row)=>row instanceof Row1 ? row.clone() :
Row1.from(row).clone()
+ ));
+ table1.options = {
+ ...this.options
+ };
+ table1.headerRow = this.headerRow?.clone();
+ return table1;
+ }
+ toString() {
+ return new TableLayout(this, this.options).toString();
+ }
+ render() {
+ console.log(this.toString());
+ return this;
+ }
+ maxColWidth(width, override = true) {
+ if (override || typeof this.options.maxColWidth === "undefined") {
+ this.options.maxColWidth = width;
+ }
+ return this;
+ }
+ minColWidth(width, override = true) {
+ if (override || typeof this.options.minColWidth === "undefined") {
+ this.options.minColWidth = width;
+ }
+ return this;
+ }
+ indent(width, override = true) {
+ if (override || typeof this.options.indent === "undefined") {
+ this.options.indent = width;
+ }
+ return this;
+ }
+ padding(padding, override = true) {
+ if (override || typeof this.options.padding === "undefined") {
+ this.options.padding = padding;
+ }
+ return this;
+ }
+ border(enable, override = true) {
+ if (override || typeof this.options.border === "undefined") {
+ this.options.border = enable;
+ }
+ return this;
+ }
+ align(direction, override = true) {
+ if (override || typeof this.options.align === "undefined") {
+ this.options.align = direction;
+ }
+ return this;
+ }
+ chars(chars) {
+ Object.assign(this.options.chars, chars);
+ return this;
+ }
+ getHeader() {
+ return this.headerRow;
+ }
+ getBody() {
+ return [
+ ...this
+ ];
+ }
+ getMaxColWidth() {
+ return this.options.maxColWidth;
+ }
+ getMinColWidth() {
+ return this.options.minColWidth;
+ }
+ getIndent() {
+ return this.options.indent;
+ }
+ getPadding() {
+ return this.options.padding;
+ }
+ getBorder() {
+ return this.options.border === true;
+ }
+ hasHeaderBorder() {
+ const hasBorder = this.headerRow?.hasBorder();
+ return hasBorder === true || this.getBorder() && hasBorder !== false;
+ }
+ hasBodyBorder() {
+ return this.getBorder() || this.some((row)=>row instanceof Row1 ? row.hasBorder() :
row.some((cell)=>cell instanceof Cell1 ? cell.getBorder : false
+ )
+ );
+ }
+ hasBorder() {
+ return this.hasHeaderBorder() || this.hasBodyBorder();
+ }
+ getAlign() {
+ return this.options.align ?? "left";
+ }
+}
+export { Table1 as Table };
+class HelpGenerator {
+ cmd;
+ indent = 2;
+ options;
+ static generate(cmd, options) {
+ return new HelpGenerator(cmd, options).generate();
+ }
+ constructor(cmd1, options6 = {
+ }){
+ this.cmd = cmd1;
+ this.options = {
+ types: false,
+ hints: true,
+ colors: true,
+ ...options6
+ };
+ }
+ generate() {
+ const areColorsEnabled = getColorEnabled();
+ setColorEnabled(this.options.colors);
+ const result = this.generateHeader() + this.generateDescription() + this.generateOptions() +
this.generateCommands() + this.generateEnvironmentVariables() + this.generateExamples();
+ setColorEnabled(areColorsEnabled);
+ return result;
+ }
+ generateHeader() {
+ const rows = [
+ [
+ bold("Usage:"),
+ magenta(`${this.cmd.getPath()}${this.cmd.getArgsDefinition() ? " " +
this.cmd.getArgsDefinition() : ""}`),
+ ],
+ ];
+ const version = this.cmd.getVersion();
+ if (version) {
+ rows.push([
+ bold("Version:"),
+ yellow(`${this.cmd.getVersion()}`)
+ ]);
+ }
+ return "\n" + Table1.from(rows).indent(this.indent).padding(1).toString() + "\n";
+ }
+ generateDescription() {
+ if (!this.cmd.getDescription()) {
+ return "";
+ }
+ return this.label("Description") + Table1.from([
+ [
+ this.cmd.getDescription()
+ ],
+ ]).indent(this.indent * 2).maxColWidth(140).padding(1).toString() + "\n";
+ }
+ generateOptions() {
+ const options7 = this.cmd.getOptions(false);
+ if (!options7.length) {
+ return "";
+ }
+ const hasTypeDefinitions = !!options7.find((option10)=>!!option10.typeDefinition
+ );
+ if (hasTypeDefinitions) {
+ return this.label("Options") + Table1.from([
+ ...options7.map((option10)=>[
+ option10.flags.map((flag)=>blue(flag)
+ ).join(", "),
+ highlightArguments(option10.typeDefinition || "", this.options.types),
+ red(bold("-")) + " " + option10.description.split("\n").shift(),
+ this.generateHints(option10),
+ ]
+ ),
+ ]).padding([
+ 2,
+ 2,
+ 2
+ ]).indent(this.indent * 2).maxColWidth([
+ 60,
+ 60,
+ 80,
+ 60
+ ]).toString() + "\n";
+ }
+ return this.label("Options") + Table1.from([
+ ...options7.map((option10)=>[
+ option10.flags.map((flag)=>blue(flag)
+ ).join(", "),
+ red(bold("-")) + " " + option10.description.split("\n").shift(),
+ this.generateHints(option10),
+ ]
+ ),
+ ]).padding([
+ 2,
+ 2
+ ]).indent(this.indent * 2).maxColWidth([
+ 60,
+ 80,
+ 60
+ ]).toString() + "\n";
+ }
+ generateCommands() {
+ const commands4 = this.cmd.getCommands(false);
+ if (!commands4.length) {
+ return "";
+ }
+ const hasTypeDefinitions = !!commands4.find((command)=>!!command.getArgsDefinition()
+ );
+ if (hasTypeDefinitions) {
+ return this.label("Commands") + Table1.from([
+ ...commands4.map((command)=>[
+ [
+ command.getName(),
+ ...command.getAliases()
+ ].map((name18)=>blue(name18)
+ ).join(", "),
+ highlightArguments(command.getArgsDefinition() || "", this.options.types),
+ red(bold("-")) + " " + command.getDescription().split("\n").shift(),
+ ]
+ ),
+ ]).padding([
+ 2,
+ 2,
+ 2
+ ]).indent(this.indent * 2).toString() + "\n";
+ }
+ return this.label("Commands") + Table1.from([
+ ...commands4.map((command)=>[
+ [
+ command.getName(),
+ ...command.getAliases()
+ ].map((name18)=>blue(name18)
+ ).join(", "),
+ red(bold("-")) + " " + command.getDescription().split("\n").shift(),
+ ]
+ ),
+ ]).padding([
+ 2,
+ 2
+ ]).indent(this.indent * 2).toString() + "\n";
+ }
+ generateEnvironmentVariables() {
+ const envVars = this.cmd.getEnvVars(false);
+ if (!envVars.length) {
+ return "";
+ }
+ return this.label("Environment variables") + Table1.from([
+ ...envVars.map((envVar1)=>[
+ envVar1.names.map((name18)=>blue(name18)
+ ).join(", "),
+ highlightArgumentDetails(envVar1.details, this.options.types),
+ `${red(bold("-"))} ${envVar1.description}`,
+ ]
+ ),
+ ]).padding(2).indent(this.indent * 2).toString() + "\n";
+ }
+ generateExamples() {
+ const examples = this.cmd.getExamples();
+ if (!examples.length) {
+ return "";
+ }
+ return this.label("Examples") + Table1.from(examples.map((example)=>[
+ dim(bold(`${capitalize(example.name)}:`)),
+ example.description,
+ ]
+ )).padding(1).indent(this.indent * 2).maxColWidth(150).toString() + "\n";
+ }
+ generateHints(option) {
+ if (!this.options.hints) {
+ return "";
+ }
+ const hints = [];
+ option.required && hints.push(yellow(`required`));
+ typeof option.default !== "undefined" && hints.push(bold(`Default: `) + inspect(option.default,
this.options.colors));
+ option.depends?.length && hints.push(yellow(bold(`Depends: `)) +
italic(option.depends.map(getFlag).join(", ")));
+ option.conflicts?.length && hints.push(red(bold(`Conflicts: `)) +
italic(option.conflicts.map(getFlag).join(", ")));
+ const type3 = this.cmd.getType(option.args[0]?.type)?.handler;
+ if (type3 instanceof Type1) {
+ const possibleValues = type3.values?.(this.cmd, this.cmd.getParent());
+ if (possibleValues?.length) {
+ hints.push(bold(`Values: `) + possibleValues.map((value4)=>inspect(value4,
this.options.colors)
+ ).join(", "));
+ }
+ }
+ if (hints.length) {
+ return `(${hints.join(", ")})`;
+ }
+ return "";
+ }
+ label(label) {
+ return "\n" + " ".repeat(this.indent) + bold(`${label}:`) + "\n\n";
+ }
+}
+function capitalize(string1) {
+ return (string1?.charAt(0).toUpperCase() + string1.slice(1)) ?? "";
+}
+function inspect(value4, colors2) {
+ return Deno.inspect(value4, {
+ depth: 1,
+ colors: colors2,
+ trailingComma: false
+ });
+}
+function highlightArguments(argsDefinition, types1 = true) {
+ if (!argsDefinition) {
+ return "";
+ }
+ return parseArgumentsDefinition(argsDefinition).map((arg3)=>highlightArgumentDetails(arg3, types1)
+ ).join(" ");
+}
+function highlightArgumentDetails(arg3, types1 = true) {
+ let str = "";
+ str += yellow(arg3.optionalValue ? "[" : "<");
+ let name18 = "";
+ name18 += arg3.name;
+ if (arg3.variadic) {
+ name18 += "...";
+ }
+ name18 = magenta(name18);
+ str += name18;
+ if (types1) {
+ str += yellow(":");
+ str += red(arg3.type);
+ }
+ if (arg3.list) {
+ str += green("[]");
+ }
+ str += yellow(arg3.optionalValue ? "]" : ">");
+ return str;
+}
+class IntegerType extends Type1 {
+ parse(type) {
+ return integer(type);
+ }
+}
+class Command1 {
+ types = new Map();
+ rawArgs = [];
+ literalArgs = [];
+ _name = "COMMAND";
+ _parent;
+ _globalParent;
+ ver;
+ desc = "";
+ fn;
+ options = [];
+ commands = new Map();
+ examples = [];
+ envVars = [];
+ aliases = [];
+ completions = new Map();
+ cmd = this;
+ argsDefinition;
+ isExecutable = false;
+ throwOnError = false;
+ _allowEmpty = true;
+ _stopEarly = false;
+ defaultCommand;
+ _useRawArgs = false;
+ args = [];
+ isHidden = false;
+ isGlobal = false;
+ hasDefaults = false;
+ _versionOption;
+ _helpOption;
+ _help;
+ exitOnHelp;
+ versionOption(flags, desc, opts) {
+ this._versionOption = flags === false ? flags : {
+ flags,
+ desc,
+ opts: typeof opts === "function" ? {
+ action: opts
+ } : opts
+ };
+ return this;
+ }
+ helpOption(flags, desc, opts) {
+ this._helpOption = flags === false ? flags : {
+ flags,
+ desc,
+ opts: typeof opts === "function" ? {
+ action: opts
+ } : opts
+ };
+ return this;
+ }
+ command(nameAndArguments, cmdOrDescription, override) {
+ const result = splitArguments(nameAndArguments);
+ const name18 = result.flags.shift();
+ const aliases = result.flags;
+ if (!name18) {
+ throw new MissingCommandName();
+ }
+ if (this.getBaseCommand(name18, true)) {
+ if (!override) {
+ throw new DuplicateCommandName(name18);
+ }
+ this.removeCommand(name18);
+ }
+ let description;
+ let cmd2;
+ if (typeof cmdOrDescription === "string") {
+ description = cmdOrDescription;
+ }
+ if (cmdOrDescription instanceof Command1) {
+ cmd2 = cmdOrDescription.reset();
+ } else {
+ cmd2 = new Command1();
+ }
+ cmd2._name = name18;
+ cmd2._parent = this;
+ if (description) {
+ cmd2.description(description);
+ }
+ if (result.typeDefinition) {
+ cmd2.arguments(result.typeDefinition);
+ }
+ aliases.forEach((alias1)=>cmd2.alias(alias1)
+ );
+ this.commands.set(name18, cmd2);
+ this.select(name18);
+ return this;
+ }
+ alias(alias) {
+ if (this.cmd._name === alias || this.cmd.aliases.includes(alias)) {
+ throw new DuplicateCommandAlias(alias);
+ }
+ this.cmd.aliases.push(alias);
+ return this;
+ }
+ reset() {
+ this.cmd = this;
+ return this;
+ }
+ select(name) {
+ const cmd2 = this.getBaseCommand(name, true);
+ if (!cmd2) {
+ throw new CommandNotFound(name, this.getBaseCommands(true));
+ }
+ this.cmd = cmd2;
+ return this;
+ }
+ name(name) {
+ this.cmd._name = name;
+ return this;
+ }
+ version(version) {
+ if (typeof version === "string") {
+ this.cmd.ver = ()=>version
+ ;
+ } else if (typeof version === "function") {
+ this.cmd.ver = version;
+ }
+ return this;
+ }
+ help(help) {
+ if (typeof help === "string") {
+ this.cmd._help = ()=>help
+ ;
+ } else if (typeof help === "function") {
+ this.cmd._help = help;
+ } else {
+ this.cmd.exitOnHelp = help.exit;
+ this.cmd._help = (cmd2)=>HelpGenerator.generate(cmd2, help)
+ ;
+ }
+ return this;
+ }
+ description(description) {
+ this.cmd.desc = description;
+ return this;
+ }
+ hidden() {
+ this.cmd.isHidden = true;
+ return this;
+ }
+ global() {
+ this.cmd.isGlobal = true;
+ return this;
+ }
+ executable() {
+ this.cmd.isExecutable = true;
+ return this;
+ }
+ arguments(args) {
+ this.cmd.argsDefinition = args;
+ return this;
+ }
+ action(fn) {
+ this.cmd.fn = fn;
+ return this;
+ }
+ allowEmpty(allowEmpty = true) {
+ this.cmd._allowEmpty = allowEmpty;
+ return this;
+ }
+ stopEarly(stopEarly = true) {
+ this.cmd._stopEarly = stopEarly;
+ return this;
+ }
+ useRawArgs(useRawArgs = true) {
+ this.cmd._useRawArgs = useRawArgs;
+ return this;
+ }
+ default(name) {
+ this.cmd.defaultCommand = name;
+ return this;
+ }
+ globalType(name, type, options) {
+ return this.type(name, type, {
+ ...options,
+ global: true
+ });
+ }
+ type(name, handler, options) {
+ if (this.cmd.types.get(name) && !options?.override) {
+ throw new DuplicateType(name);
+ }
+ this.cmd.types.set(name, {
+ ...options,
+ name,
+ handler
+ });
+ if (handler instanceof Type1 && (typeof handler.complete !== "undefined" || typeof handler.values
!== "undefined")) {
+ const completeHandler = (cmd2, parent)=>handler.complete?.(cmd2, parent) || []
+ ;
+ this.complete(name, completeHandler, options);
+ }
+ return this;
+ }
+ globalComplete(name, complete, options) {
+ return this.complete(name, complete, {
+ ...options,
+ global: true
+ });
+ }
+ complete(name, complete, options) {
+ if (this.cmd.completions.has(name) && !options?.override) {
+ throw new DuplicateCompletion(name);
+ }
+ this.cmd.completions.set(name, {
+ name,
+ complete,
+ ...options
+ });
+ return this;
+ }
+ throwErrors() {
+ this.cmd.throwOnError = true;
+ return this;
+ }
+ shouldThrowErrors() {
+ return this.cmd.throwOnError || !!this.cmd._parent?.shouldThrowErrors();
+ }
+ shouldExitOnHelp() {
+ return this.cmd.exitOnHelp ?? (this.cmd._parent?.shouldExitOnHelp() ?? true);
+ }
+ globalOption(flags, desc, opts) {
+ if (typeof opts === "function") {
+ return this.option(flags, desc, {
+ value: opts,
+ global: true
+ });
+ }
+ return this.option(flags, desc, {
+ ...opts,
+ global: true
+ });
+ }
+ option(flags, desc, opts) {
+ if (typeof opts === "function") {
+ return this.option(flags, desc, {
+ value: opts
+ });
+ }
+ const result = splitArguments(flags);
+ const args3 = result.typeDefinition ? parseArgumentsDefinition(result.typeDefinition) : [];
+ const option11 = {
+ ...opts,
+ name: "",
+ description: desc,
+ args: args3,
+ flags: result.flags,
+ typeDefinition: result.typeDefinition
+ };
+ if (option11.separator) {
+ for (const arg3 of args3){
+ if (arg3.list) {
+ arg3.separator = option11.separator;
+ }
+ }
+ }
+ for (const part of option11.flags){
+ const arg3 = part.trim();
+ const isLong = /^--/.test(arg3);
+ const name19 = isLong ? arg3.slice(2) : arg3.slice(1);
+ if (this.cmd.getBaseOption(name19, true)) {
+ if (opts?.override) {
+ this.removeOption(name19);
+ } else {
+ throw new DuplicateOptionName(name19);
+ }
+ }
+ if (!option11.name && isLong) {
+ option11.name = name19;
+ } else if (!option11.aliases) {
+ option11.aliases = [
+ name19
+ ];
+ } else {
+ option11.aliases.push(name19);
+ }
+ }
+ if (option11.prepend) {
+ this.cmd.options.unshift(option11);
+ } else {
+ this.cmd.options.push(option11);
+ }
+ return this;
+ }
+ example(name, description) {
+ if (this.cmd.hasExample(name)) {
+ throw new DuplicateExample(name);
+ }
+ this.cmd.examples.push({
+ name,
+ description
+ });
+ return this;
+ }
+ globalEnv(name, description, options) {
+ return this.env(name, description, {
+ ...options,
+ global: true
+ });
+ }
+ env(name, description, options) {
+ const result = splitArguments(name);
+ if (!result.typeDefinition) {
+ result.typeDefinition = "<value:boolean>";
+ }
+ if (result.flags.some((envName)=>this.cmd.getBaseEnvVar(envName, true)
+ )) {
+ throw new DuplicateEnvironmentVariable(name);
+ }
+ const details = parseArgumentsDefinition(result.typeDefinition);
+ if (details.length > 1) {
+ throw new EnvironmentVariableSingleValue(name);
+ } else if (details.length && details[0].optionalValue) {
+ throw new EnvironmentVariableOptionalValue(name);
+ } else if (details.length && details[0].variadic) {
+ throw new EnvironmentVariableVariadicValue(name);
+ }
+ this.cmd.envVars.push({
+ name: result.flags[0],
+ names: result.flags,
+ description,
+ type: details[0].type,
+ details: details.shift(),
+ ...options
+ });
+ return this;
+ }
+ async parse(args = Deno.args) {
+ try {
+ this.reset();
+ this.registerDefaults();
+ this.rawArgs = args;
+ if (args.length > 0) {
+ const subCommand = this.getCommand(args[0], true);
+ if (subCommand) {
+ subCommand._globalParent = this;
+ return subCommand.parse(this.rawArgs.slice(1));
+ }
+ }
+ if (this.isExecutable) {
+ await this.executeExecutable(this.rawArgs);
+ return {
+ options: {
+ },
+ args: [],
+ cmd: this,
+ literal: []
+ };
+ } else if (this._useRawArgs) {
+ const env = await this.parseEnvVars();
+ return await this.execute(env, ...this.rawArgs);
+ } else {
+ const { action , flags , unknown , literal } = this.parseFlags(this.rawArgs);
+ this.literalArgs = literal;
+ const env = await this.parseEnvVars();
+ const options7 = {
+ ...env,
+ ...flags
+ };
+ const params = this.parseArguments(unknown, options7);
+ if (action) {
+ await action.call(this, options7, ...params);
+ return {
+ options: options7,
+ args: params,
+ cmd: this,
+ literal: this.literalArgs
+ };
+ }
+ return await this.execute(options7, ...params);
+ }
+ } catch (error) {
+ throw this.error(error);
+ }
+ }
+ registerDefaults() {
+ if (this.hasDefaults || this.getParent()) {
+ return this;
+ }
+ this.hasDefaults = true;
+ this.reset();
+ !this.types.has("string") && this.type("string", new StringType1(), {
+ global: true
+ });
+ !this.types.has("number") && this.type("number", new NumberType1(), {
+ global: true
+ });
+ !this.types.has("integer") && this.type("integer", new IntegerType(), {
+ global: true
+ });
+ !this.types.has("boolean") && this.type("boolean", new BooleanType1(), {
+ global: true
+ });
+ if (!this._help) {
+ this.help({
+ hints: true,
+ types: false
+ });
+ }
+ if (this._versionOption !== false && (this._versionOption || this.ver)) {
+ this.option(this._versionOption?.flags || "-V, --version", this._versionOption?.desc || "Show
the version number for this program.", {
+ standalone: true,
+ prepend: true,
+ action: function() {
+ this.showVersion();
+ if (this.shouldExitOnHelp()) {
+ Deno.exit(0);
+ }
+ },
+ ...this._versionOption?.opts ?? {
+ }
+ });
+ }
+ if (this._helpOption !== false) {
+ this.option(this._helpOption?.flags || "-h, --help", this._helpOption?.desc || "Show this
help.", {
+ standalone: true,
+ global: true,
+ prepend: true,
+ action: function() {
+ this.showHelp();
+ if (this.shouldExitOnHelp()) {
+ Deno.exit(0);
+ }
+ },
+ ...this._helpOption?.opts ?? {
+ }
+ });
+ }
+ return this;
+ }
+ async execute(options, ...args) {
+ if (this.fn) {
+ await this.fn(options, ...args);
+ } else if (this.defaultCommand) {
+ const cmd2 = this.getCommand(this.defaultCommand, true);
+ if (!cmd2) {
+ throw new DefaultCommandNotFound(this.defaultCommand, this.getCommands());
+ }
+ cmd2._globalParent = this;
+ await cmd2.execute(options, ...args);
+ }
+ return {
+ options,
+ args,
+ cmd: this,
+ literal: this.literalArgs
+ };
+ }
+ async executeExecutable(args) {
+ const command = this.getPath().replace(/\s+/g, "-");
+ await Deno.permissions.request({
+ name: "run",
+ command
+ });
+ try {
+ const process = Deno.run({
+ cmd: [
+ command,
+ ...args
+ ]
+ });
+ const status = await process.status();
+ if (!status.success) {
+ Deno.exit(status.code);
+ }
+ } catch (error) {
+ if (error instanceof Deno.errors.NotFound) {
+ throw new CommandExecutableNotFound(command);
+ }
+ throw error;
+ }
+ }
+ parseFlags(args) {
+ try {
+ let action;
+ const result = parseFlags1(args, {
+ stopEarly: this._stopEarly,
+ allowEmpty: this._allowEmpty,
+ flags: this.getOptions(true),
+ parse: (type3)=>this.parseType(type3)
+ ,
+ option: (option11)=>{
+ if (!action && option11.action) {
+ action = option11.action;
+ }
+ }
+ });
+ return {
+ ...result,
+ action
+ };
+ } catch (error) {
+ if (error instanceof ValidationError2) {
+ throw new ValidationError1(error.message);
+ }
+ throw error;
+ }
+ }
+ parseType(type) {
+ const typeSettings = this.getType(type.type);
+ if (!typeSettings) {
+ throw new UnknownType(type.type, this.getTypes().map((type3)=>type3.name
+ ));
+ }
+ return typeSettings.handler instanceof Type1 ? typeSettings.handler.parse(type) :
typeSettings.handler(type);
+ }
+ async parseEnvVars() {
+ const envVars = this.getEnvVars(true);
+ const result = {
+ };
+ if (!envVars.length) {
+ return result;
+ }
+ const hasEnvPermissions = (await Deno.permissions.query({
+ name: "env"
+ })).state === "granted";
+ for (const env of envVars){
+ const name19 = hasEnvPermissions && env.names.find((name20)=>!!Deno.env.get(name20)
+ );
+ if (name19) {
+ const propertyName = underscoreToCamelCase(env.prefix ? env.names[0].replace(new
RegExp(`^${env.prefix}`), "") : env.names[0]);
+ result[propertyName] = this.parseType({
+ label: "Environment variable",
+ type: env.type,
+ name: name19,
+ value: Deno.env.get(name19) ?? ""
+ });
+ } else if (env.required) {
+ throw new MissingRequiredEnvVar(env);
+ }
+ }
+ return result;
+ }
+ parseArguments(args, flags) {
+ const params = [];
+ args = args.slice(0);
+ if (!this.hasArguments()) {
+ if (args.length) {
+ if (this.hasCommands(true)) {
+ throw new UnknownCommand(args[0], this.getCommands());
+ } else {
+ throw new NoArgumentsAllowed(this.getPath());
+ }
+ }
+ } else {
+ if (!args.length) {
+ const required = this.getArguments().filter((expectedArg)=>!expectedArg.optionalValue
+ ).map((expectedArg)=>expectedArg.name
+ );
+ if (required.length) {
+ const flagNames = Object.keys(flags);
+ const hasStandaloneOption = !!flagNames.find((name19)=>this.getOption(name19,
true)?.standalone
+ );
+ if (!hasStandaloneOption) {
+ throw new MissingArguments(required);
+ }
+ }
+ } else {
+ for (const expectedArg of this.getArguments()){
+ if (!args.length) {
+ if (expectedArg.optionalValue) {
+ break;
+ }
+ throw new MissingArgument(`Missing argument: ${expectedArg.name}`);
+ }
+ let arg3;
+ if (expectedArg.variadic) {
+ arg3 = args.splice(0, args.length).map((value4)=>this.parseType({
+ label: "Argument",
+ type: expectedArg.type,
+ name: expectedArg.name,
+ value: value4
+ })
+ );
+ } else {
+ arg3 = this.parseType({
+ label: "Argument",
+ type: expectedArg.type,
+ name: expectedArg.name,
+ value: args.shift()
+ });
+ }
+ if (arg3) {
+ params.push(arg3);
+ }
+ }
+ if (args.length) {
+ throw new TooManyArguments(args);
+ }
+ }
+ }
+ return params;
+ }
+ error(error) {
+ if (this.shouldThrowErrors() || !(error instanceof ValidationError1)) {
+ return error;
+ }
+ this.showHelp();
+ Deno.stderr.writeSync(new TextEncoder().encode(red(` ${bold("error")}: ${error.message}\n`) +
"\n"));
+ Deno.exit(error instanceof ValidationError1 ? error.exitCode : 1);
+ }
+ getName() {
+ return this._name;
+ }
+ getParent() {
+ return this._parent;
+ }
+ getGlobalParent() {
+ return this._globalParent;
+ }
+ getMainCommand() {
+ return this._parent?.getMainCommand() ?? this;
+ }
+ getAliases() {
+ return this.aliases;
+ }
+ getPath() {
+ return this._parent ? this._parent.getPath() + " " + this._name : this._name;
+ }
+ getArgsDefinition() {
+ return this.argsDefinition;
+ }
+ getArgument(name) {
+ return this.getArguments().find((arg3)=>arg3.name === name
+ );
+ }
+ getArguments() {
+ if (!this.args.length && this.argsDefinition) {
+ this.args = parseArgumentsDefinition(this.argsDefinition);
+ }
+ return this.args;
+ }
+ hasArguments() {
+ return !!this.argsDefinition;
+ }
+ getVersion() {
+ return this.getVersionHandler()?.call(this, this);
+ }
+ getVersionHandler() {
+ return this.ver ?? this._parent?.getVersionHandler();
+ }
+ getDescription() {
+ return typeof this.desc === "function" ? this.desc = this.desc() : this.desc;
+ }
+ getShortDescription() {
+ return this.getDescription().trim().split("\n").shift();
+ }
+ getRawArgs() {
+ return this.rawArgs;
+ }
+ getLiteralArgs() {
+ return this.literalArgs;
+ }
+ showVersion() {
+ console.log(this.getVersion());
+ }
+ showHelp() {
+ console.log(this.getHelp());
+ }
+ getHelp() {
+ this.registerDefaults();
+ return this.getHelpHandler().call(this, this);
+ }
+ getHelpHandler() {
+ return this._help ?? this._parent?.getHelpHandler();
+ }
+ hasOptions(hidden) {
+ return this.getOptions(hidden).length > 0;
+ }
+ getOptions(hidden) {
+ return this.getGlobalOptions(hidden).concat(this.getBaseOptions(hidden));
+ }
+ getBaseOptions(hidden) {
+ if (!this.options.length) {
+ return [];
+ }
+ return hidden ? this.options.slice(0) : this.options.filter((opt)=>!opt.hidden
+ );
+ }
+ getGlobalOptions(hidden) {
+ const getOptions = (cmd2, options7 = [], names = [])=>{
+ if (cmd2) {
+ if (cmd2.options.length) {
+ cmd2.options.forEach((option11)=>{
+ if (option11.global && !this.options.find((opt)=>opt.name === option11.name
+ ) && names.indexOf(option11.name) === -1 && (hidden || !option11.hidden)) {
+ names.push(option11.name);
+ options7.push(option11);
+ }
+ });
+ }
+ return getOptions(cmd2._parent, options7, names);
+ }
+ return options7;
+ };
+ return getOptions(this._parent);
+ }
+ hasOption(name, hidden) {
+ return !!this.getOption(name, hidden);
+ }
+ getOption(name, hidden) {
+ return this.getBaseOption(name, hidden) ?? this.getGlobalOption(name, hidden);
+ }
+ getBaseOption(name, hidden) {
+ const option11 = this.options.find((option12)=>option12.name === name
+ );
+ return option11 && (hidden || !option11.hidden) ? option11 : undefined;
+ }
+ getGlobalOption(name, hidden) {
+ if (!this._parent) {
+ return;
+ }
+ const option11 = this._parent.getBaseOption(name, hidden);
+ if (!option11 || !option11.global) {
+ return this._parent.getGlobalOption(name, hidden);
+ }
+ return option11;
+ }
+ removeOption(name) {
+ const index = this.options.findIndex((option11)=>option11.name === name
+ );
+ if (index === -1) {
+ return;
+ }
+ return this.options.splice(index, 1)[0];
+ }
+ hasCommands(hidden) {
+ return this.getCommands(hidden).length > 0;
+ }
+ getCommands(hidden) {
+ return this.getGlobalCommands(hidden).concat(this.getBaseCommands(hidden));
+ }
+ getBaseCommands(hidden) {
+ const commands5 = Array.from(this.commands.values());
+ return hidden ? commands5 : commands5.filter((cmd2)=>!cmd2.isHidden
+ );
+ }
+ getGlobalCommands(hidden) {
+ const getCommands = (cmd2, commands5 = [], names = [])=>{
+ if (cmd2) {
+ if (cmd2.commands.size) {
+ cmd2.commands.forEach((cmd3)=>{
+ if (cmd3.isGlobal && this !== cmd3 && !this.commands.has(cmd3._name) &&
names.indexOf(cmd3._name) === -1 && (hidden || !cmd3.isHidden)) {
+ names.push(cmd3._name);
+ commands5.push(cmd3);
+ }
+ });
+ }
+ return getCommands(cmd2._parent, commands5, names);
+ }
+ return commands5;
+ };
+ return getCommands(this._parent);
+ }
+ hasCommand(name, hidden) {
+ return !!this.getCommand(name, hidden);
+ }
+ getCommand(name, hidden) {
+ return this.getBaseCommand(name, hidden) ?? this.getGlobalCommand(name, hidden);
+ }
+ getBaseCommand(name, hidden) {
+ for (const cmd2 of this.commands.values()){
+ if (cmd2._name === name || cmd2.aliases.includes(name)) {
+ return cmd2 && (hidden || !cmd2.isHidden) ? cmd2 : undefined;
+ }
+ }
+ }
+ getGlobalCommand(name, hidden) {
+ if (!this._parent) {
+ return;
+ }
+ const cmd2 = this._parent.getBaseCommand(name, hidden);
+ if (!cmd2?.isGlobal) {
+ return this._parent.getGlobalCommand(name, hidden);
+ }
+ return cmd2;
+ }
+ removeCommand(name) {
+ const command = this.getBaseCommand(name, true);
+ if (command) {
+ this.commands.delete(command._name);
+ }
+ return command;
+ }
+ getTypes() {
+ return this.getGlobalTypes().concat(this.getBaseTypes());
+ }
+ getBaseTypes() {
+ return Array.from(this.types.values());
+ }
+ getGlobalTypes() {
+ const getTypes = (cmd2, types2 = [], names = [])=>{
+ if (cmd2) {
+ if (cmd2.types.size) {
+ cmd2.types.forEach((type3)=>{
+ if (type3.global && !this.types.has(type3.name) && names.indexOf(type3.name) === -1)
{
+ names.push(type3.name);
+ types2.push(type3);
+ }
+ });
+ }
+ return getTypes(cmd2._parent, types2, names);
+ }
+ return types2;
+ };
+ return getTypes(this._parent);
+ }
+ getType(name) {
+ return this.getBaseType(name) ?? this.getGlobalType(name);
+ }
+ getBaseType(name) {
+ return this.types.get(name);
+ }
+ getGlobalType(name) {
+ if (!this._parent) {
+ return;
+ }
+ const cmd2 = this._parent.getBaseType(name);
+ if (!cmd2?.global) {
+ return this._parent.getGlobalType(name);
+ }
+ return cmd2;
+ }
+ getCompletions() {
+ return this.getGlobalCompletions().concat(this.getBaseCompletions());
+ }
+ getBaseCompletions() {
+ return Array.from(this.completions.values());
+ }
+ getGlobalCompletions() {
+ const getCompletions = (cmd2, completions = [], names = [])=>{
+ if (cmd2) {
+ if (cmd2.completions.size) {
+ cmd2.completions.forEach((completion)=>{
+ if (completion.global && !this.completions.has(completion.name) &&
names.indexOf(completion.name) === -1) {
+ names.push(completion.name);
+ completions.push(completion);
+ }
+ });
+ }
+ return getCompletions(cmd2._parent, completions, names);
+ }
+ return completions;
+ };
+ return getCompletions(this._parent);
+ }
+ getCompletion(name) {
+ return this.getBaseCompletion(name) ?? this.getGlobalCompletion(name);
+ }
+ getBaseCompletion(name) {
+ return this.completions.get(name);
+ }
+ getGlobalCompletion(name) {
+ if (!this._parent) {
+ return;
+ }
+ const completion = this._parent.getBaseCompletion(name);
+ if (!completion?.global) {
+ return this._parent.getGlobalCompletion(name);
+ }
+ return completion;
+ }
+ hasEnvVars(hidden) {
+ return this.getEnvVars(hidden).length > 0;
+ }
+ getEnvVars(hidden) {
+ return this.getGlobalEnvVars(hidden).concat(this.getBaseEnvVars(hidden));
+ }
+ getBaseEnvVars(hidden) {
+ if (!this.envVars.length) {
+ return [];
+ }
+ return hidden ? this.envVars.slice(0) : this.envVars.filter((env)=>!env.hidden
+ );
+ }
+ getGlobalEnvVars(hidden) {
+ const getEnvVars = (cmd2, envVars = [], names = [])=>{
+ if (cmd2) {
+ if (cmd2.envVars.length) {
+ cmd2.envVars.forEach((envVar1)=>{
+ if (envVar1.global && !this.envVars.find((env)=>env.names[0] === envVar1.names[0]
+ ) && names.indexOf(envVar1.names[0]) === -1 && (hidden || !envVar1.hidden)) {
+ names.push(envVar1.names[0]);
+ envVars.push(envVar1);
+ }
+ });
+ }
+ return getEnvVars(cmd2._parent, envVars, names);
+ }
+ return envVars;
+ };
+ return getEnvVars(this._parent);
+ }
+ hasEnvVar(name, hidden) {
+ return !!this.getEnvVar(name, hidden);
+ }
+ getEnvVar(name, hidden) {
+ return this.getBaseEnvVar(name, hidden) ?? this.getGlobalEnvVar(name, hidden);
+ }
+ getBaseEnvVar(name, hidden) {
+ const envVar1 = this.envVars.find((env)=>env.names.indexOf(name) !== -1
+ );
+ return envVar1 && (hidden || !envVar1.hidden) ? envVar1 : undefined;
+ }
+ getGlobalEnvVar(name, hidden) {
+ if (!this._parent) {
+ return;
+ }
+ const envVar1 = this._parent.getBaseEnvVar(name, hidden);
+ if (!envVar1?.global) {
+ return this._parent.getGlobalEnvVar(name, hidden);
+ }
+ return envVar1;
+ }
+ hasExamples() {
+ return this.examples.length > 0;
+ }
+ getExamples() {
+ return this.examples;
+ }
+ hasExample(name) {
+ return !!this.getExample(name);
+ }
+ getExample(name) {
+ return this.examples.find((example)=>example.name === name
+ );
+ }
+}
+export { Command1 as Command };
+class BashCompletionsGenerator {
+ cmd;
+ static generate(cmd) {
+ return new BashCompletionsGenerator(cmd).generate();
+ }
+ constructor(cmd2){
+ this.cmd = cmd2;
+ }
+ generate() {
+ const path = this.cmd.getPath();
+ const version = this.cmd.getVersion() ? ` v${this.cmd.getVersion()}` : "";
+ return `#!/usr/bin/env bash\n# bash completion support for
${path}${version}\n\n_${replaceSpecialChars1(path)}() {\n local word cur prev\n local -a opts\n
COMPREPLY=()\n cur="\${COMP_WORDS[COMP_CWORD]}"\n prev="\${COMP_WORDS[COMP_CWORD-1]}"\n cmd="_"\n
opts=()\n\n _${replaceSpecialChars1(this.cmd.getName())}_complete() {\n local action="$1"; shift\n
mapfile -t values < <( ${this.cmd.getName()} completions complete "\${action}" "\${@}" )\n for i in
"\${values[@]}"; do\n opts+=("$i")\n done\n }\n\n ${this.generateCompletions(this.cmd).trim()}\n\n
for word in "\${COMP_WORDS[@]}"; do\n case "\${word}" in\n -*) ;;\n *)\n
cmd_tmp="\${cmd}_\${word//[^[:alnum:]]/_}"\n if type "\${cmd_tmp}" &>/dev/null; then\n
cmd="\${cmd_tmp}"\n fi\n esac\n done\n\n \${cmd}\n\n if [[ \${#opts[@]} -eq 0 ]]; then\n #
shellcheck disable=SC2207\n COMPREPLY=($(compgen -f "\${cur}"))\n return 0\n fi\n\n local values\n
values="$( printf "\\n%s" "\${opts[@]}" )"\n local IFS=$'\\n'\n # shellcheck disable=SC2207\n local
result=($(compgen -W "\${values[@]}" -- "\${cur}"))\n if [[ \${#result[@]} -eq 0 ]]; then\n # shellcheck
disable=SC2207\n COMPREPLY=($(compgen -f "\${cur}"))\n else\n # shellcheck disable=SC2207\n
COMPREPLY=($(printf '%q\\n' "\${result[@]}"))\n fi\n\n return 0\n}\n\ncomplete -F
_${replaceSpecialChars1(path)} -o bashdefault -o default ${path}`;
+ }
+ generateCompletions(command, path = "", index = 1) {
+ path = (path ? path + " " : "") + command.getName();
+ const commandCompletions = this.generateCommandCompletions(command, path, index);
+ const childCommandCompletions = command.getCommands(false).filter((subCommand)=>subCommand !==
command
+ ).map((subCommand)=>this.generateCompletions(subCommand, path, index + 1)
+ ).join("");
+ return `${commandCompletions}\n\n${childCommandCompletions}`;
+ }
+ generateCommandCompletions(command, path, index) {
+ const flags = this.getFlags(command);
+ const childCommandNames = command.getCommands(false).map((childCommand)=>childCommand.getName()
+ );
+ const completionsPath = ~path.indexOf(" ") ? " " + path.split(" ").slice(1).join(" ") : "";
+ const optionArguments = this.generateOptionArguments(command, completionsPath);
+ const completionsCmd = this.generateCommandCompletionsCommand(command.getArguments(),
completionsPath);
+ return ` __${replaceSpecialChars1(path)}() {\n opts=(${[
+ ...flags,
+ ...childCommandNames
+ ].join(" ")})\n ${completionsCmd}\n if [[ \${cur} == -* || \${COMP_CWORD} -eq ${index} ]] ;
then\n return 0\n fi\n ${optionArguments}\n }`;
+ }
+ getFlags(command) {
+ return command.getOptions(false).map((option11)=>option11.flags
+ ).flat();
+ }
+ generateOptionArguments(command, completionsPath) {
+ let opts = "";
+ const options7 = command.getOptions(false);
+ if (options7.length) {
+ opts += 'case "${prev}" in';
+ for (const option11 of options7){
+ const flags = option11.flags.map((flag)=>flag.trim()
+ ).join("|");
+ const completionsCmd = this.generateOptionCompletionsCommand(option11.args, completionsPath,
{
+ standalone: option11.standalone
+ });
+ opts += `\n ${flags}) ${completionsCmd} ;;`;
+ }
+ opts += "\n esac";
+ }
+ return opts;
+ }
+ generateCommandCompletionsCommand(args, path) {
+ if (args.length) {
+ return `_${replaceSpecialChars1(this.cmd.getName())}_complete ${args[0].action}${path}`;
+ }
+ return "";
+ }
+ generateOptionCompletionsCommand(args, path, opts) {
+ if (args.length) {
+ return `opts=(); _${replaceSpecialChars1(this.cmd.getName())}_complete ${args[0].action}${path}`;
+ }
+ if (opts?.standalone) {
+ return "opts=()";
+ }
+ return "";
+ }
+}
+function replaceSpecialChars1(str) {
+ return str.replace(/[^a-zA-Z0-9]/g, "_");
+}
+class BashCompletionsCommand extends Command1 {
+ #cmd;
+ constructor(cmd3){
+ super();
+ this.#cmd = cmd3;
+ this.description(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ return `Generate shell completions for bash.\n\nTo enable bash completions for this program add
following line to your ${dim(italic("~/.bashrc"))}:\n\n ${dim(italic(`source <(${baseCmd.getPath()}
completions bash)`))}`;
+ }).action(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ console.log(BashCompletionsGenerator.generate(baseCmd));
+ });
+ }
+}
+class CompleteCommand extends Command1 {
+ constructor(cmd4){
+ super();
+ this.description("Get completions for given action from given command.").arguments("<action:string>
[command...:string]").action(async (_, action, commandNames)=>{
+ let parent;
+ const completeCommand = commandNames?.reduce((cmd5, name19)=>{
+ parent = cmd5;
+ const childCmd = cmd5.getCommand(name19, false);
+ if (!childCmd) {
+ throw new UnknownCompletionCommand(name19, cmd5.getCommands());
+ }
+ return childCmd;
+ }, cmd4 || this.getMainCommand()) ?? (cmd4 || this.getMainCommand());
+ const completion = completeCommand.getCompletion(action);
+ const result = await completion?.complete(completeCommand, parent) ?? [];
+ if (result?.length) {
+ Deno.stdout.writeSync(new TextEncoder().encode(result.join("\n")));
+ }
+ }).reset();
+ }
+}
+class FishCompletionsGenerator {
+ cmd;
+ static generate(cmd) {
+ return new FishCompletionsGenerator(cmd).generate();
+ }
+ constructor(cmd5){
+ this.cmd = cmd5;
+ }
+ generate() {
+ const path = this.cmd.getPath();
+ const version = this.cmd.getVersion() ? ` v${this.cmd.getVersion()}` : "";
+ return `#!/usr/bin/env fish\n# fish completion support for ${path}${version}\n\nfunction
__fish_${replaceSpecialChars2(this.cmd.getName())}_using_command\n set cmds
${getCommandFnNames(this.cmd).join(" ")}\n set words (commandline -opc)\n set cmd "_"\n for word in
$words\n switch $word\n case '-*'\n continue\n case '*'\n set word (string replace
-r -a '\\W' '_' $word)\n set cmd_tmp $cmd"_$word"\n if contains $cmd_tmp $cmds\n set
cmd $cmd_tmp\n end\n end\n end\n if [ "$cmd" = "$argv[1]" ]\n return 0\n end\n return
1\nend\n\n${this.generateCompletions(this.cmd).trim()}`;
+ }
+ generateCompletions(command) {
+ const parent = command.getParent();
+ let result = ``;
+ if (parent) {
+ result += "\n" + this.complete(parent, {
+ description: command.getShortDescription(),
+ arguments: command.getName()
+ });
+ }
+ const commandArgs = command.getArguments();
+ if (commandArgs.length) {
+ result += "\n" + this.complete(command, {
+ arguments: commandArgs.length ? this.getCompletionCommand(commandArgs[0].action + " " +
getCompletionsPath(command)) : undefined
+ });
+ }
+ for (const option11 of command.getOptions(false)){
+ result += "\n" + this.completeOption(command, option11);
+ }
+ for (const subCommand of command.getCommands(false)){
+ result += this.generateCompletions(subCommand);
+ }
+ return result;
+ }
+ completeOption(command, option) {
+ const shortOption = option.flags.find((flag)=>flag.length === 2
+ )?.replace(/^(-)+/, "");
+ const longOption = option.flags.find((flag)=>flag.length > 2
+ )?.replace(/^(-)+/, "");
+ return this.complete(command, {
+ description: option.description,
+ shortOption: shortOption,
+ longOption: longOption,
+ required: true,
+ standalone: option.standalone,
+ arguments: option.args.length ? this.getCompletionCommand(option.args[0].action + " " +
getCompletionsPath(command)) : undefined
+ });
+ }
+ complete(command, options) {
+ const cmd6 = [
+ "complete"
+ ];
+ cmd6.push("-c", this.cmd.getName());
+ cmd6.push("-n", `'__fish_${replaceSpecialChars2(this.cmd.getName())}_using_command
__${replaceSpecialChars2(command.getPath())}'`);
+ options.shortOption && cmd6.push("-s", options.shortOption);
+ options.longOption && cmd6.push("-l", options.longOption);
+ options.standalone && cmd6.push("-x");
+ cmd6.push("-k");
+ cmd6.push("-f");
+ if (options.arguments) {
+ options.required && cmd6.push("-r");
+ cmd6.push("-a", options.arguments);
+ }
+ options.description && cmd6.push("-d", `'${options.description}'`);
+ return cmd6.join(" ");
+ }
+ getCompletionCommand(cmd) {
+ return `'(${this.cmd.getName()} completions complete ${cmd.trim()})'`;
+ }
+}
+function getCommandFnNames(cmd6, cmds = []) {
+ cmds.push(`__${replaceSpecialChars2(cmd6.getPath())}`);
+ cmd6.getCommands(false).forEach((command)=>{
+ getCommandFnNames(command, cmds);
+ });
+ return cmds;
+}
+function getCompletionsPath(command) {
+ return command.getPath().split(" ").slice(1).join(" ");
+}
+function replaceSpecialChars2(str) {
+ return str.replace(/[^a-zA-Z0-9]/g, "_");
+}
+class FishCompletionsCommand extends Command1 {
+ #cmd;
+ constructor(cmd6){
+ super();
+ this.#cmd = cmd6;
+ this.description(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ return `Generate shell completions for fish.\n\nTo enable fish completions for this program add
following line to your ${dim(italic("~/.config/fish/config.fish"))}:\n\n ${dim(italic(`source
(${baseCmd.getPath()} completions fish | psub)`))}`;
+ }).action(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ console.log(FishCompletionsGenerator.generate(baseCmd));
+ });
+ }
+}
+class ZshCompletionsGenerator {
+ cmd;
+ actions = new Map();
+ static generate(cmd) {
+ return new ZshCompletionsGenerator(cmd).generate();
+ }
+ constructor(cmd7){
+ this.cmd = cmd7;
+ }
+ generate() {
+ const path = this.cmd.getPath();
+ const name19 = this.cmd.getName();
+ const version = this.cmd.getVersion() ? ` v${this.cmd.getVersion()}` : "";
+ return `#!/usr/bin/env zsh\n# zsh completion support for ${path}${version}\n\nautoload -U
is-at-least\n\n# shellcheck disable=SC2154\n(( $+functions[__${replaceSpecialChars3(name19)}_complete] ))
||\nfunction __${replaceSpecialChars3(name19)}_complete {\n local name="$1"; shift\n local action="$1";
shift\n integer ret=1\n local -a values\n local expl lines\n _tags "$name"\n while _tags; do\n if
_requested "$name"; then\n # shellcheck disable=SC2034\n lines="$(${name19} completions complete
"\${action}" "\${@}")"\n values=("\${(ps:\\n:)lines}")\n if (( \${#values[@]} )); then\n
while _next_label "$name" expl "$action"; do\n compadd -S '' "\${expl[@]}" "\${values[@]}"\n
done\n fi\n fi\n done\n}\n\n${this.generateCompletions(this.cmd).trim()}\n\n#
_${replaceSpecialChars3(path)} "\${@}"\n\ncompdef _${replaceSpecialChars3(path)} ${path}`;
+ }
+ generateCompletions(command, path = "") {
+ if (!command.hasCommands(false) && !command.hasOptions(false) && !command.hasArguments()) {
+ return "";
+ }
+ path = (path ? path + " " : "") + command.getName();
+ return `# shellcheck disable=SC2154\n(( $+functions[_${replaceSpecialChars3(path)}] )) ||\nfunction
_${replaceSpecialChars3(path)}() {` + (!command.getParent() ? `\n local state` : "") +
this.generateCommandCompletions(command, path) + this.generateSubCommandCompletions(command, path) +
this.generateArgumentCompletions(command, path) + this.generateActions(command) + `\n}\n\n` +
command.getCommands(false).filter((subCommand)=>subCommand !== command
+ ).map((subCommand)=>this.generateCompletions(subCommand, path)
+ ).join("");
+ }
+ generateCommandCompletions(command, path) {
+ const commands5 = command.getCommands(false);
+ let completions =
commands5.map((subCommand)=>`'${subCommand.getName()}:${subCommand.getShortDescription()}'`
+ ).join("\n ");
+ if (completions) {
+ completions = `\n local -a commands\n # shellcheck disable=SC2034\n commands=(\n
${completions}\n )\n _describe 'command' commands`;
+ }
+ if (command.hasArguments()) {
+ const completionsPath = path.split(" ").slice(1).join(" ");
+ const arg3 = command.getArguments()[0];
+ const action = this.addAction(arg3, completionsPath);
+ if (action && command.getCompletion(arg3.action)) {
+ completions += `\n __${replaceSpecialChars3(this.cmd.getName())}_complete
${action.arg.name} ${action.arg.action} ${action.cmd}`;
+ }
+ }
+ if (completions) {
+ completions = `\n\n function _commands() {${completions}\n }`;
+ }
+ return completions;
+ }
+ generateSubCommandCompletions(command, path) {
+ if (command.hasCommands(false)) {
+ const actions = command.getCommands(false).map((command)=>`${command.getName()})
_${replaceSpecialChars3(path + " " + command.getName())} ;;`
+ ).join("\n ");
+ return `\n\n function _command_args() {\n case "\${words[1]}" in\n ${actions}\n
esac\n }`;
+ }
+ return "";
+ }
+ generateArgumentCompletions(command, path) {
+ this.actions.clear();
+ const options7 = this.generateOptions(command, path);
+ let argIndex = 0;
+ let argsCommand = "\n\n _arguments -w -s -S -C";
+ if (command.hasOptions()) {
+ argsCommand += ` \\\n ${options7.join(" \\\n ")}`;
+ }
+ if (command.hasCommands(false) ||
command.getArguments().filter((arg3)=>command.getCompletion(arg3.action)
+ ).length) {
+ argsCommand += ` \\\n '${++argIndex}: :_commands'`;
+ }
+ if (command.hasArguments() || command.hasCommands(false)) {
+ const args3 = [];
+ for (const arg3 of command.getArguments().slice(1)){
+ const completionsPath = path.split(" ").slice(1).join(" ");
+ const action = this.addAction(arg3, completionsPath);
+ args3.push(`${++argIndex}${arg3.optionalValue ? "::" : ":"}${action.name}`);
+ }
+ argsCommand += args3.map((arg4)=>`\\\n '${arg4}'`
+ ).join("");
+ if (command.hasCommands(false)) {
+ argsCommand += ` \\\n '*:: :->command_args'`;
+ }
+ }
+ return argsCommand;
+ }
+ generateOptions(command, path) {
+ const options7 = [];
+ const cmdArgs = path.split(" ");
+ const _baseName = cmdArgs.shift();
+ const completionsPath = cmdArgs.join(" ");
+ const excludedFlags = command.getOptions(false).map((option11)=>option11.standalone ? option11.flags
: false
+ ).flat().filter((flag)=>typeof flag === "string"
+ );
+ for (const option11 of command.getOptions(false)){
+ options7.push(this.generateOption(option11, completionsPath, excludedFlags));
+ }
+ return options7;
+ }
+ generateOption(option, completionsPath, excludedOptions) {
+ const flags = option.flags;
+ let excludedFlags = option.conflicts?.length ? [
+ ...excludedOptions,
+ ...option.conflicts.map((opt)=>"--" + opt.replace(/^--/, "")
+ ),
+ ] : excludedOptions;
+ excludedFlags = option.collect ? excludedFlags : [
+ ...excludedFlags,
+ ...flags,
+ ];
+ let args3 = "";
+ for (const arg3 of option.args){
+ const action = this.addAction(arg3, completionsPath);
+ if (arg3.variadic) {
+ args3 += `${arg3.optionalValue ? "::" : ":"}${arg3.name}:->${action.name}`;
+ } else {
+ args3 += `${arg3.optionalValue ? "::" : ":"}${arg3.name}:->${action.name}`;
+ }
+ }
+ let description = option.description.trim().split("\n").shift();
+ description = description.replace(/\[/g, "\\[").replace(/]/g, "\\]").replace(/"/g,
'\\"').replace(/'/g, "'\"'\"'");
+ const collect = option.collect ? "*" : "";
+ if (option.standalone) {
+ return `'(- *)'{${collect}${flags}}'[${description}]${args3}'`;
+ } else {
+ const excluded2 = excludedFlags.length ? `'(${excludedFlags.join(" ")})'` : "";
+ if (collect || flags.length > 1) {
+ return `${excluded2}{${collect}${flags}}'[${description}]${args3}'`;
+ } else {
+ return `${excluded2}${flags}'[${description}]${args3}'`;
+ }
+ }
+ }
+ addAction(arg, cmd) {
+ const action = `${arg.name}-${arg.action}`;
+ if (!this.actions.has(action)) {
+ this.actions.set(action, {
+ arg: arg,
+ label: `${arg.name}: ${arg.action}`,
+ name: action,
+ cmd
+ });
+ }
+ return this.actions.get(action);
+ }
+ generateActions(command) {
+ let actions = [];
+ if (this.actions.size) {
+ actions = Array.from(this.actions).map(([name19, action])=>`${name19})
__${replaceSpecialChars3(this.cmd.getName())}_complete ${action.arg.name} ${action.arg.action} ${action.cmd}
;;`
+ );
+ }
+ if (command.hasCommands(false)) {
+ actions.unshift(`command_args) _command_args ;;`);
+ }
+ if (actions.length) {
+ return `\n\n case "$state" in\n ${actions.join("\n ")}\n esac`;
+ }
+ return "";
+ }
+}
+function replaceSpecialChars3(str) {
+ return str.replace(/[^a-zA-Z0-9]/g, "_");
+}
+class ZshCompletionsCommand extends Command1 {
+ #cmd;
+ constructor(cmd8){
+ super();
+ this.#cmd = cmd8;
+ this.description(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ return `Generate shell completions for zsh.\n\nTo enable zsh completions for this program add
following line to your ${dim(italic("~/.zshrc"))}:\n\n ${dim(italic(`source <(${baseCmd.getPath()}
completions zsh)`))}`;
+ }).action(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ console.log(ZshCompletionsGenerator.generate(baseCmd));
+ });
+ }
+}
+class CompletionsCommand1 extends Command1 {
+ #cmd;
+ constructor(cmd9){
+ super();
+ this.#cmd = cmd9;
+ this.description(()=>{
+ const baseCmd = this.#cmd || this.getMainCommand();
+ return `Generate shell completions.\n\nTo enable shell completions for this program add the
following line to your ${dim(italic("~/.bashrc"))} or similar:\n\n ${dim(italic(`source
<(${baseCmd.getPath()} completions [shell])`))}\n\n For more information run
${dim(italic(`${baseCmd.getPath()} completions [shell] --help`))}\n`;
+ }).action(()=>this.showHelp()
+ ).command("bash", new BashCompletionsCommand(this.#cmd)).command("fish", new
FishCompletionsCommand(this.#cmd)).command("zsh", new ZshCompletionsCommand(this.#cmd)).command("complete",
new CompleteCommand(this.#cmd).hidden()).reset();
+ }
+}
+export { CompletionsCommand1 as CompletionsCommand };
+class CommandType extends StringType1 {
+ complete(_cmd, parent) {
+ return parent?.getCommands(false).map((cmd10)=>cmd10.getName()
+ ) || [];
+ }
+}
+class HelpCommand1 extends Command1 {
+ constructor(cmd10){
+ super();
+ this.type("command", new CommandType()).arguments("[command:command]").description("Show this help
or the help of a sub-command.").action((_, name19)=>{
+ if (!cmd10) {
+ cmd10 = name19 ? this.getGlobalParent()?.getBaseCommand(name19) : this.getGlobalParent();
+ }
+ if (!cmd10) {
+ const cmds = this.getGlobalParent()?.getCommands();
+ throw new UnknownCommand(name19 ?? "", cmds ?? [], [
+ this.getName(),
+ ...this.getAliases(),
+ ]);
+ }
+ cmd10.showHelp();
+ Deno.exit(0);
+ });
+ }
+}
+export { HelpCommand1 as HelpCommand };
+class ActionListType1 extends StringType1 {
+ cmd;
+ constructor(cmd11){
+ super();
+ this.cmd = cmd11;
+ }
+ complete() {
+ return this.cmd.getCompletions().map((type3)=>type3.name
+ ).filter((value4, index, self)=>self.indexOf(value4) === index
+ );
+ }
+}
+export { ActionListType1 as ActionListType };
+class ChildCommandType1 extends StringType1 {
+ #cmd;
+ constructor(cmd12){
+ super();
+ this.#cmd = cmd12;
+ }
+ complete(cmd) {
+ return (this.#cmd ?? cmd)?.getCommands(false).map((cmd13)=>cmd13.getName()
+ ) || [];
+ }
+}
+export { ChildCommandType1 as ChildCommandType };
+class EnumType1 extends Type1 {
+ allowedValues;
+ constructor(values){
+ super();
+ this.allowedValues = values;
+ }
+ parse(type) {
+ for (const value4 of this.allowedValues){
+ if (value4.toString() === type.value) {
+ return value4;
+ }
+ }
+ throw new InvalidTypeError(type, this.allowedValues.slice());
+ }
+ values() {
+ return this.allowedValues.slice();
+ }
+ complete() {
+ return this.values();
+ }
+}
+export { EnumType1 as EnumType };
+export { ValidationError1 as ValidationError };
+const KeyMap1 = {
+ "[P": "f1",
+ "[Q": "f2",
+ "[R": "f3",
+ "[S": "f4",
+ "OP": "f1",
+ "OQ": "f2",
+ "OR": "f3",
+ "OS": "f4",
+ "[11~": "f1",
+ "[12~": "f2",
+ "[13~": "f3",
+ "[14~": "f4",
+ "[[A": "f1",
+ "[[B": "f2",
+ "[[C": "f3",
+ "[[D": "f4",
+ "[[E": "f5",
+ "[15~": "f5",
+ "[17~": "f6",
+ "[18~": "f7",
+ "[19~": "f8",
+ "[20~": "f9",
+ "[21~": "f10",
+ "[23~": "f11",
+ "[24~": "f12",
+ "[A": "up",
+ "[B": "down",
+ "[C": "right",
+ "[D": "left",
+ "[E": "clear",
+ "[F": "end",
+ "[H": "home",
+ "OA": "up",
+ "OB": "down",
+ "OC": "right",
+ "OD": "left",
+ "OE": "clear",
+ "OF": "end",
+ "OH": "home",
+ "[1~": "home",
+ "[2~": "insert",
+ "[3~": "delete",
+ "[4~": "end",
+ "[5~": "pageup",
+ "[6~": "pagedown",
+ "[[5~": "pageup",
+ "[[6~": "pagedown",
+ "[7~": "home",
+ "[8~": "end"
+};
+const KeyMapShift1 = {
+ "[a": "up",
+ "[b": "down",
+ "[c": "right",
+ "[d": "left",
+ "[e": "clear",
+ "[2$": "insert",
+ "[3$": "delete",
+ "[5$": "pageup",
+ "[6$": "pagedown",
+ "[7$": "home",
+ "[8$": "end",
+ "[Z": "tab"
+};
+const KeyMapCtrl1 = {
+ "Oa": "up",
+ "Ob": "down",
+ "Oc": "right",
+ "Od": "left",
+ "Oe": "clear",
+ "[2^": "insert",
+ "[3^": "delete",
+ "[5^": "pageup",
+ "[6^": "pagedown",
+ "[7^": "home",
+ "[8^": "end"
+};
+const SpecialKeyMap1 = {
+ "\r": "return",
+ "\n": "enter",
+ "\t": "tab",
+ "\b": "backspace",
+ "\x7f": "backspace",
+ "\x1b": "escape",
+ " ": "space"
+};
+export { KeyMap1 as KeyMap };
+export { KeyMapShift1 as KeyMapShift };
+export { KeyMapCtrl1 as KeyMapCtrl };
+export { SpecialKeyMap1 as SpecialKeyMap };
+const kEscape = "\x1b";
+function parse1(data) {
+ let index = -1;
+ const keys = [];
+ const input = data instanceof Uint8Array ? new TextDecoder().decode(data) : data;
+ const hasNext = ()=>input.length - 1 >= index + 1
+ ;
+ const next = ()=>input[++index]
+ ;
+ parseNext();
+ return keys;
+ function parseNext() {
+ let ch = next();
+ let s = ch;
+ let escaped = false;
+ const key = {
+ name: undefined,
+ sequence: undefined,
+ code: undefined,
+ ctrl: false,
+ meta: false,
+ shift: false
+ };
+ if (ch === kEscape && hasNext()) {
+ escaped = true;
+ s += ch = next();
+ if (ch === kEscape) {
+ s += ch = next();
+ }
+ }
+ if (escaped && (ch === "O" || ch === "[")) {
+ let code1 = ch;
+ let modifier = 0;
+ if (ch === "O") {
+ s += ch = next();
+ if (ch >= "0" && ch <= "9") {
+ modifier = (Number(ch) >> 0) - 1;
+ s += ch = next();
+ }
+ code1 += ch;
+ } else if (ch === "[") {
+ s += ch = next();
+ if (ch === "[") {
+ code1 += ch;
+ s += ch = next();
+ }
+ const cmdStart = s.length - 1;
+ if (ch >= "0" && ch <= "9") {
+ s += ch = next();
+ if (ch >= "0" && ch <= "9") {
+ s += ch = next();
+ }
+ }
+ if (ch === ";") {
+ s += ch = next();
+ if (ch >= "0" && ch <= "9") {
+ s += next();
+ }
+ }
+ const cmd13 = s.slice(cmdStart);
+ let match;
+ if (match = cmd13.match(/^(\d\d?)(;(\d))?([~^$])$/)) {
+ code1 += match[1] + match[4];
+ modifier = (Number(match[3]) || 1) - 1;
+ } else if (match = cmd13.match(/^((\d;)?(\d))?([A-Za-z])$/)) {
+ code1 += match[4];
+ modifier = (Number(match[3]) || 1) - 1;
+ } else {
+ code1 += cmd13;
+ }
+ }
+ key.ctrl = !!(modifier & 4);
+ key.meta = !!(modifier & 10);
+ key.shift = !!(modifier & 1);
+ key.code = code1;
+ if (code1 in KeyMap1) {
+ key.name = KeyMap1[code1];
+ } else if (code1 in KeyMapShift1) {
+ key.name = KeyMapShift1[code1];
+ key.shift = true;
+ } else if (code1 in KeyMapCtrl1) {
+ key.name = KeyMapCtrl1[code1];
+ key.ctrl = true;
+ } else {
+ key.name = "undefined";
+ }
+ } else if (ch in SpecialKeyMap1) {
+ key.name = SpecialKeyMap1[ch];
+ key.meta = escaped;
+ } else if (!escaped && ch <= "\x1a") {
+ key.name = String.fromCharCode(ch.charCodeAt(0) + "a".charCodeAt(0) - 1);
+ key.ctrl = true;
+ } else if (/^[0-9A-Za-z]$/.test(ch)) {
+ key.name = ch.toLowerCase();
+ key.shift = /^[A-Z]$/.test(ch);
+ key.meta = escaped;
+ } else if (escaped) {
+ key.name = ch.length ? undefined : "escape";
+ key.meta = true;
+ }
+ key.sequence = s;
+ if (s.length !== 0 && (key.name !== undefined || escaped)) {
+ keys.push(key);
+ } else if (charLengthAt(s, 0) === s.length) {
+ keys.push(key);
+ } else {
+ throw new Error("Unrecognized or broken escape sequence");
+ }
+ if (hasNext()) {
+ parseNext();
+ }
+ }
+}
+function charLengthAt(str, i) {
+ const pos = str.codePointAt(i);
+ if (typeof pos === "undefined") {
+ return 1;
+ }
+ return pos >= 65536 ? 2 : 1;
+}
+export { parse1 as parse };
+const main = {
+ ARROW_UP: "↑",
+ ARROW_DOWN: "↓",
+ ARROW_LEFT: "←",
+ ARROW_RIGHT: "→",
+ ARROW_UP_LEFT: "↖",
+ ARROW_UP_RIGHT: "↗",
+ ARROW_DOWN_RIGHT: "↘",
+ ARROW_DOWN_LEFT: "↙",
+ RADIO_ON: "◉",
+ RADIO_OFF: "◯",
+ TICK: "✔",
+ CROSS: "✘",
+ ELLIPSIS: "…",
+ POINTER_SMALL: "›",
+ LINE: "─",
+ POINTER: "❯",
+ INFO: "ℹ",
+ TAB_LEFT: "⇤",
+ TAB_RIGHT: "⇥",
+ ESCAPE: "⎋",
+ BACKSPACE: "⌫",
+ PAGE_UP: "⇞",
+ PAGE_DOWN: "⇟",
+ ENTER: "↵",
+ SEARCH: "⌕"
+};
+const win = {
+ ...main,
+ RADIO_ON: "(*)",
+ RADIO_OFF: "( )",
+ TICK: "√",
+ CROSS: "×",
+ POINTER_SMALL: "»"
+};
+const Figures1 = Deno.build.os === "windows" ? win : main;
+const keyMap = {
+ up: "ARROW_UP",
+ down: "ARROW_DOWN",
+ pageup: "PAGE_UP",
+ pagedown: "PAGE_DOWN",
+ tab: "TAB_RIGHT",
+ enter: "ENTER",
+ return: "ENTER"
+};
+function getFiguresByKeys1(keys) {
+ const figures = [];
+ for (const key of keys){
+ const figure = Figures1[keyMap[key]] ?? key;
+ if (!figures.includes(figure)) {
+ figures.push(figure);
+ }
+ }
+ return figures;
+}
+export { Figures1 as Figures };
+export { getFiguresByKeys1 as getFiguresByKeys };
+class GenericPrompt1 {
+ static injectedValue;
+ settings;
+ tty = tty1;
+ indent;
+ cursor = {
+ x: 0,
+ y: 0
+ };
+ #value;
+ #lastError;
+ #isFirstRun = true;
+ static inject(value) {
+ GenericPrompt1.injectedValue = value;
+ }
+ constructor(settings){
+ this.settings = {
+ ...settings,
+ keys: {
+ submit: [
+ "enter",
+ "return"
+ ],
+ ...settings.keys ?? {
+ }
+ }
+ };
+ this.indent = this.settings.indent ?? " ";
+ }
+ async prompt() {
+ try {
+ return await this.#execute();
+ } finally{
+ this.tty.cursorShow();
+ }
+ }
+ clear() {
+ this.tty.cursorLeft.eraseDown();
+ }
+ #execute = async ()=>{
+ if (typeof GenericPrompt1.injectedValue !== "undefined" && this.#lastError) {
+ throw new Error(await this.error());
+ }
+ await this.render();
+ this.#lastError = undefined;
+ if (!await this.read()) {
+ return this.#execute();
+ }
+ if (typeof this.#value === "undefined") {
+ throw new Error("internal error: failed to read value");
+ }
+ this.clear();
+ const successMessage = this.success(this.#value);
+ if (successMessage) {
+ console.log(successMessage);
+ }
+ GenericPrompt1.injectedValue = undefined;
+ this.tty.cursorShow();
+ return this.#value;
+ };
+ async render() {
+ const result = await Promise.all([
+ this.message(),
+ this.body?.(),
+ this.footer(),
+ ]);
+ const content = result.filter(Boolean).join("\n");
+ const y = content.split("\n").length - this.cursor.y - 1;
+ if (!this.#isFirstRun || this.#lastError) {
+ this.clear();
+ }
+ this.#isFirstRun = false;
+ if (Deno.build.os === "windows") {
+ console.log(content);
+ this.tty.cursorUp();
+ } else {
+ Deno.stdout.writeSync(new TextEncoder().encode(content));
+ }
+ if (y) {
+ this.tty.cursorUp(y);
+ }
+ this.tty.cursorTo(this.cursor.x);
+ }
+ async read() {
+ if (typeof GenericPrompt1.injectedValue !== "undefined") {
+ const value4 = GenericPrompt1.injectedValue;
+ await this.#validateValue(value4);
+ } else {
+ const events = await this.#readKey();
+ if (!events.length) {
+ return false;
+ }
+ for (const event of events){
+ await this.handleEvent(event);
+ }
+ }
+ return typeof this.#value !== "undefined";
+ }
+ submit() {
+ return this.#validateValue(this.getValue());
+ }
+ message() {
+ return `${this.settings.indent}${this.settings.prefix}` + bold(this.settings.message) +
this.defaults();
+ }
+ defaults() {
+ let defaultMessage = "";
+ if (typeof this.settings.default !== "undefined") {
+ defaultMessage += dim(` (${this.format(this.settings.default)})`);
+ }
+ return defaultMessage;
+ }
+ success(value) {
+ return `${this.settings.indent}${this.settings.prefix}` + bold(this.settings.message) +
this.defaults() + " " + this.settings.pointer + " " + green(this.format(value));
+ }
+ footer() {
+ return this.error() ?? this.hint();
+ }
+ error() {
+ return this.#lastError ? this.settings.indent + red(bold(`${Figures1.CROSS} `) + this.#lastError) :
undefined;
+ }
+ hint() {
+ return this.settings.hint ? this.settings.indent + italic(blue(dim(`${Figures1.POINTER} `) +
this.settings.hint)) : undefined;
+ }
+ async handleEvent(event) {
+ switch(true){
+ case event.name === "c" && event.ctrl:
+ this.clear();
+ this.tty.cursorShow();
+ Deno.exit(130);
+ return;
+ case this.isKey(this.settings.keys, "submit", event):
+ await this.submit();
+ break;
+ }
+ }
+ #readKey = async ()=>{
+ const data = await this.#readChar();
+ return data.length ? parse1(data) : [];
+ };
+ #readChar = async ()=>{
+ const buffer = new Uint8Array(8);
+ const isTty = Deno.isatty(Deno.stdin.rid);
+ if (isTty) {
+ Deno.setRaw(Deno.stdin.rid, true, {
+ cbreak: this.settings.cbreak === true
+ });
+ }
+ const nread = await Deno.stdin.read(buffer);
+ if (isTty) {
+ Deno.setRaw(Deno.stdin.rid, false);
+ }
+ if (nread === null) {
+ return buffer;
+ }
+ return buffer.subarray(0, nread);
+ };
+ #transformValue = (value4)=>{
+ return this.settings.transform ? this.settings.transform(value4) : this.transform(value4);
+ };
+ #validateValue = async (value4)=>{
+ if (!value4 && typeof this.settings.default !== "undefined") {
+ this.#value = this.settings.default;
+ return;
+ }
+ this.#value = undefined;
+ this.#lastError = undefined;
+ const validation = await (this.settings.validate ? this.settings.validate(value4) :
this.validate(value4));
+ if (validation === false) {
+ this.#lastError = `Invalid answer.`;
+ } else if (typeof validation === "string") {
+ this.#lastError = validation;
+ } else {
+ this.#value = this.#transformValue(value4);
+ }
+ };
+ isKey(keys, name, event) {
+ const keyNames = keys?.[name];
+ return typeof keyNames !== "undefined" && (typeof event.name !== "undefined" &&
keyNames.indexOf(event.name) !== -1 || typeof event.sequence !== "undefined" &&
keyNames.indexOf(event.sequence) !== -1);
+ }
+}
+export { GenericPrompt1 as GenericPrompt };
+class GenericInput1 extends GenericPrompt1 {
+ inputValue = "";
+ inputIndex = 0;
+ constructor(settings1){
+ super({
+ ...settings1,
+ keys: {
+ moveCursorLeft: [
+ "left"
+ ],
+ moveCursorRight: [
+ "right"
+ ],
+ deleteCharLeft: [
+ "backspace"
+ ],
+ deleteCharRight: [
+ "delete"
+ ],
+ ...settings1.keys ?? {
+ }
+ }
+ });
+ }
+ getCurrentInputValue() {
+ return this.inputValue;
+ }
+ message() {
+ const message4 = super.message() + " " + this.settings.pointer + " ";
+ this.cursor.x = stripColor(message4).length + this.inputIndex + 1;
+ return message4 + this.input();
+ }
+ input() {
+ return underline(this.inputValue);
+ }
+ highlight(value, color1 = dim, color2 = blue) {
+ value = value.toString();
+ const inputLowerCase = this.getCurrentInputValue().toLowerCase();
+ const valueLowerCase = value.toLowerCase();
+ const index = valueLowerCase.indexOf(inputLowerCase);
+ const matched = value.slice(index, index + inputLowerCase.length);
+ return index >= 0 ? color1(value.slice(0, index)) + color2(matched) + color1(value.slice(index +
inputLowerCase.length)) : value;
+ }
+ async handleEvent(event) {
+ switch(true){
+ case event.name === "c" && event.ctrl:
+ this.clear();
+ this.tty.cursorShow();
+ Deno.exit(130);
+ return;
+ case this.isKey(this.settings.keys, "moveCursorLeft", event):
+ this.moveCursorLeft();
+ break;
+ case this.isKey(this.settings.keys, "moveCursorRight", event):
+ this.moveCursorRight();
+ break;
+ case this.isKey(this.settings.keys, "deleteCharRight", event):
+ this.deleteCharRight();
+ break;
+ case this.isKey(this.settings.keys, "deleteCharLeft", event):
+ this.deleteChar();
+ break;
+ case this.isKey(this.settings.keys, "submit", event):
+ await this.submit();
+ break;
+ default:
+ if (event.sequence && !event.meta && !event.ctrl) {
+ this.addChar(event.sequence);
+ }
+ }
+ }
+ addChar(__char) {
+ this.inputValue = this.inputValue.slice(0, this.inputIndex) + __char +
this.inputValue.slice(this.inputIndex);
+ this.inputIndex++;
+ }
+ moveCursorLeft() {
+ if (this.inputIndex > 0) {
+ this.inputIndex--;
+ }
+ }
+ moveCursorRight() {
+ if (this.inputIndex < this.inputValue.length) {
+ this.inputIndex++;
+ }
+ }
+ deleteChar() {
+ if (this.inputIndex > 0) {
+ this.inputIndex--;
+ this.deleteCharRight();
+ }
+ }
+ deleteCharRight() {
+ if (this.inputIndex < this.inputValue.length) {
+ this.inputValue = this.inputValue.slice(0, this.inputIndex) +
this.inputValue.slice(this.inputIndex + 1);
+ }
+ }
+}
+export { GenericInput1 as GenericInput };
+class GenericList1 extends GenericInput1 {
+ options = this.settings.options;
+ listIndex = this.getListIndex();
+ listOffset = this.getPageOffset(this.listIndex);
+ static separator(label = "------------") {
+ return {
+ value: label,
+ disabled: true
+ };
+ }
+ static mapOption(option) {
+ return {
+ value: option.value,
+ name: typeof option.name === "undefined" ? option.value : option.name,
+ disabled: !!option.disabled
+ };
+ }
+ constructor(settings2){
+ super({
+ ...settings2,
+ keys: {
+ previous: settings2.search ? [
+ "up"
+ ] : [
+ "up",
+ "u",
+ "8"
+ ],
+ next: settings2.search ? [
+ "down"
+ ] : [
+ "down",
+ "d",
+ "2"
+ ],
+ previousPage: [
+ "pageup"
+ ],
+ nextPage: [
+ "pagedown"
+ ],
+ ...settings2.keys ?? {
+ }
+ }
+ });
+ }
+ match() {
+ const input = this.getCurrentInputValue().toLowerCase();
+ if (!input.length) {
+ this.options = this.settings.options.slice();
+ } else {
+ this.options = this.settings.options.filter((option11)=>match(option11.name) || option11.name
!== option11.value && match(option11.value)
+ ).sort((a, b)=>distance(a.name, input) - distance(b.name, input)
+ );
+ }
+ this.listIndex = Math.max(0, Math.min(this.options.length - 1, this.listIndex));
+ this.listOffset = Math.max(0, Math.min(this.options.length - this.getListHeight(), this.listOffset));
+ function match(value4) {
+ return stripColor(value4).toLowerCase().includes(input);
+ }
+ }
+ message() {
+ let message4 = `${this.settings.indent}${this.settings.prefix}` + bold(this.settings.message) +
this.defaults();
+ if (this.settings.search) {
+ message4 += " " + this.settings.searchLabel + " ";
+ }
+ this.cursor.x = stripColor(message4).length + this.inputIndex + 1;
+ return message4 + this.input();
+ }
+ body() {
+ return this.getList() + this.getInfo();
+ }
+ getInfo() {
+ if (!this.settings.info) {
+ return "";
+ }
+ const selected = this.listIndex + 1;
+ const actions = [
+ [
+ "Next",
+ getFiguresByKeys1(this.settings.keys?.next ?? [])
+ ],
+ [
+ "Previous",
+ getFiguresByKeys1(this.settings.keys?.previous ?? [])
+ ],
+ [
+ "Next Page",
+ getFiguresByKeys1(this.settings.keys?.nextPage ?? [])
+ ],
+ [
+ "Previous Page",
+ getFiguresByKeys1(this.settings.keys?.previousPage ?? []),
+ ],
+ [
+ "Submit",
+ getFiguresByKeys1(this.settings.keys?.submit ?? [])
+ ],
+ ];
+ return "\n" + this.settings.indent + blue(Figures1.INFO) + bold(` ${selected}/${this.options.length}
`) + actions.map((cur)=>`${cur[0]}: ${bold(cur[1].join(", "))}`
+ ).join(", ");
+ }
+ getList() {
+ const list = [];
+ const height = this.getListHeight();
+ for(let i = this.listOffset; i < this.listOffset + height; i++){
+ list.push(this.getListItem(this.options[i], this.listIndex === i));
+ }
+ if (!list.length) {
+ list.push(this.settings.indent + dim(" No matches..."));
+ }
+ return list.join("\n");
+ }
+ getListHeight() {
+ return Math.min(this.options.length, this.settings.maxRows || this.options.length);
+ }
+ getListIndex(value) {
+ return typeof value === "undefined" ? this.options.findIndex((item)=>!item.disabled
+ ) || 0 : this.options.findIndex((item)=>item.value === value
+ ) || 0;
+ }
+ getPageOffset(index) {
+ if (index === 0) {
+ return 0;
+ }
+ const height = this.getListHeight();
+ return Math.floor(index / height) * height;
+ }
+ getOptionByValue(value) {
+ return this.options.find((option11)=>option11.value === value
+ );
+ }
+ read() {
+ if (!this.settings.search) {
+ this.tty.cursorHide();
+ }
+ return super.read();
+ }
+ async handleEvent(event) {
+ switch(true){
+ case this.isKey(this.settings.keys, "previous", event):
+ this.selectPrevious();
+ break;
+ case this.isKey(this.settings.keys, "next", event):
+ this.selectNext();
+ break;
+ case this.isKey(this.settings.keys, "nextPage", event):
+ this.selectNextPage();
+ break;
+ case this.isKey(this.settings.keys, "previousPage", event):
+ this.selectPreviousPage();
+ break;
+ default:
+ await super.handleEvent(event);
+ }
+ }
+ moveCursorLeft() {
+ if (this.settings.search) {
+ super.moveCursorLeft();
+ }
+ }
+ moveCursorRight() {
+ if (this.settings.search) {
+ super.moveCursorRight();
+ }
+ }
+ deleteChar() {
+ if (this.settings.search) {
+ super.deleteChar();
+ }
+ }
+ deleteCharRight() {
+ if (this.settings.search) {
+ super.deleteCharRight();
+ this.match();
+ }
+ }
+ addChar(__char) {
+ if (this.settings.search) {
+ super.addChar(__char);
+ this.match();
+ }
+ }
+ selectPrevious() {
+ if (this.options.length < 2) {
+ return;
+ }
+ if (this.listIndex > 0) {
+ this.listIndex--;
+ if (this.listIndex < this.listOffset) {
+ this.listOffset--;
+ }
+ if (this.options[this.listIndex].disabled) {
+ this.selectPrevious();
+ }
+ } else {
+ this.listIndex = this.options.length - 1;
+ this.listOffset = this.options.length - this.getListHeight();
+ if (this.options[this.listIndex].disabled) {
+ this.selectPrevious();
+ }
+ }
+ }
+ selectNext() {
+ if (this.options.length < 2) {
+ return;
+ }
+ if (this.listIndex < this.options.length - 1) {
+ this.listIndex++;
+ if (this.listIndex >= this.listOffset + this.getListHeight()) {
+ this.listOffset++;
+ }
+ if (this.options[this.listIndex].disabled) {
+ this.selectNext();
+ }
+ } else {
+ this.listIndex = this.listOffset = 0;
+ if (this.options[this.listIndex].disabled) {
+ this.selectNext();
+ }
+ }
+ }
+ selectPreviousPage() {
+ if (this.options?.length) {
+ const height = this.getListHeight();
+ if (this.listOffset >= height) {
+ this.listIndex -= height;
+ this.listOffset -= height;
+ } else if (this.listOffset > 0) {
+ this.listIndex -= this.listOffset;
+ this.listOffset = 0;
+ }
+ }
+ }
+ selectNextPage() {
+ if (this.options?.length) {
+ const height = this.getListHeight();
+ if (this.listOffset + height + height < this.options.length) {
+ this.listIndex += height;
+ this.listOffset += height;
+ } else if (this.listOffset + height < this.options.length) {
+ const offset = this.options.length - height;
+ this.listIndex += offset - this.listOffset;
+ this.listOffset = offset;
+ }
+ }
+ }
+}
+export { GenericList1 as GenericList };
+class Checkbox1 extends GenericList1 {
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ static prompt(options) {
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ listPointer: blue(Figures1.POINTER),
+ maxRows: 10,
+ searchLabel: blue(Figures1.SEARCH),
+ minOptions: 0,
+ maxOptions: Infinity,
+ check: green(Figures1.TICK),
+ uncheck: red(Figures1.CROSS),
+ ...options,
+ keys: {
+ check: [
+ "space"
+ ],
+ ...options.keys ?? {
+ }
+ },
+ options: Checkbox1.mapOptions(options)
+ }).prompt();
+ }
+ static separator(label) {
+ return {
+ ...super.separator(label),
+ icon: false
+ };
+ }
+ static mapOptions(options) {
+ return options.options.map((item)=>typeof item === "string" ? {
+ value: item
+ } : item
+ ).map((item)=>({
+ ...this.mapOption(item),
+ checked: typeof item.checked === "undefined" && options.default &&
options.default.indexOf(item.value) !== -1 ? true : !!item.checked,
+ icon: typeof item.icon === "undefined" ? true : item.icon
+ })
+ );
+ }
+ getListItem(item, isSelected) {
+ let line = this.settings.indent;
+ line += isSelected ? this.settings.listPointer + " " : " ";
+ if (item.icon) {
+ let check = item.checked ? this.settings.check + " " : this.settings.uncheck + " ";
+ if (item.disabled) {
+ check = dim(check);
+ }
+ line += check;
+ } else {
+ line += " ";
+ }
+ line += `${isSelected ? this.highlight(item.name, (val)=>val
+ ) : this.highlight(item.name)}`;
+ return line;
+ }
+ getValue() {
+ return this.settings.options.filter((item)=>item.checked
+ ).map((item)=>item.value
+ );
+ }
+ async handleEvent(event) {
+ switch(true){
+ case this.isKey(this.settings.keys, "check", event):
+ this.checkValue();
+ break;
+ default:
+ await super.handleEvent(event);
+ }
+ }
+ checkValue() {
+ const item = this.options[this.listIndex];
+ item.checked = !item.checked;
+ }
+ validate(value) {
+ const isValidValue = Array.isArray(value) && value.every((val)=>typeof val === "string" &&
val.length > 0 && this.settings.options.findIndex((option11)=>option11.value === val
+ ) !== -1
+ );
+ if (!isValidValue) {
+ return false;
+ }
+ if (value.length < this.settings.minOptions) {
+ return `The minimum number of options is ${this.settings.minOptions} but got ${value.length}.`;
+ }
+ if (value.length > this.settings.maxOptions) {
+ return `The maximum number of options is ${this.settings.maxOptions} but got ${value.length}.`;
+ }
+ return true;
+ }
+ transform(value) {
+ return value.map((val)=>val.trim()
+ );
+ }
+ format(value) {
+ return value.map((val)=>this.getOptionByValue(val)?.name ?? val
+ ).join(", ");
+ }
+}
+export { Checkbox1 as Checkbox };
+class GenericSuggestions extends GenericInput1 {
+ suggestionsIndex = -1;
+ suggestionsOffset = 0;
+ suggestions = [];
+ constructor(settings3){
+ super({
+ ...settings3,
+ keys: {
+ complete: [
+ "tab"
+ ],
+ next: [
+ "up"
+ ],
+ previous: [
+ "down"
+ ],
+ nextPage: [
+ "pageup"
+ ],
+ previousPage: [
+ "pagedown"
+ ],
+ ...settings3.keys ?? {
+ }
+ }
+ });
+ const suggestions1 = this.loadSuggestions();
+ if (suggestions1.length || this.settings.suggestions) {
+ this.settings.suggestions = [
+ ...suggestions1,
+ ...this.settings.suggestions ?? [],
+ ].filter(uniqueSuggestions);
+ }
+ }
+ get localStorage() {
+ if (this.settings.id && "localStorage" in window) {
+ try {
+ return window.localStorage;
+ } catch (_) {
+ }
+ }
+ return null;
+ }
+ loadSuggestions() {
+ if (this.settings.id) {
+ const json = this.localStorage?.getItem(this.settings.id);
+ const suggestions1 = json ? JSON.parse(json) : [];
+ if (!Array.isArray(suggestions1)) {
+ return [];
+ }
+ return suggestions1;
+ }
+ return [];
+ }
+ saveSuggestions(...suggestions) {
+ if (this.settings.id) {
+ this.localStorage?.setItem(this.settings.id, JSON.stringify([
+ ...suggestions,
+ ...this.loadSuggestions(),
+ ].filter(uniqueSuggestions)));
+ }
+ }
+ render() {
+ this.match();
+ return super.render();
+ }
+ match() {
+ if (!this.settings.suggestions?.length) {
+ return;
+ }
+ const input = this.getCurrentInputValue().toLowerCase();
+ if (!input.length) {
+ this.suggestions = this.settings.suggestions.slice();
+ } else {
+ this.suggestions =
this.settings.suggestions.filter((value4)=>stripColor(value4.toString()).toLowerCase().startsWith(input)
+ ).sort((a, b)=>distance((a || a).toString(), input) - distance((b || b).toString(), input)
+ );
+ }
+ this.suggestionsIndex = Math.max(this.getCurrentInputValue().trim().length === 0 ? -1 : 0,
Math.min(this.suggestions.length - 1, this.suggestionsIndex));
+ this.suggestionsOffset = Math.max(0, Math.min(this.suggestions.length - this.getListHeight(),
this.suggestionsOffset));
+ }
+ input() {
+ return super.input() + dim(this.getSuggestion());
+ }
+ getSuggestion() {
+ return
this.suggestions[this.suggestionsIndex]?.toString().substr(this.getCurrentInputValue().length) ?? "";
+ }
+ body() {
+ return this.getList() + this.getInfo();
+ }
+ getInfo() {
+ if (!this.settings.info) {
+ return "";
+ }
+ const selected = this.suggestionsIndex + 1;
+ const matched = this.suggestions.length;
+ const actions = [];
+ if (this.settings.suggestions?.length) {
+ if (this.settings.list) {
+ actions.push([
+ "Next",
+ getFiguresByKeys1(this.settings.keys?.next ?? [])
+ ], [
+ "Previous",
+ getFiguresByKeys1(this.settings.keys?.previous ?? [])
+ ], [
+ "Next Page",
+ getFiguresByKeys1(this.settings.keys?.nextPage ?? [])
+ ], [
+ "Previous Page",
+ getFiguresByKeys1(this.settings.keys?.previousPage ?? []),
+ ]);
+ } else {
+ actions.push([
+ "Next",
+ getFiguresByKeys1(this.settings.keys?.next ?? [])
+ ], [
+ "Previous",
+ getFiguresByKeys1(this.settings.keys?.previous ?? [])
+ ]);
+ }
+ actions.push([
+ "Complete",
+ getFiguresByKeys1(this.settings.keys?.complete ?? [])
+ ]);
+ }
+ actions.push([
+ "Submit",
+ getFiguresByKeys1(this.settings.keys?.submit ?? [])
+ ]);
+ let info = this.settings.indent;
+ if (this.settings.suggestions?.length) {
+ info += blue(Figures1.INFO) + bold(` ${selected}/${matched} `);
+ }
+ info += actions.map((cur)=>`${cur[0]}: ${bold(cur[1].join(" "))}`
+ ).join(", ");
+ return info;
+ }
+ getList() {
+ if (!this.settings.suggestions?.length || !this.settings.list) {
+ return "";
+ }
+ const list = [];
+ const height = this.getListHeight();
+ for(let i = this.suggestionsOffset; i < this.suggestionsOffset + height; i++){
+ list.push(this.getListItem(this.suggestions[i], this.suggestionsIndex === i));
+ }
+ if (list.length && this.settings.info) {
+ list.push("");
+ }
+ return list.join("\n");
+ }
+ getListItem(value, isSelected) {
+ let line = this.settings.indent ?? "";
+ line += isSelected ? `${this.settings.listPointer} ` : " ";
+ if (isSelected) {
+ line += underline(this.highlight(value));
+ } else {
+ line += this.highlight(value);
+ }
+ return line;
+ }
+ getListHeight(suggestions = this.suggestions) {
+ return Math.min(suggestions.length, this.settings.maxRows || suggestions.length);
+ }
+ async handleEvent(event) {
+ switch(true){
+ case this.isKey(this.settings.keys, "next", event):
+ if (this.settings.list) {
+ this.selectPreviousSuggestion();
+ } else {
+ this.selectNextSuggestion();
+ }
+ break;
+ case this.isKey(this.settings.keys, "previous", event):
+ if (this.settings.list) {
+ this.selectNextSuggestion();
+ } else {
+ this.selectPreviousSuggestion();
+ }
+ break;
+ case this.isKey(this.settings.keys, "nextPage", event):
+ if (this.settings.list) {
+ this.selectPreviousSuggestionsPage();
+ } else {
+ this.selectNextSuggestionsPage();
+ }
+ break;
+ case this.isKey(this.settings.keys, "previousPage", event):
+ if (this.settings.list) {
+ this.selectNextSuggestionsPage();
+ } else {
+ this.selectPreviousSuggestionsPage();
+ }
+ break;
+ case this.isKey(this.settings.keys, "complete", event):
+ this.complete();
+ break;
+ case this.isKey(this.settings.keys, "moveCursorRight", event):
+ if (this.inputIndex < this.inputValue.length) {
+ this.moveCursorRight();
+ } else {
+ this.complete();
+ }
+ break;
+ default:
+ await super.handleEvent(event);
+ }
+ }
+ deleteCharRight() {
+ if (this.inputIndex < this.inputValue.length) {
+ super.deleteCharRight();
+ if (!this.getCurrentInputValue().length) {
+ this.suggestionsIndex = -1;
+ this.suggestionsOffset = 0;
+ }
+ }
+ }
+ complete() {
+ if (this.suggestions.length && this.suggestions[this.suggestionsIndex]) {
+ this.inputValue = this.suggestions[this.suggestionsIndex].toString();
+ this.inputIndex = this.inputValue.length;
+ this.suggestionsIndex = 0;
+ this.suggestionsOffset = 0;
+ }
+ }
+ selectPreviousSuggestion() {
+ if (this.suggestions?.length) {
+ if (this.suggestionsIndex > -1) {
+ this.suggestionsIndex--;
+ if (this.suggestionsIndex < this.suggestionsOffset) {
+ this.suggestionsOffset--;
+ }
+ }
+ }
+ }
+ selectNextSuggestion() {
+ if (this.suggestions?.length) {
+ if (this.suggestionsIndex < this.suggestions.length - 1) {
+ this.suggestionsIndex++;
+ if (this.suggestionsIndex >= this.suggestionsOffset + this.getListHeight()) {
+ this.suggestionsOffset++;
+ }
+ }
+ }
+ }
+ selectPreviousSuggestionsPage() {
+ if (this.suggestions?.length) {
+ const height = this.getListHeight();
+ if (this.suggestionsOffset >= height) {
+ this.suggestionsIndex -= height;
+ this.suggestionsOffset -= height;
+ } else if (this.suggestionsOffset > 0) {
+ this.suggestionsIndex -= this.suggestionsOffset;
+ this.suggestionsOffset = 0;
+ }
+ }
+ }
+ selectNextSuggestionsPage() {
+ if (this.suggestions?.length) {
+ const height = this.getListHeight();
+ if (this.suggestionsOffset + height + height < this.suggestions.length) {
+ this.suggestionsIndex += height;
+ this.suggestionsOffset += height;
+ } else if (this.suggestionsOffset + height < this.suggestions.length) {
+ const offset = this.suggestions.length - height;
+ this.suggestionsIndex += offset - this.suggestionsOffset;
+ this.suggestionsOffset = offset;
+ }
+ }
+ }
+}
+function uniqueSuggestions(value4, index, self) {
+ return typeof value4 !== "undefined" && value4 !== "" && self.indexOf(value4) === index;
+}
+class Confirm1 extends GenericSuggestions {
+ static prompt(options) {
+ if (typeof options === "string") {
+ options = {
+ message: options
+ };
+ }
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ listPointer: blue(Figures1.POINTER),
+ maxRows: 8,
+ active: "Yes",
+ inactive: "No",
+ ...options,
+ suggestions: [
+ options.active ?? "Yes",
+ options.inactive ?? "No",
+ ],
+ list: false,
+ info: false
+ }).prompt();
+ }
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ defaults() {
+ let defaultMessage = "";
+ if (this.settings.default === true) {
+ defaultMessage += this.settings.active[0].toUpperCase() + "/" +
this.settings.inactive[0].toLowerCase();
+ } else if (this.settings.default === false) {
+ defaultMessage += this.settings.active[0].toLowerCase() + "/" +
this.settings.inactive[0].toUpperCase();
+ } else {
+ defaultMessage += this.settings.active[0].toLowerCase() + "/" +
this.settings.inactive[0].toLowerCase();
+ }
+ return defaultMessage ? dim(` (${defaultMessage})`) : "";
+ }
+ success(value) {
+ this.saveSuggestions(this.format(value));
+ return super.success(value);
+ }
+ getValue() {
+ return this.inputValue;
+ }
+ validate(value) {
+ return typeof value === "string" && [
+ this.settings.active[0].toLowerCase(),
+ this.settings.active.toLowerCase(),
+ this.settings.inactive[0].toLowerCase(),
+ this.settings.inactive.toLowerCase(),
+ ].indexOf(value.toLowerCase()) !== -1;
+ }
+ transform(value) {
+ switch(value.toLowerCase()){
+ case this.settings.active[0].toLowerCase():
+ case this.settings.active.toLowerCase():
+ return true;
+ case this.settings.inactive[0].toLowerCase():
+ case this.settings.inactive.toLowerCase():
+ return false;
+ }
+ return;
+ }
+ format(value) {
+ return value ? this.settings.active : this.settings.inactive;
+ }
+}
+export { Confirm1 as Confirm };
+class Input1 extends GenericSuggestions {
+ static prompt(options) {
+ if (typeof options === "string") {
+ options = {
+ message: options
+ };
+ }
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ listPointer: blue(Figures1.POINTER),
+ maxRows: 8,
+ minLength: 0,
+ maxLength: Infinity,
+ ...options
+ }).prompt();
+ }
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ success(value) {
+ this.saveSuggestions(value);
+ return super.success(value);
+ }
+ getValue() {
+ return this.inputValue;
+ }
+ validate(value) {
+ if (typeof value !== "string") {
+ return false;
+ }
+ if (value.length < this.settings.minLength) {
+ return `Value must be longer then ${this.settings.minLength} but has a length of
${value.length}.`;
+ }
+ if (value.length > this.settings.maxLength) {
+ return `Value can't be longer then ${this.settings.maxLength} but has a length of
${value.length}.`;
+ }
+ return true;
+ }
+ transform(value) {
+ return value.trim();
+ }
+ format(value) {
+ return value;
+ }
+}
+export { Input1 as Input };
+class List1 extends GenericSuggestions {
+ static prompt(options) {
+ if (typeof options === "string") {
+ options = {
+ message: options
+ };
+ }
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ listPointer: blue(Figures1.POINTER),
+ maxRows: 8,
+ separator: ",",
+ minLength: 0,
+ maxLength: Infinity,
+ minTags: 0,
+ maxTags: Infinity,
+ ...options
+ }).prompt();
+ }
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ input() {
+ const oldInput = this.inputValue;
+ const tags = this.getTags(oldInput);
+ const separator = this.settings.separator + " ";
+ this.inputValue = tags.join(separator);
+ const diff = oldInput.length - this.inputValue.length;
+ this.inputIndex -= diff;
+ this.cursor.x -= diff;
+ return tags.map((val)=>underline(val)
+ ).join(separator) + dim(this.getSuggestion());
+ }
+ getTags(value = this.inputValue) {
+ return value.trim().split(this.regexp());
+ }
+ regexp() {
+ return new RegExp(this.settings.separator === " " ? ` +` : ` *${this.settings.separator} *`);
+ }
+ success(value) {
+ this.saveSuggestions(...value);
+ return super.success(value);
+ }
+ getValue() {
+ return this.inputValue.replace(/,+\s*$/, "");
+ }
+ getCurrentInputValue() {
+ return this.getTags().pop() ?? "";
+ }
+ addChar(__char) {
+ switch(__char){
+ case this.settings.separator:
+ if (this.inputValue.length && this.inputValue.trim().slice(-1) !== this.settings.separator) {
+ super.addChar(__char);
+ }
+ this.suggestionsIndex = -1;
+ this.suggestionsOffset = 0;
+ break;
+ default:
+ super.addChar(__char);
+ }
+ }
+ deleteChar() {
+ if (this.inputValue[this.inputIndex - 1] === " ") {
+ super.deleteChar();
+ }
+ super.deleteChar();
+ }
+ complete() {
+ if (this.suggestions.length && this.suggestions[this.suggestionsIndex]) {
+ const tags = this.getTags().slice(0, -1);
+ tags.push(this.suggestions[this.suggestionsIndex].toString());
+ this.inputValue = tags.join(this.settings.separator + " ");
+ this.inputIndex = this.inputValue.length;
+ this.suggestionsIndex = 0;
+ this.suggestionsOffset = 0;
+ }
+ }
+ validate(value) {
+ if (typeof value !== "string") {
+ return false;
+ }
+ const values1 = this.transform(value);
+ for (const val of values1){
+ if (val.length < this.settings.minLength) {
+ return `Value must be longer then ${this.settings.minLength} but has a length of
${val.length}.`;
+ }
+ if (val.length > this.settings.maxLength) {
+ return `Value can't be longer then ${this.settings.maxLength} but has a length of
${val.length}.`;
+ }
+ }
+ if (values1.length < this.settings.minTags) {
+ return `The minimum number of tags is ${this.settings.minTags} but got ${values1.length}.`;
+ }
+ if (values1.length > this.settings.maxTags) {
+ return `The maximum number of tags is ${this.settings.maxTags} but got ${values1.length}.`;
+ }
+ return true;
+ }
+ transform(value) {
+ return this.getTags(value).filter((val)=>val !== ""
+ );
+ }
+ format(value) {
+ return value.join(`, `);
+ }
+}
+export { List1 as List };
+function parseNumber(value4) {
+ return Number(value4);
+}
+class Number1 extends GenericSuggestions {
+ static prompt(options) {
+ if (typeof options === "string") {
+ options = {
+ message: options
+ };
+ }
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ listPointer: blue(Figures1.POINTER),
+ maxRows: 8,
+ min: -Infinity,
+ max: Infinity,
+ float: false,
+ round: 2,
+ ...options,
+ keys: {
+ increaseValue: [
+ "up",
+ "u",
+ "+"
+ ],
+ decreaseValue: [
+ "down",
+ "d",
+ "-"
+ ],
+ ...options.keys ?? {
+ }
+ }
+ }).prompt();
+ }
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ success(value) {
+ this.saveSuggestions(value);
+ return super.success(value);
+ }
+ async handleEvent(event) {
+ switch(true){
+ case this.settings.suggestions && this.isKey(this.settings.keys, "next", event):
+ if (this.settings.list) {
+ this.selectPreviousSuggestion();
+ } else {
+ this.selectNextSuggestion();
+ }
+ break;
+ case this.settings.suggestions && this.isKey(this.settings.keys, "previous", event):
+ if (this.settings.list) {
+ this.selectNextSuggestion();
+ } else {
+ this.selectPreviousSuggestion();
+ }
+ break;
+ case this.isKey(this.settings.keys, "increaseValue", event):
+ this.increaseValue();
+ break;
+ case this.isKey(this.settings.keys, "decreaseValue", event):
+ this.decreaseValue();
+ break;
+ default:
+ await super.handleEvent(event);
+ }
+ }
+ increaseValue() {
+ this.manipulateIndex(false);
+ }
+ decreaseValue() {
+ this.manipulateIndex(true);
+ }
+ manipulateIndex(decrease) {
+ if (this.inputValue[this.inputIndex] === "-") {
+ this.inputIndex++;
+ }
+ if (this.inputValue.length && this.inputIndex > this.inputValue.length - 1) {
+ this.inputIndex--;
+ }
+ const decimalIndex = this.inputValue.indexOf(".");
+ const [abs, dec] = this.inputValue.split(".");
+ if (dec && this.inputIndex === decimalIndex) {
+ this.inputIndex--;
+ }
+ const inDecimal = decimalIndex !== -1 && this.inputIndex > decimalIndex;
+ let value4 = (inDecimal ? dec : abs) || "0";
+ const oldLength = this.inputValue.length;
+ const index = inDecimal ? this.inputIndex - decimalIndex - 1 : this.inputIndex;
+ const increaseValue = Math.pow(10, value4.length - index - 1);
+ value4 = (parseInt(value4) + (decrease ? -increaseValue : increaseValue)).toString();
+ this.inputValue = !dec ? value4 : this.inputIndex > decimalIndex ? abs + "." + value4 : value4 + "."
+ dec;
+ if (this.inputValue.length > oldLength) {
+ this.inputIndex++;
+ } else if (this.inputValue.length < oldLength && this.inputValue[this.inputIndex - 1] !== "-") {
+ this.inputIndex--;
+ }
+ this.inputIndex = Math.max(0, Math.min(this.inputIndex, this.inputValue.length - 1));
+ }
+ addChar(__char) {
+ if (isNumeric(__char)) {
+ super.addChar(__char);
+ } else if (this.settings.float && __char === "." && this.inputValue.indexOf(".") === -1 &&
(this.inputValue[0] === "-" ? this.inputIndex > 1 : this.inputIndex > 0)) {
+ super.addChar(__char);
+ }
+ }
+ validate(value) {
+ if (!isNumeric(value)) {
+ return false;
+ }
+ const val = parseFloat(value);
+ if (val > this.settings.max) {
+ return `Value must be lower or equal than ${this.settings.max}`;
+ }
+ if (val < this.settings.min) {
+ return `Value must be greater or equal than ${this.settings.min}`;
+ }
+ return true;
+ }
+ transform(value) {
+ const val = parseFloat(value);
+ if (this.settings.float) {
+ return parseFloat(val.toFixed(this.settings.round));
+ }
+ return val;
+ }
+ format(value) {
+ return value.toString();
+ }
+ getValue() {
+ return this.inputValue;
+ }
+}
+function isNumeric(value4) {
+ return typeof value4 === "number" || !!value4 && !isNaN(parseNumber(value4));
+}
+export { Number1 as Number };
+class Secret1 extends GenericInput1 {
+ static prompt(options) {
+ if (typeof options === "string") {
+ options = {
+ message: options
+ };
+ }
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ label: "Password",
+ hidden: false,
+ minLength: 0,
+ maxLength: Infinity,
+ ...options
+ }).prompt();
+ }
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ input() {
+ return underline(this.settings.hidden ? "" : "*".repeat(this.inputValue.length));
+ }
+ read() {
+ if (this.settings.hidden) {
+ this.tty.cursorHide();
+ }
+ return super.read();
+ }
+ validate(value) {
+ if (typeof value !== "string") {
+ return false;
+ }
+ if (value.length < this.settings.minLength) {
+ return `${this.settings.label} must be longer then ${this.settings.minLength} but has a length
of ${value.length}.`;
+ }
+ if (value.length > this.settings.maxLength) {
+ return `${this.settings.label} can't be longer then ${this.settings.maxLength} but has a length
of ${value.length}.`;
+ }
+ return true;
+ }
+ transform(value) {
+ return value;
+ }
+ format(value) {
+ return this.settings.hidden ? "*".repeat(8) : "*".repeat(value.length);
+ }
+ getValue() {
+ return this.inputValue;
+ }
+}
+export { Secret1 as Secret };
+class Select1 extends GenericList1 {
+ listIndex = this.getListIndex(this.settings.default);
+ static inject(value) {
+ GenericPrompt1.inject(value);
+ }
+ static prompt(options) {
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ listPointer: blue(Figures1.POINTER),
+ maxRows: 10,
+ searchLabel: blue(Figures1.SEARCH),
+ ...options,
+ options: Select1.mapOptions(options)
+ }).prompt();
+ }
+ static mapOptions(options) {
+ return options.options.map((item)=>typeof item === "string" ? {
+ value: item
+ } : item
+ ).map((item)=>this.mapOption(item)
+ );
+ }
+ input() {
+ return underline(blue(this.inputValue));
+ }
+ getListItem(item, isSelected) {
+ let line = this.settings.indent;
+ line += isSelected ? `${this.settings.listPointer} ` : " ";
+ line += `${isSelected ? this.highlight(item.name, (val)=>val
+ ) : this.highlight(item.name)}`;
+ return line;
+ }
+ getValue() {
+ return this.options[this.listIndex]?.value ?? this.settings.default;
+ }
+ validate(value) {
+ return typeof value === "string" && value.length > 0 &&
this.options.findIndex((option11)=>option11.value === value
+ ) !== -1;
+ }
+ transform(value) {
+ return value.trim();
+ }
+ format(value) {
+ return this.getOptionByValue(value)?.name ?? value;
+ }
+}
+export { Select1 as Select };
+class Toggle1 extends GenericPrompt1 {
+ status = typeof this.settings.default !== "undefined" ? this.format(this.settings.default) : "";
+ static prompt(options) {
+ if (typeof options === "string") {
+ options = {
+ message: options
+ };
+ }
+ return new this({
+ pointer: blue(Figures1.POINTER_SMALL),
+ prefix: yellow("? "),
+ indent: " ",
+ active: "Yes",
+ inactive: "No",
+ ...options,
+ keys: {
+ active: [
+ "right",
+ "y",
+ "j",
+ "s",
+ "o"
+ ],
+ inactive: [
+ "left",
+ "n"
+ ],
+ ...options.keys ?? {
+ }
+ }
+ }).prompt();
+ }
+ message() {
+ let message4 = super.message() + " " + this.settings.pointer + " ";
+ if (this.status === this.settings.active) {
+ message4 += dim(this.settings.inactive + " / ") + underline(this.settings.active);
+ } else if (this.status === this.settings.inactive) {
+ message4 += underline(this.settings.inactive) + dim(" / " + this.settings.active);
+ } else {
+ message4 += dim(this.settings.inactive + " / " + this.settings.active);
+ }
+ return message4;
+ }
+ read() {
+ this.tty.cursorHide();
+ return super.read();
+ }
+ async handleEvent(event) {
+ switch(true){
+ case event.sequence === this.settings.inactive[0].toLowerCase():
+ case this.isKey(this.settings.keys, "inactive", event):
+ this.selectInactive();
+ break;
+ case event.sequence === this.settings.active[0].toLowerCase():
+ case this.isKey(this.settings.keys, "active", event):
+ this.selectActive();
+ break;
+ default:
+ await super.handleEvent(event);
+ }
+ }
+ selectActive() {
+ this.status = this.settings.active;
+ }
+ selectInactive() {
+ this.status = this.settings.inactive;
+ }
+ validate(value) {
+ return [
+ this.settings.active,
+ this.settings.inactive
+ ].indexOf(value) !== -1;
+ }
+ transform(value) {
+ switch(value){
+ case this.settings.active:
+ return true;
+ case this.settings.inactive:
+ return false;
+ }
+ }
+ format(value) {
+ return value ? this.settings.active : this.settings.inactive;
+ }
+ getValue() {
+ return this.status;
+ }
+}
+export { Toggle1 as Toggle };
+function prompt1(prompts, options7) {
+ return new PromptList(prompts, options7).run(options7?.initial);
+}
+let injected = {
+};
+function inject1(values1) {
+ injected = values1;
+}
+class PromptList {
+ prompts;
+ options;
+ result = {
+ };
+ index = -1;
+ names;
+ isInBeforeHook = false;
+ get prompt() {
+ return this.prompts[this.index];
+ }
+ constructor(prompts, options7){
+ this.prompts = prompts;
+ this.options = options7;
+ this.names = this.prompts.map((prompt1)=>prompt1.name
+ );
+ }
+ async run(name) {
+ this.index = -1;
+ this.result = {
+ };
+ this.isInBeforeHook = false;
+ await this.next(name);
+ return this.result;
+ }
+ async next(name) {
+ if (this.updateIndex(name)) {
+ await this.runBeforeHook(async ()=>{
+ this.isInBeforeHook = false;
+ await this.runPrompt();
+ await this.runAfterHook();
+ });
+ }
+ }
+ updateIndex(name) {
+ if (name && typeof name === "string") {
+ this.index = this.names.indexOf(name);
+ if (this.index === -1) {
+ throw new Error(`Invalid prompt name: ${name}, allowed prompt names: ${this.names.join(",
")}`);
+ }
+ } else if (typeof name === "number") {
+ if (name < 0 || name > this.names.length) {
+ throw new Error(`Invalid prompt index: ${name}, prompt length: ${this.names.length}`);
+ }
+ this.index = name;
+ } else if (name === true && !this.isInBeforeHook) {
+ this.index++;
+ if (this.index < this.names.length - 1) {
+ this.index++;
+ }
+ } else {
+ this.index++;
+ }
+ this.isInBeforeHook = false;
+ if (this.index < this.names.length) {
+ return true;
+ } else if (this.index === this.names.length) {
+ return false;
+ } else {
+ throw new Error("next() called multiple times");
+ }
+ }
+ async runBeforeHook(run) {
+ this.isInBeforeHook = true;
+ const next = async (name19)=>{
+ if (name19 || typeof name19 === "number") {
+ return this.next(name19);
+ }
+ await run();
+ };
+ if (this.options?.before) {
+ await this.options.before(this.prompt.name, this.result, async (name19)=>{
+ if (name19 || typeof name19 === "number") {
+ return this.next(name19);
+ } else if (this.prompt.before) {
+ await this.prompt.before(this.result, next);
+ } else {
+ await run();
+ }
+ });
+ return;
+ } else if (this.prompt.before) {
+ await this.prompt.before(this.result, next);
+ return;
+ }
+ await run();
+ }
+ async runPrompt() {
+ const prompt1 = this.prompt.type;
+ if (typeof injected[this.prompt.name] !== "undefined") {
+ if (prompt1.inject) {
+ prompt1.inject(injected[this.prompt.name]);
+ } else {
+ GenericPrompt1.inject(injected[this.prompt.name]);
+ }
+ }
+ try {
+ this.result[this.prompt.name] = await prompt1.prompt({
+ cbreak: this.options?.cbreak,
+ ...this.prompt
+ });
+ } finally{
+ tty1.cursorShow();
+ }
+ }
+ async runAfterHook() {
+ if (this.options?.after) {
+ await this.options.after(this.prompt.name, this.result, async (name19)=>{
+ if (name19) {
+ return this.next(name19);
+ } else if (this.prompt.after) {
+ await this.prompt.after(this.result, (name20)=>this.next(name20)
+ );
+ } else {
+ await this.next();
+ }
+ });
+ } else if (this.prompt.after) {
+ await this.prompt.after(this.result, (name19)=>this.next(name19)
+ );
+ } else {
+ await this.next();
+ }
+ }
+}
+export { prompt1 as prompt };
+export { inject1 as inject };
+export { __boolean as boolean, number1 as number, OptionType1 as OptionType, parseFlags1 as parseFlags,
string1 as string, validateFlags1 as validateFlags };
\ No newline at end of file
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]