@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,372 @@
1
+ /**
2
+ * Database Utilities for Coherent.js
3
+ *
4
+ * @fileoverview Utility functions for database operations, model registration, and migrations.
5
+ */
6
+ import { DatabaseManager } from './connection-manager.js';
7
+ // Migration utilities are handled by the createMigration factory function
8
+ /**
9
+ * Model registry for managing model classes
10
+ */
11
+ const modelRegistry = new Map();
12
+ /**
13
+ * Create database connection with configuration
14
+ *
15
+ * @param {Object} config - Database configuration
16
+ * @returns {Promise<DatabaseManager>} Database manager instance
17
+ *
18
+ * @example
19
+ * const db = await createConnection({
20
+ * type: 'postgresql',
21
+ * host: 'localhost',
22
+ * database: 'myapp',
23
+ * username: 'user',
24
+ * password: 'pass'
25
+ * });
26
+ */
27
+ export async function createConnection(config) {
28
+ const db = new DatabaseManager(config);
29
+ await db.connect();
30
+ return db;
31
+ }
32
+ /**
33
+
34
+ // Add custom methods if provided
35
+ if (definition.methods) {
36
+ Object.entries(definition.methods).forEach(([methodName, method]) => {
37
+ DynamicModel.prototype[methodName] = method;
38
+ });
39
+ }
40
+
41
+ // Add custom static methods if provided
42
+ if (definition.staticMethods) {
43
+ Object.entries(definition.staticMethods).forEach(([methodName, method]) => {
44
+ DynamicModel[methodName] = method;
45
+ });
46
+ }
47
+
48
+ // Register the model
49
+ registerModel(name, DynamicModel);
50
+
51
+ return DynamicModel;
52
+ }
53
+
54
+ /**
55
+ * Register a model class
56
+ *
57
+ * @param {string} name - Model name
58
+ * @param {Function} ModelClass - Model class
59
+ *
60
+ * @example
61
+ * registerModel('User', UserModel);
62
+ */
63
+ export function registerModel(name, ModelClass) {
64
+ modelRegistry.set(name, ModelClass);
65
+ // Make model globally available for relationships
66
+ if (typeof global !== 'undefined') {
67
+ global[name] = ModelClass;
68
+ }
69
+ }
70
+ /**
71
+ * Get registered model by name
72
+ *
73
+ * @param {string} name - Model name
74
+ * @returns {Function|null} Model class or null if not found
75
+ *
76
+ * @example
77
+ * const User = getModel('User');
78
+ */
79
+ export function getModel(name) {
80
+ return modelRegistry.get(name) || null;
81
+ }
82
+ /**
83
+ * Get all registered models
84
+ *
85
+ * @returns {Map<string, Function>} Map of model names to classes
86
+ */
87
+ export function getAllModels() {
88
+ return new Map(modelRegistry);
89
+ }
90
+ /**
91
+ * Run database migrations
92
+ *
93
+ * @param {DatabaseManager} db - Database manager instance
94
+ * @param {Object} [config={}] - Migration configuration
95
+ * @returns {Promise<Array<string>>} Applied migration names
96
+ *
97
+ * @example
98
+ * const applied = await runMigrations(db, {
99
+ * directory: './migrations'
100
+ * });
101
+ */
102
+ export async function runMigrations(db, config = {}) {
103
+ const { createMigration } = await import('./migration.js');
104
+ const migration = createMigration(db, config);
105
+ return await migration.run();
106
+ }
107
+ /**
108
+ * Rollback database migrations
109
+ *
110
+ * @param {DatabaseManager} db - Database manager instance
111
+ * @param {number} [steps=1] - Number of batches to rollback
112
+ * @param {Object} [config={}] - Migration configuration
113
+ * @returns {Promise<Array<string>>} Rolled back migration names
114
+ *
115
+ * @example
116
+ * const rolledBack = await rollbackMigrations(db, 2);
117
+ */
118
+ export async function rollbackMigrations(db, steps = 1, config = {}) {
119
+ const { createMigration } = await import('./migration.js');
120
+ const migration = createMigration(db, config);
121
+ return await migration.rollback(steps);
122
+ }
123
+ /**
124
+ * Create a new migration file
125
+ *
126
+ * @param {string} name - Migration name
127
+ * @param {Object} [config={}] - Migration configuration
128
+ * @returns {Promise<string>} Created file path
129
+ *
130
+ * @example
131
+ * const filePath = await createMigration('create_users_table');
132
+ */
133
+ export async function createMigrationFile(name, config = {}) {
134
+ const { createMigration } = await import('./migration.js');
135
+ const migration = createMigration(null, config);
136
+ return await migration.create(name);
137
+ }
138
+ /**
139
+ * Seed database with initial data
140
+ *
141
+ * @param {DatabaseManager} db - Database manager instance
142
+ * @param {Function|Array<Function>} seeders - Seeder functions
143
+ * @returns {Promise<void>}
144
+ *
145
+ * @example
146
+ * await seedDatabase(db, [
147
+ * async (db) => {
148
+ * await User.create({ name: 'Admin', email: 'admin@example.com' });
149
+ * }
150
+ * ]);
151
+ */
152
+ export async function seedDatabase(db, seeders) {
153
+ const seederArray = Array.isArray(seeders) ? seeders : [seeders];
154
+ for (const seeder of seederArray) {
155
+ if (typeof seeder === 'function') {
156
+ await seeder(db);
157
+ }
158
+ }
159
+ }
160
+ /**
161
+ * Validate database configuration
162
+ *
163
+ * @param {Object} config - Database configuration
164
+ * @returns {Object} Validation result
165
+ *
166
+ * @example
167
+ * const validation = validateConfig(config);
168
+ * if (!validation.valid) {
169
+ * console.error('Config errors:', validation.errors);
170
+ * }
171
+ */
172
+ export function validateConfig(config) {
173
+ const errors = [];
174
+ if (!config || typeof config !== 'object') {
175
+ errors.push('Configuration must be an object');
176
+ return { valid: false, errors };
177
+ }
178
+ if (!config.type) {
179
+ errors.push('Database type is required');
180
+ }
181
+ else {
182
+ const supportedTypes = ['postgresql', 'mysql', 'sqlite', 'mongodb'];
183
+ if (!supportedTypes.includes(config.type)) {
184
+ errors.push(`Unsupported database type: ${config.type}`);
185
+ }
186
+ }
187
+ if (!config.database) {
188
+ errors.push('Database name is required');
189
+ }
190
+ if (config.type !== 'sqlite') {
191
+ if (!config.host) {
192
+ errors.push('Host is required for non-SQLite databases');
193
+ }
194
+ }
195
+ if (config.pool) {
196
+ if (config.pool.min && config.pool.max && config.pool.min > config.pool.max) {
197
+ errors.push('Pool min size cannot be greater than max size');
198
+ }
199
+ }
200
+ return {
201
+ valid: errors.length === 0,
202
+ errors
203
+ };
204
+ }
205
+ /**
206
+ * Create database backup
207
+ *
208
+ * @param {DatabaseManager} db - Database manager instance
209
+ * @param {Object} [options={}] - Backup options
210
+ * @returns {Promise<string>} Backup file path or data
211
+ *
212
+ * @example
213
+ * const backupPath = await createBackup(db, {
214
+ * format: 'sql',
215
+ * outputPath: './backups'
216
+ * });
217
+ */
218
+ export async function createBackup(db, options = {}) {
219
+ const backupConfig = {
220
+ format: 'sql',
221
+ outputPath: './backups',
222
+ timestamp: true,
223
+ ...options
224
+ };
225
+ const timestamp = backupConfig.timestamp ? new Date().toISOString().replace(/[:.]/g, '-') : '';
226
+ const fileName = `backup${timestamp ? `_${timestamp}` : ''}.${backupConfig.format}`;
227
+ const filePath = `${backupConfig.outputPath}/${fileName}`;
228
+ // This would be adapter-specific implementation
229
+ // For now, return a placeholder
230
+ console.log(`Backup would be created at: ${filePath}`);
231
+ return filePath;
232
+ }
233
+ /**
234
+ * Restore database from backup
235
+ *
236
+ * @param {DatabaseManager} db - Database manager instance
237
+ * @param {string} backupPath - Path to backup file
238
+ * @param {Object} [options={}] - Restore options
239
+ * @returns {Promise<void>}
240
+ *
241
+ * @example
242
+ * await restoreBackup(db, './backups/backup_2023-12-01.sql');
243
+ */
244
+ export async function restoreBackup(db, backupPath) {
245
+ // This would be adapter-specific implementation
246
+ console.log(`Restore would be performed from: ${backupPath}`);
247
+ }
248
+ /**
249
+ * Generate database schema documentation
250
+ *
251
+ * @param {DatabaseManager} db - Database manager instance
252
+ * @param {Object} [options={}] - Documentation options
253
+ * @returns {Promise<Object>} Schema documentation
254
+ *
255
+ * @example
256
+ * const docs = await generateSchemaDocs(db, {
257
+ * includeIndexes: true,
258
+ * includeRelationships: true
259
+ * });
260
+ */
261
+ export async function generateSchemaDocs(db) {
262
+ const schema = {
263
+ database: db.config.database,
264
+ type: db.config.type,
265
+ tables: [],
266
+ models: []
267
+ };
268
+ // Add registered models to documentation
269
+ for (const [name, ModelClass] of modelRegistry) {
270
+ schema.models.push({
271
+ name,
272
+ tableName: ModelClass.tableName,
273
+ primaryKey: ModelClass.primaryKey,
274
+ fillable: ModelClass.fillable,
275
+ relationships: ModelClass.relationships,
276
+ validationRules: ModelClass.validationRules
277
+ });
278
+ }
279
+ return schema;
280
+ }
281
+ /**
282
+ * Database health check utility
283
+ *
284
+ * @param {DatabaseManager} db - Database manager instance
285
+ * @returns {Promise<Object>} Health check result
286
+ *
287
+ * @example
288
+ * const health = await checkDatabaseHealth(db);
289
+ * console.log(`Database is ${health.status}`);
290
+ */
291
+ export async function checkDatabaseHealth(db) {
292
+ const startTime = Date.now();
293
+ try {
294
+ await db.query('SELECT 1');
295
+ const responseTime = Date.now() - startTime;
296
+ const stats = db.getStats();
297
+ return {
298
+ status: 'healthy',
299
+ responseTime,
300
+ connected: db.isConnected,
301
+ stats
302
+ };
303
+ }
304
+ catch (error) {
305
+ return {
306
+ status: 'unhealthy',
307
+ error: error.message,
308
+ connected: db.isConnected,
309
+ responseTime: Date.now() - startTime
310
+ };
311
+ }
312
+ }
313
+ /**
314
+ * Batch operation utility
315
+ *
316
+ * @param {DatabaseManager} db - Database manager instance
317
+ * @param {Array} operations - Array of operations to execute
318
+ * @param {Object} [options={}] - Batch options
319
+ * @returns {Promise<Array>} Results array
320
+ *
321
+ * @example
322
+ * const results = await batchOperations(db, [
323
+ * { sql: 'INSERT INTO users (name) VALUES (?)', params: ['John'] },
324
+ * { sql: 'INSERT INTO users (name) VALUES (?)', params: ['Jane'] }
325
+ * ]);
326
+ */
327
+ export async function batchOperations(db, operations, options = {}) {
328
+ const _config = {
329
+ useTransaction: true,
330
+ continueOnError: false,
331
+ ...options
332
+ };
333
+ const results = [];
334
+ if (config.useTransaction) {
335
+ const tx = await db.transaction();
336
+ try {
337
+ for (const operation of operations) {
338
+ try {
339
+ const result = await tx.query(operation.sql, operation.params);
340
+ results.push({ success: true, result });
341
+ }
342
+ catch (error) {
343
+ results.push({ success: false, error: error.message });
344
+ if (!config.continueOnError) {
345
+ throw error;
346
+ }
347
+ }
348
+ }
349
+ await tx.commit();
350
+ }
351
+ catch (error) {
352
+ await tx.rollback();
353
+ throw error;
354
+ }
355
+ }
356
+ else {
357
+ for (const operation of operations) {
358
+ try {
359
+ const result = await db.query(operation.sql, operation.params);
360
+ results.push({ success: true, result });
361
+ }
362
+ catch (error) {
363
+ results.push({ success: false, error: error.message });
364
+ if (!config.continueOnError) {
365
+ throw error;
366
+ }
367
+ }
368
+ }
369
+ }
370
+ return results;
371
+ }
372
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/database/utils.js"],"names":[],"mappings":"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"}