cli-forge 0.10.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.eslintrc.json +35 -0
  2. package/LICENSE.md +5 -0
  3. package/README.md +181 -5
  4. package/cli.js +9 -0
  5. package/dist/bin/cli.d.ts +23 -0
  6. package/{bin → dist/bin}/cli.js +2 -2
  7. package/dist/bin/cli.js.map +1 -0
  8. package/dist/bin/commands/generate-documentation.d.ts +14 -0
  9. package/{bin → dist/bin}/commands/generate-documentation.js +58 -11
  10. package/dist/bin/commands/generate-documentation.js.map +1 -0
  11. package/{bin → dist/bin}/commands/init.d.ts +11 -11
  12. package/{bin → dist/bin}/commands/init.js +11 -6
  13. package/dist/bin/commands/init.js.map +1 -0
  14. package/dist/bin/utils/fs.js.map +1 -0
  15. package/{src → dist}/index.d.ts +2 -1
  16. package/dist/index.js.map +1 -0
  17. package/dist/lib/cli-option-groups.js.map +1 -0
  18. package/dist/lib/composable-builder.d.ts +24 -0
  19. package/dist/lib/composable-builder.js +17 -0
  20. package/dist/lib/composable-builder.js.map +1 -0
  21. package/dist/lib/configuration-providers.js.map +1 -0
  22. package/{src → dist}/lib/documentation.d.ts +3 -3
  23. package/dist/lib/documentation.js.map +1 -0
  24. package/dist/lib/format-help.js.map +1 -0
  25. package/{src → dist}/lib/interactive-shell.d.ts +1 -1
  26. package/{src → dist}/lib/interactive-shell.js +6 -3
  27. package/dist/lib/interactive-shell.js.map +1 -0
  28. package/{src → dist}/lib/internal-cli.d.ts +38 -21
  29. package/{src → dist}/lib/internal-cli.js +48 -3
  30. package/dist/lib/internal-cli.js.map +1 -0
  31. package/dist/lib/public-api.d.ts +332 -0
  32. package/dist/lib/public-api.js.map +1 -0
  33. package/dist/lib/test-harness.js.map +1 -0
  34. package/dist/lib/utils.js.map +1 -0
  35. package/dist/middleware/zod.d.ts +4 -0
  36. package/dist/middleware/zod.js +18 -0
  37. package/dist/middleware/zod.js.map +1 -0
  38. package/dist/middleware.d.ts +1 -0
  39. package/dist/middleware.js +5 -0
  40. package/dist/middleware.js.map +1 -0
  41. package/package.json +29 -10
  42. package/project.json +7 -0
  43. package/src/bin/cli.ts +17 -0
  44. package/src/bin/commands/generate-documentation.ts +403 -0
  45. package/src/bin/commands/init.ts +320 -0
  46. package/src/bin/utils/fs.ts +11 -0
  47. package/src/index.ts +12 -0
  48. package/src/lib/cli-option-groups.ts +69 -0
  49. package/src/lib/composable-builder.ts +57 -0
  50. package/src/lib/configuration-providers.ts +36 -0
  51. package/src/lib/documentation.spec.ts +156 -0
  52. package/src/lib/documentation.ts +107 -0
  53. package/src/lib/format-help.ts +149 -0
  54. package/src/lib/interactive-shell.ts +115 -0
  55. package/src/lib/internal-cli.spec.ts +345 -0
  56. package/src/lib/internal-cli.ts +689 -0
  57. package/src/lib/public-api.ts +943 -0
  58. package/src/lib/test-harness.spec.ts +29 -0
  59. package/src/lib/test-harness.ts +69 -0
  60. package/src/lib/utils.spec.ts +25 -0
  61. package/src/lib/utils.ts +144 -0
  62. package/src/middleware/zod.ts +21 -0
  63. package/src/middleware.ts +1 -0
  64. package/tsconfig.json +23 -0
  65. package/tsconfig.lib.json +20 -0
  66. package/tsconfig.lib.json.tsbuildinfo +1 -0
  67. package/tsconfig.spec.json +26 -0
  68. package/vitest.config.mts +18 -0
  69. package/bin/cli.d.ts +0 -6
  70. package/bin/cli.js.map +0 -1
  71. package/bin/commands/generate-documentation.d.ts +0 -14
  72. package/bin/commands/generate-documentation.js.map +0 -1
  73. package/bin/commands/init.js.map +0 -1
  74. package/bin/utils/fs.js.map +0 -1
  75. package/src/index.js.map +0 -1
  76. package/src/lib/cli-option-groups.js.map +0 -1
  77. package/src/lib/composable-builder.d.ts +0 -3
  78. package/src/lib/composable-builder.js +0 -7
  79. package/src/lib/composable-builder.js.map +0 -1
  80. package/src/lib/configuration-providers.js.map +0 -1
  81. package/src/lib/documentation.js.map +0 -1
  82. package/src/lib/format-help.js.map +0 -1
  83. package/src/lib/interactive-shell.js.map +0 -1
  84. package/src/lib/internal-cli.js.map +0 -1
  85. package/src/lib/public-api.d.ts +0 -215
  86. package/src/lib/public-api.js.map +0 -1
  87. package/src/lib/test-harness.js.map +0 -1
  88. package/src/lib/utils.js.map +0 -1
  89. /package/{bin → dist/bin}/utils/fs.d.ts +0 -0
  90. /package/{bin → dist/bin}/utils/fs.js +0 -0
  91. /package/{src → dist}/index.js +0 -0
  92. /package/{src → dist}/lib/cli-option-groups.d.ts +0 -0
  93. /package/{src → dist}/lib/cli-option-groups.js +0 -0
  94. /package/{src → dist}/lib/configuration-providers.d.ts +0 -0
  95. /package/{src → dist}/lib/configuration-providers.js +0 -0
  96. /package/{src → dist}/lib/documentation.js +0 -0
  97. /package/{src → dist}/lib/format-help.d.ts +0 -0
  98. /package/{src → dist}/lib/format-help.js +0 -0
  99. /package/{src → dist}/lib/public-api.js +0 -0
  100. /package/{src → dist}/lib/test-harness.d.ts +0 -0
  101. /package/{src → dist}/lib/test-harness.js +0 -0
  102. /package/{src → dist}/lib/utils.d.ts +0 -0
  103. /package/{src → dist}/lib/utils.js +0 -0
