bob-core 1.4.0 → 2.0.0-beta.2

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 (66) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/index.js +4 -4
  3. package/dist/cjs/package-88kG_8yl.cjs +1 -0
  4. package/dist/cjs/src/Cli.d.ts +17 -10
  5. package/dist/cjs/src/Command.d.ts +47 -34
  6. package/dist/cjs/src/CommandIO.d.ts +12 -0
  7. package/dist/cjs/src/CommandParser.d.ts +76 -44
  8. package/dist/cjs/src/CommandRegistry.d.ts +7 -6
  9. package/dist/cjs/src/CommandSignatureParser.d.ts +85 -0
  10. package/dist/cjs/src/CommandWithSignature.d.ts +37 -0
  11. package/dist/cjs/src/ExceptionHandler.d.ts +3 -0
  12. package/dist/cjs/src/Logger.d.ts +17 -0
  13. package/dist/cjs/src/commands/HelpCommand.d.ts +2 -4
  14. package/dist/cjs/src/contracts/CommandOption.d.ts +3 -4
  15. package/dist/cjs/src/contracts/LoggerContract.d.ts +14 -0
  16. package/dist/cjs/src/contracts/index.d.ts +1 -0
  17. package/dist/cjs/src/errors/BadCommandOption.d.ts +1 -1
  18. package/dist/cjs/src/errors/BadCommandParameter.d.ts +1 -1
  19. package/dist/cjs/src/errors/BobError.d.ts +2 -1
  20. package/dist/cjs/src/errors/CommandNotFoundError.d.ts +1 -1
  21. package/dist/cjs/src/errors/InvalidOption.d.ts +4 -4
  22. package/dist/cjs/src/errors/MissingRequiredArgumentValue.d.ts +3 -4
  23. package/dist/cjs/src/errors/MissingRequiredOptionValue.d.ts +6 -0
  24. package/dist/cjs/src/errors/MissingSignatureArgument.d.ts +4 -4
  25. package/dist/cjs/src/errors/MissingSignatureOption.d.ts +4 -4
  26. package/dist/cjs/src/errors/index.d.ts +6 -0
  27. package/dist/cjs/src/index.d.ts +7 -1
  28. package/dist/cjs/src/lib/optionHelpers.d.ts +5 -0
  29. package/dist/cjs/src/lib/types.d.ts +29 -0
  30. package/dist/cjs/src/lib/valueConverter.d.ts +10 -0
  31. package/dist/cjs/src/options/HelpOption.d.ts +4 -2
  32. package/dist/cjs/src/testFixtures.d.ts +11 -0
  33. package/dist/esm/index.js +819 -367
  34. package/dist/esm/package-COKp1myj.js +31 -0
  35. package/dist/esm/src/Cli.d.ts +17 -10
  36. package/dist/esm/src/Command.d.ts +47 -34
  37. package/dist/esm/src/CommandIO.d.ts +12 -0
  38. package/dist/esm/src/CommandParser.d.ts +76 -44
  39. package/dist/esm/src/CommandRegistry.d.ts +7 -6
  40. package/dist/esm/src/CommandSignatureParser.d.ts +85 -0
  41. package/dist/esm/src/CommandWithSignature.d.ts +37 -0
  42. package/dist/esm/src/ExceptionHandler.d.ts +3 -0
  43. package/dist/esm/src/Logger.d.ts +17 -0
  44. package/dist/esm/src/commands/HelpCommand.d.ts +2 -4
  45. package/dist/esm/src/contracts/CommandOption.d.ts +3 -4
  46. package/dist/esm/src/contracts/LoggerContract.d.ts +14 -0
  47. package/dist/esm/src/contracts/index.d.ts +1 -0
  48. package/dist/esm/src/errors/BadCommandOption.d.ts +1 -1
  49. package/dist/esm/src/errors/BadCommandParameter.d.ts +1 -1
  50. package/dist/esm/src/errors/BobError.d.ts +2 -1
  51. package/dist/esm/src/errors/CommandNotFoundError.d.ts +1 -1
  52. package/dist/esm/src/errors/InvalidOption.d.ts +4 -4
  53. package/dist/esm/src/errors/MissingRequiredArgumentValue.d.ts +3 -4
  54. package/dist/esm/src/errors/MissingRequiredOptionValue.d.ts +6 -0
  55. package/dist/esm/src/errors/MissingSignatureArgument.d.ts +4 -4
  56. package/dist/esm/src/errors/MissingSignatureOption.d.ts +4 -4
  57. package/dist/esm/src/errors/index.d.ts +6 -0
  58. package/dist/esm/src/index.d.ts +7 -1
  59. package/dist/esm/src/lib/optionHelpers.d.ts +5 -0
  60. package/dist/esm/src/lib/types.d.ts +29 -0
  61. package/dist/esm/src/lib/valueConverter.d.ts +10 -0
  62. package/dist/esm/src/options/HelpOption.d.ts +4 -2
  63. package/dist/esm/src/testFixtures.d.ts +11 -0
  64. package/package.json +5 -1
  65. package/dist/cjs/package-6sByjm31.cjs +0 -1
  66. package/dist/esm/package-eljsfLkU.js +0 -31
