@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.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/esm/_dnt.shims.d.ts +6 -0
- package/esm/_dnt.shims.d.ts.map +1 -0
- package/esm/_dnt.shims.js +61 -0
- package/esm/arg.d.ts +9 -0
- package/esm/arg.d.ts.map +1 -0
- package/esm/arg.js +4 -0
- package/esm/create_command.d.ts +28 -0
- package/esm/create_command.d.ts.map +1 -0
- package/esm/create_command.js +17 -0
- package/esm/create_command_directory.d.ts +35 -0
- package/esm/create_command_directory.d.ts.map +1 -0
- package/esm/create_command_directory.js +31 -0
- package/esm/create_flag_arg.d.ts +23 -0
- package/esm/create_flag_arg.d.ts.map +1 -0
- package/esm/create_flag_arg.js +14 -0
- package/esm/create_positional_arg.d.ts +24 -0
- package/esm/create_positional_arg.d.ts.map +1 -0
- package/esm/create_positional_arg.js +15 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts +38 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/err.js +38 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts +2 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/err/index.js +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts +156 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/index.js +65 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts +2 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.js +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts +11 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.js +14 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts +2 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.js +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts +28 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts.map +1 -0
- package/esm/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.js +30 -0
- package/esm/detect_arg_conflicts/detect_arg_conflicts.d.ts +19 -0
- package/esm/detect_arg_conflicts/detect_arg_conflicts.d.ts.map +1 -0
- package/esm/detect_arg_conflicts/detect_arg_conflicts.js +54 -0
- package/esm/detect_arg_conflicts/mod.d.ts +3 -0
- package/esm/detect_arg_conflicts/mod.d.ts.map +1 -0
- package/esm/detect_arg_conflicts/mod.js +1 -0
- package/esm/generate_help_text/generate_help_text.d.ts +13 -0
- package/esm/generate_help_text/generate_help_text.d.ts.map +1 -0
- package/esm/generate_help_text/generate_help_text.js +54 -0
- package/esm/generate_help_text/mod.d.ts +2 -0
- package/esm/generate_help_text/mod.d.ts.map +1 -0
- package/esm/generate_help_text/mod.js +1 -0
- package/esm/infer_args_type.d.ts +29 -0
- package/esm/infer_args_type.d.ts.map +1 -0
- package/esm/infer_args_type.js +6 -0
- package/esm/is_boolean_schema/is_boolean_schema.d.ts +12 -0
- package/esm/is_boolean_schema/is_boolean_schema.d.ts.map +1 -0
- package/esm/is_boolean_schema/is_boolean_schema.js +21 -0
- package/esm/is_boolean_schema/mod.d.ts +2 -0
- package/esm/is_boolean_schema/mod.d.ts.map +1 -0
- package/esm/is_boolean_schema/mod.js +1 -0
- package/esm/mod.d.ts +8 -0
- package/esm/mod.d.ts.map +1 -0
- package/esm/mod.js +1 -0
- package/esm/package.json +3 -0
- package/esm/parse_args/mod.d.ts +3 -0
- package/esm/parse_args/mod.d.ts.map +1 -0
- package/esm/parse_args/mod.js +1 -0
- package/esm/parse_args/parse_args.d.ts +24 -0
- package/esm/parse_args/parse_args.d.ts.map +1 -0
- package/esm/parse_args/parse_args.js +89 -0
- package/esm/run.d.ts +19 -0
- package/esm/run.d.ts.map +1 -0
- package/esm/run.js +152 -0
- package/esm/validate_args/mod.d.ts +3 -0
- package/esm/validate_args/mod.d.ts.map +1 -0
- package/esm/validate_args/mod.js +1 -0
- package/esm/validate_args/validate_args.d.ts +20 -0
- package/esm/validate_args/validate_args.d.ts.map +1 -0
- package/esm/validate_args/validate_args.js +23 -0
- package/esm/zli.d.ts +118 -0
- package/esm/zli.d.ts.map +1 -0
- package/esm/zli.js +124 -0
- package/package.json +39 -0
- package/script/_dnt.shims.d.ts +6 -0
- package/script/_dnt.shims.d.ts.map +1 -0
- package/script/_dnt.shims.js +65 -0
- package/script/arg.d.ts +9 -0
- package/script/arg.d.ts.map +1 -0
- package/script/arg.js +5 -0
- package/script/create_command.d.ts +28 -0
- package/script/create_command.d.ts.map +1 -0
- package/script/create_command.js +20 -0
- package/script/create_command_directory.d.ts +35 -0
- package/script/create_command_directory.d.ts.map +1 -0
- package/script/create_command_directory.js +34 -0
- package/script/create_flag_arg.d.ts +23 -0
- package/script/create_flag_arg.d.ts.map +1 -0
- package/script/create_flag_arg.js +17 -0
- package/script/create_positional_arg.d.ts +24 -0
- package/script/create_positional_arg.d.ts.map +1 -0
- package/script/create_positional_arg.js +18 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts +38 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/err.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/err.js +41 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts +2 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/index.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/err/index.js +5 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts +156 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/index.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/index.js +77 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts +2 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/index.js +5 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts +11 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/is_result/is_result.js +17 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts +2 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/index.js +5 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts +28 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.d.ts.map +1 -0
- package/script/deps/jsr.io/@wentools/result/0.1.0/src/propagate_err/propagate_err.js +33 -0
- package/script/detect_arg_conflicts/detect_arg_conflicts.d.ts +19 -0
- package/script/detect_arg_conflicts/detect_arg_conflicts.d.ts.map +1 -0
- package/script/detect_arg_conflicts/detect_arg_conflicts.js +57 -0
- package/script/detect_arg_conflicts/mod.d.ts +3 -0
- package/script/detect_arg_conflicts/mod.d.ts.map +1 -0
- package/script/detect_arg_conflicts/mod.js +5 -0
- package/script/generate_help_text/generate_help_text.d.ts +13 -0
- package/script/generate_help_text/generate_help_text.d.ts.map +1 -0
- package/script/generate_help_text/generate_help_text.js +57 -0
- package/script/generate_help_text/mod.d.ts +2 -0
- package/script/generate_help_text/mod.d.ts.map +1 -0
- package/script/generate_help_text/mod.js +5 -0
- package/script/infer_args_type.d.ts +29 -0
- package/script/infer_args_type.d.ts.map +1 -0
- package/script/infer_args_type.js +7 -0
- package/script/is_boolean_schema/is_boolean_schema.d.ts +12 -0
- package/script/is_boolean_schema/is_boolean_schema.d.ts.map +1 -0
- package/script/is_boolean_schema/is_boolean_schema.js +24 -0
- package/script/is_boolean_schema/mod.d.ts +2 -0
- package/script/is_boolean_schema/mod.d.ts.map +1 -0
- package/script/is_boolean_schema/mod.js +5 -0
- package/script/mod.d.ts +8 -0
- package/script/mod.d.ts.map +1 -0
- package/script/mod.js +5 -0
- package/script/package.json +3 -0
- package/script/parse_args/mod.d.ts +3 -0
- package/script/parse_args/mod.d.ts.map +1 -0
- package/script/parse_args/mod.js +5 -0
- package/script/parse_args/parse_args.d.ts +24 -0
- package/script/parse_args/parse_args.d.ts.map +1 -0
- package/script/parse_args/parse_args.js +92 -0
- package/script/run.d.ts +19 -0
- package/script/run.d.ts.map +1 -0
- package/script/run.js +189 -0
- package/script/validate_args/mod.d.ts +3 -0
- package/script/validate_args/mod.d.ts.map +1 -0
- package/script/validate_args/mod.js +5 -0
- package/script/validate_args/validate_args.d.ts +20 -0
- package/script/validate_args/validate_args.d.ts.map +1 -0
- package/script/validate_args/validate_args.js +26 -0
- package/script/zli.d.ts +118 -0
- package/script/zli.d.ts.map +1 -0
- 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 @@
|
|
|
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;
|
package/script/zli.d.ts
ADDED
|
@@ -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;
|