zod-args-parser 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/autocomplete.js +32 -4
- package/lib/commonjs/autocomplete.js.map +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/parser.js.map +1 -1
- package/lib/module/autocomplete.js +32 -4
- package/lib/module/autocomplete.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/parser.js.map +1 -1
- package/lib/typescript/autocomplete.d.ts +21 -2
- package/lib/typescript/autocomplete.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +37 -7
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/parser.d.ts +0 -2
- package/lib/typescript/parser.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +6 -4
- package/lib/typescript/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/autocomplete.ts +95 -13
- package/src/index.ts +84 -44
- package/src/parser.ts +19 -15
- package/src/types.ts +333 -332
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { Cli, NoSubcommand, SafeParseResult, Subcommand, UnSafeParseResult } from "./types.js";
|
|
2
|
-
export declare function parse<T extends Subcommand[]>(argsv: string[], ...params: T): UnSafeParseResult<T>;
|
|
3
2
|
export declare function parse<T extends Subcommand[], U extends Cli>(argsv: string[], ...params: [U, ...T]): UnSafeParseResult<[...T, NoSubcommand & U]>;
|
|
4
|
-
export declare function safeParse<T extends Subcommand[]>(argsv: string[], ...params: T): SafeParseResult<T>;
|
|
5
3
|
export declare function safeParse<T extends Subcommand[], U extends Cli>(argsv: string[], ...params: [U, ...T]): SafeParseResult<[...T, NoSubcommand & U]>;
|
|
6
4
|
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,GAAG,EACH,YAAY,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,GAAG,EACH,YAAY,EAIZ,eAAe,EACf,UAAU,EACV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,KAAK,CAAC,CAAC,SAAS,UAAU,EAAE,EAAE,CAAC,SAAS,GAAG,EACzD,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GACnB,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CA2P7C;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,EAAE,CAAC,SAAS,GAAG,EAC7D,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GACnB,eAAe,CAAC,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAoC3C"}
|
|
@@ -234,18 +234,18 @@ export type ParseResult<S extends Partial<Subcommand>[]> = {
|
|
|
234
234
|
subcommand: S[K]["name"];
|
|
235
235
|
} & Positional<S[K]> & Info<S[K]["options"]> & OptionsArr2RecordType<S[K]["options"]> & ArgumentsArr2ArrType<S[K]["arguments"]>>;
|
|
236
236
|
}[number];
|
|
237
|
-
export type PrintMethods<N extends Subcommand["name"]
|
|
237
|
+
export type PrintMethods<N extends Subcommand["name"]> = {
|
|
238
238
|
printCliHelp: (options?: PrintHelpOpt) => void;
|
|
239
239
|
printSubcommandHelp: (subcommand: LiteralUnion<NonNullable<N>>, options?: PrintHelpOpt) => void;
|
|
240
240
|
};
|
|
241
|
-
export type UnSafeParseResult<S extends Partial<Subcommand>[]> = CheckDuplicatedSubcommands<S> extends infer E extends string ? E : Prettify<ParseResult<S> & PrintMethods<S[number]["name"]
|
|
241
|
+
export type UnSafeParseResult<S extends Partial<Subcommand>[]> = CheckDuplicatedSubcommands<S> extends infer E extends string ? E : Prettify<ParseResult<S> & PrintMethods<NonNullable<S[number]["name"]>>>;
|
|
242
242
|
export type SafeParseResult<S extends Partial<Subcommand>[]> = CheckDuplicatedSubcommands<S> extends infer E extends string ? E : Prettify<({
|
|
243
243
|
success: false;
|
|
244
244
|
error: Error;
|
|
245
245
|
} | {
|
|
246
246
|
success: true;
|
|
247
247
|
data: ParseResult<S>;
|
|
248
|
-
}) & PrintMethods<S[number]["name"]
|
|
248
|
+
}) & PrintMethods<NonNullable<S[number]["name"]>>>;
|
|
249
249
|
export type ActionFn<T extends Subcommand | Cli> = {
|
|
250
250
|
setAction: (actions: (res: UnSafeParseResult<[T]>) => void) => void;
|
|
251
251
|
};
|
|
@@ -270,7 +270,9 @@ type IsDuplicatesInArr<Input extends any[]> = Input extends [infer Item, ...infe
|
|
|
270
270
|
* - Return an error message if duplicated is found
|
|
271
271
|
* - Return `subcommand` if not found
|
|
272
272
|
*/
|
|
273
|
-
export type CheckDuplicatedOptions<T extends
|
|
273
|
+
export type CheckDuplicatedOptions<T extends {
|
|
274
|
+
options?: Option[];
|
|
275
|
+
}> = T["options"] extends infer O extends Option[] ? IsDuplicatesInArr<MapNameAndAliases2StrArr<O>> extends infer D extends string ? `>>> Error: Duplicated Options \`${D}\` <<<` : T : T;
|
|
274
276
|
/**
|
|
275
277
|
* - Check for duplicated subcommands including aliases
|
|
276
278
|
* - Return an error message if duplicated is found
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,MAAM,MAAM,UAAU,GAAG;IACvB;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAEhC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IAEtC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG,QAAQ,CACxB,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG;IACzB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB,CACF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;;;;;OASG;IACH,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;;;;;OASG;IACH,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC;IAEnB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,QAAQ,CAAC,EAAE,WAAW,CAAC;QACvB,YAAY,CAAC,EAAE,WAAW,CAAC;QAC3B,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;QACvB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM,EAAE,GACvG,UAAU,CAAC;KAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC,MAAM,CAAC,CAAC;CAAE,CAAC,GAC1F,SAAS,CAAC;AAEd;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,SAAS,MAAM,CAAC,SAAS,QAAQ,EAAE,GAC7G;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAA;KAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;CAAE,GACvF,SAAS,CAAC;AAEd,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAC;AAExD,kEAAkE;AAClE,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE/D,sDAAsD;AACtD,KAAK,mBAAmB,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAEhG,0CAA0C;AAC1C,KAAK,UAAU,CAAC,CAAC,IAAI,QAAQ,CAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7F,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,IAAI,CAAC,SAAS,MAAM,EAAE,GAClF,UAAU,CAAC;KAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC,MAAM,CAAC,CAAC;CAAE,CAAC,GAC1F,MAAM,CAAC;AAEX,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAAE,GAAG,SAAS,IAAI,CAAC,SAAS,QAAQ,EAAE,GACrF;IAAE,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAAE,IAAI,EAAE,CAAC,CAAC,UAAU,CAAA;SAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;KAAE,CAAA;CAAE,GACtG,MAAM,CAAC;AAEX,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,SAAS,IAAI,GACrF;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GACxB,MAAM,CAAC;AAEX,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,SAAS,IAAI,CAAC,SAAS,MAAM,EAAE,GACjE;IACE,KAAK,EAAE,UAAU,CAAC;SACf,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;YAAE,IAAI,EAAE,CAAC,CAAA;SAAE,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM,GACpF,SAAS,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAClC,SAAS,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAC/B,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GACrB,KAAK;KACV,CAAC,CAAC;CACJ,GACD,MAAM,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI;KACxD,CAAC,IAAI,MAAM,CAAC,GAAG,QAAQ,CACtB;QAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAC7C,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GACrB,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GACtC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAC1C;CACF,CAAC,MAAM,CAAC,CAAC;AAEV,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zod-args-parser",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "A strictly typed command-line arguments parser powered by Zod.",
|
|
5
5
|
"author": "Ahmed ALABSI <alabsi91@gmail>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|
|
12
12
|
"scripts": {
|
|
13
|
-
"dev": "tsx watch example/
|
|
13
|
+
"dev": "tsx watch example/index.ts",
|
|
14
14
|
"build": "node scripts/build.mjs",
|
|
15
15
|
"test": "eslint src/** --fix && tsc --noEmit && tsx test/test.ts",
|
|
16
16
|
"prepare": "npm run test && npm run build"
|
package/src/autocomplete.ts
CHANGED
|
@@ -2,22 +2,31 @@ import { transformOptionToArg } from "./utils.js";
|
|
|
2
2
|
|
|
3
3
|
import type { Cli, Subcommand } from "./types.js";
|
|
4
4
|
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* - Generate bash autocomplete script for your CLI
|
|
7
|
+
* - The generated script should be added to your `.bash_profile` or `.bashrc` file:
|
|
8
|
+
*
|
|
9
|
+
* - Run: `nano $HOME/.bash_profile` or `nano $HOME/.bashrc`
|
|
10
|
+
* - Add the following line: `source <generated script path>`
|
|
11
|
+
* - Save and reopen bash to take effect
|
|
12
|
+
*/
|
|
13
|
+
export function generateBashAutocompleteScript(...params: [Cli, ...Subcommand[]]): string {
|
|
7
14
|
const [cli, ...subcommands] = params;
|
|
8
15
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
type MappedCommands = Record<string, { options: string[]; aliases: string[] }>;
|
|
17
|
+
|
|
18
|
+
const mappedCommands = subcommands.reduce((acc: MappedCommands, subcommand) => {
|
|
19
|
+
acc[subcommand.name] = {
|
|
20
|
+
options: subcommand.options?.map(option => transformOptionToArg(option.name)) ?? [],
|
|
21
|
+
aliases: subcommand.aliases ?? [],
|
|
22
|
+
};
|
|
14
23
|
return acc;
|
|
15
24
|
}, {});
|
|
16
25
|
|
|
17
26
|
let switchCase = "";
|
|
18
|
-
for (const [key,
|
|
19
|
-
switchCase += ` ${key}
|
|
20
|
-
switchCase += ` opts="${
|
|
27
|
+
for (const [key, { options, aliases }] of Object.entries(mappedCommands)) {
|
|
28
|
+
switchCase += ` ${key}${aliases.length ? "|" : ""}${aliases.join("|")})\n`;
|
|
29
|
+
switchCase += ` opts="${options.join(" ")}"\n`;
|
|
21
30
|
switchCase += " ;;\n";
|
|
22
31
|
}
|
|
23
32
|
|
|
@@ -27,14 +36,14 @@ export function generateAutocompleteScript(...params: [Cli, ...Subcommand[]]): s
|
|
|
27
36
|
switchCase += " ;;\n";
|
|
28
37
|
}
|
|
29
38
|
|
|
30
|
-
return `_${
|
|
39
|
+
return `_${cli.cliName}_autocomplete() {
|
|
31
40
|
local cur prev commands opts subcommand used_opts filtered_opts
|
|
32
41
|
|
|
33
42
|
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
34
43
|
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
35
44
|
subcommand="\${COMP_WORDS[1]}"
|
|
36
45
|
|
|
37
|
-
commands="${
|
|
46
|
+
commands="${Object.keys(mappedCommands).join(" ")}"
|
|
38
47
|
|
|
39
48
|
case "$subcommand" in
|
|
40
49
|
${switchCase}
|
|
@@ -65,6 +74,79 @@ ${switchCase}
|
|
|
65
74
|
fi
|
|
66
75
|
}
|
|
67
76
|
|
|
68
|
-
complete -F _${
|
|
77
|
+
complete -F _${cli.cliName}_autocomplete ${cli.cliName}
|
|
69
78
|
`;
|
|
70
79
|
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* - Generates a PowerShell autocomplete script for your CLI.
|
|
83
|
+
* - The script assumes that your CLI is available as a `.ps1` file in the environment variable. For example:
|
|
84
|
+
* `cliName.ps1`.
|
|
85
|
+
* - This should return a path to your script: `(Get-Command <cliName>.ps1).Source`
|
|
86
|
+
* - The generated script should be added to your `profile.ps1` file:
|
|
87
|
+
*
|
|
88
|
+
* - Run: `notepad $profile`
|
|
89
|
+
* - Add the following line: `. "<generated script path>"`
|
|
90
|
+
* - Save and reopen powershell to take effect
|
|
91
|
+
*/
|
|
92
|
+
export function generatePowerShellAutocompleteScript(...params: [Cli, ...Subcommand[]]): string {
|
|
93
|
+
const [cli, ...subcommands] = params;
|
|
94
|
+
|
|
95
|
+
type MappedCommands = Record<string, { options: string[]; aliases: string[] }>;
|
|
96
|
+
|
|
97
|
+
const mappedCommands = subcommands.reduce((acc: MappedCommands, subcommand) => {
|
|
98
|
+
acc[subcommand.name] = {
|
|
99
|
+
options: subcommand.options?.map(option => transformOptionToArg(option.name)) ?? [],
|
|
100
|
+
aliases: subcommand.aliases ?? [],
|
|
101
|
+
};
|
|
102
|
+
return acc;
|
|
103
|
+
}, {});
|
|
104
|
+
|
|
105
|
+
const subcommandsStr = Object.keys(mappedCommands)
|
|
106
|
+
.map(key => `'${key}'`)
|
|
107
|
+
.join(", ");
|
|
108
|
+
const cliOptionsStr = cli.options?.map(option => `'${transformOptionToArg(option.name)}'`).join(", ") || "";
|
|
109
|
+
|
|
110
|
+
let switchCase = "switch ($subcommand) {\n";
|
|
111
|
+
for (const [key, { options, aliases }] of Object.entries(mappedCommands)) {
|
|
112
|
+
const optionsStr = options.map(option => `'${option}'`).join(", ");
|
|
113
|
+
switchCase += ` '${key}' { @(${optionsStr}) }\n`;
|
|
114
|
+
aliases.forEach(a => (switchCase += ` '${a}' { @(${optionsStr}) }\n`));
|
|
115
|
+
}
|
|
116
|
+
switchCase += ` default { @(${cliOptionsStr}) }\n }`;
|
|
117
|
+
|
|
118
|
+
let functionInfo = "";
|
|
119
|
+
if (cli.description) {
|
|
120
|
+
functionInfo = `<#\n.DESCRIPTION\n${cli.description}\n${cli.example ? `\n.EXAMPLE\n${cli.example}` : ""}\n#>`;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return `${functionInfo}
|
|
124
|
+
function ${cli.cliName} {
|
|
125
|
+
param(
|
|
126
|
+
[Parameter(Position = 0, Mandatory = $false)]
|
|
127
|
+
[string]$subcommand,
|
|
128
|
+
[Parameter(Position = 1, ValueFromRemainingArguments = $true)]
|
|
129
|
+
[string[]]$arguments
|
|
130
|
+
)
|
|
131
|
+
$scriptPath = (Get-Command '${cli.cliName}.ps1').Source
|
|
132
|
+
if ($scriptPath) {
|
|
133
|
+
$arguments = $arguments | Where-Object { $_ -notin "--", "--%" }
|
|
134
|
+
& $scriptPath $subcommand @arguments
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
Write-Error "Could not find '${cli.cliName}.ps1' script"
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
Register-ArgumentCompleter -CommandName '${cli.cliName}' -ParameterName 'subcommand' -ScriptBlock {
|
|
141
|
+
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
|
|
142
|
+
$subcommands = @(${subcommandsStr}${subcommandsStr && cliOptionsStr ? ", " : ""}${cliOptionsStr})
|
|
143
|
+
$subcommands | Where-Object { $_ -like "$wordToComplete*" }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Register-ArgumentCompleter -CommandName '${cli.cliName}' -ParameterName 'arguments' -ScriptBlock {
|
|
147
|
+
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
|
|
148
|
+
$subcommand = $commandAst.CommandElements[1].Value
|
|
149
|
+
$arguments = ${switchCase}
|
|
150
|
+
$arguments | Where-Object { $_ -like "$wordToComplete*" }
|
|
151
|
+
}`;
|
|
152
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,44 +1,84 @@
|
|
|
1
|
-
import { help } from "./help.js";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
import { help } from "./help.js";
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
ActionFn,
|
|
5
|
+
Argument,
|
|
6
|
+
CheckDuplicatedOptions,
|
|
7
|
+
Cli,
|
|
8
|
+
Option,
|
|
9
|
+
Prettify,
|
|
10
|
+
Subcommand,
|
|
11
|
+
UnSafeParseResult,
|
|
12
|
+
} from "./types.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* - Insures that there is no extra keys in `obj` compared to `shape`
|
|
16
|
+
* - Also checks objects in arrays useful for the keys `options` and `arguments`
|
|
17
|
+
*/
|
|
18
|
+
type Exact<Obj extends object, Shape extends object> = {
|
|
19
|
+
[K in keyof Obj]: K extends keyof Shape
|
|
20
|
+
? Obj[K] extends infer ObjArr extends object[]
|
|
21
|
+
? Required<Shape>[K] extends infer ShapeArr extends object[]
|
|
22
|
+
? ExactObjArr<ObjArr, ShapeArr[number]>
|
|
23
|
+
: Obj[K]
|
|
24
|
+
: Obj[K]
|
|
25
|
+
: never;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** - Insures that there is no extra keys in `obj` compared to `shape` */
|
|
29
|
+
type ExactKeys<T extends object, U extends object> = { [K in keyof T]: K extends keyof U ? T[K] : never };
|
|
30
|
+
|
|
31
|
+
/** - Insures that there is no extra keys in the objects in an array compared to `shape` */
|
|
32
|
+
type ExactObjArr<ObjArr extends object[], ShapeObj extends object> = {
|
|
33
|
+
[K in keyof ObjArr]: ExactKeys<ObjArr[K], ShapeObj>;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* - Insures that there are no duplicated options
|
|
38
|
+
* - Disallow extra keys
|
|
39
|
+
*/
|
|
40
|
+
type CliInput<T extends Cli> = CheckDuplicatedOptions<T> extends T ? Exact<T, Cli> : CheckDuplicatedOptions<T>;
|
|
41
|
+
|
|
42
|
+
export function createCli<const T extends Cli>(input: CliInput<T>) {
|
|
43
|
+
const setAction = (action: (res: UnSafeParseResult<[T]>) => void) => {
|
|
44
|
+
input.action = action;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
return Object.assign(input, { setAction }) as Prettify<CliInput<T> & ActionFn<T>>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* - Insures that there are no duplicated options
|
|
52
|
+
* - Disallow extra keys
|
|
53
|
+
*/
|
|
54
|
+
type SubcommandInput<T extends Subcommand> =
|
|
55
|
+
CheckDuplicatedOptions<T> extends T ? Exact<T, Subcommand> : CheckDuplicatedOptions<T>;
|
|
56
|
+
|
|
57
|
+
export function createSubcommand<const T extends Subcommand>(input: SubcommandInput<T>) {
|
|
58
|
+
const setAction = (action: (res: UnSafeParseResult<[T]>) => void) => {
|
|
59
|
+
input.action = action;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
return Object.assign(input, { setAction }) as Prettify<SubcommandInput<T> & ActionFn<T>>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** - Insures that there are no duplicated options */
|
|
66
|
+
type CheckOptionsInput<T extends Option[]> =
|
|
67
|
+
CheckDuplicatedOptions<{ options: T }> extends infer Err extends string ? Err : T;
|
|
68
|
+
|
|
69
|
+
export function createOptions<const T extends [Option, ...Option[]]>(options: CheckOptionsInput<T>) {
|
|
70
|
+
return options;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function createArguments<const T extends [Argument, ...Argument[]]>(args: T) {
|
|
74
|
+
return args;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const { printCliHelp, printSubcommandHelp } = help;
|
|
78
|
+
export { printCliHelp, printSubcommandHelp };
|
|
79
|
+
|
|
80
|
+
export { parse, safeParse } from "./parser.js";
|
|
81
|
+
|
|
82
|
+
export { generateBashAutocompleteScript, generatePowerShellAutocompleteScript } from "./autocomplete.js";
|
|
83
|
+
|
|
84
|
+
export type * from "./types.js";
|
package/src/parser.ts
CHANGED
|
@@ -16,18 +16,16 @@ import type {
|
|
|
16
16
|
NoSubcommand,
|
|
17
17
|
Option,
|
|
18
18
|
PrintHelpOpt,
|
|
19
|
+
PrintMethods,
|
|
19
20
|
SafeParseResult,
|
|
20
21
|
Subcommand,
|
|
21
|
-
UnSafeParseResult
|
|
22
|
+
UnSafeParseResult
|
|
22
23
|
} from "./types.js";
|
|
23
24
|
|
|
24
|
-
export function parse<T extends Subcommand[]>(argsv: string[], ...params: T): UnSafeParseResult<T>;
|
|
25
25
|
export function parse<T extends Subcommand[], U extends Cli>(
|
|
26
26
|
argsv: string[],
|
|
27
27
|
...params: [U, ...T]
|
|
28
|
-
): UnSafeParseResult<[...T, NoSubcommand & U]
|
|
29
|
-
|
|
30
|
-
export function parse<T extends Subcommand[], U extends Cli>(argsv: string[], ...params: [U, ...T]) {
|
|
28
|
+
): UnSafeParseResult<[...T, NoSubcommand & U]> {
|
|
31
29
|
const cliOptions = ("cliName" in params[0] ? params[0] : {}) as U;
|
|
32
30
|
const subcommandArr = params as unknown as T;
|
|
33
31
|
const allSubcommands = new Set<string>(subcommandArr.flatMap(c => [c.name, ...(c.aliases || [])]));
|
|
@@ -280,18 +278,19 @@ export function parse<T extends Subcommand[], U extends Cli>(argsv: string[], ..
|
|
|
280
278
|
return results as UnSafeParseResult<[...T, NoSubcommand & U]>;
|
|
281
279
|
}
|
|
282
280
|
|
|
283
|
-
export function safeParse<T extends Subcommand[]>(argsv: string[], ...params: T): SafeParseResult<T>;
|
|
284
281
|
export function safeParse<T extends Subcommand[], U extends Cli>(
|
|
285
282
|
argsv: string[],
|
|
286
283
|
...params: [U, ...T]
|
|
287
|
-
): SafeParseResult<[...T, NoSubcommand & U]
|
|
288
|
-
|
|
289
|
-
export function safeParse<T extends Subcommand[], U extends Cli>(argsv: string[], ...params: [U, ...T]) {
|
|
284
|
+
): SafeParseResult<[...T, NoSubcommand & U]> {
|
|
290
285
|
const cliOptions = ("cliName" in params[0] ? params[0] : {}) as U;
|
|
291
286
|
const subcommandArr = params as Subcommand[];
|
|
292
287
|
|
|
293
|
-
|
|
294
|
-
|
|
288
|
+
type PrintTypes = PrintMethods<T[number]["name"]>;
|
|
289
|
+
type PrintCli = PrintTypes["printCliHelp"];
|
|
290
|
+
type PrintSubcommand = PrintTypes["printSubcommandHelp"];
|
|
291
|
+
|
|
292
|
+
const printCliHelp: PrintCli = opt => help.printCliHelp(params, opt);
|
|
293
|
+
const printSubcommandHelp: PrintSubcommand = (subcommandStr, opt) => {
|
|
295
294
|
const subcommand = subcommandArr.find(c => c.name === subcommandStr);
|
|
296
295
|
if (!subcommand) return console.error(`Cannot print help for subcommand "${subcommandStr}" as it does not exist`);
|
|
297
296
|
help.printSubcommandHelp(subcommand, opt, cliOptions.cliName);
|
|
@@ -299,9 +298,9 @@ export function safeParse<T extends Subcommand[], U extends Cli>(argsv: string[]
|
|
|
299
298
|
|
|
300
299
|
try {
|
|
301
300
|
const data = parse(argsv, ...params);
|
|
302
|
-
// @ts-expect-error
|
|
301
|
+
// @ts-expect-error The operand of a 'delete' operator must be optional.
|
|
303
302
|
delete data.printCliHelp;
|
|
304
|
-
// @ts-expect-
|
|
303
|
+
// @ts-expect-errorThe operand of a 'delete' operator must be optional.
|
|
305
304
|
delete data.printSubcommandHelp;
|
|
306
305
|
|
|
307
306
|
return {
|
|
@@ -309,8 +308,13 @@ export function safeParse<T extends Subcommand[], U extends Cli>(argsv: string[]
|
|
|
309
308
|
data: data as Omit<typeof data, "printCliHelp" | "printSubcommandHelp">,
|
|
310
309
|
printCliHelp,
|
|
311
310
|
printSubcommandHelp,
|
|
312
|
-
}
|
|
311
|
+
} as SafeParseResult<[...T, NoSubcommand & U]>;
|
|
313
312
|
} catch (e) {
|
|
314
|
-
return {
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
error: e as Error,
|
|
316
|
+
printCliHelp,
|
|
317
|
+
printSubcommandHelp,
|
|
318
|
+
} as SafeParseResult<[...T, NoSubcommand & U]>;
|
|
315
319
|
}
|
|
316
320
|
}
|