@dbcube/schema-builder 1.0.9 → 1.0.10

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 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, maxDots = 40) {
143
- const startTime = Date.now();
144
- const displayName = itemName.length > 25 ? itemName.substring(0, 22) + "..." : itemName.padEnd(25);
145
- const progress = `[${current}/${total}]`.padStart(8);
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.gray(progress)} ${import_chalk.default.cyan(displayName)} `);
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
- }, 15);
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(`RESUMEN DE ${operationName.toUpperCase()}`)}`);
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:")}`);
@@ -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('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 ): 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 console.log('');\r\n }\r\n}"],"mappings":"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","names":["resolve","resolve","chalk","path","summary","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, maxDots = 40) {
106
- const startTime = Date.now();
107
- const displayName = itemName.length > 25 ? itemName.substring(0, 22) + "..." : itemName.padEnd(25);
108
- const progress = `[${current}/${total}]`.padStart(8);
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.gray(progress)} ${chalk.cyan(displayName)} `);
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
- }, 15);
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(`RESUMEN DE ${operationName.toUpperCase()}`)}`);
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:")}`);
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('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 ): 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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbcube/schema-builder",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
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",