smoonb 0.0.58 → 0.0.60

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **Complete Supabase backup and migration tool**
4
4
 
5
- A primeira ferramenta CLI completa para backup e migração de projetos Supabase. Resolve o problema de backup incompleto das ferramentas existentes.
5
+ Backup e restauração: completo e simples, como deveria ser
6
6
 
7
7
  > **Nota sobre acesso comercial:** o Supa Moonbase passará a exigir validação de conta antes de executar operações (login + verificação de assinatura) em fase futura. Nesta versão, não há autenticação implementada — este README apenas apresenta a base legal/comercial. O uso operacional será regido pelos [Termos de Serviço](https://smoonb.com/terms) e pela [Política de Privacidade](https://smoonb.com/privacy).
8
8
 
@@ -153,10 +153,6 @@ Valor atual: https://abc123.supabase.co
153
153
  Este é o valor correto do projeto alvo? (S/n): S
154
154
  ```
155
155
 
156
- ```bash
157
- npx smoonb config --init
158
- ```
159
-
160
156
  ## 🎯 Uso
161
157
 
162
158
  ### Backup Completo
@@ -246,6 +242,39 @@ npx smoonb restore
246
242
  - ✅ `.backup.gz` (compactado) - Descompacta automaticamente antes de restaurar
247
243
  - ✅ `.backup` (descompactado) - Restaura diretamente
248
244
 
245
+ ### Importar Backup do Dashboard do Supabase
246
+
247
+ Se você baixou um backup diretamente do Dashboard do Supabase (formato `.backup.gz`), você pode importá-lo para o formato esperado pelo smoonb:
248
+
249
+ ```bash
250
+ npx smoonb import --file "caminho/completo/para/db_cluster-04-03-2024@14-16-59.backup.gz"
251
+ ```
252
+
253
+ **O que o comando faz:**
254
+ 1. Lê o arquivo `.backup.gz` do Dashboard
255
+ 2. Extrai informações do nome do arquivo (data e hora)
256
+ 3. Cria uma pasta de backup no formato esperado (`backup-YYYY-MM-DD-HH-MM-SS`)
257
+ 4. Copia o arquivo para a pasta criada
258
+ 5. Deixa o backup pronto para ser encontrado pelo comando `restore`
259
+
260
+ **Exemplo completo:**
261
+ ```bash
262
+ # 1. Baixar backup do Dashboard do Supabase
263
+ # Arquivo: db_cluster-04-03-2024@14-16-59.backup.gz
264
+
265
+ # 2. Importar o arquivo
266
+ npx smoonb import --file "C:\Downloads\db_cluster-04-03-2024@14-16-59.backup.gz"
267
+
268
+ # 3. Restaurar o backup importado
269
+ npx smoonb restore
270
+ # O backup importado aparecerá na lista de backups disponíveis
271
+ ```
272
+
273
+ **Importante:**
274
+ - O arquivo deve estar no formato do Dashboard: `db_cluster-DD-MM-YYYY@HH-MM-SS.backup.gz`
275
+ - O caminho pode ser absoluto ou relativo
276
+ - O comando criará a estrutura de pastas necessária automaticamente
277
+
249
278
  ### Verificação Pós-Restore
250
279
 
251
280
  ```bash
@@ -260,15 +289,6 @@ npx smoonb check
260
289
  - ✅ Publicações Realtime
261
290
  - ✅ Buckets de Storage
262
291
 
263
- ### Edge Functions
264
-
265
- ```bash
266
- # Listar functions
267
- npx smoonb functions list
268
-
269
- # Deploy functions
270
- npx smoonb functions push
271
- ```
272
292
 
273
293
  ## 🔧 Comandos Disponíveis
274
294
 
@@ -276,6 +296,7 @@ npx smoonb functions push
276
296
  |---------|-----------|
277
297
  | `npx smoonb backup` | Backup completo interativo usando Docker |
278
298
  | `npx smoonb restore` | Restauração interativa usando psql (Docker) |
299
+ | `npx smoonb import --file <path>` | Importar arquivo .backup.gz do Dashboard do Supabase |
279
300
  | `npx smoonb check` | Verificação de integridade pós-restore |
280
301
 
281
302
  ## 🏗️ Arquitetura Técnica
package/bin/smoonb.js CHANGED
@@ -23,11 +23,14 @@ const program = new Command();
23
23
  // Configuração básica do programa
24
24
  program
25
25
  .name('smoonb')
26
- .description('Complete Supabase backup and migration tool - EXPERIMENTAL VERSION - USE AT YOUR OWN RISK')
26
+ .description('Complete Supabase backup and migration tool')
27
27
  .version(packageJson.version, '-v, --version', 'display version number')
28
28
  .addHelpText('before', () => {
29
29
  showBetaBanner();
30
- return '';
30
+ return chalk.yellow.bold('\n⚠️ TERMO DE USO E AVISO DE RISCO\n') +
31
+ chalk.white('Ao prosseguir, você reconhece e concorda que o Supa Moonbase (smoonb) é fornecido "NO ESTADO EM QUE SE ENCONTRA" ("AS IS") e "CONFORME DISPONIBILIDADE", sem garantias de qualquer natureza—expressas, implícitas ou legais—incluindo, sem limitação, garantias de comercialização, adequação a um fim específico e não violação, na máxima extensão permitida pela lei aplicável. Operações de backup e restauração envolvem riscos, os ambientes variam amplamente e não é possível prever ou validar todas as configurações dos usuários. Você é o único responsável por validar seu ambiente, manter cópias independentes e verificar os resultados antes de utilizá-los em produção. O Supa Moonbase (smoonb) é construído com repositórios públicos, auditáveis e software livre, para auxiliar pessoas a simplificar seus fluxos, sem com isso criar qualquer garantia, promessa de suporte ou compromisso de nível de serviço.\n\n') +
32
+ chalk.white('Limitação de responsabilidade (PT-BR) — Na máxima extensão permitida por lei, a Goalmoon, seus contribuidores e licenciadores não serão responsáveis por danos indiretos, incidentais, especiais, consequentes, exemplares ou punitivos (incluindo perda de dados, interrupção de negócios ou lucros cessantes) decorrentes do uso, incapacidade de uso, das operações de backup/restauração realizadas com, ou dos resultados gerados pelo Supa Moonbase (smoonb). Em qualquer hipótese, a responsabilidade total por todas as reivindicações relacionadas ao Supa Moonbase (smoonb) não excederá o valor pago por você pelo Supa Moonbase (smoonb) nos 12 meses anteriores ao evento. Nada neste aviso exclui ou limita responsabilidades onde tais limites sejam proibidos por lei, incluindo (conforme aplicável) dolo ou culpa grave.\n\n') +
33
+ chalk.white('Observação para consumidores no Brasil (PT-BR) — Para consumidores brasileiros, este aviso não afasta direitos irrenunciáveis previstos no Código de Defesa do Consumidor (CDC); qualquer limitação aqui prevista só se aplica nos limites da lei e não impede a indenização obrigatória quando cabível.\n\n');
31
34
  })
32
35
  .addHelpText('after', () => {
33
36
  return chalk.cyan.bold(`
@@ -54,12 +57,6 @@ program
54
57
  .option('--db-url <url>', 'URL da database de destino (override)')
55
58
  .action(commands.restore);
56
59
 
57
-
58
- program
59
- .command('functions')
60
- .description('Gerenciar Edge Functions do Supabase')
61
- .action(commands.functions);
62
-
63
60
  program
64
61
  .command('check')
65
62
  .description('Verificar integridade do projeto Supabase após restauração')
@@ -67,11 +64,12 @@ program
67
64
  .action(commands.check);
68
65
 
69
66
  program
70
- .command('config')
71
- .description('Configurar credenciais e configurações do smoonb')
72
- .option('--init', 'Inicializar configuração')
73
- .option('--show', 'Mostrar configuração atual')
74
- .action(commands.config);
67
+ .command('import')
68
+ .description('Importar arquivo .backup.gz do Dashboard do Supabase')
69
+ .requiredOption('-f, --file <path>', 'Caminho completo do arquivo .backup.gz a importar')
70
+ .action(async (options) => {
71
+ await commands.import({ file: options.file });
72
+ });
75
73
 
76
74
  // Tratamento de erros
77
75
  program.on('command:*', function (operands) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smoonb",
3
- "version": "0.0.58",
3
+ "version": "0.0.60",
4
4
  "description": "Complete Supabase backup and migration tool - EXPERIMENTAL VERSION - USE AT YOUR OWN RISK",
5
5
  "preferGlobal": false,
6
6
  "preventGlobalInstall": true,
@@ -0,0 +1,91 @@
1
+ const chalk = require('chalk');
2
+ const path = require('path');
3
+ const fs = require('fs').promises;
4
+ const { ensureDir } = require('../utils/fsx');
5
+ const { readEnvFile } = require('../utils/env');
6
+ const { showBetaBanner } = require('../utils/banner');
7
+
8
+ /**
9
+ * Comando para importar arquivo .backup.gz do Dashboard do Supabase
10
+ */
11
+ module.exports = async (options) => {
12
+ showBetaBanner();
13
+
14
+ try {
15
+ // Validar que o arquivo foi fornecido
16
+ if (!options.file) {
17
+ console.error(chalk.red('❌ Arquivo não fornecido'));
18
+ console.log(chalk.yellow('💡 Use: npx smoonb --import --file <caminho-completo-do-arquivo>'));
19
+ console.log(chalk.gray(' Exemplo: npx smoonb --import --file "C:\\Downloads\\db_cluster-04-03-2024@14-16-59.backup.gz"'));
20
+ process.exit(1);
21
+ }
22
+
23
+ const sourceFile = path.resolve(options.file);
24
+
25
+ // Verificar se o arquivo existe
26
+ try {
27
+ await fs.access(sourceFile);
28
+ } catch {
29
+ console.error(chalk.red(`❌ Arquivo não encontrado: ${sourceFile}`));
30
+ process.exit(1);
31
+ }
32
+
33
+ // Verificar se é um arquivo .backup.gz
34
+ if (!sourceFile.endsWith('.backup.gz') && !sourceFile.endsWith('.backup')) {
35
+ console.error(chalk.red('❌ Arquivo deve ser .backup.gz ou .backup'));
36
+ process.exit(1);
37
+ }
38
+
39
+ // Ler .env.local para obter SMOONB_OUTPUT_DIR
40
+ const envPath = path.join(process.cwd(), '.env.local');
41
+ let outputDir = './backups';
42
+
43
+ try {
44
+ const currentEnv = await readEnvFile(envPath);
45
+ outputDir = currentEnv.SMOONB_OUTPUT_DIR || './backups';
46
+ } catch {
47
+ // Se não conseguir ler .env.local, usar padrão
48
+ console.log(chalk.yellow('⚠️ Não foi possível ler .env.local, usando diretório padrão: ./backups'));
49
+ }
50
+
51
+ // Extrair informações do nome do arquivo
52
+ // Formato esperado: db_cluster-DD-MM-YYYY@HH-MM-SS.backup.gz
53
+ const fileName = path.basename(sourceFile);
54
+ const match = fileName.match(/db_cluster-(\d{2})-(\d{2})-(\d{4})@(\d{2})-(\d{2})-(\d{2})\.backup(\.gz)?/);
55
+
56
+ if (!match) {
57
+ console.error(chalk.red('❌ Nome do arquivo não está no formato esperado do Dashboard'));
58
+ console.log(chalk.yellow('💡 Formato esperado: db_cluster-DD-MM-YYYY@HH-MM-SS.backup.gz'));
59
+ console.log(chalk.gray(` Arquivo recebido: ${fileName}`));
60
+ process.exit(1);
61
+ }
62
+
63
+ const [, day, month, year, hour, minute, second] = match;
64
+
65
+ // Criar nome da pasta no formato backup-YYYY-MM-DD-HH-MM-SS
66
+ const backupDirName = `backup-${year}-${month}-${day}-${hour}-${minute}-${second}`;
67
+ const backupDir = path.join(outputDir, backupDirName);
68
+
69
+ // Criar diretório de backup
70
+ await ensureDir(backupDir);
71
+ console.log(chalk.blue(`📁 Criando diretório de backup: ${backupDirName}`));
72
+
73
+ // Copiar arquivo para o diretório de backup
74
+ const destFile = path.join(backupDir, fileName);
75
+ await fs.copyFile(sourceFile, destFile);
76
+
77
+ // Obter tamanho do arquivo
78
+ const stats = await fs.stat(destFile);
79
+ const sizeMB = (stats.size / (1024 * 1024)).toFixed(2);
80
+
81
+ console.log(chalk.green(`✅ Arquivo importado com sucesso!`));
82
+ console.log(chalk.blue(`📁 Localização: ${backupDir}`));
83
+ console.log(chalk.blue(`📦 Arquivo: ${fileName} (${sizeMB} MB)`));
84
+ console.log(chalk.cyan(`\n💡 Próximo passo: Execute 'npx smoonb restore' para restaurar este backup`));
85
+
86
+ } catch (error) {
87
+ console.error(chalk.red(`❌ Erro ao importar arquivo: ${error.message}`));
88
+ process.exit(1);
89
+ }
90
+ };
91
+
package/src/index.js CHANGED
@@ -12,9 +12,8 @@ const { showBetaBanner } = require('./utils/banner');
12
12
  // Exportar comandos
13
13
  const backupCommand = require('./commands/backup');
14
14
  const restoreCommand = require('./commands/restore');
15
- const functionsCommand = require('./commands/functions');
16
15
  const checkCommand = require('./commands/check');
17
- const configCommand = require('./commands/config');
16
+ const importCommand = require('./commands/import');
18
17
 
19
18
  // Exportar utilitários
20
19
  const supabaseUtils = require('./utils/supabase');
@@ -220,9 +219,8 @@ module.exports = {
220
219
  commands: {
221
220
  backup: backupCommand,
222
221
  restore: restoreCommand,
223
- functions: functionsCommand,
224
222
  check: checkCommand,
225
- config: configCommand
223
+ import: importCommand
226
224
  },
227
225
 
228
226
  // Utilitários
@@ -5,8 +5,7 @@ const chalk = require('chalk');
5
5
  */
6
6
  function showBetaBanner() {
7
7
  console.log(chalk.cyan.bold('\n🚀 Supa Moonbase (smoonb)\n'));
8
- console.log(chalk.white('A primeira ferramenta CLI completa para backup e migração de projetos Supabase.'));
9
- console.log(chalk.white('Resolve o problema de backup incompleto das ferramentas existentes.\n'));
8
+ console.log(chalk.white('Backup e restauração: completo e simples, como deveria ser\n'));
10
9
 
11
10
  console.log(chalk.cyan.bold('📦 Componentes de Backup:\n'));
12
11
  console.log(chalk.white(' ✅ Database PostgreSQL (pg_dumpall + SQL separados)'));