@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,356 @@
|
|
|
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
|
+
import { stdin, stdout } from 'node:process';
|
|
12
|
+
import { createInterface } from 'node:readline';
|
|
13
|
+
import { ReamError } from '../errors/ReamError.js';
|
|
14
|
+
import { colourise } from './ui.js';
|
|
15
|
+
/**
|
|
16
|
+
* Scripted answer builder — Console's `prompt.trap(name)`.
|
|
17
|
+
*
|
|
18
|
+
* Without it a command that asks anything is untestable: the test would either
|
|
19
|
+
* hang on a prompt or need a fake terminal.
|
|
20
|
+
*/
|
|
21
|
+
export class PromptTrap {
|
|
22
|
+
#install;
|
|
23
|
+
constructor(install) {
|
|
24
|
+
this.#install = install;
|
|
25
|
+
}
|
|
26
|
+
/** Answer a text/secure prompt with this value. */
|
|
27
|
+
replyWith(value) {
|
|
28
|
+
this.#install(value);
|
|
29
|
+
}
|
|
30
|
+
/** Answer a confirm/toggle prompt with yes. */
|
|
31
|
+
accept() {
|
|
32
|
+
this.#install(true);
|
|
33
|
+
}
|
|
34
|
+
/** Answer a confirm/toggle prompt with no. */
|
|
35
|
+
reject() {
|
|
36
|
+
this.#install(false);
|
|
37
|
+
}
|
|
38
|
+
/** Pick the option at this index (choice / autocomplete). */
|
|
39
|
+
chooseOption(index = 0) {
|
|
40
|
+
this.#install({ index });
|
|
41
|
+
}
|
|
42
|
+
/** Pick these indexes (multiple). */
|
|
43
|
+
chooseOptions(indexes) {
|
|
44
|
+
this.#install({ indexes: [...indexes] });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class Prompt {
|
|
48
|
+
#traps = new Map();
|
|
49
|
+
/**
|
|
50
|
+
* Script the next answer for the prompt registered under `name`
|
|
51
|
+
* (`options.name`, defaulting to the message).
|
|
52
|
+
*/
|
|
53
|
+
trap(name) {
|
|
54
|
+
return new PromptTrap((value) => {
|
|
55
|
+
this.#traps.set(name, value);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** Traps that were installed but never reached — useful in assertions. */
|
|
59
|
+
get pendingTraps() {
|
|
60
|
+
return [...this.#traps.keys()];
|
|
61
|
+
}
|
|
62
|
+
async ask(message, options = {}) {
|
|
63
|
+
return this.#text(message, options, false);
|
|
64
|
+
}
|
|
65
|
+
/** Masked input, for passwords and tokens. */
|
|
66
|
+
async secure(message, options = {}) {
|
|
67
|
+
return this.#text(message, options, true);
|
|
68
|
+
}
|
|
69
|
+
async confirm(message, options = {}) {
|
|
70
|
+
return this.toggle(message, ['y', 'n'], options);
|
|
71
|
+
}
|
|
72
|
+
async toggle(message, labels = ['y', 'n'], options = {}) {
|
|
73
|
+
const trapped = this.#takeTrap(message, options.name);
|
|
74
|
+
if (trapped !== undefined) {
|
|
75
|
+
const value = Boolean(trapped);
|
|
76
|
+
await this.#assertTrapped(value, options);
|
|
77
|
+
return options.result === undefined ? value : options.result(value);
|
|
78
|
+
}
|
|
79
|
+
const fallback = options.default ?? false;
|
|
80
|
+
const yes = labels[0];
|
|
81
|
+
const no = labels[1];
|
|
82
|
+
const shown = fallback ? `${yes.toUpperCase()}/${no}` : `${yes}/${no.toUpperCase()}`;
|
|
83
|
+
for (;;) {
|
|
84
|
+
const answer = (await this.readLine(this.#label(message, options, `(${shown})`))).toLowerCase();
|
|
85
|
+
if (answer === '') {
|
|
86
|
+
const problem = await this.#check(fallback, options);
|
|
87
|
+
if (problem === undefined) {
|
|
88
|
+
return options.result === undefined ? fallback : options.result(fallback);
|
|
89
|
+
}
|
|
90
|
+
stdout.write(`${colourise(problem, 'yellow')}\n`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const affirmative = answer === yes.toLowerCase() || answer === 'yes' || answer === 'true';
|
|
94
|
+
const negative = answer === no.toLowerCase() || answer === 'no' || answer === 'false';
|
|
95
|
+
if (!affirmative && !negative) {
|
|
96
|
+
stdout.write(`${colourise(`Answer ${yes} or ${no}.`, 'yellow')}\n`);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const problem = await this.#check(affirmative, options);
|
|
100
|
+
if (problem !== undefined) {
|
|
101
|
+
stdout.write(`${colourise(problem, 'yellow')}\n`);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
return options.result === undefined ? affirmative : options.result(affirmative);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Pick one option (Console `choice`). */
|
|
108
|
+
async choice(message, choices, options = {}) {
|
|
109
|
+
const picked = await this.#select(message, choices, options, false);
|
|
110
|
+
return picked[0];
|
|
111
|
+
}
|
|
112
|
+
/** Pick several options (Console `multiple`). */
|
|
113
|
+
async multiple(message, choices, options = {}) {
|
|
114
|
+
const picked = await this.#select(message, choices, options, true);
|
|
115
|
+
return options.result ? options.result(picked.map(String)) : picked;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Pick one option by typing part of its name (Console `autocomplete`).
|
|
119
|
+
*
|
|
120
|
+
* Substring matching rather than fuzzy scoring — predictable, and enough for
|
|
121
|
+
* the "too many options to list" case it exists for.
|
|
122
|
+
*/
|
|
123
|
+
async autocomplete(message, choices, options = {}) {
|
|
124
|
+
const trapped = this.#takeTrap(message, options.name);
|
|
125
|
+
if (trapped !== undefined) {
|
|
126
|
+
const picked = this.#fromTrap(trapped, choices, false);
|
|
127
|
+
// Same rule as every other prompt: a scripted answer is held to the
|
|
128
|
+
// command's own validation, or the test proves nothing.
|
|
129
|
+
await this.#validateSelection(picked, options, false);
|
|
130
|
+
return this.#applyResult(picked[0], options);
|
|
131
|
+
}
|
|
132
|
+
const limit = options.limit ?? 10;
|
|
133
|
+
for (;;) {
|
|
134
|
+
const typed = await this.readLine(this.#label(message, options, '(type to filter)'));
|
|
135
|
+
const matches = choices.filter((choice) => nameOf(choice).toLowerCase().includes(typed.toLowerCase()));
|
|
136
|
+
if (matches.length === 0) {
|
|
137
|
+
stdout.write(`${colourise('No match.', 'yellow')}\n`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const first = matches[0];
|
|
141
|
+
if (matches.length === 1 && first !== undefined) {
|
|
142
|
+
return this.#finish(nameOf(first), options);
|
|
143
|
+
}
|
|
144
|
+
const picked = await this.#select(message, matches.slice(0, limit), { ...options, name: undefined }, false);
|
|
145
|
+
return picked[0];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ─── internals ──────────────────────────────────────────────
|
|
149
|
+
async #text(message, options, masked) {
|
|
150
|
+
const trapped = this.#takeTrap(message, options.name);
|
|
151
|
+
if (trapped !== undefined)
|
|
152
|
+
return this.#finish(String(trapped), options);
|
|
153
|
+
for (;;) {
|
|
154
|
+
const raw = await this.readLine(this.#label(message, options), masked);
|
|
155
|
+
// `format` is display-only (Console): the returned value is what was typed,
|
|
156
|
+
// with the default filled in when the line was empty.
|
|
157
|
+
const value = raw === '' && options.default !== undefined ? options.default : raw;
|
|
158
|
+
const problem = await this.#check(value, options);
|
|
159
|
+
if (problem !== undefined) {
|
|
160
|
+
stdout.write(`${colourise(problem, 'yellow')}\n`);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
return options.result ? options.result(value) : value;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async #select(message, choices, options, many) {
|
|
167
|
+
if (choices.length === 0) {
|
|
168
|
+
throw new ReamError('E_CONSOLE_EMPTY_CHOICES', `"${message}" was asked with no options.`);
|
|
169
|
+
}
|
|
170
|
+
const trapped = this.#takeTrap(message, options.name);
|
|
171
|
+
if (trapped !== undefined) {
|
|
172
|
+
const picked = this.#fromTrap(trapped, choices, many);
|
|
173
|
+
// Same reasoning as the text prompts: a scripted answer the real prompt
|
|
174
|
+
// would reject must fail the test, not sail through it.
|
|
175
|
+
await this.#validateSelection(picked, options, many);
|
|
176
|
+
return many ? picked : picked.map((value) => this.#applyResult(value, options));
|
|
177
|
+
}
|
|
178
|
+
const defaultLabel = options.default === undefined
|
|
179
|
+
? undefined
|
|
180
|
+
: [options.default]
|
|
181
|
+
.flat()
|
|
182
|
+
.map((index) => {
|
|
183
|
+
const choice = choices[index];
|
|
184
|
+
return choice === undefined ? String(index) : displayOf(choice);
|
|
185
|
+
})
|
|
186
|
+
.join(', ');
|
|
187
|
+
for (;;) {
|
|
188
|
+
stdout.write(`${this.#label(message, { ...options, default: defaultLabel }).trimEnd()}\n`);
|
|
189
|
+
choices.forEach((choice, index) => {
|
|
190
|
+
const hint = typeof choice === 'string' ? undefined : choice.hint;
|
|
191
|
+
stdout.write(` ${colourise(String(index + 1), 'cyan')}) ${displayOf(choice)}` +
|
|
192
|
+
`${hint === undefined ? '' : colourise(` — ${hint}`, 'dim')}\n`);
|
|
193
|
+
});
|
|
194
|
+
const answer = await this.readLine(many ? `Select (e.g. 1,3) from 1-${choices.length}: ` : `Select (1-${choices.length}): `);
|
|
195
|
+
// An empty answer takes the default — which for a selection prompt is an
|
|
196
|
+
// index, as Adonis spells it. Without this the default was shown in the
|
|
197
|
+
// label and then rejected as an invalid selection.
|
|
198
|
+
const indexes = answer === '' && options.default !== undefined
|
|
199
|
+
? [options.default]
|
|
200
|
+
.flat()
|
|
201
|
+
.filter((index) => Number.isInteger(index) && index >= 0 && index < choices.length)
|
|
202
|
+
: answer
|
|
203
|
+
.split(',')
|
|
204
|
+
.map((part) => Number(part.trim()) - 1)
|
|
205
|
+
.filter((index) => Number.isInteger(index) && index >= 0 && index < choices.length);
|
|
206
|
+
if (indexes.length === 0 || (!many && indexes.length !== 1)) {
|
|
207
|
+
stdout.write(`${colourise('Invalid selection.', 'yellow')}\n`);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const picked = indexes.map((index) => nameOf(choices[index]));
|
|
211
|
+
const problem = await this.#selectionProblem(picked, options, many);
|
|
212
|
+
if (problem !== undefined) {
|
|
213
|
+
stdout.write(`${colourise(problem, 'yellow')}\n`);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
return many ? picked : picked.map((value) => this.#applyResult(value, options));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/** `result` for a single-value selection; `multiple` applies its own. */
|
|
220
|
+
#applyResult(value, options) {
|
|
221
|
+
return options.result === undefined
|
|
222
|
+
? value
|
|
223
|
+
: Reflect.apply(options.result, undefined, [String(value)]);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Validation subject for a selection: the whole array for `multiple`, the
|
|
227
|
+
* single value otherwise — so an Console rule written `validate(values: string[])`
|
|
228
|
+
* behaves the same here.
|
|
229
|
+
*/
|
|
230
|
+
async #selectionProblem(picked, options, many) {
|
|
231
|
+
if (options.validate === undefined)
|
|
232
|
+
return undefined;
|
|
233
|
+
const subject = many ? picked.map(String) : String(picked[0] ?? '');
|
|
234
|
+
const verdict = await Reflect.apply(options.validate, undefined, [subject]);
|
|
235
|
+
if (verdict === true)
|
|
236
|
+
return undefined;
|
|
237
|
+
return typeof verdict === 'string' ? verdict : 'Invalid value.';
|
|
238
|
+
}
|
|
239
|
+
async #validateSelection(picked, options, many) {
|
|
240
|
+
const problem = await this.#selectionProblem(picked, options, many);
|
|
241
|
+
if (problem === undefined)
|
|
242
|
+
return;
|
|
243
|
+
throw new ReamError('E_CONSOLE_INVALID_TRAP_VALUE', `A scripted answer was rejected by its own validation: ${problem}`, { hint: 'The trap supplies a value the real prompt would refuse — fix the test.' });
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Apply `format`, `validate` and `result` to a value that came from a trap.
|
|
247
|
+
*
|
|
248
|
+
* Skipping `validate` here would let a test inject a value the real prompt
|
|
249
|
+
* would have rejected, and the command would pass — a test giving confidence
|
|
250
|
+
* in something that cannot happen. A trapped value that fails validation is a
|
|
251
|
+
* broken test, so it throws instead of re-asking: there is nobody to re-ask.
|
|
252
|
+
*/
|
|
253
|
+
async #finish(value, options) {
|
|
254
|
+
await this.#assertTrapped(value, options);
|
|
255
|
+
return options.result ? options.result(value) : value;
|
|
256
|
+
}
|
|
257
|
+
// Only the validation hook, so `SelectPromptOptions` (whose `default` is an
|
|
258
|
+
// index, not a value) passes without a variance conflict.
|
|
259
|
+
async #assertTrapped(value, options) {
|
|
260
|
+
const problem = await this.#check(value, options);
|
|
261
|
+
if (problem === undefined)
|
|
262
|
+
return;
|
|
263
|
+
throw new ReamError('E_CONSOLE_INVALID_TRAP_VALUE', `A scripted answer was rejected by its own validation: ${problem}`, { hint: 'The trap supplies a value the real prompt would refuse — fix the test.' });
|
|
264
|
+
}
|
|
265
|
+
#fromTrap(trapped, choices, many) {
|
|
266
|
+
const read = (index) => {
|
|
267
|
+
const choice = choices[index];
|
|
268
|
+
if (choice === undefined) {
|
|
269
|
+
throw new ReamError('E_CONSOLE_TRAP_OUT_OF_RANGE', `A trap chose option ${index + 1}, but only ${choices.length} were offered.`);
|
|
270
|
+
}
|
|
271
|
+
return nameOf(choice);
|
|
272
|
+
};
|
|
273
|
+
if (typeof trapped === 'object' && trapped !== null) {
|
|
274
|
+
const indexes = Reflect.get(trapped, 'indexes');
|
|
275
|
+
if (Array.isArray(indexes))
|
|
276
|
+
return indexes.map((index) => read(Number(index)));
|
|
277
|
+
const index = Reflect.get(trapped, 'index');
|
|
278
|
+
if (typeof index === 'number')
|
|
279
|
+
return [read(index)];
|
|
280
|
+
}
|
|
281
|
+
// A trap that replied with a raw value: honour it as-is.
|
|
282
|
+
if (many)
|
|
283
|
+
return Array.isArray(trapped) ? trapped : [trapped];
|
|
284
|
+
return [trapped];
|
|
285
|
+
}
|
|
286
|
+
/** Consume a scripted answer, if one was installed for this prompt. */
|
|
287
|
+
#takeTrap(message, name) {
|
|
288
|
+
const key = name ?? message;
|
|
289
|
+
if (!this.#traps.has(key))
|
|
290
|
+
return undefined;
|
|
291
|
+
const value = this.#traps.get(key);
|
|
292
|
+
this.#traps.delete(key);
|
|
293
|
+
return value;
|
|
294
|
+
}
|
|
295
|
+
async #check(value, options) {
|
|
296
|
+
if (options.validate === undefined)
|
|
297
|
+
return undefined;
|
|
298
|
+
const verdict = await options.validate(value);
|
|
299
|
+
if (verdict === true)
|
|
300
|
+
return undefined;
|
|
301
|
+
return typeof verdict === 'string' ? verdict : 'Invalid value.';
|
|
302
|
+
}
|
|
303
|
+
// Only the display fields, so a `PromptOptions<boolean>` can be passed
|
|
304
|
+
// without tripping over the contravariance of `validate`.
|
|
305
|
+
#label(message, options, suffix) {
|
|
306
|
+
const hint = options.hint === undefined ? '' : colourise(` (${options.hint})`, 'dim');
|
|
307
|
+
// The one place `format` legitimately applies: what is shown, not what is
|
|
308
|
+
// returned.
|
|
309
|
+
const shownDefault = options.default !== undefined && options.format !== undefined
|
|
310
|
+
? Reflect.apply(options.format, undefined, [options.default])
|
|
311
|
+
: options.default;
|
|
312
|
+
const shown = shownDefault === undefined ? '' : ` [${String(shownDefault)}]`;
|
|
313
|
+
const tail = suffix === undefined ? '' : ` ${suffix}`;
|
|
314
|
+
return `${message}${hint}${shown}${tail}: `;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Read one line from the terminal.
|
|
318
|
+
*
|
|
319
|
+
* `protected` on purpose: it is the single seam through which input enters,
|
|
320
|
+
* so a test (or a future non-readline frontend) can substitute it by
|
|
321
|
+
* subclassing instead of faking a TTY.
|
|
322
|
+
*/
|
|
323
|
+
readLine(query, masked = false) {
|
|
324
|
+
if (!stdin.isTTY) {
|
|
325
|
+
return Promise.reject(new ReamError('E_CONSOLE_NOT_INTERACTIVE', `Cannot prompt for "${query.trim()}" — stdin is not interactive.`, {
|
|
326
|
+
hint: 'Pass the value as a flag, or script the answer in tests with prompt.trap(name).',
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
const rl = createInterface({ input: stdin, output: stdout, terminal: true });
|
|
330
|
+
// readline echoes each keystroke through _writeToOutput; replacing it is
|
|
331
|
+
// the dependency-free way to hide what is typed.
|
|
332
|
+
if (masked && isEchoing(rl)) {
|
|
333
|
+
rl._writeToOutput = (text) => {
|
|
334
|
+
stdout.write(text.includes(query) ? query : '');
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return new Promise((resolve) => {
|
|
338
|
+
rl.question(query, (answer) => {
|
|
339
|
+
if (masked)
|
|
340
|
+
stdout.write('\n');
|
|
341
|
+
rl.close();
|
|
342
|
+
resolve(answer.trim());
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function isEchoing(value) {
|
|
348
|
+
return '_writeToOutput' in value && typeof Reflect.get(value, '_writeToOutput') === 'function';
|
|
349
|
+
}
|
|
350
|
+
function nameOf(choice) {
|
|
351
|
+
return typeof choice === 'string' ? choice : choice.name;
|
|
352
|
+
}
|
|
353
|
+
function displayOf(choice) {
|
|
354
|
+
return typeof choice === 'string' ? choice : (choice.message ?? choice.name);
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/console/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostics channels for the console (Console `tracingChannels`).
|
|
3
|
+
*
|
|
4
|
+
* `diagnostics_channel` is Node's built-in tracing hook: an APM agent, or a
|
|
5
|
+
* test, subscribes without the framework knowing about it and without paying
|
|
6
|
+
* anything when nobody listens.
|
|
7
|
+
*/
|
|
8
|
+
import diagnosticsChannel from 'node:diagnostics_channel';
|
|
9
|
+
import type { CommandClass, CommandInstance } from './types.js';
|
|
10
|
+
export interface CommandExecTracingData {
|
|
11
|
+
command: CommandClass;
|
|
12
|
+
commandInstance: CommandInstance;
|
|
13
|
+
argv: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
/** Traces every command run by the kernel — start, end, error and result. */
|
|
16
|
+
export declare const commandExec: diagnosticsChannel.TracingChannel<"ream.command.exec", CommandExecTracingData>;
|
|
17
|
+
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/console/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,kBAAkB,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,CAAA;IACrB,eAAe,EAAE,eAAe,CAAA;IAChC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CACxB;AAED,6EAA6E;AAC7E,eAAO,MAAM,WAAW,gFAGF,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostics channels for the console (Console `tracingChannels`).
|
|
3
|
+
*
|
|
4
|
+
* `diagnostics_channel` is Node's built-in tracing hook: an APM agent, or a
|
|
5
|
+
* test, subscribes without the framework knowing about it and without paying
|
|
6
|
+
* anything when nobody listens.
|
|
7
|
+
*/
|
|
8
|
+
import diagnosticsChannel from 'node:diagnostics_channel';
|
|
9
|
+
/** Traces every command run by the kernel — start, end, error and result. */
|
|
10
|
+
export const commandExec = diagnosticsChannel.tracingChannel('ream.command.exec');
|
|
11
|
+
//# sourceMappingURL=tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/console/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,kBAAkB,MAAM,0BAA0B,CAAA;AASzD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,CAG1D,mBAAmB,CAAC,CAAA"}
|