politty 0.4.7 → 0.4.8

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.
Files changed (61) hide show
  1. package/dist/{schema-extractor-DoDO4M_i.d.ts → arg-registry-BDybpyo5.d.cts} +151 -90
  2. package/dist/arg-registry-BDybpyo5.d.cts.map +1 -0
  3. package/dist/{schema-extractor-BoWkcP9a.d.cts → arg-registry-CHmAzJOM.d.ts} +151 -90
  4. package/dist/arg-registry-CHmAzJOM.d.ts.map +1 -0
  5. package/dist/augment.d.cts +1 -1
  6. package/dist/augment.d.ts +1 -1
  7. package/dist/completion/index.cjs +2 -2
  8. package/dist/completion/index.d.cts +1 -1
  9. package/dist/completion/index.d.ts +1 -1
  10. package/dist/completion/index.js +2 -2
  11. package/dist/{completion-Df0eZ70u.cjs → completion-BADAzqT9.cjs} +3 -3
  12. package/dist/completion-BADAzqT9.cjs.map +1 -0
  13. package/dist/{completion-_AnQsWh9.js → completion-Dj7ytbLu.js} +2 -2
  14. package/dist/completion-Dj7ytbLu.js.map +1 -0
  15. package/dist/docs/index.cjs +3 -3
  16. package/dist/docs/index.d.cts +2 -1
  17. package/dist/docs/index.d.cts.map +1 -1
  18. package/dist/docs/index.d.ts +2 -1
  19. package/dist/docs/index.d.ts.map +1 -1
  20. package/dist/docs/index.js +3 -3
  21. package/dist/{index-BA0GkZQx.d.cts → index-DcwMaTvt.d.ts} +3 -2
  22. package/dist/index-DcwMaTvt.d.ts.map +1 -0
  23. package/dist/{index-rMDe9hp1.d.ts → index-DjU9BErU.d.cts} +3 -2
  24. package/dist/index-DjU9BErU.d.cts.map +1 -0
  25. package/dist/index.cjs +3 -3
  26. package/dist/index.d.cts +4 -8
  27. package/dist/index.d.cts.map +1 -1
  28. package/dist/index.d.ts +4 -8
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +3 -3
  31. package/dist/{lazy-DHlvJiQQ.cjs → lazy-B_E2X0KR.cjs} +27 -4
  32. package/dist/lazy-B_E2X0KR.cjs.map +1 -0
  33. package/dist/{lazy-DSyfzR-F.js → lazy-D6nL_iKJ.js} +26 -3
  34. package/dist/lazy-D6nL_iKJ.js.map +1 -0
  35. package/dist/{runner-D4ByDT5I.js → runner-BQcd2UEj.js} +29 -3
  36. package/dist/runner-BQcd2UEj.js.map +1 -0
  37. package/dist/{runner-Cn6Oq4ZZ.cjs → runner-nKNXknDl.cjs} +29 -3
  38. package/dist/runner-nKNXknDl.cjs.map +1 -0
  39. package/dist/schema-extractor-D1sJW-sc.d.ts +117 -0
  40. package/dist/schema-extractor-D1sJW-sc.d.ts.map +1 -0
  41. package/dist/schema-extractor-RainqdRn.d.cts +117 -0
  42. package/dist/schema-extractor-RainqdRn.d.cts.map +1 -0
  43. package/dist/{subcommand-router-sZHhUP7b.cjs → subcommand-router-BTOzDQnY.cjs} +2 -2
  44. package/dist/{subcommand-router-sZHhUP7b.cjs.map → subcommand-router-BTOzDQnY.cjs.map} +1 -1
  45. package/dist/{subcommand-router-CKuy6D2b.js → subcommand-router-Bu3YTw_f.js} +2 -2
  46. package/dist/{subcommand-router-CKuy6D2b.js.map → subcommand-router-Bu3YTw_f.js.map} +1 -1
  47. package/package.json +1 -1
  48. package/dist/arg-registry-2m40k1Et.d.ts +0 -144
  49. package/dist/arg-registry-2m40k1Et.d.ts.map +0 -1
  50. package/dist/arg-registry-BNoIwnNr.d.cts +0 -144
  51. package/dist/arg-registry-BNoIwnNr.d.cts.map +0 -1
  52. package/dist/completion-Df0eZ70u.cjs.map +0 -1
  53. package/dist/completion-_AnQsWh9.js.map +0 -1
  54. package/dist/index-BA0GkZQx.d.cts.map +0 -1
  55. package/dist/index-rMDe9hp1.d.ts.map +0 -1
  56. package/dist/lazy-DHlvJiQQ.cjs.map +0 -1
  57. package/dist/lazy-DSyfzR-F.js.map +0 -1
  58. package/dist/runner-Cn6Oq4ZZ.cjs.map +0 -1
  59. package/dist/runner-D4ByDT5I.js.map +0 -1
  60. package/dist/schema-extractor-BoWkcP9a.d.cts.map +0 -1
  61. package/dist/schema-extractor-DoDO4M_i.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-extractor-RainqdRn.d.cts","names":[],"sources":["../src/core/schema-extractor.ts"],"mappings":";;;;;AAuCA;;UAAiB,iBAAA;EAyBL;EAvBV,IAAA;EA+BoC;EA7BpC,OAAA;EA6BwE;EA3BxE,KAAA;EAJA;EAMA,WAAA;EAFA;EAIA,UAAA;EAAA;EAEA,WAAA;EAKA;;;;EAAA,GAAA;EAQQ;EANR,QAAA;EAQA;EANA,YAAA;EAUA;EARA,IAAA;EAUA;EARA,MAAA,EAAQ,CAAA,CAAE,OAAA;EAQ0B;EANpC,oBAAA;EAM6D;EAJ7D,UAAA;EAIwE;EAFxE,UAAA,GAAa,cAAA;EAQiB;EAN9B,MAAA,KAAW,KAAA,WAAgB,OAAA,EAAS,aAAA,YAAyB,WAAA;AAAA;;;;UAM9C,eAAA;EAyBE;EAvBjB,MAAA,EAAQ,iBAAA;EAuBwB;EArBhC,MAAA,EAAQ,UAAA;EAFA;EAIR,UAAA;EAFQ;EAIR,aAAA;EAAA;EAEA,QAAA,GAAW,KAAA;IACT,kBAAA;IACA,MAAA,EAAQ,iBAAA;IACR,WAAA;EAAA;EAAA;EAGF,YAAA,GAAe,eAAA;EAAA;EAEf,WAAA;EAOA;;;;AASF;;EATE,eAAA,EAAiB,eAAA;AAAA;;AAsDnB;;;;;KA7CY,eAAA;;;;;AAiMZ;;;;iBApJgB,kBAAA,CAAmB,MAAA,EAAQ,CAAA,CAAE,OAAA,GAAU,eAAA;;;;;;;iBAoJvC,WAAA,CAAY,GAAA;;;;;;;;;;;;iBAkBZ,WAAA,CAAY,GAAA;;;;;;;iBAkRZ,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,eAAA"}
