@clerc/core
Version:
213 lines (212 loc) • 12 kB
text/typescript
import * as Parser from "@clerc/parser";
import { DOUBLE_DASH, FlagOptions, IgnoreFunction, InferFlags, InvalidSchemaError, KNOWN_FLAG, PARAMETER, ParsedResult, TypeFunction, TypeValue, UNKNOWN_FLAG } from "@clerc/parser";
import { CamelCase, DeepPrettify, LiteralUnion, MaybeArray, PartialRequired, Prettify, UnionToIntersection } from "@clerc/utils";
//#region ../advanced-types/src/errors.d.ts
declare class FlagValidationError extends Error {}
declare namespace index_d_exports {
export { Enum, FlagValidationError, Range, Regex };
}
/**
* Creates a Enum type function that validates the input against allowed values.
* The display name will be formatted as "value1 | value2 | ..." for help
* output.
*
* @example
*
* ```typescript
* const format = Enum(["json", "yaml", "xml"]);
* // Help output will show: json | yaml | xml
* ```
*
* @param values - Array of allowed string values
* @returns A TypeFunction that validates and returns the input value
* @throws {Error} If the value is not in the allowed values list
*/
declare function Enum<T extends string>(...values: T[]): TypeFunction<T>;
/**
* Creates a range type function that validates the input is a number within the
* specified range.
*
* @param min - The minimum acceptable value (inclusive)
* @param max - The maximum acceptable value (inclusive)
* @returns A TypeFunction that validates the input value
* @throws {Error} If the value is not a number or is outside the specified
* range
*/
declare function Range(min: number, max: number): TypeFunction<number>;
/**
* Creates a regex type function that validates the input against the provided
* pattern.
*
* @param pattern - The regular expression pattern to validate against
* @param description - Optional description for display purposes
* @returns A TypeFunction that validates the input value
* @throws {Error} If the value does not match the regex pattern
*/
declare function Regex(pattern: RegExp, description?: string): TypeFunction<string>;
//#endregion
//#region src/types/clerc.d.ts
type ErrorHandler = (error: unknown) => void;
//#endregion
//#region src/types/flag.d.ts
interface FlagCustomOptions {}
type ClercFlagOptions = FlagOptions & {
description?: string;
} & FlagCustomOptions;
type ClercFlagDefinitionValue = ClercFlagOptions | TypeValue;
type ClercFlagsDefinition = Record<string, ClercFlagDefinitionValue>;
//#endregion
//#region src/types/parameter.d.ts
interface ParameterCustomOptions {}
type InferStringParameter<T extends string, Type = string> = T extends `<${infer Name extends string}...>` | `[${infer Name extends string}...]` ? Record<CamelCase<Name>, Type[]> : T extends `<${infer Name extends string}>` ? Record<CamelCase<Name>, Type> : T extends `[${infer Name extends string}]` ? Record<CamelCase<Name>, Type | undefined> : never;
type InferParameter<T extends ParameterDefinitionValue> = T extends string ? InferStringParameter<T> : T extends ParameterOptions ? T["type"] extends TypeFunction<infer U> ? InferStringParameter<T["key"], U> : InferStringParameter<T["key"]> : never;
type InferParameters<T extends readonly ParameterDefinitionValue[]> = T extends readonly (infer U extends ParameterDefinitionValue)[] ? Prettify<UnionToIntersection<InferParameter<U>>> : never;
type ParameterOptions = {
key: string;
description?: string;
type?: TypeFunction;
} & ParameterCustomOptions;
type ParameterDefinitionValue = string | ParameterOptions;
//#endregion
//#region src/types/context.d.ts
type AddStringIndex<T> = T & Record<string, any>;
type KnownKeys<T> = string extends keyof T ? never : keyof T;
type InferFlagsWithGlobal<C extends Command, GF extends ClercFlagsDefinition> = AddStringIndex<InferFlags<NonNullable<C["flags"]> & Omit<GF, KnownKeys<NonNullable<C["flags"]>>>>>;
interface ContextStore {}
interface BaseContext<C extends Command = Command, GF extends ClercFlagsDefinition = {}> {
command?: C;
calledAs?: string;
parameters: InferParameters<NonNullable<C["parameters"]>>;
flags: InferFlagsWithGlobal<C, GF>;
ignored: string[];
rawParsed: ParsedResult<InferFlagsWithGlobal<C, GF>>;
store: Partial<ContextStore>;
}
//#endregion
//#region src/types/command.d.ts
interface CommandCustomOptions {}
interface CommandOptions<Parameters extends readonly ParameterDefinitionValue[] = readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition = ClercFlagsDefinition> extends CommandCustomOptions {
alias?: MaybeArray<string>;
parameters?: Parameters;
flags?: Flags;
/**
* A callback function to conditionally stop parsing. When it returns true,
* parsing stops and remaining arguments are preserved in ignored.
*/
ignore?: IgnoreFunction;
}
interface Command<Name$1 extends string = string, Parameters extends readonly ParameterDefinitionValue[] = readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition = ClercFlagsDefinition> extends CommandOptions<Parameters, Flags> {
name: Name$1;
description?: string;
}
type CommandWithHandler<Name$1 extends string = string, Parameters extends readonly ParameterDefinitionValue[] = readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition = ClercFlagsDefinition> = Command<Name$1, Parameters, Flags> & {
handler?: CommandHandler<Command<Name$1, Parameters, Flags>>;
};
type CommandsRecord = Record<string, Command>;
type CommandsMap = Map<string, Command>;
type MakeEmitterEvents<Commands extends CommandsRecord, GlobalFlags extends ClercFlagsDefinition = ClercFlagsDefinition> = { [K in keyof Commands]: [CommandHandlerContext<Commands[K], GlobalFlags>] };
type CommandHandlerContext<C extends Command = Command, GF extends ClercFlagsDefinition = ClercFlagsDefinition> = DeepPrettify<PartialRequired<BaseContext<C, GF>, "command" | "calledAs"> & {
resolved: true;
}>;
type CommandHandler<C extends Command = Command, GF extends ClercFlagsDefinition = ClercFlagsDefinition> = (context: CommandHandlerContext<C, GF>) => void;
//#endregion
//#region src/types/interceptor.d.ts
type InterceptorContext<C extends Command = Command, GF extends ClercFlagsDefinition = {}> = DeepPrettify<BaseContext<C, GF>>;
/**
* Function to call the next interceptor in the chain. **MUST** be awaited.
*/
type InterceptorNext = () => void | Promise<void>;
type InterceptorHandler<C extends Command = Command, GF extends ClercFlagsDefinition = {}> = (context: InterceptorContext<C, GF>, next: InterceptorNext) => void | Promise<void>;
interface InterceptorObject<C extends Command = Command, GF extends ClercFlagsDefinition = {}> {
enforce?: "pre" | "normal" | "post";
handler: InterceptorHandler<C, GF>;
}
type Interceptor<C extends Command = Command, GF extends ClercFlagsDefinition = {}> = InterceptorHandler<C, GF> | InterceptorObject<C, GF>;
//#endregion
//#region src/types/plugin.d.ts
interface Plugin {
setup: (cli: Clerc) => void;
}
//#endregion
//#region src/cli.d.ts
interface CreateOptions {
name?: string;
scriptName?: string;
description?: string;
version?: string;
}
interface ParseOptions<Run extends boolean = true> {
argv?: string[];
run?: Run;
}
declare class Clerc<Commands extends CommandsRecord = {}, GlobalFlags extends ClercFlagsDefinition = {}> {
#private;
private constructor();
get _name(): string;
get _scriptName(): string;
get _description(): string;
get _version(): string;
get _commands(): CommandsMap;
get _globalFlags(): GlobalFlags;
get store(): Partial<ContextStore>;
static create(options?: CreateOptions): Clerc;
name(name: string): this;
scriptName(scriptName: string): this;
description(description: string): this;
version(version: string): this;
use(plugin: Plugin): this;
errorHandler(handler: ErrorHandler): this;
command(commands: readonly CommandWithHandler<any, any, any>[]): this;
command<Name$1 extends string, const Parameters extends readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition>(command: CommandWithHandler<Name$1, Parameters, Flags>): Clerc<Commands & Record<string, CommandWithHandler<Name$1, Parameters, Flags>>, GlobalFlags>;
command<Name$1 extends string, const Parameters extends readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition>(name: Name$1 extends keyof Commands ? ["COMMAND ALREADY EXISTS"] : Name$1, options?: CommandOptions<Parameters, Flags>): Clerc<Commands & Record<Name$1, Command<Name$1, Parameters, Flags>>, GlobalFlags>;
command<Name$1 extends string, const Parameters extends readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition>(name: Name$1 extends keyof Commands ? ["COMMAND ALREADY EXISTS"] : Name$1, description: string, options?: CommandOptions<Parameters, Flags>): Clerc<Commands & Record<Name$1, Command<Name$1, Parameters, Flags>>, GlobalFlags>;
globalFlag<Name$1 extends string, Flag extends ClercFlagDefinitionValue>(name: Name$1, description: string, options: Flag): Clerc<Commands, GlobalFlags & Record<Name$1, Flag>>;
globalFlag<Name$1 extends string, Flag extends ClercFlagDefinitionValue>(name: Name$1, options: Flag): Clerc<Commands, GlobalFlags & Record<Name$1, Flag>>;
interceptor(interceptor: Interceptor<Command, GlobalFlags>): this;
on<Name$1 extends LiteralUnion<keyof Commands, string>>(name: Name$1, handler: CommandHandler<Commands[Name$1], GlobalFlags>): this;
run(): Promise<void>;
parse<Run extends boolean = true>(argvOrOptions?: string[] | ParseOptions<Run>): Run extends true ? Promise<void> : this;
}
//#endregion
//#region src/command.d.ts
declare function resolveCommand(commandsMap: CommandsMap, parameters: string[]): [Command, string] | [undefined, undefined];
//#endregion
//#region src/errors.d.ts
declare class NoSuchCommandError extends Error {
commandName: string;
constructor(commandName: string, text?: string);
}
declare class NoCommandSpecifiedError extends Error {
constructor(text?: string);
}
declare class InvalidCommandError extends Error {}
declare class MissingRequiredMetadataError extends Error {
constructor(metadataName: string);
}
declare class InvalidParametersError extends Error {}
declare class MissingRequiredFlagError extends Error {
constructor(flags: string[]);
}
//#endregion
//#region src/helpers.d.ts
declare const defineCommand: <Name$1 extends string, const Parameters extends readonly ParameterDefinitionValue[], Flags extends ClercFlagsDefinition>(command: Command<Name$1, Parameters, Flags>, handler?: NoInfer<CommandHandler<Command<Name$1, Parameters, Flags>>>) => CommandWithHandler<Name$1, Parameters, Flags>;
//#endregion
//#region src/ignore.d.ts
declare function createStopAtFirstParameter(): IgnoreFunction;
//#endregion
//#region src/parameter.d.ts
interface ParameterInfo {
name: string;
isRequired: boolean;
isVariadic: boolean;
}
declare function extractParameterInfo(key: string): ParameterInfo;
//#endregion
//#region src/plugin.d.ts
declare const definePlugin: (plugin: Plugin) => Plugin;
//#endregion
//#region src/utils.d.ts
declare const normalizeFlagValue: (flag: ClercFlagDefinitionValue) => ClercFlagOptions;
declare const normalizeParameterValue: (parameter: ParameterDefinitionValue) => ParameterOptions;
//#endregion
export { BaseContext, Clerc, ClercFlagDefinitionValue, ClercFlagOptions, ClercFlagsDefinition, Command, CommandCustomOptions, CommandHandler, CommandHandlerContext, CommandOptions, CommandWithHandler, CommandsMap, CommandsRecord, ContextStore, type CreateOptions, DOUBLE_DASH, ErrorHandler, FlagCustomOptions, InferParameters, Interceptor, InterceptorContext, InterceptorHandler, InterceptorNext, InterceptorObject, InvalidCommandError, InvalidParametersError, InvalidSchemaError, KNOWN_FLAG, MakeEmitterEvents, MissingRequiredFlagError, MissingRequiredMetadataError, NoCommandSpecifiedError, NoSuchCommandError, PARAMETER, ParameterCustomOptions, ParameterDefinitionValue, ParameterOptions, type ParseOptions, type Parser, Plugin, index_d_exports as Types, UNKNOWN_FLAG, createStopAtFirstParameter, defineCommand, definePlugin, extractParameterInfo, normalizeFlagValue, normalizeParameterValue, resolveCommand };