@dbcube/schema-builder 1.0.9 → 1.0.11
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 +27 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +27 -45
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -139,12 +139,14 @@ var UIUtils = class {
|
|
|
139
139
|
/**
|
|
140
140
|
* Shows animated progress for processing items
|
|
141
141
|
*/
|
|
142
|
-
static async showItemProgress(itemName, current, total
|
|
143
|
-
const
|
|
144
|
-
const
|
|
145
|
-
const
|
|
142
|
+
static async showItemProgress(itemName, current, total) {
|
|
143
|
+
const consoleWidth = process.stdout.columns || 80;
|
|
144
|
+
const prefix = `\u251C\u2500 ${itemName} `;
|
|
145
|
+
const suffix = ` \u2713 OK`;
|
|
146
|
+
const availableSpace = consoleWidth - prefix.length - suffix.length;
|
|
147
|
+
const maxDots = Math.max(10, availableSpace);
|
|
146
148
|
return new Promise((resolve2) => {
|
|
147
|
-
process.stdout.write(`${import_chalk.default.blue("\u251C\u2500")} ${import_chalk.default.
|
|
149
|
+
process.stdout.write(`${import_chalk.default.blue("\u251C\u2500")} ${import_chalk.default.cyan(itemName)} `);
|
|
148
150
|
let dotCount = 0;
|
|
149
151
|
const interval = setInterval(() => {
|
|
150
152
|
if (dotCount < maxDots) {
|
|
@@ -154,7 +156,7 @@ var UIUtils = class {
|
|
|
154
156
|
clearInterval(interval);
|
|
155
157
|
resolve2();
|
|
156
158
|
}
|
|
157
|
-
},
|
|
159
|
+
}, 10);
|
|
158
160
|
});
|
|
159
161
|
}
|
|
160
162
|
/**
|
|
@@ -188,7 +190,7 @@ ${import_chalk.default.cyan(icon)} ${import_chalk.default.bold.green(operationNa
|
|
|
188
190
|
const { startTime, totalProcessed, successCount, errorCount, processedItems, operationName, databaseName } = summary;
|
|
189
191
|
const totalTime = ((Date.now() - startTime) / 1e3).toFixed(1);
|
|
190
192
|
console.log(`
|
|
191
|
-
${import_chalk.default.cyan("\u{1F4CA}")} ${import_chalk.default.bold.green(`
|
|
193
|
+
${import_chalk.default.cyan("\u{1F4CA}")} ${import_chalk.default.bold.green(`SUMMARY OF ${operationName.toUpperCase()}`)}`);
|
|
192
194
|
console.log(import_chalk.default.gray("\u2500".repeat(60)));
|
|
193
195
|
if (successCount > 0) {
|
|
194
196
|
console.log(`${import_chalk.default.green("\u250C\u2500")} ${import_chalk.default.bold("Successful processing:")}`);
|
|
@@ -215,7 +217,6 @@ ${import_chalk.default.green("\u{1F389}")} ${import_chalk.default.bold(`${operat
|
|
|
215
217
|
console.log(`
|
|
216
218
|
${import_chalk.default.yellow("\u26A0\uFE0F ")} ${import_chalk.default.bold("No items were processed.")}`);
|
|
217
219
|
}
|
|
218
|
-
console.log("");
|
|
219
220
|
}
|
|
220
221
|
};
|
|
221
222
|
|
|
@@ -230,8 +231,8 @@ var Schema = class {
|
|
|
230
231
|
async createDatabase() {
|
|
231
232
|
const startTime = Date.now();
|
|
232
233
|
const rootPath = import_path.default.resolve(process.cwd());
|
|
233
|
-
UIUtils.showOperationHeader("CREATING DATABASE", this.name, "\u{1F5C4}\uFE0F");
|
|
234
|
-
await UIUtils.showItemProgress("
|
|
234
|
+
UIUtils.showOperationHeader(" CREATING DATABASE", this.name, "\u{1F5C4}\uFE0F");
|
|
235
|
+
await UIUtils.showItemProgress("Preparando e instalando base de datos", 1, 1);
|
|
235
236
|
try {
|
|
236
237
|
const response = await this.engine.run("schema_engine", [
|
|
237
238
|
"--action",
|
|
@@ -240,17 +241,6 @@ var Schema = class {
|
|
|
240
241
|
rootPath
|
|
241
242
|
]);
|
|
242
243
|
if (response.status != 200) {
|
|
243
|
-
UIUtils.showItemError("Database", `Error creating: ${response.message}`);
|
|
244
|
-
const summary2 = {
|
|
245
|
-
startTime,
|
|
246
|
-
totalProcessed: 0,
|
|
247
|
-
successCount: 0,
|
|
248
|
-
errorCount: 1,
|
|
249
|
-
processedItems: [],
|
|
250
|
-
operationName: "create database",
|
|
251
|
-
databaseName: this.name
|
|
252
|
-
};
|
|
253
|
-
UIUtils.showOperationSummary(summary2);
|
|
254
244
|
returnFormattedError(response.status, response.message);
|
|
255
245
|
}
|
|
256
246
|
UIUtils.showItemSuccess("Database");
|
|
@@ -313,9 +303,8 @@ var Schema = class {
|
|
|
313
303
|
filePath
|
|
314
304
|
]);
|
|
315
305
|
if (dml.status != 200) {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
continue;
|
|
306
|
+
returnFormattedError(dml.status, dml.message);
|
|
307
|
+
break;
|
|
319
308
|
}
|
|
320
309
|
const parseJson = JSON.stringify(dml.data.actions).replace(/[\r\n\t]/g, "").replace(/\\[rnt]/g, "").replace(/\s{2,}/g, " ");
|
|
321
310
|
const queries = await this.engine.run("schema_engine", [
|
|
@@ -327,9 +316,8 @@ var Schema = class {
|
|
|
327
316
|
parseJson
|
|
328
317
|
]);
|
|
329
318
|
if (queries.status != 200) {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
continue;
|
|
319
|
+
returnFormattedError(queries.status, queries.message);
|
|
320
|
+
break;
|
|
333
321
|
}
|
|
334
322
|
delete queries.data.database_type;
|
|
335
323
|
const parseJsonQueries = JSON.stringify(queries.data);
|
|
@@ -342,9 +330,8 @@ var Schema = class {
|
|
|
342
330
|
parseJsonQueries
|
|
343
331
|
]);
|
|
344
332
|
if (response.status != 200) {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
continue;
|
|
333
|
+
returnFormattedError(response.status, response.message);
|
|
334
|
+
break;
|
|
348
335
|
}
|
|
349
336
|
const createQuery = queries.data.regular_queries.filter((q) => q.includes("CREATE"))[0];
|
|
350
337
|
await import_core.TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);
|
|
@@ -403,9 +390,8 @@ var Schema = class {
|
|
|
403
390
|
"fresh"
|
|
404
391
|
]);
|
|
405
392
|
if (dml.status != 200) {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
continue;
|
|
393
|
+
returnFormattedError(dml.status, dml.message);
|
|
394
|
+
break;
|
|
409
395
|
}
|
|
410
396
|
const parseJson = JSON.stringify(dml.data.actions).replace(/[\r\n\t]/g, "").replace(/\\[rnt]/g, "").replace(/\s{2,}/g, " ");
|
|
411
397
|
const queries = await this.engine.run("schema_engine", [
|
|
@@ -415,9 +401,8 @@ var Schema = class {
|
|
|
415
401
|
parseJson
|
|
416
402
|
]);
|
|
417
403
|
if (queries.status != 200) {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
continue;
|
|
404
|
+
returnFormattedError(queries.status, queries.message);
|
|
405
|
+
break;
|
|
421
406
|
}
|
|
422
407
|
delete queries.data._type;
|
|
423
408
|
const createQuery = queries.data.regular_queries.filter((q) => q.includes("CREATE"))[0];
|
|
@@ -435,9 +420,8 @@ var Schema = class {
|
|
|
435
420
|
parseJsonQueries
|
|
436
421
|
]);
|
|
437
422
|
if (response.status != 200) {
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
continue;
|
|
423
|
+
returnFormattedError(response.status, response.message);
|
|
424
|
+
break;
|
|
441
425
|
}
|
|
442
426
|
await import_core.TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);
|
|
443
427
|
UIUtils.showItemSuccess(tableName);
|
|
@@ -493,9 +477,8 @@ var Schema = class {
|
|
|
493
477
|
filePath
|
|
494
478
|
]);
|
|
495
479
|
if (response.status != 200) {
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
continue;
|
|
480
|
+
returnFormattedError(response.status, response.message);
|
|
481
|
+
break;
|
|
499
482
|
}
|
|
500
483
|
UIUtils.showItemSuccess(seederName);
|
|
501
484
|
successCount++;
|
|
@@ -553,9 +536,8 @@ var Schema = class {
|
|
|
553
536
|
filePath
|
|
554
537
|
]);
|
|
555
538
|
if (response.status != 200) {
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
continue;
|
|
539
|
+
returnFormattedError(response.status, response.message);
|
|
540
|
+
break;
|
|
559
541
|
}
|
|
560
542
|
UIUtils.showItemSuccess(triggerName);
|
|
561
543
|
successCount++;
|
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('Database', 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 UIUtils.showItemError('Database', `Error creating: ${response.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 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 UIUtils.showItemError(tableName, `Error parsing: ${dml.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error generating queries: ${queries.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error parsing: ${dml.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error generating queries: ${queries.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(seederName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(triggerName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 maxDots: number = 40\r\n ): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n const displayName = itemName.length > 25 ?\r\n itemName.substring(0, 22) + '...' :\r\n itemName.padEnd(25);\r\n\r\n const progress = `[${current}/${total}]`.padStart(8);\r\n\r\n return new Promise((resolve) => {\r\n process.stdout.write(`${chalk.blue('├─')} ${chalk.gray(progress)} ${chalk.cyan(displayName)} `);\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 }, 15);\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(`RESUMEN DE ${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 console.log('');\r\n }\r\n}"],"mappings":"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","names":["resolve","resolve","chalk","path","summary","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 } 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"]}
|
package/dist/index.js
CHANGED
|
@@ -102,12 +102,14 @@ var UIUtils = class {
|
|
|
102
102
|
/**
|
|
103
103
|
* Shows animated progress for processing items
|
|
104
104
|
*/
|
|
105
|
-
static async showItemProgress(itemName, current, total
|
|
106
|
-
const
|
|
107
|
-
const
|
|
108
|
-
const
|
|
105
|
+
static async showItemProgress(itemName, current, total) {
|
|
106
|
+
const consoleWidth = process.stdout.columns || 80;
|
|
107
|
+
const prefix = `\u251C\u2500 ${itemName} `;
|
|
108
|
+
const suffix = ` \u2713 OK`;
|
|
109
|
+
const availableSpace = consoleWidth - prefix.length - suffix.length;
|
|
110
|
+
const maxDots = Math.max(10, availableSpace);
|
|
109
111
|
return new Promise((resolve2) => {
|
|
110
|
-
process.stdout.write(`${chalk.blue("\u251C\u2500")} ${chalk.
|
|
112
|
+
process.stdout.write(`${chalk.blue("\u251C\u2500")} ${chalk.cyan(itemName)} `);
|
|
111
113
|
let dotCount = 0;
|
|
112
114
|
const interval = setInterval(() => {
|
|
113
115
|
if (dotCount < maxDots) {
|
|
@@ -117,7 +119,7 @@ var UIUtils = class {
|
|
|
117
119
|
clearInterval(interval);
|
|
118
120
|
resolve2();
|
|
119
121
|
}
|
|
120
|
-
},
|
|
122
|
+
}, 10);
|
|
121
123
|
});
|
|
122
124
|
}
|
|
123
125
|
/**
|
|
@@ -151,7 +153,7 @@ ${chalk.cyan(icon)} ${chalk.bold.green(operationName.toUpperCase())}`);
|
|
|
151
153
|
const { startTime, totalProcessed, successCount, errorCount, processedItems, operationName, databaseName } = summary;
|
|
152
154
|
const totalTime = ((Date.now() - startTime) / 1e3).toFixed(1);
|
|
153
155
|
console.log(`
|
|
154
|
-
${chalk.cyan("\u{1F4CA}")} ${chalk.bold.green(`
|
|
156
|
+
${chalk.cyan("\u{1F4CA}")} ${chalk.bold.green(`SUMMARY OF ${operationName.toUpperCase()}`)}`);
|
|
155
157
|
console.log(chalk.gray("\u2500".repeat(60)));
|
|
156
158
|
if (successCount > 0) {
|
|
157
159
|
console.log(`${chalk.green("\u250C\u2500")} ${chalk.bold("Successful processing:")}`);
|
|
@@ -178,7 +180,6 @@ ${chalk.green("\u{1F389}")} ${chalk.bold(`${operationName} executed successfully
|
|
|
178
180
|
console.log(`
|
|
179
181
|
${chalk.yellow("\u26A0\uFE0F ")} ${chalk.bold("No items were processed.")}`);
|
|
180
182
|
}
|
|
181
|
-
console.log("");
|
|
182
183
|
}
|
|
183
184
|
};
|
|
184
185
|
|
|
@@ -193,8 +194,8 @@ var Schema = class {
|
|
|
193
194
|
async createDatabase() {
|
|
194
195
|
const startTime = Date.now();
|
|
195
196
|
const rootPath = path2.resolve(process.cwd());
|
|
196
|
-
UIUtils.showOperationHeader("CREATING DATABASE", this.name, "\u{1F5C4}\uFE0F");
|
|
197
|
-
await UIUtils.showItemProgress("
|
|
197
|
+
UIUtils.showOperationHeader(" CREATING DATABASE", this.name, "\u{1F5C4}\uFE0F");
|
|
198
|
+
await UIUtils.showItemProgress("Preparando e instalando base de datos", 1, 1);
|
|
198
199
|
try {
|
|
199
200
|
const response = await this.engine.run("schema_engine", [
|
|
200
201
|
"--action",
|
|
@@ -203,17 +204,6 @@ var Schema = class {
|
|
|
203
204
|
rootPath
|
|
204
205
|
]);
|
|
205
206
|
if (response.status != 200) {
|
|
206
|
-
UIUtils.showItemError("Database", `Error creating: ${response.message}`);
|
|
207
|
-
const summary2 = {
|
|
208
|
-
startTime,
|
|
209
|
-
totalProcessed: 0,
|
|
210
|
-
successCount: 0,
|
|
211
|
-
errorCount: 1,
|
|
212
|
-
processedItems: [],
|
|
213
|
-
operationName: "create database",
|
|
214
|
-
databaseName: this.name
|
|
215
|
-
};
|
|
216
|
-
UIUtils.showOperationSummary(summary2);
|
|
217
207
|
returnFormattedError(response.status, response.message);
|
|
218
208
|
}
|
|
219
209
|
UIUtils.showItemSuccess("Database");
|
|
@@ -276,9 +266,8 @@ var Schema = class {
|
|
|
276
266
|
filePath
|
|
277
267
|
]);
|
|
278
268
|
if (dml.status != 200) {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
continue;
|
|
269
|
+
returnFormattedError(dml.status, dml.message);
|
|
270
|
+
break;
|
|
282
271
|
}
|
|
283
272
|
const parseJson = JSON.stringify(dml.data.actions).replace(/[\r\n\t]/g, "").replace(/\\[rnt]/g, "").replace(/\s{2,}/g, " ");
|
|
284
273
|
const queries = await this.engine.run("schema_engine", [
|
|
@@ -290,9 +279,8 @@ var Schema = class {
|
|
|
290
279
|
parseJson
|
|
291
280
|
]);
|
|
292
281
|
if (queries.status != 200) {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
continue;
|
|
282
|
+
returnFormattedError(queries.status, queries.message);
|
|
283
|
+
break;
|
|
296
284
|
}
|
|
297
285
|
delete queries.data.database_type;
|
|
298
286
|
const parseJsonQueries = JSON.stringify(queries.data);
|
|
@@ -305,9 +293,8 @@ var Schema = class {
|
|
|
305
293
|
parseJsonQueries
|
|
306
294
|
]);
|
|
307
295
|
if (response.status != 200) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
continue;
|
|
296
|
+
returnFormattedError(response.status, response.message);
|
|
297
|
+
break;
|
|
311
298
|
}
|
|
312
299
|
const createQuery = queries.data.regular_queries.filter((q) => q.includes("CREATE"))[0];
|
|
313
300
|
await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);
|
|
@@ -366,9 +353,8 @@ var Schema = class {
|
|
|
366
353
|
"fresh"
|
|
367
354
|
]);
|
|
368
355
|
if (dml.status != 200) {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
continue;
|
|
356
|
+
returnFormattedError(dml.status, dml.message);
|
|
357
|
+
break;
|
|
372
358
|
}
|
|
373
359
|
const parseJson = JSON.stringify(dml.data.actions).replace(/[\r\n\t]/g, "").replace(/\\[rnt]/g, "").replace(/\s{2,}/g, " ");
|
|
374
360
|
const queries = await this.engine.run("schema_engine", [
|
|
@@ -378,9 +364,8 @@ var Schema = class {
|
|
|
378
364
|
parseJson
|
|
379
365
|
]);
|
|
380
366
|
if (queries.status != 200) {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
continue;
|
|
367
|
+
returnFormattedError(queries.status, queries.message);
|
|
368
|
+
break;
|
|
384
369
|
}
|
|
385
370
|
delete queries.data._type;
|
|
386
371
|
const createQuery = queries.data.regular_queries.filter((q) => q.includes("CREATE"))[0];
|
|
@@ -398,9 +383,8 @@ var Schema = class {
|
|
|
398
383
|
parseJsonQueries
|
|
399
384
|
]);
|
|
400
385
|
if (response.status != 200) {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
continue;
|
|
386
|
+
returnFormattedError(response.status, response.message);
|
|
387
|
+
break;
|
|
404
388
|
}
|
|
405
389
|
await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);
|
|
406
390
|
UIUtils.showItemSuccess(tableName);
|
|
@@ -456,9 +440,8 @@ var Schema = class {
|
|
|
456
440
|
filePath
|
|
457
441
|
]);
|
|
458
442
|
if (response.status != 200) {
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
continue;
|
|
443
|
+
returnFormattedError(response.status, response.message);
|
|
444
|
+
break;
|
|
462
445
|
}
|
|
463
446
|
UIUtils.showItemSuccess(seederName);
|
|
464
447
|
successCount++;
|
|
@@ -516,9 +499,8 @@ var Schema = class {
|
|
|
516
499
|
filePath
|
|
517
500
|
]);
|
|
518
501
|
if (response.status != 200) {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
continue;
|
|
502
|
+
returnFormattedError(response.status, response.message);
|
|
503
|
+
break;
|
|
522
504
|
}
|
|
523
505
|
UIUtils.showItemSuccess(triggerName);
|
|
524
506
|
successCount++;
|
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('Database', 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 UIUtils.showItemError('Database', `Error creating: ${response.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 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 UIUtils.showItemError(tableName, `Error parsing: ${dml.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error generating queries: ${queries.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error parsing: ${dml.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error generating queries: ${queries.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(tableName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(seederName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 UIUtils.showItemError(triggerName, `Error executing: ${response.message}`);\r\n errorCount++;\r\n continue;\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 maxDots: number = 40\r\n ): Promise<void> {\r\n const startTime = Date.now();\r\n\r\n const displayName = itemName.length > 25 ?\r\n itemName.substring(0, 22) + '...' :\r\n itemName.padEnd(25);\r\n\r\n const progress = `[${current}/${total}]`.padStart(8);\r\n\r\n return new Promise((resolve) => {\r\n process.stdout.write(`${chalk.blue('├─')} ${chalk.gray(progress)} ${chalk.cyan(displayName)} `);\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 }, 15);\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(`RESUMEN DE ${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 console.log('');\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","summary","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 } 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dbcube/schema-builder",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.11",
|
|
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",
|
|
@@ -55,15 +55,15 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@dbcube/core": "^1.0.5",
|
|
58
|
-
"chalk": "^5.
|
|
59
|
-
"ora": "^8.0
|
|
58
|
+
"chalk": "^5.6.0",
|
|
59
|
+
"ora": "^8.2.0"
|
|
60
60
|
},
|
|
61
61
|
"repository": {
|
|
62
62
|
"type": "git",
|
|
63
63
|
"url": "https://github.com/Dbcube/query-builder"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
|
-
"@types/node": "^24.3.
|
|
66
|
+
"@types/node": "^24.3.1",
|
|
67
67
|
"rollup": "^4.50.0",
|
|
68
68
|
"tsup": "^8.5.0",
|
|
69
69
|
"typescript": "^5.9.2"
|