@oktis-works/cms 0.1.14 → 0.2.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/dist/assets.d.ts +94 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +671 -0
- package/dist/assets.js.map +1 -0
- package/dist/bluegreen.d.ts +121 -0
- package/dist/bluegreen.d.ts.map +1 -0
- package/dist/bluegreen.js +393 -0
- package/dist/bluegreen.js.map +1 -0
- package/dist/commands.d.ts +6 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +158 -61
- package/dist/commands.js.map +1 -1
- package/dist/config-wizard.d.ts +39 -0
- package/dist/config-wizard.d.ts.map +1 -0
- package/dist/config-wizard.js +308 -0
- package/dist/config-wizard.js.map +1 -0
- package/dist/deploy.d.ts +20 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +304 -0
- package/dist/deploy.js.map +1 -0
- package/dist/docker.d.ts +148 -0
- package/dist/docker.d.ts.map +1 -0
- package/dist/docker.js +324 -0
- package/dist/docker.js.map +1 -0
- package/dist/docs-updater.d.ts +10 -0
- package/dist/docs-updater.d.ts.map +1 -0
- package/dist/docs-updater.js +45 -0
- package/dist/docs-updater.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +51 -0
- package/dist/doctor.js.map +1 -1
- package/dist/env-file.d.ts +45 -0
- package/dist/env-file.d.ts.map +1 -0
- package/dist/env-file.js +200 -0
- package/dist/env-file.js.map +1 -0
- package/dist/env-schema.d.ts +28 -0
- package/dist/env-schema.d.ts.map +1 -0
- package/dist/env-schema.js +497 -0
- package/dist/env-schema.js.map +1 -0
- package/dist/guards.d.ts +40 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +159 -0
- package/dist/guards.js.map +1 -0
- package/dist/history.d.ts +48 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +104 -0
- package/dist/history.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +12 -3
- package/dist/parser.js.map +1 -1
- package/dist/project-config.js +2 -2
- package/dist/prompt.d.ts +81 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +379 -0
- package/dist/prompt.js.map +1 -0
- package/dist/redeploy.d.ts +109 -0
- package/dist/redeploy.d.ts.map +1 -0
- package/dist/redeploy.js +363 -0
- package/dist/redeploy.js.map +1 -0
- package/dist/rollback.d.ts +15 -0
- package/dist/rollback.d.ts.map +1 -0
- package/dist/rollback.js +170 -0
- package/dist/rollback.js.map +1 -0
- package/dist/scaffold-docs.d.ts +30 -6
- package/dist/scaffold-docs.d.ts.map +1 -1
- package/dist/scaffold-docs.js +728 -33
- package/dist/scaffold-docs.js.map +1 -1
- package/dist/scaffold.d.ts +17 -1
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +77 -14
- package/dist/scaffold.js.map +1 -1
- package/dist/theme-build.d.ts +35 -0
- package/dist/theme-build.d.ts.map +1 -0
- package/dist/theme-build.js +86 -0
- package/dist/theme-build.js.map +1 -0
- package/dist/update.d.ts +52 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +273 -0
- package/dist/update.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
// @oktis-works/cms - Catálogo de variáveis de ambiente do projeto
|
|
2
|
+
//
|
|
3
|
+
// Fonte única de verdade para o wizard `okcms config`: quais chaves existem,
|
|
4
|
+
// em qual seção, o que significam, como validar e qual o default. Não é um
|
|
5
|
+
// "schema" da aplicação — é o contrato do `.env`, que é o que o operador
|
|
6
|
+
// realmente edita.
|
|
7
|
+
//
|
|
8
|
+
// Os defaults aqui batem com `@oktis-works/config loadConfig()` e com o
|
|
9
|
+
// `.env.example` gerado no `okcms init`. Se mudar um default no config, mude
|
|
10
|
+
// aqui também (o teste de catálogo cobre esse vínculo).
|
|
11
|
+
import { parseDatabaseUrl } from './doctor.js';
|
|
12
|
+
export const ENV_SECTIONS = [
|
|
13
|
+
{ id: 'app', title: 'Aplicação', hint: 'NODE_ENV, portas e rate limit' },
|
|
14
|
+
{ id: 'database', title: 'Banco de dados', hint: 'Postgres via DB_* ou DATABASE_URL' },
|
|
15
|
+
{ id: 'redis', title: 'Redis', hint: 'cache e filas do worker' },
|
|
16
|
+
{ id: 'auth', title: 'Autenticação', hint: 'JWT, cookies e CSRF' },
|
|
17
|
+
{ id: 'storage', title: 'Storage', hint: 'local, s3, r2 ou minio' },
|
|
18
|
+
{ id: 'worker', title: 'Worker', hint: 'concorrência e retries das filas' },
|
|
19
|
+
{ id: 'cache', title: 'Cache', hint: 'TTL e prefixo das chaves' },
|
|
20
|
+
{ id: 'ports', title: 'Ports dos apps', hint: 'admin e web' },
|
|
21
|
+
{ id: 'theme', title: 'Tema', hint: 'tema ativo do site' },
|
|
22
|
+
{ id: 'deploy', title: 'Deploy (Docker)', hint: 'imagem blue/green e host do proxy' },
|
|
23
|
+
];
|
|
24
|
+
export const ENV_FIELDS = [
|
|
25
|
+
// -- Aplicação ------------------------------------------------------------
|
|
26
|
+
{
|
|
27
|
+
key: 'NODE_ENV',
|
|
28
|
+
section: 'app',
|
|
29
|
+
label: 'NODE_ENV',
|
|
30
|
+
description: 'development | production | test',
|
|
31
|
+
type: 'enum',
|
|
32
|
+
options: ['development', 'production', 'test'],
|
|
33
|
+
default: 'development',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
key: 'HOST',
|
|
37
|
+
section: 'app',
|
|
38
|
+
label: 'HOST',
|
|
39
|
+
description: 'Interface de bind da API',
|
|
40
|
+
type: 'string',
|
|
41
|
+
default: '0.0.0.0',
|
|
42
|
+
example: '0.0.0.0',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
key: 'PORT',
|
|
46
|
+
section: 'app',
|
|
47
|
+
label: 'PORT',
|
|
48
|
+
description: 'Porta da API',
|
|
49
|
+
type: 'port',
|
|
50
|
+
default: '3000',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: 'CORS_ORIGINS',
|
|
54
|
+
section: 'app',
|
|
55
|
+
label: 'CORS_ORIGINS',
|
|
56
|
+
description: 'Origens liberadas (separadas por vírgula)',
|
|
57
|
+
type: 'string',
|
|
58
|
+
default: 'http://localhost:4321',
|
|
59
|
+
example: 'https://meusite.com,https://admin.meusite.com',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
key: 'RATE_LIMIT_WINDOW_MS',
|
|
63
|
+
section: 'app',
|
|
64
|
+
label: 'RATE_LIMIT_WINDOW_MS',
|
|
65
|
+
description: 'Janela do rate limit em milissegundos',
|
|
66
|
+
type: 'number',
|
|
67
|
+
default: '60000',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key: 'RATE_LIMIT_MAX',
|
|
71
|
+
section: 'app',
|
|
72
|
+
label: 'RATE_LIMIT_MAX',
|
|
73
|
+
description: 'Requisições máximas por janela',
|
|
74
|
+
type: 'number',
|
|
75
|
+
default: '100',
|
|
76
|
+
},
|
|
77
|
+
// -- Banco de dados -------------------------------------------------------
|
|
78
|
+
{
|
|
79
|
+
key: 'DB_HOST',
|
|
80
|
+
section: 'database',
|
|
81
|
+
label: 'DB_HOST',
|
|
82
|
+
description: 'Ignorado quando DATABASE_URL estiver definida',
|
|
83
|
+
type: 'string',
|
|
84
|
+
default: 'localhost',
|
|
85
|
+
when: (r) => !r['DATABASE_URL'],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
key: 'DB_PORT',
|
|
89
|
+
section: 'database',
|
|
90
|
+
label: 'DB_PORT',
|
|
91
|
+
description: 'Porta do Postgres',
|
|
92
|
+
type: 'port',
|
|
93
|
+
default: '5432',
|
|
94
|
+
when: (r) => !r['DATABASE_URL'],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
key: 'DB_NAME',
|
|
98
|
+
section: 'database',
|
|
99
|
+
label: 'DB_NAME',
|
|
100
|
+
description: 'Nome do banco',
|
|
101
|
+
type: 'string',
|
|
102
|
+
default: 'okcms',
|
|
103
|
+
when: (r) => !r['DATABASE_URL'],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
key: 'DB_USER',
|
|
107
|
+
section: 'database',
|
|
108
|
+
label: 'DB_USER',
|
|
109
|
+
description: 'Usuário do banco',
|
|
110
|
+
type: 'string',
|
|
111
|
+
default: 'postgres',
|
|
112
|
+
when: (r) => !r['DATABASE_URL'],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
key: 'DB_PASSWORD',
|
|
116
|
+
section: 'database',
|
|
117
|
+
label: 'DB_PASSWORD',
|
|
118
|
+
description: 'Senha do banco',
|
|
119
|
+
type: 'secret',
|
|
120
|
+
required: true,
|
|
121
|
+
when: (r) => !r['DATABASE_URL'],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
key: 'DB_SSL',
|
|
125
|
+
section: 'database',
|
|
126
|
+
label: 'DB_SSL',
|
|
127
|
+
description: 'TLS no Postgres (true em provedor gerenciado)',
|
|
128
|
+
type: 'boolean',
|
|
129
|
+
default: 'false',
|
|
130
|
+
when: (r) => !r['DATABASE_URL'],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
key: 'DB_MAX_CONNECTIONS',
|
|
134
|
+
section: 'database',
|
|
135
|
+
label: 'DB_MAX_CONNECTIONS',
|
|
136
|
+
description: 'Pool máximo de conexões',
|
|
137
|
+
type: 'number',
|
|
138
|
+
default: '20',
|
|
139
|
+
when: (r) => !r['DATABASE_URL'],
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
key: 'DATABASE_URL',
|
|
143
|
+
section: 'database',
|
|
144
|
+
label: 'DATABASE_URL',
|
|
145
|
+
description: 'Formato único — tem precedência sobre DB_* (postgres://user:senha@host:5432/banco)',
|
|
146
|
+
type: 'database-url',
|
|
147
|
+
example: 'postgresql://postgres:senha@localhost:5432/okcms',
|
|
148
|
+
},
|
|
149
|
+
// -- Redis ----------------------------------------------------------------
|
|
150
|
+
{
|
|
151
|
+
key: 'REDIS_HOST',
|
|
152
|
+
section: 'redis',
|
|
153
|
+
label: 'REDIS_HOST',
|
|
154
|
+
description: 'use "disabled" para rodar sem Redis (memória)',
|
|
155
|
+
type: 'string',
|
|
156
|
+
default: 'localhost',
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
key: 'REDIS_PORT',
|
|
160
|
+
section: 'redis',
|
|
161
|
+
label: 'REDIS_PORT',
|
|
162
|
+
description: 'Porta do Redis',
|
|
163
|
+
type: 'port',
|
|
164
|
+
default: '6379',
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
key: 'REDIS_PASSWORD',
|
|
168
|
+
section: 'redis',
|
|
169
|
+
label: 'REDIS_PASSWORD',
|
|
170
|
+
description: 'Senha do Redis (vazio se não houver)',
|
|
171
|
+
type: 'secret',
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
key: 'REDIS_DB',
|
|
175
|
+
section: 'redis',
|
|
176
|
+
label: 'REDIS_DB',
|
|
177
|
+
description: 'Índice da database do Redis',
|
|
178
|
+
type: 'number',
|
|
179
|
+
default: '0',
|
|
180
|
+
},
|
|
181
|
+
// -- Autenticação ---------------------------------------------------------
|
|
182
|
+
{
|
|
183
|
+
key: 'JWT_SECRET',
|
|
184
|
+
section: 'auth',
|
|
185
|
+
label: 'JWT_SECRET',
|
|
186
|
+
description: 'Segredo de assinatura dos tokens — mínimo 16 caracteres',
|
|
187
|
+
type: 'secret',
|
|
188
|
+
required: true,
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
key: 'JWT_EXPIRES_IN',
|
|
192
|
+
section: 'auth',
|
|
193
|
+
label: 'JWT_EXPIRES_IN',
|
|
194
|
+
description: 'Validade do access token',
|
|
195
|
+
type: 'duration',
|
|
196
|
+
default: '15m',
|
|
197
|
+
example: '15m, 2h, 7d',
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
key: 'REFRESH_TOKEN_EXPIRES_IN',
|
|
201
|
+
section: 'auth',
|
|
202
|
+
label: 'REFRESH_TOKEN_EXPIRES_IN',
|
|
203
|
+
description: 'Validade do refresh token',
|
|
204
|
+
type: 'duration',
|
|
205
|
+
default: '7d',
|
|
206
|
+
example: '1d, 30d',
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
key: 'BCRYPT_ROUNDS',
|
|
210
|
+
section: 'auth',
|
|
211
|
+
label: 'BCRYPT_ROUNDS',
|
|
212
|
+
description: 'Custo do hash de senha (10..15)',
|
|
213
|
+
type: 'number',
|
|
214
|
+
default: '12',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
key: 'AUTH_COOKIE_SAMESITE',
|
|
218
|
+
section: 'auth',
|
|
219
|
+
label: 'AUTH_COOKIE_SAMESITE',
|
|
220
|
+
description: 'strict | lax | none (none exige secure=true)',
|
|
221
|
+
type: 'enum',
|
|
222
|
+
options: ['strict', 'lax', 'none'],
|
|
223
|
+
default: 'lax',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
key: 'AUTH_COOKIE_SECURE',
|
|
227
|
+
section: 'auth',
|
|
228
|
+
label: 'AUTH_COOKIE_SECURE',
|
|
229
|
+
description: 'true atrás de TLS',
|
|
230
|
+
type: 'boolean',
|
|
231
|
+
default: 'false',
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
key: 'AUTH_CSRF_ENABLED',
|
|
235
|
+
section: 'auth',
|
|
236
|
+
label: 'AUTH_CSRF_ENABLED',
|
|
237
|
+
description: 'Proteção CSRF double-submit',
|
|
238
|
+
type: 'boolean',
|
|
239
|
+
default: 'true',
|
|
240
|
+
},
|
|
241
|
+
// -- Storage --------------------------------------------------------------
|
|
242
|
+
{
|
|
243
|
+
key: 'STORAGE_DRIVER',
|
|
244
|
+
section: 'storage',
|
|
245
|
+
label: 'STORAGE_DRIVER',
|
|
246
|
+
description: 'Onde a mídia é gravada',
|
|
247
|
+
type: 'enum',
|
|
248
|
+
options: ['local', 's3', 'r2', 'minio'],
|
|
249
|
+
default: 'local',
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
key: 'STORAGE_LOCAL_PATH',
|
|
253
|
+
section: 'storage',
|
|
254
|
+
label: 'STORAGE_LOCAL_PATH',
|
|
255
|
+
description: 'Pasta local da mídia (driver=local) — monte como volume no Docker',
|
|
256
|
+
type: 'path',
|
|
257
|
+
default: '.data/storage',
|
|
258
|
+
when: (r) => (r['STORAGE_DRIVER'] ?? 'local') === 'local',
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
key: 'STORAGE_PUBLIC_BASE',
|
|
262
|
+
section: 'storage',
|
|
263
|
+
label: 'STORAGE_PUBLIC_BASE',
|
|
264
|
+
description: 'Prefixo público das URLs de mídia',
|
|
265
|
+
type: 'path',
|
|
266
|
+
default: '/storage',
|
|
267
|
+
when: (r) => (r['STORAGE_DRIVER'] ?? 'local') === 'local',
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
key: 'STORAGE_BUCKET',
|
|
271
|
+
section: 'storage',
|
|
272
|
+
label: 'STORAGE_BUCKET',
|
|
273
|
+
description: 'Bucket (s3/r2/minio)',
|
|
274
|
+
type: 'string',
|
|
275
|
+
when: (r) => (r['STORAGE_DRIVER'] ?? 'local') !== 'local',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
key: 'STORAGE_ENDPOINT',
|
|
279
|
+
section: 'storage',
|
|
280
|
+
label: 'STORAGE_ENDPOINT',
|
|
281
|
+
description: 'Endpoint S3-compatível',
|
|
282
|
+
type: 'url',
|
|
283
|
+
example: 'http://localhost:9000',
|
|
284
|
+
when: (r) => (r['STORAGE_DRIVER'] ?? 'local') !== 'local',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
key: 'STORAGE_ACCESS_KEY',
|
|
288
|
+
section: 'storage',
|
|
289
|
+
label: 'STORAGE_ACCESS_KEY',
|
|
290
|
+
description: 'Chave de acesso do objeto',
|
|
291
|
+
type: 'secret',
|
|
292
|
+
when: (r) => (r['STORAGE_DRIVER'] ?? 'local') !== 'local',
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
key: 'STORAGE_SECRET_KEY',
|
|
296
|
+
section: 'storage',
|
|
297
|
+
label: 'STORAGE_SECRET_KEY',
|
|
298
|
+
description: 'Chave secreta do objeto',
|
|
299
|
+
type: 'secret',
|
|
300
|
+
when: (r) => (r['STORAGE_DRIVER'] ?? 'local') !== 'local',
|
|
301
|
+
},
|
|
302
|
+
// -- Worker ---------------------------------------------------------------
|
|
303
|
+
{
|
|
304
|
+
key: 'WORKER_MODE',
|
|
305
|
+
section: 'worker',
|
|
306
|
+
label: 'WORKER_MODE',
|
|
307
|
+
description: 'docker | pm2 | k8s',
|
|
308
|
+
type: 'enum',
|
|
309
|
+
options: ['docker', 'pm2', 'k8s'],
|
|
310
|
+
default: 'docker',
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
key: 'WORKER_COUNT',
|
|
314
|
+
section: 'worker',
|
|
315
|
+
label: 'WORKER_COUNT',
|
|
316
|
+
description: 'Quantos processos de worker',
|
|
317
|
+
type: 'number',
|
|
318
|
+
default: '1',
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
key: 'WORKER_CONCURRENCY',
|
|
322
|
+
section: 'worker',
|
|
323
|
+
label: 'WORKER_CONCURRENCY',
|
|
324
|
+
description: 'Jobs simultâneos por processo',
|
|
325
|
+
type: 'number',
|
|
326
|
+
default: '5',
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
key: 'WORKER_RETRY_ATTEMPTS',
|
|
330
|
+
section: 'worker',
|
|
331
|
+
label: 'WORKER_RETRY_ATTEMPTS',
|
|
332
|
+
description: 'Tentativas de retry por job',
|
|
333
|
+
type: 'number',
|
|
334
|
+
default: '3',
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
key: 'WORKER_RETRY_DELAY',
|
|
338
|
+
section: 'worker',
|
|
339
|
+
label: 'WORKER_RETRY_DELAY',
|
|
340
|
+
description: 'Delay entre tentativas (ms)',
|
|
341
|
+
type: 'number',
|
|
342
|
+
default: '1000',
|
|
343
|
+
},
|
|
344
|
+
// -- Cache ----------------------------------------------------------------
|
|
345
|
+
{
|
|
346
|
+
key: 'CACHE_TTL',
|
|
347
|
+
section: 'cache',
|
|
348
|
+
label: 'CACHE_TTL',
|
|
349
|
+
description: 'Validade padrão do cache (s)',
|
|
350
|
+
type: 'number',
|
|
351
|
+
default: '3600',
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
key: 'CACHE_PREFIX',
|
|
355
|
+
section: 'cache',
|
|
356
|
+
label: 'CACHE_PREFIX',
|
|
357
|
+
description: 'Prefixo das chaves no Redis',
|
|
358
|
+
type: 'string',
|
|
359
|
+
default: 'bl:',
|
|
360
|
+
},
|
|
361
|
+
// -- Ports ----------------------------------------------------------------
|
|
362
|
+
// Os três defaults são os que os apps leem de verdade (api PORT=3000,
|
|
363
|
+
// web WEB_PORT=3001, admin PORT/3011). Divergir daqui faz o wizard gravar
|
|
364
|
+
// uma porta que ninguém escuta e o upstream do nginx apontar pro vazio.
|
|
365
|
+
{
|
|
366
|
+
key: 'ADMIN_PORT',
|
|
367
|
+
section: 'ports',
|
|
368
|
+
label: 'ADMIN_PORT',
|
|
369
|
+
description: 'Porta do admin',
|
|
370
|
+
type: 'port',
|
|
371
|
+
default: '3011',
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
key: 'WEB_PORT',
|
|
375
|
+
section: 'ports',
|
|
376
|
+
label: 'WEB_PORT',
|
|
377
|
+
description: 'Porta do site público',
|
|
378
|
+
type: 'port',
|
|
379
|
+
default: '3001',
|
|
380
|
+
},
|
|
381
|
+
// -- Tema -----------------------------------------------------------------
|
|
382
|
+
{
|
|
383
|
+
key: 'ACTIVE_THEME',
|
|
384
|
+
section: 'theme',
|
|
385
|
+
label: 'ACTIVE_THEME',
|
|
386
|
+
description: 'Nome da pasta em themes/ (vazio = tema default)',
|
|
387
|
+
type: 'string',
|
|
388
|
+
example: 'default',
|
|
389
|
+
},
|
|
390
|
+
// -- Deploy ---------------------------------------------------------------
|
|
391
|
+
{
|
|
392
|
+
key: 'OKCMS_VERSION',
|
|
393
|
+
section: 'deploy',
|
|
394
|
+
label: 'OKCMS_VERSION',
|
|
395
|
+
description: 'Tag da imagem okcms/app usada no compose de deploy blue/green',
|
|
396
|
+
type: 'string',
|
|
397
|
+
default: 'latest',
|
|
398
|
+
example: '0.2.0',
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
key: 'SERVER_NAME',
|
|
402
|
+
section: 'deploy',
|
|
403
|
+
label: 'SERVER_NAME',
|
|
404
|
+
description: 'server_name do nginx (site público)',
|
|
405
|
+
type: 'string',
|
|
406
|
+
default: '_',
|
|
407
|
+
example: 'meusite.com',
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
key: 'ADMIN_SERVER_NAME',
|
|
411
|
+
section: 'deploy',
|
|
412
|
+
label: 'ADMIN_SERVER_NAME',
|
|
413
|
+
description: 'server_name do admin no proxy (deve ser um host separado)',
|
|
414
|
+
type: 'string',
|
|
415
|
+
default: 'admin.localhost',
|
|
416
|
+
example: 'admin.meusite.com',
|
|
417
|
+
},
|
|
418
|
+
];
|
|
419
|
+
// ---------------------------------------------------------------------------
|
|
420
|
+
// Validação
|
|
421
|
+
// ---------------------------------------------------------------------------
|
|
422
|
+
const DURATION_RE = /^\d+(ms|s|m|h|d)$/;
|
|
423
|
+
const PORT_RE = /^\d+$/;
|
|
424
|
+
/** Mensagem de erro para o prompt, ou null quando o valor é válido. */
|
|
425
|
+
export function validateField(field, value) {
|
|
426
|
+
const trimmed = value.trim();
|
|
427
|
+
if (trimmed === '') {
|
|
428
|
+
if (field.required)
|
|
429
|
+
return `${field.key} é obrigatório`;
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
switch (field.type) {
|
|
433
|
+
case 'port': {
|
|
434
|
+
if (!PORT_RE.test(trimmed))
|
|
435
|
+
return 'precisa ser um número de porta';
|
|
436
|
+
const port = Number(trimmed);
|
|
437
|
+
if (port < 1 || port > 65535)
|
|
438
|
+
return 'fora da faixa 1..65535';
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
case 'number': {
|
|
442
|
+
if (!/^-?\d+$/.test(trimmed))
|
|
443
|
+
return 'precisa ser um inteiro';
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
case 'boolean': {
|
|
447
|
+
if (!['true', 'false', '1', '0'].includes(trimmed.toLowerCase())) {
|
|
448
|
+
return 'use true ou false';
|
|
449
|
+
}
|
|
450
|
+
return null;
|
|
451
|
+
}
|
|
452
|
+
case 'enum': {
|
|
453
|
+
const options = field.options ?? [];
|
|
454
|
+
if (!options.includes(trimmed))
|
|
455
|
+
return `use uma de: ${options.join(' | ')}`;
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
case 'duration': {
|
|
459
|
+
if (!DURATION_RE.test(trimmed))
|
|
460
|
+
return 'use um formato como 15m, 2h ou 7d';
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
case 'url': {
|
|
464
|
+
try {
|
|
465
|
+
const parsed = new URL(trimmed);
|
|
466
|
+
if (!['http:', 'https:'].includes(parsed.protocol))
|
|
467
|
+
return 'use http:// ou https://';
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
return 'URL inválida';
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
case 'database-url': {
|
|
475
|
+
if (!parseDatabaseUrl(trimmed)) {
|
|
476
|
+
return 'use postgres:// ou mysql:// com host e banco (ex.: postgres://user:senha@host:5432/okcms)';
|
|
477
|
+
}
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
case 'secret': {
|
|
481
|
+
if (field.key === 'JWT_SECRET' && trimmed.length < 16) {
|
|
482
|
+
return 'JWT_SECRET precisa de pelo menos 16 caracteres';
|
|
483
|
+
}
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
default:
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
/** Campos de uma seção, já filtrados por dependência (`when`). */
|
|
491
|
+
export function fieldsForSection(sectionId, record) {
|
|
492
|
+
return ENV_FIELDS.filter((field) => field.section === sectionId && (!field.when || field.when(record)));
|
|
493
|
+
}
|
|
494
|
+
export function sectionById(sectionId) {
|
|
495
|
+
return ENV_SECTIONS.find((section) => section.id === sectionId);
|
|
496
|
+
}
|
|
497
|
+
//# sourceMappingURL=env-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-schema.js","sourceRoot":"","sources":["../src/env-schema.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,yEAAyE;AACzE,mBAAmB;AACnB,EAAE;AACF,wEAAwE;AACxE,6EAA6E;AAC7E,wDAAwD;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAmC/C,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,+BAA+B,EAAE;IACxE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,mCAAmC,EAAE;IACtF,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE;IAChE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,qBAAqB,EAAE;IAClE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,kCAAkC,EAAE;IAC3E,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE;IACjE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE;IAC7D,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE;IAC1D,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,mCAAmC,EAAE;CACtF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,4EAA4E;IAC5E;QACE,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC;QAC9C,OAAO,EAAE,aAAa;KACvB;IACD;QACE,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,0BAA0B;QACvC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS;KACnB;IACD;QACE,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,cAAc;QAC3B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB;IACD;QACE,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,2CAA2C;QACxD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,+CAA+C;KACzD;IACD;QACE,GAAG,EAAE,sBAAsB;QAC3B,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;KACjB;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gCAAgC;QAC7C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,KAAK;KACf;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,+CAA+C;QAC5D,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,eAAe;QAC5B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,+CAA+C;QAC5D,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;KAChC;IACD;QACE,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,oFAAoF;QACtF,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,kDAAkD;KAC5D;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,YAAY;QACjB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,+CAA+C;QAC5D,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;KACrB;IACD;QACE,GAAG,EAAE,YAAY;QACjB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,sCAAsC;QACnD,IAAI,EAAE,QAAQ;KACf;IACD;QACE,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG;KACb;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,YAAY;QACjB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,yDAAyD;QACtE,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACf;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,0BAA0B;QACvC,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,aAAa;KACvB;IACD;QACE,GAAG,EAAE,0BAA0B;QAC/B,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,SAAS;KACnB;IACD;QACE,GAAG,EAAE,eAAe;QACpB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,iCAAiC;QAC9C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;KACd;IACD;QACE,GAAG,EAAE,sBAAsB;QAC3B,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,8CAA8C;QAC3D,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;QAClC,OAAO,EAAE,KAAK;KACf;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;KACjB;IACD;QACE,GAAG,EAAE,mBAAmB;QACxB,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,MAAM;KAChB;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,gBAAgB;QACrB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;QACvC,OAAO,EAAE,OAAO;KACjB;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,mEAAmE;QAChF,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO;KAC1D;IACD;QACE,GAAG,EAAE,qBAAqB;QAC1B,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,mCAAmC;QAChD,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO;KAC1D;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,sBAAsB;QACnC,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO;KAC1D;IACD;QACE,GAAG,EAAE,kBAAkB;QACvB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,uBAAuB;QAChC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO;KAC1D;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,2BAA2B;QACxC,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO;KAC1D;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,OAAO;KAC1D;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,oBAAoB;QACjC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;QACjC,OAAO,EAAE,QAAQ;KAClB;IACD;QACE,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG;KACb;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,+BAA+B;QAC5C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG;KACb;IACD;QACE,GAAG,EAAE,uBAAuB;QAC5B,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG;KACb;IACD;QACE,GAAG,EAAE,oBAAoB;QACzB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;KAChB;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,WAAW;QAChB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,8BAA8B;QAC3C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,MAAM;KAChB;IACD;QACE,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,KAAK;KACf;IAED,4EAA4E;IAC5E,sEAAsE;IACtE,0EAA0E;IAC1E,wEAAwE;IACxE;QACE,GAAG,EAAE,YAAY;QACjB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB;IACD;QACE,GAAG,EAAE,UAAU;QACf,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;KAChB;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,cAAc;QACnB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,iDAAiD;QAC9D,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,SAAS;KACnB;IAED,4EAA4E;IAC5E;QACE,GAAG,EAAE,eAAe;QACpB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,+DAA+D;QAC5E,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,OAAO;KACjB;IACD;QACE,GAAG,EAAE,aAAa;QAClB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,qCAAqC;QAClD,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,aAAa;KACvB;IACD;QACE,GAAG,EAAE,mBAAmB;QACxB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,2DAA2D;QACxE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,mBAAmB;KAC7B;CACF,CAAC;AAEF,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,KAAe,EAAE,KAAa;IAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO,GAAG,KAAK,CAAC,GAAG,gBAAgB,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,gCAAgC,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;gBAAE,OAAO,wBAAwB,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,wBAAwB,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACjE,OAAO,mBAAmB,CAAC;YAC7B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,mCAAmC,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;gBAChC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;oBAAE,OAAO,yBAAyB,CAAC;gBACrF,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,2FAA2F,CAAC;YACrG,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACtD,OAAO,gDAAgD,CAAC;YAC1D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,MAA8B;IAChF,OAAO,UAAU,CAAC,MAAM,CACtB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/guards.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface ContainerProbe {
|
|
2
|
+
/** Existência de arquivo (padrão: fs.existsSync). */
|
|
3
|
+
exists?: (path: string) => boolean;
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
/** Conteúdo de /proc/1/cgroup (padrão: fs.readFileSync). */
|
|
6
|
+
cgroup?: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function isInContainer(probe?: ContainerProbe): boolean;
|
|
9
|
+
export interface GuardResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
/** Mensagem pronta para `console.error` quando `ok === false`. */
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Bloqueia comandos que alteram estado fora do host quando a CLI roda dentro
|
|
16
|
+
* de um container. `force` (=`--force`) é o escape consciente — registrado em
|
|
17
|
+
* log para auditoria.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertHostOnly(command: string, opts?: {
|
|
20
|
+
force?: boolean;
|
|
21
|
+
probe?: ContainerProbe;
|
|
22
|
+
}): GuardResult;
|
|
23
|
+
/** Único destino que a CLI fala sem configuração explícita. */
|
|
24
|
+
export declare const DEFAULT_REGISTRY = "https://registry.npmjs.org";
|
|
25
|
+
export declare function registryAllowlist(env?: NodeJS.ProcessEnv): string[];
|
|
26
|
+
export declare function isUrlAllowed(url: string, allowlist?: string[]): boolean;
|
|
27
|
+
export declare function assertUrlAllowed(url: string, allowlist?: string[]): GuardResult;
|
|
28
|
+
/** true se algum serviço monta o socket do Docker (via short ou long syntax). */
|
|
29
|
+
export declare function hasDockerSocketMount(composeText: string): boolean;
|
|
30
|
+
export declare function assertNoDockerSocket(composeText: string): GuardResult;
|
|
31
|
+
/**
|
|
32
|
+
* Aplica redação a QUALQUER texto de log da CLI. Chamado pelas mensagens de
|
|
33
|
+
* erro de `update`/`config` para nunca vazar senha em CI ou em issue de suporte.
|
|
34
|
+
*/
|
|
35
|
+
export declare function redact(text: string): string;
|
|
36
|
+
/** true se o valor parece um segredo de verdade (não vazio, não placeholder). */
|
|
37
|
+
export declare function looksLikeSecret(value: string): boolean;
|
|
38
|
+
/** Gera um segredo forte (JWT_SECRET / cookie key) sem dependência externa. */
|
|
39
|
+
export declare function generateSecret(length?: number): string;
|
|
40
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAeD,wBAAgB,aAAa,CAAC,KAAK,GAAE,cAAmB,GAAG,OAAO,CAsBjE;AAYD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAAO,GACrD,WAAW,CAYb;AAMD,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,+BAA+B,CAAC;AAE7D,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAGhF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,EAAwB,GAAG,OAAO,CAE5F;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAM,EAAwB,GACxC,WAAW,CAMb;AAQD,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CASrE;AA4BD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAItD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,SAAK,GAAG,MAAM,CAOlD"}
|