@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbcube/cli",
3
- "version": "1.1.8",
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.7",
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.log(`\n💚 ${chalk.green("Creando base de datos...")}`);
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.log(`\n💚 ${chalk.green("Creemos una base de datos...")}`);
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
- await alwait(1000);
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 ProgressIndicator = require('./../../../lib/ProgressIndicator');
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
- const progress = new ProgressIndicator();
14
- progress.showHeader('Ejecutando seeders...', '🌱');
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
- await progress.showProgress('Verificando archivos de seeders', 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
- });
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
- // 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
- });
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
- let totalSeedersProcessed = 0;
28
+ // Leer todos los archivos en la carpeta
29
+ const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube')
45
30
 
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);
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
- // Obtener nombres reales de los seeders desde los archivos .cube
53
- const realSeeders = progress.extractSeederNamesFromCubes(cubeFiles);
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
- if (realSeeders.length === 0) {
56
- console.log(` ${chalk.yellow('└─')} No se encontraron seeders en los archivos .cube`);
57
- continue;
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
- // Procesar cada seeder con indicador de progreso
61
- console.log(` ${chalk.blue('├─')} Ejecutando ${realSeeders.length} seeders:`);
62
-
63
- for (let i = 0; i < realSeeders.length; i++) {
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
- progress.showError('Error durante la ejecución de seeders', 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
-
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
- // Suprimir logs de dotenv
11
- process.env.DOTENV_SILENT = 'true';
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
- // 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('├─')} 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
- // Suprimir logs de dotenv
11
- process.env.DOTENV_SILENT = 'true';
12
-
13
- const progress = new ProgressIndicator();
14
- progress.showHeader('Ejecutando refresh 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
- });
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 ProgressIndicator = require('./../../../lib/ProgressIndicator');
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
- const progress = new ProgressIndicator();
14
- progress.showHeader('Ejecutando triggers...', '⚡');
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
- await progress.showProgress('Verificando archivos de triggers', 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
- });
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
- // 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
- });
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
- let totalTriggersProcessed = 0;
28
+ // Leer todos los archivos en la carpeta
29
+ const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube')
45
30
 
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);
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
- // Obtener nombres reales de los triggers desde los archivos .cube
53
- const realTriggers = progress.extractTriggerNamesFromCubes(cubeFiles);
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
- if (realTriggers.length === 0) {
56
- console.log(` ${chalk.yellow('└─')} No se encontraron triggers en los archivos .cube`);
57
- continue;
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
- // Procesar cada trigger con indicador de progreso
61
- console.log(` ${chalk.blue('├─')} Ejecutando ${realTriggers.length} triggers:`);
62
-
63
- for (let i = 0; i < realTriggers.length; i++) {
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
- progress.showError('Error durante la ejecución de triggers', 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
-
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
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  const path = require('path');
3
3
 
4
4
  // Obtener los argumentos pasados al comando
@@ -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(` ${chalk.gray('├─')} ${truncatedName} `);
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(` ${chalk.blue('└─')} ${chalk.green('Completado')}`);
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
- // Buscar patrones de nombre de tabla en el archivo .cube
157
- // Patrón 1: @table("nombre_tabla") o @table('nombre_tabla')
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 2: table: "nombre_tabla" o table: 'nombre_tabla'
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
- // Patrón 3: usar el nombre del archivo sin la extensión .cube
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