@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.
Files changed (108) hide show
  1. package/dist/coherent.d.ts +10 -150
  2. package/dist/coherent.d.ts.map +1 -1
  3. package/dist/coherent.js +33 -166
  4. package/dist/coherent.js.map +1 -1
  5. package/dist/components/component-system.js +109 -109
  6. package/dist/core/html-utils.js +5 -5
  7. package/dist/core/object-factory.js +21 -21
  8. package/dist/core/object-utils.js +2 -2
  9. package/dist/database/adapters/mongodb.d.ts +15 -0
  10. package/dist/database/adapters/mongodb.d.ts.map +1 -0
  11. package/dist/database/adapters/mongodb.js +216 -0
  12. package/dist/database/adapters/mongodb.js.map +1 -0
  13. package/dist/database/adapters/mysql.d.ts +12 -0
  14. package/dist/database/adapters/mysql.d.ts.map +1 -0
  15. package/dist/database/adapters/mysql.js +171 -0
  16. package/dist/database/adapters/mysql.js.map +1 -0
  17. package/dist/database/adapters/postgresql.d.ts +12 -0
  18. package/dist/database/adapters/postgresql.d.ts.map +1 -0
  19. package/dist/database/adapters/postgresql.js +177 -0
  20. package/dist/database/adapters/postgresql.js.map +1 -0
  21. package/dist/database/adapters/sqlite.d.ts +15 -0
  22. package/dist/database/adapters/sqlite.d.ts.map +1 -0
  23. package/dist/database/adapters/sqlite.js +241 -0
  24. package/dist/database/adapters/sqlite.js.map +1 -0
  25. package/dist/database/connection-manager.d.ts +135 -0
  26. package/dist/database/connection-manager.d.ts.map +1 -0
  27. package/dist/database/connection-manager.js +362 -0
  28. package/dist/database/connection-manager.js.map +1 -0
  29. package/dist/database/index.d.ts +38 -0
  30. package/dist/database/index.d.ts.map +1 -0
  31. package/dist/database/index.js +60 -0
  32. package/dist/database/index.js.map +1 -0
  33. package/dist/database/middleware.d.ts +122 -0
  34. package/dist/database/middleware.d.ts.map +1 -0
  35. package/dist/database/middleware.js +390 -0
  36. package/dist/database/middleware.js.map +1 -0
  37. package/dist/database/migration.d.ts +62 -0
  38. package/dist/database/migration.d.ts.map +1 -0
  39. package/dist/database/migration.js +423 -0
  40. package/dist/database/migration.js.map +1 -0
  41. package/dist/database/model.d.ts +8 -0
  42. package/dist/database/model.d.ts.map +1 -0
  43. package/dist/database/model.js +167 -0
  44. package/dist/database/model.js.map +1 -0
  45. package/dist/database/query-builder.d.ts +111 -0
  46. package/dist/database/query-builder.d.ts.map +1 -0
  47. package/dist/database/query-builder.js +187 -0
  48. package/dist/database/query-builder.js.map +1 -0
  49. package/dist/database/utils.d.ts +196 -0
  50. package/dist/database/utils.d.ts.map +1 -0
  51. package/dist/database/utils.js +372 -0
  52. package/dist/database/utils.js.map +1 -0
  53. package/dist/dev/dev-tools.d.ts +1 -1
  54. package/dist/dev/dev-tools.js +28 -28
  55. package/dist/index.cjs +2 -1
  56. package/dist/index.cjs.map +2 -2
  57. package/dist/index.js +2 -1
  58. package/dist/index.js.map +2 -2
  59. package/dist/performance/bundle-optimizer.js +11 -11
  60. package/dist/performance/cache-manager.js +6 -6
  61. package/dist/performance/monitor.js +10 -10
  62. package/dist/performance/monitor.js.map +1 -1
  63. package/dist/rendering/base-renderer.js +13 -13
  64. package/dist/rendering/dom-renderer.d.ts +0 -23
  65. package/dist/rendering/dom-renderer.d.ts.map +1 -1
  66. package/dist/rendering/dom-renderer.js +9 -77
  67. package/dist/rendering/dom-renderer.js.map +1 -1
  68. package/dist/rendering/html-renderer.d.ts +0 -15
  69. package/dist/rendering/html-renderer.d.ts.map +1 -1
  70. package/dist/rendering/html-renderer.js +4 -85
  71. package/dist/rendering/html-renderer.js.map +1 -1
  72. package/dist/rendering/streaming-renderer.js +12 -12
  73. package/dist/utils/dependency-utils.js +2 -2
  74. package/dist/utils/normalization.js +1 -1
  75. package/dist/utils/validation.js +1 -1
  76. package/package.json +22 -1
  77. package/dist/components/lifecycle.d.ts +0 -212
  78. package/dist/components/lifecycle.d.ts.map +0 -1
  79. package/dist/components/lifecycle.js +0 -525
  80. package/dist/components/lifecycle.js.map +0 -1
  81. package/dist/forms/validation.d.ts +0 -271
  82. package/dist/forms/validation.d.ts.map +0 -1
  83. package/dist/forms/validation.js +0 -573
  84. package/dist/forms/validation.js.map +0 -1
  85. package/dist/performance/component-cache.d.ts +0 -120
  86. package/dist/performance/component-cache.d.ts.map +0 -1
  87. package/dist/performance/component-cache.js +0 -364
  88. package/dist/performance/component-cache.js.map +0 -1
  89. package/dist/rendering/css-manager.d.ts +0 -73
  90. package/dist/rendering/css-manager.d.ts.map +0 -1
  91. package/dist/rendering/css-manager.js +0 -176
  92. package/dist/rendering/css-manager.js.map +0 -1
  93. package/dist/rendering/vdom-diff.d.ts +0 -47
  94. package/dist/rendering/vdom-diff.d.ts.map +0 -1
  95. package/dist/rendering/vdom-diff.js +0 -416
  96. package/dist/rendering/vdom-diff.js.map +0 -1
  97. package/dist/routing/router.d.ts +0 -241
  98. package/dist/routing/router.d.ts.map +0 -1
  99. package/dist/routing/router.js +0 -648
  100. package/dist/routing/router.js.map +0 -1
  101. package/dist/state/reactive-state.d.ts +0 -166
  102. package/dist/state/reactive-state.d.ts.map +0 -1
  103. package/dist/state/reactive-state.js +0 -546
  104. package/dist/state/reactive-state.js.map +0 -1
  105. package/dist/utils/error-handler.d.ts +0 -148
  106. package/dist/utils/error-handler.d.ts.map +0 -1
  107. package/dist/utils/error-handler.js +0 -468
  108. 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"}