bob-core 3.0.0-alpha.7 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cjs/package-supL7Tgp.cjs +1 -0
  2. package/dist/cjs/src/Command.d.ts +7 -5
  3. package/dist/cjs/src/CommandParser.d.ts +15 -11
  4. package/dist/cjs/src/CommandRegistry.d.ts +1 -0
  5. package/dist/cjs/src/CommandSignatureParser.d.ts +4 -4
  6. package/dist/cjs/src/args/index.d.ts +42 -0
  7. package/dist/cjs/src/errors/BadCommandFlag.d.ts +3 -3
  8. package/dist/cjs/src/flags/boolean.d.ts +4 -2
  9. package/dist/cjs/src/flags/custom.d.ts +7 -2
  10. package/dist/cjs/src/flags/directory.d.ts +9 -2
  11. package/dist/cjs/src/flags/file.d.ts +9 -2
  12. package/dist/cjs/src/flags/helpers.d.ts +1 -24
  13. package/dist/cjs/src/flags/index.d.ts +44 -26
  14. package/dist/cjs/src/flags/number.d.ts +12 -2
  15. package/dist/cjs/src/flags/option.d.ts +6 -0
  16. package/dist/cjs/src/flags/string.d.ts +3 -2
  17. package/dist/cjs/src/flags/url.d.ts +3 -2
  18. package/dist/cjs/src/index.d.ts +1 -0
  19. package/dist/cjs/src/index.js +5 -4
  20. package/dist/cjs/src/lib/types.d.ts +30 -61
  21. package/dist/cjs/src/options/HelpOption.d.ts +7 -10
  22. package/dist/cjs/src/shared/ask-helpers.d.ts +7 -0
  23. package/dist/cjs/src/shared/parsers.d.ts +14 -0
  24. package/dist/esm/{package-4BaVOXvG.js → package-BNru0kNU.js} +1 -1
  25. package/dist/esm/src/Command.d.ts +7 -5
  26. package/dist/esm/src/CommandParser.d.ts +15 -11
  27. package/dist/esm/src/CommandRegistry.d.ts +1 -0
  28. package/dist/esm/src/CommandSignatureParser.d.ts +4 -4
  29. package/dist/esm/src/args/index.d.ts +42 -0
  30. package/dist/esm/src/errors/BadCommandFlag.d.ts +3 -3
  31. package/dist/esm/src/flags/boolean.d.ts +4 -2
  32. package/dist/esm/src/flags/custom.d.ts +7 -2
  33. package/dist/esm/src/flags/directory.d.ts +9 -2
  34. package/dist/esm/src/flags/file.d.ts +9 -2
  35. package/dist/esm/src/flags/helpers.d.ts +1 -24
  36. package/dist/esm/src/flags/index.d.ts +44 -26
  37. package/dist/esm/src/flags/number.d.ts +12 -2
  38. package/dist/esm/src/flags/option.d.ts +6 -0
  39. package/dist/esm/src/flags/string.d.ts +3 -2
  40. package/dist/esm/src/flags/url.d.ts +3 -2
  41. package/dist/esm/src/index.d.ts +1 -0
  42. package/dist/esm/src/index.js +342 -330
  43. package/dist/esm/src/lib/types.d.ts +30 -61
  44. package/dist/esm/src/options/HelpOption.d.ts +7 -10
  45. package/dist/esm/src/shared/ask-helpers.d.ts +7 -0
  46. package/dist/esm/src/shared/parsers.d.ts +14 -0
  47. package/package.json +1 -1
  48. package/dist/cjs/package-CX7WaEsn.cjs +0 -1
  49. package/dist/cjs/src/flags/enum.d.ts +0 -4
  50. package/dist/esm/src/flags/enum.d.ts +0 -4
@@ -0,0 +1 @@
1
+ var e={name:`bob-core`,version:`3.0.0-beta.1`,description:`BOB Core`,type:`module`,main:`./dist/cjs/src/index.js`,module:`./dist/esm/src/index.js`,types:`./dist/esm/src/index.d.ts`,files:[`dist`],exports:{".":{import:{types:`./dist/esm/src/index.d.ts`,default:`./dist/esm/src/index.js`},require:{types:`./dist/cjs/src/index.d.ts`,default:`./dist/cjs/src/index.js`}}},scripts:{start:`node -r @swc-node/register debug/main.ts`,build:`rm -rf ./dist && vite build`,typecheck:`tsc --noEmit`,prepack:`npm run build`,test:`vitest run`,lint:`eslint .`,"lint:fix":`eslint . --fix`},author:`Léo Hubert`,license:`ISC`,devDependencies:{"@eslint/js":`^9.39.4`,"@faker-js/faker":`^10.3.0`,"@swc-node/register":`^1.11.1`,"@trivago/prettier-plugin-sort-imports":`^5.2.2`,"@types/minimist":`^1.2.5`,"@types/node":`^20.14.5`,"@types/string-similarity":`^4.0.2`,"@vitest/coverage-v8":`^4.1.0`,eslint:`^9.39.4`,"eslint-config-prettier":`^10.1.8`,"eslint-plugin-prettier":`^5.5.5`,prettier:`^3.6.2`,tsx:`^4.21.0`,typescript:`^5.9.3`,"typescript-eslint":`^8.57.0`,vite:`^8.0.0`,"vite-plugin-dts":`^4.5.4`,vitest:`^4.1.0`},dependencies:{"@inquirer/prompts":`^8.3.0`,chalk:`^4.1.2`,"inquirer-file-selector":`^1.0.1`,minimist:`^1.2.8`}};exports.default=e;
@@ -1,6 +1,6 @@
1
1
  import { CommandParser } from './CommandParser.js';
2
2
  import { Logger } from './Logger.js';
3
- import { ArgumentsSchema, ContextDefinition, FlagsSchema, Parsed } from './lib/types.js';
3
+ import { ArgsSchema, ContextDefinition, FlagsSchema, Parsed } from './lib/types.js';
4
4
  import { UX } from './ux/index.js';
5
5
  export type CommandRunExample = {
6
6
  description: string;
@@ -20,10 +20,11 @@ export declare abstract class Command<C extends ContextDefinition = ContextDefin
20
20
  static command: string;
21
21
  static description: string;
22
22
  static group?: string;
23
- static args: ArgumentsSchema;
23
+ static args: ArgsSchema;
24
24
  static flags: FlagsSchema;
25
25
  static examples: CommandRunExample[];
26
26
  static hidden: boolean;
27
+ static aliases: string[];
27
28
  static disableDefaultOptions: boolean;
28
29
  static disablePrompting: boolean;
29
30
  static allowUnknownFlags: boolean;
@@ -31,16 +32,17 @@ export declare abstract class Command<C extends ContextDefinition = ContextDefin
31
32
  protected ctx: C;
32
33
  protected logger: Logger;
33
34
  protected ux: UX;
34
- protected parser: CommandParser<FlagsSchema, FlagsSchema>;
35
+ protected parser: CommandParser<FlagsSchema, ArgsSchema>;
35
36
  protected preHandle?(): Promise<void | number>;
36
37
  protected abstract handle(ctx: C, parsed: Parsed<any>): Promise<number | void> | number | void;
37
38
  static baseFlags: FlagsSchema;
38
39
  protected newCommandParser(opts: {
39
40
  flags: FlagsSchema;
40
- args: ArgumentsSchema;
41
+ args: ArgsSchema;
41
42
  ctx: ContextDefinition;
42
43
  ux: UX;
43
- }): CommandParser<FlagsSchema, FlagsSchema>;
44
+ cmd: typeof Command;
45
+ }): CommandParser<FlagsSchema, ArgsSchema>;
44
46
  protected newUX(): UX;
45
47
  run(runOpts: CommandRunOption<C>): Promise<number | void>;
46
48
  }
@@ -1,20 +1,22 @@
1
- import { ArgumentsSchema, ContextDefinition, FlagDefinition, FlagReturnType, FlagsObject, FlagsSchema } from './lib/types.js';
1
+ import { Command } from './Command.js';
2
+ import { ArgsSchema, ContextDefinition, FlagDefinition, FlagReturnType, FlagsObject, FlagsSchema } from './lib/types.js';
2
3
  import { UX } from './ux/index.js';
3
4
  /**
4
5
  * Parses command-line arguments into typed flags and arguments
5
6
  * Handles validation, type conversion, and default values
6
7
  */
7
- export declare class CommandParser<Flags extends FlagsSchema, Arguments extends ArgumentsSchema> {
8
+ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends ArgsSchema> {
8
9
  protected opts: {
9
10
  flags: Flags;
10
11
  args: Arguments;
11
12
  ctx?: ContextDefinition;
12
13
  ux: UX;
14
+ cmd?: typeof Command;
13
15
  };
14
16
  protected flags: FlagsSchema;
15
17
  protected parsedFlags: FlagsObject<Flags> | null;
16
- protected args: ArgumentsSchema;
17
- protected parsedArguments: FlagsObject<Arguments> | null;
18
+ protected args: ArgsSchema;
19
+ protected parsedArgs: FlagsObject<Arguments> | null;
18
20
  protected ux: UX;
19
21
  protected shouldPromptForMissingFlags: boolean;
20
22
  protected shouldValidateUnknownFlags: boolean;
@@ -24,6 +26,7 @@ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends
24
26
  args: Arguments;
25
27
  ctx?: ContextDefinition;
26
28
  ux: UX;
29
+ cmd?: typeof Command;
27
30
  });
28
31
  /**
29
32
  * Parses raw command-line arguments into structured flags and arguments
@@ -84,10 +87,15 @@ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends
84
87
  */
85
88
  private resolveFlagValue;
86
89
  /**
87
- * Parses a raw value using the flag's parse function
90
+ * Parses a raw value using the definition's parse function
88
91
  */
89
92
  private parseValue;
93
+ private buildOpts;
90
94
  private safeParse;
95
+ /**
96
+ * Validates a schema (flags or args) and prompts for missing required values
97
+ */
98
+ private validateSchema;
91
99
  /**
92
100
  * Disables prompting for missing argument values
93
101
  * Useful for non-interactive environments
@@ -96,11 +104,7 @@ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends
96
104
  allowUnknownFlags(): this;
97
105
  strictMode(): this;
98
106
  /**
99
- * Prompts the user to provide a missing flag/argument value via its `ask` method
100
- * Used by validate() when shouldPromptForMissingFlags is enabled
101
- * @param name - The name of the missing flag/argument
102
- * @param definition - The flag's definition (must have an `ask` method)
103
- * @returns The user-provided value, or null if `ask` is not defined
107
+ * Prompts the user to provide a missing value via its `ask` method
104
108
  */
105
- protected promptForArgument(name: string, definition: FlagDefinition): Promise<string | number | string[] | boolean | null>;
109
+ protected promptFor(name: string, definition: FlagDefinition): Promise<string | number | string[] | boolean | null>;
106
110
  }
@@ -12,6 +12,7 @@ export type CommandRegistryOptions = {
12
12
  };
