@seedcli/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/command/help.d.ts +59 -0
- package/dist/command/help.d.ts.map +1 -0
- package/dist/command/help.js +216 -0
- package/dist/command/help.js.map +1 -0
- package/dist/command/parser.d.ts +27 -0
- package/dist/command/parser.d.ts.map +1 -0
- package/dist/command/parser.js +259 -0
- package/dist/command/parser.js.map +1 -0
- package/dist/command/router.d.ts +34 -0
- package/dist/command/router.d.ts.map +1 -0
- package/dist/command/router.js +90 -0
- package/dist/command/router.js.map +1 -0
- package/dist/discovery/auto-discover.d.ts +26 -0
- package/dist/discovery/auto-discover.d.ts.map +1 -0
- package/dist/discovery/auto-discover.js +138 -0
- package/dist/discovery/auto-discover.js.map +1 -0
- package/dist/discovery/index.d.ts +3 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +2 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/errors.d.ts +23 -0
- package/dist/plugin/errors.d.ts.map +1 -0
- package/dist/plugin/errors.js +45 -0
- package/dist/plugin/errors.js.map +1 -0
- package/dist/plugin/index.d.ts +6 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +6 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/loader.d.ts +12 -0
- package/dist/plugin/loader.d.ts.map +1 -0
- package/dist/plugin/loader.js +33 -0
- package/dist/plugin/loader.js.map +1 -0
- package/dist/plugin/registry.d.ts +32 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/registry.js +101 -0
- package/dist/plugin/registry.js.map +1 -0
- package/dist/plugin/topo-sort.d.ts +8 -0
- package/dist/plugin/topo-sort.d.ts.map +1 -0
- package/dist/plugin/topo-sort.js +60 -0
- package/dist/plugin/topo-sort.js.map +1 -0
- package/dist/plugin/validator.d.ts +17 -0
- package/dist/plugin/validator.d.ts.map +1 -0
- package/dist/plugin/validator.js +58 -0
- package/dist/plugin/validator.js.map +1 -0
- package/dist/runtime/builder.d.ts +70 -0
- package/dist/runtime/builder.d.ts.map +1 -0
- package/dist/runtime/builder.js +108 -0
- package/dist/runtime/builder.js.map +1 -0
- package/dist/runtime/runtime.d.ts +53 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +424 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/types/args.d.ts +93 -0
- package/dist/types/args.d.ts.map +1 -0
- package/dist/types/args.js +9 -0
- package/dist/types/args.js.map +1 -0
- package/dist/types/command.d.ts +60 -0
- package/dist/types/command.d.ts.map +1 -0
- package/dist/types/command.js +26 -0
- package/dist/types/command.js.map +1 -0
- package/dist/types/config.d.ts +61 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +17 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/extension.d.ts +30 -0
- package/dist/types/extension.d.ts.map +1 -0
- package/dist/types/extension.js +16 -0
- package/dist/types/extension.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/modules.d.ts +47 -0
- package/dist/types/modules.d.ts.map +1 -0
- package/dist/types/modules.js +5 -0
- package/dist/types/modules.js.map +1 -0
- package/dist/types/plugin.d.ts +40 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +17 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types/toolbox.d.ts +54 -0
- package/dist/types/toolbox.d.ts.map +1 -0
- package/dist/types/toolbox.js +2 -0
- package/dist/types/toolbox.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Seed CLI Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Command } from "../types/command.js";
|
|
2
|
+
export interface HelpOptions {
|
|
3
|
+
/** Custom header text */
|
|
4
|
+
header?: string;
|
|
5
|
+
/** Show command aliases (default: true) */
|
|
6
|
+
showAliases?: boolean;
|
|
7
|
+
/** Show hidden commands (default: false) */
|
|
8
|
+
showHidden?: boolean;
|
|
9
|
+
/** Alphabetical sort (default: true) */
|
|
10
|
+
sortCommands?: boolean;
|
|
11
|
+
/** CLI brand name */
|
|
12
|
+
brand?: string;
|
|
13
|
+
/** CLI version */
|
|
14
|
+
version?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate help text for the entire CLI (global help).
|
|
18
|
+
*
|
|
19
|
+
* Output format:
|
|
20
|
+
* ```
|
|
21
|
+
* mycli v1.0.0
|
|
22
|
+
*
|
|
23
|
+
* USAGE
|
|
24
|
+
* mycli <command> [options]
|
|
25
|
+
*
|
|
26
|
+
* COMMANDS
|
|
27
|
+
* deploy Deploy the application
|
|
28
|
+
* dev Start development mode
|
|
29
|
+
* db Database commands
|
|
30
|
+
*
|
|
31
|
+
* FLAGS
|
|
32
|
+
* --help, -h Show help
|
|
33
|
+
* --version, -v Show version
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function renderGlobalHelp(commands: Command[], options?: HelpOptions): string;
|
|
37
|
+
/**
|
|
38
|
+
* Generate help text for a specific command.
|
|
39
|
+
*
|
|
40
|
+
* Output format:
|
|
41
|
+
* ```
|
|
42
|
+
* Deploy the application
|
|
43
|
+
*
|
|
44
|
+
* USAGE
|
|
45
|
+
* mycli deploy <environment> [options]
|
|
46
|
+
*
|
|
47
|
+
* ARGUMENTS
|
|
48
|
+
* environment Target environment (required)
|
|
49
|
+
*
|
|
50
|
+
* FLAGS
|
|
51
|
+
* --force, -f Force deployment (default: false)
|
|
52
|
+
* --replicas, -r <n> Number of replicas
|
|
53
|
+
*
|
|
54
|
+
* SUBCOMMANDS
|
|
55
|
+
* rollback Rollback the deployment
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function renderCommandHelp(cmd: Command, options?: HelpOptions): string;
|
|
59
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/command/help.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,MAAM,WAAW,WAAW;IAC3B,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAyDvF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAyEjF"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
// ─── Help Renderer ───
|
|
2
|
+
/**
|
|
3
|
+
* Generate help text for the entire CLI (global help).
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
* ```
|
|
7
|
+
* mycli v1.0.0
|
|
8
|
+
*
|
|
9
|
+
* USAGE
|
|
10
|
+
* mycli <command> [options]
|
|
11
|
+
*
|
|
12
|
+
* COMMANDS
|
|
13
|
+
* deploy Deploy the application
|
|
14
|
+
* dev Start development mode
|
|
15
|
+
* db Database commands
|
|
16
|
+
*
|
|
17
|
+
* FLAGS
|
|
18
|
+
* --help, -h Show help
|
|
19
|
+
* --version, -v Show version
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function renderGlobalHelp(commands, options = {}) {
|
|
23
|
+
const { header, showAliases = true, showHidden = false, sortCommands = true, brand = "cli", version, } = options;
|
|
24
|
+
const lines = [];
|
|
25
|
+
// Header
|
|
26
|
+
if (header) {
|
|
27
|
+
lines.push(header);
|
|
28
|
+
}
|
|
29
|
+
else if (version) {
|
|
30
|
+
lines.push(`${brand} v${version}`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
lines.push(brand);
|
|
34
|
+
}
|
|
35
|
+
lines.push("");
|
|
36
|
+
// Usage
|
|
37
|
+
lines.push("USAGE");
|
|
38
|
+
lines.push(` ${brand} <command> [options]`);
|
|
39
|
+
lines.push("");
|
|
40
|
+
// Commands
|
|
41
|
+
const visibleCmds = commands.filter((cmd) => showHidden || !cmd.hidden);
|
|
42
|
+
if (sortCommands) {
|
|
43
|
+
visibleCmds.sort((a, b) => a.name.localeCompare(b.name));
|
|
44
|
+
}
|
|
45
|
+
if (visibleCmds.length > 0) {
|
|
46
|
+
lines.push("COMMANDS");
|
|
47
|
+
// Calculate padding for alignment
|
|
48
|
+
const maxNameLen = Math.max(...visibleCmds.map((cmd) => formatCommandName(cmd, showAliases).length));
|
|
49
|
+
for (const cmd of visibleCmds) {
|
|
50
|
+
const name = formatCommandName(cmd, showAliases);
|
|
51
|
+
const padding = " ".repeat(Math.max(2, maxNameLen - name.length + 4));
|
|
52
|
+
const desc = cmd.description ?? "";
|
|
53
|
+
lines.push(` ${name}${padding}${desc}`);
|
|
54
|
+
}
|
|
55
|
+
lines.push("");
|
|
56
|
+
}
|
|
57
|
+
// Global flags
|
|
58
|
+
lines.push("FLAGS");
|
|
59
|
+
lines.push(" --help, -h Show help");
|
|
60
|
+
lines.push(" --version, -v Show version");
|
|
61
|
+
lines.push("");
|
|
62
|
+
return lines.join("\n");
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate help text for a specific command.
|
|
66
|
+
*
|
|
67
|
+
* Output format:
|
|
68
|
+
* ```
|
|
69
|
+
* Deploy the application
|
|
70
|
+
*
|
|
71
|
+
* USAGE
|
|
72
|
+
* mycli deploy <environment> [options]
|
|
73
|
+
*
|
|
74
|
+
* ARGUMENTS
|
|
75
|
+
* environment Target environment (required)
|
|
76
|
+
*
|
|
77
|
+
* FLAGS
|
|
78
|
+
* --force, -f Force deployment (default: false)
|
|
79
|
+
* --replicas, -r <n> Number of replicas
|
|
80
|
+
*
|
|
81
|
+
* SUBCOMMANDS
|
|
82
|
+
* rollback Rollback the deployment
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export function renderCommandHelp(cmd, options = {}) {
|
|
86
|
+
const { brand = "cli", showAliases = true, showHidden = false } = options;
|
|
87
|
+
const lines = [];
|
|
88
|
+
// Description
|
|
89
|
+
if (cmd.description) {
|
|
90
|
+
lines.push(cmd.description);
|
|
91
|
+
lines.push("");
|
|
92
|
+
}
|
|
93
|
+
// Aliases
|
|
94
|
+
if (showAliases && cmd.alias && cmd.alias.length > 0) {
|
|
95
|
+
lines.push(`ALIASES`);
|
|
96
|
+
lines.push(` ${cmd.alias.join(", ")}`);
|
|
97
|
+
lines.push("");
|
|
98
|
+
}
|
|
99
|
+
// Usage line
|
|
100
|
+
lines.push("USAGE");
|
|
101
|
+
lines.push(` ${brand} ${buildUsageLine(cmd)}`);
|
|
102
|
+
lines.push("");
|
|
103
|
+
// Arguments
|
|
104
|
+
const argEntries = Object.entries(cmd.args ?? {});
|
|
105
|
+
if (argEntries.length > 0) {
|
|
106
|
+
lines.push("ARGUMENTS");
|
|
107
|
+
const maxNameLen = Math.max(...argEntries.map(([name]) => name.length));
|
|
108
|
+
for (const [name, def] of argEntries) {
|
|
109
|
+
const padding = " ".repeat(Math.max(2, maxNameLen - name.length + 4));
|
|
110
|
+
const meta = formatArgMeta(def);
|
|
111
|
+
lines.push(` ${name}${padding}${meta}`);
|
|
112
|
+
}
|
|
113
|
+
lines.push("");
|
|
114
|
+
}
|
|
115
|
+
// Flags
|
|
116
|
+
const flagEntries = Object.entries(cmd.flags ?? {}).filter(([, def]) => !def.hidden);
|
|
117
|
+
if (flagEntries.length > 0) {
|
|
118
|
+
lines.push("FLAGS");
|
|
119
|
+
const formattedFlags = flagEntries.map(([name, def]) => ({
|
|
120
|
+
label: formatFlagLabel(name, def),
|
|
121
|
+
meta: formatFlagMeta(def),
|
|
122
|
+
}));
|
|
123
|
+
const maxLabelLen = Math.max(...formattedFlags.map((f) => f.label.length));
|
|
124
|
+
for (const { label, meta } of formattedFlags) {
|
|
125
|
+
const padding = " ".repeat(Math.max(2, maxLabelLen - label.length + 4));
|
|
126
|
+
lines.push(` ${label}${padding}${meta}`);
|
|
127
|
+
}
|
|
128
|
+
lines.push("");
|
|
129
|
+
}
|
|
130
|
+
// Subcommands
|
|
131
|
+
const subcommands = (cmd.subcommands ?? []).filter((sub) => showHidden || !sub.hidden);
|
|
132
|
+
if (subcommands.length > 0) {
|
|
133
|
+
lines.push("SUBCOMMANDS");
|
|
134
|
+
const maxNameLen = Math.max(...subcommands.map((sub) => sub.name.length));
|
|
135
|
+
for (const sub of subcommands) {
|
|
136
|
+
const padding = " ".repeat(Math.max(2, maxNameLen - sub.name.length + 4));
|
|
137
|
+
const desc = sub.description ?? "";
|
|
138
|
+
lines.push(` ${sub.name}${padding}${desc}`);
|
|
139
|
+
}
|
|
140
|
+
lines.push("");
|
|
141
|
+
}
|
|
142
|
+
return lines.join("\n");
|
|
143
|
+
}
|
|
144
|
+
// ─── Formatting Helpers ───
|
|
145
|
+
function formatCommandName(cmd, showAliases) {
|
|
146
|
+
let name = cmd.name;
|
|
147
|
+
if (showAliases && cmd.alias && cmd.alias.length > 0) {
|
|
148
|
+
name += ` (${cmd.alias.join(", ")})`;
|
|
149
|
+
}
|
|
150
|
+
return name;
|
|
151
|
+
}
|
|
152
|
+
function buildUsageLine(cmd) {
|
|
153
|
+
const parts = [cmd.name];
|
|
154
|
+
// Add positional args
|
|
155
|
+
for (const [name, def] of Object.entries(cmd.args ?? {})) {
|
|
156
|
+
if (def.required) {
|
|
157
|
+
parts.push(`<${name}>`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
parts.push(`[${name}]`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Add [options] if there are flags
|
|
164
|
+
const flagCount = Object.keys(cmd.flags ?? {}).length;
|
|
165
|
+
if (flagCount > 0) {
|
|
166
|
+
parts.push("[options]");
|
|
167
|
+
}
|
|
168
|
+
return parts.join(" ");
|
|
169
|
+
}
|
|
170
|
+
function formatArgMeta(def) {
|
|
171
|
+
const parts = [];
|
|
172
|
+
if (def.description) {
|
|
173
|
+
parts.push(def.description);
|
|
174
|
+
}
|
|
175
|
+
const argMetaChoices = def.choices;
|
|
176
|
+
if (argMetaChoices && argMetaChoices.length > 0) {
|
|
177
|
+
parts.push(`(${argMetaChoices.join(" | ")})`);
|
|
178
|
+
}
|
|
179
|
+
if (def.required) {
|
|
180
|
+
parts.push("(required)");
|
|
181
|
+
}
|
|
182
|
+
if (def.default !== undefined) {
|
|
183
|
+
parts.push(`(default: ${def.default})`);
|
|
184
|
+
}
|
|
185
|
+
return parts.join(" ");
|
|
186
|
+
}
|
|
187
|
+
function formatFlagLabel(name, def) {
|
|
188
|
+
let label = `--${name}`;
|
|
189
|
+
if (def.alias) {
|
|
190
|
+
label = `-${def.alias}, ${label}`;
|
|
191
|
+
}
|
|
192
|
+
// Add value placeholder
|
|
193
|
+
if (def.type !== "boolean") {
|
|
194
|
+
const placeholder = def.type === "number" || def.type === "number[]" ? "<n>" : "<value>";
|
|
195
|
+
label += ` ${placeholder}`;
|
|
196
|
+
}
|
|
197
|
+
return label;
|
|
198
|
+
}
|
|
199
|
+
function formatFlagMeta(def) {
|
|
200
|
+
const parts = [];
|
|
201
|
+
if (def.description) {
|
|
202
|
+
parts.push(def.description);
|
|
203
|
+
}
|
|
204
|
+
const flagMetaChoices = def.choices;
|
|
205
|
+
if (flagMetaChoices && flagMetaChoices.length > 0) {
|
|
206
|
+
parts.push(`(${flagMetaChoices.join(" | ")})`);
|
|
207
|
+
}
|
|
208
|
+
if (def.required) {
|
|
209
|
+
parts.push("(required)");
|
|
210
|
+
}
|
|
211
|
+
if (def.default !== undefined) {
|
|
212
|
+
parts.push(`(default: ${def.default})`);
|
|
213
|
+
}
|
|
214
|
+
return parts.join(" ");
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/command/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Command } from "../types/command.js";
|
|
2
|
+
export declare class ParseError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export interface ParseResult {
|
|
6
|
+
args: Record<string, unknown>;
|
|
7
|
+
flags: Record<string, unknown>;
|
|
8
|
+
command: string | undefined;
|
|
9
|
+
argv: string[];
|
|
10
|
+
raw: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse raw argv against a command's arg/flag definitions.
|
|
14
|
+
*
|
|
15
|
+
* Flow:
|
|
16
|
+
* 1. Separate positional args from flags using node:util parseArgs
|
|
17
|
+
* 2. Coerce types (string → number where needed)
|
|
18
|
+
* 3. Apply defaults for missing optional values
|
|
19
|
+
* 4. Validate required, choices, custom validators
|
|
20
|
+
* 5. Return typed { args, flags } object
|
|
21
|
+
*/
|
|
22
|
+
export declare function parse(argv: string[], cmd: Command): ParseResult;
|
|
23
|
+
/**
|
|
24
|
+
* Levenshtein distance between two strings.
|
|
25
|
+
*/
|
|
26
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
27
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/command/parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAInD,qBAAa,UAAW,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI3B;AAID,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,EAAE,CAAC;CACd;AAID;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,WAAW,CAqG/D;AAmKD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBxD"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
// ─── Error Types ───
|
|
3
|
+
export class ParseError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "ParseError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
// ─── Parser ───
|
|
10
|
+
/**
|
|
11
|
+
* Parse raw argv against a command's arg/flag definitions.
|
|
12
|
+
*
|
|
13
|
+
* Flow:
|
|
14
|
+
* 1. Separate positional args from flags using node:util parseArgs
|
|
15
|
+
* 2. Coerce types (string → number where needed)
|
|
16
|
+
* 3. Apply defaults for missing optional values
|
|
17
|
+
* 4. Validate required, choices, custom validators
|
|
18
|
+
* 5. Return typed { args, flags } object
|
|
19
|
+
*/
|
|
20
|
+
export function parse(argv, cmd) {
|
|
21
|
+
const argDefs = cmd.args ?? {};
|
|
22
|
+
const flagDefs = cmd.flags ?? {};
|
|
23
|
+
// Build parseArgs options from flag definitions
|
|
24
|
+
const options = {};
|
|
25
|
+
for (const [name, def] of Object.entries(flagDefs)) {
|
|
26
|
+
const flagType = def.type;
|
|
27
|
+
if (flagType === "boolean") {
|
|
28
|
+
options[name] = { type: "boolean" };
|
|
29
|
+
}
|
|
30
|
+
else if (flagType === "string[]" || flagType === "number[]") {
|
|
31
|
+
// Arrays are "string" with multiple: true (we coerce number[] later)
|
|
32
|
+
options[name] = { type: "string", multiple: true };
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// string, number — parseArgs treats both as "string" (we coerce number later)
|
|
36
|
+
options[name] = { type: "string" };
|
|
37
|
+
}
|
|
38
|
+
if (def.alias) {
|
|
39
|
+
options[name].short = def.alias;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Parse with node:util parseArgs
|
|
43
|
+
let parsed;
|
|
44
|
+
try {
|
|
45
|
+
parsed = parseArgs({
|
|
46
|
+
args: argv,
|
|
47
|
+
options,
|
|
48
|
+
strict: true,
|
|
49
|
+
allowPositionals: true,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof Error) {
|
|
54
|
+
throw new ParseError(err.message);
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
// ─── Process positional args ───
|
|
59
|
+
const argEntries = Object.entries(argDefs);
|
|
60
|
+
const args = {};
|
|
61
|
+
for (let i = 0; i < argEntries.length; i++) {
|
|
62
|
+
const [name, def] = argEntries[i];
|
|
63
|
+
const raw = parsed.positionals[i];
|
|
64
|
+
if (raw === undefined) {
|
|
65
|
+
if (def.default !== undefined) {
|
|
66
|
+
args[name] = def.default;
|
|
67
|
+
}
|
|
68
|
+
else if (def.required) {
|
|
69
|
+
throw new ParseError(formatMissingArg(name, def, cmd));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
args[name] = undefined;
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
args[name] = coerceArgValue(name, raw, def);
|
|
77
|
+
validateArg(name, args[name], def);
|
|
78
|
+
}
|
|
79
|
+
// ─── Process flags ───
|
|
80
|
+
const flags = {};
|
|
81
|
+
for (const [name, def] of Object.entries(flagDefs)) {
|
|
82
|
+
const raw = parsed.values[name];
|
|
83
|
+
if (raw === undefined) {
|
|
84
|
+
if (def.default !== undefined) {
|
|
85
|
+
flags[name] = def.default;
|
|
86
|
+
}
|
|
87
|
+
else if (def.required) {
|
|
88
|
+
throw new ParseError(formatMissingFlag(name, def));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
flags[name] = undefined;
|
|
92
|
+
}
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
flags[name] = coerceFlagValue(name, raw, def);
|
|
96
|
+
validateFlag(name, flags[name], def);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
args,
|
|
100
|
+
flags,
|
|
101
|
+
command: cmd.name,
|
|
102
|
+
argv: parsed.positionals,
|
|
103
|
+
raw: argv,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// ─── Type Coercion ───
|
|
107
|
+
function coerceArgValue(name, raw, def) {
|
|
108
|
+
if (def.type === "number") {
|
|
109
|
+
const num = Number(raw);
|
|
110
|
+
if (Number.isNaN(num)) {
|
|
111
|
+
throw new ParseError(`Invalid value for argument "${name}"\n\n Expected: number\n Received: "${raw}"`);
|
|
112
|
+
}
|
|
113
|
+
return num;
|
|
114
|
+
}
|
|
115
|
+
return raw;
|
|
116
|
+
}
|
|
117
|
+
function coerceFlagValue(name, raw, def) {
|
|
118
|
+
switch (def.type) {
|
|
119
|
+
case "boolean":
|
|
120
|
+
return raw;
|
|
121
|
+
case "number": {
|
|
122
|
+
const num = Number(raw);
|
|
123
|
+
if (Number.isNaN(num)) {
|
|
124
|
+
throw new ParseError(`Invalid value for flag "--${name}"\n\n Expected: number\n Received: "${raw}"`);
|
|
125
|
+
}
|
|
126
|
+
return num;
|
|
127
|
+
}
|
|
128
|
+
case "string":
|
|
129
|
+
return raw;
|
|
130
|
+
case "string[]":
|
|
131
|
+
if (Array.isArray(raw)) {
|
|
132
|
+
return raw.map(String);
|
|
133
|
+
}
|
|
134
|
+
return [String(raw)];
|
|
135
|
+
case "number[]": {
|
|
136
|
+
const items = Array.isArray(raw) ? raw : [raw];
|
|
137
|
+
return items.map((item) => {
|
|
138
|
+
const num = Number(item);
|
|
139
|
+
if (Number.isNaN(num)) {
|
|
140
|
+
throw new ParseError(`Invalid value for flag "--${name}"\n\n Expected: number[]\n Received item: "${item}"`);
|
|
141
|
+
}
|
|
142
|
+
return num;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
default:
|
|
146
|
+
return raw;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ─── Validation ───
|
|
150
|
+
function validateArg(name, value, def) {
|
|
151
|
+
// Choices validation
|
|
152
|
+
const argChoices = def.choices;
|
|
153
|
+
if (argChoices && argChoices.length > 0) {
|
|
154
|
+
if (!argChoices.includes(String(value))) {
|
|
155
|
+
const choicesStr = argChoices.map((c) => `"${c}"`).join(", ");
|
|
156
|
+
const suggestion = findClosest(String(value), argChoices);
|
|
157
|
+
let msg = `Invalid value for argument "${name}"\n\n Expected one of: ${choicesStr}\n Received: "${value}"`;
|
|
158
|
+
if (suggestion) {
|
|
159
|
+
msg += `\n\n Did you mean "${suggestion}"?`;
|
|
160
|
+
}
|
|
161
|
+
throw new ParseError(msg);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Custom validator
|
|
165
|
+
if (def.validate) {
|
|
166
|
+
const result = def.validate(value);
|
|
167
|
+
if (result === false) {
|
|
168
|
+
throw new ParseError(`Validation failed for argument "${name}"`);
|
|
169
|
+
}
|
|
170
|
+
if (typeof result === "string") {
|
|
171
|
+
throw new ParseError(`Validation failed for argument "${name}": ${result}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function validateFlag(name, value, def) {
|
|
176
|
+
// Choices validation (only for string flags)
|
|
177
|
+
const flagChoices = def.choices;
|
|
178
|
+
if (flagChoices && flagChoices.length > 0) {
|
|
179
|
+
if (!flagChoices.includes(String(value))) {
|
|
180
|
+
const choicesStr = flagChoices.map((c) => `"${c}"`).join(", ");
|
|
181
|
+
const suggestion = findClosest(String(value), flagChoices);
|
|
182
|
+
let msg = `Invalid value for flag "--${name}"\n\n Expected one of: ${choicesStr}\n Received: "${value}"`;
|
|
183
|
+
if (suggestion) {
|
|
184
|
+
msg += `\n\n Did you mean "${suggestion}"?`;
|
|
185
|
+
}
|
|
186
|
+
throw new ParseError(msg);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Custom validator
|
|
190
|
+
if (def.validate) {
|
|
191
|
+
const result = def.validate(value);
|
|
192
|
+
if (result === false) {
|
|
193
|
+
throw new ParseError(`Validation failed for flag "--${name}"`);
|
|
194
|
+
}
|
|
195
|
+
if (typeof result === "string") {
|
|
196
|
+
throw new ParseError(`Validation failed for flag "--${name}": ${result}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// ─── Error Formatting ───
|
|
201
|
+
function formatMissingArg(name, def, cmd) {
|
|
202
|
+
let msg = `Missing required argument "${name}"`;
|
|
203
|
+
if (def.description) {
|
|
204
|
+
msg += `\n\n ${def.description}`;
|
|
205
|
+
}
|
|
206
|
+
const missingArgChoices = def.choices;
|
|
207
|
+
if (missingArgChoices && missingArgChoices.length > 0) {
|
|
208
|
+
msg += `\n Expected one of: ${missingArgChoices.join(", ")}`;
|
|
209
|
+
}
|
|
210
|
+
msg += `\n\n Usage: ${cmd.name} <${name}>`;
|
|
211
|
+
return msg;
|
|
212
|
+
}
|
|
213
|
+
function formatMissingFlag(name, def) {
|
|
214
|
+
let msg = `Missing required flag "--${name}"`;
|
|
215
|
+
if (def.description) {
|
|
216
|
+
msg += `\n\n ${def.description}`;
|
|
217
|
+
}
|
|
218
|
+
return msg;
|
|
219
|
+
}
|
|
220
|
+
// ─── Utilities ───
|
|
221
|
+
/**
|
|
222
|
+
* Find the closest match to `input` from `candidates` using Levenshtein distance.
|
|
223
|
+
* Returns null if no candidate is close enough (distance > 3).
|
|
224
|
+
*/
|
|
225
|
+
function findClosest(input, candidates) {
|
|
226
|
+
let bestMatch = null;
|
|
227
|
+
let bestDistance = Number.POSITIVE_INFINITY;
|
|
228
|
+
for (const candidate of candidates) {
|
|
229
|
+
const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());
|
|
230
|
+
if (dist < bestDistance) {
|
|
231
|
+
bestDistance = dist;
|
|
232
|
+
bestMatch = candidate;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return bestDistance <= 3 ? bestMatch : null;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Levenshtein distance between two strings.
|
|
239
|
+
*/
|
|
240
|
+
export function levenshtein(a, b) {
|
|
241
|
+
const m = a.length;
|
|
242
|
+
const n = b.length;
|
|
243
|
+
// Use a single-row DP approach for space efficiency
|
|
244
|
+
const row = Array.from({ length: n + 1 }, (_, i) => i);
|
|
245
|
+
for (let i = 1; i <= m; i++) {
|
|
246
|
+
let prev = i;
|
|
247
|
+
for (let j = 1; j <= n; j++) {
|
|
248
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
249
|
+
const val = Math.min(row[j] + 1, // deletion
|
|
250
|
+
prev + 1, // insertion
|
|
251
|
+
row[j - 1] + cost);
|
|
252
|
+
row[j - 1] = prev;
|
|
253
|
+
prev = val;
|
|
254
|
+
}
|
|
255
|
+
row[n] = prev;
|
|
256
|
+
}
|
|
257
|
+
return row[n];
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/command/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Command } from "../types/command.js";
|
|
2
|
+
export interface RouteResult {
|
|
3
|
+
/** The matched command (null if not found) */
|
|
4
|
+
command: Command | null;
|
|
5
|
+
/** Remaining argv after stripping command tokens */
|
|
6
|
+
argv: string[];
|
|
7
|
+
/** Suggestions if command was not found */
|
|
8
|
+
suggestions: CommandSuggestion[];
|
|
9
|
+
}
|
|
10
|
+
export interface CommandSuggestion {
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
distance: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Route argv to a registered command.
|
|
17
|
+
*
|
|
18
|
+
* Algorithm:
|
|
19
|
+
* 1. Split argv into tokens
|
|
20
|
+
* 2. Try exact match (including aliases)
|
|
21
|
+
* 3. Try subcommand matching (e.g., ["db", "migrate"] → db.subcommands.migrate)
|
|
22
|
+
* 4. If no match, compute fuzzy suggestions
|
|
23
|
+
* 5. Return { command, argv, suggestions }
|
|
24
|
+
*/
|
|
25
|
+
export declare function route(argv: string[], commands: Command[]): RouteResult;
|
|
26
|
+
/**
|
|
27
|
+
* Flatten all commands (including subcommands) into a flat list.
|
|
28
|
+
* Useful for help generation.
|
|
29
|
+
*/
|
|
30
|
+
export declare function flattenCommands(commands: Command[], prefix?: string): Array<{
|
|
31
|
+
fullName: string;
|
|
32
|
+
command: Command;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/command/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,MAAM,WAAW,WAAW;IAC3B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,2CAA2C;IAC3C,WAAW,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAID;;;;;;;;;GASG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,WAAW,CA4BtE;AA+CD;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,SAAK,GACT,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAa/C"}
|