smoonb 0.0.74 → 0.0.75
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/package.json +1 -1
- package/src/commands/backup/index.js +62 -65
- package/src/commands/backup/steps/00-docker-validation.js +6 -4
- package/src/commands/backup/steps/01-database.js +6 -3
- package/src/commands/backup/steps/02-database-separated.js +11 -8
- package/src/commands/backup/steps/03-database-settings.js +6 -3
- package/src/commands/backup/steps/04-auth-settings.js +6 -3
- package/src/commands/backup/steps/05-realtime-settings.js +5 -2
- package/src/commands/backup/steps/06-storage.js +28 -25
- package/src/commands/backup/steps/07-custom-roles.js +6 -3
- package/src/commands/backup/steps/08-edge-functions.js +14 -10
- package/src/commands/backup/steps/09-supabase-temp.js +9 -6
- package/src/commands/backup/steps/10-migrations.js +13 -9
- package/src/commands/restore/steps/00-backup-selection.js +4 -2
- package/src/commands/restore/steps/01-components-selection.js +30 -28
- package/src/commands/restore/steps/03-database.js +19 -16
- package/src/commands/restore/steps/04-edge-functions.js +16 -13
- package/src/commands/restore/steps/05-auth-settings.js +9 -6
- package/src/commands/restore/steps/06-storage.js +47 -40
- package/src/commands/restore/steps/07-database-settings.js +10 -7
- package/src/commands/restore/steps/08-realtime-settings.js +9 -6
- package/src/i18n/locales/en.json +328 -1
- package/src/i18n/locales/pt-BR.json +327 -1
- package/src/interactive/envMapper.js +30 -25
|
@@ -246,6 +246,332 @@
|
|
|
246
246
|
"quickHelp.tokenStep3": "3. Copie o token (formato: sbp_...)",
|
|
247
247
|
"quickHelp.tokenStep4": "4. Adicione ao .env.local como SUPABASE_ACCESS_TOKEN",
|
|
248
248
|
"quickHelp.update": "ATUALIZAR PARA ÚLTIMA VERSÃO:",
|
|
249
|
-
"quickHelp.updateCommand": "npm install smoonb@latest"
|
|
249
|
+
"quickHelp.updateCommand": "npm install smoonb@latest",
|
|
250
|
+
|
|
251
|
+
"docker.validation.title": "Validação Docker",
|
|
252
|
+
"docker.validation.checking": "Verificando dependências Docker...",
|
|
253
|
+
"docker.validation.detected": "Docker Desktop detectado e funcionando",
|
|
254
|
+
"docker.validation.version": "Versão: {version}",
|
|
255
|
+
|
|
256
|
+
"env.mapping.title": "Mapeando variável: {variable}",
|
|
257
|
+
"env.mapping.selectKey": "Selecione a chave correspondente para: {expected}",
|
|
258
|
+
"env.mapping.addNew": "Adicione uma nova chave para mim",
|
|
259
|
+
"env.mapping.currentValue": "Valor atual: {value}",
|
|
260
|
+
"env.mapping.isCorrect": "Este é o valor correto do projeto alvo?",
|
|
261
|
+
"env.mapping.notFound": "Não foi encontrada uma entrada para a variável {variable}.",
|
|
262
|
+
"env.mapping.backupCreated": "Backup do .env.local: {path}",
|
|
263
|
+
"env.mapping.fileNotFound": "Arquivo .env.local não encontrado. Será criado durante o mapeamento.",
|
|
264
|
+
"env.mapping.updated": ".env.local atualizado com sucesso. Nenhuma chave renomeada; valores sincronizados.",
|
|
265
|
+
|
|
266
|
+
"backup.components.edgeFunctions.title": "Edge Functions:",
|
|
267
|
+
"backup.components.edgeFunctions.description1": "Vamos apagar as funções existentes na pasta supabase/functions, fazer um reset no link",
|
|
268
|
+
"backup.components.edgeFunctions.description2": "entre a ferramenta e o projeto, e baixar novamente as funções do servidor.",
|
|
269
|
+
"backup.components.edgeFunctions.description3": "Você terá a opção de manter ou apagar as funções na pasta após o backup.",
|
|
270
|
+
"backup.components.edgeFunctions.include": "Deseja incluir Edge Functions",
|
|
271
|
+
"backup.components.edgeFunctions.cleanup": "Deseja limpar supabase/functions após o backup",
|
|
272
|
+
|
|
273
|
+
"backup.components.temp.title": "Supabase .temp:",
|
|
274
|
+
"backup.components.temp.description1": "Vamos copiar os arquivos existentes (se existirem) na pasta supabase/.temp.",
|
|
275
|
+
"backup.components.temp.description2": "Você terá a opção de manter ou apagar os arquivos nesta pasta após o backup.",
|
|
276
|
+
"backup.components.temp.include": "Deseja incluir Supabase .temp",
|
|
277
|
+
"backup.components.temp.cleanup": "Deseja apagar supabase/.temp após o backup",
|
|
278
|
+
|
|
279
|
+
"backup.components.migrations.title": "Migrations:",
|
|
280
|
+
"backup.components.migrations.description1": "Vamos apagar as migrations existentes (se existirem) na pasta supabase/migrations,",
|
|
281
|
+
"backup.components.migrations.description2": "fazer um reset no link entre a ferramenta e o projeto, e baixar novamente as migrations",
|
|
282
|
+
"backup.components.migrations.description3": "do servidor. Você terá a opção de manter ou apagar as migrations na pasta após o backup.",
|
|
283
|
+
"backup.components.migrations.include": "Deseja incluir Migrations",
|
|
284
|
+
"backup.components.migrations.cleanup": "Deseja apagar supabase/migrations após o backup",
|
|
285
|
+
|
|
286
|
+
"backup.components.storage.include": "Deseja incluir Storage",
|
|
287
|
+
"backup.components.auth.include": "Deseja incluir Auth",
|
|
288
|
+
"backup.components.realtime.include": "Deseja incluir Realtime",
|
|
289
|
+
|
|
290
|
+
"backup.summary.title": "RESUMO DAS CONFIGURAÇÕES:",
|
|
291
|
+
"backup.summary.edgeFunctions": "Edge Functions: {value}",
|
|
292
|
+
"backup.summary.edgeFunctionsCleanup": "Limpar após backup: {value}",
|
|
293
|
+
"backup.summary.temp": "Supabase .temp: {value}",
|
|
294
|
+
"backup.summary.tempCleanup": "Apagar após backup: {value}",
|
|
295
|
+
"backup.summary.migrations": "Migrations: {value}",
|
|
296
|
+
"backup.summary.migrationsCleanup": "Apagar após backup: {value}",
|
|
297
|
+
"backup.summary.storage": "Storage: {value}",
|
|
298
|
+
"backup.summary.auth": "Auth: {value}",
|
|
299
|
+
"backup.summary.realtime": "Realtime: {value}",
|
|
300
|
+
"backup.summary.backupDir": "Diretório de backup: {path}",
|
|
301
|
+
"backup.summary.confirm": "Deseja iniciar o backup com estas configurações?",
|
|
302
|
+
"backup.summary.yes": "Sim",
|
|
303
|
+
"backup.summary.no": "Não",
|
|
304
|
+
|
|
305
|
+
"backup.start.title": "Iniciando backup do projeto: {projectId}",
|
|
306
|
+
"backup.start.directory": "Diretório: {path}",
|
|
307
|
+
"backup.start.docker": "Backup via Docker Desktop",
|
|
308
|
+
|
|
309
|
+
"backup.steps.database.title": "Backup da Database PostgreSQL via pg_dumpall Docker...",
|
|
310
|
+
"backup.steps.database.creating": "Criando backup completo via pg_dumpall...",
|
|
311
|
+
"backup.steps.database.executing": "Executando pg_dumpall via Docker...",
|
|
312
|
+
"backup.steps.database.separated.title": "Backup da Database PostgreSQL (arquivos SQL separados)...",
|
|
313
|
+
"backup.steps.database.separated.creating": "Criando backups SQL separados via Supabase CLI...",
|
|
314
|
+
"backup.steps.database.separated.exportingSchema": "Exportando schema...",
|
|
315
|
+
"backup.steps.database.separated.exportingData": "Exportando dados...",
|
|
316
|
+
"backup.steps.database.separated.exportingRoles": "Exportando roles...",
|
|
317
|
+
|
|
318
|
+
"backup.steps.databaseSettings.title": "Backup das Database Extensions and Settings via SQL...",
|
|
319
|
+
"backup.steps.databaseSettings.capturing": "Capturando Database Extensions and Settings...",
|
|
320
|
+
"backup.steps.databaseSettings.executing": "Executando queries de configurações via Docker...",
|
|
321
|
+
|
|
322
|
+
"backup.steps.auth.title": "Backup das Auth Settings via API...",
|
|
323
|
+
"backup.steps.auth.exporting": "Exportando configurações de Auth via Management API...",
|
|
324
|
+
|
|
325
|
+
"backup.steps.realtime.title": "Backup das Realtime Settings via Captura Interativa...",
|
|
326
|
+
"backup.steps.realtime.capturing": "Capturando Realtime Settings interativamente...",
|
|
327
|
+
"backup.steps.realtime.previousFound": "Foi identificada uma gravação anterior de Realtime Settings.",
|
|
328
|
+
"backup.steps.realtime.reuse": "Deseja reutilizar as configurações anteriores?",
|
|
329
|
+
"backup.steps.realtime.configTitle": "Configurações de Realtime Settings",
|
|
330
|
+
"backup.steps.realtime.access": "Acesse: {url}",
|
|
331
|
+
"backup.steps.realtime.note": "Anote os valores dos 7 parâmetros abaixo:",
|
|
332
|
+
"backup.steps.realtime.questions": "Responda as perguntas abaixo (pressione Enter para usar o valor padrão):",
|
|
333
|
+
"backup.steps.realtime.saved": "Configurações de Realtime Settings salvas!",
|
|
334
|
+
|
|
335
|
+
"backup.steps.storage.title": "Backup do Storage via API...",
|
|
336
|
+
"backup.steps.storage.listing": "Listando buckets de Storage via Management API...",
|
|
337
|
+
"backup.steps.storage.found": "Encontrados {count} buckets",
|
|
338
|
+
"backup.steps.storage.processing": "Processando bucket: {bucketName}",
|
|
339
|
+
"backup.steps.storage.listingFiles": "Listando arquivos do bucket {bucketName}...",
|
|
340
|
+
"backup.steps.storage.downloading": "Baixando {count} arquivo(s) do bucket {bucketName}...",
|
|
341
|
+
"backup.steps.storage.downloaded": "Baixados {current}/{total} arquivo(s)...",
|
|
342
|
+
"backup.steps.storage.bucketDone": "Bucket {bucketName}: {downloaded}/{total} arquivo(s) baixado(s)",
|
|
343
|
+
"backup.steps.storage.creatingZip": "Criando arquivo ZIP no padrão do Dashboard...",
|
|
344
|
+
"backup.steps.storage.zipCreated": "Arquivo ZIP criado: {fileName} ({size} MB)",
|
|
345
|
+
"backup.steps.storage.cleanup": "Deseja limpar storage_temp após o backup",
|
|
346
|
+
"backup.steps.storage.tempKept": "Estrutura temporária mantida em: {path}",
|
|
347
|
+
"backup.steps.storage.done": "Storage backupado: {buckets} buckets, {files} arquivo(s) baixado(s)",
|
|
348
|
+
|
|
349
|
+
"backup.steps.roles.title": "Backup dos Custom Roles via SQL...",
|
|
350
|
+
"backup.steps.roles.exporting": "Exportando Custom Roles via Docker...",
|
|
351
|
+
|
|
352
|
+
"backup.steps.functions.title": "Backup das Edge Functions via Docker...",
|
|
353
|
+
"backup.steps.functions.linking": "Zerando vínculo e linkando projeto: {projectId}...",
|
|
354
|
+
"backup.steps.functions.validation": "Validação: linked-ref = {linkedRef} (esperado = {expected})",
|
|
355
|
+
"backup.steps.functions.prepared": "Pasta supabase/functions preparada (será preservada após backup).",
|
|
356
|
+
"backup.steps.functions.listing": "Listando Edge Functions via Management API...",
|
|
357
|
+
"backup.steps.functions.noneFound": "Nenhuma Edge Function encontrada",
|
|
358
|
+
|
|
359
|
+
"backup.steps.temp.title": "Backup do Supabase .temp...",
|
|
360
|
+
"backup.steps.temp.copying": "Copiando supabase/.temp → {path} ({count} arquivos)...",
|
|
361
|
+
|
|
362
|
+
"backup.steps.migrations.title": "Backup das Migrations...",
|
|
363
|
+
"backup.steps.migrations.linking": "Zerando vínculo e linkando projeto: {projectId}...",
|
|
364
|
+
"backup.steps.migrations.validation": "Validação: linked-ref = {linkedRef} (esperado = {expected})",
|
|
365
|
+
"backup.steps.migrations.cleaning": "Limpando supabase/migrations...",
|
|
366
|
+
"backup.steps.migrations.downloading": "Baixando todas as migrations do servidor usando migration fetch...",
|
|
367
|
+
"backup.steps.migrations.downloaded": "Arquivos baixados: {count} migrations",
|
|
368
|
+
"backup.steps.migrations.copying": "Copiando supabase/migrations → {path} ({count} arquivos)...",
|
|
369
|
+
|
|
370
|
+
"backup.complete.title": "BACKUP COMPLETO FINALIZADO VIA DOCKER!",
|
|
371
|
+
"backup.complete.location": "Localização: {path}",
|
|
372
|
+
"backup.complete.database": "Database: {fileName} ({size}) - Idêntico ao Dashboard",
|
|
373
|
+
"backup.complete.databaseSql": "Database SQL: {count} arquivos separados ({size}) - Para troubleshooting",
|
|
374
|
+
"backup.complete.databaseSettings": "Database Settings: {fileName} ({size}) - Extensions e Configurações",
|
|
375
|
+
"backup.complete.auth": "Auth Settings: Exportadas via API",
|
|
376
|
+
"backup.complete.realtime": "Realtime: Configurações capturadas interativamente",
|
|
377
|
+
"backup.complete.storage": "Storage: {buckets} buckets, {files} arquivo(s) baixado(s), ZIP: {zipFile} ({size})",
|
|
378
|
+
"backup.complete.roles": "Custom Roles: {count} roles exportados via SQL",
|
|
379
|
+
"backup.complete.functions": "Edge Functions: {downloaded}/{total} functions baixadas via Docker",
|
|
380
|
+
"backup.complete.temp": "Supabase .temp: {count} arquivo(s) copiado(s)",
|
|
381
|
+
"backup.complete.migrations": "Migrations: {count} migration(s) copiada(s)",
|
|
382
|
+
|
|
383
|
+
"backup.error.databaseUrlNotConfigured": "DATABASE_URL NÃO CONFIGURADA",
|
|
384
|
+
"backup.error.databaseUrlInstructions": "Para fazer backup completo do Supabase, você precisa:",
|
|
385
|
+
"backup.error.databaseUrlStep1": "1. Configurar SUPABASE_DB_URL no .env.local",
|
|
386
|
+
"backup.error.databaseUrlStep2": "2. Repetir o comando de backup",
|
|
387
|
+
"backup.error.databaseUrlExample": "Exemplo de configuração:",
|
|
388
|
+
"backup.error.databaseUrlExampleValue": "\"databaseUrl\": \"postgresql://postgres:[senha]@db.[projeto].supabase.co:5432/postgres\"",
|
|
389
|
+
"backup.error.databaseUrlCancelled": "Backup cancelado - Configuração incompleta",
|
|
390
|
+
|
|
391
|
+
"backup.error.accessTokenNotConfigured": "ACCESS_TOKEN NÃO CONFIGURADO",
|
|
392
|
+
"backup.error.accessTokenInstructions": "Para fazer backup completo do Supabase, você precisa:",
|
|
393
|
+
"backup.error.accessTokenStep1": "1. Obter Personal Access Token do Supabase",
|
|
394
|
+
"backup.error.accessTokenStep2": "2. Configurar SUPABASE_ACCESS_TOKEN no .env.local",
|
|
395
|
+
"backup.error.accessTokenStep3": "3. Repetir o comando de backup",
|
|
396
|
+
"backup.error.accessTokenHowTo": "Como obter o token:",
|
|
397
|
+
"backup.error.accessTokenStep1Detail": "1. Acesse: https://supabase.com/dashboard/account/tokens",
|
|
398
|
+
"backup.error.accessTokenStep2Detail": "2. Clique: \"Generate new token\"",
|
|
399
|
+
"backup.error.accessTokenStep3Detail": "3. Copie o token (formato: sbp_...)",
|
|
400
|
+
"backup.error.accessTokenCancelled": "Backup cancelado - Token não configurado",
|
|
401
|
+
|
|
402
|
+
"backup.steps.storage.noBuckets": "Nenhum bucket encontrado",
|
|
403
|
+
"backup.steps.storage.credentialsNotAvailable": "Credenciais do Supabase não disponíveis. Fazendo backup apenas de metadados...",
|
|
404
|
+
"backup.steps.storage.cleanupRemoving": "Limpando estrutura temporária...",
|
|
405
|
+
"backup.steps.storage.cleanupRemoved": "Estrutura temporária removida",
|
|
406
|
+
"backup.steps.storage.cleanupError": "Erro ao limpar estrutura temporária: {message}",
|
|
407
|
+
"backup.steps.storage.listError": "Erro ao listar {path}: {message}",
|
|
408
|
+
"backup.steps.storage.processError": "Erro ao processar {path}: {message}",
|
|
409
|
+
"backup.steps.storage.error": "Erro no backup do Storage: {message}",
|
|
410
|
+
"backup.steps.storage.listBucketsError": "Erro ao listar buckets: {status} {statusText}",
|
|
411
|
+
"backup.steps.storage.downloadError": "Erro ao baixar {path}: {message}",
|
|
412
|
+
"backup.steps.storage.processFileError": "Erro ao processar arquivo {path}: {message}",
|
|
413
|
+
"backup.steps.storage.processBucketError": "Erro ao processar bucket {bucketName}: {message}",
|
|
414
|
+
"backup.steps.database.error": "Erro no backup do database: {message}",
|
|
415
|
+
"backup.steps.database.separated.error": "Erro nos backups SQL separados: {message}",
|
|
416
|
+
"backup.steps.database.separated.schemaError": "Erro no schema: {message}",
|
|
417
|
+
"backup.steps.database.separated.dataError": "Erro nos dados: {message}",
|
|
418
|
+
"backup.steps.database.separated.rolesError": "Erro nos roles: {message}",
|
|
419
|
+
"backup.steps.databaseSettings.error": "Erro no backup das Database Settings: {message}",
|
|
420
|
+
"backup.steps.auth.error": "Erro no backup das Auth Settings: {message}",
|
|
421
|
+
"backup.steps.auth.getError": "Erro ao obter Auth Settings: {status} {statusText}",
|
|
422
|
+
"backup.steps.realtime.error": "Erro ao capturar Realtime Settings: {message}",
|
|
423
|
+
"backup.steps.roles.error": "Erro no backup dos Custom Roles: {message}",
|
|
424
|
+
"backup.steps.roles.exportError": "Erro ao exportar Custom Roles via Docker: {message}",
|
|
425
|
+
"backup.steps.functions.error": "Erro durante backup de Edge Functions: {message}",
|
|
426
|
+
"backup.steps.functions.listError": "Erro ao listar Edge Functions: {status} {statusText}",
|
|
427
|
+
"backup.steps.functions.downloadError": "Erro ao baixar {funcName}: {message}",
|
|
428
|
+
"backup.steps.temp.error": "Erro no backup do supabase/.temp: {message}",
|
|
429
|
+
"backup.steps.migrations.error": "Erro no backup das migrations: {message}",
|
|
430
|
+
|
|
431
|
+
"backup.steps.functions.cleanBefore": "Pasta supabase/functions limpa antes do backup.",
|
|
432
|
+
"backup.steps.functions.preserving": "Preservando {count} função(ões) existente(s) na pasta supabase/functions.",
|
|
433
|
+
"backup.steps.functions.cleanAfter": "supabase/functions limpo após o backup.",
|
|
434
|
+
"backup.steps.functions.preserved": "supabase/functions preservada conforme solicitado.",
|
|
435
|
+
|
|
436
|
+
"backup.steps.migrations.cleaning": "Limpando supabase/migrations...",
|
|
437
|
+
"backup.steps.migrations.downloading": "Baixando todas as migrations do servidor usando migration fetch...",
|
|
438
|
+
"backup.steps.migrations.fetchError": "Erro ao executar migration fetch: {message}",
|
|
439
|
+
"backup.steps.migrations.fetchTip": "Verifique se o projeto está linkado corretamente e se o token está válido.",
|
|
440
|
+
"backup.steps.migrations.downloaded": "Arquivos baixados: {count} migrations",
|
|
441
|
+
"backup.steps.migrations.copying": "Copiando supabase/migrations → {path} ({count} arquivos)...",
|
|
442
|
+
"backup.steps.migrations.copied": "{count} migration(s) copiada(s)",
|
|
443
|
+
"backup.steps.migrations.cleaned": "supabase/migrations apagado.",
|
|
444
|
+
|
|
445
|
+
"backup.steps.temp.noFiles": "Nenhum arquivo encontrado em supabase/.temp",
|
|
446
|
+
"backup.steps.temp.copied": "{count} arquivo(s) copiado(s)",
|
|
447
|
+
"backup.steps.temp.cleaned": "supabase/.temp apagado.",
|
|
448
|
+
|
|
449
|
+
"restore.steps.components.edgeFunctions.title": "Edge Functions:",
|
|
450
|
+
"restore.steps.components.edgeFunctions.description1": "As Edge Functions serão copiadas para supabase/functions e implantadas no projeto destino.",
|
|
451
|
+
"restore.steps.components.edgeFunctions.description2": "A pasta supabase/functions será limpa antes do processo.",
|
|
452
|
+
"restore.steps.components.edgeFunctions.include": "Deseja restaurar Edge Functions",
|
|
453
|
+
|
|
454
|
+
"restore.steps.components.auth.title": "Auth Settings:",
|
|
455
|
+
"restore.steps.components.auth.description1": "As configurações de Auth serão exibidas para configuração manual no Dashboard.",
|
|
456
|
+
"restore.steps.components.auth.description2": "Algumas configurações não podem ser aplicadas automaticamente por questões de segurança.",
|
|
457
|
+
"restore.steps.components.auth.include": "Deseja restaurar Auth",
|
|
458
|
+
|
|
459
|
+
"restore.steps.components.storage.title": "Storage:",
|
|
460
|
+
"restore.steps.components.storage.zipFound": "Arquivo .storage.zip encontrado: {fileName}",
|
|
461
|
+
"restore.steps.components.storage.withZip.description1": "Os buckets e arquivos serão restaurados automaticamente no projeto destino.",
|
|
462
|
+
"restore.steps.components.storage.withZip.description2": "O arquivo ZIP será extraído, buckets criados e arquivos enviados via API.",
|
|
463
|
+
"restore.steps.components.storage.metadataOnly.description1": "Apenas metadados dos buckets encontrados (pasta storage).",
|
|
464
|
+
"restore.steps.components.storage.metadataOnly.description2": "Para restaurar os arquivos, é necessário o arquivo .storage.zip do Dashboard.",
|
|
465
|
+
"restore.steps.components.storage.metadataOnly.description3": "Apenas informações dos buckets serão exibidas.",
|
|
466
|
+
"restore.steps.components.storage.include": "Deseja restaurar Storage",
|
|
467
|
+
|
|
468
|
+
"restore.steps.components.databaseSettings.title": "Database Extensions and Settings:",
|
|
469
|
+
"restore.steps.components.databaseSettings.description1": "As extensões e configurações do banco de dados serão restauradas via SQL.",
|
|
470
|
+
"restore.steps.components.databaseSettings.description2": "Isso inclui extensões PostgreSQL e configurações específicas do projeto.",
|
|
471
|
+
"restore.steps.components.databaseSettings.include": "Deseja restaurar Database Settings",
|
|
472
|
+
|
|
473
|
+
"restore.steps.components.realtime.title": "Realtime Settings:",
|
|
474
|
+
"restore.steps.components.realtime.description1": "As configurações de Realtime serão exibidas para configuração manual no Dashboard.",
|
|
475
|
+
"restore.steps.components.realtime.description2": "Algumas configurações precisam ser aplicadas manualmente.",
|
|
476
|
+
"restore.steps.components.realtime.include": "Deseja restaurar Realtime",
|
|
477
|
+
"restore.steps.components.database.include": "Deseja restaurar Database",
|
|
478
|
+
|
|
479
|
+
"restore.steps.database.detectedGz": "Arquivo .backup.gz detectado",
|
|
480
|
+
"restore.steps.database.extractingGz": "Extraindo arquivo .gz...",
|
|
481
|
+
"restore.steps.database.uncompressed": "Arquivo descompactado: {file}",
|
|
482
|
+
"restore.steps.database.detectedBackup": "Arquivo .backup detectado (já descompactado)",
|
|
483
|
+
"restore.steps.database.proceeding": "Prosseguindo com restauração direta",
|
|
484
|
+
"restore.steps.database.executing": "Executando psql via Docker...",
|
|
485
|
+
"restore.steps.database.followingDocs": "Seguindo documentação oficial Supabase",
|
|
486
|
+
"restore.steps.database.warning": "AVISO: Erros como \"object already exists\" são ESPERADOS",
|
|
487
|
+
"restore.steps.database.warningReason1": "Isto acontece porque o backup contém CREATE para todos os schemas",
|
|
488
|
+
"restore.steps.database.warningReason2": "Supabase já tem auth e storage criados, então esses erros são normais",
|
|
489
|
+
"restore.steps.database.success": "Database restaurada com sucesso!",
|
|
490
|
+
"restore.steps.database.normalErrors": "Erros \"already exists\" são normais e não afetam a restauração",
|
|
491
|
+
"restore.steps.database.expectedErrors": "Erros esperados encontrados (conforme documentação Supabase)",
|
|
492
|
+
"restore.steps.database.errorsIgnored": "Erros são ignorados pois são comandos de CREATE que já existem",
|
|
493
|
+
"restore.steps.database.error": "Erro ao restaurar database: {message}",
|
|
494
|
+
|
|
495
|
+
"restore.steps.storage.noBuckets": "Nenhum bucket de Storage encontrado no backup",
|
|
496
|
+
"restore.steps.storage.zipNotFound": "Arquivo .storage.zip não encontrado",
|
|
497
|
+
"restore.steps.storage.metadataOnly": "Apenas metadados dos buckets foram encontrados",
|
|
498
|
+
"restore.steps.storage.zipRequired": "Para restaurar os arquivos, é necessário o arquivo .storage.zip do Dashboard",
|
|
499
|
+
"restore.steps.storage.bucketInfo": "{name} ({visibility})",
|
|
500
|
+
"restore.steps.storage.public": "público",
|
|
501
|
+
"restore.steps.storage.private": "privado",
|
|
502
|
+
"restore.steps.storage.noBucketsInBackup": "Nenhum bucket de Storage encontrado no backup",
|
|
503
|
+
"restore.steps.storage.projectIdNotFound": "Project ID do projeto origem não encontrado no manifest. Continuando sem substituição...",
|
|
504
|
+
"restore.steps.storage.extracting": "Extraindo arquivo .storage.zip...",
|
|
505
|
+
"restore.steps.storage.extracted": "Arquivo extraído com sucesso",
|
|
506
|
+
"restore.steps.storage.replacing": "Substituindo referências ao Project ID antigo nos arquivos extraídos...",
|
|
507
|
+
"restore.steps.storage.replacingProjectId": "Substituindo Project ID: {source} → {target}",
|
|
508
|
+
"restore.steps.storage.replaced": "Substituição de Project ID concluída",
|
|
509
|
+
"restore.steps.storage.noBucketsInZip": "Nenhum bucket encontrado no arquivo .storage.zip",
|
|
510
|
+
"restore.steps.storage.bucketConfig": "Configurações: {visibility}, limite: {limit}, tipos: {types}",
|
|
511
|
+
"restore.steps.storage.noLimit": "sem limite",
|
|
512
|
+
"restore.steps.storage.allTypes": "todos",
|
|
513
|
+
"restore.steps.storage.fileFound": "Arquivo de storage encontrado: {fileName}",
|
|
514
|
+
"restore.steps.storage.bucketsFoundInZip": "Encontrados {count} bucket(s) no arquivo ZIP",
|
|
515
|
+
"restore.steps.storage.processingBucket": "Processando bucket: {bucketName}",
|
|
516
|
+
"restore.steps.storage.creatingBucket": "Criando bucket {bucketName}...",
|
|
517
|
+
"restore.steps.storage.bucketCreated": "Bucket {bucketName} criado com configurações do backup",
|
|
518
|
+
"restore.steps.storage.bucketUpdated": "Configurações do bucket atualizadas",
|
|
519
|
+
"restore.steps.storage.bucketConfigCorrect": "Configurações do bucket já estão corretas",
|
|
520
|
+
"restore.steps.storage.filesFoundForUpload": "Encontrados {count} arquivo(s) para upload",
|
|
521
|
+
"restore.steps.storage.bucketDone": "Bucket {bucketName}: {uploaded}/{total} arquivo(s) enviado(s)",
|
|
522
|
+
"restore.steps.storage.bucketError": "Erro ao processar bucket {bucketName}: {message}",
|
|
523
|
+
"restore.steps.storage.uploadError": "Erro ao fazer upload de {path}: {message}",
|
|
524
|
+
"restore.steps.storage.restoreComplete": "Restauração de Storage concluída: {success}/{total} bucket(s) processado(s), {files} arquivo(s) enviado(s)",
|
|
525
|
+
"restore.steps.storage.bucketsFoundMetadata": "{count} bucket(s) encontrado(s) no backup (apenas metadados)",
|
|
526
|
+
"restore.steps.storage.noBucketsInSubfolders": "Erro: Nenhum bucket encontrado nas subpastas de {rootDir}",
|
|
527
|
+
"restore.steps.storage.updateError": "Não foi possível atualizar configurações: {errorText}",
|
|
528
|
+
"restore.steps.storage.uploadProgress": "Upload: {path}{metaInfo}",
|
|
529
|
+
"restore.steps.storage.metadataPreserved": "(metadados preservados)",
|
|
530
|
+
"restore.steps.storage.fileError": "Erro ao processar arquivo {path}: {message}",
|
|
531
|
+
"restore.steps.storage.rootIsProjectId": "A pasta raiz é um Project ID e não deve ser tratada como bucket",
|
|
532
|
+
"restore.steps.storage.bucketExists": "Bucket {bucketName} já existe",
|
|
533
|
+
"restore.steps.storage.updating": "Atualizando configurações do bucket para corresponder ao backup...",
|
|
534
|
+
"restore.steps.storage.detectedProjectId": "Detectada pasta raiz com Project ID: {projectId}{reason}",
|
|
535
|
+
"restore.steps.storage.searchingBuckets": "Buscando buckets nas subpastas...",
|
|
536
|
+
"restore.steps.storage.error": "Erro ao processar Storage: {message}",
|
|
537
|
+
|
|
538
|
+
"restore.steps.edgeFunctions.notFound": "Nenhuma Edge Function encontrada no backup",
|
|
539
|
+
"restore.steps.edgeFunctions.found": "Encontradas {count} Edge Function(s)",
|
|
540
|
+
"restore.steps.edgeFunctions.cleaningBefore": "Limpando supabase/functions antes de copiar...",
|
|
541
|
+
"restore.steps.edgeFunctions.linkMayExist": "Link pode já existir, continuando...",
|
|
542
|
+
"restore.steps.edgeFunctions.cleaningAfter": "Limpando supabase/functions após deploy...",
|
|
543
|
+
"restore.steps.edgeFunctions.success": "Edge Functions restauradas com sucesso!",
|
|
544
|
+
"restore.steps.edgeFunctions.error": "Erro ao restaurar Edge Functions: {message}",
|
|
545
|
+
"restore.steps.edgeFunctions.listBucketsError": "Erro ao listar buckets: {message}",
|
|
546
|
+
"restore.steps.edgeFunctions.createBucketError": "Erro ao criar bucket: {status} {errorText}",
|
|
547
|
+
"restore.steps.edgeFunctions.copying": "Copiando {funcName} para supabase/functions...",
|
|
548
|
+
"restore.steps.edgeFunctions.linking": "Linkando com projeto {projectId}...",
|
|
549
|
+
"restore.steps.edgeFunctions.deploying": "Deployando {funcName}...",
|
|
550
|
+
"restore.steps.edgeFunctions.deployed": "{funcName} deployada com sucesso!",
|
|
551
|
+
"restore.steps.edgeFunctions.deployFailed": "{funcName} - deploy falhou: {message}",
|
|
552
|
+
|
|
553
|
+
"restore.steps.auth.notFound": "Nenhuma configuração de Auth encontrada no backup",
|
|
554
|
+
"restore.steps.auth.error": "Erro ao processar Auth Settings: {message}",
|
|
555
|
+
"restore.steps.auth.urlTitle": "URL para configuração manual:",
|
|
556
|
+
"restore.steps.auth.configureTitle": "Configure manualmente as seguintes opções:",
|
|
557
|
+
"restore.steps.auth.pressEnter": "Após configurar, pressione Enter para continuar...",
|
|
558
|
+
"restore.steps.auth.success": "Auth Settings processados",
|
|
559
|
+
|
|
560
|
+
"restore.steps.databaseSettings.notFound": "Nenhuma configuração de Database encontrada no backup",
|
|
561
|
+
"restore.steps.databaseSettings.success": "Database Settings restaurados com sucesso!",
|
|
562
|
+
"restore.steps.databaseSettings.error": "Erro ao restaurar Database Settings: {message}",
|
|
563
|
+
"restore.steps.databaseSettings.enabling": "Habilitando {count} extension(s)...",
|
|
564
|
+
"restore.steps.databaseSettings.extension": "- {extName}",
|
|
565
|
+
"restore.steps.databaseSettings.invalidUrl": "URL inválida para {extName}",
|
|
566
|
+
"restore.steps.databaseSettings.extensionExists": "{extName} - extension já existe ou não pode ser habilitada",
|
|
567
|
+
|
|
568
|
+
"restore.steps.realtime.notFound": "Nenhuma configuração de Realtime encontrada no backup",
|
|
569
|
+
"restore.steps.realtime.urlTitle": "URL para configuração manual:",
|
|
570
|
+
"restore.steps.realtime.configureTitle": "Configure manualmente as seguintes opções:",
|
|
571
|
+
"restore.steps.realtime.pressEnter": "Após configurar, pressione Enter para continuar...",
|
|
572
|
+
"restore.steps.realtime.success": "Realtime Settings processados",
|
|
573
|
+
|
|
574
|
+
"restore.steps.backupSelection.title": "Backups disponíveis:",
|
|
575
|
+
"restore.steps.backupSelection.separator": "═══════════════════════════════════════════════════════════════════════════════"
|
|
250
576
|
}
|
|
251
577
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const inquirer = require('inquirer');
|
|
2
2
|
const chalk = require('chalk');
|
|
3
3
|
const { confirm } = require('../utils/prompt');
|
|
4
|
+
const { t } = require('../i18n');
|
|
4
5
|
|
|
5
6
|
async function mapEnvVariablesInteractively(env, expectedKeys) {
|
|
6
7
|
const finalEnv = { ...env };
|
|
@@ -83,8 +84,10 @@ async function mapEnvVariablesInteractively(env, expectedKeys) {
|
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
const getT = global.smoonbI18n?.t || t;
|
|
88
|
+
|
|
86
89
|
for (const expected of expectedKeys) {
|
|
87
|
-
console.log(chalk.blue(`\n🔧
|
|
90
|
+
console.log(chalk.blue(`\n🔧 ${getT('env.mapping.title', { variable: expected })}`));
|
|
88
91
|
|
|
89
92
|
let clientKey = undefined;
|
|
90
93
|
|
|
@@ -96,13 +99,13 @@ async function mapEnvVariablesInteractively(env, expectedKeys) {
|
|
|
96
99
|
const choices = [
|
|
97
100
|
...allKeys.map((k, idx) => ({ name: `${idx + 1}. ${k}`, value: k })),
|
|
98
101
|
new inquirer.Separator(),
|
|
99
|
-
{ name: '
|
|
102
|
+
{ name: getT('env.mapping.addNew'), value: '__ADD_NEW__' }
|
|
100
103
|
];
|
|
101
104
|
|
|
102
105
|
const { chosen } = await inquirer.prompt([{
|
|
103
106
|
type: 'list',
|
|
104
107
|
name: 'chosen',
|
|
105
|
-
message:
|
|
108
|
+
message: getT('env.mapping.selectKey', { expected }),
|
|
106
109
|
choices,
|
|
107
110
|
loop: false,
|
|
108
111
|
prefix: ''
|
|
@@ -131,7 +134,7 @@ async function mapEnvVariablesInteractively(env, expectedKeys) {
|
|
|
131
134
|
|
|
132
135
|
// Se não tem valor, mostrar mensagem específica e pular confirmação
|
|
133
136
|
if (!currentValue) {
|
|
134
|
-
console.log(chalk.yellow(
|
|
137
|
+
console.log(chalk.yellow(getT('env.mapping.notFound', { variable: expected })));
|
|
135
138
|
if (instructions.help) {
|
|
136
139
|
// Se o help contém link (https://), mostrar como link
|
|
137
140
|
if (instructions.help.includes('https://')) {
|
|
@@ -148,7 +151,7 @@ async function mapEnvVariablesInteractively(env, expectedKeys) {
|
|
|
148
151
|
}
|
|
149
152
|
} else {
|
|
150
153
|
// Se tem valor, perguntar se está correto
|
|
151
|
-
const isCorrect = await confirm(
|
|
154
|
+
const isCorrect = await confirm(`${getT('env.mapping.currentValue', { value: currentValue })}\n${getT('env.mapping.isCorrect')}`, true);
|
|
152
155
|
if (isCorrect) {
|
|
153
156
|
finalEnv[clientKey] = currentValue;
|
|
154
157
|
if (expected === 'SUPABASE_PROJECT_ID') {
|
|
@@ -209,51 +212,53 @@ async function mapEnvVariablesInteractively(env, expectedKeys) {
|
|
|
209
212
|
}
|
|
210
213
|
|
|
211
214
|
async function askComponentsFlags() {
|
|
215
|
+
const getT = global.smoonbI18n?.t || t;
|
|
216
|
+
|
|
212
217
|
// Explicação sobre Edge Functions
|
|
213
|
-
console.log(chalk.cyan(
|
|
214
|
-
console.log(chalk.white(
|
|
215
|
-
console.log(chalk.white('
|
|
216
|
-
console.log(chalk.white('
|
|
218
|
+
console.log(chalk.cyan(`\n⚡ ${getT('backup.components.edgeFunctions.title')}`));
|
|
219
|
+
console.log(chalk.white(` ${getT('backup.components.edgeFunctions.description1')}`));
|
|
220
|
+
console.log(chalk.white(` ${getT('backup.components.edgeFunctions.description2')}`));
|
|
221
|
+
console.log(chalk.white(` ${getT('backup.components.edgeFunctions.description3')}\n`));
|
|
217
222
|
|
|
218
|
-
const includeFunctions = await confirm('
|
|
223
|
+
const includeFunctions = await confirm(getT('backup.components.edgeFunctions.include'), true);
|
|
219
224
|
|
|
220
225
|
// Pergunta de limpeza de functions imediatamente após
|
|
221
226
|
let cleanFunctions = false;
|
|
222
227
|
if (includeFunctions) {
|
|
223
|
-
cleanFunctions = await confirm('
|
|
228
|
+
cleanFunctions = await confirm(getT('backup.components.edgeFunctions.cleanup'), false);
|
|
224
229
|
}
|
|
225
230
|
|
|
226
231
|
// Explicação sobre .temp
|
|
227
|
-
console.log(chalk.cyan(
|
|
228
|
-
console.log(chalk.white(
|
|
229
|
-
console.log(chalk.white('
|
|
232
|
+
console.log(chalk.cyan(`\n📁 ${getT('backup.components.temp.title')}`));
|
|
233
|
+
console.log(chalk.white(` ${getT('backup.components.temp.description1')}`));
|
|
234
|
+
console.log(chalk.white(` ${getT('backup.components.temp.description2')}\n`));
|
|
230
235
|
|
|
231
|
-
const includeTemp = await confirm('
|
|
236
|
+
const includeTemp = await confirm(getT('backup.components.temp.include'), true);
|
|
232
237
|
|
|
233
238
|
// Pergunta de limpeza de .temp imediatamente após
|
|
234
239
|
let cleanTemp = false;
|
|
235
240
|
if (includeTemp) {
|
|
236
|
-
cleanTemp = await confirm('
|
|
241
|
+
cleanTemp = await confirm(getT('backup.components.temp.cleanup'), false);
|
|
237
242
|
}
|
|
238
243
|
|
|
239
244
|
// Explicação sobre Migrations
|
|
240
|
-
console.log(chalk.cyan(
|
|
241
|
-
console.log(chalk.white(
|
|
242
|
-
console.log(chalk.white('
|
|
243
|
-
console.log(chalk.white('
|
|
245
|
+
console.log(chalk.cyan(`\n📋 ${getT('backup.components.migrations.title')}`));
|
|
246
|
+
console.log(chalk.white(` ${getT('backup.components.migrations.description1')}`));
|
|
247
|
+
console.log(chalk.white(` ${getT('backup.components.migrations.description2')}`));
|
|
248
|
+
console.log(chalk.white(` ${getT('backup.components.migrations.description3')}\n`));
|
|
244
249
|
|
|
245
|
-
const includeMigrations = await confirm('
|
|
250
|
+
const includeMigrations = await confirm(getT('backup.components.migrations.include'), true);
|
|
246
251
|
|
|
247
252
|
// Pergunta de limpeza de migrations imediatamente após
|
|
248
253
|
let cleanMigrations = false;
|
|
249
254
|
if (includeMigrations) {
|
|
250
|
-
cleanMigrations = await confirm('
|
|
255
|
+
cleanMigrations = await confirm(getT('backup.components.migrations.cleanup'), false);
|
|
251
256
|
}
|
|
252
257
|
|
|
253
258
|
// Continuar com outras perguntas
|
|
254
|
-
const includeStorage = await confirm('
|
|
255
|
-
const includeAuth = await confirm('
|
|
256
|
-
const includeRealtime = await confirm('
|
|
259
|
+
const includeStorage = await confirm(getT('backup.components.storage.include'), true);
|
|
260
|
+
const includeAuth = await confirm(getT('backup.components.auth.include'), true);
|
|
261
|
+
const includeRealtime = await confirm(getT('backup.components.realtime.include'), true);
|
|
257
262
|
|
|
258
263
|
return {
|
|
259
264
|
includeFunctions,
|