@coherent.js/database 1.0.0-beta.2

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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/dist/database/adapters/memory.d.ts +48 -0
  4. package/dist/database/adapters/memory.d.ts.map +1 -0
  5. package/dist/database/adapters/memory.js +250 -0
  6. package/dist/database/adapters/memory.js.map +1 -0
  7. package/dist/database/adapters/mongodb.d.ts +15 -0
  8. package/dist/database/adapters/mongodb.d.ts.map +1 -0
  9. package/dist/database/adapters/mongodb.js +216 -0
  10. package/dist/database/adapters/mongodb.js.map +1 -0
  11. package/dist/database/adapters/mysql.d.ts +12 -0
  12. package/dist/database/adapters/mysql.d.ts.map +1 -0
  13. package/dist/database/adapters/mysql.js +171 -0
  14. package/dist/database/adapters/mysql.js.map +1 -0
  15. package/dist/database/adapters/postgresql.d.ts +12 -0
  16. package/dist/database/adapters/postgresql.d.ts.map +1 -0
  17. package/dist/database/adapters/postgresql.js +177 -0
  18. package/dist/database/adapters/postgresql.js.map +1 -0
  19. package/dist/database/adapters/sqlite.d.ts +15 -0
  20. package/dist/database/adapters/sqlite.d.ts.map +1 -0
  21. package/dist/database/adapters/sqlite.js +241 -0
  22. package/dist/database/adapters/sqlite.js.map +1 -0
  23. package/dist/database/connection-manager.d.ts +148 -0
  24. package/dist/database/connection-manager.d.ts.map +1 -0
  25. package/dist/database/connection-manager.js +377 -0
  26. package/dist/database/connection-manager.js.map +1 -0
  27. package/dist/database/index.d.ts +38 -0
  28. package/dist/database/index.d.ts.map +1 -0
  29. package/dist/database/index.js +63 -0
  30. package/dist/database/index.js.map +1 -0
  31. package/dist/database/middleware.d.ts +122 -0
  32. package/dist/database/middleware.d.ts.map +1 -0
  33. package/dist/database/middleware.js +403 -0
  34. package/dist/database/middleware.js.map +1 -0
  35. package/dist/database/migration.d.ts +168 -0
  36. package/dist/database/migration.d.ts.map +1 -0
  37. package/dist/database/migration.js +946 -0
  38. package/dist/database/migration.js.map +1 -0
  39. package/dist/database/model.d.ts +81 -0
  40. package/dist/database/model.d.ts.map +1 -0
  41. package/dist/database/model.js +686 -0
  42. package/dist/database/model.js.map +1 -0
  43. package/dist/database/query-builder.d.ts +136 -0
  44. package/dist/database/query-builder.d.ts.map +1 -0
  45. package/dist/database/query-builder.js +248 -0
  46. package/dist/database/query-builder.js.map +1 -0
  47. package/dist/database/utils.d.ts +196 -0
  48. package/dist/database/utils.d.ts.map +1 -0
  49. package/dist/database/utils.js +372 -0
  50. package/dist/database/utils.js.map +1 -0
  51. package/dist/index.cjs +2286 -0
  52. package/dist/index.cjs.map +7 -0
  53. package/dist/index.js +2240 -0
  54. package/dist/index.js.map +7 -0
  55. package/package.json +52 -0
  56. package/types/index.d.ts +732 -0
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Factory function to create a DatabaseManager instance
3
+ *
4
+ * @param {Object} config - Database configuration
5
+ * @returns {DatabaseManager} Database manager instance
6
+ *
7
+ * @example
8
+ * const db = createDatabaseManager({
9
+ * type: 'sqlite',
10
+ * database: './app.db'
11
+ * });
12
+ */
13
+ export function createDatabaseManager(config: Object): DatabaseManager;
14
+ /**
15
+ * Database Connection Manager
16
+ *
17
+ * @class DatabaseManager
18
+ * @extends EventEmitter
19
+ * @description Manages database connections with pooling, health checks, and adapter abstraction.
20
+ * Provides a unified interface for different database engines.
21
+ *
22
+ * @param {Object} config - Database configuration
23
+ * @param {string} config.type - Database type ('postgresql', 'mysql', 'sqlite', 'mongodb')
24
+ * @param {string} [config.host='localhost'] - Database host
25
+ * @param {number} [config.port] - Database port (auto-detected by type)
26
+ * @param {string} config.database - Database name
27
+ * @param {string} [config.username] - Database username
28
+ * @param {string} [config.password] - Database password
29
+ * @param {Object} [config.pool] - Connection pool configuration
30
+ * @param {boolean} [config.debug=false] - Enable debug logging
31
+ *
32
+ * @example
33
+ * const db = new DatabaseManager({
34
+ * type: 'postgresql',
35
+ * host: 'localhost',
36
+ * database: 'myapp',
37
+ * username: 'user',
38
+ * password: 'pass',
39
+ * pool: { min: 2, max: 10 }
40
+ * });
41
+ *
42
+ * await db.connect();
43
+ * const users = await db.query('SELECT * FROM users WHERE active = ?', [true]);
44
+ */
45
+ export class DatabaseManager extends EventEmitter<[never]> {
46
+ constructor(config: any);
47
+ config: Object;
48
+ adapter: Object | null;
49
+ pool: any;
50
+ isConnected: boolean;
51
+ connectionAttempts: number;
52
+ maxRetries: number;
53
+ healthCheckInterval: NodeJS.Timeout | null;
54
+ healthCheckFrequency: number;
55
+ stats: {
56
+ totalConnections: number;
57
+ activeConnections: number;
58
+ failedConnections: number;
59
+ queriesExecuted: number;
60
+ averageQueryTime: number;
61
+ lastHealthCheck: null;
62
+ };
63
+ /**
64
+ * Validate database configuration
65
+ *
66
+ * @private
67
+ * @param {Object} config - Configuration to validate
68
+ * @returns {Object} Validated configuration
69
+ * @throws {Error} If configuration is invalid
70
+ */
71
+ private validateConfig;
72
+ /**
73
+ * Connect to the database
74
+ *
75
+ * @returns {Promise<void>}
76
+ * @throws {Error} If connection fails after retries
77
+ *
78
+ * @example
79
+ * await db.connect();
80
+ * console.log('Database connected successfully');
81
+ */
82
+ connect(): Promise<void>;
83
+ /**
84
+ * Load database adapter
85
+ *
86
+ * @private
87
+ * @param {string} type - Database type
88
+ * @returns {Object} Database adapter
89
+ */
90
+ private loadAdapter;
91
+ /**
92
+ * Test database connection
93
+ *
94
+ * @private
95
+ * @returns {Promise<void>}
96
+ */
97
+ private testConnection;
98
+ /**
99
+ * Execute a database query
100
+ *
101
+ * @param {string} sql - SQL query string
102
+ * @param {Array} [params=[]] - Query parameters
103
+ * @param {Object} [options={}] - Query options
104
+ * @returns {Promise<Object>} Query result
105
+ *
106
+ * @example
107
+ * const users = await db.query('SELECT * FROM users WHERE age > ?', [18]);
108
+ * const user = await db.query('SELECT * FROM users WHERE id = ?', [123], { single: true });
109
+ */
110
+ query(operation: any, params?: any[]): Promise<Object>;
111
+ /**
112
+ * Start a database transaction
113
+ *
114
+ * @returns {Promise<Object>} Transaction object
115
+ *
116
+ * @example
117
+ * const tx = await db.transaction();
118
+ * try {
119
+ * await tx.query('INSERT INTO users (name) VALUES (?)', ['John']);
120
+ * await tx.query('INSERT INTO profiles (user_id) VALUES (?)', [userId]);
121
+ * await tx.commit();
122
+ * } catch (error) {
123
+ * await tx.rollback();
124
+ * throw error;
125
+ * }
126
+ */
127
+ transaction(): Promise<Object>;
128
+ /**
129
+ * Start health check monitoring
130
+ *
131
+ * @private
132
+ */
133
+ private startHealthCheck;
134
+ /**
135
+ * Get connection statistics
136
+ *
137
+ * @returns {Object} Connection statistics
138
+ */
139
+ getStats(): Object;
140
+ /**
141
+ * Close database connection
142
+ *
143
+ * @returns {Promise<void>}
144
+ */
145
+ close(): Promise<void>;
146
+ }
147
+ import { EventEmitter } from 'events';
148
+ //# 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":"AA6ZA;;;;;;;;;;;GAWG;AACH,8CATW,MAAM,GACJ,eAAe,CAU3B;AAlaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Database Connection Manager for Coherent.js
3
+ *
4
+ * @fileoverview Manages database connections, connection pooling, and adapter selection
5
+ * with support for multiple database engines and automatic failover.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ /**
9
+ * Database Connection Manager
10
+ *
11
+ * @class DatabaseManager
12
+ * @extends EventEmitter
13
+ * @description Manages database connections with pooling, health checks, and adapter abstraction.
14
+ * Provides a unified interface for different database engines.
15
+ *
16
+ * @param {Object} config - Database configuration
17
+ * @param {string} config.type - Database type ('postgresql', 'mysql', 'sqlite', 'mongodb')
18
+ * @param {string} [config.host='localhost'] - Database host
19
+ * @param {number} [config.port] - Database port (auto-detected by type)
20
+ * @param {string} config.database - Database name
21
+ * @param {string} [config.username] - Database username
22
+ * @param {string} [config.password] - Database password
23
+ * @param {Object} [config.pool] - Connection pool configuration
24
+ * @param {boolean} [config.debug=false] - Enable debug logging
25
+ *
26
+ * @example
27
+ * const db = new DatabaseManager({
28
+ * type: 'postgresql',
29
+ * host: 'localhost',
30
+ * database: 'myapp',
31
+ * username: 'user',
32
+ * password: 'pass',
33
+ * pool: { min: 2, max: 10 }
34
+ * });
35
+ *
36
+ * await db.connect();
37
+ * const users = await db.query('SELECT * FROM users WHERE active = ?', [true]);
38
+ */
39
+ export class DatabaseManager extends EventEmitter {
40
+ constructor(config) {
41
+ super();
42
+ this.config = this.validateConfig(config);
43
+ this.adapter = null;
44
+ this.pool = null;
45
+ this.isConnected = false;
46
+ this.connectionAttempts = 0;
47
+ this.maxRetries = 3;
48
+ // Health check interval
49
+ this.healthCheckInterval = null;
50
+ this.healthCheckFrequency = 30000; // 30 seconds
51
+ // Connection statistics
52
+ this.stats = {
53
+ totalConnections: 0,
54
+ activeConnections: 0,
55
+ failedConnections: 0,
56
+ queriesExecuted: 0,
57
+ averageQueryTime: 0,
58
+ lastHealthCheck: null
59
+ };
60
+ }
61
+ /**
62
+ * Validate database configuration
63
+ *
64
+ * @private
65
+ * @param {Object} config - Configuration to validate
66
+ * @returns {Object} Validated configuration
67
+ * @throws {Error} If configuration is invalid
68
+ */
69
+ validateConfig(config) {
70
+ if (!config || typeof config !== 'object') {
71
+ throw new Error('Database configuration is required');
72
+ }
73
+ // New adapter-based configuration
74
+ if (config.adapter) {
75
+ if (typeof config.adapter !== 'object' ||
76
+ typeof config.adapter.createPool !== 'function') {
77
+ throw new Error('Invalid adapter provided. Adapter must be an object with a createPool method');
78
+ }
79
+ // Set default store config if not provided
80
+ if (!config.store) {
81
+ config.store = { name: 'default' };
82
+ }
83
+ else if (typeof config.store === 'string') {
84
+ config.store = { name: config.store };
85
+ }
86
+ return config;
87
+ }
88
+ // Legacy type-based configuration
89
+ const { type, database } = config;
90
+ if (!type) {
91
+ throw new Error('Either database type or adapter is required');
92
+ }
93
+ const supportedTypes = ['postgresql', 'mysql', 'sqlite', 'mongodb'];
94
+ if (!supportedTypes.includes(type)) {
95
+ throw new Error(`Unsupported database type: ${type}. Supported types: ${supportedTypes.join(', ')}`);
96
+ }
97
+ if (!database) {
98
+ throw new Error('Database name is required for type-based configuration');
99
+ }
100
+ // Set default ports based on database type
101
+ const defaultPorts = {
102
+ postgresql: 5432,
103
+ mysql: 3306,
104
+ mongodb: 27017,
105
+ sqlite: null
106
+ };
107
+ return {
108
+ host: config.host || 'localhost',
109
+ port: config.port || defaultPorts[type],
110
+ ...config,
111
+ pool: {
112
+ min: 2,
113
+ max: 10,
114
+ acquireTimeoutMillis: 30000,
115
+ createTimeoutMillis: 30000,
116
+ destroyTimeoutMillis: 5000,
117
+ idleTimeoutMillis: 30000,
118
+ reapIntervalMillis: 1000,
119
+ createRetryIntervalMillis: 200,
120
+ ...config.pool
121
+ }
122
+ };
123
+ }
124
+ /**
125
+ * Connect to the database
126
+ *
127
+ * @returns {Promise<void>}
128
+ * @throws {Error} If connection fails after retries
129
+ *
130
+ * @example
131
+ * await db.connect();
132
+ * console.log('Database connected successfully');
133
+ */
134
+ async connect() {
135
+ if (this.isConnected) {
136
+ return;
137
+ }
138
+ try {
139
+ // Load appropriate adapter
140
+ this.adapter = await this.loadAdapter(this.config.type);
141
+ // Create connection pool
142
+ this.pool = await this.adapter.createPool(this.config);
143
+ // Test connection
144
+ await this.testConnection();
145
+ this.isConnected = true;
146
+ this.connectionAttempts = 0;
147
+ // Start health checks if supported by the adapter
148
+ if (this.adapter.startHealthChecks) {
149
+ this.startHealthChecks();
150
+ }
151
+ return this;
152
+ }
153
+ catch (error) {
154
+ this.connectionAttempts++;
155
+ this.stats.failedConnections++;
156
+ this.emit('error', error);
157
+ if (this.connectionAttempts < this.maxRetries) {
158
+ console.warn(`Connection attempt ${this.connectionAttempts} failed. Retrying in 2 seconds...`);
159
+ await new Promise(resolve => setTimeout(resolve, 2000));
160
+ return this.connect();
161
+ }
162
+ throw new Error(`Failed to connect to database after ${this.connectionAttempts} attempts: ${error.message}`);
163
+ }
164
+ }
165
+ /**
166
+ * Load database adapter
167
+ *
168
+ * @private
169
+ * @param {string} type - Database type
170
+ * @returns {Object} Database adapter
171
+ */
172
+ loadAdapter(type) {
173
+ // If using direct adapter instance (for custom adapters like MemoryAdapter)
174
+ if (this.config.adapter) {
175
+ return this.config.adapter;
176
+ }
177
+ // For built-in adapters
178
+ const adapterMap = {
179
+ postgresql: './adapters/postgresql.js',
180
+ mysql: './adapters/mysql.js',
181
+ sqlite: './adapters/sqlite.js',
182
+ mongodb: './adapters/mongodb.js',
183
+ memory: './adapters/memory.js'
184
+ };
185
+ const adapterPath = adapterMap[type];
186
+ if (!adapterPath) {
187
+ throw new Error(`No adapter found for database type: ${type}`);
188
+ }
189
+ // Use dynamic import for ESM compatibility
190
+ return import(adapterPath)
191
+ .then(adapterModule => {
192
+ // Try both the default export and the named export pattern
193
+ if (adapterModule.default) {
194
+ return new adapterModule.default();
195
+ }
196
+ const AdapterClass = adapterModule[`${type.charAt(0).toUpperCase() + type.slice(1)}Adapter`];
197
+ if (AdapterClass) {
198
+ return new AdapterClass();
199
+ }
200
+ throw new Error(`No valid adapter found in ${adapterPath}`);
201
+ })
202
+ .catch(error => {
203
+ throw new Error(`Failed to load ${type} adapter: ${error.message}`);
204
+ });
205
+ }
206
+ /**
207
+ * Test database connection
208
+ *
209
+ * @private
210
+ * @returns {Promise<void>}
211
+ */
212
+ async testConnection() {
213
+ const startTime = Date.now();
214
+ try {
215
+ if (typeof this.adapter.testConnection === 'function') {
216
+ await this.adapter.testConnection();
217
+ }
218
+ else if (this.adapter.ping) {
219
+ // Try ping if available
220
+ await this.adapter.ping();
221
+ }
222
+ // If no test method is available, we'll assume the connection is good
223
+ const duration = Date.now() - startTime;
224
+ this.stats.lastHealthCheck = new Date();
225
+ this.emit('connect:test', { duration });
226
+ }
227
+ catch (error) {
228
+ this.emit('error', error);
229
+ throw new Error(`Database connection test failed: ${error.message}`);
230
+ }
231
+ }
232
+ /**
233
+ * Execute a database query
234
+ *
235
+ * @param {string} sql - SQL query string
236
+ * @param {Array} [params=[]] - Query parameters
237
+ * @param {Object} [options={}] - Query options
238
+ * @returns {Promise<Object>} Query result
239
+ *
240
+ * @example
241
+ * const users = await db.query('SELECT * FROM users WHERE age > ?', [18]);
242
+ * const user = await db.query('SELECT * FROM users WHERE id = ?', [123], { single: true });
243
+ */
244
+ async query(operation, params = {}) {
245
+ if (!this.isConnected) {
246
+ throw new Error('Database not connected. Call connect() first.');
247
+ }
248
+ const startTime = Date.now();
249
+ try {
250
+ let result;
251
+ // Handle MemoryAdapter's query method
252
+ if (typeof this.pool.query === 'function') {
253
+ result = await this.pool.query(operation, params);
254
+ }
255
+ // Handle SQL adapters
256
+ else if (typeof this.adapter.query === 'function') {
257
+ result = await this.adapter.query(this.pool, operation, params);
258
+ }
259
+ else {
260
+ throw new Error('No valid query method found on adapter or pool');
261
+ }
262
+ // Update statistics
263
+ const duration = Date.now() - startTime;
264
+ this.stats.queriesExecuted++;
265
+ this.stats.averageQueryTime = ((this.stats.averageQueryTime * (this.stats.queriesExecuted - 1) + duration) /
266
+ this.stats.queriesExecuted);
267
+ if (this.config.debug) {
268
+ console.log(`Query executed in ${duration}ms: ${operation}`, params);
269
+ }
270
+ this.emit('query', { operation, params, duration });
271
+ return result;
272
+ }
273
+ catch (error) {
274
+ const duration = Date.now() - startTime;
275
+ this.emit('queryError', { operation, params, duration, error: error.message });
276
+ throw new Error(`Query failed: ${error.message}`);
277
+ }
278
+ }
279
+ /**
280
+ * Start a database transaction
281
+ *
282
+ * @returns {Promise<Object>} Transaction object
283
+ *
284
+ * @example
285
+ * const tx = await db.transaction();
286
+ * try {
287
+ * await tx.query('INSERT INTO users (name) VALUES (?)', ['John']);
288
+ * await tx.query('INSERT INTO profiles (user_id) VALUES (?)', [userId]);
289
+ * await tx.commit();
290
+ * } catch (error) {
291
+ * await tx.rollback();
292
+ * throw error;
293
+ * }
294
+ */
295
+ async transaction() {
296
+ if (!this.isConnected) {
297
+ throw new Error('Database not connected. Call connect() first.');
298
+ }
299
+ return await this.adapter.transaction(this.pool);
300
+ }
301
+ /**
302
+ * Start health check monitoring
303
+ *
304
+ * @private
305
+ */
306
+ startHealthCheck() {
307
+ if (this.healthCheckInterval) {
308
+ return;
309
+ }
310
+ this.healthCheckInterval = setInterval(async () => {
311
+ try {
312
+ await this.testConnection();
313
+ this.emit('healthCheck', { status: 'healthy', timestamp: new Date() });
314
+ }
315
+ catch (error) {
316
+ this.emit('healthCheck', { status: 'unhealthy', error: error.message, timestamp: new Date() });
317
+ if (this.config.debug) {
318
+ console.error('Database health check failed:', error.message);
319
+ }
320
+ }
321
+ }, this.healthCheckFrequency);
322
+ }
323
+ /**
324
+ * Get connection statistics
325
+ *
326
+ * @returns {Object} Connection statistics
327
+ */
328
+ getStats() {
329
+ return {
330
+ ...this.stats,
331
+ isConnected: this.isConnected,
332
+ poolStats: this.pool ? this.adapter.getPoolStats(this.pool) : null
333
+ };
334
+ }
335
+ /**
336
+ * Close database connection
337
+ *
338
+ * @returns {Promise<void>}
339
+ */
340
+ async close() {
341
+ if (!this.isConnected) {
342
+ return;
343
+ }
344
+ // Stop health checks
345
+ if (this.healthCheckInterval) {
346
+ clearInterval(this.healthCheckInterval);
347
+ this.healthCheckInterval = null;
348
+ }
349
+ // Close connection pool
350
+ if (this.pool && this.adapter) {
351
+ await this.adapter.closePool(this.pool);
352
+ }
353
+ this.isConnected = false;
354
+ this.pool = null;
355
+ this.adapter = null;
356
+ this.emit('disconnected');
357
+ if (this.config.debug) {
358
+ console.log('Database connection closed');
359
+ }
360
+ }
361
+ }
362
+ /**
363
+ * Factory function to create a DatabaseManager instance
364
+ *
365
+ * @param {Object} config - Database configuration
366
+ * @returns {DatabaseManager} Database manager instance
367
+ *
368
+ * @example
369
+ * const db = createDatabaseManager({
370
+ * type: 'sqlite',
371
+ * database: './app.db'
372
+ * });
373
+ */
374
+ export function createDatabaseManager(config) {
375
+ return new DatabaseManager(config);
376
+ }
377
+ //# sourceMappingURL=connection-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../../../src/database/connection-manager.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,MAAM;QAChB,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,wBAAwB;QACxB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,CAAC,aAAa;QAEhD,wBAAwB;QACxB,IAAI,CAAC,KAAK,GAAG;YACX,gBAAgB,EAAE,CAAC;YACnB,iBAAiB,EAAE,CAAC;YACpB,iBAAiB,EAAE,CAAC;YACpB,eAAe,EAAE,CAAC;YAClB,gBAAgB,EAAE,CAAC;YACnB,eAAe,EAAE,IAAI;SACtB,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,MAAM;QACnB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,kCAAkC;QAClC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAClC,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;YAClG,CAAC;YAED,2CAA2C;YAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACrC,CAAC;iBAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACxC,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,kCAAkC;QAClC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,sBAAsB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,2CAA2C;QAC3C,MAAM,YAAY,GAAG;YACnB,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW;YAChC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC;YACvC,GAAG,MAAM;YACT,IAAI,EAAE;gBACJ,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,EAAE;gBACP,oBAAoB,EAAE,KAAK;gBAC3B,mBAAmB,EAAE,KAAK;gBAC1B,oBAAoB,EAAE,IAAI;gBAC1B,iBAAiB,EAAE,KAAK;gBACxB,kBAAkB,EAAE,IAAI;gBACxB,yBAAyB,EAAE,GAAG;gBAC9B,GAAG,MAAM,CAAC,IAAI;aACf;SACF,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,2BAA2B;YAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAExD,yBAAyB;YACzB,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEvD,kBAAkB;YAClB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAE5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAE5B,kDAAkD;YAClD,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAE1B,IAAI,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,kBAAkB,mCAAmC,CAAC,CAAC;gBAC/F,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBACxD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,kBAAkB,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAC,IAAI;QACd,4EAA4E;QAC5E,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAG;YACjB,UAAU,EAAE,0BAA0B;YACtC,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,sBAAsB;YAC9B,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,sBAAsB;SAC/B,CAAC;QAEF,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,2CAA2C;QAC3C,OAAO,MAAM,CAAC,WAAW,CAAC;aACvB,IAAI,CAAC,aAAa,CAAC,EAAE;YACpB,2DAA2D;YAC3D,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YACrC,CAAC;YAED,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAC7F,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,IAAI,YAAY,EAAE,CAAC;YAC5B,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC;aACD,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,aAAa,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;gBACtD,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACtC,CAAC;iBAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC7B,wBAAwB;gBACxB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5B,CAAC;YACD,sEAAsE;YAEtE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE;QAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,IAAI,MAAM,CAAC;YAEX,sCAAsC;YACtC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC1C,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;YACD,sBAAsB;iBACjB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBAClD,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YAED,oBAAoB;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAC5B,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;gBAC3E,IAAI,CAAC,KAAK,CAAC,eAAe,CAC3B,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,OAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEpD,OAAO,MAAM,CAAC;QAEhB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAE/E,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;gBAE/F,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO;YACL,GAAG,IAAI,CAAC,KAAK;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACnE,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,CAAC;QAED,wBAAwB;QACxB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAM;IAC1C,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Quick setup function for common database configurations
3
+ *
4
+ * @param {Object} config - Database configuration
5
+ * @returns {DatabaseManager} Configured database manager
6
+ *
7
+ * @example
8
+ * import { setupDatabase } from '@coherent/database';
9
+ *
10
+ * const db = setupDatabase({
11
+ * type: 'postgresql',
12
+ * host: 'localhost',
13
+ * database: 'myapp',
14
+ * username: 'user',
15
+ * password: 'pass'
16
+ * });
17
+ */
18
+ export function setupDatabase(config?: Object): DatabaseManager;
19
+ export { createModel } from "./model.js";
20
+ export { createMigration } from "./migration.js";
21
+ export { createDatabaseManager } from "./connection-manager.js";
22
+ export { createPostgreSQLAdapter as PostgreSQLAdapter } from "./adapters/postgresql.js";
23
+ export { createMySQLAdapter as MySQLAdapter } from "./adapters/mysql.js";
24
+ export { createSQLiteAdapter as SQLiteAdapter } from "./adapters/sqlite.js";
25
+ export { createMongoDBAdapter as MongoDBAdapter } from "./adapters/mongodb.js";
26
+ export namespace DEFAULT_DB_CONFIG {
27
+ let type: string;
28
+ let database: string;
29
+ let synchronize: boolean;
30
+ let logging: boolean;
31
+ let entities: never[];
32
+ let migrations: never[];
33
+ let subscribers: never[];
34
+ }
35
+ export { createQuery, executeQuery } from "./query-builder.js";
36
+ export { withDatabase, withTransaction, withModel, withPagination } from "./middleware.js";
37
+ export { createConnection, runMigrations } from "./utils.js";
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/database/index.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;;;;GAgBG;AACH,uCAdW,MAAM,GACJ,eAAe,CAuB3B"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Database Integration Layer for Coherent.js
3
+ *
4
+ * @fileoverview Provides database connectivity, query building, and ORM functionality
5
+ * with support for multiple database engines (PostgreSQL, MySQL, SQLite, MongoDB).
6
+ *
7
+ * @author Coherent.js Team
8
+ * @version 1.0.0
9
+ */
10
+ // Factory functions preferred over classes for pure JS object architecture
11
+ export { createQuery, executeQuery } from './query-builder.js';
12
+ export { createModel } from './model.js';
13
+ export { createMigration } from './migration.js';
14
+ export { createDatabaseManager } from './connection-manager.js';
15
+ export { withDatabase, withTransaction, withModel, withPagination } from './middleware.js';
16
+ // Import for internal use
17
+ import { createDatabaseManager } from './connection-manager.js';
18
+ // Database adapters
19
+ export { createPostgreSQLAdapter as PostgreSQLAdapter } from './adapters/postgresql.js';
20
+ export { createMySQLAdapter as MySQLAdapter } from './adapters/mysql.js';
21
+ export { createSQLiteAdapter as SQLiteAdapter } from './adapters/sqlite.js';
22
+ export { createMongoDBAdapter as MongoDBAdapter } from './adapters/mongodb.js';
23
+ // Utilities
24
+ export { createConnection, runMigrations } from './utils.js';
25
+ /**
26
+ * Default database configuration
27
+ */
28
+ export const DEFAULT_DB_CONFIG = {
29
+ type: 'sqlite',
30
+ database: ':memory:',
31
+ synchronize: true,
32
+ logging: false,
33
+ entities: [],
34
+ migrations: [],
35
+ subscribers: []
36
+ };
37
+ /**
38
+ * Quick setup function for common database configurations
39
+ *
40
+ * @param {Object} config - Database configuration
41
+ * @returns {DatabaseManager} Configured database manager
42
+ *
43
+ * @example
44
+ * import { setupDatabase } from '@coherent/database';
45
+ *
46
+ * const db = setupDatabase({
47
+ * type: 'postgresql',
48
+ * host: 'localhost',
49
+ * database: 'myapp',
50
+ * username: 'user',
51
+ * password: 'pass'
52
+ * });
53
+ */
54
+ export function setupDatabase(config = {}) {
55
+ const mergedConfig = { ...DEFAULT_DB_CONFIG, ...config };
56
+ const dbManager = createDatabaseManager(mergedConfig);
57
+ // Auto-connect if autoConnect is not explicitly set to false
58
+ if (mergedConfig.autoConnect !== false) {
59
+ dbManager.connect().catch(console.error);
60
+ }
61
+ return dbManager;
62
+ }
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/database/index.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2EAA2E;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3F,0BAA0B;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,oBAAoB;AACpB,OAAO,EAAE,uBAAuB,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE/E,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,MAAM,GAAG,EAAE;IACvC,MAAM,YAAY,GAAG,EAAE,GAAG,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAEtD,6DAA6D;IAC7D,IAAI,YAAY,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACvC,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}