@@ -0,0 +1,31 @@
1
+ const s = "bob-core", t = "2.0.0-beta.2", e = "BOB Core", i = "module", l = !1, n = ["dist/**"], r = { ".": { import: "./dist/esm/index.js", require: "./dist/cjs/index.js" } }, o = { "*": { "*": ["./dist/cjs/*.d.ts"] } }, c = { start: "node -r @swc-node/register debug/main.ts", build: "rimraf ./dist && vite build", typecheck: "tsc --noEmit", prepare: "npm run build", test: "vitest run" }, d = "Léo Hubert", p = "ISC", a = { "@faker-js/faker": "^10.0.0", "@swc-node/register": "^1.11.1", "@types/minimist": "^1.2.5", "@types/node": "^20.14.5", "@types/prompts": "^2.4.9", "@types/string-similarity": "^4.0.2", "@vitest/coverage-v8": "^3.2.4", rimraf: "^6.0.1", tsx: "^4.20.6", typescript: "^5.7.3", vite: "^7.1.6", "vite-plugin-dts": "^4.5.4", vitest: "^3.2.4" }, m = { chalk: "^4.1.2", minimist: "^1.2.8", prompts: "^2.4.2", "string-similarity": "^4.0.4" }, u = {
2
+ name: s,
3
+ version: t,
4
+ description: e,
5
+ type: i,
6
+ sideEffects: !1,
7
+ files: n,
8
+ exports: r,
9
+ typesVersions: o,
10
+ scripts: c,
11
+ author: d,
12
+ license: p,
13
+ devDependencies: a,
14
+ dependencies: m
15
+ };
16
+ export {
17
+ d as author,
18
+ u as default,
19
+ m as dependencies,
20
+ e as description,
21
+ a as devDependencies,
22
+ r as exports,
23
+ n as files,
24
+ p as license,
25
+ s as name,
26
+ c as scripts,
27
+ l as sideEffects,
28
+ i as type,
29
+ o as typesVersions,
30
+ t as version
31
+ };
@@ -1,26 +1,33 @@
1
1
  import { CommandRegistry } from './CommandRegistry.js';
2
- import { Command } from './Command.js';
3
- import { default as HelpCommand } from './commands/HelpCommand.js';
2
+ import { default as HelpCommand, HelpCommandOptions } from './commands/HelpCommand.js';
4
3
  import { ExceptionHandler } from './ExceptionHandler.js';
