smoonb 0.0.4 → 0.0.6
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/.smoonbrc +20 -0
- package/backup/backup-2025-10-17T19-18-58-539Z/auth-config.json +7 -0
- package/backup/backup-2025-10-17T19-18-58-539Z/backup-manifest.json +19 -0
- package/backup/backup-2025-10-17T19-18-58-539Z/functions/README.md +4 -0
- package/backup/backup-2025-10-17T19-18-58-539Z/realtime-config.json +7 -0
- package/backup/backup-2025-10-17T19-18-58-539Z/storage/storage-config.json +6 -0
- package/bin/smoonb.js +36 -1
- package/package.json +1 -1
- package/src/commands/backup.js +17 -4
- package/src/commands/check.js +2 -1
- package/src/commands/config.js +1 -1
- package/src/commands/functions.js +1 -1
- package/src/commands/restore.js +2 -1
- package/src/commands/secrets.js +1 -1
- package/src/index.js +1 -2
- package/src/utils/supabase.js +2 -2
package/.smoonbrc
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"supabase": {
|
|
3
|
+
"projectId": "your-project-id-here",
|
|
4
|
+
"url": "https://your-project.supabase.co",
|
|
5
|
+
"serviceKey": "your-service-key-here",
|
|
6
|
+
"anonKey": "your-anon-key-here",
|
|
7
|
+
"databaseUrl": "postgresql://postgres:[password]@db.your-project.supabase.co:5432/postgres"
|
|
8
|
+
},
|
|
9
|
+
"backup": {
|
|
10
|
+
"includeFunctions": true,
|
|
11
|
+
"includeStorage": true,
|
|
12
|
+
"includeAuth": true,
|
|
13
|
+
"includeRealtime": true,
|
|
14
|
+
"outputDir": "./backups"
|
|
15
|
+
},
|
|
16
|
+
"restore": {
|
|
17
|
+
"cleanRestore": false,
|
|
18
|
+
"verifyAfterRestore": true
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"timestamp": "2025-10-17T19:18:58.559Z",
|
|
3
|
+
"projectId": "itrnlqsdfsdfsdf",
|
|
4
|
+
"version": "0.1.0-beta",
|
|
5
|
+
"components": {
|
|
6
|
+
"database": false,
|
|
7
|
+
"functions": true,
|
|
8
|
+
"auth": true,
|
|
9
|
+
"storage": true,
|
|
10
|
+
"realtime": true
|
|
11
|
+
},
|
|
12
|
+
"files": {
|
|
13
|
+
"database": null,
|
|
14
|
+
"functions": "functions/",
|
|
15
|
+
"auth": "auth-config.json",
|
|
16
|
+
"storage": "storage/",
|
|
17
|
+
"realtime": "realtime-config.json"
|
|
18
|
+
}
|
|
19
|
+
}
|
package/bin/smoonb.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* smoonb - Complete Supabase backup and migration tool
|
|
5
5
|
*
|
|
6
6
|
* CLI principal para backup e migração de projetos Supabase
|
|
7
|
-
*
|
|
7
|
+
* EXPERIMENTAL VERSION - USE AT YOUR OWN RISK
|
|
8
8
|
*
|
|
9
9
|
* Desenvolvido por: Goalmoon Tecnologia LTDA
|
|
10
10
|
* Website: https://goalmoon.com
|
|
@@ -28,6 +28,41 @@ program
|
|
|
28
28
|
.addHelpText('before', () => {
|
|
29
29
|
showBetaBanner();
|
|
30
30
|
return '';
|
|
31
|
+
})
|
|
32
|
+
.addHelpText('after', () => {
|
|
33
|
+
return chalk.cyan.bold(`
|
|
34
|
+
📋 CONFIGURAÇÃO AUTOMÁTICA:
|
|
35
|
+
smoonb config --init # Cria ~/.smoonbrc com projectId, URLs, etc.
|
|
36
|
+
# Edite o arquivo com suas credenciais Supabase
|
|
37
|
+
smoonb backup # Funciona sem --project-id!
|
|
38
|
+
|
|
39
|
+
📝 EXEMPLO DE CONFIGURAÇÃO (.smoonbrc):
|
|
40
|
+
{
|
|
41
|
+
"supabase": {
|
|
42
|
+
"projectId": "abc123def456",
|
|
43
|
+
"url": "https://abc123def456.supabase.co",
|
|
44
|
+
"serviceKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
45
|
+
"anonKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
46
|
+
"databaseUrl": "postgresql://postgres:[senha]@db.abc123def456.supabase.co:5432/postgres"
|
|
47
|
+
},
|
|
48
|
+
"backup": {
|
|
49
|
+
"includeFunctions": true,
|
|
50
|
+
"includeStorage": true,
|
|
51
|
+
"includeAuth": true,
|
|
52
|
+
"includeRealtime": true,
|
|
53
|
+
"outputDir": "./backups"
|
|
54
|
+
},
|
|
55
|
+
"restore": {
|
|
56
|
+
"cleanRestore": false,
|
|
57
|
+
"verifyAfterRestore": true
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
🔧 COMO CONFIGURAR:
|
|
62
|
+
1. smoonb config --init
|
|
63
|
+
2. Edite ~/.smoonbrc com suas credenciais
|
|
64
|
+
3. smoonb backup (funciona automaticamente!)
|
|
65
|
+
`);
|
|
31
66
|
});
|
|
32
67
|
|
|
33
68
|
// Comandos principais
|
package/package.json
CHANGED
package/src/commands/backup.js
CHANGED
|
@@ -15,7 +15,7 @@ const { getProjectId, getDatabaseUrl } = require('../utils/supabase');
|
|
|
15
15
|
* Resolve o problema: ferramentas existentes só fazem backup da database
|
|
16
16
|
*/
|
|
17
17
|
async function backupCommand(options) {
|
|
18
|
-
console.log(chalk.red.bold('🚀 smoonb
|
|
18
|
+
console.log(chalk.red.bold('🚀 smoonb - EXPERIMENTAL VERSION'));
|
|
19
19
|
console.log(chalk.red.bold('⚠️ VERSÃO EXPERIMENTAL - NUNCA TESTADA EM PRODUÇÃO!'));
|
|
20
20
|
console.log(chalk.red.bold('🚨 USE POR SUA CONTA E RISCO - Pode causar perda de dados!'));
|
|
21
21
|
console.log(chalk.red.bold('❌ NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados!\n'));
|
|
@@ -32,6 +32,7 @@ async function backupCommand(options) {
|
|
|
32
32
|
console.log(chalk.gray(' 1. Use: smoonb backup --project-id <seu-project-id>'));
|
|
33
33
|
console.log(chalk.gray(' 2. Configure: smoonb config --init'));
|
|
34
34
|
console.log(chalk.gray(' 3. Ou defina SUPABASE_PROJECT_ID no ambiente'));
|
|
35
|
+
console.log(chalk.gray(' 4. Ou edite ~/.smoonbrc e configure o projectId'));
|
|
35
36
|
process.exit(1);
|
|
36
37
|
}
|
|
37
38
|
|
|
@@ -130,7 +131,17 @@ async function backupDatabase(projectId, outputDir) {
|
|
|
130
131
|
|
|
131
132
|
if (!dbUrl) {
|
|
132
133
|
console.log(chalk.yellow('⚠️ Database URL não configurada'));
|
|
133
|
-
console.log(chalk.gray(' - Configure DATABASE_URL
|
|
134
|
+
console.log(chalk.gray(' - Configure DATABASE_URL no ambiente'));
|
|
135
|
+
console.log(chalk.gray(' - Ou edite ~/.smoonbrc e configure databaseUrl'));
|
|
136
|
+
console.log(chalk.gray(' - Ou use smoonb config --init'));
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Verificar se a URL contém placeholder de senha
|
|
141
|
+
if (dbUrl.includes('[password]')) {
|
|
142
|
+
console.log(chalk.yellow('⚠️ Database URL contém placeholder [password]'));
|
|
143
|
+
console.log(chalk.gray(' - Substitua [password] pela senha real da database'));
|
|
144
|
+
console.log(chalk.gray(' - Ou configure DATABASE_URL completa no ambiente'));
|
|
134
145
|
return null;
|
|
135
146
|
}
|
|
136
147
|
|
|
@@ -146,8 +157,10 @@ async function backupDatabase(projectId, outputDir) {
|
|
|
146
157
|
|
|
147
158
|
return filepath;
|
|
148
159
|
} catch (error) {
|
|
149
|
-
console.log(chalk.yellow('⚠️ Backup da database falhou
|
|
150
|
-
console.log(chalk.gray(' -
|
|
160
|
+
console.log(chalk.yellow('⚠️ Backup da database falhou:'), error.message);
|
|
161
|
+
console.log(chalk.gray(' - Verifique se DATABASE_URL está correta'));
|
|
162
|
+
console.log(chalk.gray(' - Verifique se pg_dump está instalado'));
|
|
163
|
+
console.log(chalk.gray(' - Verifique se as credenciais estão corretas'));
|
|
151
164
|
return null;
|
|
152
165
|
}
|
|
153
166
|
}
|
package/src/commands/check.js
CHANGED
|
@@ -14,7 +14,7 @@ const { getProjectId } = require('../utils/supabase');
|
|
|
14
14
|
* Resolve o problema: garantir que restauração foi bem-sucedida
|
|
15
15
|
*/
|
|
16
16
|
async function checkCommand(options) {
|
|
17
|
-
console.log(chalk.red.bold('🚀 smoonb
|
|
17
|
+
console.log(chalk.red.bold('🚀 smoonb - EXPERIMENTAL VERSION'));
|
|
18
18
|
console.log(chalk.red.bold('⚠️ VERSÃO EXPERIMENTAL - NUNCA TESTADA EM PRODUÇÃO!'));
|
|
19
19
|
console.log(chalk.red.bold('🚨 USE POR SUA CONTA E RISCO - Pode causar perda de dados!'));
|
|
20
20
|
console.log(chalk.red.bold('❌ NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados!\n'));
|
|
@@ -31,6 +31,7 @@ async function checkCommand(options) {
|
|
|
31
31
|
console.log(chalk.gray(' 1. Use: smoonb check --project-id <seu-project-id>'));
|
|
32
32
|
console.log(chalk.gray(' 2. Configure: smoonb config --init'));
|
|
33
33
|
console.log(chalk.gray(' 3. Ou defina SUPABASE_PROJECT_ID no ambiente'));
|
|
34
|
+
console.log(chalk.gray(' 4. Ou edite ~/.smoonbrc e configure o projectId'));
|
|
34
35
|
process.exit(1);
|
|
35
36
|
}
|
|
36
37
|
|
package/src/commands/config.js
CHANGED
|
@@ -8,7 +8,7 @@ const path = require('path');
|
|
|
8
8
|
const os = require('os');
|
|
9
9
|
|
|
10
10
|
async function configCommand(options) {
|
|
11
|
-
console.log(chalk.red.bold('🚀 smoonb
|
|
11
|
+
console.log(chalk.red.bold('🚀 smoonb - EXPERIMENTAL VERSION'));
|
|
12
12
|
console.log(chalk.red.bold('⚠️ VERSÃO EXPERIMENTAL - NUNCA TESTADA EM PRODUÇÃO!'));
|
|
13
13
|
console.log(chalk.red.bold('🚨 USE POR SUA CONTA E RISCO - Pode causar perda de dados!'));
|
|
14
14
|
console.log(chalk.red.bold('❌ NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados!\n'));
|
|
@@ -13,7 +13,7 @@ const path = require('path');
|
|
|
13
13
|
* Resolve o problema: Edge Functions ficam fora da database
|
|
14
14
|
*/
|
|
15
15
|
async function functionsCommand(options) {
|
|
16
|
-
console.log(chalk.red.bold('🚀 smoonb
|
|
16
|
+
console.log(chalk.red.bold('🚀 smoonb - EXPERIMENTAL VERSION'));
|
|
17
17
|
console.log(chalk.red.bold('⚠️ VERSÃO EXPERIMENTAL - NUNCA TESTADA EM PRODUÇÃO!'));
|
|
18
18
|
console.log(chalk.red.bold('🚨 USE POR SUA CONTA E RISCO - Pode causar perda de dados!'));
|
|
19
19
|
console.log(chalk.red.bold('❌ NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados!\n'));
|
package/src/commands/restore.js
CHANGED
|
@@ -14,7 +14,7 @@ const { getProjectId } = require('../utils/supabase');
|
|
|
14
14
|
* Processo seguro: DROP → CREATE → RESTORE (nunca restore sobre banco existente)
|
|
15
15
|
*/
|
|
16
16
|
async function restoreCommand(options) {
|
|
17
|
-
console.log(chalk.red.bold('🚀 smoonb
|
|
17
|
+
console.log(chalk.red.bold('🚀 smoonb - EXPERIMENTAL VERSION'));
|
|
18
18
|
console.log(chalk.red.bold('⚠️ VERSÃO EXPERIMENTAL - NUNCA TESTADA EM PRODUÇÃO!'));
|
|
19
19
|
console.log(chalk.red.bold('🚨 USE POR SUA CONTA E RISCO - Pode causar perda de dados!'));
|
|
20
20
|
console.log(chalk.red.bold('❌ NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados!\n'));
|
|
@@ -31,6 +31,7 @@ async function restoreCommand(options) {
|
|
|
31
31
|
console.log(chalk.gray(' 1. Use: smoonb restore --project-id <seu-project-id>'));
|
|
32
32
|
console.log(chalk.gray(' 2. Configure: smoonb config --init'));
|
|
33
33
|
console.log(chalk.gray(' 3. Ou defina SUPABASE_PROJECT_ID no ambiente'));
|
|
34
|
+
console.log(chalk.gray(' 4. Ou edite ~/.smoonbrc e configure o projectId'));
|
|
34
35
|
process.exit(1);
|
|
35
36
|
}
|
|
36
37
|
|
package/src/commands/secrets.js
CHANGED
|
@@ -12,7 +12,7 @@ const path = require('path');
|
|
|
12
12
|
* Resolve o problema: secrets sensíveis não devem ser commitados
|
|
13
13
|
*/
|
|
14
14
|
async function secretsCommand(options) {
|
|
15
|
-
console.log(chalk.red.bold('🚀 smoonb
|
|
15
|
+
console.log(chalk.red.bold('🚀 smoonb - EXPERIMENTAL VERSION'));
|
|
16
16
|
console.log(chalk.red.bold('⚠️ VERSÃO EXPERIMENTAL - NUNCA TESTADA EM PRODUÇÃO!'));
|
|
17
17
|
console.log(chalk.red.bold('🚨 USE POR SUA CONTA E RISCO - Pode causar perda de dados!'));
|
|
18
18
|
console.log(chalk.red.bold('❌ NÃO NOS RESPONSABILIZAMOS por qualquer perda de dados!\n'));
|
package/src/index.js
CHANGED
|
@@ -24,7 +24,6 @@ const validationUtils = require('./utils/validation');
|
|
|
24
24
|
*/
|
|
25
25
|
const packageInfo = {
|
|
26
26
|
name: 'smoonb',
|
|
27
|
-
version: '0.0.3',
|
|
28
27
|
description: 'Complete Supabase backup and migration tool - EXPERIMENTAL VERSION - USE AT YOUR OWN RISK',
|
|
29
28
|
author: 'Goalmoon Tecnologia LTDA <https://goalmoon.com>',
|
|
30
29
|
license: 'SEE LICENSE IN LICENSE.md'
|
|
@@ -36,7 +35,7 @@ const packageInfo = {
|
|
|
36
35
|
function showBetaBanner() {
|
|
37
36
|
console.log(chalk.red.bold(`
|
|
38
37
|
╔══════════════════════════════════════════════════════════════╗
|
|
39
|
-
║ 🚀 smoonb
|
|
38
|
+
║ 🚀 smoonb ║
|
|
40
39
|
║ ║
|
|
41
40
|
║ ⚠️ EXPERIMENTAL VERSION - NÃO TESTADA! ║
|
|
42
41
|
║ ║
|
package/src/utils/supabase.js
CHANGED
|
@@ -85,7 +85,7 @@ function getProjectId() {
|
|
|
85
85
|
|
|
86
86
|
// Tentar configuração
|
|
87
87
|
const config = loadConfig();
|
|
88
|
-
if (config?.supabase?.projectId) {
|
|
88
|
+
if (config?.supabase?.projectId && config.supabase.projectId.trim() !== '') {
|
|
89
89
|
return config.supabase.projectId;
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -103,7 +103,7 @@ function getDatabaseUrl(projectId = null) {
|
|
|
103
103
|
|
|
104
104
|
// Tentar configuração
|
|
105
105
|
const config = loadConfig();
|
|
106
|
-
if (config?.supabase?.databaseUrl) {
|
|
106
|
+
if (config?.supabase?.databaseUrl && config.supabase.databaseUrl.trim() !== '') {
|
|
107
107
|
return config.supabase.databaseUrl;
|
|
108
108
|
}
|
|
109
109
|
|