@oktis-works/cms 0.6.4 → 0.7.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/commands.d.ts.map +1 -1
- package/dist/commands.js +11 -0
- package/dist/commands.js.map +1 -1
- package/dist/dev.d.ts +34 -0
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +173 -6
- package/dist/dev.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/parser.d.ts +5 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +8 -1
- package/dist/parser.js.map +1 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +29 -9
- package/dist/prompt.js.map +1 -1
- package/dist/scaffold-docs.d.ts.map +1 -1
- package/dist/scaffold-docs.js +16 -7
- package/dist/scaffold-docs.js.map +1 -1
- package/dist/wizard-env.d.ts +24 -0
- package/dist/wizard-env.d.ts.map +1 -0
- package/dist/wizard-env.js +171 -0
- package/dist/wizard-env.js.map +1 -0
- package/dist/wizard-flows.d.ts +19 -0
- package/dist/wizard-flows.d.ts.map +1 -0
- package/dist/wizard-flows.js +165 -0
- package/dist/wizard-flows.js.map +1 -0
- package/dist/wizard-i18n.d.ts +112 -0
- package/dist/wizard-i18n.d.ts.map +1 -0
- package/dist/wizard-i18n.js +232 -0
- package/dist/wizard-i18n.js.map +1 -0
- package/dist/wizard-run.d.ts +39 -0
- package/dist/wizard-run.d.ts.map +1 -0
- package/dist/wizard-run.js +121 -0
- package/dist/wizard-run.js.map +1 -0
- package/dist/wizard-state.d.ts +30 -0
- package/dist/wizard-state.d.ts.map +1 -0
- package/dist/wizard-state.js +69 -0
- package/dist/wizard-state.js.map +1 -0
- package/dist/wizard.d.ts +16 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +304 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// @oktis-works/cms - Wizard: executor de comandos via subprocesso
|
|
2
|
+
//
|
|
3
|
+
// O wizard NUNCA chama handlers in-process: cada ação spawna o próprio bin do
|
|
4
|
+
// CLI (`okcms <comando>`) com stdio herdado. Isso dá três coisas que importam:
|
|
5
|
+
//
|
|
6
|
+
// 1. isolamento total de estado — o `okcms dev` roda exatamente como roda
|
|
7
|
+
// no seu terminal, sem "meio ambiente envenenado" pelo wizard;
|
|
8
|
+
// 2. espelho de automação — a linha `$ okcms ...` impressa ANTES do spawn é
|
|
9
|
+
// literalmente a linha que roda; copiar é reaproveitar em CI/script;
|
|
10
|
+
// 3. Ctrl+C limpo — o sinal vai pro filho; o wizard percebe o exit 130 e
|
|
11
|
+
// volta pro menu em vez de morrer junto.
|
|
12
|
+
//
|
|
13
|
+
// O bin é resolvido uma vez (argv[1] do processo atual ou o dist do package);
|
|
14
|
+
// os testes injetam um runner falso e nunca spawnam de verdade.
|
|
15
|
+
import { spawn } from 'node:child_process';
|
|
16
|
+
import { existsSync } from 'node:fs';
|
|
17
|
+
import { dirname, join, resolve } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import { style, symbol } from './prompt.js';
|
|
20
|
+
/**
|
|
21
|
+
* Resolve o executável + script do CLI atual. Preferências:
|
|
22
|
+
* 1. `process.argv[1]` — quando o usuário rodou `okcms`/`bunx`, é o entry
|
|
23
|
+
* real (dev usa src/index.ts, build usa dist/index.js);
|
|
24
|
+
* 2. dist vizinho deste módulo — fallback defensivo.
|
|
25
|
+
* O intérprete é `process.execPath` (bun) — mesmo runtime, zero PATH.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveCliInvocation() {
|
|
28
|
+
const argv1 = process.argv[1];
|
|
29
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
30
|
+
const candidates = [argv1, join(here, 'index.js'), join(here, 'index.ts')].filter((candidate) => typeof candidate === 'string' && candidate.length > 0);
|
|
31
|
+
for (const candidate of candidates) {
|
|
32
|
+
const abs = resolve(candidate);
|
|
33
|
+
if (existsSync(abs))
|
|
34
|
+
return { command: process.execPath, script: abs };
|
|
35
|
+
}
|
|
36
|
+
// última tentativa: argv[1] mesmo sem existsSync (bins symlinkados)
|
|
37
|
+
if (argv1)
|
|
38
|
+
return { command: process.execPath, script: resolve(argv1) };
|
|
39
|
+
throw new Error('cannot resolve the okcms entry point to spawn');
|
|
40
|
+
}
|
|
41
|
+
export const defaultSpawn = (command, args, cwd) => new Promise((resolvePromise) => {
|
|
42
|
+
const child = spawn(command, args, { stdio: 'inherit', cwd });
|
|
43
|
+
let interrupted = false;
|
|
44
|
+
const onSigint = () => {
|
|
45
|
+
interrupted = true;
|
|
46
|
+
};
|
|
47
|
+
// o wizard vive: quem decide parar é o filho (recebe o mesmo SIGINT do
|
|
48
|
+
// terminal em foreground). Sem isto, o Ctrl+C mataria os dois.
|
|
49
|
+
process.once('SIGINT', onSigint);
|
|
50
|
+
child.on('error', () => {
|
|
51
|
+
process.removeListener('SIGINT', onSigint);
|
|
52
|
+
resolvePromise({ code: 127, interrupted: false });
|
|
53
|
+
});
|
|
54
|
+
child.on('close', (code, signal) => {
|
|
55
|
+
process.removeListener('SIGINT', onSigint);
|
|
56
|
+
const bySignal = signal === 'SIGINT' || signal === 'SIGTERM';
|
|
57
|
+
resolvePromise({ code: code ?? (bySignal ? 130 : 1), interrupted: interrupted || bySignal });
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
/** `['dev', ['--yes']]` → `okcms dev --yes` (a linha de automação). */
|
|
61
|
+
export function formatCommand(command, flags, positional = []) {
|
|
62
|
+
const parts = [`okcms`, command, ...positional];
|
|
63
|
+
for (const [name, value] of flags) {
|
|
64
|
+
for (const item of splitRepeatable(value)) {
|
|
65
|
+
parts.push(item === 'true' ? `--${name}` : `--${name} ${item}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return parts.join(' ');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Flags repetíveis (`--set A=1 --set B=2`) chegam acumuladas com `\n` — o
|
|
72
|
+
* parser faz isso de propósito. Na linha de automação e no spawn elas voltam a
|
|
73
|
+
* ser ocorrências separadas.
|
|
74
|
+
*/
|
|
75
|
+
function splitRepeatable(value) {
|
|
76
|
+
return value.includes('\n') ? value.split('\n').filter(Boolean) : [value];
|
|
77
|
+
}
|
|
78
|
+
/** Mesma conversão de `formatCommand`, mas como argv para o spawn. */
|
|
79
|
+
export function flagsToArgv(flags) {
|
|
80
|
+
const argv = [];
|
|
81
|
+
for (const [name, value] of flags) {
|
|
82
|
+
for (const item of splitRepeatable(value)) {
|
|
83
|
+
if (item === 'true')
|
|
84
|
+
argv.push(`--${name}`);
|
|
85
|
+
else
|
|
86
|
+
argv.push(`--${name}`, item);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return argv;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Imprime o espelho (`$ okcms ...`), executa como filho com stdio herdado e
|
|
93
|
+
* devolve o resultado. `longRunning` muda o aviso: o comando vai bloquear
|
|
94
|
+
* (dev/start) e o Ctrl+C retorna ao wizard, não mata a sessão.
|
|
95
|
+
*/
|
|
96
|
+
export async function runCliCommand(command, flags, opts) {
|
|
97
|
+
const { prompt } = opts;
|
|
98
|
+
const spawnFn = opts.spawn ?? defaultSpawn;
|
|
99
|
+
const positional = opts.positional ?? [];
|
|
100
|
+
const line = formatCommand(command, flags, positional);
|
|
101
|
+
prompt.write(` ${style.dim(symbol.arrow)} ${style.cyan(promptMirror(line))}\n`);
|
|
102
|
+
if (opts.longRunning)
|
|
103
|
+
prompt.info('long-running command — Ctrl+C returns to the wizard');
|
|
104
|
+
const { command: exe, script } = resolveCliInvocation();
|
|
105
|
+
const args = [script, command, ...positional, ...flagsToArgv(flags)];
|
|
106
|
+
const result = await spawnFn(exe, args, opts.cwd);
|
|
107
|
+
if (result.interrupted) {
|
|
108
|
+
prompt.warn('interrupted — back to the wizard');
|
|
109
|
+
}
|
|
110
|
+
else if (result.code === 0) {
|
|
111
|
+
prompt.success('finished with success');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
prompt.error(`exited with code ${result.code}`);
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
function promptMirror(line) {
|
|
119
|
+
return `$ ${line}`;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=wizard-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-run.js","sourceRoot":"","sources":["../src/wizard-run.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,EAAE;AACF,4EAA4E;AAC5E,oEAAoE;AACpE,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,gEAAgE;AAEhE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAe,MAAM,aAAa,CAAC;AAWzD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAC/E,CAAC,SAAS,EAAuB,EAAE,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAC1F,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzE,CAAC;IACD,oEAAoE;IACpE,IAAI,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IACxE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAY,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAC1D,IAAI,OAAO,CAAY,CAAC,cAAc,EAAE,EAAE;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC;IACF,uEAAuE;IACvE,+DAA+D;IAC/D,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,cAAc,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QACjC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC;QAC7D,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,KAA8B,EAC9B,aAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,KAA8B;IACxD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,IAAI,KAAK,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;;gBACvC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,KAA8B,EAC9B,IAAsE;IAEtE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEvD,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACjF,IAAI,IAAI,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAEzF,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,KAAK,IAAI,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Runner } from './docker.js';
|
|
2
|
+
export interface WizardStateDeps {
|
|
3
|
+
cwd: string;
|
|
4
|
+
runner?: Runner;
|
|
5
|
+
/** Sobrescreve a leitura de processos (testes). */
|
|
6
|
+
appsFn?: (cwd: string) => Array<{
|
|
7
|
+
label: string;
|
|
8
|
+
alive: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export interface WizardState {
|
|
12
|
+
/** há okcms.config.json ou .env — "é um projeto OkCMS". */
|
|
13
|
+
isProject: boolean;
|
|
14
|
+
/** todas as variáveis obrigatórias do schema têm valor. */
|
|
15
|
+
envComplete: boolean;
|
|
16
|
+
/** quantas obrigatórias faltam (0 quando completo). */
|
|
17
|
+
envMissing: number;
|
|
18
|
+
dockerUp: boolean;
|
|
19
|
+
infraRunning: boolean;
|
|
20
|
+
appsRunning: boolean;
|
|
21
|
+
appsLabels: string[];
|
|
22
|
+
}
|
|
23
|
+
export type Suggestion = 'init' | 'env' | 'infra' | 'apps' | 'deploy' | 'none';
|
|
24
|
+
export declare function probeState(deps: WizardStateDeps): WizardState;
|
|
25
|
+
/**
|
|
26
|
+
* Próximo passo lógico — ordem de importância: projeto novo → env incompleto →
|
|
27
|
+
* infra parada → apps parados → pronto pra deploy.
|
|
28
|
+
*/
|
|
29
|
+
export declare function suggestNext(state: WizardState): Suggestion;
|
|
30
|
+
//# sourceMappingURL=wizard-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-state.d.ts","sourceRoot":"","sources":["../src/wizard-state.ts"],"names":[],"mappings":"AAeA,OAAO,EAAoD,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAE5F,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,WAAW,EAAE,OAAO,CAAC;IACrB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/E,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAyC7D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAM1D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// @oktis-works/cms - Wizard: sondagem de estado do projeto
|
|
2
|
+
//
|
|
3
|
+
// Checagem leve e SOMENTE LEITURA que roda no boot do wizard (e no "Refresh")
|
|
4
|
+
// pra adaptar o menu: banner de próximo passo lógico, itens indisponíveis e
|
|
5
|
+
// pré-checagens dos fluxos de deploy. Nada aqui cria arquivo, container ou
|
|
6
|
+
// processo — o pior caso é o wizard demorar ~200ms no boot.
|
|
7
|
+
//
|
|
8
|
+
// Tudo que depende de ambiente externo (docker, processos) vem injetado, então
|
|
9
|
+
// os testes nunca tocam docker de verdade.
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { ENV_FIELDS } from './env-schema.js';
|
|
13
|
+
import { loadEnvFile } from './env-file.js';
|
|
14
|
+
import { statusAll } from './runtime-state.js';
|
|
15
|
+
import { defaultRunner, dockerAvailable, inspectContainer } from './docker.js';
|
|
16
|
+
export function probeState(deps) {
|
|
17
|
+
const { cwd } = deps;
|
|
18
|
+
const runner = deps.runner ?? defaultRunner;
|
|
19
|
+
const appsFn = deps.appsFn ?? ((dir) => statusAll(dir));
|
|
20
|
+
const isProject = existsSync(join(cwd, 'okcms.config.json')) || existsSync(join(cwd, '.env'));
|
|
21
|
+
let envComplete = false;
|
|
22
|
+
let envMissing = ENV_FIELDS.filter((field) => field.required === true).length;
|
|
23
|
+
if (isProject) {
|
|
24
|
+
const record = loadEnvFile(join(cwd, '.env')).toRecord();
|
|
25
|
+
const missing = ENV_FIELDS.filter((field) => {
|
|
26
|
+
if (field.required !== true)
|
|
27
|
+
return false;
|
|
28
|
+
if (field.when && !field.when(record))
|
|
29
|
+
return false;
|
|
30
|
+
return !(record[field.key] ?? '').trim().length;
|
|
31
|
+
});
|
|
32
|
+
envMissing = missing.length;
|
|
33
|
+
envComplete = missing.length === 0;
|
|
34
|
+
}
|
|
35
|
+
const dockerUp = dockerAvailable(runner);
|
|
36
|
+
let infraRunning = false;
|
|
37
|
+
if (dockerUp) {
|
|
38
|
+
const postgres = inspectContainer(runner, 'okcms-postgres');
|
|
39
|
+
const redis = inspectContainer(runner, 'okcms-redis');
|
|
40
|
+
infraRunning = postgres.running || redis.running;
|
|
41
|
+
}
|
|
42
|
+
const apps = isProject ? appsFn(cwd) : [];
|
|
43
|
+
const aliveApps = apps.filter((app) => app.alive);
|
|
44
|
+
return {
|
|
45
|
+
isProject,
|
|
46
|
+
envComplete,
|
|
47
|
+
envMissing,
|
|
48
|
+
dockerUp,
|
|
49
|
+
infraRunning,
|
|
50
|
+
appsRunning: aliveApps.length > 0,
|
|
51
|
+
appsLabels: aliveApps.map((app) => app.label),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Próximo passo lógico — ordem de importância: projeto novo → env incompleto →
|
|
56
|
+
* infra parada → apps parados → pronto pra deploy.
|
|
57
|
+
*/
|
|
58
|
+
export function suggestNext(state) {
|
|
59
|
+
if (!state.isProject)
|
|
60
|
+
return 'init';
|
|
61
|
+
if (!state.envComplete)
|
|
62
|
+
return 'env';
|
|
63
|
+
if (state.dockerUp && !state.infraRunning)
|
|
64
|
+
return 'infra';
|
|
65
|
+
if (!state.appsRunning)
|
|
66
|
+
return 'apps';
|
|
67
|
+
return state.infraRunning ? 'deploy' : 'none';
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=wizard-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard-state.js","sourceRoot":"","sources":["../src/wizard-state.ts"],"names":[],"mappings":"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"}
|
package/dist/wizard.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type PromptIO } from './prompt.js';
|
|
2
|
+
import { type WizardLang } from './wizard-i18n.js';
|
|
3
|
+
import { type WizardState } from './wizard-state.js';
|
|
4
|
+
import { type SpawnFn } from './wizard-run.js';
|
|
5
|
+
export interface WizardOptions {
|
|
6
|
+
cwd?: string;
|
|
7
|
+
io?: Partial<PromptIO>;
|
|
8
|
+
lang?: WizardLang;
|
|
9
|
+
spawn?: SpawnFn;
|
|
10
|
+
/** Sonda de estado injetável (testes nunca tocam docker). */
|
|
11
|
+
stateFn?: () => WizardState;
|
|
12
|
+
}
|
|
13
|
+
export declare function runWizard(opts?: WizardOptions): Promise<number>;
|
|
14
|
+
/** Total de comandos registrados (usado pelo banner de documentação). */
|
|
15
|
+
export declare const wizardCommandCount: () => number;
|
|
16
|
+
//# sourceMappingURL=wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAcA,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,EAA2B,KAAK,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAE/F,OAAO,EAAgC,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAY7E,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,WAAW,CAAC;CAC7B;AAyBD,wBAAsB,SAAS,CAAC,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsEzE;AAoPD,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,QAAO,MAAyB,CAAC"}
|
package/dist/wizard.js
ADDED
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// @oktis-works/cms - Wizard interativo do CLI
|
|
2
|
+
//
|
|
3
|
+
// `okcms` sem argumentos em TTY abre isto; fora de TTY segue o help estático
|
|
4
|
+
// (automazione nunca cai aqui). O wizard é um ORQUESTRADOR: navega, explica e
|
|
5
|
+
// executa os mesmos comandos via subprocesso — ele não reimplementa nada.
|
|
6
|
+
//
|
|
7
|
+
// Três eixos no menu:
|
|
8
|
+
// 1. fluxos guiados (init, dev, 3 deploys, update);
|
|
9
|
+
// 2. qualquer um dos comandos do CLI, agrupados, destrutivos marcados;
|
|
10
|
+
// 3. entrevista de .env campo a campo.
|
|
11
|
+
// Mais: status do projeto (sondagem adaptativa), troca de idioma e sair.
|
|
12
|
+
import { getCommand, commands } from './commands.js';
|
|
13
|
+
import { commandGroupNames } from './parser.js';
|
|
14
|
+
import { Prompt, style, symbol } from './prompt.js';
|
|
15
|
+
import { catalogFor, initialLang } from './wizard-i18n.js';
|
|
16
|
+
import { probeState, suggestNext } from './wizard-state.js';
|
|
17
|
+
import { runEnvInterview } from './wizard-env.js';
|
|
18
|
+
import { runCliCommand, formatCommand } from './wizard-run.js';
|
|
19
|
+
import { flowDeployBlueGreen, flowDeployPm2, flowDeploySimple, flowDev, flowInit, flowUpdate, } from './wizard-flows.js';
|
|
20
|
+
/**
|
|
21
|
+
* Comandos destrutivos: exigem confirmação EXTRA (com o texto do perigo) antes
|
|
22
|
+
* de rodar. A lista é por NOME de comando — o wizard marca no catálogo e
|
|
23
|
+
* confirma duas vezes antes do spawn.
|
|
24
|
+
*/
|
|
25
|
+
const DANGEROUS = new Set(['db:restore', 'db:rollback', 'rollback', 'update']);
|
|
26
|
+
/** Comandos que só rodam com projeto OkCMS no cwd — avisamos antes. */
|
|
27
|
+
const NEEDS_PROJECT = new Set([
|
|
28
|
+
'start', 'stop', 'status', 'dev', 'config', 'update', 'redeploy', 'deploy',
|
|
29
|
+
'rollback', 'db:migrate', 'db:rollback', 'db:status', 'db:backup', 'db:restore',
|
|
30
|
+
'seed', 'user:create', 'plugin:install', 'plugin:list', 'plugin:manage',
|
|
31
|
+
'theme:install', 'theme:list', 'theme:manage', 'theme:build', 'build',
|
|
32
|
+
'prerender', 'media:migrate', 'system:status',
|
|
33
|
+
]);
|
|
34
|
+
/** Comandos que bloqueiam por longo tempo (Ctrl+C volta ao wizard). */
|
|
35
|
+
const LONG_RUNNING = new Set(['dev', 'start', 'init', 'update', 'redeploy', 'deploy']);
|
|
36
|
+
export async function runWizard(opts = {}) {
|
|
37
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
38
|
+
const lang = opts.lang ?? initialLang(cwd);
|
|
39
|
+
const prompt = new Prompt(opts.io);
|
|
40
|
+
// o wizard só existe com TTY de verdade — sem terminal não há setas nem
|
|
41
|
+
// entrevista; quem chamou isto por engano recebe o help e sai
|
|
42
|
+
if (!prompt.interactive) {
|
|
43
|
+
prompt.close();
|
|
44
|
+
const { generateHelp } = await import('./parser.js');
|
|
45
|
+
console.log(generateHelp());
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
const stateFn = opts.stateFn ?? (() => probeState({ cwd }));
|
|
49
|
+
const ctx = {
|
|
50
|
+
prompt,
|
|
51
|
+
cwd,
|
|
52
|
+
spawn: opts.spawn,
|
|
53
|
+
lang,
|
|
54
|
+
stateFn,
|
|
55
|
+
};
|
|
56
|
+
try {
|
|
57
|
+
for (;;) {
|
|
58
|
+
const catalog = catalogFor(ctx.lang);
|
|
59
|
+
const state = stateFn();
|
|
60
|
+
const suggestion = suggestNext(state);
|
|
61
|
+
printBanner(prompt, catalog, ctx.lang, suggestion, state);
|
|
62
|
+
const choice = await prompt.select(catalog.title, mainMenu(catalog, state));
|
|
63
|
+
switch (choice) {
|
|
64
|
+
case 'flows': {
|
|
65
|
+
await flowsMenu(ctx);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case 'command': {
|
|
69
|
+
await catalogMenu(ctx);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case 'env': {
|
|
73
|
+
await envMenu(ctx);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
case 'status': {
|
|
77
|
+
printStatus(catalog, stateFn());
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
case 'refresh': {
|
|
81
|
+
prompt.success(catalog.statusRefreshed);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'lang': {
|
|
85
|
+
ctx.lang = await prompt.select(catalog.languageHeading, [
|
|
86
|
+
{ value: 'en', label: 'English' },
|
|
87
|
+
{ value: 'pt', label: 'Português (Brasil)' },
|
|
88
|
+
]);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case 'exit': {
|
|
92
|
+
prompt.write(`\n ${style.dim(catalog.bye)}\n\n`);
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
prompt.close();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function printBanner(prompt, catalog, lang, suggestion, state) {
|
|
103
|
+
prompt.write(`\n${style.bold(` ◈ ${catalog.title}`)} ${style.dim(`· ${catalog.langLabel(lang)}`)}\n`);
|
|
104
|
+
const tip = suggestionTip(catalog, suggestion);
|
|
105
|
+
if (tip)
|
|
106
|
+
prompt.write(` ${style.cyan(symbol.arrow)} ${style.dim(tip)}\n`);
|
|
107
|
+
if (!state.isProject)
|
|
108
|
+
prompt.warn(catalog.statusNoProject);
|
|
109
|
+
}
|
|
110
|
+
function suggestionTip(catalog, suggestion) {
|
|
111
|
+
switch (suggestion) {
|
|
112
|
+
case 'init': return catalog.suggestInit;
|
|
113
|
+
case 'env': return catalog.suggestEnv;
|
|
114
|
+
case 'infra': return catalog.suggestInfra;
|
|
115
|
+
case 'apps': return catalog.suggestApps;
|
|
116
|
+
case 'deploy': return catalog.suggestDeploy;
|
|
117
|
+
default: return catalog.suggestNone;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function mainMenu(catalog, state) {
|
|
121
|
+
return [
|
|
122
|
+
{ value: 'flows', label: catalog.menuFlows, hint: catalog.menuFlowsHint },
|
|
123
|
+
{
|
|
124
|
+
value: 'command',
|
|
125
|
+
label: catalog.menuCommand,
|
|
126
|
+
hint: catalog.menuCommandHint.replace('{n}', String(wizardCommandCount())),
|
|
127
|
+
},
|
|
128
|
+
{ value: 'env', label: catalog.menuEnv, hint: state.isProject ? catalog.menuEnvHint : catalog.envNoProject },
|
|
129
|
+
{ value: 'status', label: catalog.menuStatus, hint: catalog.menuStatusHint },
|
|
130
|
+
{ value: 'lang', label: catalog.languageHeading, hint: `en / pt` },
|
|
131
|
+
{ value: 'refresh', label: catalog.menuRefresh, hint: catalog.menuRefreshHint },
|
|
132
|
+
{ value: 'exit', label: catalog.menuExit, hint: catalog.menuExitHint },
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
function printStatus(catalog, state) {
|
|
136
|
+
promptHeadingOnly(catalog.statusHeading);
|
|
137
|
+
if (!state.isProject) {
|
|
138
|
+
console.log(` ${symbol.fail} ${catalog.statusNoProject}`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
console.log(` ${symbol.arrow} ${state.envComplete ? catalog.statusEnvComplete : catalog.statusEnvIncomplete(state.envMissing)}`);
|
|
142
|
+
console.log(` ${symbol.arrow} ${state.dockerUp ? catalog.statusDockerUp : catalog.statusDockerDown}`);
|
|
143
|
+
console.log(` ${symbol.arrow} ${state.infraRunning ? catalog.statusInfraUp : catalog.statusInfraDown}`);
|
|
144
|
+
console.log(` ${symbol.arrow} ${state.appsRunning ? catalog.statusAppsUp(state.appsLabels.join(', ')) : catalog.statusAppsDown}`);
|
|
145
|
+
}
|
|
146
|
+
function promptHeadingOnly(text) {
|
|
147
|
+
console.log(`\n${style.bold(text)}`);
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// Fluxos guiados
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
async function flowsMenu(ctx) {
|
|
153
|
+
const catalog = catalogFor(ctx.lang);
|
|
154
|
+
const deps = {
|
|
155
|
+
prompt: ctx.prompt,
|
|
156
|
+
catalog,
|
|
157
|
+
cwd: ctx.cwd,
|
|
158
|
+
spawn: ctx.spawn,
|
|
159
|
+
stateFn: ctx.stateFn,
|
|
160
|
+
};
|
|
161
|
+
const pick = await ctx.prompt.select(catalog.flowsHeading, [
|
|
162
|
+
{ value: 'dev', label: catalog.flowDev, hint: catalog.flowDevHint },
|
|
163
|
+
{ value: 'bg', label: catalog.flowDeployBg, hint: catalog.flowDeployBgHint },
|
|
164
|
+
{ value: 'simple', label: catalog.flowDeploySimple, hint: catalog.flowDeploySimpleHint },
|
|
165
|
+
{ value: 'pm2', label: catalog.flowDeployPm2, hint: catalog.flowDeployPm2Hint },
|
|
166
|
+
{ value: 'update', label: catalog.flowUpdate, hint: catalog.flowUpdateHint },
|
|
167
|
+
{ value: 'init', label: catalog.flowInit, hint: catalog.flowInitHint },
|
|
168
|
+
{ value: 'back', label: catalog.flowBack, hint: catalog.flowBackHint },
|
|
169
|
+
]);
|
|
170
|
+
const runners = {
|
|
171
|
+
init: flowInit,
|
|
172
|
+
dev: flowDev,
|
|
173
|
+
bg: flowDeployBlueGreen,
|
|
174
|
+
simple: flowDeploySimple,
|
|
175
|
+
pm2: flowDeployPm2,
|
|
176
|
+
update: flowUpdate,
|
|
177
|
+
};
|
|
178
|
+
if (pick === 'back')
|
|
179
|
+
return;
|
|
180
|
+
await runners[pick](deps);
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// Catálogo de comandos (rodar qualquer um interativamente)
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
async function catalogMenu(ctx) {
|
|
186
|
+
const prompt = ctx.prompt;
|
|
187
|
+
const catalog = catalogFor(ctx.lang);
|
|
188
|
+
prompt.heading(catalog.catalogHeading);
|
|
189
|
+
prompt.info(catalog.catalogIntro);
|
|
190
|
+
const groups = commandGroupNames();
|
|
191
|
+
const groupChoices = groups.map(([group]) => ({
|
|
192
|
+
value: `group:${group}`,
|
|
193
|
+
label: group,
|
|
194
|
+
hint: `${groupCommands(group).length} commands`,
|
|
195
|
+
}));
|
|
196
|
+
groupChoices.push({ value: 'back', label: catalog.flowBack, hint: catalog.flowBackHint });
|
|
197
|
+
const groupPick = await prompt.select(catalog.catalogPickCommand, groupChoices);
|
|
198
|
+
if (groupPick === 'back')
|
|
199
|
+
return;
|
|
200
|
+
const group = groupPick.slice('group:'.length);
|
|
201
|
+
const names = groupCommands(group);
|
|
202
|
+
const commandChoices = names.map((name) => {
|
|
203
|
+
const cmd = getCommand(name);
|
|
204
|
+
const danger = DANGEROUS.has(name) ? ` ${symbol.warn}` : '';
|
|
205
|
+
return { value: name, label: `${name}${danger}`, hint: cmd.description };
|
|
206
|
+
});
|
|
207
|
+
commandChoices.push({ value: 'back', label: catalog.flowBack, hint: catalog.flowBackHint });
|
|
208
|
+
const namePick = await prompt.select(`${group}`, commandChoices);
|
|
209
|
+
if (namePick === 'back')
|
|
210
|
+
return;
|
|
211
|
+
await runCommandInteractive(ctx, getCommand(namePick));
|
|
212
|
+
}
|
|
213
|
+
function groupCommands(group) {
|
|
214
|
+
const entry = commandGroupNames().find(([name]) => name === group);
|
|
215
|
+
return entry ? entry[1] : [];
|
|
216
|
+
}
|
|
217
|
+
/** Pergunta as opções obrigatórias (e opcionais, se pedidas) e executa. */
|
|
218
|
+
async function runCommandInteractive(ctx, cmd) {
|
|
219
|
+
const prompt = ctx.prompt;
|
|
220
|
+
const catalog = catalogFor(ctx.lang);
|
|
221
|
+
const dangerous = DANGEROUS.has(cmd.name);
|
|
222
|
+
prompt.heading(dangerous ? catalog.catalogDanger(cmd.name) : `okcms ${cmd.name}`);
|
|
223
|
+
prompt.info(cmd.description);
|
|
224
|
+
if (NEEDS_PROJECT.has(cmd.name)) {
|
|
225
|
+
const state = ctx.stateFn();
|
|
226
|
+
if (!state.isProject)
|
|
227
|
+
prompt.warn(catalog.warnNoProject);
|
|
228
|
+
}
|
|
229
|
+
const flags = [];
|
|
230
|
+
for (const option of cmd.options) {
|
|
231
|
+
if (!option.required)
|
|
232
|
+
continue;
|
|
233
|
+
const label = catalog.catalogRequired(`--${option.name}`, option.description);
|
|
234
|
+
const secretLike = /password|secret/i.test(option.name);
|
|
235
|
+
let value;
|
|
236
|
+
if (secretLike) {
|
|
237
|
+
value = await prompt.secret(label, { default: option.default });
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
value = await prompt.ask(label, {
|
|
241
|
+
default: option.default,
|
|
242
|
+
placeholder: option.default ? `${option.default} (default)` : undefined,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
if (value)
|
|
246
|
+
flags.push([option.name, value]);
|
|
247
|
+
}
|
|
248
|
+
const optionals = cmd.options.filter((option) => !option.required);
|
|
249
|
+
if (optionals.length > 0) {
|
|
250
|
+
const add = await prompt.confirm(catalog.catalogAddOptionals, { defaultValue: false });
|
|
251
|
+
if (add) {
|
|
252
|
+
for (;;) {
|
|
253
|
+
const pick = await prompt.select(catalog.catalogPickOptional, [
|
|
254
|
+
...optionals.map((option) => ({
|
|
255
|
+
value: option.name,
|
|
256
|
+
label: `--${option.name}`,
|
|
257
|
+
hint: option.description,
|
|
258
|
+
})),
|
|
259
|
+
{ value: '__run', label: '▶ ' + symbol.arrow + ' run', hint: catalog.catalogDone },
|
|
260
|
+
]);
|
|
261
|
+
if (pick === '__run')
|
|
262
|
+
break;
|
|
263
|
+
const option = optionals.find((candidate) => candidate.name === pick);
|
|
264
|
+
const value = await prompt.ask(catalog.catalogValueFor(`--${option.name}`, option.description), {
|
|
265
|
+
default: option.default ?? 'true',
|
|
266
|
+
});
|
|
267
|
+
flags.push([option.name, value || 'true']);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const line = formatCommand(cmd.name, flags);
|
|
272
|
+
if (dangerous) {
|
|
273
|
+
const ok = await prompt.confirm(catalog.catalogConfirmDanger(line), { defaultValue: false });
|
|
274
|
+
if (!ok) {
|
|
275
|
+
prompt.warn(catalog.stepCancelled);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else if (!(await prompt.confirm(catalog.catalogConfirmRun(line), { defaultValue: true }))) {
|
|
280
|
+
prompt.warn(catalog.stepCancelled);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
await runCliCommand(cmd.name, flags, {
|
|
284
|
+
prompt,
|
|
285
|
+
spawn: ctx.spawn,
|
|
286
|
+
cwd: ctx.cwd,
|
|
287
|
+
longRunning: LONG_RUNNING.has(cmd.name),
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// Entrevista de env como item de menu
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
async function envMenu(ctx) {
|
|
294
|
+
const catalog = catalogFor(ctx.lang);
|
|
295
|
+
const state = ctx.stateFn();
|
|
296
|
+
if (!state.isProject) {
|
|
297
|
+
ctx.prompt.warn(catalog.envNoProject);
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
await runEnvInterview({ prompt: ctx.prompt, catalog, cwd: ctx.cwd });
|
|
301
|
+
}
|
|
302
|
+
/** Total de comandos registrados (usado pelo banner de documentação). */
|
|
303
|
+
export const wizardCommandCount = () => commands.length;
|
|
304
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"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"}
|