@coherent.js/core 1.0.0-beta.2 → 1.0.0-beta.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/coherent.d.ts +10 -150
- package/dist/coherent.d.ts.map +1 -1
- package/dist/coherent.js +33 -166
- package/dist/coherent.js.map +1 -1
- package/dist/components/component-system.js +109 -109
- package/dist/core/html-utils.js +5 -5
- package/dist/core/object-factory.js +21 -21
- package/dist/core/object-utils.js +2 -2
- package/dist/database/adapters/mongodb.d.ts +15 -0
- package/dist/database/adapters/mongodb.d.ts.map +1 -0
- package/dist/database/adapters/mongodb.js +216 -0
- package/dist/database/adapters/mongodb.js.map +1 -0
- package/dist/database/adapters/mysql.d.ts +12 -0
- package/dist/database/adapters/mysql.d.ts.map +1 -0
- package/dist/database/adapters/mysql.js +171 -0
- package/dist/database/adapters/mysql.js.map +1 -0
- package/dist/database/adapters/postgresql.d.ts +12 -0
- package/dist/database/adapters/postgresql.d.ts.map +1 -0
- package/dist/database/adapters/postgresql.js +177 -0
- package/dist/database/adapters/postgresql.js.map +1 -0
- package/dist/database/adapters/sqlite.d.ts +15 -0
- package/dist/database/adapters/sqlite.d.ts.map +1 -0
- package/dist/database/adapters/sqlite.js +241 -0
- package/dist/database/adapters/sqlite.js.map +1 -0
- package/dist/database/connection-manager.d.ts +135 -0
- package/dist/database/connection-manager.d.ts.map +1 -0
- package/dist/database/connection-manager.js +362 -0
- package/dist/database/connection-manager.js.map +1 -0
- package/dist/database/index.d.ts +38 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +60 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/middleware.d.ts +122 -0
- package/dist/database/middleware.d.ts.map +1 -0
- package/dist/database/middleware.js +390 -0
- package/dist/database/middleware.js.map +1 -0
- package/dist/database/migration.d.ts +62 -0
- package/dist/database/migration.d.ts.map +1 -0
- package/dist/database/migration.js +423 -0
- package/dist/database/migration.js.map +1 -0
- package/dist/database/model.d.ts +8 -0
- package/dist/database/model.d.ts.map +1 -0
- package/dist/database/model.js +167 -0
- package/dist/database/model.js.map +1 -0
- package/dist/database/query-builder.d.ts +111 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +187 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/utils.d.ts +196 -0
- package/dist/database/utils.d.ts.map +1 -0
- package/dist/database/utils.js +372 -0
- package/dist/database/utils.js.map +1 -0
- package/dist/dev/dev-tools.d.ts +1 -1
- package/dist/dev/dev-tools.js +28 -28
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +2 -2
- package/dist/index.js +2 -1
- package/dist/index.js.map +2 -2
- package/dist/performance/bundle-optimizer.js +11 -11
- package/dist/performance/cache-manager.js +6 -6
- package/dist/performance/monitor.js +10 -10
- package/dist/performance/monitor.js.map +1 -1
- package/dist/rendering/base-renderer.js +13 -13
- package/dist/rendering/dom-renderer.d.ts +0 -23
- package/dist/rendering/dom-renderer.d.ts.map +1 -1
- package/dist/rendering/dom-renderer.js +9 -77
- package/dist/rendering/dom-renderer.js.map +1 -1
- package/dist/rendering/html-renderer.d.ts +0 -15
- package/dist/rendering/html-renderer.d.ts.map +1 -1
- package/dist/rendering/html-renderer.js +4 -85
- package/dist/rendering/html-renderer.js.map +1 -1
- package/dist/rendering/streaming-renderer.js +12 -12
- package/dist/utils/dependency-utils.js +2 -2
- package/dist/utils/normalization.js +1 -1
- package/dist/utils/validation.js +1 -1
- package/package.json +22 -1
- package/dist/components/lifecycle.d.ts +0 -212
- package/dist/components/lifecycle.d.ts.map +0 -1
- package/dist/components/lifecycle.js +0 -525
- package/dist/components/lifecycle.js.map +0 -1
- package/dist/forms/validation.d.ts +0 -271
- package/dist/forms/validation.d.ts.map +0 -1
- package/dist/forms/validation.js +0 -573
- package/dist/forms/validation.js.map +0 -1
- package/dist/performance/component-cache.d.ts +0 -120
- package/dist/performance/component-cache.d.ts.map +0 -1
- package/dist/performance/component-cache.js +0 -364
- package/dist/performance/component-cache.js.map +0 -1
- package/dist/rendering/css-manager.d.ts +0 -73
- package/dist/rendering/css-manager.d.ts.map +0 -1
- package/dist/rendering/css-manager.js +0 -176
- package/dist/rendering/css-manager.js.map +0 -1
- package/dist/rendering/vdom-diff.d.ts +0 -47
- package/dist/rendering/vdom-diff.d.ts.map +0 -1
- package/dist/rendering/vdom-diff.js +0 -416
- package/dist/rendering/vdom-diff.js.map +0 -1
- package/dist/routing/router.d.ts +0 -241
- package/dist/routing/router.d.ts.map +0 -1
- package/dist/routing/router.js +0 -648
- package/dist/routing/router.js.map +0 -1
- package/dist/state/reactive-state.d.ts +0 -166
- package/dist/state/reactive-state.d.ts.map +0 -1
- package/dist/state/reactive-state.js +0 -546
- package/dist/state/reactive-state.js.map +0 -1
- package/dist/utils/error-handler.d.ts +0 -148
- package/dist/utils/error-handler.d.ts.map +0 -1
- package/dist/utils/error-handler.js +0 -468
- package/dist/utils/error-handler.js.map +0 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview PostgreSQL adapter implementation with connection pooling and advanced features.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create PostgreSQL adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} PostgreSQL adapter instance
|
|
10
|
+
*/
|
|
11
|
+
export function createPostgreSQLAdapter() {
|
|
12
|
+
let pg = null;
|
|
13
|
+
async function initializePostgreSQL() {
|
|
14
|
+
if (!pg) {
|
|
15
|
+
try {
|
|
16
|
+
const pgModule = await import('pg');
|
|
17
|
+
pg = pgModule.default || pgModule;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
throw new Error('pg package is required for PostgreSQL adapter. Install with: npm install pg');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function convertPlaceholders(sql) {
|
|
25
|
+
let index = 1;
|
|
26
|
+
return sql.replace(/\?/g, () => `$${index++}`);
|
|
27
|
+
}
|
|
28
|
+
function extractInsertId(result) {
|
|
29
|
+
if (result.rows && result.rows.length > 0) {
|
|
30
|
+
const row = result.rows[0];
|
|
31
|
+
return row.id || row.insertId || row.lastval || null;
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
/**
|
|
37
|
+
* Create connection pool
|
|
38
|
+
*/
|
|
39
|
+
async createPool(config) {
|
|
40
|
+
await initializePostgreSQL();
|
|
41
|
+
const poolConfig = {
|
|
42
|
+
host: config.host,
|
|
43
|
+
port: config.port,
|
|
44
|
+
database: config.database,
|
|
45
|
+
user: config.username,
|
|
46
|
+
password: config.password,
|
|
47
|
+
min: config.pool.min,
|
|
48
|
+
max: config.pool.max,
|
|
49
|
+
acquireTimeoutMillis: config.pool.acquireTimeoutMillis,
|
|
50
|
+
createTimeoutMillis: config.pool.createTimeoutMillis,
|
|
51
|
+
destroyTimeoutMillis: config.pool.destroyTimeoutMillis,
|
|
52
|
+
idleTimeoutMillis: config.pool.idleTimeoutMillis,
|
|
53
|
+
reapIntervalMillis: config.pool.reapIntervalMillis,
|
|
54
|
+
createRetryIntervalMillis: config.pool.createRetryIntervalMillis,
|
|
55
|
+
ssl: config.ssl || false
|
|
56
|
+
};
|
|
57
|
+
const pool = new pg.Pool(poolConfig);
|
|
58
|
+
pool.on('_error', (err) => {
|
|
59
|
+
console._error('PostgreSQL pool _error:', err);
|
|
60
|
+
});
|
|
61
|
+
return pool;
|
|
62
|
+
},
|
|
63
|
+
/**
|
|
64
|
+
* Test database connection
|
|
65
|
+
*/
|
|
66
|
+
async testConnection(pool) {
|
|
67
|
+
const client = await pool.connect();
|
|
68
|
+
try {
|
|
69
|
+
await client.query('SELECT 1');
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
client.release();
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* Execute database query
|
|
77
|
+
*/
|
|
78
|
+
async query(pool, sql, params = [], options = {}) {
|
|
79
|
+
const client = await pool.connect();
|
|
80
|
+
try {
|
|
81
|
+
const pgSql = convertPlaceholders(sql);
|
|
82
|
+
const result = await client.query(pgSql, params);
|
|
83
|
+
if (options.single) {
|
|
84
|
+
return result.rows[0] || null;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
rows: result.rows,
|
|
88
|
+
rowCount: result.rowCount,
|
|
89
|
+
affectedRows: result.rowCount,
|
|
90
|
+
insertId: extractInsertId(result)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
client.release();
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
/**
|
|
98
|
+
* Start database transaction
|
|
99
|
+
*/
|
|
100
|
+
async transaction(pool, options = {}) {
|
|
101
|
+
const client = await pool.connect();
|
|
102
|
+
let beginSql = 'BEGIN';
|
|
103
|
+
if (options.isolationLevel) {
|
|
104
|
+
beginSql += ` ISOLATION LEVEL ${options.isolationLevel}`;
|
|
105
|
+
}
|
|
106
|
+
if (options.readOnly) {
|
|
107
|
+
beginSql += ' READ ONLY';
|
|
108
|
+
}
|
|
109
|
+
await client.query(beginSql);
|
|
110
|
+
const transaction = {
|
|
111
|
+
client,
|
|
112
|
+
pool,
|
|
113
|
+
isCommitted: false,
|
|
114
|
+
isRolledBack: false,
|
|
115
|
+
query: async (sql, params, queryOptions) => {
|
|
116
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
117
|
+
throw new Error('Cannot execute query on completed transaction');
|
|
118
|
+
}
|
|
119
|
+
const pgSql = convertPlaceholders(sql);
|
|
120
|
+
const result = await client.query(pgSql, params);
|
|
121
|
+
if (queryOptions && queryOptions.single) {
|
|
122
|
+
return result.rows[0] || null;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
rows: result.rows,
|
|
126
|
+
rowCount: result.rowCount,
|
|
127
|
+
affectedRows: result.rowCount,
|
|
128
|
+
insertId: extractInsertId(result)
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
commit: async () => {
|
|
132
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
133
|
+
throw new Error('Transaction already completed');
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
await client.query('COMMIT');
|
|
137
|
+
transaction.isCommitted = true;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
client.release();
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
rollback: async () => {
|
|
144
|
+
if (transaction.isCommitted || transaction.isRolledBack) {
|
|
145
|
+
throw new Error('Transaction already completed');
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
await client.query('ROLLBACK');
|
|
149
|
+
transaction.isRolledBack = true;
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
client.release();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
return transaction;
|
|
157
|
+
},
|
|
158
|
+
/**
|
|
159
|
+
* Get pool statistics
|
|
160
|
+
*/
|
|
161
|
+
getPoolStats(pool) {
|
|
162
|
+
return {
|
|
163
|
+
total: pool.totalCount,
|
|
164
|
+
available: pool.idleCount,
|
|
165
|
+
acquired: pool.totalCount - pool.idleCount,
|
|
166
|
+
waiting: pool.waitingCount
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
/**
|
|
170
|
+
* Close connection pool
|
|
171
|
+
*/
|
|
172
|
+
async closePool(pool) {
|
|
173
|
+
await pool.end();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=postgresql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgresql.js","sourceRoot":"","sources":["../../../../../src/database/adapters/postgresql.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview SQLite adapter implementation with connection pooling and transaction support.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new SQLite adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} SQLite adapter instance with database operations
|
|
10
|
+
*/
|
|
11
|
+
export function createSQLiteAdapter(): Object;
|
|
12
|
+
export namespace SQLiteAdapter {
|
|
13
|
+
export { createSQLiteAdapter as create };
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../../../src/database/adapters/sqlite.js"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,uCAFa,MAAM,CAmQlB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Adapter for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview SQLite adapter implementation with connection pooling and transaction support.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a new SQLite adapter instance
|
|
8
|
+
*
|
|
9
|
+
* @returns {Object} SQLite adapter instance with database operations
|
|
10
|
+
*/
|
|
11
|
+
export function createSQLiteAdapter() {
|
|
12
|
+
let sqlite3 = null;
|
|
13
|
+
let db = null;
|
|
14
|
+
/**
|
|
15
|
+
* Initialize SQLite module
|
|
16
|
+
*
|
|
17
|
+
* @private
|
|
18
|
+
* @returns {Promise<void>}
|
|
19
|
+
*/
|
|
20
|
+
async function initializeSQLite() {
|
|
21
|
+
if (!sqlite3) {
|
|
22
|
+
try {
|
|
23
|
+
// Try to import sqlite3 (peer dependency)
|
|
24
|
+
const sqlite3Module = await import('sqlite3');
|
|
25
|
+
sqlite3 = sqlite3Module.default || sqlite3Module;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error('Failed to load sqlite3 module. Make sure to install it: npm install sqlite3');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Connect to the database
|
|
34
|
+
*
|
|
35
|
+
* @param {Object} config - Database configuration
|
|
36
|
+
* @param {string} config.database - Path to the SQLite database file
|
|
37
|
+
* @param {boolean} [config.readonly=false] - Open the database in read-only mode
|
|
38
|
+
* @returns {Promise<Object>} The database adapter instance
|
|
39
|
+
*/
|
|
40
|
+
async function connect(config) {
|
|
41
|
+
await initializeSQLite();
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
try {
|
|
44
|
+
db = new sqlite3.Database(config.database, config.readonly ? sqlite3.OPEN_READONLY : sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, (err) => {
|
|
45
|
+
if (err) {
|
|
46
|
+
return reject(new Error(`Failed to connect to SQLite database: ${err.message}`));
|
|
47
|
+
}
|
|
48
|
+
// Enable foreign keys by default
|
|
49
|
+
db.run('PRAGMA foreign_keys = ON');
|
|
50
|
+
// Enable WAL mode for better concurrency
|
|
51
|
+
db.run('PRAGMA journal_mode = WAL');
|
|
52
|
+
// Set busy timeout to handle concurrent write operations
|
|
53
|
+
db.run('PRAGMA busy_timeout = 5000');
|
|
54
|
+
resolve(instance);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (_error) {
|
|
58
|
+
reject(new Error(`Failed to connect to SQLite database: ${_error.message}`));
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Execute a SQL query
|
|
64
|
+
*
|
|
65
|
+
* @param {string} sql - SQL query string
|
|
66
|
+
* @param {Array} [params=[]] - Query parameters
|
|
67
|
+
* @returns {Promise<{rows: Array<Object>}>} Query result
|
|
68
|
+
*/
|
|
69
|
+
function query(sql, params = []) {
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
if (!db) {
|
|
72
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
73
|
+
}
|
|
74
|
+
db.all(sql, params, (err, rows) => {
|
|
75
|
+
if (err) {
|
|
76
|
+
return reject(new Error(`SQLite query _error: ${err.message}`));
|
|
77
|
+
}
|
|
78
|
+
resolve({ rows });
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Execute a SQL statement
|
|
84
|
+
*
|
|
85
|
+
* @param {string} sql - SQL statement
|
|
86
|
+
* @param {Array} [params=[]] - Statement parameters
|
|
87
|
+
* @returns {Promise<{affectedRows: number, insertId: number}>} Execution result
|
|
88
|
+
*/
|
|
89
|
+
function execute(sql, params = []) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
if (!db) {
|
|
92
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
93
|
+
}
|
|
94
|
+
db.run(sql, params, function (err) {
|
|
95
|
+
if (err) {
|
|
96
|
+
return reject(new Error(`SQLite execute _error: ${err.message}`));
|
|
97
|
+
}
|
|
98
|
+
resolve({
|
|
99
|
+
affectedRows: this.changes,
|
|
100
|
+
insertId: this.lastID
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Begin a transaction
|
|
107
|
+
*
|
|
108
|
+
* @returns {Promise<void>}
|
|
109
|
+
*/
|
|
110
|
+
function beginTransaction() {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
if (!db) {
|
|
113
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
114
|
+
}
|
|
115
|
+
db.run('BEGIN TRANSACTION', (err) => {
|
|
116
|
+
if (err) {
|
|
117
|
+
return reject(new Error(`Failed to begin transaction: ${err.message}`));
|
|
118
|
+
}
|
|
119
|
+
resolve();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Commit a transaction
|
|
125
|
+
*
|
|
126
|
+
* @returns {Promise<void>}
|
|
127
|
+
*/
|
|
128
|
+
function commit() {
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
if (!db) {
|
|
131
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
132
|
+
}
|
|
133
|
+
db.run('COMMIT', (err) => {
|
|
134
|
+
if (err) {
|
|
135
|
+
return reject(new Error(`Failed to commit transaction: ${err.message}`));
|
|
136
|
+
}
|
|
137
|
+
resolve();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Rollback a transaction
|
|
143
|
+
*
|
|
144
|
+
* @returns {Promise<void>}
|
|
145
|
+
*/
|
|
146
|
+
function rollback() {
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
if (!db) {
|
|
149
|
+
return reject(new Error('Database connection not established. Call connect() first.'));
|
|
150
|
+
}
|
|
151
|
+
db.run('ROLLBACK', (err) => {
|
|
152
|
+
if (err) {
|
|
153
|
+
return reject(new Error(`Failed to rollback transaction: ${err.message}`));
|
|
154
|
+
}
|
|
155
|
+
resolve();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Disconnect from the database
|
|
161
|
+
*
|
|
162
|
+
* @returns {Promise<void>}
|
|
163
|
+
*/
|
|
164
|
+
function disconnect() {
|
|
165
|
+
return new Promise((resolve, reject) => {
|
|
166
|
+
if (!db) {
|
|
167
|
+
return resolve();
|
|
168
|
+
}
|
|
169
|
+
db.close((err) => {
|
|
170
|
+
if (err) {
|
|
171
|
+
return reject(new Error(`Failed to close database connection: ${err.message}`));
|
|
172
|
+
}
|
|
173
|
+
db = null;
|
|
174
|
+
resolve();
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the underlying database connection
|
|
180
|
+
*
|
|
181
|
+
* @returns {Object} The database connection
|
|
182
|
+
*/
|
|
183
|
+
function getConnection() {
|
|
184
|
+
if (!db) {
|
|
185
|
+
throw new Error('Database connection not established. Call connect() first.');
|
|
186
|
+
}
|
|
187
|
+
return db;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Ping the database to check if connection is alive
|
|
191
|
+
*
|
|
192
|
+
* @returns {Promise<boolean>} True if connection is alive
|
|
193
|
+
*/
|
|
194
|
+
async function ping() {
|
|
195
|
+
try {
|
|
196
|
+
await query('SELECT 1');
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Escape a value for SQL queries
|
|
205
|
+
*
|
|
206
|
+
* @param {*} value - Value to escape
|
|
207
|
+
* @returns {string} Escaped value
|
|
208
|
+
*/
|
|
209
|
+
function escape(value) {
|
|
210
|
+
if (value === null || value === undefined) {
|
|
211
|
+
return 'NULL';
|
|
212
|
+
}
|
|
213
|
+
if (typeof value === 'boolean') {
|
|
214
|
+
return value ? '1' : '0';
|
|
215
|
+
}
|
|
216
|
+
if (typeof value === 'number') {
|
|
217
|
+
return String(value);
|
|
218
|
+
}
|
|
219
|
+
// Escape single quotes by doubling them
|
|
220
|
+
return `'${String(value).replace(/'/g, "''")}'`;
|
|
221
|
+
}
|
|
222
|
+
// Public API
|
|
223
|
+
const instance = {
|
|
224
|
+
connect,
|
|
225
|
+
query,
|
|
226
|
+
execute,
|
|
227
|
+
beginTransaction,
|
|
228
|
+
commit,
|
|
229
|
+
rollback,
|
|
230
|
+
disconnect,
|
|
231
|
+
getConnection,
|
|
232
|
+
ping,
|
|
233
|
+
escape,
|
|
234
|
+
// Alias for backward compatibility
|
|
235
|
+
run: execute
|
|
236
|
+
};
|
|
237
|
+
return instance;
|
|
238
|
+
}
|
|
239
|
+
// For backward compatibility
|
|
240
|
+
export const SQLiteAdapter = { create: createSQLiteAdapter };
|
|
241
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../../src/database/adapters/sqlite.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Connection Manager
|
|
3
|
+
*
|
|
4
|
+
* @class DatabaseManager
|
|
5
|
+
* @extends EventEmitter
|
|
6
|
+
* @description Manages database connections with pooling, health checks, and adapter abstraction.
|
|
7
|
+
* Provides a unified interface for different database engines.
|
|
8
|
+
*
|
|
9
|
+
* @param {Object} config - Database configuration
|
|
10
|
+
* @param {string} config.type - Database type ('postgresql', 'mysql', 'sqlite', 'mongodb')
|
|
11
|
+
* @param {string} [config.host='localhost'] - Database host
|
|
12
|
+
* @param {number} [config.port] - Database port (auto-detected by type)
|
|
13
|
+
* @param {string} config.database - Database name
|
|
14
|
+
* @param {string} [config.username] - Database username
|
|
15
|
+
* @param {string} [config.password] - Database password
|
|
16
|
+
* @param {Object} [config.pool] - Connection pool configuration
|
|
17
|
+
* @param {boolean} [config.debug=false] - Enable debug logging
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const db = new DatabaseManager({
|
|
21
|
+
* type: 'postgresql',
|
|
22
|
+
* host: 'localhost',
|
|
23
|
+
* database: 'myapp',
|
|
24
|
+
* username: 'user',
|
|
25
|
+
* password: 'pass',
|
|
26
|
+
* pool: { min: 2, max: 10 }
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* await db.connect();
|
|
30
|
+
* const users = await db.query('SELECT * FROM users WHERE active = ?', [true]);
|
|
31
|
+
*/
|
|
32
|
+
export class DatabaseManager extends EventEmitter<[never]> {
|
|
33
|
+
constructor(config: any);
|
|
34
|
+
config: Object;
|
|
35
|
+
adapter: Object | null;
|
|
36
|
+
pool: any;
|
|
37
|
+
isConnected: boolean;
|
|
38
|
+
connectionAttempts: number;
|
|
39
|
+
maxRetries: number;
|
|
40
|
+
healthCheckInterval: NodeJS.Timeout | null;
|
|
41
|
+
healthCheckFrequency: number;
|
|
42
|
+
stats: {
|
|
43
|
+
totalConnections: number;
|
|
44
|
+
activeConnections: number;
|
|
45
|
+
failedConnections: number;
|
|
46
|
+
queriesExecuted: number;
|
|
47
|
+
averageQueryTime: number;
|
|
48
|
+
lastHealthCheck: null;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Validate database configuration
|
|
52
|
+
*
|
|
53
|
+
* @private
|
|
54
|
+
* @param {Object} config - Configuration to validate
|
|
55
|
+
* @returns {Object} Validated configuration
|
|
56
|
+
* @throws {Error} If configuration is invalid
|
|
57
|
+
*/
|
|
58
|
+
private validateConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Connect to the database
|
|
61
|
+
*
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
* @throws {Error} If connection fails after retries
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* await db.connect();
|
|
67
|
+
* console.log('Database connected successfully');
|
|
68
|
+
*/
|
|
69
|
+
connect(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Load database adapter
|
|
72
|
+
*
|
|
73
|
+
* @private
|
|
74
|
+
* @param {string} type - Database type
|
|
75
|
+
* @returns {Object} Database adapter
|
|
76
|
+
*/
|
|
77
|
+
private loadAdapter;
|
|
78
|
+
/**
|
|
79
|
+
* Test database connection
|
|
80
|
+
*
|
|
81
|
+
* @private
|
|
82
|
+
* @returns {Promise<void>}
|
|
83
|
+
*/
|
|
84
|
+
private testConnection;
|
|
85
|
+
/**
|
|
86
|
+
* Execute a database query
|
|
87
|
+
*
|
|
88
|
+
* @param {string} sql - SQL query string
|
|
89
|
+
* @param {Array} [params=[]] - Query parameters
|
|
90
|
+
* @param {Object} [options={}] - Query options
|
|
91
|
+
* @returns {Promise<Object>} Query result
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* const users = await db.query('SELECT * FROM users WHERE age > ?', [18]);
|
|
95
|
+
* const user = await db.query('SELECT * FROM users WHERE id = ?', [123], { single: true });
|
|
96
|
+
*/
|
|
97
|
+
query(operation: any, params?: any[]): Promise<Object>;
|
|
98
|
+
/**
|
|
99
|
+
* Start a database transaction
|
|
100
|
+
*
|
|
101
|
+
* @returns {Promise<Object>} Transaction object
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* const tx = await db.transaction();
|
|
105
|
+
* try {
|
|
106
|
+
* await tx.query('INSERT INTO users (name) VALUES (?)', ['John']);
|
|
107
|
+
* await tx.query('INSERT INTO profiles (user_id) VALUES (?)', [userId]);
|
|
108
|
+
* await tx.commit();
|
|
109
|
+
* } catch (error) {
|
|
110
|
+
* await tx.rollback();
|
|
111
|
+
* throw error;
|
|
112
|
+
* }
|
|
113
|
+
*/
|
|
114
|
+
transaction(): Promise<Object>;
|
|
115
|
+
/**
|
|
116
|
+
* Start health check monitoring
|
|
117
|
+
*
|
|
118
|
+
* @private
|
|
119
|
+
*/
|
|
120
|
+
private startHealthCheck;
|
|
121
|
+
/**
|
|
122
|
+
* Get connection statistics
|
|
123
|
+
*
|
|
124
|
+
* @returns {Object} Connection statistics
|
|
125
|
+
*/
|
|
126
|
+
getStats(): Object;
|
|
127
|
+
/**
|
|
128
|
+
* Close database connection
|
|
129
|
+
*
|
|
130
|
+
* @returns {Promise<void>}
|
|
131
|
+
*/
|
|
132
|
+
close(): Promise<void>;
|
|
133
|
+
}
|
|
134
|
+
import { EventEmitter } from 'events';
|
|
135
|
+
//# sourceMappingURL=connection-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../../../src/database/connection-manager.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;IACE,yBAuBC;IApBC,eAAyC;IACzC,uBAAmB;IACnB,UAAgB;IAChB,qBAAwB;IACxB,2BAA2B;IAC3B,mBAAmB;IAGnB,2CAA+B;IAC/B,6BAAiC;IAGjC;;;;;;;MAOC;IAGH;;;;;;;OAOG;IACH,uBA8DC;IAED;;;;;;;;;OASG;IACH,WAPa,OAAO,CAAC,IAAI,CAAC,CA4CzB;IAED;;;;;;OAMG;IACH,oBAsCC;IAED;;;;;OAKG;IACH,uBAoBC;IAED;;;;;;;;;;;OAWG;IACH,uCANa,OAAO,CAAC,MAAM,CAAC,CAiD3B;IAED;;;;;;;;;;;;;;;OAeG;IACH,eAba,OAAO,CAAC,MAAM,CAAC,CAmB3B;IAED;;;;OAIG;IACH,yBAiBC;IAED;;;;OAIG;IACH,YAFa,MAAM,CAQlB;IAED;;;;OAIG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CA2BzB;CACF;6BApZ4B,QAAQ"}
|