@dbcube/schema-builder
Version:
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. Its agnostic design allows you to generate data man
1 lines • 22.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/lib/Schema.ts","../src/lib/FileUtils.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\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 const engine = new Engine(name);\r\n this.engine = engine;\r\n }\r\n\r\n async createDatabase(): Promise<any> {\r\n const rootPath = path.resolve(process.cwd());\r\n const response = await this.engine.run('schema_engine',[\r\n '--action', 'create_database',\r\n '--path', rootPath,\r\n ]);\r\n if(response.status!=200){\r\n returnFormattedError(response.status, response.message);\r\n }\r\n return response.data;\r\n }\r\n\r\n async refreshTables(): Promise<any> {\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 } else { \r\n for (const file of cubeFiles) {\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n if (stats.isFile()) {\r\n const dml = await this.engine.run('schema_engine',[\r\n '--action', 'parse_table',\r\n '--mode', 'refresh',\r\n '--schema-path', filePath,\r\n ]);\r\n if(dml.status!=200){\r\n returnFormattedError(dml.status, dml.message);\r\n }\r\n const parseJson = JSON.stringify(dml.data.actions).replace(/[\\r\\n\\t]/g, '').replace(/\\\\[rnt]/g, '').replace(/\\s{2,}/g, ' '); \r\n\r\n const queries = await this.engine.run('schema_engine',[\r\n '--action', 'generate',\r\n '--mode', 'refresh',\r\n '--dml', parseJson,\r\n ]);\r\n if(queries.status!=200){\r\n returnFormattedError(queries.status, queries.message);\r\n }\r\n delete queries.data.database_type;\r\n \r\n const parseJsonQueries = JSON.stringify(queries.data); \r\n\r\n const response = await this.engine.run('schema_engine',[\r\n '--action', 'execute',\r\n '--mode', 'refresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if(response.status!=200){\r\n returnFormattedError(response.status, response.message);\r\n }\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 return response.data;\r\n \r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n async freshTables(): Promise<any> {\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 } else { \r\n for (const file of cubeFiles) {\r\n const filePath = path.isAbsolute(file) ? file : path.join(cubesDir, file);\r\n const stats = fs.statSync(filePath);\r\n if (stats.isFile()) {\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 if(dml.status!=200){\r\n returnFormattedError(dml.status, dml.message);\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 if(queries.status!=200){\r\n returnFormattedError(queries.status, queries.message);\r\n }\r\n delete queries.data. _type;\r\n \r\n const createQuery = queries.data.regular_queries.filter((q:string) => q.includes(\"CREATE\"))[0];\r\n \r\n if(queries.data.regular_queries.length>0){\r\n const nowQueries = await TableProcessor.generateAlterQueries(queries.data.regular_queries[0], dml.data.motor, dml.data.table, dml.data.database);\r\n queries.data.regular_queries = nowQueries;\r\n }\r\n\r\n const parseJsonQueries = JSON.stringify(queries.data); \r\n\r\n const response = await this.engine.run('schema_engine',[\r\n '--action', 'execute',\r\n '--mode', 'fresh',\r\n '--dml', parseJsonQueries,\r\n ]);\r\n\r\n if(response.status!=200){\r\n returnFormattedError(response.status, response.message);\r\n }\r\n \r\n await TableProcessor.saveQuery(dml.data.table, dml.data.database, createQuery);\r\n\r\n return response.data;\r\n \r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n async executeSeeders(): Promise<any> {\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 } else { \r\n for (const file of cubeFiles) {\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\r\n const response = await this.engine.run('schema_engine',[\r\n '--action', 'seeder',\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if(response.status!=200){\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n return response.data;\r\n \r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n async executeTriggers(): Promise<any> {\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 } else { \r\n for (const file of cubeFiles) {\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\r\n const response = await this.engine.run('schema_engine',[\r\n '--action', 'trigger',\r\n '--path-exit', triggersDirExit,\r\n '--schema-path', filePath,\r\n ]);\r\n\r\n if(response.status!=200){\r\n returnFormattedError(response.status, response.message);\r\n }\r\n\r\n return response.data;\r\n \r\n }\r\n }\r\n }\r\n return 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\nexport default FileUtils;"],"mappings":"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","names":["resolve","path","fs","err"]}