@@ -8,6 +8,6 @@ export declare class InteractiveShell {
8
8
  private readonly rl;
9
9
  private listeners;
10
10
  constructor(cli: InternalCLI<any>, opts?: InteractiveShellOptions);
11
- registerLineListener(callback: (line: string) => Promise<void>): void;
11
+ registerLineListener(callback: (line: string) => Promise<boolean | void>): void;
12
12
  close(): void;
13
13
  }
@@ -38,7 +38,7 @@ class InteractiveShell {
38
38
  output: process.stdout,
39
39
  prompt: prompt,
40
40
  })
41
- .on('SIGINT', () => {
41
+ .once('SIGINT', () => {
42
42
  process.emit('SIGINT');
43
43
  });
44
44
  this.rl.prompt();
@@ -61,6 +61,7 @@ class InteractiveShell {
61
61
  }
62
62
  else if (nextArgs[0] === 'exit') {
63
63
  this.close();
64
+ return true;
64
65
  }
65
66
  else if (line.trim()) {
66
67
  try {
@@ -70,13 +71,15 @@ class InteractiveShell {
70
71
  // ignore
71
72
  }
72
73
  }
74
+ return false;
73
75
  });
74
76
  }
75
77
  registerLineListener(callback) {
76
78
  const wrapped = async (line) => {
77
79
  this.rl.pause();
78
- await callback(line);
79
- this.rl.prompt();
80
+ const shouldHalt = await callback(line);
81
+ if (!shouldHalt)
82
+ this.rl.prompt();
80
83
  };
81
84
  this.listeners.push(wrapped);
82
85
  this.rl.on('line', wrapped);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-shell.js","sourceRoot":"","sources":["../../src/lib/interactive-shell.ts"],"names":[],"mappings":"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"}
@@ -19,16 +19,21 @@ import { CLI, CLICommandOptions, Command, ErrorHandler } from './public-api';
19
19
  * }).forge();
