@c9up/ream 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/dist/Ignitor.d.ts +115 -7
- package/dist/Ignitor.d.ts.map +1 -1
- package/dist/Ignitor.js +233 -37
- package/dist/Ignitor.js.map +1 -1
- package/dist/console/BaseCommand.d.ts +217 -0
- package/dist/console/BaseCommand.d.ts.map +1 -0
- package/dist/console/BaseCommand.js +340 -0
- package/dist/console/BaseCommand.js.map +1 -0
- package/dist/console/Console.d.ts +86 -0
- package/dist/console/Console.d.ts.map +1 -0
- package/dist/console/Console.js +134 -0
- package/dist/console/Console.js.map +1 -0
- package/dist/console/ExceptionHandler.d.ts +28 -0
- package/dist/console/ExceptionHandler.d.ts.map +1 -0
- package/dist/console/ExceptionHandler.js +76 -0
- package/dist/console/ExceptionHandler.js.map +1 -0
- package/dist/console/HelpCommand.d.ts +16 -0
- package/dist/console/HelpCommand.d.ts.map +1 -0
- package/dist/console/HelpCommand.js +40 -0
- package/dist/console/HelpCommand.js.map +1 -0
- package/dist/console/IndexGenerator.d.ts +24 -0
- package/dist/console/IndexGenerator.d.ts.map +1 -0
- package/dist/console/IndexGenerator.js +65 -0
- package/dist/console/IndexGenerator.js.map +1 -0
- package/dist/console/Kernel.d.ts +298 -0
- package/dist/console/Kernel.d.ts.map +1 -0
- package/dist/console/Kernel.js +1120 -0
- package/dist/console/Kernel.js.map +1 -0
- package/dist/console/ListCommand.d.ts +18 -0
- package/dist/console/ListCommand.d.ts.map +1 -0
- package/dist/console/ListCommand.js +60 -0
- package/dist/console/ListCommand.js.map +1 -0
- package/dist/console/assertions.d.ts +20 -0
- package/dist/console/assertions.d.ts.map +1 -0
- package/dist/console/assertions.js +84 -0
- package/dist/console/assertions.js.map +1 -0
- package/dist/console/cliui.d.ts +248 -0
- package/dist/console/cliui.d.ts.map +1 -0
- package/dist/console/cliui.js +587 -0
- package/dist/console/cliui.js.map +1 -0
- package/dist/console/decorators.d.ts +90 -0
- package/dist/console/decorators.d.ts.map +1 -0
- package/dist/console/decorators.js +142 -0
- package/dist/console/decorators.js.map +1 -0
- package/dist/console/index.d.ts +32 -0
- package/dist/console/index.d.ts.map +1 -0
- package/dist/console/index.js +24 -0
- package/dist/console/index.js.map +1 -0
- package/dist/console/loaders.d.ts +52 -0
- package/dist/console/loaders.d.ts.map +1 -0
- package/dist/console/loaders.js +131 -0
- package/dist/console/loaders.js.map +1 -0
- package/dist/console/parser.d.ts +86 -0
- package/dist/console/parser.d.ts.map +1 -0
- package/dist/console/parser.js +440 -0
- package/dist/console/parser.js.map +1 -0
- package/dist/console/prompts.d.ts +124 -0
- package/dist/console/prompts.d.ts.map +1 -0
- package/dist/console/prompts.js +356 -0
- package/dist/console/prompts.js.map +1 -0
- package/dist/console/tracing.d.ts +17 -0
- package/dist/console/tracing.d.ts.map +1 -0
- package/dist/console/tracing.js +11 -0
- package/dist/console/tracing.js.map +1 -0
- package/dist/console/types.d.ts +255 -0
- package/dist/console/types.d.ts.map +1 -0
- package/dist/console/types.js +25 -0
- package/dist/console/types.js.map +1 -0
- package/dist/console/ui.d.ts +20 -0
- package/dist/console/ui.d.ts.map +1 -0
- package/dist/console/ui.js +31 -0
- package/dist/console/ui.js.map +1 -0
- package/dist/console/utils.d.ts +27 -0
- package/dist/console/utils.d.ts.map +1 -0
- package/dist/console/utils.js +56 -0
- package/dist/console/utils.js.map +1 -0
- package/dist/container/Container.d.ts.map +1 -1
- package/dist/container/Container.js +40 -12
- package/dist/container/Container.js.map +1 -1
- package/dist/container/types.d.ts +14 -2
- package/dist/container/types.d.ts.map +1 -1
- package/dist/decorators/Service.d.ts +7 -0
- package/dist/decorators/Service.d.ts.map +1 -1
- package/dist/decorators/Service.js +23 -3
- package/dist/decorators/Service.js.map +1 -1
- package/dist/errors/ReamError.d.ts +25 -0
- package/dist/errors/ReamError.d.ts.map +1 -1
- package/dist/errors/ReamError.js +5 -0
- package/dist/errors/ReamError.js.map +1 -1
- package/dist/errors/prettyPrintError.d.ts +9 -0
- package/dist/errors/prettyPrintError.d.ts.map +1 -0
- package/dist/errors/prettyPrintError.js +22 -0
- package/dist/errors/prettyPrintError.js.map +1 -0
- package/dist/index.d.ts +14 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/Pipeline.d.ts +29 -8
- package/dist/middleware/Pipeline.d.ts.map +1 -1
- package/dist/middleware/Pipeline.js +39 -1
- package/dist/middleware/Pipeline.js.map +1 -1
- package/dist/rpc/RpcRouter.d.ts.map +1 -1
- package/dist/rpc/RpcRouter.js +13 -2
- package/dist/rpc/RpcRouter.js.map +1 -1
- package/dist/services/app.d.ts +1 -1
- package/dist/services/app.js +1 -1
- package/dist/services/console.d.ts +21 -0
- package/dist/services/console.d.ts.map +1 -0
- package/dist/services/console.js +35 -0
- package/dist/services/console.js.map +1 -0
- package/dist/testing/ApiResponse.d.ts +218 -0
- package/dist/testing/ApiResponse.d.ts.map +1 -0
- package/dist/testing/ApiResponse.js +576 -0
- package/dist/testing/ApiResponse.js.map +1 -0
- package/dist/testing/RequestBuilder.d.ts +132 -72
- package/dist/testing/RequestBuilder.d.ts.map +1 -1
- package/dist/testing/RequestBuilder.js +389 -222
- package/dist/testing/RequestBuilder.js.map +1 -1
- package/dist/testing/TestClient.d.ts +34 -39
- package/dist/testing/TestClient.d.ts.map +1 -1
- package/dist/testing/TestClient.js +48 -56
- package/dist/testing/TestClient.js.map +1 -1
- package/dist/utils/Macroable.js +3 -3
- package/dist/utils/Macroable.js.map +1 -1
- package/events.darwin-arm64.node +0 -0
- package/events.darwin-x64.node +0 -0
- package/events.linux-arm64-gnu.node +0 -0
- package/events.linux-x64-gnu.node +0 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +15 -2
- package/scheduler.darwin-arm64.node +0 -0
- package/scheduler.darwin-x64.node +0 -0
- package/scheduler.linux-arm64-gnu.node +0 -0
- package/scheduler.linux-x64-gnu.node +0 -0
- package/scheduler.win32-x64-msvc.node +0 -0
- package/src/Ignitor.ts +340 -42
- package/src/console/BaseCommand.ts +467 -0
- package/src/console/Console.ts +174 -0
- package/src/console/ExceptionHandler.ts +91 -0
- package/src/console/HelpCommand.ts +37 -0
- package/src/console/IndexGenerator.ts +79 -0
- package/src/console/Kernel.ts +1382 -0
- package/src/console/ListCommand.ts +55 -0
- package/src/console/assertions.ts +114 -0
- package/src/console/cliui.ts +756 -0
- package/src/console/decorators.ts +199 -0
- package/src/console/index.ts +67 -0
- package/src/console/loaders.ts +145 -0
- package/src/console/parser.ts +598 -0
- package/src/console/prompts.ts +548 -0
- package/src/console/tracing.ts +22 -0
- package/src/console/types.ts +280 -0
- package/src/console/ui.ts +37 -0
- package/src/console/utils.ts +69 -0
- package/src/container/Container.ts +55 -13
- package/src/container/types.ts +15 -2
- package/src/decorators/Service.ts +28 -3
- package/src/errors/ReamError.ts +31 -0
- package/src/errors/prettyPrintError.ts +20 -0
- package/src/index.ts +30 -4
- package/src/middleware/Pipeline.ts +76 -5
- package/src/rpc/RpcRouter.ts +16 -2
- package/src/services/app.ts +1 -1
- package/src/services/console.ts +42 -0
- package/src/testing/ApiResponse.ts +691 -0
- package/src/testing/RequestBuilder.ts +498 -275
- package/src/testing/TestClient.ts +63 -86
- package/src/utils/Macroable.ts +3 -3
- package/dist/console/CommandRunner.d.ts +0 -18
- package/dist/console/CommandRunner.d.ts.map +0 -1
- package/dist/console/CommandRunner.js +0 -65
- package/dist/console/CommandRunner.js.map +0 -1
- package/src/console/CommandRunner.ts +0 -82
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* argv parser for console commands.
|
|
3
|
+
*
|
|
4
|
+
* Metadata-driven, unlike the naive splitter it replaces: knowing a flag's
|
|
5
|
+
* declared type is what makes `--email hugo@example.com` work. Without it the
|
|
6
|
+
* parser cannot tell a value-taking flag from a boolean one, so it has to treat
|
|
7
|
+
* every `--flag` as `true` and let the value fall through to the positionals —
|
|
8
|
+
* which is exactly how the previous implementation silently dropped arguments.
|
|
9
|
+
*
|
|
10
|
+
* Supported forms (Console parity):
|
|
11
|
+
* --flag=value --flag value --flag (boolean) --no-flag (boolean false)
|
|
12
|
+
* -f value -f -abc (grouped boolean aliases)
|
|
13
|
+
* -- everything after it is positional, never a flag
|
|
14
|
+
* repeated flags accumulate for `@flags.array()`
|
|
15
|
+
*/
|
|
16
|
+
import { ReamError } from '../errors/ReamError.js';
|
|
17
|
+
/**
|
|
18
|
+
* The parser as an object (Console `Parser`).
|
|
19
|
+
*
|
|
20
|
+
* Same work as {@link parseArgv}, held in a shape that can be passed around and
|
|
21
|
+
* reused — which is how Console's kernel and its ported code hold it.
|
|
22
|
+
*/
|
|
23
|
+
export class Parser {
|
|
24
|
+
#options;
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.#options = options;
|
|
27
|
+
}
|
|
28
|
+
parse(argv) {
|
|
29
|
+
return parseArgv(typeof argv === 'string' ? argv.split(' ').filter(Boolean) : argv, this.#options);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function parseArgv(argv, options = {}) {
|
|
33
|
+
const declaredFlags = options.flags ?? [];
|
|
34
|
+
const declaredArgs = options.args ?? [];
|
|
35
|
+
const where = options.commandName ? ` for "${options.commandName}"` : '';
|
|
36
|
+
const byName = new Map();
|
|
37
|
+
const byAlias = new Map();
|
|
38
|
+
for (const flag of declaredFlags) {
|
|
39
|
+
byName.set(flag.flagName, flag);
|
|
40
|
+
for (const alias of flag.alias)
|
|
41
|
+
byAlias.set(alias, flag);
|
|
42
|
+
}
|
|
43
|
+
const positionals = [];
|
|
44
|
+
/** Collected per property so repeated flags can accumulate into arrays. */
|
|
45
|
+
const collected = new Map();
|
|
46
|
+
const unknown = {};
|
|
47
|
+
const push = (meta, value) => {
|
|
48
|
+
const existing = collected.get(meta.propertyName);
|
|
49
|
+
if (existing)
|
|
50
|
+
existing.push(value);
|
|
51
|
+
else
|
|
52
|
+
collected.set(meta.propertyName, [value]);
|
|
53
|
+
};
|
|
54
|
+
/** Record the flag as seen without attaching a value to it. */
|
|
55
|
+
const mention = (meta) => {
|
|
56
|
+
if (!collected.has(meta.propertyName))
|
|
57
|
+
collected.set(meta.propertyName, []);
|
|
58
|
+
};
|
|
59
|
+
let sawTerminator = false;
|
|
60
|
+
for (let i = 0; i < argv.length; i++) {
|
|
61
|
+
const token = argv[i];
|
|
62
|
+
if (sawTerminator) {
|
|
63
|
+
positionals.push(token);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (token === '--') {
|
|
67
|
+
sawTerminator = true;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// --long, --long=value, --no-long
|
|
71
|
+
if (token.startsWith('--')) {
|
|
72
|
+
const body = token.slice(2);
|
|
73
|
+
const eq = body.indexOf('=');
|
|
74
|
+
const name = eq === -1 ? body : body.slice(0, eq);
|
|
75
|
+
const inline = eq === -1 ? undefined : body.slice(eq + 1);
|
|
76
|
+
// `--no-x` negates a declared boolean. Checked before the plain lookup so
|
|
77
|
+
// a genuine flag literally named `no-cache` still wins.
|
|
78
|
+
const negated = !byName.has(name) && name.startsWith('no-') ? byName.get(name.slice(3)) : undefined;
|
|
79
|
+
if (negated && negated.type === 'boolean') {
|
|
80
|
+
if (inline !== undefined) {
|
|
81
|
+
throw invalidNegation(token, where);
|
|
82
|
+
}
|
|
83
|
+
push(negated, false);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const meta = byName.get(name);
|
|
87
|
+
if (!meta) {
|
|
88
|
+
if (!options.allowUnknownFlags)
|
|
89
|
+
throw unknownFlag(`--${name}`, where, declaredFlags);
|
|
90
|
+
// An undeclared flag has no type to go on, so `--foo bar` is read the
|
|
91
|
+
// way a shell parser does: the next token is its value unless it looks
|
|
92
|
+
// like another flag. Treating it as a bare boolean would drop `bar`
|
|
93
|
+
// entirely — a proxy command would silently lose its arguments.
|
|
94
|
+
if (inline !== undefined) {
|
|
95
|
+
unknown[name] = inline;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const next = argv[i + 1];
|
|
99
|
+
if (next !== undefined && (!next.startsWith('-') || next === '-')) {
|
|
100
|
+
unknown[name] = next;
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
unknown[name] = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
i = consume({ meta, value: inline }, argv, i, { push, mention }, where);
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
// -a, -a value, -abc (grouped booleans)
|
|
113
|
+
if (token.startsWith('-') && token.length > 1) {
|
|
114
|
+
const body = token.slice(1);
|
|
115
|
+
const eq = body.indexOf('=');
|
|
116
|
+
const chars = eq === -1 ? body : body.slice(0, eq);
|
|
117
|
+
const inline = eq === -1 ? undefined : body.slice(eq + 1);
|
|
118
|
+
if (chars.length === 1) {
|
|
119
|
+
const meta = byAlias.get(chars);
|
|
120
|
+
if (!meta) {
|
|
121
|
+
if (!options.allowUnknownFlags)
|
|
122
|
+
throw unknownFlag(`-${chars}`, where, declaredFlags);
|
|
123
|
+
if (inline !== undefined) {
|
|
124
|
+
unknown[chars] = inline;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const next = argv[i + 1];
|
|
128
|
+
if (next !== undefined && (!next.startsWith('-') || next === '-')) {
|
|
129
|
+
unknown[chars] = next;
|
|
130
|
+
i++;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
unknown[chars] = true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
i = consume({ meta, value: inline }, argv, i, { push, mention }, where);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// A group like `-rs` can only be booleans: there is no way to attach a
|
|
142
|
+
// value to more than one flag at a time.
|
|
143
|
+
for (const char of chars) {
|
|
144
|
+
const meta = byAlias.get(char);
|
|
145
|
+
if (!meta) {
|
|
146
|
+
if (!options.allowUnknownFlags)
|
|
147
|
+
throw unknownFlag(`-${char}`, where, declaredFlags);
|
|
148
|
+
unknown[char] = true;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (meta.type !== 'boolean') {
|
|
152
|
+
throw new ReamError('E_CONSOLE_INVALID_FLAG_GROUP', `Cannot group "-${char}" with other flags${where} — "--${meta.flagName}" expects a value.`, { hint: `Pass it on its own: -${char} <value>` });
|
|
153
|
+
}
|
|
154
|
+
push(meta, true);
|
|
155
|
+
}
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
positionals.push(token);
|
|
159
|
+
}
|
|
160
|
+
const extraArgs = [];
|
|
161
|
+
const strict = options.validate !== false;
|
|
162
|
+
const flags = applyParse(declaredFlags, materialiseFlags(declaredFlags, collected, unknown, where, strict));
|
|
163
|
+
const args = applyParse(declaredArgs, materialiseArgs(declaredArgs, positionals, where, options.allowUnknownFlags === true, extraArgs, strict));
|
|
164
|
+
// Rekeyed into Console's shape only here: defaults and `parse` are applied per
|
|
165
|
+
// DECLARATION, which needs the property name, while what comes out describes
|
|
166
|
+
// what was typed — positionals as a list, flags under their CLI name.
|
|
167
|
+
const byFlagName = { ...unknown };
|
|
168
|
+
for (const meta of declaredFlags) {
|
|
169
|
+
if (meta.propertyName in flags)
|
|
170
|
+
byFlagName[meta.flagName] = flags[meta.propertyName];
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
unknownFlags: Object.keys(unknown),
|
|
174
|
+
flags: byFlagName,
|
|
175
|
+
args: declaredArgs.map((meta) => args[meta.propertyName]),
|
|
176
|
+
extraArgs,
|
|
177
|
+
_: extraArgs,
|
|
178
|
+
nodeArgs: [],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Run each declared input's `parse` callback over the materialised value.
|
|
183
|
+
*
|
|
184
|
+
* Applied last, on the already-typed value, so `parse` receives a number for a
|
|
185
|
+
* number flag rather than the raw token — and only for inputs that were
|
|
186
|
+
* actually provided or defaulted, never for an absent optional one.
|
|
187
|
+
*/
|
|
188
|
+
function applyParse(declared, values) {
|
|
189
|
+
for (const meta of declared) {
|
|
190
|
+
if (meta.parse === undefined)
|
|
191
|
+
continue;
|
|
192
|
+
const current = values[meta.propertyName];
|
|
193
|
+
if (current === undefined)
|
|
194
|
+
continue;
|
|
195
|
+
Reflect.set(values, meta.propertyName, Reflect.apply(meta.parse, undefined, [current]));
|
|
196
|
+
}
|
|
197
|
+
return values;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Attach a value to a flag, pulling the next argv token when the value was not
|
|
201
|
+
* written inline. Returns the new cursor position.
|
|
202
|
+
*/
|
|
203
|
+
function consume(raw, argv, index, collect, where) {
|
|
204
|
+
const { push, mention } = collect;
|
|
205
|
+
const { meta, value } = raw;
|
|
206
|
+
if (meta.type === 'boolean') {
|
|
207
|
+
if (value === undefined) {
|
|
208
|
+
push(meta, true);
|
|
209
|
+
return index;
|
|
210
|
+
}
|
|
211
|
+
// `--force=false` is explicit enough to honour; anything else is a typo.
|
|
212
|
+
if (value === 'true' || value === 'false') {
|
|
213
|
+
push(meta, value === 'true');
|
|
214
|
+
return index;
|
|
215
|
+
}
|
|
216
|
+
throw new ReamError('E_CONSOLE_INVALID_FLAG_VALUE', `Flag "--${meta.flagName}"${where} is a boolean and cannot take the value "${value}".`, { hint: `Use --${meta.flagName} or --no-${meta.flagName}` });
|
|
217
|
+
}
|
|
218
|
+
if (value !== undefined) {
|
|
219
|
+
push(meta, value);
|
|
220
|
+
return index;
|
|
221
|
+
}
|
|
222
|
+
// Value-taking flag with no inline value: the next token is it. A token that
|
|
223
|
+
// itself looks like a flag is NOT consumed — `--email --name x` is a mistake
|
|
224
|
+
// worth reporting, not an email of "--name".
|
|
225
|
+
const next = argv[index + 1];
|
|
226
|
+
if (next === undefined || (next.startsWith('-') && next !== '-')) {
|
|
227
|
+
// Unless the flag says an empty value is meaningful (Console
|
|
228
|
+
// `allowEmptyValue`), in which case the mention itself is the value.
|
|
229
|
+
if (meta.allowEmptyValue === true) {
|
|
230
|
+
// An array flag with nothing behind it is an EMPTY list, not a list
|
|
231
|
+
// holding one empty string — `mention` records it without a value.
|
|
232
|
+
if (meta.type === 'array')
|
|
233
|
+
mention(meta);
|
|
234
|
+
else
|
|
235
|
+
push(meta, '');
|
|
236
|
+
return index;
|
|
237
|
+
}
|
|
238
|
+
throw new ReamError('E_CONSOLE_MISSING_FLAG_VALUE', `Flag "--${meta.flagName}"${where} expects a value.`, { hint: `Example: --${meta.flagName}=<value>` });
|
|
239
|
+
}
|
|
240
|
+
push(meta, next);
|
|
241
|
+
return index + 1;
|
|
242
|
+
}
|
|
243
|
+
/** Apply types, defaults and required checks to the collected flag values. */
|
|
244
|
+
function materialiseFlags(declared, collected, unknown, where, strict) {
|
|
245
|
+
const out = { ...unknown };
|
|
246
|
+
for (const meta of declared) {
|
|
247
|
+
const values = collected.get(meta.propertyName);
|
|
248
|
+
if (values === undefined) {
|
|
249
|
+
if (meta.default !== undefined)
|
|
250
|
+
out[meta.propertyName] = meta.default;
|
|
251
|
+
else if (meta.required && strict) {
|
|
252
|
+
throw new ReamError('E_CONSOLE_MISSING_FLAG', `Missing required flag "--${meta.flagName}"${where}.`);
|
|
253
|
+
}
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
switch (meta.type) {
|
|
257
|
+
case 'array':
|
|
258
|
+
out[meta.propertyName] = values.map(String);
|
|
259
|
+
break;
|
|
260
|
+
case 'number': {
|
|
261
|
+
// Last one wins for scalars, matching how shells are normally used.
|
|
262
|
+
const last = String(values[values.length - 1]);
|
|
263
|
+
const parsed = Number(last);
|
|
264
|
+
if (last.trim() === '' || Number.isNaN(parsed)) {
|
|
265
|
+
throw new ReamError('E_CONSOLE_INVALID_FLAG_VALUE', `Flag "--${meta.flagName}"${where} expects a number, got "${last}".`);
|
|
266
|
+
}
|
|
267
|
+
out[meta.propertyName] = parsed;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
case 'boolean':
|
|
271
|
+
out[meta.propertyName] = Boolean(values[values.length - 1]);
|
|
272
|
+
break;
|
|
273
|
+
default:
|
|
274
|
+
out[meta.propertyName] = String(values[values.length - 1]);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return out;
|
|
278
|
+
}
|
|
279
|
+
/** Map positionals onto declared arguments, honouring `@args.spread()`. */
|
|
280
|
+
function materialiseArgs(declared, positionals, where, allowExtra, extraArgs, strict) {
|
|
281
|
+
const out = {};
|
|
282
|
+
let cursor = 0;
|
|
283
|
+
for (const meta of declared) {
|
|
284
|
+
if (meta.type === 'spread') {
|
|
285
|
+
const rest = positionals.slice(cursor);
|
|
286
|
+
cursor = positionals.length;
|
|
287
|
+
if (rest.length === 0) {
|
|
288
|
+
// No default and nothing to collect: the argument is UNDEFINED, not an
|
|
289
|
+
// empty list (Console). A command that distinguishes "not given" from
|
|
290
|
+
// "given empty" must be able to tell them apart.
|
|
291
|
+
if (meta.default !== undefined)
|
|
292
|
+
out[meta.propertyName] = meta.default;
|
|
293
|
+
else if (meta.required && strict)
|
|
294
|
+
throw missingArgument(meta, where);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
out[meta.propertyName] = rest;
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
const value = positionals[cursor];
|
|
301
|
+
cursor++;
|
|
302
|
+
if (value === undefined) {
|
|
303
|
+
if (meta.default !== undefined)
|
|
304
|
+
out[meta.propertyName] = meta.default;
|
|
305
|
+
else if (meta.required && strict)
|
|
306
|
+
throw missingArgument(meta, where);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
// An empty positional is nearly always a shell variable that did not
|
|
310
|
+
// expand, so it is reported rather than accepted (Console) — unless the
|
|
311
|
+
// argument declares that an empty value means something.
|
|
312
|
+
if (value === '' && meta.allowEmptyValue !== true && strict) {
|
|
313
|
+
throw new ReamError('E_CONSOLE_MISSING_ARGUMENT_VALUE', `Missing value for argument "${meta.argumentName}"${where}.`);
|
|
314
|
+
}
|
|
315
|
+
out[meta.propertyName] = value;
|
|
316
|
+
}
|
|
317
|
+
// Anything left over was never asked for. Swallowing it hides a typo:
|
|
318
|
+
// `greet john extra` would run as `greet john`, silently dropping the rest.
|
|
319
|
+
// A `spread` argument consumes the tail, so this only fires without one.
|
|
320
|
+
if (cursor < positionals.length) {
|
|
321
|
+
const extra = positionals.slice(cursor);
|
|
322
|
+
// A proxy command (allowUnknownFlags) keeps them — forwarding them is its
|
|
323
|
+
// whole purpose. Anything else reports them, because swallowing a
|
|
324
|
+
// positional hides a typo.
|
|
325
|
+
if (allowExtra) {
|
|
326
|
+
extraArgs.push(...extra);
|
|
327
|
+
return out;
|
|
328
|
+
}
|
|
329
|
+
throw new ReamError('E_CONSOLE_UNEXPECTED_ARGUMENT', `Unexpected argument${extra.length > 1 ? 's' : ''} ${extra.map((value) => `"${value}"`).join(', ')}${where}.`, {
|
|
330
|
+
hint: declared.length === 0
|
|
331
|
+
? 'This command takes no positional arguments.'
|
|
332
|
+
: `It takes ${declared.length}: ${declared.map((arg) => arg.argumentName).join(', ')}.`,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return out;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Check a parsed input against a command's declarations (Console `validate`).
|
|
339
|
+
*
|
|
340
|
+
* Separate from parsing because the ORDER matters: Console runs the global-flag
|
|
341
|
+
* listeners between the two, which is what lets `--help` work on a command
|
|
342
|
+
* whose flags are required. One implementation, called by the kernel and by
|
|
343
|
+
* `BaseCommand.validate()`.
|
|
344
|
+
*
|
|
345
|
+
* Positionals are accepted as a list (Console's shape) or keyed by property name
|
|
346
|
+
* (what a hand-built Ream input holds).
|
|
347
|
+
*/
|
|
348
|
+
export function validateParsed(parsed, declarations) {
|
|
349
|
+
const where = declarations.commandName ? ` for "${declarations.commandName}"` : '';
|
|
350
|
+
const byPosition = Array.isArray(parsed.args) ? parsed.args : undefined;
|
|
351
|
+
const byName = byPosition === undefined ? { ...parsed.args } : {};
|
|
352
|
+
(declarations.args ?? []).forEach((arg, index) => {
|
|
353
|
+
const value = byPosition === undefined ? byName[arg.propertyName] : byPosition[index];
|
|
354
|
+
if (arg.required && value === undefined)
|
|
355
|
+
throw missingArgument(arg, where);
|
|
356
|
+
if (value === undefined || arg.allowEmptyValue === true)
|
|
357
|
+
return;
|
|
358
|
+
if (value === '' || (Array.isArray(value) && value.length === 0)) {
|
|
359
|
+
throw new ReamError('E_CONSOLE_MISSING_ARGUMENT_VALUE', `Missing value for argument "${arg.argumentName}"${where}.`);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
const unknown = parsed.unknownFlags ?? [];
|
|
363
|
+
if (declarations.allowUnknownFlags !== true && unknown.length > 0) {
|
|
364
|
+
const flag = unknown[0] ?? '';
|
|
365
|
+
throw new ReamError('E_CONSOLE_UNKNOWN_FLAG', `Unknown flag "${flag.length === 1 ? `-${flag}` : `--${flag}`}"${where}.`);
|
|
366
|
+
}
|
|
367
|
+
const flags = parsed.flags ?? {};
|
|
368
|
+
for (const flag of declarations.flags ?? []) {
|
|
369
|
+
// Keyed by flag name (Console, and what the parser returns) or by property
|
|
370
|
+
// name — a hand-built input must validate whichever shape it was written in.
|
|
371
|
+
const key = Object.hasOwn(flags, flag.flagName) ? flag.flagName : flag.propertyName;
|
|
372
|
+
const mentioned = Object.hasOwn(flags, key);
|
|
373
|
+
const value = flags[key];
|
|
374
|
+
if (flag.required && !mentioned) {
|
|
375
|
+
throw new ReamError('E_CONSOLE_MISSING_FLAG', `Missing required flag "--${flag.flagName}"${where}.`);
|
|
376
|
+
}
|
|
377
|
+
if (!mentioned || flag.allowEmptyValue === true)
|
|
378
|
+
continue;
|
|
379
|
+
if (flag.type === 'number') {
|
|
380
|
+
if (value === undefined || Number.isNaN(value)) {
|
|
381
|
+
throw new ReamError('E_CONSOLE_INVALID_FLAG_VALUE', `Flag "--${flag.flagName}"${where} expects a number, got "${String(value)}".`);
|
|
382
|
+
}
|
|
383
|
+
continue;
|
|
384
|
+
}
|
|
385
|
+
// A mentioned string/array flag with nothing behind it: `--name` alone
|
|
386
|
+
// yields '' from a parser, and an empty array for a repeatable flag.
|
|
387
|
+
if (flag.type === 'boolean')
|
|
388
|
+
continue;
|
|
389
|
+
if (value === '' || (Array.isArray(value) && value.length === 0)) {
|
|
390
|
+
throw new ReamError('E_CONSOLE_MISSING_FLAG_VALUE', `Missing value for flag "--${flag.flagName}"${where}.`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Assign the parsed values to the properties they were declared on.
|
|
396
|
+
*
|
|
397
|
+
* The single hydration path: `BaseCommand.hydrate()` calls it, and so does the
|
|
398
|
+
* kernel for a command declared structurally, which has no `hydrate()` of its
|
|
399
|
+
* own. Both input shapes are accepted — positionals as a list (what the parser
|
|
400
|
+
* now returns, and Console's shape) or keyed by property name, flags under their
|
|
401
|
+
* flag name or their property name — because a hand-built input is a documented
|
|
402
|
+
* use case.
|
|
403
|
+
*/
|
|
404
|
+
export function assignParsedValues(target, declaredArgs, declaredFlags, parsed) {
|
|
405
|
+
const byPosition = Array.isArray(parsed.args) ? parsed.args : undefined;
|
|
406
|
+
const byArgName = byPosition === undefined ? { ...parsed.args } : {};
|
|
407
|
+
declaredArgs.forEach((meta, index) => {
|
|
408
|
+
define(target, meta.propertyName, byPosition?.[index] ?? byArgName[meta.propertyName]);
|
|
409
|
+
});
|
|
410
|
+
for (const meta of declaredFlags) {
|
|
411
|
+
const key = Object.hasOwn(parsed.flags, meta.flagName) ? meta.flagName : meta.propertyName;
|
|
412
|
+
define(target, meta.propertyName, parsed.flags[key]);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/** Writable and enumerable, as Console's `hydrate` defines them. */
|
|
416
|
+
function define(target, property, value) {
|
|
417
|
+
Object.defineProperty(target, property, {
|
|
418
|
+
value,
|
|
419
|
+
enumerable: true,
|
|
420
|
+
writable: true,
|
|
421
|
+
configurable: true,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Exported so `BaseCommand.validate()` reports a missing argument with the very
|
|
426
|
+
* message the parser uses — two wordings for one rule is how they drift apart.
|
|
427
|
+
*/
|
|
428
|
+
export function missingArgument(meta, where = '') {
|
|
429
|
+
return new ReamError('E_CONSOLE_MISSING_ARGUMENT', `Missing required argument "${meta.argumentName}"${where}.`, meta.description ? { hint: meta.description } : undefined);
|
|
430
|
+
}
|
|
431
|
+
function unknownFlag(token, where, declared) {
|
|
432
|
+
const known = declared.map((f) => `--${f.flagName}`).join(', ');
|
|
433
|
+
return new ReamError('E_CONSOLE_UNKNOWN_FLAG', `Unknown flag "${token}"${where}.`, {
|
|
434
|
+
hint: known.length > 0 ? `Known flags: ${known}` : 'This command declares no flags.',
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
function invalidNegation(token, where) {
|
|
438
|
+
return new ReamError('E_CONSOLE_INVALID_FLAG_VALUE', `"${token}"${where} negates a boolean flag and cannot carry a value.`);
|
|
439
|
+
}
|
|
440
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/console/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive prompts (Console / `@poppinss/prompts` surface).
|
|
3
|
+
*
|
|
4
|
+
* Dependency-free, which sets one deliberate boundary: selection prompts are
|
|
5
|
+
* answered by typing a number or a name, not by arrow-key navigation. Doing
|
|
6
|
+
* that properly means raw mode, cursor control and redraw handling — a terminal
|
|
7
|
+
* widget toolkit, which is what enquirer is. Everything else matches Console: the
|
|
8
|
+
* method names, the option bag (`validate` / `default` / `hint` / `name` /
|
|
9
|
+
* `result` / `format`), and the trap API that makes prompts testable.
|
|
10
|
+
*/
|
|
11
|
+
/** A selectable option — a bare string, or a value with its display text. */
|
|
12
|
+
export type PromptChoice = string | {
|
|
13
|
+
name: string;
|
|
14
|
+
message?: string;
|
|
15
|
+
hint?: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Options for the selection prompts.
|
|
19
|
+
*
|
|
20
|
+
* `default` is an INDEX here, not a value — that is how Adonis spells it for
|
|
21
|
+
* `choice` / `multiple` / `autocomplete`.
|
|
22
|
+
*/
|
|
23
|
+
export interface SelectPromptOptions extends Omit<PromptOptions, 'default'> {
|
|
24
|
+
default?: number | readonly number[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Options for `multiple()`.
|
|
28
|
+
*
|
|
29
|
+
* `validate` and `result` receive the whole selection, not each item: the
|
|
30
|
+
* prompt's value IS the array, and per-item calls would make a rule like "pick
|
|
31
|
+
* at least two" impossible to express.
|
|
32
|
+
*/
|
|
33
|
+
export interface MultiplePromptOptions extends Omit<SelectPromptOptions, 'validate' | 'result' | 'format'> {
|
|
34
|
+
validate?: (values: string[]) => boolean | string | Promise<boolean | string>;
|
|
35
|
+
result?: (values: string[]) => unknown;
|
|
36
|
+
}
|
|
37
|
+
export interface PromptOptions<T = string> {
|
|
38
|
+
/** Used when the answer is empty. */
|
|
39
|
+
default?: T;
|
|
40
|
+
/** Identifies the prompt for {@link Prompt.trap}. Defaults to the message. */
|
|
41
|
+
name?: string;
|
|
42
|
+
/** Shown next to the question. */
|
|
43
|
+
hint?: string;
|
|
44
|
+
/** Return `true` to accept, or a string describing what is wrong. */
|
|
45
|
+
validate?: (value: T) => boolean | string | Promise<boolean | string>;
|
|
46
|
+
/** Transforms the value that is returned. */
|
|
47
|
+
result?: (value: T) => unknown;
|
|
48
|
+
/**
|
|
49
|
+
* Formats what is echoed as the user types — display only.
|
|
50
|
+
*
|
|
51
|
+
* It does NOT change the value the prompt returns: Console documents it as
|
|
52
|
+
* "affecting only the CLI output", and treating it as a transform would make
|
|
53
|
+
* a ported command receive a different value. Use `result` to transform.
|
|
54
|
+
*/
|
|
55
|
+
format?: (value: T) => T;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Scripted answer builder — Console's `prompt.trap(name)`.
|
|
59
|
+
*
|
|
60
|
+
* Without it a command that asks anything is untestable: the test would either
|
|
61
|
+
* hang on a prompt or need a fake terminal.
|
|
62
|
+
*/
|
|
63
|
+
export declare class PromptTrap {
|
|
64
|
+
#private;
|
|
65
|
+
constructor(install: (value: unknown) => void);
|
|
66
|
+
/** Answer a text/secure prompt with this value. */
|
|
67
|
+
replyWith(value: string): void;
|
|
68
|
+
/** Answer a confirm/toggle prompt with yes. */
|
|
69
|
+
accept(): void;
|
|
70
|
+
/** Answer a confirm/toggle prompt with no. */
|
|
71
|
+
reject(): void;
|
|
72
|
+
/** Pick the option at this index (choice / autocomplete). */
|
|
73
|
+
chooseOption(index?: number): void;
|
|
74
|
+
/** Pick these indexes (multiple). */
|
|
75
|
+
chooseOptions(indexes: readonly number[]): void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Options for `confirm` / `toggle`. `result` may map the boolean to something
|
|
79
|
+
* else, which is why the return type follows it (Console documents `result` for
|
|
80
|
+
* every prompt).
|
|
81
|
+
*/
|
|
82
|
+
export interface BooleanPromptOptions<R = boolean> extends Omit<PromptOptions<boolean>, 'result' | 'format'> {
|
|
83
|
+
result?: (value: boolean) => R;
|
|
84
|
+
}
|
|
85
|
+
export declare class Prompt {
|
|
86
|
+
#private;
|
|
87
|
+
/**
|
|
88
|
+
* Script the next answer for the prompt registered under `name`
|
|
89
|
+
* (`options.name`, defaulting to the message).
|
|
90
|
+
*/
|
|
91
|
+
trap(name: string): PromptTrap;
|
|
92
|
+
/** Traps that were installed but never reached — useful in assertions. */
|
|
93
|
+
get pendingTraps(): string[];
|
|
94
|
+
ask(message: string, options?: PromptOptions): Promise<unknown>;
|
|
95
|
+
/** Masked input, for passwords and tokens. */
|
|
96
|
+
secure(message: string, options?: PromptOptions): Promise<unknown>;
|
|
97
|
+
confirm(message: string, options?: BooleanPromptOptions): Promise<boolean>;
|
|
98
|
+
confirm<R>(message: string, options: BooleanPromptOptions<R>): Promise<R>;
|
|
99
|
+
/** Two custom labels instead of yes/no (Console `toggle`). */
|
|
100
|
+
toggle(message: string, labels?: readonly [string, string], options?: BooleanPromptOptions): Promise<boolean>;
|
|
101
|
+
toggle<R>(message: string, labels: readonly [string, string] | undefined, options: BooleanPromptOptions<R>): Promise<R>;
|
|
102
|
+
/** Pick one option (Console `choice`). */
|
|
103
|
+
choice(message: string, choices: readonly PromptChoice[], options?: SelectPromptOptions): Promise<unknown>;
|
|
104
|
+
/** Pick several options (Console `multiple`). */
|
|
105
|
+
multiple(message: string, choices: readonly PromptChoice[], options?: MultiplePromptOptions): Promise<unknown>;
|
|
106
|
+
/**
|
|
107
|
+
* Pick one option by typing part of its name (Console `autocomplete`).
|
|
108
|
+
*
|
|
109
|
+
* Substring matching rather than fuzzy scoring — predictable, and enough for
|
|
110
|
+
* the "too many options to list" case it exists for.
|
|
111
|
+
*/
|
|
112
|
+
autocomplete(message: string, choices: readonly PromptChoice[], options?: SelectPromptOptions & {
|
|
113
|
+
limit?: number;
|
|
114
|
+
}): Promise<unknown>;
|
|
115
|
+
/**
|
|
116
|
+
* Read one line from the terminal.
|
|
117
|
+
*
|
|
118
|
+
* `protected` on purpose: it is the single seam through which input enters,
|
|
119
|
+
* so a test (or a future non-readline frontend) can substitute it by
|
|
120
|
+
* subclassing instead of faking a TTY.
|
|
121
|
+
*/
|
|
122
|
+
protected readLine(query: string, masked?: boolean): Promise<string>;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/console/prompts.ts"],"names":[],"mappings":"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"}
|