@dbcube/cli 1.1.7 → 1.1.9
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
CHANGED
|
@@ -35,6 +35,11 @@ async function main() {
|
|
|
35
35
|
const configuredDatabases = await progress.showProgress('Cargando configuraciones de base de datos', async () => {
|
|
36
36
|
return await ConfigFileUtils.getConfiguredDatabases();
|
|
37
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
|
+
});
|
|
38
43
|
|
|
39
44
|
let totalSeedersProcessed = 0;
|
|
40
45
|
|
|
@@ -42,29 +47,30 @@ async function main() {
|
|
|
42
47
|
for (const config of configuredDatabases) {
|
|
43
48
|
console.log(`\n${chalk.blue('┌─')} Procesando base de datos: ${chalk.bold(config.name)} ${chalk.gray(`(${config.type})`)}`);
|
|
44
49
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Obtener lista de seeders (simulamos esto por ahora)
|
|
48
|
-
const mockSeeders = await progress.showProgress('Obteniendo lista de seeders', async () => {
|
|
49
|
-
// Aquí podrías obtener la lista real de seeders desde el schema
|
|
50
|
-
return ['UserSeeder', 'ProductSeeder', 'CategorySeeder', 'OrderSeeder']; // Mock data
|
|
51
|
-
});
|
|
50
|
+
// Obtener nombres reales de los seeders desde los archivos .cube
|
|
51
|
+
const realSeeders = progress.extractSeederNamesFromCubes(cubeFiles);
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (let i = 0; i < mockSeeders.length; i++) {
|
|
57
|
-
const seederName = mockSeeders[i];
|
|
58
|
-
await progress.showTableProgress(seederName, 'seeder');
|
|
59
|
-
totalSeedersProcessed++;
|
|
53
|
+
if (realSeeders.length === 0) {
|
|
54
|
+
console.log(` ${chalk.yellow('└─')} No se encontraron seeders en los archivos .cube`);
|
|
55
|
+
continue;
|
|
60
56
|
}
|
|
61
57
|
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
console.log(` ${chalk.blue('├─')} Seeders encontrados: ${chalk.cyan(realSeeders.join(', '))}`);
|
|
59
|
+
console.log(` ${chalk.blue('├─')} Ejecutando seeders...`);
|
|
60
|
+
|
|
61
|
+
// Ejecutar los seeders reales SIN animación para que se vean los mensajes del core
|
|
62
|
+
try {
|
|
63
|
+
const schema = new Schema(config.name);
|
|
64
64
|
await schema.executeSeeders();
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
console.log(` ${chalk.green('├─')} ✅ Seeders completados exitosamente`);
|
|
67
|
+
totalSeedersProcessed += realSeeders.length;
|
|
68
|
+
} catch (schemaError) {
|
|
69
|
+
console.log(` ${chalk.red('├─')} ❌ Error durante seeders: ${schemaError.message}`);
|
|
70
|
+
totalSeedersProcessed = 0;
|
|
71
|
+
}
|
|
66
72
|
|
|
67
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')}
|
|
73
|
+
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Procesamiento de ${config.name} completado`);
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
// Mostrar resumen
|
|
@@ -4,85 +4,98 @@ 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
|
|
8
|
-
const { default: alwait } = require('alwait');
|
|
7
|
+
const ProgressIndicator = require('./../../../lib/ProgressIndicator');
|
|
9
8
|
|
|
10
9
|
async function main() {
|
|
11
10
|
// Suprimir logs de dotenv
|
|
12
11
|
process.env.DOTENV_SILENT = 'true';
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
const progress = new ProgressIndicator();
|
|
14
|
+
progress.showHeader('Ejecutando fresh tables...', '🗑️');
|
|
15
|
+
|
|
16
16
|
try {
|
|
17
17
|
// Verificar y leer archivos de la carpeta cubes
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
+
});
|
|
21
33
|
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
+
});
|
|
27
43
|
|
|
28
|
-
|
|
29
|
-
const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube')
|
|
44
|
+
let totalTablesProcessed = 0;
|
|
30
45
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
+
// Obtener nombres reales de las tablas desde los archivos .cube
|
|
51
|
+
const realTables = progress.extractTableNamesFromCubes(cubeFiles);
|
|
36
52
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
53
|
+
if (realTables.length === 0) {
|
|
54
|
+
console.log(` ${chalk.yellow('└─')} No se encontraron tablas en los archivos .cube`);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.log(` ${chalk.blue('├─')} Tablas encontradas: ${chalk.cyan(realTables.join(', '))}`);
|
|
59
|
+
console.log(` ${chalk.blue('├─')} Ejecutando fresh tables...`);
|
|
41
60
|
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
const freshSpinner = ora(`Ejecutando fresh tables para: ${config.name} (${config.type})...`).start();
|
|
45
|
-
|
|
46
|
-
try {
|
|
61
|
+
// Ejecutar el fresh real SIN animación para que se vean los mensajes del core
|
|
62
|
+
try {
|
|
47
63
|
const schema = new Schema(config.name);
|
|
48
64
|
const result = await schema.freshTables();
|
|
49
65
|
|
|
50
66
|
if (result === null) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
process.exit(1);
|
|
67
|
+
console.log(` ${chalk.red('├─')} ❌ Error: Base de datos ${config.name} no existe o no es accesible`);
|
|
68
|
+
totalTablesProcessed = 0;
|
|
54
69
|
} else {
|
|
55
|
-
|
|
56
|
-
|
|
70
|
+
console.log(` ${chalk.green('├─')} ✅ Fresh completado exitosamente`);
|
|
71
|
+
totalTablesProcessed += realTables.length;
|
|
57
72
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
process.exit(1);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if(countTableCreated==0) {
|
|
66
|
-
console.log(`\n⚠️ ${chalk.yellow('No hay tablas para procesar.')}`);
|
|
67
|
-
} else {
|
|
68
|
-
console.log(`\n🎉 ${chalk.green(`Fresh tables ejecutado exitosamente en ${countTableCreated} base(s) de datos!`)}`);
|
|
73
|
+
} catch (schemaError) {
|
|
74
|
+
console.log(` ${chalk.red('├─')} ❌ Error durante fresh: ${schemaError.message}`);
|
|
75
|
+
totalTablesProcessed = 0;
|
|
69
76
|
}
|
|
70
77
|
|
|
78
|
+
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Procesamiento de ${config.name} completado`);
|
|
71
79
|
}
|
|
80
|
+
|
|
81
|
+
// Mostrar resumen
|
|
82
|
+
progress.showSummary('fresh', totalTablesProcessed, configuredDatabases.length);
|
|
83
|
+
|
|
72
84
|
} catch (error) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
85
|
+
progress.showError('Error durante el fresh', error);
|
|
86
|
+
|
|
87
|
+
if(error.message.includes("reading 'init'")){
|
|
88
|
+
console.error('\n💡 Soluciones sugeridas:');
|
|
89
|
+
console.error(` ${chalk.gray('├─')} Ejecutar: ${chalk.cyan('dbcube run database:create')}`);
|
|
90
|
+
console.error(` ${chalk.gray('└─')} Verificar archivo: ${chalk.cyan('dbcube.config.js')}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
} else if(error.message.includes("reading 'getDatabase'")){
|
|
93
|
+
console.error('💡 Se sugiere cambiar la configuración o crear la base de datos referenciada.');
|
|
94
|
+
}
|
|
95
|
+
|
|
78
96
|
process.exit(1);
|
|
79
|
-
} else if(error.message.includes("reading 'getDatabase'")){
|
|
80
|
-
console.error('- Se sugiere cambiar el linea o crear la base de datos a la que se hace referencia.');
|
|
81
|
-
}else{
|
|
82
|
-
console.error('Error aqui:', error);
|
|
83
|
-
console.error('Error aqui:', error.message);
|
|
84
|
-
}
|
|
85
97
|
}
|
|
98
|
+
|
|
86
99
|
console.log('\n');
|
|
87
100
|
}
|
|
88
101
|
|
|
@@ -35,6 +35,11 @@ async function main() {
|
|
|
35
35
|
const configuredDatabases = await progress.showProgress('Cargando configuraciones de base de datos', async () => {
|
|
36
36
|
return await ConfigFileUtils.getConfiguredDatabases();
|
|
37
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
|
+
});
|
|
38
43
|
|
|
39
44
|
let totalTablesProcessed = 0;
|
|
40
45
|
|
|
@@ -42,29 +47,30 @@ async function main() {
|
|
|
42
47
|
for (const config of configuredDatabases) {
|
|
43
48
|
console.log(`\n${chalk.blue('┌─')} Procesando base de datos: ${chalk.bold(config.name)} ${chalk.gray(`(${config.type})`)}`);
|
|
44
49
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Obtener lista de tablas (simulamos esto por ahora)
|
|
48
|
-
const mockTables = await progress.showProgress('Obteniendo lista de tablas', async () => {
|
|
49
|
-
// Aquí podrías obtener la lista real de tablas desde el schema
|
|
50
|
-
return ['users', 'products', 'orders', 'categories']; // Mock data
|
|
51
|
-
});
|
|
50
|
+
// Obtener nombres reales de las tablas desde los archivos .cube
|
|
51
|
+
const realTables = progress.extractTableNamesFromCubes(cubeFiles);
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (let i = 0; i < mockTables.length; i++) {
|
|
57
|
-
const tableName = mockTables[i];
|
|
58
|
-
await progress.showTableProgress(tableName, 'refresh');
|
|
59
|
-
totalTablesProcessed++;
|
|
53
|
+
if (realTables.length === 0) {
|
|
54
|
+
console.log(` ${chalk.yellow('└─')} No se encontraron tablas en los archivos .cube`);
|
|
55
|
+
continue;
|
|
60
56
|
}
|
|
61
57
|
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
console.log(` ${chalk.blue('├─')} Tablas encontradas: ${chalk.cyan(realTables.join(', '))}`);
|
|
59
|
+
console.log(` ${chalk.blue('├─')} Ejecutando refresh tables...`);
|
|
60
|
+
|
|
61
|
+
// Ejecutar el refresh real SIN animación para que se vean los mensajes del core
|
|
62
|
+
try {
|
|
63
|
+
const schema = new Schema(config.name);
|
|
64
64
|
await schema.refreshTables();
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
console.log(` ${chalk.green('├─')} ✅ Refresh completado exitosamente`);
|
|
67
|
+
totalTablesProcessed += realTables.length;
|
|
68
|
+
} catch (schemaError) {
|
|
69
|
+
console.log(` ${chalk.red('├─')} ❌ Error durante refresh: ${schemaError.message}`);
|
|
70
|
+
totalTablesProcessed = 0;
|
|
71
|
+
}
|
|
66
72
|
|
|
67
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')}
|
|
73
|
+
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Procesamiento de ${config.name} completado`);
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
// Mostrar resumen
|
|
@@ -35,6 +35,11 @@ async function main() {
|
|
|
35
35
|
const configuredDatabases = await progress.showProgress('Cargando configuraciones de base de datos', async () => {
|
|
36
36
|
return await ConfigFileUtils.getConfiguredDatabases();
|
|
37
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
|
+
});
|
|
38
43
|
|
|
39
44
|
let totalTriggersProcessed = 0;
|
|
40
45
|
|
|
@@ -42,29 +47,30 @@ async function main() {
|
|
|
42
47
|
for (const config of configuredDatabases) {
|
|
43
48
|
console.log(`\n${chalk.blue('┌─')} Procesando base de datos: ${chalk.bold(config.name)} ${chalk.gray(`(${config.type})`)}`);
|
|
44
49
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Obtener lista de triggers (simulamos esto por ahora)
|
|
48
|
-
const mockTriggers = await progress.showProgress('Obteniendo lista de triggers', async () => {
|
|
49
|
-
// Aquí podrías obtener la lista real de triggers desde el schema
|
|
50
|
-
return ['before_insert_users', 'after_update_products', 'before_delete_orders']; // Mock data
|
|
51
|
-
});
|
|
50
|
+
// Obtener nombres reales de los triggers desde los archivos .cube
|
|
51
|
+
const realTriggers = progress.extractTriggerNamesFromCubes(cubeFiles);
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (let i = 0; i < mockTriggers.length; i++) {
|
|
57
|
-
const triggerName = mockTriggers[i];
|
|
58
|
-
await progress.showTableProgress(triggerName, 'trigger');
|
|
59
|
-
totalTriggersProcessed++;
|
|
53
|
+
if (realTriggers.length === 0) {
|
|
54
|
+
console.log(` ${chalk.yellow('└─')} No se encontraron triggers en los archivos .cube`);
|
|
55
|
+
continue;
|
|
60
56
|
}
|
|
61
57
|
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
console.log(` ${chalk.blue('├─')} Triggers encontrados: ${chalk.cyan(realTriggers.join(', '))}`);
|
|
59
|
+
console.log(` ${chalk.blue('├─')} Ejecutando triggers...`);
|
|
60
|
+
|
|
61
|
+
// Ejecutar los triggers reales SIN animación para que se vean los mensajes del core
|
|
62
|
+
try {
|
|
63
|
+
const schema = new Schema(config.name);
|
|
64
64
|
await schema.executeTriggers();
|
|
65
|
-
|
|
65
|
+
|
|
66
|
+
console.log(` ${chalk.green('├─')} ✅ Triggers completados exitosamente`);
|
|
67
|
+
totalTriggersProcessed += realTriggers.length;
|
|
68
|
+
} catch (schemaError) {
|
|
69
|
+
console.log(` ${chalk.red('├─')} ❌ Error durante triggers: ${schemaError.message}`);
|
|
70
|
+
totalTriggersProcessed = 0;
|
|
71
|
+
}
|
|
66
72
|
|
|
67
|
-
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')}
|
|
73
|
+
console.log(` ${chalk.blue('└─')} ${chalk.green('✓')} Procesamiento de ${config.name} completado`);
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
// Mostrar resumen
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const { default: chalk } = require('chalk');
|
|
2
2
|
const { default: ora } = require('ora');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
3
5
|
|
|
4
6
|
class ProgressIndicator {
|
|
5
7
|
constructor() {
|
|
@@ -139,6 +141,143 @@ class ProgressIndicator {
|
|
|
139
141
|
return operations[operation] || operation;
|
|
140
142
|
}
|
|
141
143
|
|
|
144
|
+
/**
|
|
145
|
+
* Extrae nombres de tablas reales de archivos .cube
|
|
146
|
+
* @param {string[]} cubeFiles - Array de rutas de archivos .cube
|
|
147
|
+
* @returns {string[]} Array de nombres de tablas
|
|
148
|
+
*/
|
|
149
|
+
extractTableNamesFromCubes(cubeFiles) {
|
|
150
|
+
const tableNames = [];
|
|
151
|
+
|
|
152
|
+
for (const filePath of cubeFiles) {
|
|
153
|
+
try {
|
|
154
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
155
|
+
|
|
156
|
+
// Patrón principal: @meta({ name: "nombre_tabla"; }) o @meta({ name: 'nombre_tabla'; })
|
|
157
|
+
const metaMatch = content.match(/@meta\s*\(\s*\{\s*name\s*:\s*["']([^"']+)["']\s*;?\s*[^}]*\}\s*\)/);
|
|
158
|
+
if (metaMatch) {
|
|
159
|
+
tableNames.push(metaMatch[1]);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Patrón alternativo: @table("nombre_tabla") o @table('nombre_tabla')
|
|
164
|
+
const tableMatch = content.match(/@table\(\s*["']([^"']+)["']\s*\)/);
|
|
165
|
+
if (tableMatch) {
|
|
166
|
+
tableNames.push(tableMatch[1]);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Patrón 3: table: "nombre_tabla" o table: 'nombre_tabla'
|
|
171
|
+
const tableMatch2 = content.match(/table\s*:\s*["']([^"']+)["']/);
|
|
172
|
+
if (tableMatch2) {
|
|
173
|
+
tableNames.push(tableMatch2[1]);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Fallback: usar el nombre del archivo sin la extensión .cube
|
|
178
|
+
const fileName = path.basename(filePath, '.table.cube');
|
|
179
|
+
if (fileName && fileName !== 'table') {
|
|
180
|
+
// Si el archivo tiene un número al principio, quitarlo
|
|
181
|
+
const cleanName = fileName.replace(/^\d+[-_]?/, '');
|
|
182
|
+
if (cleanName) {
|
|
183
|
+
tableNames.push(cleanName);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
} catch (error) {
|
|
188
|
+
// Si no se puede leer el archivo, usar el nombre del archivo
|
|
189
|
+
const fileName = path.basename(filePath, '.table.cube');
|
|
190
|
+
const cleanName = fileName.replace(/^\d+[-_]?/, '');
|
|
191
|
+
if (cleanName && cleanName !== 'table') {
|
|
192
|
+
tableNames.push(cleanName);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return [...new Set(tableNames)]; // Eliminar duplicados
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Extrae nombres de seeders de archivos .cube
|
|
202
|
+
* @param {string[]} cubeFiles - Array de rutas de archivos .cube
|
|
203
|
+
* @returns {string[]} Array de nombres de seeders
|
|
204
|
+
*/
|
|
205
|
+
extractSeederNamesFromCubes(cubeFiles) {
|
|
206
|
+
const seederNames = [];
|
|
207
|
+
|
|
208
|
+
for (const filePath of cubeFiles) {
|
|
209
|
+
try {
|
|
210
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
211
|
+
|
|
212
|
+
// Buscar secciones de seeders en el archivo
|
|
213
|
+
const seederMatches = content.match(/@seeder\s*\(\s*["']([^"']+)["']\s*\)/g);
|
|
214
|
+
if (seederMatches) {
|
|
215
|
+
for (const match of seederMatches) {
|
|
216
|
+
const seederName = match.match(/@seeder\s*\(\s*["']([^"']+)["']\s*\)/)[1];
|
|
217
|
+
seederNames.push(seederName);
|
|
218
|
+
}
|
|
219
|
+
} else {
|
|
220
|
+
// Si no hay seeders específicos, crear uno basado en el nombre de la tabla
|
|
221
|
+
const tableNames = this.extractTableNamesFromCubes([filePath]);
|
|
222
|
+
if (tableNames.length > 0) {
|
|
223
|
+
seederNames.push(`${tableNames[0]}Seeder`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
} catch (error) {
|
|
228
|
+
// Fallback: usar nombre del archivo
|
|
229
|
+
const fileName = path.basename(filePath, '.table.cube');
|
|
230
|
+
const cleanName = fileName.replace(/^\d+[-_]?/, '');
|
|
231
|
+
if (cleanName && cleanName !== 'table') {
|
|
232
|
+
seederNames.push(`${cleanName}Seeder`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return seederNames;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Extrae nombres de triggers de archivos .cube
|
|
242
|
+
* @param {string[]} cubeFiles - Array de rutas de archivos .cube
|
|
243
|
+
* @returns {string[]} Array de nombres de triggers
|
|
244
|
+
*/
|
|
245
|
+
extractTriggerNamesFromCubes(cubeFiles) {
|
|
246
|
+
const triggerNames = [];
|
|
247
|
+
|
|
248
|
+
for (const filePath of cubeFiles) {
|
|
249
|
+
try {
|
|
250
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
251
|
+
|
|
252
|
+
// Buscar triggers en el archivo
|
|
253
|
+
const triggerMatches = content.match(/@trigger\s*\(\s*["']([^"']+)["']\s*\)/g);
|
|
254
|
+
if (triggerMatches) {
|
|
255
|
+
for (const match of triggerMatches) {
|
|
256
|
+
const triggerName = match.match(/@trigger\s*\(\s*["']([^"']+)["']\s*\)/)[1];
|
|
257
|
+
triggerNames.push(triggerName);
|
|
258
|
+
}
|
|
259
|
+
} else {
|
|
260
|
+
// Si no hay triggers específicos, crear algunos basados en la tabla
|
|
261
|
+
const tableNames = this.extractTableNamesFromCubes([filePath]);
|
|
262
|
+
if (tableNames.length > 0) {
|
|
263
|
+
const tableName = tableNames[0];
|
|
264
|
+
triggerNames.push(`before_insert_${tableName}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
} catch (error) {
|
|
269
|
+
// Fallback: usar nombre del archivo
|
|
270
|
+
const fileName = path.basename(filePath, '.table.cube');
|
|
271
|
+
const cleanName = fileName.replace(/^\d+[-_]?/, '');
|
|
272
|
+
if (cleanName && cleanName !== 'table') {
|
|
273
|
+
triggerNames.push(`before_insert_${cleanName}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return triggerNames;
|
|
279
|
+
}
|
|
280
|
+
|
|
142
281
|
/**
|
|
143
282
|
* Limpia la pantalla y muestra encabezado
|
|
144
283
|
* @param {string} title - Título principal
|