@wentools/zli 0.2.0-beta.2dc33a43

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 (167) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/esm/_dnt.shims.d.ts +6 -0
  4. package/esm/_dnt.shims.d.ts.map +1 -0
  5. package/esm/_dnt.shims.js +61 -0
  6. package/esm/arg.d.ts +9 -0
  7. package/esm/arg.d.ts.map +1 -0
  8. package/esm/arg.js +4 -0
  9. package/esm/create_command.d.ts +28 -0
  10. package/esm/create_command.d.ts.map +1 -0
  11. package/esm/create_command.js +17 -0
  12. package/esm/create_command_directory.d.ts +35 -0
  13. package/esm/create_command_directory.d.ts.map +1 -0
  14. package/esm/create_command_directory.js +31 -0
  15. package/esm/create_flag_arg.d.ts +23 -0
  16. package/esm/create_flag_arg.d.ts.map +1 -0
  17. package/esm/create_flag_arg.js +14 -0
  18. package/esm/create_positional_arg.d.ts +24 -0
  19. package/esm/create_positional_arg.d.ts.map +1 -0
  20. package/esm/create_positional_arg.js +15 -0
  21. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts +38 -0
  22. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts.map +1 -0
  23. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/err.js +38 -0
  24. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts +2 -0
  25. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts.map +1 -0
  26. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/index.js +1 -0
  27. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts +156 -0
  28. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts.map +1 -0
  29. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/index.js +65 -0
  30. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts +2 -0
  31. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts.map +1 -0
  32. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.js +1 -0
  33. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts +11 -0
  34. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts.map +1 -0
  35. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.js +14 -0
  36. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts +2 -0
  37. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts.map +1 -0
  38. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.js +1 -0
  39. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts +28 -0
  40. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts.map +1 -0
  41. package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.js +30 -0
  42. package/esm/detect_arg_conflicts/detect_arg_conflicts.d.ts +19 -0
  43. package/esm/detect_arg_conflicts/detect_arg_conflicts.d.ts.map +1 -0
  44. package/esm/detect_arg_conflicts/detect_arg_conflicts.js +54 -0
  45. package/esm/detect_arg_conflicts/mod.d.ts +3 -0
  46. package/esm/detect_arg_conflicts/mod.d.ts.map +1 -0
  47. package/esm/detect_arg_conflicts/mod.js +1 -0
  48. package/esm/generate_help_text/generate_help_text.d.ts +13 -0
  49. package/esm/generate_help_text/generate_help_text.d.ts.map +1 -0
  50. package/esm/generate_help_text/generate_help_text.js +54 -0
  51. package/esm/generate_help_text/mod.d.ts +2 -0
  52. package/esm/generate_help_text/mod.d.ts.map +1 -0
  53. package/esm/generate_help_text/mod.js +1 -0
  54. package/esm/infer_args_type.d.ts +29 -0
  55. package/esm/infer_args_type.d.ts.map +1 -0
  56. package/esm/infer_args_type.js +6 -0
  57. package/esm/is_boolean_schema/is_boolean_schema.d.ts +12 -0
  58. package/esm/is_boolean_schema/is_boolean_schema.d.ts.map +1 -0
  59. package/esm/is_boolean_schema/is_boolean_schema.js +21 -0
  60. package/esm/is_boolean_schema/mod.d.ts +2 -0
  61. package/esm/is_boolean_schema/mod.d.ts.map +1 -0
  62. package/esm/is_boolean_schema/mod.js +1 -0
  63. package/esm/mod.d.ts +8 -0
  64. package/esm/mod.d.ts.map +1 -0
  65. package/esm/mod.js +1 -0
  66. package/esm/package.json +3 -0
  67. package/esm/parse_args/mod.d.ts +3 -0
  68. package/esm/parse_args/mod.d.ts.map +1 -0
  69. package/esm/parse_args/mod.js +1 -0
  70. package/esm/parse_args/parse_args.d.ts +24 -0
  71. package/esm/parse_args/parse_args.d.ts.map +1 -0
  72. package/esm/parse_args/parse_args.js +89 -0
  73. package/esm/run.d.ts +19 -0
  74. package/esm/run.d.ts.map +1 -0
  75. package/esm/run.js +152 -0
  76. package/esm/validate_args/mod.d.ts +3 -0
  77. package/esm/validate_args/mod.d.ts.map +1 -0
  78. package/esm/validate_args/mod.js +1 -0
  79. package/esm/validate_args/validate_args.d.ts +20 -0
  80. package/esm/validate_args/validate_args.d.ts.map +1 -0
  81. package/esm/validate_args/validate_args.js +23 -0
  82. package/esm/zli.d.ts +118 -0
  83. package/esm/zli.d.ts.map +1 -0
  84. package/esm/zli.js +124 -0
  85. package/package.json +39 -0
  86. package/script/_dnt.shims.d.ts +6 -0
  87. package/script/_dnt.shims.d.ts.map +1 -0
  88. package/script/_dnt.shims.js +65 -0
  89. package/script/arg.d.ts +9 -0
  90. package/script/arg.d.ts.map +1 -0
  91. package/script/arg.js +5 -0
  92. package/script/create_command.d.ts +28 -0
  93. package/script/create_command.d.ts.map +1 -0
  94. package/script/create_command.js +20 -0
  95. package/script/create_command_directory.d.ts +35 -0
  96. package/script/create_command_directory.d.ts.map +1 -0
  97. package/script/create_command_directory.js +34 -0
  98. package/script/create_flag_arg.d.ts +23 -0
  99. package/script/create_flag_arg.d.ts.map +1 -0
  100. package/script/create_flag_arg.js +17 -0
  101. package/script/create_positional_arg.d.ts +24 -0
  102. package/script/create_positional_arg.d.ts.map +1 -0
  103. package/script/create_positional_arg.js +18 -0
  104. package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts +38 -0
  105. package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts.map +1 -0
  106. package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/err.js +41 -0
  107. package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts +2 -0
  108. package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts.map +1 -0
  109. package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/index.js +5 -0
  110. package/script/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts +156 -0
  111. package/script/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts.map +1 -0
  112. package/script/deps/jsr.io/@wentools/result/0.1.0/src/index.js +77 -0
  113. package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts +2 -0
  114. package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts.map +1 -0
  115. package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.js +5 -0
  116. package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts +11 -0
  117. package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts.map +1 -0
  118. package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.js +17 -0
  119. package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts +2 -0
  120. package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts.map +1 -0
  121. package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.js +5 -0
  122. package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts +28 -0
  123. package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts.map +1 -0
  124. package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.js +33 -0
  125. package/script/detect_arg_conflicts/detect_arg_conflicts.d.ts +19 -0
  126. package/script/detect_arg_conflicts/detect_arg_conflicts.d.ts.map +1 -0
  127. package/script/detect_arg_conflicts/detect_arg_conflicts.js +57 -0
  128. package/script/detect_arg_conflicts/mod.d.ts +3 -0
  129. package/script/detect_arg_conflicts/mod.d.ts.map +1 -0
  130. package/script/detect_arg_conflicts/mod.js +5 -0
  131. package/script/generate_help_text/generate_help_text.d.ts +13 -0
  132. package/script/generate_help_text/generate_help_text.d.ts.map +1 -0
  133. package/script/generate_help_text/generate_help_text.js +57 -0
  134. package/script/generate_help_text/mod.d.ts +2 -0
  135. package/script/generate_help_text/mod.d.ts.map +1 -0
  136. package/script/generate_help_text/mod.js +5 -0
  137. package/script/infer_args_type.d.ts +29 -0
  138. package/script/infer_args_type.d.ts.map +1 -0
  139. package/script/infer_args_type.js +7 -0
  140. package/script/is_boolean_schema/is_boolean_schema.d.ts +12 -0
  141. package/script/is_boolean_schema/is_boolean_schema.d.ts.map +1 -0
  142. package/script/is_boolean_schema/is_boolean_schema.js +24 -0
  143. package/script/is_boolean_schema/mod.d.ts +2 -0
  144. package/script/is_boolean_schema/mod.d.ts.map +1 -0
  145. package/script/is_boolean_schema/mod.js +5 -0
  146. package/script/mod.d.ts +8 -0
  147. package/script/mod.d.ts.map +1 -0
  148. package/script/mod.js +5 -0
  149. package/script/package.json +3 -0
  150. package/script/parse_args/mod.d.ts +3 -0
  151. package/script/parse_args/mod.d.ts.map +1 -0
  152. package/script/parse_args/mod.js +5 -0
  153. package/script/parse_args/parse_args.d.ts +24 -0
  154. package/script/parse_args/parse_args.d.ts.map +1 -0
  155. package/script/parse_args/parse_args.js +92 -0
  156. package/script/run.d.ts +19 -0
  157. package/script/run.d.ts.map +1 -0
  158. package/script/run.js +189 -0
  159. package/script/validate_args/mod.d.ts +3 -0
  160. package/script/validate_args/mod.d.ts.map +1 -0
  161. package/script/validate_args/mod.js +5 -0
  162. package/script/validate_args/validate_args.d.ts +20 -0
  163. package/script/validate_args/validate_args.d.ts.map +1 -0
  164. package/script/validate_args/validate_args.js +26 -0
  165. package/script/zli.d.ts +118 -0
  166. package/script/zli.d.ts.map +1 -0
  167. package/script/zli.js +127 -0
