bob-core 3.0.0-alpha.3 → 3.0.0-alpha.5

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 (88) hide show
  1. package/dist/cjs/package-DOYmkuEV.cjs +1 -0
  2. package/dist/cjs/src/Command.d.ts +6 -5
  3. package/dist/cjs/src/CommandParser.d.ts +10 -10
  4. package/dist/cjs/src/CommandRegistry.d.ts +3 -3
  5. package/dist/cjs/src/CommandWithSignature.d.ts +6 -4
  6. package/dist/cjs/src/errors/ValidationError.d.ts +3 -0
  7. package/dist/cjs/src/errors/index.d.ts +1 -0
  8. package/dist/cjs/src/flags/boolean.d.ts +2 -0
  9. package/dist/cjs/src/flags/custom.d.ts +2 -0
  10. package/dist/cjs/src/flags/directory.d.ts +2 -0
  11. package/dist/cjs/src/flags/enum.d.ts +4 -0
  12. package/dist/cjs/src/flags/file.d.ts +2 -0
  13. package/dist/cjs/src/flags/helpers.d.ts +25 -0
  14. package/dist/cjs/src/flags/index.d.ts +28 -0
  15. package/dist/cjs/src/flags/number.d.ts +2 -0
  16. package/dist/cjs/src/flags/string.d.ts +2 -0
  17. package/dist/cjs/src/flags/url.d.ts +2 -0
  18. package/dist/cjs/src/index.d.ts +6 -6
  19. package/dist/cjs/src/index.js +48 -5
  20. package/dist/cjs/src/lib/helpers.d.ts +0 -1
  21. package/dist/cjs/src/lib/types.d.ts +8 -3
  22. package/dist/cjs/src/ux/askForCheckbox.d.ts +20 -0
  23. package/dist/cjs/src/ux/askForConfirmation.d.ts +5 -0
  24. package/dist/cjs/src/ux/askForEditor.d.ts +7 -0
  25. package/dist/cjs/src/ux/askForExpand.d.ts +9 -0
  26. package/dist/cjs/src/ux/askForFileSelector.d.ts +12 -0
  27. package/dist/cjs/src/ux/askForInput.d.ts +9 -0
  28. package/dist/cjs/src/ux/askForList.d.ts +6 -0
  29. package/dist/cjs/src/ux/askForNumber.d.ts +9 -0
  30. package/dist/cjs/src/ux/askForPassword.d.ts +5 -0
  31. package/dist/cjs/src/ux/askForRawList.d.ts +8 -0
  32. package/dist/cjs/src/ux/askForSearch.d.ts +9 -0
  33. package/dist/cjs/src/ux/askForSelect.d.ts +7 -0
  34. package/dist/cjs/src/ux/askForToggle.d.ts +6 -0
  35. package/dist/cjs/src/ux/helpers.d.ts +1 -0
  36. package/dist/cjs/src/ux/index.d.ts +86 -0
  37. package/dist/cjs/src/ux/keyValue.d.ts +2 -0
  38. package/dist/cjs/src/ux/loader.d.ts +6 -0
  39. package/dist/cjs/src/ux/progressBar.d.ts +8 -0
  40. package/dist/cjs/src/ux/table.d.ts +2 -0
  41. package/dist/cjs/src/ux/types.d.ts +24 -0
  42. package/dist/esm/{package-DEXUmuu7.js → package-C8P0aq1p.js} +4 -4
  43. package/dist/esm/src/Command.d.ts +6 -5
  44. package/dist/esm/src/CommandParser.d.ts +10 -10
  45. package/dist/esm/src/CommandRegistry.d.ts +3 -3
  46. package/dist/esm/src/CommandWithSignature.d.ts +6 -4
  47. package/dist/esm/src/errors/ValidationError.d.ts +3 -0
  48. package/dist/esm/src/errors/index.d.ts +1 -0
  49. package/dist/esm/src/flags/boolean.d.ts +2 -0
  50. package/dist/esm/src/flags/custom.d.ts +2 -0
  51. package/dist/esm/src/flags/directory.d.ts +2 -0
  52. package/dist/esm/src/flags/enum.d.ts +4 -0
  53. package/dist/esm/src/flags/file.d.ts +2 -0
  54. package/dist/esm/src/flags/helpers.d.ts +25 -0
  55. package/dist/esm/src/flags/index.d.ts +28 -0
  56. package/dist/esm/src/flags/number.d.ts +2 -0
  57. package/dist/esm/src/flags/string.d.ts +2 -0
  58. package/dist/esm/src/flags/url.d.ts +2 -0
  59. package/dist/esm/src/index.d.ts +6 -6
  60. package/dist/esm/src/index.js +12504 -536
  61. package/dist/esm/src/lib/helpers.d.ts +0 -1
  62. package/dist/esm/src/lib/types.d.ts +8 -3
  63. package/dist/esm/src/ux/askForCheckbox.d.ts +20 -0
  64. package/dist/esm/src/ux/askForConfirmation.d.ts +5 -0
  65. package/dist/esm/src/ux/askForEditor.d.ts +7 -0
  66. package/dist/esm/src/ux/askForExpand.d.ts +9 -0
  67. package/dist/esm/src/ux/askForFileSelector.d.ts +12 -0
  68. package/dist/esm/src/ux/askForInput.d.ts +9 -0
  69. package/dist/esm/src/ux/askForList.d.ts +6 -0
  70. package/dist/esm/src/ux/askForNumber.d.ts +9 -0
  71. package/dist/esm/src/ux/askForPassword.d.ts +5 -0
  72. package/dist/esm/src/ux/askForRawList.d.ts +8 -0
  73. package/dist/esm/src/ux/askForSearch.d.ts +9 -0
  74. package/dist/esm/src/ux/askForSelect.d.ts +7 -0
  75. package/dist/esm/src/ux/askForToggle.d.ts +6 -0
  76. package/dist/esm/src/ux/helpers.d.ts +1 -0
  77. package/dist/esm/src/ux/index.d.ts +86 -0
  78. package/dist/esm/src/ux/keyValue.d.ts +2 -0
  79. package/dist/esm/src/ux/loader.d.ts +6 -0
  80. package/dist/esm/src/ux/progressBar.d.ts +8 -0
  81. package/dist/esm/src/ux/table.d.ts +2 -0
  82. package/dist/esm/src/ux/types.d.ts +24 -0
  83. package/package.json +7 -5
  84. package/dist/cjs/package-D6-YkvLr.cjs +0 -1
  85. package/dist/cjs/src/CommandIO.d.ts +0 -58
  86. package/dist/cjs/src/Flags.d.ts +0 -25
  87. package/dist/esm/src/CommandIO.d.ts +0 -58
  88. package/dist/esm/src/Flags.d.ts +0 -25