5
- export type CliOptions<C> = {
4
+ import { Command } from './Command.js';
5
+ import { Logger } from './Logger.js';
6
+ export type CliOptions<C = any> = {
6
7
  ctx?: C;
7
8
  name?: string;
8
9
  version?: string;
10
+ logger?: Logger;
9
11
  };
10
- export declare class Cli<C> {
12
+ export declare class Cli<C = any> {
13
+ private readonly ctx?;
14
+ private readonly logger;
11
15
  readonly commandRegistry: CommandRegistry;
12
16
  private readonly exceptionHandler;
13
- private readonly ctx?;
14
17
  private readonly helpCommand;
15
- get CommandRegistryClass(): typeof CommandRegistry;
16
- get HelpCommandClass(): typeof HelpCommand;
17
- get ExceptionHandlerClass(): typeof ExceptionHandler;
18
+ protected newCommandRegistry(opts: {
19
+ logger: Logger;
20
+ }): CommandRegistry;
21
+ protected newHelpCommand(opts: HelpCommandOptions): HelpCommand;
22
+ protected newExceptionHandler(opts: {
23
+ logger: Logger;
24
+ }): ExceptionHandler;
18
25
  constructor(opts?: CliOptions<C>);
19
26
  setCommandResolver(resolver: (path: string) => Promise<Command<C>>): void;
20
- withCommands(...commands: Array<Command<C> | {
27
+ withCommands(...commands: Array<Command<C, any, any> | {
21
28
  new (): Command<C>;
22
29
  } | string>): Promise<void>;
23
- runCommand(command: string | Command, ...args: any[]): Promise<number>;
30
+ runCommand(command: string | Command | undefined, ...args: any[]): Promise<number>;
24
31
  runHelpCommand(): Promise<number>;
25
32
  protected registerCommand(command: Command<C>): void;
26
33
  }
@@ -1,45 +1,58 @@
1
+ import { OptionsSchema, OptionsObject, ArgumentsSchema, ArgumentsObject } from './lib/types.js';
1
2
  import { CommandParser } from './CommandParser.js';
3
+ import { CommandSignatureParser } from './CommandSignatureParser.js';
2
4
  import { CommandOption } from './contracts/index.js';
3
5
  import { CommandIO } from './CommandIO.js';
6
+ import { Logger } from './Logger.js';
7
+ export type CommandHandlerOptions<Options extends OptionsSchema, Arguments extends ArgumentsSchema> = {
8
+ options: OptionsObject<Options>;
9
+ arguments: ArgumentsObject<Arguments>;
10
+ };
11
+ export type CommandHandler<C, Options extends OptionsSchema, Arguments extends ArgumentsSchema> = (ctx: C, opts: CommandHandlerOptions<Options, Arguments>) => Promise<number | void> | number | void;
12
+ type BaseCommandRunOption<C> = {
13
+ logger: Logger;
14
+ ctx: C;
15
+ };
16
+ export type CommandRunArgsOption<C> = {
17
+ args: string[];
18
+ } & BaseCommandRunOption<C>;
19
+ export type CommandRunParsedOption<C, Options extends OptionsSchema, Arguments extends ArgumentsSchema> = {
20
+ options: OptionsObject<Options>;
21
+ arguments: ArgumentsObject<Arguments>;
22
+ } & BaseCommandRunOption<C>;
23
+ export type CommandRunOption<C, Options extends OptionsSchema, Arguments extends ArgumentsSchema> = CommandRunArgsOption<C> | CommandRunParsedOption<C, Options, Arguments>;
4
24
  export type CommandExample = {
5
25
  description: string;
6
26
  command: string;
7
27
  };
8
- export declare abstract class Command<C = any> {
9
- abstract signature: string;
10
- abstract description: string;
11
- protected ctx: C;
12
- protected helperDefinitions: {
13
- [key: string]: string;
14
- };
28
+ export declare class Command<C = any, Options extends OptionsSchema = {}, Arguments extends ArgumentsSchema = {}> {
29
+ readonly _command: string;
30
+ readonly description: string;
15
31
  protected commandsExamples: CommandExample[];
16
- protected parser: CommandParser;
32
+ get command(): string;
33
+ protected ctx: C;
17
34
  protected io: CommandIO;
18
- protected abstract handle(): Promise<void | number>;
35
+ protected logger: Logger;
36
+ protected _handler?: CommandHandler<C, Options, Arguments>;
37
+ protected parser: CommandParser<Options, Arguments>;
38
+ private tmp?;
39
+ protected defaultOptions(): CommandOption<Command<any, any, any>>[];
40
+ protected newCommandParser(opts: {
41
+ io: CommandIO;
42
+ options: Options;
43
+ arguments: Arguments;
44
+ }): CommandParser<Options, Arguments> | CommandSignatureParser;
45
+ protected newCommandIO(opts: {
46
+ logger: Logger;
47
+ }): CommandIO;
48
+ constructor(command: string, opts?: {
49
+ description?: string;
50
+ });
19
51
  protected preHandle?(): Promise<void | number>;
20
- protected get CommandParserClass(): typeof CommandParser;
21
- protected get CommandIOClass(): typeof CommandIO;
22
- protected defaultOptions(): CommandOption<Command<C>>[];
23
- get command(): string;
24
- run(ctx: C, ...args: any[]): Promise<number>;
25
- protected setOption(name: string, value: any): void;
26
- protected setArgument(name: string, value: any): void;
27
- protected option<T = string>(key: string): T | null;
28
- protected option<T = string>(key: string, defaultValue: T): NoInfer<T>;
29
- protected optionBoolean(key: string, defaultValue?: boolean): boolean;
30
- protected optionArray<T = string>(key: string, defaultValue?: Array<T>): Array<NoInfer<T>>;
31
- protected optionNumber(key: string): number | null;
32
- protected optionNumber(key: string, defaultValue: number): number;
33
- protected argument<T = string>(key: string): T | null;
34
- protected argument<T = string>(key: string, defaultValue: T): NoInfer<T>;
35
- protected argumentArray<T = string>(key: string, defaultValue?: Array<any>): Array<T>;
36
- protected argumentBoolean(key: string, defaultValue?: boolean): boolean;
37
- protected argumentNumber(key: string, defaultValue?: number | null): number | null;
38
- /**
39
- * Prompt utils
40
- */
41
- askForConfirmation(...opts: Parameters<typeof this.io.askForConfirmation>): ReturnType<typeof this.io.askForConfirmation>;
42
- askForInput(...opts: Parameters<typeof this.io.askForInput>): ReturnType<typeof this.io.askForInput>;
43
- askForSelect(...opts: Parameters<typeof this.io.askForSelect>): ReturnType<typeof this.io.askForSelect>;
44
- newLoader(...opts: Parameters<typeof this.io.newLoader>): ReturnType<typeof this.io.newLoader>;
52
+ protected handle?(ctx: C, opts: CommandHandlerOptions<Options, Arguments>): Promise<number | void> | number | void;
53
+ handler(handler: CommandHandler<C, Options, Arguments>): Command<C, Options, Arguments>;
54
+ options<Opts extends OptionsSchema>(opts: Opts): Command<C, Options & Opts, Arguments>;
55
+ arguments<Args extends ArgumentsSchema>(args: Args): Command<C, Options, Arguments & Args>;
56
+ run(opts: CommandRunOption<C, Options, Arguments>): Promise<number | void>;
45
57
  }
58
+ export {};
@@ -1,3 +1,4 @@
1
+ import { Logger } from './Logger.js';
1
2
  export type SelectOption = {
2
3
  title: string;
3
4
  value?: any;
@@ -6,6 +7,17 @@ export type SelectOption = {
6
7
  description?: string | undefined;
7
8
  };
8
9
  export declare class CommandIO {
10
+ private logger;
11
+ constructor(logger: Logger);
12
+ /**
13
+ * Logger methods
14
+ */
15
+ log(...args: any[]): void;
16
+ info(...args: any[]): void;
17
+ warn(...args: any[]): void;
18
+ error(...args: any[]): void;
19
+ debug(...args: any[]): void;
20
+ verbose(...args: any[]): void;
9
21
  /**
10
22
  * Prompt utils
11
23
  */
@@ -1,48 +1,80 @@
1
- import { CommandOption } from './contracts/index.js';
1
+ import { OptionsSchema, OptionReturnType, OptionsObject } from './lib/types.js';
2
+ import { OptionDetails } from './lib/optionHelpers.js';
2
3
  import { CommandIO } from './CommandIO.js';
3
- export type ArgSignature = {
4
- name: string;
5
- type: 'string' | 'boolean' | 'array';
6
- optional?: boolean;
7
- variadic?: boolean;
8
- alias?: string[];
9
- help?: string;
10
- defaultValue: string | boolean | Array<string> | null;
11
- isOption?: boolean;
12
- };
13
- export declare class CommandParser {
14
- protected readonly io: CommandIO;
15
- protected readonly signature: string;
16
- protected readonly helperDefinitions: {
17
- [key: string]: string;
4
+ /**
5
+ * Parses command-line arguments into typed options and arguments
6
+ * Handles validation, type conversion, and default values
7
+ */
8
+ export declare class CommandParser<Options extends OptionsSchema, Arguments extends OptionsSchema> {
9
+ protected options: Options;
10
+ protected parsedOptions: OptionsObject<Options> | null;
11
+ protected arguments: Arguments;
12
+ protected parsedArguments: OptionsObject<Arguments> | null;
13
+ protected io: CommandIO;
14
+ constructor(opts: {
15
+ io: CommandIO;
16
+ options: Options;
17
+ arguments: Arguments;
18
+ });
19
+ /**
20
+ * Parses raw command-line arguments into structured options and arguments
21
+ * @param args - Raw command line arguments (typically from process.argv.slice(2))
22
+ * @returns Object containing parsed options and arguments
23
+ * @throws {InvalidOption} If an unknown option is provided
24
+ * @throws {BadCommandOption} If a value cannot be converted to the expected type
25
+ */
26
+ init(args: string[]): {
27
+ options: OptionsObject<Options>;
28
+ arguments: OptionsObject<Arguments>;
18
29
  };
19
- protected readonly defaultCommandOptions: CommandOption<any>[];
20
- command: string;
21
- private arguments;
22
- private options;
23
- private argumentsSignature;
24
- private optionSignatures;
25
- private optionAliases;
26
- constructor(io: CommandIO, signature: string, helperDefinitions: {
27
- [key: string]: string;
28
- }, defaultCommandOptions: CommandOption<any>[], ...args: any[]);
29
- option(name: string): any;
30
- setOption(name: string, value: any): void;
31
- optionHelp(name: string): string | undefined;
32
- argument(name: string): any;
33
- setArgument(name: string, value: any): void;
34
- argumentHelp(name: string): string | undefined;
35
- getArgumentSignatures(): {
36
- [argument: string]: ArgSignature;
37
- };
38
- getOptionSignatures(): {
39
- [option: string]: ArgSignature;
40
- };
41
- private getParamValue;
42
- private handleArguments;
43
- private handleOptions;
44
- private parseSignature;
45
- private parseDefaultOptions;
46
- private parseParamSignature;
30
+ /**
31
+ * Validates the parsed options and arguments
32
+ * @throws {Error} If validation fails
33
+ */
47
34
  validate(): Promise<void>;
35
+ /**
36
+ * Retrieves a parsed option value by name
37
+ * @param name - The option name
38
+ * @returns The typed option value
39
+ * @throws {Error} If init() has not been called yet
40
+ */
41
+ option<OptsName extends keyof Options>(name: OptsName): OptionReturnType<Options[OptsName]>;
42
+ /**
43
+ * Retrieves a parsed argument value by name
44
+ * @param name - The argument name
45
+ * @returns The typed argument value
46
+ * @throws {Error} If init() has not been called yet
47
+ */
48
+ argument<ArgName extends keyof Arguments>(name: ArgName): OptionReturnType<Arguments[ArgName]>;
49
+ /**
50
+ * Validates that all provided options are recognized
51
+ * @throws {InvalidOption} If an unknown option is found
52
+ */
53
+ private validateUnknownOptions;
54
+ /**
55
+ * Processes named options from minimist output
56
+ */
57
+ private handleOptions;
58
+ /**
59
+ * Processes positional arguments from minimist output
60
+ */
61
+ private handleArguments;
62
+ /**
63
+ * Handles variadic arguments that consume all remaining positional values
64
+ */
65
+ private handleVariadicArgument;
66
+ /**
67
+ * Resolves a single positional argument value with defaults and type conversion
68
+ * Note: Does not validate required arguments - validation happens in subclass validate() methods
69
+ */
70
+ private resolveArgumentValue;
71
+ /**
72
+ * Resolves an option value from the parsed option values object
73
+ * Handles alias resolution, defaults, and type conversion
74
+ */
75
+ private resolveOptionValue;
76
+ optionDefinitions(): Record<string, OptionDetails>;
77
+ argumentDefinitions(): Record<string, OptionDetails>;
78
+ availableOptions(): string[];
79
+ availableArguments(): string[];
48
80
  }
@@ -1,17 +1,18 @@
1
- import { Command } from './Command.js';
2
1
  import { CommandIO } from './CommandIO.js';
2
+ import { Command } from './Command.js';
3
+ import { Logger } from './Logger.js';
3
4
  export type CommandResolver = (path: string) => Promise<Command>;
4
5
  export declare class CommandRegistry {
5
6
  private readonly commands;
6
7
  protected readonly io: CommandIO;
7
- get commandSuffix(): string;
8
+ protected readonly logger: Logger;
8
9
  protected get CommandIOClass(): typeof CommandIO;
9
- constructor();
10
+ constructor(logger?: Logger);
10
11
  getAvailableCommands(): string[];
11
- getCommands(): Command[];
12
+ getCommands(): Array<Command>;
12
13
  private commandResolver;
13
- setCommandResolver(resolver: (path: string) => Promise<Command>): void;
14
- registerCommand(command: Command, force?: boolean): void;
14
+ setCommandResolver(resolver: CommandResolver): void;
15
+ registerCommand(command: Command<any, any, any>, force?: boolean): void;
15
16
  loadCommandsPath(commandsPath: string): Promise<void>;
16
17
  runCommand(ctx: any, command: string | Command, ...args: any[]): Promise<number>;
17
18
  private suggestCommand;
@@ -0,0 +1,85 @@
1
+ import { CommandOption } from './contracts/index.js';
2
+ import { CommandIO } from './CommandIO.js';
3
+ import { OptionsObject, OptionsSchema } from './lib/types.js';
4
+ import { CommandParser } from './CommandParser.js';
5
+ /**
6
+ * Extends CommandParser to parse command signatures like "command {arg} {--option}"
7
+ * Handles interactive prompting for missing required arguments via CommandIO
8
+ */
9
+ export declare class CommandSignatureParser<Opts extends OptionsSchema = any, Args extends OptionsSchema = any> extends CommandParser<Opts, Args> {
10
+ readonly command: string;
11
+ private readonly argumentsSchema;
12
+ private readonly optionsSchema;
13
+ constructor(opts: {
14
+ io: CommandIO;
15
+ signature: string;
16
+ helperDefinitions: {
17
+ [key: string]: string;
18
+ };
19
+ defaultOptions: CommandOption<any>[];
20
+ });
21
+ /**
22
+ * Parses command signature string into command name and parameter schemas
23
+ * Example: "migrate {name} {--force}" -> { command: "migrate", arguments: {name: ...}, options: {force: ...} }
24
+ */
25
+ private static parseSignature;
26
+ /**
27
+ * Retrieves an option value by name, with signature validation
28
+ */
29
+ option(name: any): any;
30
+ /**
31
+ * Sets an option value programmatically
32
+ */
33
+ setOption(name: string, value: any): void;
34
+ /**
35
+ * Retrieves the description/help text for an option
36
+ */
37
+ optionHelp(name: string): string | undefined;
38
+ /**
39
+ * Retrieves the description/help text for an argument
40
+ */
41
+ argumentHelp(name: string): string | undefined;
42
+ /**
43
+ * Retrieves an argument value by name, with signature validation
44
+ */
45
+ argument(name: any): any;
46
+ /**
47
+ * Sets an argument value programmatically
48
+ */
49
+ setArgument(name: string, value: any): void;
50
+ /**
51
+ * Returns all argument definitions from the signature
52
+ */
53
+ getArgumentSignatures(): OptionsSchema;
54
+ /**
55
+ * Returns all option definitions from the signature
56
+ */
57
+ getOptionSignatures(): OptionsSchema;
58
+ /**
59
+ * Parses a single parameter signature like "{name}" or "{--force}" or "{files*}"
60
+ * Extracts name, type, default value, aliases, description, etc.
61
+ *
62
+ * Signature syntax:
63
+ * - {arg} -> required string argument
64
+ * - {arg?} -> optional argument
65
+ * - {arg=default} -> argument with default value
66
+ * - {arg*} -> variadic argument (array)
67
+ * - {arg:desc} -> argument with description
68
+ * - {--opt} -> boolean option
69
+ * - {--opt=} -> string option
70
+ * - {--opt|o} -> option with alias
71
+ */
72
+ private static parseParamSignature;
73
+ /**
74
+ * Validates that all required arguments are present
75
+ * If missing, prompts the user via CommandIO to provide them
76
+ * @throws {MissingRequiredArgumentValue} If a required argument cannot be obtained
77
+ */
78
+ validate(): Promise<void>;
79
+ /**
80
+ * Prompts the user to provide a missing argument value via CommandIO
81
+ */
82
+ private promptForArgument;
83
+ optionValues(): OptionsObject<Opts>;
84
+ argumentValues(): OptionsObject<Args>;
85
+ }
@@ -0,0 +1,37 @@
1
+ import { Command, CommandHandlerOptions } from './Command.js';
2
+ import { CommandIO } from './CommandIO.js';
3
+ import { CommandSignatureParser } from './CommandSignatureParser.js';
4
+ import { OptionsSchema } from './lib/types.js';
5
+ export declare abstract class CommandWithSignature<C = any, Opts extends OptionsSchema = {}, Args extends OptionsSchema = {}> extends Command<C, Opts, Args> {
6
+ abstract signature: string;
7
+ abstract description: string;
8
+ protected helperDefinitions: {
9
+ [key: string]: string;
10
+ };
11
+ get command(): string;
12
+ parser: CommandSignatureParser<Opts, Args>;
13
+ protected newCommandParser(opts: {
14
+ io: CommandIO;
15
+ options: Opts;
16
+ arguments: Args;
17
+ }): CommandSignatureParser;
18
+ constructor();
19
+ protected abstract handle(ctx: C, opts: CommandHandlerOptions<Opts, Args>): Promise<number | void>;
20
+ protected setOption(name: string, value: any): void;
21
+ protected setArgument(name: string, value: any): void;
22
+ protected option<T = string>(key: string): T | null;
23
+ protected option<T = string>(key: string, defaultValue: T): NoInfer<T>;
24
+ protected optionBoolean(key: string, defaultValue?: boolean): boolean;
25
+ protected optionArray<T = string>(key: string, defaultValue?: Array<T>): Array<NoInfer<T>>;
26
+ protected optionNumber(key: string): number | null;
27
+ protected optionNumber(key: string, defaultValue: number): number;
28
+ protected argument<T = string>(key: string): T | null;
29
+ protected argument<T = string>(key: string, defaultValue: T): NoInfer<T>;
30
+ protected argumentArray<T = string>(key: string, defaultValue?: Array<any>): Array<T>;
31
+ protected argumentBoolean(key: string, defaultValue?: boolean): boolean;
32
+ protected argumentNumber(key: string, defaultValue?: number | null): number | null;
33
+ askForConfirmation(...opts: Parameters<typeof this.io.askForConfirmation>): ReturnType<typeof this.io.askForConfirmation>;
34
+ askForInput(...opts: Parameters<typeof this.io.askForInput>): ReturnType<typeof this.io.askForInput>;
35
+ askForSelect(...opts: Parameters<typeof this.io.askForSelect>): ReturnType<typeof this.io.askForSelect>;
36
+ newLoader(...opts: Parameters<typeof this.io.newLoader>): ReturnType<typeof this.io.newLoader>;
37
+ }
@@ -1,4 +1,7 @@
1
1
  import { BobError } from './errors/index.js';
2
+ import { Logger } from './Logger.js';
2
3
  export declare class ExceptionHandler {
4
+ private readonly logger;
5
+ constructor(logger: Logger);
3
6
  handle(err: Error | BobError): number;
4
7
  }
@@ -0,0 +1,17 @@
1
+ export type LogLevel = 'debug' | 'verbose' | 'info' | 'warn' | 'error' | 'silent';
2
+ export type LoggerOptions = {
3
+ level?: LogLevel;
4
+ };
5
+ export declare class Logger {
6
+ private level;
7
+ constructor(opts?: LoggerOptions);
8
+ private shouldLog;
9
+ setLevel(level: LogLevel): void;
10
+ getLevel(): LogLevel;
11
+ log(...args: any[]): void;
12
+ info(...args: any[]): void;
13
+ warn(...args: any[]): void;
14
+ error(...args: any[]): void;
15
+ debug(...args: any[]): void;
16
+ verbose(...args: any[]): void;
17
+ }
@@ -1,5 +1,5 @@
1
- import { Command } from '../Command.js';
2
1
  import { CommandRegistry } from '../CommandRegistry.js';
2
+ import { Command } from '../Command.js';
3
3
  export type HelpCommandOptions = {
4
4
  commandRegistry: CommandRegistry;
5
5
  cliName?: string;
@@ -7,8 +7,6 @@ export type HelpCommandOptions = {
7
7
  };
8
8
  export default class HelpCommand extends Command {
9
9
  private opts;
10
- signature: string;
11
- description: string;
12
10
  constructor(opts: HelpCommandOptions);
13
- protected handle(): Promise<void>;
11
+ handle(): Promise<void>;
14
12
  }
@@ -1,7 +1,6 @@
1
- export interface CommandOption<C> {
1
+ import { OptionDefinition } from '../lib/types.js';
2
+ import { Command } from '../Command.js';
3
+ export interface CommandOption<C extends Command> extends OptionDefinition {
2
4
  option: string;
3
- alias?: string[];
4
- defaultValue: string | boolean | Array<string> | null;
5
- description?: string;
6
5
  handler(this: C): Promise<number | void>;
7
6
  }
@@ -0,0 +1,14 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'verbose';
2
+ /**
3
+ * Logger interface defining standard logging methods and level management
4
+ */
5
+ export interface LoggerContract {
6
+ log(message: string, ...args: any[]): void;
7
+ info(message: string, ...args: any[]): void;
8
+ warn(message: string, ...args: any[]): void;
9
+ error(message: string, ...args: any[]): void;
10
+ debug(message: string, ...args: any[]): void;
11
+ verbose(message: string, ...args: any[]): void;
12
+ setLevel(level: LogLevel): void;
13
+ getLevel(): LogLevel;
14
+ }
@@ -1 +1,2 @@
1
1
  export * from './CommandOption.js';
2
+ export * from './LoggerContract.js';
@@ -7,5 +7,5 @@ export type OptionProps = {
7
7
  export declare class BadCommandOption extends BobError {
8
8
  readonly param: OptionProps;
9
9
  constructor(param: OptionProps);
10
- pretty(): void;
10
+ pretty(io: any): void;
11
11
  }
@@ -7,5 +7,5 @@ export type ParameterProps = {
7
7
  export declare class BadCommandParameter extends BobError {
8
8
  readonly param: ParameterProps;
9
9
  constructor(param: ParameterProps);
10
- pretty(): void;
10
+ pretty(io: any): void;
11
11
  }
@@ -1,3 +1,4 @@
1
+ import { Logger } from '../Logger.js';
1
2
  export declare abstract class BobError extends Error {
2
- abstract pretty(): void;
3
+ abstract pretty(logger: Logger): void;
3
4
  }
@@ -2,5 +2,5 @@ import { BobError } from './BobError.js';
2
2
  export declare class CommandNotFoundError extends BobError {
3
3
  readonly command: string;
4
4
  constructor(command: string);
5
- pretty(): void;
5
+ pretty(io: any): void;
6
6
  }
@@ -1,8 +1,8 @@
1
1
  import { BobError } from './BobError.js';
2
- import { ArgSignature } from '../CommandParser.js';
2
+ import { OptionsSchema } from '../lib/types.js';
3
3
  export declare class InvalidOption extends BobError {
4
4
  private option;
5
- private optionsSignature;
6
- constructor(option: string, optionsSignature: ArgSignature[]);
7
- pretty(): void;
5
+ private optionsSchema;
6
+ constructor(option: string, optionsSchema?: OptionsSchema);
7
+ pretty(io: any): void;
8
8
  }
@@ -1,7 +1,6 @@
1
1
  import { BobError } from './BobError.js';
2
- import { ArgSignature } from '../CommandParser.js';
3
2
  export declare class MissingRequiredArgumentValue extends BobError {
4
- readonly paramSignature: ArgSignature;
5
- constructor(paramSignature: ArgSignature);
6
- pretty(): void;
3
+ readonly argument: string;
4
+ constructor(argument: string);
5
+ pretty(io: any): void;
7
6
  }
@@ -0,0 +1,6 @@
1
+ import { BobError } from './BobError.js';
2
+ export declare class MissingRequiredOptionValue extends BobError {
3
+ readonly option: string;
4
+ constructor(option: string);
5
+ pretty(io: any): void;
6
+ }
@@ -1,8 +1,8 @@
1
1
  import { BobError } from './BobError.js';
2
- import { ArgSignature } from '../CommandParser.js';
2
+ import { OptionsSchema } from '../lib/types.js';
3
3
  export declare class MissingSignatureArgument extends BobError {
4
4
  private argument;
5
- private argumentSignatures;
6
- constructor(argument: string, argumentSignatures: ArgSignature[]);
7
- pretty(): void;
5
+ private argumentsSchema;
6
+ constructor(argument: string, argumentsSchema: OptionsSchema);
7
+ pretty(io: any): void;
8
8
  }
@@ -1,8 +1,8 @@
1
1
  import { BobError } from './BobError.js';
2
- import { ArgSignature } from '../CommandParser.js';
2
+ import { OptionsSchema } from '../lib/types.js';
3
3
  export declare class MissingSignatureOption extends BobError {
4
4
  private option;
5
- private optionsSignature;
6
- constructor(option: string, optionsSignature: ArgSignature[]);
7
- pretty(): void;
5
+ private optionsSchema;
6
+ constructor(option: string, optionsSchema: OptionsSchema);
7
+ pretty(io: any): void;
8
8
  }
@@ -1,3 +1,9 @@
1
1
  export * from './BobError.js';
2
2
  export * from './BadCommandParameter.js';
3
3
  export * from './BadCommandOption.js';
4
+ export * from './InvalidOption.js';
5
+ export * from './CommandNotFoundError.js';
6
+ export * from './MissingSignatureArgument.js';
7
+ export * from './MissingSignatureOption.js';
8
+ export * from './MissingRequiredArgumentValue.js';
9
+ export * from './MissingRequiredOptionValue.js';