package/script/run.js ADDED
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createRun = exports.run = void 0;
37
+ /**
38
+ * Run a command or multi-command CLI
39
+ *
40
+ * This is the main entry point that:
41
+ * 1. Detects if help is requested
42
+ * 2. Parses arguments
43
+ * 3. Validates against schemas
44
+ * 4. Executes handler
45
+ */
46
+ const dntShim = __importStar(require("./_dnt.shims.js"));
47
+ const mod_js_1 = require("./parse_args/mod.js");
48
+ const mod_js_2 = require("./validate_args/mod.js");
49
+ const mod_js_3 = require("./detect_arg_conflicts/mod.js");
50
+ const mod_js_4 = require("./generate_help_text/mod.js");
51
+ const index_js_1 = require("./deps/jsr.io/@wentools/result/0.1.0/src/index.js");
52
+ // Type guard - check if entry is a directory
53
+ const isCommandDirectory = (input) => {
54
+ return 'commands' in input;
55
+ };
56
+ /**
57
+ * Create a run function with explicit argv (for testing)
58
+ */
59
+ const createRun = (argv) => {
60
+ const runWithArgs = async (input) => {
61
+ if (isCommandDirectory(input)) {
62
+ await runCommandDirectory(input, argv, []);
63
+ }
64
+ else {
65
+ // Single command mode
66
+ const command = input;
67
+ // Check for help
68
+ if (argv[0] === '--help' || argv[0] === '-h') {
69
+ console.log((0, mod_js_4.generateHelpText)(command));
70
+ return;
71
+ }
72
+ await runSingleCommand(command, argv);
73
+ }
74
+ };
75
+ const runCommandDirectory = async (dir, args, commandPath) => {
76
+ // Build full path
77
+ const fullPath = [...commandPath, dir.name];
78
+ // Help handling
79
+ if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {
80
+ showCommandDirectoryHelp(dir, fullPath);
81
+ return;
82
+ }
83
+ // Lookup subcommand
84
+ const subcommandName = args[0];
85
+ if (subcommandName === undefined) {
86
+ showCommandDirectoryHelp(dir, fullPath);
87
+ return;
88
+ }
89
+ const entry = dir.commands[subcommandName];
90
+ if (!entry) {
91
+ console.error(`❌ Unknown command: ${[...fullPath, subcommandName].join(' ')}`);
92
+ console.error(`\nAvailable commands: ${Object.keys(dir.commands).join(', ')}`);
93
+ dntShim.Deno.exit(1);
94
+ }
95
+ // Recurse or execute
96
+ if (isCommandDirectory(entry)) {
97
+ // Nested directory - recurse!
98
+ await runCommandDirectory(entry, args.slice(1), fullPath);
99
+ }
100
+ else {
101
+ // Leaf command - execute
102
+ const cmdPath = [...fullPath, subcommandName].join(' ');
103
+ // Check for command-specific help
104
+ if (args[1] === '--help' || args[1] === '-h') {
105
+ console.log((0, mod_js_4.generateHelpText)(entry, cmdPath));
106
+ return;
107
+ }
108
+ await runSingleCommand(entry, args.slice(1));
109
+ }
110
+ };
111
+ const showCommandDirectoryHelp = (dir, commandPath) => {
112
+ const pathStr = commandPath.join(' ');
113
+ console.log(`${dir.description || dir.name}\n`);
114
+ console.log('Commands:');
115
+ // Group and display commands
116
+ const entries = Object.entries(dir.commands);
117
+ const maxNameLength = Math.max(...entries.map(([name]) => name.length));
118
+ for (const [name, entry] of entries) {
119
+ const padding = ' '.repeat(maxNameLength - name.length + 2);
120
+ const indicator = isCommandDirectory(entry) ? '→ ' : ' ';
121
+ const desc = entry.description || '';
122
+ console.log(` ${name}${padding}${indicator}${desc}`);
123
+ }
124
+ console.log(`\nUse '${pathStr} <command> --help' for command-specific help`);
125
+ };
126
+ const runSingleCommand = async (command, args) => {
127
+ // Check for conflicts
128
+ const conflicts = (0, mod_js_3.detectArgConflicts)(command.args);
129
+ if (conflicts.length > 0) {
130
+ console.error('❌ Argument configuration error:');
131
+ for (const conflict of conflicts) {
132
+ if (conflict.type === 'duplicate_name') {
133
+ console.error(` Duplicate argument name: ${conflict.name}`);
134
+ }
135
+ else {
136
+ console.error(` Duplicate short flag: -${conflict.name} used by ${conflict.conflictingArgs.join(', ')}`);
137
+ }
138
+ }
139
+ dntShim.Deno.exit(1);
140
+ }
141
+ // Parse arguments
142
+ const rawValues = (0, mod_js_1.parseArgs)(args, command.args);
143
+ // Validate arguments
144
+ const validatedResult = (0, mod_js_2.validateArgs)(rawValues, command.args);
145
+ if (validatedResult.isErr()) {
146
+ const { argName, zodError } = validatedResult.error;
147
+ console.error(`❌ Validation error for argument '${argName}':`);
148
+ zodError.issues.forEach((issue) => {
149
+ console.error(` ${issue.path.join('.')}: ${issue.message}`);
150
+ });
151
+ dntShim.Deno.exit(1);
152
+ }
153
+ // Safe: isErr() checked above, Deno.exit() terminates
154
+ const validatedValues = validatedResult._unsafeUnwrap();
155
+ // Execute handler
156
+ try {
157
+ const result = await command.handler(validatedValues);
158
+ // Check if handler returned a Result type
159
+ if ((0, index_js_1.isResult)(result)) {
160
+ if (result.isErr()) {
161
+ const error = result.error;
162
+ console.error('❌ Command failed:');
163
+ if (error && typeof error === 'object') {
164
+ console.error(JSON.stringify(error, null, 2));
165
+ }
166
+ else {
167
+ console.error(String(error));
168
+ }
169
+ dntShim.Deno.exit(1);
170
+ }
171
+ // ok() - just return, script ends normally
172
+ }
173
+ }
174
+ catch (error) {
175
+ console.error('❌ Command execution failed:', error);
176
+ dntShim.Deno.exit(1);
177
+ }
178
+ };
179
+ return runWithArgs;
180
+ };
181
+ exports.createRun = createRun;
182
+ /**
183
+ * Run a CLI command using Deno.args
184
+ */
185
+ const run = async (input) => {
186
+ const runWithArgs = createRun(dntShim.Deno.args);
187
+ await runWithArgs(input);
188
+ };
189
+ exports.run = run;
@@ -0,0 +1,3 @@
1
+ export { validateArgs } from './validate_args.js';
2
+ export type { ValidationError, ValidatedValues } from './validate_args.js';
3
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/validate_args/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateArgs = void 0;
4
+ var validate_args_js_1 = require("./validate_args.js");
5
+ Object.defineProperty(exports, "validateArgs", { enumerable: true, get: function () { return validate_args_js_1.validateArgs; } });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Validate parsed argument values against Zod schemas
3
+ *
4
+ * Takes raw parsed values and arg definitions, validates each value,
5
+ * returns validated & typed values or validation errors.
6
+ */
7
+ import type { Arg } from '../arg.js';
8
+ import type { RawValues } from '../parse_args/mod.js';
9
+ import { type Result } from '../deps/jsr.io/@wentools/result/0.1.0/src/index.js';
10
+ import type { ZodError } from 'zod';
11
+ type ValidationError = {
12
+ type: 'validation_error';
13
+ argName: string;
14
+ zodError: ZodError;
15
+ };
16
+ type ValidatedValues = Record<string, unknown>;
17
+ declare const validateArgs: (rawValues: RawValues, args: readonly Arg[]) => Result<ValidatedValues, ValidationError>;
18
+ export { validateArgs };
19
+ export type { ValidationError, ValidatedValues };
20
+ //# sourceMappingURL=validate_args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate_args.d.ts","sourceRoot":"","sources":["../../src/validate_args/validate_args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,oDAAoD,CAAA;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAEnC,KAAK,eAAe,GAAG;IACtB,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,QAAQ,CAAA;CAClB,CAAA;AAED,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE9C,QAAA,MAAM,YAAY,GACjB,WAAW,SAAS,EACpB,MAAM,SAAS,GAAG,EAAE,KAClB,MAAM,CAAC,eAAe,EAAE,eAAe,CAkBzC,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA;AACvB,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Validate parsed argument values against Zod schemas
4
+ *
5
+ * Takes raw parsed values and arg definitions, validates each value,
6
+ * returns validated & typed values or validation errors.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.validateArgs = void 0;
10
+ const index_js_1 = require("../deps/jsr.io/@wentools/result/0.1.0/src/index.js");
11
+ const validateArgs = (rawValues, args) => {
12
+ const validated = {};
13
+ for (const arg of args) {
14
+ const rawValue = rawValues[arg.name];
15
+ const result = arg.schema.safeParse(rawValue);
16
+ if (!result.success) {
17
+ return (0, index_js_1.err)('validation_error', `Validation failed for argument: ${arg.name}`, {
18
+ argName: arg.name,
19
+ zodError: result.error,
20
+ });
21
+ }
22
+ validated[arg.name] = result.data;
23
+ }
24
+ return (0, index_js_1.ok)(validated);
25
+ };
26
+ exports.validateArgs = validateArgs;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * ZLI - Lightweight CLI builder with Zod validation
3
+ *
4
+ * A minimal, type-safe CLI argument parser built on Zod.
5
+ * Zero dependencies beyond Zod (already in project).
6
+ *
7
+ * ## Goals
8
+ *
9
+ * - Type-safe arguments inferred from Zod schemas
10
+ * - Flexible parsing: positional args by order OR by --name
11
+ * - Short flags: --verbose or -v
12
+ * - Copy-paste friendly: easy to expand from simple to multi-command scripts
13
+ * - Auto-generated help text
14
+ * - Pretty validation error messages
15
+ * - Conflict detection (duplicate names/shorts)
16
+ *
17
+ * ## API
18
+ *
19
+ * - `zli.p(name, schema, options?)` - Create positional argument
20
+ * - `zli.f(name, schema, options?)` - Create flag argument
21
+ * - `zli.c(args, handler, options?)` - Create command
22
+ * - `zli.d(name, options)` - Create command directory
23
+ * - `zli.run(command | multiCommand)` - Execute CLI
24
+ *
25
+ * ## Usage - Simple Single Command
26
+ *
27
+ * ```typescript
28
+ * import { zli } from '@wentools/zli'
29
+ * import { z } from 'zod'
30
+ *
31
+ * const command = zli.c(
32
+ * [
33
+ * zli.p('email', z.string().email(), {
34
+ * description: 'User email address',
35
+ * short: 'e'
36
+ * }),
37
+ * zli.f('verbose', z.boolean(), {
38
+ * description: 'Verbose output',
39
+ * short: 'v'
40
+ * })
41
+ * ],
42
+ * (args) => {
43
+ * console.log(args.email) // typed as string
44
+ * console.log(args.verbose) // typed as boolean | undefined
45
+ * },
46
+ * { description: 'Check user permissions' }
47
+ * )
48
+ *
49
+ * zli.run(command)
50
+ * ```
51
+ *
52
+ * **Invocation:**
53
+ * ```bash
54
+ * # Positional
55
+ * pnpm exec tsx --env-file=.env script.ts user@example.com
56
+ *
57
+ * # Named
58
+ * pnpm exec tsx --env-file=.env script.ts --email user@example.com
59
+ *
60
+ * # Short flag
61
+ * pnpm exec tsx --env-file=.env script.ts -e user@example.com
62
+ *
63
+ * # With flags
64
+ * pnpm exec tsx --env-file=.env script.ts user@example.com --verbose
65
+ * pnpm exec tsx --env-file=.env script.ts user@example.com -v
66
+ *
67
+ * # Help
68
+ * pnpm exec tsx --env-file=.env script.ts --help
69
+ * ```
70
+ *
71
+ * ## Usage - Multi-Command Script
72
+ *
73
+ * ```typescript
74
+ * import { zli } from '@wentools/zli'
75
+ * import { z } from 'zod'
76
+ *
77
+ * const checkPermissions = zli.c(
78
+ * [
79
+ * zli.p('email', z.string().email(), { description: 'User email' }),
80
+ * zli.f('verbose', z.boolean(), { description: 'Verbose output', short: 'v' })
81
+ * ],
82
+ * (args) => {
83
+ * console.log(`Checking permissions for ${args.email}`)
84
+ * },
85
+ * { description: 'Check user permissions' }
86
+ * )
87
+ *
88
+ * const promote = zli.c(
89
+ * [
90
+ * zli.p('email', z.string().email(), { description: 'User email' })
91
+ * ],
92
+ * async (args) => {
93
+ * console.log(`Promoting ${args.email} to admin`)
94
+ * },
95
+ * { description: 'Promote user to admin' }
96
+ * )
97
+ *
98
+ * zli.run({
99
+ * name: 'user',
100
+ * description: 'User management commands',
101
+ * commands: {
102
+ * 'check-permissions': checkPermissions,
103
+ * 'promote': promote
104
+ * }
105
+ * })
106
+ * ```
107
+ */
108
+ declare const zli: {
109
+ p: <TSchema extends import("zod").ZodType>(name: string, schema: TSchema, options?: import("./create_positional_arg.js").PositionalArgOptions) => import("./create_positional_arg.js").PositionalArg<TSchema>;
110
+ f: <TSchema extends import("zod").ZodType>(name: string, schema: TSchema, options?: import("./create_flag_arg.js").FlagArgOptions) => import("./create_flag_arg.js").FlagArg<TSchema>;
111
+ c: <const TArgs extends readonly import("./arg.js").Arg[]>(args: TArgs, handler: import("./create_command.js").CommandHandler<import("./infer_args_type.js").InferArgsType<TArgs>>, options?: import("./create_command.js").CommandOptions) => import("./create_command.js").Command<TArgs>;
112
+ d: <const TCommands extends Record<string, import("./run.js").CommandEntry>>(name: string, options: import("./create_command_directory.js").CommandDirectoryOptions & {
113
+ commands: TCommands;
114
+ }) => import("./create_command_directory.js").CommandDirectory;
115
+ run: (input: import("./run.js").CliInput) => Promise<void>;
116
+ };
117
+ export { zli };
118
+ //# sourceMappingURL=zli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zli.d.ts","sourceRoot":"","sources":["../src/zli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0GG;AAaH,QAAA,MAAM,GAAG;;;;;;;;CAMR,CAAA;AAED,OAAO,EAAE,GAAG,EAAE,CAAA"}
package/script/zli.js ADDED
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /**
3
+ * ZLI - Lightweight CLI builder with Zod validation
4
+ *
5
+ * A minimal, type-safe CLI argument parser built on Zod.
6
+ * Zero dependencies beyond Zod (already in project).
7
+ *
8
+ * ## Goals
9
+ *
10
+ * - Type-safe arguments inferred from Zod schemas
11
+ * - Flexible parsing: positional args by order OR by --name
12
+ * - Short flags: --verbose or -v
13
+ * - Copy-paste friendly: easy to expand from simple to multi-command scripts
14
+ * - Auto-generated help text
15
+ * - Pretty validation error messages
16
+ * - Conflict detection (duplicate names/shorts)
17
+ *
18
+ * ## API
19
+ *
20
+ * - `zli.p(name, schema, options?)` - Create positional argument
21
+ * - `zli.f(name, schema, options?)` - Create flag argument
22
+ * - `zli.c(args, handler, options?)` - Create command
23
+ * - `zli.d(name, options)` - Create command directory
24
+ * - `zli.run(command | multiCommand)` - Execute CLI
25
+ *
26
+ * ## Usage - Simple Single Command
27
+ *
28
+ * ```typescript
29
+ * import { zli } from '@wentools/zli'
30
+ * import { z } from 'zod'
31
+ *
32
+ * const command = zli.c(
33
+ * [
34
+ * zli.p('email', z.string().email(), {
35
+ * description: 'User email address',
36
+ * short: 'e'
37
+ * }),
38
+ * zli.f('verbose', z.boolean(), {
39
+ * description: 'Verbose output',
40
+ * short: 'v'
41
+ * })
42
+ * ],
43
+ * (args) => {
44
+ * console.log(args.email) // typed as string
45
+ * console.log(args.verbose) // typed as boolean | undefined
46
+ * },
47
+ * { description: 'Check user permissions' }
48
+ * )
49
+ *
50
+ * zli.run(command)
51
+ * ```
52
+ *
53
+ * **Invocation:**
54
+ * ```bash
55
+ * # Positional
56
+ * pnpm exec tsx --env-file=.env script.ts user@example.com
57
+ *
58
+ * # Named
59
+ * pnpm exec tsx --env-file=.env script.ts --email user@example.com
60
+ *
61
+ * # Short flag
62
+ * pnpm exec tsx --env-file=.env script.ts -e user@example.com
63
+ *
64
+ * # With flags
65
+ * pnpm exec tsx --env-file=.env script.ts user@example.com --verbose
66
+ * pnpm exec tsx --env-file=.env script.ts user@example.com -v
67
+ *
68
+ * # Help
69
+ * pnpm exec tsx --env-file=.env script.ts --help
70
+ * ```
71
+ *
72
+ * ## Usage - Multi-Command Script
73
+ *
74
+ * ```typescript
75
+ * import { zli } from '@wentools/zli'
76
+ * import { z } from 'zod'
77
+ *
78
+ * const checkPermissions = zli.c(
79
+ * [
80
+ * zli.p('email', z.string().email(), { description: 'User email' }),
81
+ * zli.f('verbose', z.boolean(), { description: 'Verbose output', short: 'v' })
82
+ * ],
83
+ * (args) => {
84
+ * console.log(`Checking permissions for ${args.email}`)
85
+ * },
86
+ * { description: 'Check user permissions' }
87
+ * )
88
+ *
89
+ * const promote = zli.c(
90
+ * [
91
+ * zli.p('email', z.string().email(), { description: 'User email' })
92
+ * ],
93
+ * async (args) => {
94
+ * console.log(`Promoting ${args.email} to admin`)
95
+ * },
96
+ * { description: 'Promote user to admin' }
97
+ * )
98
+ *
99
+ * zli.run({
100
+ * name: 'user',
101
+ * description: 'User management commands',
102
+ * commands: {
103
+ * 'check-permissions': checkPermissions,
104
+ * 'promote': promote
105
+ * }
106
+ * })
107
+ * ```
108
+ */
109
+ Object.defineProperty(exports, "__esModule", { value: true });
110
+ exports.zli = void 0;
111
+ const create_positional_arg_js_1 = require("./create_positional_arg.js");
112
+ const create_flag_arg_js_1 = require("./create_flag_arg.js");
113
+ const create_command_js_1 = require("./create_command.js");
114
+ const create_command_directory_js_1 = require("./create_command_directory.js");
115
+ const run_js_1 = require("./run.js");
116
+ const p = create_positional_arg_js_1.createPositionalArg;
117
+ const f = create_flag_arg_js_1.createFlagArg;
118
+ const c = create_command_js_1.createCommand;
119
+ const d = create_command_directory_js_1.createCommandDirectory;
120
+ const zli = {
121
+ p,
122
+ f,
123
+ c,
124
+ d,
125
+ run: run_js_1.run,
126
+ };
127
+ exports.zli = zli;