dbcube 5.2.3 → 5.2.5
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 +38 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +39 -6
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
CHANGED
|
@@ -111,6 +111,7 @@ var FileUtils_default = FileUtils;
|
|
|
111
111
|
|
|
112
112
|
// src/lib/Dbcube.ts
|
|
113
113
|
var import_path = __toESM(require("path"));
|
|
114
|
+
var fs2 = __toESM(require("fs"));
|
|
114
115
|
var import_module = require("module");
|
|
115
116
|
var Dbcube = class _Dbcube {
|
|
116
117
|
static instance;
|
|
@@ -146,6 +147,20 @@ var Dbcube = class _Dbcube {
|
|
|
146
147
|
const exists = await FileUtils_default.fileExists(this.configPath);
|
|
147
148
|
exists ?? console.log("\u274C Dont exists config file, please create a dbcube.config.js file");
|
|
148
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Detecta si el proyecto está marcado como ESM ("type": "module"), lo que
|
|
152
|
+
* impide cargar un dbcube.config.js (CommonJS) con require().
|
|
153
|
+
* @private
|
|
154
|
+
*/
|
|
155
|
+
projectIsESM() {
|
|
156
|
+
try {
|
|
157
|
+
const pkgPath = import_path.default.join(process.cwd(), "package.json");
|
|
158
|
+
if (!fs2.existsSync(pkgPath)) return false;
|
|
159
|
+
return JSON.parse(fs2.readFileSync(pkgPath, "utf8")).type === "module";
|
|
160
|
+
} catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
149
164
|
/**
|
|
150
165
|
* Initializes the Dbcube ORM with database configurations
|
|
151
166
|
*
|
|
@@ -168,21 +183,39 @@ var Dbcube = class _Dbcube {
|
|
|
168
183
|
* ```
|
|
169
184
|
*/
|
|
170
185
|
init(configCreate = {}) {
|
|
186
|
+
import_core.EnvLoader.load();
|
|
171
187
|
let config;
|
|
188
|
+
const cjsPath = import_path.default.join(process.cwd(), "dbcube.config.cjs");
|
|
189
|
+
const configFilePath = fs2.existsSync(cjsPath) ? cjsPath : this.configPath;
|
|
172
190
|
try {
|
|
173
191
|
const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
|
|
174
192
|
const require2 = (0, import_module.createRequire)(requireUrl);
|
|
175
|
-
delete require2.cache[require2.resolve(
|
|
176
|
-
const configModule = require2(
|
|
193
|
+
delete require2.cache[require2.resolve(configFilePath)];
|
|
194
|
+
const configModule = require2(configFilePath);
|
|
177
195
|
config = configModule.default || configModule;
|
|
178
196
|
} catch (error) {
|
|
179
|
-
|
|
197
|
+
const missing = (String(error.message).match(/Cannot find module '([^']+)'/) || [])[1];
|
|
198
|
+
const missingIsConfig = missing && (configFilePath.includes(missing) || missing.includes("dbcube.config"));
|
|
199
|
+
if (error.code === "MODULE_NOT_FOUND" && missing && !missingIsConfig) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`dbcube.config requiere un m\xF3dulo que no est\xE1 instalado: "${missing}". Inst\xE1lalo (p. ej. npm install ${missing}). Nota: DBCube ya carga el .env autom\xE1ticamente \u2014 puedes quitar require("dotenv").`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
if (this.projectIsESM() || error.code === "ERR_REQUIRE_ESM") {
|
|
205
|
+
throw new Error(
|
|
206
|
+
`No se pudo cargar dbcube.config.js: el proyecto es ESM ("type": "module") pero la config usa CommonJS (module.exports). Renombra el archivo a "dbcube.config.cjs" o quita "type": "module" de package.json.`
|
|
207
|
+
);
|
|
208
|
+
}
|
|
180
209
|
if (error.code === "MODULE_NOT_FOUND") {
|
|
181
|
-
|
|
182
|
-
return;
|
|
210
|
+
throw new Error("No existe dbcube.config.js. Crea el archivo de configuraci\xF3n en la ra\xEDz del proyecto.");
|
|
183
211
|
}
|
|
184
212
|
throw error;
|
|
185
213
|
}
|
|
214
|
+
if (typeof config !== "function") {
|
|
215
|
+
throw new Error(
|
|
216
|
+
`dbcube.config no exporta una configuraci\xF3n v\xE1lida.` + (this.projectIsESM() ? ` El proyecto es ESM: renombra a "dbcube.config.cjs" o quita "type": "module".` : ` Debe exportar una funci\xF3n: module.exports = function (config) { config.set({ databases: {...} }); }.`)
|
|
217
|
+
);
|
|
218
|
+
}
|
|
186
219
|
config(this.config);
|
|
187
220
|
const databases = Object.keys(this.config.getAllDatabases());
|
|
188
221
|
for (const database of databases) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/Dbcube.ts","../src/lib/FileUtils.ts"],"sourcesContent":["import { Dbcube } from './lib/Dbcube';\r\nimport { Database, Table } from '@dbcube/query-builder';\r\n\r\nconst dbcube = new Dbcube();\r\ndbcube.init()\r\n\r\n// Re-export the types directly from the definition\r\nexport { \r\n dbcube,\r\n Database,\r\n Table\r\n};\r\n\r\n// Export types using interface definitions for better compatibility\r\nexport type DatabaseRecord = Record<string, any>;\r\nexport type WhereCallback = (query: Table) => void;","import { Config } from '@dbcube/core';\r\nimport { Database } from '@dbcube/query-builder';\r\nimport FileUtils from './FileUtils';\r\nimport path from 'path';\r\nimport { createRequire } from 'module';\r\n\r\n/**\r\n * Dbcube ORM - Main class for database management\r\n * \r\n * A lightweight, flexible ORM that supports multiple database engines including \r\n * MySQL, PostgreSQL, SQLite, and MongoDB with a fluent query builder interface.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { Dbcube } from 'dbcube';\r\n * \r\n * const dbcube = new Dbcube();\r\n * await dbcube.init();\r\n * \r\n * // Get a database connection\r\n * const db = dbcube.database('myDatabase');\r\n * \r\n * // Use query builder\r\n * const users = await db.table('users').select().where('active', true).get();\r\n * ```\r\n * \r\n * @class\r\n * @author Albert Araya\r\n * @license MIT\r\n */\r\nexport class Dbcube {\r\n private static instance: Dbcube;\r\n private configPath!: string;\r\n private config!: Config;\r\n private databases!: Record<string, Database>;\r\n\r\n /**\r\n * Creates a new Dbcube instance (Singleton pattern)\r\n * \r\n * @constructor\r\n * @example\r\n * ```typescript\r\n * const dbcube = new Dbcube();\r\n * ```\r\n */\r\n constructor() {\r\n if (Dbcube.instance) {\r\n return Dbcube.instance;\r\n }\r\n this.configPath = path.join(process.cwd(), 'dbcube.config.js');\r\n this.config = new Config();\r\n this.databases = {};\r\n Dbcube.instance = this;\r\n }\r\n\r\n /**\r\n * Loads configuration from dbcube.config.js file\r\n * \r\n * @private\r\n * @returns {Promise<void>}\r\n * @throws {Error} If config file doesn't exist\r\n */\r\n async loadConfig() {\r\n const exists = await FileUtils.fileExists(this.configPath);\r\n exists ?? console.log('❌ Dont exists config file, please create a dbcube.config.js file');\r\n }\r\n\r\n /**\r\n * Initializes the Dbcube ORM with database configurations\r\n * \r\n * @param {Object} configCreate - Optional configuration for creating new database\r\n * @param {string} [configCreate.databaseName] - Name of the database to create\r\n * @param {string} [configCreate.motor] - Database engine (mysql, postgres, sqlite, mongodb)\r\n * @param {any} [configCreate.configAnswers] - Additional configuration answers\r\n * @returns {Promise<void>}\r\n * \r\n * @example\r\n * ```typescript\r\n * // Initialize with existing config\r\n * await dbcube.init();\r\n * \r\n * // Initialize with new database creation\r\n * await dbcube.init({\r\n * databaseName: 'myapp',\r\n * motor: 'mysql'\r\n * });\r\n * ```\r\n */\r\n init(configCreate: { databaseName?: string; motor?: string; configAnswers?: any } = {}) {\r\n let config: any;\r\n try {\r\n // Use createRequire for better Next.js compatibility\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(this.configPath)];\r\n const configModule = require(this.configPath);\r\n config = configModule.default || configModule;\r\n } catch (error: any) {\r\n console.log('❌ Config load error:', error);\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n console.log('❌ Config file not found, please create a dbcube.config.js file');\r\n return;\r\n }\r\n throw error;\r\n }\r\n\r\n config(this.config);\r\n\r\n const databases = Object.keys(this.config.getAllDatabases());\r\n\r\n for (const database of databases) {\r\n this.databases[database] = new Database(database);\r\n }\r\n if (configCreate.databaseName) {\r\n this.databases[configCreate.databaseName] = new Database(configCreate.databaseName);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a database connection instance for query building\r\n * \r\n * @param {string} databaseName - Name of the database configuration\r\n * @returns {Database} Database instance with query builder capabilities\r\n * \r\n * @example\r\n * ```typescript\r\n * // Get database connection\r\n * const db = dbcube.database('myapp');\r\n * \r\n * // Use query builder methods\r\n * const users = await db.table('users')\r\n * .select(['id', 'name', 'email'])\r\n * .where('status', 'active')\r\n * .orderBy('created_at', 'desc')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert data\r\n * await db.table('users').insert({\r\n * name: 'John Doe',\r\n * email: 'john@example.com'\r\n * });\r\n * \r\n * // Update data\r\n * await db.table('users')\r\n * .where('id', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete data\r\n * await db.table('users').where('id', 1).delete();\r\n * ```\r\n */\r\n database(databaseName: string): Database {\r\n // Lazy init: cubre el caso en que la config aún no se había cargado\r\n // cuando se importó el módulo (p. ej. bundlers que reordenan side effects)\r\n if (!this.databases[databaseName] && Object.keys(this.databases).length === 0) {\r\n this.init();\r\n }\r\n const db = this.databases[databaseName];\r\n if (!db) {\r\n const known = Object.keys(this.databases);\r\n throw new Error(\r\n `Database '${databaseName}' is not defined in dbcube.config.js.` +\r\n (known.length ? ` Available: ${known.join(', ')}` : ' No databases were loaded — check that dbcube.config.js exists and calls config.set().')\r\n );\r\n }\r\n return db;\r\n }\r\n}\r\n\r\nexport default Dbcube;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport class FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns Promise que resuelve true si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise<boolean>((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Extrae el nombre de la base de datos de un string con formato @database().\r\n * @param input - String de entrada que contiene la referencia a la base de datos.\r\n * @returns El nombre de la base de datos o null si no se encuentra.\r\n */\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && (entry.name.endsWith(suffix) || entry.name.includes(suffix))) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a: string, b: string) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n}\r\n\r\nexport default FileUtils;"],"mappings":"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","names":["resolve","path","require","import_query_builder"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/Dbcube.ts","../src/lib/FileUtils.ts"],"sourcesContent":["import { Dbcube } from './lib/Dbcube';\r\nimport { Database, Table } from '@dbcube/query-builder';\r\n\r\nconst dbcube = new Dbcube();\r\ndbcube.init()\r\n\r\n// Re-export the types directly from the definition\r\nexport { \r\n dbcube,\r\n Database,\r\n Table\r\n};\r\n\r\n// Export types using interface definitions for better compatibility\r\nexport type DatabaseRecord = Record<string, any>;\r\nexport type WhereCallback = (query: Table) => void;","import { Config, EnvLoader } from '@dbcube/core';\r\nimport { Database } from '@dbcube/query-builder';\r\nimport FileUtils from './FileUtils';\r\nimport path from 'path';\r\nimport * as fs from 'fs';\r\nimport { createRequire } from 'module';\r\n\r\n/**\r\n * Dbcube ORM - Main class for database management\r\n * \r\n * A lightweight, flexible ORM that supports multiple database engines including \r\n * MySQL, PostgreSQL, SQLite, and MongoDB with a fluent query builder interface.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { Dbcube } from 'dbcube';\r\n * \r\n * const dbcube = new Dbcube();\r\n * await dbcube.init();\r\n * \r\n * // Get a database connection\r\n * const db = dbcube.database('myDatabase');\r\n * \r\n * // Use query builder\r\n * const users = await db.table('users').select().where('active', true).get();\r\n * ```\r\n * \r\n * @class\r\n * @author Albert Araya\r\n * @license MIT\r\n */\r\nexport class Dbcube {\r\n private static instance: Dbcube;\r\n private configPath!: string;\r\n private config!: Config;\r\n private databases!: Record<string, Database>;\r\n\r\n /**\r\n * Creates a new Dbcube instance (Singleton pattern)\r\n * \r\n * @constructor\r\n * @example\r\n * ```typescript\r\n * const dbcube = new Dbcube();\r\n * ```\r\n */\r\n constructor() {\r\n if (Dbcube.instance) {\r\n return Dbcube.instance;\r\n }\r\n this.configPath = path.join(process.cwd(), 'dbcube.config.js');\r\n this.config = new Config();\r\n this.databases = {};\r\n Dbcube.instance = this;\r\n }\r\n\r\n /**\r\n * Loads configuration from dbcube.config.js file\r\n * \r\n * @private\r\n * @returns {Promise<void>}\r\n * @throws {Error} If config file doesn't exist\r\n */\r\n async loadConfig() {\r\n const exists = await FileUtils.fileExists(this.configPath);\r\n exists ?? console.log('❌ Dont exists config file, please create a dbcube.config.js file');\r\n }\r\n\r\n /**\r\n * Detecta si el proyecto está marcado como ESM (\"type\": \"module\"), lo que\r\n * impide cargar un dbcube.config.js (CommonJS) con require().\r\n * @private\r\n */\r\n private projectIsESM(): boolean {\r\n try {\r\n const pkgPath = path.join(process.cwd(), 'package.json');\r\n if (!fs.existsSync(pkgPath)) return false;\r\n return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).type === 'module';\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the Dbcube ORM with database configurations\r\n * \r\n * @param {Object} configCreate - Optional configuration for creating new database\r\n * @param {string} [configCreate.databaseName] - Name of the database to create\r\n * @param {string} [configCreate.motor] - Database engine (mysql, postgres, sqlite, mongodb)\r\n * @param {any} [configCreate.configAnswers] - Additional configuration answers\r\n * @returns {Promise<void>}\r\n * \r\n * @example\r\n * ```typescript\r\n * // Initialize with existing config\r\n * await dbcube.init();\r\n * \r\n * // Initialize with new database creation\r\n * await dbcube.init({\r\n * databaseName: 'myapp',\r\n * motor: 'mysql'\r\n * });\r\n * ```\r\n */\r\n init(configCreate: { databaseName?: string; motor?: string; configAnswers?: any } = {}) {\r\n // Carga automática de .env (cargador propio de DBCube): el usuario no\r\n // necesita instalar dotenv ni escribir require(\"dotenv\") en su config.\r\n EnvLoader.load();\r\n\r\n let config: any;\r\n // En proyectos ESM, dbcube.config.cjs se carga con require() y el .js no.\r\n const cjsPath = path.join(process.cwd(), 'dbcube.config.cjs');\r\n const configFilePath = fs.existsSync(cjsPath) ? cjsPath : this.configPath;\r\n try {\r\n // Use createRequire for better Next.js compatibility\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(configFilePath)];\r\n const configModule = require(configFilePath);\r\n config = configModule.default || configModule;\r\n } catch (error: any) {\r\n const missing = (String(error.message).match(/Cannot find module '([^']+)'/) || [])[1];\r\n const missingIsConfig = missing && (configFilePath.includes(missing) || missing.includes('dbcube.config'));\r\n if (error.code === 'MODULE_NOT_FOUND' && missing && !missingIsConfig) {\r\n throw new Error(\r\n `dbcube.config requiere un módulo que no está instalado: \"${missing}\". ` +\r\n `Instálalo (p. ej. npm install ${missing}). ` +\r\n `Nota: DBCube ya carga el .env automáticamente — puedes quitar require(\"dotenv\").`\r\n );\r\n }\r\n if (this.projectIsESM() || error.code === 'ERR_REQUIRE_ESM') {\r\n throw new Error(\r\n `No se pudo cargar dbcube.config.js: el proyecto es ESM (\"type\": \"module\") pero la config usa ` +\r\n `CommonJS (module.exports). Renombra el archivo a \"dbcube.config.cjs\" o quita \"type\": \"module\" de package.json.`\r\n );\r\n }\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('No existe dbcube.config.js. Crea el archivo de configuración en la raíz del proyecto.');\r\n }\r\n throw error;\r\n }\r\n\r\n if (typeof config !== 'function') {\r\n throw new Error(\r\n `dbcube.config no exporta una configuración válida.` +\r\n (this.projectIsESM()\r\n ? ` El proyecto es ESM: renombra a \"dbcube.config.cjs\" o quita \"type\": \"module\".`\r\n : ` Debe exportar una función: module.exports = function (config) { config.set({ databases: {...} }); }.`)\r\n );\r\n }\r\n\r\n config(this.config);\r\n\r\n const databases = Object.keys(this.config.getAllDatabases());\r\n\r\n for (const database of databases) {\r\n this.databases[database] = new Database(database);\r\n }\r\n if (configCreate.databaseName) {\r\n this.databases[configCreate.databaseName] = new Database(configCreate.databaseName);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a database connection instance for query building\r\n * \r\n * @param {string} databaseName - Name of the database configuration\r\n * @returns {Database} Database instance with query builder capabilities\r\n * \r\n * @example\r\n * ```typescript\r\n * // Get database connection\r\n * const db = dbcube.database('myapp');\r\n * \r\n * // Use query builder methods\r\n * const users = await db.table('users')\r\n * .select(['id', 'name', 'email'])\r\n * .where('status', 'active')\r\n * .orderBy('created_at', 'desc')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert data\r\n * await db.table('users').insert({\r\n * name: 'John Doe',\r\n * email: 'john@example.com'\r\n * });\r\n * \r\n * // Update data\r\n * await db.table('users')\r\n * .where('id', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete data\r\n * await db.table('users').where('id', 1).delete();\r\n * ```\r\n */\r\n database(databaseName: string): Database {\r\n // Lazy init: cubre el caso en que la config aún no se había cargado\r\n // cuando se importó el módulo (p. ej. bundlers que reordenan side effects)\r\n if (!this.databases[databaseName] && Object.keys(this.databases).length === 0) {\r\n this.init();\r\n }\r\n const db = this.databases[databaseName];\r\n if (!db) {\r\n const known = Object.keys(this.databases);\r\n throw new Error(\r\n `Database '${databaseName}' is not defined in dbcube.config.js.` +\r\n (known.length ? ` Available: ${known.join(', ')}` : ' No databases were loaded — check that dbcube.config.js exists and calls config.set().')\r\n );\r\n }\r\n return db;\r\n }\r\n}\r\n\r\nexport default Dbcube;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport class FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns Promise que resuelve true si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise<boolean>((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Extrae el nombre de la base de datos de un string con formato @database().\r\n * @param input - String de entrada que contiene la referencia a la base de datos.\r\n * @returns El nombre de la base de datos o null si no se encuentra.\r\n */\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && (entry.name.endsWith(suffix) || entry.name.includes(suffix))) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a: string, b: string) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n}\r\n\r\nexport default FileUtils;"],"mappings":"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","names":["resolve","fs","path","require","import_query_builder"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -23,6 +23,12 @@ declare class Dbcube {
|
|
|
23
23
|
* @throws {Error} If config file doesn't exist
|
|
24
24
|
*/
|
|
25
25
|
loadConfig(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Detecta si el proyecto está marcado como ESM ("type": "module"), lo que
|
|
28
|
+
* impide cargar un dbcube.config.js (CommonJS) con require().
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
private projectIsESM;
|
|
26
32
|
/**
|
|
27
33
|
* Initializes the Dbcube ORM with database configurations
|
|
28
34
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -23,6 +23,12 @@ declare class Dbcube {
|
|
|
23
23
|
* @throws {Error} If config file doesn't exist
|
|
24
24
|
*/
|
|
25
25
|
loadConfig(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Detecta si el proyecto está marcado como ESM ("type": "module"), lo que
|
|
28
|
+
* impide cargar un dbcube.config.js (CommonJS) con require().
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
private projectIsESM;
|
|
26
32
|
/**
|
|
27
33
|
* Initializes the Dbcube ORM with database configurations
|
|
28
34
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/lib/Dbcube.ts
|
|
2
|
-
import { Config } from "@dbcube/core";
|
|
2
|
+
import { Config, EnvLoader } from "@dbcube/core";
|
|
3
3
|
import { Database } from "@dbcube/query-builder";
|
|
4
4
|
|
|
5
5
|
// src/lib/FileUtils.ts
|
|
@@ -73,6 +73,7 @@ var FileUtils_default = FileUtils;
|
|
|
73
73
|
|
|
74
74
|
// src/lib/Dbcube.ts
|
|
75
75
|
import path2 from "path";
|
|
76
|
+
import * as fs2 from "fs";
|
|
76
77
|
import { createRequire } from "module";
|
|
77
78
|
var Dbcube = class _Dbcube {
|
|
78
79
|
static instance;
|
|
@@ -108,6 +109,20 @@ var Dbcube = class _Dbcube {
|
|
|
108
109
|
const exists = await FileUtils_default.fileExists(this.configPath);
|
|
109
110
|
exists ?? console.log("\u274C Dont exists config file, please create a dbcube.config.js file");
|
|
110
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Detecta si el proyecto está marcado como ESM ("type": "module"), lo que
|
|
114
|
+
* impide cargar un dbcube.config.js (CommonJS) con require().
|
|
115
|
+
* @private
|
|
116
|
+
*/
|
|
117
|
+
projectIsESM() {
|
|
118
|
+
try {
|
|
119
|
+
const pkgPath = path2.join(process.cwd(), "package.json");
|
|
120
|
+
if (!fs2.existsSync(pkgPath)) return false;
|
|
121
|
+
return JSON.parse(fs2.readFileSync(pkgPath, "utf8")).type === "module";
|
|
122
|
+
} catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
111
126
|
/**
|
|
112
127
|
* Initializes the Dbcube ORM with database configurations
|
|
113
128
|
*
|
|
@@ -130,21 +145,39 @@ var Dbcube = class _Dbcube {
|
|
|
130
145
|
* ```
|
|
131
146
|
*/
|
|
132
147
|
init(configCreate = {}) {
|
|
148
|
+
EnvLoader.load();
|
|
133
149
|
let config;
|
|
150
|
+
const cjsPath = path2.join(process.cwd(), "dbcube.config.cjs");
|
|
151
|
+
const configFilePath = fs2.existsSync(cjsPath) ? cjsPath : this.configPath;
|
|
134
152
|
try {
|
|
135
153
|
const requireUrl = typeof __filename !== "undefined" ? __filename : process.cwd();
|
|
136
154
|
const require2 = createRequire(requireUrl);
|
|
137
|
-
delete require2.cache[require2.resolve(
|
|
138
|
-
const configModule = require2(
|
|
155
|
+
delete require2.cache[require2.resolve(configFilePath)];
|
|
156
|
+
const configModule = require2(configFilePath);
|
|
139
157
|
config = configModule.default || configModule;
|
|
140
158
|
} catch (error) {
|
|
141
|
-
|
|
159
|
+
const missing = (String(error.message).match(/Cannot find module '([^']+)'/) || [])[1];
|
|
160
|
+
const missingIsConfig = missing && (configFilePath.includes(missing) || missing.includes("dbcube.config"));
|
|
161
|
+
if (error.code === "MODULE_NOT_FOUND" && missing && !missingIsConfig) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
`dbcube.config requiere un m\xF3dulo que no est\xE1 instalado: "${missing}". Inst\xE1lalo (p. ej. npm install ${missing}). Nota: DBCube ya carga el .env autom\xE1ticamente \u2014 puedes quitar require("dotenv").`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
if (this.projectIsESM() || error.code === "ERR_REQUIRE_ESM") {
|
|
167
|
+
throw new Error(
|
|
168
|
+
`No se pudo cargar dbcube.config.js: el proyecto es ESM ("type": "module") pero la config usa CommonJS (module.exports). Renombra el archivo a "dbcube.config.cjs" o quita "type": "module" de package.json.`
|
|
169
|
+
);
|
|
170
|
+
}
|
|
142
171
|
if (error.code === "MODULE_NOT_FOUND") {
|
|
143
|
-
|
|
144
|
-
return;
|
|
172
|
+
throw new Error("No existe dbcube.config.js. Crea el archivo de configuraci\xF3n en la ra\xEDz del proyecto.");
|
|
145
173
|
}
|
|
146
174
|
throw error;
|
|
147
175
|
}
|
|
176
|
+
if (typeof config !== "function") {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`dbcube.config no exporta una configuraci\xF3n v\xE1lida.` + (this.projectIsESM() ? ` El proyecto es ESM: renombra a "dbcube.config.cjs" o quita "type": "module".` : ` Debe exportar una funci\xF3n: module.exports = function (config) { config.set({ databases: {...} }); }.`)
|
|
179
|
+
);
|
|
180
|
+
}
|
|
148
181
|
config(this.config);
|
|
149
182
|
const databases = Object.keys(this.config.getAllDatabases());
|
|
150
183
|
for (const database of databases) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/Dbcube.ts","../src/lib/FileUtils.ts","../src/index.ts"],"sourcesContent":["import { Config } from '@dbcube/core';\r\nimport { Database } from '@dbcube/query-builder';\r\nimport FileUtils from './FileUtils';\r\nimport path from 'path';\r\nimport { createRequire } from 'module';\r\n\r\n/**\r\n * Dbcube ORM - Main class for database management\r\n * \r\n * A lightweight, flexible ORM that supports multiple database engines including \r\n * MySQL, PostgreSQL, SQLite, and MongoDB with a fluent query builder interface.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { Dbcube } from 'dbcube';\r\n * \r\n * const dbcube = new Dbcube();\r\n * await dbcube.init();\r\n * \r\n * // Get a database connection\r\n * const db = dbcube.database('myDatabase');\r\n * \r\n * // Use query builder\r\n * const users = await db.table('users').select().where('active', true).get();\r\n * ```\r\n * \r\n * @class\r\n * @author Albert Araya\r\n * @license MIT\r\n */\r\nexport class Dbcube {\r\n private static instance: Dbcube;\r\n private configPath!: string;\r\n private config!: Config;\r\n private databases!: Record<string, Database>;\r\n\r\n /**\r\n * Creates a new Dbcube instance (Singleton pattern)\r\n * \r\n * @constructor\r\n * @example\r\n * ```typescript\r\n * const dbcube = new Dbcube();\r\n * ```\r\n */\r\n constructor() {\r\n if (Dbcube.instance) {\r\n return Dbcube.instance;\r\n }\r\n this.configPath = path.join(process.cwd(), 'dbcube.config.js');\r\n this.config = new Config();\r\n this.databases = {};\r\n Dbcube.instance = this;\r\n }\r\n\r\n /**\r\n * Loads configuration from dbcube.config.js file\r\n * \r\n * @private\r\n * @returns {Promise<void>}\r\n * @throws {Error} If config file doesn't exist\r\n */\r\n async loadConfig() {\r\n const exists = await FileUtils.fileExists(this.configPath);\r\n exists ?? console.log('❌ Dont exists config file, please create a dbcube.config.js file');\r\n }\r\n\r\n /**\r\n * Initializes the Dbcube ORM with database configurations\r\n * \r\n * @param {Object} configCreate - Optional configuration for creating new database\r\n * @param {string} [configCreate.databaseName] - Name of the database to create\r\n * @param {string} [configCreate.motor] - Database engine (mysql, postgres, sqlite, mongodb)\r\n * @param {any} [configCreate.configAnswers] - Additional configuration answers\r\n * @returns {Promise<void>}\r\n * \r\n * @example\r\n * ```typescript\r\n * // Initialize with existing config\r\n * await dbcube.init();\r\n * \r\n * // Initialize with new database creation\r\n * await dbcube.init({\r\n * databaseName: 'myapp',\r\n * motor: 'mysql'\r\n * });\r\n * ```\r\n */\r\n init(configCreate: { databaseName?: string; motor?: string; configAnswers?: any } = {}) {\r\n let config: any;\r\n try {\r\n // Use createRequire for better Next.js compatibility\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(this.configPath)];\r\n const configModule = require(this.configPath);\r\n config = configModule.default || configModule;\r\n } catch (error: any) {\r\n console.log('❌ Config load error:', error);\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n console.log('❌ Config file not found, please create a dbcube.config.js file');\r\n return;\r\n }\r\n throw error;\r\n }\r\n\r\n config(this.config);\r\n\r\n const databases = Object.keys(this.config.getAllDatabases());\r\n\r\n for (const database of databases) {\r\n this.databases[database] = new Database(database);\r\n }\r\n if (configCreate.databaseName) {\r\n this.databases[configCreate.databaseName] = new Database(configCreate.databaseName);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a database connection instance for query building\r\n * \r\n * @param {string} databaseName - Name of the database configuration\r\n * @returns {Database} Database instance with query builder capabilities\r\n * \r\n * @example\r\n * ```typescript\r\n * // Get database connection\r\n * const db = dbcube.database('myapp');\r\n * \r\n * // Use query builder methods\r\n * const users = await db.table('users')\r\n * .select(['id', 'name', 'email'])\r\n * .where('status', 'active')\r\n * .orderBy('created_at', 'desc')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert data\r\n * await db.table('users').insert({\r\n * name: 'John Doe',\r\n * email: 'john@example.com'\r\n * });\r\n * \r\n * // Update data\r\n * await db.table('users')\r\n * .where('id', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete data\r\n * await db.table('users').where('id', 1).delete();\r\n * ```\r\n */\r\n database(databaseName: string): Database {\r\n // Lazy init: cubre el caso en que la config aún no se había cargado\r\n // cuando se importó el módulo (p. ej. bundlers que reordenan side effects)\r\n if (!this.databases[databaseName] && Object.keys(this.databases).length === 0) {\r\n this.init();\r\n }\r\n const db = this.databases[databaseName];\r\n if (!db) {\r\n const known = Object.keys(this.databases);\r\n throw new Error(\r\n `Database '${databaseName}' is not defined in dbcube.config.js.` +\r\n (known.length ? ` Available: ${known.join(', ')}` : ' No databases were loaded — check that dbcube.config.js exists and calls config.set().')\r\n );\r\n }\r\n return db;\r\n }\r\n}\r\n\r\nexport default Dbcube;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport class FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns Promise que resuelve true si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise<boolean>((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Extrae el nombre de la base de datos de un string con formato @database().\r\n * @param input - String de entrada que contiene la referencia a la base de datos.\r\n * @returns El nombre de la base de datos o null si no se encuentra.\r\n */\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && (entry.name.endsWith(suffix) || entry.name.includes(suffix))) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a: string, b: string) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n}\r\n\r\nexport default FileUtils;","import { Dbcube } from './lib/Dbcube';\r\nimport { Database, Table } from '@dbcube/query-builder';\r\n\r\nconst dbcube = new Dbcube();\r\ndbcube.init()\r\n\r\n// Re-export the types directly from the definition\r\nexport { \r\n dbcube,\r\n Database,\r\n Table\r\n};\r\n\r\n// Export types using interface definitions for better compatibility\r\nexport type DatabaseRecord = Record<string, any>;\r\nexport type WhereCallback = (query: Table) => void;"],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,gBAAgB;;;ACDzB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEf,IAAM,YAAN,MAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,aAAa,WAAW,UAAoC;AAC1D,WAAO,IAAI,QAAiB,CAACA,aAAY;AACvC,MAAG,UAAY,aAAQ,QAAQ,GAAM,aAAU,MAAM,CAAC,QAAQ;AAC5D,QAAAA,SAAQ,CAAC,GAAG;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,eAAe,UAA2B;AAC/C,QAAI;AACF,MAAG,cAAgB,aAAQ,QAAQ,GAAM,aAAU,IAAI;AACvD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,OAA8B;AACvD,UAAM,QAAQ,MAAM,MAAM,iCAAiC;AAC3D,WAAO,QAAQ,MAAM,CAAC,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,wBAAwB,KAAa,QAA0B;AACpE,UAAM,UAAe,aAAQ,GAAG;AAChC,UAAM,YAAsB,CAAC;AAE7B,aAAS,QAAQ,YAA0B;AACzC,YAAM,UAAa,eAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAElE,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAgB,UAAK,YAAY,MAAM,IAAI;AAEjD,YAAI,MAAM,YAAY,GAAG;AACvB,kBAAQ,QAAQ;AAAA,QAClB,WAAW,MAAM,OAAO,MAAM,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM,KAAK,SAAS,MAAM,IAAI;AACzF,oBAAU,KAAK,QAAQ;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,OAAO;AAGf,cAAU,KAAK,CAAC,GAAW,MAAc;AACvC,YAAM,OAAO,SAAc,cAAS,CAAC,CAAC;AACtC,YAAM,OAAO,SAAc,cAAS,CAAC,CAAC;AACtC,cAAQ,MAAM,IAAI,IAAI,IAAI,SAAS,MAAM,IAAI,IAAI,IAAI;AAAA,IACvD,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAEA,IAAO,oBAAQ;;;AD3Ef,OAAOC,WAAU;AACjB,SAAS,qBAAqB;AA0BvB,IAAM,SAAN,MAAM,QAAO;AAAA,EAChB,OAAe;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,cAAc;AACV,QAAI,QAAO,UAAU;AACjB,aAAO,QAAO;AAAA,IAClB;AACA,SAAK,aAAaA,MAAK,KAAK,QAAQ,IAAI,GAAG,kBAAkB;AAC7D,SAAK,SAAS,IAAI,OAAO;AACzB,SAAK,YAAY,CAAC;AAClB,YAAO,WAAW;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa;AACf,UAAM,SAAS,MAAM,kBAAU,WAAW,KAAK,UAAU;AACzD,cAAU,QAAQ,IAAI,uEAAkE;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,KAAK,eAA+E,CAAC,GAAG;AACpF,QAAI;AACJ,QAAI;AAGA,YAAM,aAAa,OAAO,eAAe,cAAc,aAAa,QAAQ,IAAI;AAChF,YAAMC,WAAU,cAAc,UAAU;AAExC,aAAOA,SAAQ,MAAMA,SAAQ,QAAQ,KAAK,UAAU,CAAC;AACrD,YAAM,eAAeA,SAAQ,KAAK,UAAU;AAC5C,eAAS,aAAa,WAAW;AAAA,IACrC,SAAS,OAAY;AACjB,cAAQ,IAAI,6BAAwB,KAAK;AACzC,UAAI,MAAM,SAAS,oBAAoB;AACnC,gBAAQ,IAAI,qEAAgE;AAC5E;AAAA,MACJ;AACA,YAAM;AAAA,IACV;AAEA,WAAO,KAAK,MAAM;AAElB,UAAM,YAAY,OAAO,KAAK,KAAK,OAAO,gBAAgB,CAAC;AAE3D,eAAW,YAAY,WAAW;AAC9B,WAAK,UAAU,QAAQ,IAAI,IAAI,SAAS,QAAQ;AAAA,IACpD;AACA,QAAI,aAAa,cAAc;AAC3B,WAAK,UAAU,aAAa,YAAY,IAAI,IAAI,SAAS,aAAa,YAAY;AAAA,IACtF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,SAAS,cAAgC;AAGrC,QAAI,CAAC,KAAK,UAAU,YAAY,KAAK,OAAO,KAAK,KAAK,SAAS,EAAE,WAAW,GAAG;AAC3E,WAAK,KAAK;AAAA,IACd;AACA,UAAM,KAAK,KAAK,UAAU,YAAY;AACtC,QAAI,CAAC,IAAI;AACL,YAAM,QAAQ,OAAO,KAAK,KAAK,SAAS;AACxC,YAAM,IAAI;AAAA,QACN,aAAa,YAAY,2CACxB,MAAM,SAAS,eAAe,MAAM,KAAK,IAAI,CAAC,KAAK;AAAA,MACxD;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;;;AEzKA,SAAS,YAAAC,WAAU,aAAa;AAEhC,IAAM,SAAS,IAAI,OAAO;AAC1B,OAAO,KAAK;","names":["resolve","path","require","Database"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/Dbcube.ts","../src/lib/FileUtils.ts","../src/index.ts"],"sourcesContent":["import { Config, EnvLoader } from '@dbcube/core';\r\nimport { Database } from '@dbcube/query-builder';\r\nimport FileUtils from './FileUtils';\r\nimport path from 'path';\r\nimport * as fs from 'fs';\r\nimport { createRequire } from 'module';\r\n\r\n/**\r\n * Dbcube ORM - Main class for database management\r\n * \r\n * A lightweight, flexible ORM that supports multiple database engines including \r\n * MySQL, PostgreSQL, SQLite, and MongoDB with a fluent query builder interface.\r\n * \r\n * @example\r\n * ```typescript\r\n * import { Dbcube } from 'dbcube';\r\n * \r\n * const dbcube = new Dbcube();\r\n * await dbcube.init();\r\n * \r\n * // Get a database connection\r\n * const db = dbcube.database('myDatabase');\r\n * \r\n * // Use query builder\r\n * const users = await db.table('users').select().where('active', true).get();\r\n * ```\r\n * \r\n * @class\r\n * @author Albert Araya\r\n * @license MIT\r\n */\r\nexport class Dbcube {\r\n private static instance: Dbcube;\r\n private configPath!: string;\r\n private config!: Config;\r\n private databases!: Record<string, Database>;\r\n\r\n /**\r\n * Creates a new Dbcube instance (Singleton pattern)\r\n * \r\n * @constructor\r\n * @example\r\n * ```typescript\r\n * const dbcube = new Dbcube();\r\n * ```\r\n */\r\n constructor() {\r\n if (Dbcube.instance) {\r\n return Dbcube.instance;\r\n }\r\n this.configPath = path.join(process.cwd(), 'dbcube.config.js');\r\n this.config = new Config();\r\n this.databases = {};\r\n Dbcube.instance = this;\r\n }\r\n\r\n /**\r\n * Loads configuration from dbcube.config.js file\r\n * \r\n * @private\r\n * @returns {Promise<void>}\r\n * @throws {Error} If config file doesn't exist\r\n */\r\n async loadConfig() {\r\n const exists = await FileUtils.fileExists(this.configPath);\r\n exists ?? console.log('❌ Dont exists config file, please create a dbcube.config.js file');\r\n }\r\n\r\n /**\r\n * Detecta si el proyecto está marcado como ESM (\"type\": \"module\"), lo que\r\n * impide cargar un dbcube.config.js (CommonJS) con require().\r\n * @private\r\n */\r\n private projectIsESM(): boolean {\r\n try {\r\n const pkgPath = path.join(process.cwd(), 'package.json');\r\n if (!fs.existsSync(pkgPath)) return false;\r\n return JSON.parse(fs.readFileSync(pkgPath, 'utf8')).type === 'module';\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the Dbcube ORM with database configurations\r\n * \r\n * @param {Object} configCreate - Optional configuration for creating new database\r\n * @param {string} [configCreate.databaseName] - Name of the database to create\r\n * @param {string} [configCreate.motor] - Database engine (mysql, postgres, sqlite, mongodb)\r\n * @param {any} [configCreate.configAnswers] - Additional configuration answers\r\n * @returns {Promise<void>}\r\n * \r\n * @example\r\n * ```typescript\r\n * // Initialize with existing config\r\n * await dbcube.init();\r\n * \r\n * // Initialize with new database creation\r\n * await dbcube.init({\r\n * databaseName: 'myapp',\r\n * motor: 'mysql'\r\n * });\r\n * ```\r\n */\r\n init(configCreate: { databaseName?: string; motor?: string; configAnswers?: any } = {}) {\r\n // Carga automática de .env (cargador propio de DBCube): el usuario no\r\n // necesita instalar dotenv ni escribir require(\"dotenv\") en su config.\r\n EnvLoader.load();\r\n\r\n let config: any;\r\n // En proyectos ESM, dbcube.config.cjs se carga con require() y el .js no.\r\n const cjsPath = path.join(process.cwd(), 'dbcube.config.cjs');\r\n const configFilePath = fs.existsSync(cjsPath) ? cjsPath : this.configPath;\r\n try {\r\n // Use createRequire for better Next.js compatibility\r\n // Use __filename for CJS, process.cwd() for ESM\r\n const requireUrl = typeof __filename !== 'undefined' ? __filename : process.cwd();\r\n const require = createRequire(requireUrl);\r\n // Clear require cache to ensure fresh load\r\n delete require.cache[require.resolve(configFilePath)];\r\n const configModule = require(configFilePath);\r\n config = configModule.default || configModule;\r\n } catch (error: any) {\r\n const missing = (String(error.message).match(/Cannot find module '([^']+)'/) || [])[1];\r\n const missingIsConfig = missing && (configFilePath.includes(missing) || missing.includes('dbcube.config'));\r\n if (error.code === 'MODULE_NOT_FOUND' && missing && !missingIsConfig) {\r\n throw new Error(\r\n `dbcube.config requiere un módulo que no está instalado: \"${missing}\". ` +\r\n `Instálalo (p. ej. npm install ${missing}). ` +\r\n `Nota: DBCube ya carga el .env automáticamente — puedes quitar require(\"dotenv\").`\r\n );\r\n }\r\n if (this.projectIsESM() || error.code === 'ERR_REQUIRE_ESM') {\r\n throw new Error(\r\n `No se pudo cargar dbcube.config.js: el proyecto es ESM (\"type\": \"module\") pero la config usa ` +\r\n `CommonJS (module.exports). Renombra el archivo a \"dbcube.config.cjs\" o quita \"type\": \"module\" de package.json.`\r\n );\r\n }\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('No existe dbcube.config.js. Crea el archivo de configuración en la raíz del proyecto.');\r\n }\r\n throw error;\r\n }\r\n\r\n if (typeof config !== 'function') {\r\n throw new Error(\r\n `dbcube.config no exporta una configuración válida.` +\r\n (this.projectIsESM()\r\n ? ` El proyecto es ESM: renombra a \"dbcube.config.cjs\" o quita \"type\": \"module\".`\r\n : ` Debe exportar una función: module.exports = function (config) { config.set({ databases: {...} }); }.`)\r\n );\r\n }\r\n\r\n config(this.config);\r\n\r\n const databases = Object.keys(this.config.getAllDatabases());\r\n\r\n for (const database of databases) {\r\n this.databases[database] = new Database(database);\r\n }\r\n if (configCreate.databaseName) {\r\n this.databases[configCreate.databaseName] = new Database(configCreate.databaseName);\r\n }\r\n }\r\n\r\n /**\r\n * Gets a database connection instance for query building\r\n * \r\n * @param {string} databaseName - Name of the database configuration\r\n * @returns {Database} Database instance with query builder capabilities\r\n * \r\n * @example\r\n * ```typescript\r\n * // Get database connection\r\n * const db = dbcube.database('myapp');\r\n * \r\n * // Use query builder methods\r\n * const users = await db.table('users')\r\n * .select(['id', 'name', 'email'])\r\n * .where('status', 'active')\r\n * .orderBy('created_at', 'desc')\r\n * .limit(10)\r\n * .get();\r\n * \r\n * // Insert data\r\n * await db.table('users').insert({\r\n * name: 'John Doe',\r\n * email: 'john@example.com'\r\n * });\r\n * \r\n * // Update data\r\n * await db.table('users')\r\n * .where('id', 1)\r\n * .update({ status: 'inactive' });\r\n * \r\n * // Delete data\r\n * await db.table('users').where('id', 1).delete();\r\n * ```\r\n */\r\n database(databaseName: string): Database {\r\n // Lazy init: cubre el caso en que la config aún no se había cargado\r\n // cuando se importó el módulo (p. ej. bundlers que reordenan side effects)\r\n if (!this.databases[databaseName] && Object.keys(this.databases).length === 0) {\r\n this.init();\r\n }\r\n const db = this.databases[databaseName];\r\n if (!db) {\r\n const known = Object.keys(this.databases);\r\n throw new Error(\r\n `Database '${databaseName}' is not defined in dbcube.config.js.` +\r\n (known.length ? ` Available: ${known.join(', ')}` : ' No databases were loaded — check that dbcube.config.js exists and calls config.set().')\r\n );\r\n }\r\n return db;\r\n }\r\n}\r\n\r\nexport default Dbcube;","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport class FileUtils {\r\n /**\r\n * Verifica si un archivo existe (asincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns Promise que resuelve true si el archivo existe, false si no.\r\n */\r\n static async fileExists(filePath: string): Promise<boolean> {\r\n return new Promise<boolean>((resolve) => {\r\n fs.access(path.resolve(filePath), fs.constants.F_OK, (err) => {\r\n resolve(!err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Verifica si un archivo existe (sincrónico).\r\n * @param filePath - Ruta del archivo.\r\n * @returns True si el archivo existe, false si no.\r\n */\r\n static fileExistsSync(filePath: string): boolean {\r\n try {\r\n fs.accessSync(path.resolve(filePath), fs.constants.F_OK);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Extrae el nombre de la base de datos de un string con formato @database().\r\n * @param input - String de entrada que contiene la referencia a la base de datos.\r\n * @returns El nombre de la base de datos o null si no se encuentra.\r\n */\r\n static extractDatabaseName(input: string): string | null {\r\n const match = input.match(/@database\\([\"']?([\\w-]+)[\"']?\\)/);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Lee recursivamente archivos que terminan en un sufijo dado y los ordena numéricamente.\r\n * @param dir - Directorio base (relativo o absoluto).\r\n * @param suffix - Sufijo de archivo (como 'table.cube').\r\n * @returns Rutas absolutas de los archivos encontrados y ordenados.\r\n */\r\n static getCubeFilesRecursively(dir: string, suffix: string): string[] {\r\n const baseDir = path.resolve(dir); // ✅ Asegura que sea absoluto\r\n const cubeFiles: string[] = [];\r\n\r\n function recurse(currentDir: string): void {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n recurse(fullPath);\r\n } else if (entry.isFile() && (entry.name.endsWith(suffix) || entry.name.includes(suffix))) {\r\n cubeFiles.push(fullPath); // Ya es absoluta\r\n }\r\n }\r\n }\r\n\r\n recurse(baseDir);\r\n\r\n // Ordenar por número si los archivos comienzan con un número\r\n cubeFiles.sort((a: string, b: string) => {\r\n const aNum = parseInt(path.basename(a));\r\n const bNum = parseInt(path.basename(b));\r\n return (isNaN(aNum) ? 0 : aNum) - (isNaN(bNum) ? 0 : bNum);\r\n });\r\n\r\n return cubeFiles;\r\n }\r\n}\r\n\r\nexport default FileUtils;","import { Dbcube } from './lib/Dbcube';\r\nimport { Database, Table } from '@dbcube/query-builder';\r\n\r\nconst dbcube = new Dbcube();\r\ndbcube.init()\r\n\r\n// Re-export the types directly from the definition\r\nexport { \r\n dbcube,\r\n Database,\r\n Table\r\n};\r\n\r\n// Export types using interface definitions for better compatibility\r\nexport type DatabaseRecord = Record<string, any>;\r\nexport type WhereCallback = (query: Table) => void;"],"mappings":";AAAA,SAAS,QAAQ,iBAAiB;AAClC,SAAS,gBAAgB;;;ACDzB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEf,IAAM,YAAN,MAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,aAAa,WAAW,UAAoC;AAC1D,WAAO,IAAI,QAAiB,CAACA,aAAY;AACvC,MAAG,UAAY,aAAQ,QAAQ,GAAM,aAAU,MAAM,CAAC,QAAQ;AAC5D,QAAAA,SAAQ,CAAC,GAAG;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,eAAe,UAA2B;AAC/C,QAAI;AACF,MAAG,cAAgB,aAAQ,QAAQ,GAAM,aAAU,IAAI;AACvD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,oBAAoB,OAA8B;AACvD,UAAM,QAAQ,MAAM,MAAM,iCAAiC;AAC3D,WAAO,QAAQ,MAAM,CAAC,IAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,wBAAwB,KAAa,QAA0B;AACpE,UAAM,UAAe,aAAQ,GAAG;AAChC,UAAM,YAAsB,CAAC;AAE7B,aAAS,QAAQ,YAA0B;AACzC,YAAM,UAAa,eAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAElE,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAgB,UAAK,YAAY,MAAM,IAAI;AAEjD,YAAI,MAAM,YAAY,GAAG;AACvB,kBAAQ,QAAQ;AAAA,QAClB,WAAW,MAAM,OAAO,MAAM,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM,KAAK,SAAS,MAAM,IAAI;AACzF,oBAAU,KAAK,QAAQ;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,OAAO;AAGf,cAAU,KAAK,CAAC,GAAW,MAAc;AACvC,YAAM,OAAO,SAAc,cAAS,CAAC,CAAC;AACtC,YAAM,OAAO,SAAc,cAAS,CAAC,CAAC;AACtC,cAAQ,MAAM,IAAI,IAAI,IAAI,SAAS,MAAM,IAAI,IAAI,IAAI;AAAA,IACvD,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAEA,IAAO,oBAAQ;;;AD3Ef,OAAOC,WAAU;AACjB,YAAYC,SAAQ;AACpB,SAAS,qBAAqB;AA0BvB,IAAM,SAAN,MAAM,QAAO;AAAA,EAChB,OAAe;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,cAAc;AACV,QAAI,QAAO,UAAU;AACjB,aAAO,QAAO;AAAA,IAClB;AACA,SAAK,aAAaD,MAAK,KAAK,QAAQ,IAAI,GAAG,kBAAkB;AAC7D,SAAK,SAAS,IAAI,OAAO;AACzB,SAAK,YAAY,CAAC;AAClB,YAAO,WAAW;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAa;AACf,UAAM,SAAS,MAAM,kBAAU,WAAW,KAAK,UAAU;AACzD,cAAU,QAAQ,IAAI,uEAAkE;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAwB;AAC5B,QAAI;AACA,YAAM,UAAUA,MAAK,KAAK,QAAQ,IAAI,GAAG,cAAc;AACvD,UAAI,CAAI,eAAW,OAAO,EAAG,QAAO;AACpC,aAAO,KAAK,MAAS,iBAAa,SAAS,MAAM,CAAC,EAAE,SAAS;AAAA,IACjE,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,KAAK,eAA+E,CAAC,GAAG;AAGpF,cAAU,KAAK;AAEf,QAAI;AAEJ,UAAM,UAAUA,MAAK,KAAK,QAAQ,IAAI,GAAG,mBAAmB;AAC5D,UAAM,iBAAoB,eAAW,OAAO,IAAI,UAAU,KAAK;AAC/D,QAAI;AAGA,YAAM,aAAa,OAAO,eAAe,cAAc,aAAa,QAAQ,IAAI;AAChF,YAAME,WAAU,cAAc,UAAU;AAExC,aAAOA,SAAQ,MAAMA,SAAQ,QAAQ,cAAc,CAAC;AACpD,YAAM,eAAeA,SAAQ,cAAc;AAC3C,eAAS,aAAa,WAAW;AAAA,IACrC,SAAS,OAAY;AACjB,YAAM,WAAW,OAAO,MAAM,OAAO,EAAE,MAAM,8BAA8B,KAAK,CAAC,GAAG,CAAC;AACrF,YAAM,kBAAkB,YAAY,eAAe,SAAS,OAAO,KAAK,QAAQ,SAAS,eAAe;AACxG,UAAI,MAAM,SAAS,sBAAsB,WAAW,CAAC,iBAAiB;AAClE,cAAM,IAAI;AAAA,UACN,kEAA4D,OAAO,uCAClC,OAAO;AAAA,QAE5C;AAAA,MACJ;AACA,UAAI,KAAK,aAAa,KAAK,MAAM,SAAS,mBAAmB;AACzD,cAAM,IAAI;AAAA,UACN;AAAA,QAEJ;AAAA,MACJ;AACA,UAAI,MAAM,SAAS,oBAAoB;AACnC,cAAM,IAAI,MAAM,6FAAuF;AAAA,MAC3G;AACA,YAAM;AAAA,IACV;AAEA,QAAI,OAAO,WAAW,YAAY;AAC9B,YAAM,IAAI;AAAA,QACN,8DACC,KAAK,aAAa,IACb,kFACA;AAAA,MACV;AAAA,IACJ;AAEA,WAAO,KAAK,MAAM;AAElB,UAAM,YAAY,OAAO,KAAK,KAAK,OAAO,gBAAgB,CAAC;AAE3D,eAAW,YAAY,WAAW;AAC9B,WAAK,UAAU,QAAQ,IAAI,IAAI,SAAS,QAAQ;AAAA,IACpD;AACA,QAAI,aAAa,cAAc;AAC3B,WAAK,UAAU,aAAa,YAAY,IAAI,IAAI,SAAS,aAAa,YAAY;AAAA,IACtF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,SAAS,cAAgC;AAGrC,QAAI,CAAC,KAAK,UAAU,YAAY,KAAK,OAAO,KAAK,KAAK,SAAS,EAAE,WAAW,GAAG;AAC3E,WAAK,KAAK;AAAA,IACd;AACA,UAAM,KAAK,KAAK,UAAU,YAAY;AACtC,QAAI,CAAC,IAAI;AACL,YAAM,QAAQ,OAAO,KAAK,KAAK,SAAS;AACxC,YAAM,IAAI;AAAA,QACN,aAAa,YAAY,2CACxB,MAAM,SAAS,eAAe,MAAM,KAAK,IAAI,CAAC,KAAK;AAAA,MACxD;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;;;AEtNA,SAAS,YAAAC,WAAU,aAAa;AAEhC,IAAM,SAAS,IAAI,OAAO;AAC1B,OAAO,KAAK;","names":["resolve","path","fs","require","Database"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dbcube",
|
|
3
|
-
"version": "5.2.
|
|
3
|
+
"version": "5.2.5",
|
|
4
4
|
"description": "DBCube ORM: the fastest way to work with MySQL, PostgreSQL, SQLite and MongoDB in Node.js — daemon-powered query engine (sub-millisecond queries), fluent query builder, transactions, eager loading and .cube schema files.",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -54,8 +54,8 @@
|
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@dbcube/core": "^5.2.
|
|
58
|
-
"@dbcube/query-builder": "^5.2.
|
|
57
|
+
"@dbcube/core": "^5.2.5",
|
|
58
|
+
"@dbcube/query-builder": "^5.2.5"
|
|
59
59
|
},
|
|
60
60
|
"files": [
|
|
61
61
|
"dist/**/*"
|