import { NodeType } from './constants'; export declare function debug(str: string): void; export type StateMachine = { nodes: Array; }; export type TokenBase = { segmentIndex: number; }; export type PathToken = TokenBase & { type: `path`; slice?: undefined; }; export type PositionalToken = TokenBase & { type: `positional`; slice?: undefined; }; export type OptionToken = TokenBase & { type: `option`; slice?: [number, number]; option: string; }; export type AssignToken = TokenBase & { type: `assign`; slice: [number, number]; }; export type ValueToken = TokenBase & { type: `value`; slice?: [number, number]; }; export type Token = PathToken | PositionalToken | OptionToken | AssignToken | ValueToken; export type RunState = { candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; tokens: Array; }; export declare function makeStateMachine(): StateMachine; export declare function makeAnyOfMachine(inputs: Array): StateMachine; export declare function injectNode(machine: StateMachine, node: Node): number; export declare function simplifyMachine(input: StateMachine): void; export declare function debugMachine(machine: StateMachine, { prefix }?: { prefix?: string; }): void; export declare function runMachineInternal(machine: StateMachine, input: Array, partial?: boolean): { node: number; state: RunState; }[]; export declare function trimSmallerBranches(branches: Array<{ node: number; state: RunState; }>): { node: number; state: RunState; }[]; export declare function selectBestState(input: Array, states: Array): RunState; export declare function aggregateHelpStates(states: Array): RunState[]; type Transition = { to: number; reducer?: Callback; }; type Node = { dynamics: Array<[Callback, Transition]>; shortcuts: Array; statics: { [segment: string]: Array; }; }; export declare function makeNode(): Node; export declare function isTerminalNode(node: number): boolean; export declare function cloneTransition(input: Transition, offset?: number): { to: number; reducer: "setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError" | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError"] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", candidateState: Partial] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", index: number] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", names: Map] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", name: string] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", name: string] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", name: string] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", command: number] | ["setCandidateState" | "setSelectedIndex" | "pushBatch" | "pushBound" | "pushPath" | "pushPositional" | "pushExtra" | "pushExtraNoLimits" | "pushTrue" | "pushFalse" | "pushUndefined" | "pushStringValue" | "setStringValue" | "inhibateOptions" | "useHelp" | "setError" | "setOptionArityError", errorMessage: string] | undefined; }; export declare function cloneNode(input: Node, offset?: number): Node; export declare function registerDynamic(machine: StateMachine, from: NodeType | number, test: Callback, to: NodeType | number, reducer?: Callback): void; export declare function registerShortcut(machine: StateMachine, from: NodeType | number, to: NodeType | number, reducer?: Callback): void; export declare function registerStatic(machine: StateMachine, from: NodeType | number, test: string, to: NodeType | number, reducer?: Callback): void; type UndefinedKeys = { [P in keyof T]-?: undefined extends T[P] ? P : never; }[keyof T]; type UndefinedTupleKeys> = UndefinedKeys>; type TupleKeys = Exclude; export type CallbackFn

