dbcube 5.1.4 → 5.2.1

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/README.md CHANGED
@@ -0,0 +1,121 @@
1
+ # dbcube
2
+
3
+ The fastest way to work with **MySQL, PostgreSQL, SQLite and MongoDB** in Node.js.
4
+
5
+ DBCube runs your queries through a persistent Rust engine (daemon mode) with warm connection pools — **sub-millisecond query dispatch** instead of paying process-spawn overhead, plus a fluent query builder, real transactions and schema-as-code with `.cube` files.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install dbcube
11
+ npx dbcube init # scaffolds dbcube.config.js + dbcube/ + example schema
12
+ ```
13
+
14
+ ## Configuration
15
+
16
+ `dbcube.config.js` in your project root:
17
+
18
+ ```js
19
+ module.exports = function (config) {
20
+ config.set({
21
+ databases: {
22
+ myapp: {
23
+ type: "mysql", // mysql | postgres | sqlite | mongodb
24
+ config: {
25
+ HOST: process.env.DB_HOST,
26
+ USER: process.env.DB_USER,
27
+ PASSWORD: process.env.DB_PASSWORD,
28
+ DATABASE: process.env.DB_NAME,
29
+ PORT: 3306
30
+ }
31
+ }
32
+ }
33
+ });
34
+ };
35
+ ```
36
+
37
+ ## Usage
38
+
39
+ ```js
40
+ const dbcube = require('dbcube');
41
+ const db = dbcube.database('myapp');
42
+
43
+ // Queries
44
+ const users = await db.table('users')
45
+ .where('status', '=', 'active')
46
+ .orderBy('created_at', 'DESC')
47
+ .limit(10)
48
+ .get();
49
+
50
+ // Writes (update/delete always require a WHERE)
51
+ await db.table('users').insert([{ name: 'Ada', email: 'ada@example.com' }]);
52
+ await db.table('users').where('id', '=', 1).update({ status: 'inactive' });
53
+
54
+ // Transactions — everything commits or everything rolls back
55
+ await db.transaction(async (trx) => {
56
+ await trx.table('accounts').where('id', '=', 1).update({ balance: 50 });
57
+ await trx.table('accounts').where('id', '=', 2).update({ balance: 150 });
58
+ });
59
+
60
+ // Raw SQL escape hatch (bound parameters)
61
+ const rows = await db.raw('SELECT * FROM users WHERE age > ?', [25]);
62
+
63
+ // Eager loading from your .cube foreign keys — one batched query, no N+1
64
+ const usersWithOrders = await db.table('users').with('orders').get();
65
+
66
+ // Pagination, upsert, atomic counters…
67
+ const page = await db.table('posts').paginate(2, 20);
68
+ await db.table('settings').upsert([{ key: 'theme', value: 'dark' }], ['key']);
69
+ await db.table('products').where('id', '=', 7).increment('stock', 5);
70
+ ```
71
+
72
+ ## Advanced configuration
73
+
74
+ Tune the connection pool and daemon per database:
75
+
76
+ ```js
77
+ myapp: {
78
+ type: "mysql",
79
+ config: { /* ... */ },
80
+ pool: {
81
+ maxConnections: 20, // default 5 (sqlite: 10)
82
+ minConnections: 4, // default 2
83
+ acquireTimeoutMs: 5000, // default 3000
84
+ idleTimeoutMs: 600000 // default 3600000
85
+ },
86
+ daemon: {
87
+ enabled: true, // false → one-shot mode (transactions need the daemon)
88
+ requestTimeoutMs: 60000 // default 30000
89
+ }
90
+ }
91
+ ```
92
+
93
+ ## TypeScript
94
+
95
+ Generate interfaces from your schema and get fully typed queries:
96
+
97
+ ```ts
98
+ // npx dbcube generate → dbcube/types.ts
99
+ import type { User } from './dbcube/types';
100
+
101
+ const users = await db.table<User>('users').where('age', '>', 25).get(); // User[]
102
+ const one = await db.table<User>('users').first(); // User | null
103
+ ```
104
+
105
+ ## Highlights
106
+
107
+ - **Daemon mode**: persistent TCP engine, ~0.3 ms per query (disable with `DBCUBE_DAEMON=0`)
108
+ - **Transactions** with automatic rollback on error — MySQL, PostgreSQL, SQLite and MongoDB (replica set)
109
+ - **Schema as code**: define tables in `.table.cube` files, apply with `npx dbcube run table:refresh`
110
+ - **Migrations** with history and rollback (`.alter.cube` + `migrate:status` / `migrate:rollback`)
111
+ - **TypeScript types** generated from your schema: `npx dbcube generate`
112
+ - Aggregations (`count/sum/avg/max/min`), `exists()`, `chunk()`, `whereIn/whereNotIn`, `having`, `selectRaw`, computed fields and runtime triggers
113
+ - **Runtime triggers scale horizontally**: they run in JS in the process that performs the write, so with N service replicas each operation fires its trigger exactly once — no distributed coordination needed
114
+
115
+ ## Documentation
116
+
117
+ Full docs: https://dbcube.org — CLI reference: `npx dbcube help`
118
+
119
+ ## License
120
+
121
+ MIT
package/dist/index.cjs CHANGED
@@ -227,7 +227,17 @@ var Dbcube = class _Dbcube {
227
227
  * ```