@@ -0,0 +1 @@
1
+ require(`./src/index.js`);var e={name:`bob-core`,version:`3.0.0-alpha.5`,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
- import { CommandIO, CommandIOOptions } from './CommandIO.js';
2
1
  import { CommandParser } from './CommandParser.js';
3
2
  import { Logger } from './Logger.js';
3
+ import { UX } from './ux/index.js';
4
4
  import { ArgumentsSchema, ContextDefinition, FlagsSchema, Parsed } from './lib/types.js';
5
5
  export type CommandRunExample = {
6
6
  description: string;
@@ -16,7 +16,7 @@ export type CommandRunOption<C = ContextDefinition> = {
16
16
  flags: Record<string, any>;
17
17
  });
18
18
  export declare abstract class Command<C extends ContextDefinition = ContextDefinition> {
19
- $type: "BobCommand";
19
+ static $type: "BobCommand";
20
20
  static command: string;
21
21
  static description: string;
22
22
  static group?: string;
@@ -29,7 +29,8 @@ export declare abstract class Command<C extends ContextDefinition = ContextDefin
29
29
  static allowUnknownFlags: boolean;
30
30
  static strictMode: boolean;
31
31
  protected ctx: C;
32
- protected io: CommandIO;
32
+ protected logger: Logger;
33
+ protected ux: UX;
33
34
  protected parser: CommandParser<FlagsSchema, FlagsSchema>;
34
35
  protected preHandle?(): Promise<void | number>;
35
36
  protected abstract handle(ctx: C, parsed: Parsed<any>): Promise<number | void> | number | void;
@@ -38,8 +39,8 @@ export declare abstract class Command<C extends ContextDefinition = ContextDefin
38
39
  flags: FlagsSchema;
39
40
  args: ArgumentsSchema;
40
41
  ctx: ContextDefinition;
41
- io: CommandIO;
42
+ ux: UX;
42
43
  }): CommandParser<FlagsSchema, FlagsSchema>;