@@ -38,7 +38,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
38
38
  }) : target, mod));
39
39
 
40
40
  //#endregion
41
- const require_lazy = require('./lazy-DHlvJiQQ.cjs');
41
+ const require_lazy = require('./lazy-B_E2X0KR.cjs');
42
42
 
43
43
  //#region src/executor/log-collector.ts
44
44
  /**
@@ -240,4 +240,4 @@ Object.defineProperty(exports, 'resolveSubcommand', {
240
240
  return resolveSubcommand;
241
241
  }
242
242
  });
243
- //# sourceMappingURL=subcommand-router-sZHhUP7b.cjs.map
243
+ //# sourceMappingURL=subcommand-router-BTOzDQnY.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"subcommand-router-sZHhUP7b.cjs","names":["isLazyCommand"],"sources":["../src/executor/log-collector.ts","../src/executor/subcommand-router.ts"],"sourcesContent":["import type { CollectedLogs, LogEntry, LogLevel, LogStream } from \"../types.js\";\n\n/**\n * Mapping from log level to output stream\n */\nconst LOG_STREAM_MAP: Record<LogLevel, LogStream> = {\n log: \"stdout\",\n info: \"stdout\",\n debug: \"stdout\",\n warn: \"stderr\",\n error: \"stderr\",\n};\n\n/**\n * All log levels\n */\nconst ALL_LOG_LEVELS: LogLevel[] = [\"log\", \"info\", \"debug\", \"warn\", \"error\"];\n\n/**\n * Options for log collector\n */\nexport interface LogCollectorOptions {\n /** Log levels to capture (default: all) */\n levels?: LogLevel[];\n /** Whether to call original console methods (default: true) */\n passthrough?: boolean;\n}\n\n/**\n * Log collector that intercepts console methods\n */\nexport interface LogCollector {\n /** Get collected logs */\n getLogs: () => CollectedLogs;\n /** Start collecting logs */\n start: () => void;\n /** Stop collecting and restore original console methods */\n stop: () => void;\n}\n\n/**\n * Format console arguments to string\n */\nexport function formatArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n return arg.message;\n }\n if (typeof arg === \"object\" && arg !== null) {\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n })\n .join(\" \");\n}\n\n/**\n * Create a log collector that intercepts console methods\n *\n * @param options - Options for the log collector\n * @returns A log collector instance\n *\n * @example\n * ```ts\n * const collector = createLogCollector();\n * collector.start();\n *\n * console.log(\"Info message\");\n * console.error(\"Something went wrong\");\n * console.warn(\"This is a warning\");\n *\n * collector.stop();\n * const logs = collector.getLogs();\n * // {\n * // entries: [\n * // { message: \"Info message\", level: \"log\", stream: \"stdout\", timestamp: ... },\n * // { message: \"Something went wrong\", level: \"error\", stream: \"stderr\", timestamp: ... },\n * // { message: \"This is a warning\", level: \"warn\", stream: \"stderr\", timestamp: ... }\n * // ]\n * // }\n * ```\n */\nexport function createLogCollector(options: LogCollectorOptions = {}): LogCollector {\n const entries: LogEntry[] = [];\n const levels = options.levels ?? ALL_LOG_LEVELS;\n const passthrough = options.passthrough ?? true;\n\n let originals: Record<LogLevel, typeof console.log> | null = null;\n\n const createInterceptor = (level: LogLevel, original: typeof console.log) => {\n return (...args: unknown[]) => {\n entries.push({\n message: formatArgs(args),\n timestamp: new Date(),\n level,\n stream: LOG_STREAM_MAP[level],\n });\n if (passthrough) {\n original.apply(console, args);\n }\n };\n };\n\n return {\n getLogs() {\n return { entries: [...entries] };\n },\n start() {\n if (originals !== null) {\n // Already started\n return;\n }\n originals = {\n log: console.log,\n info: console.info,\n debug: console.debug,\n warn: console.warn,\n error: console.error,\n };\n for (const level of levels) {\n console[level] = createInterceptor(level, originals[level]);\n }\n },\n stop() {\n if (originals === null) {\n return;\n }\n for (const level of levels) {\n console[level] = originals[level];\n }\n originals = null;\n },\n };\n}\n\n/**\n * Merge multiple CollectedLogs into one (sorted by timestamp)\n */\nexport function mergeLogs(...logsArray: CollectedLogs[]): CollectedLogs {\n return {\n entries: logsArray\n .flatMap((l) => l.entries)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime()),\n };\n}\n\n/**\n * Create an empty CollectedLogs object\n */\nexport function emptyLogs(): CollectedLogs {\n return { entries: [] };\n}\n","import { isLazyCommand } 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\n *\n * Handles both sync and async (lazy-loaded) subcommands.\n *\n * @param command - The parent command\n * @param name - The subcommand name 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 const subCmd = command.subCommands[name];\n\n if (!subCmd) {\n return undefined;\n }\n\n return resolveLazyCommand(subCmd);\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAM,iBAA8C;CAClD,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACR;;;;AAKD,MAAM,iBAA6B;CAAC;CAAO;CAAQ;CAAS;CAAQ;CAAQ;;;;AA2B5E,SAAgB,WAAW,MAAyB;AAClD,QAAO,KACJ,KAAK,QAAQ;AACZ,MAAI,eAAe,MACjB,QAAO,IAAI;AAEb,MAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,KAAI;AACF,UAAO,KAAK,UAAU,IAAI;UACpB;AACN,UAAO,OAAO,IAAI;;AAGtB,SAAO,OAAO,IAAI;GAClB,CACD,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6Bd,SAAgB,mBAAmB,UAA+B,EAAE,EAAgB;CAClF,MAAM,UAAsB,EAAE;CAC9B,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,cAAc,QAAQ,eAAe;CAE3C,IAAI,YAAyD;CAE7D,MAAM,qBAAqB,OAAiB,aAAiC;AAC3E,UAAQ,GAAG,SAAoB;AAC7B,WAAQ,KAAK;IACX,SAAS,WAAW,KAAK;IACzB,2BAAW,IAAI,MAAM;IACrB;IACA,QAAQ,eAAe;IACxB,CAAC;AACF,OAAI,YACF,UAAS,MAAM,SAAS,KAAK;;;AAKnC,QAAO;EACL,UAAU;AACR,UAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAE;;EAElC,QAAQ;AACN,OAAI,cAAc,KAEhB;AAEF,eAAY;IACV,KAAK,QAAQ;IACb,MAAM,QAAQ;IACd,OAAO,QAAQ;IACf,MAAM,QAAQ;IACd,OAAO,QAAQ;IAChB;AACD,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,kBAAkB,OAAO,UAAU,OAAO;;EAG/D,OAAO;AACL,OAAI,cAAc,KAChB;AAEF,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,UAAU;AAE7B,eAAY;;EAEf;;;;;AAMH,SAAgB,UAAU,GAAG,WAA2C;AACtE,QAAO,EACL,SAAS,UACN,SAAS,MAAM,EAAE,QAAQ,CACzB,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC,EACjE;;;;;AAMH,SAAgB,YAA2B;AACzC,QAAO,EAAE,SAAS,EAAE,EAAE;;;;;;;;;;;AClJxB,eAAsB,mBAAmB,KAA2C;AAClF,KAAIA,2BAAc,IAAI,CACpB,QAAO,MAAM,IAAI,MAAM;AAEzB,KAAI,OAAO,QAAQ,WACjB,QAAO,MAAM,KAAK;AAEpB,QAAO;;;;;;;;;;;AAYT,eAAsB,kBACpB,SACA,MACiC;AACjC,KAAI,CAAC,QAAQ,YACX;CAGF,MAAM,SAAS,QAAQ,YAAY;AAEnC,KAAI,CAAC,OACH;AAGF,QAAO,mBAAmB,OAAO;;;;;;;;AASnC,SAAgB,gBAAgB,SAA+B;AAC7D,KAAI,CAAC,QAAQ,YACX,QAAO,EAAE;AAGX,QAAO,OAAO,KAAK,QAAQ,YAAY"}
1
+ {"version":3,"file":"subcommand-router-BTOzDQnY.cjs","names":["isLazyCommand"],"sources":["../src/executor/log-collector.ts","../src/executor/subcommand-router.ts"],"sourcesContent":["import type { CollectedLogs, LogEntry, LogLevel, LogStream } from \"../types.js\";\n\n/**\n * Mapping from log level to output stream\n */\nconst LOG_STREAM_MAP: Record<LogLevel, LogStream> = {\n log: \"stdout\",\n info: \"stdout\",\n debug: \"stdout\",\n warn: \"stderr\",\n error: \"stderr\",\n};\n\n/**\n * All log levels\n */\nconst ALL_LOG_LEVELS: LogLevel[] = [\"log\", \"info\", \"debug\", \"warn\", \"error\"];\n\n/**\n * Options for log collector\n */\nexport interface LogCollectorOptions {\n /** Log levels to capture (default: all) */\n levels?: LogLevel[];\n /** Whether to call original console methods (default: true) */\n passthrough?: boolean;\n}\n\n/**\n * Log collector that intercepts console methods\n */\nexport interface LogCollector {\n /** Get collected logs */\n getLogs: () => CollectedLogs;\n /** Start collecting logs */\n start: () => void;\n /** Stop collecting and restore original console methods */\n stop: () => void;\n}\n\n/**\n * Format console arguments to string\n */\nexport function formatArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n return arg.message;\n }\n if (typeof arg === \"object\" && arg !== null) {\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n })\n .join(\" \");\n}\n\n/**\n * Create a log collector that intercepts console methods\n *\n * @param options - Options for the log collector\n * @returns A log collector instance\n *\n * @example\n * ```ts\n * const collector = createLogCollector();\n * collector.start();\n *\n * console.log(\"Info message\");\n * console.error(\"Something went wrong\");\n * console.warn(\"This is a warning\");\n *\n * collector.stop();\n * const logs = collector.getLogs();\n * // {\n * // entries: [\n * // { message: \"Info message\", level: \"log\", stream: \"stdout\", timestamp: ... },\n * // { message: \"Something went wrong\", level: \"error\", stream: \"stderr\", timestamp: ... },\n * // { message: \"This is a warning\", level: \"warn\", stream: \"stderr\", timestamp: ... }\n * // ]\n * // }\n * ```\n */\nexport function createLogCollector(options: LogCollectorOptions = {}): LogCollector {\n const entries: LogEntry[] = [];\n const levels = options.levels ?? ALL_LOG_LEVELS;\n const passthrough = options.passthrough ?? true;\n\n let originals: Record<LogLevel, typeof console.log> | null = null;\n\n const createInterceptor = (level: LogLevel, original: typeof console.log) => {\n return (...args: unknown[]) => {\n entries.push({\n message: formatArgs(args),\n timestamp: new Date(),\n level,\n stream: LOG_STREAM_MAP[level],\n });\n if (passthrough) {\n original.apply(console, args);\n }\n };\n };\n\n return {\n getLogs() {\n return { entries: [...entries] };\n },\n start() {\n if (originals !== null) {\n // Already started\n return;\n }\n originals = {\n log: console.log,\n info: console.info,\n debug: console.debug,\n warn: console.warn,\n error: console.error,\n };\n for (const level of levels) {\n console[level] = createInterceptor(level, originals[level]);\n }\n },\n stop() {\n if (originals === null) {\n return;\n }\n for (const level of levels) {\n console[level] = originals[level];\n }\n originals = null;\n },\n };\n}\n\n/**\n * Merge multiple CollectedLogs into one (sorted by timestamp)\n */\nexport function mergeLogs(...logsArray: CollectedLogs[]): CollectedLogs {\n return {\n entries: logsArray\n .flatMap((l) => l.entries)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime()),\n };\n}\n\n/**\n * Create an empty CollectedLogs object\n */\nexport function emptyLogs(): CollectedLogs {\n return { entries: [] };\n}\n","import { isLazyCommand } 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\n *\n * Handles both sync and async (lazy-loaded) subcommands.\n *\n * @param command - The parent command\n * @param name - The subcommand name 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 const subCmd = command.subCommands[name];\n\n if (!subCmd) {\n return undefined;\n }\n\n return resolveLazyCommand(subCmd);\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAM,iBAA8C;CAClD,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACR;;;;AAKD,MAAM,iBAA6B;CAAC;CAAO;CAAQ;CAAS;CAAQ;CAAQ;;;;AA2B5E,SAAgB,WAAW,MAAyB;AAClD,QAAO,KACJ,KAAK,QAAQ;AACZ,MAAI,eAAe,MACjB,QAAO,IAAI;AAEb,MAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,KAAI;AACF,UAAO,KAAK,UAAU,IAAI;UACpB;AACN,UAAO,OAAO,IAAI;;AAGtB,SAAO,OAAO,IAAI;GAClB,CACD,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6Bd,SAAgB,mBAAmB,UAA+B,EAAE,EAAgB;CAClF,MAAM,UAAsB,EAAE;CAC9B,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,cAAc,QAAQ,eAAe;CAE3C,IAAI,YAAyD;CAE7D,MAAM,qBAAqB,OAAiB,aAAiC;AAC3E,UAAQ,GAAG,SAAoB;AAC7B,WAAQ,KAAK;IACX,SAAS,WAAW,KAAK;IACzB,2BAAW,IAAI,MAAM;IACrB;IACA,QAAQ,eAAe;IACxB,CAAC;AACF,OAAI,YACF,UAAS,MAAM,SAAS,KAAK;;;AAKnC,QAAO;EACL,UAAU;AACR,UAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAE;;EAElC,QAAQ;AACN,OAAI,cAAc,KAEhB;AAEF,eAAY;IACV,KAAK,QAAQ;IACb,MAAM,QAAQ;IACd,OAAO,QAAQ;IACf,MAAM,QAAQ;IACd,OAAO,QAAQ;IAChB;AACD,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,kBAAkB,OAAO,UAAU,OAAO;;EAG/D,OAAO;AACL,OAAI,cAAc,KAChB;AAEF,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,UAAU;AAE7B,eAAY;;EAEf;;;;;AAMH,SAAgB,UAAU,GAAG,WAA2C;AACtE,QAAO,EACL,SAAS,UACN,SAAS,MAAM,EAAE,QAAQ,CACzB,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC,EACjE;;;;;AAMH,SAAgB,YAA2B;AACzC,QAAO,EAAE,SAAS,EAAE,EAAE;;;;;;;;;;;AClJxB,eAAsB,mBAAmB,KAA2C;AAClF,KAAIA,2BAAc,IAAI,CACpB,QAAO,MAAM,IAAI,MAAM;AAEzB,KAAI,OAAO,QAAQ,WACjB,QAAO,MAAM,KAAK;AAEpB,QAAO;;;;;;;;;;;AAYT,eAAsB,kBACpB,SACA,MACiC;AACjC,KAAI,CAAC,QAAQ,YACX;CAGF,MAAM,SAAS,QAAQ,YAAY;AAEnC,KAAI,CAAC,OACH;AAGF,QAAO,mBAAmB,OAAO;;;;;;;;AASnC,SAAgB,gBAAgB,SAA+B;AAC7D,KAAI,CAAC,QAAQ,YACX,QAAO,EAAE;AAGX,QAAO,OAAO,KAAK,QAAQ,YAAY"}
@@ -1,4 +1,4 @@
1
- import { t as isLazyCommand } from "./lazy-DSyfzR-F.js";
1
+ import { t as isLazyCommand } from "./lazy-D6nL_iKJ.js";
2
2
 
3
3
  //#region src/executor/log-collector.ts
4
4
  /**
@@ -153,4 +153,4 @@ function listSubCommands(command) {
153
153
 
154
154
  //#endregion
155
155
  export { emptyLogs as a, createLogCollector as i, resolveLazyCommand as n, mergeLogs as o, resolveSubcommand as r, listSubCommands as t };
156
- //# sourceMappingURL=subcommand-router-CKuy6D2b.js.map
156
+ //# sourceMappingURL=subcommand-router-Bu3YTw_f.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subcommand-router-CKuy6D2b.js","names":[],"sources":["../src/executor/log-collector.ts","../src/executor/subcommand-router.ts"],"sourcesContent":["import type { CollectedLogs, LogEntry, LogLevel, LogStream } from \"../types.js\";\n\n/**\n * Mapping from log level to output stream\n */\nconst LOG_STREAM_MAP: Record<LogLevel, LogStream> = {\n log: \"stdout\",\n info: \"stdout\",\n debug: \"stdout\",\n warn: \"stderr\",\n error: \"stderr\",\n};\n\n/**\n * All log levels\n */\nconst ALL_LOG_LEVELS: LogLevel[] = [\"log\", \"info\", \"debug\", \"warn\", \"error\"];\n\n/**\n * Options for log collector\n */\nexport interface LogCollectorOptions {\n /** Log levels to capture (default: all) */\n levels?: LogLevel[];\n /** Whether to call original console methods (default: true) */\n passthrough?: boolean;\n}\n\n/**\n * Log collector that intercepts console methods\n */\nexport interface LogCollector {\n /** Get collected logs */\n getLogs: () => CollectedLogs;\n /** Start collecting logs */\n start: () => void;\n /** Stop collecting and restore original console methods */\n stop: () => void;\n}\n\n/**\n * Format console arguments to string\n */\nexport function formatArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n return arg.message;\n }\n if (typeof arg === \"object\" && arg !== null) {\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n })\n .join(\" \");\n}\n\n/**\n * Create a log collector that intercepts console methods\n *\n * @param options - Options for the log collector\n * @returns A log collector instance\n *\n * @example\n * ```ts\n * const collector = createLogCollector();\n * collector.start();\n *\n * console.log(\"Info message\");\n * console.error(\"Something went wrong\");\n * console.warn(\"This is a warning\");\n *\n * collector.stop();\n * const logs = collector.getLogs();\n * // {\n * // entries: [\n * // { message: \"Info message\", level: \"log\", stream: \"stdout\", timestamp: ... },\n * // { message: \"Something went wrong\", level: \"error\", stream: \"stderr\", timestamp: ... },\n * // { message: \"This is a warning\", level: \"warn\", stream: \"stderr\", timestamp: ... }\n * // ]\n * // }\n * ```\n */\nexport function createLogCollector(options: LogCollectorOptions = {}): LogCollector {\n const entries: LogEntry[] = [];\n const levels = options.levels ?? ALL_LOG_LEVELS;\n const passthrough = options.passthrough ?? true;\n\n let originals: Record<LogLevel, typeof console.log> | null = null;\n\n const createInterceptor = (level: LogLevel, original: typeof console.log) => {\n return (...args: unknown[]) => {\n entries.push({\n message: formatArgs(args),\n timestamp: new Date(),\n level,\n stream: LOG_STREAM_MAP[level],\n });\n if (passthrough) {\n original.apply(console, args);\n }\n };\n };\n\n return {\n getLogs() {\n return { entries: [...entries] };\n },\n start() {\n if (originals !== null) {\n // Already started\n return;\n }\n originals = {\n log: console.log,\n info: console.info,\n debug: console.debug,\n warn: console.warn,\n error: console.error,\n };\n for (const level of levels) {\n console[level] = createInterceptor(level, originals[level]);\n }\n },\n stop() {\n if (originals === null) {\n return;\n }\n for (const level of levels) {\n console[level] = originals[level];\n }\n originals = null;\n },\n };\n}\n\n/**\n * Merge multiple CollectedLogs into one (sorted by timestamp)\n */\nexport function mergeLogs(...logsArray: CollectedLogs[]): CollectedLogs {\n return {\n entries: logsArray\n .flatMap((l) => l.entries)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime()),\n };\n}\n\n/**\n * Create an empty CollectedLogs object\n */\nexport function emptyLogs(): CollectedLogs {\n return { entries: [] };\n}\n","import { isLazyCommand } 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\n *\n * Handles both sync and async (lazy-loaded) subcommands.\n *\n * @param command - The parent command\n * @param name - The subcommand name 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 const subCmd = command.subCommands[name];\n\n if (!subCmd) {\n return undefined;\n }\n\n return resolveLazyCommand(subCmd);\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"],"mappings":";;;;;;AAKA,MAAM,iBAA8C;CAClD,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACR;;;;AAKD,MAAM,iBAA6B;CAAC;CAAO;CAAQ;CAAS;CAAQ;CAAQ;;;;AA2B5E,SAAgB,WAAW,MAAyB;AAClD,QAAO,KACJ,KAAK,QAAQ;AACZ,MAAI,eAAe,MACjB,QAAO,IAAI;AAEb,MAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,KAAI;AACF,UAAO,KAAK,UAAU,IAAI;UACpB;AACN,UAAO,OAAO,IAAI;;AAGtB,SAAO,OAAO,IAAI;GAClB,CACD,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6Bd,SAAgB,mBAAmB,UAA+B,EAAE,EAAgB;CAClF,MAAM,UAAsB,EAAE;CAC9B,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,cAAc,QAAQ,eAAe;CAE3C,IAAI,YAAyD;CAE7D,MAAM,qBAAqB,OAAiB,aAAiC;AAC3E,UAAQ,GAAG,SAAoB;AAC7B,WAAQ,KAAK;IACX,SAAS,WAAW,KAAK;IACzB,2BAAW,IAAI,MAAM;IACrB;IACA,QAAQ,eAAe;IACxB,CAAC;AACF,OAAI,YACF,UAAS,MAAM,SAAS,KAAK;;;AAKnC,QAAO;EACL,UAAU;AACR,UAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAE;;EAElC,QAAQ;AACN,OAAI,cAAc,KAEhB;AAEF,eAAY;IACV,KAAK,QAAQ;IACb,MAAM,QAAQ;IACd,OAAO,QAAQ;IACf,MAAM,QAAQ;IACd,OAAO,QAAQ;IAChB;AACD,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,kBAAkB,OAAO,UAAU,OAAO;;EAG/D,OAAO;AACL,OAAI,cAAc,KAChB;AAEF,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,UAAU;AAE7B,eAAY;;EAEf;;;;;AAMH,SAAgB,UAAU,GAAG,WAA2C;AACtE,QAAO,EACL,SAAS,UACN,SAAS,MAAM,EAAE,QAAQ,CACzB,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC,EACjE;;;;;AAMH,SAAgB,YAA2B;AACzC,QAAO,EAAE,SAAS,EAAE,EAAE;;;;;;;;;;;AClJxB,eAAsB,mBAAmB,KAA2C;AAClF,KAAI,cAAc,IAAI,CACpB,QAAO,MAAM,IAAI,MAAM;AAEzB,KAAI,OAAO,QAAQ,WACjB,QAAO,MAAM,KAAK;AAEpB,QAAO;;;;;;;;;;;AAYT,eAAsB,kBACpB,SACA,MACiC;AACjC,KAAI,CAAC,QAAQ,YACX;CAGF,MAAM,SAAS,QAAQ,YAAY;AAEnC,KAAI,CAAC,OACH;AAGF,QAAO,mBAAmB,OAAO;;;;;;;;AASnC,SAAgB,gBAAgB,SAA+B;AAC7D,KAAI,CAAC,QAAQ,YACX,QAAO,EAAE;AAGX,QAAO,OAAO,KAAK,QAAQ,YAAY"}
1
+ {"version":3,"file":"subcommand-router-Bu3YTw_f.js","names":[],"sources":["../src/executor/log-collector.ts","../src/executor/subcommand-router.ts"],"sourcesContent":["import type { CollectedLogs, LogEntry, LogLevel, LogStream } from \"../types.js\";\n\n/**\n * Mapping from log level to output stream\n */\nconst LOG_STREAM_MAP: Record<LogLevel, LogStream> = {\n log: \"stdout\",\n info: \"stdout\",\n debug: \"stdout\",\n warn: \"stderr\",\n error: \"stderr\",\n};\n\n/**\n * All log levels\n */\nconst ALL_LOG_LEVELS: LogLevel[] = [\"log\", \"info\", \"debug\", \"warn\", \"error\"];\n\n/**\n * Options for log collector\n */\nexport interface LogCollectorOptions {\n /** Log levels to capture (default: all) */\n levels?: LogLevel[];\n /** Whether to call original console methods (default: true) */\n passthrough?: boolean;\n}\n\n/**\n * Log collector that intercepts console methods\n */\nexport interface LogCollector {\n /** Get collected logs */\n getLogs: () => CollectedLogs;\n /** Start collecting logs */\n start: () => void;\n /** Stop collecting and restore original console methods */\n stop: () => void;\n}\n\n/**\n * Format console arguments to string\n */\nexport function formatArgs(args: unknown[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n return arg.message;\n }\n if (typeof arg === \"object\" && arg !== null) {\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }\n return String(arg);\n })\n .join(\" \");\n}\n\n/**\n * Create a log collector that intercepts console methods\n *\n * @param options - Options for the log collector\n * @returns A log collector instance\n *\n * @example\n * ```ts\n * const collector = createLogCollector();\n * collector.start();\n *\n * console.log(\"Info message\");\n * console.error(\"Something went wrong\");\n * console.warn(\"This is a warning\");\n *\n * collector.stop();\n * const logs = collector.getLogs();\n * // {\n * // entries: [\n * // { message: \"Info message\", level: \"log\", stream: \"stdout\", timestamp: ... },\n * // { message: \"Something went wrong\", level: \"error\", stream: \"stderr\", timestamp: ... },\n * // { message: \"This is a warning\", level: \"warn\", stream: \"stderr\", timestamp: ... }\n * // ]\n * // }\n * ```\n */\nexport function createLogCollector(options: LogCollectorOptions = {}): LogCollector {\n const entries: LogEntry[] = [];\n const levels = options.levels ?? ALL_LOG_LEVELS;\n const passthrough = options.passthrough ?? true;\n\n let originals: Record<LogLevel, typeof console.log> | null = null;\n\n const createInterceptor = (level: LogLevel, original: typeof console.log) => {\n return (...args: unknown[]) => {\n entries.push({\n message: formatArgs(args),\n timestamp: new Date(),\n level,\n stream: LOG_STREAM_MAP[level],\n });\n if (passthrough) {\n original.apply(console, args);\n }\n };\n };\n\n return {\n getLogs() {\n return { entries: [...entries] };\n },\n start() {\n if (originals !== null) {\n // Already started\n return;\n }\n originals = {\n log: console.log,\n info: console.info,\n debug: console.debug,\n warn: console.warn,\n error: console.error,\n };\n for (const level of levels) {\n console[level] = createInterceptor(level, originals[level]);\n }\n },\n stop() {\n if (originals === null) {\n return;\n }\n for (const level of levels) {\n console[level] = originals[level];\n }\n originals = null;\n },\n };\n}\n\n/**\n * Merge multiple CollectedLogs into one (sorted by timestamp)\n */\nexport function mergeLogs(...logsArray: CollectedLogs[]): CollectedLogs {\n return {\n entries: logsArray\n .flatMap((l) => l.entries)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime()),\n };\n}\n\n/**\n * Create an empty CollectedLogs object\n */\nexport function emptyLogs(): CollectedLogs {\n return { entries: [] };\n}\n","import { isLazyCommand } 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\n *\n * Handles both sync and async (lazy-loaded) subcommands.\n *\n * @param command - The parent command\n * @param name - The subcommand name 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 const subCmd = command.subCommands[name];\n\n if (!subCmd) {\n return undefined;\n }\n\n return resolveLazyCommand(subCmd);\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"],"mappings":";;;;;;AAKA,MAAM,iBAA8C;CAClD,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACR;;;;AAKD,MAAM,iBAA6B;CAAC;CAAO;CAAQ;CAAS;CAAQ;CAAQ;;;;AA2B5E,SAAgB,WAAW,MAAyB;AAClD,QAAO,KACJ,KAAK,QAAQ;AACZ,MAAI,eAAe,MACjB,QAAO,IAAI;AAEb,MAAI,OAAO,QAAQ,YAAY,QAAQ,KACrC,KAAI;AACF,UAAO,KAAK,UAAU,IAAI;UACpB;AACN,UAAO,OAAO,IAAI;;AAGtB,SAAO,OAAO,IAAI;GAClB,CACD,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6Bd,SAAgB,mBAAmB,UAA+B,EAAE,EAAgB;CAClF,MAAM,UAAsB,EAAE;CAC9B,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,cAAc,QAAQ,eAAe;CAE3C,IAAI,YAAyD;CAE7D,MAAM,qBAAqB,OAAiB,aAAiC;AAC3E,UAAQ,GAAG,SAAoB;AAC7B,WAAQ,KAAK;IACX,SAAS,WAAW,KAAK;IACzB,2BAAW,IAAI,MAAM;IACrB;IACA,QAAQ,eAAe;IACxB,CAAC;AACF,OAAI,YACF,UAAS,MAAM,SAAS,KAAK;;;AAKnC,QAAO;EACL,UAAU;AACR,UAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAE;;EAElC,QAAQ;AACN,OAAI,cAAc,KAEhB;AAEF,eAAY;IACV,KAAK,QAAQ;IACb,MAAM,QAAQ;IACd,OAAO,QAAQ;IACf,MAAM,QAAQ;IACd,OAAO,QAAQ;IAChB;AACD,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,kBAAkB,OAAO,UAAU,OAAO;;EAG/D,OAAO;AACL,OAAI,cAAc,KAChB;AAEF,QAAK,MAAM,SAAS,OAClB,SAAQ,SAAS,UAAU;AAE7B,eAAY;;EAEf;;;;;AAMH,SAAgB,UAAU,GAAG,WAA2C;AACtE,QAAO,EACL,SAAS,UACN,SAAS,MAAM,EAAE,QAAQ,CACzB,MAAM,GAAG,MAAM,EAAE,UAAU,SAAS,GAAG,EAAE,UAAU,SAAS,CAAC,EACjE;;;;;AAMH,SAAgB,YAA2B;AACzC,QAAO,EAAE,SAAS,EAAE,EAAE;;;;;;;;;;;AClJxB,eAAsB,mBAAmB,KAA2C;AAClF,KAAI,cAAc,IAAI,CACpB,QAAO,MAAM,IAAI,MAAM;AAEzB,KAAI,OAAO,QAAQ,WACjB,QAAO,MAAM,KAAK;AAEpB,QAAO;;;;;;;;;;;AAYT,eAAsB,kBACpB,SACA,MACiC;AACjC,KAAI,CAAC,QAAQ,YACX;CAGF,MAAM,SAAS,QAAQ,YAAY;AAEnC,KAAI,CAAC,OACH;AAGF,QAAO,mBAAmB,OAAO;;;;;;;;AASnC,SAAgB,gBAAgB,SAA+B;AAC7D,KAAI,CAAC,QAAQ,YACX,QAAO,EAAE;AAGX,QAAO,OAAO,KAAK,QAAQ,YAAY"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "politty",
3
- "version": "0.4.7",
3
+ "version": "0.4.8",
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",
@@ -1,144 +0,0 @@
1
- import { z } from "zod";
2
-
3
- //#region src/core/arg-registry.d.ts
4
- /**
5
- * Built-in completion types
6
- */
7
- type CompletionType = "file" | "directory" | "none";
8
- /**
9
- * Custom completion specification
10
- */
11
- interface CustomCompletion {
12
- /** Static list of choices for completion */
13
- choices?: string[];
14
- /** Shell command to execute for dynamic completion */
15
- shellCommand?: string;
16
- }
17
- /**
18
- * Completion metadata for an argument
19
- *
20
- * @example
21
- * ```ts
22
- * // File completion with extension filter
23
- * input: arg(z.string(), {
24
- * completion: { type: "file", extensions: ["json", "yaml"] }
25
- * })
26
- *
27
- * // Directory completion
28
- * outputDir: arg(z.string(), {
29
- * completion: { type: "directory" }
30
- * })
31
- *
32
- * // Custom static choices
33
- * logLevel: arg(z.string(), {
34
- * completion: { custom: { choices: ["debug", "info", "warn", "error"] } }
35
- * })
36
- *
37
- * // Dynamic completion from shell command
38
- * branch: arg(z.string(), {
39
- * completion: { custom: { shellCommand: "git branch --format='%(refname:short)'" } }
40
- * })
41
- *
42
- * // File completion with glob pattern matcher
43
- * envFile: arg(z.string(), {
44
- * completion: { type: "file", matcher: [".env.*"] }
45
- * })
46
- * ```
47
- */
48
- type CompletionMeta = {
49
- /** Built-in completion type */type?: CompletionType; /** Custom completion (takes precedence over type if both specified) */
50
- custom?: CustomCompletion;
51
- } & ({
52
- /** File extension filter (only applies when type is "file") */extensions?: string[];
53
- matcher?: never;
54
- } | {
55
- /** Glob patterns for file matching (only applies when type is "file") */matcher?: string[];
56
- extensions?: never;
57
- });
58
- /**
59
- * Base metadata shared by all argument types
60
- */
61
- interface BaseArgMeta {
62
- /** Argument description */
63
- description?: string;
64
- /** Treat as positional argument */
65
- positional?: boolean;
66
- /** Placeholder for help display */
67
- placeholder?: string;
68
- /**
69
- * Environment variable name(s) to read value from.
70
- * If an array is provided, earlier entries take priority.
71
- * CLI arguments always take precedence over environment variables.
72
- *
73
- * @example
74
- * ```ts
75
- * // Single env var
76
- * port: arg(z.coerce.number(), { env: "PORT" })
77
- *
78
- * // Multiple env vars (PORT takes priority over SERVER_PORT)
79
- * port: arg(z.coerce.number(), { env: ["PORT", "SERVER_PORT"] })
80
- * ```
81
- */
82
- env?: string | string[];
83
- /** Completion configuration for shell tab-completion */
84
- completion?: CompletionMeta;
85
- }
86
- /**
87
- * Metadata for regular arguments (non-builtin aliases)
88
- */
89
- interface RegularArgMeta extends BaseArgMeta {
90
- /** Short alias (e.g., 'v' for --verbose) */
91
- alias?: string;
92
- }
93
- /**
94
- * Metadata for overriding built-in aliases (-h, -H)
95
- */
96
- interface BuiltinOverrideArgMeta extends BaseArgMeta {
97
- /** Built-in alias to override ('h' or 'H') */
98
- alias: "h" | "H";
99
- /** Must be true to override built-in aliases */
100
- overrideBuiltinAlias: true;
101
- }
102
- /**
103
- * Metadata options for argument definition
104
- */
105
- type ArgMeta = RegularArgMeta | BuiltinOverrideArgMeta;
106
- /**
107
- * Register metadata for a Zod schema
108
- *
109
- * @param schema - The Zod schema
110
- * @param meta - Argument metadata
111
- * @returns The same schema (for chaining)
112
- *
113
- * @example
114
- * ```ts
115
- * import { z } from "zod";
116
- * import { arg, defineCommand } from "politty";
117
- *
118
- * const cmd = defineCommand({
119
- * args: z.object({
120
- * name: arg(z.string(), { description: "User name", positional: true }),
121
- * verbose: arg(z.boolean().default(false), { alias: "v" }),
122
- * }),
123
- * run: (args) => {
124
- * console.log(args.name, args.verbose);
125
- * },
126
- * });
127
- * ```
128
- */
129
- /**
130
- * Type helper to validate ArgMeta
131
- * Forces a type error if alias is "h" or "H" without overrideBuiltinAlias: true
132
- */
133
- type ValidateArgMeta<M> = M extends {
134
- alias: "h" | "H";
135
- } ? M extends {
136
- overrideBuiltinAlias: true;
137
- } ? M : { [K in keyof M]: M[K] } & {
138
- __typeError: "Alias 'h' or 'H' requires overrideBuiltinAlias: true";
139
- } : M;
140
- declare function arg<T extends z.ZodType>(schema: T): T;
141
- declare function arg<T extends z.ZodType, M extends ArgMeta>(schema: T, meta: ValidateArgMeta<M>): T;
142
- //#endregion
143
- export { arg as a, CustomCompletion as i, CompletionMeta as n, CompletionType as r, ArgMeta as t };
144
- //# sourceMappingURL=arg-registry-2m40k1Et.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arg-registry-2m40k1Et.d.ts","names":[],"sources":["../src/core/arg-registry.ts"],"mappings":";;;;;AAKA;KAAY,cAAA;;;;UAKK,gBAAA;EAAgB;EAE/B,OAAA;EAAA;EAEA,YAAA;AAAA;;;;;;;;;;;;;;AAqDF;;;;;;;;;;;;AA6BA;;;;;AAQA;KAxDY,cAAA;iCAEV,IAAA,GAAO,cAAA,EAsDuC;EApD9C,MAAA,GAAS,gBAAA;AAAA;EAwDW,+DArDgD,UAAA;EAChE,OAAA;AAAA;EA0Da,yEAvD6D,OAAA;EAC1E,UAAA;AAAA;;AA4D2C;;UArDhC,WAAA;EAkFS;EAhFxB,WAAA;EAkFI;EAhFJ,UAAA;EAkFsB;EAhFtB,WAAA;EAoFE;;;;;;;;;;;;;;EArEF,GAAA;EAqEG;EAnEH,UAAA,GAAa,cAAA;AAAA;;;;UAME,cAAA,SAAuB,WAAA;EA+Da;EA7DnD,KAAA;AAAA;;;;UAMe,sBAAA,SAA+B,WAAA;EAuDP;EArDvC,KAAA;EAqDoD;EAnDpD,oBAAA;AAAA;;;;KAMU,OAAA,GAAU,cAAA,GAAiB,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmClC,eAAA,MAAqB,CAAA;EAAY,KAAA;AAAA,IAClC,CAAA;EAAY,oBAAA;AAAA,IACV,CAAA,iBAEc,CAAA,GAAI,CAAA,CAAE,CAAA;EAElB,WAAA;AAAA,IAEJ,CAAA;AAAA,iBAEY,GAAA,WAAc,CAAA,CAAE,OAAA,CAAA,CAAS,MAAA,EAAQ,CAAA,GAAI,CAAA;AAAA,iBACrC,GAAA,WAAc,CAAA,CAAE,OAAA,YAAmB,OAAA,CAAA,CAAS,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,eAAA,CAAgB,CAAA,IAAK,CAAA"}
@@ -1,144 +0,0 @@
1
- import { z } from "zod";
2
-
3
- //#region src/core/arg-registry.d.ts
4
- /**
5
- * Built-in completion types
6
- */
7
- type CompletionType = "file" | "directory" | "none";
8
- /**
9
- * Custom completion specification
10
- */
11
- interface CustomCompletion {
12
- /** Static list of choices for completion */
13
- choices?: string[];
14
- /** Shell command to execute for dynamic completion */
15
- shellCommand?: string;
16
- }
17
- /**
18
- * Completion metadata for an argument
19
- *
20
- * @example
21
- * ```ts
22
- * // File completion with extension filter
23
- * input: arg(z.string(), {
24
- * completion: { type: "file", extensions: ["json", "yaml"] }
25
- * })
26
- *
27
- * // Directory completion
28
- * outputDir: arg(z.string(), {
29
- * completion: { type: "directory" }
30
- * })
31
- *
32
- * // Custom static choices
33
- * logLevel: arg(z.string(), {
34
- * completion: { custom: { choices: ["debug", "info", "warn", "error"] } }
35
- * })
36
- *
37
- * // Dynamic completion from shell command
38
- * branch: arg(z.string(), {
39
- * completion: { custom: { shellCommand: "git branch --format='%(refname:short)'" } }
40
- * })
41
- *
42
- * // File completion with glob pattern matcher
43
- * envFile: arg(z.string(), {
44
- * completion: { type: "file", matcher: [".env.*"] }
45
- * })
46
- * ```
47
- */
48
- type CompletionMeta = {
49
- /** Built-in completion type */type?: CompletionType; /** Custom completion (takes precedence over type if both specified) */
50
- custom?: CustomCompletion;
51
- } & ({
52
- /** File extension filter (only applies when type is "file") */extensions?: string[];
53
- matcher?: never;
54
- } | {
55
- /** Glob patterns for file matching (only applies when type is "file") */matcher?: string[];
56
- extensions?: never;
57
- });
58
- /**
59
- * Base metadata shared by all argument types
60
- */
61
- interface BaseArgMeta {
62
- /** Argument description */
63
- description?: string;
64
- /** Treat as positional argument */
65
- positional?: boolean;
66
- /** Placeholder for help display */
67
- placeholder?: string;
68
- /**
69
- * Environment variable name(s) to read value from.
70
- * If an array is provided, earlier entries take priority.
71
- * CLI arguments always take precedence over environment variables.
72
- *
73
- * @example
74
- * ```ts
75
- * // Single env var
76
- * port: arg(z.coerce.number(), { env: "PORT" })
77
- *
78
- * // Multiple env vars (PORT takes priority over SERVER_PORT)
79
- * port: arg(z.coerce.number(), { env: ["PORT", "SERVER_PORT"] })
80
- * ```
81
- */
82
- env?: string | string[];
83
- /** Completion configuration for shell tab-completion */
84
- completion?: CompletionMeta;
85
- }
86
- /**
87
- * Metadata for regular arguments (non-builtin aliases)
88
- */
89
- interface RegularArgMeta extends BaseArgMeta {
90
- /** Short alias (e.g., 'v' for --verbose) */
91
- alias?: string;
92
- }
93
- /**
94
- * Metadata for overriding built-in aliases (-h, -H)
95
- */
96
- interface BuiltinOverrideArgMeta extends BaseArgMeta {
97
- /** Built-in alias to override ('h' or 'H') */
98
- alias: "h" | "H";
99
- /** Must be true to override built-in aliases */
100
- overrideBuiltinAlias: true;
101
- }
102
- /**
103
- * Metadata options for argument definition
104
- */
105
- type ArgMeta = RegularArgMeta | BuiltinOverrideArgMeta;
106
- /**
107
- * Register metadata for a Zod schema
108
- *
109
- * @param schema - The Zod schema
110
- * @param meta - Argument metadata
111
- * @returns The same schema (for chaining)
112
- *
113
- * @example
114
- * ```ts
115
- * import { z } from "zod";
116
- * import { arg, defineCommand } from "politty";
117
- *
118
- * const cmd = defineCommand({
119
- * args: z.object({
120
- * name: arg(z.string(), { description: "User name", positional: true }),
121
- * verbose: arg(z.boolean().default(false), { alias: "v" }),
122
- * }),
123
- * run: (args) => {
124
- * console.log(args.name, args.verbose);
125
- * },
126
- * });
127
- * ```
128
- */
129
- /**
130
- * Type helper to validate ArgMeta
131
- * Forces a type error if alias is "h" or "H" without overrideBuiltinAlias: true
132
- */
133
- type ValidateArgMeta<M> = M extends {
134
- alias: "h" | "H";
135
- } ? M extends {
136
- overrideBuiltinAlias: true;
137
- } ? M : { [K in keyof M]: M[K] } & {
138
- __typeError: "Alias 'h' or 'H' requires overrideBuiltinAlias: true";
139
- } : M;
140
- declare function arg<T extends z.ZodType>(schema: T): T;
141
- declare function arg<T extends z.ZodType, M extends ArgMeta>(schema: T, meta: ValidateArgMeta<M>): T;
142
- //#endregion
143
- export { arg as a, CustomCompletion as i, CompletionMeta as n, CompletionType as r, ArgMeta as t };
144
- //# sourceMappingURL=arg-registry-BNoIwnNr.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arg-registry-BNoIwnNr.d.cts","names":[],"sources":["../src/core/arg-registry.ts"],"mappings":";;;;;AAKA;KAAY,cAAA;;;;UAKK,gBAAA;EAAgB;EAE/B,OAAA;EAAA;EAEA,YAAA;AAAA;;;;;;;;;;;;;;AAqDF;;;;;;;;;;;;AA6BA;;;;;AAQA;KAxDY,cAAA;iCAEV,IAAA,GAAO,cAAA,EAsDuC;EApD9C,MAAA,GAAS,gBAAA;AAAA;EAwDW,+DArDgD,UAAA;EAChE,OAAA;AAAA;EA0Da,yEAvD6D,OAAA;EAC1E,UAAA;AAAA;;AA4D2C;;UArDhC,WAAA;EAkFS;EAhFxB,WAAA;EAkFI;EAhFJ,UAAA;EAkFsB;EAhFtB,WAAA;EAoFE;;;;;;;;;;;;;;EArEF,GAAA;EAqEG;EAnEH,UAAA,GAAa,cAAA;AAAA;;;;UAME,cAAA,SAAuB,WAAA;EA+Da;EA7DnD,KAAA;AAAA;;;;UAMe,sBAAA,SAA+B,WAAA;EAuDP;EArDvC,KAAA;EAqDoD;EAnDpD,oBAAA;AAAA;;;;KAMU,OAAA,GAAU,cAAA,GAAiB,sBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmClC,eAAA,MAAqB,CAAA;EAAY,KAAA;AAAA,IAClC,CAAA;EAAY,oBAAA;AAAA,IACV,CAAA,iBAEc,CAAA,GAAI,CAAA,CAAE,CAAA;EAElB,WAAA;AAAA,IAEJ,CAAA;AAAA,iBAEY,GAAA,WAAc,CAAA,CAAE,OAAA,CAAA,CAAS,MAAA,EAAQ,CAAA,GAAI,CAAA;AAAA,iBACrC,GAAA,WAAc,CAAA,CAAE,OAAA,YAAmB,OAAA,CAAA,CAAS,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,eAAA,CAAgB,CAAA,IAAK,CAAA"}