@neetru/cli 2.31.0 → 2.32.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 +99 -2
- package/README.md +2 -0
- package/dist/cli-kit/choices.d.ts +33 -0
- package/dist/cli-kit/choices.js +32 -0
- package/dist/cli-kit/command-context.d.ts +98 -0
- package/dist/cli-kit/command-context.js +108 -0
- package/dist/cli-kit/errors.d.ts +79 -0
- package/dist/cli-kit/errors.js +94 -0
- package/dist/cli-kit/index.d.ts +8 -0
- package/dist/cli-kit/index.js +8 -0
- package/dist/cli-kit/suggest.d.ts +74 -0
- package/dist/cli-kit/suggest.js +207 -0
- package/dist/commands/admin/oidc-login.js +1 -1
- package/dist/commands/admin/sdk-credential.js +1 -1
- package/dist/commands/autocomplete.d.ts +1 -1
- package/dist/commands/autocomplete.js +1 -0
- package/dist/commands/bug.d.ts +59 -0
- package/dist/commands/bug.js +118 -6
- package/dist/commands/build.d.ts +24 -1
- package/dist/commands/build.js +195 -73
- package/dist/commands/chat.d.ts +94 -1
- package/dist/commands/chat.js +258 -26
- package/dist/commands/customers.js +1 -1
- package/dist/commands/db-move.js +3 -3
- package/dist/commands/db.js +20 -33
- package/dist/commands/deploy.d.ts +91 -2
- package/dist/commands/deploy.js +423 -78
- package/dist/commands/deployments.js +11 -6
- package/dist/commands/dev-context.js +15 -5
- package/dist/commands/docs-produto.d.ts +25 -0
- package/dist/commands/docs-produto.js +70 -8
- package/dist/commands/doctor.js +36 -1
- package/dist/commands/domains.js +85 -4
- package/dist/commands/env.d.ts +9 -3
- package/dist/commands/env.js +23 -3
- package/dist/commands/infra-read.js +2 -2
- package/dist/commands/init.js +8 -1
- package/dist/commands/login.js +35 -8
- package/dist/commands/logs.js +12 -4
- package/dist/commands/mobile.js +33 -9
- package/dist/commands/new.d.ts +29 -1
- package/dist/commands/new.js +92 -4
- package/dist/commands/open.js +16 -6
- package/dist/commands/ops.js +1 -1
- package/dist/commands/products-db.d.ts +1 -0
- package/dist/commands/products-db.js +41 -8
- package/dist/commands/products.d.ts +17 -3
- package/dist/commands/products.js +86 -18
- package/dist/commands/promote.js +30 -5
- package/dist/commands/secrets.d.ts +91 -0
- package/dist/commands/secrets.js +471 -0
- package/dist/commands/servers.js +8 -5
- package/dist/commands/status.js +2 -2
- package/dist/commands/support.js +5 -3
- package/dist/commands/tenants.js +28 -16
- package/dist/commands/upgrade.d.ts +9 -0
- package/dist/commands/upgrade.js +50 -1
- package/dist/commands/vm-memory.js +1 -0
- package/dist/commands/webhooks.d.ts +2 -0
- package/dist/commands/webhooks.js +9 -3
- package/dist/commands/workspaces.js +42 -11
- package/dist/index.js +70 -14
- package/dist/lib/api-client.d.ts +14 -0
- package/dist/lib/api-client.js +59 -6
- package/dist/lib/api-error.d.ts +14 -0
- package/dist/lib/api-error.js +107 -46
- package/dist/lib/build-targets.d.ts +127 -0
- package/dist/lib/build-targets.js +348 -0
- package/dist/lib/cli-error.d.ts +13 -0
- package/dist/lib/cli-error.js +24 -0
- package/dist/lib/cli-write.d.ts +43 -9
- package/dist/lib/cli-write.js +154 -45
- package/dist/lib/config-schema.d.ts +8 -8
- package/dist/lib/db-local/db-json.d.ts +1 -1
- package/dist/lib/db-local/db-json.js +13 -5
- package/dist/lib/db-local/env.d.ts +15 -3
- package/dist/lib/db-local/env.js +37 -10
- package/dist/lib/db-pipeline/build-deps.d.ts +5 -1
- package/dist/lib/db-pipeline/build-deps.js +23 -3
- package/dist/lib/db-pipeline/types.d.ts +6 -2
- package/dist/lib/db-pipeline/types.js +0 -18
- package/dist/lib/deploy-target-contract.d.ts +152 -0
- package/dist/lib/deploy-target-contract.js +411 -0
- package/dist/lib/env-file-do-build.d.ts +19 -0
- package/dist/lib/env-file-do-build.js +44 -0
- package/dist/lib/envs.d.ts +108 -0
- package/dist/lib/envs.js +127 -0
- package/dist/lib/fs-seguro.d.ts +63 -0
- package/dist/lib/fs-seguro.js +108 -0
- package/dist/lib/inquirer-sob-demanda.d.ts +14 -0
- package/dist/lib/inquirer-sob-demanda.js +18 -0
- package/dist/lib/mobile-local/mobile-json.js +10 -4
- package/dist/lib/pickers.d.ts +44 -7
- package/dist/lib/pickers.js +65 -7
- package/dist/lib/product-docs/sync.d.ts +6 -0
- package/dist/lib/product-docs/sync.js +10 -1
- package/dist/lib/public-secret-scan.d.ts +44 -3
- package/dist/lib/public-secret-scan.js +361 -36
- package/dist/lib/render.d.ts +16 -0
- package/dist/lib/render.js +34 -4
- package/dist/lib/segredo-produto.d.ts +124 -0
- package/dist/lib/segredo-produto.js +336 -0
- package/dist/lib/texto-utf8.d.ts +96 -0
- package/dist/lib/texto-utf8.js +196 -0
- package/package.json +2 -1
- package/dist/cli-kit/format.js.map +0 -1
- package/dist/cli-kit/glyphs.js.map +0 -1
- package/dist/cli-kit/index.js.map +0 -1
- package/dist/cli-kit/palette.js.map +0 -1
- package/dist/commands/add.js.map +0 -1
- package/dist/commands/admin/iam-check.js.map +0 -1
- package/dist/commands/admin/oidc-login.js.map +0 -1
- package/dist/commands/admin/sdk-credential.js.map +0 -1
- package/dist/commands/agent-release.js.map +0 -1
- package/dist/commands/agent-write.js.map +0 -1
- package/dist/commands/ai-models.js.map +0 -1
- package/dist/commands/ai.js.map +0 -1
- package/dist/commands/api-catalog.js.map +0 -1
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/artifact-registry.js.map +0 -1
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/autocomplete.js.map +0 -1
- package/dist/commands/billing.js.map +0 -1
- package/dist/commands/bootstrap.js.map +0 -1
- package/dist/commands/bug.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/chat-menu.js.map +0 -1
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/cloud-run.js.map +0 -1
- package/dist/commands/code.js.map +0 -1
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/customers.js.map +0 -1
- package/dist/commands/db-move.js.map +0 -1
- package/dist/commands/db.js.map +0 -1
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/deployments.js.map +0 -1
- package/dist/commands/dev-context.js.map +0 -1
- package/dist/commands/dev-up.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/docs-produto.js.map +0 -1
- package/dist/commands/docs.js.map +0 -1
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/domains.js.map +0 -1
- package/dist/commands/dr.js.map +0 -1
- package/dist/commands/env.js.map +0 -1
- package/dist/commands/hosting-write.js.map +0 -1
- package/dist/commands/infra-read.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/mobile.js.map +0 -1
- package/dist/commands/mocks.js.map +0 -1
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/open.js.map +0 -1
- package/dist/commands/ops.js.map +0 -1
- package/dist/commands/products-db.js.map +0 -1
- package/dist/commands/products.js.map +0 -1
- package/dist/commands/promote.js.map +0 -1
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/schema.js.map +0 -1
- package/dist/commands/servers.js.map +0 -1
- package/dist/commands/smoke.js.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/support.js.map +0 -1
- package/dist/commands/surface-status.js.map +0 -1
- package/dist/commands/tenants.js.map +0 -1
- package/dist/commands/ui.js.map +0 -1
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/vm-memory.js.map +0 -1
- package/dist/commands/vm.js.map +0 -1
- package/dist/commands/webhooks.js.map +0 -1
- package/dist/commands/whoami.js.map +0 -1
- package/dist/commands/workspaces.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/agent-artifact-url.js.map +0 -1
- package/dist/lib/agent-commands.js.map +0 -1
- package/dist/lib/ai/auth-discovery.js.map +0 -1
- package/dist/lib/ai/context.js.map +0 -1
- package/dist/lib/ai/orchestrator.js.map +0 -1
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/api-error.js.map +0 -1
- package/dist/lib/auth.js.map +0 -1
- package/dist/lib/cli-read.js.map +0 -1
- package/dist/lib/cli-write.js.map +0 -1
- package/dist/lib/code-agent-budget.js.map +0 -1
- package/dist/lib/code-agent-files.js.map +0 -1
- package/dist/lib/code-agent-gateway.js.map +0 -1
- package/dist/lib/code-agent-git-tools.js.map +0 -1
- package/dist/lib/code-agent-protocol.js.map +0 -1
- package/dist/lib/code-agent-session.js.map +0 -1
- package/dist/lib/code-agent-settings.js.map +0 -1
- package/dist/lib/code-agent-skills.js.map +0 -1
- package/dist/lib/code-agent-subagents.js.map +0 -1
- package/dist/lib/code-agent-tools.js.map +0 -1
- package/dist/lib/code-agent-tui.js.map +0 -1
- package/dist/lib/code-agent-types.js.map +0 -1
- package/dist/lib/code-agent-ui.js.map +0 -1
- package/dist/lib/code-agent-web-tools.js.map +0 -1
- package/dist/lib/code-agent-write-tools.js.map +0 -1
- package/dist/lib/compose-generator.js.map +0 -1
- package/dist/lib/config-schema.js.map +0 -1
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/db-local/db-json.js.map +0 -1
- package/dist/lib/db-local/env.js.map +0 -1
- package/dist/lib/db-local/fingerprint.js.map +0 -1
- package/dist/lib/db-local/index.js.map +0 -1
- package/dist/lib/db-pipeline/build-deps.js.map +0 -1
- package/dist/lib/db-pipeline/errors.js.map +0 -1
- package/dist/lib/db-pipeline/index.js.map +0 -1
- package/dist/lib/db-pipeline/pipeline.js.map +0 -1
- package/dist/lib/db-pipeline/rehearse.js.map +0 -1
- package/dist/lib/db-pipeline/types.js.map +0 -1
- package/dist/lib/dev-local-context.js.map +0 -1
- package/dist/lib/iam-preflight.js.map +0 -1
- package/dist/lib/mobile-local/index.js.map +0 -1
- package/dist/lib/mobile-local/mobile-json.js.map +0 -1
- package/dist/lib/pickers.js.map +0 -1
- package/dist/lib/product-config.js.map +0 -1
- package/dist/lib/product-docs/check.js.map +0 -1
- package/dist/lib/product-docs/config.js.map +0 -1
- package/dist/lib/product-docs/dates.js.map +0 -1
- package/dist/lib/product-docs/frontmatter.js.map +0 -1
- package/dist/lib/product-docs/git.js.map +0 -1
- package/dist/lib/product-docs/markdown.js.map +0 -1
- package/dist/lib/product-docs/ops.js.map +0 -1
- package/dist/lib/product-docs/structure.js.map +0 -1
- package/dist/lib/product-docs/sync.js.map +0 -1
- package/dist/lib/product-docs/taxonomy.js.map +0 -1
- package/dist/lib/product-docs/templates.js.map +0 -1
- package/dist/lib/public-secret-scan.js.map +0 -1
- package/dist/lib/render.js.map +0 -1
- package/dist/lib/schema-cache.js.map +0 -1
- package/dist/lib/sse.js.map +0 -1
- package/dist/lib/telemetry.js.map +0 -1
- package/dist/lib/token-resolver.js.map +0 -1
- package/dist/lib/url-allowlist.js.map +0 -1
- package/dist/lib/version-check.js.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/logo.js.map +0 -1
- package/dist/utils/safe-exit.js.map +0 -1
- package/dist/utils/spinner-registry.js.map +0 -1
- package/dist/version.js.map +0 -1
package/dist/lib/pickers.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import
|
|
2
|
+
import { carregarInquirer } from './inquirer-sob-demanda.js';
|
|
3
3
|
import { apiRequest } from './api-client.js';
|
|
4
4
|
import { handleApiError } from './api-error.js';
|
|
5
|
+
import { adviseCommand, declaredInputs } from '../cli-kit/command-context.js';
|
|
5
6
|
import { log } from '../utils/logger.js';
|
|
6
7
|
import { safeExit } from '../utils/safe-exit.js';
|
|
7
8
|
export function isInteractive(opts = {}) {
|
|
@@ -26,12 +27,32 @@ function failLookup(error, json) {
|
|
|
26
27
|
// →2) divergentes dos comandos, contribuindo pro conflito que quebrava CI.
|
|
27
28
|
return handleApiError(error, json);
|
|
28
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* A entrada que o conselho pode citar, já validada contra o comando em
|
|
32
|
+
* execução: `'--tenant'`, `'<id>'`, `'<serverId> ou --server'`… — ou `null`
|
|
33
|
+
* quando o comando não declara nenhuma das candidatas (ou não há comando).
|
|
34
|
+
*
|
|
35
|
+
* P105: o texto fixo citava a entrada padrão do picker. Medido na árvore do
|
|
36
|
+
* Commander em 2026-10-18, ela não existia em 10 comandos: `tenants get|
|
|
37
|
+
* update|suspend|reactivate` (recebem `[id]`, não `--tenant`), `servers
|
|
38
|
+
* deactivate|dispatch` (`[serverId]`, não `--server`), `products publish|
|
|
39
|
+
* unpublish` (`[slug]`, não `--product`) e `admin database create`/`products
|
|
40
|
+
* db create` (`--product-id`/`--server-id`, não `--product`/`--server`).
|
|
41
|
+
*/
|
|
42
|
+
export function entradaDoPicker(opts) {
|
|
43
|
+
const declaradas = declaredInputs(opts.inputs ?? [opts.flagName]);
|
|
44
|
+
return declaradas.length > 0 ? declaradas.join(' ou ') : null;
|
|
45
|
+
}
|
|
29
46
|
export async function resolveOrPick(opts) {
|
|
30
47
|
const flagged = opts.fromFlag?.trim();
|
|
31
48
|
if (flagged)
|
|
32
49
|
return flagged;
|
|
50
|
+
const entrada = entradaDoPicker(opts);
|
|
51
|
+
const sujeito = opts.subject ?? 'o valor';
|
|
33
52
|
if (opts.json) {
|
|
34
|
-
failInput(
|
|
53
|
+
failInput(entrada
|
|
54
|
+
? `${entrada} e obrigatorio em modo --json.`
|
|
55
|
+
: `Este comando precisa escolher ${sujeito} e, em modo --json, não há como perguntar qual.`, true);
|
|
35
56
|
}
|
|
36
57
|
let items;
|
|
37
58
|
try {
|
|
@@ -50,8 +71,13 @@ export async function resolveOrPick(opts) {
|
|
|
50
71
|
const available = items
|
|
51
72
|
.map((item) => ` - ${opts.getId(item)}: ${stripAnsi(opts.format(item))}`)
|
|
52
73
|
.join('\n');
|
|
53
|
-
failInput(
|
|
74
|
+
failInput(entrada
|
|
75
|
+
? `Multiplos candidatos encontrados. Passe ${entrada} explicitamente.\nDisponiveis:\n${available}`
|
|
76
|
+
: `Múltiplos candidatos encontrados, e este comando não recebe ${sujeito} por argumento: ` +
|
|
77
|
+
`rode num terminal interativo para escolher.\nDisponiveis:\n${available}`, opts.json);
|
|
54
78
|
}
|
|
79
|
+
// Só aqui o picker pergunta: o inquirer é carregado agora (P115).
|
|
80
|
+
const inquirer = await carregarInquirer();
|
|
55
81
|
const choices = items.map((item) => ({
|
|
56
82
|
name: opts.format(item),
|
|
57
83
|
value: opts.getId(item),
|
|
@@ -83,7 +109,7 @@ export async function promptText(message, opts = {}) {
|
|
|
83
109
|
return '';
|
|
84
110
|
failInput(`Informe ${message}`, opts.json);
|
|
85
111
|
}
|
|
86
|
-
const answer = await
|
|
112
|
+
const answer = await (await carregarInquirer()).prompt([
|
|
87
113
|
{
|
|
88
114
|
type: 'input',
|
|
89
115
|
name: 'value',
|
|
@@ -107,7 +133,7 @@ export async function promptChoice(message, choices, opts = {}) {
|
|
|
107
133
|
return opts.default;
|
|
108
134
|
failInput(`Escolha ${message}`, opts.json);
|
|
109
135
|
}
|
|
110
|
-
const answer = await
|
|
136
|
+
const answer = await (await carregarInquirer()).prompt([
|
|
111
137
|
{
|
|
112
138
|
type: 'list',
|
|
113
139
|
name: 'picked',
|
|
@@ -122,6 +148,21 @@ export async function promptChoice(message, choices, opts = {}) {
|
|
|
122
148
|
// Slugs Neetru-owned conhecidos no cliente CLI (espelho do fallback server-side).
|
|
123
149
|
// Atualizar junto com NEETRU_PRODUCT_SLUGS_FALLBACK em resolve-default.ts.
|
|
124
150
|
const NEETRU_SLUGS_CLI = ['gestovendas', 'pdv-agiliza'];
|
|
151
|
+
/**
|
|
152
|
+
* Versão só-slug da heurística abaixo, para quando o produto AINDA NÃO existe
|
|
153
|
+
* no Core — caso do `neetru new`, que precisa decidir o customer antes de
|
|
154
|
+
* criar qualquer coisa.
|
|
155
|
+
*
|
|
156
|
+
* bug_7dcb68e2666a43f69ef362d2cbff94ed: como a lista de fallback tem apenas
|
|
157
|
+
* dois slugs, todo produto novo cai no caminho "não é Neetru-owned", que é
|
|
158
|
+
* justamente o caminho em que o Core exige `--customer`. O ponto é avisar
|
|
159
|
+
* ANTES, e não quebrar no passo [2/5] com o produto já criado.
|
|
160
|
+
*/
|
|
161
|
+
export function isNeetruOwnedSlug(slug) {
|
|
162
|
+
if (!slug)
|
|
163
|
+
return false;
|
|
164
|
+
return NEETRU_SLUGS_CLI.includes(slug.trim().toLowerCase());
|
|
165
|
+
}
|
|
125
166
|
/**
|
|
126
167
|
* Verifica (via GET /api/cli/v1/products/{id}) se um produto é Neetru-owned.
|
|
127
168
|
* Usa heurísticas de cliente: ownedBy==='neetru' | ownerTeam==='Neetru Core' | slug fallback.
|
|
@@ -220,6 +261,17 @@ export function productLabel(product) {
|
|
|
220
261
|
const team = product.ownerTeam ? chalk.dim(`- ${product.ownerTeam}`) : '';
|
|
221
262
|
return compact([statusDot(product.status), chalk.bold(name), slug, status, team]).join(' ');
|
|
222
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* "Nenhum produto": a dica de criar só cita `neetru products create` se o
|
|
266
|
+
* comando existe na árvore (P105).
|
|
267
|
+
*/
|
|
268
|
+
function semProdutoAinda() {
|
|
269
|
+
return adviseCommand({
|
|
270
|
+
command: 'products create',
|
|
271
|
+
withCommand: 'Nenhum produto encontrado. Crie com: neetru products create',
|
|
272
|
+
withoutCommand: 'Nenhum produto encontrado.',
|
|
273
|
+
});
|
|
274
|
+
}
|
|
223
275
|
export async function pickProductId(token, opts = {}) {
|
|
224
276
|
return resolveOrPick({
|
|
225
277
|
...opts,
|
|
@@ -227,8 +279,9 @@ export async function pickProductId(token, opts = {}) {
|
|
|
227
279
|
format: productLabel,
|
|
228
280
|
getId: (product) => product.id,
|
|
229
281
|
message: opts.message ?? 'Escolha o produto:',
|
|
230
|
-
emptyError:
|
|
282
|
+
emptyError: semProdutoAinda(),
|
|
231
283
|
flagName: '--product',
|
|
284
|
+
subject: 'o produto',
|
|
232
285
|
});
|
|
233
286
|
}
|
|
234
287
|
/**
|
|
@@ -272,8 +325,9 @@ export async function pickProductSlug(token, opts = {}) {
|
|
|
272
325
|
format: productLabel,
|
|
273
326
|
getId: (product) => product.slug ?? product.id,
|
|
274
327
|
message: opts.message ?? 'Escolha o produto:',
|
|
275
|
-
emptyError:
|
|
328
|
+
emptyError: semProdutoAinda(),
|
|
276
329
|
flagName: '--product',
|
|
330
|
+
subject: 'o produto',
|
|
277
331
|
});
|
|
278
332
|
}
|
|
279
333
|
export async function pickTenant(token, opts = {}) {
|
|
@@ -285,6 +339,7 @@ export async function pickTenant(token, opts = {}) {
|
|
|
285
339
|
message: opts.message ?? 'Escolha o tenant:',
|
|
286
340
|
emptyError: 'Nenhum tenant encontrado no escopo atual.',
|
|
287
341
|
flagName: '--tenant',
|
|
342
|
+
subject: 'o tenant',
|
|
288
343
|
});
|
|
289
344
|
}
|
|
290
345
|
export async function pickWorkspace(token, opts = {}) {
|
|
@@ -296,6 +351,7 @@ export async function pickWorkspace(token, opts = {}) {
|
|
|
296
351
|
message: opts.message ?? 'Escolha o workspace:',
|
|
297
352
|
emptyError: 'Nenhum workspace encontrado no escopo atual.',
|
|
298
353
|
flagName: '<workspaceId>',
|
|
354
|
+
subject: 'o workspace',
|
|
299
355
|
});
|
|
300
356
|
}
|
|
301
357
|
export async function pickServer(token, opts = {}) {
|
|
@@ -307,6 +363,7 @@ export async function pickServer(token, opts = {}) {
|
|
|
307
363
|
message: opts.message ?? 'Escolha o server:',
|
|
308
364
|
emptyError: 'Nenhum server encontrado no escopo atual.',
|
|
309
365
|
flagName: '--server',
|
|
366
|
+
subject: 'o server',
|
|
310
367
|
});
|
|
311
368
|
}
|
|
312
369
|
export async function pickDatabase(token, opts = {}) {
|
|
@@ -322,6 +379,7 @@ export async function pickDatabase(token, opts = {}) {
|
|
|
322
379
|
message: opts.message ?? 'Escolha o banco:',
|
|
323
380
|
emptyError: 'Nenhum banco encontrado no escopo atual.',
|
|
324
381
|
flagName: '<id>',
|
|
382
|
+
subject: 'o banco',
|
|
325
383
|
});
|
|
326
384
|
}
|
|
327
385
|
function workspaceLabel(workspace) {
|
|
@@ -53,9 +53,15 @@ export interface SyncResult {
|
|
|
53
53
|
file: string;
|
|
54
54
|
codes: string[];
|
|
55
55
|
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Docs que o Core recusou. `httpStatus` é o status da resposta (0 = sem
|
|
58
|
+
* resposta HTTP: rede, timeout) — é dele que sai o código de saída de cada
|
|
59
|
+
* falha no `neetru docs sync` (P105).
|
|
60
|
+
*/
|
|
56
61
|
falhas: Array<{
|
|
57
62
|
slug: string;
|
|
58
63
|
message: string;
|
|
64
|
+
httpStatus: number;
|
|
59
65
|
}>;
|
|
60
66
|
/** Não enviados por regra do Core conferida localmente (slug, tamanho). */
|
|
61
67
|
recusados: Array<{
|
|
@@ -294,13 +294,22 @@ export async function syncProductDocs(repo, opts) {
|
|
|
294
294
|
base.falhas.push({
|
|
295
295
|
slug: d.slug,
|
|
296
296
|
message: status === 413 ? `grande demais para o Core (${msg})` : status === 429 ? `limite de envios do Core (${msg}) — tente de novo em alguns minutos` : msg,
|
|
297
|
+
httpStatus: status,
|
|
297
298
|
});
|
|
298
299
|
break;
|
|
299
300
|
}
|
|
300
301
|
}
|
|
301
302
|
}
|
|
302
303
|
if (base.falhas.length) {
|
|
303
|
-
|
|
304
|
+
// P105: "parcial" só quando algo deu certo (enviado ou já igual no Core).
|
|
305
|
+
// Com tudo falhando, dizer "parcial" era o mesmo tipo de mentira do
|
|
306
|
+
// bug_6e9fe576 ao contrário — o status passa a ser `falha`.
|
|
307
|
+
const deuCerto = base.enviados.length + base.inalterados.length;
|
|
308
|
+
return {
|
|
309
|
+
...base,
|
|
310
|
+
status: deuCerto > 0 ? 'parcial' : 'falha',
|
|
311
|
+
message: `${base.enviados.length} enviado(s), ${base.falhas.length} com falha.`,
|
|
312
|
+
};
|
|
304
313
|
}
|
|
305
314
|
return {
|
|
306
315
|
...base,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ProblemaDeCodificacao } from './texto-utf8.js';
|
|
1
2
|
export interface SecretPattern {
|
|
2
3
|
id: 'nrt_key' | 'npk_key' | 'private_key';
|
|
3
4
|
label: string;
|
|
@@ -40,17 +41,57 @@ export interface ScanResult {
|
|
|
40
41
|
/** Arquivos públicos grandes demais para varrer (caminhos). */
|
|
41
42
|
skippedLarge: string[];
|
|
42
43
|
}
|
|
43
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Regex que acha o valor no pacote com cada caractere que pode sair escapado
|
|
46
|
+
* em qualquer uma das suas formas, letra a letra: o SWC do Next mistura as
|
|
47
|
+
* formas dentro do MESMO valor (`chave-€-łódź` sai com `€`, `ł` e `ź` crus
|
|
48
|
+
* e `ó` como `\xf3`). `emBytes` diz se o pacote foi lido em latin1 (a forma
|
|
49
|
+
* crua é então a dos bytes UTF-8). Devolve `null` quando nenhum caractere do
|
|
50
|
+
* valor pode sair escapado: aí basta `includes`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function padraoDoValorNoPacote(valor: string, emBytes: boolean): RegExp | null;
|
|
53
|
+
/**
|
|
54
|
+
* Varre um conteúdo de arquivo. Um achado por (arquivo, padrão): desde a
|
|
55
|
+
* rodada final 5 do cli#81 cada nome tem até três valores procurados (o do
|
|
56
|
+
* Next, o do Vite e o cru), e quando um é pedaço do outro os dois casavam. A
|
|
57
|
+
* busca do nome para no primeiro valor achado.
|
|
58
|
+
*/
|
|
44
59
|
export declare function scanContent(file: string, content: Buffer | string, envSecrets: readonly PublicEnvSecret[]): PublicSecretFinding[];
|
|
45
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Lê o .env com a regra do dotenv, a MESMA que o `@next/env` 15.5 e o Vite 5.4
|
|
62
|
+
* embutem (copiada dos dois no `node_modules` da core-deps; rodada final 4 do
|
|
63
|
+
* cli#81). A varredura procura no pacote o valor que o bundler leu, e o parser
|
|
64
|
+
* mínimo de antes divergia em quatro pontos, medidos num `next build` real:
|
|
65
|
+
* - `CHAVE=valor # nota`: o dotenv corta no `#`; o parser antigo levava a nota;
|
|
66
|
+
* - valor entre crases: o dotenv tira as crases; o antigo não;
|
|
67
|
+
* - `CHAVE="a\nb"`: entre aspas duplas, o dotenv troca `\n` e `\r` pela
|
|
68
|
+
* quebra de linha e pelo retorno; o antigo deixava a barra e a letra;
|
|
69
|
+
* - valor entre aspas em mais de uma linha: o dotenv junta; o antigo cortava.
|
|
70
|
+
*/
|
|
46
71
|
export declare function parseDotenv(content: string): Record<string, string>;
|
|
47
72
|
/** Arquivos .env que o bundler lê num build de produção (o `.env*` NÃO viaja no tarball). */
|
|
48
73
|
export declare const BUILD_ENV_FILES: readonly [".env", ".env.production", ".env.local", ".env.production.local"];
|
|
49
74
|
/**
|
|
50
75
|
* Coleta envs públicas com nome sensível a partir do ambiente do build:
|
|
51
76
|
* `.env*` do projeto, `--env-file` e `process.env` do CLI (o build roda com ele).
|
|
77
|
+
*
|
|
78
|
+
* Rodada final 2 do cli#81: cada arquivo é lido COMO O BUNDLER O LÊ, porque a
|
|
79
|
+
* varredura procura no pacote o valor que o bundler gravou lá. O `@next/env`
|
|
80
|
+
* (Next 15.5) lê o `.env` com `readFileSync(…, "utf8")` e o Vite 5.4 passa os
|
|
81
|
+
* bytes ao `dotenv`, que faz `toString()`: os dois trocam byte que não é UTF-8
|
|
82
|
+
* por U+FFFD, e é esse valor trocado que vai ao JS do navegador. Por isso aqui
|
|
83
|
+
* a leitura NÃO recusa (como faz o `--env-file`, que a CLI injeta ela mesma):
|
|
84
|
+
* recusar esconderia o valor que de fato está no pacote. Em vez de passar
|
|
85
|
+
* calado, `aoLerForaDeUtf8` recebe cada arquivo que não é UTF-8 limpo, para o
|
|
86
|
+
* deploy avisar que o app vai receber outro valor.
|
|
87
|
+
*
|
|
88
|
+
* Rodada final 5: o `--env-file` não é um `.env` que o bundler lê. O
|
|
89
|
+
* `neetru build` o injeta no ambiente do processo do build, com a regra
|
|
90
|
+
* própria da CLI (`variaveisDoEnvFile`). Por isso ele entra aqui como ambiente:
|
|
91
|
+
* vence os arquivos, serve de fonte para a expansão e não é expandido. Cada
|
|
92
|
+
* valor é procurado como o Next o deixa, como o Vite o deixa e cru.
|
|
52
93
|
*/
|
|
53
|
-
export declare function collectPublicEnvSecrets(cwd: string, envFile?: string, processEnv?: NodeJS.ProcessEnv): Promise<PublicEnvSecret[]>;
|
|
94
|
+
export declare function collectPublicEnvSecrets(cwd: string, envFile?: string, processEnv?: NodeJS.ProcessEnv, aoLerForaDeUtf8?: (arquivo: string, problema: ProblemaDeCodificacao) => void): Promise<PublicEnvSecret[]>;
|
|
54
95
|
/**
|
|
55
96
|
* Lê um .tar.gz em streaming e chama `onFile` para cada arquivo regular que
|
|
56
97
|
* `want(nome, tamanho)` aceitar. Arquivos não desejados são pulados sem buffer.
|