43
- protected newCommandIO(opts: CommandIOOptions): CommandIO;
44
+ protected newUX(): UX;
44
45
  run(runOpts: CommandRunOption<C>): Promise<number | void>;
45
46
  }
@@ -1,4 +1,4 @@
1
- import { CommandIO } from './CommandIO.js';
1
+ import { UX } from './ux/index.js';
2
2
  import { ArgumentsSchema, ContextDefinition, FlagDefinition, FlagReturnType, FlagsObject, FlagsSchema } from './lib/types.js';
3
3
  /**
4
4
  * Parses command-line arguments into typed flags and arguments
@@ -9,13 +9,13 @@ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends
9
9
  flags: Flags;
10
10
  args: Arguments;
11
11
  ctx?: ContextDefinition;
12
- io: CommandIO;
12
+ ux: UX;
13
13
  };
14
14
  protected flags: FlagsSchema;
15
15
  protected parsedFlags: FlagsObject<Flags> | null;
16
16
  protected args: ArgumentsSchema;
17
17
  protected parsedArguments: FlagsObject<Arguments> | null;
18
- protected io: CommandIO;
18
+ protected ux: UX;
19
19
  protected shouldPromptForMissingFlags: boolean;
20
20
  protected shouldValidateUnknownFlags: boolean;
21
21
  protected shouldRejectExtraArguments: boolean;
@@ -23,7 +23,7 @@ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends
23
23
  flags: Flags;
24
24
  args: Arguments;
25
25
  ctx?: ContextDefinition;
26
- io: CommandIO;
26
+ ux: UX;
27
27
  });
28
28
  /**
29
29
  * Parses raw command-line arguments into structured flags and arguments
@@ -96,11 +96,11 @@ export declare class CommandParser<Flags extends FlagsSchema, Arguments extends
96
96
  allowUnknownFlags(): this;
97
97
  strictMode(): this;
98
98
  /**
99
- * Prompts the user to provide a missing argument value via CommandIO
100
- * Used by validate() when shouldPromptForMissingArgs is enabled
101
- * @param argumentName - The name of the missing argument
102
- * @param definition - The argument's definition for type and description
103
- * @returns The user-provided value, or null if none given
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
104
104
  */
105
- protected promptForArgument(argumentName: string, definition: FlagDefinition): Promise<string | number | string[] | null>;
105
+ protected promptForArgument(name: string, definition: FlagDefinition): Promise<string | number | string[] | boolean | null>;
106
106
  }
@@ -1,20 +1,20 @@
1
1
  import { Command } from './Command.js';
2
- import { CommandIO, CommandIOOptions } from './CommandIO.js';
3
2
  import { Logger } from './Logger.js';
4
3
  import { StringSimilarity } from './StringSimilarity.js';
4
+ import { UX } from './ux/index.js';
5
5
  import { ContextDefinition } from './lib/types.js';
6
6
  export type CommandResolver = (path: string) => Promise<typeof Command | null>;
7
7
  export type FileImporter = (filePath: string) => Promise<unknown>;
8
8
  export type CommandRegistryOptions = {
9
9
  logger?: Logger;
10
+ ux?: UX;
10
11
  stringSimilarity?: StringSimilarity;
11
12
  };
12
13
  export declare class CommandRegistry {
13
14
  private readonly commands;
14
- protected readonly io: CommandIO;
15
+ protected readonly ux: UX;
15
16
  protected readonly logger: Logger;
16
17
  private readonly stringSimilarity;
17
- protected newCommandIO(opts: CommandIOOptions): CommandIO;
18
18
  constructor(opts?: CommandRegistryOptions);
19
19
  getAvailableCommands(): string[];
20
20
  getCommands(): Array<typeof Command>;
@@ -11,12 +11,14 @@ export declare abstract class CommandWithSignature<C extends ContextDefinition =
11
11
  static helperDefinitions: Record<string, string>;
12
12
  static get command(): string;
13
13
  run(runOpts: CommandRunOption<C>): Promise<number | void>;
14
+ /**
15
+ * Convenience accessor for a parsed option value.
16
+ */
14
17
  protected option<T = string>(key: string): T | null;
15
18
  protected option<T = string>(key: string, defaultValue: T): NoInfer<T>;
19
+ /**
20
+ * Convenience accessor for a parsed argument value.
21
+ */
16
22
  protected argument<T = string>(key: string): T | null;
17
23
  protected argument<T = string>(key: string, defaultValue: T): NoInfer<T>;
18
- askForConfirmation(...opts: Parameters<typeof this.io.askForConfirmation>): ReturnType<typeof this.io.askForConfirmation>;
19
- askForInput(...opts: Parameters<typeof this.io.askForInput>): ReturnType<typeof this.io.askForInput>;
20
- askForSelect(...opts: Parameters<typeof this.io.askForSelect>): ReturnType<typeof this.io.askForSelect>;
21
- newLoader(...opts: Parameters<typeof this.io.newLoader>): ReturnType<typeof this.io.newLoader>;
22
24
  }