13
13
  export declare class CommandRegistry {
14
14
  private readonly commands;
15
+ private readonly aliases;
15
16
  protected readonly ux: UX;
16
17
  protected readonly logger: Logger;
17
18
  private readonly stringSimilarity;
@@ -1,8 +1,8 @@
1
- import { ArgumentsSchema, FlagsSchema } from './lib/types.js';
1
+ import { FlagsSchema } from './lib/types.js';
2
2
  /**
3
3
  * @deprecated This class is deprecated and will be removed in future versions. Use CommandParser with explicit schema definitions instead.
4
4
  * Parses command signature strings like "command {arg} {--option}" into
5
- * FlagsSchema and ArgumentsSchema using Flags/Args factories.
5
+ * FlagsSchema and ArgsSchema using Flags/Args factories.
6
6
  */
7
7
  export declare class CommandSignatureParser {
8
8
  /**
@@ -15,10 +15,10 @@ export declare class CommandSignatureParser {
15
15
  static parse(signature: string, helperDefinitions?: Record<string, string>): {
16
16
  command: string;
17
17
  flags: FlagsSchema;
18
- args: ArgumentsSchema;
18
+ args: FlagsSchema;
19
19
  };
20
20
  /**
21
- * Parses a single parameter signature into a FlagDefinition.
21
+ * Parses a single parameter signature into a FlagDefinition or ArgDefinition.
22
22
  *
23
23
  * Signature syntax:
24
24
  * - {arg} -> required string argument
@@ -0,0 +1,42 @@
1
+ import { custom } from '../flags/custom.js';
2
+ import { optionFlag } from '../flags/option.js';
3
+ export declare const Args: {
4
+ string: <const U extends import('../index.js').FlagProps<string> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<string> & U & {
5
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
6
+ };
7
+ number: <const U extends import('../index.js').FlagProps<number> & Partial<{
8
+ min?: number;
9
+ max?: number;
10
+ }> = import('../index.js').FlagProps<number> & Partial<{
11
+ min?: number;
12
+ max?: number;
13
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "min" | "max">, never>) | undefined) => import('../index.js').FlagProps<number> & {
14
+ min?: number;
15
+ max?: number;
16
+ } & U & {
17
+ parse(input: any, opts: import('../index.js').ParameterOpts): number;
18
+ };
19
+ option: typeof optionFlag;
20
+ file: <const U extends import('../index.js').FlagProps<string> & Partial<{
21
+ exists?: boolean;
22
+ }> = import('../index.js').FlagProps<string> & Partial<{
23
+ exists?: boolean;
24
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "exists">, never>) | undefined) => import('../index.js').FlagProps<string> & {
25
+ exists?: boolean;
26
+ } & U & {
27
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
28
+ };
29
+ directory: <const U extends import('../index.js').FlagProps<string> & Partial<{
30
+ exists?: boolean;
31
+ }> = import('../index.js').FlagProps<string> & Partial<{
32
+ exists?: boolean;
33
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "exists">, never>) | undefined) => import('../index.js').FlagProps<string> & {
34
+ exists?: boolean;
35
+ } & U & {
36
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
37
+ };
38
+ url: <const U extends import('../index.js').FlagProps<URL> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<URL> & U & {
39
+ parse(input: any, opts: import('../index.js').ParameterOpts): URL;
40
+ };
41
+ custom: typeof custom;
42
+ };
@@ -1,14 +1,14 @@
1
1
  import { Logger } from '../Logger.js';
2
2
  import { BobError } from './BobError.js';
3
3
  import { FlagDefinition } from '../lib/types.js';
4
- export type FlagProps = {
4
+ export type BadFlagParams = {
5
5
  flag: string;
6
6
  value?: any;
7
7
  reason?: string;
8
8
  };
9
9
  export declare class BadCommandFlag extends BobError {
10
- readonly param: FlagProps;
10
+ readonly param: BadFlagParams;
11
11
  readonly flagDefinition?: FlagDefinition | undefined;
12
- constructor(param: FlagProps, flagDefinition?: FlagDefinition | undefined);
12
+ constructor(param: BadFlagParams, flagDefinition?: FlagDefinition | undefined);
13
13
  pretty(logger: Logger): void;
14
14
  }
@@ -1,2 +1,4 @@
1
- import { BooleanFlagDef, FlagInput } from '../lib/types.js';
2
- export declare function booleanFlag<const T extends FlagInput<BooleanFlagDef>>(opts?: T): BooleanFlagDef & T;
1
+ import { ParameterOpts } from '../lib/types.js';
2
+ export declare const booleanFlag: <const U extends import('../lib/types.js').FlagProps<boolean> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../lib/types.js').FlagProps<boolean> & U & {
3
+ parse(input: any, opts: ParameterOpts): boolean;
4
+ };
@@ -1,2 +1,7 @@
1
- import { CustomFlagDef, FlagInput } from '../lib/types.js';
2
- export declare function customFlag<T>(defaults?: FlagInput<CustomFlagDef<T>>): <const U extends FlagInput<CustomFlagDef<T>>>(overrides?: U) => CustomFlagDef<T> & U;
1
+ import { CustomOptions, FlagProps, ParameterOpts } from '../lib/types.js';
2
+ export declare function custom<T, const D extends FlagProps<any> = FlagProps<T>>(defaults?: D): <const U extends FlagProps<T> = {}>(overrides?: U & Record<Exclude<keyof U, keyof FlagProps<T> | keyof D>, never>) => D & U & {
3
+ parse(input: any, opts: ParameterOpts): T;
4
+ };
5
+ export declare function custom<T, P extends CustomOptions = CustomOptions>(defaults?: FlagProps<T> & Partial<P>): <const U extends FlagProps<T> & Partial<P> = FlagProps<T> & Partial<P>>(overrides?: U & Record<Exclude<keyof U, keyof FlagProps<T> | keyof P>, never>) => FlagProps<T> & P & U & {
6
+ parse(input: any, opts: ParameterOpts): T;
7
+ };
@@ -1,2 +1,9 @@
1
- import { DirectoryFlagDef, FlagInput } from '../lib/types.js';
2
- export declare function directoryFlag<const T extends FlagInput<DirectoryFlagDef>>(opts?: T): DirectoryFlagDef & T;
1
+ export declare const directoryFlag: <const U extends import('../index.js').FlagProps<string> & Partial<{
2
+ exists?: boolean;
3
+ }> = import('../index.js').FlagProps<string> & Partial<{
4
+ exists?: boolean;
5
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "exists">, never>) | undefined) => import('../index.js').FlagProps<string> & {
6
+ exists?: boolean;
7
+ } & U & {
8
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
9
+ };
@@ -1,2 +1,9 @@
1
- import { FileFlagDef, FlagInput } from '../lib/types.js';
2
- export declare function fileFlag<const T extends FlagInput<FileFlagDef>>(opts?: T): FileFlagDef & T;
1
+ export declare const fileFlag: <const U extends import('../index.js').FlagProps<string> & Partial<{
2
+ exists?: boolean;
3
+ }> = import('../index.js').FlagProps<string> & Partial<{
4
+ exists?: boolean;
5
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "exists">, never>) | undefined) => import('../index.js').FlagProps<string> & {
6
+ exists?: boolean;
7
+ } & U & {
8
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
9
+ };
@@ -1,25 +1,2 @@
1
- import { FlagAskContext, FlagDefinition } from '../lib/types.js';
2
- /**
3
- * Generates a standard prompt message for a missing required flag/argument
4
- */
1
+ import { FlagDefinition } from '../lib/types.js';
5
2
  export declare function formatPromptMessage(name: string, definition: FlagDefinition): string;
6
- /**
7
- * Wraps a flag definition's parse function into a UX-compatible validator.
8
- * Catches ValidationError for clean messages, other errors get a generic message.
9
- */
10
- export declare function buildInputValidator(definition: FlagDefinition): (value: string) => string | true;
11
- /**
12
- * Wraps a flag definition's parse function into a UX-compatible validator
13
- * for multiple comma-separated values. Calls parse per-item, catches ValidationError.
14
- */
15
- export declare function buildMultipleValuesValidator(def: FlagDefinition): (value: string) => string | true;
16
- /**
17
- * Shared ask logic for multiple-value flags (string[], number[]).
18
- * Replaces the duplicated ~15-line branch in string and number ask methods.
19
- */
20
- export declare function askForMultipleValues(ctx: FlagAskContext): Promise<string[] | null>;
21
- /**
22
- * Shared ask logic for simple single-input flags (file, directory, url).
23
- * Replaces the identical 3-line ask implementations.
24
- */
25
- export declare function askForSingleInput(ctx: FlagAskContext): Promise<string | null>;
@@ -1,28 +1,46 @@
1
- import { booleanFlag } from './boolean.js';
2
- import { customFlag } from './custom.js';
3
- import { directoryFlag } from './directory.js';
4
- import { enumFlag } from './enum.js';
5
- import { fileFlag } from './file.js';
6
- import { numberFlag } from './number.js';
7
- import { stringFlag } from './string.js';
8
- import { urlFlag } from './url.js';
1
+ import { custom } from './custom.js';
2
+ import { optionFlag } from './option.js';
9
3
  export declare const Flags: {
10
- string: typeof stringFlag;
11
- number: typeof numberFlag;
12
- boolean: typeof booleanFlag;
13
- enum: typeof enumFlag;
14
- file: typeof fileFlag;
15
- directory: typeof directoryFlag;
16
- url: typeof urlFlag;
17
- custom: typeof customFlag;
18
- };
19
- export declare const Args: {
20
- string: typeof stringFlag;
21
- number: typeof numberFlag;
22
- boolean: typeof booleanFlag;
23
- enum: typeof enumFlag;
24
- file: typeof fileFlag;
25
- directory: typeof directoryFlag;
26
- url: typeof urlFlag;
27
- custom: typeof customFlag;
4
+ string: <const U extends import('../index.js').FlagProps<string> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<string> & U & {
5
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
6
+ };
7
+ number: <const U extends import('../index.js').FlagProps<number> & Partial<{
8
+ min?: number;
9
+ max?: number;
10
+ }> = import('../index.js').FlagProps<number> & Partial<{
11
+ min?: number;
12
+ max?: number;
13
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "min" | "max">, never>) | undefined) => import('../index.js').FlagProps<number> & {
14
+ min?: number;
15
+ max?: number;
16
+ } & U & {
17
+ parse(input: any, opts: import('../index.js').ParameterOpts): number;
18
+ };
19
+ boolean: <const U extends import('../index.js').FlagProps<boolean> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<boolean> & U & {
20
+ parse(input: any, opts: import('../index.js').ParameterOpts): boolean;
21
+ };
22
+ option: typeof optionFlag;
23
+ file: <const U extends import('../index.js').FlagProps<string> & Partial<{
24
+ exists?: boolean;
25
+ }> = import('../index.js').FlagProps<string> & Partial<{
26
+ exists?: boolean;
27
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "exists">, never>) | undefined) => import('../index.js').FlagProps<string> & {
28
+ exists?: boolean;
29
+ } & U & {
30
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
31
+ };
32
+ directory: <const U extends import('../index.js').FlagProps<string> & Partial<{
33
+ exists?: boolean;
34
+ }> = import('../index.js').FlagProps<string> & Partial<{
35
+ exists?: boolean;
36
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "exists">, never>) | undefined) => import('../index.js').FlagProps<string> & {
37
+ exists?: boolean;
38
+ } & U & {
39
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
40
+ };
41
+ url: <const U extends import('../index.js').FlagProps<URL> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<URL> & U & {
42
+ parse(input: any, opts: import('../index.js').ParameterOpts): URL;
43
+ };
44
+ custom: typeof custom;
28
45
  };
46
+ export { Args } from '../args/index.js';
@@ -1,2 +1,12 @@
1
- import { FlagInput, NumberFlagDef } from '../lib/types.js';
2
- export declare function numberFlag<const T extends FlagInput<NumberFlagDef>>(opts?: T): NumberFlagDef & T;
1
+ export declare const numberFlag: <const U extends import('../index.js').FlagProps<number> & Partial<{
2
+ min?: number;
3
+ max?: number;
4
+ }> = import('../index.js').FlagProps<number> & Partial<{
5
+ min?: number;
6
+ max?: number;
7
+ }>>(overrides?: (U & Record<Exclude<keyof U, keyof import('../index.js').FlagProps<T> | "min" | "max">, never>) | undefined) => import('../index.js').FlagProps<number> & {
8
+ min?: number;
9
+ max?: number;
10
+ } & U & {
11
+ parse(input: any, opts: import('../index.js').ParameterOpts): number;
12
+ };
@@ -0,0 +1,6 @@
1
+ import { FlagProps, ParameterOpts } from '../lib/types.js';
2
+ export declare function optionFlag<const T extends readonly string[], const U extends Partial<FlagProps>>(opts: {
3
+ options: T;
4
+ } & U): U & FlagProps<T[number]> & {
5
+ parse(input: any, opts: ParameterOpts): T[number];
6
+ };
@@ -1,2 +1,3 @@
1
- import { FlagInput, StringFlagDef } from '../lib/types.js';
2
- export declare function stringFlag<const T extends FlagInput<StringFlagDef>>(opts?: T): StringFlagDef & T;
1
+ export declare const stringFlag: <const U extends import('../index.js').FlagProps<string> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<string> & U & {
2
+ parse(input: any, opts: import('../index.js').ParameterOpts): string;
3
+ };
@@ -1,2 +1,3 @@
1
- import { FlagInput, UrlFlagDef } from '../lib/types.js';
2
- export declare function urlFlag<const T extends FlagInput<UrlFlagDef>>(opts?: T): UrlFlagDef & T;
1
+ export declare const urlFlag: <const U extends import('../index.js').FlagProps<URL> = {}>(overrides?: (U & Record<Exclude<keyof U, "required" | "type" | "default" | "description" | "help" | "multiple" | "parse" | "ask" | "alias" | "handler">, never>) | undefined) => import('../index.js').FlagProps<URL> & U & {
2
+ parse(input: any, opts: import('../index.js').ParameterOpts): URL;
3
+ };
@@ -9,6 +9,7 @@ export * from './Logger.js';
9
9
  export * from './StringSimilarity.js';