, R> = (state: RunState, segment: string, segmentIndex: number, ...args: P) => R; export type CallbackFnParameters> = T extends ((state: RunState, segment: string, segmentIndex: number, ...args: infer P) => any) ? P : never; export type CallbackStore = Record>; export type Callback> = [ TupleKeys> ] extends [UndefinedTupleKeys>] ? (T | [T, ...CallbackFnParameters]) : [T, ...CallbackFnParameters]; export declare function execute>(store: S, callback: Callback, state: RunState, segment: string, segmentIndex: number): R; export declare const tests: { always: () => boolean; isOptionLike: (state: RunState, segment: string) => boolean; isNotOptionLike: (state: RunState, segment: string) => boolean; isOption: (state: RunState, segment: string, segmentIndex: number, name: string) => boolean; isBatchOption: (state: RunState, segment: string, segmentIndex: number, names: Map) => boolean; isBoundOption: (state: RunState, segment: string, segmentIndex: number, names: Map, options: Array) => boolean; isNegatedOption: (state: RunState, segment: string, segmentIndex: number, name: string) => boolean; isHelp: (state: RunState, segment: string) => boolean; isUnsupportedOption: (state: RunState, segment: string, segmentIndex: number, names: Map) => boolean; isInvalidOption: (state: RunState, segment: string) => boolean; }; export declare const reducers: { setCandidateState: (state: RunState, segment: string, segmentIndex: number, candidateState: Partial) => { candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; tokens: Array; }; setSelectedIndex: (state: RunState, segment: string, segmentIndex: number, index: number) => { selectedIndex: number; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; tokens: Array; }; pushBatch: (state: RunState, segment: string, segmentIndex: number, names: Map) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; pushBound: (state: RunState, segment: string, segmentIndex: number) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; pushPath: (state: RunState, segment: string, segmentIndex: number) => { path: string[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; pushPositional: (state: RunState, segment: string, segmentIndex: number) => { positionals: { value: string; extra: boolean | typeof NoLimits; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; remainder: string | null; selectedIndex: number | null; }; pushExtra: (state: RunState, segment: string, segmentIndex: number) => { positionals: { value: string; extra: boolean | typeof NoLimits; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; remainder: string | null; selectedIndex: number | null; }; pushExtraNoLimits: (state: RunState, segment: string, segmentIndex: number) => { positionals: { value: string; extra: boolean | typeof NoLimits; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; remainder: string | null; selectedIndex: number | null; }; pushTrue: (state: RunState, segment: string, segmentIndex: number, name: string) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; pushFalse: (state: RunState, segment: string, segmentIndex: number, name: string) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; pushUndefined: (state: RunState, segment: string, segmentIndex: number, name: string) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; pushStringValue: (state: RunState, segment: string, segmentIndex: number) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; setStringValue: (state: RunState, segment: string, segmentIndex: number) => { options: { name: string; value: any; }[]; tokens: Token[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; }; inhibateOptions: (state: RunState) => { ignoreOptions: boolean; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; options: Array<{ name: string; value: any; }>; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; tokens: Array; }; useHelp: (state: RunState, segment: string, segmentIndex: number, command: number) => { options: { name: string; value: string; }[]; candidateUsage: string | null; requiredOptions: Array>; errorMessage: string | null; ignoreOptions: boolean; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; tokens: Array; }; setError: (state: RunState, segment: string, segmentIndex: number, errorMessage: string) => { errorMessage: string; candidateUsage: string | null; requiredOptions: Array>; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; tokens: Array; }; setOptionArityError: (state: RunState, segment: string) => { errorMessage: string; candidateUsage: string | null; requiredOptions: Array>; ignoreOptions: boolean; options: Array<{ name: string; value: any; }>; path: Array; positionals: Array<{ value: string; extra: boolean | typeof NoLimits; }>; remainder: string | null; selectedIndex: number | null; tokens: Array; }; }; export declare const NoLimits: unique symbol; export type ArityDefinition = { leading: Array; extra: Array | typeof NoLimits; trailing: Array; proxy: boolean; }; export type OptDefinition = { preferredName: string; nameSet: Array; description?: string; arity: number; hidden: boolean; required: boolean; allowBinding: boolean; }; export declare class CommandBuilder { readonly cliIndex: number; readonly cliOpts: Readonly; readonly allOptionNames: Map; readonly arity: ArityDefinition; readonly options: Array; readonly paths: Array>; private context?; constructor(cliIndex: number, cliOpts: CliOptions); addPath(path: Array): void; setArity({ leading, trailing, extra, proxy }: Partial): void; addPositional({ name, required }?: { name?: string; required?: boolean; }): void; addRest({ name, required }?: { name?: string; required?: number; }): void; addProxy({ required }?: { name?: string; required?: number; }): void; addOption({ names: nameSet, description, arity, hidden, required, allowBinding }: Partial & { names: Array; }): void; setContext(context: Context): void; usage({ detailed, inlineOptions }?: { detailed?: boolean; inlineOptions?: boolean; }): { usage: string; options: { preferredName: string; nameSet: Array; definition: string; description: string; required: boolean; }[]; }; compile(): { machine: StateMachine; context: Context & ({} | null); }; private registerOptions; } export type CliOptions = { binaryName: string; }; export type CliBuilderCallback = (command: CommandBuilder) => CommandBuilder | void; export declare class CliBuilder { private readonly opts; private readonly builders; static build(cbs: Array>, opts?: Partial): { machine: StateMachine; contexts: ((Context & null) | (Context & {}))[]; process: (input: string[], { partial }?: { partial?: boolean | undefined; }) => RunState; }; constructor({ binaryName }?: Partial); getBuilderByIndex(n: number): CommandBuilder; commands(cbs: Array>): this; command(): CommandBuilder; compile(): { machine: StateMachine; contexts: ((Context & null) | (Context & {}))[]; process: (input: Array, { partial }?: { partial?: boolean | undefined; }) => RunState; }; } export {};