228
228
  */
229
229
  database(databaseName) {
230
- return this.databases[databaseName];
230
+ if (!this.databases[databaseName] && Object.keys(this.databases).length === 0) {
231
+ this.init();
232
+ }
233
+ const db = this.databases[databaseName];
234
+ if (!db) {
235
+ const known = Object.keys(this.databases);
236
+ throw new Error(
237
+ `Database '${databaseName}' is not defined in dbcube.config.js.` + (known.length ? ` Available: ${known.join(", ")}` : " No databases were loaded \u2014 check that dbcube.config.js exists and calls config.set().")
238
+ );
239
+ }
240
+ return db;
231
241
  }
232
242
  };
233
243
 
@@ -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: any;\r\n private databases!: Record<string, any>;\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) {\r\n return this.databases[databaseName];\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 } 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"]}
package/dist/index.d.mts CHANGED
@@ -83,7 +83,7 @@ declare class Dbcube {
83
83
  * await db.table('users').where('id', 1).delete();
84
84
  * ```
85
85
  */
86
- database(databaseName: string): any;
86
+ database(databaseName: string): Database;
87
87
  }
88
88
  export declare const dbcube: Dbcube;
89
89
  export type DatabaseRecord = Record<string, any>;
@@ -0,0 +1,97 @@
1
+ import { Database, Table } from '@dbcube/query-builder';
2
+
3
+ declare class Dbcube {
4
+ private static instance;
5
+ private configPath;
6
+ private config;
7
+ private databases;
8
+ /**
9
+ * Creates a new Dbcube instance (Singleton pattern)
10
+ *
11
+ * @constructor
12
+ * @example
13
+ * ```typescript
14
+ * const dbcube = new Dbcube();
15
+ * ```
16
+ */
17
+ constructor();
18
+ /**
19
+ * Loads configuration from dbcube.config.js file
20
+ *
21
+ * @private
22
+ * @returns {Promise<void>}
23
+ * @throws {Error} If config file doesn't exist
24
+ */
25
+ loadConfig(): Promise<void>;
26
+ /**
27
+ * Initializes the Dbcube ORM with database configurations
28
+ *
29
+ * @param {Object} configCreate - Optional configuration for creating new database
30
+ * @param {string} [configCreate.databaseName] - Name of the database to create
31
+ * @param {string} [configCreate.motor] - Database engine (mysql, postgres, sqlite, mongodb)
32
+ * @param {any} [configCreate.configAnswers] - Additional configuration answers
33
+ * @returns {Promise<void>}
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * // Initialize with existing config
38
+ * await dbcube.init();
39
+ *
40
+ * // Initialize with new database creation
41
+ * await dbcube.init({
42
+ * databaseName: 'myapp',
43
+ * motor: 'mysql'
44
+ * });
45
+ * ```
46
+ */
47
+ init(configCreate?: {
48
+ databaseName?: string;
49
+ motor?: string;
50
+ configAnswers?: any;
51
+ }): void;
52
+ /**
53
+ * Gets a database connection instance for query building
54
+ *
55
+ * @param {string} databaseName - Name of the database configuration
56
+ * @returns {Database} Database instance with query builder capabilities
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * // Get database connection
61
+ * const db = dbcube.database('myapp');
62
+ *
63
+ * // Use query builder methods
64
+ * const users = await db.table('users')
65
+ * .select(['id', 'name', 'email'])
66
+ * .where('status', 'active')
67
+ * .orderBy('created_at', 'desc')
68
+ * .limit(10)
69
+ * .get();
70
+ *
71
+ * // Insert data
72
+ * await db.table('users').insert({
73
+ * name: 'John Doe',
74
+ * email: 'john@example.com'
75
+ * });
76
+ *
77
+ * // Update data
78
+ * await db.table('users')
79
+ * .where('id', 1)
80
+ * .update({ status: 'inactive' });
81
+ *
82
+ * // Delete data
83
+ * await db.table('users').where('id', 1).delete();
84
+ * ```
85
+ */
86
+ database(databaseName: string): Database;
87
+ }
88
+ export declare const dbcube: Dbcube;
89
+ export type DatabaseRecord = Record<string, any>;
90
+ export type WhereCallback = (query: Table) => void;
91
+
92
+ export {
93
+ Database,
94
+ Table,
95
+ };
96
+
97
+ export {};
package/dist/index.js CHANGED
@@ -189,7 +189,17 @@ var Dbcube = class _Dbcube {
189
189
  * ```
190
190
  */
191
191
  database(databaseName) {
192
- return this.databases[databaseName];
192
+ if (!this.databases[databaseName] && Object.keys(this.databases).length === 0) {
193
+ this.init();
194
+ }
195
+ const db = this.databases[databaseName];
196
+ if (!db) {
197
+ const known = Object.keys(this.databases);
198
+ throw new Error(
199
+ `Database '${databaseName}' is not defined in dbcube.config.js.` + (known.length ? ` Available: ${known.join(", ")}` : " No databases were loaded \u2014 check that dbcube.config.js exists and calls config.set().")
200
+ );
201
+ }
202
+ return db;
193
203
  }
194
204
  };
195
205
 
@@ -0,0 +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":"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","names":["resolve","path","require","Database"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dbcube",
3
- "version": "5.1.4",
4
- "description": "",
3
+ "version": "5.2.1",
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",
7
7
  "types": "dist/index.d.ts",
@@ -54,20 +54,23 @@
54
54
  "access": "public"
55
55
  },
56
56
  "dependencies": {
57
- "@dbcube/core": "^5.1.13",
58
- "@dbcube/query-builder": "^5.1.5"
57
+ "@dbcube/core": "^5.2.1",
58
+ "@dbcube/query-builder": "^5.2.1"
59
59
  },
60
+ "files": [
61
+ "dist/**/*"
62
+ ],
60
63
  "repository": {
61
64
  "type": "git",
62
65
  "url": "git+https://github.com/Dbcube/query-builder"
63
66
  },
64
67
  "devDependencies": {
65
- "@types/node": "^25.6.2",
68
+ "@types/node": "^25.9.3",
66
69
  "alwait": "^1.0.0",
67
70
  "chalk": "^5.6.2",
68
71
  "dotenv": "^17.4.2",
69
72
  "dts-bundle-generator": "^9.5.1",
70
- "rollup": "^4.60.3",
73
+ "rollup": "^4.61.1",
71
74
  "tsup": "^8.5.1",
72
75
  "typescript": "^6.0.3"
73
76
  }
package/.pnpmrc DELETED
@@ -1 +0,0 @@
1
- enable-pre-post-scripts=true
package/CONTRIBUTING.md DELETED
@@ -1,9 +0,0 @@
1
- ## Colaboración
2
-
3
- Si deseas contribuir a este proyecto, sigue estos pasos:
4
-
5
- 1. Haz un fork del repositorio.
6
- 2. Crea una nueva rama (`git checkout -b feature/nueva-caracteristica`).
7
- 3. Realiza tus cambios y haz commit de ellos (`git commit -am 'Añadir nueva característica'`).
8
- 4. Sube tu rama (`git push origin feature/nueva-caracteristica`).
9
- 5. Abre un Pull Request.