@dbcube/schema-builder 1.0.12 → 1.0.14
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/dist/index.cjs +79 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +87 -12
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -101,6 +101,35 @@ var FileUtils = class {
|
|
|
101
101
|
});
|
|
102
102
|
return cubeFiles;
|
|
103
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* Extracts database name from cube files
|
|
106
|
+
* @param filePath - Path to the .cube file
|
|
107
|
+
* @returns Object containing status and database name
|
|
108
|
+
*/
|
|
109
|
+
static extractDatabaseNameFromCube(filePath) {
|
|
110
|
+
try {
|
|
111
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
112
|
+
const databaseMatch = content.match(/@database\s*\(\s*["']([^"']+)["']\s*\)\s*;?/);
|
|
113
|
+
if (databaseMatch) {
|
|
114
|
+
return {
|
|
115
|
+
status: 200,
|
|
116
|
+
message: databaseMatch[1]
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
throw new Error(`No @database directive found in file ${filePath}`);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (error instanceof Error) {
|
|
122
|
+
return {
|
|
123
|
+
status: 500,
|
|
124
|
+
message: error.message
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
status: 500,
|
|
129
|
+
message: String(error)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
104
133
|
/**
|
|
105
134
|
* Extrae nombres de tablas reales de archivos .cube
|
|
106
135
|
* @param {string} filePath - String ruta del archivo .cube
|
|
@@ -210,13 +239,6 @@ ${import_chalk.default.cyan("\u{1F4CA}")} ${import_chalk.default.bold.green(`SUM
|
|
|
210
239
|
}
|
|
211
240
|
console.log(`${import_chalk.default.blue("\u251C\u2500")} ${import_chalk.default.gray(`Total time: ${totalTime}s`)}`);
|
|
212
241
|
console.log(`${import_chalk.default.blue("\u2514\u2500")} ${import_chalk.default.bold(totalProcessed > 0 ? import_chalk.default.green("\u2705 Completed") : import_chalk.default.yellow("\u26A0\uFE0F No changes"))}`);
|
|
213
|
-
if (totalProcessed > 0) {
|
|
214
|
-
console.log(`
|
|
215
|
-
${import_chalk.default.green("\u{1F389}")} ${import_chalk.default.bold(`${operationName} executed successfully!`)}`);
|
|
216
|
-
} else {
|
|
217
|
-
console.log(`
|
|
218
|
-
${import_chalk.default.yellow("\u26A0\uFE0F ")} ${import_chalk.default.bold("No items were processed.")}`);
|
|
219
|
-
}
|
|
220
242
|
}
|
|
221
243
|
};
|
|
222
244
|
|
|
@@ -228,6 +250,52 @@ var Schema = class {
|
|
|
228
250
|
this.name = name;
|
|
229
251
|
this.engine = new import_core.Engine(name);
|
|
230
252
|
}
|
|
253
|
+
/**
|
|
254
|
+
* Validates that the database specified in cube file exists in configuration
|
|
255
|
+
* @param filePath - Path to the cube file
|
|
256
|
+
* @returns true if valid, throws error if invalid
|
|
257
|
+
*/
|
|
258
|
+
validateDatabaseConfiguration(filePath) {
|
|
259
|
+
try {
|
|
260
|
+
const dbResult = FileUtils_default.extractDatabaseNameFromCube(filePath);
|
|
261
|
+
if (dbResult.status !== 200) {
|
|
262
|
+
throw new Error(`Error reading database directive from ${filePath}: ${dbResult.message}`);
|
|
263
|
+
}
|
|
264
|
+
const cubeDbName = dbResult.message;
|
|
265
|
+
const configInstance = new import_core.Config();
|
|
266
|
+
const configFilePath = import_path.default.resolve(process.cwd(), "dbcube.config.js");
|
|
267
|
+
const configFn = require(configFilePath);
|
|
268
|
+
if (typeof configFn === "function") {
|
|
269
|
+
configFn(configInstance);
|
|
270
|
+
} else {
|
|
271
|
+
throw new Error("\u274C The dbcube.config.js file does not export a function.");
|
|
272
|
+
}
|
|
273
|
+
const dbConfig = configInstance.getDatabase(cubeDbName);
|
|
274
|
+
if (!dbConfig) {
|
|
275
|
+
let availableDbs = [];
|
|
276
|
+
try {
|
|
277
|
+
const testNames = ["test", "development", "production", "local", "main"];
|
|
278
|
+
for (const testName of testNames) {
|
|
279
|
+
try {
|
|
280
|
+
const testConfig = configInstance.getDatabase(testName);
|
|
281
|
+
if (testConfig) {
|
|
282
|
+
availableDbs.push(testName);
|
|
283
|
+
}
|
|
284
|
+
} catch (e) {
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
} catch (e) {
|
|
288
|
+
}
|
|
289
|
+
const availableText = availableDbs.length > 0 ? availableDbs.join(", ") : "none found";
|
|
290
|
+
throw new Error(`\u274C Database configuration '${cubeDbName}' from cube file '${import_path.default.basename(filePath)}' not found in dbcube.config.js.
|
|
291
|
+
|
|
292
|
+
Available databases: ${availableText}`);
|
|
293
|
+
}
|
|
294
|
+
return true;
|
|
295
|
+
} catch (error) {
|
|
296
|
+
throw new Error(`Database configuration validation failed: ${error.message}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
231
299
|
async createDatabase() {
|
|
232
300
|
const startTime = Date.now();
|
|
233
301
|
const rootPath = import_path.default.resolve(process.cwd());
|
|
@@ -294,6 +362,7 @@ var Schema = class {
|
|
|
294
362
|
const tableName = getTableName.status === 200 ? getTableName.message : import_path.default.basename(file, ".table.cube");
|
|
295
363
|
await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);
|
|
296
364
|
try {
|
|
365
|
+
this.validateDatabaseConfiguration(filePath);
|
|
297
366
|
const dml = await this.engine.run("schema_engine", [
|
|
298
367
|
"--action",
|
|
299
368
|
"parse_table",
|
|
@@ -381,6 +450,7 @@ var Schema = class {
|
|
|
381
450
|
const tableName = getTableName.status === 200 ? getTableName.message : import_path.default.basename(file, ".table.cube");
|
|
382
451
|
await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);
|
|
383
452
|
try {
|
|
453
|
+
this.validateDatabaseConfiguration(filePath);
|
|
384
454
|
const dml = await this.engine.run("schema_engine", [
|
|
385
455
|
"--action",
|
|
386
456
|
"parse_table",
|
|
@@ -406,10 +476,6 @@ var Schema = class {
|
|
|
406
476
|
}
|
|
407
477
|
delete queries.data._type;
|
|
408
478
|
const createQuery = queries.data.regular_queries.filter((q) => q.includes("CREATE"))[0];
|
|
409
|
-
if (queries.data.regular_queries.length > 0) {
|
|
410
|
-
const nowQueries = await import_core.TableProcessor.generateAlterQueries(queries.data.regular_queries[0], dml.data.motor, dml.data.table, dml.data.database);
|
|
411
|
-
queries.data.regular_queries = nowQueries;
|
|
412
|
-
}
|
|
413
479
|
const parseJsonQueries = JSON.stringify(queries.data);
|
|
414
480
|
const response = await this.engine.run("schema_engine", [
|
|
415
481
|
"--action",
|
|
@@ -470,6 +536,7 @@ var Schema = class {
|
|
|
470
536
|
const seederName = getSeederName.status === 200 ? getSeederName.message : import_path.default.basename(file, ".seeder.cube");
|
|
471
537
|
await UIUtils.showItemProgress(seederName, index + 1, cubeFiles.length);
|
|
472
538
|
try {
|
|
539
|
+
this.validateDatabaseConfiguration(filePath);
|
|
473
540
|
const response = await this.engine.run("schema_engine", [
|
|
474
541
|
"--action",
|
|
475
542
|
"seeder",
|
|
@@ -527,6 +594,7 @@ var Schema = class {
|
|
|
527
594
|
const triggerName = getTriggerName.status === 200 ? getTriggerName.message : import_path.default.basename(file, ".trigger.cube");
|
|
528
595
|
await UIUtils.showItemProgress(triggerName, index + 1, cubeFiles.length);
|
|
529
596
|
try {
|
|
597
|
+
this.validateDatabaseConfiguration(filePath);
|
|
530
598
|
const response = await this.engine.run("schema_engine", [
|
|
531
599
|
"--action",
|
|
532
600
|
"trigger",
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/Schema.ts","../src/lib/FileUtils.ts","../src/lib/UIUtils.ts"],"sourcesContent":["import { Schema } from './lib/Schema';\r\n\r\nexport default Schema;\r\nexport { Schema };","import fs from 'fs';\r\nimport { Engine, TableProcessor } from \"@dbcube/core\";\r\nimport path from 'path';\r\nimport FileUtils from './FileUtils';\r\nimport chalk from 'chalk';\r\nimport { UIUtils, ProcessSummary } from './UIUtils';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nclass Schema {\r\n private name: string;\r\n private engine: any;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n this.engine = new Engine(name);\r\n }\r\n\r\n async createDatabase(): Promise<any> {\r\n const startTime = Date.now();\r\n const rootPath = path.resolve(process.cwd());\r\n\r\n // Show header\r\n UIUtils.showOperationHeader(' CREATING DATABASE', this.name, '🗄️');\r\n\r\n // Show progress for database creation\r\n await UIUtils.showItemProgress('Preparando e instalando base de datos', 1, 1);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'create_database',\r\n '--path', rootPath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n UIUtils.showItemSuccess('Database');\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 1,\r\n successCount: 1,\r\n errorCount: 0,\r\n processedItems: [this.name],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return response.data;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError('Database', error.message);\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 0,\r\n successCount: 0,\r\n errorCount: 1,\r\n processedItems: [],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n throw error;\r\n }\r\n }\r\n\r\n async refreshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING REFRESH TABLES', this.name, '🔄');\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--mode', 'refresh',\r\n '--schema-path', filePath,\r\n ]);\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--mode', 'refresh',\r\n '--dml', parseJson,\r\n ]);\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n delete queries.data.database_type;\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'refresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'refresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async freshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING FRESH TABLES', this.name);\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--schema-path', filePath,\r\n '--mode', 'fresh',\r\n ]);\r\n\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--dml', parseJson,\r\n ]);\r\n\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n\r\n delete queries.data._type;\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n if (queries.data.regular_queries.length > 0) {\r\n const nowQueries = await TableProcessor.generateAlterQueries(queries.data.regular_queries[0], dml.data.motor, dml.data.table, dml.data.database);\r\n queries.data.regular_queries = nowQueries;\r\n }\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'fresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'fresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n\r\n async executeSeeders(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'seeder.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING SEEDERS', this.name, '🌱');\r\n\r\n let totalSeedersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedSeeders: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getSeederName = FileUtils.extracTableNameFromCube(filePath);\r\n const seederName = getSeederName.status === 200 ? getSeederName.message : path.basename(file, '.seeder.cube');\r\n\r\n // Show visual progress for each seeder\r\n await UIUtils.showItemProgress(seederName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'seeder',\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(seederName);\r\n successCount++;\r\n processedSeeders.push(seederName);\r\n totalSeedersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(seederName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalSeedersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedSeeders,\r\n operationName: 'seeders',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalSeedersProcessed > 0 ? { processed: totalSeedersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async executeTriggers(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n const triggersDirExit = path.join(process.cwd(), 'dbcube', 'triggers');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'trigger.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING TRIGGERS', this.name, '⚡');\r\n\r\n let totalTriggersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTriggers: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTriggerName = FileUtils.extracTableNameFromCube(filePath);\r\n const triggerName = getTriggerName.status === 200 ? getTriggerName.message : path.basename(file, '.trigger.cube');\r\n\r\n // Show visual progress for each trigger\r\n await UIUtils.showItemProgress(triggerName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'trigger',\r\n '--path-exit', triggersDirExit,\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(triggerName);\r\n successCount++;\r\n processedTriggers.push(triggerName);\r\n totalTriggersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(triggerName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTriggersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTriggers,\r\n operationName: 'triggers',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTriggersProcessed > 0 ? { processed: totalTriggersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n}\r\n\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n process.exit(1);\r\n}\r\n\r\nexport default Schema;\r\nexport { Schema };\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nclass FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith(suffix)) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a, b) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n\r\n /**\r\n * Extrae nombres de tablas reales de archivos .cube\r\n * @param {string} filePath - String ruta del archivo .cube\r\n * @returns {object} - Objeto que contiene el estado y el mensaje con el nombre de la tabla\r\n */\r\n static extracTableNameFromCube(filePath: string) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n\r\n // Patrón principal: @meta({ name: \"nombre_tabla\"; }) o @meta({ name: 'nombre_tabla'; })\r\n const metaMatch = content.match(/@meta\\s*\\(\\s*\\{\\s*name\\s*:\\s*[\"']([^\"']+)[\"']\\s*;\\s*[^}]*\\}\\s*\\)/s);\r\n if (metaMatch) {\r\n return {\r\n status: 200,\r\n message: metaMatch[1]\r\n };\r\n }\r\n\r\n throw new Error(`Error to execute this file ${filePath} because no exist a name of table.`);\r\n\r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n return {\r\n status: 500,\r\n message: error.message\r\n };\r\n }\r\n return {\r\n status: 500,\r\n message: String(error)\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default FileUtils;","import chalk from 'chalk';\r\n\r\nexport interface ProcessSummary {\r\n startTime: number;\r\n totalProcessed: number;\r\n successCount: number;\r\n errorCount: number;\r\n processedItems: string[];\r\n operationName: string;\r\n databaseName: string;\r\n}\r\n\r\nexport class UIUtils {\r\n /**\r\n * Shows animated progress for processing items\r\n */\r\n static async showItemProgress(\r\n itemName: string,\r\n current: number,\r\n total: number\r\n ): Promise<void> {\r\n // Get console width, default to 80 if not available\r\n const consoleWidth = process.stdout.columns || 80;\r\n\r\n // Calculate available space for dots\r\n // Format: \"├─ itemName \" + dots + \" ✓ OK\"\r\n const prefix = `├─ ${itemName} `;\r\n const suffix = ` ✓ OK`;\r\n const availableSpace = consoleWidth - prefix.length - suffix.length;\r\n const maxDots = Math.max(10, availableSpace); // Minimum 10 dots\r\n\r\n return new Promise((resolve) => {\r\n process.stdout.write(`${chalk.blue('├─')} ${chalk.cyan(itemName)} `);\r\n\r\n let dotCount = 0;\r\n const interval = setInterval(() => {\r\n if (dotCount < maxDots) {\r\n process.stdout.write(chalk.gray('.'));\r\n dotCount++;\r\n } else {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // Faster animation\r\n });\r\n }\r\n\r\n /**\r\n * Shows success for a processed item\r\n */\r\n static showItemSuccess(itemName: string): void {\r\n process.stdout.write(` ${chalk.green('✓')} ${chalk.gray('OK')}\\n`);\r\n }\r\n\r\n /**\r\n * Shows error for an item\r\n */\r\n static showItemError(itemName: string, error: string): void {\r\n process.stdout.write(` ${chalk.red('✗')} ${chalk.red('ERROR')}\\n`);\r\n console.log(`${chalk.red('│ ')} ${chalk.gray('└─')} ${chalk.red(error)}`);\r\n }\r\n\r\n /**\r\n * Shows operation header\r\n */\r\n static showOperationHeader(operationName: string, databaseName: string, icon: string = '🗑️'): void {\r\n console.log(`\\n${chalk.cyan(icon)} ${chalk.bold.green(operationName.toUpperCase())}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n console.log(`${chalk.blue('┌─')} ${chalk.bold(`Database: ${databaseName}`)}`);\r\n }\r\n\r\n /**\r\n * Shows comprehensive operation summary\r\n */\r\n static showOperationSummary(summary: ProcessSummary): void {\r\n const { startTime, totalProcessed, successCount, errorCount, processedItems, operationName, databaseName } = summary;\r\n const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);\r\n\r\n console.log(`\\n${chalk.cyan('📊')} ${chalk.bold.green(`SUMMARY OF ${operationName.toUpperCase()}`)}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n\r\n if (successCount > 0) {\r\n console.log(`${chalk.green('┌─')} ${chalk.bold('Successful processing:')}`);\r\n console.log(`${chalk.green('├─')} ${chalk.cyan(`Items processed: ${successCount}`)}`);\r\n console.log(`${chalk.green('├─')} ${chalk.gray(`Database: ${databaseName}`)}`);\r\n\r\n if (processedItems.length > 0) {\r\n console.log(`${chalk.green('├─')} ${chalk.yellow('Items updated:')}`);\r\n processedItems.forEach((item, index) => {\r\n const isLast = index === processedItems.length - 1;\r\n const connector = isLast ? '└─' : '├─';\r\n console.log(`${chalk.green('│ ')} ${chalk.gray(connector)} ${chalk.cyan(item)}`);\r\n });\r\n }\r\n }\r\n\r\n if (errorCount > 0) {\r\n console.log(`${chalk.red('├─')} ${chalk.bold.red(`Errors: ${errorCount}`)}`);\r\n }\r\n\r\n console.log(`${chalk.blue('├─')} ${chalk.gray(`Total time: ${totalTime}s`)}`);\r\n console.log(`${chalk.blue('└─')} ${chalk.bold(totalProcessed > 0 ? chalk.green('✅ Completed') : chalk.yellow('⚠️ No changes'))}`);\r\n\r\n if (totalProcessed > 0) {\r\n console.log(`\\n${chalk.green('🎉')} ${chalk.bold(`${operationName} executed successfully!`)}`);\r\n } else {\r\n console.log(`\\n${chalk.yellow('⚠️ ')} ${chalk.bold('No items were processed.')}`);\r\n }\r\n }\r\n}"],"mappings":"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","names":["resolve","resolve","chalk","path","fs","err"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/Schema.ts","../src/lib/FileUtils.ts","../src/lib/UIUtils.ts"],"sourcesContent":["import { Schema } from './lib/Schema';\r\n\r\nexport default Schema;\r\nexport { Schema };","import fs from 'fs';\r\nimport { Engine, TableProcessor, Config as ConfigClass } from \"@dbcube/core\";\r\nimport path from 'path';\r\nimport FileUtils from './FileUtils';\r\nimport chalk from 'chalk';\r\nimport { UIUtils, ProcessSummary } from './UIUtils';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nclass Schema {\r\n private name: string;\r\n private engine: any;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n this.engine = new Engine(name);\r\n }\r\n\r\n /**\r\n * Validates that the database specified in cube file exists in configuration\r\n * @param filePath - Path to the cube file\r\n * @returns true if valid, throws error if invalid\r\n */\r\n private validateDatabaseConfiguration(filePath: string): boolean {\r\n try {\r\n // Extract database name from cube file\r\n const dbResult = FileUtils.extractDatabaseNameFromCube(filePath);\r\n if (dbResult.status !== 200) {\r\n throw new Error(`Error reading database directive from ${filePath}: ${dbResult.message}`);\r\n }\r\n\r\n const cubeDbName = dbResult.message;\r\n \r\n // Get available configurations\r\n const configInstance = new ConfigClass();\r\n const configFilePath = path.resolve(process.cwd(), 'dbcube.config.js');\r\n const configFn = require(configFilePath);\r\n \r\n if (typeof configFn === 'function') {\r\n configFn(configInstance);\r\n } else {\r\n throw new Error('❌ The dbcube.config.js file does not export a function.');\r\n }\r\n \r\n // Check if the database configuration exists\r\n const dbConfig = configInstance.getDatabase(cubeDbName);\r\n if (!dbConfig) {\r\n // Try to get available databases by attempting to access common ones\r\n let availableDbs: string[] = [];\r\n try {\r\n // Try some common database names to see what exists\r\n const testNames = ['test', 'development', 'production', 'local', 'main'];\r\n for (const testName of testNames) {\r\n try {\r\n const testConfig = configInstance.getDatabase(testName);\r\n if (testConfig) {\r\n availableDbs.push(testName);\r\n }\r\n } catch (e) {\r\n // Skip non-existent configs\r\n }\r\n }\r\n } catch (e) {\r\n // Fallback if we can't determine available databases\r\n }\r\n \r\n const availableText = availableDbs.length > 0 ? availableDbs.join(', ') : 'none found';\r\n throw new Error(`❌ Database configuration '${cubeDbName}' from cube file '${path.basename(filePath)}' not found in dbcube.config.js.\\n\\nAvailable databases: ${availableText}`);\r\n }\r\n \r\n return true;\r\n \r\n } catch (error: any) {\r\n throw new Error(`Database configuration validation failed: ${error.message}`);\r\n }\r\n }\r\n\r\n async createDatabase(): Promise<any> {\r\n const startTime = Date.now();\r\n const rootPath = path.resolve(process.cwd());\r\n\r\n // Show header\r\n UIUtils.showOperationHeader(' CREATING DATABASE', this.name, '🗄️');\r\n\r\n // Show progress for database creation\r\n await UIUtils.showItemProgress('Preparando e instalando base de datos', 1, 1);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'create_database',\r\n '--path', rootPath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n UIUtils.showItemSuccess('Database');\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 1,\r\n successCount: 1,\r\n errorCount: 0,\r\n processedItems: [this.name],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return response.data;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError('Database', error.message);\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 0,\r\n successCount: 0,\r\n errorCount: 1,\r\n processedItems: [],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n throw error;\r\n }\r\n }\r\n\r\n async refreshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING REFRESH TABLES', this.name, '🔄');\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--mode', 'refresh',\r\n '--schema-path', filePath,\r\n ]);\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--mode', 'refresh',\r\n '--dml', parseJson,\r\n ]);\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n delete queries.data.database_type;\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'refresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'refresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async freshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING FRESH TABLES', this.name);\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--schema-path', filePath,\r\n '--mode', 'fresh',\r\n ]);\r\n\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--dml', parseJson,\r\n ]);\r\n\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n\r\n delete queries.data._type;\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n // For fresh mode, use the generated queries directly without alterations\r\n // generateAlterQueries is used for refresh mode, not fresh mode\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'fresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'fresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n\r\n async executeSeeders(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'seeder.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING SEEDERS', this.name, '🌱');\r\n\r\n let totalSeedersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedSeeders: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getSeederName = FileUtils.extracTableNameFromCube(filePath);\r\n const seederName = getSeederName.status === 200 ? getSeederName.message : path.basename(file, '.seeder.cube');\r\n\r\n // Show visual progress for each seeder\r\n await UIUtils.showItemProgress(seederName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'seeder',\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(seederName);\r\n successCount++;\r\n processedSeeders.push(seederName);\r\n totalSeedersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(seederName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalSeedersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedSeeders,\r\n operationName: 'seeders',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalSeedersProcessed > 0 ? { processed: totalSeedersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async executeTriggers(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n const triggersDirExit = path.join(process.cwd(), 'dbcube', 'triggers');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'trigger.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING TRIGGERS', this.name, '⚡');\r\n\r\n let totalTriggersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTriggers: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTriggerName = FileUtils.extracTableNameFromCube(filePath);\r\n const triggerName = getTriggerName.status === 200 ? getTriggerName.message : path.basename(file, '.trigger.cube');\r\n\r\n // Show visual progress for each trigger\r\n await UIUtils.showItemProgress(triggerName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'trigger',\r\n '--path-exit', triggersDirExit,\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(triggerName);\r\n successCount++;\r\n processedTriggers.push(triggerName);\r\n totalTriggersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(triggerName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTriggersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTriggers,\r\n operationName: 'triggers',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTriggersProcessed > 0 ? { processed: totalTriggersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n}\r\n\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n process.exit(1);\r\n}\r\n\r\nexport default Schema;\r\nexport { Schema };\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nclass FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith(suffix)) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a, b) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n\r\n /**\r\n * Extracts database name from cube files\r\n * @param filePath - Path to the .cube file\r\n * @returns Object containing status and database name\r\n */\r\n static extractDatabaseNameFromCube(filePath: string) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n \r\n // Pattern: @database(\"database_name\") or @database('database_name')\r\n const databaseMatch = content.match(/@database\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)\\s*;?/);\r\n if (databaseMatch) {\r\n return {\r\n status: 200,\r\n message: databaseMatch[1]\r\n };\r\n }\r\n \r\n throw new Error(`No @database directive found in file ${filePath}`);\r\n \r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n return {\r\n status: 500,\r\n message: error.message\r\n };\r\n }\r\n return {\r\n status: 500,\r\n message: String(error)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Extrae nombres de tablas reales de archivos .cube\r\n * @param {string} filePath - String ruta del archivo .cube\r\n * @returns {object} - Objeto que contiene el estado y el mensaje con el nombre de la tabla\r\n */\r\n static extracTableNameFromCube(filePath: string) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n\r\n // Patrón principal: @meta({ name: \"nombre_tabla\"; }) o @meta({ name: 'nombre_tabla'; })\r\n const metaMatch = content.match(/@meta\\s*\\(\\s*\\{\\s*name\\s*:\\s*[\"']([^\"']+)[\"']\\s*;\\s*[^}]*\\}\\s*\\)/s);\r\n if (metaMatch) {\r\n return {\r\n status: 200,\r\n message: metaMatch[1]\r\n };\r\n }\r\n\r\n throw new Error(`Error to execute this file ${filePath} because no exist a name of table.`);\r\n\r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n return {\r\n status: 500,\r\n message: error.message\r\n };\r\n }\r\n return {\r\n status: 500,\r\n message: String(error)\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default FileUtils;","import chalk from 'chalk';\r\n\r\nexport interface ProcessSummary {\r\n startTime: number;\r\n totalProcessed: number;\r\n successCount: number;\r\n errorCount: number;\r\n processedItems: string[];\r\n operationName: string;\r\n databaseName: string;\r\n}\r\n\r\nexport class UIUtils {\r\n /**\r\n * Shows animated progress for processing items\r\n */\r\n static async showItemProgress(\r\n itemName: string,\r\n current: number,\r\n total: number\r\n ): Promise<void> {\r\n // Get console width, default to 80 if not available\r\n const consoleWidth = process.stdout.columns || 80;\r\n\r\n // Calculate available space for dots\r\n // Format: \"├─ itemName \" + dots + \" ✓ OK\"\r\n const prefix = `├─ ${itemName} `;\r\n const suffix = ` ✓ OK`;\r\n const availableSpace = consoleWidth - prefix.length - suffix.length;\r\n const maxDots = Math.max(10, availableSpace); // Minimum 10 dots\r\n\r\n return new Promise((resolve) => {\r\n process.stdout.write(`${chalk.blue('├─')} ${chalk.cyan(itemName)} `);\r\n\r\n let dotCount = 0;\r\n const interval = setInterval(() => {\r\n if (dotCount < maxDots) {\r\n process.stdout.write(chalk.gray('.'));\r\n dotCount++;\r\n } else {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // Faster animation\r\n });\r\n }\r\n\r\n /**\r\n * Shows success for a processed item\r\n */\r\n static showItemSuccess(itemName: string): void {\r\n process.stdout.write(` ${chalk.green('✓')} ${chalk.gray('OK')}\\n`);\r\n }\r\n\r\n /**\r\n * Shows error for an item\r\n */\r\n static showItemError(itemName: string, error: string): void {\r\n process.stdout.write(` ${chalk.red('✗')} ${chalk.red('ERROR')}\\n`);\r\n console.log(`${chalk.red('│ ')} ${chalk.gray('└─')} ${chalk.red(error)}`);\r\n }\r\n\r\n /**\r\n * Shows operation header\r\n */\r\n static showOperationHeader(operationName: string, databaseName: string, icon: string = '🗑️'): void {\r\n console.log(`\\n${chalk.cyan(icon)} ${chalk.bold.green(operationName.toUpperCase())}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n console.log(`${chalk.blue('┌─')} ${chalk.bold(`Database: ${databaseName}`)}`);\r\n }\r\n\r\n /**\r\n * Shows comprehensive operation summary\r\n */\r\n static showOperationSummary(summary: ProcessSummary): void {\r\n const { startTime, totalProcessed, successCount, errorCount, processedItems, operationName, databaseName } = summary;\r\n const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);\r\n\r\n console.log(`\\n${chalk.cyan('📊')} ${chalk.bold.green(`SUMMARY OF ${operationName.toUpperCase()}`)}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n\r\n if (successCount > 0) {\r\n console.log(`${chalk.green('┌─')} ${chalk.bold('Successful processing:')}`);\r\n console.log(`${chalk.green('├─')} ${chalk.cyan(`Items processed: ${successCount}`)}`);\r\n console.log(`${chalk.green('├─')} ${chalk.gray(`Database: ${databaseName}`)}`);\r\n\r\n if (processedItems.length > 0) {\r\n console.log(`${chalk.green('├─')} ${chalk.yellow('Items updated:')}`);\r\n processedItems.forEach((item, index) => {\r\n const isLast = index === processedItems.length - 1;\r\n const connector = isLast ? '└─' : '├─';\r\n console.log(`${chalk.green('│ ')} ${chalk.gray(connector)} ${chalk.cyan(item)}`);\r\n });\r\n }\r\n }\r\n\r\n if (errorCount > 0) {\r\n console.log(`${chalk.red('├─')} ${chalk.bold.red(`Errors: ${errorCount}`)}`);\r\n }\r\n\r\n console.log(`${chalk.blue('├─')} ${chalk.gray(`Total time: ${totalTime}s`)}`);\r\n console.log(`${chalk.blue('└─')} ${chalk.bold(totalProcessed > 0 ? chalk.green('✅ Completed') : chalk.yellow('⚠️ No changes'))}`);\r\n }\r\n}"],"mappings":"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","names":["resolve","resolve","chalk","ConfigClass","path","fs","err"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -6,6 +6,12 @@ declare class Schema {
|
|
|
6
6
|
private name;
|
|
7
7
|
private engine;
|
|
8
8
|
constructor(name: string);
|
|
9
|
+
/**
|
|
10
|
+
* Validates that the database specified in cube file exists in configuration
|
|
11
|
+
* @param filePath - Path to the cube file
|
|
12
|
+
* @returns true if valid, throws error if invalid
|
|
13
|
+
*/
|
|
14
|
+
private validateDatabaseConfiguration;
|
|
9
15
|
createDatabase(): Promise<any>;
|
|
10
16
|
refreshTables(): Promise<any>;
|
|
11
17
|
freshTables(): Promise<any>;
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,12 @@ declare class Schema {
|
|
|
6
6
|
private name;
|
|
7
7
|
private engine;
|
|
8
8
|
constructor(name: string);
|
|
9
|
+
/**
|
|
10
|
+
* Validates that the database specified in cube file exists in configuration
|
|
11
|
+
* @param filePath - Path to the cube file
|
|
12
|
+
* @returns true if valid, throws error if invalid
|
|
13
|
+
*/
|
|
14
|
+
private validateDatabaseConfiguration;
|
|
9
15
|
createDatabase(): Promise<any>;
|
|
10
16
|
refreshTables(): Promise<any>;
|
|
11
17
|
freshTables(): Promise<any>;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
1
8
|
// src/lib/Schema.ts
|
|
2
9
|
import fs2 from "fs";
|
|
3
|
-
import { Engine, TableProcessor } from "@dbcube/core";
|
|
10
|
+
import { Engine, TableProcessor, Config as ConfigClass } from "@dbcube/core";
|
|
4
11
|
import path2 from "path";
|
|
5
12
|
|
|
6
13
|
// src/lib/FileUtils.ts
|
|
@@ -64,6 +71,35 @@ var FileUtils = class {
|
|
|
64
71
|
});
|
|
65
72
|
return cubeFiles;
|
|
66
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Extracts database name from cube files
|
|
76
|
+
* @param filePath - Path to the .cube file
|
|
77
|
+
* @returns Object containing status and database name
|
|
78
|
+
*/
|
|
79
|
+
static extractDatabaseNameFromCube(filePath) {
|
|
80
|
+
try {
|
|
81
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
82
|
+
const databaseMatch = content.match(/@database\s*\(\s*["']([^"']+)["']\s*\)\s*;?/);
|
|
83
|
+
if (databaseMatch) {
|
|
84
|
+
return {
|
|
85
|
+
status: 200,
|
|
86
|
+
message: databaseMatch[1]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`No @database directive found in file ${filePath}`);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
if (error instanceof Error) {
|
|
92
|
+
return {
|
|
93
|
+
status: 500,
|
|
94
|
+
message: error.message
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
status: 500,
|
|
99
|
+
message: String(error)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
67
103
|
/**
|
|
68
104
|
* Extrae nombres de tablas reales de archivos .cube
|
|
69
105
|
* @param {string} filePath - String ruta del archivo .cube
|
|
@@ -173,13 +209,6 @@ ${chalk.cyan("\u{1F4CA}")} ${chalk.bold.green(`SUMMARY OF ${operationName.toUppe
|
|
|
173
209
|
}
|
|
174
210
|
console.log(`${chalk.blue("\u251C\u2500")} ${chalk.gray(`Total time: ${totalTime}s`)}`);
|
|
175
211
|
console.log(`${chalk.blue("\u2514\u2500")} ${chalk.bold(totalProcessed > 0 ? chalk.green("\u2705 Completed") : chalk.yellow("\u26A0\uFE0F No changes"))}`);
|
|
176
|
-
if (totalProcessed > 0) {
|
|
177
|
-
console.log(`
|
|
178
|
-
${chalk.green("\u{1F389}")} ${chalk.bold(`${operationName} executed successfully!`)}`);
|
|
179
|
-
} else {
|
|
180
|
-
console.log(`
|
|
181
|
-
${chalk.yellow("\u26A0\uFE0F ")} ${chalk.bold("No items were processed.")}`);
|
|
182
|
-
}
|
|
183
212
|
}
|
|
184
213
|
};
|
|
185
214
|
|
|
@@ -191,6 +220,52 @@ var Schema = class {
|
|
|
191
220
|
this.name = name;
|
|
192
221
|
this.engine = new Engine(name);
|
|
193
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Validates that the database specified in cube file exists in configuration
|
|
225
|
+
* @param filePath - Path to the cube file
|
|
226
|
+
* @returns true if valid, throws error if invalid
|
|
227
|
+
*/
|
|
228
|
+
validateDatabaseConfiguration(filePath) {
|
|
229
|
+
try {
|
|
230
|
+
const dbResult = FileUtils_default.extractDatabaseNameFromCube(filePath);
|
|
231
|
+
if (dbResult.status !== 200) {
|
|
232
|
+
throw new Error(`Error reading database directive from ${filePath}: ${dbResult.message}`);
|
|
233
|
+
}
|
|
234
|
+
const cubeDbName = dbResult.message;
|
|
235
|
+
const configInstance = new ConfigClass();
|
|
236
|
+
const configFilePath = path2.resolve(process.cwd(), "dbcube.config.js");
|
|
237
|
+
const configFn = __require(configFilePath);
|
|
238
|
+
if (typeof configFn === "function") {
|
|
239
|
+
configFn(configInstance);
|
|
240
|
+
} else {
|
|
241
|
+
throw new Error("\u274C The dbcube.config.js file does not export a function.");
|
|
242
|
+
}
|
|
243
|
+
const dbConfig = configInstance.getDatabase(cubeDbName);
|
|
244
|
+
if (!dbConfig) {
|
|
245
|
+
let availableDbs = [];
|
|
246
|
+
try {
|
|
247
|
+
const testNames = ["test", "development", "production", "local", "main"];
|
|
248
|
+
for (const testName of testNames) {
|
|
249
|
+
try {
|
|
250
|
+
const testConfig = configInstance.getDatabase(testName);
|
|
251
|
+
if (testConfig) {
|
|
252
|
+
availableDbs.push(testName);
|
|
253
|
+
}
|
|
254
|
+
} catch (e) {
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
} catch (e) {
|
|
258
|
+
}
|
|
259
|
+
const availableText = availableDbs.length > 0 ? availableDbs.join(", ") : "none found";
|
|
260
|
+
throw new Error(`\u274C Database configuration '${cubeDbName}' from cube file '${path2.basename(filePath)}' not found in dbcube.config.js.
|
|
261
|
+
|
|
262
|
+
Available databases: ${availableText}`);
|
|
263
|
+
}
|
|
264
|
+
return true;
|
|
265
|
+
} catch (error) {
|
|
266
|
+
throw new Error(`Database configuration validation failed: ${error.message}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
194
269
|
async createDatabase() {
|
|
195
270
|
const startTime = Date.now();
|
|
196
271
|
const rootPath = path2.resolve(process.cwd());
|
|
@@ -257,6 +332,7 @@ var Schema = class {
|
|
|
257
332
|
const tableName = getTableName.status === 200 ? getTableName.message : path2.basename(file, ".table.cube");
|
|
258
333
|
await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);
|
|
259
334
|
try {
|
|
335
|
+
this.validateDatabaseConfiguration(filePath);
|
|
260
336
|
const dml = await this.engine.run("schema_engine", [
|
|
261
337
|
"--action",
|
|
262
338
|
"parse_table",
|
|
@@ -344,6 +420,7 @@ var Schema = class {
|
|
|
344
420
|
const tableName = getTableName.status === 200 ? getTableName.message : path2.basename(file, ".table.cube");
|
|
345
421
|
await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);
|
|
346
422
|
try {
|
|
423
|
+
this.validateDatabaseConfiguration(filePath);
|
|
347
424
|
const dml = await this.engine.run("schema_engine", [
|
|
348
425
|
"--action",
|
|
349
426
|
"parse_table",
|
|
@@ -369,10 +446,6 @@ var Schema = class {
|
|
|
369
446
|
}
|
|
370
447
|
delete queries.data._type;
|
|
371
448
|
const createQuery = queries.data.regular_queries.filter((q) => q.includes("CREATE"))[0];
|
|
372
|
-
if (queries.data.regular_queries.length > 0) {
|
|
373
|
-
const nowQueries = await TableProcessor.generateAlterQueries(queries.data.regular_queries[0], dml.data.motor, dml.data.table, dml.data.database);
|
|
374
|
-
queries.data.regular_queries = nowQueries;
|
|
375
|
-
}
|
|
376
449
|
const parseJsonQueries = JSON.stringify(queries.data);
|
|
377
450
|
const response = await this.engine.run("schema_engine", [
|
|
378
451
|
"--action",
|
|
@@ -433,6 +506,7 @@ var Schema = class {
|
|
|
433
506
|
const seederName = getSeederName.status === 200 ? getSeederName.message : path2.basename(file, ".seeder.cube");
|
|
434
507
|
await UIUtils.showItemProgress(seederName, index + 1, cubeFiles.length);
|
|
435
508
|
try {
|
|
509
|
+
this.validateDatabaseConfiguration(filePath);
|
|
436
510
|
const response = await this.engine.run("schema_engine", [
|
|
437
511
|
"--action",
|
|
438
512
|
"seeder",
|
|
@@ -490,6 +564,7 @@ var Schema = class {
|
|
|
490
564
|
const triggerName = getTriggerName.status === 200 ? getTriggerName.message : path2.basename(file, ".trigger.cube");
|
|
491
565
|
await UIUtils.showItemProgress(triggerName, index + 1, cubeFiles.length);
|
|
492
566
|
try {
|
|
567
|
+
this.validateDatabaseConfiguration(filePath);
|
|
493
568
|
const response = await this.engine.run("schema_engine", [
|
|
494
569
|
"--action",
|
|
495
570
|
"trigger",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/Schema.ts","../src/lib/FileUtils.ts","../src/lib/UIUtils.ts","../src/index.ts"],"sourcesContent":["import fs from 'fs';\r\nimport { Engine, TableProcessor } from \"@dbcube/core\";\r\nimport path from 'path';\r\nimport FileUtils from './FileUtils';\r\nimport chalk from 'chalk';\r\nimport { UIUtils, ProcessSummary } from './UIUtils';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nclass Schema {\r\n private name: string;\r\n private engine: any;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n this.engine = new Engine(name);\r\n }\r\n\r\n async createDatabase(): Promise<any> {\r\n const startTime = Date.now();\r\n const rootPath = path.resolve(process.cwd());\r\n\r\n // Show header\r\n UIUtils.showOperationHeader(' CREATING DATABASE', this.name, '🗄️');\r\n\r\n // Show progress for database creation\r\n await UIUtils.showItemProgress('Preparando e instalando base de datos', 1, 1);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'create_database',\r\n '--path', rootPath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n UIUtils.showItemSuccess('Database');\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 1,\r\n successCount: 1,\r\n errorCount: 0,\r\n processedItems: [this.name],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return response.data;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError('Database', error.message);\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 0,\r\n successCount: 0,\r\n errorCount: 1,\r\n processedItems: [],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n throw error;\r\n }\r\n }\r\n\r\n async refreshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING REFRESH TABLES', this.name, '🔄');\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--mode', 'refresh',\r\n '--schema-path', filePath,\r\n ]);\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--mode', 'refresh',\r\n '--dml', parseJson,\r\n ]);\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n delete queries.data.database_type;\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'refresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'refresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async freshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING FRESH TABLES', this.name);\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--schema-path', filePath,\r\n '--mode', 'fresh',\r\n ]);\r\n\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--dml', parseJson,\r\n ]);\r\n\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n\r\n delete queries.data._type;\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n if (queries.data.regular_queries.length > 0) {\r\n const nowQueries = await TableProcessor.generateAlterQueries(queries.data.regular_queries[0], dml.data.motor, dml.data.table, dml.data.database);\r\n queries.data.regular_queries = nowQueries;\r\n }\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'fresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'fresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n\r\n async executeSeeders(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'seeder.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING SEEDERS', this.name, '🌱');\r\n\r\n let totalSeedersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedSeeders: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getSeederName = FileUtils.extracTableNameFromCube(filePath);\r\n const seederName = getSeederName.status === 200 ? getSeederName.message : path.basename(file, '.seeder.cube');\r\n\r\n // Show visual progress for each seeder\r\n await UIUtils.showItemProgress(seederName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'seeder',\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(seederName);\r\n successCount++;\r\n processedSeeders.push(seederName);\r\n totalSeedersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(seederName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalSeedersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedSeeders,\r\n operationName: 'seeders',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalSeedersProcessed > 0 ? { processed: totalSeedersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async executeTriggers(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n const triggersDirExit = path.join(process.cwd(), 'dbcube', 'triggers');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'trigger.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING TRIGGERS', this.name, '⚡');\r\n\r\n let totalTriggersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTriggers: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTriggerName = FileUtils.extracTableNameFromCube(filePath);\r\n const triggerName = getTriggerName.status === 200 ? getTriggerName.message : path.basename(file, '.trigger.cube');\r\n\r\n // Show visual progress for each trigger\r\n await UIUtils.showItemProgress(triggerName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'trigger',\r\n '--path-exit', triggersDirExit,\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(triggerName);\r\n successCount++;\r\n processedTriggers.push(triggerName);\r\n totalTriggersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(triggerName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTriggersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTriggers,\r\n operationName: 'triggers',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTriggersProcessed > 0 ? { processed: totalTriggersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n}\r\n\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n process.exit(1);\r\n}\r\n\r\nexport default Schema;\r\nexport { Schema };\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nclass FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith(suffix)) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a, b) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n\r\n /**\r\n * Extrae nombres de tablas reales de archivos .cube\r\n * @param {string} filePath - String ruta del archivo .cube\r\n * @returns {object} - Objeto que contiene el estado y el mensaje con el nombre de la tabla\r\n */\r\n static extracTableNameFromCube(filePath: string) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n\r\n // Patrón principal: @meta({ name: \"nombre_tabla\"; }) o @meta({ name: 'nombre_tabla'; })\r\n const metaMatch = content.match(/@meta\\s*\\(\\s*\\{\\s*name\\s*:\\s*[\"']([^\"']+)[\"']\\s*;\\s*[^}]*\\}\\s*\\)/s);\r\n if (metaMatch) {\r\n return {\r\n status: 200,\r\n message: metaMatch[1]\r\n };\r\n }\r\n\r\n throw new Error(`Error to execute this file ${filePath} because no exist a name of table.`);\r\n\r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n return {\r\n status: 500,\r\n message: error.message\r\n };\r\n }\r\n return {\r\n status: 500,\r\n message: String(error)\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default FileUtils;","import chalk from 'chalk';\r\n\r\nexport interface ProcessSummary {\r\n startTime: number;\r\n totalProcessed: number;\r\n successCount: number;\r\n errorCount: number;\r\n processedItems: string[];\r\n operationName: string;\r\n databaseName: string;\r\n}\r\n\r\nexport class UIUtils {\r\n /**\r\n * Shows animated progress for processing items\r\n */\r\n static async showItemProgress(\r\n itemName: string,\r\n current: number,\r\n total: number\r\n ): Promise<void> {\r\n // Get console width, default to 80 if not available\r\n const consoleWidth = process.stdout.columns || 80;\r\n\r\n // Calculate available space for dots\r\n // Format: \"├─ itemName \" + dots + \" ✓ OK\"\r\n const prefix = `├─ ${itemName} `;\r\n const suffix = ` ✓ OK`;\r\n const availableSpace = consoleWidth - prefix.length - suffix.length;\r\n const maxDots = Math.max(10, availableSpace); // Minimum 10 dots\r\n\r\n return new Promise((resolve) => {\r\n process.stdout.write(`${chalk.blue('├─')} ${chalk.cyan(itemName)} `);\r\n\r\n let dotCount = 0;\r\n const interval = setInterval(() => {\r\n if (dotCount < maxDots) {\r\n process.stdout.write(chalk.gray('.'));\r\n dotCount++;\r\n } else {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // Faster animation\r\n });\r\n }\r\n\r\n /**\r\n * Shows success for a processed item\r\n */\r\n static showItemSuccess(itemName: string): void {\r\n process.stdout.write(` ${chalk.green('✓')} ${chalk.gray('OK')}\\n`);\r\n }\r\n\r\n /**\r\n * Shows error for an item\r\n */\r\n static showItemError(itemName: string, error: string): void {\r\n process.stdout.write(` ${chalk.red('✗')} ${chalk.red('ERROR')}\\n`);\r\n console.log(`${chalk.red('│ ')} ${chalk.gray('└─')} ${chalk.red(error)}`);\r\n }\r\n\r\n /**\r\n * Shows operation header\r\n */\r\n static showOperationHeader(operationName: string, databaseName: string, icon: string = '🗑️'): void {\r\n console.log(`\\n${chalk.cyan(icon)} ${chalk.bold.green(operationName.toUpperCase())}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n console.log(`${chalk.blue('┌─')} ${chalk.bold(`Database: ${databaseName}`)}`);\r\n }\r\n\r\n /**\r\n * Shows comprehensive operation summary\r\n */\r\n static showOperationSummary(summary: ProcessSummary): void {\r\n const { startTime, totalProcessed, successCount, errorCount, processedItems, operationName, databaseName } = summary;\r\n const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);\r\n\r\n console.log(`\\n${chalk.cyan('📊')} ${chalk.bold.green(`SUMMARY OF ${operationName.toUpperCase()}`)}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n\r\n if (successCount > 0) {\r\n console.log(`${chalk.green('┌─')} ${chalk.bold('Successful processing:')}`);\r\n console.log(`${chalk.green('├─')} ${chalk.cyan(`Items processed: ${successCount}`)}`);\r\n console.log(`${chalk.green('├─')} ${chalk.gray(`Database: ${databaseName}`)}`);\r\n\r\n if (processedItems.length > 0) {\r\n console.log(`${chalk.green('├─')} ${chalk.yellow('Items updated:')}`);\r\n processedItems.forEach((item, index) => {\r\n const isLast = index === processedItems.length - 1;\r\n const connector = isLast ? '└─' : '├─';\r\n console.log(`${chalk.green('│ ')} ${chalk.gray(connector)} ${chalk.cyan(item)}`);\r\n });\r\n }\r\n }\r\n\r\n if (errorCount > 0) {\r\n console.log(`${chalk.red('├─')} ${chalk.bold.red(`Errors: ${errorCount}`)}`);\r\n }\r\n\r\n console.log(`${chalk.blue('├─')} ${chalk.gray(`Total time: ${totalTime}s`)}`);\r\n console.log(`${chalk.blue('└─')} ${chalk.bold(totalProcessed > 0 ? chalk.green('✅ Completed') : chalk.yellow('⚠️ No changes'))}`);\r\n\r\n if (totalProcessed > 0) {\r\n console.log(`\\n${chalk.green('🎉')} ${chalk.bold(`${operationName} executed successfully!`)}`);\r\n } else {\r\n console.log(`\\n${chalk.yellow('⚠️ ')} ${chalk.bold('No items were processed.')}`);\r\n }\r\n }\r\n}","import { Schema } from './lib/Schema';\r\n\r\nexport default Schema;\r\nexport { Schema };"],"mappings":"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","names":["fs","path","resolve","resolve","path","fs","err"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/Schema.ts","../src/lib/FileUtils.ts","../src/lib/UIUtils.ts","../src/index.ts"],"sourcesContent":["import fs from 'fs';\r\nimport { Engine, TableProcessor, Config as ConfigClass } from \"@dbcube/core\";\r\nimport path from 'path';\r\nimport FileUtils from './FileUtils';\r\nimport chalk from 'chalk';\r\nimport { UIUtils, ProcessSummary } from './UIUtils';\r\n\r\n/**\r\n * Main class to handle MySQL database connections and queries.\r\n * Implements the Singleton pattern to ensure a single instance of the connection pool.\r\n */\r\nclass Schema {\r\n private name: string;\r\n private engine: any;\r\n\r\n constructor(name: string) {\r\n this.name = name;\r\n this.engine = new Engine(name);\r\n }\r\n\r\n /**\r\n * Validates that the database specified in cube file exists in configuration\r\n * @param filePath - Path to the cube file\r\n * @returns true if valid, throws error if invalid\r\n */\r\n private validateDatabaseConfiguration(filePath: string): boolean {\r\n try {\r\n // Extract database name from cube file\r\n const dbResult = FileUtils.extractDatabaseNameFromCube(filePath);\r\n if (dbResult.status !== 200) {\r\n throw new Error(`Error reading database directive from ${filePath}: ${dbResult.message}`);\r\n }\r\n\r\n const cubeDbName = dbResult.message;\r\n \r\n // Get available configurations\r\n const configInstance = new ConfigClass();\r\n const configFilePath = path.resolve(process.cwd(), 'dbcube.config.js');\r\n const configFn = require(configFilePath);\r\n \r\n if (typeof configFn === 'function') {\r\n configFn(configInstance);\r\n } else {\r\n throw new Error('❌ The dbcube.config.js file does not export a function.');\r\n }\r\n \r\n // Check if the database configuration exists\r\n const dbConfig = configInstance.getDatabase(cubeDbName);\r\n if (!dbConfig) {\r\n // Try to get available databases by attempting to access common ones\r\n let availableDbs: string[] = [];\r\n try {\r\n // Try some common database names to see what exists\r\n const testNames = ['test', 'development', 'production', 'local', 'main'];\r\n for (const testName of testNames) {\r\n try {\r\n const testConfig = configInstance.getDatabase(testName);\r\n if (testConfig) {\r\n availableDbs.push(testName);\r\n }\r\n } catch (e) {\r\n // Skip non-existent configs\r\n }\r\n }\r\n } catch (e) {\r\n // Fallback if we can't determine available databases\r\n }\r\n \r\n const availableText = availableDbs.length > 0 ? availableDbs.join(', ') : 'none found';\r\n throw new Error(`❌ Database configuration '${cubeDbName}' from cube file '${path.basename(filePath)}' not found in dbcube.config.js.\\n\\nAvailable databases: ${availableText}`);\r\n }\r\n \r\n return true;\r\n \r\n } catch (error: any) {\r\n throw new Error(`Database configuration validation failed: ${error.message}`);\r\n }\r\n }\r\n\r\n async createDatabase(): Promise<any> {\r\n const startTime = Date.now();\r\n const rootPath = path.resolve(process.cwd());\r\n\r\n // Show header\r\n UIUtils.showOperationHeader(' CREATING DATABASE', this.name, '🗄️');\r\n\r\n // Show progress for database creation\r\n await UIUtils.showItemProgress('Preparando e instalando base de datos', 1, 1);\r\n\r\n try {\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'create_database',\r\n '--path', rootPath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n UIUtils.showItemSuccess('Database');\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 1,\r\n successCount: 1,\r\n errorCount: 0,\r\n processedItems: [this.name],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return response.data;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError('Database', error.message);\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: 0,\r\n successCount: 0,\r\n errorCount: 1,\r\n processedItems: [],\r\n operationName: 'create database',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n throw error;\r\n }\r\n }\r\n\r\n async refreshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING REFRESH TABLES', this.name, '🔄');\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--mode', 'refresh',\r\n '--schema-path', filePath,\r\n ]);\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--mode', 'refresh',\r\n '--dml', parseJson,\r\n ]);\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n delete queries.data.database_type;\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'refresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'refresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async freshTables(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'table.cube');\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING FRESH TABLES', this.name);\r\n\r\n let totalTablesProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTables: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTableName = FileUtils.extracTableNameFromCube(filePath);\r\n const tableName = getTableName.status === 200 ? getTableName.message : path.basename(file, '.table.cube');\r\n\r\n // Show visual progress for each table\r\n await UIUtils.showItemProgress(tableName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const dml = await this.engine.run('schema_engine', [\r\n '--action', 'parse_table',\r\n '--schema-path', filePath,\r\n '--mode', 'fresh',\r\n ]);\r\n\r\n if (dml.status != 200) {\r\n returnFormattedError(dml.status, dml.message);\r\n break;\r\n }\r\n\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' ');\r\n\r\n const queries = await this.engine.run('schema_engine', [\r\n '--action', 'generate',\r\n '--dml', parseJson,\r\n ]);\r\n\r\n if (queries.status != 200) {\r\n returnFormattedError(queries.status, queries.message);\r\n break;\r\n }\r\n\r\n delete queries.data._type;\r\n const createQuery = queries.data.regular_queries.filter((q: string) => q.includes(\"CREATE\"))[0];\r\n\r\n // For fresh mode, use the generated queries directly without alterations\r\n // generateAlterQueries is used for refresh mode, not fresh mode\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'execute',\r\n '--mode', 'fresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n UIUtils.showItemSuccess(tableName);\r\n successCount++;\r\n processedTables.push(tableName);\r\n totalTablesProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(tableName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTablesProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTables,\r\n operationName: 'fresh tables',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTablesProcessed > 0 ? { processed: totalTablesProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n\r\n async executeSeeders(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'seeder.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING SEEDERS', this.name, '🌱');\r\n\r\n let totalSeedersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedSeeders: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getSeederName = FileUtils.extracTableNameFromCube(filePath);\r\n const seederName = getSeederName.status === 200 ? getSeederName.message : path.basename(file, '.seeder.cube');\r\n\r\n // Show visual progress for each seeder\r\n await UIUtils.showItemProgress(seederName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'seeder',\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(seederName);\r\n successCount++;\r\n processedSeeders.push(seederName);\r\n totalSeedersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(seederName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalSeedersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedSeeders,\r\n operationName: 'seeders',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalSeedersProcessed > 0 ? { processed: totalSeedersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n\r\n async executeTriggers(): Promise<any> {\r\n const startTime = Date.now();\r\n const cubesDir = path.join(process.cwd(), 'dbcube', 'cubes');\r\n const triggersDirExit = path.join(process.cwd(), 'dbcube', 'triggers');\r\n\r\n // Verificar si la carpeta existe\r\n if (!fs.existsSync(cubesDir)) {\r\n throw new Error('❌ The cubes folder does not exist');\r\n }\r\n\r\n const cubeFiles = FileUtils.getCubeFilesRecursively('dbcube', 'trigger.cube');\r\n\r\n if (cubeFiles.length === 0) {\r\n throw new Error('❌ There are no cubes to execute');\r\n }\r\n\r\n // Show header\r\n UIUtils.showOperationHeader('EXECUTING TRIGGERS', this.name, '⚡');\r\n\r\n let totalTriggersProcessed = 0;\r\n let successCount = 0;\r\n let errorCount = 0;\r\n const processedTriggers: string[] = [];\r\n\r\n for (let index = 0; index < cubeFiles.length; index++) {\r\n const file = cubeFiles[index];\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n\r\n if (stats.isFile()) {\r\n const getTriggerName = FileUtils.extracTableNameFromCube(filePath);\r\n const triggerName = getTriggerName.status === 200 ? getTriggerName.message : path.basename(file, '.trigger.cube');\r\n\r\n // Show visual progress for each trigger\r\n await UIUtils.showItemProgress(triggerName, index + 1, cubeFiles.length);\r\n\r\n try {\r\n // Validate database configuration before processing\r\n this.validateDatabaseConfiguration(filePath);\r\n\r\n const response = await this.engine.run('schema_engine', [\r\n '--action', 'trigger',\r\n '--path-exit', triggersDirExit,\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if (response.status != 200) {\r\n returnFormattedError(response.status, response.message);\r\n break;\r\n }\r\n\r\n UIUtils.showItemSuccess(triggerName);\r\n successCount++;\r\n processedTriggers.push(triggerName);\r\n totalTriggersProcessed++;\r\n\r\n } catch (error: any) {\r\n UIUtils.showItemError(triggerName, error.message);\r\n errorCount++;\r\n }\r\n }\r\n }\r\n\r\n // Show final summary\r\n const summary: ProcessSummary = {\r\n startTime,\r\n totalProcessed: totalTriggersProcessed,\r\n successCount,\r\n errorCount,\r\n processedItems: processedTriggers,\r\n operationName: 'triggers',\r\n databaseName: this.name\r\n };\r\n UIUtils.showOperationSummary(summary);\r\n\r\n return totalTriggersProcessed > 0 ? { processed: totalTriggersProcessed, success: successCount, errors: errorCount } : null;\r\n }\r\n}\r\n\r\n\r\nfunction returnFormattedError(status: number, message: string) {\r\n const RESET = '\\x1b[0m';\r\n const RED = '\\x1b[31m';\r\n const YELLOW = '\\x1b[33m';\r\n const BOLD = '\\x1b[1m';\r\n const CYAN = '\\x1b[36m';\r\n const GRAY = '\\x1b[90m';\r\n const UNDERLINE = '\\x1b[4m';\r\n const MAGENTA = '\\x1b[35m';\r\n\r\n let output = '';\r\n let help = '';\r\n const color = status === 600 ? YELLOW : RED;\r\n\r\n\r\n if (message.includes(\"[help]\")) {\r\n const parts = message.split(\"[help]\");\r\n output += `\\n${RED}${BOLD}${parts[0]}${RESET}`;\r\n help += `\\n${MAGENTA}${BOLD}[help]${RESET} ${GRAY}${parts[1]}${RESET}\\n`;\r\n } else {\r\n output += `\\n${color}${BOLD}${message}${RESET}\\n`;\r\n }\r\n\r\n const err = new Error();\r\n const stackLines = err.stack?.split('\\n') || [];\r\n\r\n // Buscamos la primera línea del stack fuera de node_modules\r\n const relevantStackLine = stackLines.find(line =>\r\n line.includes('.js:') && !line.includes('node_modules')\r\n );\r\n\r\n if (relevantStackLine) {\r\n const match = relevantStackLine.match(/\\((.*):(\\d+):(\\d+)\\)/) ||\r\n relevantStackLine.match(/at (.*):(\\d+):(\\d+)/);\r\n\r\n if (match) {\r\n const [, filePath, lineStr, columnStr] = match;\r\n const lineNum = parseInt(lineStr, 10);\r\n const errorLocation = `${filePath}:${lineStr}:${columnStr}`;\r\n\r\n // Leemos el archivo y sacamos las líneas relevantes\r\n try {\r\n const codeLines = fs.readFileSync(filePath, 'utf-8').split('\\n');\r\n const start = Math.max(0, lineNum - 3);\r\n const end = Math.min(codeLines.length, lineNum + 2);\r\n\r\n output += `\\n${CYAN}${BOLD}[code] ${RESET}${YELLOW} ${UNDERLINE}${errorLocation}${RESET}\\n`;\r\n\r\n for (let i = start; i < end; i++) {\r\n const line = codeLines[i];\r\n const lineLabel = `${i + 1}`.padStart(4, ' ');\r\n const pointer = i + 1 === lineNum ? `${RED}<-${RESET}` : ' ';\r\n output += `${GRAY}${lineLabel}${RESET} ${pointer} ${line}\\n`;\r\n }\r\n } catch (err) {\r\n output += `${YELLOW}⚠️ No se pudo leer el archivo de origen: ${filePath}${RESET}\\n`;\r\n output += `\\n${CYAN}${BOLD}Stack Trace:${RESET}\\n${stackLines.slice(2).join('\\n')}\\n`;\r\n }\r\n }\r\n }\r\n output += help;\r\n console.error(output);\r\n process.exit(1);\r\n}\r\n\r\nexport default Schema;\r\nexport { Schema };\r\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nclass FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && entry.name.endsWith(suffix)) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a, b) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n\r\n /**\r\n * Extracts database name from cube files\r\n * @param filePath - Path to the .cube file\r\n * @returns Object containing status and database name\r\n */\r\n static extractDatabaseNameFromCube(filePath: string) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n \r\n // Pattern: @database(\"database_name\") or @database('database_name')\r\n const databaseMatch = content.match(/@database\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)\\s*;?/);\r\n if (databaseMatch) {\r\n return {\r\n status: 200,\r\n message: databaseMatch[1]\r\n };\r\n }\r\n \r\n throw new Error(`No @database directive found in file ${filePath}`);\r\n \r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n return {\r\n status: 500,\r\n message: error.message\r\n };\r\n }\r\n return {\r\n status: 500,\r\n message: String(error)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Extrae nombres de tablas reales de archivos .cube\r\n * @param {string} filePath - String ruta del archivo .cube\r\n * @returns {object} - Objeto que contiene el estado y el mensaje con el nombre de la tabla\r\n */\r\n static extracTableNameFromCube(filePath: string) {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n\r\n // Patrón principal: @meta({ name: \"nombre_tabla\"; }) o @meta({ name: 'nombre_tabla'; })\r\n const metaMatch = content.match(/@meta\\s*\\(\\s*\\{\\s*name\\s*:\\s*[\"']([^\"']+)[\"']\\s*;\\s*[^}]*\\}\\s*\\)/s);\r\n if (metaMatch) {\r\n return {\r\n status: 200,\r\n message: metaMatch[1]\r\n };\r\n }\r\n\r\n throw new Error(`Error to execute this file ${filePath} because no exist a name of table.`);\r\n\r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n return {\r\n status: 500,\r\n message: error.message\r\n };\r\n }\r\n return {\r\n status: 500,\r\n message: String(error)\r\n };\r\n }\r\n }\r\n}\r\n\r\nexport default FileUtils;","import chalk from 'chalk';\r\n\r\nexport interface ProcessSummary {\r\n startTime: number;\r\n totalProcessed: number;\r\n successCount: number;\r\n errorCount: number;\r\n processedItems: string[];\r\n operationName: string;\r\n databaseName: string;\r\n}\r\n\r\nexport class UIUtils {\r\n /**\r\n * Shows animated progress for processing items\r\n */\r\n static async showItemProgress(\r\n itemName: string,\r\n current: number,\r\n total: number\r\n ): Promise<void> {\r\n // Get console width, default to 80 if not available\r\n const consoleWidth = process.stdout.columns || 80;\r\n\r\n // Calculate available space for dots\r\n // Format: \"├─ itemName \" + dots + \" ✓ OK\"\r\n const prefix = `├─ ${itemName} `;\r\n const suffix = ` ✓ OK`;\r\n const availableSpace = consoleWidth - prefix.length - suffix.length;\r\n const maxDots = Math.max(10, availableSpace); // Minimum 10 dots\r\n\r\n return new Promise((resolve) => {\r\n process.stdout.write(`${chalk.blue('├─')} ${chalk.cyan(itemName)} `);\r\n\r\n let dotCount = 0;\r\n const interval = setInterval(() => {\r\n if (dotCount < maxDots) {\r\n process.stdout.write(chalk.gray('.'));\r\n dotCount++;\r\n } else {\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 10); // Faster animation\r\n });\r\n }\r\n\r\n /**\r\n * Shows success for a processed item\r\n */\r\n static showItemSuccess(itemName: string): void {\r\n process.stdout.write(` ${chalk.green('✓')} ${chalk.gray('OK')}\\n`);\r\n }\r\n\r\n /**\r\n * Shows error for an item\r\n */\r\n static showItemError(itemName: string, error: string): void {\r\n process.stdout.write(` ${chalk.red('✗')} ${chalk.red('ERROR')}\\n`);\r\n console.log(`${chalk.red('│ ')} ${chalk.gray('└─')} ${chalk.red(error)}`);\r\n }\r\n\r\n /**\r\n * Shows operation header\r\n */\r\n static showOperationHeader(operationName: string, databaseName: string, icon: string = '🗑️'): void {\r\n console.log(`\\n${chalk.cyan(icon)} ${chalk.bold.green(operationName.toUpperCase())}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n console.log(`${chalk.blue('┌─')} ${chalk.bold(`Database: ${databaseName}`)}`);\r\n }\r\n\r\n /**\r\n * Shows comprehensive operation summary\r\n */\r\n static showOperationSummary(summary: ProcessSummary): void {\r\n const { startTime, totalProcessed, successCount, errorCount, processedItems, operationName, databaseName } = summary;\r\n const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);\r\n\r\n console.log(`\\n${chalk.cyan('📊')} ${chalk.bold.green(`SUMMARY OF ${operationName.toUpperCase()}`)}`);\r\n console.log(chalk.gray('─'.repeat(60)));\r\n\r\n if (successCount > 0) {\r\n console.log(`${chalk.green('┌─')} ${chalk.bold('Successful processing:')}`);\r\n console.log(`${chalk.green('├─')} ${chalk.cyan(`Items processed: ${successCount}`)}`);\r\n console.log(`${chalk.green('├─')} ${chalk.gray(`Database: ${databaseName}`)}`);\r\n\r\n if (processedItems.length > 0) {\r\n console.log(`${chalk.green('├─')} ${chalk.yellow('Items updated:')}`);\r\n processedItems.forEach((item, index) => {\r\n const isLast = index === processedItems.length - 1;\r\n const connector = isLast ? '└─' : '├─';\r\n console.log(`${chalk.green('│ ')} ${chalk.gray(connector)} ${chalk.cyan(item)}`);\r\n });\r\n }\r\n }\r\n\r\n if (errorCount > 0) {\r\n console.log(`${chalk.red('├─')} ${chalk.bold.red(`Errors: ${errorCount}`)}`);\r\n }\r\n\r\n console.log(`${chalk.blue('├─')} ${chalk.gray(`Total time: ${totalTime}s`)}`);\r\n console.log(`${chalk.blue('└─')} ${chalk.bold(totalProcessed > 0 ? chalk.green('✅ Completed') : chalk.yellow('⚠️ No changes'))}`);\r\n }\r\n}","import { Schema } from './lib/Schema';\r\n\r\nexport default Schema;\r\nexport { Schema };"],"mappings":"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","names":["fs","path","resolve","resolve","path","fs","err"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dbcube/schema-builder",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "The DBCube Query Builder is a lightweight, flexible, and fluent library for building queries across multiple database engines, including MySQL, PostgreSQL, SQLite, and MongoDB, using JavaScript/Node.js. \nIts agnostic design allows you to generate data manipulation (DML) and data definition (DDL) operations with a clean, chainable syntax—without sacrificing power or expressiveness.\nIt’s designed to work seamlessly in both SQL and NoSQL environments, providing a consistent abstraction layer across different storage technologies while still leveraging the native capabilities of each engine.",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@dbcube/core": "^1.0.
|
|
57
|
+
"@dbcube/core": "^1.0.7",
|
|
58
58
|
"chalk": "^5.6.0",
|
|
59
59
|
"ora": "^8.2.0"
|
|
60
60
|
},
|