@neetru/cli 2.11.3 → 2.12.1
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/CHANGELOG.md +561 -547
- package/README.md +33 -5
- package/dist/commands/ai.js +40 -15
- package/dist/commands/ai.js.map +1 -1
- package/dist/commands/auth.js +8 -0
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/autocomplete.js +34 -34
- package/dist/commands/config.js +13 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/db.d.ts +6 -0
- package/dist/commands/db.js +58 -0
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.js +64 -7
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev-up.d.ts +70 -0
- package/dist/commands/dev-up.js +224 -0
- package/dist/commands/dev-up.js.map +1 -0
- package/dist/commands/doctor.js +14 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/dr.js +8 -0
- package/dist/commands/dr.js.map +1 -1
- package/dist/commands/fn.d.ts +6 -0
- package/dist/commands/fn.js +88 -0
- package/dist/commands/fn.js.map +1 -0
- package/dist/commands/init.js +164 -121
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/marketplace.d.ts +36 -0
- package/dist/commands/marketplace.js +585 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/ops.d.ts +41 -9
- package/dist/commands/ops.js +371 -21
- package/dist/commands/ops.js.map +1 -1
- package/dist/index.js +38 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/ai/auth-discovery.d.ts +7 -1
- package/dist/lib/ai/auth-discovery.js +23 -1
- package/dist/lib/ai/auth-discovery.js.map +1 -1
- package/dist/lib/ai/context.d.ts +0 -3
- package/dist/lib/ai/context.js +109 -90
- package/dist/lib/ai/context.js.map +1 -1
- package/dist/lib/ai/orchestrator.d.ts +43 -8
- package/dist/lib/ai/orchestrator.js +452 -150
- package/dist/lib/ai/orchestrator.js.map +1 -1
- package/dist/lib/api-client.js +9 -2
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/config.d.ts +5 -1
- package/dist/lib/config.js +5 -1
- package/dist/lib/config.js.map +1 -1
- package/package.json +1 -1
- package/templates/auth/callback.ts +22 -22
- package/templates/auth/sign-in.tsx +41 -41
- package/templates/billing/checkout.ts +22 -22
- package/templates/billing/page.tsx +43 -43
- package/templates/support/ticket-form.tsx +68 -68
- package/templates/usage/track.ts +30 -30
- package/templates/users/profile.tsx +43 -43
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru dev up` — emulador local estilo Firebase Emulator Suite.
|
|
3
|
+
*
|
|
4
|
+
* Origem: ENG_REVERSA_CLI_2026-06-08 (F-EMU / P0) — "neetru dev start" que sobe
|
|
5
|
+
* o ambiente de dev 100% local, sem tocar GCP. Opção A (VM-first):
|
|
6
|
+
*
|
|
7
|
+
* 1. Sobe os Firebase Emulators (Firestore + Auth + Functions) via
|
|
8
|
+
* `firebase emulators:start --only ...` no diretório do Core.
|
|
9
|
+
* 2. Espera o Firestore subir (porta 8080).
|
|
10
|
+
* 3. Sobe o Core Next.js em modo dev (`npm run dev`) com env apontando pros
|
|
11
|
+
* emuladores locais (FIRESTORE_EMULATOR_HOST / FIREBASE_AUTH_EMULATOR_HOST).
|
|
12
|
+
* 4. Espera o Core subir (porta 9003) e imprime as URLs.
|
|
13
|
+
* 5. Ctrl-C encerra os DOIS processos limpo (SIGTERM em cascata).
|
|
14
|
+
*
|
|
15
|
+
* A orquestração é injetada via `DevUpDeps` pra ser unit-testável sem subir
|
|
16
|
+
* processo/rede de verdade (mesmo padrão do `dev.ts`).
|
|
17
|
+
*
|
|
18
|
+
* Plain PT-BR nas strings visíveis. NÃO substitui a migração futura pra um
|
|
19
|
+
* emulador de ModuleEngine (Opção C do design) — é o passo P0.
|
|
20
|
+
*/
|
|
21
|
+
import { spawn } from 'node:child_process';
|
|
22
|
+
import * as fsSync from 'node:fs';
|
|
23
|
+
import * as net from 'node:net';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import chalk from 'chalk';
|
|
26
|
+
import ora from 'ora';
|
|
27
|
+
import { log } from '../utils/logger.js';
|
|
28
|
+
import { safeExit, setSafeExitCode } from '../utils/safe-exit.js';
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Constantes
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
/** Portas default dos emuladores Firebase (firebase.json pode sobrescrever). */
|
|
33
|
+
const FIRESTORE_PORT = 8080;
|
|
34
|
+
const AUTH_PORT = 9099;
|
|
35
|
+
/** Porta default do Core Next.js em dev (CLAUDE.md: dev port 9003). */
|
|
36
|
+
const DEFAULT_CORE_PORT = 9003;
|
|
37
|
+
/** Timeout pra cada serviço subir antes de desistir. */
|
|
38
|
+
const PORT_WAIT_TIMEOUT_MS = 90_000;
|
|
39
|
+
/** Arquivos que identificam o diretório do Core (onde rodar tudo). */
|
|
40
|
+
const CORE_MARKERS = ['firebase.json'];
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// buildDevUpDeps — fiação de produção
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export function buildDevUpDeps() {
|
|
45
|
+
return {
|
|
46
|
+
spawnProc(name, cmd, args, env, cwd) {
|
|
47
|
+
const child = spawn(cmd, args, {
|
|
48
|
+
cwd,
|
|
49
|
+
env: { ...process.env, ...env },
|
|
50
|
+
stdio: 'inherit',
|
|
51
|
+
shell: process.platform === 'win32',
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
name,
|
|
55
|
+
kill: (signal = 'SIGTERM') => {
|
|
56
|
+
try {
|
|
57
|
+
child.kill(signal);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// já morto — ignora
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
onExit: (cb) => child.on('exit', cb),
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
waitForPort(port, timeoutMs) {
|
|
67
|
+
const deadline = Date.now() + timeoutMs;
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
const tryOnce = () => {
|
|
70
|
+
const sock = net.connect({ port, host: '127.0.0.1' });
|
|
71
|
+
const onFail = () => {
|
|
72
|
+
sock.destroy();
|
|
73
|
+
if (Date.now() >= deadline) {
|
|
74
|
+
resolve(false);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
setTimeout(tryOnce, 500);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
sock.once('connect', () => {
|
|
81
|
+
sock.destroy();
|
|
82
|
+
resolve(true);
|
|
83
|
+
});
|
|
84
|
+
sock.once('error', onFail);
|
|
85
|
+
};
|
|
86
|
+
tryOnce();
|
|
87
|
+
});
|
|
88
|
+
},
|
|
89
|
+
existsSync: (p) => fsSync.existsSync(p),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// runDevUp — o orquestrador
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
export async function runDevUp(opts = {}, deps = buildDevUpDeps()) {
|
|
96
|
+
log.banner();
|
|
97
|
+
log.heading('neetru dev up');
|
|
98
|
+
const corePath = path.resolve(opts.corePath ?? process.cwd());
|
|
99
|
+
const corePort = opts.corePort ?? DEFAULT_CORE_PORT;
|
|
100
|
+
const only = opts.only ?? 'firestore,auth,functions';
|
|
101
|
+
// ── 1. Valida que estamos no diretório do Core ─────────────────────────────
|
|
102
|
+
const hasMarker = CORE_MARKERS.some((m) => deps.existsSync(path.join(corePath, m)));
|
|
103
|
+
if (!hasMarker) {
|
|
104
|
+
log.error(`firebase.json não encontrado em ${chalk.bold(corePath)}. ` +
|
|
105
|
+
'Rode `neetru dev up` na raiz do Core (ou passe --core-path).');
|
|
106
|
+
safeExit(1);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const procs = [];
|
|
110
|
+
let tearingDown = false;
|
|
111
|
+
const teardown = (reason) => {
|
|
112
|
+
if (tearingDown)
|
|
113
|
+
return;
|
|
114
|
+
tearingDown = true;
|
|
115
|
+
log.dim('');
|
|
116
|
+
log.info(`Encerrando (${reason})…`);
|
|
117
|
+
// SIGTERM em cascata — Core primeiro, emuladores depois.
|
|
118
|
+
for (const p of [...procs].reverse()) {
|
|
119
|
+
p.kill('SIGTERM');
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
// ── 2. Sobe os emuladores Firebase ─────────────────────────────────────────
|
|
123
|
+
// F-IMPORT: --import restaura um seed portátil; --export-on-exit salva o
|
|
124
|
+
// estado ao sair (time-travel de dados compartilhável no repo via git).
|
|
125
|
+
const emuArgs = ['emulators:start', '--only', only];
|
|
126
|
+
if (opts.importDir)
|
|
127
|
+
emuArgs.push('--import', opts.importDir);
|
|
128
|
+
if (opts.exportOnExit)
|
|
129
|
+
emuArgs.push('--export-on-exit', opts.exportOnExit);
|
|
130
|
+
const emuSpinner = ora({ text: `Subindo emuladores (${only})…`, color: 'blue' }).start();
|
|
131
|
+
const emulators = deps.spawnProc('emulators', 'firebase', emuArgs, {}, corePath);
|
|
132
|
+
procs.push(emulators);
|
|
133
|
+
// Se os emuladores morrerem, derruba tudo.
|
|
134
|
+
emulators.onExit((code) => {
|
|
135
|
+
if (!tearingDown)
|
|
136
|
+
teardown(`emuladores saíram com código ${code ?? '?'}`);
|
|
137
|
+
});
|
|
138
|
+
const firestoreUp = await deps.waitForPort(FIRESTORE_PORT, PORT_WAIT_TIMEOUT_MS);
|
|
139
|
+
if (!firestoreUp) {
|
|
140
|
+
emuSpinner.fail(`Firestore não subiu na porta ${FIRESTORE_PORT} a tempo.`);
|
|
141
|
+
teardown('timeout dos emuladores');
|
|
142
|
+
safeExit(1);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
emuSpinner.succeed(`Emuladores no ar — Firestore ${chalk.dim(':' + FIRESTORE_PORT)} · Auth ${chalk.dim(':' + AUTH_PORT)}`);
|
|
146
|
+
log.dim(` Emulator UI: ${chalk.cyan('http://localhost:4000')}`);
|
|
147
|
+
// ── 3. Sobe o Core apontando pros emuladores ───────────────────────────────
|
|
148
|
+
if (!opts.skipCore) {
|
|
149
|
+
const coreSpinner = ora({ text: 'Subindo Core (npm run dev)…', color: 'blue' }).start();
|
|
150
|
+
const core = deps.spawnProc('core', 'npm', ['run', 'dev'], {
|
|
151
|
+
FIRESTORE_EMULATOR_HOST: `127.0.0.1:${FIRESTORE_PORT}`,
|
|
152
|
+
FIREBASE_AUTH_EMULATOR_HOST: `127.0.0.1:${AUTH_PORT}`,
|
|
153
|
+
NEETRU_ENV: 'dev',
|
|
154
|
+
PORT: String(corePort),
|
|
155
|
+
}, corePath);
|
|
156
|
+
procs.push(core);
|
|
157
|
+
core.onExit((code) => {
|
|
158
|
+
if (!tearingDown)
|
|
159
|
+
teardown(`Core saiu com código ${code ?? '?'}`);
|
|
160
|
+
});
|
|
161
|
+
const coreUp = await deps.waitForPort(corePort, PORT_WAIT_TIMEOUT_MS);
|
|
162
|
+
if (!coreUp) {
|
|
163
|
+
coreSpinner.fail(`Core não subiu na porta ${corePort} a tempo.`);
|
|
164
|
+
teardown('timeout do Core');
|
|
165
|
+
safeExit(1);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
coreSpinner.succeed(`Core no ar — ${chalk.cyan('http://localhost:' + corePort)}`);
|
|
169
|
+
}
|
|
170
|
+
log.dim('');
|
|
171
|
+
log.success('Ambiente de dev local pronto. 100% offline (sem GCP).');
|
|
172
|
+
log.dim(' (Ctrl-C para encerrar tudo)');
|
|
173
|
+
// ── 4. Aguarda Ctrl-C / autoStop ───────────────────────────────────────────
|
|
174
|
+
if (opts.autoStop) {
|
|
175
|
+
teardown('autoStop');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
await new Promise((resolve) => {
|
|
179
|
+
const onSignal = () => {
|
|
180
|
+
teardown('Ctrl-C');
|
|
181
|
+
// dá um tempinho pros processos receberem o SIGTERM antes de sair.
|
|
182
|
+
setTimeout(resolve, 300);
|
|
183
|
+
};
|
|
184
|
+
process.once('SIGINT', onSignal);
|
|
185
|
+
process.once('SIGTERM', onSignal);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Roda `<script>` com os emuladores ativos, encerra e propaga o exit code —
|
|
190
|
+
* idêntico ao `firebase emulators:exec`. Fecha o gap de testes de integração
|
|
191
|
+
* CI que hoje precisam de credenciais de staging real (ENG_REVERSA_CLI F-SEED).
|
|
192
|
+
*/
|
|
193
|
+
export async function runDevExec(script, opts = {}, deps = buildDevUpDeps()) {
|
|
194
|
+
log.banner();
|
|
195
|
+
log.heading('neetru dev exec');
|
|
196
|
+
const corePath = path.resolve(opts.corePath ?? process.cwd());
|
|
197
|
+
const only = opts.only ?? 'firestore,auth,functions';
|
|
198
|
+
if (!script || !script.trim()) {
|
|
199
|
+
log.error('Informe o script a rodar: `neetru dev exec "<comando>"`.');
|
|
200
|
+
safeExit(1);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!CORE_MARKERS.some((m) => deps.existsSync(path.join(corePath, m)))) {
|
|
204
|
+
log.error(`firebase.json não encontrado em ${chalk.bold(corePath)}. ` +
|
|
205
|
+
'Rode na raiz do Core (ou passe --core-path).');
|
|
206
|
+
safeExit(1);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
log.info(`Rodando ${chalk.bold(script)} com emuladores (${only})…`);
|
|
210
|
+
const proc = deps.spawnProc('exec', 'firebase', ['emulators:exec', '--only', only, script], {}, corePath);
|
|
211
|
+
await new Promise((resolve) => {
|
|
212
|
+
proc.onExit((code) => {
|
|
213
|
+
if (code && code !== 0) {
|
|
214
|
+
log.error(`Script falhou (exit ${code}).`);
|
|
215
|
+
setSafeExitCode(code); // propaga pro CI sem matar o drain
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
log.success('Script concluído.');
|
|
219
|
+
}
|
|
220
|
+
resolve();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=dev-up.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-up.js","sourceRoot":"","sources":["../../src/commands/dev-up.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -35,7 +35,9 @@ export async function checkToken() {
|
|
|
35
35
|
if (typeof t !== 'string' || !t.startsWith('nrt_')) {
|
|
36
36
|
return { name: 'token CLI', ok: false, detail: 'formato inválido (esperado nrt_*)' };
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
// bug: slice(0,12) expunha 8 chars de material secreto em --json/logs.
|
|
39
|
+
// Mostra apenas o prefixo constante "nrt_" sem entropia do token.
|
|
40
|
+
return { name: 'token CLI', ok: true, detail: `presente (nrt_*)` };
|
|
39
41
|
}
|
|
40
42
|
export async function checkCoreHealth() {
|
|
41
43
|
try {
|
|
@@ -82,7 +84,9 @@ export async function checkConfigSchema(cwd) {
|
|
|
82
84
|
};
|
|
83
85
|
}
|
|
84
86
|
export async function checkNeetruEnv(cwd) {
|
|
85
|
-
|
|
87
|
+
// bug: 'production' não é valor canônico do SDK/Core — o correto é 'prod'.
|
|
88
|
+
// 'production' causava doctor OK mas runtime falhava ao comparar NEETRU_ENV.
|
|
89
|
+
const valid = ['dev', 'workspace', 'beta', 'prod'];
|
|
86
90
|
// Procura .env.local pra ver NEETRU_ENV.
|
|
87
91
|
try {
|
|
88
92
|
const raw = await fs.readFile(path.join(cwd, '.env.local'), 'utf8');
|
|
@@ -96,6 +100,14 @@ export async function checkNeetruEnv(cwd) {
|
|
|
96
100
|
};
|
|
97
101
|
}
|
|
98
102
|
const v = m[1].trim().replace(/^['"]|['"]$/g, '');
|
|
103
|
+
// Dica de migração: 'production' era aceito antes mas nunca foi canônico.
|
|
104
|
+
if (v === 'production') {
|
|
105
|
+
return {
|
|
106
|
+
name: 'NEETRU_ENV',
|
|
107
|
+
ok: false,
|
|
108
|
+
detail: `"production" não é valor válido — renomeie pra "prod" em .env.local`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
99
111
|
if (!valid.includes(v)) {
|
|
100
112
|
return {
|
|
101
113
|
name: 'NEETRU_ENV',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,MAAM,YAAY,GAAG,wCAAwC,CAAC;AAmB9D,yEAAyE;AAEzE,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,+EAA+E;IAC/E,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC7E,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IACvF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/dr.js
CHANGED
|
@@ -17,6 +17,8 @@ export async function runDrExportsList(opts) {
|
|
|
17
17
|
const spinner = opts.json
|
|
18
18
|
? null
|
|
19
19
|
: ora({ text: 'Buscando exports de DR…', color: 'blue' }).start();
|
|
20
|
+
// bug: res sem inicialização — se handleApiError for mockado como no-op em testes,
|
|
21
|
+
// o acesso posterior causaria TypeError. Usar undefined + null-check como defesa.
|
|
20
22
|
let res;
|
|
21
23
|
try {
|
|
22
24
|
res = await apiRequest('/api/cli/v1/dr/exports', { token });
|
|
@@ -26,6 +28,8 @@ export async function runDrExportsList(opts) {
|
|
|
26
28
|
spinner?.fail('Falha ao listar exports.');
|
|
27
29
|
handleApiError(error, opts.json);
|
|
28
30
|
}
|
|
31
|
+
if (!res)
|
|
32
|
+
return;
|
|
29
33
|
if (opts.json) {
|
|
30
34
|
console.log(JSON.stringify(res));
|
|
31
35
|
return;
|
|
@@ -58,6 +62,8 @@ export async function runDrRestore(opts) {
|
|
|
58
62
|
const spinner = opts.json
|
|
59
63
|
? null
|
|
60
64
|
: ora({ text: 'Disparando restore…', color: 'blue' }).start();
|
|
65
|
+
// bug: res sem inicialização — se handleApiError for mockado como no-op em testes,
|
|
66
|
+
// o acesso posterior causaria TypeError. Usar undefined + null-check como defesa.
|
|
61
67
|
let res;
|
|
62
68
|
try {
|
|
63
69
|
res = await apiRequest(`/api/cli/v1/dr/restore${opts.dryRun ? '?dryRun=true' : ''}`, {
|
|
@@ -72,6 +78,8 @@ export async function runDrRestore(opts) {
|
|
|
72
78
|
spinner?.fail('Falha ao disparar restore.');
|
|
73
79
|
handleApiError(error, opts.json);
|
|
74
80
|
}
|
|
81
|
+
if (!res)
|
|
82
|
+
return;
|
|
75
83
|
printWriteResult(res.dryRun
|
|
76
84
|
? res
|
|
77
85
|
: { operationName: res.operationName, targetProject: res.targetProject }, `Restore disparado — operationName: ${res.operationName}. ` +
|
package/dist/commands/dr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dr.js","sourceRoot":"","sources":["../../src/commands/dr.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAejD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAwB;IAC7D,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI;QACvB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACpE,IAAI,
|
|
1
|
+
{"version":3,"file":"dr.js","sourceRoot":"","sources":["../../src/commands/dr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `neetru fn` — gestão de Functions/APIs do produto.
|
|
3
|
+
*
|
|
4
|
+
* Sprint 10 (CLI 1.4) — `neetru fn deploy`.
|
|
5
|
+
* Stub: chama API Core (`/cli/v1/fn/deploy`) registrando uma nova versão da
|
|
6
|
+
* API publicada no catálogo `neetru-apis` (Sprint 7 — `api-catalog/`).
|
|
7
|
+
*
|
|
8
|
+
* NOTA: O endpoint real ainda não existe (pendente Sprint 11). Por agora
|
|
9
|
+
* o command apresenta o fluxo + faz uma chamada que retorna 404 ou 501 —
|
|
10
|
+
* trata gracefully como "feature em construção" pra o owner saber que o
|
|
11
|
+
* comando está wired mas o backend não está pronto.
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs/promises';
|
|
14
|
+
import * as fsSync from 'node:fs';
|
|
15
|
+
import * as path from 'node:path';
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import { log } from '../utils/logger.js';
|
|
18
|
+
import { apiRequest, CliApiError, CliNetworkError } from '../lib/api-client.js';
|
|
19
|
+
import { safeExit } from '../utils/safe-exit.js';
|
|
20
|
+
const CONFIG_FILENAMES = ['neetru.config.json', '.neetru.json'];
|
|
21
|
+
async function loadProductConfig() {
|
|
22
|
+
for (const name of CONFIG_FILENAMES) {
|
|
23
|
+
const filePath = path.resolve(process.cwd(), name);
|
|
24
|
+
if (fsSync.existsSync(filePath)) {
|
|
25
|
+
try {
|
|
26
|
+
const raw = await fs.readFile(filePath, 'utf8');
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
export async function runFnDeploy(opts = {}) {
|
|
37
|
+
log.banner();
|
|
38
|
+
log.heading('neetru fn deploy');
|
|
39
|
+
const cfg = await loadProductConfig();
|
|
40
|
+
if (!cfg) {
|
|
41
|
+
log.error('neetru.config.json não encontrado.');
|
|
42
|
+
safeExit(1);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const version = opts.version ?? cfg.apiVersion ?? 'v1';
|
|
46
|
+
const channel = opts.channel ?? 'stable';
|
|
47
|
+
// Optional spec file (OpenAPI / JSON schema). Apenas valida existência —
|
|
48
|
+
// upload real virá no Sprint 11.
|
|
49
|
+
if (opts.spec) {
|
|
50
|
+
const specAbs = path.resolve(process.cwd(), opts.spec);
|
|
51
|
+
if (!fsSync.existsSync(specAbs)) {
|
|
52
|
+
log.error(`Spec não encontrado: ${opts.spec}`);
|
|
53
|
+
safeExit(2);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
log.info(`Spec carregado: ${chalk.bold(opts.spec)}`);
|
|
57
|
+
}
|
|
58
|
+
log.info(`Registering API ${chalk.bold(cfg.slug)} ${chalk.bold(version)} (${channel}) ...`);
|
|
59
|
+
try {
|
|
60
|
+
const r = await apiRequest('/cli/v1/fn/deploy', {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
body: { productId: cfg.slug, apiVersion: version, channel, hasSpec: !!opts.spec },
|
|
63
|
+
});
|
|
64
|
+
log.success(`API ${r.productId}@${r.apiVersion} registrada no canal ${r.channel}.`);
|
|
65
|
+
log.dim(` registered=${r.registered}`);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err instanceof CliApiError) {
|
|
69
|
+
if (err.status === 404 || err.status === 501) {
|
|
70
|
+
log.warn(`Endpoint /cli/v1/fn/deploy ainda não disponível (${err.status}).`);
|
|
71
|
+
log.dim(' Esta funcionalidade entra em build no Sprint 11. Ver docs/PLATFORM_RELATORIO_FINAL_CTO.md.');
|
|
72
|
+
safeExit(0);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
log.error(`API ${err.status}: ${err.message}`);
|
|
76
|
+
safeExit(3);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (err instanceof CliNetworkError) {
|
|
80
|
+
log.error(`Conexão falhou: ${err.message}`);
|
|
81
|
+
safeExit(4);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
85
|
+
safeExit(5);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=fn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fn.js","sourceRoot":"","sources":["../../src/commands/fn.ts"],"names":[],"mappings":"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"}
|