20
20
  * ```
21
21
  */
22
- export declare class InternalCLI<TArgs extends ParsedArgs = ParsedArgs> implements CLI<TArgs> {
22
+ export declare class InternalCLI<TArgs extends ParsedArgs = ParsedArgs, THandlerReturn = void, TChildren = {}, TParent = undefined> implements CLI<TArgs, THandlerReturn, TChildren, TParent> {
23
23
  name: string;
24
24
  /**
25
25
  * For internal use only. Stick to properties available on {@link CLI}.
26
26
  */
27
- registeredCommands: Record<string, InternalCLI<any>>;
27
+ registeredCommands: Record<string, InternalCLI<any, any, any, any>>;
28
28
  /**
29
29
  * For internal use only. Stick to properties available on {@link CLI}.
30
30
  */
31
31
  commandChain: string[];
32
+ /**
33
+ * Reference to the parent CLI instance, if this command was registered as a subcommand.
34
+ * For internal use only. Use `getParent()` instead.
35
+ */
36
+ private _parent?;
32
37
  private requiresCommand;
33
38
  private _configuration?;
34
39
  private _versionOverride?;
@@ -68,19 +73,24 @@ export declare class InternalCLI<TArgs extends ParsedArgs = ParsedArgs> implemen
68
73
  * @param name What should the name of the cli command be?
69
74
  * @param configuration Configuration for the current CLI command.
70
75
  */
71
- constructor(name: string, rootCommandConfiguration?: CLICommandOptions<TArgs>);
72
- withRootCommandConfiguration<TRootCommandArgs extends TArgs>(configuration: CLICommandOptions<TArgs, TRootCommandArgs>): InternalCLI<TArgs>;
73
- command<TCommandArgs extends TArgs>(keyOrCommand: string | Command<TArgs, TCommandArgs>, options?: CLICommandOptions<TArgs, TCommandArgs>): CLI<TArgs>;
74
- commands(...a0: Command[] | Command[][]): CLI<TArgs>;
75
- option<TOption extends string, TOptionConfig extends OptionConfig>(name: TOption, config: TOptionConfig): any;
76
- positional<TOption extends string, TOptionConfig extends OptionConfig>(name: TOption, config: TOptionConfig): any;
77
- conflicts(...args: [string, string, ...string[]]): CLI<TArgs>;
78
- implies(option: string, ...impliedOptions: string[]): CLI<TArgs>;
79
- env(a0?: string | EnvOptionConfig | undefined): this;
80
- demandCommand(): this;
81
- usage(usageText: string): this;
82
- examples(...examples: string[]): this;
83
- version(version?: string): this;
76
+ constructor(name: string, rootCommandConfiguration?: CLICommandOptions<TArgs, any, THandlerReturn, TChildren>);
77
+ withRootCommandConfiguration<TRootCommandArgs extends TArgs>(configuration: CLICommandOptions<TArgs, TRootCommandArgs>): InternalCLI<TArgs, THandlerReturn, TChildren, TParent>;
78
+ command<TCommandArgs extends TArgs>(cmd: Command<TArgs, TCommandArgs>): CLI<TArgs, THandlerReturn, TChildren & (typeof cmd extends Command<TArgs, infer TCmdArgs, infer TCmdName> ? {
79
+ [key in TCmdName]: CLI<TCmdArgs, void, {}, CLI<TArgs, THandlerReturn, TChildren, TParent>>;
80
+ } : {}), TParent>;
81
+ command<TCommandArgs extends TArgs, TChildHandlerReturn = void, TCommandName extends string = string>(key: TCommandName, options: CLICommandOptions<TArgs, TCommandArgs, TChildHandlerReturn>): CLI<TArgs, THandlerReturn, TChildren & {
82
+ [key in TCommandName]: CLI<TCommandArgs, TChildHandlerReturn, {}, CLI<TArgs, THandlerReturn, TChildren, TParent>>;
83
+ }, TParent>;
84
+ commands(...a0: Command[] | Command[][]): any;
85
+ option<TOption extends string, const TOptionConfig extends OptionConfig<any, any, any, any>>(name: TOption, config: TOptionConfig): any;
86
+ positional<TOption extends string, const TOptionConfig extends OptionConfig<any, any, any, any>>(name: TOption, config: TOptionConfig): any;
87
+ conflicts(...args: [string, string, ...string[]]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
88
+ implies(option: string, ...impliedOptions: string[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
89
+ env(a0?: string | EnvOptionConfig | undefined): CLI<TArgs, THandlerReturn, TChildren, TParent>;
90
+ demandCommand(): CLI<TArgs, THandlerReturn, TChildren, TParent>;
91
+ usage(usageText: string): CLI<TArgs, THandlerReturn, TChildren, TParent>;
92
+ examples(...examples: string[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
93
+ version(version?: string): CLI<TArgs, THandlerReturn, TChildren, TParent>;
84
94
  /**
85
95
  * Gets help text for the current command as a string.
86
96
  * @returns Help text for the current command.
@@ -90,23 +100,30 @@ export declare class InternalCLI<TArgs extends ParsedArgs = ParsedArgs> implemen
90
100
  * Prints help text for the current command to the console.
91
101
  */
92
102
  printHelp(): void;
93
- middleware(callback: (args: TArgs) => void): CLI<TArgs>;
103
+ middleware<TArgs2>(callback: (args: TArgs) => TArgs2 | Promise<TArgs2>): CLI<TArgs2 extends void ? TArgs : TArgs & TArgs2, THandlerReturn, TChildren, TParent>;
94
104
  /**
95
105
  * Runs the current command.
96
106
  * @param cmd The command to run.
97
107
  * @param args The arguments to pass to the command.
98
108
  */
99
109
  runCommand<T extends ParsedArgs>(args: T, originalArgV: string[]): Promise<void>;
100
- enableInteractiveShell(): this;
110
+ getChildren(): TChildren;
111
+ getParent(): TParent;
112
+ getBuilder<T extends ParsedArgs = {
113
+ unmatched: string[];
114
+ '--'?: string[];
115
+ }>(_?: CLI<T, any, any> | undefined): ((parser: CLI<T, any, any>) => CLI<TArgs, THandlerReturn, TChildren>) | undefined;
116
+ getHandler(): ((args: Omit<TArgs, keyof ParsedArgs>) => THandlerReturn) | undefined;
117
+ enableInteractiveShell(): CLI<TArgs, THandlerReturn, TChildren, TParent>;
101
118
  private versionHandler;
102
119
  private withErrorHandlers;
103
- errorHandler(handler: ErrorHandler): this;
120
+ errorHandler(handler: ErrorHandler): CLI<TArgs, THandlerReturn, TChildren, TParent>;
104
121
  group(labelOrConfigObject: string | {
105
122
  label: string;
106
123
  keys: (keyof TArgs)[];
107
124
  sortOrder: number;
108
- }, keys?: (keyof TArgs)[]): CLI<TArgs>;
109
- config(provider: ConfigurationFiles.ConfigurationProvider<TArgs>): CLI<TArgs>;
125
+ }, keys?: (keyof TArgs)[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
126
+ config(provider: ConfigurationFiles.ConfigurationProvider<TArgs>): CLI<TArgs, THandlerReturn, TChildren, TParent>;
110
127
  /**
111
128
  * Parses argv and executes the CLI
112
129
  * @param args argv. Defaults to process.argv.slice(2)
@@ -119,5 +136,5 @@ export declare class InternalCLI<TArgs extends ParsedArgs = ParsedArgs> implemen
119
136
  version: boolean | undefined;
120
137
  }>;
121
138
  getSubcommands(): Readonly<Record<string, InternalCLI>>;
122
- clone(): InternalCLI<TArgs>;
139
+ clone(): InternalCLI<TArgs, THandlerReturn, TChildren, TParent>;
123
140
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InternalCLI = void 0;
4
+ /* eslint-disable @typescript-eslint/ban-types */
4
5
  const parser_1 = require("@cli-forge/parser");
5
6
  const utils_1 = require("./utils");
6
7
  const interactive_shell_1 = require("./interactive-shell");
@@ -35,6 +36,11 @@ class InternalCLI {
35
36
  * For internal use only. Stick to properties available on {@link CLI}.
36
37
  */
37
38
  commandChain = [];
39
+ /**
40
+ * Reference to the parent CLI instance, if this command was registered as a subcommand.
41
+ * For internal use only. Use `getParent()` instead.
42
+ */
43
+ _parent;
38
44
  requiresCommand = 'IMPLICIT';
39
45
  _configuration;
40
46
  _versionOverride;
@@ -132,6 +138,7 @@ class InternalCLI {
132
138
  });
133
139
  }
134
140
  const cmd = new InternalCLI(key).withRootCommandConfiguration(options);
141
+ cmd._parent = this;
135
142
  this.registeredCommands[key] = cmd;
136
143
  if (options.alias) {
137
144
  for (const alias of options.alias) {
@@ -141,6 +148,7 @@ class InternalCLI {
141
148
  }
142
149
  else if (keyOrCommand instanceof InternalCLI) {
143
150
  const cmd = keyOrCommand;
151
+ cmd._parent = this;
144
152
  this.registeredCommands[cmd.name] = cmd;
145
153
  if (cmd.configuration?.alias) {
146
154
  for (const alias of cmd.configuration.alias) {
@@ -158,6 +166,7 @@ class InternalCLI {
158
166
  const commands = a0.flat();
159
167
  for (const val of commands) {
160
168
  if (val instanceof InternalCLI) {
169
+ val._parent = this;
161
170
  this.registeredCommands[val.name] = val;
162
171
  // Include any options that were defined via cli(...).option() instead of via builder
163
172
  this.parser.augment(val.parser);
@@ -231,6 +240,9 @@ class InternalCLI {
231
240
  }
232
241
  middleware(callback) {
233
242
  this.registeredMiddleware.push(callback);
243
+ // If middleware returns void, TArgs doesn't change...
244
+ // If it returns something, we need to merge it into TArgs...
245
+ // that's not here though, its where we apply the middleware results.
234
246
  return this;
235
247
  }
236
248
  /**
@@ -254,9 +266,13 @@ class InternalCLI {
254
266
  }
255
267
  if (cmd.configuration?.handler) {
256
268
  for (const middleware of middlewares) {
257
- await middleware(args);
269
+ const middlewareResult = await middleware(args);
270
+ if (middlewareResult !== void 0 &&
271
+ typeof middlewareResult === 'object') {
272
+ args = middlewareResult;
273
+ }
258
274
  }
259
- await cmd.configuration.handler(args, {
275
+ return cmd.configuration.handler(args, {
260
276
  command: cmd,
261
277
  });
262
278
  }
@@ -292,6 +308,36 @@ class InternalCLI {
292
308
  this.printHelp();
293
309
  }
294
310
  }
311
+ getChildren() {
312
+ // Return a copy of registered commands, excluding aliases (same command registered under different keys)
313
+ const children = {};
314
+ const seen = new Set();
315
+ for (const [key, cmd] of Object.entries(this.registeredCommands)) {
316
+ if (!seen.has(cmd)) {
317
+ seen.add(cmd);
318
+ children[key] = cmd;
319
+ }
320
+ }
321
+ return children;
322
+ }
323
+ getParent() {
324
+ return this._parent;
325
+ }
326
+ getBuilder(
327
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- This is used to help TS infer T correctly
328
+ _) {
329
+ return this.configuration?.builder;
330
+ }
331
+ getHandler() {
332
+ const context = {
333
+ command: this,
334
+ };
335
+ const handler = this._configuration?.handler;
336
+ if (!handler) {
337
+ return undefined;
338
+ }
339
+ return (args) => handler(args, context);
340
+ }
295
341
  enableInteractiveShell() {
296
342
  if (this.requiresCommand === 'EXPLICIT') {
297
343
  throw new Error('Interactive shell is not supported for commands that require a command.');
@@ -419,7 +465,6 @@ class InternalCLI {
419
465
  clone.registeredCommands = {};
420
466
  for (const command in this.registeredCommands ?? {}) {
421
467
  clone.command(this.registeredCommands[command].clone());
422
- // this.registeredCommands[command].clone();
423
468
  }
424
469
  clone.commandChain = [...this.commandChain];
425
470
  clone.requiresCommand = this.requiresCommand;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal-cli.js","sourceRoot":"","sources":["../../src/lib/internal-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,332 @@
1
+ import { type ConfigurationFiles, OptionConfig, OptionConfigToType, ParsedArgs, EnvOptionConfig, ObjectOptionConfig, StringOptionConfig, NumberOptionConfig, BooleanOptionConfig, ArrayOptionConfig, ResolveProperties, WithOptional, MakeUndefinedPropertiesOptional, WithAdditionalProperties } from '@cli-forge/parser';
2
+ import { InternalCLI } from './internal-cli';
3
+ /**
4
+ * Extracts the command name from a Command type.
5
+ * Works with both CLI instances and command config objects.
6
+ */
7
+ export type ExtractCommandName<T> = T extends CLI<any, any, any> ? T extends InternalCLI<any, any, any> ? string : string : T extends {
8
+ name: infer N;
9
+ } ? N extends string ? N : string : string;
10
+ /**
11
+ * Extracts the args type from a Command.
12
+ * Works with both CLI instances and command config objects.
13
+ */
14
+ export type ExtractCommandArgs<T> = T extends CLI<infer A, any, any> ? A : T extends CLICommandOptions<any, infer A, any, any> ? A : ParsedArgs;
15
+ /**
16
+ * Extracts the handler return type from a Command.
17
+ */
18
+ export type ExtractCommandHandlerReturn<T> = T extends CLI<any, infer R, any> ? R : T extends CLICommandOptions<any, any, infer R, any> ? R : void;
19
+ /**
20
+ * Converts a Command to its child CLI entry for TChildren tracking.
21
+ * TParentCLI is the parent CLI type that will be set as the child's TParent.
22
+ */
23
+ export type CommandToChildEntry<T, TParentCLI = undefined> = {
24
+ [K in ExtractCommandName<T>]: CLI<ExtractCommandArgs<T>, ExtractCommandHandlerReturn<T>, {}, TParentCLI>;
25
+ };
26
+ /**
27
+ * The interface for a CLI application or subcommands.
28
+ *
29
+ * {@link cli} is provided as a small helper function to create a new CLI instance.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * import { cli } from 'cli-forge';
34
+ *
35
+ * cli('basic-cli').command('hello', {
36
+ * builder: (args) =>
37
+ * args.option('name', {
38
+ * type: 'string',
39
+ * }),
40
+ * handler: (args) => {
41
+ * console.log(`Hello, ${args.name}!`);
42
+ * }).forge();
43
+ * ```
44
+ */
45
+ export interface CLI<TArgs extends ParsedArgs = ParsedArgs, THandlerReturn = void, TChildren = {}, TParent = undefined> {
46
+ command<TCommandArgs extends TArgs>(cmd: Command<TArgs, TCommandArgs>): CLI<TArgs, THandlerReturn, TChildren & (typeof cmd extends Command<TArgs, infer TCommandArgs, infer TCmdName> ? {
47
+ [key in TCmdName]: CLI<TCommandArgs, void, {}, CLI<TArgs, THandlerReturn, TChildren, TParent>>;
48
+ } : {}), TParent>;
49
+ /**
50
+ * Registers a new command with the CLI.
51
+ * @param key What should the new command be called?
52
+ * @param options Settings for the new command. See {@link CLICommandOptions}.
53
+ * @returns Updated CLI instance with the new command registered.
54
+ */
55
+ command<TCommandArgs extends TArgs, TChildHandlerReturn, TKey extends string, TChildChildren = {}>(key: TKey, options: CLICommandOptions<TArgs, TCommandArgs, TChildHandlerReturn, any, CLI<TArgs, THandlerReturn, TChildren, TParent>, TChildChildren>): CLI<TArgs, THandlerReturn, TChildren & {
56
+ [key in TKey]: CLI<TCommandArgs, TChildHandlerReturn, TChildChildren, CLI<TArgs, THandlerReturn, TChildren, TParent>>;
57
+ }, TParent>;
58
+ /**
59
+ * Registers multiple subcommands with the CLI.
60
+ * @param commands Several commands to register. Can be the result of a call to {@link cli} or a configuration object.
61
+ * @returns Updated CLI instance with the commands registered and their types tracked in TChildren.
62
+ */
63
+ commands<C1 extends Command>(c1: C1): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
64
+ commands<C1 extends Command, C2 extends Command>(c1: C1, c2: C2): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
65
+ commands<C1 extends Command, C2 extends Command, C3 extends Command>(c1: C1, c2: C2, c3: C3): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
66
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
67
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command, C5 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4, c5: C5): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C5, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
68
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command, C5 extends Command, C6 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4, c5: C5, c6: C6): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C5, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C6, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
69
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command, C5 extends Command, C6 extends Command, C7 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4, c5: C5, c6: C6, c7: C7): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C5, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C6, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C7, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
70
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command, C5 extends Command, C6 extends Command, C7 extends Command, C8 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4, c5: C5, c6: C6, c7: C7, c8: C8): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C5, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C6, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C7, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C8, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
71
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command, C5 extends Command, C6 extends Command, C7 extends Command, C8 extends Command, C9 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4, c5: C5, c6: C6, c7: C7, c8: C8, c9: C9): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C5, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C6, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C7, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C8, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C9, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
72
+ commands<C1 extends Command, C2 extends Command, C3 extends Command, C4 extends Command, C5 extends Command, C6 extends Command, C7 extends Command, C8 extends Command, C9 extends Command, C10 extends Command>(c1: C1, c2: C2, c3: C3, c4: C4, c5: C5, c6: C6, c7: C7, c8: C8, c9: C9, c10: C10): CLI<TArgs, THandlerReturn, TChildren & CommandToChildEntry<C1, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C2, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C3, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C4, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C5, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C6, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C7, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C8, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C9, CLI<TArgs, THandlerReturn, TChildren, TParent>> & CommandToChildEntry<C10, CLI<TArgs, THandlerReturn, TChildren, TParent>>, TParent>;
73
+ commands(commands: Command[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
74
+ commands(...commands: Command[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
75
+ /**
76
+ * Register's a configuration provider for the CLI. See {@link ConfigurationProviders} for built-in providers.
77
+ *
78
+ * @param provider Provider to register.
79
+ */
80
+ config(provider: ConfigurationFiles.ConfigurationProvider<TArgs>): CLI<TArgs, THandlerReturn, TChildren, TParent>;
81
+ /**
82
+ * Enables the ability to run CLI commands that contain subcommands as an interactive shell.
83
+ * This presents as a small shell that only knows the current command and its subcommands.
84
+ * Any flags already consumed by the command will be passed to every subcommand invocation.
85
+ */
86
+ enableInteractiveShell(): CLI<TArgs, THandlerReturn, TChildren, TParent>;
87
+ /**
88
+ * Registers a custom global error handler for the CLI. This handler will be called when an error is thrown
89
+ * during the execution of the CLI and not otherwise handled. Error handlers should re-throw the error if they
90
+ * cannot handle it, s.t. the next error handler can attempt to handle it.
91
+ *
92
+ * @param handler Typically called with an Error object, but you should be prepared to handle any type of error.
93
+ * @param actions Actions that can be taken by the error handler. Prefer using these over process.exit for better support of interactive shells.
94
+ */
95
+ errorHandler(handler: ErrorHandler): CLI<TArgs, THandlerReturn, TChildren, TParent>;
96
+ /**
97
+ * Registers a new option for the CLI command. This option will be accessible
98
+ * within the command handler, as well as any subcommands.
99
+ *
100
+ * @param name The name of the option.
101
+ * @param config Configuration for the option. See {@link UnknownOptionConfig}.
102
+ * @returns Updated CLI instance with the new option registered.
103
+ */
104
+ option<TOption extends string, TCoerce, const TProps extends Record<string, {
105
+ type: string;
106
+ }>, TAdditionalProps extends false | 'string' | 'number' | 'boolean' = false>(name: TOption, config: ObjectOptionConfig<TCoerce, TProps, TAdditionalProps>): CLI<TArgs & MakeUndefinedPropertiesOptional<{
107
+ [key in TOption]: WithOptional<unknown extends TCoerce ? WithAdditionalProperties<ResolveProperties<TProps>, TAdditionalProps> : TCoerce, ObjectOptionConfig<TCoerce, TProps, TAdditionalProps>>;
108
+ }>, THandlerReturn, TChildren, TParent>;
109
+ option<TOption extends string, const TConfig extends StringOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
110
+ [key in TOption]: OptionConfigToType<TConfig>;
111
+ }>, THandlerReturn, TChildren, TParent>;
112
+ option<TOption extends string, const TConfig extends NumberOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
113
+ [key in TOption]: OptionConfigToType<TConfig>;
114
+ }>, THandlerReturn, TChildren, TParent>;
115
+ option<TOption extends string, const TConfig extends BooleanOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
116
+ [key in TOption]: OptionConfigToType<TConfig>;
117
+ }>, THandlerReturn, TChildren, TParent>;
118
+ option<TOption extends string, const TConfig extends ArrayOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
119
+ [key in TOption]: OptionConfigToType<TConfig>;
120
+ }>, THandlerReturn, TChildren, TParent>;
121
+ option<TOption extends string, const TOptionConfig extends OptionConfig<any, any, any, any>>(name: TOption, config: TOptionConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
122
+ [key in TOption]: OptionConfigToType<TOptionConfig>;
123
+ }>, THandlerReturn, TChildren, TParent>;
124
+ /**
125
+ * Registers a new positional argument for the CLI command. This argument will be accessible
126
+ * within the command handler, as well as any subcommands.
127
+ * @param name The name of the positional argument.
128
+ * @param config Configuration for the positional argument. See {@link UnknownOptionConfig}.
129
+ * @returns Updated CLI instance with the new positional argument registered.
130
+ */
131
+ positional<TOption extends string, TCoerce, const TProps extends Record<string, {
132
+ type: string;
133
+ }>, TAdditionalProps extends false | 'string' | 'number' | 'boolean' = false>(name: TOption, config: ObjectOptionConfig<TCoerce, TProps, TAdditionalProps>): CLI<TArgs & MakeUndefinedPropertiesOptional<{
134
+ [key in TOption]: WithOptional<unknown extends TCoerce ? WithAdditionalProperties<ResolveProperties<TProps>, TAdditionalProps> : TCoerce, ObjectOptionConfig<TCoerce, TProps, TAdditionalProps>>;
135
+ }>, THandlerReturn, TChildren, TParent>;
136
+ positional<TOption extends string, const TConfig extends StringOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
137
+ [key in TOption]: OptionConfigToType<TConfig>;
138
+ }>, THandlerReturn, TChildren, TParent>;
139
+ positional<TOption extends string, const TConfig extends NumberOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
140
+ [key in TOption]: OptionConfigToType<TConfig>;
141
+ }>, THandlerReturn, TChildren, TParent>;
142
+ positional<TOption extends string, const TConfig extends BooleanOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
143
+ [key in TOption]: OptionConfigToType<TConfig>;
144
+ }>, THandlerReturn, TChildren, TParent>;
145
+ positional<TOption extends string, const TConfig extends ArrayOptionConfig<any, any>>(name: TOption, config: TConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
146
+ [key in TOption]: OptionConfigToType<TConfig>;
147
+ }>, THandlerReturn, TChildren, TParent>;
148
+ positional<TOption extends string, const TOptionConfig extends OptionConfig<any, any, any, any>>(name: TOption, config: TOptionConfig): CLI<TArgs & MakeUndefinedPropertiesOptional<{
149
+ [key in TOption]: OptionConfigToType<TOptionConfig>;
150
+ }>, THandlerReturn, TChildren, TParent>;
151
+ /**
152
+ * Adds support for reading CLI options from environment variables.
153
+ * @param prefix The prefix to use when looking up environment variables. Defaults to the command name.
154
+ */
155
+ env(prefix?: string): CLI<TArgs, THandlerReturn, TChildren, TParent>;
156
+ env(options: EnvOptionConfig): CLI<TArgs, THandlerReturn, TChildren, TParent>;
157
+ /**
158
+ * Sets a group of options as mutually exclusive. If more than one option is provided, there will be a validation error.
159
+ * @param options The options that should be mutually exclusive.
160
+ */
161
+ conflicts(...options: [string, string, ...string[]]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
162
+ /**
163
+ * Sets a group of options as mutually inclusive. If one option is provided, all other options must also be provided.
164
+ * @param option The option that implies the other options.
165
+ * @param impliedOptions The options which become required when the option is provided.
166
+ */
167
+ implies(option: string, ...impliedOptions: string[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
168
+ /**
169
+ * Requires a command to be provided when executing the CLI. Useful if your parent command
170
+ * cannot be executed on its own.
171
+ * @returns Updated CLI instance.
172
+ */
173
+ demandCommand(): CLI<TArgs, THandlerReturn, TChildren, TParent>;
174
+ /**
175
+ * Sets the usage text for the CLI. This text will be displayed in place of the default usage text
176
+ * @param usageText Text displayed in place of the default usage text for `--help` and in generated docs.
177
+ */
178
+ usage(usageText: string): CLI<TArgs, THandlerReturn, TChildren, TParent>;
179
+ /**
180
+ * Sets the description for the CLI. This text will be displayed in the help text and generated docs.
181
+ * @param examples Examples to display in the help text and generated docs.
182
+ */
183
+ examples(...examples: string[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
184
+ /**
185
+ * Allows overriding the version displayed when passing `--version`. Defaults to crawling
186
+ * the file system to get the package.json of the currently executing command.
187
+ * @param override
188
+ */
189
+ version(override?: string): CLI<TArgs, THandlerReturn, TChildren, TParent>;
190
+ /**
191
+ * Prints help text to stdout.
192
+ */
193
+ printHelp(): void;
194
+ group({ label, keys, sortOrder, }: {
195
+ label: string;
196
+ keys: (keyof TArgs)[];
197
+ sortOrder: number;
198
+ }): CLI<TArgs, THandlerReturn, TChildren, TParent>;
199
+ group(label: string, keys: (keyof TArgs)[]): CLI<TArgs, THandlerReturn, TChildren, TParent>;
200
+ middleware<TArgs2>(callback: MiddlewareFunction<TArgs, TArgs2>): CLI<TArgs2 extends void ? TArgs : TArgs & TArgs2, THandlerReturn, TChildren, TParent>;
201
+ /**
202
+ * Parses argv and executes the CLI
203
+ * @param args argv. Defaults to process.argv.slice(2)
204
+ * @returns Promise that resolves when the handler completes.
205
+ */
206
+ forge(args?: string[]): Promise<TArgs>;
207
+ /**
208
+ * Returns the typed children commands registered with this CLI.
209
+ * The return type is determined by the commands registered via `command()` or `commands()`.
210
+ *
211
+ * @example
212
+ * ```ts
213
+ * const app = cli('app')
214
+ * .command('init', { ... })
215
+ * .command('build', { ... });
216
+ *
217
+ * const children = app.getChildren();
218
+ * // children.init and children.build are typed CLI instances
219
+ * const initHandler = children.init.getHandler();
220
+ * ```
221
+ */
222
+ getChildren(): TChildren;
223
+ /**
224
+ * Returns the parent CLI instance, if this command was registered as a subcommand.
225
+ * Returns undefined for root-level CLI instances.
226
+ *
227
+ * @example
228
+ * ```ts
229
+ * const build = cli('build', {
230
+ * handler: (args, ctx) => {
231
+ * const parent = ctx.command.getParent();
232
+ * const siblings = parent?.getChildren();
233
+ * // Access sibling commands
234
+ * }
235
+ * });
236
+ * ```
237
+ */
238
+ getParent(): TParent;
239
+ getBuilder<T extends ParsedArgs = ParsedArgs>(initialCli?: CLI<T, any, any>): ((parser: CLI<T, any, any>) => CLI<TArgs, THandlerReturn, TChildren>) | undefined;
240
+ getHandler(): ((args: Omit<TArgs, keyof ParsedArgs>) => THandlerReturn) | undefined;
241
+ }
242
+ export interface CLIHandlerContext<TChildren = {}, TParent = any> {
243
+ command: CLI<any, any, TChildren, TParent>;
244
+ }
245
+ /**
246
+ * Extracts the TChildren type parameter from a CLI type.
247
+ */
248
+ export type ExtractCLIChildren<T> = T extends CLI<any, any, infer C, any> ? C : {};
249
+ /**
250
+ * Represents the configuration needed to create a CLI command.
251
+ */
252
+ export interface CLICommandOptions<
253
+ /**
254
+ * The type of the arguments that are already registered before `builder` is invoked.
255
+ */
256
+ TInitial extends ParsedArgs,
257
+ /**
258
+ * The type of the arguments that are registered after `builder` is invoked, and the type that is passed to the handler.
259
+ */
260
+ TArgs extends TInitial = TInitial, THandlerReturn = void,
261
+ /**
262
+ * The children commands that exist before the builder runs.
263
+ */
264
+ TInitialChildren = {}, TParent = any,
265
+ /**
266
+ * The children commands after the builder runs (includes TInitialChildren plus any added by builder).
267
+ */
268
+ TChildren = {}> {
269
+ /**
270
+ * If set the command will be registered under the provided name and any aliases.
271
+ *
272
+ * This can be useful if a command should be executed under more than one name, e.g. `npx my-cli` and `npx my-cli hello`.
273
+ */
274
+ alias?: string[];
275
+ /**
276
+ * The command description. This will be displayed in the help text and generated docs.
277
+ */
278
+ description?: string;
279
+ /**
280
+ * The command builder. This function is called before the command is executed, and is used to register options and positional parameters.
281
+ * @param parser The parser instance to register options and positionals with.
282
+ */
283
+ builder?: (parser: CLI<TInitial, any, TInitialChildren, TParent>) => CLI<TArgs, any, TChildren, any>;
284
+ /**
285
+ * The command handler. This function is called when the command is executed.
286
+ * @param args The parsed arguments.
287
+ * @param context Context for the handler. Contains the command instance.
288
+ */
289
+ handler?: (args: NoInfer<TArgs>, context: CLIHandlerContext<NoInfer<TChildren>, TParent>) => THandlerReturn;
290
+ /**
291
+ * The usage text for the command. This text will be displayed in place of the default usage text in the help text and generated docs.
292
+ */
293
+ usage?: string;
294
+ /**
295
+ * Examples to display in the help text and generated docs.
296
+ */
297
+ examples?: string[];
298
+ /**
299
+ * Hides the command from the help text and generated docs. Useful primarily for experimental or internal commands.
300
+ */
301
+ hidden?: boolean;
302
+ /**
303
+ * The epilogue text for the command. This text will be displayed at the end of the help text and generated docs.
304
+ */
305
+ epilogue?: string;
306
+ }
307
+ export type Command<TInitial extends ParsedArgs = any, TArgs extends TInitial = TInitial, TCommandName extends string = string> = ({
308
+ name: TCommandName;
309
+ } & CLICommandOptions<TInitial, TArgs>) | CLI<TArgs>;
310
+ /**
311
+ * Error Handler for CLI applications. Error handlers should re-throw the error if they cannot handle it.
312
+ *
313
+ * @param e The error that was thrown.
314
+ * @param actions Actions that can be taken by the error handler. Prefer using these over process.exit for better support of interactive shells.
315
+ */
316
+ export type ErrorHandler = (e: unknown, actions: {
317
+ /**
318
+ * Exits the process immediately.
319
+ * @param code
320
+ */
321
+ exit: (code?: number) => void;
322
+ }) => void;
323
+ export type UnknownCLI = CLI<ParsedArgs, any, any, any>;
324
+ export type MiddlewareFunction<TArgs extends ParsedArgs, TArgs2> = (args: TArgs) => TArgs2 | Promise<TArgs2>;
325
+ /**
326
+ * Constructs a CLI instance. See {@link CLI} for more information.
327
+ * @param name Name for the top level CLI
328
+ * @param rootCommandConfiguration Configuration used when running the bare CLI. e.g. npx my-cli, rather than npx my-cli [cmd]
329
+ * @returns A {@link CLI} instance.
330
+ */
331
+ export declare function cli<TArgs extends ParsedArgs, THandlerReturn = void, TChildren = {}, TName extends string = string>(name: TName, rootCommandConfiguration?: CLICommandOptions<ParsedArgs, TArgs, THandlerReturn, {}, any, TChildren>): CLI<TArgs, THandlerReturn, TChildren>;
332
+ export default cli;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../../src/lib/public-api.ts"],"names":[],"mappings":";;AAs5BA,kBAsBC;AA15BD,iDAA6C;AA83B7C;;;;;GAKG;AACH,SAAgB,GAAG,CAOjB,IAAW,EACX,wBAOC;IAED,OAAO,IAAI,0BAAW,CAAC,IAAI,EAAE,wBAA+B,CAI3D,CAAC;AACJ,CAAC;AAED,kBAAe,GAAG,CAAC"}