import type { StandardSchemaV1 } from "@standard-schema/spec"; export interface Step { value: T; data: TData; } export type AnyStep = Step; export interface Done { ok: true; value: V; data: D; remainder: Input; } export interface Fail { ok: false; error: Error; remainder: Input; } export interface Next extends Parser> { ok: true; value: V; data: unknown; remainder: Input; } export type ToSteps = { [K in keyof Values]: Step; } extends infer U extends [AnyStep, ...AnyStep[]] ? U : never; export type Increment = Steps extends [infer S extends AnyStep] ? Done | Fail : Steps extends [infer S extends AnyStep, ...infer Rest extends [AnyStep, ...AnyStep[]]] ? | Next< S["value"], { [K in keyof Rest]: Rest[K] extends AnyStep ? Rest[K]["value"] : never; } extends infer U extends [unknown, ...unknown[]] ? U : never > | Fail : Done | Fail; export interface Parser { path: string[]; description?: string; aliases?: string[]; parse(input: Input): Increment; } export interface Input { values?: { name: string; value: unknown; }[]; envs?: { name: string; value: Record; }[]; args?: string[]; } export interface FieldData { source: Source; sources: Source[]; } export interface Field extends Parser<[Step>]> { mods: Mods; schema: StandardSchemaV1; required: boolean; } export type Source = { issues?: readonly StandardSchemaV1.Issue[]; value: T; sourceType: string; sourceName: string; }; export interface Mods { default?: unknown; argument: boolean; array: boolean; }