@dbcube/cli 1.1.8 → 1.1.12
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 +2 -2
- package/src/commands/run/database/create/createDatabase.js +7 -20
- package/src/commands/run/database/create/index.js +22 -32
- package/src/commands/run/seeder/add.js +46 -69
- package/src/commands/run/table/fresh.js +20 -95
- package/src/commands/run/table/refresh.js +21 -90
- package/src/commands/run/trigger/fresh.js +46 -69
- package/src/index.js +1 -1
- package/src/lib/ProgressIndicator.js +45 -31
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dbcube/cli",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.12",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dbcube": "node src/index.js"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"license": "ISC",
|
|
14
14
|
"description": "",
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@dbcube/schema-builder": "^1.0.
|
|
16
|
+
"@dbcube/schema-builder": "^1.0.20",
|
|
17
17
|
"@inquirer/prompts": "^7.8.4",
|
|
18
18
|
"alwait": "^1.0.0",
|
|
19
19
|
"chalk": "^5.6.0",
|
|
@@ -16,21 +16,9 @@ async function createDatabasePhysically(databaseName) {
|
|
|
16
16
|
console.log('Uso: node createDatabase.js --name=<nombre> | -n <nombre>');
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
console.log('\n')
|
|
21
|
-
const spinner = ora(`Creando base de datos '${databaseName}'...`).start();
|
|
22
|
-
|
|
23
|
-
console.log("\n")
|
|
24
|
-
console.log(`Inicializando Schema para: ${databaseName}`)
|
|
25
19
|
const schema = new Schema(databaseName);
|
|
26
|
-
console.log(`Creando base de datos: ${databaseName}`)
|
|
27
20
|
await schema.createDatabase();
|
|
28
|
-
|
|
29
|
-
await alwait(1000);
|
|
30
|
-
spinner.succeed(`Base de datos '${databaseName}' creada correctamente!\n`);
|
|
31
|
-
|
|
32
|
-
console.log(`✅ Base de datos '${databaseName}' creada exitosamente`);
|
|
33
|
-
|
|
21
|
+
|
|
34
22
|
} catch (error) {
|
|
35
23
|
console.log('\n')
|
|
36
24
|
console.error('❌ Error al crear la base de datos:', error.message || error);
|
|
@@ -41,10 +29,10 @@ async function createDatabasePhysically(databaseName) {
|
|
|
41
29
|
// Procesar argumentos de línea de comandos
|
|
42
30
|
function parseArguments(args) {
|
|
43
31
|
const parsedArgs = {};
|
|
44
|
-
|
|
32
|
+
|
|
45
33
|
for (let i = 0; i < args.length; i++) {
|
|
46
34
|
const arg = args[i];
|
|
47
|
-
|
|
35
|
+
|
|
48
36
|
if (arg.startsWith('--name=')) {
|
|
49
37
|
parsedArgs.name = arg.split('=')[1];
|
|
50
38
|
} else if (arg === '--name' || arg === '-n') {
|
|
@@ -57,23 +45,22 @@ function parseArguments(args) {
|
|
|
57
45
|
i++; // Saltar el siguiente argumento
|
|
58
46
|
}
|
|
59
47
|
}
|
|
60
|
-
|
|
48
|
+
|
|
61
49
|
return parsedArgs;
|
|
62
50
|
}
|
|
63
51
|
|
|
64
52
|
// Función principal
|
|
65
53
|
async function main() {
|
|
66
|
-
console.
|
|
67
|
-
|
|
54
|
+
console.clear();
|
|
68
55
|
try {
|
|
69
56
|
const parsedArgs = parseArguments(args);
|
|
70
|
-
|
|
57
|
+
|
|
71
58
|
if (!parsedArgs.name) {
|
|
72
59
|
console.error('❌ Error: Debe proporcionar el nombre de la base de datos');
|
|
73
60
|
console.log('Uso: --name=<nombre> | -n <nombre> | --database=<nombre> | -d <nombre>');
|
|
74
61
|
process.exit(1);
|
|
75
62
|
}
|
|
76
|
-
|
|
63
|
+
|
|
77
64
|
await createDatabasePhysically(parsedArgs.name);
|
|
78
65
|
} catch (error) {
|
|
79
66
|
console.error('Error inesperado:', error);
|
|
@@ -10,17 +10,18 @@ const path = require('path');
|
|
|
10
10
|
* Función para crear una nueva base de datos con configuración (Proceso completo en dos fases)
|
|
11
11
|
*/
|
|
12
12
|
async function createNewDatabase() {
|
|
13
|
+
console.clear();
|
|
13
14
|
try {
|
|
14
15
|
console.log(`\n💚 ${chalk.green("Proceso de creación de base de datos...")}`);
|
|
15
16
|
console.log('📋 Fase 1: Configuración');
|
|
16
17
|
console.log('🏗️ Fase 2: Creación física\n');
|
|
17
|
-
|
|
18
|
+
|
|
18
19
|
// Fase 1: Ejecutar addDatabaseConfig.js
|
|
19
20
|
console.log('🔧 Iniciando configuración de base de datos...');
|
|
20
21
|
const configCommand = `node "${path.join(__dirname, 'addDatabaseConfig.js')}"`;
|
|
21
|
-
|
|
22
|
+
|
|
22
23
|
try {
|
|
23
|
-
execSync(configCommand, {
|
|
24
|
+
execSync(configCommand, {
|
|
24
25
|
stdio: 'inherit',
|
|
25
26
|
cwd: process.cwd()
|
|
26
27
|
});
|
|
@@ -28,12 +29,12 @@ async function createNewDatabase() {
|
|
|
28
29
|
console.error('❌ Error en la fase de configuración:', error.message);
|
|
29
30
|
process.exit(1);
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
+
|
|
32
33
|
// Leer el nombre de la base de datos del archivo temporal
|
|
33
34
|
const fs = require('fs');
|
|
34
35
|
const tempFile = path.join(__dirname, '.temp_db_name');
|
|
35
36
|
let databaseName;
|
|
36
|
-
|
|
37
|
+
|
|
37
38
|
try {
|
|
38
39
|
databaseName = fs.readFileSync(tempFile, 'utf8');
|
|
39
40
|
// Limpiar el archivo temporal
|
|
@@ -42,14 +43,14 @@ async function createNewDatabase() {
|
|
|
42
43
|
console.error('❌ Error: No se pudo obtener el nombre de la base de datos configurada');
|
|
43
44
|
process.exit(1);
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
+
|
|
46
47
|
console.log('\n🏗️ Iniciando creación física de la base de datos...');
|
|
47
|
-
|
|
48
|
+
|
|
48
49
|
// Fase 2: Ejecutar createDatabase.js
|
|
49
50
|
const createCommand = `node "${path.join(__dirname, 'createDatabase.js')}" --name="${databaseName}"`;
|
|
50
|
-
|
|
51
|
+
|
|
51
52
|
try {
|
|
52
|
-
execSync(createCommand, {
|
|
53
|
+
execSync(createCommand, {
|
|
53
54
|
stdio: 'inherit',
|
|
54
55
|
cwd: process.cwd()
|
|
55
56
|
});
|
|
@@ -57,7 +58,7 @@ async function createNewDatabase() {
|
|
|
57
58
|
console.error('❌ Error en la fase de creación:', error.message);
|
|
58
59
|
process.exit(1);
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
+
|
|
61
62
|
console.log(`\n🎉 ${chalk.green("¡Base de datos creada exitosamente!")}`);
|
|
62
63
|
console.log(`✅ Configuración y creación de '${databaseName}' completadas\n`);
|
|
63
64
|
|
|
@@ -72,16 +73,12 @@ async function createNewDatabase() {
|
|
|
72
73
|
* @param {string} databaseName - Nombre de la base de datos a usar
|
|
73
74
|
*/
|
|
74
75
|
async function useExistingDatabase(databaseName) {
|
|
75
|
-
console.log(`\n=== Usando base de datos: ${databaseName} ===\n`);
|
|
76
|
-
|
|
77
|
-
console.log('📋 Usando configuración existente para crear la base de datos...\n');
|
|
78
|
-
|
|
79
76
|
try {
|
|
80
77
|
// Ejecutar createDatabase.js con el nombre de la base de datos existente
|
|
81
78
|
const createCommand = `node "${path.join(__dirname, 'createDatabase.js')}" --name="${databaseName}"`;
|
|
82
|
-
|
|
79
|
+
|
|
83
80
|
try {
|
|
84
|
-
execSync(createCommand, {
|
|
81
|
+
execSync(createCommand, {
|
|
85
82
|
stdio: 'inherit',
|
|
86
83
|
cwd: process.cwd()
|
|
87
84
|
});
|
|
@@ -89,10 +86,7 @@ async function useExistingDatabase(databaseName) {
|
|
|
89
86
|
console.error('❌ Error al crear la base de datos:', error.message);
|
|
90
87
|
process.exit(1);
|
|
91
88
|
}
|
|
92
|
-
|
|
93
|
-
console.log(`\n🎉 ${chalk.green("¡Base de datos lista para usar!")}`);
|
|
94
|
-
console.log(`✅ Base de datos '${databaseName}' creada usando configuración existente\n`);
|
|
95
|
-
|
|
89
|
+
|
|
96
90
|
} catch (error) {
|
|
97
91
|
console.log('❌ Error al crear la base de datos:', error);
|
|
98
92
|
process.exit(1);
|
|
@@ -101,18 +95,16 @@ async function useExistingDatabase(databaseName) {
|
|
|
101
95
|
|
|
102
96
|
async function main() {
|
|
103
97
|
//const dbcubelog = new DBCubeLogger(`❤️ ${chalk.green("Creemos una base de datos...")}\n`);
|
|
104
|
-
console.
|
|
105
|
-
|
|
98
|
+
console.clear();
|
|
99
|
+
console.log(`💚 ${chalk.green("Creemos una base de datos...")}`);
|
|
100
|
+
|
|
106
101
|
try {
|
|
107
102
|
// Obtener las bases de datos configuradas
|
|
108
|
-
const spinner = ora('Cargando bases de datos configuradas...').start();
|
|
109
103
|
const configuredDatabases = await ConfigFileUtils.getConfiguredDatabases();
|
|
110
|
-
|
|
111
|
-
spinner.succeed(`¡Configuracion de bases de datos cargada!\n`);
|
|
112
|
-
|
|
104
|
+
|
|
113
105
|
// Preparar las opciones para el menú
|
|
114
106
|
const choices = [];
|
|
115
|
-
|
|
107
|
+
|
|
116
108
|
// Agregar las bases de datos configuradas
|
|
117
109
|
configuredDatabases.forEach(element => {
|
|
118
110
|
choices.push({
|
|
@@ -122,7 +114,7 @@ async function main() {
|
|
|
122
114
|
});
|
|
123
115
|
});
|
|
124
116
|
let selected = 'create';
|
|
125
|
-
if(choices.length > 0){
|
|
117
|
+
if (choices.length > 0) {
|
|
126
118
|
// Agregar opción para crear nueva base de datos
|
|
127
119
|
choices.push({
|
|
128
120
|
name: 'Crear nueva configuración\n',
|
|
@@ -135,9 +127,7 @@ async function main() {
|
|
|
135
127
|
choices: choices
|
|
136
128
|
});
|
|
137
129
|
}
|
|
138
|
-
|
|
139
|
-
console.clear();
|
|
140
|
-
console.log(`\n💚 ${chalk.green("Creemos una base de datos...")}`);
|
|
130
|
+
|
|
141
131
|
if (selected === 'create') {
|
|
142
132
|
// El usuario quiere crear una nueva base de datos
|
|
143
133
|
await createNewDatabase();
|
|
@@ -149,7 +139,7 @@ async function main() {
|
|
|
149
139
|
console.error('Error inesperado:', error);
|
|
150
140
|
}
|
|
151
141
|
}
|
|
152
|
-
|
|
142
|
+
|
|
153
143
|
// Ejecutar el ejemplo
|
|
154
144
|
main().catch(error => {
|
|
155
145
|
console.error('Error fatal:', error);
|
|
@@ -4,94 +4,71 @@ const fs = require('fs');
|
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const FileUtils = require('./../../../utils/FileUtils');
|
|
6
6
|
const { default: chalk } = require('chalk');
|
|
7
|
-
const
|
|
7
|
+
const { default: ora } = require('ora');
|
|
8
|
+
const { default: alwait } = require('alwait');
|
|
8
9
|
|
|
9
10
|
async function main() {
|
|
10
11
|
// Suprimir logs de dotenv
|
|
11
12
|
process.env.DOTENV_SILENT = 'true';
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
console.clear();
|
|
15
|
+
console.log(`\n🌱 ${chalk.green("Ejecutando seeders...")}`);
|
|
16
16
|
try {
|
|
17
17
|
// Verificar y leer archivos de la carpeta cubes
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (!fs.existsSync(cubesDir)) {
|
|
22
|
-
throw new Error('❌ The cubes folder does not exist');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');
|
|
26
|
-
|
|
27
|
-
if (cubeFiles.length === 0) {
|
|
28
|
-
throw new Error('❌ There are no cubes to execute');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return cubeFiles;
|
|
32
|
-
});
|
|
18
|
+
const spinner = ora('Preparando ejecución de seeders...').start();
|
|
19
|
+
await alwait(500);
|
|
20
|
+
const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');
|
|
33
21
|
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// Obtener archivos .cube reales
|
|
40
|
-
const cubeFiles = await progress.showProgress('Analizando archivos .cube', async () => {
|
|
41
|
-
return FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');
|
|
42
|
-
});
|
|
22
|
+
// Verificar si la carpeta existe
|
|
23
|
+
if (!fs.existsSync(cubesDir)) {
|
|
24
|
+
spinner.fail('Carpeta de cubes no encontrada');
|
|
25
|
+
throw new Error('❌ The cubes folder does not exist');
|
|
26
|
+
}
|
|
43
27
|
|
|
44
|
-
|
|
28
|
+
// Leer todos los archivos en la carpeta
|
|
29
|
+
const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube')
|
|
45
30
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
31
|
+
if (cubeFiles.length === 0) {
|
|
32
|
+
spinner.fail('No hay cubes para ejecutar');
|
|
33
|
+
throw new Error('❌ There are no cubes to execute');
|
|
34
|
+
} else {
|
|
35
|
+
spinner.succeed('Cubes encontrados correctamente');
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
|
|
37
|
+
const loadingSpinner = ora('Cargando configuraciones de base de datos...').start();
|
|
38
|
+
let countTableCreated = 0;
|
|
39
|
+
const configuredDatabases = await ConfigFileUtils.getConfiguredDatabases();
|
|
40
|
+
loadingSpinner.succeed(`Configuraciones cargadas (${configuredDatabases.length} bases de datos)`);
|
|
54
41
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
// Recorrer cada archivo y mostrar su contenido
|
|
43
|
+
for (const config of configuredDatabases) {
|
|
44
|
+
const seederSpinner = ora(`Ejecutando seeders para: ${config.name} (${config.type})...`).start();
|
|
45
|
+
const schema = new Schema(config.name);
|
|
46
|
+
await schema.executeSeeders();
|
|
47
|
+
seederSpinner.succeed(`Seeders ejecutados para: ${config.name}`);
|
|
48
|
+
countTableCreated++;
|
|
58
49
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const seederName = realSeeders[i];
|
|
65
|
-
await progress.showTableProgress(seederName, 'seeder');
|
|
66
|
-
totalSeedersProcessed++;
|
|
50
|
+
|
|
51
|
+
if(countTableCreated==0) {
|
|
52
|
+
console.log(`\n⚠️ ${chalk.yellow('No hay seeders para ejecutar.')}`);
|
|
53
|
+
} else {
|
|
54
|
+
console.log(`\n🎉 ${chalk.green(`Seeders ejecutados exitosamente en ${countTableCreated} base(s) de datos!`)}`);
|
|
67
55
|
}
|
|
68
56
|
|
|
69
|
-
// Ejecutar los seeders reales
|
|
70
|
-
await progress.showProgress('Insertando datos de prueba', async () => {
|
|
71
|
-
await schema.executeSeeders();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Base de datos ${config.name} completada`);
|
|
75
57
|
}
|
|
76
|
-
|
|
77
|
-
// Mostrar resumen
|
|
78
|
-
progress.showSummary('seeder', totalSeedersProcessed, configuredDatabases.length);
|
|
79
|
-
|
|
80
58
|
} catch (error) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.error(` ${chalk.gray('└─')} Verificar archivo: ${chalk.cyan('dbcube.config.js')}`);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
} else if(error.message.includes("reading 'getDatabase'")){
|
|
89
|
-
console.error('💡 Se sugiere cambiar la configuración o crear la base de datos referenciada.');
|
|
90
|
-
}
|
|
91
|
-
|
|
59
|
+
if(error.message.includes("reading 'init'")){
|
|
60
|
+
console.error('❌ Configuracion de base de datos no encontrada\n');
|
|
61
|
+
console.error('Ejecute el comando para crear una nueva base de datos:');
|
|
62
|
+
console.error(`\tdbcube run create:database`);
|
|
63
|
+
console.error('\nO verifique que la base de datos este configurada en el archivo dbcube.config.js\n');
|
|
92
64
|
process.exit(1);
|
|
65
|
+
} else if(error.message.includes("reading 'getDatabase'")){
|
|
66
|
+
console.error('- Se sugiere cambiar el linea o crear la base de datos a la que se hace referencia.');
|
|
67
|
+
}else{
|
|
68
|
+
console.error('Error aqui:', error);
|
|
69
|
+
console.error('Error aqui:', error.message);
|
|
70
|
+
}
|
|
93
71
|
}
|
|
94
|
-
|
|
95
72
|
console.log('\n');
|
|
96
73
|
}
|
|
97
74
|
|
|
@@ -1,104 +1,29 @@
|
|
|
1
1
|
const { default: Schema } = require('@dbcube/schema-builder');
|
|
2
2
|
const ConfigFileUtils = require('./../../../utils/ConfigFileUtils');
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const FileUtils = require('./../../../utils/FileUtils');
|
|
6
|
-
const { default: chalk } = require('chalk');
|
|
7
|
-
const ProgressIndicator = require('./../../../lib/ProgressIndicator');
|
|
8
3
|
|
|
9
4
|
async function main() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const progress = new ProgressIndicator();
|
|
14
|
-
progress.showHeader('Ejecutando fresh tables...', '🗑️');
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
// Verificar y leer archivos de la carpeta cubes
|
|
18
|
-
await progress.showProgress('Verificando archivos de cubes', async () => {
|
|
19
|
-
const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');
|
|
20
|
-
|
|
21
|
-
if (!fs.existsSync(cubesDir)) {
|
|
22
|
-
throw new Error('❌ The cubes folder does not exist');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');
|
|
26
|
-
|
|
27
|
-
if (cubeFiles.length === 0) {
|
|
28
|
-
throw new Error('❌ There are no cubes to execute');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return cubeFiles;
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// Cargar configuraciones de base de datos
|
|
35
|
-
const configuredDatabases = await progress.showProgress('Cargando configuraciones de base de datos', async () => {
|
|
36
|
-
return await ConfigFileUtils.getConfiguredDatabases();
|
|
37
|
-
});
|
|
5
|
+
try {
|
|
6
|
+
const configuredDatabases = await ConfigFileUtils.getConfiguredDatabases();
|
|
38
7
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
console.log(` ${chalk.yellow('└─')} No se encontraron tablas en los archivos .cube`);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Procesar cada tabla con indicador de progreso
|
|
61
|
-
console.log(` ${chalk.blue('├─')} Ejecutando fresh en ${realTables.length} tablas:`);
|
|
62
|
-
|
|
63
|
-
for (let i = 0; i < realTables.length; i++) {
|
|
64
|
-
const tableName = realTables[i];
|
|
65
|
-
await progress.showTableProgress(tableName, 'refresh');
|
|
66
|
-
totalTablesProcessed++;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Ejecutar el fresh real
|
|
70
|
-
await progress.showProgress('Aplicando fresh en la base de datos', async () => {
|
|
71
|
-
const result = await schema.freshTables();
|
|
72
|
-
|
|
73
|
-
if (result === null) {
|
|
74
|
-
throw new Error(`Base de datos ${config.name} no existe o no es accesible`);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return result;
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Base de datos ${config.name} completada`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Mostrar resumen
|
|
84
|
-
progress.showSummary('fresh', totalTablesProcessed, configuredDatabases.length);
|
|
85
|
-
|
|
86
|
-
} catch (error) {
|
|
87
|
-
progress.showError('Error durante el fresh', error);
|
|
88
|
-
|
|
89
|
-
if(error.message.includes("reading 'init'")){
|
|
90
|
-
console.error('\n💡 Soluciones sugeridas:');
|
|
91
|
-
console.error(` ${chalk.gray('├─')} Ejecutar: ${chalk.cyan('dbcube run database:create')}`);
|
|
92
|
-
console.error(` ${chalk.gray('└─')} Verificar archivo: ${chalk.cyan('dbcube.config.js')}`);
|
|
93
|
-
process.exit(1);
|
|
94
|
-
} else if(error.message.includes("reading 'getDatabase'")){
|
|
95
|
-
console.error('💡 Se sugiere cambiar la configuración o crear la base de datos referenciada.');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
process.exit(1);
|
|
8
|
+
// Recorrer cada archivo y mostrar su contenido
|
|
9
|
+
for (const config of configuredDatabases) {
|
|
10
|
+
const schema = new Schema(config.name);
|
|
11
|
+
await schema.freshTables();
|
|
12
|
+
}
|
|
13
|
+
} catch (error) {
|
|
14
|
+
if (error.message.includes("reading 'init'")) {
|
|
15
|
+
console.error('❌ Configuracion de base de datos no encontrada\n');
|
|
16
|
+
console.error('Ejecute el comando para crear una nueva base de datos:');
|
|
17
|
+
console.error(`\tdbcube run create:database`);
|
|
18
|
+
console.error('\nO verifique que la base de datos este configurada en el archivo dbcube.config.js\n');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
} else if (error.message.includes("reading 'getDatabase'")) {
|
|
21
|
+
console.error('- Se sugiere cambiar el linea o crear la base de datos a la que se hace referencia.');
|
|
22
|
+
} else {
|
|
23
|
+
console.error('Error aqui:', error);
|
|
24
|
+
console.error('Error aqui:', error.message);
|
|
99
25
|
}
|
|
100
|
-
|
|
101
|
-
console.log('\n');
|
|
26
|
+
}
|
|
102
27
|
}
|
|
103
28
|
|
|
104
29
|
// Ejecutar el ejemplo
|
|
@@ -1,98 +1,29 @@
|
|
|
1
1
|
const { default: Schema } = require('@dbcube/schema-builder');
|
|
2
2
|
const ConfigFileUtils = require('./../../../utils/ConfigFileUtils');
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
const FileUtils = require('./../../../utils/FileUtils');
|
|
6
|
-
const { default: chalk } = require('chalk');
|
|
7
|
-
const ProgressIndicator = require('./../../../lib/ProgressIndicator');
|
|
8
3
|
|
|
9
4
|
async function main() {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return cubeFiles;
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// Cargar configuraciones de base de datos
|
|
35
|
-
const configuredDatabases = await progress.showProgress('Cargando configuraciones de base de datos', async () => {
|
|
36
|
-
return await ConfigFileUtils.getConfiguredDatabases();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
// Obtener archivos .cube reales
|
|
40
|
-
const cubeFiles = await progress.showProgress('Analizando archivos .cube', async () => {
|
|
41
|
-
return FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
let totalTablesProcessed = 0;
|
|
45
|
-
|
|
46
|
-
// Procesar cada base de datos
|
|
47
|
-
for (const config of configuredDatabases) {
|
|
48
|
-
console.log(`\n${chalk.blue('┌─')} Procesando base de datos: ${chalk.bold(config.name)} ${chalk.gray(`(${config.type})`)}`);
|
|
49
|
-
|
|
50
|
-
const schema = new Schema(config.name);
|
|
51
|
-
|
|
52
|
-
// Obtener nombres reales de las tablas desde los archivos .cube
|
|
53
|
-
const realTables = progress.extractTableNamesFromCubes(cubeFiles);
|
|
54
|
-
|
|
55
|
-
if (realTables.length === 0) {
|
|
56
|
-
console.log(` ${chalk.yellow('└─')} No se encontraron tablas en los archivos .cube`);
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Procesar cada tabla con indicador de progreso
|
|
61
|
-
console.log(` ${chalk.blue('├─')} Refrescando ${realTables.length} tablas:`);
|
|
62
|
-
|
|
63
|
-
for (let i = 0; i < realTables.length; i++) {
|
|
64
|
-
const tableName = realTables[i];
|
|
65
|
-
await progress.showTableProgress(tableName, 'refresh');
|
|
66
|
-
totalTablesProcessed++;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Ejecutar el refresh real
|
|
70
|
-
await progress.showProgress('Aplicando cambios en la base de datos', async () => {
|
|
71
|
-
await schema.refreshTables();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Base de datos ${config.name} completada`);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Mostrar resumen
|
|
78
|
-
progress.showSummary('refresh', totalTablesProcessed, configuredDatabases.length);
|
|
79
|
-
|
|
80
|
-
} catch (error) {
|
|
81
|
-
progress.showError('Error durante el refresh', error);
|
|
82
|
-
|
|
83
|
-
if(error.message.includes("reading 'init'")){
|
|
84
|
-
console.error('\n💡 Soluciones sugeridas:');
|
|
85
|
-
console.error(` ${chalk.gray('├─')} Ejecutar: ${chalk.cyan('dbcube run database:create')}`);
|
|
86
|
-
console.error(` ${chalk.gray('└─')} Verificar archivo: ${chalk.cyan('dbcube.config.js')}`);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
} else if(error.message.includes("reading 'getDatabase'")){
|
|
89
|
-
console.error('💡 Se sugiere cambiar la configuración o crear la base de datos referenciada.');
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
process.exit(1);
|
|
5
|
+
console.clear();
|
|
6
|
+
try {
|
|
7
|
+
const configuredDatabases = await ConfigFileUtils.getConfiguredDatabases();
|
|
8
|
+
// Recorrer cada archivo y mostrar su contenido
|
|
9
|
+
for (const config of configuredDatabases) {
|
|
10
|
+
const schema = new Schema(config.name);
|
|
11
|
+
await schema.refreshTables();
|
|
12
|
+
}
|
|
13
|
+
} catch (error) {
|
|
14
|
+
if (error.message.includes("reading 'init'")) {
|
|
15
|
+
console.error('❌ Configuracion de base de datos no encontrada\n');
|
|
16
|
+
console.error('Ejecute el comando para crear una nueva base de datos:');
|
|
17
|
+
console.error(`\tdbcube run create:database`);
|
|
18
|
+
console.error('\nO verifique que la base de datos este configurada en el archivo dbcube.config.js\n');
|
|
19
|
+
process.exit(1);
|
|
20
|
+
} else if (error.message.includes("reading 'getDatabase'")) {
|
|
21
|
+
console.error('- Se sugiere cambiar el linea o crear la base de datos a la que se hace referencia.');
|
|
22
|
+
} else {
|
|
23
|
+
console.error('Error aqui:', error);
|
|
24
|
+
console.error('Error aqui:', error.message);
|
|
93
25
|
}
|
|
94
|
-
|
|
95
|
-
console.log('\n');
|
|
26
|
+
}
|
|
96
27
|
}
|
|
97
28
|
|
|
98
29
|
// Ejecutar el ejemplo
|
|
@@ -4,94 +4,71 @@ const fs = require('fs');
|
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const FileUtils = require('./../../../utils/FileUtils');
|
|
6
6
|
const { default: chalk } = require('chalk');
|
|
7
|
-
const
|
|
7
|
+
const { default: ora } = require('ora');
|
|
8
|
+
const { default: alwait } = require('alwait');
|
|
8
9
|
|
|
9
10
|
async function main() {
|
|
10
11
|
// Suprimir logs de dotenv
|
|
11
12
|
process.env.DOTENV_SILENT = 'true';
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
console.clear();
|
|
15
|
+
console.log(`\n⚡ ${chalk.green("Ejecutando triggers...")}`);
|
|
16
16
|
try {
|
|
17
17
|
// Verificar y leer archivos de la carpeta cubes
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (!fs.existsSync(cubesDir)) {
|
|
22
|
-
throw new Error('❌ The cubes folder does not exist');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');
|
|
26
|
-
|
|
27
|
-
if (cubeFiles.length === 0) {
|
|
28
|
-
throw new Error('❌ There are no cubes to execute');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return cubeFiles;
|
|
32
|
-
});
|
|
18
|
+
const spinner = ora('Preparando ejecución de triggers...').start();
|
|
19
|
+
await alwait(500);
|
|
20
|
+
const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');
|
|
33
21
|
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// Obtener archivos .cube reales
|
|
40
|
-
const cubeFiles = await progress.showProgress('Analizando archivos .cube', async () => {
|
|
41
|
-
return FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');
|
|
42
|
-
});
|
|
22
|
+
// Verificar si la carpeta existe
|
|
23
|
+
if (!fs.existsSync(cubesDir)) {
|
|
24
|
+
spinner.fail('Carpeta de cubes no encontrada');
|
|
25
|
+
throw new Error('❌ The cubes folder does not exist');
|
|
26
|
+
}
|
|
43
27
|
|
|
44
|
-
|
|
28
|
+
// Leer todos los archivos en la carpeta
|
|
29
|
+
const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube')
|
|
45
30
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
31
|
+
if (cubeFiles.length === 0) {
|
|
32
|
+
spinner.fail('No hay cubes para ejecutar');
|
|
33
|
+
throw new Error('❌ There are no cubes to execute');
|
|
34
|
+
} else {
|
|
35
|
+
spinner.succeed('Cubes encontrados correctamente');
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
|
|
37
|
+
const loadingSpinner = ora('Cargando configuraciones de base de datos...').start();
|
|
38
|
+
let countTableCreated = 0;
|
|
39
|
+
const configuredDatabases = await ConfigFileUtils.getConfiguredDatabases();
|
|
40
|
+
loadingSpinner.succeed(`Configuraciones cargadas (${configuredDatabases.length} bases de datos)`);
|
|
54
41
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
// Recorrer cada archivo y mostrar su contenido
|
|
43
|
+
for (const config of configuredDatabases) {
|
|
44
|
+
const triggerSpinner = ora(`Ejecutando triggers para: ${config.name} (${config.type})...`).start();
|
|
45
|
+
const schema = new Schema(config.name);
|
|
46
|
+
await schema.executeTriggers();
|
|
47
|
+
triggerSpinner.succeed(`Triggers ejecutados para: ${config.name}`);
|
|
48
|
+
countTableCreated++;
|
|
58
49
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const triggerName = realTriggers[i];
|
|
65
|
-
await progress.showTableProgress(triggerName, 'trigger');
|
|
66
|
-
totalTriggersProcessed++;
|
|
50
|
+
|
|
51
|
+
if(countTableCreated==0) {
|
|
52
|
+
console.log(`\n⚠️ ${chalk.yellow('No hay triggers para ejecutar.')}`);
|
|
53
|
+
} else {
|
|
54
|
+
console.log(`\n🎉 ${chalk.green(`Triggers ejecutados exitosamente en ${countTableCreated} base(s) de datos!`)}`);
|
|
67
55
|
}
|
|
68
56
|
|
|
69
|
-
// Ejecutar los triggers reales
|
|
70
|
-
await progress.showProgress('Aplicando triggers en la base de datos', async () => {
|
|
71
|
-
await schema.executeTriggers();
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Base de datos ${config.name} completada`);
|
|
75
57
|
}
|
|
76
|
-
|
|
77
|
-
// Mostrar resumen
|
|
78
|
-
progress.showSummary('trigger', totalTriggersProcessed, configuredDatabases.length);
|
|
79
|
-
|
|
80
58
|
} catch (error) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.error(` ${chalk.gray('└─')} Verificar archivo: ${chalk.cyan('dbcube.config.js')}`);
|
|
87
|
-
process.exit(1);
|
|
88
|
-
} else if(error.message.includes("reading 'getDatabase'")){
|
|
89
|
-
console.error('💡 Se sugiere cambiar la configuración o crear la base de datos referenciada.');
|
|
90
|
-
}
|
|
91
|
-
|
|
59
|
+
if(error.message.includes("reading 'init'")){
|
|
60
|
+
console.error('❌ Configuracion de base de datos no encontrada\n');
|
|
61
|
+
console.error('Ejecute el comando para crear una nueva base de datos:');
|
|
62
|
+
console.error(`\tdbcube run create:database`);
|
|
63
|
+
console.error('\nO verifique que la base de datos este configurada en el archivo dbcube.config.js\n');
|
|
92
64
|
process.exit(1);
|
|
65
|
+
} else if(error.message.includes("reading 'getDatabase'")){
|
|
66
|
+
console.error('- Se sugiere cambiar el linea o crear la base de datos a la que se hace referencia.');
|
|
67
|
+
}else{
|
|
68
|
+
console.error('Error aqui:', error);
|
|
69
|
+
console.error('Error aqui:', error.message);
|
|
70
|
+
}
|
|
93
71
|
}
|
|
94
|
-
|
|
95
72
|
console.log('\n');
|
|
96
73
|
}
|
|
97
74
|
|
package/src/index.js
CHANGED
|
@@ -28,17 +28,17 @@ class ProgressIndicator {
|
|
|
28
28
|
const startTime = Date.now();
|
|
29
29
|
const maxDots = 50;
|
|
30
30
|
const operationText = this.getOperationText(operation);
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
// Formatear el nombre para que tenga un ancho fijo
|
|
33
33
|
const displayName = databaseName ? `${databaseName}.${tableName}` : tableName;
|
|
34
|
-
const truncatedName = displayName.length > 30 ?
|
|
35
|
-
displayName.substring(0, 27) + '...' :
|
|
34
|
+
const truncatedName = displayName.length > 30 ?
|
|
35
|
+
displayName.substring(0, 27) + '...' :
|
|
36
36
|
displayName.padEnd(30);
|
|
37
37
|
|
|
38
38
|
// Simular progreso con puntos
|
|
39
39
|
return new Promise((resolve) => {
|
|
40
|
-
process.stdout.write(
|
|
41
|
-
|
|
40
|
+
process.stdout.write(`${chalk.gray('├─')} ${truncatedName} `);
|
|
41
|
+
|
|
42
42
|
let dotCount = 0;
|
|
43
43
|
const interval = setInterval(() => {
|
|
44
44
|
if (dotCount < maxDots) {
|
|
@@ -64,19 +64,19 @@ class ProgressIndicator {
|
|
|
64
64
|
async showMultipleTablesProgress(tables, operation, databaseName, executor) {
|
|
65
65
|
const operationText = this.getOperationText(operation);
|
|
66
66
|
console.log(` ${chalk.blue('┌─')} ${operationText} en ${chalk.bold(databaseName)}:`);
|
|
67
|
-
|
|
67
|
+
|
|
68
68
|
for (let i = 0; i < tables.length; i++) {
|
|
69
69
|
const table = tables[i];
|
|
70
70
|
const isLast = i === tables.length - 1;
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
await this.showTableProgress(table, operation, '');
|
|
73
|
-
|
|
73
|
+
|
|
74
74
|
if (executor) {
|
|
75
75
|
await executor(table);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
|
|
79
|
-
console.log(
|
|
78
|
+
|
|
79
|
+
console.log(`${chalk.blue('└─')} ${chalk.green('Completado')}`);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/**
|
|
@@ -87,7 +87,7 @@ class ProgressIndicator {
|
|
|
87
87
|
async showProgress(message, executor) {
|
|
88
88
|
const spinner = ora(message).start();
|
|
89
89
|
const startTime = Date.now();
|
|
90
|
-
|
|
90
|
+
|
|
91
91
|
try {
|
|
92
92
|
const result = await executor();
|
|
93
93
|
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
@@ -108,13 +108,20 @@ class ProgressIndicator {
|
|
|
108
108
|
showSummary(operation, count, databases) {
|
|
109
109
|
const totalTime = this.startTime ? ((Date.now() - this.startTime) / 1000).toFixed(1) : '0.0';
|
|
110
110
|
const operationText = this.getOperationText(operation);
|
|
111
|
-
|
|
111
|
+
|
|
112
112
|
console.log(`\n${chalk.green('🎉')} ${chalk.bold('Resumen:')}`);
|
|
113
113
|
console.log(` ${chalk.gray('├─')} ${operationText}: ${chalk.cyan(count)} elementos`);
|
|
114
114
|
console.log(` ${chalk.gray('├─')} Bases de datos: ${chalk.cyan(databases)}`);
|
|
115
115
|
console.log(` ${chalk.gray('└─')} Tiempo total: ${chalk.cyan(totalTime + 's')}`);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Inicia el cronómetro
|
|
120
|
+
*/
|
|
121
|
+
startTimer() {
|
|
122
|
+
this.startTime = Date.now();
|
|
123
|
+
}
|
|
124
|
+
|
|
118
125
|
/**
|
|
119
126
|
* Muestra error con formato
|
|
120
127
|
* @param {string} message - Mensaje de error
|
|
@@ -148,27 +155,33 @@ class ProgressIndicator {
|
|
|
148
155
|
*/
|
|
149
156
|
extractTableNamesFromCubes(cubeFiles) {
|
|
150
157
|
const tableNames = [];
|
|
151
|
-
|
|
158
|
+
|
|
152
159
|
for (const filePath of cubeFiles) {
|
|
153
160
|
try {
|
|
154
161
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
155
|
-
|
|
156
|
-
//
|
|
157
|
-
|
|
162
|
+
|
|
163
|
+
// Patrón principal: @meta({ name: "nombre_tabla"; }) o @meta({ name: 'nombre_tabla'; })
|
|
164
|
+
const metaMatch = content.match(/@meta\s*\(\s*\{\s*name\s*:\s*["']([^"']+)["']\s*;?\s*[^}]*\}\s*\)/);
|
|
165
|
+
if (metaMatch) {
|
|
166
|
+
tableNames.push(metaMatch[1]);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Patrón alternativo: @table("nombre_tabla") o @table('nombre_tabla')
|
|
158
171
|
const tableMatch = content.match(/@table\(\s*["']([^"']+)["']\s*\)/);
|
|
159
172
|
if (tableMatch) {
|
|
160
173
|
tableNames.push(tableMatch[1]);
|
|
161
174
|
continue;
|
|
162
175
|
}
|
|
163
|
-
|
|
164
|
-
// Patrón
|
|
176
|
+
|
|
177
|
+
// Patrón 3: table: "nombre_tabla" o table: 'nombre_tabla'
|
|
165
178
|
const tableMatch2 = content.match(/table\s*:\s*["']([^"']+)["']/);
|
|
166
179
|
if (tableMatch2) {
|
|
167
180
|
tableNames.push(tableMatch2[1]);
|
|
168
181
|
continue;
|
|
169
182
|
}
|
|
170
|
-
|
|
171
|
-
//
|
|
183
|
+
|
|
184
|
+
// Fallback: usar el nombre del archivo sin la extensión .cube
|
|
172
185
|
const fileName = path.basename(filePath, '.table.cube');
|
|
173
186
|
if (fileName && fileName !== 'table') {
|
|
174
187
|
// Si el archivo tiene un número al principio, quitarlo
|
|
@@ -177,7 +190,7 @@ class ProgressIndicator {
|
|
|
177
190
|
tableNames.push(cleanName);
|
|
178
191
|
}
|
|
179
192
|
}
|
|
180
|
-
|
|
193
|
+
|
|
181
194
|
} catch (error) {
|
|
182
195
|
// Si no se puede leer el archivo, usar el nombre del archivo
|
|
183
196
|
const fileName = path.basename(filePath, '.table.cube');
|
|
@@ -187,8 +200,8 @@ class ProgressIndicator {
|
|
|
187
200
|
}
|
|
188
201
|
}
|
|
189
202
|
}
|
|
190
|
-
|
|
191
|
-
return tableNames;
|
|
203
|
+
|
|
204
|
+
return [...new Set(tableNames)]; // Eliminar duplicados
|
|
192
205
|
}
|
|
193
206
|
|
|
194
207
|
/**
|
|
@@ -198,11 +211,11 @@ class ProgressIndicator {
|
|
|
198
211
|
*/
|
|
199
212
|
extractSeederNamesFromCubes(cubeFiles) {
|
|
200
213
|
const seederNames = [];
|
|
201
|
-
|
|
214
|
+
|
|
202
215
|
for (const filePath of cubeFiles) {
|
|
203
216
|
try {
|
|
204
217
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
205
|
-
|
|
218
|
+
|
|
206
219
|
// Buscar secciones de seeders en el archivo
|
|
207
220
|
const seederMatches = content.match(/@seeder\s*\(\s*["']([^"']+)["']\s*\)/g);
|
|
208
221
|
if (seederMatches) {
|
|
@@ -217,7 +230,7 @@ class ProgressIndicator {
|
|
|
217
230
|
seederNames.push(`${tableNames[0]}Seeder`);
|
|
218
231
|
}
|
|
219
232
|
}
|
|
220
|
-
|
|
233
|
+
|
|
221
234
|
} catch (error) {
|
|
222
235
|
// Fallback: usar nombre del archivo
|
|
223
236
|
const fileName = path.basename(filePath, '.table.cube');
|
|
@@ -227,7 +240,7 @@ class ProgressIndicator {
|
|
|
227
240
|
}
|
|
228
241
|
}
|
|
229
242
|
}
|
|
230
|
-
|
|
243
|
+
|
|
231
244
|
return seederNames;
|
|
232
245
|
}
|
|
233
246
|
|
|
@@ -238,11 +251,11 @@ class ProgressIndicator {
|
|
|
238
251
|
*/
|
|
239
252
|
extractTriggerNamesFromCubes(cubeFiles) {
|
|
240
253
|
const triggerNames = [];
|
|
241
|
-
|
|
254
|
+
|
|
242
255
|
for (const filePath of cubeFiles) {
|
|
243
256
|
try {
|
|
244
257
|
const content = fs.readFileSync(filePath, 'utf8');
|
|
245
|
-
|
|
258
|
+
|
|
246
259
|
// Buscar triggers en el archivo
|
|
247
260
|
const triggerMatches = content.match(/@trigger\s*\(\s*["']([^"']+)["']\s*\)/g);
|
|
248
261
|
if (triggerMatches) {
|
|
@@ -258,7 +271,7 @@ class ProgressIndicator {
|
|
|
258
271
|
triggerNames.push(`before_insert_${tableName}`);
|
|
259
272
|
}
|
|
260
273
|
}
|
|
261
|
-
|
|
274
|
+
|
|
262
275
|
} catch (error) {
|
|
263
276
|
// Fallback: usar nombre del archivo
|
|
264
277
|
const fileName = path.basename(filePath, '.table.cube');
|
|
@@ -268,7 +281,7 @@ class ProgressIndicator {
|
|
|
268
281
|
}
|
|
269
282
|
}
|
|
270
283
|
}
|
|
271
|
-
|
|
284
|
+
|
|
272
285
|
return triggerNames;
|
|
273
286
|
}
|
|
274
287
|
|
|
@@ -281,6 +294,7 @@ class ProgressIndicator {
|
|
|
281
294
|
console.clear();
|
|
282
295
|
console.log(`\n${emoji} ${chalk.green.bold(title)}`);
|
|
283
296
|
console.log(chalk.gray('─'.repeat(50)));
|
|
297
|
+
this.startTime = Date.now(); // Iniciar cronómetro aquí
|
|
284
298
|
}
|
|
285
299
|
}
|
|
286
300
|
|