politty 0.5.1 → 0.6.0
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/README.md +47 -0
- package/dist/{arg-registry-6E0WHOh_.d.ts → arg-registry-BoqVZRFO.d.cts} +24 -22
- package/dist/arg-registry-BoqVZRFO.d.cts.map +1 -0
- package/dist/{arg-registry--NRaNFJM.d.cts → arg-registry-BoqVZRFO.d.ts} +24 -22
- package/dist/arg-registry-BoqVZRFO.d.ts.map +1 -0
- package/dist/augment.d.cts +1 -1
- package/dist/augment.d.ts +1 -1
- package/dist/cli.cjs +54 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/completion/index.cjs +6 -1
- package/dist/completion/index.d.cts +3 -3
- package/dist/completion/index.d.ts +3 -3
- package/dist/completion/index.js +2 -2
- package/dist/{completion-BFOAOg95.cjs → completion-CLHO3Xaz.cjs} +1812 -337
- package/dist/completion-CLHO3Xaz.cjs.map +1 -0
- package/dist/{completion-K5LGh1hO.js → completion-DHnVx9Zk.js} +1786 -340
- package/dist/completion-DHnVx9Zk.js.map +1 -0
- package/dist/docs/index.cjs +3 -3
- package/dist/docs/index.cjs.map +1 -1
- package/dist/docs/index.d.cts +1 -1
- package/dist/docs/index.d.cts.map +1 -1
- package/dist/docs/index.d.ts +1 -1
- package/dist/docs/index.d.ts.map +1 -1
- package/dist/docs/index.js +3 -3
- package/dist/docs/index.js.map +1 -1
- package/dist/{index-Cg8qstsT.d.cts → index-Csk1VFou.d.ts} +119 -4
- package/dist/index-Csk1VFou.d.ts.map +1 -0
- package/dist/{index-O3yn97Ed.d.ts → index-Ct48_myg.d.cts} +119 -4
- package/dist/index-Ct48_myg.d.cts.map +1 -0
- package/dist/index.cjs +4 -3
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/{log-collector-Cu6MCtAx.js → log-collector-DK32-73m.js} +1 -1
- package/dist/{log-collector-Cu6MCtAx.js.map → log-collector-DK32-73m.js.map} +1 -1
- package/dist/{log-collector-Cd2_mv87.cjs → log-collector-DUqC427m.cjs} +1 -1
- package/dist/{log-collector-Cd2_mv87.cjs.map → log-collector-DUqC427m.cjs.map} +1 -1
- package/dist/prompt/clack/index.cjs +1 -2
- package/dist/prompt/clack/index.cjs.map +1 -1
- package/dist/prompt/clack/index.d.cts +1 -1
- package/dist/prompt/clack/index.d.ts +1 -1
- package/dist/prompt/clack/index.js +1 -1
- package/dist/prompt/index.cjs +1 -1
- package/dist/prompt/index.d.cts +1 -1
- package/dist/prompt/index.d.cts.map +1 -1
- package/dist/prompt/index.d.ts +1 -1
- package/dist/prompt/index.d.ts.map +1 -1
- package/dist/prompt/index.js +1 -1
- package/dist/prompt/inquirer/index.cjs +1 -2
- package/dist/prompt/inquirer/index.cjs.map +1 -1
- package/dist/prompt/inquirer/index.d.cts +1 -1
- package/dist/prompt/inquirer/index.d.ts +1 -1
- package/dist/prompt/inquirer/index.js +1 -1
- package/dist/{prompt-aXfSf27y.cjs → prompt-Bs9e-Em3.cjs} +1 -1
- package/dist/{prompt-aXfSf27y.cjs.map → prompt-Bs9e-Em3.cjs.map} +1 -1
- package/dist/{prompt-BKHqGrFw.js → prompt-Cc8Tfmdv.js} +1 -1
- package/dist/{prompt-BKHqGrFw.js.map → prompt-Cc8Tfmdv.js.map} +1 -1
- package/dist/{runner-BmSEiD9A.js → runner--Zn4KN9B.js} +3 -3
- package/dist/{runner-BmSEiD9A.js.map → runner--Zn4KN9B.js.map} +1 -1
- package/dist/{runner-CRZ_7Y9i.cjs → runner-BloFWJEB.cjs} +3 -3
- package/dist/{runner-CRZ_7Y9i.cjs.map → runner-BloFWJEB.cjs.map} +1 -1
- package/dist/{schema-extractor-SLPgBNgZ.cjs → schema-extractor-BxSRwLrx.cjs} +1 -2
- package/dist/schema-extractor-BxSRwLrx.cjs.map +1 -0
- package/dist/{schema-extractor-C50R-1re.js → schema-extractor-Dqe7_kyQ.js} +1 -1
- package/dist/schema-extractor-Dqe7_kyQ.js.map +1 -0
- package/package.json +14 -11
- package/dist/arg-registry--NRaNFJM.d.cts.map +0 -1
- package/dist/arg-registry-6E0WHOh_.d.ts.map +0 -1
- package/dist/completion-BFOAOg95.cjs.map +0 -1
- package/dist/completion-K5LGh1hO.js.map +0 -1
- package/dist/index-Cg8qstsT.d.cts.map +0 -1
- package/dist/index-O3yn97Ed.d.ts.map +0 -1
- package/dist/schema-extractor-C50R-1re.js.map +0 -1
- package/dist/schema-extractor-SLPgBNgZ.cjs.map +0 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
const require_log_collector = require('./log-collector-Cd2_mv87.cjs');
|
|
2
1
|
let zod = require("zod");
|
|
3
2
|
|
|
4
3
|
//#region src/core/arg-registry.ts
|
|
@@ -708,4 +707,4 @@ Object.defineProperty(exports, 'toKebabCase', {
|
|
|
708
707
|
return toKebabCase;
|
|
709
708
|
}
|
|
710
709
|
});
|
|
711
|
-
//# sourceMappingURL=schema-extractor-
|
|
710
|
+
//# sourceMappingURL=schema-extractor-BxSRwLrx.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-extractor-BxSRwLrx.cjs","names":["z","getArgMeta","getArgMetaFromRegistry"],"sources":["../src/core/arg-registry.ts","../src/lazy.ts","../src/executor/subcommand-router.ts","../src/core/schema-extractor.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport type { GlobalArgs, IsEmpty } from \"../types.js\";\nimport type { DynamicCompletionResolver } from \"./dynamic-completion-types.js\";\nimport type { ExpandCompletion } from \"./expand-completion-types.js\";\n\n/**\n * Built-in completion types\n */\nexport type CompletionType = \"file\" | \"directory\" | \"none\";\n\n/**\n * Custom completion specification.\n *\n * `choices`, `shellCommand`, `resolve`, and `expand` are mutually exclusive —\n * specifying more than one throws when the field metadata is resolved.\n */\nexport interface CustomCompletion {\n /** Static list of choices for completion */\n choices?: string[];\n /** Shell command to execute for dynamic completion */\n shellCommand?: string;\n /**\n * In-process JS callback for dynamic completion. Receives parsed context\n * (other arg values typed so far, previously supplied values for this same\n * option) and returns candidates. Dispatcher scripts call\n * `<program> __complete` for every completion request; static scripts\n * delegate to it whenever this is set.\n */\n resolve?: DynamicCompletionResolver;\n /**\n * Completion whose candidates depend on sibling arg values. Dispatcher\n * scripts call `enumerate` inside `__complete` for the dependency values\n * already typed on the command line. Static scripts pre-enumerate every\n * combination of `dependsOn` values at script-generation time and dispatch\n * via a shell lookup table.\n */\n expand?: ExpandCompletion;\n}\n\n/**\n * Completion metadata for an argument\n *\n * @example\n * ```ts\n * // File completion with extension filter\n * input: arg(z.string(), {\n * completion: { type: \"file\", extensions: [\"json\", \"yaml\"] }\n * })\n *\n * // Directory completion\n * outputDir: arg(z.string(), {\n * completion: { type: \"directory\" }\n * })\n *\n * // Custom static choices\n * logLevel: arg(z.string(), {\n * completion: { custom: { choices: [\"debug\", \"info\", \"warn\", \"error\"] } }\n * })\n *\n * // Dynamic completion from shell command\n * branch: arg(z.string(), {\n * completion: { custom: { shellCommand: \"git branch --format='%(refname:short)'\" } }\n * })\n *\n * // File completion with glob pattern matcher\n * envFile: arg(z.string(), {\n * completion: { type: \"file\", matcher: [\".env.*\"] }\n * })\n * ```\n */\nexport type CompletionMeta = {\n /** Built-in completion type */\n type?: CompletionType;\n /** Custom completion (takes precedence over type if both specified) */\n custom?: CustomCompletion;\n} & (\n | {\n /** File extension filter (only applies when type is \"file\") */ extensions?: string[];\n matcher?: never;\n }\n | {\n /** Glob patterns for file matching (only applies when type is \"file\") */ matcher?: string[];\n extensions?: never;\n }\n);\n\n/**\n * Prompt input type for interactive prompts\n *\n * - \"text\": free-form text input (default for string schemas)\n * - \"password\": masked text input\n * - \"confirm\": yes/no prompt (default for boolean schemas)\n * - \"select\": single selection from choices (default for enum schemas)\n * - \"file\": file path input (inherited from completion type)\n * - \"directory\": directory path input (inherited from completion type)\n */\nexport type PromptType = \"text\" | \"password\" | \"confirm\" | \"select\" | \"file\" | \"directory\";\n\n/**\n * Prompt metadata for interactive input when a value is missing.\n * Used by the `politty/prompt` module to request user input for unresolved arguments.\n *\n * @example\n * ```ts\n * // Custom prompt message\n * name: arg(z.string(), {\n * prompt: { message: \"What is your name?\" }\n * })\n *\n * // Password input (masked)\n * token: arg(z.string(), {\n * prompt: { type: \"password\", message: \"Enter API token\" }\n * })\n *\n * // Select with custom choices\n * region: arg(z.string(), {\n * prompt: { choices: [\"us-east-1\", \"eu-west-1\", \"ap-northeast-1\"] }\n * })\n * ```\n */\nexport interface PromptMeta {\n /** Prompt message shown to the user. Defaults to the field's description or name. */\n message?: string;\n /** Explicit prompt type. Overrides auto-detection from schema/completion. */\n type?: PromptType;\n /** Choices for select prompt. Overrides enum values from schema. */\n choices?: Array<string | { label: string; value: string }>;\n /** Whether to enable prompting for this field (default: true when prompt is set) */\n enabled?: boolean;\n}\n\n/**\n * Context provided to effect callbacks.\n * When GlobalArgs is extended via declaration merging, `globalArgs` is typed accordingly.\n */\nexport type EffectContext = {\n /** Field name (camelCase) */\n name: string;\n /** Validated args for this schema (global args for global effects, command args for command effects) */\n args: Readonly<Record<string, unknown>>;\n} & (IsEmpty<GlobalArgs> extends true\n ? { globalArgs?: Readonly<Record<string, unknown>> }\n : { globalArgs?: Readonly<GlobalArgs> });\n\n/**\n * Base metadata shared by all argument types\n */\nexport interface BaseArgMeta<TValue = unknown> {\n /** Argument description */\n description?: string;\n /** Treat as positional argument */\n positional?: boolean;\n /** Placeholder for help display */\n placeholder?: string;\n /**\n * Environment variable name(s) to read value from.\n * If an array is provided, earlier entries take priority.\n * CLI arguments always take precedence over environment variables.\n *\n * @example\n * ```ts\n * // Single env var\n * port: arg(z.coerce.number(), { env: \"PORT\" })\n *\n * // Multiple env vars (PORT takes priority over SERVER_PORT)\n * port: arg(z.coerce.number(), { env: [\"PORT\", \"SERVER_PORT\"] })\n * ```\n */\n env?: string | string[];\n /** Completion configuration for shell tab-completion */\n completion?: CompletionMeta;\n /**\n * Interactive prompt configuration for missing values.\n * When set, the `politty/prompt` module will prompt the user interactively\n * if this argument is not provided via CLI args or environment variables.\n *\n * @example\n * ```ts\n * name: arg(z.string(), {\n * description: \"User name\",\n * prompt: { message: \"What is your name?\" },\n * })\n * ```\n */\n prompt?: PromptMeta;\n /**\n * Control the boolean negation option.\n *\n * Boolean fields automatically accept `--no-<cliName>` (and the camelCase\n * `--no<Name>` form) to set the value to `false`. By default this form is\n * accepted by the parser but hidden from help, generated docs, and shell\n * completions. This option lets you customize or expose that behavior:\n *\n * - `string` — replaces the auto-generated `--no-*` form with a custom\n * name. The default `--no-*` is no longer recognized.\n * - `true` — opt-in to advertising the default `--no-<cliName>` form in\n * help, generated docs, and shell completions. Parser behavior is\n * unchanged.\n * - `false` — disables negation entirely; neither the default `--no-*`\n * nor any custom name is accepted.\n *\n * String values follow the same naming conventions as `cliName`\n * (kebab-case is recommended). Only valid on boolean fields; setting\n * `negation` on a non-boolean field is a type error and raises a\n * runtime error during command parsing.\n *\n * @example\n * ```ts\n * // Custom negation name\n * cache: arg(z.boolean().default(true), {\n * description: \"Enable caching\",\n * negation: \"disable-cache\",\n * })\n * // Accepts: --cache (true), --disable-cache (false)\n * // No longer accepts: --no-cache\n *\n * // Expose default `--no-X` in help/docs/completion\n * verbose: arg(z.boolean().default(false), {\n * negation: true,\n * })\n * // Help shows `--verbose / --no-verbose`\n *\n * // Disable negation entirely\n * dryRun: arg(z.boolean().default(false), {\n * negation: false,\n * })\n * // Accepts: --dry-run (true)\n * // No longer accepts: --no-dry-run\n * ```\n */\n negation?: string | boolean;\n /**\n * Description shown for the negation option in help and generated docs.\n * Only meaningful when `negation` is set to a custom name string or `true`.\n * Disallowed when `negation` is `false`.\n */\n negationDescription?: string;\n /**\n * Side-effect callback executed after argument parsing and validation.\n * Runs before the command lifecycle (setup/run/cleanup).\n * Use Zod .transform() for value transformation instead.\n *\n * @example\n * ```ts\n * verbose: arg(z.boolean().default(false), {\n * alias: \"v\",\n * effect: (value) => {\n * if (value) logger.setLevel(\"debug\");\n * },\n * })\n * ```\n */\n effect?: (value: TValue, context: EffectContext) => void | PromiseLike<void>;\n}\n\n/**\n * Metadata for regular arguments (non-builtin aliases)\n *\n * `alias` accepts either a single string or an array of strings.\n * Single-character entries become short options (e.g. `-v`); multi-character\n * entries become additional long options (e.g. `--to-be` for `--tobe`).\n */\nexport interface RegularArgMeta<TValue = unknown> extends BaseArgMeta<TValue> {\n /**\n * Alias name(s) for this option.\n * - 1-char string → short alias (`-v`)\n * - >1-char string → long alias (`--long-name`)\n * - array → multiple aliases of either kind\n */\n alias?: string | string[] | readonly string[];\n /**\n * Alias name(s) that are accepted by the parser but hidden from help,\n * generated docs, and shell completion. Useful for legacy or deprecated\n * names that should still work without being advertised.\n */\n hiddenAlias?: string | string[] | readonly string[];\n}\n\n/**\n * Metadata for overriding built-in aliases (-h, -H)\n */\nexport interface BuiltinOverrideArgMeta<TValue = unknown> extends BaseArgMeta<TValue> {\n /** Built-in alias to override ('h' or 'H'), optionally combined with extra aliases */\n alias: \"h\" | \"H\" | Array<\"h\" | \"H\" | string> | ReadonlyArray<\"h\" | \"H\" | string>;\n /** Hidden aliases (accepted but not surfaced in help/docs/completion) */\n hiddenAlias?: string | string[] | readonly string[];\n /** Must be true to override built-in aliases */\n overrideBuiltinAlias: true;\n}\n\n/**\n * Metadata options for argument definition\n */\nexport type ArgMeta<TValue = unknown> = RegularArgMeta<TValue> | BuiltinOverrideArgMeta<TValue>;\n\n/**\n * Custom registry for politty argument metadata\n * This avoids polluting Zod's GlobalMeta\n */\nexport const argRegistry = z.registry<ArgMeta>();\n\n/**\n * Register metadata for a Zod schema\n *\n * @param schema - The Zod schema\n * @param meta - Argument metadata\n * @returns The same schema (for chaining)\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { arg, defineCommand } from \"politty\";\n *\n * const cmd = defineCommand({\n * args: z.object({\n * name: arg(z.string(), { description: \"User name\", positional: true }),\n * verbose: arg(z.boolean().default(false), { alias: \"v\" }),\n * }),\n * run: (args) => {\n * console.log(args.name, args.verbose);\n * },\n * });\n * ```\n */\n/**\n * Detect whether `A` contains a reserved alias (\"h\" or \"H\"), for either a\n * plain string or a tuple/array of strings. Uses `[A] extends [never]` to\n * prevent distribution returning `never` for missing fields.\n */\ntype ContainsReservedAlias<A> = [A] extends [never]\n ? false\n : A extends \"h\" | \"H\"\n ? true\n : A extends readonly (infer E)[]\n ? [Extract<E, \"h\" | \"H\">] extends [never]\n ? false\n : true\n : false;\n\ntype ReservedAliasTypeError<M> = {\n [K in keyof M]: M[K];\n} & {\n __typeError: \"Alias 'h' or 'H' requires overrideBuiltinAlias: true\";\n};\n\ntype NegationTypeError<M> = {\n [K in keyof M]: M[K];\n} & {\n __typeError: \"negation/negationDescription can only be used on boolean fields\";\n};\n\ntype AliasFieldOf<M> = M extends { alias: infer A } ? A : never;\ntype HiddenAliasFieldOf<M> = M extends { hiddenAlias: infer H } ? H : never;\n\n/**\n * Check whether a Zod output type is a (possibly optional) boolean.\n * Strips `undefined` to allow `z.boolean().optional()`. Requires both\n * `boolean extends NonNullable<T>` (so `z.literal(true)` is rejected — the full\n * `boolean` domain is needed) and `NonNullable<T> extends boolean` (so unions\n * such as `z.union([z.boolean(), z.string()])` are rejected at the type level\n * to match the runtime check).\n */\ntype IsBooleanField<T> =\n boolean extends NonNullable<T> ? ([NonNullable<T>] extends [boolean] ? true : false) : false;\n\n/**\n * Detect whether `M` has `K` set to a non-undefined value.\n *\n * When `M` is inferred from a literal such as `{ negation: \"off\" }`,\n * `M[\"negation\"]` is `\"off\"` (without `undefined`), so this returns `true`.\n * When `M` is the wider `ArgMeta` type, `M[\"negation\"]` is\n * `string | boolean | undefined`, so this returns `false` and avoids\n * false-positive type errors on broadly-typed meta values.\n */\ntype HasExplicit<M, K extends string> = K extends keyof M\n ? undefined extends M[K]\n ? false\n : true\n : false;\n\n/**\n * Reject `negation` / `negationDescription` on non-boolean fields.\n * Uses {@link HasExplicit} so the error only fires when the user explicitly\n * sets the field on a narrowly-inferred meta literal.\n */\ntype ValidateNegation<M, TValue> =\n HasExplicit<M, \"negation\"> extends true\n ? IsBooleanField<TValue> extends true\n ? M\n : NegationTypeError<M>\n : HasExplicit<M, \"negationDescription\"> extends true\n ? IsBooleanField<TValue> extends true\n ? M\n : NegationTypeError<M>\n : M;\n\n/**\n * Type helper to validate ArgMeta.\n * Forces a type error when a reserved alias (\"h\" / \"H\") is used without\n * `overrideBuiltinAlias: true`, whether the alias is provided as a string\n * or as part of an array, and whether it appears in `alias` or `hiddenAlias`.\n * Also rejects `negation` / `negationDescription` on non-boolean fields.\n */\ntype ValidateArgMeta<M, TValue = unknown> = M extends { overrideBuiltinAlias: true }\n ? ValidateNegation<M, TValue>\n : ContainsReservedAlias<AliasFieldOf<M>> extends true\n ? ReservedAliasTypeError<M>\n : ContainsReservedAlias<HiddenAliasFieldOf<M>> extends true\n ? ReservedAliasTypeError<M>\n : ValidateNegation<M, TValue>;\n\nexport function arg<T extends z.ZodType>(schema: T): T;\nexport function arg<T extends z.ZodType, M extends ArgMeta<z.output<T>>>(\n schema: T,\n meta: ValidateArgMeta<M, z.output<T>>,\n): T;\nexport function arg<T extends z.ZodType>(\n schema: T,\n meta?: ValidateArgMeta<ArgMeta, z.output<T>>,\n): T {\n if (meta) {\n argRegistry.add(schema, meta as ArgMeta);\n }\n return schema;\n}\n\n/**\n * Get metadata for a schema from the registry\n *\n * @param schema - The Zod schema\n * @returns The metadata if registered, undefined otherwise\n */\nexport function getArgMeta(schema: z.ZodType): ArgMeta | undefined {\n // Zod's `$replace<Meta, S>` recursively rewrites the meta type, which mangles\n // the generic `then` signature of `PromiseLike<void>` inside `effect`'s return\n // type under newer TypeScript builds (@typescript/native-preview ≥ 20260504).\n // The runtime value is always the original ArgMeta we stored, so we restore\n // the static type at the boundary.\n return argRegistry.get(schema) as ArgMeta | undefined;\n}\n","/**\n * Lazy-loaded subcommand with synchronous metadata\n */\n\nimport type { AnyCommand, SubCommandValue } from \"./types.js\";\n\n/**\n * Marker property for LazyCommand identification\n */\nconst LAZY_BRAND = \"__politty_lazy__\" as const;\n\n/**\n * A lazily-loaded command that carries synchronous metadata for\n * static analysis (completion, help) while deferring full module\n * loading to execution time.\n */\nexport interface LazyCommand<T extends AnyCommand = AnyCommand> {\n readonly __politty_lazy__: true;\n readonly meta: T;\n readonly load: () => Promise<AnyCommand>;\n}\n\n/**\n * Type guard: check if a value is a LazyCommand\n */\nexport function isLazyCommand(value: unknown): value is LazyCommand {\n return (\n typeof value === \"object\" && value !== null && LAZY_BRAND in value && value[LAZY_BRAND] === true\n );\n}\n\n/**\n * Create a lazily-loaded subcommand with synchronous metadata.\n *\n * The `meta` command provides names, descriptions, and args schema\n * for static analysis (completion scripts, help text) without loading\n * the full command module.\n *\n * The `load` function is called only at execution time.\n *\n * @example\n * ```ts\n * import { lazy, defineCommand } from \"politty\";\n *\n * const cli = defineCommand({\n * name: \"mycli\",\n * subCommands: {\n * deploy: lazy(\n * defineCommand({\n * name: \"deploy\",\n * description: \"Deploy the application\",\n * args: z.object({ env: arg(z.string()) }),\n * }),\n * () => import(\"./deploy.js\").then((m) => m.deployCommand),\n * ),\n * },\n * });\n * ```\n */\nexport function lazy<T extends AnyCommand>(\n meta: T,\n load: () => Promise<AnyCommand>,\n): LazyCommand<T> {\n return {\n [LAZY_BRAND]: true as const,\n meta,\n load,\n };\n}\n\n/**\n * Resolve synchronous metadata from a SubCommandValue.\n * Returns null for legacy async subcommands whose metadata is unavailable.\n */\nexport function resolveSubCommandMeta(subCmd: SubCommandValue): AnyCommand | null {\n if (isLazyCommand(subCmd)) return subCmd.meta;\n if (typeof subCmd === \"function\") return null;\n return subCmd;\n}\n","import { isLazyCommand, resolveSubCommandMeta } from \"../lazy.js\";\nimport type { AnyCommand, SubCommandValue } from \"../types.js\";\n\n/**\n * Resolve a lazy-loaded command (sync or async)\n *\n * @param cmd - The command or lazy loader function\n * @returns The resolved command\n */\nexport async function resolveLazyCommand(cmd: SubCommandValue): Promise<AnyCommand> {\n if (isLazyCommand(cmd)) {\n return await cmd.load();\n }\n if (typeof cmd === \"function\") {\n return await cmd();\n }\n return cmd;\n}\n\n/**\n * Resolve a subcommand by name (including alias lookup)\n *\n * Handles both sync and async (lazy-loaded) subcommands.\n * If the name does not match a direct subcommand key, searches\n * for a subcommand whose `aliases` array includes the name.\n *\n * @param command - The parent command\n * @param name - The subcommand name or alias to resolve\n * @returns The resolved subcommand, or undefined if not found\n */\nexport async function resolveSubcommand(\n command: AnyCommand,\n name: string,\n): Promise<AnyCommand | undefined> {\n if (!command.subCommands) {\n return undefined;\n }\n\n // Direct lookup first\n const subCmd = command.subCommands[name];\n if (subCmd) {\n return resolveLazyCommand(subCmd);\n }\n\n // Alias lookup: find a subcommand whose aliases include the name\n const canonicalName = resolveSubCommandAlias(command, name);\n if (canonicalName) {\n return resolveLazyCommand(command.subCommands[canonicalName]!);\n }\n\n return undefined;\n}\n\n/**\n * Resolve a subcommand by name (including alias lookup) and return both the\n * resolved command and the canonical name if accessed via alias.\n *\n * This avoids a redundant alias scan when the caller needs both pieces of info.\n */\nexport async function resolveSubcommandWithAlias(\n command: AnyCommand,\n name: string,\n): Promise<{ command: AnyCommand; aliasFor: string | undefined } | undefined> {\n if (!command.subCommands) {\n return undefined;\n }\n\n // Direct lookup\n const subCmd = command.subCommands[name];\n if (subCmd) {\n return { command: await resolveLazyCommand(subCmd), aliasFor: undefined };\n }\n\n // Alias lookup\n const canonicalName = resolveSubCommandAlias(command, name);\n if (canonicalName) {\n return {\n command: await resolveLazyCommand(command.subCommands[canonicalName]!),\n aliasFor: canonicalName,\n };\n }\n\n return undefined;\n}\n\n/**\n * Resolve an alias to the canonical subcommand name.\n * Returns the canonical name if the given name is an alias, or undefined.\n *\n * Note: Aliases are only recognized for eagerly-defined commands and\n * `lazy()` commands (which carry synchronous metadata). Pure async\n * subcommand functions do not expose metadata synchronously, so their\n * aliases cannot be resolved without loading the module.\n *\n * @param command - The parent command\n * @param alias - The alias to look up\n * @returns The canonical subcommand name, or undefined\n */\nexport function resolveSubCommandAlias(command: AnyCommand, alias: string): string | undefined {\n if (!command.subCommands) return undefined;\n\n for (const [name, subCmd] of Object.entries(command.subCommands)) {\n const meta = resolveSubCommandMeta(subCmd);\n if (meta?.aliases?.includes(alias)) {\n return name;\n }\n }\n return undefined;\n}\n\n/**\n * Build a set of all recognized subcommand names including aliases.\n *\n * @param command - The parent command\n * @returns Set of all names (canonical + aliases)\n */\nexport function listSubCommandNamesWithAliases(command: AnyCommand): Set<string> {\n const names = new Set<string>();\n if (!command.subCommands) return names;\n\n for (const [name, subCmd] of Object.entries(command.subCommands)) {\n names.add(name);\n const meta = resolveSubCommandMeta(subCmd);\n if (meta?.aliases) {\n for (const alias of meta.aliases) {\n names.add(alias);\n }\n }\n }\n return names;\n}\n\n/**\n * List all subcommand names for a command\n *\n * @param command - The parent command\n * @returns Array of subcommand names\n */\nexport function listSubCommands(command: AnyCommand): string[] {\n if (!command.subCommands) {\n return [];\n }\n\n return Object.keys(command.subCommands);\n}\n","import type { z } from \"zod\";\nimport type { AnyCommand, ArgsSchema } from \"../types.js\";\nimport {\n getArgMeta as getArgMetaFromRegistry,\n type ArgMeta,\n type CompletionMeta,\n type EffectContext,\n type PromptMeta,\n} from \"./arg-registry.js\";\n\n/**\n * Get ArgMeta from both the custom registry and Zod's _def\n * Priority: custom registry > _def.argMeta\n */\nfunction getArgMeta(schema: z.ZodType): ArgMeta | undefined {\n // First check custom registry\n const fromRegistry = getArgMetaFromRegistry(schema);\n if (fromRegistry) return fromRegistry;\n // Check Zod native meta\n // Some Zod versions or extensions use a global registry accessed via .meta()\n if (typeof (schema as any).meta === \"function\") {\n const meta = (schema as any).meta();\n if (meta && typeof meta === \"object\") {\n return meta as ArgMeta;\n }\n }\n\n // Then check _def.argMeta (for augmented Zod types)\n const def = (schema as any)._def;\n if (def?.argMeta) return def.argMeta;\n\n // Also check _def.meta just in case\n if (def?.meta) return def.meta as ArgMeta;\n\n return undefined;\n}\n\n/**\n * Long flag names reserved for built-in handling (parseArgs / scanForSubcommand\n * intercept these before option parsing), so custom negation names must avoid them.\n */\nconst RESERVED_NEGATION_NAMES: ReadonlySet<string> = new Set([\"help\", \"help-all\", \"version\"]);\n\n/**\n * Resolved metadata for an argument field\n */\nexport interface ResolvedFieldMeta {\n /** Field name (camelCase, as defined in schema) */\n name: string;\n /** CLI option name (kebab-case, for command line usage) */\n cliName: string;\n /**\n * Aliases for this option, normalized to an array.\n * 1-char entries are short aliases (`-v`); multi-char entries are long\n * aliases (`--to-be`).\n */\n alias?: string[] | undefined;\n /**\n * Aliases that are accepted at parse time but hidden from help,\n * generated docs, and shell completion.\n */\n hiddenAlias?: string[] | undefined;\n /** Argument description */\n description?: string | undefined;\n /** Whether this is a positional argument */\n positional: boolean;\n /** Placeholder for help display */\n placeholder?: string | undefined;\n /**\n * Environment variable name(s) to read value from.\n * If an array, earlier entries take priority.\n */\n env?: string | string[] | undefined;\n /** Whether this argument is required */\n required: boolean;\n /** Default value if any */\n defaultValue?: unknown;\n /** Detected type from schema */\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"unknown\";\n /** Original Zod schema */\n schema: z.ZodType;\n /** True if this overrides built-in aliases (-h, -H) */\n overrideBuiltinAlias?: true;\n /** Enum values if detected from schema (z.enum) */\n enumValues?: string[] | undefined;\n /** Completion metadata from arg() */\n completion?: CompletionMeta | undefined;\n /** Prompt metadata from arg() for interactive input */\n prompt?: PromptMeta | undefined;\n /**\n * Negation configuration for this boolean field.\n *\n * - String (e.g. `\"disable-cache\"`): the default `--no-<cliName>` form is\n * suppressed and only `--<negation>` (plus its camelCase variant) is\n * accepted as the negation flag.\n * - `true`: the default `--no-<cliName>` form is accepted **and** shown in\n * help, generated docs, and shell completions.\n * - `false`: neither the default `--no-<cliName>` nor any custom name is\n * accepted; the field only responds to the positive flag.\n * - `undefined`: the default `--no-<cliName>` is accepted by the parser\n * but hidden from help/docs/completions.\n *\n * Only applies to boolean fields; populated as `undefined` otherwise.\n */\n negation?: string | boolean | undefined;\n /**\n * Derived display name (no `--` prefix) for the negation flag in help,\n * generated docs, and shell completions. `undefined` means the negation\n * is hidden from those surfaces. Computed from `negation` + `cliName`.\n */\n negationDisplay?: string | undefined;\n /** Description shown for the negation option in help/docs. */\n negationDescription?: string | undefined;\n /** Side-effect callback from arg() metadata */\n effect?: ((value: unknown, context: EffectContext) => void | PromiseLike<void>) | undefined;\n}\n\n/**\n * Extracted fields from a schema\n */\nexport interface ExtractedFields {\n /** All field definitions */\n fields: ResolvedFieldMeta[];\n /** Original schema for validation */\n schema: ArgsSchema;\n /** Schema type */\n schemaType: \"object\" | \"discriminatedUnion\" | \"union\" | \"xor\" | \"intersection\";\n /** Discriminator key (for discriminatedUnion) */\n discriminator?: string;\n /** Variants (for discriminatedUnion) */\n variants?: Array<{\n discriminatorValue: string;\n fields: ResolvedFieldMeta[];\n description?: string;\n }>;\n /** Options (for union) */\n unionOptions?: ExtractedFields[];\n /** Schema description */\n description?: string;\n /**\n * Unknown keys handling mode\n * - \"strict\": Unknown keys cause validation errors (z.strictObject or z.object().strict())\n * - \"strip\": Unknown keys trigger warnings (default, z.object())\n * - \"passthrough\": Unknown keys are silently ignored (z.looseObject or z.object().passthrough())\n */\n unknownKeysMode: UnknownKeysMode;\n}\n\n/**\n * Unknown keys handling mode for object schemas\n * - \"strict\": Unknown keys cause validation errors\n * - \"strip\": Unknown keys are silently ignored (default)\n * - \"passthrough\": Unknown keys are passed through\n */\nexport type UnknownKeysMode = \"strict\" | \"strip\" | \"passthrough\";\n\n// Internal type for accessing zod v4 internals\ninterface ZodV4Def {\n type?: string;\n innerType?: z.ZodType;\n schema?: z.ZodType;\n defaultValue?: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shape?: Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options?: any[];\n discriminator?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n left?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n right?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n catchall?: any;\n /** Pipe input schema (zod v4 transform/refine) */\n in?: z.ZodType;\n /** Pipe output schema (zod v4 transform/refine) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n out?: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ZodSchemaWithDef = z.ZodType & { def?: ZodV4Def; _def?: ZodV4Def; type?: string; shape?: any };\n\n/**\n * Get the type name from a zod schema (v4 compatible)\n */\nfunction getTypeName(schema: z.ZodType): string | undefined {\n const s = schema as ZodSchemaWithDef;\n return s.def?.type ?? s._def?.type ?? s.type;\n}\n\n/**\n * Detect unknown keys handling mode from a Zod object schema\n *\n * In Zod v4:\n * - Default (strip): _def.catchall is undefined\n * - strict: _def.catchall is ZodNever (type = \"never\")\n * - passthrough: _def.catchall is ZodUnknown (type = \"unknown\")\n */\nexport function getUnknownKeysMode(schema: z.ZodType): UnknownKeysMode {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const catchall = def?.catchall;\n\n if (!catchall) {\n // Default behavior: strip unknown keys (but we want to warn)\n return \"strip\";\n }\n\n const catchallType = getTypeName(catchall);\n\n if (catchallType === \"never\") {\n // z.strictObject() or z.object().strict() - reject unknown keys\n return \"strict\";\n }\n\n if (catchallType === \"unknown\" || catchallType === \"any\") {\n // z.looseObject() or z.object().passthrough() - allow unknown keys\n return \"passthrough\";\n }\n\n // Unknown catchall type, default to strip behavior\n return \"strip\";\n}\n\n/**\n * Get the inner schema, unwrapping optional, nullable, default, etc.\n */\nfunction unwrapSchema(schema: z.ZodType): z.ZodType {\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"optional\" || typeName === \"nullable\" || typeName === \"default\") {\n const innerSchema = def?.innerType;\n if (innerSchema) {\n return unwrapSchema(innerSchema);\n }\n }\n\n // Handle effects (transform, refine, etc.)\n if (typeName === \"pipe\") {\n const innerSchema = def?.in ?? def?.schema;\n if (innerSchema) {\n return unwrapSchema(innerSchema);\n }\n }\n\n return schema;\n}\n\n/**\n * Detect the base type of a schema\n */\nfunction detectType(schema: z.ZodType): \"string\" | \"number\" | \"boolean\" | \"array\" | \"unknown\" {\n const innerSchema = unwrapSchema(schema);\n const typeName = getTypeName(innerSchema);\n\n switch (typeName) {\n case \"string\":\n case \"enum\":\n return \"string\";\n case \"number\":\n case \"int\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"array\":\n return \"array\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Extract enum values from a schema if it's an enum type\n *\n * @param schema - The Zod schema to extract enum values from\n * @returns Array of enum values if schema is an enum, undefined otherwise\n */\nexport function extractEnumValues(schema: z.ZodType): string[] | undefined {\n const innerSchema = unwrapSchema(schema);\n const typeName = getTypeName(innerSchema);\n const s = innerSchema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"enum\") {\n // Zod v4: enum values are in def.entries or def.values\n const entries = (def as { entries?: Record<string, string> })?.entries;\n if (entries && typeof entries === \"object\") {\n return Object.values(entries);\n }\n\n // Check for values array (some Zod versions)\n const values = (def as { values?: string[] })?.values;\n if (Array.isArray(values)) {\n return values;\n }\n\n // Fallback: check for options property on schema\n const options = (s as { options?: string[] }).options;\n if (Array.isArray(options)) {\n return options;\n }\n }\n\n // Handle array types: extract enum values from the element type\n if (typeName === \"array\") {\n const element = (def as { element?: z.ZodType })?.element;\n if (element) {\n return extractEnumValues(element);\n }\n }\n\n // Also handle literal union patterns (z.literal(\"a\").or(z.literal(\"b\")))\n if (typeName === \"union\") {\n const options = def?.options;\n if (Array.isArray(options)) {\n const literalValues: string[] = [];\n for (const option of options) {\n const optionTypeName = getTypeName(option);\n if (optionTypeName === \"literal\") {\n const optionDef = (option as ZodSchemaWithDef).def ?? (option as ZodSchemaWithDef)._def;\n const value = (optionDef as { value?: unknown; values?: unknown[] })?.value;\n const values = (optionDef as { value?: unknown; values?: unknown[] })?.values;\n const literalValue = value ?? values?.[0];\n if (typeof literalValue === \"string\") {\n literalValues.push(literalValue);\n }\n }\n }\n // Only return if all options are string literals\n if (literalValues.length === options.length && literalValues.length > 0) {\n return literalValues;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Convert camelCase to kebab-case\n * @example toKebabCase(\"dryRun\") => \"dry-run\"\n * @example toKebabCase(\"outputDir\") => \"output-dir\"\n * @example toKebabCase(\"XMLParser\") => \"xml-parser\"\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/**\n * Convert hyphen-separated sequences to camelCase.\n *\n * Replaces `-x` (hyphen followed by a lowercase letter) with the uppercase\n * variant. Non-hyphenated input (e.g., already camelCase) is returned as-is.\n *\n * @param str - A string that may contain hyphens\n * @example toCamelCase(\"dry-run\") => \"dryRun\"\n * @example toCamelCase(\"output-dir\") => \"outputDir\"\n * @example toCamelCase(\"dryRun\") => \"dryRun\"\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Check if a schema is required (not optional or has default)\n *\n * Note: We only check isOptional(), not isNullable(), because CLI arguments\n * are either present (string value) or absent (undefined), never null.\n * Also, some coerce types incorrectly report isNullable()=true.\n */\nfunction isRequired(schema: z.ZodType): boolean {\n return !schema.isOptional();\n}\n\n/**\n * Extract default value from schema if present\n */\nfunction extractDefaultValue(schema: z.ZodType): unknown {\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"default\") {\n const defaultValue = def?.defaultValue;\n // In zod v4, defaultValue can be a direct value or a function\n if (typeof defaultValue === \"function\") {\n return defaultValue();\n }\n return defaultValue;\n }\n\n // Check for nested default in optional/nullable\n if (typeName === \"optional\" || typeName === \"nullable\") {\n const innerSchema = def?.innerType;\n if (innerSchema) {\n return extractDefaultValue(innerSchema);\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract description from schema\n */\nfunction extractDescription(schema: z.ZodType): string | undefined {\n // Check direct description\n if (schema.description) {\n return schema.description;\n }\n\n // Check inner schema for wrapped types\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"optional\" || typeName === \"nullable\" || typeName === \"default\") {\n const innerSchema = def?.innerType;\n if (innerSchema) {\n return extractDescription(innerSchema);\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolve field metadata from schema and argRegistry\n */\nfunction resolveFieldMeta(name: string, schema: z.ZodType): ResolvedFieldMeta {\n // Get metadata from argRegistry\n const argMeta = getArgMeta(schema) ?? getArgMeta(unwrapSchema(schema));\n\n // Priority: argRegistry > schema.describe()\n const description = argMeta?.description ?? extractDescription(schema);\n\n // Convert camelCase field name to kebab-case for CLI usage\n const cliName = toKebabCase(name);\n\n // Extract enum values from schema\n const enumValues = extractEnumValues(schema);\n\n // Normalize alias-like inputs to a deduped, validated array (or undefined when empty).\n // Leading dashes are stripped for convenience; entries that still fail the pattern after\n // stripping cause a validation error so that invalid aliases are never silently ignored.\n const aliasPattern = /^[A-Za-z0-9][A-Za-z0-9-]*$/;\n const normalizeAliasList = (\n input: unknown,\n metaKey: \"alias\" | \"hiddenAlias\",\n ): string[] | undefined => {\n if (input == null) return undefined;\n const arr = Array.isArray(input) ? input : [input];\n const normalized = arr.map((a) => {\n if (typeof a !== \"string\") {\n throw new Error(\n `Invalid ${metaKey} for field \"${name}\": expected string or string[], received ${typeof a}.`,\n );\n }\n const candidate = a.trim().replace(/^-+/, \"\");\n if (candidate.length === 0 || !aliasPattern.test(candidate)) {\n throw new Error(\n `Invalid ${metaKey} \"${a}\" for field \"${name}\": aliases must match ${aliasPattern}.`,\n );\n }\n return candidate;\n });\n const result = Array.from(new Set(normalized));\n return result.length > 0 ? result : undefined;\n };\n\n const alias = normalizeAliasList(argMeta?.alias, \"alias\");\n // Filter hiddenAlias so it never overlaps with visible alias (visible wins)\n const visibleSet = new Set(alias ?? []);\n const hiddenAliasRaw = normalizeAliasList(\n (argMeta as { hiddenAlias?: string | string[] } | undefined)?.hiddenAlias,\n \"hiddenAlias\",\n );\n const hiddenAlias = hiddenAliasRaw?.filter((a) => !visibleSet.has(a));\n const hiddenAliasFinal = hiddenAlias && hiddenAlias.length > 0 ? hiddenAlias : undefined;\n\n const fieldType = detectType(schema);\n\n // Validate and normalize `negation` (only meaningful for boolean fields).\n // Accepts:\n // - string: custom negation CLI name (suppresses default `--no-*`)\n // - true: keep default `--no-*` and advertise it in help/docs/completion\n // - false: disable negation entirely (default `--no-*` also rejected)\n const rawNegation = (argMeta as { negation?: unknown } | undefined)?.negation;\n let negation: string | boolean | undefined;\n if (rawNegation !== undefined && rawNegation !== null) {\n if (typeof rawNegation === \"boolean\") {\n if (fieldType !== \"boolean\") {\n throw new Error(\n `Invalid negation for field \"${name}\": negation can only be used on boolean fields.`,\n );\n }\n negation = rawNegation;\n } else {\n if (typeof rawNegation !== \"string\") {\n throw new Error(\n `Invalid negation for field \"${name}\": expected string or boolean, received ${typeof rawNegation}.`,\n );\n }\n const candidate = rawNegation.trim().replace(/^-+/, \"\");\n if (candidate.length === 0 || !aliasPattern.test(candidate)) {\n throw new Error(\n `Invalid negation \"${rawNegation}\" for field \"${name}\": negation names must match ${aliasPattern}.`,\n );\n }\n if (RESERVED_NEGATION_NAMES.has(candidate)) {\n throw new Error(\n `Invalid negation \"${rawNegation}\" for field \"${name}\": negation cannot use reserved built-in flag names (${[\n ...RESERVED_NEGATION_NAMES,\n ]\n .map((n) => `--${n}`)\n .join(\", \")}).`,\n );\n }\n if (fieldType !== \"boolean\") {\n throw new Error(\n `Invalid negation for field \"${name}\": negation can only be used on boolean fields.`,\n );\n }\n negation = candidate;\n }\n }\n\n const rawNegationDescription = (argMeta as { negationDescription?: unknown } | undefined)\n ?.negationDescription;\n let negationDescription: string | undefined;\n if (rawNegationDescription !== undefined && rawNegationDescription !== null) {\n if (typeof rawNegationDescription !== \"string\") {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": expected string, received ${typeof rawNegationDescription}.`,\n );\n }\n if (negation === false) {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": negationDescription cannot be used when negation is false.`,\n );\n }\n if (negation === undefined) {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": negationDescription requires \\`negation\\` to be set (string or true).`,\n );\n }\n // Reject blank strings: downstream rendering treats falsy values as\n // \"no description provided\" and collapses to the inline `/` form, so\n // an empty/whitespace-only string would be silently ignored.\n const trimmed = rawNegationDescription.trim();\n if (trimmed.length === 0) {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": negationDescription must be a non-empty string.`,\n );\n }\n negationDescription = trimmed;\n }\n\n // Compute the displayed negation name (without leading `--`) for help,\n // generated docs, and shell completions. `undefined` means hidden.\n const negationDisplay: string | undefined =\n typeof negation === \"string\" ? negation : negation === true ? `no-${cliName}` : undefined;\n\n const meta: ResolvedFieldMeta = {\n name,\n cliName,\n alias,\n hiddenAlias: hiddenAliasFinal,\n description,\n positional: argMeta?.positional ?? false,\n placeholder: argMeta?.placeholder,\n env: argMeta?.env,\n required: isRequired(schema),\n defaultValue: extractDefaultValue(schema),\n type: fieldType,\n schema,\n enumValues,\n completion: argMeta?.completion,\n prompt: argMeta?.prompt,\n negation,\n negationDisplay,\n negationDescription,\n effect: argMeta?.effect,\n };\n\n // Add overrideBuiltinAlias only if it's true\n if (argMeta && \"overrideBuiltinAlias\" in argMeta && argMeta.overrideBuiltinAlias === true) {\n meta.overrideBuiltinAlias = true;\n }\n\n return meta;\n}\n\n/**\n * Get the combined list of visible + hidden aliases for a field.\n * Used by the parser and validators which treat both equally,\n * while help/docs/completion rely on `field.alias` only.\n */\nexport function getAllAliases(field: ResolvedFieldMeta): string[] {\n if (!field.alias && !field.hiddenAlias) return [];\n return [...(field.alias ?? []), ...(field.hiddenAlias ?? [])];\n}\n\n/**\n * Get shape from a ZodObject\n */\nfunction getObjectShape(schema: z.ZodType): Record<string, z.ZodType> {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n return def?.shape ?? s.shape ?? {};\n}\n\n/**\n * Extract fields from a ZodObject\n */\nfunction extractFromObject(schema: z.ZodType): ResolvedFieldMeta[] {\n const shape = getObjectShape(schema);\n return Object.entries(shape).map(([name, fieldSchema]) => resolveFieldMeta(name, fieldSchema));\n}\n\n/**\n * Extract fields from a discriminated union\n */\nfunction extractFromDiscriminatedUnion(schema: z.ZodType): ExtractedFields {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const discriminator = def?.discriminator ?? \"\";\n const options = def?.options ?? [];\n\n // Collect all unique fields across all variants\n const allFieldsMap = new Map<string, ResolvedFieldMeta>();\n const variants: ExtractedFields[\"variants\"] = [];\n\n for (const option of options) {\n const shape = getObjectShape(option as z.ZodObject<z.ZodRawShape>);\n const variantFields: ResolvedFieldMeta[] = [];\n\n // Get discriminator value from the variant's discriminator schema.\n // Supports z.literal() and single-value z.enum() discriminators.\n let discriminatorValue = \"\";\n const discriminatorSchema = shape[discriminator];\n if (discriminatorSchema) {\n const typeName = getTypeName(discriminatorSchema);\n if (typeName === \"literal\") {\n const litDef =\n (discriminatorSchema as ZodSchemaWithDef).def ??\n (discriminatorSchema as ZodSchemaWithDef)._def;\n // In Zod v4, literal values are in _def.values array\n const value = (litDef as { value?: unknown; values?: unknown[] })?.value;\n const values = (litDef as { value?: unknown; values?: unknown[] })?.values;\n discriminatorValue = String(value ?? values?.[0] ?? \"\");\n } else if (typeName === \"enum\") {\n // Only single-value enums map to one variant. Multi-value enums\n // (z.enum(['a','b'])) on a single variant are not standard for\n // discriminatedUnion and are not extracted here.\n const enumValues = extractEnumValues(discriminatorSchema);\n if (enumValues && enumValues.length === 1) {\n discriminatorValue = enumValues[0]!;\n }\n }\n }\n\n for (const [name, fieldSchema] of Object.entries(shape)) {\n const fieldMeta = resolveFieldMeta(name, fieldSchema);\n variantFields.push(fieldMeta);\n\n // Add to all fields map (first occurrence wins for metadata)\n if (!allFieldsMap.has(name)) {\n allFieldsMap.set(name, fieldMeta);\n }\n }\n\n // Extract description from the variant option\n const variantDescription = extractDescription(option as z.ZodType);\n\n variants.push({\n discriminatorValue,\n fields: variantFields,\n ...(variantDescription ? { description: variantDescription } : {}),\n });\n }\n\n const description = extractDescription(schema);\n return {\n fields: Array.from(allFieldsMap.values()),\n schema: schema as ArgsSchema,\n schemaType: \"discriminatedUnion\",\n unknownKeysMode: getUnknownKeysMode(schema),\n discriminator,\n variants,\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Extract fields from a union-like schema (union or xor)\n */\nfunction extractFromUnionLike(schema: z.ZodType, schemaType: \"union\" | \"xor\"): ExtractedFields {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const options = def?.options ?? [];\n\n // Collect all unique fields across all options\n const allFieldsMap = new Map<string, ResolvedFieldMeta>();\n const unionOptions: ExtractedFields[] = [];\n\n for (const option of options) {\n // Extract fields for this option recursively\n // We cast to ArgsSchema because we expect options to be objects or other supported types\n const extracted = extractFields(option as ArgsSchema);\n unionOptions.push(extracted);\n\n // Add to combined fields map\n for (const field of extracted.fields) {\n if (!allFieldsMap.has(field.name)) {\n allFieldsMap.set(field.name, field);\n }\n }\n }\n\n const description = extractDescription(schema);\n return {\n fields: Array.from(allFieldsMap.values()),\n schema: schema as ArgsSchema,\n schemaType,\n unknownKeysMode: getUnknownKeysMode(schema),\n unionOptions,\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Extract fields from an intersection\n */\nfunction extractFromIntersection(schema: z.ZodType): ExtractedFields {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const left = def?.left;\n const right = def?.right;\n\n const allFieldsMap = new Map<string, ResolvedFieldMeta>();\n\n // Helper to extract fields from a sub-schema\n const extractSubFields = (subSchema: z.ZodType | undefined) => {\n if (!subSchema) return;\n\n const extracted = extractFields(subSchema as ArgsSchema);\n for (const field of extracted.fields) {\n if (!allFieldsMap.has(field.name)) {\n allFieldsMap.set(field.name, field);\n }\n }\n };\n\n extractSubFields(left);\n extractSubFields(right);\n\n const description = extractDescription(schema);\n return {\n fields: Array.from(allFieldsMap.values()),\n schema: schema as ArgsSchema,\n schemaType: \"intersection\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Cache for extractFields results to avoid redundant schema extraction\n */\nconst extractFieldsCache = new WeakMap<ArgsSchema, ExtractedFields>();\n\n/**\n * Extract all fields from a schema\n *\n * @param schema - The args schema (ZodObject, ZodDiscriminatedUnion, etc.)\n * @returns Extracted field information\n */\nexport function extractFields(schema: ArgsSchema): ExtractedFields {\n const cached = extractFieldsCache.get(schema);\n if (cached) return cached;\n\n let result: ExtractedFields;\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n switch (typeName) {\n case \"object\": {\n const description = extractDescription(schema);\n result = {\n fields: extractFromObject(schema),\n schema,\n schemaType: \"object\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(description ? { description } : {}),\n };\n break;\n }\n\n case \"union\":\n // In Zod v4, discriminatedUnion has type \"union\" with a discriminator property\n if (def?.discriminator) {\n result = extractFromDiscriminatedUnion(schema);\n } else {\n result = extractFromUnionLike(schema, \"union\");\n }\n break;\n\n case \"xor\":\n result = extractFromUnionLike(schema, \"xor\");\n break;\n\n case \"intersection\":\n result = extractFromIntersection(schema);\n break;\n\n case \"pipe\": {\n // Handle transform/refine on top-level schema (e.g., z.object({...}).transform(...))\n const pipeInner = def?.in ?? def?.schema;\n if (pipeInner) {\n const innerResult = extractFields(pipeInner as ArgsSchema);\n const pipeDescription = extractDescription(schema);\n result = {\n ...innerResult,\n schema,\n ...(pipeDescription ? { description: pipeDescription } : {}),\n };\n break;\n }\n const pipeDescription = extractDescription(schema);\n result = {\n fields: [],\n schema,\n schemaType: \"object\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(pipeDescription ? { description: pipeDescription } : {}),\n };\n break;\n }\n\n default: {\n const description = extractDescription(schema);\n // Fallback: try to treat as object\n result = {\n fields: [],\n schema,\n schemaType: \"object\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(description ? { description } : {}),\n };\n break;\n }\n }\n\n extractFieldsCache.set(schema, result);\n return result;\n}\n\n/**\n * Get extracted fields from a command\n *\n * @param command - The command to extract fields from\n * @returns Extracted field information, or null if command has no args schema\n */\nexport function getExtractedFields(command: AnyCommand): ExtractedFields | null {\n if (!command.args) {\n return null;\n }\n return extractFields(command.args);\n}\n"],"mappings":"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"}
|
|
@@ -618,4 +618,4 @@ function getExtractedFields(command) {
|
|
|
618
618
|
|
|
619
619
|
//#endregion
|
|
620
620
|
export { toCamelCase as a, listSubCommands as c, resolveSubcommandWithAlias as d, isLazyCommand as f, arg as h, getUnknownKeysMode as i, resolveLazyCommand as l, resolveSubCommandMeta as m, getAllAliases as n, toKebabCase as o, lazy as p, getExtractedFields as r, listSubCommandNamesWithAliases as s, extractFields as t, resolveSubCommandAlias as u };
|
|
621
|
-
//# sourceMappingURL=schema-extractor-
|
|
621
|
+
//# sourceMappingURL=schema-extractor-Dqe7_kyQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-extractor-Dqe7_kyQ.js","names":["getArgMeta","getArgMetaFromRegistry"],"sources":["../src/core/arg-registry.ts","../src/lazy.ts","../src/executor/subcommand-router.ts","../src/core/schema-extractor.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport type { GlobalArgs, IsEmpty } from \"../types.js\";\nimport type { DynamicCompletionResolver } from \"./dynamic-completion-types.js\";\nimport type { ExpandCompletion } from \"./expand-completion-types.js\";\n\n/**\n * Built-in completion types\n */\nexport type CompletionType = \"file\" | \"directory\" | \"none\";\n\n/**\n * Custom completion specification.\n *\n * `choices`, `shellCommand`, `resolve`, and `expand` are mutually exclusive —\n * specifying more than one throws when the field metadata is resolved.\n */\nexport interface CustomCompletion {\n /** Static list of choices for completion */\n choices?: string[];\n /** Shell command to execute for dynamic completion */\n shellCommand?: string;\n /**\n * In-process JS callback for dynamic completion. Receives parsed context\n * (other arg values typed so far, previously supplied values for this same\n * option) and returns candidates. Dispatcher scripts call\n * `<program> __complete` for every completion request; static scripts\n * delegate to it whenever this is set.\n */\n resolve?: DynamicCompletionResolver;\n /**\n * Completion whose candidates depend on sibling arg values. Dispatcher\n * scripts call `enumerate` inside `__complete` for the dependency values\n * already typed on the command line. Static scripts pre-enumerate every\n * combination of `dependsOn` values at script-generation time and dispatch\n * via a shell lookup table.\n */\n expand?: ExpandCompletion;\n}\n\n/**\n * Completion metadata for an argument\n *\n * @example\n * ```ts\n * // File completion with extension filter\n * input: arg(z.string(), {\n * completion: { type: \"file\", extensions: [\"json\", \"yaml\"] }\n * })\n *\n * // Directory completion\n * outputDir: arg(z.string(), {\n * completion: { type: \"directory\" }\n * })\n *\n * // Custom static choices\n * logLevel: arg(z.string(), {\n * completion: { custom: { choices: [\"debug\", \"info\", \"warn\", \"error\"] } }\n * })\n *\n * // Dynamic completion from shell command\n * branch: arg(z.string(), {\n * completion: { custom: { shellCommand: \"git branch --format='%(refname:short)'\" } }\n * })\n *\n * // File completion with glob pattern matcher\n * envFile: arg(z.string(), {\n * completion: { type: \"file\", matcher: [\".env.*\"] }\n * })\n * ```\n */\nexport type CompletionMeta = {\n /** Built-in completion type */\n type?: CompletionType;\n /** Custom completion (takes precedence over type if both specified) */\n custom?: CustomCompletion;\n} & (\n | {\n /** File extension filter (only applies when type is \"file\") */ extensions?: string[];\n matcher?: never;\n }\n | {\n /** Glob patterns for file matching (only applies when type is \"file\") */ matcher?: string[];\n extensions?: never;\n }\n);\n\n/**\n * Prompt input type for interactive prompts\n *\n * - \"text\": free-form text input (default for string schemas)\n * - \"password\": masked text input\n * - \"confirm\": yes/no prompt (default for boolean schemas)\n * - \"select\": single selection from choices (default for enum schemas)\n * - \"file\": file path input (inherited from completion type)\n * - \"directory\": directory path input (inherited from completion type)\n */\nexport type PromptType = \"text\" | \"password\" | \"confirm\" | \"select\" | \"file\" | \"directory\";\n\n/**\n * Prompt metadata for interactive input when a value is missing.\n * Used by the `politty/prompt` module to request user input for unresolved arguments.\n *\n * @example\n * ```ts\n * // Custom prompt message\n * name: arg(z.string(), {\n * prompt: { message: \"What is your name?\" }\n * })\n *\n * // Password input (masked)\n * token: arg(z.string(), {\n * prompt: { type: \"password\", message: \"Enter API token\" }\n * })\n *\n * // Select with custom choices\n * region: arg(z.string(), {\n * prompt: { choices: [\"us-east-1\", \"eu-west-1\", \"ap-northeast-1\"] }\n * })\n * ```\n */\nexport interface PromptMeta {\n /** Prompt message shown to the user. Defaults to the field's description or name. */\n message?: string;\n /** Explicit prompt type. Overrides auto-detection from schema/completion. */\n type?: PromptType;\n /** Choices for select prompt. Overrides enum values from schema. */\n choices?: Array<string | { label: string; value: string }>;\n /** Whether to enable prompting for this field (default: true when prompt is set) */\n enabled?: boolean;\n}\n\n/**\n * Context provided to effect callbacks.\n * When GlobalArgs is extended via declaration merging, `globalArgs` is typed accordingly.\n */\nexport type EffectContext = {\n /** Field name (camelCase) */\n name: string;\n /** Validated args for this schema (global args for global effects, command args for command effects) */\n args: Readonly<Record<string, unknown>>;\n} & (IsEmpty<GlobalArgs> extends true\n ? { globalArgs?: Readonly<Record<string, unknown>> }\n : { globalArgs?: Readonly<GlobalArgs> });\n\n/**\n * Base metadata shared by all argument types\n */\nexport interface BaseArgMeta<TValue = unknown> {\n /** Argument description */\n description?: string;\n /** Treat as positional argument */\n positional?: boolean;\n /** Placeholder for help display */\n placeholder?: string;\n /**\n * Environment variable name(s) to read value from.\n * If an array is provided, earlier entries take priority.\n * CLI arguments always take precedence over environment variables.\n *\n * @example\n * ```ts\n * // Single env var\n * port: arg(z.coerce.number(), { env: \"PORT\" })\n *\n * // Multiple env vars (PORT takes priority over SERVER_PORT)\n * port: arg(z.coerce.number(), { env: [\"PORT\", \"SERVER_PORT\"] })\n * ```\n */\n env?: string | string[];\n /** Completion configuration for shell tab-completion */\n completion?: CompletionMeta;\n /**\n * Interactive prompt configuration for missing values.\n * When set, the `politty/prompt` module will prompt the user interactively\n * if this argument is not provided via CLI args or environment variables.\n *\n * @example\n * ```ts\n * name: arg(z.string(), {\n * description: \"User name\",\n * prompt: { message: \"What is your name?\" },\n * })\n * ```\n */\n prompt?: PromptMeta;\n /**\n * Control the boolean negation option.\n *\n * Boolean fields automatically accept `--no-<cliName>` (and the camelCase\n * `--no<Name>` form) to set the value to `false`. By default this form is\n * accepted by the parser but hidden from help, generated docs, and shell\n * completions. This option lets you customize or expose that behavior:\n *\n * - `string` — replaces the auto-generated `--no-*` form with a custom\n * name. The default `--no-*` is no longer recognized.\n * - `true` — opt-in to advertising the default `--no-<cliName>` form in\n * help, generated docs, and shell completions. Parser behavior is\n * unchanged.\n * - `false` — disables negation entirely; neither the default `--no-*`\n * nor any custom name is accepted.\n *\n * String values follow the same naming conventions as `cliName`\n * (kebab-case is recommended). Only valid on boolean fields; setting\n * `negation` on a non-boolean field is a type error and raises a\n * runtime error during command parsing.\n *\n * @example\n * ```ts\n * // Custom negation name\n * cache: arg(z.boolean().default(true), {\n * description: \"Enable caching\",\n * negation: \"disable-cache\",\n * })\n * // Accepts: --cache (true), --disable-cache (false)\n * // No longer accepts: --no-cache\n *\n * // Expose default `--no-X` in help/docs/completion\n * verbose: arg(z.boolean().default(false), {\n * negation: true,\n * })\n * // Help shows `--verbose / --no-verbose`\n *\n * // Disable negation entirely\n * dryRun: arg(z.boolean().default(false), {\n * negation: false,\n * })\n * // Accepts: --dry-run (true)\n * // No longer accepts: --no-dry-run\n * ```\n */\n negation?: string | boolean;\n /**\n * Description shown for the negation option in help and generated docs.\n * Only meaningful when `negation` is set to a custom name string or `true`.\n * Disallowed when `negation` is `false`.\n */\n negationDescription?: string;\n /**\n * Side-effect callback executed after argument parsing and validation.\n * Runs before the command lifecycle (setup/run/cleanup).\n * Use Zod .transform() for value transformation instead.\n *\n * @example\n * ```ts\n * verbose: arg(z.boolean().default(false), {\n * alias: \"v\",\n * effect: (value) => {\n * if (value) logger.setLevel(\"debug\");\n * },\n * })\n * ```\n */\n effect?: (value: TValue, context: EffectContext) => void | PromiseLike<void>;\n}\n\n/**\n * Metadata for regular arguments (non-builtin aliases)\n *\n * `alias` accepts either a single string or an array of strings.\n * Single-character entries become short options (e.g. `-v`); multi-character\n * entries become additional long options (e.g. `--to-be` for `--tobe`).\n */\nexport interface RegularArgMeta<TValue = unknown> extends BaseArgMeta<TValue> {\n /**\n * Alias name(s) for this option.\n * - 1-char string → short alias (`-v`)\n * - >1-char string → long alias (`--long-name`)\n * - array → multiple aliases of either kind\n */\n alias?: string | string[] | readonly string[];\n /**\n * Alias name(s) that are accepted by the parser but hidden from help,\n * generated docs, and shell completion. Useful for legacy or deprecated\n * names that should still work without being advertised.\n */\n hiddenAlias?: string | string[] | readonly string[];\n}\n\n/**\n * Metadata for overriding built-in aliases (-h, -H)\n */\nexport interface BuiltinOverrideArgMeta<TValue = unknown> extends BaseArgMeta<TValue> {\n /** Built-in alias to override ('h' or 'H'), optionally combined with extra aliases */\n alias: \"h\" | \"H\" | Array<\"h\" | \"H\" | string> | ReadonlyArray<\"h\" | \"H\" | string>;\n /** Hidden aliases (accepted but not surfaced in help/docs/completion) */\n hiddenAlias?: string | string[] | readonly string[];\n /** Must be true to override built-in aliases */\n overrideBuiltinAlias: true;\n}\n\n/**\n * Metadata options for argument definition\n */\nexport type ArgMeta<TValue = unknown> = RegularArgMeta<TValue> | BuiltinOverrideArgMeta<TValue>;\n\n/**\n * Custom registry for politty argument metadata\n * This avoids polluting Zod's GlobalMeta\n */\nexport const argRegistry = z.registry<ArgMeta>();\n\n/**\n * Register metadata for a Zod schema\n *\n * @param schema - The Zod schema\n * @param meta - Argument metadata\n * @returns The same schema (for chaining)\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { arg, defineCommand } from \"politty\";\n *\n * const cmd = defineCommand({\n * args: z.object({\n * name: arg(z.string(), { description: \"User name\", positional: true }),\n * verbose: arg(z.boolean().default(false), { alias: \"v\" }),\n * }),\n * run: (args) => {\n * console.log(args.name, args.verbose);\n * },\n * });\n * ```\n */\n/**\n * Detect whether `A` contains a reserved alias (\"h\" or \"H\"), for either a\n * plain string or a tuple/array of strings. Uses `[A] extends [never]` to\n * prevent distribution returning `never` for missing fields.\n */\ntype ContainsReservedAlias<A> = [A] extends [never]\n ? false\n : A extends \"h\" | \"H\"\n ? true\n : A extends readonly (infer E)[]\n ? [Extract<E, \"h\" | \"H\">] extends [never]\n ? false\n : true\n : false;\n\ntype ReservedAliasTypeError<M> = {\n [K in keyof M]: M[K];\n} & {\n __typeError: \"Alias 'h' or 'H' requires overrideBuiltinAlias: true\";\n};\n\ntype NegationTypeError<M> = {\n [K in keyof M]: M[K];\n} & {\n __typeError: \"negation/negationDescription can only be used on boolean fields\";\n};\n\ntype AliasFieldOf<M> = M extends { alias: infer A } ? A : never;\ntype HiddenAliasFieldOf<M> = M extends { hiddenAlias: infer H } ? H : never;\n\n/**\n * Check whether a Zod output type is a (possibly optional) boolean.\n * Strips `undefined` to allow `z.boolean().optional()`. Requires both\n * `boolean extends NonNullable<T>` (so `z.literal(true)` is rejected — the full\n * `boolean` domain is needed) and `NonNullable<T> extends boolean` (so unions\n * such as `z.union([z.boolean(), z.string()])` are rejected at the type level\n * to match the runtime check).\n */\ntype IsBooleanField<T> =\n boolean extends NonNullable<T> ? ([NonNullable<T>] extends [boolean] ? true : false) : false;\n\n/**\n * Detect whether `M` has `K` set to a non-undefined value.\n *\n * When `M` is inferred from a literal such as `{ negation: \"off\" }`,\n * `M[\"negation\"]` is `\"off\"` (without `undefined`), so this returns `true`.\n * When `M` is the wider `ArgMeta` type, `M[\"negation\"]` is\n * `string | boolean | undefined`, so this returns `false` and avoids\n * false-positive type errors on broadly-typed meta values.\n */\ntype HasExplicit<M, K extends string> = K extends keyof M\n ? undefined extends M[K]\n ? false\n : true\n : false;\n\n/**\n * Reject `negation` / `negationDescription` on non-boolean fields.\n * Uses {@link HasExplicit} so the error only fires when the user explicitly\n * sets the field on a narrowly-inferred meta literal.\n */\ntype ValidateNegation<M, TValue> =\n HasExplicit<M, \"negation\"> extends true\n ? IsBooleanField<TValue> extends true\n ? M\n : NegationTypeError<M>\n : HasExplicit<M, \"negationDescription\"> extends true\n ? IsBooleanField<TValue> extends true\n ? M\n : NegationTypeError<M>\n : M;\n\n/**\n * Type helper to validate ArgMeta.\n * Forces a type error when a reserved alias (\"h\" / \"H\") is used without\n * `overrideBuiltinAlias: true`, whether the alias is provided as a string\n * or as part of an array, and whether it appears in `alias` or `hiddenAlias`.\n * Also rejects `negation` / `negationDescription` on non-boolean fields.\n */\ntype ValidateArgMeta<M, TValue = unknown> = M extends { overrideBuiltinAlias: true }\n ? ValidateNegation<M, TValue>\n : ContainsReservedAlias<AliasFieldOf<M>> extends true\n ? ReservedAliasTypeError<M>\n : ContainsReservedAlias<HiddenAliasFieldOf<M>> extends true\n ? ReservedAliasTypeError<M>\n : ValidateNegation<M, TValue>;\n\nexport function arg<T extends z.ZodType>(schema: T): T;\nexport function arg<T extends z.ZodType, M extends ArgMeta<z.output<T>>>(\n schema: T,\n meta: ValidateArgMeta<M, z.output<T>>,\n): T;\nexport function arg<T extends z.ZodType>(\n schema: T,\n meta?: ValidateArgMeta<ArgMeta, z.output<T>>,\n): T {\n if (meta) {\n argRegistry.add(schema, meta as ArgMeta);\n }\n return schema;\n}\n\n/**\n * Get metadata for a schema from the registry\n *\n * @param schema - The Zod schema\n * @returns The metadata if registered, undefined otherwise\n */\nexport function getArgMeta(schema: z.ZodType): ArgMeta | undefined {\n // Zod's `$replace<Meta, S>` recursively rewrites the meta type, which mangles\n // the generic `then` signature of `PromiseLike<void>` inside `effect`'s return\n // type under newer TypeScript builds (@typescript/native-preview ≥ 20260504).\n // The runtime value is always the original ArgMeta we stored, so we restore\n // the static type at the boundary.\n return argRegistry.get(schema) as ArgMeta | undefined;\n}\n","/**\n * Lazy-loaded subcommand with synchronous metadata\n */\n\nimport type { AnyCommand, SubCommandValue } from \"./types.js\";\n\n/**\n * Marker property for LazyCommand identification\n */\nconst LAZY_BRAND = \"__politty_lazy__\" as const;\n\n/**\n * A lazily-loaded command that carries synchronous metadata for\n * static analysis (completion, help) while deferring full module\n * loading to execution time.\n */\nexport interface LazyCommand<T extends AnyCommand = AnyCommand> {\n readonly __politty_lazy__: true;\n readonly meta: T;\n readonly load: () => Promise<AnyCommand>;\n}\n\n/**\n * Type guard: check if a value is a LazyCommand\n */\nexport function isLazyCommand(value: unknown): value is LazyCommand {\n return (\n typeof value === \"object\" && value !== null && LAZY_BRAND in value && value[LAZY_BRAND] === true\n );\n}\n\n/**\n * Create a lazily-loaded subcommand with synchronous metadata.\n *\n * The `meta` command provides names, descriptions, and args schema\n * for static analysis (completion scripts, help text) without loading\n * the full command module.\n *\n * The `load` function is called only at execution time.\n *\n * @example\n * ```ts\n * import { lazy, defineCommand } from \"politty\";\n *\n * const cli = defineCommand({\n * name: \"mycli\",\n * subCommands: {\n * deploy: lazy(\n * defineCommand({\n * name: \"deploy\",\n * description: \"Deploy the application\",\n * args: z.object({ env: arg(z.string()) }),\n * }),\n * () => import(\"./deploy.js\").then((m) => m.deployCommand),\n * ),\n * },\n * });\n * ```\n */\nexport function lazy<T extends AnyCommand>(\n meta: T,\n load: () => Promise<AnyCommand>,\n): LazyCommand<T> {\n return {\n [LAZY_BRAND]: true as const,\n meta,\n load,\n };\n}\n\n/**\n * Resolve synchronous metadata from a SubCommandValue.\n * Returns null for legacy async subcommands whose metadata is unavailable.\n */\nexport function resolveSubCommandMeta(subCmd: SubCommandValue): AnyCommand | null {\n if (isLazyCommand(subCmd)) return subCmd.meta;\n if (typeof subCmd === \"function\") return null;\n return subCmd;\n}\n","import { isLazyCommand, resolveSubCommandMeta } from \"../lazy.js\";\nimport type { AnyCommand, SubCommandValue } from \"../types.js\";\n\n/**\n * Resolve a lazy-loaded command (sync or async)\n *\n * @param cmd - The command or lazy loader function\n * @returns The resolved command\n */\nexport async function resolveLazyCommand(cmd: SubCommandValue): Promise<AnyCommand> {\n if (isLazyCommand(cmd)) {\n return await cmd.load();\n }\n if (typeof cmd === \"function\") {\n return await cmd();\n }\n return cmd;\n}\n\n/**\n * Resolve a subcommand by name (including alias lookup)\n *\n * Handles both sync and async (lazy-loaded) subcommands.\n * If the name does not match a direct subcommand key, searches\n * for a subcommand whose `aliases` array includes the name.\n *\n * @param command - The parent command\n * @param name - The subcommand name or alias to resolve\n * @returns The resolved subcommand, or undefined if not found\n */\nexport async function resolveSubcommand(\n command: AnyCommand,\n name: string,\n): Promise<AnyCommand | undefined> {\n if (!command.subCommands) {\n return undefined;\n }\n\n // Direct lookup first\n const subCmd = command.subCommands[name];\n if (subCmd) {\n return resolveLazyCommand(subCmd);\n }\n\n // Alias lookup: find a subcommand whose aliases include the name\n const canonicalName = resolveSubCommandAlias(command, name);\n if (canonicalName) {\n return resolveLazyCommand(command.subCommands[canonicalName]!);\n }\n\n return undefined;\n}\n\n/**\n * Resolve a subcommand by name (including alias lookup) and return both the\n * resolved command and the canonical name if accessed via alias.\n *\n * This avoids a redundant alias scan when the caller needs both pieces of info.\n */\nexport async function resolveSubcommandWithAlias(\n command: AnyCommand,\n name: string,\n): Promise<{ command: AnyCommand; aliasFor: string | undefined } | undefined> {\n if (!command.subCommands) {\n return undefined;\n }\n\n // Direct lookup\n const subCmd = command.subCommands[name];\n if (subCmd) {\n return { command: await resolveLazyCommand(subCmd), aliasFor: undefined };\n }\n\n // Alias lookup\n const canonicalName = resolveSubCommandAlias(command, name);\n if (canonicalName) {\n return {\n command: await resolveLazyCommand(command.subCommands[canonicalName]!),\n aliasFor: canonicalName,\n };\n }\n\n return undefined;\n}\n\n/**\n * Resolve an alias to the canonical subcommand name.\n * Returns the canonical name if the given name is an alias, or undefined.\n *\n * Note: Aliases are only recognized for eagerly-defined commands and\n * `lazy()` commands (which carry synchronous metadata). Pure async\n * subcommand functions do not expose metadata synchronously, so their\n * aliases cannot be resolved without loading the module.\n *\n * @param command - The parent command\n * @param alias - The alias to look up\n * @returns The canonical subcommand name, or undefined\n */\nexport function resolveSubCommandAlias(command: AnyCommand, alias: string): string | undefined {\n if (!command.subCommands) return undefined;\n\n for (const [name, subCmd] of Object.entries(command.subCommands)) {\n const meta = resolveSubCommandMeta(subCmd);\n if (meta?.aliases?.includes(alias)) {\n return name;\n }\n }\n return undefined;\n}\n\n/**\n * Build a set of all recognized subcommand names including aliases.\n *\n * @param command - The parent command\n * @returns Set of all names (canonical + aliases)\n */\nexport function listSubCommandNamesWithAliases(command: AnyCommand): Set<string> {\n const names = new Set<string>();\n if (!command.subCommands) return names;\n\n for (const [name, subCmd] of Object.entries(command.subCommands)) {\n names.add(name);\n const meta = resolveSubCommandMeta(subCmd);\n if (meta?.aliases) {\n for (const alias of meta.aliases) {\n names.add(alias);\n }\n }\n }\n return names;\n}\n\n/**\n * List all subcommand names for a command\n *\n * @param command - The parent command\n * @returns Array of subcommand names\n */\nexport function listSubCommands(command: AnyCommand): string[] {\n if (!command.subCommands) {\n return [];\n }\n\n return Object.keys(command.subCommands);\n}\n","import type { z } from \"zod\";\nimport type { AnyCommand, ArgsSchema } from \"../types.js\";\nimport {\n getArgMeta as getArgMetaFromRegistry,\n type ArgMeta,\n type CompletionMeta,\n type EffectContext,\n type PromptMeta,\n} from \"./arg-registry.js\";\n\n/**\n * Get ArgMeta from both the custom registry and Zod's _def\n * Priority: custom registry > _def.argMeta\n */\nfunction getArgMeta(schema: z.ZodType): ArgMeta | undefined {\n // First check custom registry\n const fromRegistry = getArgMetaFromRegistry(schema);\n if (fromRegistry) return fromRegistry;\n // Check Zod native meta\n // Some Zod versions or extensions use a global registry accessed via .meta()\n if (typeof (schema as any).meta === \"function\") {\n const meta = (schema as any).meta();\n if (meta && typeof meta === \"object\") {\n return meta as ArgMeta;\n }\n }\n\n // Then check _def.argMeta (for augmented Zod types)\n const def = (schema as any)._def;\n if (def?.argMeta) return def.argMeta;\n\n // Also check _def.meta just in case\n if (def?.meta) return def.meta as ArgMeta;\n\n return undefined;\n}\n\n/**\n * Long flag names reserved for built-in handling (parseArgs / scanForSubcommand\n * intercept these before option parsing), so custom negation names must avoid them.\n */\nconst RESERVED_NEGATION_NAMES: ReadonlySet<string> = new Set([\"help\", \"help-all\", \"version\"]);\n\n/**\n * Resolved metadata for an argument field\n */\nexport interface ResolvedFieldMeta {\n /** Field name (camelCase, as defined in schema) */\n name: string;\n /** CLI option name (kebab-case, for command line usage) */\n cliName: string;\n /**\n * Aliases for this option, normalized to an array.\n * 1-char entries are short aliases (`-v`); multi-char entries are long\n * aliases (`--to-be`).\n */\n alias?: string[] | undefined;\n /**\n * Aliases that are accepted at parse time but hidden from help,\n * generated docs, and shell completion.\n */\n hiddenAlias?: string[] | undefined;\n /** Argument description */\n description?: string | undefined;\n /** Whether this is a positional argument */\n positional: boolean;\n /** Placeholder for help display */\n placeholder?: string | undefined;\n /**\n * Environment variable name(s) to read value from.\n * If an array, earlier entries take priority.\n */\n env?: string | string[] | undefined;\n /** Whether this argument is required */\n required: boolean;\n /** Default value if any */\n defaultValue?: unknown;\n /** Detected type from schema */\n type: \"string\" | \"number\" | \"boolean\" | \"array\" | \"unknown\";\n /** Original Zod schema */\n schema: z.ZodType;\n /** True if this overrides built-in aliases (-h, -H) */\n overrideBuiltinAlias?: true;\n /** Enum values if detected from schema (z.enum) */\n enumValues?: string[] | undefined;\n /** Completion metadata from arg() */\n completion?: CompletionMeta | undefined;\n /** Prompt metadata from arg() for interactive input */\n prompt?: PromptMeta | undefined;\n /**\n * Negation configuration for this boolean field.\n *\n * - String (e.g. `\"disable-cache\"`): the default `--no-<cliName>` form is\n * suppressed and only `--<negation>` (plus its camelCase variant) is\n * accepted as the negation flag.\n * - `true`: the default `--no-<cliName>` form is accepted **and** shown in\n * help, generated docs, and shell completions.\n * - `false`: neither the default `--no-<cliName>` nor any custom name is\n * accepted; the field only responds to the positive flag.\n * - `undefined`: the default `--no-<cliName>` is accepted by the parser\n * but hidden from help/docs/completions.\n *\n * Only applies to boolean fields; populated as `undefined` otherwise.\n */\n negation?: string | boolean | undefined;\n /**\n * Derived display name (no `--` prefix) for the negation flag in help,\n * generated docs, and shell completions. `undefined` means the negation\n * is hidden from those surfaces. Computed from `negation` + `cliName`.\n */\n negationDisplay?: string | undefined;\n /** Description shown for the negation option in help/docs. */\n negationDescription?: string | undefined;\n /** Side-effect callback from arg() metadata */\n effect?: ((value: unknown, context: EffectContext) => void | PromiseLike<void>) | undefined;\n}\n\n/**\n * Extracted fields from a schema\n */\nexport interface ExtractedFields {\n /** All field definitions */\n fields: ResolvedFieldMeta[];\n /** Original schema for validation */\n schema: ArgsSchema;\n /** Schema type */\n schemaType: \"object\" | \"discriminatedUnion\" | \"union\" | \"xor\" | \"intersection\";\n /** Discriminator key (for discriminatedUnion) */\n discriminator?: string;\n /** Variants (for discriminatedUnion) */\n variants?: Array<{\n discriminatorValue: string;\n fields: ResolvedFieldMeta[];\n description?: string;\n }>;\n /** Options (for union) */\n unionOptions?: ExtractedFields[];\n /** Schema description */\n description?: string;\n /**\n * Unknown keys handling mode\n * - \"strict\": Unknown keys cause validation errors (z.strictObject or z.object().strict())\n * - \"strip\": Unknown keys trigger warnings (default, z.object())\n * - \"passthrough\": Unknown keys are silently ignored (z.looseObject or z.object().passthrough())\n */\n unknownKeysMode: UnknownKeysMode;\n}\n\n/**\n * Unknown keys handling mode for object schemas\n * - \"strict\": Unknown keys cause validation errors\n * - \"strip\": Unknown keys are silently ignored (default)\n * - \"passthrough\": Unknown keys are passed through\n */\nexport type UnknownKeysMode = \"strict\" | \"strip\" | \"passthrough\";\n\n// Internal type for accessing zod v4 internals\ninterface ZodV4Def {\n type?: string;\n innerType?: z.ZodType;\n schema?: z.ZodType;\n defaultValue?: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n shape?: Record<string, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options?: any[];\n discriminator?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n left?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n right?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n catchall?: any;\n /** Pipe input schema (zod v4 transform/refine) */\n in?: z.ZodType;\n /** Pipe output schema (zod v4 transform/refine) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n out?: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ZodSchemaWithDef = z.ZodType & { def?: ZodV4Def; _def?: ZodV4Def; type?: string; shape?: any };\n\n/**\n * Get the type name from a zod schema (v4 compatible)\n */\nfunction getTypeName(schema: z.ZodType): string | undefined {\n const s = schema as ZodSchemaWithDef;\n return s.def?.type ?? s._def?.type ?? s.type;\n}\n\n/**\n * Detect unknown keys handling mode from a Zod object schema\n *\n * In Zod v4:\n * - Default (strip): _def.catchall is undefined\n * - strict: _def.catchall is ZodNever (type = \"never\")\n * - passthrough: _def.catchall is ZodUnknown (type = \"unknown\")\n */\nexport function getUnknownKeysMode(schema: z.ZodType): UnknownKeysMode {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const catchall = def?.catchall;\n\n if (!catchall) {\n // Default behavior: strip unknown keys (but we want to warn)\n return \"strip\";\n }\n\n const catchallType = getTypeName(catchall);\n\n if (catchallType === \"never\") {\n // z.strictObject() or z.object().strict() - reject unknown keys\n return \"strict\";\n }\n\n if (catchallType === \"unknown\" || catchallType === \"any\") {\n // z.looseObject() or z.object().passthrough() - allow unknown keys\n return \"passthrough\";\n }\n\n // Unknown catchall type, default to strip behavior\n return \"strip\";\n}\n\n/**\n * Get the inner schema, unwrapping optional, nullable, default, etc.\n */\nfunction unwrapSchema(schema: z.ZodType): z.ZodType {\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"optional\" || typeName === \"nullable\" || typeName === \"default\") {\n const innerSchema = def?.innerType;\n if (innerSchema) {\n return unwrapSchema(innerSchema);\n }\n }\n\n // Handle effects (transform, refine, etc.)\n if (typeName === \"pipe\") {\n const innerSchema = def?.in ?? def?.schema;\n if (innerSchema) {\n return unwrapSchema(innerSchema);\n }\n }\n\n return schema;\n}\n\n/**\n * Detect the base type of a schema\n */\nfunction detectType(schema: z.ZodType): \"string\" | \"number\" | \"boolean\" | \"array\" | \"unknown\" {\n const innerSchema = unwrapSchema(schema);\n const typeName = getTypeName(innerSchema);\n\n switch (typeName) {\n case \"string\":\n case \"enum\":\n return \"string\";\n case \"number\":\n case \"int\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"array\":\n return \"array\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Extract enum values from a schema if it's an enum type\n *\n * @param schema - The Zod schema to extract enum values from\n * @returns Array of enum values if schema is an enum, undefined otherwise\n */\nexport function extractEnumValues(schema: z.ZodType): string[] | undefined {\n const innerSchema = unwrapSchema(schema);\n const typeName = getTypeName(innerSchema);\n const s = innerSchema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"enum\") {\n // Zod v4: enum values are in def.entries or def.values\n const entries = (def as { entries?: Record<string, string> })?.entries;\n if (entries && typeof entries === \"object\") {\n return Object.values(entries);\n }\n\n // Check for values array (some Zod versions)\n const values = (def as { values?: string[] })?.values;\n if (Array.isArray(values)) {\n return values;\n }\n\n // Fallback: check for options property on schema\n const options = (s as { options?: string[] }).options;\n if (Array.isArray(options)) {\n return options;\n }\n }\n\n // Handle array types: extract enum values from the element type\n if (typeName === \"array\") {\n const element = (def as { element?: z.ZodType })?.element;\n if (element) {\n return extractEnumValues(element);\n }\n }\n\n // Also handle literal union patterns (z.literal(\"a\").or(z.literal(\"b\")))\n if (typeName === \"union\") {\n const options = def?.options;\n if (Array.isArray(options)) {\n const literalValues: string[] = [];\n for (const option of options) {\n const optionTypeName = getTypeName(option);\n if (optionTypeName === \"literal\") {\n const optionDef = (option as ZodSchemaWithDef).def ?? (option as ZodSchemaWithDef)._def;\n const value = (optionDef as { value?: unknown; values?: unknown[] })?.value;\n const values = (optionDef as { value?: unknown; values?: unknown[] })?.values;\n const literalValue = value ?? values?.[0];\n if (typeof literalValue === \"string\") {\n literalValues.push(literalValue);\n }\n }\n }\n // Only return if all options are string literals\n if (literalValues.length === options.length && literalValues.length > 0) {\n return literalValues;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Convert camelCase to kebab-case\n * @example toKebabCase(\"dryRun\") => \"dry-run\"\n * @example toKebabCase(\"outputDir\") => \"output-dir\"\n * @example toKebabCase(\"XMLParser\") => \"xml-parser\"\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/**\n * Convert hyphen-separated sequences to camelCase.\n *\n * Replaces `-x` (hyphen followed by a lowercase letter) with the uppercase\n * variant. Non-hyphenated input (e.g., already camelCase) is returned as-is.\n *\n * @param str - A string that may contain hyphens\n * @example toCamelCase(\"dry-run\") => \"dryRun\"\n * @example toCamelCase(\"output-dir\") => \"outputDir\"\n * @example toCamelCase(\"dryRun\") => \"dryRun\"\n */\nexport function toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Check if a schema is required (not optional or has default)\n *\n * Note: We only check isOptional(), not isNullable(), because CLI arguments\n * are either present (string value) or absent (undefined), never null.\n * Also, some coerce types incorrectly report isNullable()=true.\n */\nfunction isRequired(schema: z.ZodType): boolean {\n return !schema.isOptional();\n}\n\n/**\n * Extract default value from schema if present\n */\nfunction extractDefaultValue(schema: z.ZodType): unknown {\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"default\") {\n const defaultValue = def?.defaultValue;\n // In zod v4, defaultValue can be a direct value or a function\n if (typeof defaultValue === \"function\") {\n return defaultValue();\n }\n return defaultValue;\n }\n\n // Check for nested default in optional/nullable\n if (typeName === \"optional\" || typeName === \"nullable\") {\n const innerSchema = def?.innerType;\n if (innerSchema) {\n return extractDefaultValue(innerSchema);\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract description from schema\n */\nfunction extractDescription(schema: z.ZodType): string | undefined {\n // Check direct description\n if (schema.description) {\n return schema.description;\n }\n\n // Check inner schema for wrapped types\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n if (typeName === \"optional\" || typeName === \"nullable\" || typeName === \"default\") {\n const innerSchema = def?.innerType;\n if (innerSchema) {\n return extractDescription(innerSchema);\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolve field metadata from schema and argRegistry\n */\nfunction resolveFieldMeta(name: string, schema: z.ZodType): ResolvedFieldMeta {\n // Get metadata from argRegistry\n const argMeta = getArgMeta(schema) ?? getArgMeta(unwrapSchema(schema));\n\n // Priority: argRegistry > schema.describe()\n const description = argMeta?.description ?? extractDescription(schema);\n\n // Convert camelCase field name to kebab-case for CLI usage\n const cliName = toKebabCase(name);\n\n // Extract enum values from schema\n const enumValues = extractEnumValues(schema);\n\n // Normalize alias-like inputs to a deduped, validated array (or undefined when empty).\n // Leading dashes are stripped for convenience; entries that still fail the pattern after\n // stripping cause a validation error so that invalid aliases are never silently ignored.\n const aliasPattern = /^[A-Za-z0-9][A-Za-z0-9-]*$/;\n const normalizeAliasList = (\n input: unknown,\n metaKey: \"alias\" | \"hiddenAlias\",\n ): string[] | undefined => {\n if (input == null) return undefined;\n const arr = Array.isArray(input) ? input : [input];\n const normalized = arr.map((a) => {\n if (typeof a !== \"string\") {\n throw new Error(\n `Invalid ${metaKey} for field \"${name}\": expected string or string[], received ${typeof a}.`,\n );\n }\n const candidate = a.trim().replace(/^-+/, \"\");\n if (candidate.length === 0 || !aliasPattern.test(candidate)) {\n throw new Error(\n `Invalid ${metaKey} \"${a}\" for field \"${name}\": aliases must match ${aliasPattern}.`,\n );\n }\n return candidate;\n });\n const result = Array.from(new Set(normalized));\n return result.length > 0 ? result : undefined;\n };\n\n const alias = normalizeAliasList(argMeta?.alias, \"alias\");\n // Filter hiddenAlias so it never overlaps with visible alias (visible wins)\n const visibleSet = new Set(alias ?? []);\n const hiddenAliasRaw = normalizeAliasList(\n (argMeta as { hiddenAlias?: string | string[] } | undefined)?.hiddenAlias,\n \"hiddenAlias\",\n );\n const hiddenAlias = hiddenAliasRaw?.filter((a) => !visibleSet.has(a));\n const hiddenAliasFinal = hiddenAlias && hiddenAlias.length > 0 ? hiddenAlias : undefined;\n\n const fieldType = detectType(schema);\n\n // Validate and normalize `negation` (only meaningful for boolean fields).\n // Accepts:\n // - string: custom negation CLI name (suppresses default `--no-*`)\n // - true: keep default `--no-*` and advertise it in help/docs/completion\n // - false: disable negation entirely (default `--no-*` also rejected)\n const rawNegation = (argMeta as { negation?: unknown } | undefined)?.negation;\n let negation: string | boolean | undefined;\n if (rawNegation !== undefined && rawNegation !== null) {\n if (typeof rawNegation === \"boolean\") {\n if (fieldType !== \"boolean\") {\n throw new Error(\n `Invalid negation for field \"${name}\": negation can only be used on boolean fields.`,\n );\n }\n negation = rawNegation;\n } else {\n if (typeof rawNegation !== \"string\") {\n throw new Error(\n `Invalid negation for field \"${name}\": expected string or boolean, received ${typeof rawNegation}.`,\n );\n }\n const candidate = rawNegation.trim().replace(/^-+/, \"\");\n if (candidate.length === 0 || !aliasPattern.test(candidate)) {\n throw new Error(\n `Invalid negation \"${rawNegation}\" for field \"${name}\": negation names must match ${aliasPattern}.`,\n );\n }\n if (RESERVED_NEGATION_NAMES.has(candidate)) {\n throw new Error(\n `Invalid negation \"${rawNegation}\" for field \"${name}\": negation cannot use reserved built-in flag names (${[\n ...RESERVED_NEGATION_NAMES,\n ]\n .map((n) => `--${n}`)\n .join(\", \")}).`,\n );\n }\n if (fieldType !== \"boolean\") {\n throw new Error(\n `Invalid negation for field \"${name}\": negation can only be used on boolean fields.`,\n );\n }\n negation = candidate;\n }\n }\n\n const rawNegationDescription = (argMeta as { negationDescription?: unknown } | undefined)\n ?.negationDescription;\n let negationDescription: string | undefined;\n if (rawNegationDescription !== undefined && rawNegationDescription !== null) {\n if (typeof rawNegationDescription !== \"string\") {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": expected string, received ${typeof rawNegationDescription}.`,\n );\n }\n if (negation === false) {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": negationDescription cannot be used when negation is false.`,\n );\n }\n if (negation === undefined) {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": negationDescription requires \\`negation\\` to be set (string or true).`,\n );\n }\n // Reject blank strings: downstream rendering treats falsy values as\n // \"no description provided\" and collapses to the inline `/` form, so\n // an empty/whitespace-only string would be silently ignored.\n const trimmed = rawNegationDescription.trim();\n if (trimmed.length === 0) {\n throw new Error(\n `Invalid negationDescription for field \"${name}\": negationDescription must be a non-empty string.`,\n );\n }\n negationDescription = trimmed;\n }\n\n // Compute the displayed negation name (without leading `--`) for help,\n // generated docs, and shell completions. `undefined` means hidden.\n const negationDisplay: string | undefined =\n typeof negation === \"string\" ? negation : negation === true ? `no-${cliName}` : undefined;\n\n const meta: ResolvedFieldMeta = {\n name,\n cliName,\n alias,\n hiddenAlias: hiddenAliasFinal,\n description,\n positional: argMeta?.positional ?? false,\n placeholder: argMeta?.placeholder,\n env: argMeta?.env,\n required: isRequired(schema),\n defaultValue: extractDefaultValue(schema),\n type: fieldType,\n schema,\n enumValues,\n completion: argMeta?.completion,\n prompt: argMeta?.prompt,\n negation,\n negationDisplay,\n negationDescription,\n effect: argMeta?.effect,\n };\n\n // Add overrideBuiltinAlias only if it's true\n if (argMeta && \"overrideBuiltinAlias\" in argMeta && argMeta.overrideBuiltinAlias === true) {\n meta.overrideBuiltinAlias = true;\n }\n\n return meta;\n}\n\n/**\n * Get the combined list of visible + hidden aliases for a field.\n * Used by the parser and validators which treat both equally,\n * while help/docs/completion rely on `field.alias` only.\n */\nexport function getAllAliases(field: ResolvedFieldMeta): string[] {\n if (!field.alias && !field.hiddenAlias) return [];\n return [...(field.alias ?? []), ...(field.hiddenAlias ?? [])];\n}\n\n/**\n * Get shape from a ZodObject\n */\nfunction getObjectShape(schema: z.ZodType): Record<string, z.ZodType> {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n return def?.shape ?? s.shape ?? {};\n}\n\n/**\n * Extract fields from a ZodObject\n */\nfunction extractFromObject(schema: z.ZodType): ResolvedFieldMeta[] {\n const shape = getObjectShape(schema);\n return Object.entries(shape).map(([name, fieldSchema]) => resolveFieldMeta(name, fieldSchema));\n}\n\n/**\n * Extract fields from a discriminated union\n */\nfunction extractFromDiscriminatedUnion(schema: z.ZodType): ExtractedFields {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const discriminator = def?.discriminator ?? \"\";\n const options = def?.options ?? [];\n\n // Collect all unique fields across all variants\n const allFieldsMap = new Map<string, ResolvedFieldMeta>();\n const variants: ExtractedFields[\"variants\"] = [];\n\n for (const option of options) {\n const shape = getObjectShape(option as z.ZodObject<z.ZodRawShape>);\n const variantFields: ResolvedFieldMeta[] = [];\n\n // Get discriminator value from the variant's discriminator schema.\n // Supports z.literal() and single-value z.enum() discriminators.\n let discriminatorValue = \"\";\n const discriminatorSchema = shape[discriminator];\n if (discriminatorSchema) {\n const typeName = getTypeName(discriminatorSchema);\n if (typeName === \"literal\") {\n const litDef =\n (discriminatorSchema as ZodSchemaWithDef).def ??\n (discriminatorSchema as ZodSchemaWithDef)._def;\n // In Zod v4, literal values are in _def.values array\n const value = (litDef as { value?: unknown; values?: unknown[] })?.value;\n const values = (litDef as { value?: unknown; values?: unknown[] })?.values;\n discriminatorValue = String(value ?? values?.[0] ?? \"\");\n } else if (typeName === \"enum\") {\n // Only single-value enums map to one variant. Multi-value enums\n // (z.enum(['a','b'])) on a single variant are not standard for\n // discriminatedUnion and are not extracted here.\n const enumValues = extractEnumValues(discriminatorSchema);\n if (enumValues && enumValues.length === 1) {\n discriminatorValue = enumValues[0]!;\n }\n }\n }\n\n for (const [name, fieldSchema] of Object.entries(shape)) {\n const fieldMeta = resolveFieldMeta(name, fieldSchema);\n variantFields.push(fieldMeta);\n\n // Add to all fields map (first occurrence wins for metadata)\n if (!allFieldsMap.has(name)) {\n allFieldsMap.set(name, fieldMeta);\n }\n }\n\n // Extract description from the variant option\n const variantDescription = extractDescription(option as z.ZodType);\n\n variants.push({\n discriminatorValue,\n fields: variantFields,\n ...(variantDescription ? { description: variantDescription } : {}),\n });\n }\n\n const description = extractDescription(schema);\n return {\n fields: Array.from(allFieldsMap.values()),\n schema: schema as ArgsSchema,\n schemaType: \"discriminatedUnion\",\n unknownKeysMode: getUnknownKeysMode(schema),\n discriminator,\n variants,\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Extract fields from a union-like schema (union or xor)\n */\nfunction extractFromUnionLike(schema: z.ZodType, schemaType: \"union\" | \"xor\"): ExtractedFields {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const options = def?.options ?? [];\n\n // Collect all unique fields across all options\n const allFieldsMap = new Map<string, ResolvedFieldMeta>();\n const unionOptions: ExtractedFields[] = [];\n\n for (const option of options) {\n // Extract fields for this option recursively\n // We cast to ArgsSchema because we expect options to be objects or other supported types\n const extracted = extractFields(option as ArgsSchema);\n unionOptions.push(extracted);\n\n // Add to combined fields map\n for (const field of extracted.fields) {\n if (!allFieldsMap.has(field.name)) {\n allFieldsMap.set(field.name, field);\n }\n }\n }\n\n const description = extractDescription(schema);\n return {\n fields: Array.from(allFieldsMap.values()),\n schema: schema as ArgsSchema,\n schemaType,\n unknownKeysMode: getUnknownKeysMode(schema),\n unionOptions,\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Extract fields from an intersection\n */\nfunction extractFromIntersection(schema: z.ZodType): ExtractedFields {\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n const left = def?.left;\n const right = def?.right;\n\n const allFieldsMap = new Map<string, ResolvedFieldMeta>();\n\n // Helper to extract fields from a sub-schema\n const extractSubFields = (subSchema: z.ZodType | undefined) => {\n if (!subSchema) return;\n\n const extracted = extractFields(subSchema as ArgsSchema);\n for (const field of extracted.fields) {\n if (!allFieldsMap.has(field.name)) {\n allFieldsMap.set(field.name, field);\n }\n }\n };\n\n extractSubFields(left);\n extractSubFields(right);\n\n const description = extractDescription(schema);\n return {\n fields: Array.from(allFieldsMap.values()),\n schema: schema as ArgsSchema,\n schemaType: \"intersection\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(description ? { description } : {}),\n };\n}\n\n/**\n * Cache for extractFields results to avoid redundant schema extraction\n */\nconst extractFieldsCache = new WeakMap<ArgsSchema, ExtractedFields>();\n\n/**\n * Extract all fields from a schema\n *\n * @param schema - The args schema (ZodObject, ZodDiscriminatedUnion, etc.)\n * @returns Extracted field information\n */\nexport function extractFields(schema: ArgsSchema): ExtractedFields {\n const cached = extractFieldsCache.get(schema);\n if (cached) return cached;\n\n let result: ExtractedFields;\n const typeName = getTypeName(schema);\n const s = schema as ZodSchemaWithDef;\n const def = s.def ?? s._def;\n\n switch (typeName) {\n case \"object\": {\n const description = extractDescription(schema);\n result = {\n fields: extractFromObject(schema),\n schema,\n schemaType: \"object\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(description ? { description } : {}),\n };\n break;\n }\n\n case \"union\":\n // In Zod v4, discriminatedUnion has type \"union\" with a discriminator property\n if (def?.discriminator) {\n result = extractFromDiscriminatedUnion(schema);\n } else {\n result = extractFromUnionLike(schema, \"union\");\n }\n break;\n\n case \"xor\":\n result = extractFromUnionLike(schema, \"xor\");\n break;\n\n case \"intersection\":\n result = extractFromIntersection(schema);\n break;\n\n case \"pipe\": {\n // Handle transform/refine on top-level schema (e.g., z.object({...}).transform(...))\n const pipeInner = def?.in ?? def?.schema;\n if (pipeInner) {\n const innerResult = extractFields(pipeInner as ArgsSchema);\n const pipeDescription = extractDescription(schema);\n result = {\n ...innerResult,\n schema,\n ...(pipeDescription ? { description: pipeDescription } : {}),\n };\n break;\n }\n const pipeDescription = extractDescription(schema);\n result = {\n fields: [],\n schema,\n schemaType: \"object\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(pipeDescription ? { description: pipeDescription } : {}),\n };\n break;\n }\n\n default: {\n const description = extractDescription(schema);\n // Fallback: try to treat as object\n result = {\n fields: [],\n schema,\n schemaType: \"object\",\n unknownKeysMode: getUnknownKeysMode(schema),\n ...(description ? { description } : {}),\n };\n break;\n }\n }\n\n extractFieldsCache.set(schema, result);\n return result;\n}\n\n/**\n * Get extracted fields from a command\n *\n * @param command - The command to extract fields from\n * @returns Extracted field information, or null if command has no args schema\n */\nexport function getExtractedFields(command: AnyCommand): ExtractedFields | null {\n if (!command.args) {\n return null;\n }\n return extractFields(command.args);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "politty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "A lightweight CLI framework inspired by citty with zod v4 registry integration for type-safe metadata management",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"argument-parser",
|
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
"type": "git",
|
|
17
17
|
"url": "https://github.com/toiroakr/politty.git"
|
|
18
18
|
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"politty": "./dist/cli.js"
|
|
21
|
+
},
|
|
19
22
|
"files": [
|
|
20
23
|
"dist"
|
|
21
24
|
],
|
|
@@ -101,21 +104,21 @@
|
|
|
101
104
|
"devDependencies": {
|
|
102
105
|
"@changesets/cli": "2.31.0",
|
|
103
106
|
"@clack/prompts": "1.2.0",
|
|
104
|
-
"@inquirer/prompts": "8.5.
|
|
107
|
+
"@inquirer/prompts": "8.5.2",
|
|
105
108
|
"@quansync/fs": "1.0.0",
|
|
106
109
|
"@types/node": "25.9.1",
|
|
107
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
108
|
-
"@vitest/coverage-v8": "4.1.
|
|
109
|
-
"knip": "6.
|
|
110
|
-
"lefthook": "2.1.
|
|
110
|
+
"@typescript/native-preview": "7.0.0-dev.20260604.1",
|
|
111
|
+
"@vitest/coverage-v8": "4.1.8",
|
|
112
|
+
"knip": "6.15.0",
|
|
113
|
+
"lefthook": "2.1.9",
|
|
111
114
|
"organize-imports-cli": "1.0.2",
|
|
112
|
-
"oxfmt": "0.
|
|
113
|
-
"oxlint": "1.
|
|
115
|
+
"oxfmt": "0.53.0",
|
|
116
|
+
"oxlint": "1.68.0",
|
|
114
117
|
"quansync": "1.0.0",
|
|
115
|
-
"tsdown": "0.22.
|
|
116
|
-
"tsx": "4.22.
|
|
118
|
+
"tsdown": "0.22.2",
|
|
119
|
+
"tsx": "4.22.4",
|
|
117
120
|
"typescript": "6.0.3",
|
|
118
|
-
"vitest": "4.1.
|
|
121
|
+
"vitest": "4.1.8",
|
|
119
122
|
"zod": "4.4.3"
|
|
120
123
|
},
|
|
121
124
|
"peerDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arg-registry--NRaNFJM.d.cts","names":[],"sources":["../src/core/schema-extractor.ts","../src/lazy.ts","../src/types.ts","../src/core/dynamic-completion-types.ts","../src/core/expand-completion-types.ts","../src/core/arg-registry.ts"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"arg-registry-6E0WHOh_.d.ts","names":[],"sources":["../src/core/schema-extractor.ts","../src/lazy.ts","../src/types.ts","../src/core/dynamic-completion-types.ts","../src/core/expand-completion-types.ts","../src/core/arg-registry.ts"],"mappings":";;;AA8CA;;;AAAA,UAAiB,iBAAA;EAwCF;EAtCb,IAAA;EAkEoC;EAhEpC,OAAA;EAgEwE;;;;;EA1DxE,KAAA;EAOA;;;;EAFA,WAAA;EAeA;EAbA,WAAA;EAiBA;EAfA,UAAA;EAeU;EAbV,WAAA;EAiBA;;;;EAZA,GAAA;EAgCA;EA9BA,QAAA;EAsCA;EApCA,YAAA;EAsCW;EApCX,IAAA;EAoC2B;EAlC3B,MAAA,EAAQ,CAAA,CAAE,OAAA;EAkC8D;EAhCxE,oBAAA;EAsCe;EApCf,UAAA;;EAEA,UAAA,GAAa,cAAA;EAsCL;EApCR,MAAA,GAAS,UAAA;EA0CE;;;;;;;;;;;;;;;EA1BX,QAAA;EA6BE;;;;;EAvBF,eAAA;EAmCgC;EAjChC,mBAAA;EA0CU;EAxCV,MAAA,KAAW,KAAA,WAAgB,OAAA,EAAS,aAAA,YAAyB,WAAA;AAAA;;AAwCpC;AA6C3B;UA/EiB,eAAA;;EAEf,MAAA,EAAQ,iBAAA;EA6EiC;EA3EzC,MAAA,EAAQ,UAAA;EA2EyB;EAzEjC,UAAA;EAyEoE;EAvEpE,aAAA;EA2Nc;EAzNd,QAAA,GAAW,KAAA;IACT,kBAAA;IACA,MAAA,EAAQ,iBAAA;IACR,WAAA;EAAA;EAwOuB;EArOzB,YAAA,GAAe,eAAA;EAqOsB;EAnOrC,WAAA;EAsoBc;;;;;;EA/nBd,eAAA,EAAiB,eAAA;AAAA;AA+nB+C;;;;AChwBlE;;ADgwBkE,KAtnBtD,eAAA;;;;;;;;;iBA6CI,kBAAA,CAAmB,MAAA,EAAQ,CAAA,CAAE,OAAA,GAAU,eAAe;;ACpL7B;AAMzC;;;;iBDkUgB,WAAA,CAAY,GAAW;;;;AClU4B;AAkCnE;;;;;;;iBDkTgB,WAAA,CAAY,GAAW;;;;;;;iBAmavB,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,eAAe;;;;;;;;UChwBjD,WAAA,WAAsB,UAAA,GAAa,UAAA;EAAA,SACzC,gBAAA;EAAA,SACA,IAAA,EAAM,CAAA;EAAA,SACN,IAAA,QAAY,OAAA,CAAQ,UAAA;AAAA;;;;iBAMf,aAAA,CAAc,KAAA,YAAiB,KAAA,IAAS,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;ADyFO;AAM1E;;;iBC7DgB,IAAA,WAAe,UAAA,CAAA,CAC7B,IAAA,EAAM,CAAA,EACN,IAAA,QAAY,OAAA,CAAQ,UAAA,IACnB,WAAA,CAAY,CAAA;;;ADhBf;;;;;;;;;;AAAA,UE9BiB,UAAA;;;;KAKL,OAAA,YAAmB,CAAC;;;;UAKf,OAAA;EFoDf;EElDA,GAAA;EFoDQ;EElDR,IAAA;EFoDA;EElDA,MAAA;AAAA;;;;;UAOe,MAAA;EFyEf;EEvEA,GAAA,CAAI,OAAA;EFyEO;EEvEX,KAAA,CAAM,OAAA;AAAA;;;AFuEkE;KEhE9D,UAAA,GAAa,CAAA,CAAE,OAAO,CAAC,MAAA;;;;UAKlB,YAAA;EF6EL;EE3EV,IAAA,EAAM,KAAK;AAAA;;;;UAMI,cAAA;EF2DP;EEzDR,IAAA,EAAM,KAAA;EF2DE;EEzDR,KAAA,GAAQ,KAAK;AAAA;;;;UAOE,kBAAA;;;;UAKA,oBAAA;EFkEf;EEhEA,KAAA,GAAQ,KAAK;AAAA;AFgEmB;AASlC;;;;AATkC,UExDjB,WAAA,qBACK,UAAA;EF6GN;EEzGd,IAAA;;EAEA,WAAA;EFuGyC;EErGzC,OAAA;EFqGiC;EEnGjC,IAAA,EAAM,WAAA;EFmG8D;EEjGpE,WAAA,GAAc,iBAAA;EFqPA;EEnPd,KAAA,KAAU,OAAA,EAAS,YAAA,CAAa,KAAA,aAAkB,OAAA;;EAElD,OAAA,KAAY,OAAA,EAAS,cAAA,CAAe,KAAA,aAAkB,OAAA;EFiPjB;EE/OrC,KAAA;EFiQyB;EE/PzB,QAAA,GAAW,OAAA;EF+P0B;AAAA;AAmavC;;;;EE3pBE,WAAA,KAAgB,IAAA;AAAA;;;AF2pBgD;;;;UElpBjD,eAAA,qBACK,UAAA,sEAGZ,WAAA,CAAY,WAAA,EAAa,KAAA;EDlHP;ECoH1B,GAAA,GAAM,IAAA,EAAM,KAAA,KAAU,OAAA;AAAA;;;;;;UAQP,kBAAA,qBACK,UAAA,mDAEZ,WAAA,CAAY,WAAA,EAAa,KAAA;ED/HN;ECiI3B,GAAA;AAAA;;;;KAMU,OAAA,qBACU,UAAA,gEAGlB,eAAA,CAAgB,WAAA,EAAa,KAAA,EAAO,OAAA,IAAW,kBAAA,CAAmB,WAAA,EAAa,KAAA;;;;ADxI1C;AAMzC;;KC2IK,OAAA;;;;;KAOA,SAAA;ADlJ8D;AAkCnE;;;AAlCmE,KCwJvD,UAAA,GAAa,OAAA,CAAQ,UAAA,cAAwB,OAAA,EAAS,SAAA;;;;KAKtD,eAAA,GAAkB,UAAA,UAAoB,OAAA,CAAQ,UAAA,KAAe,WAAA;;;;KAK7D,iBAAA,GAAoB,MAAM,SAAS,eAAA;;;;;;KAOnC,cAAA,IACV,OAAA,EAAS,MAAA,mBACT,SAAA,EAAW,eAAA,KACR,OAAA,CAAQ,MAAA;;;;UAKI,WAAA;;EAEf,OAAA;;EAEA,KAAA;EA9LyB;EAgMzB,WAAA;EAhMyB;EAkMzB,cAAA;EA7LU;EA+LV,MAAA,GAAS,MAAA;EA/LQ;EAiMjB,UAAA,GAAa,UAAA;EAjMiB;EAmM9B,KAAA,KAAU,OAAA,EAAS,kBAAA,YAA8B,OAAA;EA9L3B;EAgMtB,OAAA,KAAY,OAAA,EAAS,oBAAA,YAAgC,OAAA;EAhM/B;EAkMtB,aAAA;EA9LA;EAgMA,MAAA,GAAS,cAAA;AAAA;AA9LH;AAOR;;AAPQ,UAoMS,iBAAA;EA7LM;EA+LrB,KAAA;EA7LI;EA+LJ,WAAA;EA7LM;EA+LN,cAAA;EA/LqB;EAiMrB,MAAA,GAAS,MAAA;EA1LW;EA4LpB,UAAA,GAAa,UAAA;EA5LmB;EA8LhC,KAAA,KAAU,OAAA,EAAS,kBAAA,YAA8B,OAAA;EA9LxB;EAgMzB,OAAA,KAAY,OAAA,EAAS,oBAAA,YAAgC,OAAA;EAhMd;EAkMvC,MAAA,GAAS,cAAA;AAAA;;;AAnKI;KAoMH,QAAA;;;;KAKA,SAAA;;;;UAKK,QAAA;EArLqB;EAuLpC,OAAA;EAvLsD;EAyLtD,SAAA,EAAW,IAAA;EArLO;EAuLlB,KAAA,EAAO,QAAA;EA3MP;EA6MA,MAAA,EAAQ,SAAA;AAAA;;;;UAMO,aAAA;EAzMT;EA2MN,OAAA,EAAS,QAAQ;AAAA;;;;UAMF,gBAAA;EA7MmC;EA+MlD,OAAA;EA7MqB;EA+MrB,MAAA,EAAQ,CAAA;EA/MI;EAiNZ,KAAA;EA/MA;EAiNA,QAAA;EA/MW;EAiNX,IAAA,EAAM,aAAa;AAAA;;AA1MoB;AASzC;UAuMiB,gBAAA;EAvMe;EAyM9B,OAAA;EArMoB;EAuMpB,MAAA;EArMY;EAuMZ,KAAA,EAAO,KAAA;EAzMC;EA2MR,QAAA;EA3MmB;EA6MnB,IAAA,EAAM,aAAa;AAAA;;;;KAMT,SAAA,gBAAyB,gBAAA,CAAiB,CAAA,IAAK,gBAAA;;;;;;AFvS3D;;;;;;;;;;;;KG9BY,uBAAA;AAAA,UAEK,wBAAA;EH6Cf;EG3CA,WAAA;EH+CA;EG7CA,KAAA;EHoDA;;;;;;EG7CA,UAAA,EAAY,QAAQ,CAAC,MAAA;EHuDrB;;;;EGlDA,cAAA;EHsEA;;;;;;EG/DA,cAAA;AAAA;AAAA,UAGe,0BAAA;EACf,KAAA;EACA,WAAW;AAAA;AAAA,UAGI,uBAAA;EHyEP;EGvER,UAAA,EAAY,KAAA,UAAe,0BAAA;EHiFjB;;;;EG5EV,SAAA,GAAY,uBAAA;AAAA;AAAA,KAGF,yBAAA,IACV,GAAA,EAAK,wBAAA,KACF,uBAAA,GAA0B,OAAA,CAAQ,uBAAA;;;;;;AHfvC;;;;;;;;;;;;UI9BiB,eAAA;EACf,KAAA;EACA,WAAW;AAAA;;UAII,uBAAA;EACf,KAAA;EACA,WAAW;AAAA;;;;;;;;;;;;;;;UAiBI,gBAAA;EACf,SAAA;EACA,SAAA,GAAY,IAAA,EAAM,QAAA,CAAS,MAAA,sBAA4B,aAAA,UAAuB,eAAA;AAAA;;;;;;KClCpE,cAAA;;;;;;;UAQK,gBAAA;ELuCf;EKrCA,OAAA;EL4CA;EK1CA,YAAA;EL8CA;;;;;;EKvCA,OAAA,GAAU,yBAAA;ELoDA;;;;;;;;EK3CV,MAAA,GAAS,gBAAgB;AAAA;;;;;;;AL6E+C;AAM1E;;;;;;;;;;;;;;;;;;;;;;;;KKjDY,cAAA;ELmEV,+BKjEA,IAAA,GAAO,cAAA,ELwEU;EKtEjB,MAAA,GAAS,gBAAgB;AAAA;EL+Ef,+DK5E0D,UAAA;EAChE,OAAA;AAAA;EL2EqB,yEKxEqD,OAAA;EAC1E,UAAA;AAAA;;;;;;;;;ALoHgE;AAoJtE;KK1PY,UAAA;;;AL0P2B;AAkBvC;;;;AAAuC;AAmavC;;;;;;;;AAAkE;;;;AChwBlE;;UIyGiB,UAAA;EJzGsB;EI2GrC,OAAA;EJzGe;EI2Gf,IAAA,GAAO,UAAA;EJ1Gc;EI4GrB,OAAA,GAAU,KAAK;IAAY,KAAA;IAAe,KAAA;EAAA;EJ/GQ;EIiHlD,OAAA;AAAA;;;;;KAOU,aAAA;EJrH6B,6BIuHvC,IAAA,UJjH2B;EImH3B,IAAA,EAAM,QAAA,CAAS,MAAA;AAAA,KACZ,OAAA,CAAQ,UAAA;EACP,UAAA,GAAa,QAAA,CAAS,MAAA;AAAA;EACtB,UAAA,GAAa,QAAA,CAAS,UAAA;AAAA;AJtHuC;AAkCnE;;AAlCmE,UI2HlD,WAAA;EJzFc;EI2F7B,WAAA;EJzFoB;EI2FpB,UAAA;EJ1Fa;EI4Fb,WAAA;EJ5FY;;;;;;;;;;;;AAAE;;EI2Gd,GAAA;;EAEA,UAAA,GAAa,cAAA;EH3JY;;;AAAA;AAK3B;;;;AAAgC;AAKhC;;;;EG+JE,MAAA,GAAS,UAAA;EH3JT;;;AAEM;AAOR;;;;;;;;;AAIuB;AAOvB;;;;;;;;AAAyC;AAKzC;;;;;;;;AAEa;AAMb;;;;;;;;;;AAIe;AAOf;;EG6JE,QAAA;EH7JiC;AAAA;AAKnC;;;EG8JE,mBAAA;EH5Ja;AAQf;;;;;;;;;;;;;;EGoKE,MAAA,IAAU,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,aAAA,YAAyB,WAAA;AAAA;;;;;;;;UAU5C,cAAA,2BAAyC,WAAW,CAAC,MAAA;EHjKtD;;;;;;EGwKd,KAAA;EHpKqB;;;;;EG0KrB,WAAA;AAAA;;;;UAMe,sBAAA,2BAAiD,WAAA,CAAY,MAAA;EH5J7D;EG8Jf,KAAA,cAAmB,KAAA,uBAA4B,aAAA;EH9JjB;EGgK9B,WAAA;EH5JoB;EG8JpB,oBAAA;AAAA;;;;KAMU,OAAA,qBAA4B,cAAA,CAAe,MAAA,IAAU,sBAAA,CAAuB,MAAA;;;;;;;;AHlKzD;AAQ/B;;;;;;;;;;;;;;;;;AAKK;AAML;;KGmLK,qBAAA,OAA4B,CAAA,4BAE7B,CAAA,4BAEE,CAAA,iCACG,OAAA,CAAQ,CAAA;AAAA,KAKZ,sBAAA,oBACS,CAAA,GAAI,CAAA,CAAE,CAAA;EAElB,WAAA;AAAA;AAAA,KAGG,iBAAA,oBACS,CAAA,GAAI,CAAA,CAAE,CAAA;EAElB,WAAA;AAAA;AAAA,KAGG,YAAA,MAAkB,CAAC;EAAW,KAAA;AAAA,IAAmB,CAAA;AAAA,KACjD,kBAAA,MAAwB,CAAC;EAAW,WAAA;AAAA,IAAyB,CAAA;;;;;;;AHtMsB;AAAE;KGgNrF,cAAA,sBACa,WAAA,CAAY,CAAA,MAAO,WAAA,CAAY,CAAA;;;AHxMrC;AAAA;;;;AAOE;AAMd;KGsMK,WAAA,wBAAmC,CAAA,eAAgB,CAAA,qBAClC,CAAA,CAAE,CAAA;;;;;;KAUnB,gBAAA,cACH,WAAA,CAAY,CAAA,6BACR,cAAA,CAAe,MAAA,iBACb,CAAA,GACA,iBAAA,CAAkB,CAAA,IACpB,WAAA,CAAY,CAAA,wCACV,cAAA,CAAe,MAAA,iBACb,CAAA,GACA,iBAAA,CAAkB,CAAA,IACpB,CAAA;;;;;;;AH1NmE;KGmOtE,eAAA,wBAAuC,CAAA;EAAY,oBAAA;AAAA,IACpD,gBAAA,CAAiB,CAAA,EAAG,MAAA,IACpB,qBAAA,CAAsB,YAAA,CAAa,CAAA,kBACjC,sBAAA,CAAuB,CAAA,IACvB,qBAAA,CAAsB,kBAAA,CAAmB,CAAA,kBACvC,sBAAA,CAAuB,CAAA,IACvB,gBAAA,CAAiB,CAAA,EAAG,MAAA;AAAA,iBAEZ,GAAA,WAAc,CAAA,CAAE,OAAA,CAAA,CAAS,MAAA,EAAQ,CAAA,GAAI,CAAA;AAAA,iBACrC,GAAA,WAAc,CAAA,CAAE,OAAA,YAAmB,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,GAAA,CAClE,MAAA,EAAQ,CAAA,EACR,IAAA,EAAM,eAAA,CAAgB,CAAA,EAAG,CAAA,CAAE,MAAA,CAAO,CAAA,KACjC,CAAA"}
|