@forgecart/cli 2.202609301601.0 → 2.202610020334.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/dist/src/cli.d.ts +10 -3
- package/dist/src/cli.js +34 -7
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/init.d.ts +7 -3
- package/dist/src/commands/init.js +4 -2
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/exit-ladder.d.ts +25 -0
- package/dist/src/exit-ladder.js +32 -0
- package/dist/src/exit-ladder.js.map +1 -0
- package/dist/src/question/given-answers.d.ts +42 -0
- package/dist/src/question/given-answers.js +154 -0
- package/dist/src/question/given-answers.js.map +1 -0
- package/dist/src/question/prompt-arm.d.ts +21 -0
- package/dist/src/question/prompt-arm.js +263 -0
- package/dist/src/question/prompt-arm.js.map +1 -0
- package/dist/src/question/question-prompt.adapter.d.ts +36 -0
- package/dist/src/question/question-prompt.adapter.js +81 -0
- package/dist/src/question/question-prompt.adapter.js.map +1 -0
- package/dist/src/question/question-unanswered-refusal.d.ts +15 -0
- package/dist/src/question/question-unanswered-refusal.js +35 -0
- package/dist/src/question/question-unanswered-refusal.js.map +1 -0
- package/dist/src/question/terminal-question-session.d.ts +36 -0
- package/dist/src/question/terminal-question-session.js +126 -0
- package/dist/src/question/terminal-question-session.js.map +1 -0
- package/dist/src/question/terminal-screen.d.ts +26 -0
- package/dist/src/question/terminal-screen.js +68 -0
- package/dist/src/question/terminal-screen.js.map +1 -0
- package/dist/src/question/type/question-prompt.input.d.ts +20 -0
- package/dist/src/question/type/question-prompt.input.js +2 -0
- package/dist/src/question/type/question-prompt.input.js.map +1 -0
- package/dist/src/question/type/question-prompt.types.d.ts +104 -0
- package/dist/src/question/type/question-prompt.types.js +2 -0
- package/dist/src/question/type/question-prompt.types.js.map +1 -0
- package/dist/src/question/util/answer-flag.util.d.ts +12 -0
- package/dist/src/question/util/answer-flag.util.js +22 -0
- package/dist/src/question/util/answer-flag.util.js.map +1 -0
- package/dist/src/question/util/question-frame.util.d.ts +22 -0
- package/dist/src/question/util/question-frame.util.js +49 -0
- package/dist/src/question/util/question-frame.util.js.map +1 -0
- package/dist/src/question/util/terminal-text.util.d.ts +7 -0
- package/dist/src/question/util/terminal-text.util.js +15 -0
- package/dist/src/question/util/terminal-text.util.js.map +1 -0
- package/package.json +1 -1
package/dist/src/cli.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
export { CliExitLadder, CliRefusal } from './exit-ladder.js';
|
|
3
|
+
export { QuestionPromptAdapter } from './question/question-prompt.adapter.js';
|
|
4
|
+
export type { QuestionPromptInput } from './question/type/question-prompt.input.js';
|
|
5
|
+
export type { CliQuestion, CliQuestionKind, CliQuestionOption, QuestionAnswersFile, QuestionPrompt, QuestionPromptAnswer, QuestionPromptIo, } from './question/type/question-prompt.types.js';
|
|
2
6
|
/**
|
|
3
7
|
* CLI version, read from `package.json` (the single source of truth) so the
|
|
4
8
|
* `--version` output can never drift from the published version.
|
|
@@ -13,7 +17,10 @@ export declare const CLI_VERSION: string;
|
|
|
13
17
|
*/
|
|
14
18
|
export declare function createProgram(): Command;
|
|
15
19
|
/**
|
|
16
|
-
* Parse argv and execute the program
|
|
17
|
-
*
|
|
20
|
+
* Parse argv and execute the program — `createProgram()`'s unless one is given.
|
|
21
|
+
* Nothing thrown is swallowed: a {@link CliRefusal} prints its lines on stderr
|
|
22
|
+
* under the command that refused and exits on its own rung of
|
|
23
|
+
* {@link CliExitLadder}; any other error prints behind `Error:` and exits
|
|
24
|
+
* {@link CliExitLadder.error}.
|
|
18
25
|
*/
|
|
19
|
-
export declare function run(argv?: string[]): Promise<void>;
|
|
26
|
+
export declare function run(argv?: string[], program?: Command): Promise<void>;
|
package/dist/src/cli.js
CHANGED
|
@@ -2,8 +2,11 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { createInitCommand } from './commands/init.js';
|
|
3
3
|
import { createDeleteCommand, createDeployCommand, createEnvCommand, createInitApplicationCommand, createListCommand, createLogsCommand, createScaleCommand, createStatusCommand, createWhoamiCommand, } from './commands/placeholders.js';
|
|
4
4
|
import { createRefreshCommand } from './commands/refresh.js';
|
|
5
|
+
import { CliExitLadder, CliRefusal } from './exit-ladder.js';
|
|
5
6
|
import { printError } from './output.js';
|
|
6
7
|
import { readPackageVersion } from './version.js';
|
|
8
|
+
export { CliExitLadder, CliRefusal } from './exit-ladder.js';
|
|
9
|
+
export { QuestionPromptAdapter } from './question/question-prompt.adapter.js';
|
|
7
10
|
/**
|
|
8
11
|
* CLI version, read from `package.json` (the single source of truth) so the
|
|
9
12
|
* `--version` output can never drift from the published version.
|
|
@@ -36,18 +39,42 @@ export function createProgram() {
|
|
|
36
39
|
return program;
|
|
37
40
|
}
|
|
38
41
|
/**
|
|
39
|
-
* Parse argv and execute the program
|
|
40
|
-
*
|
|
42
|
+
* Parse argv and execute the program — `createProgram()`'s unless one is given.
|
|
43
|
+
* Nothing thrown is swallowed: a {@link CliRefusal} prints its lines on stderr
|
|
44
|
+
* under the command that refused and exits on its own rung of
|
|
45
|
+
* {@link CliExitLadder}; any other error prints behind `Error:` and exits
|
|
46
|
+
* {@link CliExitLadder.error}.
|
|
41
47
|
*/
|
|
42
|
-
export async function run(argv = process.argv) {
|
|
43
|
-
|
|
48
|
+
export async function run(argv = process.argv, program = createProgram()) {
|
|
49
|
+
let actionCommand = program;
|
|
50
|
+
program.hook('preAction', (_program, command) => {
|
|
51
|
+
actionCommand = command;
|
|
52
|
+
});
|
|
44
53
|
try {
|
|
45
54
|
await program.parseAsync(argv);
|
|
46
55
|
}
|
|
47
56
|
catch (error) {
|
|
48
|
-
|
|
49
|
-
printError(`Error: ${message}`);
|
|
50
|
-
process.exitCode = 1;
|
|
57
|
+
reportFailure(error, actionCommand);
|
|
51
58
|
}
|
|
52
59
|
}
|
|
60
|
+
function reportFailure(error, command) {
|
|
61
|
+
if (error instanceof CliRefusal) {
|
|
62
|
+
const path = commandPath(command);
|
|
63
|
+
for (const line of error.lines)
|
|
64
|
+
printError(`${path}: ${line}`);
|
|
65
|
+
process.exitCode = error.exitCode;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
69
|
+
printError(`Error: ${message}`);
|
|
70
|
+
process.exitCode = CliExitLadder.error;
|
|
71
|
+
}
|
|
72
|
+
/** `forgecart init` — the command's name under every command above it. */
|
|
73
|
+
function commandPath(command) {
|
|
74
|
+
const names = [];
|
|
75
|
+
for (let current = command; current !== null; current = current.parent) {
|
|
76
|
+
names.unshift(current.name());
|
|
77
|
+
}
|
|
78
|
+
return names.join(' ');
|
|
79
|
+
}
|
|
53
80
|
//# sourceMappingURL=cli.js.map
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,4BAA4B,EAC5B,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,4BAA4B,EAC5B,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAY9E;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAC,4BAA4B,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,OAAiB,OAAO,CAAC,IAAI,EAC7B,UAAmB,aAAa,EAAE;IAElC,IAAI,aAAa,GAAG,OAAO,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC9C,aAAa,GAAG,OAAO,CAAC;IAC1B,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,OAAgB;IACrD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK;YAAE,UAAU,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAClC,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,UAAU,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC;AACzC,CAAC;AAED,0EAA0E;AAC1E,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,OAAO,GAAmB,OAAO,EAAE,OAAO,KAAK,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACvF,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import type { QuestionPromptInput } from '../question/type/question-prompt.input.js';
|
|
2
3
|
/**
|
|
3
4
|
* Default shop API base, INCLUDING the mounted path. The API serves the shop
|
|
4
5
|
* GraphQL endpoint at `/shop-api` (`app/forgecart/src/main.ts`), and the SDK
|
|
@@ -26,8 +27,11 @@ export declare const WORKSPACE_TEMPLATE_DIR_ENV = "WORKSPACE_TEMPLATE_DIR";
|
|
|
26
27
|
* regular install, so older images and cold scaffolds keep working unchanged.
|
|
27
28
|
*/
|
|
28
29
|
export declare const DEPS_READY_MARKER_PATH = ".forgecart/deps-ready.json";
|
|
29
|
-
/**
|
|
30
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Resolved options for `forgecart init`: its own, and the three flags every
|
|
32
|
+
* questioning command shares (#2771).
|
|
33
|
+
*/
|
|
34
|
+
export interface InitOptions extends QuestionPromptInput {
|
|
31
35
|
/** Channel token (required). */
|
|
32
36
|
token?: string;
|
|
33
37
|
/**
|
|
@@ -87,5 +91,5 @@ export declare function getStorefrontTemplateDir(): string;
|
|
|
87
91
|
* missing template, copy failure).
|
|
88
92
|
*/
|
|
89
93
|
export declare function runInit(name: string | undefined, options: InitOptions): Promise<void>;
|
|
90
|
-
/** Build the `init [name]` command. */
|
|
94
|
+
/** Build the `init [name]` command, carrying the question adapter's three flags. */
|
|
91
95
|
export declare function createInitCommand(): Command;
|
|
@@ -3,6 +3,7 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { Command } from 'commander';
|
|
5
5
|
import { print } from '../output.js';
|
|
6
|
+
import { QuestionPromptAdapter } from '../question/question-prompt.adapter.js';
|
|
6
7
|
import { readPackageVersion } from '../version.js';
|
|
7
8
|
import { writeTemplateManifest } from './template-manifest.js';
|
|
8
9
|
/**
|
|
@@ -310,9 +311,9 @@ export async function runInit(name, options) {
|
|
|
310
311
|
await writeTemplateManifest(targetDir, plan.templateDir, readPackageVersion());
|
|
311
312
|
printNextSteps(name ?? '.', options.application ?? false, plan.source === 'warmed');
|
|
312
313
|
}
|
|
313
|
-
/** Build the `init [name]` command. */
|
|
314
|
+
/** Build the `init [name]` command, carrying the question adapter's three flags. */
|
|
314
315
|
export function createInitCommand() {
|
|
315
|
-
|
|
316
|
+
const command = new Command('init')
|
|
316
317
|
.description('Scaffold a ForgeCart storefront in the target directory')
|
|
317
318
|
.argument('[name]', 'Target directory name (defaults to the current directory)')
|
|
318
319
|
.option('-t, --token <token>', 'ForgeCart channel token (required)')
|
|
@@ -325,5 +326,6 @@ export function createInitCommand() {
|
|
|
325
326
|
.action(async (name, options) => {
|
|
326
327
|
await runInit(name, options);
|
|
327
328
|
});
|
|
329
|
+
return QuestionPromptAdapter.registerOptions(command);
|
|
328
330
|
}
|
|
329
331
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,oCAAoC,CAAC;AAEzE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI's exit ladder (#2771; record `refs/design/cli-improvements`, contract
|
|
3
|
+
* `CliExitLadder`): the status a scripted caller routes on without parsing the
|
|
4
|
+
* words printed beside it. `0` is success.
|
|
5
|
+
*/
|
|
6
|
+
export declare enum CliExitLadder {
|
|
7
|
+
/** Every error the CLI raises — the status `run` has always set for one. */
|
|
8
|
+
error = 1,
|
|
9
|
+
/**
|
|
10
|
+
* A question no flag answered and no terminal could ask: nothing is wrong,
|
|
11
|
+
* something is missing, and a caller supplies it with `--answer`,
|
|
12
|
+
* `--answers-file` or `--yes`.
|
|
13
|
+
*/
|
|
14
|
+
questionUnanswered = 2
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The CLI stopping for a reason that is not an error, on its own rung of
|
|
18
|
+
* {@link CliExitLadder}. `run` prints each line under the command that refused
|
|
19
|
+
* (`forgecart init: …`), never behind `Error:`, and exits on the rung.
|
|
20
|
+
*/
|
|
21
|
+
export declare class CliRefusal extends Error {
|
|
22
|
+
readonly exitCode: CliExitLadder;
|
|
23
|
+
readonly lines: readonly string[];
|
|
24
|
+
constructor(exitCode: CliExitLadder, lines: readonly string[]);
|
|
25
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI's exit ladder (#2771; record `refs/design/cli-improvements`, contract
|
|
3
|
+
* `CliExitLadder`): the status a scripted caller routes on without parsing the
|
|
4
|
+
* words printed beside it. `0` is success.
|
|
5
|
+
*/
|
|
6
|
+
export var CliExitLadder;
|
|
7
|
+
(function (CliExitLadder) {
|
|
8
|
+
/** Every error the CLI raises — the status `run` has always set for one. */
|
|
9
|
+
CliExitLadder[CliExitLadder["error"] = 1] = "error";
|
|
10
|
+
/**
|
|
11
|
+
* A question no flag answered and no terminal could ask: nothing is wrong,
|
|
12
|
+
* something is missing, and a caller supplies it with `--answer`,
|
|
13
|
+
* `--answers-file` or `--yes`.
|
|
14
|
+
*/
|
|
15
|
+
CliExitLadder[CliExitLadder["questionUnanswered"] = 2] = "questionUnanswered";
|
|
16
|
+
})(CliExitLadder || (CliExitLadder = {}));
|
|
17
|
+
/**
|
|
18
|
+
* The CLI stopping for a reason that is not an error, on its own rung of
|
|
19
|
+
* {@link CliExitLadder}. `run` prints each line under the command that refused
|
|
20
|
+
* (`forgecart init: …`), never behind `Error:`, and exits on the rung.
|
|
21
|
+
*/
|
|
22
|
+
export class CliRefusal extends Error {
|
|
23
|
+
exitCode;
|
|
24
|
+
lines;
|
|
25
|
+
constructor(exitCode, lines) {
|
|
26
|
+
super(lines.join('\n'));
|
|
27
|
+
this.exitCode = exitCode;
|
|
28
|
+
this.lines = lines;
|
|
29
|
+
this.name = 'CliRefusal';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=exit-ladder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exit-ladder.js","sourceRoot":"","sources":["../../src/exit-ladder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,4EAA4E;IAC5E,mDAAS,CAAA;IACT;;;;OAIG;IACH,6EAAsB,CAAA;AACxB,CAAC,EATW,aAAa,KAAb,aAAa,QASxB;AAED;;;;GAIG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAExB;IACA;IAFX,YACW,QAAuB,EACvB,KAAwB;QAEjC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAHf,aAAQ,GAAR,QAAQ,CAAe;QACvB,UAAK,GAAL,KAAK,CAAmB;QAGjC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { QuestionPromptInput } from './type/question-prompt.input.js';
|
|
2
|
+
import type { CliQuestion, QuestionPromptAnswer } from './type/question-prompt.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The answers a run brings with it — `--answer`, `--answers-file` and `--yes` —
|
|
5
|
+
* looked up per question: by its id, then by its stable key; the command line
|
|
6
|
+
* before the file; any given answer before `--yes`'s default. A given answer is
|
|
7
|
+
* checked against the question it answers: an option the question does not
|
|
8
|
+
* offer, or an empty text, is an error rather than an answer.
|
|
9
|
+
*/
|
|
10
|
+
export declare class GivenAnswers {
|
|
11
|
+
private readonly flagged;
|
|
12
|
+
private readonly filed;
|
|
13
|
+
private readonly filePath;
|
|
14
|
+
private readonly yes;
|
|
15
|
+
private constructor();
|
|
16
|
+
/** Read the flags, and the answers file when one is named. */
|
|
17
|
+
static from(flags: QuestionPromptInput): Promise<GivenAnswers>;
|
|
18
|
+
/** The answer the run gives `question` — none when it leaves the question open. */
|
|
19
|
+
answerFor(question: CliQuestion): QuestionPromptAnswer | undefined;
|
|
20
|
+
private givenFor;
|
|
21
|
+
/**
|
|
22
|
+
* A choice is answered by its option ids; a `both` question by its option ids
|
|
23
|
+
* or, failing that, by text; a `text` question by its text, verbatim.
|
|
24
|
+
*/
|
|
25
|
+
private toAnswer;
|
|
26
|
+
private textAnswer;
|
|
27
|
+
/**
|
|
28
|
+
* The options `value` names, in the question's own order — none when it names
|
|
29
|
+
* anything the question does not offer, or, for a single choice, not exactly
|
|
30
|
+
* one option. A string lists a multi-select's ids comma-separated.
|
|
31
|
+
*/
|
|
32
|
+
private optionIdsOf;
|
|
33
|
+
private splitIds;
|
|
34
|
+
private unanswerable;
|
|
35
|
+
private static readAnswersFile;
|
|
36
|
+
private static readText;
|
|
37
|
+
private static parseJson;
|
|
38
|
+
private static answerValue;
|
|
39
|
+
private static isRecord;
|
|
40
|
+
private static isStringList;
|
|
41
|
+
private static reasonOf;
|
|
42
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { parseAnswerFlag } from './util/answer-flag.util.js';
|
|
3
|
+
import { defaultAnswer } from './util/question-frame.util.js';
|
|
4
|
+
/**
|
|
5
|
+
* The answers a run brings with it — `--answer`, `--answers-file` and `--yes` —
|
|
6
|
+
* looked up per question: by its id, then by its stable key; the command line
|
|
7
|
+
* before the file; any given answer before `--yes`'s default. A given answer is
|
|
8
|
+
* checked against the question it answers: an option the question does not
|
|
9
|
+
* offer, or an empty text, is an error rather than an answer.
|
|
10
|
+
*/
|
|
11
|
+
export class GivenAnswers {
|
|
12
|
+
flagged;
|
|
13
|
+
filed;
|
|
14
|
+
filePath;
|
|
15
|
+
yes;
|
|
16
|
+
constructor(flagged, filed, filePath, yes) {
|
|
17
|
+
this.flagged = flagged;
|
|
18
|
+
this.filed = filed;
|
|
19
|
+
this.filePath = filePath;
|
|
20
|
+
this.yes = yes;
|
|
21
|
+
}
|
|
22
|
+
/** Read the flags, and the answers file when one is named. */
|
|
23
|
+
static async from(flags) {
|
|
24
|
+
const flagged = new Map((flags.answer ?? []).map((raw) => {
|
|
25
|
+
const { question, answer } = parseAnswerFlag(raw);
|
|
26
|
+
return [question, answer];
|
|
27
|
+
}));
|
|
28
|
+
const yes = flags.yes === true;
|
|
29
|
+
if (flags.answersFile === undefined)
|
|
30
|
+
return new GivenAnswers(flagged, new Map(), '', yes);
|
|
31
|
+
const filed = new Map(Object.entries(await GivenAnswers.readAnswersFile(flags.answersFile)));
|
|
32
|
+
return new GivenAnswers(flagged, filed, flags.answersFile, yes);
|
|
33
|
+
}
|
|
34
|
+
/** The answer the run gives `question` — none when it leaves the question open. */
|
|
35
|
+
answerFor(question) {
|
|
36
|
+
const given = this.givenFor(question);
|
|
37
|
+
if (given !== undefined)
|
|
38
|
+
return this.toAnswer(question, given);
|
|
39
|
+
return this.yes ? defaultAnswer(question) : undefined;
|
|
40
|
+
}
|
|
41
|
+
givenFor(question) {
|
|
42
|
+
const names = [question.id, question.key];
|
|
43
|
+
for (const name of names) {
|
|
44
|
+
const value = this.flagged.get(name);
|
|
45
|
+
if (value !== undefined)
|
|
46
|
+
return { value, origin: `--answer ${name}=${value}` };
|
|
47
|
+
}
|
|
48
|
+
for (const name of names) {
|
|
49
|
+
const value = this.filed.get(name);
|
|
50
|
+
if (value !== undefined) {
|
|
51
|
+
return { value, origin: `--answers-file ${this.filePath} "${name}"` };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A choice is answered by its option ids; a `both` question by its option ids
|
|
58
|
+
* or, failing that, by text; a `text` question by its text, verbatim.
|
|
59
|
+
*/
|
|
60
|
+
toAnswer(question, given) {
|
|
61
|
+
if (question.kind === 'text')
|
|
62
|
+
return this.textAnswer(question, given);
|
|
63
|
+
const optionIds = this.optionIdsOf(question, given.value);
|
|
64
|
+
if (optionIds !== undefined)
|
|
65
|
+
return { questionId: question.id, optionIds };
|
|
66
|
+
if (question.kind === 'both' && typeof given.value === 'string') {
|
|
67
|
+
return this.textAnswer(question, given);
|
|
68
|
+
}
|
|
69
|
+
const expected = question.allowMultiple ? 'option ids among' : 'one option of';
|
|
70
|
+
const ids = question.options.map((option) => option.id).join(', ');
|
|
71
|
+
throw this.unanswerable(question, given, `expected ${expected} ${ids}`);
|
|
72
|
+
}
|
|
73
|
+
textAnswer(question, given) {
|
|
74
|
+
const { value } = given;
|
|
75
|
+
if (typeof value !== 'string') {
|
|
76
|
+
throw this.unanswerable(question, given, 'expected text, not a list');
|
|
77
|
+
}
|
|
78
|
+
if (value.trim() === '')
|
|
79
|
+
throw this.unanswerable(question, given, 'the answer is empty');
|
|
80
|
+
return { questionId: question.id, text: value };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The options `value` names, in the question's own order — none when it names
|
|
84
|
+
* anything the question does not offer, or, for a single choice, not exactly
|
|
85
|
+
* one option. A string lists a multi-select's ids comma-separated.
|
|
86
|
+
*/
|
|
87
|
+
optionIdsOf(question, value) {
|
|
88
|
+
const ids = typeof value === 'string' ? this.splitIds(value, question.allowMultiple) : value;
|
|
89
|
+
if (!question.allowMultiple && ids.length !== 1)
|
|
90
|
+
return undefined;
|
|
91
|
+
const offered = new Set(question.options.map((option) => option.id));
|
|
92
|
+
if (!ids.every((id) => offered.has(id)))
|
|
93
|
+
return undefined;
|
|
94
|
+
return question.options.filter((option) => ids.includes(option.id)).map((option) => option.id);
|
|
95
|
+
}
|
|
96
|
+
splitIds(value, multiple) {
|
|
97
|
+
if (!multiple)
|
|
98
|
+
return [value.trim()];
|
|
99
|
+
return value
|
|
100
|
+
.split(',')
|
|
101
|
+
.map((id) => id.trim())
|
|
102
|
+
.filter((id) => id !== '');
|
|
103
|
+
}
|
|
104
|
+
unanswerable(question, given, reason) {
|
|
105
|
+
return new Error(`${given.origin} does not answer question ${question.id} "${question.question}": ${reason}.`);
|
|
106
|
+
}
|
|
107
|
+
static async readAnswersFile(path) {
|
|
108
|
+
const text = await GivenAnswers.readText(path);
|
|
109
|
+
const parsed = GivenAnswers.parseJson(text, path);
|
|
110
|
+
if (!GivenAnswers.isRecord(parsed)) {
|
|
111
|
+
throw new Error(`--answers-file ${path} must hold a JSON object of question ids or keys to answers.`);
|
|
112
|
+
}
|
|
113
|
+
return Object.fromEntries(Object.entries(parsed).map(([name, value]) => [
|
|
114
|
+
name,
|
|
115
|
+
GivenAnswers.answerValue(name, value, path),
|
|
116
|
+
]));
|
|
117
|
+
}
|
|
118
|
+
static async readText(path) {
|
|
119
|
+
try {
|
|
120
|
+
return await readFile(path, 'utf8');
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw new Error(`--answers-file ${path} cannot be read: ${GivenAnswers.reasonOf(error)}`, {
|
|
124
|
+
cause: error,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
static parseJson(text, path) {
|
|
129
|
+
try {
|
|
130
|
+
const parsed = JSON.parse(text);
|
|
131
|
+
return parsed;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new Error(`--answers-file ${path} is not JSON: ${GivenAnswers.reasonOf(error)}`, {
|
|
135
|
+
cause: error,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
static answerValue(name, value, path) {
|
|
140
|
+
if (typeof value === 'string' || GivenAnswers.isStringList(value))
|
|
141
|
+
return value;
|
|
142
|
+
throw new Error(`--answers-file ${path} answers "${name}" with neither a string nor a list of strings.`);
|
|
143
|
+
}
|
|
144
|
+
static isRecord(value) {
|
|
145
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
146
|
+
}
|
|
147
|
+
static isStringList(value) {
|
|
148
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
149
|
+
}
|
|
150
|
+
static reasonOf(error) {
|
|
151
|
+
return error instanceof Error ? error.message : String(error);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=given-answers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"given-answers.js","sourceRoot":"","sources":["../../../src/question/given-answers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Key } from 'node:readline';
|
|
2
|
+
import type { ArmStep, CliQuestion, PromptFrame } from './type/question-prompt.types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One way of answering a question on a terminal, as a key-event reducer: each
|
|
5
|
+
* keypress returns the step it takes, and {@link frame} draws the state it
|
|
6
|
+
* leaves. Esc is the same everywhere — the question's declared default with
|
|
7
|
+
* `defaulted: true`, or, with none declared, a redraw that says why.
|
|
8
|
+
*/
|
|
9
|
+
export declare abstract class PromptArm {
|
|
10
|
+
protected readonly question: CliQuestion;
|
|
11
|
+
constructor(question: CliQuestion);
|
|
12
|
+
/** The arm a question opens on: the free-text buffer, a checklist or a list. */
|
|
13
|
+
static of(question: CliQuestion): PromptArm;
|
|
14
|
+
/** The step one keypress takes. */
|
|
15
|
+
abstract press(key: Key): ArmStep;
|
|
16
|
+
/** The frame this arm draws now, for a terminal `columns` cells wide. */
|
|
17
|
+
abstract frame(columns: number): PromptFrame;
|
|
18
|
+
protected escape(): ArmStep;
|
|
19
|
+
/** The key line's Esc arm, naming the default it takes — none without a default. */
|
|
20
|
+
protected escapeHint(): string;
|
|
21
|
+
}
|