cli-kiss 0.2.4 → 0.2.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/Typo.ts","../src/lib/Command.ts","../src/lib/Operation.ts","../src/lib/Type.ts","../src/lib/Option.ts","../src/lib/Positional.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Command\";\nexport * from \"./lib/Operation\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Positional\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n\n// TODO - maybe add a parsed option recap on error\n","/**\n * Color names for terminal styling, used by {@link TypoStyle}.\n * `dark*` = standard ANSI (30–37); `bright*` = high-intensity (90–97).\n */\nexport type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\n/**\n * Visual styling applied by a {@link TypoSupport} instance.\n * All fields are optional; ignored entirely in `\"none\"` mode.\n */\nexport type TypoStyle = {\n /**\n * Foreground (text) color.\n */\n fgColor?: TypoColor;\n /**\n * Background color.\n */\n bgColor?: TypoColor;\n /**\n * Reduced intensity.\n */\n dim?: boolean;\n /**\n * Bold.\n */\n bold?: boolean;\n /**\n * Italic.\n */\n italic?: boolean;\n /**\n * Underline.\n */\n underline?: boolean;\n /**\n * Strikethrough.\n */\n strikethrough?: boolean;\n};\n\n/**\n * Section title style. Bold dark-green.\n */\nexport const typoStyleTitle: TypoStyle = {\n fgColor: \"darkGreen\",\n bold: true,\n};\n/**\n * Logic/type identifier style. Bold dark-magenta.\n */\nexport const typoStyleLogic: TypoStyle = {\n fgColor: \"darkMagenta\",\n bold: true,\n};\n/**\n * Quoted user-input style. Bold dark-yellow.\n */\nexport const typoStyleQuote: TypoStyle = {\n fgColor: \"darkYellow\",\n bold: true,\n};\n\n/**\n * Error label style. Bold dark-red.\n */\nexport const typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\n};\n\n/**\n * Option/command name style. Bold dark-cyan.\n */\nexport const typoStyleConstants: TypoStyle = {\n fgColor: \"darkCyan\",\n bold: true,\n};\n/**\n * Positional/user-input label style. Bold dark-blue.\n */\nexport const typoStyleUserInput: TypoStyle = {\n fgColor: \"darkBlue\",\n bold: true,\n};\n\n/**\n * Strong text style. Bold.\n */\nexport const typoStyleRegularStrong: TypoStyle = {\n bold: true,\n};\n/**\n * Subtle text style. Italic and dim.\n */\nexport const typoStyleRegularWeaker: TypoStyle = {\n italic: true,\n dim: true,\n};\n\n/**\n * Immutable styled string segment. Compose into a {@link TypoText}.\n */\nexport class TypoString {\n #value: string;\n #typoStyle: TypoStyle;\n /**\n * @param value - Raw text content.\n * @param typoStyle - Style to apply when rendering. Defaults to `{}` (no style).\n */\n constructor(value: string, typoStyle: TypoStyle = {}) {\n this.#value = value;\n this.#typoStyle = typoStyle;\n }\n /**\n * Returns the text styled by `typoSupport`.\n *\n * @param typoSupport - Rendering mode.\n */\n computeStyledString(typoSupport: TypoSupport): string {\n return typoSupport.computeStyledString(this.#value, this.#typoStyle);\n }\n /**\n * Returns the raw text.\n */\n getRawString(): string {\n return this.#value;\n }\n}\n\n/**\n * Mutable sequence of {@link TypoString} segments.\n */\nexport class TypoText {\n #typoStrings: Array<TypoString>;\n /**\n * @param segments - Initial text segments\n */\n constructor(\n ...segments: Array<TypoText | Array<TypoString> | TypoString | string>\n ) {\n this.#typoStrings = [];\n for (const typoPart of segments) {\n this.push(typoPart);\n }\n }\n /**\n * Appends new text segment(s).\n *\n * @param segment - Text segment(s) to append.\n */\n push(segment: TypoText | Array<TypoString> | TypoString | string) {\n if (typeof segment === \"string\") {\n this.#typoStrings.push(new TypoString(segment));\n } else if (segment instanceof TypoText) {\n this.#typoStrings.push(...segment.#typoStrings);\n } else if (Array.isArray(segment)) {\n for (const typoString of segment) {\n this.#typoStrings.push(typoString);\n }\n } else {\n this.#typoStrings.push(segment);\n }\n }\n /**\n * Renders all segments into a single styled string.\n *\n * @param typoSupport - Rendering mode.\n * @returns Concatenated styled string.\n */\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoStrings\n .map((t) => t.computeStyledString(typoSupport))\n .join(\"\");\n }\n /**\n * Returns the concatenated raw text.\n */\n computeRawString(): string {\n return this.#typoStrings.map((t) => t.getRawString()).join(\"\");\n }\n /**\n * Returns the total raw character count.\n */\n computeRawLength(): number {\n let length = 0;\n for (const typoString of this.#typoStrings) {\n length += typoString.getRawString().length;\n }\n return length;\n }\n}\n\n/**\n * Column-aligned grid of {@link TypoText} cells.\n * Each column is padded to the widest cell (raw chars); the last column is not padded.\n */\nexport class TypoGrid {\n #typoRows: Array<Array<TypoText>>;\n constructor() {\n this.#typoRows = [];\n }\n /**\n * Appends a row. All rows should have the same cell count.\n *\n * @param cells - Ordered {@link TypoText} cells.\n */\n pushRow(cells: Array<TypoText>) {\n this.#typoRows.push(cells);\n }\n /**\n * Renders as an array of styled, column-padded strings.\n *\n * @param typoSupport - Rendering mode.\n * @returns 2-D array of styled strings.\n */\n computeStyledLines(typoSupport: TypoSupport): Array<string> {\n const widths = new Array<number>();\n const styledLines = new Array<string>();\n for (const typoGridRow of this.#typoRows) {\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const width = typoGridCell.computeRawLength();\n if (\n widths[typoGridColumnIndex] === undefined ||\n width > widths[typoGridColumnIndex]!\n ) {\n widths[typoGridColumnIndex] = width;\n }\n }\n }\n for (const typoGridRow of this.#typoRows) {\n const styledGridRow = new Array<string>();\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n styledGridRow.push(typoGridCell.computeStyledString(typoSupport));\n if (typoGridColumnIndex < typoGridRow.length - 1) {\n const width = typoGridCell.computeRawLength();\n const padding = \" \".repeat(widths[typoGridColumnIndex]! - width);\n styledGridRow.push(padding);\n }\n }\n styledLines.push(styledGridRow.join(\"\"));\n }\n return styledLines;\n }\n}\n\n/**\n * `Error` subclass with a {@link TypoText} styled message for rich terminal output.\n * Chains `TypoError` sources after `\": \"`.\n */\nexport class TypoError extends Error {\n #typoText: TypoText;\n /**\n * @param currentTypoText - Styled message for this error.\n * @param source - Optional cause; `TypoError` chains styled text, `Error` appends `.message`, else `String()`.\n */\n constructor(currentTypoText: TypoText, source?: unknown) {\n const typoText = new TypoText();\n typoText.push(currentTypoText);\n if (source instanceof TypoError) {\n typoText.push(new TypoString(\": \"));\n typoText.push(source.#typoText);\n } else if (source instanceof Error) {\n typoText.push(new TypoString(`: ${source.message}`));\n } else if (source !== undefined) {\n typoText.push(new TypoString(`: ${String(source)}`));\n }\n super(typoText.computeRawString());\n this.#typoText = typoText;\n }\n /**\n * Renders the styled message (without `\"Error:\"` prefix).\n *\n * @param typoSupport - Rendering mode.\n * @returns Styled error string.\n */\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoText.computeStyledString(typoSupport);\n }\n /**\n * Runs `thrower`; wraps any thrown error as a `TypoError` with `context()` prepended.\n *\n * @typeParam Value - Return type of `thrower`.\n * @param thrower - Function to execute; result passed through on success.\n * @param context - Produces the {@link TypoText} prepended to the caught error.\n * @returns Value from `thrower`.\n * @throws `TypoError` wrapping the original error with context prepended.\n */\n static tryWithContext<Value>(\n thrower: () => Value,\n context: () => TypoText,\n ): Value {\n try {\n return thrower();\n } catch (error) {\n throw new TypoError(context(), error);\n }\n }\n}\n\n/**\n * Controls ANSI terminal styling. Create via the static factory methods.\n */\nexport class TypoSupport {\n #kind: \"none\" | \"tty\" | \"mock\";\n private constructor(kind: \"none\" | \"tty\" | \"mock\") {\n this.#kind = kind;\n }\n /**\n * Plain text — no ANSI codes.\n */\n static none(): TypoSupport {\n return new TypoSupport(\"none\");\n }\n /**\n * ANSI escape codes for color terminals.\n */\n static tty(): TypoSupport {\n return new TypoSupport(\"tty\");\n }\n /**\n * Deterministic textual styling for snapshot tests.\n * Style flags appear as suffixes: `{text}@color`, `{text}+` (bold), `{text}-` (dim),\n * `{text}*` (italic), `{text}_` (underline), `{text}~` (strikethrough).\n */\n static mock(): TypoSupport {\n return new TypoSupport(\"mock\");\n }\n /**\n * Auto-detects styling mode from the process environment.\n * `FORCE_COLOR=0` / `NO_COLOR` → none; `FORCE_COLOR` (truthy) / `isTTY` → tty; else → none.\n * Falls back to none if `process` is unavailable.\n */\n static inferFromProcess(): TypoSupport {\n if (!process) {\n return TypoSupport.none();\n }\n if (process.env) {\n if (process.env[\"FORCE_COLOR\"] === \"0\") {\n return TypoSupport.none();\n }\n if (process.env[\"FORCE_COLOR\"]) {\n return TypoSupport.tty();\n }\n if (\"NO_COLOR\" in process.env) {\n return TypoSupport.none();\n }\n }\n if (process.stdout && process.stdout.isTTY) {\n return TypoSupport.tty();\n }\n return TypoSupport.none();\n }\n /**\n * Applies `typoStyle` to `value` according to the current mode.\n *\n * @param value - Raw text.\n * @param typoStyle - Style to apply.\n * @returns Styled string.\n */\n computeStyledString(value: string, typoStyle: TypoStyle): string {\n if (this.#kind === \"none\") {\n return value;\n }\n if (this.#kind === \"tty\") {\n const fgColorCode = typoStyle.fgColor\n ? ttyCodeFgColors[typoStyle.fgColor]\n : \"\";\n const bgColorCode = typoStyle.bgColor\n ? ttyCodeBgColors[typoStyle.bgColor]\n : \"\";\n const boldCode = typoStyle.bold ? ttyCodeBold : \"\";\n const dimCode = typoStyle.dim ? ttyCodeDim : \"\";\n const italicCode = typoStyle.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoStyle.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoStyle.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${fgColorCode}${bgColorCode}${boldCode}${dimCode}${italicCode}${underlineCode}${strikethroughCode}${value}${ttyCodeReset}`;\n }\n if (this.#kind === \"mock\") {\n const fgColorPart = typoStyle.fgColor\n ? `{${value}}@${typoStyle.fgColor}`\n : value;\n const bgColorPart = typoStyle.bgColor\n ? `{${fgColorPart}}#${typoStyle.bgColor}`\n : fgColorPart;\n const boldPart = typoStyle.bold ? `{${bgColorPart}}+` : bgColorPart;\n const dimPart = typoStyle.dim ? `{${boldPart}}-` : boldPart;\n const italicPart = typoStyle.italic ? `{${dimPart}}*` : dimPart;\n const underlinePart = typoStyle.underline\n ? `{${italicPart}}_`\n : italicPart;\n const strikethroughPart = typoStyle.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\n }\n throw new Error(`Unknown TypoSupport kind: ${this.#kind}`);\n }\n /**\n * Formats any thrown value as `\"Error: <message>\"` with {@link typoStyleFailure} on the prefix.\n *\n * @param error - Any thrown value.\n * @returns Styled error string.\n */\n computeStyledErrorMessage(error: unknown): string {\n return [\n this.computeStyledString(\"Error:\", typoStyleFailure),\n error instanceof TypoError\n ? error.computeStyledString(this)\n : error instanceof Error\n ? error.message\n : String(error),\n ].join(\" \");\n }\n}\n\nconst ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeDim = \"\\x1b[2m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeFgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { Operation } from \"./Operation\";\nimport { ReaderArgs } from \"./Reader\";\nimport {\n TypoError,\n TypoString,\n typoStyleQuote,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\nimport { UsageCommand, UsageSegment } from \"./Usage\";\n\n/**\n * A CLI command. Created with {@link command}, {@link commandWithSubcommands}, or {@link commandChained}.\n *\n * @typeParam Context - Injected at execution; forwarded to handlers.\n * @typeParam Result - Produced on execution; typically `void`.\n */\nexport type Command<Context, Result> = {\n /**\n * Returns static metadata.\n */\n getInformation(): CommandInformation;\n /**\n * Registers options/positionals on `readerArgs`; returns a {@link CommandDecoder}.\n */\n consumeAndMakeDecoder(\n readerArgs: ReaderArgs,\n ): CommandDecoder<Context, Result>;\n};\n\n/**\n * Produced by {@link Command.consumeAndMakeDecoder}.\n *\n * @typeParam Context - See {@link Command}.\n * @typeParam Result - See {@link Command}.\n */\nexport type CommandDecoder<Context, Result> = {\n /**\n * Returns {@link UsageCommand} for the current command path.\n */\n generateUsage(): UsageCommand;\n /**\n * Creates a ready-to-execute {@link CommandInterpreter}.\n *\n * @throws {@link TypoError} if parsing or decoding failed.\n */\n decodeAndMakeInterpreter(): CommandInterpreter<Context, Result>;\n};\n\n/**\n * A fully parsed, decoded and ready-to-execute command.\n *\n * @typeParam Context - Context passed to the handler.\n * @typeParam Result - Value produced on success.\n */\nexport type CommandInterpreter<Context, Result> = {\n /**\n * Executes with the provided context.\n */\n executeWithContext(context: Context): Promise<Result>;\n};\n\n/**\n * Command metadata shown in `--help` output.\n */\nexport type CommandInformation = {\n /**\n * Shown in the usage header.\n */\n description: string;\n /**\n * Shown in parentheses, e.g. `\"deprecated\"`, `\"experimental\"`.\n */\n hint?: string;\n /**\n * Extra lines printed below the description.\n */\n details?: Array<string>;\n /**\n * Shown in the `Examples:` section.\n */\n examples?: Array<{\n /**\n * Explanation shown above the example.\n */\n explanation: string;\n /**\n * Example command args.\n */\n commandArgs: Array<\n | string\n | { positional: string }\n | { subcommand: string }\n | {\n option:\n | { long: string; value?: string }\n | { short: string; value?: string };\n }\n >;\n }>;\n};\n\n/**\n * Creates a leaf command that directly executes an {@link Operation}.\n *\n * @typeParam Context - Context forwarded to the handler.\n * @typeParam Result - Value returned by the handler.\n *\n * @param information - Command metadata.\n * @param operation - Options, positionals, and handler.\n * @returns A {@link Command}.\n *\n * @example\n * ```ts\n * const greet = command(\n * { description: \"Greet a user\" },\n * operation(\n * { options: {}, positionals: [positionalRequired({ type: typeString, label: \"NAME\" })] },\n * async (_ctx, { positionals: [name] }) => console.log(`Hello, ${name}!`),\n * ),\n * );\n * ```\n */\nexport function command<Context, Result>(\n information: CommandInformation,\n operation: Operation<Context, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n try {\n const operationDecoder = operation.consumeAndMakeDecoder(readerArgs);\n const endPositional = readerArgs.consumePositional();\n if (endPositional !== undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`Unexpected argument: `),\n new TypoString(`\"${endPositional}\"`, typoStyleQuote),\n ),\n );\n }\n return {\n generateUsage: () => generateUsageLeaf(information, operation),\n decodeAndMakeInterpreter() {\n const operationInterpreter =\n operationDecoder.decodeAndMakeInterpreter();\n return {\n async executeWithContext(context: Context) {\n return await operationInterpreter.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage: () => generateUsageLeaf(information, operation),\n decodeAndMakeInterpreter() {\n throw error;\n },\n };\n }\n },\n };\n}\n\n/**\n * Creates a command that runs `operation` first, then dispatches to a named subcommand.\n *\n * @typeParam Context - Context accepted by `operation`.\n * @typeParam Payload - Output of `operation`; becomes the subcommand's context.\n * @typeParam Result - Value produced by the selected subcommand.\n *\n * @param information - Command metadata.\n * @param operation - Runs first; output becomes the subcommand's context.\n * @param subcommands - Map of subcommand names to their {@link Command}s.\n * @returns A dispatching {@link Command}.\n *\n * @example\n * ```ts\n * const rootCmd = commandWithSubcommands(\n * { description: \"My CLI\" },\n * operation({ options: {}, positionals: [] }, async (ctx) => ctx),\n * {\n * deploy: command({ description: \"Deploy\" }, deployOperation),\n * rollback: command({ description: \"Rollback\" }, rollbackOperation),\n * },\n * );\n * ```\n */\nexport function commandWithSubcommands<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommands: { [subcommand: Lowercase<string>]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n try {\n const operationDecoder = operation.consumeAndMakeDecoder(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n const subcommandInput =\n subcommands[subcommandName as Lowercase<string>];\n if (subcommandInput === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<SUBCOMMAND>`, typoStyleUserInput),\n new TypoString(`: Invalid value: `),\n new TypoString(`\"${subcommandName}\"`, typoStyleQuote),\n ),\n );\n }\n const subcommandDecoder =\n subcommandInput.consumeAndMakeDecoder(readerArgs);\n return {\n generateUsage() {\n const subcommandUsage = subcommandDecoder.generateUsage();\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push(segmentSubcommand(subcommandName));\n currentUsage.segments.push(...subcommandUsage.segments);\n currentUsage.information = subcommandUsage.information;\n currentUsage.positionals.push(...subcommandUsage.positionals);\n currentUsage.subcommands = subcommandUsage.subcommands;\n currentUsage.options.push(...subcommandUsage.options);\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n const operationInterpreter =\n operationDecoder.decodeAndMakeInterpreter();\n const subcommandInterpreter =\n subcommandDecoder.decodeAndMakeInterpreter();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInterpreter.executeWithContext(\n await operationInterpreter.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push(segmentPositional(\"<SUBCOMMAND>\"));\n for (const [name, subcommand] of Object.entries(subcommands)) {\n const { description, hint } = subcommand.getInformation();\n currentUsage.subcommands.push({ name, description, hint });\n }\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n throw error;\n },\n };\n }\n },\n };\n}\n\n/**\n * Chains an {@link Operation} and a {@link Command}: `operation` runs first, its\n * output becomes `subcommand`'s context. No token is consumed for routing.\n *\n * @typeParam Context - Context accepted by `operation`.\n * @typeParam Payload - Output of `operation`; becomes `subcommand`'s context.\n * @typeParam Result - Value produced by `subcommand`.\n *\n * @param information - Command metadata.\n * @param operation - Runs first; output becomes `subcommand`'s context.\n * @param subcommand - Runs after `operation`.\n * @returns A {@link Command} composing both stages.\n *\n * @example\n * ```ts\n * const authenticatedDeploy = commandChained(\n * { description: \"Authenticate then deploy\" },\n * operation(\n * { options: { token: optionSingleValue({ long: \"token\", type: typeString, default: () => \"\" }) }, positionals: [] },\n * async (_ctx, { options: { token } }) => ({ token }),\n * ),\n * command({ description: \"Deploy\" }, deployOperation),\n * );\n * ```\n */\nexport function commandChained<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommand: Command<Payload, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n try {\n const operationDecoder = operation.consumeAndMakeDecoder(readerArgs);\n const subcommandDecoder = subcommand.consumeAndMakeDecoder(readerArgs);\n return {\n generateUsage() {\n const subcommandUsage = subcommandDecoder.generateUsage();\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push(...subcommandUsage.segments);\n currentUsage.information = subcommandUsage.information;\n currentUsage.positionals.push(...subcommandUsage.positionals);\n currentUsage.subcommands = subcommandUsage.subcommands;\n currentUsage.options.push(...subcommandUsage.options);\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n const operationInterpreter =\n operationDecoder.decodeAndMakeInterpreter();\n const subcommandInterpreter =\n subcommandDecoder.decodeAndMakeInterpreter();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInterpreter.executeWithContext(\n await operationInterpreter.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push(segmentPositional(\"[REST]...\"));\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction segmentPositional(value: string): UsageSegment {\n return { positional: value };\n}\n\nfunction segmentSubcommand(value: string): UsageSegment {\n return { subcommand: value };\n}\n\nfunction generateUsageLeaf(\n information: CommandInformation,\n operation: Operation<any, any>,\n): UsageCommand {\n const { positionals, options } = operation.generateUsage();\n return {\n segments: positionals.map((positional) =>\n segmentPositional(positional.label),\n ),\n information,\n positionals,\n subcommands: [],\n options,\n };\n}\n","import { Option, OptionDecoder } from \"./Option\";\nimport { Positional, PositionalDecoder } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { UsageOperation, UsageOption, UsagePositional } from \"./Usage\";\n\n/**\n * Options, positionals, and an async handler that together form the logic of a CLI command.\n *\n * Created with {@link operation} and passed to {@link command},\n * {@link commandWithSubcommands}, or {@link commandChained}.\n *\n * @typeParam Context - Injected at execution; forwarded to handlers.\n * @typeParam Result - Value produced on execution; typically `void`.\n */\nexport type Operation<Context, Result> = {\n /**\n * Returns usage metadata without consuming any arguments.\n */\n generateUsage(): UsageOperation;\n /**\n * Consumes args from `readerArgs` and returns an {@link OperationDecoder}.\n */\n consumeAndMakeDecoder(\n readerArgs: ReaderArgs,\n ): OperationDecoder<Context, Result>;\n};\n\n/**\n * Produced by {@link Operation.consumeAndMakeDecoder}.\n *\n * @typeParam Context - See {@link Operation}.\n * @typeParam Result - See {@link Operation}.\n */\nexport type OperationDecoder<Context, Result> = {\n /**\n * Creates a ready-to-execute {@link OperationInterpreter}.\n *\n * @throws {@link TypoError} if parsing or decoding failed.\n */\n decodeAndMakeInterpreter(): OperationInterpreter<Context, Result>;\n};\n\n/**\n * A fully parsed, decoded and ready-to-execute operation.\n *\n * @typeParam Context - Caller-supplied context.\n * @typeParam Result - Value produced on success.\n */\nexport type OperationInterpreter<Context, Result> = {\n /**\n * Executes with the provided context.\n */\n executeWithContext(context: Context): Promise<Result>;\n};\n\n/**\n * Creates an {@link Operation} from options, positionals, and an async handler.\n *\n * The `handler` receives `context` and `inputs` with decoded `options` and `positionals`.\n *\n * @typeParam Context - Context type accepted by the handler.\n * @typeParam Result - Return type of the handler.\n * @typeParam Options - Map of option keys to parsed value types.\n * @typeParam Positionals - Tuple of parsed positional value types, in order.\n *\n * @param inputs - Options and positionals this operation accepts.\n * @param inputs.options - Map of keys to {@link Option} descriptors.\n * @param inputs.positionals - Ordered array of {@link Positional} descriptors.\n * @param handler - Async function implementing the command logic.\n * @returns An {@link Operation}.\n *\n * @example\n * ```ts\n * const greetOperation = operation(\n * {\n * options: {\n * loud: optionFlag({ long: \"loud\", description: \"Print in uppercase\" }),\n * },\n * positionals: [\n * positionalRequired({ type: typeString, label: \"NAME\", description: \"Name to greet\" }),\n * ],\n * },\n * async function (_ctx, { options: { loud }, positionals: [name] }) {\n * const message = `Hello, ${name}!`;\n * console.log(loud ? message.toUpperCase() : message);\n * },\n * );\n * ```\n */\nexport function operation<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Positionals extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n positionals: { [K in keyof Positionals]: Positional<Positionals[K]> };\n },\n handler: (\n context: Context,\n inputs: {\n options: Options;\n positionals: Positionals;\n },\n ) => Promise<Result>,\n): Operation<Context, Result> {\n return {\n generateUsage() {\n const optionsUsage = new Array<UsageOption>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const positionalsUsage = new Array<UsagePositional>();\n for (const positionalInput of inputs.positionals) {\n positionalsUsage.push(positionalInput.generateUsage());\n }\n return { options: optionsUsage, positionals: positionalsUsage };\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n const optionsDecoders: Record<string, OptionDecoder<any>> = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsDecoders[optionKey] =\n optionInput.registerAndMakeDecoder(readerArgs);\n }\n const positionalsDecoders: Array<PositionalDecoder<any>> = [];\n for (const positionalInput of inputs.positionals) {\n positionalsDecoders.push(\n positionalInput.consumeAndMakeDecoder(readerArgs),\n );\n }\n return {\n decodeAndMakeInterpreter() {\n const optionsValues: any = {};\n for (const optionKey in optionsDecoders) {\n optionsValues[optionKey] =\n optionsDecoders[optionKey]!.getAndDecodeValue();\n }\n const positionalsValues: any = [];\n for (const positionalDecoder of positionalsDecoders) {\n positionalsValues.push(positionalDecoder.decodeValue());\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n positionals: positionalsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","import {\n TypoError,\n TypoString,\n typoStyleLogic,\n typoStyleQuote,\n TypoText,\n} from \"./Typo\";\n\n/**\n * Decodes a raw CLI string into a typed value.\n * A pair of a human-readable `content` name (e.g. `\"Number\"`) and a `decoder` function.\n *\n * Built-in: {@link typeString}, {@link typeBoolean}, {@link typeNumber},\n * {@link typeInteger}, {@link typeDate}, {@link typeUrl}.\n * Composite: {@link typeOneOf}, {@link typeMapped}, {@link typeTuple}, {@link typeList}.\n *\n * @typeParam Value - Type produced by the decoder.\n */\nexport type Type<Value> = {\n /**\n * Human-readable name shown in help and errors (e.g. `\"String\"`, `\"Number\"`).\n */\n content: string;\n /**\n * Decodes a raw CLI string into `Value`.\n *\n * @param input - Raw string from the command line.\n * @returns The decoded value.\n * @throws {@link TypoError} on invalid input.\n */\n decoder(input: string): Value;\n};\n\n/**\n * Decodes a string to `boolean` (case-insensitive).\n * Used by {@link optionFlag} for `--flag=<value>`.\n *\n * @example\n * ```ts\n * typeBoolean.decoder(\"true\") // → true\n * typeBoolean.decoder(\"yes\") // → true\n * typeBoolean.decoder(\"y\") // → true\n * typeBoolean.decoder(\"false\") // → false\n * typeBoolean.decoder(\"no\") // → false\n * typeBoolean.decoder(\"n\") // → false\n * ```\n */\nexport const typeBoolean: Type<boolean> = {\n content: \"Boolean\",\n decoder(input: string) {\n const lower = input.toLowerCase();\n if (booleanValuesTrue.has(lower)) {\n return true;\n }\n if (booleanValuesFalse.has(lower)) {\n return false;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid value: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n },\n};\nconst booleanValuesTrue = new Set([\"true\", \"yes\", \"on\", \"1\", \"y\", \"t\"]);\nconst booleanValuesFalse = new Set([\"false\", \"no\", \"off\", \"0\", \"n\", \"f\"]);\n\n/**\n * Parses a date/time string via `Date.parse`.\n * Accepts any format supported by `Date.parse`, including ISO 8601.\n *\n * @example\n * ```ts\n * typeDate.decoder(\"2024-01-15\") // → Date object for 2024-01-15\n * typeDate.decoder(\"2024-01-15T13:45:30Z\") // → Date object for 2024-01-15 13:45:30 UTC\n * typeDate.decoder(\"not a date\") // throws TypoError\n * ```\n */\nexport const typeDate: Type<Date> = {\n content: \"Date\",\n decoder(input: string) {\n try {\n const timestampMs = Date.parse(input);\n if (isNaN(timestampMs)) {\n throw new Error();\n }\n return new Date(timestampMs);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Not a valid ISO_8601: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n};\n\n/**\n * Parses a string to `number` via `Number()`; `NaN` throws {@link TypoError}.\n *\n * @example\n * ```ts\n * typeNumber.decoder(\"3.14\") // → 3.14\n * typeNumber.decoder(\"-1\") // → -1\n * typeNumber.decoder(\"hello\") // throws TypoError\n * ```\n */\nexport const typeNumber: Type<number> = {\n content: \"Number\",\n decoder(input: string) {\n try {\n const parsed = Number(input);\n if (isNaN(parsed)) {\n throw new Error();\n }\n return parsed;\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Unable to parse: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n};\n\n/**\n * Parses an integer string to `bigint` via `BigInt()`.\n * Floats and non-numeric strings throw {@link TypoError}.\n *\n * @example\n * ```ts\n * typeInteger.decoder(\"42\") // → 42n\n * typeInteger.decoder(\"3.14\") // throws TypoError\n * typeInteger.decoder(\"abc\") // throws TypoError\n * ```\n */\nexport const typeInteger: Type<bigint> = {\n content: \"Integer\",\n decoder(input: string) {\n try {\n return BigInt(input);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Unable to parse: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n};\n\n/**\n * Parses an absolute URL string to a `URL` object.\n * Relative or malformed URLs throw {@link TypoError}.\n *\n * @example\n * ```ts\n * typeUrl.decoder(\"https://example.com\") // → URL { href: \"https://example.com/\", ... }\n * typeUrl.decoder(\"not-a-url\") // throws TypoError\n * ```\n */\nexport const typeUrl: Type<URL> = {\n content: \"Url\",\n decoder(input: string) {\n try {\n return new URL(input);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Unable to parse: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n};\n\n/**\n * Identity decoder — passes the raw string through unchanged.\n *\n * @example\n * ```ts\n * typeString.decoder(\"hello\") // → \"hello\"\n * typeString.decoder(\"\") // → \"\"\n * ```\n */\nexport const typeString: Type<string> = {\n content: \"String\",\n decoder(input: string) {\n return input;\n },\n};\n\n/**\n * Chains `before`'s decoder with an `after` transformation.\n * `before` errors are prefixed with `\"from: <content>\"` for traceability.\n *\n * @typeParam Before - Intermediate type from `before.decoder`.\n * @typeParam After - Final type from `after.decoder`.\n *\n * @param before - Base decoder for the raw string.\n * @param after - Transformation applied to the decoded value.\n * @param after.content - Name for the resulting type (shown in errors).\n * @param after.decoder - Converts a `Before` value to `After`.\n * @returns A {@link Type}`<After>`.\n *\n * @example\n * ```ts\n * const typePort = typeMapped(typeNumber, {\n * content: \"Port\",\n * decoder: (n) => {\n * if (n < 1 || n > 65535) throw new Error(\"Out of range\");\n * return n;\n * },\n * });\n * // \"--port 8080\" → 8080\n * // \"--port 99999\" → TypoError: --port: <PORT>: Port: Out of range\n * ```\n */\nexport function typeMapped<Before, After>(\n before: Type<Before>,\n after: { content: string; decoder: (value: Before) => After },\n): Type<After> {\n return {\n content: after.content,\n decoder: (input: string) => {\n return after.decoder(\n TypoError.tryWithContext(\n () => before.decoder(input),\n () =>\n new TypoText(\n new TypoString(\"from: \"),\n new TypoString(before.content, typoStyleLogic),\n ),\n ),\n );\n },\n };\n}\n\n/**\n * Creates a {@link Type}`<string>` that only accepts a fixed set of values.\n * Out-of-set inputs throw {@link TypoError} listing up to 5 valid options.\n *\n * @param content - Name shown in help and errors (e.g. `\"Environment\"`).\n * @param values - Ordered list of accepted values.\n * @returns A {@link Type}`<string>`.\n *\n * @example\n * ```ts\n * const typeEnv = typeOneOf(\"Environment\", [\"dev\", \"staging\", \"prod\"]);\n * typeEnv.decoder(\"prod\") // → \"prod\"\n * typeEnv.decoder(\"unknown\") // throws TypoError: Invalid value: \"unknown\" (expected one of: \"dev\" | \"staging\" | \"prod\")\n * ```\n */\nexport function typeOneOf<const Value extends string>(\n content: string,\n values: Array<Value>,\n): Type<Value> {\n return {\n content: content,\n decoder(input: string) {\n for (const value of values) {\n if (input === value) {\n return value;\n }\n }\n const valuesPreview = [];\n for (const value of values) {\n if (valuesPreview.length >= 5) {\n valuesPreview.push(new TypoString(`...`));\n break;\n }\n if (valuesPreview.length > 0) {\n valuesPreview.push(new TypoString(` | `));\n }\n valuesPreview.push(new TypoString(`\"${value}\"`, typoStyleQuote));\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid value: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n new TypoString(` (expected one of: `),\n ...valuesPreview,\n new TypoString(`)`),\n ),\n );\n },\n };\n}\n\n/**\n * Splits a delimited string into a typed tuple.\n * Each part is decoded by the corresponding element type; wrong count or decode failure throws {@link TypoError}.\n *\n * @typeParam Elements - Tuple of decoded value types (inferred from `elementTypes`).\n *\n * @param elementTypes - One {@link Type} per tuple element, in order.\n * @param separator - Delimiter (default `\",\"`).\n * @returns A {@link Type}`<Elements>`.\n *\n * @example\n * ```ts\n * const typePoint = typeTuple([typeNumber, typeNumber]);\n * typePoint.decoder(\"3.14,2.71\") // → [3.14, 2.71]\n * typePoint.decoder(\"1,2,3\") // → [1, 2]\n * typePoint.decoder(\"x,2\") // throws TypoError: at 0: Number: Unable to parse: \"x\"\n * ```\n */\nexport function typeTuple<const Elements extends Array<any>>(\n elementTypes: { [K in keyof Elements]: Type<Elements[K]> },\n separator: string = \",\",\n): Type<Elements> {\n return {\n content: elementTypes\n .map((elementType) => elementType.content)\n .join(separator),\n decoder(input: string) {\n const splits = input.split(separator, elementTypes.length);\n if (splits.length !== elementTypes.length) {\n throw new TypoError(\n new TypoText(\n new TypoString(`Found ${splits.length} splits: `),\n new TypoString(`Expected ${elementTypes.length} splits from: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n return splits.map((split, index) => {\n const elementType = elementTypes[index]!;\n return TypoError.tryWithContext(\n () => elementType.decoder(split),\n () =>\n new TypoText(\n new TypoString(`at ${index}: `),\n new TypoString(elementType.content, typoStyleLogic),\n ),\n );\n }) as Elements;\n },\n };\n}\n\n/**\n * Splits a delimited string into a typed array.\n * Each part is decoded by `elementType`; failed decodes throw {@link TypoError}.\n * Note: splitting an empty string yields one empty element — prefer {@link optionRepeatable} for a zero-default.\n *\n * @typeParam Value - Element type produced by `elementType.decoder`.\n *\n * @param elementType - Decoder applied to each element.\n * @param separator - Delimiter (default `\",\"`).\n * @returns A {@link Type}`<Array<Value>>`.\n *\n * @example\n * ```ts\n * const typeNumbers = typeList(typeNumber);\n * typeNumbers.decoder(\"1,2,3\") // → [1, 2, 3]\n * typeNumbers.decoder(\"1,x,3\") // throws TypoError: at 1: Number: Unable to parse: \"x\"\n *\n * const typePaths = typeList(typeString, \":\");\n * typePaths.decoder(\"/usr/bin:/usr/local/bin\") // → [\"/usr/bin\", \"/usr/local/bin\"]\n * ```\n */\nexport function typeList<Value>(\n elementType: Type<Value>,\n separator: string = \",\",\n): Type<Array<Value>> {\n return {\n content: `${elementType.content}[${separator}${elementType.content}]...`,\n decoder(input: string) {\n const splits = input.split(separator);\n return splits.map((split, index) =>\n TypoError.tryWithContext(\n () => elementType.decoder(split),\n () =>\n new TypoText(\n new TypoString(`at ${index}: `),\n new TypoString(elementType.content, typoStyleLogic),\n ),\n ),\n );\n },\n };\n}\n","import { ReaderOptionParsing, ReaderArgs as ReaderOptions } from \"./Reader\";\nimport { Type, typeBoolean } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleLogic,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\nimport { UsageOption } from \"./Usage\";\n\n/**\n * A CLI option. Created with {@link optionFlag}, {@link optionSingleValue},\n * or {@link optionRepeatable}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type Option<Value> = {\n /**\n * Returns metadata for the `Options:` section.\n */\n generateUsage(): UsageOption;\n /**\n * Registers the option on `readerOptions` and returns an {@link OptionDecoder}.\n */\n registerAndMakeDecoder(readerOptions: ReaderOptions): OptionDecoder<Value>;\n};\n\n/**\n * Produced by {@link Option.registerAndMakeDecoder}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type OptionDecoder<Value> = {\n /**\n * Returns the decoded option value.\n *\n * @throws {@link TypoError} if decoding failed.\n */\n getAndDecodeValue(): Value;\n};\n\n/**\n * Creates a boolean flag option (`--verbose`, optionally `--flag=no`).\n *\n * Parsing: absent → `false`; `--flag` / `--flag=yes` → `true`; `--flag=no` → `false`;\n * specified more than once → {@link TypoError}.\n *\n * @param definition.long - Long-form name (without `--`).\n * @param definition.short - Short-form name (without `-`).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.aliases - Additional names.\n * @param definition.default - Default when absent. Defaults to `false`.\n * @returns An {@link Option}`<boolean>`.\n *\n * @example\n * ```ts\n * const verboseFlag = optionFlag({\n * long: \"verbose\",\n * short: \"v\",\n * description: \"Enable verbose output\",\n * });\n * ```\n */\nexport function optionFlag(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n default?: boolean;\n}): Option<boolean> {\n const label = `<${typeBoolean.content.toUpperCase()}>`;\n return {\n generateUsage() {\n return {\n short: definition.short,\n long: definition.long,\n label: undefined,\n annotation: \"[=no]\",\n description: definition.description,\n hint: definition.hint,\n };\n },\n registerAndMakeDecoder(readerOptions: ReaderOptions) {\n const longNegative = `no-${definition.long}` as Lowercase<string>;\n const aliasesLongsNegatives = definition.aliases?.longs?.map(\n (aliasLong) => `no-${aliasLong}` as Lowercase<string>,\n );\n const keyNegative = registerOption(readerOptions, {\n long: longNegative,\n short: undefined,\n aliasesShorts: undefined,\n aliasesLongs: aliasesLongsNegatives,\n parsing: { consumeShortGroup: false, consumeNextArg: () => false },\n });\n const keyPositive = registerOption(readerOptions, {\n long: definition.long,\n short: definition.short,\n aliasesLongs: definition.aliases?.longs,\n aliasesShorts: definition.aliases?.shorts,\n parsing: { consumeShortGroup: false, consumeNextArg: () => false },\n });\n return {\n getAndDecodeValue() {\n const negativeResults = readerOptions.getOptionValues(keyNegative);\n const positiveResults = readerOptions.getOptionValues(keyPositive);\n if (positiveResults.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n if (negativeResults.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${longNegative}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n }\n if (negativeResults.length > 0 && positiveResults.length > 0) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Must not be set in combination with: `),\n new TypoString(`--${longNegative}`, typoStyleConstants),\n ),\n );\n }\n if (negativeResults.length > 0) {\n const negativeResult = negativeResults[0]!;\n if (negativeResult.inlined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${longNegative}`, typoStyleConstants),\n new TypoString(`: Must not have a value`),\n ),\n );\n }\n return false;\n }\n if (positiveResults.length > 0) {\n const positiveResult = positiveResults[0]!;\n return decodeValue({\n long: definition.long,\n short: definition.short,\n label,\n type: typeBoolean,\n input:\n positiveResult.inlined === null\n ? \"true\"\n : positiveResult.inlined,\n });\n }\n return definition.default ?? false;\n },\n };\n },\n };\n}\n\n/**\n * Creates an option that accepts exactly one value (e.g. `--output dist/`).\n *\n * Parsing: absent → `default()`; once → decoded with `type`; more than once → {@link TypoError}.\n * Value syntax: `--long value`, `--long=value`, `-s value`, `-s=value`, `-svalue`.\n *\n * @typeParam Value - Type produced by the decoder.\n *\n * @param definition.long - Long-form name (without `--`).\n * @param definition.short - Short-form name (without `-`).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.aliases - Additional names.\n * @param definition.label - Value placeholder in help. Defaults to uppercased `type.content`.\n * @param definition.type - Decoder for the raw string value.\n * @param definition.default - Default when absent. Throw to make the option required.\n * @returns An {@link Option}`<Value>`.\n *\n * @example\n * ```ts\n * const outputOption = optionSingleValue({\n * long: \"output\",\n * short: \"o\",\n * type: typeString,\n * label: \"PATH\",\n * description: \"Output directory\",\n * default: () => \"dist/\",\n * });\n * ```\n */\nexport function optionSingleValue<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Option<Value> {\n const label = `<${definition.label ?? definition.type.content.toUpperCase()}>`;\n return {\n generateUsage() {\n return {\n short: definition.short,\n long: definition.long,\n label: label as Uppercase<string>,\n annotation: undefined,\n description: definition.description,\n hint: definition.hint,\n };\n },\n registerAndMakeDecoder(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n long: definition.long,\n short: definition.short,\n aliasesLongs: definition.aliases?.longs,\n aliasesShorts: definition.aliases?.shorts,\n parsing: {\n consumeShortGroup: true,\n consumeNextArg: (inlined, separated) =>\n inlined === null && separated.length === 0,\n },\n });\n return {\n getAndDecodeValue() {\n const optionResults = readerOptions.getOptionValues(key);\n if (optionResults.length > 1) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Requires a single value, but got multiple`),\n ),\n );\n }\n const optionResult = optionResults[0];\n if (optionResult === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${definition.long}`, typoStyleConstants),\n new TypoString(`: Failed to get default value`),\n ),\n error,\n );\n }\n }\n return decodeValue({\n long: definition.long,\n short: definition.short,\n label,\n type: definition.type,\n input: optionResult.inlined ?? optionResult.separated[0]!,\n });\n },\n };\n },\n };\n}\n\n/**\n * Creates an option that collects every occurrence into an array (e.g. `--file a.ts --file b.ts`).\n *\n * Parsing: absent → `[]`; N occurrences → array of N decoded values in order.\n * Value syntax: `--long value`, `--long=value`, `-s value`, `-s=value`, `-svalue`.\n *\n * @typeParam Value - Type produced by the decoder for each occurrence.\n *\n * @param definition.long - Long-form name (without `--`).\n * @param definition.short - Short-form name (without `-`).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.aliases - Additional names.\n * @param definition.label - Value placeholder in help. Defaults to uppercased `type.content`.\n * @param definition.type - Decoder applied to each raw string value.\n * @returns An {@link Option}`<Array<Value>>`.\n *\n * @example\n * ```ts\n * const filesOption = optionRepeatable({\n * long: \"file\",\n * short: \"f\",\n * type: typeString,\n * label: \"PATH\",\n * description: \"Input file (may be repeated)\",\n * });\n * // Usage: my-cli --file a.ts --file b.ts → [\"a.ts\", \"b.ts\"]\n * ```\n */\nexport function optionRepeatable<Value>(definition: {\n long: Lowercase<string>;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<Lowercase<string>>; shorts?: Array<string> };\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Option<Array<Value>> {\n const label = `<${definition.label ?? definition.type.content.toUpperCase()}>`;\n return {\n generateUsage() {\n // TODO - showcase that it can be repeated ?\n return {\n short: definition.short,\n long: definition.long,\n label: label as Uppercase<string>,\n annotation: \" [*]\",\n description: definition.description,\n hint: definition.hint,\n };\n },\n registerAndMakeDecoder(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n long: definition.long,\n short: definition.short,\n aliasesLongs: definition.aliases?.longs,\n aliasesShorts: definition.aliases?.shorts,\n parsing: {\n consumeShortGroup: true,\n consumeNextArg: (inlined, separated) =>\n inlined === null && separated.length === 0,\n },\n });\n return {\n getAndDecodeValue() {\n const optionResults = readerOptions.getOptionValues(key);\n return optionResults.map((optionResult) =>\n decodeValue({\n long: definition.long,\n short: definition.short,\n label,\n type: definition.type,\n input: optionResult.inlined ?? optionResult.separated[0]!,\n }),\n );\n },\n };\n },\n };\n}\n\nfunction decodeValue<Value>(params: {\n long: string;\n short: string | undefined;\n label: string;\n type: Type<Value>;\n input: string;\n}): Value {\n return TypoError.tryWithContext(\n () => params.type.decoder(params.input),\n () => {\n const text = new TypoText();\n if (params.short) {\n text.push(new TypoString(`-${params.short}`, typoStyleConstants));\n text.push(new TypoString(`, `));\n }\n text.push(new TypoString(`--${params.long}`, typoStyleConstants));\n text.push(new TypoString(`: `));\n text.push(new TypoString(params.label, typoStyleUserInput));\n text.push(new TypoString(`: `));\n text.push(new TypoString(params.type.content, typoStyleLogic));\n return text;\n },\n );\n}\n\nfunction registerOption(\n readerOptions: ReaderOptions,\n definition: {\n long: Lowercase<string>;\n short: undefined | string;\n aliasesLongs: undefined | Array<Lowercase<string>>;\n aliasesShorts: undefined | Array<string>;\n parsing: ReaderOptionParsing;\n },\n) {\n const { long, short, aliasesLongs, aliasesShorts, parsing } = definition;\n const longs = long ? [long] : [];\n if (aliasesLongs) {\n longs.push(...aliasesLongs);\n }\n const shorts = short ? [short] : [];\n if (aliasesShorts) {\n shorts.push(...aliasesShorts);\n }\n return readerOptions.registerOption({ longs, shorts, parsing });\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleLogic,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\nimport { UsagePositional } from \"./Usage\";\n\n/**\n * A positional argument. Created with {@link positionalRequired}, {@link positionalOptional},\n * or {@link positionalVariadics}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type Positional<Value> = {\n /**\n * Returns metadata for the `Positionals:` section.\n */\n generateUsage(): UsagePositional;\n /**\n * Consumes the next positional token from `readerPositionals`.\n * Returns a decoder that produces the final value.\n */\n consumeAndMakeDecoder(\n readerPositionals: ReaderPositionals,\n ): PositionalDecoder<Value>;\n};\n\n/**\n * Produced by {@link Positional.consumeAndMakeDecoder}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type PositionalDecoder<Value> = {\n /**\n * Returns the decoded positional value.\n *\n * @throws {@link TypoError} if decoding failed.\n */\n decodeValue(): Value;\n};\n\n/**\n * Creates a required positional — missing token throws {@link TypoError}.\n * Label defaults to uppercased `type.content` in angle brackets (e.g. `<STRING>`).\n *\n * @typeParam Value - Type produced by the decoder.\n *\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.label - Label without brackets; defaults to uppercased `type.content`.\n * @param definition.type - Decoder for the raw token.\n * @returns A {@link Positional}`<Value>`.\n *\n * @example\n * ```ts\n * const namePositional = positionalRequired({\n * type: typeString,\n * label: \"NAME\",\n * description: \"The name to greet\",\n * });\n * // Parses: my-cli Alice → \"Alice\"\n * ```\n */\nexport function positionalRequired<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Value> {\n const label = `<${definition.label ?? definition.type.content.toUpperCase()}>`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumeAndMakeDecoder(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n return {\n decodeValue() {\n return decodeValue(label, definition.type, positional);\n },\n };\n },\n };\n}\n\n/**\n * Creates an optional positional — absent token falls back to `default()`.\n * Label defaults to uppercased `type.content` in square brackets (e.g. `[STRING]`).\n *\n * @typeParam Value - Type produced by the decoder (or the default).\n *\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.label - Label without brackets; defaults to uppercased `type.content`.\n * @param definition.type - Decoder for the raw token.\n * @param definition.default - Value when absent. Throw to make it required.\n * @returns A {@link Positional}`<Value>`.\n *\n * @example\n * ```ts\n * const greeteePositional = positionalOptional({\n * type: typeString,\n * label: \"NAME\",\n * description: \"Name to greet (default: world)\",\n * default: () => \"world\",\n * });\n * // my-cli → \"world\"\n * // my-cli Alice → \"Alice\"\n * ```\n */\nexport function positionalOptional<Value>(definition: {\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n default: () => Value;\n}): Positional<Value> {\n const label = `[${definition.label ?? definition.type.content.toUpperCase()}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: label as Uppercase<string>,\n };\n },\n consumeAndMakeDecoder(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n return {\n decodeValue() {\n if (positional === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Failed to get default value`),\n ),\n error,\n );\n }\n }\n return decodeValue(label, definition.type, positional);\n },\n };\n },\n };\n}\n\n/**\n * Creates a variadic positional that collects zero or more remaining tokens into an array.\n * Stops at `endDelimiter` (consumed, not included). Label: `[TYPE]...` notation.\n *\n * @typeParam Value - Type produced by the decoder for each token.\n *\n * @param definition.endDelimiter - Sentinel token that stops collection (consumed, not included).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.label - Label without brackets; defaults to uppercased `type.content`.\n * @param definition.type - Decoder applied to each token.\n * @returns A {@link Positional}`<Array<Value>>`.\n *\n * @example\n * ```ts\n * const filesPositional = positionalVariadics({\n * type: typeString,\n * label: \"FILE\",\n * description: \"Files to process\",\n * });\n * // my-cli a.ts b.ts c.ts → [\"a.ts\", \"b.ts\", \"c.ts\"]\n * // my-cli → []\n * ```\n */\nexport function positionalVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n hint?: string;\n label?: Uppercase<string>;\n type: Type<Value>;\n}): Positional<Array<Value>> {\n const label = `[${definition.label ?? definition.type.content.toUpperCase()}]`;\n return {\n generateUsage() {\n return {\n description: definition.description,\n hint: definition.hint,\n label: (`${label}...` +\n (definition.endDelimiter\n ? ` [\"${definition.endDelimiter}\"]`\n : \"\")) as Uppercase<string>,\n };\n },\n consumeAndMakeDecoder(readerPositionals: ReaderPositionals) {\n const positionals = new Array<string>();\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n positionals.push(positional);\n }\n return {\n decodeValue() {\n return positionals.map((positional) =>\n decodeValue(label, definition.type, positional),\n );\n },\n };\n },\n };\n}\n\nfunction decodeValue<Value>(\n label: string,\n type: Type<Value>,\n input: string,\n): Value {\n return TypoError.tryWithContext(\n () => type.decoder(input),\n () =>\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: `),\n new TypoString(type.content, typoStyleLogic),\n ),\n );\n}\n","import {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleQuote,\n TypoText,\n} from \"./Typo\";\n\n/**\n * Opaque key returned by {@link ReaderArgs.registerOption}.\n */\nexport type ReaderOptionKey = (string | { __brand: \"ReaderOptionKey\" }) & {\n __brand: \"ReaderOptionKey\";\n};\n\n/**\n * Parsing behaviour for a registered option, passed to {@link ReaderArgs.registerOption}.\n */\nexport type ReaderOptionParsing = {\n consumeShortGroup: boolean;\n consumeNextArg: (\n inlined: string | null,\n separated: Array<string>,\n next: string | undefined,\n ) => boolean;\n};\n\n/**\n * Result of parsing an option, including its inlined value and any following separated values.\n */\nexport type ReaderOptionValue = {\n inlined: string | null;\n separated: Array<string>;\n};\n\n/**\n * Option registration/query interface. Subset of {@link ReaderArgs}.\n */\nexport type ReaderOptions = {\n /**\n * Registers an option; all `longs` and `shorts` share the same key.\n *\n * @param definition.longs - Long-form names (without `--`).\n * @param definition.shorts - Short-form names (without `-`).\n * @param definition.parsing - Parsing behaviour.\n * @returns A {@link ReaderOptionKey} for later retrieval.\n * @throws `Error` if a name is already registered or short names overlap.\n */\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n parsing: ReaderOptionParsing;\n }): ReaderOptionKey;\n /**\n * Returns all values collected for `key`.\n */\n getOptionValues(key: ReaderOptionKey): Array<ReaderOptionValue>;\n};\n\n/**\n * Positional consumption interface. Subset of {@link ReaderArgs}.\n */\nexport type ReaderPositionals = {\n /**\n * Returns the next positional token, parsing intervening options as side-effects.\n *\n * @returns The next positional, or `undefined` when exhausted.\n * @throws {@link TypoError} on an unrecognised option.\n */\n consumePositional(): string | undefined;\n};\n\n/**\n * Core argument parser: converts raw CLI tokens into named options and positionals.\n * Options must be registered before {@link ReaderArgs.consumePositional} is called.\n *\n * Supported syntax: `--name`, `--name value`, `--name=value`,\n * `-n`, `-n value`, `-nvalue`, `-abc` (stacked), `--` (end-of-options).\n *\n * Created internally by {@link runAndExit}; exposed for advanced / custom runners.\n */\nexport class ReaderArgs {\n #args: ReadonlyArray<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n #optionContextByLong: Map<string, ReaderOptionContext>;\n #optionContextByShort: Map<string, ReaderOptionContext>;\n #optionContextByKey: Map<ReaderOptionKey, ReaderOptionContext>;\n\n /**\n * @param args - Raw CLI tokens (e.g. `process.argv.slice(2)`). Not mutated.\n */\n constructor(args: ReadonlyArray<string>) {\n this.#args = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n this.#optionContextByLong = new Map();\n this.#optionContextByShort = new Map();\n this.#optionContextByKey = new Map();\n }\n\n /**\n * Registers an option; all `longs` and `shorts` share the same key.\n * Short names must not be prefixes of one another.\n *\n * @param definition.longs - Long-form names (without `--`).\n * @param definition.shorts - Short-form names (without `-`).\n * @param definition.parsing - Parsing behaviour.\n * @returns A {@link ReaderOptionKey} for {@link ReaderArgs.getOptionValues}.\n * @throws `Error` if any name is already registered or short names overlap.\n */\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n parsing: ReaderOptionParsing;\n }) {\n const key = [\n ...definition.longs.map((long) => `--${long}`),\n ...definition.shorts.map((short) => `-${short}`),\n ].join(\", \") as ReaderOptionKey;\n for (const long of definition.longs) {\n if (!this.#isValidOptionName(long)) {\n throw new Error(`Invalid option name: --${long}`);\n }\n if (this.#optionContextByLong.has(long)) {\n throw new Error(`Option already registered: --${long}`);\n }\n }\n for (const short of definition.shorts) {\n if (!this.#isValidOptionName(short)) {\n throw new Error(`Invalid option name: -${short}`);\n }\n if (this.#optionContextByShort.has(short)) {\n throw new Error(`Option already registered: -${short}`);\n }\n for (let i = 0; i < short.length; i++) {\n const shortSlice = short.slice(0, i);\n if (this.#optionContextByShort.has(shortSlice)) {\n throw new Error(\n `Option -${short} overlap with shorter option: -${shortSlice}`,\n );\n }\n }\n for (const shortOther of this.#optionContextByShort.keys()) {\n if (shortOther.startsWith(short)) {\n throw new Error(\n `Option -${short} overlap with longer option: -${shortOther}`,\n );\n }\n }\n }\n const optionContext = {\n parsing: definition.parsing,\n results: new Array<ReaderOptionValue>(),\n };\n for (const long of definition.longs) {\n this.#optionContextByLong.set(long, optionContext);\n }\n for (const short of definition.shorts) {\n this.#optionContextByShort.set(short, optionContext);\n }\n this.#optionContextByKey.set(key, optionContext);\n return key;\n }\n\n /**\n * Returns all values collected for `key`.\n *\n * @param key - Key from {@link ReaderArgs.registerOption}.\n * @returns One entry per occurrence.\n * @throws `Error` if `key` was not registered.\n */\n getOptionValues(key: ReaderOptionKey): Array<ReaderOptionValue> {\n const optionContext = this.#optionContextByKey.get(key);\n if (optionContext === undefined) {\n throw new Error(`Unregistered option: ${key}`);\n }\n return optionContext.results;\n }\n\n /**\n * Returns the next positional token; parses intervening options as a side-effect.\n * All tokens after `--` are treated as positionals.\n *\n * @returns The next positional, or `undefined` when exhausted.\n * @throws {@link TypoError} on an unrecognised option.\n */\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === undefined) {\n return undefined;\n }\n if (!this.#tryConsumeAsOption(arg)) {\n return arg;\n }\n }\n }\n\n #consumeArg(): string | undefined {\n const arg = this.#args[this.#parsedIndex];\n if (arg === undefined) {\n return undefined;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #tryConsumeAsOption(arg: string): boolean {\n if (this.#parsedDouble) {\n return false;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return true;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const optionContext = this.#optionContextByShort.get(short);\n if (optionContext !== undefined) {\n const rest = arg.slice(shortIndexEnd);\n if (this.#tryConsumeOptionShort(optionContext, short, rest)) {\n return true;\n }\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Unexpected unknown option(s): `),\n new TypoString(`-${arg.slice(shortIndexStart)}`, typoStyleQuote),\n ),\n );\n }\n return false;\n }\n\n #consumeOptionLong(long: string, inlined: string | null): void {\n const constant = `--${long}`;\n const optionContext = this.#optionContextByLong.get(long);\n if (optionContext !== undefined) {\n return this.#consumeOptionValues(optionContext, constant, inlined);\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Unexpected unknown option: `),\n new TypoString(constant, typoStyleQuote),\n ),\n );\n }\n\n #tryConsumeOptionShort(\n optionContext: ReaderOptionContext,\n short: string,\n rest: string,\n ): boolean {\n const constant = `-${short}`;\n if (rest.startsWith(\"=\")) {\n this.#consumeOptionValues(optionContext, constant, rest.slice(1));\n return true;\n }\n if (rest.length === 0) {\n this.#consumeOptionValues(optionContext, constant, null);\n return true;\n }\n if (optionContext.parsing.consumeShortGroup) {\n this.#consumeOptionValues(optionContext, constant, rest);\n return true;\n }\n this.#consumeOptionValues(optionContext, constant, null);\n return false;\n }\n\n #consumeOptionValues(\n optionContext: ReaderOptionContext,\n constant: string,\n inlined: string | null,\n ) {\n const separated = new Array<string>();\n while (\n optionContext.parsing.consumeNextArg(\n inlined,\n separated,\n this.#args[this.#parsedIndex],\n )\n ) {\n separated.push(this.#consumeOptionValue(constant));\n }\n optionContext.results.push({ inlined, separated });\n }\n\n #consumeOptionValue(constant: string): string {\n const arg = this.#consumeArg();\n if (arg === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value, but got end of input`),\n ),\n );\n }\n if (this.#parsedDouble) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value before `),\n new TypoString(`\"--\"`, typoStyleQuote),\n ),\n );\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value, but got: `),\n new TypoString(`\"${arg}\"`, typoStyleQuote),\n ),\n );\n }\n return arg;\n }\n\n #isValidOptionName(name: string): boolean {\n return name.length > 0 && !name.includes(\"=\");\n }\n}\n\ntype ReaderOptionContext = {\n parsing: ReaderOptionParsing;\n results: Array<ReaderOptionValue>;\n};\n","import { CommandInformation } from \"./Command\";\nimport {\n TypoGrid,\n TypoString,\n typoStyleConstants,\n typoStyleLogic,\n typoStyleRegularStrong,\n typoStyleRegularWeaker,\n typoStyleTitle,\n typoStyleUserInput,\n TypoSupport,\n TypoText,\n} from \"./Typo\";\n\n/**\n * Usage model. Produced by {@link CommandDecoder.generateUsage}, consumed by {@link usageToStyledLines}.\n */\nexport type UsageCommand = {\n /**\n * Segments of the usage line\n * (e.g. `my-cli <POSITIONAL> subcommand <ANOTHER_POSITIONAL>`).\n */\n segments: Array<UsageSegment>;\n /**\n * Command metadata.\n */\n information: CommandInformation;\n /**\n * Positionals in declaration order.\n */\n positionals: Array<UsagePositional>;\n /**\n * Subcommands, populated when none was selected.\n */\n subcommands: Array<UsageSubcommand>;\n /**\n * Options in registration order.\n */\n options: Array<UsageOption>;\n};\n\n/**\n * One segment of the usage line.\n */\nexport type UsageSegment = { positional: string } | { subcommand: string };\n\n/**\n * Usage metadata. Produced by {@link Operation.generateUsage}, consumed when building {@link UsageCommand}.\n */\nexport type UsageOperation = {\n /**\n * Registered options.\n */\n options: Array<UsageOption>;\n /**\n * Declared positionals, in order.\n */\n positionals: Array<UsagePositional>;\n};\n\n/**\n * Positional metadata for the `Positionals:` section of help.\n */\nexport type UsagePositional = {\n /**\n * Help text.\n */\n description: string | undefined;\n /**\n * Short note shown in parentheses.\n */\n hint: string | undefined;\n /**\n * Placeholder label shown in the usage line and the `Positionals:` section.\n * Required: `<NAME>`, optional: `[NAME]`, variadic: `[NAME]...`.\n */\n label: Uppercase<string>;\n};\n\n/**\n * Entry in the `Subcommands:` section.\n */\nexport type UsageSubcommand = {\n /**\n * Token the user types (e.g. `\"deploy\"`).\n */\n name: string;\n /**\n * From {@link CommandInformation.description}.\n */\n description: string | undefined;\n /**\n * From {@link CommandInformation.hint}.\n */\n hint: string | undefined;\n};\n\n/**\n * Option metadata for the `Options:` section of help.\n */\nexport type UsageOption = {\n /**\n * Short-form name without `-` (e.g. `\"v\"`).\n */\n short: string | undefined;\n /**\n * Long-form name without `--` (e.g. `\"verbose\"`).\n */\n long: Lowercase<string>;\n /**\n * Extra annotation appended to the option label in help (e.g. `[=no]`, ` [*]`).\n */\n annotation: string | undefined;\n /**\n * Help text.\n */\n description: string | undefined;\n /**\n * Short note shown in parentheses.\n */\n hint: string | undefined;\n /**\n * Value placeholder in help (e.g. `\"<FILE>\"`). `undefined` for flags.\n */\n label: Uppercase<string> | undefined;\n};\n\n/**\n * Converts a {@link UsageCommand} model into an array of styled lines ready to be\n * joined with `\"\\n\"` and printed to the terminal.\n *\n * The output format is:\n * ```\n * Usage: <cliName> [segments...]\n *\n * <description> (<hint>)\n * <detail lines...>\n *\n * Positionals:\n * <LABEL> <description> (<hint>)\n *\n * Subcommands:\n * <name> <description> (<hint>)\n *\n * Options:\n * -s, --long <LABEL><annotation> <description> (<hint>)\n *\n * Examples:\n * <description>\n * <command line>\n *\n * ```\n * Sections that have no entries are omitted. The trailing empty line is always included.\n *\n * Column alignment per section via {@link TypoGrid}.\n *\n * @param params.cliName - Program name for the usage line.\n * @param params.usage - From {@link CommandDecoder.generateUsage}.\n * @param params.typoSupport - Rendering mode.\n * @returns Styled lines; includes a trailing empty string.\n *\n * @example\n * ```ts\n * const lines = usageToStyledLines({\n * cliName: \"my-cli\",\n * usage: commandDecoder.generateUsage(),\n * typoSupport: TypoSupport.tty(),\n * });\n * process.stdout.write(lines.join(\"\\n\"));\n * ```\n */\nexport function usageToStyledLines(params: {\n cliName: Lowercase<string>;\n usage: UsageCommand;\n typoSupport: TypoSupport;\n}) {\n const { cliName, usage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n const segmentsText = new TypoText();\n segmentsText.push(textUsageHero(\"Usage:\"));\n segmentsText.push(textDelimiter(\" \"));\n segmentsText.push(textConstants(cliName));\n for (const segment of usage.segments) {\n segmentsText.push(textDelimiter(\" \"));\n if (\"positional\" in segment) {\n segmentsText.push(textUserInput(segment.positional));\n }\n if (\"subcommand\" in segment) {\n segmentsText.push(textConstants(segment.subcommand));\n }\n }\n lines.push(segmentsText.computeStyledString(typoSupport));\n\n lines.push(\"\");\n const introText = new TypoText();\n introText.push(textUsageText(usage.information.description));\n if (usage.information.hint) {\n introText.push(textDelimiter(\" \"));\n introText.push(textSubtleInfo(`(${usage.information.hint})`));\n }\n lines.push(introText.computeStyledString(typoSupport));\n for (const detail of usage.information.details ?? []) {\n const detailText = new TypoText();\n detailText.push(textSubtleInfo(detail));\n lines.push(detailText.computeStyledString(typoSupport));\n }\n\n if (usage.positionals.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Positionals:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const positionalUsage of usage.positionals) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));\n typoGridRow.push(...createInformationals(positionalUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(...typoGrid.computeStyledLines(typoSupport));\n }\n\n if (usage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Subcommands:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const subcommandUsage of usage.subcommands) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textConstants(subcommandUsage.name)));\n typoGridRow.push(...createInformationals(subcommandUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(...typoGrid.computeStyledLines(typoSupport));\n }\n\n if (usage.options.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Options:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const optionUsage of usage.options) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n if (optionUsage.short) {\n typoGridRow.push(\n new TypoText(\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ),\n );\n } else {\n typoGridRow.push(new TypoText());\n }\n const longOptionText = new TypoText(\n textConstants(`--${optionUsage.long}`),\n );\n if (optionUsage.label) {\n longOptionText.push(textDelimiter(\" \"));\n longOptionText.push(textUserInput(optionUsage.label));\n }\n if (optionUsage.annotation) {\n longOptionText.push(textSubtleInfo(optionUsage.annotation));\n }\n typoGridRow.push(longOptionText);\n typoGridRow.push(...createInformationals(optionUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(...typoGrid.computeStyledLines(typoSupport));\n }\n\n if (usage.information.examples) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Examples:\").computeStyledString(typoSupport));\n for (const example of usage.information.examples) {\n const exampleExplanationText = new TypoText();\n exampleExplanationText.push(textDelimiter(\" \"));\n exampleExplanationText.push(textSubtleInfo(`# ${example.explanation}`));\n lines.push(exampleExplanationText.computeStyledString(typoSupport));\n const commandLineText = new TypoText();\n commandLineText.push(textDelimiter(\" \"));\n commandLineText.push(textConstants(cliName));\n for (const commandArg of example.commandArgs) {\n commandLineText.push(textDelimiter(\" \"));\n if (typeof commandArg === \"string\") {\n commandLineText.push(commandArg);\n } else if (\"positional\" in commandArg) {\n commandLineText.push(textUserInput(commandArg.positional));\n } else if (\"subcommand\" in commandArg) {\n commandLineText.push(textConstants(commandArg.subcommand));\n } else if (\"option\" in commandArg) {\n const option = commandArg.option;\n if (\"short\" in option) {\n commandLineText.push(textConstants(`-${option.short}`));\n } else {\n commandLineText.push(textConstants(`--${option.long}`));\n }\n if (option.value !== undefined) {\n commandLineText.push(textSubtleInfo(\"=\"));\n commandLineText.push(textUserInput(option.value));\n }\n }\n }\n lines.push(commandLineText.computeStyledString(typoSupport));\n }\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction createInformationals(usage: {\n description: string | undefined;\n hint: string | undefined;\n}): Array<TypoText> {\n const informationals = [];\n if (usage.description) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textUsefulInfo(usage.description));\n }\n if (usage.hint) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textSubtleInfo(`(${usage.hint})`));\n }\n if (informationals.length > 0) {\n return [new TypoText(textDelimiter(\" \"), ...informationals)];\n }\n return [];\n}\n\nfunction textUsageHero(value: string): TypoString {\n return new TypoString(value, typoStyleLogic);\n}\n\nfunction textUsageText(value: string): TypoString {\n return new TypoString(value, typoStyleRegularStrong);\n}\n\nfunction textUsefulInfo(value: string): TypoString {\n return new TypoString(value);\n}\n\nfunction textBlockTitle(value: string): TypoString {\n return new TypoString(value, typoStyleTitle);\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, typoStyleRegularWeaker);\n}\n\nfunction textConstants(value: string): TypoString {\n return new TypoString(value, typoStyleConstants);\n}\n\nfunction textUserInput(value: string): TypoString {\n return new TypoString(value, typoStyleUserInput);\n}\n\nfunction textDelimiter(value: string): TypoString {\n return new TypoString(value);\n}\n","import { Command, CommandDecoder } from \"./Command\";\nimport { ReaderArgs } from \"./Reader\";\nimport { TypoSupport } from \"./Typo\";\nimport { usageToStyledLines } from \"./Usage\";\n\n/**\n * Main entry point: parses CLI arguments, executes the matched command, and exits.\n * Handles `--help`, `--version`, usage-on-error, and exit codes.\n *\n * Exit codes:\n * - `0` on success / `--help` / `--version`\n * - `1` on parse error or execution error.\n *\n * @typeParam Context - Forwarded unchanged to the handler.\n *\n * @param cliName - Program name used in usage and `--version` output.\n * @param cliArgs - Raw arguments, typically `process.argv.slice(2)`.\n * @param context - Forwarded to the handler.\n * @param command - Root {@link Command}.\n * @param options.useTtyColors - Color mode: `true` (always), `false` (never),\n * `\"mock\"` (snapshot-friendly), `undefined` (auto-detect from env).\n * @param options.usageOnHelp - Enables `--help` flag (default `true`).\n * @param options.usageOnError - Prints usage to stderr on parse error (default `true`).\n * @param options.buildVersion - Enables `--version`; prints `<cliName> <buildVersion>`.\n * @param options.onError - Custom handler for errors.\n * @param options.onExit - Overrides `process.exit`; useful for testing.\n *\n * @returns `Promise<never>` — always calls `onExit`.\n *\n * @example\n * ```ts\n * import { runAndExit, command, operation, positionalRequired, typeString } from \"cli-kiss\";\n *\n * const greetCommand = command(\n * { description: \"Greet someone\" },\n * operation(\n * { options: {}, positionals: [positionalRequired({ type: typeString, label: \"NAME\" })] },\n * async function (_ctx, { positionals: [name] }) {\n * console.log(`Hello, ${name}!`);\n * },\n * ),\n * );\n *\n * await runAndExit(\"greet\", process.argv.slice(2), undefined, greetCommand, {\n * buildVersion: \"1.0.0\",\n * });\n * ```\n */\nexport async function runAndExit<Context>(\n cliName: Lowercase<string>,\n cliArgs: ReadonlyArray<string>,\n context: Context,\n command: Command<Context, void>,\n options?: {\n useTtyColors?: boolean | undefined | \"mock\"; // TODO - flag setter option\n usageOnHelp?: boolean | undefined;\n usageOnError?: boolean | undefined;\n buildVersion?: string | undefined;\n onError?: ((error: unknown) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n },\n): Promise<never> {\n const readerArgs = new ReaderArgs(cliArgs);\n const usageOnHelp = options?.usageOnHelp ?? true;\n if (usageOnHelp) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"help\"],\n parsing: {\n consumeShortGroup: false,\n consumeNextArg: () => false,\n },\n });\n }\n const buildVersion = options?.buildVersion;\n if (buildVersion) {\n readerArgs.registerOption({\n shorts: [],\n longs: [\"version\"],\n parsing: {\n consumeShortGroup: false,\n consumeNextArg: () => false,\n },\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n // TODO - handle color flag ?\n const commandDecoder = command.consumeAndMakeDecoder(readerArgs);\n while (true) {\n try {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n } catch (_) {}\n }\n const typoSupport = computeTypoSupport(options?.useTtyColors);\n const onExit = options?.onExit ?? process.exit;\n if (usageOnHelp) {\n if (readerArgs.getOptionValues(\"--help\" as any).length > 0) {\n console.log(computeUsageString(cliName, commandDecoder, typoSupport));\n return onExit(0);\n }\n }\n if (buildVersion) {\n if (readerArgs.getOptionValues(\"--version\" as any).length > 0) {\n console.log([cliName, buildVersion].join(\" \"));\n return onExit(0);\n }\n }\n try {\n const commandInterpreter = commandDecoder.decodeAndMakeInterpreter();\n try {\n await commandInterpreter.executeWithContext(context);\n return onExit(0);\n } catch (executionError) {\n handleError(options?.onError, executionError, typoSupport);\n return onExit(1);\n }\n } catch (parsingError) {\n if (options?.usageOnError ?? true) {\n console.error(computeUsageString(cliName, commandDecoder, typoSupport));\n }\n handleError(options?.onError, parsingError, typoSupport);\n return onExit(1);\n }\n}\n\nfunction handleError(\n onError: ((error: unknown) => void) | undefined,\n error: unknown,\n typoSupport: TypoSupport,\n) {\n if (onError !== undefined) {\n onError(error);\n } else {\n console.error(typoSupport.computeStyledErrorMessage(error));\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: Lowercase<string>,\n commandDecoder: CommandDecoder<Context, Result>,\n typoSupport: TypoSupport,\n) {\n return usageToStyledLines({\n cliName,\n usage: commandDecoder.generateUsage(),\n typoSupport,\n }).join(\"\\n\");\n}\n\nfunction computeTypoSupport(\n useTtyColors: boolean | undefined | \"mock\",\n): TypoSupport {\n return useTtyColors === undefined\n ? TypoSupport.inferFromProcess()\n : useTtyColors === \"mock\"\n ? TypoSupport.mock()\n : useTtyColors\n ? TypoSupport.tty()\n : TypoSupport.none();\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderArgs","TypoError","TypoGrid","TypoString","TypoSupport","TypoText","command","commandChained","commandWithSubcommands","operation","optionFlag","optionRepeatable","optionSingleValue","positionalOptional","positionalRequired","positionalVariadics","runAndExit","typeBoolean","typeDate","typeInteger","typeList","typeMapped","typeNumber","typeOneOf","typeString","typeTuple","typeUrl","typoStyleConstants","typoStyleFailure","typoStyleLogic","typoStyleQuote","typoStyleRegularStrong","typoStyleRegularWeaker","typoStyleTitle","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleTitle","typoStyleLogic","typoStyleQuote","typoStyleFailure","typoStyleConstants","typoStyleUserInput","typoStyleRegularStrong","typoStyleRegularWeaker","_value","_typoStyle","TypoString","value","typoStyle","__privateAdd","__privateSet","typoSupport","__privateGet","_typoStrings","_TypoText","segments","typoPart","segment","typoString","t","length","TypoText","_typoRows","TypoGrid","cells","widths","styledLines","typoGridRow","typoGridColumnIndex","width","styledGridRow","typoGridCell","padding","_typoText","_TypoError","currentTypoText","source","typoText","thrower","context","error","TypoError","_kind","_TypoSupport","kind","fgColorCode","ttyCodeFgColors","bgColorCode","ttyCodeBgColors","boldCode","ttyCodeBold","dimCode","ttyCodeDim","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","fgColorPart","bgColorPart","boldPart","dimPart","italicPart","underlinePart","TypoSupport","command","information","operation","readerArgs","operationDecoder","endPositional","TypoError","TypoText","TypoString","typoStyleQuote","generateUsageLeaf","operationInterpreter","context","error","commandWithSubcommands","subcommands","subcommandName","typoStyleUserInput","subcommandInput","subcommandDecoder","subcommandUsage","currentUsage","segmentSubcommand","subcommandInterpreter","segmentPositional","name","subcommand","description","hint","commandChained","value","positionals","options","positional","operation","inputs","handler","optionsUsage","optionKey","optionInput","positionalsUsage","positionalInput","readerArgs","optionsDecoders","positionalsDecoders","optionsValues","positionalsValues","positionalDecoder","context","typeBoolean","input","lower","booleanValuesTrue","booleanValuesFalse","TypoError","TypoText","TypoString","typoStyleQuote","typeDate","timestampMs","typeNumber","parsed","typeInteger","typeUrl","typeString","typeMapped","before","after","typoStyleLogic","typeOneOf","content","values","value","valuesPreview","typeTuple","elementTypes","separator","elementType","splits","split","index","typeList","optionFlag","definition","label","typeBoolean","readerOptions","longNegative","aliasesLongsNegatives","aliasLong","keyNegative","registerOption","keyPositive","negativeResults","positiveResults","TypoError","TypoText","TypoString","typoStyleConstants","positiveResult","decodeValue","optionSingleValue","key","inlined","separated","optionResults","optionResult","error","optionRepeatable","params","text","typoStyleUserInput","typoStyleLogic","long","short","aliasesLongs","aliasesShorts","parsing","longs","shorts","positionalRequired","definition","label","readerPositionals","positional","TypoError","TypoText","TypoString","typoStyleUserInput","decodeValue","positionalOptional","error","positionalVariadics","positionals","type","input","typoStyleLogic","_args","_parsedIndex","_parsedDouble","_optionContextByLong","_optionContextByShort","_optionContextByKey","_ReaderArgs_instances","consumeArg_fn","tryConsumeAsOption_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","consumeOptionValues_fn","consumeOptionValue_fn","isValidOptionName_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","key","long","short","__privateMethod","__privateGet","shortSlice","shortOther","optionContext","arg","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","rest","TypoError","TypoText","TypoString","typoStyleQuote","inlined","constant","separated","typoStyleConstants","name","usageToStyledLines","params","cliName","usage","typoSupport","lines","segmentsText","TypoText","textUsageHero","textDelimiter","textConstants","segment","textUserInput","introText","textUsageText","textSubtleInfo","detail","detailText","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","createInformationals","subcommandUsage","optionUsage","longOptionText","example","exampleExplanationText","commandLineText","commandArg","option","informationals","textUsefulInfo","value","TypoString","typoStyleLogic","typoStyleRegularStrong","typoStyleTitle","typoStyleRegularWeaker","typoStyleConstants","typoStyleUserInput","runAndExit","cliName","cliArgs","context","command","options","readerArgs","ReaderArgs","usageOnHelp","buildVersion","commandDecoder","typoSupport","computeTypoSupport","onExit","computeUsageString","commandInterpreter","executionError","handleError","parsingError","onError","error","usageToStyledLines","useTtyColors","TypoSupport"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/Typo.ts","../src/lib/Command.ts","../src/lib/Operation.ts","../src/lib/Type.ts","../src/lib/Option.ts","../src/lib/Positional.ts","../src/lib/Reader.ts","../src/lib/Usage.ts","../src/lib/Run.ts"],"sourcesContent":["export * from \"./lib/Command\";\nexport * from \"./lib/Operation\";\nexport * from \"./lib/Option\";\nexport * from \"./lib/Positional\";\nexport * from \"./lib/Reader\";\nexport * from \"./lib/Run\";\nexport * from \"./lib/Type\";\nexport * from \"./lib/Typo\";\nexport * from \"./lib/Usage\";\n","/**\n * Color names for terminal styling, used by {@link TypoStyle}.\n * `dark*` = standard ANSI (30–37); `bright*` = high-intensity (90–97).\n */\nexport type TypoColor =\n | \"darkBlack\"\n | \"darkRed\"\n | \"darkGreen\"\n | \"darkYellow\"\n | \"darkBlue\"\n | \"darkMagenta\"\n | \"darkCyan\"\n | \"darkWhite\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\";\n\n/**\n * Visual styling applied by a {@link TypoSupport} instance.\n * All fields are optional; ignored entirely in `\"none\"` mode.\n */\nexport type TypoStyle = {\n /**\n * Letter case.\n */\n case?: \"upper\" | \"lower\";\n /**\n * Foreground (text) color.\n */\n fgColor?: TypoColor;\n /**\n * Background color.\n */\n bgColor?: TypoColor;\n /**\n * Reduced intensity.\n */\n dim?: boolean;\n /**\n * Bold.\n */\n bold?: boolean;\n /**\n * Italic.\n */\n italic?: boolean;\n /**\n * Underline.\n */\n underline?: boolean;\n /**\n * Strikethrough.\n */\n strikethrough?: boolean;\n};\n\n/**\n * Section title style. Bold dark-green.\n */\nexport const typoStyleTitle: TypoStyle = {\n fgColor: \"darkGreen\",\n bold: true,\n};\n/**\n * Logic/type identifier style. Bold dark-magenta.\n */\nexport const typoStyleLogic: TypoStyle = {\n fgColor: \"darkMagenta\",\n bold: true,\n};\n/**\n * Quoted user-input style. Bold dark-yellow.\n */\nexport const typoStyleQuote: TypoStyle = {\n fgColor: \"darkYellow\",\n bold: true,\n};\n\n/**\n * Error label style. Bold dark-red.\n */\nexport const typoStyleFailure: TypoStyle = {\n fgColor: \"darkRed\",\n bold: true,\n};\n\n/**\n * Option/command name style. Bold dark-cyan.\n */\nexport const typoStyleConstants: TypoStyle = {\n fgColor: \"darkCyan\",\n bold: true,\n};\n/**\n * Positional/user-input label style. Bold dark-blue.\n */\nexport const typoStyleUserInput: TypoStyle = {\n fgColor: \"darkBlue\",\n bold: true,\n};\n\n/**\n * Strong text style. Bold.\n */\nexport const typoStyleRegularStrong: TypoStyle = {\n bold: true,\n};\n/**\n * Subtle text style. Italic and dim.\n */\nexport const typoStyleRegularWeaker: TypoStyle = {\n italic: true,\n dim: true,\n};\n\n/**\n * Immutable styled string segment. Compose into a {@link TypoText}.\n */\nexport class TypoString {\n #value: string;\n #typoStyle: TypoStyle;\n /**\n * @param value - Raw text content.\n * @param typoStyle - Style to apply when rendering. Defaults to `{}` (no style).\n */\n constructor(value: string, typoStyle: TypoStyle = {}) {\n this.#value = value;\n this.#typoStyle = typoStyle;\n }\n /**\n * Returns the text styled by `typoSupport`.\n *\n * @param typoSupport - Rendering mode.\n */\n computeStyledString(typoSupport: TypoSupport): string {\n return typoSupport.computeStyledString(this.#value, this.#typoStyle);\n }\n /**\n * Returns the raw text.\n */\n getRawString(): string {\n return this.#value;\n }\n}\n\n/**\n * Mutable sequence of {@link TypoString} segments.\n */\nexport class TypoText {\n #typoStrings: Array<TypoString>;\n /**\n * @param segments - Initial text segments\n */\n constructor(\n ...segments: Array<TypoText | Array<TypoString> | TypoString | string>\n ) {\n this.#typoStrings = [];\n for (const typoPart of segments) {\n this.push(typoPart);\n }\n }\n /**\n * Appends new text segment(s).\n *\n * @param segment - Text segment(s) to append.\n */\n push(segment: TypoText | Array<TypoString> | TypoString | string) {\n if (typeof segment === \"string\") {\n this.#typoStrings.push(new TypoString(segment));\n } else if (segment instanceof TypoText) {\n this.#typoStrings.push(...segment.#typoStrings);\n } else if (Array.isArray(segment)) {\n for (const typoString of segment) {\n this.#typoStrings.push(typoString);\n }\n } else {\n this.#typoStrings.push(segment);\n }\n }\n /**\n * Renders all segments into a single styled string.\n *\n * @param typoSupport - Rendering mode.\n * @returns Concatenated styled string.\n */\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoStrings\n .map((t) => t.computeStyledString(typoSupport))\n .join(\"\");\n }\n /**\n * Returns the concatenated raw text.\n */\n computeRawString(): string {\n return this.#typoStrings.map((t) => t.getRawString()).join(\"\");\n }\n /**\n * Returns the total raw character count.\n */\n computeRawLength(): number {\n let length = 0;\n for (const typoString of this.#typoStrings) {\n length += typoString.getRawString().length;\n }\n return length;\n }\n}\n\n/**\n * Column-aligned grid of {@link TypoText} cells.\n * Each column is padded to the widest cell (raw chars); the last column is not padded.\n */\nexport class TypoGrid {\n #typoRows: Array<Array<TypoText>>;\n constructor() {\n this.#typoRows = [];\n }\n /**\n * Appends a row. All rows should have the same cell count.\n *\n * @param cells - Ordered {@link TypoText} cells.\n */\n pushRow(cells: Array<TypoText>) {\n this.#typoRows.push(cells);\n }\n /**\n * Renders as an array of styled, column-padded strings.\n *\n * @param typoSupport - Rendering mode.\n * @returns Array of styled strings.\n */\n computeStyledLines(typoSupport: TypoSupport): Array<string> {\n const widths = new Array<number>();\n const styledLines = new Array<string>();\n for (const typoGridRow of this.#typoRows) {\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n const width = typoGridCell.computeRawLength();\n if (\n widths[typoGridColumnIndex] === undefined ||\n width > widths[typoGridColumnIndex]!\n ) {\n widths[typoGridColumnIndex] = width;\n }\n }\n }\n for (const typoGridRow of this.#typoRows) {\n const styledGridRow = new Array<string>();\n for (\n let typoGridColumnIndex = 0;\n typoGridColumnIndex < typoGridRow.length;\n typoGridColumnIndex++\n ) {\n const typoGridCell = typoGridRow[typoGridColumnIndex]!;\n styledGridRow.push(typoGridCell.computeStyledString(typoSupport));\n if (typoGridColumnIndex < typoGridRow.length - 1) {\n const width = typoGridCell.computeRawLength();\n const padding = \" \".repeat(widths[typoGridColumnIndex]! - width);\n styledGridRow.push(padding);\n }\n }\n styledLines.push(styledGridRow.join(\"\"));\n }\n return styledLines;\n }\n}\n\n/**\n * `Error` subclass with a {@link TypoText} styled message for rich terminal output.\n * Chains `TypoError` sources after `\": \"`.\n */\nexport class TypoError extends Error {\n #typoText: TypoText;\n /**\n * @param currentTypoText - Styled message for this error.\n * @param source - Optional cause; `TypoError` chains styled text, `Error` appends `.message`, else `String()`.\n */\n constructor(currentTypoText: TypoText, source?: unknown) {\n const typoText = new TypoText();\n typoText.push(currentTypoText);\n if (source instanceof TypoError) {\n typoText.push(new TypoString(\": \"));\n typoText.push(source.#typoText);\n } else if (source instanceof Error) {\n typoText.push(new TypoString(`: ${source.message}`));\n } else if (source !== undefined) {\n typoText.push(new TypoString(`: ${String(source)}`));\n }\n super(typoText.computeRawString());\n this.#typoText = typoText;\n }\n /**\n * Renders the styled message (without `\"Error:\"` prefix).\n *\n * @param typoSupport - Rendering mode.\n * @returns Styled error string.\n */\n computeStyledString(typoSupport: TypoSupport): string {\n return this.#typoText.computeStyledString(typoSupport);\n }\n /**\n * Runs `thrower`; wraps any thrown error as a `TypoError` with `context()` prepended.\n *\n * @typeParam Value - Return type of `thrower`.\n * @param thrower - Function to execute; result passed through on success.\n * @param context - Produces the {@link TypoText} prepended to the caught error.\n * @returns Value from `thrower`.\n * @throws `TypoError` wrapping the original error with context prepended.\n */\n static tryWithContext<Value>(\n thrower: () => Value,\n context: () => TypoText,\n ): Value {\n try {\n return thrower();\n } catch (error) {\n throw new TypoError(context(), error);\n }\n }\n}\n\n/**\n * Controls ANSI terminal styling. Create via the static factory methods.\n */\nexport class TypoSupport {\n #kind: \"none\" | \"tty\" | \"mock\";\n private constructor(kind: \"none\" | \"tty\" | \"mock\") {\n this.#kind = kind;\n }\n /**\n * Plain text — no ANSI codes.\n */\n static none(): TypoSupport {\n return new TypoSupport(\"none\");\n }\n /**\n * ANSI escape codes for color terminals.\n */\n static tty(): TypoSupport {\n return new TypoSupport(\"tty\");\n }\n /**\n * Deterministic textual styling for snapshot tests.\n */\n static mock(): TypoSupport {\n return new TypoSupport(\"mock\");\n }\n /**\n * Auto-detects styling mode from the process environment on best-effort basis.\n */\n static inferFromEnv(): TypoSupport {\n if (!process || !process.env) {\n return TypoSupport.none();\n }\n function readEnvVar(name: string) {\n if (!(name in process.env)) {\n return undefined;\n }\n return process.env[name];\n }\n const envForceColor = readEnvVar(\"FORCE_COLOR\");\n if (envForceColor === \"0\") {\n return TypoSupport.none();\n }\n if (envForceColor !== undefined) {\n TypoSupport.tty();\n }\n if (readEnvVar(\"NO_COLOR\") !== undefined) {\n return TypoSupport.none();\n }\n if (readEnvVar(\"MOCK_COLOR\") !== undefined) {\n return TypoSupport.mock();\n }\n return TypoSupport.tty();\n }\n /**\n * Applies `typoStyle` to `value` according to the current mode.\n *\n * @param value - Raw text.\n * @param typoStyle - Style to apply.\n * @returns Styled string.\n */\n computeStyledString(value: string, typoStyle: TypoStyle): string {\n let styledValue = value;\n if (typoStyle.case === \"upper\") {\n styledValue = styledValue.toUpperCase();\n }\n if (typoStyle.case === \"lower\") {\n styledValue = styledValue.toLowerCase();\n }\n if (this.#kind === \"none\") {\n return styledValue;\n }\n if (this.#kind === \"tty\") {\n const fgColorCode = typoStyle.fgColor\n ? ttyCodeFgColors[typoStyle.fgColor]\n : \"\";\n const bgColorCode = typoStyle.bgColor\n ? ttyCodeBgColors[typoStyle.bgColor]\n : \"\";\n const boldCode = typoStyle.bold ? ttyCodeBold : \"\";\n const dimCode = typoStyle.dim ? ttyCodeDim : \"\";\n const italicCode = typoStyle.italic ? ttyCodeItalic : \"\";\n const underlineCode = typoStyle.underline ? ttyCodeUnderline : \"\";\n const strikethroughCode = typoStyle.strikethrough\n ? ttyCodeStrikethrough\n : \"\";\n return `${fgColorCode}${bgColorCode}${boldCode}${dimCode}${italicCode}${underlineCode}${strikethroughCode}${styledValue}${ttyCodeReset}`;\n }\n if (this.#kind === \"mock\") {\n const fgColorPart = typoStyle.fgColor\n ? `{${styledValue}}@${typoStyle.fgColor}`\n : styledValue;\n const bgColorPart = typoStyle.bgColor\n ? `{${fgColorPart}}#${typoStyle.bgColor}`\n : fgColorPart;\n const boldPart = typoStyle.bold ? `{${bgColorPart}}+` : bgColorPart;\n const dimPart = typoStyle.dim ? `{${boldPart}}-` : boldPart;\n const italicPart = typoStyle.italic ? `{${dimPart}}*` : dimPart;\n const underlinePart = typoStyle.underline\n ? `{${italicPart}}_`\n : italicPart;\n const strikethroughPart = typoStyle.strikethrough\n ? `{${underlinePart}}~`\n : underlinePart;\n return strikethroughPart;\n }\n throw new Error(`Unknown TypoSupport kind: ${this.#kind}`);\n }\n /**\n * Formats any thrown value as `\"Error: <message>\"` with {@link typoStyleFailure} on the prefix.\n *\n * @param error - Any thrown value.\n * @returns Styled error string.\n */\n computeStyledErrorMessage(error: unknown): string {\n return [\n this.computeStyledString(\"Error:\", typoStyleFailure),\n error instanceof TypoError\n ? error.computeStyledString(this)\n : error instanceof Error\n ? error.message\n : String(error),\n ].join(\" \");\n }\n}\n\nconst ttyCodeReset = \"\\x1b[0m\";\nconst ttyCodeBold = \"\\x1b[1m\";\nconst ttyCodeDim = \"\\x1b[2m\";\nconst ttyCodeItalic = \"\\x1b[3m\";\nconst ttyCodeUnderline = \"\\x1b[4m\";\nconst ttyCodeStrikethrough = \"\\x1b[9m\";\nconst ttyCodeFgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[30m\",\n darkRed: \"\\x1b[31m\",\n darkGreen: \"\\x1b[32m\",\n darkYellow: \"\\x1b[33m\",\n darkBlue: \"\\x1b[34m\",\n darkMagenta: \"\\x1b[35m\",\n darkCyan: \"\\x1b[36m\",\n darkWhite: \"\\x1b[37m\",\n brightBlack: \"\\x1b[90m\",\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n};\nconst ttyCodeBgColors: Record<TypoColor, string> = {\n darkBlack: \"\\x1b[40m\",\n darkRed: \"\\x1b[41m\",\n darkGreen: \"\\x1b[42m\",\n darkYellow: \"\\x1b[43m\",\n darkBlue: \"\\x1b[44m\",\n darkMagenta: \"\\x1b[45m\",\n darkCyan: \"\\x1b[46m\",\n darkWhite: \"\\x1b[47m\",\n brightBlack: \"\\x1b[100m\",\n brightRed: \"\\x1b[101m\",\n brightGreen: \"\\x1b[102m\",\n brightYellow: \"\\x1b[103m\",\n brightBlue: \"\\x1b[104m\",\n brightMagenta: \"\\x1b[105m\",\n brightCyan: \"\\x1b[106m\",\n brightWhite: \"\\x1b[107m\",\n};\n","import { Operation } from \"./Operation\";\nimport { ReaderArgs } from \"./Reader\";\nimport {\n TypoError,\n TypoString,\n typoStyleQuote,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\nimport { UsageCommand } from \"./Usage\";\n\n/**\n * A CLI command. Created with {@link command}, {@link commandWithSubcommands}, or {@link commandChained}.\n *\n * @typeParam Context - Injected at execution; forwarded to handlers.\n * @typeParam Result - Produced on execution; typically `void`.\n */\nexport type Command<Context, Result> = {\n /**\n * Returns static metadata.\n */\n getInformation(): CommandInformation;\n /**\n * Registers options/positionals on `readerArgs`; returns a {@link CommandDecoder}.\n */\n consumeAndMakeDecoder(\n readerArgs: ReaderArgs,\n ): CommandDecoder<Context, Result>;\n};\n\n/**\n * Produced by {@link Command.consumeAndMakeDecoder}.\n *\n * @typeParam Context - See {@link Command}.\n * @typeParam Result - See {@link Command}.\n */\nexport type CommandDecoder<Context, Result> = {\n /**\n * Returns {@link UsageCommand} for the current command path.\n */\n generateUsage(): UsageCommand;\n /**\n * Creates a ready-to-execute {@link CommandInterpreter}.\n *\n * @throws {@link TypoError} if parsing or decoding failed.\n */\n decodeAndMakeInterpreter(): CommandInterpreter<Context, Result>;\n};\n\n/**\n * A fully parsed, decoded and ready-to-execute command.\n *\n * @typeParam Context - Context passed to the handler.\n * @typeParam Result - Value produced on success.\n */\nexport type CommandInterpreter<Context, Result> = {\n /**\n * Executes with the provided context.\n */\n executeWithContext(context: Context): Promise<Result>;\n};\n\n/**\n * Command metadata shown in `--help` output.\n */\nexport type CommandInformation = {\n /**\n * Shown in the usage header.\n */\n description: string;\n /**\n * Shown in parentheses, e.g. `\"deprecated\"`, `\"experimental\"`.\n */\n hint?: string;\n /**\n * Extra lines printed below the description.\n */\n details?: Array<string>;\n /**\n * Shown in the `Examples:` section.\n */\n examples?: Array<{\n /**\n * Explanation shown above the example.\n */\n explanation: string;\n /**\n * Example command args.\n */\n commandArgs: Array<\n | string\n | { positional: string }\n | { subcommand: string }\n | {\n option:\n | { long: string; inlined?: string; separated?: Array<string> }\n | { short: string; inlined?: string; separated?: Array<string> };\n }\n >;\n }>;\n};\n\n/**\n * Creates a leaf command that directly executes an {@link Operation}.\n *\n * @typeParam Context - Context forwarded to the handler.\n * @typeParam Result - Value returned by the handler.\n *\n * @param information - Command metadata.\n * @param operation - Options, positionals, and handler.\n * @returns A {@link Command}.\n *\n * @example\n * ```ts\n * const greet = command(\n * { description: \"Greet a user\" },\n * operation(\n * { options: {}, positionals: [positionalRequired({ type: type(\"name\") })] },\n * async (_ctx, { positionals: [name] }) => console.log(`Hello, ${name}!`),\n * ),\n * );\n * ```\n */\nexport function command<Context, Result>(\n information: CommandInformation,\n operation: Operation<Context, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n try {\n const operationDecoder = operation.consumeAndMakeDecoder(readerArgs);\n const endPositional = readerArgs.consumePositional();\n if (endPositional !== undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`Unexpected argument: `),\n new TypoString(`\"${endPositional}\"`, typoStyleQuote),\n ),\n );\n }\n return {\n generateUsage: () => generateUsageLeaf(information, operation),\n decodeAndMakeInterpreter() {\n const operationInterpreter =\n operationDecoder.decodeAndMakeInterpreter();\n return {\n async executeWithContext(context: Context) {\n return await operationInterpreter.executeWithContext(context);\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage: () => generateUsageLeaf(information, operation),\n decodeAndMakeInterpreter() {\n throw error;\n },\n };\n }\n },\n };\n}\n\n/**\n * Creates a command that runs `operation` first, then dispatches to a named subcommand.\n *\n * @typeParam Context - Context accepted by `operation`.\n * @typeParam Payload - Output of `operation`; becomes the subcommand's context.\n * @typeParam Result - Value produced by the selected subcommand.\n *\n * @param information - Command metadata.\n * @param operation - Runs first; output becomes the subcommand's context.\n * @param subcommands - Map of subcommand names to their {@link Command}s.\n * @returns A dispatching {@link Command}.\n *\n * @example\n * ```ts\n * const rootCmd = commandWithSubcommands(\n * { description: \"My CLI\" },\n * operation({ options: {}, positionals: [] }, async (ctx) => ctx),\n * {\n * deploy: command({ description: \"Deploy\" }, deployOperation),\n * rollback: command({ description: \"Rollback\" }, rollbackOperation),\n * },\n * );\n * ```\n */\nexport function commandWithSubcommands<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommands: { [subcommand: string]: Command<Payload, Result> },\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n try {\n const operationDecoder = operation.consumeAndMakeDecoder(readerArgs);\n const subcommandName = readerArgs.consumePositional();\n if (subcommandName === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<subcommand>`, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n const subcommandInput = subcommands[subcommandName];\n if (subcommandInput === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(`<subcommand>`, typoStyleUserInput),\n new TypoString(`: Invalid value: `),\n new TypoString(`\"${subcommandName}\"`, typoStyleQuote),\n ),\n );\n }\n const subcommandDecoder =\n subcommandInput.consumeAndMakeDecoder(readerArgs);\n return {\n generateUsage() {\n const subcommandUsage = subcommandDecoder.generateUsage();\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push({ subcommand: subcommandName });\n currentUsage.segments.push(...subcommandUsage.segments);\n currentUsage.information = subcommandUsage.information;\n currentUsage.positionals.push(...subcommandUsage.positionals);\n currentUsage.subcommands = subcommandUsage.subcommands;\n currentUsage.options.push(...subcommandUsage.options);\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n const operationInterpreter =\n operationDecoder.decodeAndMakeInterpreter();\n const subcommandInterpreter =\n subcommandDecoder.decodeAndMakeInterpreter();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInterpreter.executeWithContext(\n await operationInterpreter.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push({ positional: \"<subcommand>\" });\n for (const [name, subcommand] of Object.entries(subcommands)) {\n const { description, hint } = subcommand.getInformation();\n currentUsage.subcommands.push({ name, description, hint });\n }\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n throw error;\n },\n };\n }\n },\n };\n}\n\n/**\n * Chains an {@link Operation} and a {@link Command}: `operation` runs first, its\n * output becomes `subcommand`'s context. No token is consumed for routing.\n *\n * @typeParam Context - Context accepted by `operation`.\n * @typeParam Payload - Output of `operation`; becomes `subcommand`'s context.\n * @typeParam Result - Value produced by `subcommand`.\n *\n * @param information - Command metadata.\n * @param operation - Runs first; output becomes `subcommand`'s context.\n * @param subcommand - Runs after `operation`.\n * @returns A {@link Command} composing both stages.\n */\nexport function commandChained<Context, Payload, Result>(\n information: CommandInformation,\n operation: Operation<Context, Payload>,\n subcommand: Command<Payload, Result>,\n): Command<Context, Result> {\n return {\n getInformation() {\n return information;\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n try {\n const operationDecoder = operation.consumeAndMakeDecoder(readerArgs);\n const subcommandDecoder = subcommand.consumeAndMakeDecoder(readerArgs);\n return {\n generateUsage() {\n const subcommandUsage = subcommandDecoder.generateUsage();\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push(...subcommandUsage.segments);\n currentUsage.information = subcommandUsage.information;\n currentUsage.positionals.push(...subcommandUsage.positionals);\n currentUsage.subcommands = subcommandUsage.subcommands;\n currentUsage.options.push(...subcommandUsage.options);\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n const operationInterpreter =\n operationDecoder.decodeAndMakeInterpreter();\n const subcommandInterpreter =\n subcommandDecoder.decodeAndMakeInterpreter();\n return {\n async executeWithContext(context: Context) {\n return await subcommandInterpreter.executeWithContext(\n await operationInterpreter.executeWithContext(context),\n );\n },\n };\n },\n };\n } catch (error) {\n return {\n generateUsage() {\n const currentUsage = generateUsageLeaf(information, operation);\n currentUsage.segments.push({ positional: \"[REST]...\" });\n return currentUsage;\n },\n decodeAndMakeInterpreter() {\n throw error;\n },\n };\n }\n },\n };\n}\n\nfunction generateUsageLeaf(\n information: CommandInformation,\n operation: Operation<any, any>,\n): UsageCommand {\n const { positionals, options } = operation.generateUsage();\n return {\n segments: positionals.map((positional) => ({\n positional: positional.label,\n })),\n information,\n positionals,\n subcommands: [],\n options,\n };\n}\n","import { Option, OptionDecoder } from \"./Option\";\nimport { Positional, PositionalDecoder } from \"./Positional\";\nimport { ReaderArgs } from \"./Reader\";\nimport { UsageOption, UsagePositional } from \"./Usage\";\n\n/**\n * Options, positionals, and an async handler that together form the logic of a CLI command.\n *\n * Created with {@link operation} and passed to {@link command},\n * {@link commandWithSubcommands}, or {@link commandChained}.\n *\n * @typeParam Context - Injected at execution; forwarded to handlers.\n * @typeParam Result - Value produced on execution; typically `void`.\n */\nexport type Operation<Context, Result> = {\n /**\n * Returns usage metadata without consuming any arguments.\n */\n generateUsage(): {\n /**\n * Registered options.\n */\n options: Array<UsageOption>;\n /**\n * Declared positionals, in order.\n */\n positionals: Array<UsagePositional>;\n };\n /**\n * Consumes args from `readerArgs` and returns an {@link OperationDecoder}.\n */\n consumeAndMakeDecoder(\n readerArgs: ReaderArgs,\n ): OperationDecoder<Context, Result>;\n};\n\n/**\n * Produced by {@link Operation.consumeAndMakeDecoder}.\n *\n * @typeParam Context - See {@link Operation}.\n * @typeParam Result - See {@link Operation}.\n */\nexport type OperationDecoder<Context, Result> = {\n /**\n * Creates a ready-to-execute {@link OperationInterpreter}.\n *\n * @throws {@link TypoError} if parsing or decoding failed.\n */\n decodeAndMakeInterpreter(): OperationInterpreter<Context, Result>;\n};\n\n/**\n * A fully parsed, decoded and ready-to-execute operation.\n *\n * @typeParam Context - Caller-supplied context.\n * @typeParam Result - Value produced on success.\n */\nexport type OperationInterpreter<Context, Result> = {\n /**\n * Executes with the provided context.\n */\n executeWithContext(context: Context): Promise<Result>;\n};\n\n/**\n * Creates an {@link Operation} from options, positionals, and an async handler.\n *\n * The `handler` receives `context` and `inputs` with decoded `options` and `positionals`.\n *\n * @typeParam Context - Context type accepted by the handler.\n * @typeParam Result - Return type of the handler.\n * @typeParam Options - Map of option keys to parsed value types.\n * @typeParam Positionals - Tuple of parsed positional value types, in order.\n *\n * @param inputs - Options and positionals this operation accepts.\n * @param inputs.options - Map of keys to {@link Option} descriptors.\n * @param inputs.positionals - Ordered array of {@link Positional} descriptors.\n * @param handler - Async function implementing the command logic.\n * @returns An {@link Operation}.\n *\n * @example\n * ```ts\n * const greetOperation = operation(\n * {\n * options: {\n * loud: optionFlag({ long: \"loud\", description: \"Print in uppercase\", default: false }),\n * },\n * positionals: [\n * positionalRequired({ type: type(\"name\"), description: \"Name to greet\" }),\n * ],\n * },\n * async function (_ctx, { options: { loud }, positionals: [name] }) {\n * const message = `Hello, ${name}!`;\n * console.log(loud ? message.toUpperCase() : message);\n * },\n * );\n * ```\n */\nexport function operation<\n Context,\n Result,\n Options extends { [option: string]: any },\n const Positionals extends Array<any>,\n>(\n inputs: {\n options: { [K in keyof Options]: Option<Options[K]> };\n positionals: { [K in keyof Positionals]: Positional<Positionals[K]> };\n },\n handler: (\n context: Context,\n inputs: {\n options: Options;\n positionals: Positionals;\n },\n ) => Promise<Result>,\n): Operation<Context, Result> {\n return {\n generateUsage() {\n const optionsUsage = new Array<UsageOption>();\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsUsage.push(optionInput.generateUsage());\n }\n const positionalsUsage = new Array<UsagePositional>();\n for (const positionalInput of inputs.positionals) {\n positionalsUsage.push(positionalInput.generateUsage());\n }\n return { options: optionsUsage, positionals: positionalsUsage };\n },\n consumeAndMakeDecoder(readerArgs: ReaderArgs) {\n const optionsDecoders: Record<string, OptionDecoder<any>> = {};\n for (const optionKey in inputs.options) {\n const optionInput = inputs.options[optionKey]!;\n optionsDecoders[optionKey] =\n optionInput.registerAndMakeDecoder(readerArgs);\n }\n const positionalsDecoders: Array<PositionalDecoder<any>> = [];\n for (const positionalInput of inputs.positionals) {\n positionalsDecoders.push(\n positionalInput.consumeAndMakeDecoder(readerArgs),\n );\n }\n return {\n decodeAndMakeInterpreter() {\n const optionsValues: any = {};\n for (const optionKey in optionsDecoders) {\n optionsValues[optionKey] =\n optionsDecoders[optionKey]!.getAndDecodeValue();\n }\n const positionalsValues: any = [];\n for (const positionalDecoder of positionalsDecoders) {\n positionalsValues.push(positionalDecoder.decodeValue());\n }\n return {\n executeWithContext(context: Context) {\n return handler(context, {\n options: optionsValues,\n positionals: positionalsValues,\n });\n },\n };\n },\n };\n },\n };\n}\n","import { statSync } from \"fs\";\nimport {\n TypoError,\n TypoString,\n typoStyleLogic,\n typoStyleQuote,\n TypoText,\n} from \"./Typo\";\n\n/**\n * Decodes a raw CLI string into a typed value.\n * A pair of a human-readable `content` name and a `decoder` function.\n *\n * Built-in: {@link type}, {@link typeBoolean}, {@link typeNumber},\n * {@link typeInteger}, {@link typeDatetime}, {@link typeUrl}.\n * Composite: {@link typeChoice}, {@link typeConverted}, {@link typeTuple}, {@link typeList}.\n *\n * @typeParam Value - Type produced by the decoder.\n */\nexport type Type<Value> = {\n /**\n * Human-readable name shown in help and errors (e.g. `\"name\"`, `\"number\"`).\n */\n content: string;\n /**\n * Decodes a raw CLI string into `Value`.\n *\n * @param input - Raw string from the command line.\n * @returns The decoded value.\n * @throws {@link TypoError} on invalid input.\n */\n decoder(input: string): Value;\n};\n\n/**\n * Decodes a string to `boolean` (case-insensitive).\n * Used by {@link optionFlag} for `--flag=<value>`.\n *\n * @example\n * ```ts\n * typeBoolean(\"flag\").decoder(\"true\") // → true\n * typeBoolean(\"flag\").decoder(\"yes\") // → true\n * typeBoolean(\"flag\").decoder(\"y\") // → true\n * typeBoolean(\"flag\").decoder(\"false\") // → false\n * typeBoolean(\"flag\").decoder(\"no\") // → false\n * typeBoolean(\"flag\").decoder(\"n\") // → false\n * ```\n */\nexport function typeBoolean(name?: string): Type<boolean> {\n return {\n content: name ?? \"boolean\",\n decoder(input: string) {\n const lower = input.toLowerCase();\n if (booleanValuesTrue.has(lower)) {\n return true;\n }\n if (booleanValuesFalse.has(lower)) {\n return false;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Not a boolean: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n },\n };\n}\nconst booleanValuesTrue = new Set([\"true\", \"yes\", \"on\", \"1\", \"y\", \"t\"]);\nconst booleanValuesFalse = new Set([\"false\", \"no\", \"off\", \"0\", \"n\", \"f\"]);\n\n/**\n * Parses a date/time string via `Date.parse`.\n * Accepts any format supported by `Date.parse`, including ISO 8601.\n *\n * @example\n * ```ts\n * typeDatetime(\"my-datetime\").decoder(\"2024-01-15\") // → Date object for 2024-01-15\n * typeDatetime(\"my-datetime\").decoder(\"2024-01-15T13:45:30Z\") // → Date object for 2024-01-15 13:45:30 UTC\n * typeDatetime(\"my-datetime\").decoder(\"not a date\") // throws TypoError\n * ```\n */\nexport function typeDatetime(name?: string): Type<Date> {\n return {\n content: name ?? \"datetime\",\n decoder(input: string) {\n try {\n const timestampMs = Date.parse(input);\n if (isNaN(timestampMs)) {\n throw new Error();\n }\n return new Date(timestampMs);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Not a valid ISO_8601 datetime: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n };\n}\n\n/**\n * Parses a string to `number` via `Number()`; `NaN` throws {@link TypoError}.\n *\n * @example\n * ```ts\n * typeNumber(\"my-number\").decoder(\"3.14\") // → 3.14\n * typeNumber(\"my-number\").decoder(\"-1\") // → -1\n * typeNumber(\"my-number\").decoder(\"hello\") // throws TypoError\n * ```\n */\nexport function typeNumber(name?: string): Type<number> {\n return {\n content: name ?? \"number\",\n decoder(input: string) {\n try {\n const parsed = Number(input);\n if (isNaN(parsed)) {\n throw new Error();\n }\n return parsed;\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Not a number: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n };\n}\n\n/**\n * Parses an integer string to `bigint` via `BigInt()`.\n * Floats and non-numeric strings throw {@link TypoError}.\n *\n * @example\n * ```ts\n * typeInteger(\"my-integer\").decoder(\"42\") // → 42n\n * typeInteger(\"my-integer\").decoder(\"3.14\") // throws TypoError\n * typeInteger(\"my-integer\").decoder(\"abc\") // throws TypoError\n * ```\n */\nexport function typeInteger(name?: string): Type<bigint> {\n return {\n content: name ?? \"integer\",\n decoder(input: string) {\n try {\n return BigInt(input);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Not an integer: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n };\n}\n\n/**\n * Parses an absolute URL string to a `URL` object.\n * Relative or malformed URLs throw {@link TypoError}.\n *\n * @example\n * ```ts\n * typeUrl(\"my-url\").decoder(\"https://example.com\") // → URL { href: \"https://example.com/\", ... }\n * typeUrl(\"my-url\").decoder(\"not-a-url\") // throws TypoError\n * ```\n */\nexport function typeUrl(name?: string): Type<URL> {\n return {\n content: name ?? \"url\",\n decoder(input: string) {\n try {\n return new URL(input);\n } catch {\n throw new TypoError(\n new TypoText(\n new TypoString(`Not an URL: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n },\n };\n}\n\n/**\n * A named type that accepts any string as input.\n * @param name - Name shown in help and errors (e.g. `\"my-value\"`).\n * @example\n * ```ts\n * type(\"greeting\").decoder(\"hello\") // → \"hello\"\n * type(\"greeting\").decoder(\"\") // → \"\"\n * ```\n */\nexport function type(name?: string): Type<string> {\n return {\n content: name ?? \"string\",\n decoder: (input: string) => input,\n };\n}\n\n/**\n * Chains `before`'s decoder with an `after` transformation.\n * `before` errors are prefixed with `\"from: <content>\"` for traceability.\n *\n * @typeParam Before - Intermediate type from `before.decoder`.\n * @typeParam After - Final type from `after.decoder`.\n *\n * @param name - Name shown in help and errors (e.g. `\"my-value\"`).\n * @param before - Base type to decode the raw string.\n * @param mapper - Transforms `before`'s output to the final value; errors are wrapped with context.\n * @returns A {@link Type}`<After>`.\n *\n * @example\n * ```ts\n * const typePort = typeConverted(\"port\", typeNumber(), (n) => {\n * if (n < 1 || n > 65535) throw new Error(\"Out of range\");\n * return n;\n * });\n * // \"--port 8080\" → 8080\n * // \"--port 99999\" → TypoError: --port: <PORT>: Port: Out of range\n * ```\n */\nexport function typeConverted<Before, After>(\n name: string,\n before: Type<Before>,\n mapper: (value: Before) => After,\n): Type<After> {\n return {\n content: name,\n decoder: (input: string) => {\n return mapper(\n TypoError.tryWithContext(\n () => before.decoder(input),\n () =>\n new TypoText(\n new TypoString(\"from: \"),\n new TypoString(before.content, typoStyleLogic),\n ),\n ),\n );\n },\n };\n}\n\n/**\n * Adds a name to a {@link Type} for clearer error messages and help text.\n *\n * @param name - Name to use for the type.\n * @param type - Base type to name.\n * @returns A {@link Type} with the given name.\n */\nexport function typeRenamed<Value>(\n type: Type<Value>,\n name: string,\n): Type<Value> {\n return {\n content: name,\n decoder: (input: string) => {\n return TypoError.tryWithContext(\n () => type.decoder(input),\n () =>\n new TypoText(\n new TypoString(\"from: \"),\n new TypoString(type.content, typoStyleLogic),\n ),\n );\n },\n };\n}\n\n/**\n * Creates a {@link Type} for filesystem paths with optional existence checks.\n * @param checks - Optional checks for path existence and type (file/directory).\n * @returns A {@link Type}`<string>` representing the path.\n */\nexport function typePath(\n name?: string,\n checks?: { checkSyncExistAs?: \"file\" | \"directory\" | \"anything\" },\n): Type<string> {\n return {\n content: name ?? \"path\",\n decoder(input: string) {\n if (input.length === 0) {\n throw new Error(`Path cannot be empty`);\n }\n if (input.includes(\"\\0\")) {\n throw new Error(`Path cannot contain null characters`);\n }\n if (checks?.checkSyncExistAs !== undefined) {\n const stats = statSync(input);\n const preview = stats.isDirectory()\n ? \"directory\"\n : stats.isFile()\n ? \"file\"\n : \"unknown\";\n if (checks.checkSyncExistAs === \"file\" && !stats.isFile()) {\n throw new TypoError(\n new TypoText(\n new TypoString(`Expected a 'file' but found '${preview}': `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n if (checks.checkSyncExistAs === \"directory\" && !stats.isDirectory()) {\n throw new TypoError(\n new TypoText(\n new TypoString(`Expected a 'directory' but found '${preview}': `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n }\n return input;\n },\n };\n}\n\n/**\n * Creates a {@link Type}`<string>` that only accepts a fixed set of values.\n * Out-of-set inputs throw {@link TypoError} listing up to 5 valid options.\n *\n * @param name - Name shown in help and errors.\n * @param values - Ordered list of accepted values.\n * @returns A {@link Type}`<string>`.\n *\n * @example\n * ```ts\n * const typeEnv = typeChoice(\"environment\", [\"dev\", \"staging\", \"prod\"]);\n * typeEnv.decoder(\"prod\") // → \"prod\"\n * typeEnv.decoder(\"unknown\") // throws TypoError: Invalid value: \"unknown\" (expected one of: \"dev\" | \"staging\" | \"prod\")\n * ```\n */\nexport function typeChoice<const Value extends string>(\n name: string,\n values: Array<Value>,\n caseSensitive: boolean = false,\n): Type<Value> {\n const normalize = caseSensitive\n ? (s: string) => s\n : (s: string) => s.toLowerCase();\n const valueMap = new Map(values.map((value) => [normalize(value), value]));\n return {\n content: name,\n decoder(input: string) {\n const normalized = normalize(input);\n const original = valueMap.get(normalized);\n if (original !== undefined) {\n return original;\n }\n const valuesPreview = [];\n for (const value of values) {\n if (valuesPreview.length >= 5) {\n valuesPreview.push(new TypoString(`...`));\n break;\n }\n if (valuesPreview.length > 0) {\n valuesPreview.push(new TypoString(` | `));\n }\n valuesPreview.push(new TypoString(`\"${value}\"`, typoStyleQuote));\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Invalid value: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n new TypoString(` (expected one of: `),\n ...valuesPreview,\n new TypoString(`)`),\n ),\n );\n },\n };\n}\n\n/**\n * Splits a delimited string into a typed tuple.\n * Each part is decoded by the corresponding element type; wrong count or decode failure throws {@link TypoError}.\n *\n * @typeParam Elements - Tuple of decoded value types (inferred from `elementTypes`).\n *\n * @param elementTypes - One {@link Type} per tuple element, in order.\n * @param separator - Delimiter (default `\",\"`).\n * @returns A {@link Type}`<Elements>`.\n *\n * @example\n * ```ts\n * const typePoint = typeTuple([typeNumber(\"x\"), typeNumber(\"y\")]);\n * typePoint.decoder(\"3.14,2.71\") // → [3.14, 2.71]\n * typePoint.decoder(\"1,2,3\") // → [1, 2]\n * typePoint.decoder(\"x,2\") // throws TypoError: at 0: Number: Unable to parse: \"x\"\n * ```\n */\nexport function typeTuple<const Elements extends Array<any>>(\n elementTypes: { [K in keyof Elements]: Type<Elements[K]> },\n separator: string = \",\",\n): Type<Elements> {\n return {\n content: elementTypes\n .map((elementType) => elementType.content)\n .join(separator),\n decoder(input: string) {\n const splits = input.split(separator, elementTypes.length);\n if (splits.length !== elementTypes.length) {\n throw new TypoError(\n new TypoText(\n new TypoString(`Found ${splits.length} splits: `),\n new TypoString(`Expected ${elementTypes.length} splits from: `),\n new TypoString(`\"${input}\"`, typoStyleQuote),\n ),\n );\n }\n return splits.map((split, index) => {\n const elementType = elementTypes[index]!;\n return TypoError.tryWithContext(\n () => elementType.decoder(split),\n () =>\n new TypoText(\n new TypoString(`at ${index}: `),\n new TypoString(elementType.content, typoStyleLogic),\n ),\n );\n }) as Elements;\n },\n };\n}\n\n/**\n * Splits a delimited string into a typed array.\n * Each part is decoded by `elementType`; failed decodes throw {@link TypoError}.\n * Note: splitting an empty string yields one empty element — prefer {@link optionRepeatable} for a zero-default.\n *\n * @typeParam Value - Element type produced by `elementType.decoder`.\n *\n * @param elementType - Decoder applied to each element.\n * @param separator - Delimiter (default `\",\"`).\n * @returns A {@link Type}`<Array<Value>>`.\n *\n * @example\n * ```ts\n * const typeNumbers = typeList(typeNumber);\n * typeNumbers.decoder(\"1,2,3\") // → [1, 2, 3]\n * typeNumbers.decoder(\"1,x,3\") // throws TypoError: at 1: Number: Unable to parse: \"x\"\n *\n * const typePaths = typeList(typePath(), \":\");\n * typePaths.decoder(\"/usr/bin:/usr/local/bin\") // → [\"/usr/bin\", \"/usr/local/bin\"]\n * ```\n */\nexport function typeList<Value>(\n elementType: Type<Value>,\n separator: string = \",\",\n): Type<Array<Value>> {\n return {\n content: `${elementType.content}[${separator}${elementType.content}]...`,\n decoder(input: string) {\n const splits = input.split(separator);\n return splits.map((split, index) =>\n TypoError.tryWithContext(\n () => elementType.decoder(split),\n () =>\n new TypoText(\n new TypoString(`at ${index}: `),\n new TypoString(elementType.content, typoStyleLogic),\n ),\n ),\n );\n },\n };\n}\n","import { ReaderOptionParsing, ReaderArgs as ReaderOptions } from \"./Reader\";\nimport { Type, typeBoolean } from \"./Type\";\nimport {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleLogic,\n typoStyleUserInput,\n TypoText,\n} from \"./Typo\";\nimport { UsageOption } from \"./Usage\";\n\n/**\n * A CLI option. Created with {@link optionFlag}, {@link optionSingleValue},\n * or {@link optionRepeatable}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type Option<Value> = {\n /**\n * Returns metadata for the `Options:` section.\n */\n generateUsage(): UsageOption;\n /**\n * Registers the option on `readerOptions` and returns an {@link OptionDecoder}.\n */\n registerAndMakeDecoder(readerOptions: ReaderOptions): OptionDecoder<Value>;\n};\n\n/**\n * Produced by {@link Option.registerAndMakeDecoder}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type OptionDecoder<Value> = {\n /**\n * Returns the decoded option value.\n *\n * @throws {@link TypoError} if decoding failed.\n */\n getAndDecodeValue(): Value;\n};\n\n/**\n * Creates a boolean flag option (`--verbose`, optionally `--flag=no`).\n *\n * Parsing: absent → default value; `--flag` / `--flag=yes` → `true`; `--flag=no` → `false`;\n * specified more than once → throws {@link TypoError}.\n *\n * @param definition.long - Long-form name (without `--`).\n * @param definition.short - Short-form name (without `-`).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.aliases - Additional names.\n * @param definition.default - Default value when absent.\n * @returns An {@link Option}`<boolean>`.\n *\n * @example\n * ```ts\n * const verboseFlag = optionFlag({\n * long: \"verbose\",\n * short: \"v\",\n * description: \"Enable verbose output\",\n * });\n * // Usage:\n * // my-cli → false\n * // my-cli --verbose → true\n * // my-cli --verbose=yes → true\n * // my-cli -v=no → false\n * ```\n */\nexport function optionFlag(definition: {\n long: string;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<string>; shorts?: Array<string> };\n default?: boolean;\n}): Option<boolean> {\n const type = typeBoolean(\"value\");\n const { long, short, description, hint, aliases } = definition;\n return {\n generateUsage() {\n return { short, long, annotation: \"[=no]\", description, hint };\n },\n registerAndMakeDecoder(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n long,\n short,\n aliasesLongs: aliases?.longs,\n aliasesShorts: aliases?.shorts,\n parsing: { consumeShortGroup: false, consumeNextArg: () => false },\n });\n return {\n getAndDecodeValue() {\n const optionResults = readerOptions.getOptionValues(key);\n if (optionResults.length > 1) {\n throwSetMultipleTimesError(long);\n }\n if (optionResults.length === 0) {\n return definition.default === undefined\n ? false\n : definition.default;\n }\n const positiveResult = optionResults[0]!;\n const value =\n positiveResult.inlined === null ? \"true\" : positiveResult.inlined;\n return decodeValue({ long, short, type, input: value });\n },\n };\n },\n };\n}\n\n/**\n * Creates an option that accepts exactly one value (e.g. `--output dist/`).\n *\n * Parsing: absent → `defaultValue()`; once → decoded with `type`; more than once → {@link TypoError}.\n * Value syntax: `--long value`, `--long=value`, `-s value`, `-s=value`, `-svalue`.\n *\n * @typeParam Value - Type produced by the decoder.\n *\n * @param definition.long - Long-form name (without `--`).\n * @param definition.short - Short-form name (without `-`).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.aliases - Additional names.\n * @param definition.type - Decoder for the raw string value.\n * @param definition.valueWhenNotDefined - Default value when the option is not specified at all.\n * @param definition.valueWhenNotInlined - Default value when the option is specified without an inline value (e.g. `--option` or `-o`).\n * @returns An {@link Option}`<Value>`.\n *\n * @example\n * ```ts\n * const outputOption = optionSingleValue({\n * long: \"output\",\n * short: \"o\",\n * type: typePath(),\n * description: \"Output directory\",\n * valueWhenNotDefined: () => \"dist\",\n * });\n * // Usage:\n * // my-cli → \"dist\"\n * // my-cli --output folder → \"folder\"\n * // my-cli -o folder → \"folder\"\n * ```\n */\nexport function optionSingleValue<Value>(definition: {\n long: string;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<string>; shorts?: Array<string> };\n type: Type<Value>;\n defaultWhenNotDefined: () => Value;\n defaultWhenNotInlined?: () => Value;\n}): Option<Value> {\n const { long, short, description, hint, aliases, type } = definition;\n const label = `<${type.content}>`;\n return {\n generateUsage() {\n return { short, long, label, description, hint };\n },\n registerAndMakeDecoder(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n long,\n short,\n aliasesLongs: aliases?.longs,\n aliasesShorts: aliases?.shorts,\n parsing: {\n consumeShortGroup: true,\n consumeNextArg(inlined, separated) {\n if (definition.defaultWhenNotInlined !== undefined) {\n return false;\n }\n return inlined === null && separated.length === 0;\n },\n },\n });\n return {\n getAndDecodeValue() {\n const optionResults = readerOptions.getOptionValues(key);\n if (optionResults.length > 1) {\n throwSetMultipleTimesError(long);\n }\n const optionResult = optionResults[0];\n if (optionResult === undefined) {\n try {\n return definition.defaultWhenNotDefined();\n } catch (error) {\n throwFailedToGetDefaultValueError(long, error, \"not set\");\n }\n }\n if (optionResult.inlined) {\n const inlined = optionResult.inlined;\n return decodeValue({ long, short, label, type, input: inlined });\n }\n if (definition.defaultWhenNotInlined !== undefined) {\n try {\n return definition.defaultWhenNotInlined();\n } catch (error) {\n throwFailedToGetDefaultValueError(long, error, \"not inlined\");\n }\n }\n const separated = optionResult.separated[0]!;\n return decodeValue({ long, short, label, type, input: separated });\n },\n };\n },\n };\n}\n\n/**\n * Creates an option that collects every occurrence into an array (e.g. `--file a.ts --file b.ts`).\n *\n * Parsing: absent → `[]`; N occurrences → array of N decoded values in order.\n * Value syntax: `--long value`, `--long=value`, `-s value`, `-s=value`, `-svalue`.\n *\n * @typeParam Value - Type produced by the decoder for each occurrence.\n *\n * @param definition.long - Long-form name (without `--`).\n * @param definition.short - Short-form name (without `-`).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.aliases - Additional names.\n * @param definition.type - Decoder applied to each raw string value.\n * @returns An {@link Option}`<Array<Value>>`.\n *\n * @example\n * ```ts\n * const filesOption = optionRepeatable({\n * long: \"file\",\n * short: \"f\",\n * type: typeString,\n * label: \"PATH\",\n * description: \"Input file (may be repeated)\",\n * });\n * // Usage: my-cli --file a.ts --file b.ts → [\"a.ts\", \"b.ts\"]\n * ```\n */\nexport function optionRepeatable<Value>(definition: {\n long: string;\n short?: string;\n description?: string;\n hint?: string;\n aliases?: { longs?: Array<string>; shorts?: Array<string> };\n type: Type<Value>;\n}): Option<Array<Value>> {\n const { long, short, description, hint, aliases, type } = definition;\n const label = `<${type.content}>`;\n return {\n generateUsage() {\n return { short, long, label, annotation: \" [*]\", description, hint };\n },\n registerAndMakeDecoder(readerOptions: ReaderOptions) {\n const key = registerOption(readerOptions, {\n long,\n short,\n aliasesLongs: aliases?.longs,\n aliasesShorts: aliases?.shorts,\n parsing: {\n consumeShortGroup: true,\n consumeNextArg: (inlined, separated) =>\n inlined === null && separated.length === 0,\n },\n });\n return {\n getAndDecodeValue() {\n const optionResults = readerOptions.getOptionValues(key);\n return optionResults.map((optionResult) => {\n const input = optionResult.inlined ?? optionResult.separated[0]!;\n return decodeValue({ long, short, label, type, input });\n });\n },\n };\n },\n };\n}\n\nfunction decodeValue<Value>(params: {\n long: string;\n short?: string | undefined;\n label?: string | undefined;\n type: Type<Value>;\n input: string;\n}): Value {\n return TypoError.tryWithContext(\n () => params.type.decoder(params.input),\n () => {\n const text = new TypoText();\n if (params.short) {\n text.push(new TypoString(`-${params.short}`, typoStyleConstants));\n text.push(new TypoString(`, `));\n }\n text.push(new TypoString(`--${params.long}`, typoStyleConstants));\n if (params.label) {\n text.push(new TypoString(`: `));\n text.push(new TypoString(params.label, typoStyleUserInput));\n } else {\n text.push(new TypoString(`: `));\n text.push(new TypoString(params.type.content, typoStyleLogic));\n }\n return text;\n },\n );\n}\n\nfunction registerOption(\n readerOptions: ReaderOptions,\n definition: {\n long: string;\n short: undefined | string;\n aliasesLongs: undefined | Array<string>;\n aliasesShorts: undefined | Array<string>;\n parsing: ReaderOptionParsing;\n },\n) {\n const { long, short, aliasesLongs, aliasesShorts, parsing } = definition;\n const longs = long ? [long] : [];\n if (aliasesLongs) {\n longs.push(...aliasesLongs);\n }\n const shorts = short ? [short] : [];\n if (aliasesShorts) {\n shorts.push(...aliasesShorts);\n }\n return readerOptions.registerOption({ longs, shorts, parsing });\n}\n\nfunction throwSetMultipleTimesError(long: string): never {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${long}`, typoStyleConstants),\n new TypoString(`: Must not be set multiple times`),\n ),\n );\n}\n\nfunction throwFailedToGetDefaultValueError(\n long: string,\n error: unknown,\n context: string,\n): never {\n throw new TypoError(\n new TypoText(\n new TypoString(`--${long}`, typoStyleConstants),\n new TypoString(`: Failed to get default value (${context})`),\n ),\n error,\n );\n}\n","import { ReaderPositionals } from \"./Reader\";\nimport { Type } from \"./Type\";\nimport { TypoError, TypoString, typoStyleUserInput, TypoText } from \"./Typo\";\nimport { UsagePositional } from \"./Usage\";\n\n/**\n * A positional argument. Created with {@link positionalRequired}, {@link positionalOptional},\n * or {@link positionalVariadics}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type Positional<Value> = {\n /**\n * Returns metadata for the `Positionals:` section.\n */\n generateUsage(): UsagePositional;\n /**\n * Consumes the next positional token from `readerPositionals`.\n * Returns a decoder that produces the final value.\n */\n consumeAndMakeDecoder(\n readerPositionals: ReaderPositionals,\n ): PositionalDecoder<Value>;\n};\n\n/**\n * Produced by {@link Positional.consumeAndMakeDecoder}.\n *\n * @typeParam Value - Decoded value type.\n */\nexport type PositionalDecoder<Value> = {\n /**\n * Returns the decoded positional value.\n *\n * @throws {@link TypoError} if decoding failed.\n */\n decodeValue(): Value;\n};\n\n/**\n * Creates a required positional — missing token throws {@link TypoError}.\n *\n * @typeParam Value - Type produced by the decoder.\n *\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.type - Decoder for the raw token.\n * @returns A {@link Positional}`<Value>`.\n *\n * @example\n * ```ts\n * const namePositional = positionalRequired({\n * type: type(\"name\"),\n * description: \"The name to greet\",\n * });\n * // Usage:\n * // my-cli Alice → \"Alice\"\n * ```\n */\nexport function positionalRequired<Value>(definition: {\n description?: string;\n hint?: string;\n type: Type<Value>;\n}): Positional<Value> {\n const { description, hint, type } = definition;\n const label = `<${type.content}>`;\n return {\n generateUsage() {\n return { description, hint, label };\n },\n consumeAndMakeDecoder(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n if (positional === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Is required, but was not provided`),\n ),\n );\n }\n return {\n decodeValue() {\n return decodeValue(label, definition.type, positional);\n },\n };\n },\n };\n}\n\n/**\n * Creates an optional positional — absent token falls back to `default()`.\n *\n * @typeParam Value - Type produced by the decoder (or the default).\n *\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.type - Decoder for the raw token.\n * @param definition.default - Value when absent. Throw to make it required.\n * @returns A {@link Positional}`<Value>`.\n *\n * @example\n * ```ts\n * const greeteePositional = positionalOptional({\n * type: type(\"name\"),\n * description: \"Name to greet (default: world)\",\n * default: () => \"world\",\n * });\n * // Usage:\n * // my-cli → \"world\"\n * // my-cli Alice → \"Alice\"\n * ```\n */\nexport function positionalOptional<Value>(definition: {\n description?: string;\n hint?: string;\n type: Type<Value>;\n default: () => Value;\n}): Positional<Value> {\n const { description, hint, type } = definition;\n const label = `[${type.content}]`;\n return {\n generateUsage() {\n return { description, hint, label };\n },\n consumeAndMakeDecoder(readerPositionals: ReaderPositionals) {\n const positional = readerPositionals.consumePositional();\n return {\n decodeValue() {\n if (positional === undefined) {\n try {\n return definition.default();\n } catch (error) {\n throwsWhenFailedToGetDefault(label);\n }\n }\n return decodeValue(label, definition.type, positional);\n },\n };\n },\n };\n}\n\n/**\n * Creates a variadic positional that collects zero or more remaining tokens into an array.\n * Optionally stops at `endDelimiter` (consumed, not included).\n *\n * @typeParam Value - Type produced by the decoder for each token.\n *\n * @param definition.endDelimiter - Sentinel token that stops collection (consumed, not included).\n * @param definition.description - Help text.\n * @param definition.hint - Short note shown in parentheses.\n * @param definition.type - Decoder applied to each token.\n * @returns A {@link Positional}`<Array<Value>>`.\n *\n * @example\n * ```ts\n * const filesPositional = positionalVariadics({\n * type: typePath(),\n * description: \"Files to process\",\n * });\n * // Usage:\n * // my-cli → []\n * // my-cli a.ts b.ts c.ts → [\"a.ts\", \"b.ts\", \"c.ts\"]\n * ```\n */\nexport function positionalVariadics<Value>(definition: {\n endDelimiter?: string;\n description?: string;\n hint?: string;\n type: Type<Value>;\n}): Positional<Array<Value>> {\n const { description, hint, type } = definition;\n const labelSingle = `[${type.content}]`;\n const labelMultiple =\n `${labelSingle}...` +\n (definition.endDelimiter ? ` [\"${definition.endDelimiter}\"]` : \"\");\n return {\n generateUsage() {\n return { description, hint, label: labelMultiple };\n },\n consumeAndMakeDecoder(readerPositionals: ReaderPositionals) {\n const positionals = new Array<string>();\n while (true) {\n const positional = readerPositionals.consumePositional();\n if (\n positional === undefined ||\n positional === definition.endDelimiter\n ) {\n break;\n }\n positionals.push(positional);\n }\n return {\n decodeValue() {\n return positionals.map((positional) =>\n decodeValue(labelSingle, definition.type, positional),\n );\n },\n };\n },\n };\n}\n\nfunction decodeValue<Value>(\n label: string,\n type: Type<Value>,\n input: string,\n): Value {\n return TypoError.tryWithContext(\n () => type.decoder(input),\n () => new TypoText(new TypoString(label, typoStyleUserInput)),\n );\n}\n\nfunction throwsWhenFailedToGetDefault(label: string): never {\n throw new TypoError(\n new TypoText(\n new TypoString(label, typoStyleUserInput),\n new TypoString(`: Failed to get default value`),\n ),\n );\n}\n","import {\n TypoError,\n TypoString,\n typoStyleConstants,\n typoStyleQuote,\n TypoText,\n} from \"./Typo\";\n\n/**\n * Opaque key returned by {@link ReaderArgs.registerOption}.\n */\nexport type ReaderOptionKey = (string | { __brand: \"ReaderOptionKey\" }) & {\n __brand: \"ReaderOptionKey\";\n};\n\n/**\n * Parsing behaviour for a registered option, passed to {@link ReaderArgs.registerOption}.\n */\nexport type ReaderOptionParsing = {\n consumeShortGroup: boolean; // TODO - this doesnt matter when no short option\n consumeNextArg: (\n inlined: string | null,\n separated: Array<string>,\n nextArg: string | undefined,\n ) => boolean;\n};\n\n/**\n * Result of parsing an option, including its inlined value and any following separated values.\n */\nexport type ReaderOptionValue = {\n inlined: string | null;\n separated: Array<string>;\n};\n\n/**\n * Option registration/query interface. Subset of {@link ReaderArgs}.\n */\nexport type ReaderOptions = {\n /**\n * Registers an option; all `longs` and `shorts` share the same key.\n *\n * @param definition.longs - Long-form names (without `--`).\n * @param definition.shorts - Short-form names (without `-`).\n * @param definition.parsing - Parsing behaviour.\n * @returns A {@link ReaderOptionKey} for later retrieval.\n * @throws `Error` if a name is already registered or short names overlap.\n */\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n parsing: ReaderOptionParsing;\n }): ReaderOptionKey;\n /**\n * Returns all values collected for `key`.\n */\n getOptionValues(key: ReaderOptionKey): Array<ReaderOptionValue>;\n};\n\n/**\n * Positional consumption interface. Subset of {@link ReaderArgs}.\n */\nexport type ReaderPositionals = {\n /**\n * Returns the next positional token, parsing intervening options as side-effects.\n *\n * @returns The next positional, or `undefined` when exhausted.\n * @throws {@link TypoError} on an unrecognised option.\n */\n consumePositional(): string | undefined;\n};\n\n/**\n * Core argument parser: converts raw CLI tokens into named options and positionals.\n * Options must be registered before {@link ReaderArgs.consumePositional} is called.\n *\n * Supported syntax: `--name`, `--name value`, `--name=value`,\n * `-n`, `-n value`, `-nvalue`, `-abc` (stacked), `--` (end-of-options).\n *\n * Created internally by {@link runAndExit}; exposed for advanced / custom runners.\n */\nexport class ReaderArgs {\n #args: ReadonlyArray<string>;\n #parsedIndex: number;\n #parsedDouble: boolean;\n #optionContextByLong: Map<string, ReaderOptionContext>;\n #optionContextByShort: Map<string, ReaderOptionContext>;\n #optionContextByKey: Map<ReaderOptionKey, ReaderOptionContext>;\n\n /**\n * @param args - Raw CLI tokens (e.g. `process.argv.slice(2)`). Not mutated.\n */\n constructor(args: ReadonlyArray<string>) {\n this.#args = args;\n this.#parsedIndex = 0;\n this.#parsedDouble = false;\n this.#optionContextByLong = new Map();\n this.#optionContextByShort = new Map();\n this.#optionContextByKey = new Map();\n }\n\n /**\n * Registers an option; all `longs` and `shorts` share the same key.\n * Short names must not be prefixes of one another.\n *\n * @param definition.longs - Long-form names (without `--`).\n * @param definition.shorts - Short-form names (without `-`).\n * @param definition.parsing - Parsing behaviour.\n * @returns A {@link ReaderOptionKey} for {@link ReaderArgs.getOptionValues}.\n * @throws `Error` if any name is already registered or short names overlap.\n */\n registerOption(definition: {\n longs: Array<string>;\n shorts: Array<string>;\n parsing: ReaderOptionParsing;\n }) {\n const key = [\n ...definition.longs.map((long) => `--${long}`),\n ...definition.shorts.map((short) => `-${short}`),\n ].join(\", \") as ReaderOptionKey;\n for (const long of definition.longs) {\n if (!this.#isValidOptionName(long)) {\n throw new Error(`Invalid option name: --${long}`);\n }\n if (this.#optionContextByLong.has(long)) {\n throw new Error(`Option already registered: --${long}`);\n }\n }\n for (const short of definition.shorts) {\n if (!this.#isValidOptionName(short)) {\n throw new Error(`Invalid option name: -${short}`);\n }\n if (this.#optionContextByShort.has(short)) {\n throw new Error(`Option already registered: -${short}`);\n }\n for (let i = 0; i < short.length; i++) {\n const shortSlice = short.slice(0, i);\n if (this.#optionContextByShort.has(shortSlice)) {\n throw new Error(\n `Option -${short} overlap with shorter option: -${shortSlice}`,\n );\n }\n }\n for (const shortOther of this.#optionContextByShort.keys()) {\n if (shortOther.startsWith(short)) {\n throw new Error(\n `Option -${short} overlap with longer option: -${shortOther}`,\n );\n }\n }\n }\n const optionContext = {\n parsing: definition.parsing,\n results: new Array<ReaderOptionValue>(),\n };\n for (const long of definition.longs) {\n this.#optionContextByLong.set(long, optionContext);\n }\n for (const short of definition.shorts) {\n this.#optionContextByShort.set(short, optionContext);\n }\n this.#optionContextByKey.set(key, optionContext);\n return key;\n }\n\n /**\n * Returns all values collected for `key`.\n *\n * @param key - Key from {@link ReaderArgs.registerOption}.\n * @returns One entry per occurrence.\n * @throws `Error` if `key` was not registered.\n */\n getOptionValues(key: ReaderOptionKey): Array<ReaderOptionValue> {\n const optionContext = this.#optionContextByKey.get(key);\n if (optionContext === undefined) {\n throw new Error(`Unregistered option: ${key}`);\n }\n return optionContext.results;\n }\n\n /**\n * Returns the next positional token; parses intervening options as a side-effect.\n * All tokens after `--` are treated as positionals.\n *\n * @returns The next positional, or `undefined` when exhausted.\n * @throws {@link TypoError} on an unrecognised option.\n */\n consumePositional(): string | undefined {\n while (true) {\n const arg = this.#consumeArg();\n if (arg === undefined) {\n return undefined;\n }\n if (!this.#tryConsumeAsOption(arg)) {\n return arg;\n }\n }\n }\n\n #consumeArg(): string | undefined {\n const arg = this.#args[this.#parsedIndex];\n if (arg === undefined) {\n return undefined;\n }\n this.#parsedIndex++;\n if (!this.#parsedDouble) {\n if (arg === \"--\") {\n this.#parsedDouble = true;\n return this.#consumeArg();\n }\n }\n return arg;\n }\n\n #tryConsumeAsOption(arg: string): boolean {\n if (this.#parsedDouble) {\n return false;\n }\n if (arg.startsWith(\"--\")) {\n const valueIndexStart = arg.indexOf(\"=\");\n if (valueIndexStart === -1) {\n this.#consumeOptionLong(arg.slice(2), null);\n } else {\n this.#consumeOptionLong(\n arg.slice(2, valueIndexStart),\n arg.slice(valueIndexStart + 1),\n );\n }\n return true;\n }\n if (arg.startsWith(\"-\")) {\n let shortIndexStart = 1;\n let shortIndexEnd = 2;\n while (shortIndexEnd <= arg.length) {\n const short = arg.slice(shortIndexStart, shortIndexEnd);\n const optionContext = this.#optionContextByShort.get(short);\n if (optionContext !== undefined) {\n const rest = arg.slice(shortIndexEnd);\n if (this.#tryConsumeOptionShort(optionContext, short, rest)) {\n return true;\n }\n shortIndexStart = shortIndexEnd;\n }\n shortIndexEnd++;\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Unexpected unknown option(s): `),\n new TypoString(`-${arg.slice(shortIndexStart)}`, typoStyleQuote),\n ),\n );\n }\n return false;\n }\n\n #consumeOptionLong(long: string, inlined: string | null): void {\n const constant = `--${long}`;\n const optionContext = this.#optionContextByLong.get(long);\n if (optionContext !== undefined) {\n return this.#consumeOptionValues(optionContext, constant, inlined);\n }\n throw new TypoError(\n new TypoText(\n new TypoString(`Unexpected unknown option: `),\n new TypoString(constant, typoStyleQuote),\n ),\n );\n }\n\n #tryConsumeOptionShort(\n optionContext: ReaderOptionContext,\n short: string,\n rest: string,\n ): boolean {\n const constant = `-${short}`;\n if (rest.startsWith(\"=\")) {\n this.#consumeOptionValues(optionContext, constant, rest.slice(1));\n return true;\n }\n if (rest.length === 0) {\n this.#consumeOptionValues(optionContext, constant, null);\n return true;\n }\n if (optionContext.parsing.consumeShortGroup) {\n this.#consumeOptionValues(optionContext, constant, rest);\n return true;\n }\n this.#consumeOptionValues(optionContext, constant, null);\n return false;\n }\n\n #consumeOptionValues(\n optionContext: ReaderOptionContext,\n constant: string,\n inlined: string | null,\n ) {\n const separated = new Array<string>();\n while (\n optionContext.parsing.consumeNextArg(\n inlined,\n separated,\n this.#args[this.#parsedIndex],\n )\n ) {\n separated.push(this.#consumeOptionValue(constant));\n }\n optionContext.results.push({ inlined, separated });\n }\n\n #consumeOptionValue(constant: string): string {\n const arg = this.#consumeArg();\n if (arg === undefined) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value, but got end of input`),\n ),\n );\n }\n if (this.#parsedDouble) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value before `),\n new TypoString(`\"--\"`, typoStyleQuote),\n ),\n );\n }\n // TODO - is that weird, could a valid value start with dash ?\n if (arg.startsWith(\"-\")) {\n throw new TypoError(\n new TypoText(\n new TypoString(constant, typoStyleConstants),\n new TypoString(`: Requires a value, but got: `),\n new TypoString(`\"${arg}\"`, typoStyleQuote),\n ),\n );\n }\n return arg;\n }\n\n #isValidOptionName(name: string): boolean {\n return name.length > 0 && !name.includes(\"=\") && !name.includes(\"\\0\");\n }\n}\n\ntype ReaderOptionContext = {\n parsing: ReaderOptionParsing;\n results: Array<ReaderOptionValue>;\n};\n","import { CommandInformation } from \"./Command\";\nimport {\n TypoGrid,\n TypoString,\n typoStyleConstants,\n typoStyleLogic,\n typoStyleRegularStrong,\n typoStyleRegularWeaker,\n typoStyleTitle,\n typoStyleUserInput,\n TypoSupport,\n TypoText,\n} from \"./Typo\";\n\n/**\n * Usage model. Produced by {@link CommandDecoder.generateUsage}, consumed by {@link usageToStyledLines}.\n */\nexport type UsageCommand = {\n /**\n * Segments of the usage line\n */\n segments: Array<{ positional: string } | { subcommand: string }>;\n /**\n * Command metadata.\n */\n information: CommandInformation;\n /**\n * Positionals in declaration order.\n */\n positionals: Array<UsagePositional>;\n /**\n * Subcommands, populated when none was selected.\n */\n subcommands: Array<UsageSubcommand>;\n /**\n * Options in registration order.\n */\n options: Array<UsageOption>;\n};\n\n/**\n * Positional metadata for the `Positionals:` section of help.\n */\nexport type UsagePositional = {\n /**\n * Help text.\n */\n description?: string | undefined;\n /**\n * Short note shown in parentheses.\n */\n hint?: string | undefined;\n /**\n * Placeholder label shown in the usage line and the `Positionals:` section.\n */\n label: string;\n};\n\n/**\n * Entry in the `Subcommands:` section.\n */\nexport type UsageSubcommand = {\n /**\n * Token the user types (e.g. `\"deploy\"`).\n */\n name: string;\n /**\n * From {@link CommandInformation.description}.\n */\n description?: string | undefined;\n /**\n * From {@link CommandInformation.hint}.\n */\n hint?: string | undefined;\n};\n\n/**\n * Option metadata for the `Options:` section of help.\n */\nexport type UsageOption = {\n /**\n * Short-form name without `-` (e.g. `\"v\"`).\n */\n short?: string | undefined;\n /**\n * Long-form name without `--` (e.g. `\"verbose\"`).\n */\n long: string;\n /**\n * Value placeholder in help (e.g. `\"<FILE>\"`).\n */\n label?: string | undefined;\n /**\n * Extra annotation appended to the option label in help.\n */\n annotation?: string | undefined;\n /**\n * Help text.\n */\n description?: string | undefined;\n /**\n * Short note shown in parentheses.\n */\n hint?: string | undefined;\n};\n\n/**\n * Converts a {@link UsageCommand} model into an array of styled lines ready to be\n * joined with `\"\\n\"` and printed to the terminal.\n *\n * The output format is:\n * ```\n * Usage: <cliName> [segments...]\n *\n * <description> (<hint>)\n * <detail lines...>\n *\n * Positionals:\n * <LABEL> <description> (<hint>)\n *\n * Subcommands:\n * <name> <description> (<hint>)\n *\n * Options:\n * -s, --long <LABEL><annotation> <description> (<hint>)\n *\n * Examples:\n * <description>\n * <command line>\n *\n * ```\n * Sections that have no entries are omitted. The trailing empty line is always included.\n *\n * Column alignment per section via {@link TypoGrid}.\n *\n * @param params.cliName - Program name for the usage line.\n * @param params.usage - From {@link CommandDecoder.generateUsage}.\n * @param params.typoSupport - Rendering mode.\n * @returns Styled lines; includes a trailing empty string.\n *\n * @example\n * ```ts\n * const lines = usageToStyledLines({\n * cliName: \"my-cli\",\n * usage: commandDecoder.generateUsage(),\n * typoSupport: TypoSupport.tty(),\n * });\n * process.stdout.write(lines.join(\"\\n\"));\n * ```\n */\nexport function usageToStyledLines(params: {\n cliName: string;\n usage: UsageCommand;\n typoSupport: TypoSupport;\n}) {\n const { cliName, usage, typoSupport } = params;\n\n const lines = new Array<string>();\n\n const segmentsText = new TypoText();\n segmentsText.push(textUsageHero(\"Usage:\"));\n segmentsText.push(textDelimiter(\" \"));\n segmentsText.push(textConstants(cliName));\n for (const segment of usage.segments) {\n segmentsText.push(textDelimiter(\" \"));\n if (\"positional\" in segment) {\n segmentsText.push(textUserInput(segment.positional));\n }\n if (\"subcommand\" in segment) {\n segmentsText.push(textConstants(segment.subcommand));\n }\n }\n lines.push(segmentsText.computeStyledString(typoSupport));\n\n lines.push(\"\");\n const introText = new TypoText();\n introText.push(textUsageText(usage.information.description));\n if (usage.information.hint) {\n introText.push(textDelimiter(\" \"));\n introText.push(textSubtleInfo(`(${usage.information.hint})`));\n }\n lines.push(introText.computeStyledString(typoSupport));\n for (const detail of usage.information.details ?? []) {\n const detailText = new TypoText();\n detailText.push(textSubtleInfo(detail));\n lines.push(detailText.computeStyledString(typoSupport));\n }\n\n if (usage.positionals.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Positionals:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const positionalUsage of usage.positionals) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textUserInput(positionalUsage.label)));\n typoGridRow.push(...createInformationals(positionalUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(...typoGrid.computeStyledLines(typoSupport));\n }\n\n if (usage.subcommands.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Subcommands:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const subcommandUsage of usage.subcommands) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n typoGridRow.push(new TypoText(textConstants(subcommandUsage.name)));\n typoGridRow.push(...createInformationals(subcommandUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(...typoGrid.computeStyledLines(typoSupport));\n }\n\n if (usage.options.length > 0) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Options:\").computeStyledString(typoSupport));\n const typoGrid = new TypoGrid();\n for (const optionUsage of usage.options) {\n const typoGridRow = new Array<TypoText>();\n typoGridRow.push(new TypoText(textDelimiter(\" \")));\n if (optionUsage.short) {\n typoGridRow.push(\n new TypoText(\n textConstants(`-${optionUsage.short}`),\n textDelimiter(\", \"),\n ),\n );\n } else {\n typoGridRow.push(new TypoText());\n }\n const longOptionText = new TypoText(\n textConstants(`--${optionUsage.long}`),\n );\n if (optionUsage.label) {\n longOptionText.push(textDelimiter(\" \"));\n longOptionText.push(textUserInput(optionUsage.label));\n }\n if (optionUsage.annotation) {\n longOptionText.push(textSubtleInfo(optionUsage.annotation));\n }\n typoGridRow.push(longOptionText);\n typoGridRow.push(...createInformationals(optionUsage));\n typoGrid.pushRow(typoGridRow);\n }\n lines.push(...typoGrid.computeStyledLines(typoSupport));\n }\n\n if (usage.information.examples) {\n lines.push(\"\");\n lines.push(textBlockTitle(\"Examples:\").computeStyledString(typoSupport));\n for (const example of usage.information.examples) {\n const exampleExplanationText = new TypoText();\n exampleExplanationText.push(textDelimiter(\" \"));\n exampleExplanationText.push(textSubtleInfo(`# ${example.explanation}`));\n lines.push(exampleExplanationText.computeStyledString(typoSupport));\n const commandLineText = new TypoText();\n commandLineText.push(textDelimiter(\" \"));\n commandLineText.push(textConstants(cliName));\n for (const commandArg of example.commandArgs) {\n commandLineText.push(textDelimiter(\" \"));\n if (typeof commandArg === \"string\") {\n commandLineText.push(commandArg);\n } else if (\"positional\" in commandArg) {\n commandLineText.push(textUserInput(commandArg.positional));\n } else if (\"subcommand\" in commandArg) {\n commandLineText.push(textConstants(commandArg.subcommand));\n } else if (\"option\" in commandArg) {\n const option = commandArg.option;\n if (\"short\" in option) {\n commandLineText.push(textConstants(`-${option.short}`));\n } else {\n commandLineText.push(textConstants(`--${option.long}`));\n }\n if (option.inlined !== undefined) {\n commandLineText.push(textSubtleInfo(\"=\"));\n commandLineText.push(textUserInput(option.inlined));\n }\n if (option.separated !== undefined) {\n for (const separatedValue of option.separated) {\n commandLineText.push(textDelimiter(\" \"));\n commandLineText.push(textUserInput(separatedValue));\n }\n }\n }\n }\n lines.push(commandLineText.computeStyledString(typoSupport));\n }\n }\n\n lines.push(\"\");\n return lines;\n}\n\nfunction createInformationals(usage: {\n description?: string | undefined;\n hint?: string | undefined;\n}): Array<TypoText> {\n const informationals = [];\n if (usage.description) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textUsefulInfo(usage.description));\n }\n if (usage.hint) {\n informationals.push(textDelimiter(\" \"));\n informationals.push(textSubtleInfo(`(${usage.hint})`));\n }\n if (informationals.length > 0) {\n return [new TypoText(textDelimiter(\" \"), ...informationals)];\n }\n return [];\n}\n\nfunction textUsageHero(value: string): TypoString {\n return new TypoString(value, typoStyleLogic);\n}\n\nfunction textUsageText(value: string): TypoString {\n return new TypoString(value, typoStyleRegularStrong);\n}\n\nfunction textUsefulInfo(value: string): TypoString {\n return new TypoString(value);\n}\n\nfunction textBlockTitle(value: string): TypoString {\n return new TypoString(value, typoStyleTitle);\n}\n\nfunction textSubtleInfo(value: string): TypoString {\n return new TypoString(value, typoStyleRegularWeaker);\n}\n\nfunction textConstants(value: string): TypoString {\n return new TypoString(value, typoStyleConstants);\n}\n\nfunction textUserInput(value: string): TypoString {\n return new TypoString(value, typoStyleUserInput);\n}\n\nfunction textDelimiter(value: string): TypoString {\n return new TypoString(value);\n}\n","import { Command, CommandDecoder } from \"./Command\";\nimport { optionFlag, optionSingleValue } from \"./Option\";\nimport { ReaderArgs } from \"./Reader\";\nimport { typeChoice } from \"./Type\";\nimport { TypoSupport } from \"./Typo\";\nimport { usageToStyledLines } from \"./Usage\";\n\n/**\n * Main entry point: parses CLI arguments, executes the matched command, and exits.\n * Handles `--help`, `--version`, usage-on-error, and exit codes.\n *\n * Exit codes:\n * - `0` on success / `--help` / `--version`\n * - `1` on parse error or execution error.\n *\n * @typeParam Context - Forwarded unchanged to the handler.\n *\n * @param cliName - Program name used in usage and `--version` output.\n * @param cliArgs - Raw arguments, typically `process.argv.slice(2)`.\n * @param context - Forwarded to the handler.\n * @param command - Root {@link Command}.\n * @param options.colorSetup - Configures color support; enables `--color` flag if set to `\"flag\"`.\n * @param options.usageOnHelp - Enables `--help` flag (default `true`).\n * @param options.usageOnError - Prints usage to stderr on parse error (default `true`).\n * @param options.buildVersion - Enables `--version`; prints `<cliName> <buildVersion>`.\n * @param options.onError - Custom handler for errors.\n * @param options.onExit - Overrides `process.exit`; useful for testing.\n *\n * @returns `Promise<never>` — always calls `onExit`.\n *\n * @example\n * ```ts\n * import { runAndExit, command, operation, positionalRequired, type } from \"cli-kiss\";\n *\n * const greetCommand = command(\n * { description: \"Greet someone\" },\n * operation(\n * { options: {}, positionals: [positionalRequired({ type: type(\"name\") })] },\n * async function (_ctx, { positionals: [name] }) {\n * console.log(`Hello, ${name}!`);\n * },\n * ),\n * );\n *\n * await runAndExit(\"greet\", process.argv.slice(2), undefined, greetCommand, {\n * buildVersion: \"1.0.0\",\n * });\n * ```\n */\nexport async function runAndExit<Context>(\n cliName: string,\n cliArgs: ReadonlyArray<string>,\n context: Context,\n command: Command<Context, void>,\n options?: {\n colorSetup?: \"flag\" | \"env\" | \"always\" | \"never\" | \"mock\" | undefined;\n usageOnHelp?: boolean | undefined;\n usageOnError?: boolean | undefined;\n buildVersion?: string | undefined;\n onError?: ((error: unknown) => void) | undefined;\n onExit?: ((code: number) => never) | undefined;\n },\n): Promise<never> {\n const readerArgs = new ReaderArgs(cliArgs);\n const preprocessors = new Array<\n (commandDecoder: CommandDecoder<Context, void>) => undefined | number\n >();\n let typoSupport = TypoSupport.none();\n const colorSetup = options?.colorSetup ?? \"flag\";\n if (colorSetup === \"flag\") {\n const colorOption = optionSingleValue<\"auto\" | \"always\" | \"never\" | \"mock\">(\n {\n long: \"color\",\n type: typeChoice(\"color-mode\", [\"auto\", \"always\", \"never\", \"mock\"]),\n defaultWhenNotDefined: () => \"auto\",\n defaultWhenNotInlined: () => \"always\",\n },\n ).registerAndMakeDecoder(readerArgs);\n preprocessors.push(() => {\n try {\n typoSupport = computeTypoSupport(colorOption.getAndDecodeValue());\n } catch (error) {\n typoSupport = TypoSupport.inferFromEnv();\n throw error;\n }\n return undefined;\n });\n } else {\n if (colorSetup === \"env\") {\n typoSupport = TypoSupport.inferFromEnv();\n } else {\n typoSupport = computeTypoSupport(colorSetup);\n }\n }\n if (options?.usageOnHelp ?? true) {\n const helpOption = optionFlag({ long: \"help\" }).registerAndMakeDecoder(\n readerArgs,\n );\n preprocessors.push((commandDecoder) => {\n if (!helpOption.getAndDecodeValue()) {\n return undefined;\n }\n console.log(computeUsageString(cliName, commandDecoder, typoSupport));\n return 0;\n });\n }\n if (options?.buildVersion) {\n const versionOption = optionFlag({\n long: \"version\",\n }).registerAndMakeDecoder(readerArgs);\n preprocessors.push(() => {\n if (!versionOption.getAndDecodeValue()) {\n return undefined;\n }\n console.log([cliName, options.buildVersion].join(\" \"));\n return 0;\n });\n }\n /*\n // TODO - handle completions ?\n readerArgs.registerFlag({\n key: \"completion\",\n shorts: [],\n longs: [\"completion\"],\n });\n */\n const commandDecoder = command.consumeAndMakeDecoder(readerArgs);\n while (true) {\n try {\n const positional = readerArgs.consumePositional();\n if (positional === undefined) {\n break;\n }\n } catch (_) {}\n }\n const onExit = options?.onExit ?? process.exit;\n try {\n for (const preprocessor of preprocessors) {\n const preprocessorResult = preprocessor(commandDecoder);\n if (preprocessorResult !== undefined) {\n return onExit(preprocessorResult);\n }\n }\n const commandInterpreter = commandDecoder.decodeAndMakeInterpreter();\n try {\n await commandInterpreter.executeWithContext(context);\n return onExit(0);\n } catch (executionError) {\n handleError(options?.onError, executionError, typoSupport);\n return onExit(1);\n }\n } catch (parsingError) {\n if (options?.usageOnError ?? true) {\n console.error(computeUsageString(cliName, commandDecoder, typoSupport));\n }\n handleError(options?.onError, parsingError, typoSupport);\n return onExit(1);\n }\n}\n\nfunction handleError(\n onError: ((error: unknown) => void) | undefined,\n error: unknown,\n typoSupport: TypoSupport,\n) {\n if (onError !== undefined) {\n onError(error);\n } else {\n console.error(typoSupport.computeStyledErrorMessage(error));\n }\n}\n\nfunction computeUsageString<Context, Result>(\n cliName: string,\n commandDecoder: CommandDecoder<Context, Result>,\n typoSupport: TypoSupport,\n) {\n return usageToStyledLines({\n cliName,\n usage: commandDecoder.generateUsage(),\n typoSupport,\n }).join(\"\\n\");\n}\n\nfunction computeTypoSupport(\n colorMode: \"auto\" | \"always\" | \"never\" | \"mock\",\n): TypoSupport {\n switch (colorMode) {\n case \"auto\":\n return TypoSupport.inferFromEnv();\n case \"always\":\n return TypoSupport.tty();\n case \"never\":\n return TypoSupport.none();\n case \"mock\":\n return TypoSupport.mock();\n }\n}\n"],"mappings":"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","names":["index_exports","__export","ReaderArgs","TypoError","TypoGrid","TypoString","TypoSupport","TypoText","command","commandChained","commandWithSubcommands","operation","optionFlag","optionRepeatable","optionSingleValue","positionalOptional","positionalRequired","positionalVariadics","runAndExit","type","typeBoolean","typeChoice","typeConverted","typeDatetime","typeInteger","typeList","typeNumber","typePath","typeRenamed","typeTuple","typeUrl","typoStyleConstants","typoStyleFailure","typoStyleLogic","typoStyleQuote","typoStyleRegularStrong","typoStyleRegularWeaker","typoStyleTitle","typoStyleUserInput","usageToStyledLines","__toCommonJS","typoStyleTitle","typoStyleLogic","typoStyleQuote","typoStyleFailure","typoStyleConstants","typoStyleUserInput","typoStyleRegularStrong","typoStyleRegularWeaker","_value","_typoStyle","TypoString","value","typoStyle","__privateAdd","__privateSet","typoSupport","__privateGet","_typoStrings","_TypoText","segments","typoPart","segment","typoString","t","length","TypoText","_typoRows","TypoGrid","cells","widths","styledLines","typoGridRow","typoGridColumnIndex","width","styledGridRow","typoGridCell","padding","_typoText","_TypoError","currentTypoText","source","typoText","thrower","context","error","TypoError","_kind","_TypoSupport","kind","readEnvVar","name","envForceColor","styledValue","fgColorCode","ttyCodeFgColors","bgColorCode","ttyCodeBgColors","boldCode","ttyCodeBold","dimCode","ttyCodeDim","italicCode","ttyCodeItalic","underlineCode","ttyCodeUnderline","strikethroughCode","ttyCodeStrikethrough","ttyCodeReset","fgColorPart","bgColorPart","boldPart","dimPart","italicPart","underlinePart","TypoSupport","command","information","operation","readerArgs","operationDecoder","endPositional","TypoError","TypoText","TypoString","typoStyleQuote","generateUsageLeaf","operationInterpreter","context","error","commandWithSubcommands","subcommands","subcommandName","typoStyleUserInput","subcommandInput","subcommandDecoder","subcommandUsage","currentUsage","subcommandInterpreter","name","subcommand","description","hint","commandChained","positionals","options","positional","operation","inputs","handler","optionsUsage","optionKey","optionInput","positionalsUsage","positionalInput","readerArgs","optionsDecoders","positionalsDecoders","optionsValues","positionalsValues","positionalDecoder","context","import_fs","typeBoolean","name","input","lower","booleanValuesTrue","booleanValuesFalse","TypoError","TypoText","TypoString","typoStyleQuote","typeDatetime","timestampMs","typeNumber","parsed","typeInteger","typeUrl","type","typeConverted","before","mapper","typoStyleLogic","typeRenamed","typePath","checks","stats","preview","typeChoice","values","caseSensitive","normalize","valueMap","value","normalized","original","valuesPreview","typeTuple","elementTypes","separator","elementType","splits","split","index","typeList","optionFlag","definition","type","typeBoolean","long","short","description","hint","aliases","readerOptions","key","registerOption","optionResults","throwSetMultipleTimesError","positiveResult","value","decodeValue","optionSingleValue","label","inlined","separated","optionResult","error","throwFailedToGetDefaultValueError","optionRepeatable","input","params","TypoError","text","TypoText","TypoString","typoStyleConstants","typoStyleUserInput","typoStyleLogic","aliasesLongs","aliasesShorts","parsing","longs","shorts","context","positionalRequired","definition","description","hint","type","label","readerPositionals","positional","TypoError","TypoText","TypoString","typoStyleUserInput","decodeValue","positionalOptional","throwsWhenFailedToGetDefault","positionalVariadics","labelSingle","labelMultiple","positionals","input","_args","_parsedIndex","_parsedDouble","_optionContextByLong","_optionContextByShort","_optionContextByKey","_ReaderArgs_instances","consumeArg_fn","tryConsumeAsOption_fn","consumeOptionLong_fn","tryConsumeOptionShort_fn","consumeOptionValues_fn","consumeOptionValue_fn","isValidOptionName_fn","ReaderArgs","args","__privateAdd","__privateSet","definition","key","long","short","__privateMethod","__privateGet","i","shortSlice","shortOther","optionContext","arg","__privateWrapper","valueIndexStart","shortIndexStart","shortIndexEnd","rest","TypoError","TypoText","TypoString","typoStyleQuote","inlined","constant","separated","typoStyleConstants","name","usageToStyledLines","params","cliName","usage","typoSupport","lines","segmentsText","TypoText","textUsageHero","textDelimiter","textConstants","segment","textUserInput","introText","textUsageText","textSubtleInfo","detail","detailText","textBlockTitle","typoGrid","TypoGrid","positionalUsage","typoGridRow","createInformationals","subcommandUsage","optionUsage","longOptionText","example","exampleExplanationText","commandLineText","commandArg","option","separatedValue","informationals","textUsefulInfo","value","TypoString","typoStyleLogic","typoStyleRegularStrong","typoStyleTitle","typoStyleRegularWeaker","typoStyleConstants","typoStyleUserInput","runAndExit","cliName","cliArgs","context","command","options","readerArgs","ReaderArgs","preprocessors","typoSupport","TypoSupport","colorSetup","colorOption","optionSingleValue","typeChoice","computeTypoSupport","error","helpOption","optionFlag","commandDecoder","computeUsageString","versionOption","onExit","preprocessor","preprocessorResult","commandInterpreter","executionError","handleError","parsingError","onError","usageToStyledLines","colorMode"]}