@@ -0,0 +1,3 @@
1
+ export declare class ValidationError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -6,3 +6,4 @@ export * from './CommandNotFoundError.js';
6
6
  export * from './MissingRequiredArgumentValue.js';
7
7
  export * from './MissingRequiredFlagValue.js';
8
8
  export * from './TooManyArguments.js';
9
+ export * from './ValidationError.js';
@@ -0,0 +1,2 @@
1
+ import { BooleanFlagDef, FlagInput } from '../lib/types.js';
2
+ export declare function booleanFlag<const T extends FlagInput<BooleanFlagDef>>(opts?: T): BooleanFlagDef & T;
@@ -0,0 +1,2 @@
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;
@@ -0,0 +1,2 @@
1
+ import { DirectoryFlagDef, FlagInput } from '../lib/types.js';
2
+ export declare function directoryFlag<const T extends FlagInput<DirectoryFlagDef>>(opts?: T): DirectoryFlagDef & T;
@@ -0,0 +1,4 @@
1
+ import { EnumFlagDef, FlagInput } from '../lib/types.js';
2
+ export declare function enumFlag<const T extends readonly string[], const U extends FlagInput<EnumFlagDef<T>, 'options'>>(opts: {
3
+ options: T;
4
+ } & U): EnumFlagDef<T> & U;
@@ -0,0 +1,2 @@
1
+ import { FileFlagDef, FlagInput } from '../lib/types.js';
2
+ export declare function fileFlag<const T extends FlagInput<FileFlagDef>>(opts?: T): FileFlagDef & T;
@@ -0,0 +1,25 @@
1
+ import { FlagAskContext, FlagDefinition } from '../lib/types.js';
2
+ /**
3
+ * Generates a standard prompt message for a missing required flag/argument
4
+ */
5
+ 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>;
@@ -0,0 +1,28 @@
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';
9
+ 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;
28
+ };
@@ -0,0 +1,2 @@
1
+ import { FlagInput, NumberFlagDef } from '../lib/types.js';
2
+ export declare function numberFlag<const T extends FlagInput<NumberFlagDef>>(opts?: T): NumberFlagDef & T;
@@ -0,0 +1,2 @@
1
+ import { FlagInput, StringFlagDef } from '../lib/types.js';
2
+ export declare function stringFlag<const T extends FlagInput<StringFlagDef>>(opts?: T): StringFlagDef & T;
@@ -0,0 +1,2 @@
1
+ import { FlagInput, UrlFlagDef } from '../lib/types.js';
2
+ export declare function urlFlag<const T extends FlagInput<UrlFlagDef>>(opts?: T): UrlFlagDef & T;
@@ -1,15 +1,15 @@
1
+ export * from './Cli.js';
1
2
  export * from './Command.js';
2
- export * from './CommandIO.js';
3
3
  export * from './CommandParser.js';
4
4
  export * from './CommandRegistry.js';
5
5
  export * from './CommandSignatureParser.js';
6
6
  export * from './CommandWithSignature.js';
7
- export * from './Cli.js';
8
- export * from './Logger.js';
9
7
  export * from './ExceptionHandler.js';
8
+ export * from './Logger.js';
10
9
  export * from './StringSimilarity.js';
11
- export * from './lib/types.js';
12
- export * from './Flags.js';
10
+ export * from './contracts/index.js';
13
11
  export * from './errors/index.js';
12
+ export * from './flags/index.js';
13
+ export * from './lib/types.js';
14
14
  export * from './options/index.js';
15
- export * from './contracts/index.js';
15
+ export * from './ux/index.js';