@dbcube/core 1.0.7 → 1.0.8
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 +7 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -386,7 +386,7 @@ var Engine = class {
|
|
|
386
386
|
var import_better_sqlite3 = __toESM(require("better-sqlite3"));
|
|
387
387
|
var path2 = __toESM(require("path"));
|
|
388
388
|
var import_fs = __toESM(require("fs"));
|
|
389
|
-
var rootPath = path2.resolve(process.cwd(), "dbcube");
|
|
389
|
+
var rootPath = path2.resolve(process.cwd(), ".dbcube");
|
|
390
390
|
var SQLite = class {
|
|
391
391
|
db = null;
|
|
392
392
|
database;
|
|
@@ -397,6 +397,9 @@ var SQLite = class {
|
|
|
397
397
|
if (this.database) {
|
|
398
398
|
const dbPath = this.database || ":memory:";
|
|
399
399
|
const configPath = path2.join(rootPath, dbPath + ".db");
|
|
400
|
+
if (!import_fs.default.existsSync(rootPath)) {
|
|
401
|
+
import_fs.default.mkdirSync(rootPath, { recursive: true });
|
|
402
|
+
}
|
|
400
403
|
if (import_fs.default.existsSync(configPath)) {
|
|
401
404
|
return true;
|
|
402
405
|
}
|
|
@@ -409,6 +412,9 @@ var SQLite = class {
|
|
|
409
412
|
if (!this.db) {
|
|
410
413
|
const dbPath = this.database || ":memory:";
|
|
411
414
|
const configPath = path2.join(rootPath, dbPath + ".db");
|
|
415
|
+
if (!import_fs.default.existsSync(rootPath)) {
|
|
416
|
+
import_fs.default.mkdirSync(rootPath, { recursive: true });
|
|
417
|
+
}
|
|
412
418
|
this.db = new import_better_sqlite3.default(configPath);
|
|
413
419
|
}
|
|
414
420
|
resolve2(this.db);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/Engine.ts","../src/lib/Arquitecture.ts","../src/lib/Binary.ts","../src/lib/Config.ts","../src/lib/DbConfig.ts","../src/lib/FileLogger.ts","../src/lib/Processors.ts"],"sourcesContent":["import { Engine } from './lib/Engine';\r\nimport { Arquitecture } from './lib/Arquitecture';\r\nimport { Binary } from './lib/Binary';\r\nimport { DbConfig } from './lib/DbConfig';\r\nimport { Config } from './lib/Config';\r\nimport { FileLogger, InterceptController } from './lib/FileLogger';\r\nimport { ComputedFieldProcessor, TableProcessor, TriggerProcessor } from './lib/Processors';\r\n\r\nexport { Config, Engine, Arquitecture, Binary, DbConfig, ComputedFieldProcessor, TableProcessor, TriggerProcessor, FileLogger, InterceptController };\r\n","import path from \"path\";\r\nimport { Binary } from \"./Binary\";\r\nimport { Config as ConfigClass } from './Config';\r\nimport { spawn } from \"child_process\";\r\nimport { ProcessResponse, ResponseEngine } from \"../@types/Engine\";\r\nimport { BinaryType } from \"../@types/Binary\";\r\n\r\nclass Engine {\r\n private name: string;\r\n private config: any;\r\n private arguments: any;\r\n private binary: BinaryType;\r\n private timeout: number;\r\n\r\n constructor(name: string, timeout = 30000) {\r\n this.name = name;\r\n this.config = this.setConfig(name);\r\n const binary: BinaryType = Binary.get();\r\n this.binary = {\r\n query_engine: path.resolve(__dirname, '../bin', binary.query_engine),\r\n schema_engine: path.resolve(__dirname, '../bin', binary.schema_engine),\r\n }\r\n this.arguments = this.setArguments();\r\n this.timeout = timeout;\r\n }\r\n\r\n setArguments() {\r\n let args = [];\r\n if (this.config.type == 'sqlite') {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE + \".db\",\r\n '--motor', this.config.type\r\n ];\r\n } else {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE,\r\n '--host', this.config.config.HOST,\r\n '--port', this.config.config.PORT,\r\n '--user', this.config.config.USER,\r\n '--password', this.config.config.PASSWORD,\r\n '--motor', this.config.type\r\n ];\r\n }\r\n return args;\r\n }\r\n\r\n setConfig(name: string) {\r\n const configInstance = new ConfigClass();\r\n\r\n const configFilePath = path.resolve(process.cwd(), 'dbcube.config.js');\r\n const configFn = require(configFilePath);\r\n\r\n if (typeof configFn === 'function') {\r\n configFn(configInstance);\r\n } else {\r\n console.error('❌ El archivo dbcube.config.js no exporta una función.');\r\n }\r\n\r\n return configInstance.getDatabase(name);\r\n\r\n }\r\n\r\n getConfig() {\r\n return this.config;\r\n }\r\n\r\n async run(binary: string, args: []) {\r\n return new Promise<ResponseEngine>((resolve, reject) => {\r\n const child = spawn(this.binary[binary as keyof BinaryType], [...this.arguments, ...args]);\r\n\r\n let stdoutBuffer = '';\r\n let stderrBuffer = '';\r\n let isResolved = false;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n child.kill();\r\n reject(new Error('Process timeout'));\r\n }\r\n }, this.timeout);\r\n\r\n const resolveOnce = (response: ResponseEngine) => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n clearTimeout(timeoutId);\r\n resolve(response);\r\n }\r\n };\r\n\r\n child.stdout.on('data', (data) => {\r\n stdoutBuffer += data.toString();\r\n // console.log(stdoutBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stdoutBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n child.stderr.on('data', (data) => {\r\n stderrBuffer += data.toString();\r\n // console.log(stderrBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stderrBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n\r\n child.on('close', (code) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: code === 0 ? 200 : 500,\r\n message: code === 0 ? 'Process completed' : `Process exited with code ${code}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.on('error', (error) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: 500,\r\n message: `Process error: ${error.message}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.unref();\r\n });\r\n }\r\n}\r\n\r\nexport { Engine }","import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\"\r\n\r\nclass Binary{\r\n static get(): BinaryType{\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform(); \r\n const architecture = arch.getArchitecture(); \r\n switch(platform){\r\n case \"windows\":\r\n if(architecture==\"x86_64\"){\r\n return {\r\n query_engine: \"query-engine-windows-x64.exe\",\r\n schema_engine: \"schema-engine-windows-x64.exe\"\r\n };\r\n }\r\n break;\r\n }\r\n return {\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n}\r\n\r\nexport { Binary }","/**\r\n * Tipo para la configuración de una base de datos\r\n */\r\ntype DatabaseConfig = Record<string, any>;\r\n\r\n/**\r\n * Tipo para la configuración general del ORM\r\n */\r\ninterface ConfigData {\r\n [key: string]: any;\r\n databases?: Record<string, DatabaseConfig>;\r\n}\r\n\r\n/**\r\n * Clase para manejar la configuración del ORM\r\n */\r\nexport class Config {\r\n private data: ConfigData = {};\r\n private databases: Record<string, DatabaseConfig> = {};\r\n\r\n /**\r\n * Establece la configuración\r\n * @param configData - Datos de configuración\r\n */\r\n set(configData: ConfigData): void {\r\n this.data = configData;\r\n\r\n if (configData.databases) {\r\n this.databases = configData.databases;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor de configuración\r\n * @param key - Clave de configuración\r\n * @returns Valor de configuración\r\n */\r\n get<T = any>(key: string): T {\r\n return this.data[key];\r\n }\r\n\r\n /**\r\n * Obtiene la configuración de una base de datos específica\r\n * @param dbName - Nombre de la base de datos\r\n * @returns Configuración de la base de datos o null\r\n */\r\n getDatabase(dbName: string): DatabaseConfig | null {\r\n return this.databases[dbName] || null;\r\n }\r\n\r\n /**\r\n * Obtiene todas las bases de datos configuradas\r\n * @returns Todas las configuraciones de bases de datos\r\n */\r\n getAllDatabases(): Record<string, DatabaseConfig> {\r\n return this.databases;\r\n }\r\n}\r\n\r\nexport default Config;\r\n","import Database from 'better-sqlite3';\r\nimport * as path from 'path';\r\nimport fs from 'fs';\r\n\r\nconst rootPath = path.resolve(process.cwd(), 'dbcube');\r\n\r\ninterface DatabaseConfig {\r\n name?: string;\r\n HOST?: string;\r\n USER?: string;\r\n PASSWORD?: string;\r\n DATABASE?: string;\r\n PORT?: number;\r\n}\r\n\r\ninterface QueryResult {\r\n status: 'success' | 'error';\r\n message: string;\r\n data: any | null;\r\n}\r\n\r\ninterface RunResult {\r\n changes: number;\r\n lastID: number;\r\n}\r\n\r\ninterface ParametrizedQueryResult {\r\n query: string;\r\n parameters: any[];\r\n}\r\n\r\nclass SQLite {\r\n private db: Database.Database | null = null;\r\n private database?: string;\r\n \r\n constructor(config: DatabaseConfig) {\r\n this.database = config.DATABASE;\r\n }\r\n\r\n ifExist(): Boolean {\r\n if (this.database) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n if (fs.existsSync(configPath)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n async connect(): Promise<Database.Database> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n if (!this.db) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n \r\n this.db = new Database(configPath);\r\n }\r\n resolve(this.db);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.db) {\r\n this.db.close();\r\n this.db = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n async query(sqlQuery: string): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const sqlCommands = sqlQuery.split(';').filter(cmd => cmd.trim().length > 0);\r\n const results: any[] = [];\r\n \r\n for (const command of sqlCommands) {\r\n const query = `${command};`;\r\n const isSelect = query.trim().toLowerCase().startsWith('select');\r\n \r\n if (isSelect) {\r\n const stmt = this.db.prepare(query);\r\n const rows = stmt.all();\r\n results.push(rows);\r\n } else {\r\n const stmt = this.db.prepare(query);\r\n const result = stmt.run();\r\n results.push({ \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n });\r\n }\r\n }\r\n \r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: results.length === 1 ? results[0] : results,\r\n });\r\n } catch (error) {\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n async queryWithParameters(sqlQuery: string, params: any[] = []): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!Array.isArray(params)) {\r\n throw new Error('Parameters must be an array.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const isSelect = sqlQuery.trim().toLowerCase().startsWith('select');\r\n const stmt = this.db.prepare(sqlQuery);\r\n \r\n if (isSelect) {\r\n const rows = stmt.all(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: rows,\r\n });\r\n } else {\r\n const result = stmt.run(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: { \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n },\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n convertToParameterizedQuery(sql: string): ParametrizedQueryResult {\r\n const normalizedSql = sql.replace(/\\s+/g, ' ').trim();\r\n \r\n const baseQueryMatch = normalizedSql.match(/^(.+?)\\s+VALUES\\s*\\(/i);\r\n if (!baseQueryMatch) {\r\n throw new Error('No se pudo encontrar la estructura VALUES en la consulta');\r\n }\r\n \r\n const baseQuery = baseQueryMatch[1];\r\n \r\n const valuesStartIndex = normalizedSql.toUpperCase().indexOf('VALUES');\r\n const valuesSection = normalizedSql.substring(valuesStartIndex);\r\n const valuesMatch = valuesSection.match(/VALUES\\s*\\((.+)\\)\\s*;?\\s*$/i);\r\n if (!valuesMatch) {\r\n throw new Error('No se pudieron extraer los valores de la consulta');\r\n }\r\n \r\n const valuesString = valuesMatch[1];\r\n \r\n function parseValues(str: string): any[] {\r\n const values: any[] = [];\r\n let currentValue = '';\r\n let inQuotes = false;\r\n let quoteChar = '';\r\n let inCompute = false;\r\n let computeDepth = 0;\r\n \r\n for (let i = 0; i < str.length; i++) {\r\n const char = str[i];\r\n const prevChar = str[i - 1];\r\n \r\n if (!inQuotes && str.substring(i, i + 8) === '@compute') {\r\n inCompute = true;\r\n }\r\n \r\n if (inCompute && char === '(') {\r\n computeDepth++;\r\n } else if (inCompute && char === ')') {\r\n computeDepth--;\r\n if (computeDepth === 0) {\r\n inCompute = false;\r\n }\r\n }\r\n \r\n if (!inCompute && (char === '\"' || char === \"'\") && prevChar !== '\\\\') {\r\n if (!inQuotes) {\r\n inQuotes = true;\r\n quoteChar = char;\r\n } else if (char === quoteChar) {\r\n if (str[i + 1] === quoteChar) {\r\n currentValue += char + char;\r\n i++;\r\n continue;\r\n } else {\r\n inQuotes = false;\r\n quoteChar = '';\r\n }\r\n }\r\n }\r\n \r\n if (!inQuotes && !inCompute && char === ',') {\r\n values.push(cleanValue(currentValue.trim()));\r\n currentValue = '';\r\n continue;\r\n }\r\n \r\n currentValue += char;\r\n }\r\n \r\n if (currentValue.trim()) {\r\n values.push(cleanValue(currentValue.trim()));\r\n }\r\n \r\n return values;\r\n }\r\n \r\n function cleanValue(value: string): any {\r\n value = value.trim();\r\n \r\n if (value.startsWith('@compute')) {\r\n return value;\r\n }\r\n \r\n if ((value.startsWith('\"') && value.endsWith('\"')) || \r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n value = value.replace(/''/g, \"'\").replace(/\"\"/g, '\"');\r\n }\r\n \r\n return value;\r\n }\r\n \r\n const parameters = parseValues(valuesString);\r\n const placeholders = parameters.map(() => '?').join(', ');\r\n const parametrizedQuery = `${baseQuery} VALUES (${placeholders});`;\r\n \r\n return {\r\n query: parametrizedQuery,\r\n parameters: parameters\r\n };\r\n }\r\n}\r\n\r\nexport const DbConfig = new SQLite({DATABASE: \"config\"});\r\nexport default DbConfig;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { EventEmitter } from 'events';\r\n\r\ninterface InterceptOptions {\r\n interceptLog?: boolean;\r\n interceptError?: boolean;\r\n interceptWarn?: boolean;\r\n keepOriginal?: boolean;\r\n useBuffer?: boolean;\r\n}\r\n\r\ninterface ReadOptions {\r\n lines?: number | null;\r\n fromEnd?: boolean;\r\n asArray?: boolean;\r\n}\r\n\r\ninterface WatchOptions {\r\n persistent?: boolean;\r\n interval?: number;\r\n fromEnd?: boolean;\r\n}\r\n\r\ninterface WatchController {\r\n id: string;\r\n stop: () => void;\r\n isWatching: () => boolean;\r\n}\r\n\r\nexport interface InterceptController {\r\n restore: () => void;\r\n commit: () => Promise<boolean>;\r\n discard: () => number;\r\n hasBuffer: () => boolean;\r\n getBufferSize: () => number;\r\n}\r\n\r\ninterface DeleteResult {\r\n filePath: string;\r\n deleted: boolean;\r\n error: string | null;\r\n}\r\n\r\ntype LogLevel = 'INFO' | 'ERROR' | 'WARN' | 'DEBUG';\r\n\r\nexport class FileLogger extends EventEmitter {\r\n private static watchers = new Map<string, (curr: fs.Stats, prev: fs.Stats) => void>(); // Store listener functions\r\n private static buffers = new Map<string, string[]>();\r\n \r\n /**\r\n * Escribe un log en el archivo especificado\r\n * @param filePath - Ruta del archivo de log\r\n * @param message - Mensaje a escribir\r\n * @param level - Nivel del log (INFO, ERROR, WARN, DEBUG)\r\n * @param append - Si debe agregar al final del archivo (default: true)\r\n */\r\n static async write(filePath: string, message: string, level: LogLevel = 'INFO', append: boolean = true): Promise<boolean> {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Formatear el mensaje con timestamp\r\n const timestamp = new Date().toISOString();\r\n const formattedMessage = `[${timestamp}] [${level}] ${message}\\n`;\r\n \r\n // Si existe un buffer para este archivo, agregarlo al buffer en lugar de escribir directamente\r\n if (FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.get(filePath)!.push(formattedMessage);\r\n return true;\r\n }\r\n \r\n // Escribir al archivo normalmente\r\n if (append) {\r\n await fs.promises.appendFile(filePath, formattedMessage, 'utf8');\r\n } else {\r\n await fs.promises.writeFile(filePath, formattedMessage, 'utf8');\r\n }\r\n \r\n return true;\r\n } catch (error) {\r\n console.error('Error escribiendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Inicia un buffer temporal para un archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static startBuffer(filePath: string): void {\r\n if (!FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.set(filePath, []);\r\n }\r\n }\r\n \r\n /**\r\n * Confirma y escribe todos los logs del buffer al archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static async commitBuffer(filePath: string): Promise<boolean> {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n if (buffer && buffer.length > 0) {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Escribir todos los logs del buffer\r\n const content = buffer.join('');\r\n await fs.promises.appendFile(filePath, content, 'utf8');\r\n \r\n // Limpiar el buffer\r\n FileLogger.buffers.delete(filePath);\r\n return true;\r\n } catch (error) {\r\n console.error('Error confirmando buffer:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n // Limpiar el buffer aunque esté vacío\r\n FileLogger.buffers.delete(filePath);\r\n return false;\r\n }\r\n \r\n /**\r\n * Descarta todos los logs del buffer sin escribirlos\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static discardBuffer(filePath: string): number {\r\n if (FileLogger.buffers.has(filePath)) {\r\n const discardedCount = FileLogger.buffers.get(filePath)!.length;\r\n FileLogger.buffers.delete(filePath);\r\n return discardedCount;\r\n }\r\n return 0;\r\n }\r\n \r\n /**\r\n * Verifica si existe un buffer activo para un archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static hasBuffer(filePath: string): boolean {\r\n return FileLogger.buffers.has(filePath);\r\n }\r\n \r\n /**\r\n * Obtiene el número de logs en el buffer\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static getBufferSize(filePath: string): number {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n return buffer ? buffer.length : 0;\r\n }\r\n \r\n /**\r\n * Intercepta console.log y console.error para escribir a archivo\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de interceptación\r\n */\r\n static interceptConsole(filePath: string, options: InterceptOptions = {}): InterceptController {\r\n const {\r\n interceptLog = true,\r\n interceptError = true,\r\n interceptWarn = true,\r\n keepOriginal = true, // Mantener el comportamiento original de console\r\n useBuffer = false // Usar buffer temporal\r\n } = options;\r\n \r\n // Iniciar buffer si se solicita\r\n if (useBuffer) {\r\n FileLogger.startBuffer(filePath);\r\n }\r\n \r\n // Guardar referencias originales\r\n const originalLog = console.log;\r\n const originalError = console.error;\r\n const originalWarn = console.warn;\r\n \r\n if (interceptLog) {\r\n console.log = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'INFO').catch(err => {\r\n originalError('Error escribiendo log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalLog.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptError) {\r\n console.error = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'ERROR').catch(err => {\r\n originalError('Error escribiendo error log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalError.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptWarn) {\r\n console.warn = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'WARN').catch(err => {\r\n originalError('Error escribiendo warn log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalWarn.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n // Retornar función para restaurar console original\r\n return {\r\n restore: () => {\r\n if (interceptLog) console.log = originalLog;\r\n if (interceptError) console.error = originalError;\r\n if (interceptWarn) console.warn = originalWarn;\r\n },\r\n commit: async () => {\r\n if (useBuffer) {\r\n return await FileLogger.commitBuffer(filePath);\r\n }\r\n return false;\r\n },\r\n discard: () => {\r\n if (useBuffer) {\r\n return FileLogger.discardBuffer(filePath);\r\n }\r\n return 0;\r\n },\r\n hasBuffer: () => FileLogger.hasBuffer(filePath),\r\n getBufferSize: () => FileLogger.getBufferSize(filePath)\r\n };\r\n }\r\n \r\n /**\r\n * Lee el contenido completo del archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de lectura\r\n * @returns Contenido del archivo\r\n */\r\n static async read(filePath: string, options: ReadOptions = {}): Promise<string | string[]> {\r\n const { \r\n lines = null, // Número de líneas a leer (null = todas)\r\n fromEnd = false, // Si debe leer desde el final\r\n asArray = false // Si debe retornar como array de líneas\r\n } = options;\r\n \r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return asArray ? [] : '';\r\n }\r\n \r\n let content = await fs.promises.readFile(filePath, 'utf8');\r\n \r\n if (asArray) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n \r\n if (lines !== null) {\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n }\r\n \r\n return linesArray;\r\n }\r\n \r\n // Si se especifica número de líneas y no es array\r\n if (lines !== null) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n content = linesArray.join('\\n');\r\n }\r\n \r\n return content;\r\n } catch (error) {\r\n console.error('Error leyendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Observa un archivo de log en tiempo real\r\n * @param filePath - Ruta del archivo de log\r\n * @param callback - Función callback para nuevas líneas\r\n * @param options - Opciones del watcher\r\n * @returns Objeto con métodos para controlar el watcher\r\n */\r\n static watch(filePath: string, callback: (line: string, filePath: string) => void, options: WatchOptions = {}): WatchController {\r\n const {\r\n persistent = true,\r\n interval = 100,\r\n fromEnd = true // Empezar desde el final del archivo\r\n } = options;\r\n \r\n let lastSize = 0;\r\n let lastPosition = 0;\r\n \r\n // Inicializar posición si el archivo ya existe\r\n if (fs.existsSync(filePath)) {\r\n const stats = fs.statSync(filePath);\r\n lastSize = stats.size;\r\n lastPosition = fromEnd ? stats.size : 0;\r\n }\r\n \r\n // Fixed: Correct listener function signature for fs.watchFile\r\n const listener = async (curr: fs.Stats, prev: fs.Stats) => {\r\n try {\r\n if (curr.size > lastSize) {\r\n // El archivo ha crecido\r\n const stream = fs.createReadStream(filePath, {\r\n start: lastPosition,\r\n end: curr.size - 1,\r\n encoding: 'utf8'\r\n });\r\n \r\n let buffer = '';\r\n \r\n stream.on('data', (chunk) => {\r\n buffer += chunk;\r\n const lines = buffer.split('\\n');\r\n \r\n // Procesar líneas completas\r\n for (let i = 0; i < lines.length - 1; i++) {\r\n if (lines[i].trim()) {\r\n callback(lines[i].trim(), filePath);\r\n }\r\n }\r\n \r\n // Guardar la línea incompleta\r\n buffer = lines[lines.length - 1];\r\n });\r\n \r\n stream.on('end', () => {\r\n // Procesar la última línea si existe\r\n if (buffer.trim()) {\r\n callback(buffer.trim(), filePath);\r\n }\r\n });\r\n \r\n lastSize = curr.size;\r\n lastPosition = curr.size;\r\n }\r\n } catch (error) {\r\n console.error('Error en watcher:', error);\r\n }\r\n };\r\n \r\n // Watcher para cambios en el archivo\r\n fs.watchFile(filePath, { persistent, interval }, listener);\r\n \r\n // Guardar referencia del watcher\r\n const watcherId = `${filePath}_${Date.now()}`;\r\n // Store listener reference for cleanup\r\n FileLogger.watchers.set(watcherId, listener as any);\r\n \r\n // Retornar objeto de control\r\n return {\r\n id: watcherId,\r\n stop: () => {\r\n const storedListener = FileLogger.watchers.get(watcherId);\r\n if (storedListener) {\r\n fs.unwatchFile(filePath, storedListener);\r\n FileLogger.watchers.delete(watcherId);\r\n }\r\n },\r\n isWatching: () => FileLogger.watchers.has(watcherId)\r\n };\r\n }\r\n \r\n /**\r\n * Detiene todos los watchers activos\r\n */\r\n static stopAllWatchers(): void {\r\n for (const [watcherId] of FileLogger.watchers) {\r\n const filePath = watcherId.split('_')[0];\r\n fs.unwatchFile(filePath);\r\n }\r\n FileLogger.watchers.clear();\r\n }\r\n \r\n /**\r\n * Métodos de conveniencia para diferentes niveles de log\r\n */\r\n static async info(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'INFO');\r\n }\r\n \r\n static async error(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'ERROR');\r\n }\r\n \r\n static async warn(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'WARN');\r\n }\r\n \r\n static async debug(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'DEBUG');\r\n }\r\n \r\n /**\r\n * Limpia logs antiguos\r\n * @param filePath - Ruta del archivo de log\r\n * @param maxLines - Máximo número de líneas a mantener\r\n */\r\n static async cleanup(filePath: string, maxLines: number = 1000): Promise<number> {\r\n try {\r\n const lines = await this.read(filePath, { asArray: true }) as string[];\r\n \r\n if (lines.length > maxLines) {\r\n const keepLines = lines.slice(-maxLines);\r\n const content = keepLines.join('\\n') + '\\n';\r\n await fs.promises.writeFile(filePath, content, 'utf8');\r\n return lines.length - maxLines; // Líneas eliminadas\r\n }\r\n \r\n return 0;\r\n } catch (error) {\r\n console.error('Error limpiando logs:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina un archivo de log\r\n * @param filePath - Ruta del archivo de log a eliminar\r\n */\r\n static async deleteLogFile(filePath: string): Promise<boolean> {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n await fs.promises.unlink(filePath);\r\n return true;\r\n }\r\n return false;\r\n } catch (error) {\r\n console.error('Error eliminando archivo de log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina múltiples archivos de log\r\n * @param filePaths - Array de rutas de archivos de log a eliminar\r\n */\r\n static async deleteLogFiles(filePaths: string[]): Promise<DeleteResult[]> {\r\n const results: DeleteResult[] = [];\r\n \r\n for (const filePath of filePaths) {\r\n try {\r\n const deleted = await this.deleteLogFile(filePath);\r\n results.push({ filePath, deleted, error: null });\r\n } catch (error) {\r\n results.push({ filePath, deleted: false, error: (error as Error).message });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n}\r\n\r\nexport default FileLogger;","import { ComputedFieldConfig, DataObject, DataType } from \"../@types/DataObject\";\r\nimport { Column, DatabaseType, TableSchema } from \"../@types/Processor\";\r\nimport DbConfig from \"./DbConfig\";\r\n\r\nexport class ComputedFieldProcessor {\r\n\r\n static async getComputedFields(name: string): Promise<any[]> {\r\n let computedFields = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_computes_config WHERE database_ref='${name}'`);\r\n computedFields = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n computedFields = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n computedFields = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return computedFields;\r\n }\r\n\r\n /**\r\n * Processes computed field instruction and returns the computed value\r\n * @param instruction - The @compute instruction\r\n * @param rowData - The row data containing column values\r\n * @returns The computed value or null if there's an error\r\n */\r\n static processInstruction(instruction: string, rowData: Record<string, any>): any {\r\n try {\r\n // Remove @compute wrapper and extract the function content\r\n const functionMatch = instruction.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*{([\\s\\S]*?)}\\s*\\)/);\r\n\r\n if (!functionMatch) {\r\n throw new Error('Invalid @compute instruction format');\r\n }\r\n\r\n let functionBody: string = functionMatch[1].trim();\r\n\r\n // Clean up the function body - remove trailing semicolon if present\r\n if (functionBody.endsWith(';')) {\r\n functionBody = functionBody.slice(0, -1).trim();\r\n }\r\n\r\n // Replace @column(columnName) with actual values\r\n functionBody = functionBody.replace(/@column\\(([^)]+)\\)/g, (_match, columnName: string) => {\r\n const cleanColumnName = columnName.trim().replace(/['\"]/g, '');\r\n const value = rowData[cleanColumnName];\r\n\r\n if (value === null || value === undefined) {\r\n return 'null';\r\n } else if (typeof value === 'string') {\r\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\r\n } else if (typeof value === 'number' || typeof value === 'boolean') {\r\n return value.toString();\r\n } else if (value instanceof Date) {\r\n return `new Date(\"${value.toISOString()}\")`;\r\n } else {\r\n return JSON.stringify(value);\r\n }\r\n });\r\n\r\n // Create and execute the function\r\n const computeFunction = new Function(functionBody);\r\n return computeFunction();\r\n } catch (error) {\r\n console.error('Error processing computed field:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extracts column dependencies from a computed field instruction\r\n * @param instruction - The @compute instruction\r\n * @returns Array of column names that this computed field depends on\r\n */\r\n static extractDependencies(instruction: string): string[] {\r\n const dependencies: string[] = [];\r\n const columnMatches = instruction.match(/@column\\(([^)]+)\\)/g);\r\n\r\n if (columnMatches) {\r\n for (const match of columnMatches) {\r\n const innerMatch = match.match(/@column\\(([^)]+)\\)/);\r\n if (innerMatch) {\r\n const columnName = innerMatch[1].trim().replace(/['\"]/g, '');\r\n if (!dependencies.includes(columnName)) {\r\n dependencies.push(columnName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return dependencies;\r\n }\r\n\r\n /**\r\n * Adds computed fields to an array of data objects based on configuration array\r\n * @param data - Array of data objects\r\n * @param computedConfigs - Array of computed field configurations\r\n * @returns Array with the new computed fields added\r\n */\r\n static computedFields<T extends DataObject>(\r\n data: T[],\r\n computedConfigs: ComputedFieldConfig[]\r\n ): T[] {\r\n\r\n return data.map((item, index) => {\r\n let processedItem: any = { ...item };\r\n\r\n // Procesar cada configuración de campo computado\r\n computedConfigs.forEach((config) => {\r\n try {\r\n const { column: fieldName, type, instruction } = config;\r\n\r\n // Reemplazar @column(fieldName) con el valor real del objeto\r\n let processedExpression = instruction.replace(\r\n /@column\\(([^)]+)\\)/g,\r\n (match, columnName) => {\r\n // Remover comillas si las tiene\r\n const cleanColumnName = columnName.replace(/['\"]/g, '');\r\n const value = processedItem[cleanColumnName];\r\n\r\n // Convertir el valor a string seguro para la evaluación\r\n if (typeof value === 'string') {\r\n return `\"${value}\"`;\r\n } else if (value === null || value === undefined) {\r\n return 'null';\r\n } else {\r\n return String(value);\r\n }\r\n }\r\n );\r\n\r\n // Extraer la función dentro de @compute\r\n const computeMatch = processedExpression.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*\\{(.*)\\}\\s*\\)/s);\r\n if (!computeMatch) {\r\n throw new Error(`Formato de @compute inválido para campo ${fieldName}`);\r\n }\r\n\r\n const functionBody = computeMatch[1];\r\n\r\n // Crear y ejecutar la función\r\n const computeFunction = new Function(functionBody);\r\n let result = computeFunction();\r\n\r\n // Aplicar conversión de tipo\r\n result = convertToType(result, type as DataType);\r\n\r\n // Agregar el nuevo campo al objeto procesado\r\n processedItem[fieldName] = result;\r\n\r\n } catch (error) {\r\n console.error(`Error procesando campo ${config.column} en item ${index}:`, error);\r\n // En caso de error, asignar null al campo\r\n processedItem[config.column] = null;\r\n }\r\n });\r\n\r\n return processedItem;\r\n });\r\n }\r\n}\r\n\r\nexport class TableProcessor {\r\n static async generateAlterQueries(\r\n nowQuery: string,\r\n dbType: DatabaseType,\r\n tableName: string,\r\n database_ref: string,\r\n ): Promise<string[]> {\r\n function parseCreateTableQuery(query: string, dbType: DatabaseType): TableSchema {\r\n // Limpiar y normalizar la query\r\n const cleanQuery = query.trim().replace(/\\s+/g, ' ');\r\n\r\n // Extraer el nombre de la tabla\r\n const tableNameMatch = cleanQuery.match(/CREATE TABLE (?:IF NOT EXISTS )?(\\w+)/i);\r\n if (!tableNameMatch) {\r\n throw new Error('No se pudo extraer el nombre de la tabla');\r\n }\r\n\r\n const tableName = tableNameMatch[1];\r\n\r\n // Extraer las definiciones de columnas\r\n const columnsMatch = cleanQuery.match(/\\((.+)\\)/);\r\n if (!columnsMatch) {\r\n throw new Error('No se pudieron extraer las definiciones de columnas');\r\n }\r\n\r\n const columnsString = columnsMatch[1];\r\n const columnDefinitions = columnsString.split(',').map(def => def.trim());\r\n\r\n const columns: Column[] = [];\r\n\r\n for (const def of columnDefinitions) {\r\n // Skip constraints that aren't column definitions\r\n if (def.toUpperCase().startsWith('PRIMARY KEY') ||\r\n def.toUpperCase().startsWith('FOREIGN KEY') ||\r\n def.toUpperCase().startsWith('CONSTRAINT')) {\r\n continue;\r\n }\r\n\r\n const parts = def.split(/\\s+/);\r\n if (parts.length < 2) continue;\r\n\r\n const columnName = parts[0];\r\n const columnType = parts[1];\r\n\r\n const column: Column = {\r\n name: columnName,\r\n type: columnType,\r\n nullable: !def.toUpperCase().includes('NOT NULL'),\r\n primaryKey: def.toUpperCase().includes('PRIMARY KEY'),\r\n autoIncrement: def.toUpperCase().includes('AUTOINCREMENT') || def.toUpperCase().includes('AUTO_INCREMENT')\r\n };\r\n\r\n columns.push(column);\r\n }\r\n\r\n return { tableName, columns };\r\n }\r\n\r\n function generateMySQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // Modificar columna existente\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${columnDef};`);\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generatePostgreSQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'postgres');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // PostgreSQL requiere comandos separados para diferentes modificaciones\r\n if (column.type !== oldColumn.type) {\r\n const pgType = column.type.replace('INTEGER', 'INT').replace('TEXT', 'VARCHAR');\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} TYPE ${pgType};`);\r\n }\r\n\r\n if (column.nullable !== oldColumn.nullable) {\r\n const constraint = column.nullable ? 'DROP NOT NULL' : 'SET NOT NULL';\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} ${constraint};`);\r\n }\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generateSQLiteQueries(\r\n nowSchema: TableSchema,\r\n oldSchema: TableSchema,\r\n tableName: string\r\n ): string[] {\r\n // SQLite no soporta DROP COLUMN directamente, necesitamos recrear la tabla\r\n const queries: string[] = [];\r\n\r\n // Verificar si hay diferencias\r\n if (schemasEqual(nowSchema, oldSchema)) {\r\n return queries; // No hay cambios\r\n }\r\n\r\n const tempTableName = `${tableName}_temp_${Date.now()}`;\r\n\r\n // 1. Crear tabla temporal con el nuevo esquema\r\n const createTempQuery = buildCreateTableQuery(nowSchema, 'sqlite', tempTableName);\r\n queries.push(createTempQuery);\r\n\r\n // 2. Copiar datos compatibles\r\n const commonColumns = nowSchema.columns\r\n .filter(col => oldSchema.columns.some(oldCol => oldCol.name.toLowerCase() === col.name.toLowerCase()))\r\n .map(col => col.name);\r\n\r\n if (commonColumns.length > 0) {\r\n const columnsList = commonColumns.join(', ');\r\n queries.push(`INSERT INTO ${tempTableName} (${columnsList}) SELECT ${columnsList} FROM ${tableName};`);\r\n }\r\n\r\n // 3. Eliminar tabla original\r\n queries.push(`DROP TABLE ${tableName};`);\r\n\r\n // 4. Renombrar tabla temporal\r\n queries.push(`ALTER TABLE ${tempTableName} RENAME TO ${tableName};`);\r\n\r\n return queries;\r\n }\r\n\r\n function generateMongoDBQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n collectionName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Campos a eliminar\r\n const fieldsToRemove: string[] = [];\r\n for (const [fieldName] of oldColumns) {\r\n if (!nowColumns.has(fieldName)) {\r\n fieldsToRemove.push(fieldName);\r\n }\r\n }\r\n\r\n if (fieldsToRemove.length > 0) {\r\n const unsetFields = fieldsToRemove.reduce((acc, field) => {\r\n acc[field] = \"\";\r\n return acc;\r\n }, {} as Record<string, string>);\r\n\r\n queries.push(`db.${collectionName}.updateMany({}, { $unset: ${JSON.stringify(unsetFields)} });`);\r\n }\r\n\r\n // Campos a agregar (con valores por defecto)\r\n const fieldsToAdd: Record<string, any> = {};\r\n for (const [fieldName, column] of nowColumns) {\r\n if (!oldColumns.has(fieldName)) {\r\n // Valor por defecto según el tipo\r\n let defaultValue: any = null;\r\n if (!column.nullable) {\r\n switch (column.type.toUpperCase()) {\r\n case 'INTEGER':\r\n defaultValue = 0;\r\n break;\r\n case 'TEXT':\r\n case 'VARCHAR':\r\n defaultValue = '';\r\n break;\r\n default:\r\n defaultValue = null;\r\n }\r\n }\r\n fieldsToAdd[fieldName] = defaultValue;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldsToAdd).length > 0) {\r\n queries.push(`db.${collectionName}.updateMany({}, { $set: ${JSON.stringify(fieldsToAdd)} });`);\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function buildColumnDefinition(column: Column, dbType: DatabaseType): string {\r\n let def = `${column.name} ${column.type}`;\r\n\r\n if (column.primaryKey) {\r\n def += ' PRIMARY KEY';\r\n }\r\n\r\n if (column.autoIncrement) {\r\n if (dbType === 'mysql') {\r\n def += ' AUTO_INCREMENT';\r\n } else if (dbType === 'sqlite') {\r\n def += ' AUTOINCREMENT';\r\n } else if (dbType === 'postgres') {\r\n def = def.replace(column.type, 'SERIAL');\r\n }\r\n }\r\n\r\n if (!column.nullable) {\r\n def += ' NOT NULL';\r\n }\r\n\r\n return def;\r\n }\r\n\r\n function buildCreateTableQuery(schema: TableSchema, dbType: DatabaseType, tableName?: string): string {\r\n const name = tableName || schema.tableName;\r\n const columnDefs = schema.columns.map(col => buildColumnDefinition(col, dbType));\r\n return `CREATE TABLE ${name} (${columnDefs.join(', ')});`;\r\n }\r\n\r\n function columnsEqual(col1: Column, col2: Column): boolean {\r\n return col1.name.toLowerCase() === col2.name.toLowerCase() &&\r\n col1.type === col2.type &&\r\n col1.nullable === col2.nullable &&\r\n col1.primaryKey === col2.primaryKey &&\r\n col1.autoIncrement === col2.autoIncrement;\r\n }\r\n\r\n function schemasEqual(schema1: TableSchema, schema2: TableSchema): boolean {\r\n if (schema1.columns.length !== schema2.columns.length) {\r\n return false;\r\n }\r\n\r\n const cols1 = new Map(schema1.columns.map(col => [col.name.toLowerCase(), col]));\r\n const cols2 = new Map(schema2.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n for (const [name, col1] of cols1) {\r\n const col2 = cols2.get(name);\r\n if (!col2 || !columnsEqual(col1, col2)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_schemas_config WHERE table_ref='${tableName}' AND database_ref='${database_ref}'`);\r\n const oldQuery = queryComputes.data[0];\r\n\r\n // Validar que oldQuery existe y tiene struct\r\n if (!oldQuery || !oldQuery.struct) {\r\n console.error('No exist a previus schema please execute the refresh first...', oldQuery);\r\n return [];\r\n }\r\n\r\n const nowSchema = parseCreateTableQuery(nowQuery, dbType);\r\n const oldSchema = parseCreateTableQuery(oldQuery.struct, dbType);\r\n\r\n // Verificar que el nombre de tabla coincida\r\n if (nowSchema.tableName.toLowerCase() !== tableName.toLowerCase()) {\r\n throw new Error(`El nombre de tabla en la query (${nowSchema.tableName}) no coincide con el parámetro (${tableName})`);\r\n }\r\n\r\n // Crear mapas para facilitar la comparación\r\n const nowColumns = new Map(nowSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n const oldColumns = new Map(oldSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n switch (dbType) {\r\n case 'mysql':\r\n return generateMySQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'postgres':\r\n return generatePostgreSQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'sqlite':\r\n return generateSQLiteQueries(nowSchema, oldSchema, tableName);\r\n\r\n case 'mongodb':\r\n return generateMongoDBQueries(nowColumns, oldColumns, tableName);\r\n\r\n default:\r\n throw new Error(`Tipo de base de datos no soportado: ${dbType}`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n return [nowQuery];\r\n } else {\r\n return [nowQuery];\r\n }\r\n }\r\n\r\n static async saveQuery(table_ref: string, database_ref: string, struct: string): Promise<void> {\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n await DbConfig.query(`DELETE FROM dbcube_schemas_config WHERE table_ref='${table_ref}' AND database_ref='${database_ref}'`);\r\n\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `INSERT INTO dbcube_schemas_config (table_ref, database_ref, struct) VALUES (?, ?, ?)`;\r\n await DbConfig.queryWithParameters(tableExistsQuery, [table_ref, database_ref, struct]);\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n }\r\n}\r\n\r\nexport class TriggerProcessor {\r\n\r\n static async getTriggers(name: string): Promise<any[]> {\r\n let triggers = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_triggers_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_triggers_config WHERE database_ref='${name}'`);\r\n triggers = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n triggers = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n triggers = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return triggers;\r\n }\r\n}\r\n\r\n// Utils\r\nfunction convertToType(value: any, type: DataType): any {\r\n switch (type) {\r\n case 'string':\r\n return String(value);\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? 0 : num;\r\n case 'boolean':\r\n return Boolean(value);\r\n case 'date':\r\n return value instanceof Date ? value : new Date(value);\r\n case 'object':\r\n return value;\r\n default:\r\n return value;\r\n }\r\n}"],"mappings":"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","names":["platform","arch","arch","platform","path","resolve","path","fs","resolve","Database","fs","path","type","dbType","tableName"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/Engine.ts","../src/lib/Arquitecture.ts","../src/lib/Binary.ts","../src/lib/Config.ts","../src/lib/DbConfig.ts","../src/lib/FileLogger.ts","../src/lib/Processors.ts"],"sourcesContent":["import { Engine } from './lib/Engine';\r\nimport { Arquitecture } from './lib/Arquitecture';\r\nimport { Binary } from './lib/Binary';\r\nimport { DbConfig } from './lib/DbConfig';\r\nimport { Config } from './lib/Config';\r\nimport { FileLogger, InterceptController } from './lib/FileLogger';\r\nimport { ComputedFieldProcessor, TableProcessor, TriggerProcessor } from './lib/Processors';\r\n\r\nexport { Config, Engine, Arquitecture, Binary, DbConfig, ComputedFieldProcessor, TableProcessor, TriggerProcessor, FileLogger, InterceptController };\r\n","import path from \"path\";\r\nimport { Binary } from \"./Binary\";\r\nimport { Config as ConfigClass } from './Config';\r\nimport { spawn } from \"child_process\";\r\nimport { ProcessResponse, ResponseEngine } from \"../@types/Engine\";\r\nimport { BinaryType } from \"../@types/Binary\";\r\n\r\nclass Engine {\r\n private name: string;\r\n private config: any;\r\n private arguments: any;\r\n private binary: BinaryType;\r\n private timeout: number;\r\n\r\n constructor(name: string, timeout = 30000) {\r\n this.name = name;\r\n this.config = this.setConfig(name);\r\n const binary: BinaryType = Binary.get();\r\n this.binary = {\r\n query_engine: path.resolve(__dirname, '../bin', binary.query_engine),\r\n schema_engine: path.resolve(__dirname, '../bin', binary.schema_engine),\r\n }\r\n this.arguments = this.setArguments();\r\n this.timeout = timeout;\r\n }\r\n\r\n setArguments() {\r\n let args = [];\r\n if (this.config.type == 'sqlite') {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE + \".db\",\r\n '--motor', this.config.type\r\n ];\r\n } else {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE,\r\n '--host', this.config.config.HOST,\r\n '--port', this.config.config.PORT,\r\n '--user', this.config.config.USER,\r\n '--password', this.config.config.PASSWORD,\r\n '--motor', this.config.type\r\n ];\r\n }\r\n return args;\r\n }\r\n\r\n setConfig(name: string) {\r\n const configInstance = new ConfigClass();\r\n\r\n const configFilePath = path.resolve(process.cwd(), 'dbcube.config.js');\r\n const configFn = require(configFilePath);\r\n\r\n if (typeof configFn === 'function') {\r\n configFn(configInstance);\r\n } else {\r\n console.error('❌ El archivo dbcube.config.js no exporta una función.');\r\n }\r\n\r\n return configInstance.getDatabase(name);\r\n\r\n }\r\n\r\n getConfig() {\r\n return this.config;\r\n }\r\n\r\n async run(binary: string, args: []) {\r\n return new Promise<ResponseEngine>((resolve, reject) => {\r\n const child = spawn(this.binary[binary as keyof BinaryType], [...this.arguments, ...args]);\r\n\r\n let stdoutBuffer = '';\r\n let stderrBuffer = '';\r\n let isResolved = false;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n child.kill();\r\n reject(new Error('Process timeout'));\r\n }\r\n }, this.timeout);\r\n\r\n const resolveOnce = (response: ResponseEngine) => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n clearTimeout(timeoutId);\r\n resolve(response);\r\n }\r\n };\r\n\r\n child.stdout.on('data', (data) => {\r\n stdoutBuffer += data.toString();\r\n // console.log(stdoutBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stdoutBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n child.stderr.on('data', (data) => {\r\n stderrBuffer += data.toString();\r\n // console.log(stderrBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stderrBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n\r\n child.on('close', (code) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: code === 0 ? 200 : 500,\r\n message: code === 0 ? 'Process completed' : `Process exited with code ${code}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.on('error', (error) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: 500,\r\n message: `Process error: ${error.message}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.unref();\r\n });\r\n }\r\n}\r\n\r\nexport { Engine }","import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\"\r\n\r\nclass Binary{\r\n static get(): BinaryType{\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform(); \r\n const architecture = arch.getArchitecture(); \r\n switch(platform){\r\n case \"windows\":\r\n if(architecture==\"x86_64\"){\r\n return {\r\n query_engine: \"query-engine-windows-x64.exe\",\r\n schema_engine: \"schema-engine-windows-x64.exe\"\r\n };\r\n }\r\n break;\r\n }\r\n return {\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n}\r\n\r\nexport { Binary }","/**\r\n * Tipo para la configuración de una base de datos\r\n */\r\ntype DatabaseConfig = Record<string, any>;\r\n\r\n/**\r\n * Tipo para la configuración general del ORM\r\n */\r\ninterface ConfigData {\r\n [key: string]: any;\r\n databases?: Record<string, DatabaseConfig>;\r\n}\r\n\r\n/**\r\n * Clase para manejar la configuración del ORM\r\n */\r\nexport class Config {\r\n private data: ConfigData = {};\r\n private databases: Record<string, DatabaseConfig> = {};\r\n\r\n /**\r\n * Establece la configuración\r\n * @param configData - Datos de configuración\r\n */\r\n set(configData: ConfigData): void {\r\n this.data = configData;\r\n\r\n if (configData.databases) {\r\n this.databases = configData.databases;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor de configuración\r\n * @param key - Clave de configuración\r\n * @returns Valor de configuración\r\n */\r\n get<T = any>(key: string): T {\r\n return this.data[key];\r\n }\r\n\r\n /**\r\n * Obtiene la configuración de una base de datos específica\r\n * @param dbName - Nombre de la base de datos\r\n * @returns Configuración de la base de datos o null\r\n */\r\n getDatabase(dbName: string): DatabaseConfig | null {\r\n return this.databases[dbName] || null;\r\n }\r\n\r\n /**\r\n * Obtiene todas las bases de datos configuradas\r\n * @returns Todas las configuraciones de bases de datos\r\n */\r\n getAllDatabases(): Record<string, DatabaseConfig> {\r\n return this.databases;\r\n }\r\n}\r\n\r\nexport default Config;\r\n","import Database from 'better-sqlite3';\r\nimport * as path from 'path';\r\nimport fs from 'fs';\r\n\r\nconst rootPath = path.resolve(process.cwd(), '.dbcube');\r\n\r\ninterface DatabaseConfig {\r\n name?: string;\r\n HOST?: string;\r\n USER?: string;\r\n PASSWORD?: string;\r\n DATABASE?: string;\r\n PORT?: number;\r\n}\r\n\r\ninterface QueryResult {\r\n status: 'success' | 'error';\r\n message: string;\r\n data: any | null;\r\n}\r\n\r\ninterface RunResult {\r\n changes: number;\r\n lastID: number;\r\n}\r\n\r\ninterface ParametrizedQueryResult {\r\n query: string;\r\n parameters: any[];\r\n}\r\n\r\nclass SQLite {\r\n private db: Database.Database | null = null;\r\n private database?: string;\r\n \r\n constructor(config: DatabaseConfig) {\r\n this.database = config.DATABASE;\r\n }\r\n\r\n ifExist(): Boolean {\r\n if (this.database) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n \r\n // Create .dbcube directory if it doesn't exist\r\n if (!fs.existsSync(rootPath)) {\r\n fs.mkdirSync(rootPath, { recursive: true });\r\n }\r\n \r\n if (fs.existsSync(configPath)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n async connect(): Promise<Database.Database> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n if (!this.db) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n \r\n // Create .dbcube directory if it doesn't exist\r\n if (!fs.existsSync(rootPath)) {\r\n fs.mkdirSync(rootPath, { recursive: true });\r\n }\r\n \r\n this.db = new Database(configPath);\r\n }\r\n resolve(this.db);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.db) {\r\n this.db.close();\r\n this.db = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n async query(sqlQuery: string): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const sqlCommands = sqlQuery.split(';').filter(cmd => cmd.trim().length > 0);\r\n const results: any[] = [];\r\n \r\n for (const command of sqlCommands) {\r\n const query = `${command};`;\r\n const isSelect = query.trim().toLowerCase().startsWith('select');\r\n \r\n if (isSelect) {\r\n const stmt = this.db.prepare(query);\r\n const rows = stmt.all();\r\n results.push(rows);\r\n } else {\r\n const stmt = this.db.prepare(query);\r\n const result = stmt.run();\r\n results.push({ \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n });\r\n }\r\n }\r\n \r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: results.length === 1 ? results[0] : results,\r\n });\r\n } catch (error) {\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n async queryWithParameters(sqlQuery: string, params: any[] = []): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!Array.isArray(params)) {\r\n throw new Error('Parameters must be an array.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const isSelect = sqlQuery.trim().toLowerCase().startsWith('select');\r\n const stmt = this.db.prepare(sqlQuery);\r\n \r\n if (isSelect) {\r\n const rows = stmt.all(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: rows,\r\n });\r\n } else {\r\n const result = stmt.run(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: { \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n },\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n convertToParameterizedQuery(sql: string): ParametrizedQueryResult {\r\n const normalizedSql = sql.replace(/\\s+/g, ' ').trim();\r\n \r\n const baseQueryMatch = normalizedSql.match(/^(.+?)\\s+VALUES\\s*\\(/i);\r\n if (!baseQueryMatch) {\r\n throw new Error('No se pudo encontrar la estructura VALUES en la consulta');\r\n }\r\n \r\n const baseQuery = baseQueryMatch[1];\r\n \r\n const valuesStartIndex = normalizedSql.toUpperCase().indexOf('VALUES');\r\n const valuesSection = normalizedSql.substring(valuesStartIndex);\r\n const valuesMatch = valuesSection.match(/VALUES\\s*\\((.+)\\)\\s*;?\\s*$/i);\r\n if (!valuesMatch) {\r\n throw new Error('No se pudieron extraer los valores de la consulta');\r\n }\r\n \r\n const valuesString = valuesMatch[1];\r\n \r\n function parseValues(str: string): any[] {\r\n const values: any[] = [];\r\n let currentValue = '';\r\n let inQuotes = false;\r\n let quoteChar = '';\r\n let inCompute = false;\r\n let computeDepth = 0;\r\n \r\n for (let i = 0; i < str.length; i++) {\r\n const char = str[i];\r\n const prevChar = str[i - 1];\r\n \r\n if (!inQuotes && str.substring(i, i + 8) === '@compute') {\r\n inCompute = true;\r\n }\r\n \r\n if (inCompute && char === '(') {\r\n computeDepth++;\r\n } else if (inCompute && char === ')') {\r\n computeDepth--;\r\n if (computeDepth === 0) {\r\n inCompute = false;\r\n }\r\n }\r\n \r\n if (!inCompute && (char === '\"' || char === \"'\") && prevChar !== '\\\\') {\r\n if (!inQuotes) {\r\n inQuotes = true;\r\n quoteChar = char;\r\n } else if (char === quoteChar) {\r\n if (str[i + 1] === quoteChar) {\r\n currentValue += char + char;\r\n i++;\r\n continue;\r\n } else {\r\n inQuotes = false;\r\n quoteChar = '';\r\n }\r\n }\r\n }\r\n \r\n if (!inQuotes && !inCompute && char === ',') {\r\n values.push(cleanValue(currentValue.trim()));\r\n currentValue = '';\r\n continue;\r\n }\r\n \r\n currentValue += char;\r\n }\r\n \r\n if (currentValue.trim()) {\r\n values.push(cleanValue(currentValue.trim()));\r\n }\r\n \r\n return values;\r\n }\r\n \r\n function cleanValue(value: string): any {\r\n value = value.trim();\r\n \r\n if (value.startsWith('@compute')) {\r\n return value;\r\n }\r\n \r\n if ((value.startsWith('\"') && value.endsWith('\"')) || \r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n value = value.replace(/''/g, \"'\").replace(/\"\"/g, '\"');\r\n }\r\n \r\n return value;\r\n }\r\n \r\n const parameters = parseValues(valuesString);\r\n const placeholders = parameters.map(() => '?').join(', ');\r\n const parametrizedQuery = `${baseQuery} VALUES (${placeholders});`;\r\n \r\n return {\r\n query: parametrizedQuery,\r\n parameters: parameters\r\n };\r\n }\r\n}\r\n\r\nexport const DbConfig = new SQLite({DATABASE: \"config\"});\r\nexport default DbConfig;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { EventEmitter } from 'events';\r\n\r\ninterface InterceptOptions {\r\n interceptLog?: boolean;\r\n interceptError?: boolean;\r\n interceptWarn?: boolean;\r\n keepOriginal?: boolean;\r\n useBuffer?: boolean;\r\n}\r\n\r\ninterface ReadOptions {\r\n lines?: number | null;\r\n fromEnd?: boolean;\r\n asArray?: boolean;\r\n}\r\n\r\ninterface WatchOptions {\r\n persistent?: boolean;\r\n interval?: number;\r\n fromEnd?: boolean;\r\n}\r\n\r\ninterface WatchController {\r\n id: string;\r\n stop: () => void;\r\n isWatching: () => boolean;\r\n}\r\n\r\nexport interface InterceptController {\r\n restore: () => void;\r\n commit: () => Promise<boolean>;\r\n discard: () => number;\r\n hasBuffer: () => boolean;\r\n getBufferSize: () => number;\r\n}\r\n\r\ninterface DeleteResult {\r\n filePath: string;\r\n deleted: boolean;\r\n error: string | null;\r\n}\r\n\r\ntype LogLevel = 'INFO' | 'ERROR' | 'WARN' | 'DEBUG';\r\n\r\nexport class FileLogger extends EventEmitter {\r\n private static watchers = new Map<string, (curr: fs.Stats, prev: fs.Stats) => void>(); // Store listener functions\r\n private static buffers = new Map<string, string[]>();\r\n \r\n /**\r\n * Escribe un log en el archivo especificado\r\n * @param filePath - Ruta del archivo de log\r\n * @param message - Mensaje a escribir\r\n * @param level - Nivel del log (INFO, ERROR, WARN, DEBUG)\r\n * @param append - Si debe agregar al final del archivo (default: true)\r\n */\r\n static async write(filePath: string, message: string, level: LogLevel = 'INFO', append: boolean = true): Promise<boolean> {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Formatear el mensaje con timestamp\r\n const timestamp = new Date().toISOString();\r\n const formattedMessage = `[${timestamp}] [${level}] ${message}\\n`;\r\n \r\n // Si existe un buffer para este archivo, agregarlo al buffer en lugar de escribir directamente\r\n if (FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.get(filePath)!.push(formattedMessage);\r\n return true;\r\n }\r\n \r\n // Escribir al archivo normalmente\r\n if (append) {\r\n await fs.promises.appendFile(filePath, formattedMessage, 'utf8');\r\n } else {\r\n await fs.promises.writeFile(filePath, formattedMessage, 'utf8');\r\n }\r\n \r\n return true;\r\n } catch (error) {\r\n console.error('Error escribiendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Inicia un buffer temporal para un archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static startBuffer(filePath: string): void {\r\n if (!FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.set(filePath, []);\r\n }\r\n }\r\n \r\n /**\r\n * Confirma y escribe todos los logs del buffer al archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static async commitBuffer(filePath: string): Promise<boolean> {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n if (buffer && buffer.length > 0) {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Escribir todos los logs del buffer\r\n const content = buffer.join('');\r\n await fs.promises.appendFile(filePath, content, 'utf8');\r\n \r\n // Limpiar el buffer\r\n FileLogger.buffers.delete(filePath);\r\n return true;\r\n } catch (error) {\r\n console.error('Error confirmando buffer:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n // Limpiar el buffer aunque esté vacío\r\n FileLogger.buffers.delete(filePath);\r\n return false;\r\n }\r\n \r\n /**\r\n * Descarta todos los logs del buffer sin escribirlos\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static discardBuffer(filePath: string): number {\r\n if (FileLogger.buffers.has(filePath)) {\r\n const discardedCount = FileLogger.buffers.get(filePath)!.length;\r\n FileLogger.buffers.delete(filePath);\r\n return discardedCount;\r\n }\r\n return 0;\r\n }\r\n \r\n /**\r\n * Verifica si existe un buffer activo para un archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static hasBuffer(filePath: string): boolean {\r\n return FileLogger.buffers.has(filePath);\r\n }\r\n \r\n /**\r\n * Obtiene el número de logs en el buffer\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static getBufferSize(filePath: string): number {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n return buffer ? buffer.length : 0;\r\n }\r\n \r\n /**\r\n * Intercepta console.log y console.error para escribir a archivo\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de interceptación\r\n */\r\n static interceptConsole(filePath: string, options: InterceptOptions = {}): InterceptController {\r\n const {\r\n interceptLog = true,\r\n interceptError = true,\r\n interceptWarn = true,\r\n keepOriginal = true, // Mantener el comportamiento original de console\r\n useBuffer = false // Usar buffer temporal\r\n } = options;\r\n \r\n // Iniciar buffer si se solicita\r\n if (useBuffer) {\r\n FileLogger.startBuffer(filePath);\r\n }\r\n \r\n // Guardar referencias originales\r\n const originalLog = console.log;\r\n const originalError = console.error;\r\n const originalWarn = console.warn;\r\n \r\n if (interceptLog) {\r\n console.log = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'INFO').catch(err => {\r\n originalError('Error escribiendo log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalLog.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptError) {\r\n console.error = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'ERROR').catch(err => {\r\n originalError('Error escribiendo error log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalError.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptWarn) {\r\n console.warn = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'WARN').catch(err => {\r\n originalError('Error escribiendo warn log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalWarn.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n // Retornar función para restaurar console original\r\n return {\r\n restore: () => {\r\n if (interceptLog) console.log = originalLog;\r\n if (interceptError) console.error = originalError;\r\n if (interceptWarn) console.warn = originalWarn;\r\n },\r\n commit: async () => {\r\n if (useBuffer) {\r\n return await FileLogger.commitBuffer(filePath);\r\n }\r\n return false;\r\n },\r\n discard: () => {\r\n if (useBuffer) {\r\n return FileLogger.discardBuffer(filePath);\r\n }\r\n return 0;\r\n },\r\n hasBuffer: () => FileLogger.hasBuffer(filePath),\r\n getBufferSize: () => FileLogger.getBufferSize(filePath)\r\n };\r\n }\r\n \r\n /**\r\n * Lee el contenido completo del archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de lectura\r\n * @returns Contenido del archivo\r\n */\r\n static async read(filePath: string, options: ReadOptions = {}): Promise<string | string[]> {\r\n const { \r\n lines = null, // Número de líneas a leer (null = todas)\r\n fromEnd = false, // Si debe leer desde el final\r\n asArray = false // Si debe retornar como array de líneas\r\n } = options;\r\n \r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return asArray ? [] : '';\r\n }\r\n \r\n let content = await fs.promises.readFile(filePath, 'utf8');\r\n \r\n if (asArray) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n \r\n if (lines !== null) {\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n }\r\n \r\n return linesArray;\r\n }\r\n \r\n // Si se especifica número de líneas y no es array\r\n if (lines !== null) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n content = linesArray.join('\\n');\r\n }\r\n \r\n return content;\r\n } catch (error) {\r\n console.error('Error leyendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Observa un archivo de log en tiempo real\r\n * @param filePath - Ruta del archivo de log\r\n * @param callback - Función callback para nuevas líneas\r\n * @param options - Opciones del watcher\r\n * @returns Objeto con métodos para controlar el watcher\r\n */\r\n static watch(filePath: string, callback: (line: string, filePath: string) => void, options: WatchOptions = {}): WatchController {\r\n const {\r\n persistent = true,\r\n interval = 100,\r\n fromEnd = true // Empezar desde el final del archivo\r\n } = options;\r\n \r\n let lastSize = 0;\r\n let lastPosition = 0;\r\n \r\n // Inicializar posición si el archivo ya existe\r\n if (fs.existsSync(filePath)) {\r\n const stats = fs.statSync(filePath);\r\n lastSize = stats.size;\r\n lastPosition = fromEnd ? stats.size : 0;\r\n }\r\n \r\n // Fixed: Correct listener function signature for fs.watchFile\r\n const listener = async (curr: fs.Stats, prev: fs.Stats) => {\r\n try {\r\n if (curr.size > lastSize) {\r\n // El archivo ha crecido\r\n const stream = fs.createReadStream(filePath, {\r\n start: lastPosition,\r\n end: curr.size - 1,\r\n encoding: 'utf8'\r\n });\r\n \r\n let buffer = '';\r\n \r\n stream.on('data', (chunk) => {\r\n buffer += chunk;\r\n const lines = buffer.split('\\n');\r\n \r\n // Procesar líneas completas\r\n for (let i = 0; i < lines.length - 1; i++) {\r\n if (lines[i].trim()) {\r\n callback(lines[i].trim(), filePath);\r\n }\r\n }\r\n \r\n // Guardar la línea incompleta\r\n buffer = lines[lines.length - 1];\r\n });\r\n \r\n stream.on('end', () => {\r\n // Procesar la última línea si existe\r\n if (buffer.trim()) {\r\n callback(buffer.trim(), filePath);\r\n }\r\n });\r\n \r\n lastSize = curr.size;\r\n lastPosition = curr.size;\r\n }\r\n } catch (error) {\r\n console.error('Error en watcher:', error);\r\n }\r\n };\r\n \r\n // Watcher para cambios en el archivo\r\n fs.watchFile(filePath, { persistent, interval }, listener);\r\n \r\n // Guardar referencia del watcher\r\n const watcherId = `${filePath}_${Date.now()}`;\r\n // Store listener reference for cleanup\r\n FileLogger.watchers.set(watcherId, listener as any);\r\n \r\n // Retornar objeto de control\r\n return {\r\n id: watcherId,\r\n stop: () => {\r\n const storedListener = FileLogger.watchers.get(watcherId);\r\n if (storedListener) {\r\n fs.unwatchFile(filePath, storedListener);\r\n FileLogger.watchers.delete(watcherId);\r\n }\r\n },\r\n isWatching: () => FileLogger.watchers.has(watcherId)\r\n };\r\n }\r\n \r\n /**\r\n * Detiene todos los watchers activos\r\n */\r\n static stopAllWatchers(): void {\r\n for (const [watcherId] of FileLogger.watchers) {\r\n const filePath = watcherId.split('_')[0];\r\n fs.unwatchFile(filePath);\r\n }\r\n FileLogger.watchers.clear();\r\n }\r\n \r\n /**\r\n * Métodos de conveniencia para diferentes niveles de log\r\n */\r\n static async info(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'INFO');\r\n }\r\n \r\n static async error(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'ERROR');\r\n }\r\n \r\n static async warn(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'WARN');\r\n }\r\n \r\n static async debug(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'DEBUG');\r\n }\r\n \r\n /**\r\n * Limpia logs antiguos\r\n * @param filePath - Ruta del archivo de log\r\n * @param maxLines - Máximo número de líneas a mantener\r\n */\r\n static async cleanup(filePath: string, maxLines: number = 1000): Promise<number> {\r\n try {\r\n const lines = await this.read(filePath, { asArray: true }) as string[];\r\n \r\n if (lines.length > maxLines) {\r\n const keepLines = lines.slice(-maxLines);\r\n const content = keepLines.join('\\n') + '\\n';\r\n await fs.promises.writeFile(filePath, content, 'utf8');\r\n return lines.length - maxLines; // Líneas eliminadas\r\n }\r\n \r\n return 0;\r\n } catch (error) {\r\n console.error('Error limpiando logs:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina un archivo de log\r\n * @param filePath - Ruta del archivo de log a eliminar\r\n */\r\n static async deleteLogFile(filePath: string): Promise<boolean> {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n await fs.promises.unlink(filePath);\r\n return true;\r\n }\r\n return false;\r\n } catch (error) {\r\n console.error('Error eliminando archivo de log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina múltiples archivos de log\r\n * @param filePaths - Array de rutas de archivos de log a eliminar\r\n */\r\n static async deleteLogFiles(filePaths: string[]): Promise<DeleteResult[]> {\r\n const results: DeleteResult[] = [];\r\n \r\n for (const filePath of filePaths) {\r\n try {\r\n const deleted = await this.deleteLogFile(filePath);\r\n results.push({ filePath, deleted, error: null });\r\n } catch (error) {\r\n results.push({ filePath, deleted: false, error: (error as Error).message });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n}\r\n\r\nexport default FileLogger;","import { ComputedFieldConfig, DataObject, DataType } from \"../@types/DataObject\";\r\nimport { Column, DatabaseType, TableSchema } from \"../@types/Processor\";\r\nimport DbConfig from \"./DbConfig\";\r\n\r\nexport class ComputedFieldProcessor {\r\n\r\n static async getComputedFields(name: string): Promise<any[]> {\r\n let computedFields = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_computes_config WHERE database_ref='${name}'`);\r\n computedFields = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n computedFields = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n computedFields = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return computedFields;\r\n }\r\n\r\n /**\r\n * Processes computed field instruction and returns the computed value\r\n * @param instruction - The @compute instruction\r\n * @param rowData - The row data containing column values\r\n * @returns The computed value or null if there's an error\r\n */\r\n static processInstruction(instruction: string, rowData: Record<string, any>): any {\r\n try {\r\n // Remove @compute wrapper and extract the function content\r\n const functionMatch = instruction.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*{([\\s\\S]*?)}\\s*\\)/);\r\n\r\n if (!functionMatch) {\r\n throw new Error('Invalid @compute instruction format');\r\n }\r\n\r\n let functionBody: string = functionMatch[1].trim();\r\n\r\n // Clean up the function body - remove trailing semicolon if present\r\n if (functionBody.endsWith(';')) {\r\n functionBody = functionBody.slice(0, -1).trim();\r\n }\r\n\r\n // Replace @column(columnName) with actual values\r\n functionBody = functionBody.replace(/@column\\(([^)]+)\\)/g, (_match, columnName: string) => {\r\n const cleanColumnName = columnName.trim().replace(/['\"]/g, '');\r\n const value = rowData[cleanColumnName];\r\n\r\n if (value === null || value === undefined) {\r\n return 'null';\r\n } else if (typeof value === 'string') {\r\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\r\n } else if (typeof value === 'number' || typeof value === 'boolean') {\r\n return value.toString();\r\n } else if (value instanceof Date) {\r\n return `new Date(\"${value.toISOString()}\")`;\r\n } else {\r\n return JSON.stringify(value);\r\n }\r\n });\r\n\r\n // Create and execute the function\r\n const computeFunction = new Function(functionBody);\r\n return computeFunction();\r\n } catch (error) {\r\n console.error('Error processing computed field:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extracts column dependencies from a computed field instruction\r\n * @param instruction - The @compute instruction\r\n * @returns Array of column names that this computed field depends on\r\n */\r\n static extractDependencies(instruction: string): string[] {\r\n const dependencies: string[] = [];\r\n const columnMatches = instruction.match(/@column\\(([^)]+)\\)/g);\r\n\r\n if (columnMatches) {\r\n for (const match of columnMatches) {\r\n const innerMatch = match.match(/@column\\(([^)]+)\\)/);\r\n if (innerMatch) {\r\n const columnName = innerMatch[1].trim().replace(/['\"]/g, '');\r\n if (!dependencies.includes(columnName)) {\r\n dependencies.push(columnName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return dependencies;\r\n }\r\n\r\n /**\r\n * Adds computed fields to an array of data objects based on configuration array\r\n * @param data - Array of data objects\r\n * @param computedConfigs - Array of computed field configurations\r\n * @returns Array with the new computed fields added\r\n */\r\n static computedFields<T extends DataObject>(\r\n data: T[],\r\n computedConfigs: ComputedFieldConfig[]\r\n ): T[] {\r\n\r\n return data.map((item, index) => {\r\n let processedItem: any = { ...item };\r\n\r\n // Procesar cada configuración de campo computado\r\n computedConfigs.forEach((config) => {\r\n try {\r\n const { column: fieldName, type, instruction } = config;\r\n\r\n // Reemplazar @column(fieldName) con el valor real del objeto\r\n let processedExpression = instruction.replace(\r\n /@column\\(([^)]+)\\)/g,\r\n (match, columnName) => {\r\n // Remover comillas si las tiene\r\n const cleanColumnName = columnName.replace(/['\"]/g, '');\r\n const value = processedItem[cleanColumnName];\r\n\r\n // Convertir el valor a string seguro para la evaluación\r\n if (typeof value === 'string') {\r\n return `\"${value}\"`;\r\n } else if (value === null || value === undefined) {\r\n return 'null';\r\n } else {\r\n return String(value);\r\n }\r\n }\r\n );\r\n\r\n // Extraer la función dentro de @compute\r\n const computeMatch = processedExpression.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*\\{(.*)\\}\\s*\\)/s);\r\n if (!computeMatch) {\r\n throw new Error(`Formato de @compute inválido para campo ${fieldName}`);\r\n }\r\n\r\n const functionBody = computeMatch[1];\r\n\r\n // Crear y ejecutar la función\r\n const computeFunction = new Function(functionBody);\r\n let result = computeFunction();\r\n\r\n // Aplicar conversión de tipo\r\n result = convertToType(result, type as DataType);\r\n\r\n // Agregar el nuevo campo al objeto procesado\r\n processedItem[fieldName] = result;\r\n\r\n } catch (error) {\r\n console.error(`Error procesando campo ${config.column} en item ${index}:`, error);\r\n // En caso de error, asignar null al campo\r\n processedItem[config.column] = null;\r\n }\r\n });\r\n\r\n return processedItem;\r\n });\r\n }\r\n}\r\n\r\nexport class TableProcessor {\r\n static async generateAlterQueries(\r\n nowQuery: string,\r\n dbType: DatabaseType,\r\n tableName: string,\r\n database_ref: string,\r\n ): Promise<string[]> {\r\n function parseCreateTableQuery(query: string, dbType: DatabaseType): TableSchema {\r\n // Limpiar y normalizar la query\r\n const cleanQuery = query.trim().replace(/\\s+/g, ' ');\r\n\r\n // Extraer el nombre de la tabla\r\n const tableNameMatch = cleanQuery.match(/CREATE TABLE (?:IF NOT EXISTS )?(\\w+)/i);\r\n if (!tableNameMatch) {\r\n throw new Error('No se pudo extraer el nombre de la tabla');\r\n }\r\n\r\n const tableName = tableNameMatch[1];\r\n\r\n // Extraer las definiciones de columnas\r\n const columnsMatch = cleanQuery.match(/\\((.+)\\)/);\r\n if (!columnsMatch) {\r\n throw new Error('No se pudieron extraer las definiciones de columnas');\r\n }\r\n\r\n const columnsString = columnsMatch[1];\r\n const columnDefinitions = columnsString.split(',').map(def => def.trim());\r\n\r\n const columns: Column[] = [];\r\n\r\n for (const def of columnDefinitions) {\r\n // Skip constraints that aren't column definitions\r\n if (def.toUpperCase().startsWith('PRIMARY KEY') ||\r\n def.toUpperCase().startsWith('FOREIGN KEY') ||\r\n def.toUpperCase().startsWith('CONSTRAINT')) {\r\n continue;\r\n }\r\n\r\n const parts = def.split(/\\s+/);\r\n if (parts.length < 2) continue;\r\n\r\n const columnName = parts[0];\r\n const columnType = parts[1];\r\n\r\n const column: Column = {\r\n name: columnName,\r\n type: columnType,\r\n nullable: !def.toUpperCase().includes('NOT NULL'),\r\n primaryKey: def.toUpperCase().includes('PRIMARY KEY'),\r\n autoIncrement: def.toUpperCase().includes('AUTOINCREMENT') || def.toUpperCase().includes('AUTO_INCREMENT')\r\n };\r\n\r\n columns.push(column);\r\n }\r\n\r\n return { tableName, columns };\r\n }\r\n\r\n function generateMySQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // Modificar columna existente\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${columnDef};`);\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generatePostgreSQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'postgres');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // PostgreSQL requiere comandos separados para diferentes modificaciones\r\n if (column.type !== oldColumn.type) {\r\n const pgType = column.type.replace('INTEGER', 'INT').replace('TEXT', 'VARCHAR');\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} TYPE ${pgType};`);\r\n }\r\n\r\n if (column.nullable !== oldColumn.nullable) {\r\n const constraint = column.nullable ? 'DROP NOT NULL' : 'SET NOT NULL';\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} ${constraint};`);\r\n }\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generateSQLiteQueries(\r\n nowSchema: TableSchema,\r\n oldSchema: TableSchema,\r\n tableName: string\r\n ): string[] {\r\n // SQLite no soporta DROP COLUMN directamente, necesitamos recrear la tabla\r\n const queries: string[] = [];\r\n\r\n // Verificar si hay diferencias\r\n if (schemasEqual(nowSchema, oldSchema)) {\r\n return queries; // No hay cambios\r\n }\r\n\r\n const tempTableName = `${tableName}_temp_${Date.now()}`;\r\n\r\n // 1. Crear tabla temporal con el nuevo esquema\r\n const createTempQuery = buildCreateTableQuery(nowSchema, 'sqlite', tempTableName);\r\n queries.push(createTempQuery);\r\n\r\n // 2. Copiar datos compatibles\r\n const commonColumns = nowSchema.columns\r\n .filter(col => oldSchema.columns.some(oldCol => oldCol.name.toLowerCase() === col.name.toLowerCase()))\r\n .map(col => col.name);\r\n\r\n if (commonColumns.length > 0) {\r\n const columnsList = commonColumns.join(', ');\r\n queries.push(`INSERT INTO ${tempTableName} (${columnsList}) SELECT ${columnsList} FROM ${tableName};`);\r\n }\r\n\r\n // 3. Eliminar tabla original\r\n queries.push(`DROP TABLE ${tableName};`);\r\n\r\n // 4. Renombrar tabla temporal\r\n queries.push(`ALTER TABLE ${tempTableName} RENAME TO ${tableName};`);\r\n\r\n return queries;\r\n }\r\n\r\n function generateMongoDBQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n collectionName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Campos a eliminar\r\n const fieldsToRemove: string[] = [];\r\n for (const [fieldName] of oldColumns) {\r\n if (!nowColumns.has(fieldName)) {\r\n fieldsToRemove.push(fieldName);\r\n }\r\n }\r\n\r\n if (fieldsToRemove.length > 0) {\r\n const unsetFields = fieldsToRemove.reduce((acc, field) => {\r\n acc[field] = \"\";\r\n return acc;\r\n }, {} as Record<string, string>);\r\n\r\n queries.push(`db.${collectionName}.updateMany({}, { $unset: ${JSON.stringify(unsetFields)} });`);\r\n }\r\n\r\n // Campos a agregar (con valores por defecto)\r\n const fieldsToAdd: Record<string, any> = {};\r\n for (const [fieldName, column] of nowColumns) {\r\n if (!oldColumns.has(fieldName)) {\r\n // Valor por defecto según el tipo\r\n let defaultValue: any = null;\r\n if (!column.nullable) {\r\n switch (column.type.toUpperCase()) {\r\n case 'INTEGER':\r\n defaultValue = 0;\r\n break;\r\n case 'TEXT':\r\n case 'VARCHAR':\r\n defaultValue = '';\r\n break;\r\n default:\r\n defaultValue = null;\r\n }\r\n }\r\n fieldsToAdd[fieldName] = defaultValue;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldsToAdd).length > 0) {\r\n queries.push(`db.${collectionName}.updateMany({}, { $set: ${JSON.stringify(fieldsToAdd)} });`);\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function buildColumnDefinition(column: Column, dbType: DatabaseType): string {\r\n let def = `${column.name} ${column.type}`;\r\n\r\n if (column.primaryKey) {\r\n def += ' PRIMARY KEY';\r\n }\r\n\r\n if (column.autoIncrement) {\r\n if (dbType === 'mysql') {\r\n def += ' AUTO_INCREMENT';\r\n } else if (dbType === 'sqlite') {\r\n def += ' AUTOINCREMENT';\r\n } else if (dbType === 'postgres') {\r\n def = def.replace(column.type, 'SERIAL');\r\n }\r\n }\r\n\r\n if (!column.nullable) {\r\n def += ' NOT NULL';\r\n }\r\n\r\n return def;\r\n }\r\n\r\n function buildCreateTableQuery(schema: TableSchema, dbType: DatabaseType, tableName?: string): string {\r\n const name = tableName || schema.tableName;\r\n const columnDefs = schema.columns.map(col => buildColumnDefinition(col, dbType));\r\n return `CREATE TABLE ${name} (${columnDefs.join(', ')});`;\r\n }\r\n\r\n function columnsEqual(col1: Column, col2: Column): boolean {\r\n return col1.name.toLowerCase() === col2.name.toLowerCase() &&\r\n col1.type === col2.type &&\r\n col1.nullable === col2.nullable &&\r\n col1.primaryKey === col2.primaryKey &&\r\n col1.autoIncrement === col2.autoIncrement;\r\n }\r\n\r\n function schemasEqual(schema1: TableSchema, schema2: TableSchema): boolean {\r\n if (schema1.columns.length !== schema2.columns.length) {\r\n return false;\r\n }\r\n\r\n const cols1 = new Map(schema1.columns.map(col => [col.name.toLowerCase(), col]));\r\n const cols2 = new Map(schema2.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n for (const [name, col1] of cols1) {\r\n const col2 = cols2.get(name);\r\n if (!col2 || !columnsEqual(col1, col2)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_schemas_config WHERE table_ref='${tableName}' AND database_ref='${database_ref}'`);\r\n const oldQuery = queryComputes.data[0];\r\n\r\n // Validar que oldQuery existe y tiene struct\r\n if (!oldQuery || !oldQuery.struct) {\r\n console.error('No exist a previus schema please execute the refresh first...', oldQuery);\r\n return [];\r\n }\r\n\r\n const nowSchema = parseCreateTableQuery(nowQuery, dbType);\r\n const oldSchema = parseCreateTableQuery(oldQuery.struct, dbType);\r\n\r\n // Verificar que el nombre de tabla coincida\r\n if (nowSchema.tableName.toLowerCase() !== tableName.toLowerCase()) {\r\n throw new Error(`El nombre de tabla en la query (${nowSchema.tableName}) no coincide con el parámetro (${tableName})`);\r\n }\r\n\r\n // Crear mapas para facilitar la comparación\r\n const nowColumns = new Map(nowSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n const oldColumns = new Map(oldSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n switch (dbType) {\r\n case 'mysql':\r\n return generateMySQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'postgres':\r\n return generatePostgreSQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'sqlite':\r\n return generateSQLiteQueries(nowSchema, oldSchema, tableName);\r\n\r\n case 'mongodb':\r\n return generateMongoDBQueries(nowColumns, oldColumns, tableName);\r\n\r\n default:\r\n throw new Error(`Tipo de base de datos no soportado: ${dbType}`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n return [nowQuery];\r\n } else {\r\n return [nowQuery];\r\n }\r\n }\r\n\r\n static async saveQuery(table_ref: string, database_ref: string, struct: string): Promise<void> {\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n await DbConfig.query(`DELETE FROM dbcube_schemas_config WHERE table_ref='${table_ref}' AND database_ref='${database_ref}'`);\r\n\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `INSERT INTO dbcube_schemas_config (table_ref, database_ref, struct) VALUES (?, ?, ?)`;\r\n await DbConfig.queryWithParameters(tableExistsQuery, [table_ref, database_ref, struct]);\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n }\r\n}\r\n\r\nexport class TriggerProcessor {\r\n\r\n static async getTriggers(name: string): Promise<any[]> {\r\n let triggers = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_triggers_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_triggers_config WHERE database_ref='${name}'`);\r\n triggers = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n triggers = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n triggers = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return triggers;\r\n }\r\n}\r\n\r\n// Utils\r\nfunction convertToType(value: any, type: DataType): any {\r\n switch (type) {\r\n case 'string':\r\n return String(value);\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? 0 : num;\r\n case 'boolean':\r\n return Boolean(value);\r\n case 'date':\r\n return value instanceof Date ? value : new Date(value);\r\n case 'object':\r\n return value;\r\n default:\r\n return value;\r\n }\r\n}"],"mappings":"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","names":["platform","arch","arch","platform","path","resolve","path","fs","resolve","Database","fs","path","type","dbType","tableName"]}
|
package/dist/index.js
CHANGED
|
@@ -349,7 +349,7 @@ var Engine = class {
|
|
|
349
349
|
import Database from "better-sqlite3";
|
|
350
350
|
import * as path2 from "path";
|
|
351
351
|
import fs from "fs";
|
|
352
|
-
var rootPath = path2.resolve(process.cwd(), "dbcube");
|
|
352
|
+
var rootPath = path2.resolve(process.cwd(), ".dbcube");
|
|
353
353
|
var SQLite = class {
|
|
354
354
|
db = null;
|
|
355
355
|
database;
|
|
@@ -360,6 +360,9 @@ var SQLite = class {
|
|
|
360
360
|
if (this.database) {
|
|
361
361
|
const dbPath = this.database || ":memory:";
|
|
362
362
|
const configPath = path2.join(rootPath, dbPath + ".db");
|
|
363
|
+
if (!fs.existsSync(rootPath)) {
|
|
364
|
+
fs.mkdirSync(rootPath, { recursive: true });
|
|
365
|
+
}
|
|
363
366
|
if (fs.existsSync(configPath)) {
|
|
364
367
|
return true;
|
|
365
368
|
}
|
|
@@ -372,6 +375,9 @@ var SQLite = class {
|
|
|
372
375
|
if (!this.db) {
|
|
373
376
|
const dbPath = this.database || ":memory:";
|
|
374
377
|
const configPath = path2.join(rootPath, dbPath + ".db");
|
|
378
|
+
if (!fs.existsSync(rootPath)) {
|
|
379
|
+
fs.mkdirSync(rootPath, { recursive: true });
|
|
380
|
+
}
|
|
375
381
|
this.db = new Database(configPath);
|
|
376
382
|
}
|
|
377
383
|
resolve2(this.db);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/Engine.ts","../src/lib/Arquitecture.ts","../src/lib/Binary.ts","../src/lib/Config.ts","../src/lib/DbConfig.ts","../src/lib/FileLogger.ts","../src/lib/Processors.ts"],"sourcesContent":["import path from \"path\";\r\nimport { Binary } from \"./Binary\";\r\nimport { Config as ConfigClass } from './Config';\r\nimport { spawn } from \"child_process\";\r\nimport { ProcessResponse, ResponseEngine } from \"../@types/Engine\";\r\nimport { BinaryType } from \"../@types/Binary\";\r\n\r\nclass Engine {\r\n private name: string;\r\n private config: any;\r\n private arguments: any;\r\n private binary: BinaryType;\r\n private timeout: number;\r\n\r\n constructor(name: string, timeout = 30000) {\r\n this.name = name;\r\n this.config = this.setConfig(name);\r\n const binary: BinaryType = Binary.get();\r\n this.binary = {\r\n query_engine: path.resolve(__dirname, '../bin', binary.query_engine),\r\n schema_engine: path.resolve(__dirname, '../bin', binary.schema_engine),\r\n }\r\n this.arguments = this.setArguments();\r\n this.timeout = timeout;\r\n }\r\n\r\n setArguments() {\r\n let args = [];\r\n if (this.config.type == 'sqlite') {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE + \".db\",\r\n '--motor', this.config.type\r\n ];\r\n } else {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE,\r\n '--host', this.config.config.HOST,\r\n '--port', this.config.config.PORT,\r\n '--user', this.config.config.USER,\r\n '--password', this.config.config.PASSWORD,\r\n '--motor', this.config.type\r\n ];\r\n }\r\n return args;\r\n }\r\n\r\n setConfig(name: string) {\r\n const configInstance = new ConfigClass();\r\n\r\n const configFilePath = path.resolve(process.cwd(), 'dbcube.config.js');\r\n const configFn = require(configFilePath);\r\n\r\n if (typeof configFn === 'function') {\r\n configFn(configInstance);\r\n } else {\r\n console.error('❌ El archivo dbcube.config.js no exporta una función.');\r\n }\r\n\r\n return configInstance.getDatabase(name);\r\n\r\n }\r\n\r\n getConfig() {\r\n return this.config;\r\n }\r\n\r\n async run(binary: string, args: []) {\r\n return new Promise<ResponseEngine>((resolve, reject) => {\r\n const child = spawn(this.binary[binary as keyof BinaryType], [...this.arguments, ...args]);\r\n\r\n let stdoutBuffer = '';\r\n let stderrBuffer = '';\r\n let isResolved = false;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n child.kill();\r\n reject(new Error('Process timeout'));\r\n }\r\n }, this.timeout);\r\n\r\n const resolveOnce = (response: ResponseEngine) => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n clearTimeout(timeoutId);\r\n resolve(response);\r\n }\r\n };\r\n\r\n child.stdout.on('data', (data) => {\r\n stdoutBuffer += data.toString();\r\n // console.log(stdoutBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stdoutBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n child.stderr.on('data', (data) => {\r\n stderrBuffer += data.toString();\r\n // console.log(stderrBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stderrBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n\r\n child.on('close', (code) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: code === 0 ? 200 : 500,\r\n message: code === 0 ? 'Process completed' : `Process exited with code ${code}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.on('error', (error) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: 500,\r\n message: `Process error: ${error.message}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.unref();\r\n });\r\n }\r\n}\r\n\r\nexport { Engine }","import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\"\r\n\r\nclass Binary{\r\n static get(): BinaryType{\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform(); \r\n const architecture = arch.getArchitecture(); \r\n switch(platform){\r\n case \"windows\":\r\n if(architecture==\"x86_64\"){\r\n return {\r\n query_engine: \"query-engine-windows-x64.exe\",\r\n schema_engine: \"schema-engine-windows-x64.exe\"\r\n };\r\n }\r\n break;\r\n }\r\n return {\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n}\r\n\r\nexport { Binary }","/**\r\n * Tipo para la configuración de una base de datos\r\n */\r\ntype DatabaseConfig = Record<string, any>;\r\n\r\n/**\r\n * Tipo para la configuración general del ORM\r\n */\r\ninterface ConfigData {\r\n [key: string]: any;\r\n databases?: Record<string, DatabaseConfig>;\r\n}\r\n\r\n/**\r\n * Clase para manejar la configuración del ORM\r\n */\r\nexport class Config {\r\n private data: ConfigData = {};\r\n private databases: Record<string, DatabaseConfig> = {};\r\n\r\n /**\r\n * Establece la configuración\r\n * @param configData - Datos de configuración\r\n */\r\n set(configData: ConfigData): void {\r\n this.data = configData;\r\n\r\n if (configData.databases) {\r\n this.databases = configData.databases;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor de configuración\r\n * @param key - Clave de configuración\r\n * @returns Valor de configuración\r\n */\r\n get<T = any>(key: string): T {\r\n return this.data[key];\r\n }\r\n\r\n /**\r\n * Obtiene la configuración de una base de datos específica\r\n * @param dbName - Nombre de la base de datos\r\n * @returns Configuración de la base de datos o null\r\n */\r\n getDatabase(dbName: string): DatabaseConfig | null {\r\n return this.databases[dbName] || null;\r\n }\r\n\r\n /**\r\n * Obtiene todas las bases de datos configuradas\r\n * @returns Todas las configuraciones de bases de datos\r\n */\r\n getAllDatabases(): Record<string, DatabaseConfig> {\r\n return this.databases;\r\n }\r\n}\r\n\r\nexport default Config;\r\n","import Database from 'better-sqlite3';\r\nimport * as path from 'path';\r\nimport fs from 'fs';\r\n\r\nconst rootPath = path.resolve(process.cwd(), 'dbcube');\r\n\r\ninterface DatabaseConfig {\r\n name?: string;\r\n HOST?: string;\r\n USER?: string;\r\n PASSWORD?: string;\r\n DATABASE?: string;\r\n PORT?: number;\r\n}\r\n\r\ninterface QueryResult {\r\n status: 'success' | 'error';\r\n message: string;\r\n data: any | null;\r\n}\r\n\r\ninterface RunResult {\r\n changes: number;\r\n lastID: number;\r\n}\r\n\r\ninterface ParametrizedQueryResult {\r\n query: string;\r\n parameters: any[];\r\n}\r\n\r\nclass SQLite {\r\n private db: Database.Database | null = null;\r\n private database?: string;\r\n \r\n constructor(config: DatabaseConfig) {\r\n this.database = config.DATABASE;\r\n }\r\n\r\n ifExist(): Boolean {\r\n if (this.database) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n if (fs.existsSync(configPath)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n async connect(): Promise<Database.Database> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n if (!this.db) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n \r\n this.db = new Database(configPath);\r\n }\r\n resolve(this.db);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.db) {\r\n this.db.close();\r\n this.db = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n async query(sqlQuery: string): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const sqlCommands = sqlQuery.split(';').filter(cmd => cmd.trim().length > 0);\r\n const results: any[] = [];\r\n \r\n for (const command of sqlCommands) {\r\n const query = `${command};`;\r\n const isSelect = query.trim().toLowerCase().startsWith('select');\r\n \r\n if (isSelect) {\r\n const stmt = this.db.prepare(query);\r\n const rows = stmt.all();\r\n results.push(rows);\r\n } else {\r\n const stmt = this.db.prepare(query);\r\n const result = stmt.run();\r\n results.push({ \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n });\r\n }\r\n }\r\n \r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: results.length === 1 ? results[0] : results,\r\n });\r\n } catch (error) {\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n async queryWithParameters(sqlQuery: string, params: any[] = []): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!Array.isArray(params)) {\r\n throw new Error('Parameters must be an array.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const isSelect = sqlQuery.trim().toLowerCase().startsWith('select');\r\n const stmt = this.db.prepare(sqlQuery);\r\n \r\n if (isSelect) {\r\n const rows = stmt.all(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: rows,\r\n });\r\n } else {\r\n const result = stmt.run(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: { \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n },\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n convertToParameterizedQuery(sql: string): ParametrizedQueryResult {\r\n const normalizedSql = sql.replace(/\\s+/g, ' ').trim();\r\n \r\n const baseQueryMatch = normalizedSql.match(/^(.+?)\\s+VALUES\\s*\\(/i);\r\n if (!baseQueryMatch) {\r\n throw new Error('No se pudo encontrar la estructura VALUES en la consulta');\r\n }\r\n \r\n const baseQuery = baseQueryMatch[1];\r\n \r\n const valuesStartIndex = normalizedSql.toUpperCase().indexOf('VALUES');\r\n const valuesSection = normalizedSql.substring(valuesStartIndex);\r\n const valuesMatch = valuesSection.match(/VALUES\\s*\\((.+)\\)\\s*;?\\s*$/i);\r\n if (!valuesMatch) {\r\n throw new Error('No se pudieron extraer los valores de la consulta');\r\n }\r\n \r\n const valuesString = valuesMatch[1];\r\n \r\n function parseValues(str: string): any[] {\r\n const values: any[] = [];\r\n let currentValue = '';\r\n let inQuotes = false;\r\n let quoteChar = '';\r\n let inCompute = false;\r\n let computeDepth = 0;\r\n \r\n for (let i = 0; i < str.length; i++) {\r\n const char = str[i];\r\n const prevChar = str[i - 1];\r\n \r\n if (!inQuotes && str.substring(i, i + 8) === '@compute') {\r\n inCompute = true;\r\n }\r\n \r\n if (inCompute && char === '(') {\r\n computeDepth++;\r\n } else if (inCompute && char === ')') {\r\n computeDepth--;\r\n if (computeDepth === 0) {\r\n inCompute = false;\r\n }\r\n }\r\n \r\n if (!inCompute && (char === '\"' || char === \"'\") && prevChar !== '\\\\') {\r\n if (!inQuotes) {\r\n inQuotes = true;\r\n quoteChar = char;\r\n } else if (char === quoteChar) {\r\n if (str[i + 1] === quoteChar) {\r\n currentValue += char + char;\r\n i++;\r\n continue;\r\n } else {\r\n inQuotes = false;\r\n quoteChar = '';\r\n }\r\n }\r\n }\r\n \r\n if (!inQuotes && !inCompute && char === ',') {\r\n values.push(cleanValue(currentValue.trim()));\r\n currentValue = '';\r\n continue;\r\n }\r\n \r\n currentValue += char;\r\n }\r\n \r\n if (currentValue.trim()) {\r\n values.push(cleanValue(currentValue.trim()));\r\n }\r\n \r\n return values;\r\n }\r\n \r\n function cleanValue(value: string): any {\r\n value = value.trim();\r\n \r\n if (value.startsWith('@compute')) {\r\n return value;\r\n }\r\n \r\n if ((value.startsWith('\"') && value.endsWith('\"')) || \r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n value = value.replace(/''/g, \"'\").replace(/\"\"/g, '\"');\r\n }\r\n \r\n return value;\r\n }\r\n \r\n const parameters = parseValues(valuesString);\r\n const placeholders = parameters.map(() => '?').join(', ');\r\n const parametrizedQuery = `${baseQuery} VALUES (${placeholders});`;\r\n \r\n return {\r\n query: parametrizedQuery,\r\n parameters: parameters\r\n };\r\n }\r\n}\r\n\r\nexport const DbConfig = new SQLite({DATABASE: \"config\"});\r\nexport default DbConfig;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { EventEmitter } from 'events';\r\n\r\ninterface InterceptOptions {\r\n interceptLog?: boolean;\r\n interceptError?: boolean;\r\n interceptWarn?: boolean;\r\n keepOriginal?: boolean;\r\n useBuffer?: boolean;\r\n}\r\n\r\ninterface ReadOptions {\r\n lines?: number | null;\r\n fromEnd?: boolean;\r\n asArray?: boolean;\r\n}\r\n\r\ninterface WatchOptions {\r\n persistent?: boolean;\r\n interval?: number;\r\n fromEnd?: boolean;\r\n}\r\n\r\ninterface WatchController {\r\n id: string;\r\n stop: () => void;\r\n isWatching: () => boolean;\r\n}\r\n\r\nexport interface InterceptController {\r\n restore: () => void;\r\n commit: () => Promise<boolean>;\r\n discard: () => number;\r\n hasBuffer: () => boolean;\r\n getBufferSize: () => number;\r\n}\r\n\r\ninterface DeleteResult {\r\n filePath: string;\r\n deleted: boolean;\r\n error: string | null;\r\n}\r\n\r\ntype LogLevel = 'INFO' | 'ERROR' | 'WARN' | 'DEBUG';\r\n\r\nexport class FileLogger extends EventEmitter {\r\n private static watchers = new Map<string, (curr: fs.Stats, prev: fs.Stats) => void>(); // Store listener functions\r\n private static buffers = new Map<string, string[]>();\r\n \r\n /**\r\n * Escribe un log en el archivo especificado\r\n * @param filePath - Ruta del archivo de log\r\n * @param message - Mensaje a escribir\r\n * @param level - Nivel del log (INFO, ERROR, WARN, DEBUG)\r\n * @param append - Si debe agregar al final del archivo (default: true)\r\n */\r\n static async write(filePath: string, message: string, level: LogLevel = 'INFO', append: boolean = true): Promise<boolean> {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Formatear el mensaje con timestamp\r\n const timestamp = new Date().toISOString();\r\n const formattedMessage = `[${timestamp}] [${level}] ${message}\\n`;\r\n \r\n // Si existe un buffer para este archivo, agregarlo al buffer en lugar de escribir directamente\r\n if (FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.get(filePath)!.push(formattedMessage);\r\n return true;\r\n }\r\n \r\n // Escribir al archivo normalmente\r\n if (append) {\r\n await fs.promises.appendFile(filePath, formattedMessage, 'utf8');\r\n } else {\r\n await fs.promises.writeFile(filePath, formattedMessage, 'utf8');\r\n }\r\n \r\n return true;\r\n } catch (error) {\r\n console.error('Error escribiendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Inicia un buffer temporal para un archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static startBuffer(filePath: string): void {\r\n if (!FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.set(filePath, []);\r\n }\r\n }\r\n \r\n /**\r\n * Confirma y escribe todos los logs del buffer al archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static async commitBuffer(filePath: string): Promise<boolean> {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n if (buffer && buffer.length > 0) {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Escribir todos los logs del buffer\r\n const content = buffer.join('');\r\n await fs.promises.appendFile(filePath, content, 'utf8');\r\n \r\n // Limpiar el buffer\r\n FileLogger.buffers.delete(filePath);\r\n return true;\r\n } catch (error) {\r\n console.error('Error confirmando buffer:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n // Limpiar el buffer aunque esté vacío\r\n FileLogger.buffers.delete(filePath);\r\n return false;\r\n }\r\n \r\n /**\r\n * Descarta todos los logs del buffer sin escribirlos\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static discardBuffer(filePath: string): number {\r\n if (FileLogger.buffers.has(filePath)) {\r\n const discardedCount = FileLogger.buffers.get(filePath)!.length;\r\n FileLogger.buffers.delete(filePath);\r\n return discardedCount;\r\n }\r\n return 0;\r\n }\r\n \r\n /**\r\n * Verifica si existe un buffer activo para un archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static hasBuffer(filePath: string): boolean {\r\n return FileLogger.buffers.has(filePath);\r\n }\r\n \r\n /**\r\n * Obtiene el número de logs en el buffer\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static getBufferSize(filePath: string): number {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n return buffer ? buffer.length : 0;\r\n }\r\n \r\n /**\r\n * Intercepta console.log y console.error para escribir a archivo\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de interceptación\r\n */\r\n static interceptConsole(filePath: string, options: InterceptOptions = {}): InterceptController {\r\n const {\r\n interceptLog = true,\r\n interceptError = true,\r\n interceptWarn = true,\r\n keepOriginal = true, // Mantener el comportamiento original de console\r\n useBuffer = false // Usar buffer temporal\r\n } = options;\r\n \r\n // Iniciar buffer si se solicita\r\n if (useBuffer) {\r\n FileLogger.startBuffer(filePath);\r\n }\r\n \r\n // Guardar referencias originales\r\n const originalLog = console.log;\r\n const originalError = console.error;\r\n const originalWarn = console.warn;\r\n \r\n if (interceptLog) {\r\n console.log = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'INFO').catch(err => {\r\n originalError('Error escribiendo log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalLog.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptError) {\r\n console.error = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'ERROR').catch(err => {\r\n originalError('Error escribiendo error log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalError.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptWarn) {\r\n console.warn = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'WARN').catch(err => {\r\n originalError('Error escribiendo warn log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalWarn.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n // Retornar función para restaurar console original\r\n return {\r\n restore: () => {\r\n if (interceptLog) console.log = originalLog;\r\n if (interceptError) console.error = originalError;\r\n if (interceptWarn) console.warn = originalWarn;\r\n },\r\n commit: async () => {\r\n if (useBuffer) {\r\n return await FileLogger.commitBuffer(filePath);\r\n }\r\n return false;\r\n },\r\n discard: () => {\r\n if (useBuffer) {\r\n return FileLogger.discardBuffer(filePath);\r\n }\r\n return 0;\r\n },\r\n hasBuffer: () => FileLogger.hasBuffer(filePath),\r\n getBufferSize: () => FileLogger.getBufferSize(filePath)\r\n };\r\n }\r\n \r\n /**\r\n * Lee el contenido completo del archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de lectura\r\n * @returns Contenido del archivo\r\n */\r\n static async read(filePath: string, options: ReadOptions = {}): Promise<string | string[]> {\r\n const { \r\n lines = null, // Número de líneas a leer (null = todas)\r\n fromEnd = false, // Si debe leer desde el final\r\n asArray = false // Si debe retornar como array de líneas\r\n } = options;\r\n \r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return asArray ? [] : '';\r\n }\r\n \r\n let content = await fs.promises.readFile(filePath, 'utf8');\r\n \r\n if (asArray) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n \r\n if (lines !== null) {\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n }\r\n \r\n return linesArray;\r\n }\r\n \r\n // Si se especifica número de líneas y no es array\r\n if (lines !== null) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n content = linesArray.join('\\n');\r\n }\r\n \r\n return content;\r\n } catch (error) {\r\n console.error('Error leyendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Observa un archivo de log en tiempo real\r\n * @param filePath - Ruta del archivo de log\r\n * @param callback - Función callback para nuevas líneas\r\n * @param options - Opciones del watcher\r\n * @returns Objeto con métodos para controlar el watcher\r\n */\r\n static watch(filePath: string, callback: (line: string, filePath: string) => void, options: WatchOptions = {}): WatchController {\r\n const {\r\n persistent = true,\r\n interval = 100,\r\n fromEnd = true // Empezar desde el final del archivo\r\n } = options;\r\n \r\n let lastSize = 0;\r\n let lastPosition = 0;\r\n \r\n // Inicializar posición si el archivo ya existe\r\n if (fs.existsSync(filePath)) {\r\n const stats = fs.statSync(filePath);\r\n lastSize = stats.size;\r\n lastPosition = fromEnd ? stats.size : 0;\r\n }\r\n \r\n // Fixed: Correct listener function signature for fs.watchFile\r\n const listener = async (curr: fs.Stats, prev: fs.Stats) => {\r\n try {\r\n if (curr.size > lastSize) {\r\n // El archivo ha crecido\r\n const stream = fs.createReadStream(filePath, {\r\n start: lastPosition,\r\n end: curr.size - 1,\r\n encoding: 'utf8'\r\n });\r\n \r\n let buffer = '';\r\n \r\n stream.on('data', (chunk) => {\r\n buffer += chunk;\r\n const lines = buffer.split('\\n');\r\n \r\n // Procesar líneas completas\r\n for (let i = 0; i < lines.length - 1; i++) {\r\n if (lines[i].trim()) {\r\n callback(lines[i].trim(), filePath);\r\n }\r\n }\r\n \r\n // Guardar la línea incompleta\r\n buffer = lines[lines.length - 1];\r\n });\r\n \r\n stream.on('end', () => {\r\n // Procesar la última línea si existe\r\n if (buffer.trim()) {\r\n callback(buffer.trim(), filePath);\r\n }\r\n });\r\n \r\n lastSize = curr.size;\r\n lastPosition = curr.size;\r\n }\r\n } catch (error) {\r\n console.error('Error en watcher:', error);\r\n }\r\n };\r\n \r\n // Watcher para cambios en el archivo\r\n fs.watchFile(filePath, { persistent, interval }, listener);\r\n \r\n // Guardar referencia del watcher\r\n const watcherId = `${filePath}_${Date.now()}`;\r\n // Store listener reference for cleanup\r\n FileLogger.watchers.set(watcherId, listener as any);\r\n \r\n // Retornar objeto de control\r\n return {\r\n id: watcherId,\r\n stop: () => {\r\n const storedListener = FileLogger.watchers.get(watcherId);\r\n if (storedListener) {\r\n fs.unwatchFile(filePath, storedListener);\r\n FileLogger.watchers.delete(watcherId);\r\n }\r\n },\r\n isWatching: () => FileLogger.watchers.has(watcherId)\r\n };\r\n }\r\n \r\n /**\r\n * Detiene todos los watchers activos\r\n */\r\n static stopAllWatchers(): void {\r\n for (const [watcherId] of FileLogger.watchers) {\r\n const filePath = watcherId.split('_')[0];\r\n fs.unwatchFile(filePath);\r\n }\r\n FileLogger.watchers.clear();\r\n }\r\n \r\n /**\r\n * Métodos de conveniencia para diferentes niveles de log\r\n */\r\n static async info(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'INFO');\r\n }\r\n \r\n static async error(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'ERROR');\r\n }\r\n \r\n static async warn(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'WARN');\r\n }\r\n \r\n static async debug(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'DEBUG');\r\n }\r\n \r\n /**\r\n * Limpia logs antiguos\r\n * @param filePath - Ruta del archivo de log\r\n * @param maxLines - Máximo número de líneas a mantener\r\n */\r\n static async cleanup(filePath: string, maxLines: number = 1000): Promise<number> {\r\n try {\r\n const lines = await this.read(filePath, { asArray: true }) as string[];\r\n \r\n if (lines.length > maxLines) {\r\n const keepLines = lines.slice(-maxLines);\r\n const content = keepLines.join('\\n') + '\\n';\r\n await fs.promises.writeFile(filePath, content, 'utf8');\r\n return lines.length - maxLines; // Líneas eliminadas\r\n }\r\n \r\n return 0;\r\n } catch (error) {\r\n console.error('Error limpiando logs:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina un archivo de log\r\n * @param filePath - Ruta del archivo de log a eliminar\r\n */\r\n static async deleteLogFile(filePath: string): Promise<boolean> {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n await fs.promises.unlink(filePath);\r\n return true;\r\n }\r\n return false;\r\n } catch (error) {\r\n console.error('Error eliminando archivo de log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina múltiples archivos de log\r\n * @param filePaths - Array de rutas de archivos de log a eliminar\r\n */\r\n static async deleteLogFiles(filePaths: string[]): Promise<DeleteResult[]> {\r\n const results: DeleteResult[] = [];\r\n \r\n for (const filePath of filePaths) {\r\n try {\r\n const deleted = await this.deleteLogFile(filePath);\r\n results.push({ filePath, deleted, error: null });\r\n } catch (error) {\r\n results.push({ filePath, deleted: false, error: (error as Error).message });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n}\r\n\r\nexport default FileLogger;","import { ComputedFieldConfig, DataObject, DataType } from \"../@types/DataObject\";\r\nimport { Column, DatabaseType, TableSchema } from \"../@types/Processor\";\r\nimport DbConfig from \"./DbConfig\";\r\n\r\nexport class ComputedFieldProcessor {\r\n\r\n static async getComputedFields(name: string): Promise<any[]> {\r\n let computedFields = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_computes_config WHERE database_ref='${name}'`);\r\n computedFields = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n computedFields = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n computedFields = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return computedFields;\r\n }\r\n\r\n /**\r\n * Processes computed field instruction and returns the computed value\r\n * @param instruction - The @compute instruction\r\n * @param rowData - The row data containing column values\r\n * @returns The computed value or null if there's an error\r\n */\r\n static processInstruction(instruction: string, rowData: Record<string, any>): any {\r\n try {\r\n // Remove @compute wrapper and extract the function content\r\n const functionMatch = instruction.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*{([\\s\\S]*?)}\\s*\\)/);\r\n\r\n if (!functionMatch) {\r\n throw new Error('Invalid @compute instruction format');\r\n }\r\n\r\n let functionBody: string = functionMatch[1].trim();\r\n\r\n // Clean up the function body - remove trailing semicolon if present\r\n if (functionBody.endsWith(';')) {\r\n functionBody = functionBody.slice(0, -1).trim();\r\n }\r\n\r\n // Replace @column(columnName) with actual values\r\n functionBody = functionBody.replace(/@column\\(([^)]+)\\)/g, (_match, columnName: string) => {\r\n const cleanColumnName = columnName.trim().replace(/['\"]/g, '');\r\n const value = rowData[cleanColumnName];\r\n\r\n if (value === null || value === undefined) {\r\n return 'null';\r\n } else if (typeof value === 'string') {\r\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\r\n } else if (typeof value === 'number' || typeof value === 'boolean') {\r\n return value.toString();\r\n } else if (value instanceof Date) {\r\n return `new Date(\"${value.toISOString()}\")`;\r\n } else {\r\n return JSON.stringify(value);\r\n }\r\n });\r\n\r\n // Create and execute the function\r\n const computeFunction = new Function(functionBody);\r\n return computeFunction();\r\n } catch (error) {\r\n console.error('Error processing computed field:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extracts column dependencies from a computed field instruction\r\n * @param instruction - The @compute instruction\r\n * @returns Array of column names that this computed field depends on\r\n */\r\n static extractDependencies(instruction: string): string[] {\r\n const dependencies: string[] = [];\r\n const columnMatches = instruction.match(/@column\\(([^)]+)\\)/g);\r\n\r\n if (columnMatches) {\r\n for (const match of columnMatches) {\r\n const innerMatch = match.match(/@column\\(([^)]+)\\)/);\r\n if (innerMatch) {\r\n const columnName = innerMatch[1].trim().replace(/['\"]/g, '');\r\n if (!dependencies.includes(columnName)) {\r\n dependencies.push(columnName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return dependencies;\r\n }\r\n\r\n /**\r\n * Adds computed fields to an array of data objects based on configuration array\r\n * @param data - Array of data objects\r\n * @param computedConfigs - Array of computed field configurations\r\n * @returns Array with the new computed fields added\r\n */\r\n static computedFields<T extends DataObject>(\r\n data: T[],\r\n computedConfigs: ComputedFieldConfig[]\r\n ): T[] {\r\n\r\n return data.map((item, index) => {\r\n let processedItem: any = { ...item };\r\n\r\n // Procesar cada configuración de campo computado\r\n computedConfigs.forEach((config) => {\r\n try {\r\n const { column: fieldName, type, instruction } = config;\r\n\r\n // Reemplazar @column(fieldName) con el valor real del objeto\r\n let processedExpression = instruction.replace(\r\n /@column\\(([^)]+)\\)/g,\r\n (match, columnName) => {\r\n // Remover comillas si las tiene\r\n const cleanColumnName = columnName.replace(/['\"]/g, '');\r\n const value = processedItem[cleanColumnName];\r\n\r\n // Convertir el valor a string seguro para la evaluación\r\n if (typeof value === 'string') {\r\n return `\"${value}\"`;\r\n } else if (value === null || value === undefined) {\r\n return 'null';\r\n } else {\r\n return String(value);\r\n }\r\n }\r\n );\r\n\r\n // Extraer la función dentro de @compute\r\n const computeMatch = processedExpression.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*\\{(.*)\\}\\s*\\)/s);\r\n if (!computeMatch) {\r\n throw new Error(`Formato de @compute inválido para campo ${fieldName}`);\r\n }\r\n\r\n const functionBody = computeMatch[1];\r\n\r\n // Crear y ejecutar la función\r\n const computeFunction = new Function(functionBody);\r\n let result = computeFunction();\r\n\r\n // Aplicar conversión de tipo\r\n result = convertToType(result, type as DataType);\r\n\r\n // Agregar el nuevo campo al objeto procesado\r\n processedItem[fieldName] = result;\r\n\r\n } catch (error) {\r\n console.error(`Error procesando campo ${config.column} en item ${index}:`, error);\r\n // En caso de error, asignar null al campo\r\n processedItem[config.column] = null;\r\n }\r\n });\r\n\r\n return processedItem;\r\n });\r\n }\r\n}\r\n\r\nexport class TableProcessor {\r\n static async generateAlterQueries(\r\n nowQuery: string,\r\n dbType: DatabaseType,\r\n tableName: string,\r\n database_ref: string,\r\n ): Promise<string[]> {\r\n function parseCreateTableQuery(query: string, dbType: DatabaseType): TableSchema {\r\n // Limpiar y normalizar la query\r\n const cleanQuery = query.trim().replace(/\\s+/g, ' ');\r\n\r\n // Extraer el nombre de la tabla\r\n const tableNameMatch = cleanQuery.match(/CREATE TABLE (?:IF NOT EXISTS )?(\\w+)/i);\r\n if (!tableNameMatch) {\r\n throw new Error('No se pudo extraer el nombre de la tabla');\r\n }\r\n\r\n const tableName = tableNameMatch[1];\r\n\r\n // Extraer las definiciones de columnas\r\n const columnsMatch = cleanQuery.match(/\\((.+)\\)/);\r\n if (!columnsMatch) {\r\n throw new Error('No se pudieron extraer las definiciones de columnas');\r\n }\r\n\r\n const columnsString = columnsMatch[1];\r\n const columnDefinitions = columnsString.split(',').map(def => def.trim());\r\n\r\n const columns: Column[] = [];\r\n\r\n for (const def of columnDefinitions) {\r\n // Skip constraints that aren't column definitions\r\n if (def.toUpperCase().startsWith('PRIMARY KEY') ||\r\n def.toUpperCase().startsWith('FOREIGN KEY') ||\r\n def.toUpperCase().startsWith('CONSTRAINT')) {\r\n continue;\r\n }\r\n\r\n const parts = def.split(/\\s+/);\r\n if (parts.length < 2) continue;\r\n\r\n const columnName = parts[0];\r\n const columnType = parts[1];\r\n\r\n const column: Column = {\r\n name: columnName,\r\n type: columnType,\r\n nullable: !def.toUpperCase().includes('NOT NULL'),\r\n primaryKey: def.toUpperCase().includes('PRIMARY KEY'),\r\n autoIncrement: def.toUpperCase().includes('AUTOINCREMENT') || def.toUpperCase().includes('AUTO_INCREMENT')\r\n };\r\n\r\n columns.push(column);\r\n }\r\n\r\n return { tableName, columns };\r\n }\r\n\r\n function generateMySQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // Modificar columna existente\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${columnDef};`);\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generatePostgreSQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'postgres');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // PostgreSQL requiere comandos separados para diferentes modificaciones\r\n if (column.type !== oldColumn.type) {\r\n const pgType = column.type.replace('INTEGER', 'INT').replace('TEXT', 'VARCHAR');\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} TYPE ${pgType};`);\r\n }\r\n\r\n if (column.nullable !== oldColumn.nullable) {\r\n const constraint = column.nullable ? 'DROP NOT NULL' : 'SET NOT NULL';\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} ${constraint};`);\r\n }\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generateSQLiteQueries(\r\n nowSchema: TableSchema,\r\n oldSchema: TableSchema,\r\n tableName: string\r\n ): string[] {\r\n // SQLite no soporta DROP COLUMN directamente, necesitamos recrear la tabla\r\n const queries: string[] = [];\r\n\r\n // Verificar si hay diferencias\r\n if (schemasEqual(nowSchema, oldSchema)) {\r\n return queries; // No hay cambios\r\n }\r\n\r\n const tempTableName = `${tableName}_temp_${Date.now()}`;\r\n\r\n // 1. Crear tabla temporal con el nuevo esquema\r\n const createTempQuery = buildCreateTableQuery(nowSchema, 'sqlite', tempTableName);\r\n queries.push(createTempQuery);\r\n\r\n // 2. Copiar datos compatibles\r\n const commonColumns = nowSchema.columns\r\n .filter(col => oldSchema.columns.some(oldCol => oldCol.name.toLowerCase() === col.name.toLowerCase()))\r\n .map(col => col.name);\r\n\r\n if (commonColumns.length > 0) {\r\n const columnsList = commonColumns.join(', ');\r\n queries.push(`INSERT INTO ${tempTableName} (${columnsList}) SELECT ${columnsList} FROM ${tableName};`);\r\n }\r\n\r\n // 3. Eliminar tabla original\r\n queries.push(`DROP TABLE ${tableName};`);\r\n\r\n // 4. Renombrar tabla temporal\r\n queries.push(`ALTER TABLE ${tempTableName} RENAME TO ${tableName};`);\r\n\r\n return queries;\r\n }\r\n\r\n function generateMongoDBQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n collectionName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Campos a eliminar\r\n const fieldsToRemove: string[] = [];\r\n for (const [fieldName] of oldColumns) {\r\n if (!nowColumns.has(fieldName)) {\r\n fieldsToRemove.push(fieldName);\r\n }\r\n }\r\n\r\n if (fieldsToRemove.length > 0) {\r\n const unsetFields = fieldsToRemove.reduce((acc, field) => {\r\n acc[field] = \"\";\r\n return acc;\r\n }, {} as Record<string, string>);\r\n\r\n queries.push(`db.${collectionName}.updateMany({}, { $unset: ${JSON.stringify(unsetFields)} });`);\r\n }\r\n\r\n // Campos a agregar (con valores por defecto)\r\n const fieldsToAdd: Record<string, any> = {};\r\n for (const [fieldName, column] of nowColumns) {\r\n if (!oldColumns.has(fieldName)) {\r\n // Valor por defecto según el tipo\r\n let defaultValue: any = null;\r\n if (!column.nullable) {\r\n switch (column.type.toUpperCase()) {\r\n case 'INTEGER':\r\n defaultValue = 0;\r\n break;\r\n case 'TEXT':\r\n case 'VARCHAR':\r\n defaultValue = '';\r\n break;\r\n default:\r\n defaultValue = null;\r\n }\r\n }\r\n fieldsToAdd[fieldName] = defaultValue;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldsToAdd).length > 0) {\r\n queries.push(`db.${collectionName}.updateMany({}, { $set: ${JSON.stringify(fieldsToAdd)} });`);\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function buildColumnDefinition(column: Column, dbType: DatabaseType): string {\r\n let def = `${column.name} ${column.type}`;\r\n\r\n if (column.primaryKey) {\r\n def += ' PRIMARY KEY';\r\n }\r\n\r\n if (column.autoIncrement) {\r\n if (dbType === 'mysql') {\r\n def += ' AUTO_INCREMENT';\r\n } else if (dbType === 'sqlite') {\r\n def += ' AUTOINCREMENT';\r\n } else if (dbType === 'postgres') {\r\n def = def.replace(column.type, 'SERIAL');\r\n }\r\n }\r\n\r\n if (!column.nullable) {\r\n def += ' NOT NULL';\r\n }\r\n\r\n return def;\r\n }\r\n\r\n function buildCreateTableQuery(schema: TableSchema, dbType: DatabaseType, tableName?: string): string {\r\n const name = tableName || schema.tableName;\r\n const columnDefs = schema.columns.map(col => buildColumnDefinition(col, dbType));\r\n return `CREATE TABLE ${name} (${columnDefs.join(', ')});`;\r\n }\r\n\r\n function columnsEqual(col1: Column, col2: Column): boolean {\r\n return col1.name.toLowerCase() === col2.name.toLowerCase() &&\r\n col1.type === col2.type &&\r\n col1.nullable === col2.nullable &&\r\n col1.primaryKey === col2.primaryKey &&\r\n col1.autoIncrement === col2.autoIncrement;\r\n }\r\n\r\n function schemasEqual(schema1: TableSchema, schema2: TableSchema): boolean {\r\n if (schema1.columns.length !== schema2.columns.length) {\r\n return false;\r\n }\r\n\r\n const cols1 = new Map(schema1.columns.map(col => [col.name.toLowerCase(), col]));\r\n const cols2 = new Map(schema2.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n for (const [name, col1] of cols1) {\r\n const col2 = cols2.get(name);\r\n if (!col2 || !columnsEqual(col1, col2)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_schemas_config WHERE table_ref='${tableName}' AND database_ref='${database_ref}'`);\r\n const oldQuery = queryComputes.data[0];\r\n\r\n // Validar que oldQuery existe y tiene struct\r\n if (!oldQuery || !oldQuery.struct) {\r\n console.error('No exist a previus schema please execute the refresh first...', oldQuery);\r\n return [];\r\n }\r\n\r\n const nowSchema = parseCreateTableQuery(nowQuery, dbType);\r\n const oldSchema = parseCreateTableQuery(oldQuery.struct, dbType);\r\n\r\n // Verificar que el nombre de tabla coincida\r\n if (nowSchema.tableName.toLowerCase() !== tableName.toLowerCase()) {\r\n throw new Error(`El nombre de tabla en la query (${nowSchema.tableName}) no coincide con el parámetro (${tableName})`);\r\n }\r\n\r\n // Crear mapas para facilitar la comparación\r\n const nowColumns = new Map(nowSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n const oldColumns = new Map(oldSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n switch (dbType) {\r\n case 'mysql':\r\n return generateMySQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'postgres':\r\n return generatePostgreSQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'sqlite':\r\n return generateSQLiteQueries(nowSchema, oldSchema, tableName);\r\n\r\n case 'mongodb':\r\n return generateMongoDBQueries(nowColumns, oldColumns, tableName);\r\n\r\n default:\r\n throw new Error(`Tipo de base de datos no soportado: ${dbType}`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n return [nowQuery];\r\n } else {\r\n return [nowQuery];\r\n }\r\n }\r\n\r\n static async saveQuery(table_ref: string, database_ref: string, struct: string): Promise<void> {\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n await DbConfig.query(`DELETE FROM dbcube_schemas_config WHERE table_ref='${table_ref}' AND database_ref='${database_ref}'`);\r\n\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `INSERT INTO dbcube_schemas_config (table_ref, database_ref, struct) VALUES (?, ?, ?)`;\r\n await DbConfig.queryWithParameters(tableExistsQuery, [table_ref, database_ref, struct]);\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n }\r\n}\r\n\r\nexport class TriggerProcessor {\r\n\r\n static async getTriggers(name: string): Promise<any[]> {\r\n let triggers = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_triggers_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_triggers_config WHERE database_ref='${name}'`);\r\n triggers = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n triggers = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n triggers = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return triggers;\r\n }\r\n}\r\n\r\n// Utils\r\nfunction convertToType(value: any, type: DataType): any {\r\n switch (type) {\r\n case 'string':\r\n return String(value);\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? 0 : num;\r\n case 'boolean':\r\n return Boolean(value);\r\n case 'date':\r\n return value instanceof Date ? value : new Date(value);\r\n case 'object':\r\n return value;\r\n default:\r\n return value;\r\n }\r\n}"],"mappings":";;;;;;;;AAAA,OAAO,UAAU;;;ACAjB,YAAY,QAAQ;AAoBpB,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EAER,cAAc;AACV,SAAK,aAAa,KAAK,iBAAiB;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAA+B;AACnC,WAAO;AAAA,MACH,UAAa,YAAS;AAAA,MACtB,MAAS,QAAK;AAAA,MACd,SAAY,WAAQ;AAAA,MACpB,MAAS,QAAK;AAAA,MACd,YAAe,cAAW;AAAA,MAC1B,MAAS,QAAK,EAAE;AAAA,IACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AAClB,UAAMA,YAAW,KAAK,WAAW;AAEjC,YAAQA,WAAU;AAAA,MACd,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAOA;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0B;AACtB,UAAMC,QAAO,KAAK,WAAW;AAE7B,YAAQA,OAAM;AAAA,MACV,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX,KAAK;AACD,eAAO;AAAA,MACX;AACI,eAAOA;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,UAA0B;AACpC,UAAMD,YAAW,KAAK,YAAY;AAClC,UAAMC,QAAO,KAAK,gBAAgB;AAClC,UAAM,YAAYD,cAAa,YAAY,SAAS;AAEpD,WAAO,GAAG,QAAQ,IAAIA,SAAQ,IAAIC,KAAI,GAAG,SAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA4B;AACxB,WAAO,EAAE,GAAG,KAAK,WAAW;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAA8B;AAC1B,UAAMD,YAAW,KAAK,YAAY;AAClC,UAAMC,QAAO,KAAK,gBAAgB;AAGlC,UAAM,YAAuC;AAAA,MACzC,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,IACtB;AAEA,UAAM,MAAM,GAAGD,SAAQ,IAAIC,KAAI;AAC/B,WAAO,UAAU,GAAG,KAAK,GAAGA,KAAI,YAAYD,SAAQ;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAwB;AACpB,YAAQ,IAAI,sCAA0B;AACtC,YAAQ,IAAI,0BAAgB,KAAK,YAAY,CAAC;AAC9C,YAAQ,IAAI,8BAAoB,KAAK,gBAAgB,CAAC;AACtD,YAAQ,IAAI,yBAAe,KAAK,WAAW,IAAI;AAC/C,YAAQ,IAAI,4BAAkB,KAAK,WAAW,OAAO;AACrD,YAAQ,IAAI,4BAAkB,KAAK,WAAW,UAAU;AACxD,YAAQ,IAAI,sBAAY,KAAK,WAAW,IAAI;AAC5C,YAAQ,IAAI,6BAAmB,KAAK,oBAAoB,CAAC;AAAA,EAC7D;AACJ;;;ACrJA,IAAM,SAAN,MAAY;AAAA,EACR,OAAO,MAAiB;AACpB,UAAME,QAAO,IAAI,aAAa;AAC9B,UAAMC,YAAWD,MAAK,YAAY;AAClC,UAAM,eAAeA,MAAK,gBAAgB;AAC1C,YAAOC,WAAS;AAAA,MACZ,KAAK;AACD,YAAG,gBAAc,UAAS;AACtB,iBAAO;AAAA,YACH,cAAc;AAAA,YACd,eAAe;AAAA,UACnB;AAAA,QACJ;AACA;AAAA,IACR;AACA,WAAO;AAAA,MACH,cAAc;AAAA,MACd,eAAe;AAAA,IACnB;AAAA,EACJ;AACJ;;;ACPO,IAAM,SAAN,MAAa;AAAA,EACV,OAAmB,CAAC;AAAA,EACpB,YAA4C,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrD,IAAI,YAA8B;AAChC,SAAK,OAAO;AAEZ,QAAI,WAAW,WAAW;AACxB,WAAK,YAAY,WAAW;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAa,KAAgB;AAC3B,WAAO,KAAK,KAAK,GAAG;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,QAAuC;AACjD,WAAO,KAAK,UAAU,MAAM,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkD;AAChD,WAAO,KAAK;AAAA,EACd;AACF;;;AHtDA,SAAS,aAAa;AAItB,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAc,UAAU,KAAO;AACvC,SAAK,OAAO;AACZ,SAAK,SAAS,KAAK,UAAU,IAAI;AACjC,UAAM,SAAqB,OAAO,IAAI;AACtC,SAAK,SAAS;AAAA,MACV,cAAc,KAAK,QAAQ,WAAW,UAAU,OAAO,YAAY;AAAA,MACnE,eAAe,KAAK,QAAQ,WAAW,UAAU,OAAO,aAAa;AAAA,IACzE;AACA,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,eAAe;AACX,QAAI,OAAO,CAAC;AACZ,QAAI,KAAK,OAAO,QAAQ,UAAU;AAC9B,aAAO;AAAA,QACH;AAAA,QAAQ,YAAY,KAAK;AAAA,QACzB;AAAA,QAAkB,KAAK;AAAA,QACvB;AAAA,QAAc,KAAK,OAAO,OAAO,WAAW;AAAA,QAC5C;AAAA,QAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,IACJ,OAAO;AACH,aAAO;AAAA,QACH;AAAA,QAAQ,YAAY,KAAK;AAAA,QACzB;AAAA,QAAkB,KAAK;AAAA,QACvB;AAAA,QAAc,KAAK,OAAO,OAAO;AAAA,QACjC;AAAA,QAAU,KAAK,OAAO,OAAO;AAAA,QAC7B;AAAA,QAAU,KAAK,OAAO,OAAO;AAAA,QAC7B;AAAA,QAAU,KAAK,OAAO,OAAO;AAAA,QAC7B;AAAA,QAAc,KAAK,OAAO,OAAO;AAAA,QACjC;AAAA,QAAW,KAAK,OAAO;AAAA,MAC3B;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,MAAc;AACpB,UAAM,iBAAiB,IAAI,OAAY;AAEvC,UAAM,iBAAiB,KAAK,QAAQ,QAAQ,IAAI,GAAG,kBAAkB;AACrE,UAAM,WAAW,UAAQ,cAAc;AAEvC,QAAI,OAAO,aAAa,YAAY;AAChC,eAAS,cAAc;AAAA,IAC3B,OAAO;AACH,cAAQ,MAAM,+DAAuD;AAAA,IACzE;AAEA,WAAO,eAAe,YAAY,IAAI;AAAA,EAE1C;AAAA,EAEA,YAAY;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,IAAI,QAAgB,MAAU;AAChC,WAAO,IAAI,QAAwB,CAACC,UAAS,WAAW;AACpD,YAAM,QAAQ,MAAM,KAAK,OAAO,MAA0B,GAAG,CAAC,GAAG,KAAK,WAAW,GAAG,IAAI,CAAC;AAEzF,UAAI,eAAe;AACnB,UAAI,eAAe;AACnB,UAAI,aAAa;AAEjB,YAAM,YAAY,WAAW,MAAM;AAC/B,YAAI,CAAC,YAAY;AACb,uBAAa;AACb,gBAAM,KAAK;AACX,iBAAO,IAAI,MAAM,iBAAiB,CAAC;AAAA,QACvC;AAAA,MACJ,GAAG,KAAK,OAAO;AAEf,YAAM,cAAc,CAAC,aAA6B;AAC9C,YAAI,CAAC,YAAY;AACb,uBAAa;AACb,uBAAa,SAAS;AACtB,UAAAA,SAAQ,QAAQ;AAAA,QACpB;AAAA,MACJ;AAEA,YAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAC9B,wBAAgB,KAAK,SAAS;AAI9B,cAAM,QAAQ,aAAa,MAAM,2BAA2B;AAC5D,YAAI,OAAO;AACP,cAAI;AACA,kBAAM,WAA4B,KAAK,MAAM,MAAM,CAAC,CAAC;AACrD,wBAAY;AAAA,cACR,QAAQ,SAAS;AAAA,cACjB,SAAS,SAAS;AAAA,cAClB,MAAM,SAAS;AAAA,YACnB,CAAC;AAAA,UACL,SAAS,OAAO;AACZ,wBAAY;AAAA,cACR,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,MAAM;AAAA,YACV,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ,CAAC;AAED,YAAM,OAAO,GAAG,QAAQ,CAAC,SAAS;AAC9B,wBAAgB,KAAK,SAAS;AAI9B,cAAM,QAAQ,aAAa,MAAM,2BAA2B;AAC5D,YAAI,OAAO;AACP,cAAI;AACA,kBAAM,WAA4B,KAAK,MAAM,MAAM,CAAC,CAAC;AACrD,wBAAY;AAAA,cACR,QAAQ,SAAS;AAAA,cACjB,SAAS,SAAS;AAAA,cAClB,MAAM,SAAS;AAAA,YACnB,CAAC;AAAA,UACL,SAAS,OAAO;AACZ,wBAAY;AAAA,cACR,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,MAAM;AAAA,YACV,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ,CAAC;AAGD,YAAM,GAAG,SAAS,CAAC,SAAS;AACxB,qBAAa,SAAS;AACtB,YAAI,CAAC,YAAY;AACb,sBAAY;AAAA,YACR,QAAQ,SAAS,IAAI,MAAM;AAAA,YAC3B,SAAS,SAAS,IAAI,sBAAsB,4BAA4B,IAAI;AAAA,YAC5E,MAAM;AAAA,UACV,CAAC;AAAA,QACL;AAAA,MACJ,CAAC;AAED,YAAM,GAAG,SAAS,CAAC,UAAU;AACzB,qBAAa,SAAS;AACtB,YAAI,CAAC,YAAY;AACb,sBAAY;AAAA,YACR,QAAQ;AAAA,YACR,SAAS,kBAAkB,MAAM,OAAO;AAAA,YACxC,MAAM;AAAA,UACV,CAAC;AAAA,QACL;AAAA,MACJ,CAAC;AAED,YAAM,MAAM;AAAA,IAChB,CAAC;AAAA,EACL;AACJ;;;AIxKA,OAAO,cAAc;AACrB,YAAYC,WAAU;AACtB,OAAO,QAAQ;AAEf,IAAM,WAAgB,cAAQ,QAAQ,IAAI,GAAG,QAAQ;AA2BrD,IAAM,SAAN,MAAa;AAAA,EACD,KAA+B;AAAA,EAC/B;AAAA,EAER,YAAY,QAAwB;AAChC,SAAK,WAAW,OAAO;AAAA,EAC3B;AAAA,EAEA,UAAmB;AACf,QAAI,KAAK,UAAU;AACf,YAAM,SAAS,KAAK,YAAY;AAChC,YAAM,aAAkB,WAAK,UAAU,SAAS,KAAK;AACrD,UAAI,GAAG,WAAW,UAAU,GAAG;AAC3B,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,UAAsC;AACxC,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACpC,UAAI;AACA,YAAI,CAAC,KAAK,IAAI;AACV,gBAAM,SAAS,KAAK,YAAY;AAChC,gBAAM,aAAkB,WAAK,UAAU,SAAS,KAAK;AAErD,eAAK,KAAK,IAAI,SAAS,UAAU;AAAA,QACrC;AACA,QAAAA,SAAQ,KAAK,EAAE;AAAA,MACnB,SAAS,OAAO;AACZ,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,aAA4B;AAC9B,WAAO,IAAI,QAAQ,CAACA,aAAY;AAC5B,UAAI,KAAK,IAAI;AACT,aAAK,GAAG,MAAM;AACd,aAAK,KAAK;AAAA,MACd;AACA,MAAAA,SAAQ;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,MAAM,UAAwC;AAChD,WAAO,IAAI,QAAQ,OAAOA,aAAY;AAClC,UAAI;AACA,YAAI,OAAO,aAAa,UAAU;AAC9B,gBAAM,IAAI,MAAM,iCAAiC;AAAA,QACrD;AAEA,YAAI,CAAC,KAAK,IAAI;AACV,gBAAM,KAAK,QAAQ;AAAA,QACvB;AAEA,YAAI,CAAC,KAAK,IAAI;AACV,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QAC3D;AAEA,cAAM,cAAc,SAAS,MAAM,GAAG,EAAE,OAAO,SAAO,IAAI,KAAK,EAAE,SAAS,CAAC;AAC3E,cAAM,UAAiB,CAAC;AAExB,mBAAW,WAAW,aAAa;AAC/B,gBAAM,QAAQ,GAAG,OAAO;AACxB,gBAAM,WAAW,MAAM,KAAK,EAAE,YAAY,EAAE,WAAW,QAAQ;AAE/D,cAAI,UAAU;AACV,kBAAM,OAAO,KAAK,GAAG,QAAQ,KAAK;AAClC,kBAAM,OAAO,KAAK,IAAI;AACtB,oBAAQ,KAAK,IAAI;AAAA,UACrB,OAAO;AACH,kBAAM,OAAO,KAAK,GAAG,QAAQ,KAAK;AAClC,kBAAM,SAAS,KAAK,IAAI;AACxB,oBAAQ,KAAK;AAAA,cACT,SAAS,OAAO;AAAA,cAChB,QAAQ,OAAO;AAAA,YACnB,CAAC;AAAA,UACL;AAAA,QACJ;AAEA,QAAAA,SAAQ;AAAA,UACJ,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,MAAM,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,QAC9C,CAAC;AAAA,MACL,SAAS,OAAO;AACZ,QAAAA,SAAQ;AAAA,UACJ,QAAQ;AAAA,UACR,SAAU,MAAgB,WAAW;AAAA,UACrC,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,oBAAoB,UAAkB,SAAgB,CAAC,GAAyB;AAClF,WAAO,IAAI,QAAQ,OAAOA,aAAY;AAClC,UAAI;AACA,YAAI,OAAO,aAAa,UAAU;AAC9B,gBAAM,IAAI,MAAM,iCAAiC;AAAA,QACrD;AAEA,YAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AACxB,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAClD;AAEA,YAAI,CAAC,KAAK,IAAI;AACV,gBAAM,KAAK,QAAQ;AAAA,QACvB;AAEA,YAAI,CAAC,KAAK,IAAI;AACV,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QAC3D;AAEA,cAAM,WAAW,SAAS,KAAK,EAAE,YAAY,EAAE,WAAW,QAAQ;AAClE,cAAM,OAAO,KAAK,GAAG,QAAQ,QAAQ;AAErC,YAAI,UAAU;AACV,gBAAM,OAAO,KAAK,IAAI,GAAG,MAAM;AAC/B,UAAAA,SAAQ;AAAA,YACJ,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,UACV,CAAC;AAAA,QACL,OAAO;AACH,gBAAM,SAAS,KAAK,IAAI,GAAG,MAAM;AACjC,UAAAA,SAAQ;AAAA,YACJ,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,MAAM;AAAA,cACF,SAAS,OAAO;AAAA,cAChB,QAAQ,OAAO;AAAA,YACnB;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,IAAI,KAAK;AACjB,QAAAA,SAAQ;AAAA,UACJ,QAAQ;AAAA,UACR,SAAU,MAAgB,WAAW;AAAA,UACrC,MAAM;AAAA,QACV,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,4BAA4B,KAAsC;AAC9D,UAAM,gBAAgB,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAEpD,UAAM,iBAAiB,cAAc,MAAM,uBAAuB;AAClE,QAAI,CAAC,gBAAgB;AACjB,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC9E;AAEA,UAAM,YAAY,eAAe,CAAC;AAElC,UAAM,mBAAmB,cAAc,YAAY,EAAE,QAAQ,QAAQ;AACrE,UAAM,gBAAgB,cAAc,UAAU,gBAAgB;AAC9D,UAAM,cAAc,cAAc,MAAM,6BAA6B;AACrE,QAAI,CAAC,aAAa;AACd,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACvE;AAEA,UAAM,eAAe,YAAY,CAAC;AAElC,aAAS,YAAY,KAAoB;AACrC,YAAM,SAAgB,CAAC;AACvB,UAAI,eAAe;AACnB,UAAI,WAAW;AACf,UAAI,YAAY;AAChB,UAAI,YAAY;AAChB,UAAI,eAAe;AAEnB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,cAAM,OAAO,IAAI,CAAC;AAClB,cAAM,WAAW,IAAI,IAAI,CAAC;AAE1B,YAAI,CAAC,YAAY,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,YAAY;AACrD,sBAAY;AAAA,QAChB;AAEA,YAAI,aAAa,SAAS,KAAK;AAC3B;AAAA,QACJ,WAAW,aAAa,SAAS,KAAK;AAClC;AACA,cAAI,iBAAiB,GAAG;AACpB,wBAAY;AAAA,UAChB;AAAA,QACJ;AAEA,YAAI,CAAC,cAAc,SAAS,OAAO,SAAS,QAAQ,aAAa,MAAM;AACnE,cAAI,CAAC,UAAU;AACX,uBAAW;AACX,wBAAY;AAAA,UAChB,WAAW,SAAS,WAAW;AAC3B,gBAAI,IAAI,IAAI,CAAC,MAAM,WAAW;AAC1B,8BAAgB,OAAO;AACvB;AACA;AAAA,YACJ,OAAO;AACH,yBAAW;AACX,0BAAY;AAAA,YAChB;AAAA,UACJ;AAAA,QACJ;AAEA,YAAI,CAAC,YAAY,CAAC,aAAa,SAAS,KAAK;AACzC,iBAAO,KAAK,WAAW,aAAa,KAAK,CAAC,CAAC;AAC3C,yBAAe;AACf;AAAA,QACJ;AAEA,wBAAgB;AAAA,MACpB;AAEA,UAAI,aAAa,KAAK,GAAG;AACrB,eAAO,KAAK,WAAW,aAAa,KAAK,CAAC,CAAC;AAAA,MAC/C;AAEA,aAAO;AAAA,IACX;AAEA,aAAS,WAAW,OAAoB;AACpC,cAAQ,MAAM,KAAK;AAEnB,UAAI,MAAM,WAAW,UAAU,GAAG;AAC9B,eAAO;AAAA,MACX;AAEA,UAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AAChD,gBAAQ,MAAM,MAAM,GAAG,EAAE;AACzB,gBAAQ,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AAAA,MACxD;AAEA,aAAO;AAAA,IACX;AAEA,UAAM,aAAa,YAAY,YAAY;AAC3C,UAAM,eAAe,WAAW,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACxD,UAAM,oBAAoB,GAAG,SAAS,YAAY,YAAY;AAE9D,WAAO;AAAA,MACH,OAAO;AAAA,MACP;AAAA,IACJ;AAAA,EACJ;AACJ;AAEO,IAAM,WAAW,IAAI,OAAO,EAAC,UAAU,SAAQ,CAAC;AACvD,IAAO,mBAAQ;;;AC1Rf,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,oBAAoB;AA4CtB,IAAM,aAAN,MAAM,oBAAmB,aAAa;AAAA,EACzC,OAAe,WAAW,oBAAI,IAAsD;AAAA;AAAA,EACpF,OAAe,UAAU,oBAAI,IAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASnD,aAAa,MAAM,UAAkB,SAAiB,QAAkB,QAAQ,SAAkB,MAAwB;AACtH,QAAI;AAEA,YAAM,MAAW,cAAQ,QAAQ;AACjC,UAAI,CAAI,eAAW,GAAG,GAAG;AACrB,QAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MACzC;AAGA,YAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,YAAM,mBAAmB,IAAI,SAAS,MAAM,KAAK,KAAK,OAAO;AAAA;AAG7D,UAAI,YAAW,QAAQ,IAAI,QAAQ,GAAG;AAClC,oBAAW,QAAQ,IAAI,QAAQ,EAAG,KAAK,gBAAgB;AACvD,eAAO;AAAA,MACX;AAGA,UAAI,QAAQ;AACR,cAAS,aAAS,WAAW,UAAU,kBAAkB,MAAM;AAAA,MACnE,OAAO;AACH,cAAS,aAAS,UAAU,UAAU,kBAAkB,MAAM;AAAA,MAClE;AAEA,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,cAAQ,MAAM,0BAA0B,KAAK;AAC7C,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAAY,UAAwB;AACvC,QAAI,CAAC,YAAW,QAAQ,IAAI,QAAQ,GAAG;AACnC,kBAAW,QAAQ,IAAI,UAAU,CAAC,CAAC;AAAA,IACvC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,aAAa,UAAoC;AAC1D,UAAM,SAAS,YAAW,QAAQ,IAAI,QAAQ;AAC9C,QAAI,UAAU,OAAO,SAAS,GAAG;AAC7B,UAAI;AAEA,cAAM,MAAW,cAAQ,QAAQ;AACjC,YAAI,CAAI,eAAW,GAAG,GAAG;AACrB,UAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,QACzC;AAGA,cAAM,UAAU,OAAO,KAAK,EAAE;AAC9B,cAAS,aAAS,WAAW,UAAU,SAAS,MAAM;AAGtD,oBAAW,QAAQ,OAAO,QAAQ;AAClC,eAAO;AAAA,MACX,SAAS,OAAO;AACZ,gBAAQ,MAAM,6BAA6B,KAAK;AAChD,cAAM;AAAA,MACV;AAAA,IACJ;AAGA,gBAAW,QAAQ,OAAO,QAAQ;AAClC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cAAc,UAA0B;AAC3C,QAAI,YAAW,QAAQ,IAAI,QAAQ,GAAG;AAClC,YAAM,iBAAiB,YAAW,QAAQ,IAAI,QAAQ,EAAG;AACzD,kBAAW,QAAQ,OAAO,QAAQ;AAClC,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAAU,UAA2B;AACxC,WAAO,YAAW,QAAQ,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cAAc,UAA0B;AAC3C,UAAM,SAAS,YAAW,QAAQ,IAAI,QAAQ;AAC9C,WAAO,SAAS,OAAO,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,iBAAiB,UAAkB,UAA4B,CAAC,GAAwB;AAC3F,UAAM;AAAA,MACF,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,eAAe;AAAA;AAAA,MACf,YAAY;AAAA;AAAA,IAChB,IAAI;AAGJ,QAAI,WAAW;AACX,kBAAW,YAAY,QAAQ;AAAA,IACnC;AAGA,UAAM,cAAc,QAAQ;AAC5B,UAAM,gBAAgB,QAAQ;AAC9B,UAAM,eAAe,QAAQ;AAE7B,QAAI,cAAc;AACd,cAAQ,MAAM,YAAY,MAAa;AACnC,cAAM,UAAU,KAAK;AAAA,UAAI,SACrB,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI,OAAO,GAAG;AAAA,QAC9D,EAAE,KAAK,GAAG;AAEV,oBAAW,MAAM,UAAU,SAAS,MAAM,EAAE,MAAM,SAAO;AACrD,wBAAc,0BAA0B,GAAG;AAAA,QAC/C,CAAC;AAED,YAAI,cAAc;AACd,sBAAY,MAAM,SAAS,IAAI;AAAA,QACnC;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,gBAAgB;AAChB,cAAQ,QAAQ,YAAY,MAAa;AACrC,cAAM,UAAU,KAAK;AAAA,UAAI,SACrB,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI,OAAO,GAAG;AAAA,QAC9D,EAAE,KAAK,GAAG;AAEV,oBAAW,MAAM,UAAU,SAAS,OAAO,EAAE,MAAM,SAAO;AACtD,wBAAc,gCAAgC,GAAG;AAAA,QACrD,CAAC;AAED,YAAI,cAAc;AACd,wBAAc,MAAM,SAAS,IAAI;AAAA,QACrC;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,eAAe;AACf,cAAQ,OAAO,YAAY,MAAa;AACpC,cAAM,UAAU,KAAK;AAAA,UAAI,SACrB,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI,OAAO,GAAG;AAAA,QAC9D,EAAE,KAAK,GAAG;AAEV,oBAAW,MAAM,UAAU,SAAS,MAAM,EAAE,MAAM,SAAO;AACrD,wBAAc,+BAA+B,GAAG;AAAA,QACpD,CAAC;AAED,YAAI,cAAc;AACd,uBAAa,MAAM,SAAS,IAAI;AAAA,QACpC;AAAA,MACJ;AAAA,IACJ;AAGA,WAAO;AAAA,MACH,SAAS,MAAM;AACX,YAAI,aAAc,SAAQ,MAAM;AAChC,YAAI,eAAgB,SAAQ,QAAQ;AACpC,YAAI,cAAe,SAAQ,OAAO;AAAA,MACtC;AAAA,MACA,QAAQ,YAAY;AAChB,YAAI,WAAW;AACX,iBAAO,MAAM,YAAW,aAAa,QAAQ;AAAA,QACjD;AACA,eAAO;AAAA,MACX;AAAA,MACA,SAAS,MAAM;AACX,YAAI,WAAW;AACX,iBAAO,YAAW,cAAc,QAAQ;AAAA,QAC5C;AACA,eAAO;AAAA,MACX;AAAA,MACA,WAAW,MAAM,YAAW,UAAU,QAAQ;AAAA,MAC9C,eAAe,MAAM,YAAW,cAAc,QAAQ;AAAA,IAC1D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,KAAK,UAAkB,UAAuB,CAAC,GAA+B;AACvF,UAAM;AAAA,MACF,QAAQ;AAAA;AAAA,MACR,UAAU;AAAA;AAAA,MACV,UAAU;AAAA;AAAA,IACd,IAAI;AAEJ,QAAI;AACA,UAAI,CAAI,eAAW,QAAQ,GAAG;AAC1B,eAAO,UAAU,CAAC,IAAI;AAAA,MAC1B;AAEA,UAAI,UAAU,MAAS,aAAS,SAAS,UAAU,MAAM;AAEzD,UAAI,SAAS;AACT,YAAI,aAAa,QAAQ,MAAM,IAAI,EAAE,OAAO,UAAQ,KAAK,KAAK,MAAM,EAAE;AAEtE,YAAI,UAAU,MAAM;AAChB,cAAI,SAAS;AACT,yBAAa,WAAW,MAAM,CAAC,KAAK;AAAA,UACxC,OAAO;AACH,yBAAa,WAAW,MAAM,GAAG,KAAK;AAAA,UAC1C;AAAA,QACJ;AAEA,eAAO;AAAA,MACX;AAGA,UAAI,UAAU,MAAM;AAChB,YAAI,aAAa,QAAQ,MAAM,IAAI,EAAE,OAAO,UAAQ,KAAK,KAAK,MAAM,EAAE;AACtE,YAAI,SAAS;AACT,uBAAa,WAAW,MAAM,CAAC,KAAK;AAAA,QACxC,OAAO;AACH,uBAAa,WAAW,MAAM,GAAG,KAAK;AAAA,QAC1C;AACA,kBAAU,WAAW,KAAK,IAAI;AAAA,MAClC;AAEA,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,cAAQ,MAAM,sBAAsB,KAAK;AACzC,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,MAAM,UAAkB,UAAoD,UAAwB,CAAC,GAAoB;AAC5H,UAAM;AAAA,MACF,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA;AAAA,IACd,IAAI;AAEJ,QAAI,WAAW;AACf,QAAI,eAAe;AAGnB,QAAO,eAAW,QAAQ,GAAG;AACzB,YAAM,QAAW,aAAS,QAAQ;AAClC,iBAAW,MAAM;AACjB,qBAAe,UAAU,MAAM,OAAO;AAAA,IAC1C;AAGA,UAAM,WAAW,OAAO,MAAgB,SAAmB;AACvD,UAAI;AACA,YAAI,KAAK,OAAO,UAAU;AAEtB,gBAAM,SAAY,qBAAiB,UAAU;AAAA,YACzC,OAAO;AAAA,YACP,KAAK,KAAK,OAAO;AAAA,YACjB,UAAU;AAAA,UACd,CAAC;AAED,cAAI,SAAS;AAEb,iBAAO,GAAG,QAAQ,CAAC,UAAU;AACzB,sBAAU;AACV,kBAAM,QAAQ,OAAO,MAAM,IAAI;AAG/B,qBAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACvC,kBAAI,MAAM,CAAC,EAAE,KAAK,GAAG;AACjB,yBAAS,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ;AAAA,cACtC;AAAA,YACJ;AAGA,qBAAS,MAAM,MAAM,SAAS,CAAC;AAAA,UACnC,CAAC;AAED,iBAAO,GAAG,OAAO,MAAM;AAEnB,gBAAI,OAAO,KAAK,GAAG;AACf,uBAAS,OAAO,KAAK,GAAG,QAAQ;AAAA,YACpC;AAAA,UACJ,CAAC;AAED,qBAAW,KAAK;AAChB,yBAAe,KAAK;AAAA,QACxB;AAAA,MACJ,SAAS,OAAO;AACZ,gBAAQ,MAAM,qBAAqB,KAAK;AAAA,MAC5C;AAAA,IACJ;AAGA,IAAG,cAAU,UAAU,EAAE,YAAY,SAAS,GAAG,QAAQ;AAGzD,UAAM,YAAY,GAAG,QAAQ,IAAI,KAAK,IAAI,CAAC;AAE3C,gBAAW,SAAS,IAAI,WAAW,QAAe;AAGlD,WAAO;AAAA,MACH,IAAI;AAAA,MACJ,MAAM,MAAM;AACR,cAAM,iBAAiB,YAAW,SAAS,IAAI,SAAS;AACxD,YAAI,gBAAgB;AAChB,UAAG,gBAAY,UAAU,cAAc;AACvC,sBAAW,SAAS,OAAO,SAAS;AAAA,QACxC;AAAA,MACJ;AAAA,MACA,YAAY,MAAM,YAAW,SAAS,IAAI,SAAS;AAAA,IACvD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,kBAAwB;AAC3B,eAAW,CAAC,SAAS,KAAK,YAAW,UAAU;AAC3C,YAAM,WAAW,UAAU,MAAM,GAAG,EAAE,CAAC;AACvC,MAAG,gBAAY,QAAQ;AAAA,IAC3B;AACA,gBAAW,SAAS,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAK,UAAkB,SAAmC;AACnE,WAAO,KAAK,MAAM,UAAU,SAAS,MAAM;AAAA,EAC/C;AAAA,EAEA,aAAa,MAAM,UAAkB,SAAmC;AACpE,WAAO,KAAK,MAAM,UAAU,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,aAAa,KAAK,UAAkB,SAAmC;AACnE,WAAO,KAAK,MAAM,UAAU,SAAS,MAAM;AAAA,EAC/C;AAAA,EAEA,aAAa,MAAM,UAAkB,SAAmC;AACpE,WAAO,KAAK,MAAM,UAAU,SAAS,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,QAAQ,UAAkB,WAAmB,KAAuB;AAC7E,QAAI;AACA,YAAM,QAAQ,MAAM,KAAK,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC;AAEzD,UAAI,MAAM,SAAS,UAAU;AACzB,cAAM,YAAY,MAAM,MAAM,CAAC,QAAQ;AACvC,cAAM,UAAU,UAAU,KAAK,IAAI,IAAI;AACvC,cAAS,aAAS,UAAU,UAAU,SAAS,MAAM;AACrD,eAAO,MAAM,SAAS;AAAA,MAC1B;AAEA,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,cAAQ,MAAM,yBAAyB,KAAK;AAC5C,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,cAAc,UAAoC;AAC3D,QAAI;AACA,UAAO,eAAW,QAAQ,GAAG;AACzB,cAAS,aAAS,OAAO,QAAQ;AACjC,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX,SAAS,OAAO;AACZ,cAAQ,MAAM,oCAAoC,KAAK;AACvD,YAAM;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,eAAe,WAA8C;AACtE,UAAM,UAA0B,CAAC;AAEjC,eAAW,YAAY,WAAW;AAC9B,UAAI;AACA,cAAM,UAAU,MAAM,KAAK,cAAc,QAAQ;AACjD,gBAAQ,KAAK,EAAE,UAAU,SAAS,OAAO,KAAK,CAAC;AAAA,MACnD,SAAS,OAAO;AACZ,gBAAQ,KAAK,EAAE,UAAU,SAAS,OAAO,OAAQ,MAAgB,QAAQ,CAAC;AAAA,MAC9E;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;;;ACleO,IAAM,yBAAN,MAA6B;AAAA,EAElC,aAAa,kBAAkB,MAA8B;AAC3D,QAAI,iBAAiB,CAAC;AACtB,QAAI,iBAAS,QAAQ,GAAG;AACtB,YAAM,iBAAS,QAAQ;AACvB,UAAI;AAEF,cAAM,mBAAmB;AACzB,cAAM,oBAAoB,MAAM,iBAAS,MAAM,gBAAgB;AAE/D,YAAI,kBAAkB,WAAW,aAAa,kBAAkB,QAAQ,kBAAkB,KAAK,SAAS,GAAG;AACzG,gBAAM,gBAAgB,MAAM,iBAAS,MAAM,4DAA4D,IAAI,GAAG;AAC9G,2BAAiB,cAAc;AAAA,QACjC,OAAO;AAEL,2BAAiB,CAAC;AAAA,QACpB;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AACtD,yBAAiB,CAAC;AAAA,MACpB;AACA,YAAM,iBAAS,WAAW;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,mBAAmB,aAAqB,SAAmC;AAChF,QAAI;AAEF,YAAM,gBAAgB,YAAY,MAAM,kDAAkD;AAE1F,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACvD;AAEA,UAAI,eAAuB,cAAc,CAAC,EAAE,KAAK;AAGjD,UAAI,aAAa,SAAS,GAAG,GAAG;AAC9B,uBAAe,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,MAChD;AAGA,qBAAe,aAAa,QAAQ,uBAAuB,CAAC,QAAQ,eAAuB;AACzF,cAAM,kBAAkB,WAAW,KAAK,EAAE,QAAQ,SAAS,EAAE;AAC7D,cAAM,QAAQ,QAAQ,eAAe;AAErC,YAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,iBAAO;AAAA,QACT,WAAW,OAAO,UAAU,UAAU;AACpC,iBAAO,IAAI,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACvC,WAAW,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAClE,iBAAO,MAAM,SAAS;AAAA,QACxB,WAAW,iBAAiB,MAAM;AAChC,iBAAO,aAAa,MAAM,YAAY,CAAC;AAAA,QACzC,OAAO;AACL,iBAAO,KAAK,UAAU,KAAK;AAAA,QAC7B;AAAA,MACF,CAAC;AAGD,YAAM,kBAAkB,IAAI,SAAS,YAAY;AACjD,aAAO,gBAAgB;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,aAA+B;AACxD,UAAM,eAAyB,CAAC;AAChC,UAAM,gBAAgB,YAAY,MAAM,qBAAqB;AAE7D,QAAI,eAAe;AACjB,iBAAW,SAAS,eAAe;AACjC,cAAM,aAAa,MAAM,MAAM,oBAAoB;AACnD,YAAI,YAAY;AACd,gBAAM,aAAa,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE;AAC3D,cAAI,CAAC,aAAa,SAAS,UAAU,GAAG;AACtC,yBAAa,KAAK,UAAU;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,eACL,MACA,iBACK;AAEL,WAAO,KAAK,IAAI,CAAC,MAAM,UAAU;AAC/B,UAAI,gBAAqB,EAAE,GAAG,KAAK;AAGnC,sBAAgB,QAAQ,CAAC,WAAW;AAClC,YAAI;AACF,gBAAM,EAAE,QAAQ,WAAW,MAAAC,OAAM,YAAY,IAAI;AAGjD,cAAI,sBAAsB,YAAY;AAAA,YACpC;AAAA,YACA,CAAC,OAAO,eAAe;AAErB,oBAAM,kBAAkB,WAAW,QAAQ,SAAS,EAAE;AACtD,oBAAM,QAAQ,cAAc,eAAe;AAG3C,kBAAI,OAAO,UAAU,UAAU;AAC7B,uBAAO,IAAI,KAAK;AAAA,cAClB,WAAW,UAAU,QAAQ,UAAU,QAAW;AAChD,uBAAO;AAAA,cACT,OAAO;AACL,uBAAO,OAAO,KAAK;AAAA,cACrB;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,eAAe,oBAAoB,MAAM,+CAA+C;AAC9F,cAAI,CAAC,cAAc;AACjB,kBAAM,IAAI,MAAM,8CAA2C,SAAS,EAAE;AAAA,UACxE;AAEA,gBAAM,eAAe,aAAa,CAAC;AAGnC,gBAAM,kBAAkB,IAAI,SAAS,YAAY;AACjD,cAAI,SAAS,gBAAgB;AAG7B,mBAAS,cAAc,QAAQA,KAAgB;AAG/C,wBAAc,SAAS,IAAI;AAAA,QAE7B,SAAS,OAAO;AACd,kBAAQ,MAAM,0BAA0B,OAAO,MAAM,YAAY,KAAK,KAAK,KAAK;AAEhF,wBAAc,OAAO,MAAM,IAAI;AAAA,QACjC;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,aAAa,qBACX,UACA,QACA,WACA,cACmB;AACnB,aAAS,sBAAsB,OAAeC,SAAmC;AAE/E,YAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAGnD,YAAM,iBAAiB,WAAW,MAAM,wCAAwC;AAChF,UAAI,CAAC,gBAAgB;AACnB,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,YAAMC,aAAY,eAAe,CAAC;AAGlC,YAAM,eAAe,WAAW,MAAM,UAAU;AAChD,UAAI,CAAC,cAAc;AACjB,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AAEA,YAAM,gBAAgB,aAAa,CAAC;AACpC,YAAM,oBAAoB,cAAc,MAAM,GAAG,EAAE,IAAI,SAAO,IAAI,KAAK,CAAC;AAExE,YAAM,UAAoB,CAAC;AAE3B,iBAAW,OAAO,mBAAmB;AAEnC,YAAI,IAAI,YAAY,EAAE,WAAW,aAAa,KAC5C,IAAI,YAAY,EAAE,WAAW,aAAa,KAC1C,IAAI,YAAY,EAAE,WAAW,YAAY,GAAG;AAC5C;AAAA,QACF;AAEA,cAAM,QAAQ,IAAI,MAAM,KAAK;AAC7B,YAAI,MAAM,SAAS,EAAG;AAEtB,cAAM,aAAa,MAAM,CAAC;AAC1B,cAAM,aAAa,MAAM,CAAC;AAE1B,cAAM,SAAiB;AAAA,UACrB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,UAAU,CAAC,IAAI,YAAY,EAAE,SAAS,UAAU;AAAA,UAChD,YAAY,IAAI,YAAY,EAAE,SAAS,aAAa;AAAA,UACpD,eAAe,IAAI,YAAY,EAAE,SAAS,eAAe,KAAK,IAAI,YAAY,EAAE,SAAS,gBAAgB;AAAA,QAC3G;AAEA,gBAAQ,KAAK,MAAM;AAAA,MACrB;AAEA,aAAO,EAAE,WAAAA,YAAW,QAAQ;AAAA,IAC9B;AAEA,aAAS,qBACP,YACA,YACAA,YACU;AACV,YAAM,UAAoB,CAAC;AAG3B,iBAAW,CAAC,UAAU,KAAK,YAAY;AACrC,YAAI,CAAC,WAAW,IAAI,UAAU,GAAG;AAC/B,kBAAQ,KAAK,eAAeA,UAAS,gBAAgB,UAAU,GAAG;AAAA,QACpE;AAAA,MACF;AAGA,iBAAW,CAAC,YAAY,MAAM,KAAK,YAAY;AAC7C,cAAM,YAAY,WAAW,IAAI,UAAU;AAE3C,YAAI,CAAC,WAAW;AAEd,gBAAM,YAAY,sBAAsB,QAAQ,OAAO;AACvD,kBAAQ,KAAK,eAAeA,UAAS,eAAe,SAAS,GAAG;AAAA,QAClE,WAAW,CAAC,aAAa,QAAQ,SAAS,GAAG;AAE3C,gBAAM,YAAY,sBAAsB,QAAQ,OAAO;AACvD,kBAAQ,KAAK,eAAeA,UAAS,kBAAkB,SAAS,GAAG;AAAA,QACrE;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,0BACP,YACA,YACAA,YACU;AACV,YAAM,UAAoB,CAAC;AAG3B,iBAAW,CAAC,UAAU,KAAK,YAAY;AACrC,YAAI,CAAC,WAAW,IAAI,UAAU,GAAG;AAC/B,kBAAQ,KAAK,eAAeA,UAAS,gBAAgB,UAAU,GAAG;AAAA,QACpE;AAAA,MACF;AAGA,iBAAW,CAAC,YAAY,MAAM,KAAK,YAAY;AAC7C,cAAM,YAAY,WAAW,IAAI,UAAU;AAE3C,YAAI,CAAC,WAAW;AAEd,gBAAM,YAAY,sBAAsB,QAAQ,UAAU;AAC1D,kBAAQ,KAAK,eAAeA,UAAS,eAAe,SAAS,GAAG;AAAA,QAClE,WAAW,CAAC,aAAa,QAAQ,SAAS,GAAG;AAE3C,cAAI,OAAO,SAAS,UAAU,MAAM;AAClC,kBAAM,SAAS,OAAO,KAAK,QAAQ,WAAW,KAAK,EAAE,QAAQ,QAAQ,SAAS;AAC9E,oBAAQ,KAAK,eAAeA,UAAS,iBAAiB,UAAU,SAAS,MAAM,GAAG;AAAA,UACpF;AAEA,cAAI,OAAO,aAAa,UAAU,UAAU;AAC1C,kBAAM,aAAa,OAAO,WAAW,kBAAkB;AACvD,oBAAQ,KAAK,eAAeA,UAAS,iBAAiB,UAAU,IAAI,UAAU,GAAG;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,sBACP,WACA,WACAA,YACU;AAEV,YAAM,UAAoB,CAAC;AAG3B,UAAI,aAAa,WAAW,SAAS,GAAG;AACtC,eAAO;AAAA,MACT;AAEA,YAAM,gBAAgB,GAAGA,UAAS,SAAS,KAAK,IAAI,CAAC;AAGrD,YAAM,kBAAkB,sBAAsB,WAAW,UAAU,aAAa;AAChF,cAAQ,KAAK,eAAe;AAG5B,YAAM,gBAAgB,UAAU,QAC7B,OAAO,SAAO,UAAU,QAAQ,KAAK,YAAU,OAAO,KAAK,YAAY,MAAM,IAAI,KAAK,YAAY,CAAC,CAAC,EACpG,IAAI,SAAO,IAAI,IAAI;AAEtB,UAAI,cAAc,SAAS,GAAG;AAC5B,cAAM,cAAc,cAAc,KAAK,IAAI;AAC3C,gBAAQ,KAAK,eAAe,aAAa,KAAK,WAAW,YAAY,WAAW,SAASA,UAAS,GAAG;AAAA,MACvG;AAGA,cAAQ,KAAK,cAAcA,UAAS,GAAG;AAGvC,cAAQ,KAAK,eAAe,aAAa,cAAcA,UAAS,GAAG;AAEnE,aAAO;AAAA,IACT;AAEA,aAAS,uBACP,YACA,YACA,gBACU;AACV,YAAM,UAAoB,CAAC;AAG3B,YAAM,iBAA2B,CAAC;AAClC,iBAAW,CAAC,SAAS,KAAK,YAAY;AACpC,YAAI,CAAC,WAAW,IAAI,SAAS,GAAG;AAC9B,yBAAe,KAAK,SAAS;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,GAAG;AAC7B,cAAM,cAAc,eAAe,OAAO,CAAC,KAAK,UAAU;AACxD,cAAI,KAAK,IAAI;AACb,iBAAO;AAAA,QACT,GAAG,CAAC,CAA2B;AAE/B,gBAAQ,KAAK,MAAM,cAAc,6BAA6B,KAAK,UAAU,WAAW,CAAC,MAAM;AAAA,MACjG;AAGA,YAAM,cAAmC,CAAC;AAC1C,iBAAW,CAAC,WAAW,MAAM,KAAK,YAAY;AAC5C,YAAI,CAAC,WAAW,IAAI,SAAS,GAAG;AAE9B,cAAI,eAAoB;AACxB,cAAI,CAAC,OAAO,UAAU;AACpB,oBAAQ,OAAO,KAAK,YAAY,GAAG;AAAA,cACjC,KAAK;AACH,+BAAe;AACf;AAAA,cACF,KAAK;AAAA,cACL,KAAK;AACH,+BAAe;AACf;AAAA,cACF;AACE,+BAAe;AAAA,YACnB;AAAA,UACF;AACA,sBAAY,SAAS,IAAI;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACvC,gBAAQ,KAAK,MAAM,cAAc,2BAA2B,KAAK,UAAU,WAAW,CAAC,MAAM;AAAA,MAC/F;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,sBAAsB,QAAgBD,SAA8B;AAC3E,UAAI,MAAM,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI;AAEvC,UAAI,OAAO,YAAY;AACrB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,eAAe;AACxB,YAAIA,YAAW,SAAS;AACtB,iBAAO;AAAA,QACT,WAAWA,YAAW,UAAU;AAC9B,iBAAO;AAAA,QACT,WAAWA,YAAW,YAAY;AAChC,gBAAM,IAAI,QAAQ,OAAO,MAAM,QAAQ;AAAA,QACzC;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,UAAU;AACpB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,sBAAsB,QAAqBA,SAAsBC,YAA4B;AACpG,YAAM,OAAOA,cAAa,OAAO;AACjC,YAAM,aAAa,OAAO,QAAQ,IAAI,SAAO,sBAAsB,KAAKD,OAAM,CAAC;AAC/E,aAAO,gBAAgB,IAAI,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,IACvD;AAEA,aAAS,aAAa,MAAc,MAAuB;AACzD,aAAO,KAAK,KAAK,YAAY,MAAM,KAAK,KAAK,YAAY,KACvD,KAAK,SAAS,KAAK,QACnB,KAAK,aAAa,KAAK,YACvB,KAAK,eAAe,KAAK,cACzB,KAAK,kBAAkB,KAAK;AAAA,IAChC;AAEA,aAAS,aAAa,SAAsB,SAA+B;AACzE,UAAI,QAAQ,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AACrD,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ,IAAI,SAAO,CAAC,IAAI,KAAK,YAAY,GAAG,GAAG,CAAC,CAAC;AAC/E,YAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ,IAAI,SAAO,CAAC,IAAI,KAAK,YAAY,GAAG,GAAG,CAAC,CAAC;AAE/E,iBAAW,CAAC,MAAM,IAAI,KAAK,OAAO;AAChC,cAAM,OAAO,MAAM,IAAI,IAAI;AAC3B,YAAI,CAAC,QAAQ,CAAC,aAAa,MAAM,IAAI,GAAG;AACtC,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,QAAI,iBAAS,QAAQ,GAAG;AACtB,YAAM,iBAAS,QAAQ;AACvB,UAAI;AAEF,cAAM,mBAAmB;AACzB,cAAM,oBAAoB,MAAM,iBAAS,MAAM,gBAAgB;AAE/D,YAAI,kBAAkB,WAAW,aAAa,kBAAkB,QAAQ,kBAAkB,KAAK,SAAS,GAAG;AACzG,gBAAM,gBAAgB,MAAM,iBAAS,MAAM,wDAAwD,SAAS,uBAAuB,YAAY,GAAG;AAClJ,gBAAM,WAAW,cAAc,KAAK,CAAC;AAGrC,cAAI,CAAC,YAAY,CAAC,SAAS,QAAQ;AACjC,oBAAQ,MAAM,iEAAiE,QAAQ;AACvF,mBAAO,CAAC;AAAA,UACV;AAEA,gBAAM,YAAY,sBAAsB,UAAU,MAAM;AACxD,gBAAM,YAAY,sBAAsB,SAAS,QAAQ,MAAM;AAG/D,cAAI,UAAU,UAAU,YAAY,MAAM,UAAU,YAAY,GAAG;AACjE,kBAAM,IAAI,MAAM,mCAAmC,UAAU,SAAS,sCAAmC,SAAS,GAAG;AAAA,UACvH;AAGA,gBAAM,aAAa,IAAI,IAAI,UAAU,QAAQ,IAAI,SAAO,CAAC,IAAI,KAAK,YAAY,GAAG,GAAG,CAAC,CAAC;AACtF,gBAAM,aAAa,IAAI,IAAI,UAAU,QAAQ,IAAI,SAAO,CAAC,IAAI,KAAK,YAAY,GAAG,GAAG,CAAC,CAAC;AAEtF,kBAAQ,QAAQ;AAAA,YACd,KAAK;AACH,qBAAO,qBAAqB,YAAY,YAAY,SAAS;AAAA,YAE/D,KAAK;AACH,qBAAO,0BAA0B,YAAY,YAAY,SAAS;AAAA,YAEpE,KAAK;AACH,qBAAO,sBAAsB,WAAW,WAAW,SAAS;AAAA,YAE9D,KAAK;AACH,qBAAO,uBAAuB,YAAY,YAAY,SAAS;AAAA,YAEjE;AACE,oBAAM,IAAI,MAAM,uCAAuC,MAAM,EAAE;AAAA,UACnE;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AAAA,MACxD;AACA,YAAM,iBAAS,WAAW;AAC1B,aAAO,CAAC,QAAQ;AAAA,IAClB,OAAO;AACL,aAAO,CAAC,QAAQ;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,aAAa,UAAU,WAAmB,cAAsB,QAA+B;AAE7F,QAAI,iBAAS,QAAQ,GAAG;AACtB,YAAM,iBAAS,QAAQ;AACvB,UAAI;AACF,cAAM,iBAAS,MAAM,sDAAsD,SAAS,uBAAuB,YAAY,GAAG;AAG1H,cAAM,mBAAmB;AACzB,cAAM,iBAAS,oBAAoB,kBAAkB,CAAC,WAAW,cAAc,MAAM,CAAC;AAAA,MACxF,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AAAA,MACxD;AACA,YAAM,iBAAS,WAAW;AAAA,IAC5B;AAAA,EACF;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAE5B,aAAa,YAAY,MAA8B;AACrD,QAAI,WAAW,CAAC;AAChB,QAAI,iBAAS,QAAQ,GAAG;AACtB,YAAM,iBAAS,QAAQ;AACvB,UAAI;AAEF,cAAM,mBAAmB;AACzB,cAAM,oBAAoB,MAAM,iBAAS,MAAM,gBAAgB;AAE/D,YAAI,kBAAkB,WAAW,aAAa,kBAAkB,QAAQ,kBAAkB,KAAK,SAAS,GAAG;AACzG,gBAAM,gBAAgB,MAAM,iBAAS,MAAM,4DAA4D,IAAI,GAAG;AAC9G,qBAAW,cAAc;AAAA,QAC3B,OAAO;AAEL,qBAAW,CAAC;AAAA,QACd;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,mCAAmC,KAAK;AACtD,mBAAW,CAAC;AAAA,MACd;AACA,YAAM,iBAAS,WAAW;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AACF;AAGA,SAAS,cAAc,OAAYD,OAAqB;AACtD,UAAQA,OAAM;AAAA,IACZ,KAAK;AACH,aAAO,OAAO,KAAK;AAAA,IACrB,KAAK;AACH,YAAM,MAAM,OAAO,KAAK;AACxB,aAAO,MAAM,GAAG,IAAI,IAAI;AAAA,IAC1B,KAAK;AACH,aAAO,QAAQ,KAAK;AAAA,IACtB,KAAK;AACH,aAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAAA,IACvD,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":["platform","arch","arch","platform","resolve","path","resolve","fs","path","type","dbType","tableName"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/Engine.ts","../src/lib/Arquitecture.ts","../src/lib/Binary.ts","../src/lib/Config.ts","../src/lib/DbConfig.ts","../src/lib/FileLogger.ts","../src/lib/Processors.ts"],"sourcesContent":["import path from \"path\";\r\nimport { Binary } from \"./Binary\";\r\nimport { Config as ConfigClass } from './Config';\r\nimport { spawn } from \"child_process\";\r\nimport { ProcessResponse, ResponseEngine } from \"../@types/Engine\";\r\nimport { BinaryType } from \"../@types/Binary\";\r\n\r\nclass Engine {\r\n private name: string;\r\n private config: any;\r\n private arguments: any;\r\n private binary: BinaryType;\r\n private timeout: number;\r\n\r\n constructor(name: string, timeout = 30000) {\r\n this.name = name;\r\n this.config = this.setConfig(name);\r\n const binary: BinaryType = Binary.get();\r\n this.binary = {\r\n query_engine: path.resolve(__dirname, '../bin', binary.query_engine),\r\n schema_engine: path.resolve(__dirname, '../bin', binary.schema_engine),\r\n }\r\n this.arguments = this.setArguments();\r\n this.timeout = timeout;\r\n }\r\n\r\n setArguments() {\r\n let args = [];\r\n if (this.config.type == 'sqlite') {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE + \".db\",\r\n '--motor', this.config.type\r\n ];\r\n } else {\r\n args = [\r\n '--id', 'dbcube-' + this.name,\r\n '--database-ref', this.name,\r\n '--database', this.config.config.DATABASE,\r\n '--host', this.config.config.HOST,\r\n '--port', this.config.config.PORT,\r\n '--user', this.config.config.USER,\r\n '--password', this.config.config.PASSWORD,\r\n '--motor', this.config.type\r\n ];\r\n }\r\n return args;\r\n }\r\n\r\n setConfig(name: string) {\r\n const configInstance = new ConfigClass();\r\n\r\n const configFilePath = path.resolve(process.cwd(), 'dbcube.config.js');\r\n const configFn = require(configFilePath);\r\n\r\n if (typeof configFn === 'function') {\r\n configFn(configInstance);\r\n } else {\r\n console.error('❌ El archivo dbcube.config.js no exporta una función.');\r\n }\r\n\r\n return configInstance.getDatabase(name);\r\n\r\n }\r\n\r\n getConfig() {\r\n return this.config;\r\n }\r\n\r\n async run(binary: string, args: []) {\r\n return new Promise<ResponseEngine>((resolve, reject) => {\r\n const child = spawn(this.binary[binary as keyof BinaryType], [...this.arguments, ...args]);\r\n\r\n let stdoutBuffer = '';\r\n let stderrBuffer = '';\r\n let isResolved = false;\r\n\r\n const timeoutId = setTimeout(() => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n child.kill();\r\n reject(new Error('Process timeout'));\r\n }\r\n }, this.timeout);\r\n\r\n const resolveOnce = (response: ResponseEngine) => {\r\n if (!isResolved) {\r\n isResolved = true;\r\n clearTimeout(timeoutId);\r\n resolve(response);\r\n }\r\n };\r\n\r\n child.stdout.on('data', (data) => {\r\n stdoutBuffer += data.toString();\r\n // console.log(stdoutBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stdoutBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n child.stderr.on('data', (data) => {\r\n stderrBuffer += data.toString();\r\n // console.log(stderrBuffer)\r\n\r\n // Buscar respuesta JSON completa\r\n const match = stderrBuffer.match(/PROCESS_RESPONSE:(\\{.*\\})/);\r\n if (match) {\r\n try {\r\n const response: ProcessResponse = JSON.parse(match[1]);\r\n resolveOnce({\r\n status: response.status,\r\n message: response.message,\r\n data: response.data\r\n });\r\n } catch (error) {\r\n resolveOnce({\r\n status: 500,\r\n message: 'Failed to parse response JSON',\r\n data: null\r\n });\r\n }\r\n }\r\n });\r\n\r\n\r\n child.on('close', (code) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: code === 0 ? 200 : 500,\r\n message: code === 0 ? 'Process completed' : `Process exited with code ${code}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.on('error', (error) => {\r\n clearTimeout(timeoutId);\r\n if (!isResolved) {\r\n resolveOnce({\r\n status: 500,\r\n message: `Process error: ${error.message}`,\r\n data: null\r\n });\r\n }\r\n });\r\n\r\n child.unref();\r\n });\r\n }\r\n}\r\n\r\nexport { Engine }","import * as os from 'os';\r\nimport * as path from 'path';\r\nimport * as fs from 'fs';\r\n\r\ninterface SystemInfo {\r\n platform: string;\r\n arch: string;\r\n release: string;\r\n type: string;\r\n endianness: string;\r\n cpus: number;\r\n}\r\n\r\ninterface BinaryInfo {\r\n name: string;\r\n path: string;\r\n exists: boolean;\r\n executable: boolean;\r\n}\r\n\r\nclass Arquitecture {\r\n private systemInfo: SystemInfo;\r\n\r\n constructor() {\r\n this.systemInfo = this.detectSystemInfo();\r\n }\r\n\r\n /**\r\n * Detecta información completa del sistema\r\n */\r\n private detectSystemInfo(): SystemInfo {\r\n return {\r\n platform: os.platform(),\r\n arch: os.arch(),\r\n release: os.release(),\r\n type: os.type(),\r\n endianness: os.endianness(),\r\n cpus: os.cpus().length\r\n };\r\n }\r\n\r\n /**\r\n * Obtiene la plataforma normalizada\r\n */\r\n getPlatform(): string {\r\n const platform = this.systemInfo.platform;\r\n \r\n switch (platform) {\r\n case 'win32':\r\n return 'windows';\r\n case 'darwin':\r\n return 'macos';\r\n case 'linux':\r\n return 'linux';\r\n case 'freebsd':\r\n return 'freebsd';\r\n case 'openbsd':\r\n return 'openbsd';\r\n case 'sunos':\r\n return 'solaris';\r\n default:\r\n return platform;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la arquitectura normalizada\r\n */\r\n getArchitecture(): string {\r\n const arch = this.systemInfo.arch;\r\n \r\n switch (arch) {\r\n case 'x64':\r\n return 'x86_64';\r\n case 'x32':\r\n case 'ia32':\r\n return 'i686';\r\n case 'arm64':\r\n return 'aarch64';\r\n case 'arm':\r\n return 'armv7';\r\n case 'ppc64':\r\n return 'powerpc64';\r\n case 'ppc':\r\n return 'powerpc';\r\n case 's390x':\r\n return 's390x';\r\n case 'mips':\r\n return 'mips';\r\n case 'mipsel':\r\n return 'mipsel';\r\n default:\r\n return arch;\r\n }\r\n }\r\n\r\n /**\r\n * Genera el nombre del binario basado en la arquitectura\r\n */\r\n getBinaryName(baseName: string): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n const extension = platform === 'windows' ? '.exe' : '';\r\n \r\n return `${baseName}-${platform}-${arch}${extension}`;\r\n }\r\n\r\n /**\r\n * Obtiene información completa del sistema\r\n */\r\n getSystemInfo(): SystemInfo {\r\n return { ...this.systemInfo };\r\n }\r\n\r\n /**\r\n * Obtiene el triple de destino (target triple) para Rust\r\n */\r\n getRustTargetTriple(): string {\r\n const platform = this.getPlatform();\r\n const arch = this.getArchitecture();\r\n \r\n // Mapeo de plataformas y arquitecturas a target triples de Rust\r\n const targetMap: { [key: string]: string } = {\r\n 'linux-x86_64': 'x86_64-unknown-linux-gnu',\r\n 'linux-i686': 'i686-unknown-linux-gnu',\r\n 'linux-aarch64': 'aarch64-unknown-linux-gnu',\r\n 'linux-armv7': 'armv7-unknown-linux-gnueabihf',\r\n 'macos-x86_64': 'x86_64-apple-darwin',\r\n 'macos-aarch64': 'aarch64-apple-darwin',\r\n 'windows-x86_64': 'x86_64-pc-windows-msvc',\r\n 'windows-i686': 'i686-pc-windows-msvc',\r\n 'windows-aarch64': 'aarch64-pc-windows-msvc',\r\n 'freebsd-x86_64': 'x86_64-unknown-freebsd',\r\n };\r\n \r\n const key = `${platform}-${arch}`;\r\n return targetMap[key] || `${arch}-unknown-${platform}`;\r\n }\r\n\r\n /**\r\n * Muestra información detallada del sistema\r\n */\r\n printSystemInfo(): void {\r\n console.log('🖥️ System Information:');\r\n console.log('├─ Platform:', this.getPlatform());\r\n console.log('├─ Arquitecture:', this.getArchitecture());\r\n console.log('├─ OS Type:', this.systemInfo.type);\r\n console.log('├─ OS Release:', this.systemInfo.release);\r\n console.log('├─ Endianness:', this.systemInfo.endianness);\r\n console.log('├─ CPUs:', this.systemInfo.cpus);\r\n console.log('└─ Rust Target:', this.getRustTargetTriple());\r\n }\r\n}\r\n\r\nexport { \r\n Arquitecture, \r\n SystemInfo,\r\n BinaryInfo\r\n};","import { BinaryType } from \"../@types/Binary\";\r\nimport { Arquitecture } from \"./Arquitecture\"\r\n\r\nclass Binary{\r\n static get(): BinaryType{\r\n const arch = new Arquitecture();\r\n const platform = arch.getPlatform(); \r\n const architecture = arch.getArchitecture(); \r\n switch(platform){\r\n case \"windows\":\r\n if(architecture==\"x86_64\"){\r\n return {\r\n query_engine: \"query-engine-windows-x64.exe\",\r\n schema_engine: \"schema-engine-windows-x64.exe\"\r\n };\r\n }\r\n break;\r\n }\r\n return {\r\n query_engine: \"\",\r\n schema_engine: \"\"\r\n };\r\n }\r\n}\r\n\r\nexport { Binary }","/**\r\n * Tipo para la configuración de una base de datos\r\n */\r\ntype DatabaseConfig = Record<string, any>;\r\n\r\n/**\r\n * Tipo para la configuración general del ORM\r\n */\r\ninterface ConfigData {\r\n [key: string]: any;\r\n databases?: Record<string, DatabaseConfig>;\r\n}\r\n\r\n/**\r\n * Clase para manejar la configuración del ORM\r\n */\r\nexport class Config {\r\n private data: ConfigData = {};\r\n private databases: Record<string, DatabaseConfig> = {};\r\n\r\n /**\r\n * Establece la configuración\r\n * @param configData - Datos de configuración\r\n */\r\n set(configData: ConfigData): void {\r\n this.data = configData;\r\n\r\n if (configData.databases) {\r\n this.databases = configData.databases;\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor de configuración\r\n * @param key - Clave de configuración\r\n * @returns Valor de configuración\r\n */\r\n get<T = any>(key: string): T {\r\n return this.data[key];\r\n }\r\n\r\n /**\r\n * Obtiene la configuración de una base de datos específica\r\n * @param dbName - Nombre de la base de datos\r\n * @returns Configuración de la base de datos o null\r\n */\r\n getDatabase(dbName: string): DatabaseConfig | null {\r\n return this.databases[dbName] || null;\r\n }\r\n\r\n /**\r\n * Obtiene todas las bases de datos configuradas\r\n * @returns Todas las configuraciones de bases de datos\r\n */\r\n getAllDatabases(): Record<string, DatabaseConfig> {\r\n return this.databases;\r\n }\r\n}\r\n\r\nexport default Config;\r\n","import Database from 'better-sqlite3';\r\nimport * as path from 'path';\r\nimport fs from 'fs';\r\n\r\nconst rootPath = path.resolve(process.cwd(), '.dbcube');\r\n\r\ninterface DatabaseConfig {\r\n name?: string;\r\n HOST?: string;\r\n USER?: string;\r\n PASSWORD?: string;\r\n DATABASE?: string;\r\n PORT?: number;\r\n}\r\n\r\ninterface QueryResult {\r\n status: 'success' | 'error';\r\n message: string;\r\n data: any | null;\r\n}\r\n\r\ninterface RunResult {\r\n changes: number;\r\n lastID: number;\r\n}\r\n\r\ninterface ParametrizedQueryResult {\r\n query: string;\r\n parameters: any[];\r\n}\r\n\r\nclass SQLite {\r\n private db: Database.Database | null = null;\r\n private database?: string;\r\n \r\n constructor(config: DatabaseConfig) {\r\n this.database = config.DATABASE;\r\n }\r\n\r\n ifExist(): Boolean {\r\n if (this.database) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n \r\n // Create .dbcube directory if it doesn't exist\r\n if (!fs.existsSync(rootPath)) {\r\n fs.mkdirSync(rootPath, { recursive: true });\r\n }\r\n \r\n if (fs.existsSync(configPath)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n async connect(): Promise<Database.Database> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n if (!this.db) {\r\n const dbPath = this.database || ':memory:';\r\n const configPath = path.join(rootPath, dbPath + \".db\");\r\n \r\n // Create .dbcube directory if it doesn't exist\r\n if (!fs.existsSync(rootPath)) {\r\n fs.mkdirSync(rootPath, { recursive: true });\r\n }\r\n \r\n this.db = new Database(configPath);\r\n }\r\n resolve(this.db);\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n return new Promise((resolve) => {\r\n if (this.db) {\r\n this.db.close();\r\n this.db = null;\r\n }\r\n resolve();\r\n });\r\n }\r\n\r\n async query(sqlQuery: string): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const sqlCommands = sqlQuery.split(';').filter(cmd => cmd.trim().length > 0);\r\n const results: any[] = [];\r\n \r\n for (const command of sqlCommands) {\r\n const query = `${command};`;\r\n const isSelect = query.trim().toLowerCase().startsWith('select');\r\n \r\n if (isSelect) {\r\n const stmt = this.db.prepare(query);\r\n const rows = stmt.all();\r\n results.push(rows);\r\n } else {\r\n const stmt = this.db.prepare(query);\r\n const result = stmt.run();\r\n results.push({ \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n });\r\n }\r\n }\r\n \r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: results.length === 1 ? results[0] : results,\r\n });\r\n } catch (error) {\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n async queryWithParameters(sqlQuery: string, params: any[] = []): Promise<QueryResult> {\r\n return new Promise(async (resolve) => {\r\n try {\r\n if (typeof sqlQuery !== 'string') {\r\n throw new Error('The SQL query must be a string.');\r\n }\r\n \r\n if (!Array.isArray(params)) {\r\n throw new Error('Parameters must be an array.');\r\n }\r\n \r\n if (!this.db) {\r\n await this.connect();\r\n }\r\n \r\n if (!this.db) {\r\n throw new Error('Database connection is not available.');\r\n }\r\n \r\n const isSelect = sqlQuery.trim().toLowerCase().startsWith('select');\r\n const stmt = this.db.prepare(sqlQuery);\r\n \r\n if (isSelect) {\r\n const rows = stmt.all(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: rows,\r\n });\r\n } else {\r\n const result = stmt.run(...params);\r\n resolve({\r\n status: 'success',\r\n message: 'Query executed successfully',\r\n data: { \r\n changes: result.changes, \r\n lastID: result.lastInsertRowid \r\n },\r\n });\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n resolve({\r\n status: 'error',\r\n message: (error as Error).message || 'An error occurred while executing the query.',\r\n data: null,\r\n });\r\n }\r\n });\r\n }\r\n\r\n convertToParameterizedQuery(sql: string): ParametrizedQueryResult {\r\n const normalizedSql = sql.replace(/\\s+/g, ' ').trim();\r\n \r\n const baseQueryMatch = normalizedSql.match(/^(.+?)\\s+VALUES\\s*\\(/i);\r\n if (!baseQueryMatch) {\r\n throw new Error('No se pudo encontrar la estructura VALUES en la consulta');\r\n }\r\n \r\n const baseQuery = baseQueryMatch[1];\r\n \r\n const valuesStartIndex = normalizedSql.toUpperCase().indexOf('VALUES');\r\n const valuesSection = normalizedSql.substring(valuesStartIndex);\r\n const valuesMatch = valuesSection.match(/VALUES\\s*\\((.+)\\)\\s*;?\\s*$/i);\r\n if (!valuesMatch) {\r\n throw new Error('No se pudieron extraer los valores de la consulta');\r\n }\r\n \r\n const valuesString = valuesMatch[1];\r\n \r\n function parseValues(str: string): any[] {\r\n const values: any[] = [];\r\n let currentValue = '';\r\n let inQuotes = false;\r\n let quoteChar = '';\r\n let inCompute = false;\r\n let computeDepth = 0;\r\n \r\n for (let i = 0; i < str.length; i++) {\r\n const char = str[i];\r\n const prevChar = str[i - 1];\r\n \r\n if (!inQuotes && str.substring(i, i + 8) === '@compute') {\r\n inCompute = true;\r\n }\r\n \r\n if (inCompute && char === '(') {\r\n computeDepth++;\r\n } else if (inCompute && char === ')') {\r\n computeDepth--;\r\n if (computeDepth === 0) {\r\n inCompute = false;\r\n }\r\n }\r\n \r\n if (!inCompute && (char === '\"' || char === \"'\") && prevChar !== '\\\\') {\r\n if (!inQuotes) {\r\n inQuotes = true;\r\n quoteChar = char;\r\n } else if (char === quoteChar) {\r\n if (str[i + 1] === quoteChar) {\r\n currentValue += char + char;\r\n i++;\r\n continue;\r\n } else {\r\n inQuotes = false;\r\n quoteChar = '';\r\n }\r\n }\r\n }\r\n \r\n if (!inQuotes && !inCompute && char === ',') {\r\n values.push(cleanValue(currentValue.trim()));\r\n currentValue = '';\r\n continue;\r\n }\r\n \r\n currentValue += char;\r\n }\r\n \r\n if (currentValue.trim()) {\r\n values.push(cleanValue(currentValue.trim()));\r\n }\r\n \r\n return values;\r\n }\r\n \r\n function cleanValue(value: string): any {\r\n value = value.trim();\r\n \r\n if (value.startsWith('@compute')) {\r\n return value;\r\n }\r\n \r\n if ((value.startsWith('\"') && value.endsWith('\"')) || \r\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n value = value.slice(1, -1);\r\n value = value.replace(/''/g, \"'\").replace(/\"\"/g, '\"');\r\n }\r\n \r\n return value;\r\n }\r\n \r\n const parameters = parseValues(valuesString);\r\n const placeholders = parameters.map(() => '?').join(', ');\r\n const parametrizedQuery = `${baseQuery} VALUES (${placeholders});`;\r\n \r\n return {\r\n query: parametrizedQuery,\r\n parameters: parameters\r\n };\r\n }\r\n}\r\n\r\nexport const DbConfig = new SQLite({DATABASE: \"config\"});\r\nexport default DbConfig;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { EventEmitter } from 'events';\r\n\r\ninterface InterceptOptions {\r\n interceptLog?: boolean;\r\n interceptError?: boolean;\r\n interceptWarn?: boolean;\r\n keepOriginal?: boolean;\r\n useBuffer?: boolean;\r\n}\r\n\r\ninterface ReadOptions {\r\n lines?: number | null;\r\n fromEnd?: boolean;\r\n asArray?: boolean;\r\n}\r\n\r\ninterface WatchOptions {\r\n persistent?: boolean;\r\n interval?: number;\r\n fromEnd?: boolean;\r\n}\r\n\r\ninterface WatchController {\r\n id: string;\r\n stop: () => void;\r\n isWatching: () => boolean;\r\n}\r\n\r\nexport interface InterceptController {\r\n restore: () => void;\r\n commit: () => Promise<boolean>;\r\n discard: () => number;\r\n hasBuffer: () => boolean;\r\n getBufferSize: () => number;\r\n}\r\n\r\ninterface DeleteResult {\r\n filePath: string;\r\n deleted: boolean;\r\n error: string | null;\r\n}\r\n\r\ntype LogLevel = 'INFO' | 'ERROR' | 'WARN' | 'DEBUG';\r\n\r\nexport class FileLogger extends EventEmitter {\r\n private static watchers = new Map<string, (curr: fs.Stats, prev: fs.Stats) => void>(); // Store listener functions\r\n private static buffers = new Map<string, string[]>();\r\n \r\n /**\r\n * Escribe un log en el archivo especificado\r\n * @param filePath - Ruta del archivo de log\r\n * @param message - Mensaje a escribir\r\n * @param level - Nivel del log (INFO, ERROR, WARN, DEBUG)\r\n * @param append - Si debe agregar al final del archivo (default: true)\r\n */\r\n static async write(filePath: string, message: string, level: LogLevel = 'INFO', append: boolean = true): Promise<boolean> {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Formatear el mensaje con timestamp\r\n const timestamp = new Date().toISOString();\r\n const formattedMessage = `[${timestamp}] [${level}] ${message}\\n`;\r\n \r\n // Si existe un buffer para este archivo, agregarlo al buffer en lugar de escribir directamente\r\n if (FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.get(filePath)!.push(formattedMessage);\r\n return true;\r\n }\r\n \r\n // Escribir al archivo normalmente\r\n if (append) {\r\n await fs.promises.appendFile(filePath, formattedMessage, 'utf8');\r\n } else {\r\n await fs.promises.writeFile(filePath, formattedMessage, 'utf8');\r\n }\r\n \r\n return true;\r\n } catch (error) {\r\n console.error('Error escribiendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Inicia un buffer temporal para un archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static startBuffer(filePath: string): void {\r\n if (!FileLogger.buffers.has(filePath)) {\r\n FileLogger.buffers.set(filePath, []);\r\n }\r\n }\r\n \r\n /**\r\n * Confirma y escribe todos los logs del buffer al archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static async commitBuffer(filePath: string): Promise<boolean> {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n if (buffer && buffer.length > 0) {\r\n try {\r\n // Asegurar que el directorio existe\r\n const dir = path.dirname(filePath);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n \r\n // Escribir todos los logs del buffer\r\n const content = buffer.join('');\r\n await fs.promises.appendFile(filePath, content, 'utf8');\r\n \r\n // Limpiar el buffer\r\n FileLogger.buffers.delete(filePath);\r\n return true;\r\n } catch (error) {\r\n console.error('Error confirmando buffer:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n // Limpiar el buffer aunque esté vacío\r\n FileLogger.buffers.delete(filePath);\r\n return false;\r\n }\r\n \r\n /**\r\n * Descarta todos los logs del buffer sin escribirlos\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static discardBuffer(filePath: string): number {\r\n if (FileLogger.buffers.has(filePath)) {\r\n const discardedCount = FileLogger.buffers.get(filePath)!.length;\r\n FileLogger.buffers.delete(filePath);\r\n return discardedCount;\r\n }\r\n return 0;\r\n }\r\n \r\n /**\r\n * Verifica si existe un buffer activo para un archivo\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static hasBuffer(filePath: string): boolean {\r\n return FileLogger.buffers.has(filePath);\r\n }\r\n \r\n /**\r\n * Obtiene el número de logs en el buffer\r\n * @param filePath - Ruta del archivo de log\r\n */\r\n static getBufferSize(filePath: string): number {\r\n const buffer = FileLogger.buffers.get(filePath);\r\n return buffer ? buffer.length : 0;\r\n }\r\n \r\n /**\r\n * Intercepta console.log y console.error para escribir a archivo\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de interceptación\r\n */\r\n static interceptConsole(filePath: string, options: InterceptOptions = {}): InterceptController {\r\n const {\r\n interceptLog = true,\r\n interceptError = true,\r\n interceptWarn = true,\r\n keepOriginal = true, // Mantener el comportamiento original de console\r\n useBuffer = false // Usar buffer temporal\r\n } = options;\r\n \r\n // Iniciar buffer si se solicita\r\n if (useBuffer) {\r\n FileLogger.startBuffer(filePath);\r\n }\r\n \r\n // Guardar referencias originales\r\n const originalLog = console.log;\r\n const originalError = console.error;\r\n const originalWarn = console.warn;\r\n \r\n if (interceptLog) {\r\n console.log = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'INFO').catch(err => {\r\n originalError('Error escribiendo log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalLog.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptError) {\r\n console.error = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'ERROR').catch(err => {\r\n originalError('Error escribiendo error log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalError.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n if (interceptWarn) {\r\n console.warn = function(...args: any[]) {\r\n const message = args.map(arg => \r\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\r\n ).join(' ');\r\n \r\n FileLogger.write(filePath, message, 'WARN').catch(err => {\r\n originalError('Error escribiendo warn log:', err);\r\n });\r\n \r\n if (keepOriginal) {\r\n originalWarn.apply(console, args);\r\n }\r\n };\r\n }\r\n \r\n // Retornar función para restaurar console original\r\n return {\r\n restore: () => {\r\n if (interceptLog) console.log = originalLog;\r\n if (interceptError) console.error = originalError;\r\n if (interceptWarn) console.warn = originalWarn;\r\n },\r\n commit: async () => {\r\n if (useBuffer) {\r\n return await FileLogger.commitBuffer(filePath);\r\n }\r\n return false;\r\n },\r\n discard: () => {\r\n if (useBuffer) {\r\n return FileLogger.discardBuffer(filePath);\r\n }\r\n return 0;\r\n },\r\n hasBuffer: () => FileLogger.hasBuffer(filePath),\r\n getBufferSize: () => FileLogger.getBufferSize(filePath)\r\n };\r\n }\r\n \r\n /**\r\n * Lee el contenido completo del archivo de log\r\n * @param filePath - Ruta del archivo de log\r\n * @param options - Opciones de lectura\r\n * @returns Contenido del archivo\r\n */\r\n static async read(filePath: string, options: ReadOptions = {}): Promise<string | string[]> {\r\n const { \r\n lines = null, // Número de líneas a leer (null = todas)\r\n fromEnd = false, // Si debe leer desde el final\r\n asArray = false // Si debe retornar como array de líneas\r\n } = options;\r\n \r\n try {\r\n if (!fs.existsSync(filePath)) {\r\n return asArray ? [] : '';\r\n }\r\n \r\n let content = await fs.promises.readFile(filePath, 'utf8');\r\n \r\n if (asArray) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n \r\n if (lines !== null) {\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n }\r\n \r\n return linesArray;\r\n }\r\n \r\n // Si se especifica número de líneas y no es array\r\n if (lines !== null) {\r\n let linesArray = content.split('\\n').filter(line => line.trim() !== '');\r\n if (fromEnd) {\r\n linesArray = linesArray.slice(-lines);\r\n } else {\r\n linesArray = linesArray.slice(0, lines);\r\n }\r\n content = linesArray.join('\\n');\r\n }\r\n \r\n return content;\r\n } catch (error) {\r\n console.error('Error leyendo log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Observa un archivo de log en tiempo real\r\n * @param filePath - Ruta del archivo de log\r\n * @param callback - Función callback para nuevas líneas\r\n * @param options - Opciones del watcher\r\n * @returns Objeto con métodos para controlar el watcher\r\n */\r\n static watch(filePath: string, callback: (line: string, filePath: string) => void, options: WatchOptions = {}): WatchController {\r\n const {\r\n persistent = true,\r\n interval = 100,\r\n fromEnd = true // Empezar desde el final del archivo\r\n } = options;\r\n \r\n let lastSize = 0;\r\n let lastPosition = 0;\r\n \r\n // Inicializar posición si el archivo ya existe\r\n if (fs.existsSync(filePath)) {\r\n const stats = fs.statSync(filePath);\r\n lastSize = stats.size;\r\n lastPosition = fromEnd ? stats.size : 0;\r\n }\r\n \r\n // Fixed: Correct listener function signature for fs.watchFile\r\n const listener = async (curr: fs.Stats, prev: fs.Stats) => {\r\n try {\r\n if (curr.size > lastSize) {\r\n // El archivo ha crecido\r\n const stream = fs.createReadStream(filePath, {\r\n start: lastPosition,\r\n end: curr.size - 1,\r\n encoding: 'utf8'\r\n });\r\n \r\n let buffer = '';\r\n \r\n stream.on('data', (chunk) => {\r\n buffer += chunk;\r\n const lines = buffer.split('\\n');\r\n \r\n // Procesar líneas completas\r\n for (let i = 0; i < lines.length - 1; i++) {\r\n if (lines[i].trim()) {\r\n callback(lines[i].trim(), filePath);\r\n }\r\n }\r\n \r\n // Guardar la línea incompleta\r\n buffer = lines[lines.length - 1];\r\n });\r\n \r\n stream.on('end', () => {\r\n // Procesar la última línea si existe\r\n if (buffer.trim()) {\r\n callback(buffer.trim(), filePath);\r\n }\r\n });\r\n \r\n lastSize = curr.size;\r\n lastPosition = curr.size;\r\n }\r\n } catch (error) {\r\n console.error('Error en watcher:', error);\r\n }\r\n };\r\n \r\n // Watcher para cambios en el archivo\r\n fs.watchFile(filePath, { persistent, interval }, listener);\r\n \r\n // Guardar referencia del watcher\r\n const watcherId = `${filePath}_${Date.now()}`;\r\n // Store listener reference for cleanup\r\n FileLogger.watchers.set(watcherId, listener as any);\r\n \r\n // Retornar objeto de control\r\n return {\r\n id: watcherId,\r\n stop: () => {\r\n const storedListener = FileLogger.watchers.get(watcherId);\r\n if (storedListener) {\r\n fs.unwatchFile(filePath, storedListener);\r\n FileLogger.watchers.delete(watcherId);\r\n }\r\n },\r\n isWatching: () => FileLogger.watchers.has(watcherId)\r\n };\r\n }\r\n \r\n /**\r\n * Detiene todos los watchers activos\r\n */\r\n static stopAllWatchers(): void {\r\n for (const [watcherId] of FileLogger.watchers) {\r\n const filePath = watcherId.split('_')[0];\r\n fs.unwatchFile(filePath);\r\n }\r\n FileLogger.watchers.clear();\r\n }\r\n \r\n /**\r\n * Métodos de conveniencia para diferentes niveles de log\r\n */\r\n static async info(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'INFO');\r\n }\r\n \r\n static async error(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'ERROR');\r\n }\r\n \r\n static async warn(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'WARN');\r\n }\r\n \r\n static async debug(filePath: string, message: string): Promise<boolean> {\r\n return this.write(filePath, message, 'DEBUG');\r\n }\r\n \r\n /**\r\n * Limpia logs antiguos\r\n * @param filePath - Ruta del archivo de log\r\n * @param maxLines - Máximo número de líneas a mantener\r\n */\r\n static async cleanup(filePath: string, maxLines: number = 1000): Promise<number> {\r\n try {\r\n const lines = await this.read(filePath, { asArray: true }) as string[];\r\n \r\n if (lines.length > maxLines) {\r\n const keepLines = lines.slice(-maxLines);\r\n const content = keepLines.join('\\n') + '\\n';\r\n await fs.promises.writeFile(filePath, content, 'utf8');\r\n return lines.length - maxLines; // Líneas eliminadas\r\n }\r\n \r\n return 0;\r\n } catch (error) {\r\n console.error('Error limpiando logs:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina un archivo de log\r\n * @param filePath - Ruta del archivo de log a eliminar\r\n */\r\n static async deleteLogFile(filePath: string): Promise<boolean> {\r\n try {\r\n if (fs.existsSync(filePath)) {\r\n await fs.promises.unlink(filePath);\r\n return true;\r\n }\r\n return false;\r\n } catch (error) {\r\n console.error('Error eliminando archivo de log:', error);\r\n throw error;\r\n }\r\n }\r\n \r\n /**\r\n * Elimina múltiples archivos de log\r\n * @param filePaths - Array de rutas de archivos de log a eliminar\r\n */\r\n static async deleteLogFiles(filePaths: string[]): Promise<DeleteResult[]> {\r\n const results: DeleteResult[] = [];\r\n \r\n for (const filePath of filePaths) {\r\n try {\r\n const deleted = await this.deleteLogFile(filePath);\r\n results.push({ filePath, deleted, error: null });\r\n } catch (error) {\r\n results.push({ filePath, deleted: false, error: (error as Error).message });\r\n }\r\n }\r\n \r\n return results;\r\n }\r\n}\r\n\r\nexport default FileLogger;","import { ComputedFieldConfig, DataObject, DataType } from \"../@types/DataObject\";\r\nimport { Column, DatabaseType, TableSchema } from \"../@types/Processor\";\r\nimport DbConfig from \"./DbConfig\";\r\n\r\nexport class ComputedFieldProcessor {\r\n\r\n static async getComputedFields(name: string): Promise<any[]> {\r\n let computedFields = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_computes_config WHERE database_ref='${name}'`);\r\n computedFields = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n computedFields = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n computedFields = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return computedFields;\r\n }\r\n\r\n /**\r\n * Processes computed field instruction and returns the computed value\r\n * @param instruction - The @compute instruction\r\n * @param rowData - The row data containing column values\r\n * @returns The computed value or null if there's an error\r\n */\r\n static processInstruction(instruction: string, rowData: Record<string, any>): any {\r\n try {\r\n // Remove @compute wrapper and extract the function content\r\n const functionMatch = instruction.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*{([\\s\\S]*?)}\\s*\\)/);\r\n\r\n if (!functionMatch) {\r\n throw new Error('Invalid @compute instruction format');\r\n }\r\n\r\n let functionBody: string = functionMatch[1].trim();\r\n\r\n // Clean up the function body - remove trailing semicolon if present\r\n if (functionBody.endsWith(';')) {\r\n functionBody = functionBody.slice(0, -1).trim();\r\n }\r\n\r\n // Replace @column(columnName) with actual values\r\n functionBody = functionBody.replace(/@column\\(([^)]+)\\)/g, (_match, columnName: string) => {\r\n const cleanColumnName = columnName.trim().replace(/['\"]/g, '');\r\n const value = rowData[cleanColumnName];\r\n\r\n if (value === null || value === undefined) {\r\n return 'null';\r\n } else if (typeof value === 'string') {\r\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\r\n } else if (typeof value === 'number' || typeof value === 'boolean') {\r\n return value.toString();\r\n } else if (value instanceof Date) {\r\n return `new Date(\"${value.toISOString()}\")`;\r\n } else {\r\n return JSON.stringify(value);\r\n }\r\n });\r\n\r\n // Create and execute the function\r\n const computeFunction = new Function(functionBody);\r\n return computeFunction();\r\n } catch (error) {\r\n console.error('Error processing computed field:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Extracts column dependencies from a computed field instruction\r\n * @param instruction - The @compute instruction\r\n * @returns Array of column names that this computed field depends on\r\n */\r\n static extractDependencies(instruction: string): string[] {\r\n const dependencies: string[] = [];\r\n const columnMatches = instruction.match(/@column\\(([^)]+)\\)/g);\r\n\r\n if (columnMatches) {\r\n for (const match of columnMatches) {\r\n const innerMatch = match.match(/@column\\(([^)]+)\\)/);\r\n if (innerMatch) {\r\n const columnName = innerMatch[1].trim().replace(/['\"]/g, '');\r\n if (!dependencies.includes(columnName)) {\r\n dependencies.push(columnName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return dependencies;\r\n }\r\n\r\n /**\r\n * Adds computed fields to an array of data objects based on configuration array\r\n * @param data - Array of data objects\r\n * @param computedConfigs - Array of computed field configurations\r\n * @returns Array with the new computed fields added\r\n */\r\n static computedFields<T extends DataObject>(\r\n data: T[],\r\n computedConfigs: ComputedFieldConfig[]\r\n ): T[] {\r\n\r\n return data.map((item, index) => {\r\n let processedItem: any = { ...item };\r\n\r\n // Procesar cada configuración de campo computado\r\n computedConfigs.forEach((config) => {\r\n try {\r\n const { column: fieldName, type, instruction } = config;\r\n\r\n // Reemplazar @column(fieldName) con el valor real del objeto\r\n let processedExpression = instruction.replace(\r\n /@column\\(([^)]+)\\)/g,\r\n (match, columnName) => {\r\n // Remover comillas si las tiene\r\n const cleanColumnName = columnName.replace(/['\"]/g, '');\r\n const value = processedItem[cleanColumnName];\r\n\r\n // Convertir el valor a string seguro para la evaluación\r\n if (typeof value === 'string') {\r\n return `\"${value}\"`;\r\n } else if (value === null || value === undefined) {\r\n return 'null';\r\n } else {\r\n return String(value);\r\n }\r\n }\r\n );\r\n\r\n // Extraer la función dentro de @compute\r\n const computeMatch = processedExpression.match(/@compute\\s*\\(\\s*\\(\\s*\\)\\s*=>\\s*\\{(.*)\\}\\s*\\)/s);\r\n if (!computeMatch) {\r\n throw new Error(`Formato de @compute inválido para campo ${fieldName}`);\r\n }\r\n\r\n const functionBody = computeMatch[1];\r\n\r\n // Crear y ejecutar la función\r\n const computeFunction = new Function(functionBody);\r\n let result = computeFunction();\r\n\r\n // Aplicar conversión de tipo\r\n result = convertToType(result, type as DataType);\r\n\r\n // Agregar el nuevo campo al objeto procesado\r\n processedItem[fieldName] = result;\r\n\r\n } catch (error) {\r\n console.error(`Error procesando campo ${config.column} en item ${index}:`, error);\r\n // En caso de error, asignar null al campo\r\n processedItem[config.column] = null;\r\n }\r\n });\r\n\r\n return processedItem;\r\n });\r\n }\r\n}\r\n\r\nexport class TableProcessor {\r\n static async generateAlterQueries(\r\n nowQuery: string,\r\n dbType: DatabaseType,\r\n tableName: string,\r\n database_ref: string,\r\n ): Promise<string[]> {\r\n function parseCreateTableQuery(query: string, dbType: DatabaseType): TableSchema {\r\n // Limpiar y normalizar la query\r\n const cleanQuery = query.trim().replace(/\\s+/g, ' ');\r\n\r\n // Extraer el nombre de la tabla\r\n const tableNameMatch = cleanQuery.match(/CREATE TABLE (?:IF NOT EXISTS )?(\\w+)/i);\r\n if (!tableNameMatch) {\r\n throw new Error('No se pudo extraer el nombre de la tabla');\r\n }\r\n\r\n const tableName = tableNameMatch[1];\r\n\r\n // Extraer las definiciones de columnas\r\n const columnsMatch = cleanQuery.match(/\\((.+)\\)/);\r\n if (!columnsMatch) {\r\n throw new Error('No se pudieron extraer las definiciones de columnas');\r\n }\r\n\r\n const columnsString = columnsMatch[1];\r\n const columnDefinitions = columnsString.split(',').map(def => def.trim());\r\n\r\n const columns: Column[] = [];\r\n\r\n for (const def of columnDefinitions) {\r\n // Skip constraints that aren't column definitions\r\n if (def.toUpperCase().startsWith('PRIMARY KEY') ||\r\n def.toUpperCase().startsWith('FOREIGN KEY') ||\r\n def.toUpperCase().startsWith('CONSTRAINT')) {\r\n continue;\r\n }\r\n\r\n const parts = def.split(/\\s+/);\r\n if (parts.length < 2) continue;\r\n\r\n const columnName = parts[0];\r\n const columnType = parts[1];\r\n\r\n const column: Column = {\r\n name: columnName,\r\n type: columnType,\r\n nullable: !def.toUpperCase().includes('NOT NULL'),\r\n primaryKey: def.toUpperCase().includes('PRIMARY KEY'),\r\n autoIncrement: def.toUpperCase().includes('AUTOINCREMENT') || def.toUpperCase().includes('AUTO_INCREMENT')\r\n };\r\n\r\n columns.push(column);\r\n }\r\n\r\n return { tableName, columns };\r\n }\r\n\r\n function generateMySQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // Modificar columna existente\r\n const columnDef = buildColumnDefinition(column, 'mysql');\r\n queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${columnDef};`);\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generatePostgreSQLQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n tableName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Columnas a eliminar\r\n for (const [columnName] of oldColumns) {\r\n if (!nowColumns.has(columnName)) {\r\n queries.push(`ALTER TABLE ${tableName} DROP COLUMN ${columnName};`);\r\n }\r\n }\r\n\r\n // Columnas a agregar o modificar\r\n for (const [columnName, column] of nowColumns) {\r\n const oldColumn = oldColumns.get(columnName);\r\n\r\n if (!oldColumn) {\r\n // Agregar nueva columna\r\n const columnDef = buildColumnDefinition(column, 'postgres');\r\n queries.push(`ALTER TABLE ${tableName} ADD COLUMN ${columnDef};`);\r\n } else if (!columnsEqual(column, oldColumn)) {\r\n // PostgreSQL requiere comandos separados para diferentes modificaciones\r\n if (column.type !== oldColumn.type) {\r\n const pgType = column.type.replace('INTEGER', 'INT').replace('TEXT', 'VARCHAR');\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} TYPE ${pgType};`);\r\n }\r\n\r\n if (column.nullable !== oldColumn.nullable) {\r\n const constraint = column.nullable ? 'DROP NOT NULL' : 'SET NOT NULL';\r\n queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${columnName} ${constraint};`);\r\n }\r\n }\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function generateSQLiteQueries(\r\n nowSchema: TableSchema,\r\n oldSchema: TableSchema,\r\n tableName: string\r\n ): string[] {\r\n // SQLite no soporta DROP COLUMN directamente, necesitamos recrear la tabla\r\n const queries: string[] = [];\r\n\r\n // Verificar si hay diferencias\r\n if (schemasEqual(nowSchema, oldSchema)) {\r\n return queries; // No hay cambios\r\n }\r\n\r\n const tempTableName = `${tableName}_temp_${Date.now()}`;\r\n\r\n // 1. Crear tabla temporal con el nuevo esquema\r\n const createTempQuery = buildCreateTableQuery(nowSchema, 'sqlite', tempTableName);\r\n queries.push(createTempQuery);\r\n\r\n // 2. Copiar datos compatibles\r\n const commonColumns = nowSchema.columns\r\n .filter(col => oldSchema.columns.some(oldCol => oldCol.name.toLowerCase() === col.name.toLowerCase()))\r\n .map(col => col.name);\r\n\r\n if (commonColumns.length > 0) {\r\n const columnsList = commonColumns.join(', ');\r\n queries.push(`INSERT INTO ${tempTableName} (${columnsList}) SELECT ${columnsList} FROM ${tableName};`);\r\n }\r\n\r\n // 3. Eliminar tabla original\r\n queries.push(`DROP TABLE ${tableName};`);\r\n\r\n // 4. Renombrar tabla temporal\r\n queries.push(`ALTER TABLE ${tempTableName} RENAME TO ${tableName};`);\r\n\r\n return queries;\r\n }\r\n\r\n function generateMongoDBQueries(\r\n nowColumns: Map<string, Column>,\r\n oldColumns: Map<string, Column>,\r\n collectionName: string\r\n ): string[] {\r\n const queries: string[] = [];\r\n\r\n // Campos a eliminar\r\n const fieldsToRemove: string[] = [];\r\n for (const [fieldName] of oldColumns) {\r\n if (!nowColumns.has(fieldName)) {\r\n fieldsToRemove.push(fieldName);\r\n }\r\n }\r\n\r\n if (fieldsToRemove.length > 0) {\r\n const unsetFields = fieldsToRemove.reduce((acc, field) => {\r\n acc[field] = \"\";\r\n return acc;\r\n }, {} as Record<string, string>);\r\n\r\n queries.push(`db.${collectionName}.updateMany({}, { $unset: ${JSON.stringify(unsetFields)} });`);\r\n }\r\n\r\n // Campos a agregar (con valores por defecto)\r\n const fieldsToAdd: Record<string, any> = {};\r\n for (const [fieldName, column] of nowColumns) {\r\n if (!oldColumns.has(fieldName)) {\r\n // Valor por defecto según el tipo\r\n let defaultValue: any = null;\r\n if (!column.nullable) {\r\n switch (column.type.toUpperCase()) {\r\n case 'INTEGER':\r\n defaultValue = 0;\r\n break;\r\n case 'TEXT':\r\n case 'VARCHAR':\r\n defaultValue = '';\r\n break;\r\n default:\r\n defaultValue = null;\r\n }\r\n }\r\n fieldsToAdd[fieldName] = defaultValue;\r\n }\r\n }\r\n\r\n if (Object.keys(fieldsToAdd).length > 0) {\r\n queries.push(`db.${collectionName}.updateMany({}, { $set: ${JSON.stringify(fieldsToAdd)} });`);\r\n }\r\n\r\n return queries;\r\n }\r\n\r\n function buildColumnDefinition(column: Column, dbType: DatabaseType): string {\r\n let def = `${column.name} ${column.type}`;\r\n\r\n if (column.primaryKey) {\r\n def += ' PRIMARY KEY';\r\n }\r\n\r\n if (column.autoIncrement) {\r\n if (dbType === 'mysql') {\r\n def += ' AUTO_INCREMENT';\r\n } else if (dbType === 'sqlite') {\r\n def += ' AUTOINCREMENT';\r\n } else if (dbType === 'postgres') {\r\n def = def.replace(column.type, 'SERIAL');\r\n }\r\n }\r\n\r\n if (!column.nullable) {\r\n def += ' NOT NULL';\r\n }\r\n\r\n return def;\r\n }\r\n\r\n function buildCreateTableQuery(schema: TableSchema, dbType: DatabaseType, tableName?: string): string {\r\n const name = tableName || schema.tableName;\r\n const columnDefs = schema.columns.map(col => buildColumnDefinition(col, dbType));\r\n return `CREATE TABLE ${name} (${columnDefs.join(', ')});`;\r\n }\r\n\r\n function columnsEqual(col1: Column, col2: Column): boolean {\r\n return col1.name.toLowerCase() === col2.name.toLowerCase() &&\r\n col1.type === col2.type &&\r\n col1.nullable === col2.nullable &&\r\n col1.primaryKey === col2.primaryKey &&\r\n col1.autoIncrement === col2.autoIncrement;\r\n }\r\n\r\n function schemasEqual(schema1: TableSchema, schema2: TableSchema): boolean {\r\n if (schema1.columns.length !== schema2.columns.length) {\r\n return false;\r\n }\r\n\r\n const cols1 = new Map(schema1.columns.map(col => [col.name.toLowerCase(), col]));\r\n const cols2 = new Map(schema2.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n for (const [name, col1] of cols1) {\r\n const col2 = cols2.get(name);\r\n if (!col2 || !columnsEqual(col1, col2)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_computes_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_schemas_config WHERE table_ref='${tableName}' AND database_ref='${database_ref}'`);\r\n const oldQuery = queryComputes.data[0];\r\n\r\n // Validar que oldQuery existe y tiene struct\r\n if (!oldQuery || !oldQuery.struct) {\r\n console.error('No exist a previus schema please execute the refresh first...', oldQuery);\r\n return [];\r\n }\r\n\r\n const nowSchema = parseCreateTableQuery(nowQuery, dbType);\r\n const oldSchema = parseCreateTableQuery(oldQuery.struct, dbType);\r\n\r\n // Verificar que el nombre de tabla coincida\r\n if (nowSchema.tableName.toLowerCase() !== tableName.toLowerCase()) {\r\n throw new Error(`El nombre de tabla en la query (${nowSchema.tableName}) no coincide con el parámetro (${tableName})`);\r\n }\r\n\r\n // Crear mapas para facilitar la comparación\r\n const nowColumns = new Map(nowSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n const oldColumns = new Map(oldSchema.columns.map(col => [col.name.toLowerCase(), col]));\r\n\r\n switch (dbType) {\r\n case 'mysql':\r\n return generateMySQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'postgres':\r\n return generatePostgreSQLQueries(nowColumns, oldColumns, tableName);\r\n\r\n case 'sqlite':\r\n return generateSQLiteQueries(nowSchema, oldSchema, tableName);\r\n\r\n case 'mongodb':\r\n return generateMongoDBQueries(nowColumns, oldColumns, tableName);\r\n\r\n default:\r\n throw new Error(`Tipo de base de datos no soportado: ${dbType}`);\r\n }\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n return [nowQuery];\r\n } else {\r\n return [nowQuery];\r\n }\r\n }\r\n\r\n static async saveQuery(table_ref: string, database_ref: string, struct: string): Promise<void> {\r\n\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n await DbConfig.query(`DELETE FROM dbcube_schemas_config WHERE table_ref='${table_ref}' AND database_ref='${database_ref}'`);\r\n\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `INSERT INTO dbcube_schemas_config (table_ref, database_ref, struct) VALUES (?, ?, ?)`;\r\n await DbConfig.queryWithParameters(tableExistsQuery, [table_ref, database_ref, struct]);\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n }\r\n}\r\n\r\nexport class TriggerProcessor {\r\n\r\n static async getTriggers(name: string): Promise<any[]> {\r\n let triggers = [];\r\n if (DbConfig.ifExist()) {\r\n await DbConfig.connect()\r\n try {\r\n // Verificar si la tabla computes existe antes de intentar acceder a ella\r\n const tableExistsQuery = `SELECT name FROM sqlite_master WHERE type='table' AND name='dbcube_triggers_config'`;\r\n const tableExistsResult = await DbConfig.query(tableExistsQuery);\r\n\r\n if (tableExistsResult.status === 'success' && tableExistsResult.data && tableExistsResult.data.length > 0) {\r\n const queryComputes = await DbConfig.query(`SELECT * FROM dbcube_triggers_config WHERE database_ref='${name}'`);\r\n triggers = queryComputes.data;\r\n } else {\r\n // La tabla no existe, inicializar como array vacío\r\n triggers = [];\r\n }\r\n } catch (error) {\r\n console.error('Error fetching computed fields:', error);\r\n triggers = [];\r\n }\r\n await DbConfig.disconnect()\r\n }\r\n\r\n return triggers;\r\n }\r\n}\r\n\r\n// Utils\r\nfunction convertToType(value: any, type: DataType): any {\r\n switch (type) {\r\n case 'string':\r\n return String(value);\r\n case 'number':\r\n const num = Number(value);\r\n return isNaN(num) ? 0 : num;\r\n case 'boolean':\r\n return Boolean(value);\r\n case 'date':\r\n return value instanceof Date ? value : new Date(value);\r\n case 'object':\r\n return value;\r\n default:\r\n return value;\r\n }\r\n}"],"mappings":"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","names":["platform","arch","arch","platform","resolve","path","resolve","fs","path","type","dbType","tableName"]}
|