10
10
  export * from './contracts/index.js';
11
11
  export * from './errors/index.js';
12
+ export * from './args/index.js';
12
13
  export * from './flags/index.js';
13
14
  export * from './lib/types.js';
14
15
  export * from './options/index.js';
@@ -1,9 +1,10 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`chalk`);c=s(c);let l=require(`node:fs`);l=s(l);let u=require(`node:path`);u=s(u);let d=require(`minimist`);d=s(d);let f=require(`@inquirer/prompts`),p=require(`inquirer-file-selector`);var m=class{level;constructor(e={}){this.level=e.level??`info`}shouldLog(e){let t=[`debug`,`info`,`warn`,`error`],n=t.indexOf(this.level);return t.indexOf(e)>=n}setLevel(e){this.level=e}getLevel(){return this.level}log(...e){console.log(...e)}info(...e){this.shouldLog(`info`)&&console.log(...e)}warn(...e){this.shouldLog(`warn`)&&console.warn(...e)}error(...e){this.shouldLog(`error`)&&console.error(...e)}debug(...e){this.shouldLog(`debug`)&&console.log(...e)}},h=class{getBigrams(e){let t=[],n=e.toLowerCase();for(let e=0;e<n.length-1;e++)t.push(n.slice(e,e+2));return t}calculateSimilarity(e,t){if(e===t)return 1;if(e.length<2||t.length<2)return 0;let n=this.getBigrams(e),r=this.getBigrams(t),i=new Set(r),a=0;for(let e of n)i.has(e)&&(a++,i.delete(e));return 2*a/(n.length+r.length)}findBestMatch(e,t){let n=t.map(t=>({target:t,rating:this.calculateSimilarity(e,t)})),r=0,i=n[0]?.rating??0;for(let e=1;e<n.length;e++)n[e].rating>i&&(i=n[e].rating,r=e);return{ratings:n,bestMatch:n[r],bestMatchIndex:r}}},g=class extends Error{$type=`BobError`},_=class extends g{constructor(e){super(`Command "${e}" not found.`),this.command=e}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Command ${c.default.bold.yellow(this.command)} not found.`),e.log(``)}},v=class extends g{constructor(e,t={}){super(`Flag ${e} is not recognized`),this.flag=e,this.flagsSchema=t}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Flag ${c.default.bold.yellow(this.flag)} is not recognized.`);let t=Object.entries(this.flagsSchema);if(t.length>0){e.log(``),e.log(` ${c.default.dim(`Available flags:`)}`),e.log(``);let n=t.map(([e,t])=>{let n=t.alias?typeof t.alias==`string`?[t.alias]:t.alias:[],r=t.type===`enum`&&t.options?t.options.join(` | `):t.type;return{nameWithAlias:`--${e}${n.length>0?n.map(e=>`, -${e}`).join(``):``}`,description:t.description||``,typeDisplay:r}}),r=Math.max(...n.map(e=>e.nameWithAlias.length));for(let t of n){let n=` `.repeat(r-t.nameWithAlias.length+2);e.log(` ${c.default.green(t.nameWithAlias)}${n}${t.description} ${c.default.dim(`(${t.typeDisplay})`)}`)}}e.log(``)}},y=class extends g{constructor(e){super(`Argument "${e}" is required.`),this.argument=e}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Argument ${c.default.bold.yellow(this.argument)} is required.`),e.log(``)}},b=class extends g{constructor(e){super(`Flag "${e}" is required.`),this.flag=e}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Flag ${c.default.bold.yellow(this.flag)} is required.`),e.log(``)}},x=class extends g{constructor(e,t){let n=`Argument "${e.arg}" value is invalid.`;e.reason?n+=` Reason: ${e.reason}`:n+=` Value: "${e.value}"`,super(n),this.detail=e,this.argDefinition=t}pretty(e){let t=[];if(this.detail.reason!=null&&t.push([`Reason`,this.detail.reason]),this.detail.value!=null&&t.push([`Value`,this.detail.value]),this.argDefinition?.help!=null&&t.push([`Help`,c.default.green(this.argDefinition.help)]),e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Argument ${c.default.bold.yellow(this.detail.arg)} value is invalid.`),t.length>0){e.log(``);let n=Math.max(...t.map(([e])=>e.length));for(let[r,i]of t)e.log(` ${` `.repeat(n-r.length)}${c.default.dim(r)} ${i}`)}e.log(``)}},S=class extends g{constructor(e,t){let n=`Flag "${e.flag}" value is invalid.`;e.reason?n+=` Reason: ${e.reason}`:n+=` Value: "${e.value}"`,super(n),this.param=e,this.flagDefinition=t}pretty(e){let t=[];if(this.param.reason!=null&&t.push([`Reason`,this.param.reason]),this.param.value!=null&&t.push([`Value`,this.param.value]),this.flagDefinition?.help!=null&&t.push([`Help`,c.default.green(this.flagDefinition.help)]),e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Flag ${c.default.bold.yellow(this.param.flag)} value is invalid.`),t.length>0){e.log(``);let n=Math.max(...t.map(([e])=>e.length));for(let[r,i]of t)e.log(` ${` `.repeat(n-r.length)}${c.default.dim(r)} ${i}`)}e.log(``)}},C=class extends g{constructor(e,t){super(`Too many arguments provided. Expected ${e}, got ${t}.`),this.expected=e,this.received=t}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Too many arguments. Expected ${c.default.bold.yellow(String(this.expected))}, got ${c.default.bold.yellow(String(this.received))}.`),e.log(``)}},w=class extends Error{constructor(e){super(e)}},T=class{flags;parsedFlags=null;args;parsedArguments=null;ux;shouldPromptForMissingFlags=!0;shouldValidateUnknownFlags=!0;shouldRejectExtraArguments=!1;constructor(e){this.opts=e,this.ux=e.ux,this.flags=e.flags,this.args=e.args}async init(e){let{_:t,...n}=(0,d.default)(e);return this.shouldValidateUnknownFlags&&this.validateUnknownFlags(n),this.parsedFlags=await this.handleOptions(n),this.parsedArguments=await this.handleArguments(t),{flags:this.parsedFlags,args:this.parsedArguments}}async validate(){for(let e in this.flags){let t=this.flags[e],n=this.parsedFlags?.[e],r=this.isEmptyValue(n);if(t.required&&r){if(!this.shouldPromptForMissingFlags)throw new b(e);let r=await this.promptForArgument(e,t);if(r!=null&&this.parsedFlags)n=await this.parseValue(r,t,{name:e}),this.parsedFlags[e]=n;else throw new b(e)}}for(let e in this.args){let t=this.args[e],n=this.parsedArguments?.[e],r=this.isEmptyValue(n);if(t.required&&r){if(!this.shouldPromptForMissingFlags)throw new y(e);let r=await this.promptForArgument(e,t);if(r!=null&&this.parsedArguments)n=await this.parseValue(r,t,{name:e,isArg:!0}),this.parsedArguments[e]=n;else throw new y(e)}}}flag(e,t){if(!this.parsedFlags)throw Error(`Flags have not been parsed yet. Call init() first.`);return this.isEmptyValue(this.parsedFlags[e])&&t!==void 0?t:this.parsedFlags[e]}async setFlag(e,t){if(!this.parsedFlags)throw Error(`Flags have not been parsed yet. Call init() first.`);if(!(e in this.flags))throw new v(e,this.flags);this.parsedFlags[e]=t}argument(e,t){if(!this.parsedArguments)throw Error(`Arguments have not been parsed yet. Call init() first.`);return this.isEmptyValue(this.parsedArguments[e])&&t!==void 0?t:this.parsedArguments[e]}async setArgument(e,t){if(!this.parsedArguments)throw Error(`Arguments have not been parsed yet. Call init() first.`);if(!(e in this.args))throw new x({arg:e,reason:`Argument "${e}" is not recognized`});this.parsedArguments[e]=t}isEmptyValue(e){return e==null||typeof e==`string`&&e.trim()===``||Array.isArray(e)&&e.length===0}validateUnknownFlags(e){let t=new Set;for(let e in this.flags){t.add(e);let n=this.flags[e],r=Array.isArray(n.alias)?n.alias:n.alias?[n.alias]:[];for(let e of r)t.add(e)}for(let n in e)if(!t.has(n))throw new v(n,this.flags)}async handleOptions(e){let t={};for(let n in this.flags)t[n]=await this.resolveFlagValue(n,this.flags[n],e);return t}async handleArguments(e){let t={},n=[...e],r=Object.keys(this.args).length;for(let e in this.args){let r=this.args[e];if(`multiple`in r&&r.multiple){t[e]=await this.parseValue(n,r,{name:e,isArg:!0}),n.length=0;continue}t[e]=await this.parseValue(n.shift(),r,{name:e,isArg:!0})}if(this.shouldRejectExtraArguments&&n.length>0)throw new C(r,r+n.length);return t}async resolveFlagValue(e,t,n){let r,i=[e];t.alias&&i.push(...Array.isArray(t.alias)?t.alias:[t.alias]);for(let e of i)if(e in n){r=n[e];break}return this.parseValue(r,t,{name:e})}async parseValue(e,t,n){if(this.isEmptyValue(e))return typeof t.default==`function`?await t.default():t.default;if(`multiple`in t&&t.multiple){Array.isArray(e)||(e=[e]);let r=[];for(let i of e)r.push(await this.safeParse(i,t,n));return r}return this.safeParse(e,t,n)}async safeParse(e,t,n){try{return t.parse(e,this.opts.ctx)}catch(t){if(t instanceof S||t instanceof x||!n)throw t;let r=t instanceof Error?t.message:String(t);throw n.isArg?new x({arg:n.name,value:e,reason:r}):new S({flag:n.name,value:e,reason:r})}}disablePrompting(){return this.shouldPromptForMissingFlags=!1,this}allowUnknownFlags(){return this.shouldValidateUnknownFlags=!1,this}strictMode(){return this.shouldRejectExtraArguments=!0,this}async promptForArgument(e,t){return t.ask?t.ask({name:e,ux:this.ux,definition:t}):null}};function E(e,t){let n=`multiple`in t&&t.multiple,r=`${c.default.yellow.bold(e)} is required`;return t.description&&(r+=`: ${c.default.gray(`(${t.description})`)}`),r+=` ${c.default.green(`(${t.type}${n?`[]`:``})`)}\n`,r}function D(e){return t=>{if((t==null||typeof t==`string`&&t.trim()===``)&&e.required)return`This value is required`;try{e.parse(t,void 0)}catch(e){return e instanceof w?e.message:`Invalid value`}return!0}}function ee(e){return t=>{if((t==null||t.trim()===``)&&e.required)return`Please enter at least one value`;for(let n of t.split(`,`)){let t=n.trim();if(t!==``)try{e.parse(t,void 0)}catch(e){return e instanceof w?`"${t}": ${e.message}`:`"${t}": Invalid value`}}return!0}}async function te(e){let t=e.definition,n=E(e.name,t);return await e.ux.askForList(n+`Please provide one or more values, separated by commas:
2
- `,{separator:`,`,validate:ee(t)})}async function ne(e){let t=E(e.name,e.definition);return await e.ux.askForInput(t,{validate:D(e.definition)})}function re(e){return{default:!1,ask:async e=>{let t=E(e.name,e.definition);return await e.ux.askForToggle(t)},parse:e=>{if(typeof e==`boolean`)return e;let t=String(e).toLowerCase();if(t===`true`||t===`1`)return!0;if(t===`false`||t===`0`)return!1;throw new w(`Invalid boolean value: "${e}". Expected true, false, 1, or 0.`)},...e,type:`boolean`}}function ie(e){return t=>({default:e?.multiple||t?.multiple?[]:null,parse:e=>e,...e,...t,type:`custom`})}function ae(e){return{default:null,ask:async e=>{let t=E(e.name,e.definition);return e.ux.askForDirectory(t,{basePath:process.cwd()})},parse:t=>{let n=String(t);if(e?.exists&&!(l.default.existsSync(n)&&l.default.lstatSync(n).isDirectory()))throw new w(`directory does not exist`);return n},...e,type:`directory`}}function oe(e){return{default:e.multiple?[]:null,ask:async e=>{let t=e.definition,n=`multiple`in t&&t.multiple,r=E(e.name,t);if(t.type!==`enum`)return null;let i=t.options.map(e=>({name:e,value:e}));return n?await e.ux.askForCheckbox(r,i):await e.ux.askForSelect(r,i)},parse:t=>{let n=String(t);if(!e.options.includes(n))throw new w(`must be one of: ${e.options.map(e=>`"${e}"`).join(`, `)}`);return n},...e,type:`enum`}}function se(e){return{default:null,ask:async e=>{let t=E(e.name,e.definition);return e.ux.askForFile(t,{basePath:process.cwd()})},parse:t=>{let n=String(t);if(e?.exists&&!l.default.existsSync(n))throw new w(`file does not exist`);return n},...e,type:`file`}}function ce(e){return{default:e?.multiple?[]:null,ask:async e=>{let t=e.definition,n=`multiple`in t&&t.multiple,r=E(e.name,t);return n?te(e):await e.ux.askForNumber(r,{validate:e=>{if(e===void 0&&t.required)return`This value is required`;if(e!==void 0)try{t.parse(String(e),void 0)}catch(e){return e instanceof w?e.message:`Invalid value`}return!0}})},parse:t=>{let n=typeof t==`number`?t:Number(t);if(isNaN(n))throw new w(`must be a valid number`);if(e?.min!==void 0&&n<e.min)throw new w(`is below minimum ${e.min}`);if(e?.max!==void 0&&n>e.max)throw new w(`exceeds maximum ${e.max}`);return n},...e,type:`number`}}function le(e){return{default:e?.multiple?[]:null,ask:async e=>{let t=e.definition;return`multiple`in t&&t.multiple?te(e):`secret`in t&&t.secret?e.ux.askForPassword(E(e.name,t),{validate:D(t)}):ne(e)},parse:e=>{if(typeof e==`boolean`)throw Error(`Expected a string, got boolean "${e}"`);return String(e)},...e,type:`string`}}function ue(e){return{default:null,ask:async e=>ne(e),parse:e=>{try{return new URL(String(e))}catch{throw new w(`Invalid URL: "${e}"`)}},...e,type:`url`}}var O={string:le,number:ce,boolean:re,enum:oe,file:se,directory:ae,url:ue,custom:ie},k=O;function A(e){return Array(e+5).join(` `)}function de(e){let t=e.type;return t===`enum`&&e.options?`enum: ${e.options.join(`|`)}`:t}var j=O.boolean({alias:[`h`],handler:(e,t,n)=>{if(!e)return{shouldStop:!1};let r=n.args,i={...n.baseFlags,...n.flags},a=Object.entries(r),o=Object.entries(i),s=o.map(([e,t])=>{let n=Array.isArray(t.alias)?t.alias:t.alias?[t.alias]:[];return{name:e,...t,flagWithAlias:`--${e}${n.map(e=>`, -${e}`).join(``)}`}}),l=a.filter(([,e])=>e.required);console.log(c.default.yellow(`Description:`)),console.log(` ${n.description}\n`),console.log(c.default.yellow(`Usage:`)),console.log(` ${n.command} ${l.length>0?l.map(([e])=>`<${e}>`).join(` `):`\b`} [options]`);let u=Math.max(...s.map(e=>e.flagWithAlias.length),0),d=Math.max(...a.map(([e])=>e.length),0),f=d>u?d:u;if(a.length>0){console.log(`\n${c.default.yellow(`Arguments`)}:`);for(let[e,t]of a){let n=A(f-e.length),r=` ${c.default.green(e)} ${n} ${t.description??`\b`}`;if(t.default!==void 0&&!t.required){let e=typeof t.default==`function`?`[function]`:t.multiple?JSON.stringify(t.default):t.default;r+=` ${c.default.yellow(`[default: ${e}]`)}`}`multiple`in t&&t.multiple&&(r+=` ${c.default.white(`(variadic)`)}`),console.log(r)}}if(o.length>0){console.log(`\n${c.default.yellow(`Options`)}:`);for(let e of s){let t=A(f-e.flagWithAlias.length),n=` ${c.default.green(e.flagWithAlias)} ${t} ${e.description??`\b`}`;if(e.type&&(n+=` ${c.default.white(`(${de(e)})`)}`),e.default!==void 0&&!e.required){let t=typeof e.default==`function`?`(function)`:e.default;n+=` ${c.default.yellow(`[default: ${t}]`)}`}console.log(n)}}let p=n.examples??[];if(p.length>0){console.log(`\n${c.default.yellow(`Examples`)}:`);let e=process.argv[0].split(`/`).pop();e===`node`&&(e+=` `+process.argv[1].split(`/`).pop());for(let[t,n]of p.entries())t>0&&console.log(``),console.log(` ${n.description}\n`),console.log(` ${c.default.green(`${e} ${n.command}`)}`)}return{shouldStop:!0}}}),fe=class extends Error{name=`ExitPromptError`};async function M(e,t){try{return await e()}catch(e){if(e instanceof fe||e instanceof Error&&e.name===`ExitPromptError`)return t;throw e}}async function N(e,t,n){if(t.length===0)throw Error(`No options provided`);let r=t.map(e=>typeof e==`string`?{name:e,value:e}:{name:e.name,value:e.value,disabled:e.disabled,checked:e.checked,description:e.description});return M(()=>(0,f.checkbox)({message:e,choices:r,required:n?.required,pageSize:n?.pageSize,loop:n?.loop,validate:n?.validate,shortcuts:n?.shortcuts}),null)}async function P(e=`Do you want to continue?`,t){return M(()=>(0,f.confirm)({message:e,default:t?.default??!1,transformer:t?.transformer}),!1)}async function F(e,t){return M(()=>(0,f.editor)({message:e,default:t?.default,postfix:t?.postfix,waitForUserInput:t?.waitForUserInput,validate:t?.validate}),null)}async function I(e,t,n){return M(()=>(0,f.expand)({message:e,choices:t,default:n?.default}),null)}async function L(e,t){return M(async()=>{let n=await(0,p.fileSelector)({message:e,basePath:t?.basePath,type:t?.type===`file+directory`?void 0:t?.type,filter:t?.filter,allowCancel:!0,pageSize:t?.pageSize,loop:t?.loop});return n===null?null:n.path},null)}async function R(e,t){return M(()=>(0,f.input)({message:e,default:t?.default,required:t?.required,validate:t?.validate,transformer:t?.transformer}),null)}async function z(e,t){let n=t?.separator??`,`;return M(async()=>(await(0,f.input)({message:e,default:t?.default,validate:t?.validate})).split(n).map(e=>e.trim()).filter(e=>e.length>0),null)}async function B(e,t){return M(async()=>await(0,f.number)({message:e,default:t?.default,required:t?.required,min:t?.min,max:t?.max,step:t?.step,validate:t?.validate})??null,null)}async function V(e,t){return M(()=>(0,f.password)({message:e,mask:t?.mask,validate:t?.validate}),null)}async function H(e,t,n){return M(()=>(0,f.rawlist)({message:e,choices:t,loop:n?.loop}),null)}async function U(e,t,n){return M(()=>(0,f.search)({message:e,source:t,pageSize:n?.pageSize,validate:n?.validate}),null)}async function W(e,t,n){if(t.length===0)throw Error(`No options provided`);let r=t.map(e=>typeof e==`string`?{name:e,value:e}:e);return M(()=>(0,f.select)({message:e,choices:r,default:n?.default,pageSize:n?.pageSize,loop:n?.loop}),null)}async function G(e,t){let n=t?.active??`Yes`,r=t?.inactive??`No`;return M(()=>(0,f.confirm)({message:e,default:t?.default??!1,transformer:e=>e?n:r}),!1)}function K(e,t){let n=t?.separator??`: `,r=t?.keyStyle??c.default.bold,i=Array.isArray(e)?e:Object.entries(e);if(i.length===0)return;let a=Math.max(...i.map(([e])=>e.length));for(let[e,t]of i)console.log(r(e.padEnd(a))+n+String(t??``))}function q(e=``,t=[`⠙`,`⠘`,`⠰`,`⠴`,`⠤`,`⠦`,`⠆`,`⠃`,`⠋`,`⠉`],n=100){let r=e,i=null,a=0,o=setInterval(function(){i&&=(process.stdout.write(new TextEncoder().encode(`\r`+` `.repeat(i.length+5)+`\r`)),null),process.stdout.write(new TextEncoder().encode(`\r`+t[a++]+` `+r)),a%=t.length},n),s=()=>{clearInterval(o),process.stdout.write(new TextEncoder().encode(`\r`+` `.repeat(r.length+5)+`\r`))};return{[Symbol.dispose]:s,[Symbol.asyncDispose]:s,updateText:e=>{i=r,r=e},stop:s}}function J(e,t){let n=t?.width??30,r=t?.completeChar??`█`,i=t?.incompleteChar??`░`,a=0,o=!1,s=()=>{if(o)return;let t=e<=0?1:Math.min(a/e,1),s=Math.round(t*n),c=`${r.repeat(s)+i.repeat(n-s)} ${Math.round(t*100)}% ${a}/${e}`;process.stdout.write(`\r`+c)},c=()=>{o||(o=!0,process.stdout.write(`
3
- `))};return s(),{increment:(t=1)=>{o||(a=Math.min(a+t,e),s())},update:t=>{o||(a=Math.max(0,Math.min(t,e)),s())},stop:c,[Symbol.dispose]:c,[Symbol.asyncDispose]:c}}function pe(e,t){if(e.length===0)return;let n=t??Object.keys(e[0]).map(e=>({key:e})),r=n.map(e=>e.header??e.key.toUpperCase()),i=n.map((t,n)=>{let i=Math.max(r[n].length,...e.map(e=>(t.format?t.format(e[t.key]):String(e[t.key]??``)).length));return t.width?Math.min(i,t.width):i}),a=(e,t,n=`left`)=>{if(e.length>t)return e.slice(0,t-1)+`…`;switch(n){case`right`:return e.padStart(t);case`center`:{let n=Math.floor((t-e.length)/2);return` `.repeat(n)+e+` `.repeat(t-e.length-n)}default:return e.padEnd(t)}},o=n.map((e,t)=>a(r[t],i[t],e.alignment)).join(` `);console.log(c.default.bold(o));let s=i.map(e=>`-`.repeat(e)).join(` `);console.log(c.default.dim(s));for(let t of e){let e=n.map((e,n)=>a(e.format?e.format(t[e.key]):String(t[e.key]??``),i[n],e.alignment)).join(` `);console.log(e)}}var Y=class{askForConfirmation(e,t){return P(e,t)}askForInput(e,t){return R(e,t)}askForPassword(e,t){return V(e,t)}askForNumber(e,t){return B(e,t)}askForSelect(e,t,n){return W(e,t,n)}askForCheckbox(e,t,n){return N(e,t,n)}askForSearch(e,t,n){return U(e,t,n)}askForList(e,t){return z(e,t)}askForToggle(e,t){return G(e,t)}askForEditor(e,t){return F(e,t)}askForRawList(e,t,n){return H(e,t,n)}askForExpand(e,t,n){return I(e,t,n)}askForFile(e,t){return L(e,{...t,type:`file`})}askForDirectory(e,t){return L(e,{...t,type:`directory`})}askForFileSelector(e,t){return L(e,t)}keyValue(e,t){return K(e,t)}table(e,t){return pe(e,t)}newProgressBar(e,t){return J(e,t)}newLoader(e,t,n){return q(e,t,n)}},X=class{static $type=`BobCommand`;static command=``;static description=``;static group;static args={};static flags={};static examples=[];static hidden=!1;static disableDefaultOptions=!1;static disablePrompting=!1;static allowUnknownFlags=!1;static strictMode=!1;ctx;logger;ux;parser;static baseFlags={help:j};newCommandParser(e){return new T({ux:e.ux,ctx:e.ctx,flags:e.flags,args:e.args})}newUX(){return new Y}async run(e){let t=this.constructor;this.ctx=e.ctx,this.logger=e.logger,this.ux=this.newUX();let n;if(`flags`in e)n={flags:e.flags,args:e.args};else{this.parser=this.newCommandParser({ctx:this.ctx,ux:this.ux,flags:t.disableDefaultOptions?t.flags:{...t.baseFlags,...t.flags},args:t.args}),t.allowUnknownFlags&&this.parser.allowUnknownFlags(),t.strictMode&&this.parser.strictMode(),t.disablePrompting&&this.parser.disablePrompting();let r=await this.parser.init(e.args);for(let n in r.flags){let i=r.flags[n],a=t.flags[n]||t.baseFlags[n];if(a&&a.handler){let n=a.handler(i,e.ctx,t);if(n&&n.shouldStop)return-1}}await this.parser.validate(),n={flags:r.flags,args:r.args}}if(this.preHandle){let e=await this.preHandle();if(e&&e!==0)return e}return await this.handle(this.ctx,n)??0}};function me(e){return typeof e==`object`&&!!e&&`$type`in e&&e.$type===`BobError`}function Z(e){return typeof e==`function`?e.prototype instanceof X||e.$type===`BobCommand`:!1}var Q=class{commands={};ux;logger;stringSimilarity;constructor(e){this.logger=e?.logger??new m,this.ux=e?.ux??new Y,this.stringSimilarity=e?.stringSimilarity??new h}getAvailableCommands(){return Object.keys(this.commands)}getCommands(){return Object.values(this.commands)}importFile=async e=>(await import(e)).default;commandResolver=async e=>{let t=await this.importFile(e);return t?(t&&typeof t==`object`&&`default`in t&&(t=t.default),typeof t==`function`&&Z(t)?t:null):null};withCommandResolver(e){return this.commandResolver=e,this}withFileImporter(e){return this.importFile=e,this}registerCommand(e,t=!1){if(!Z(e))throw Error(`Invalid command, it must extend the Command class.`);let n=e.command;if(!n)throw Error(`Cannot register a command with no name. ${e.name} `);if(!t&&this.commands[n])throw Error(`Command ${n} already registered.`);this.commands[n]=e}async loadCommandsPath(e){for await(let t of this.listCommandsFiles(e))try{let e=await this.commandResolver(t);Z(e)&&this.registerCommand(e)}catch(e){throw Error(`Command ${t} failed to load. ${e}`,{cause:e})}}async runCommand(e,t,...n){let r;if(typeof t==`string`){let i=this.commands[t];if(!i){let r=await this.suggestCommand(t);if(r)return await this.runCommand(e,r,...n);throw new _(t)}r=new i}else r=Z(t)?new t:t;return await r.run({ctx:e,logger:this.logger,args:n})??0}async suggestCommand(e){let t=this.getAvailableCommands(),{bestMatch:n,bestMatchIndex:r,ratings:i}=this.stringSimilarity.findBestMatch(e,t),a=i.filter(e=>e.rating>.3).map(e=>e.target);if(n&&(n.rating>0&&a.length<=1||n.rating>.7&&a.length>1)){let n=t[r];return await this.askRunSimilarCommand(e,n)?n:null}if(a.length){this.logger.error(`${c.default.bgRed(` ERROR `)} Command ${c.default.yellow(e)} not found.\n`);let t=await this.ux.askForSelect(c.default.green(`Did you mean to run one of these commands instead?`),a);if(t)return t}throw new _(e)}async askRunSimilarCommand(e,t){return this.logger.error(`${c.default.bgRed(` ERROR `)} Command ${c.default.yellow(e)} not found.\n`),this.ux.askForConfirmation(`${c.default.green(`Do you want to run ${c.default.yellow(t)} instead?`)} `)}async*listCommandsFiles(e){let t=l.default.readdirSync(e,{withFileTypes:!0});for(let n of t){let t=u.default.resolve(e,n.name);if(n.isDirectory())yield*this.listCommandsFiles(u.default.resolve(e,n.name));else{if(!t.endsWith(`.ts`)&&!t.endsWith(`.js`)&&!t.endsWith(`.mjs`)&&!t.endsWith(`.cjs`))continue;yield t}}}},he=class{logger;constructor(e){this.logger=e}handle(e){if(me(e))return e.pretty(this.logger),-1;throw e}},ge=class extends X{static command=`help`;static description=c.default.bold(`Show help information about the CLI and its commands`);constructor(e){super(),this.opts=e}async handle(){let e=this.opts.commandRegistry.getCommands().filter(e=>!e.hidden),t=this.opts.cliName??`Bob CLI`,n=this.opts.cliVersion??`0.0.0`,r=(await Promise.resolve().then(()=>require(`../package-CX7WaEsn.cjs`)))?.default?.version??`0.0.0`;this.logger.log(`${t} ${c.default.green(n)} (core: ${c.default.yellow(r)})
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`chalk`);c=s(c);let l=require(`node:fs`);l=s(l);let u=require(`node:path`);u=s(u);let d=require(`minimist`);d=s(d);let f=require(`@inquirer/prompts`),p=require(`inquirer-file-selector`);var m=class{level;constructor(e={}){this.level=e.level??`info`}shouldLog(e){let t=[`debug`,`info`,`warn`,`error`],n=t.indexOf(this.level);return t.indexOf(e)>=n}setLevel(e){this.level=e}getLevel(){return this.level}log(...e){console.log(...e)}info(...e){this.shouldLog(`info`)&&console.log(...e)}warn(...e){this.shouldLog(`warn`)&&console.warn(...e)}error(...e){this.shouldLog(`error`)&&console.error(...e)}debug(...e){this.shouldLog(`debug`)&&console.log(...e)}},ee=class{getBigrams(e){let t=[],n=e.toLowerCase();for(let e=0;e<n.length-1;e++)t.push(n.slice(e,e+2));return t}calculateSimilarity(e,t){if(e===t)return 1;if(e.length<2||t.length<2)return 0;let n=this.getBigrams(e),r=this.getBigrams(t),i=new Set(r),a=0;for(let e of n)i.has(e)&&(a++,i.delete(e));return 2*a/(n.length+r.length)}findBestMatch(e,t){let n=t.map(t=>({target:t,rating:this.calculateSimilarity(e,t)})),r=0,i=n[0]?.rating??0;for(let e=1;e<n.length;e++)n[e].rating>i&&(i=n[e].rating,r=e);return{ratings:n,bestMatch:n[r],bestMatchIndex:r}}},h=class extends Error{$type=`BobError`},g=class extends h{constructor(e){super(`Command "${e}" not found.`),this.command=e}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Command ${c.default.bold.yellow(this.command)} not found.`),e.log(``)}},_=class extends h{constructor(e,t={}){super(`Flag ${e} is not recognized`),this.flag=e,this.flagsSchema=t}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Flag ${c.default.bold.yellow(this.flag)} is not recognized.`);let t=Object.entries(this.flagsSchema);if(t.length>0){e.log(``),e.log(` ${c.default.dim(`Available flags:`)}`),e.log(``);let n=t.map(([e,t])=>{let n=t.alias?typeof t.alias==`string`?[t.alias]:t.alias:[],r=t.type===`option`&&`options`in t&&t.options?t.options.join(` | `):t.type;return{nameWithAlias:`--${e}${n.length>0?n.map(e=>`, -${e}`).join(``):``}`,description:t.description||``,typeDisplay:r}}),r=Math.max(...n.map(e=>e.nameWithAlias.length));for(let t of n){let n=` `.repeat(r-t.nameWithAlias.length+2);e.log(` ${c.default.green(t.nameWithAlias)}${n}${t.description} ${c.default.dim(`(${t.typeDisplay})`)}`)}}e.log(``)}},v=class extends h{constructor(e){super(`Argument "${e}" is required.`),this.argument=e}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Argument ${c.default.bold.yellow(this.argument)} is required.`),e.log(``)}},y=class extends h{constructor(e){super(`Flag "${e}" is required.`),this.flag=e}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Flag ${c.default.bold.yellow(this.flag)} is required.`),e.log(``)}},b=class extends h{constructor(e,t){let n=`Argument "${e.arg}" value is invalid.`;e.reason?n+=` Reason: ${e.reason}`:n+=` Value: "${e.value}"`,super(n),this.detail=e,this.argDefinition=t}pretty(e){let t=[];if(this.detail.reason!=null&&t.push([`Reason`,this.detail.reason]),this.detail.value!=null&&t.push([`Value`,c.default.yellow(this.detail.value)]),this.argDefinition?.help!=null&&t.push([`Help`,c.default.green(this.argDefinition.help)]),e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Argument ${c.default.bold.yellow(this.detail.arg)} value is invalid.`),t.length>0){e.log(``);let n=Math.max(...t.map(([e])=>e.length));for(let[r,i]of t)e.log(` ${` `.repeat(n-r.length)}${c.default.dim(r)} ${i}`)}e.log(``)}},x=class extends h{constructor(e,t){let n=`Flag "${e.flag}" value is invalid.`;e.reason?n+=` Reason: ${e.reason}`:n+=` Value: "${e.value}"`,super(n),this.param=e,this.flagDefinition=t}pretty(e){let t=[];if(this.param.reason!=null&&t.push([`Reason`,this.param.reason]),this.param.value!=null&&t.push([`Value`,c.default.yellow(this.param.value)]),this.flagDefinition?.help!=null&&t.push([`Help`,c.default.green(this.flagDefinition.help)]),e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Flag ${c.default.bold.yellow(this.param.flag)} value is invalid.`),t.length>0){e.log(``);let n=Math.max(...t.map(([e])=>e.length));for(let[r,i]of t)e.log(` ${` `.repeat(n-r.length)}${c.default.dim(r)} ${i}`)}e.log(``)}},te=class extends h{constructor(e,t){super(`Too many arguments provided. Expected ${e}, got ${t}.`),this.expected=e,this.received=t}pretty(e){e.log(``),e.log(` ${c.default.bold.white.bgRed(` ERROR `)} Too many arguments. Expected ${c.default.bold.yellow(String(this.expected))}, got ${c.default.bold.yellow(String(this.received))}.`),e.log(``)}},S=class extends Error{constructor(e){super(e)}},C=class{flags;parsedFlags=null;args;parsedArgs=null;ux;shouldPromptForMissingFlags=!0;shouldValidateUnknownFlags=!0;shouldRejectExtraArguments=!1;constructor(e){this.opts=e,this.ux=e.ux,this.flags=e.flags,this.args=e.args}async init(e){let{_:t,...n}=(0,d.default)(e);return this.shouldValidateUnknownFlags&&this.validateUnknownFlags(n),this.parsedFlags=await this.handleOptions(n),this.parsedArgs=await this.handleArguments(t),{flags:this.parsedFlags,args:this.parsedArgs}}async validate(){await this.validateSchema(this.flags,this.parsedFlags,`flag`),await this.validateSchema(this.args,this.parsedArgs,`arg`)}flag(e,t){if(!this.parsedFlags)throw Error(`Flags have not been parsed yet. Call init() first.`);return this.isEmptyValue(this.parsedFlags[e])&&t!==void 0?t:this.parsedFlags[e]}async setFlag(e,t){if(!this.parsedFlags)throw Error(`Flags have not been parsed yet. Call init() first.`);if(!(e in this.flags))throw new _(e,this.flags);this.parsedFlags[e]=t}argument(e,t){if(!this.parsedArgs)throw Error(`Arguments have not been parsed yet. Call init() first.`);return this.isEmptyValue(this.parsedArgs[e])&&t!==void 0?t:this.parsedArgs[e]}async setArgument(e,t){if(!this.parsedArgs)throw Error(`Arguments have not been parsed yet. Call init() first.`);if(!(e in this.args))throw new b({arg:e,reason:`Argument "${e}" is not recognized`});this.parsedArgs[e]=t}isEmptyValue(e){return e==null||typeof e==`string`&&e.trim()===``||Array.isArray(e)&&e.length===0}validateUnknownFlags(e){let t=new Set;for(let e in this.flags){t.add(e);let n=this.flags[e],r=Array.isArray(n.alias)?n.alias:n.alias?[n.alias]:[];for(let e of r)t.add(e)}for(let n in e)if(!t.has(n))throw new _(n,this.flags)}async handleOptions(e){let t={};for(let n in this.flags)t[n]=await this.resolveFlagValue(n,this.flags[n],e);return t}async handleArguments(e){let t={},n=[...e],r=Object.keys(this.args).length;for(let e in this.args){let r=this.args[e];if(`multiple`in r&&r.multiple){t[e]=await this.parseValue(n,r,`arg`,{name:e}),n.length=0;continue}t[e]=await this.parseValue(n.shift(),r,`arg`,{name:e})}if(this.shouldRejectExtraArguments&&n.length>0)throw new te(r,r+n.length);return t}async resolveFlagValue(e,t,n){let r,i=[e];t.alias&&i.push(...Array.isArray(t.alias)?t.alias:[t.alias]);for(let e of i)if(e in n){r=n[e];break}return this.parseValue(r,t,`flag`,{name:e})}async parseValue(e,t,n,r){if(this.isEmptyValue(e))return typeof t.default==`function`?await t.default():t.default;if(`multiple`in t&&t.multiple){Array.isArray(e)||(e=[e]);let i=[];for(let a of e)i.push(await this.safeParse(a,t,n,r));return i}return this.safeParse(e,t,n,r)}buildOpts(e,t){return{name:e,ux:this.ux,ctx:this.opts.ctx,definition:t,cmd:this.opts.cmd??Z}}async safeParse(e,t,n,r){try{return t.parse(e,this.buildOpts(r?.name??``,t))}catch(t){if(t instanceof x||t instanceof b||!r)throw t;let i=t instanceof Error?t.message:String(t);throw n===`flag`?new x({flag:r.name,value:e,reason:i}):new b({arg:r.name,value:e,reason:i})}}async validateSchema(e,t,n){for(let r in e){let i=e[r],a=t?.[r],o=this.isEmptyValue(a);if(i.required&&o){if(!this.shouldPromptForMissingFlags)throw n===`flag`?new y(r):new v(r);let e=await this.promptFor(r,i);if(e!=null&&t)a=await this.parseValue(e,i,n,{name:r}),t[r]=a;else throw n===`flag`?new y(r):new v(r)}}}disablePrompting(){return this.shouldPromptForMissingFlags=!1,this}allowUnknownFlags(){return this.shouldValidateUnknownFlags=!1,this}strictMode(){return this.shouldRejectExtraArguments=!0,this}async promptFor(e,t){return t.ask?t.ask(this.buildOpts(e,t)):null}};function w(e){return t=>({type:`custom`,default:e?.multiple||t?.multiple?[]:null,parse:e=>e,...e,...t})}function T(e,t){let n=`multiple`in t&&t.multiple,r=`${c.default.yellow.bold(e)} is required`;return t.description&&(r+=`: ${c.default.gray(`(${t.description})`)}`),r+=` ${c.default.green(`(${t.type}${n?`[]`:``})`)}\n`,r}function ne(e){if(typeof e==`boolean`)throw Error(`Expected a string, got boolean "${e}"`);return String(e)}function re(e,t){let n=typeof e==`number`?e:Number(e);if(isNaN(n))throw new S(`must be a valid number`);if(t?.min!==void 0&&n<t.min)throw new S(`is below minimum ${t.min}`);if(t?.max!==void 0&&n>t.max)throw new S(`exceeds maximum ${t.max}`);return n}function ie(e){if(typeof e==`boolean`)return e;let t=String(e).toLowerCase();if(t===`true`||t===`1`)return!0;if(t===`false`||t===`0`)return!1;throw new S(`Invalid boolean value: "${e}". Expected true, false, 1, or 0.`)}function ae(e,t){let n=String(e);if(!t.includes(n))throw new S(`must be one of: ${t.map(e=>`"${e}"`).join(`, `)}`);return n}function oe(e,t){let n=String(e);if(t?.exists&&!l.default.existsSync(n))throw new S(`file does not exist`);return n}function se(e,t){let n=String(e);if(t?.exists)try{if(!l.default.lstatSync(n).isDirectory())throw new S(`directory does not exist`)}catch(e){throw e instanceof S?e:new S(`directory does not exist`)}return n}function ce(e){try{return new URL(String(e))}catch{throw new S(`Invalid URL: "${e}"`)}}var le=w({default:!1,parse:e=>ie(e),ask:async e=>{let t=T(e.name,e.definition);return await e.ux.askForToggle(t)},type:`boolean`});function E(e,t){return n=>{if((n==null||typeof n==`string`&&n.trim()===``)&&e.required)return`This value is required`;try{e.parse(n,t)}catch(e){return e instanceof S?e.message:`Invalid value`}return!0}}function D(e,t){return n=>{if((n==null||n.trim()===``)&&e.required)return`Please enter at least one value`;for(let r of n.split(`,`)){let n=r.trim();if(n!==``)try{e.parse(n,t)}catch(e){return e instanceof S?`"${n}": ${e.message}`:`"${n}": Invalid value`}}return!0}}async function ue(e){let t=e.definition,n=`multiple`in t&&t.multiple,r=T(e.name,t);return n?await e.ux.askForList(r+`Please provide one or more values, separated by commas:
2
+ `,{separator:`,`,validate:D(t,e)}):`secret`in t&&t.secret?e.ux.askForPassword(r,{validate:E(t,e)}):await e.ux.askForInput(r,{validate:E(t,e)})}async function de(e){let t=e.definition,n=`multiple`in t&&t.multiple,r=T(e.name,t);return n?await e.ux.askForList(r+`Please provide one or more values, separated by commas:
3
+ `,{separator:`,`,validate:D(t,e)}):await e.ux.askForNumber(r,{validate:n=>{if(n===void 0&&t.required)return`This value is required`;if(n!==void 0)try{t.parse(String(n),e)}catch(e){return e instanceof S?e.message:`Invalid value`}return!0}})}async function fe(e){let t=e.definition,n=`multiple`in t&&t.multiple,r=T(e.name,t);if(t.type!==`option`)return null;let i=t.options.map(e=>({name:e,value:e}));return n?await e.ux.askForCheckbox(r,i):await e.ux.askForSelect(r,i)}async function pe(e){let t=T(e.name,e.definition);return e.ux.askForFile(t,{basePath:process.cwd()})}async function me(e){let t=T(e.name,e.definition);return e.ux.askForDirectory(t,{basePath:process.cwd()})}async function he(e){let t=T(e.name,e.definition);return await e.ux.askForInput(t,{validate:E(e.definition,e)})}var O=w({parse:(e,t)=>se(e,{exists:t.definition.exists}),ask:me,type:`directory`}),k=w({parse:(e,t)=>oe(e,{exists:t.definition.exists}),ask:pe,type:`file`}),A=w({parse:(e,t)=>re(e,{min:t.definition.min,max:t.definition.max}),ask:de,type:`number`});function j(e){return w({parse:(e,t)=>ae(e,t.definition.options),ask:fe,...e,type:`option`})()}var M=w({parse:e=>ne(e),ask:ue,type:`string`}),N=w({parse:e=>ce(e),ask:he,type:`url`}),P={string:M,number:A,option:j,file:k,directory:O,url:N,custom:w},F={string:M,number:A,boolean:le,option:j,file:k,directory:O,url:N,custom:w};function I(e){return Array(e+5).join(` `)}function ge(e){let t=e.type;return t===`option`&&`options`in e&&e.options?`enum: ${e.options.join(`|`)}`:t??`custom`}var L=F.boolean({alias:[`h`],handler:(e,t)=>{if(!e)return{shouldStop:!1};let n=t.cmd,r=n.args,i={...n.baseFlags,...n.flags},a=Object.entries(r),o=Object.entries(i),s=o.map(([e,t])=>{let n=Array.isArray(t.alias)?t.alias:t.alias?[t.alias]:[];return{name:e,...t,flagWithAlias:`--${e}${n.map(e=>`, -${e}`).join(``)}`}}),l=a.filter(([,e])=>e.required);console.log(c.default.yellow(`Description:`)),console.log(` ${n.description}\n`),n.aliases.length>0&&(console.log(c.default.yellow(`Aliases:`)),console.log(` ${n.aliases.join(`, `)}\n`)),console.log(c.default.yellow(`Usage:`)),console.log(` ${n.command} ${l.length>0?l.map(([e])=>`<${e}>`).join(` `):`\b`} [options]`);let u=Math.max(...s.map(e=>e.flagWithAlias.length),0),d=Math.max(...a.map(([e])=>e.length),0),f=d>u?d:u;if(a.length>0){console.log(`\n${c.default.yellow(`Arguments`)}:`);for(let[e,t]of a){let n=I(f-e.length),r=` ${c.default.green(e)} ${n} ${t.description??`\b`}`;if(t.default!==void 0&&!t.required){let e=typeof t.default==`function`?`[function]`:t.multiple?JSON.stringify(t.default):t.default;r+=` ${c.default.yellow(`[default: ${e}]`)}`}`multiple`in t&&t.multiple&&(r+=` ${c.default.white(`(variadic)`)}`),console.log(r)}}if(o.length>0){console.log(`\n${c.default.yellow(`Options`)}:`);for(let e of s){let t=I(f-e.flagWithAlias.length),n=` ${c.default.green(e.flagWithAlias)} ${t} ${e.description??`\b`}`;if(e.type&&(n+=` ${c.default.white(`(${ge(e)})`)}`),e.default!==void 0&&!e.required){let t=typeof e.default==`function`?`(function)`:e.default;n+=` ${c.default.yellow(`[default: ${t}]`)}`}console.log(n)}}let p=n.examples??[];if(p.length>0){console.log(`\n${c.default.yellow(`Examples`)}:`);let e=process.argv[0].split(`/`).pop();e===`node`&&(e+=` `+process.argv[1].split(`/`).pop());for(let[t,n]of p.entries())t>0&&console.log(``),console.log(` ${n.description}\n`),console.log(` ${c.default.green(`${e} ${n.command}`)}`)}return{shouldStop:!0}}}),_e=class extends Error{name=`ExitPromptError`};async function R(e,t){try{return await e()}catch(e){if(e instanceof _e||e instanceof Error&&e.name===`ExitPromptError`)return t;throw e}}async function z(e,t,n){if(t.length===0)throw Error(`No options provided`);let r=t.map(e=>typeof e==`string`?{name:e,value:e}:{name:e.name,value:e.value,disabled:e.disabled,checked:e.checked,description:e.description});return R(()=>(0,f.checkbox)({message:e,choices:r,required:n?.required,pageSize:n?.pageSize,loop:n?.loop,validate:n?.validate,shortcuts:n?.shortcuts}),null)}async function B(e=`Do you want to continue?`,t){return R(()=>(0,f.confirm)({message:e,default:t?.default??!1,transformer:t?.transformer}),!1)}async function ve(e,t){return R(()=>(0,f.editor)({message:e,default:t?.default,postfix:t?.postfix,waitForUserInput:t?.waitForUserInput,validate:t?.validate}),null)}async function V(e,t,n){return R(()=>(0,f.expand)({message:e,choices:t,default:n?.default}),null)}async function H(e,t){return R(async()=>{let n=await(0,p.fileSelector)({message:e,basePath:t?.basePath,type:t?.type===`file+directory`?void 0:t?.type,filter:t?.filter,allowCancel:!0,pageSize:t?.pageSize,loop:t?.loop});return n===null?null:n.path},null)}async function U(e,t){return R(()=>(0,f.input)({message:e,default:t?.default,required:t?.required,validate:t?.validate,transformer:t?.transformer}),null)}async function W(e,t){let n=t?.separator??`,`;return R(async()=>(await(0,f.input)({message:e,default:t?.default,validate:t?.validate})).split(n).map(e=>e.trim()).filter(e=>e.length>0),null)}async function G(e,t){return R(async()=>await(0,f.number)({message:e,default:t?.default,required:t?.required,min:t?.min,max:t?.max,step:t?.step,validate:t?.validate})??null,null)}async function K(e,t){return R(()=>(0,f.password)({message:e,mask:t?.mask,validate:t?.validate}),null)}async function q(e,t,n){return R(()=>(0,f.rawlist)({message:e,choices:t,loop:n?.loop}),null)}async function J(e,t,n){return R(()=>(0,f.search)({message:e,source:t,pageSize:n?.pageSize,validate:n?.validate}),null)}async function ye(e,t,n){if(t.length===0)throw Error(`No options provided`);let r=t.map(e=>typeof e==`string`?{name:e,value:e}:e);return R(()=>(0,f.select)({message:e,choices:r,default:n?.default,pageSize:n?.pageSize,loop:n?.loop}),null)}async function be(e,t){let n=t?.active??`Yes`,r=t?.inactive??`No`;return R(()=>(0,f.confirm)({message:e,default:t?.default??!1,transformer:e=>e?n:r}),!1)}function xe(e,t){let n=t?.separator??`: `,r=t?.keyStyle??c.default.bold,i=Array.isArray(e)?e:Object.entries(e);if(i.length===0)return;let a=Math.max(...i.map(([e])=>e.length));for(let[e,t]of i)console.log(r(e.padEnd(a))+n+String(t??``))}function Se(e=``,t=[`⠙`,`⠘`,`⠰`,`⠴`,`⠤`,`⠦`,`⠆`,`⠃`,`⠋`,`⠉`],n=100){let r=e,i=null,a=0,o=setInterval(function(){i&&=(process.stdout.write(`\r`+` `.repeat(i.length+5)+`\r`),null),process.stdout.write(`\r`+t[a++]+` `+r),a%=t.length},n),s=()=>{clearInterval(o),process.stdout.write(`\r`+` `.repeat(r.length+5)+`\r`)};return{[Symbol.dispose]:s,[Symbol.asyncDispose]:s,updateText:e=>{i=r,r=e},stop:s}}function Ce(e,t){let n=t?.width??30,r=t?.completeChar??`█`,i=t?.incompleteChar??`░`,a=0,o=!1,s=()=>{if(o)return;let t=e<=0?1:Math.min(a/e,1),s=Math.round(t*n),c=`${r.repeat(s)+i.repeat(n-s)} ${Math.round(t*100)}% ${a}/${e}`;process.stdout.write(`\r`+c)},c=()=>{o||(o=!0,process.stdout.write(`
4
+ `))};return s(),{increment:(t=1)=>{o||(a=Math.min(a+t,e),s())},update:t=>{o||(a=Math.max(0,Math.min(t,e)),s())},stop:c,[Symbol.dispose]:c,[Symbol.asyncDispose]:c}}function Y(e,t){if(e.length===0)return;let n=t??Object.keys(e[0]).map(e=>({key:e})),r=n.map(e=>e.header??e.key.toUpperCase()),i=n.map((t,n)=>{let i=Math.max(r[n].length,...e.map(e=>(t.format?t.format(e[t.key]):String(e[t.key]??``)).length));return t.width?Math.min(i,t.width):i}),a=(e,t,n=`left`)=>{if(e.length>t)return e.slice(0,t-1)+`…`;switch(n){case`right`:return e.padStart(t);case`center`:{let n=Math.floor((t-e.length)/2);return` `.repeat(n)+e+` `.repeat(t-e.length-n)}default:return e.padEnd(t)}},o=n.map((e,t)=>a(r[t],i[t],e.alignment)).join(` `);console.log(c.default.bold(o));let s=i.map(e=>`-`.repeat(e)).join(` `);console.log(c.default.dim(s));for(let t of e){let e=n.map((e,n)=>a(e.format?e.format(t[e.key]):String(t[e.key]??``),i[n],e.alignment)).join(` `);console.log(e)}}var X=class{askForConfirmation(e,t){return B(e,t)}askForInput(e,t){return U(e,t)}askForPassword(e,t){return K(e,t)}askForNumber(e,t){return G(e,t)}askForSelect(e,t,n){return ye(e,t,n)}askForCheckbox(e,t,n){return z(e,t,n)}askForSearch(e,t,n){return J(e,t,n)}askForList(e,t){return W(e,t)}askForToggle(e,t){return be(e,t)}askForEditor(e,t){return ve(e,t)}askForRawList(e,t,n){return q(e,t,n)}askForExpand(e,t,n){return V(e,t,n)}askForFile(e,t){return H(e,{...t,type:`file`})}askForDirectory(e,t){return H(e,{...t,type:`directory`})}askForFileSelector(e,t){return H(e,t)}keyValue(e,t){return xe(e,t)}table(e,t){return Y(e,t)}newProgressBar(e,t){return Ce(e,t)}newLoader(e,t,n){return Se(e,t,n)}},Z=class{static $type=`BobCommand`;static command=``;static description=``;static group;static args={};static flags={};static examples=[];static hidden=!1;static aliases=[];static disableDefaultOptions=!1;static disablePrompting=!1;static allowUnknownFlags=!1;static strictMode=!1;ctx;logger;ux;parser;static baseFlags={help:L};newCommandParser(e){return new C({ux:e.ux,ctx:e.ctx,flags:e.flags,args:e.args,cmd:e.cmd})}newUX(){return new X}async run(e){let t=this.constructor;this.ctx=e.ctx,this.logger=e.logger,this.ux=this.newUX();let n;if(`flags`in e)n={flags:e.flags,args:e.args};else{this.parser=this.newCommandParser({ctx:this.ctx,ux:this.ux,flags:t.disableDefaultOptions?t.flags:{...t.baseFlags,...t.flags},args:t.args,cmd:t}),t.allowUnknownFlags&&this.parser.allowUnknownFlags(),t.strictMode&&this.parser.strictMode(),t.disablePrompting&&this.parser.disablePrompting();let r=await this.parser.init(e.args);for(let n in r.flags){let i=r.flags[n],a=t.flags[n]||t.baseFlags[n];if(a&&a.handler){let r={name:n,ux:this.ux,ctx:e.ctx,definition:a,cmd:t},o=a.handler(i,r);if(o&&o.shouldStop)return-1}}await this.parser.validate(),n={flags:r.flags,args:r.args}}if(this.preHandle){let e=await this.preHandle();if(e&&e!==0)return e}return await this.handle(this.ctx,n)??0}};function we(e){return typeof e==`object`&&!!e&&`$type`in e&&e.$type===`BobError`}function Q(e){return typeof e==`function`?e.prototype instanceof Z||e.$type===`BobCommand`:!1}var Te=class{commands={};aliases={};ux;logger;stringSimilarity;constructor(e){this.logger=e?.logger??new m,this.ux=e?.ux??new X,this.stringSimilarity=e?.stringSimilarity??new ee}getAvailableCommands(){return[...Object.keys(this.commands),...Object.keys(this.aliases)]}getCommands(){return Object.values(this.commands)}importFile=async e=>(await import(e)).default;commandResolver=async e=>{let t=await this.importFile(e);return t?(t&&typeof t==`object`&&`default`in t&&(t=t.default),typeof t==`function`&&Q(t)?t:null):null};withCommandResolver(e){return this.commandResolver=e,this}withFileImporter(e){return this.importFile=e,this}registerCommand(e,t=!1){if(!Q(e))throw Error(`Invalid command, it must extend the Command class.`);let n=e.command;if(!n)throw Error(`Cannot register a command with no name. ${e.name} `);if(!t&&this.commands[n])throw Error(`Command ${n} already registered.`);if(!t&&this.aliases[n])throw Error(`Command name ${n} conflicts with an existing alias.`);this.commands[n]=e;for(let r of e.aliases){if(!t&&this.commands[r])throw Error(`Alias ${r} conflicts with an existing command name.`);if(!t&&this.aliases[r])throw Error(`Alias ${r} already registered.`);this.aliases[r]=n}}async loadCommandsPath(e){for await(let t of this.listCommandsFiles(e))try{let e=await this.commandResolver(t);Q(e)&&this.registerCommand(e)}catch(e){throw Error(`Command ${t} failed to load. ${e}`,{cause:e})}}async runCommand(e,t,...n){let r;if(typeof t==`string`){let i=this.commands[t]??this.commands[this.aliases[t]];if(!i){let r=await this.suggestCommand(t);if(r)return await this.runCommand(e,r,...n);throw new g(t)}r=new i}else r=Q(t)?new t:t;return await r.run({ctx:e,logger:this.logger,args:n})??0}async suggestCommand(e){let t=this.getAvailableCommands(),{bestMatch:n,bestMatchIndex:r,ratings:i}=this.stringSimilarity.findBestMatch(e,t),a=i.filter(e=>e.rating>.3).map(e=>e.target);if(n&&(n.rating>0&&a.length<=1||n.rating>.7&&a.length>1)){let n=t[r];return await this.askRunSimilarCommand(e,n)?n:null}if(a.length){this.logger.error(`${c.default.bgRed(` ERROR `)} Command ${c.default.yellow(e)} not found.\n`);let t=await this.ux.askForSelect(c.default.green(`Did you mean to run one of these commands instead?`),a);if(t)return t}throw new g(e)}async askRunSimilarCommand(e,t){return this.logger.error(`${c.default.bgRed(` ERROR `)} Command ${c.default.yellow(e)} not found.\n`),this.ux.askForConfirmation(`${c.default.green(`Do you want to run ${c.default.yellow(t)} instead?`)} `)}async*listCommandsFiles(e){let t=await l.default.promises.readdir(e,{withFileTypes:!0});for(let n of t){let t=u.default.resolve(e,n.name);if(n.isDirectory())yield*this.listCommandsFiles(u.default.resolve(e,n.name));else{if(!t.endsWith(`.ts`)&&!t.endsWith(`.js`)&&!t.endsWith(`.mjs`)&&!t.endsWith(`.cjs`))continue;yield t}}}},Ee=class{logger;constructor(e){this.logger=e}handle(e){if(we(e))return e.pretty(this.logger),-1;throw e}},De=class extends Z{static command=`help`;static description=c.default.bold(`Show help information about the CLI and its commands`);constructor(e){super(),this.opts=e}async handle(){let e=this.opts.commandRegistry.getCommands().filter(e=>!e.hidden),t=this.opts.cliName??`Bob CLI`,n=this.opts.cliVersion??`0.0.0`,r=(await Promise.resolve().then(()=>require(`../package-supL7Tgp.cjs`)))?.default?.version??`0.0.0`;this.logger.log(`${t} ${c.default.green(n)} (core: ${c.default.yellow(r)})
4
5
 
5
6
  ${c.default.yellow(`Usage`)}:
6
7
  command [options] [arguments]
7
8
 
8
9
  ${c.default.yellow(`Available commands`)}:
9
- `);let i=Math.max(...e.map(e=>e.command.length))??0,a={};for(let t of e){let e=t.group??t.command.split(`:`)[0];a[e]||(a[e]=[]),a[e].push(t)}let o=Object.entries(a).sort(([e],[t])=>e.toLowerCase().localeCompare(t.toLowerCase())).sort(([,e],[,t])=>e.length-t.length);for(let[e,t]of o){let n=t.length>1;n&&this.logger.log(c.default.yellow(`${e}:`));let r=t.sort((e,t)=>e.command.toLowerCase().localeCompare(t.command.toLowerCase()));for(let e of r){let t=A(i-e.command.length);n&&(t=t.slice(2)),this.logger.log(`${n?` `:``}${c.default.green(e.command)} ${t} ${e.description}`)}}}},_e=class{ctx;logger;commandRegistry;exceptionHandler;helpCommand;newCommandRegistry(e){return new Q(e)}newHelpCommand(e){return new ge(e)}newExceptionHandler(e){return new he(e.logger)}constructor(e={}){this.ctx=e.ctx,this.logger=e.logger??new m,this.commandRegistry=this.newCommandRegistry({logger:this.logger}),this.exceptionHandler=this.newExceptionHandler({logger:this.logger}),this.helpCommand=this.newHelpCommand({cliName:e.name,cliVersion:e.version,commandRegistry:this.commandRegistry})}withCommandResolver(e){return this.commandRegistry.withCommandResolver(e),this}withFileImporter(e){return this.commandRegistry.withFileImporter(e),this}async withCommands(...e){for(let t of e)typeof t==`string`?await this.commandRegistry.loadCommandsPath(t):typeof t==`function`?this.registerCommand(t):this.registerCommand(t.constructor)}async runCommand(e,...t){return e?await this.commandRegistry.runCommand(this.ctx??{},e,...t).catch(this.exceptionHandler.handle.bind(this.exceptionHandler)):await this.runHelpCommand()}async runHelpCommand(){return await this.runCommand(this.helpCommand)}registerCommand(e){this.commandRegistry.registerCommand(e)}},$=class e{static parse(t,n={}){let[r,...i]=t.split(/\{(.*?)\}/g).map(e=>e.trim()).filter(Boolean),a={},o={};for(let t of i){let{name:r,isFlag:i,definition:s}=e.parseParamSignature(t,n);i?a[r]=s:o[r]=s}return{command:r,flags:a,args:o}}static parseParamSignature(e,t){let n=e,r=!1,i,a,o,s=!1,c=!1,l=!0;if(n.includes(`:`)){let[e,t]=n.split(`:`);n=e.trim(),i=t.trim()}if(n.includes(`=`)){let[e,t]=n.split(`=`);n=e.trim();let r=t.trim();l=!1,r.length?r===`*`?(c=!0,a=[]):r===`true`?(s=!0,a=!0):r===`false`?(s=!0,a=!1):a=r:a=null}else n.startsWith(`--`)&&(s=!0,l=!1,a=!1);if(n.includes(`|`)){let[e,...t]=n.split(`|`);n=e.trim(),o=t.map(e=>e.trim())}n.startsWith(`--`)&&(r=!0,n=n.slice(2)),n.endsWith(`?`)&&(l=!1,n=n.slice(0,-1)),n.endsWith(`*`)&&(c=!0,l=!0,a=[],n=n.slice(0,-1)),i=i??t[n]??t[`--${n}`];let u,d=r?O:k;return u=s?O.boolean({description:i,alias:o,...a===void 0?{}:{default:a}}):c?d.string({description:i,alias:o,multiple:!0,...l?{required:!0}:{},default:a??[]}):d.string({description:i,alias:o,...l?{required:!0}:{},...a===void 0?{}:{default:a}}),{name:n,isFlag:r,definition:u}}},ve=class extends X{static signature=``;static helperDefinitions={};static get command(){return this.signature.split(/\s/)[0]||``}async run(e){let t=this.constructor;if(t.signature&&!Object.prototype.hasOwnProperty.call(t,`_signatureParsed`)){let e=$.parse(t.signature,t.helperDefinitions),n=Object.prototype.hasOwnProperty.call(t,`flags`)?t.flags:{},r=Object.prototype.hasOwnProperty.call(t,`args`)?t.args:{};t.flags={...e.flags,...n},t.args={...e.args,...r},Object.defineProperty(t,`_signatureParsed`,{value:!0})}return super.run(e)}option(e,t=null){return this.parser.flag(e,t)}argument(e,t=null){return this.parser.argument(e,t)}};exports.Args=k,exports.BadCommandArgument=x,exports.BadCommandFlag=S,exports.BobError=g,exports.Cli=_e,exports.Command=X,exports.CommandNotFoundError=_,exports.CommandParser=T,exports.CommandRegistry=Q,exports.CommandSignatureParser=$,exports.CommandWithSignature=ve,exports.ExceptionHandler=he,exports.Flags=O,exports.HelpCommandFlag=j,exports.InvalidFlag=v,exports.Logger=m,exports.MissingRequiredArgumentValue=y,exports.MissingRequiredFlagValue=b,exports.StringSimilarity=h,exports.TooManyArguments=C,exports.UX=Y,exports.ValidationError=w,exports.askForCheckbox=N,exports.askForConfirmation=P,exports.askForEditor=F,exports.askForExpand=I,exports.askForFileSelector=L,exports.askForInput=R,exports.askForList=z,exports.askForNumber=B,exports.askForPassword=V,exports.askForRawList=H,exports.askForSearch=U,exports.askForSelect=W,exports.askForToggle=G,exports.keyValue=K,exports.newLoader=q,exports.newProgressBar=J,exports.table=pe,exports.withCancelHandling=M;
10
+ `);let i=Math.max(...e.map(e=>{let t=e.aliases.length>0?` (${e.aliases.join(`, `)})`:``;return e.command.length+t.length}))??0,a={};for(let t of e){let e=t.group??t.command.split(`:`)[0];a[e]||(a[e]=[]),a[e].push(t)}let o=Object.entries(a).sort(([e],[t])=>e.toLowerCase().localeCompare(t.toLowerCase())).sort(([,e],[,t])=>e.length-t.length);for(let[e,t]of o){let n=t.length>1;n&&this.logger.log(c.default.yellow(`${e}:`));let r=t.sort((e,t)=>e.command.toLowerCase().localeCompare(t.command.toLowerCase()));for(let e of r){let t=e.aliases.length>0?c.default.gray(` (${e.aliases.join(`, `)})`):``,r=I(i-(e.command.length+(e.aliases.length>0?` (${e.aliases.join(`, `)})`.length:0)));n&&(r=r.slice(2)),this.logger.log(`${n?` `:``}${c.default.green(e.command)}${t} ${r} ${e.description}`)}}}},Oe=class{ctx;logger;commandRegistry;exceptionHandler;helpCommand;newCommandRegistry(e){return new Te(e)}newHelpCommand(e){return new De(e)}newExceptionHandler(e){return new Ee(e.logger)}constructor(e={}){this.ctx=e.ctx,this.logger=e.logger??new m,this.commandRegistry=this.newCommandRegistry({logger:this.logger}),this.exceptionHandler=this.newExceptionHandler({logger:this.logger}),this.helpCommand=this.newHelpCommand({cliName:e.name,cliVersion:e.version,commandRegistry:this.commandRegistry})}withCommandResolver(e){return this.commandRegistry.withCommandResolver(e),this}withFileImporter(e){return this.commandRegistry.withFileImporter(e),this}async withCommands(...e){for(let t of e)typeof t==`string`?await this.commandRegistry.loadCommandsPath(t):typeof t==`function`?this.registerCommand(t):this.registerCommand(t.constructor)}async runCommand(e,...t){return e?await this.commandRegistry.runCommand(this.ctx??{},e,...t).catch(this.exceptionHandler.handle.bind(this.exceptionHandler)):await this.runHelpCommand()}async runHelpCommand(){return await this.runCommand(this.helpCommand)}registerCommand(e){this.commandRegistry.registerCommand(e)}},$=class e{static parse(t,n={}){let[r,...i]=t.split(/\{(.*?)\}/g).map(e=>e.trim()).filter(Boolean),a={},o={};for(let t of i){let r=e.parseParamSignature(t,n);r.isFlag?a[r.name]=r.definition:o[r.name]=r.definition}return{command:r,flags:a,args:o}}static parseParamSignature(e,t){let n=e,r=!1,i,a,o,s=!1,c=!1,l=!0;if(n.includes(`:`)){let[e,t]=n.split(`:`);n=e.trim(),i=t.trim()}if(n.includes(`=`)){let[e,t]=n.split(`=`);n=e.trim();let r=t.trim();l=!1,r.length?r===`*`?(c=!0,a=[]):r===`true`?(s=!0,a=!0):r===`false`?(s=!0,a=!1):a=r:a=null}else n.startsWith(`--`)&&(s=!0,l=!1,a=!1);if(n.includes(`|`)){let[e,...t]=n.split(`|`);n=e.trim(),o=t.map(e=>e.trim())}n.startsWith(`--`)&&(r=!0,n=n.slice(2)),n.endsWith(`?`)&&(l=!1,n=n.slice(0,-1)),n.endsWith(`*`)&&(c=!0,a=[],n=n.slice(0,-1)),i=i??t[n]??t[`--${n}`];let u;return u=r?s?F.boolean({description:i,alias:o,...a===void 0?{}:{default:a}}):c?F.string({description:i,alias:o,multiple:!0,...l?{required:!0}:{},default:a??[]}):F.string({description:i,alias:o,...l?{required:!0}:{},...a===void 0?{}:{default:a}}):c?P.string({description:i,multiple:!0,...l?{required:!0}:{},default:a??[]}):P.string({description:i,...l?{required:!0}:{},...a===void 0?{}:{default:a}}),{name:n,isFlag:r,definition:u}}},ke=class extends Z{static signature=``;static helperDefinitions={};static get command(){return this.signature.split(/\s/)[0]||``}async run(e){let t=this.constructor;if(t.signature&&!Object.prototype.hasOwnProperty.call(t,`_signatureParsed`)){let e=$.parse(t.signature,t.helperDefinitions),n=Object.prototype.hasOwnProperty.call(t,`flags`)?t.flags:{},r=Object.prototype.hasOwnProperty.call(t,`args`)?t.args:{};t.flags={...e.flags,...n},t.args={...e.args,...r},Object.defineProperty(t,`_signatureParsed`,{value:!0})}return super.run(e)}option(e,t=null){return this.parser.flag(e,t)}argument(e,t=null){return this.parser.argument(e,t)}};exports.Args=P,exports.BadCommandArgument=b,exports.BadCommandFlag=x,exports.BobError=h,exports.Cli=Oe,exports.Command=Z,exports.CommandNotFoundError=g,exports.CommandParser=C,exports.CommandRegistry=Te,exports.CommandSignatureParser=$,exports.CommandWithSignature=ke,exports.ExceptionHandler=Ee,exports.Flags=F,exports.HelpCommandFlag=L,exports.InvalidFlag=_,exports.Logger=m,exports.MissingRequiredArgumentValue=v,exports.MissingRequiredFlagValue=y,exports.StringSimilarity=ee,exports.TooManyArguments=te,exports.UX=X,exports.ValidationError=S,exports.askForCheckbox=z,exports.askForConfirmation=B,exports.askForEditor=ve,exports.askForExpand=V,exports.askForFileSelector=H,exports.askForInput=U,exports.askForList=W,exports.askForNumber=G,exports.askForPassword=K,exports.askForRawList=q,exports.askForSearch=J,exports.askForSelect=ye,exports.askForToggle=be,exports.keyValue=xe,exports.newLoader=Se,exports.newProgressBar=Ce,exports.table=Y,exports.withCancelHandling=R;