@coherent.js/core 1.0.0-beta.2 → 1.0.0-beta.3
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/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 +1 -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,423 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Migration System for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Provides database schema migration functionality with version control,
|
|
5
|
+
* rollback support, and automatic migration tracking.
|
|
6
|
+
*/
|
|
7
|
+
import { readdir, writeFile } from 'fs/promises';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Create migration instance
|
|
11
|
+
*
|
|
12
|
+
* @param {DatabaseManager} db - Database manager instance
|
|
13
|
+
* @param {Object} [config={}] - Migration configuration
|
|
14
|
+
* @returns {Object} Migration instance
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const migration = createMigration(db, {
|
|
18
|
+
* directory: './migrations',
|
|
19
|
+
* tableName: 'coherent_migrations'
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* await migration.run();
|
|
23
|
+
*/
|
|
24
|
+
export function createMigration(db, config = {}) {
|
|
25
|
+
const migrationConfig = {
|
|
26
|
+
directory: './migrations',
|
|
27
|
+
tableName: 'coherent_migrations',
|
|
28
|
+
...config
|
|
29
|
+
};
|
|
30
|
+
const migrations = [];
|
|
31
|
+
const appliedMigrations = new Set();
|
|
32
|
+
// Helper functions
|
|
33
|
+
async function ensureMigrationsTable() {
|
|
34
|
+
const tableName = migrationConfig.tableName;
|
|
35
|
+
try {
|
|
36
|
+
await db.query(`SELECT 1 FROM ${tableName} LIMIT 1`);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
const createTableSQL = `
|
|
40
|
+
CREATE TABLE ${tableName} (
|
|
41
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
42
|
+
migration VARCHAR(255) NOT NULL UNIQUE,
|
|
43
|
+
batch INTEGER NOT NULL,
|
|
44
|
+
executed_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
45
|
+
)
|
|
46
|
+
`;
|
|
47
|
+
await db.query(createTableSQL);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function loadAppliedMigrations() {
|
|
51
|
+
const tableName = migrationConfig.tableName;
|
|
52
|
+
const result = await db.query(`SELECT migration FROM ${tableName} ORDER BY executed_at`);
|
|
53
|
+
if (result.rows) {
|
|
54
|
+
result.rows.forEach(row => {
|
|
55
|
+
appliedMigrations.add(row.migration);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function loadMigrationFiles() {
|
|
60
|
+
try {
|
|
61
|
+
const files = await readdir(migrationConfig.directory);
|
|
62
|
+
const migrationFiles = files
|
|
63
|
+
.filter(file => file.endsWith('.js'))
|
|
64
|
+
.sort();
|
|
65
|
+
for (const file of migrationFiles) {
|
|
66
|
+
const migrationName = file.replace('.js', '');
|
|
67
|
+
const filePath = join(migrationConfig.directory, file);
|
|
68
|
+
try {
|
|
69
|
+
const migration = await import(filePath);
|
|
70
|
+
migrations.push({
|
|
71
|
+
name: migrationName,
|
|
72
|
+
file: filePath,
|
|
73
|
+
up: migration.up,
|
|
74
|
+
down: migration.down,
|
|
75
|
+
applied: appliedMigrations.has(migrationName)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (_error) {
|
|
79
|
+
console.warn(`Failed to load migration ${file}: ${_error.message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (_error) {
|
|
84
|
+
if (_error.code !== 'ENOENT') {
|
|
85
|
+
throw _error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function getNextBatchNumber() {
|
|
90
|
+
const result = await db.query(`SELECT MAX(batch) as max_batch FROM ${migrationConfig.tableName}`);
|
|
91
|
+
const maxBatch = result.rows && result.rows[0] ? result.rows[0].max_batch : 0;
|
|
92
|
+
return (maxBatch || 0) + 1;
|
|
93
|
+
}
|
|
94
|
+
async function getLastBatches(count) {
|
|
95
|
+
const result = await db.query(`SELECT DISTINCT batch FROM ${migrationConfig.tableName} ORDER BY batch DESC LIMIT ?`, [count]);
|
|
96
|
+
return result.rows ? result.rows.map(row => row.batch) : [];
|
|
97
|
+
}
|
|
98
|
+
async function getMigrationsInBatch(batch) {
|
|
99
|
+
const result = await db.query(`SELECT migration FROM ${migrationConfig.tableName} WHERE batch = ? ORDER BY executed_at`, [batch]);
|
|
100
|
+
return result.rows ? result.rows.map(row => row.migration) : [];
|
|
101
|
+
}
|
|
102
|
+
async function ensureDirectory(dirPath) {
|
|
103
|
+
try {
|
|
104
|
+
const { mkdir } = await import('fs/promises');
|
|
105
|
+
await mkdir(dirPath, { recursive: true });
|
|
106
|
+
}
|
|
107
|
+
catch (_error) {
|
|
108
|
+
if (_error.code !== 'EEXIST') {
|
|
109
|
+
throw _error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function getMigrationTemplate(name, options) {
|
|
114
|
+
const tableName = options.table || name.replace(/^create_/, '').replace(/_table$/, '');
|
|
115
|
+
if (name.startsWith('create_')) {
|
|
116
|
+
return `/**
|
|
117
|
+
* Migration: ${name}
|
|
118
|
+
* Created: ${new Date().toISOString()}
|
|
119
|
+
*/
|
|
120
|
+
|
|
121
|
+
export async function up(schema) {
|
|
122
|
+
await schema.createTable('${tableName}', (table) => {
|
|
123
|
+
table.id();
|
|
124
|
+
table.string('name').notNull();
|
|
125
|
+
table.timestamps();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export async function down(schema) {
|
|
130
|
+
await schema.dropTable('${tableName}');
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
}
|
|
134
|
+
return `/**
|
|
135
|
+
* Migration: ${name}
|
|
136
|
+
* Created: ${new Date().toISOString()}
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
export async function up(schema) {
|
|
140
|
+
// Add your migration logic here
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export async function down(schema) {
|
|
144
|
+
// Add your rollback logic here
|
|
145
|
+
}
|
|
146
|
+
`;
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
/**
|
|
150
|
+
* Initialize migration system
|
|
151
|
+
*/
|
|
152
|
+
async initialize() {
|
|
153
|
+
await ensureMigrationsTable();
|
|
154
|
+
await loadAppliedMigrations();
|
|
155
|
+
await loadMigrationFiles();
|
|
156
|
+
},
|
|
157
|
+
/**
|
|
158
|
+
* Run pending migrations
|
|
159
|
+
*/
|
|
160
|
+
async run(options = {}) {
|
|
161
|
+
await this.initialize();
|
|
162
|
+
const pendingMigrations = migrations.filter(m => !m.applied);
|
|
163
|
+
if (pendingMigrations.length === 0) {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const batch = await getNextBatchNumber();
|
|
167
|
+
const appliedMigrationsList = [];
|
|
168
|
+
for (const migration of pendingMigrations) {
|
|
169
|
+
try {
|
|
170
|
+
console.log(`Running migration: ${migration.name}`);
|
|
171
|
+
const tx = await db.transaction();
|
|
172
|
+
try {
|
|
173
|
+
await migration.up(createSchemaBuilder(tx));
|
|
174
|
+
await tx.query(`INSERT INTO ${migrationConfig.tableName} (migration, batch) VALUES (?, ?)`, [migration.name, batch]);
|
|
175
|
+
await tx.commit();
|
|
176
|
+
appliedMigrationsList.push(migration.name);
|
|
177
|
+
migration.applied = true;
|
|
178
|
+
console.log(`✓ Migration ${migration.name} completed`);
|
|
179
|
+
}
|
|
180
|
+
catch (_error) {
|
|
181
|
+
await tx.rollback();
|
|
182
|
+
throw _error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (_error) {
|
|
186
|
+
console._error(`✗ Migration ${migration.name} failed: ${_error.message}`);
|
|
187
|
+
if (!options.continueOnError) {
|
|
188
|
+
throw _error;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return appliedMigrationsList;
|
|
193
|
+
},
|
|
194
|
+
/**
|
|
195
|
+
* Rollback migrations
|
|
196
|
+
*/
|
|
197
|
+
async rollback(steps = 1) {
|
|
198
|
+
await this.initialize();
|
|
199
|
+
const batches = await getLastBatches(steps);
|
|
200
|
+
if (batches.length === 0) {
|
|
201
|
+
return [];
|
|
202
|
+
}
|
|
203
|
+
const rolledBackMigrations = [];
|
|
204
|
+
for (const batch of batches) {
|
|
205
|
+
const batchMigrations = await getMigrationsInBatch(batch);
|
|
206
|
+
for (const migrationName of batchMigrations.reverse()) {
|
|
207
|
+
const migration = migrations.find(m => m.name === migrationName);
|
|
208
|
+
if (!migration || !migration.down) {
|
|
209
|
+
console.warn(`Cannot rollback migration: ${migrationName}`);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
console.log(`Rolling back migration: ${migrationName}`);
|
|
214
|
+
const tx = await db.transaction();
|
|
215
|
+
try {
|
|
216
|
+
await migration.down(createSchemaBuilder(tx));
|
|
217
|
+
await tx.query(`DELETE FROM ${migrationConfig.tableName} WHERE migration = ?`, [migrationName]);
|
|
218
|
+
await tx.commit();
|
|
219
|
+
rolledBackMigrations.push(migrationName);
|
|
220
|
+
migration.applied = false;
|
|
221
|
+
console.log(`✓ Migration ${migrationName} rolled back`);
|
|
222
|
+
}
|
|
223
|
+
catch (_error) {
|
|
224
|
+
await tx.rollback();
|
|
225
|
+
throw _error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (_error) {
|
|
229
|
+
console._error(`✗ Rollback ${migrationName} failed: ${_error.message}`);
|
|
230
|
+
throw _error;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return rolledBackMigrations;
|
|
235
|
+
},
|
|
236
|
+
/**
|
|
237
|
+
* Get migration status
|
|
238
|
+
*/
|
|
239
|
+
async status() {
|
|
240
|
+
await this.initialize();
|
|
241
|
+
return migrations.map(migration => ({
|
|
242
|
+
name: migration.name,
|
|
243
|
+
applied: migration.applied,
|
|
244
|
+
file: migration.file
|
|
245
|
+
}));
|
|
246
|
+
},
|
|
247
|
+
/**
|
|
248
|
+
* Create new migration file
|
|
249
|
+
*/
|
|
250
|
+
async create(name, options = {}) {
|
|
251
|
+
const timestamp = new Date().toISOString().replace(/[-:T]/g, '').split('.')[0];
|
|
252
|
+
const fileName = `${timestamp}_${name}.js`;
|
|
253
|
+
const filePath = join(migrationConfig.directory, fileName);
|
|
254
|
+
const template = getMigrationTemplate(name, options);
|
|
255
|
+
await ensureDirectory(migrationConfig.directory);
|
|
256
|
+
await writeFile(filePath, template);
|
|
257
|
+
console.log(`Created migration: ${filePath}`);
|
|
258
|
+
return filePath;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Create schema builder instance
|
|
264
|
+
*/
|
|
265
|
+
export function createSchemaBuilder(db) {
|
|
266
|
+
return {
|
|
267
|
+
async createTable(tableName, callback) {
|
|
268
|
+
const table = createTableBuilder(tableName);
|
|
269
|
+
callback(table);
|
|
270
|
+
const sql = table.toCreateSQL();
|
|
271
|
+
await db.query(sql);
|
|
272
|
+
},
|
|
273
|
+
async alterTable(tableName, callback) {
|
|
274
|
+
const table = createTableBuilder(tableName);
|
|
275
|
+
callback(table);
|
|
276
|
+
const statements = table.toAlterSQL();
|
|
277
|
+
for (const sql of statements) {
|
|
278
|
+
await db.query(sql);
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
async dropTable(tableName) {
|
|
282
|
+
await db.query(`DROP TABLE IF EXISTS ${tableName}`);
|
|
283
|
+
},
|
|
284
|
+
async raw(sql, params = []) {
|
|
285
|
+
return await db.query(sql, params);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Create table builder instance
|
|
291
|
+
*/
|
|
292
|
+
export function createTableBuilder(tableName) {
|
|
293
|
+
const columns = [];
|
|
294
|
+
const alterations = [];
|
|
295
|
+
function createColumnBuilder(column) {
|
|
296
|
+
return {
|
|
297
|
+
notNull() {
|
|
298
|
+
column.nullable = false;
|
|
299
|
+
return this;
|
|
300
|
+
},
|
|
301
|
+
unique() {
|
|
302
|
+
column.unique = true;
|
|
303
|
+
return this;
|
|
304
|
+
},
|
|
305
|
+
default(value) {
|
|
306
|
+
column.default = typeof value === 'string' ? `'${value}'` : value;
|
|
307
|
+
return this;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
id(name = 'id') {
|
|
313
|
+
columns.push({
|
|
314
|
+
name,
|
|
315
|
+
type: 'INTEGER',
|
|
316
|
+
primaryKey: true,
|
|
317
|
+
autoIncrement: true
|
|
318
|
+
});
|
|
319
|
+
return this;
|
|
320
|
+
},
|
|
321
|
+
string(name, length = 255) {
|
|
322
|
+
const column = {
|
|
323
|
+
name,
|
|
324
|
+
type: `VARCHAR(${length})`,
|
|
325
|
+
nullable: true
|
|
326
|
+
};
|
|
327
|
+
columns.push(column);
|
|
328
|
+
return createColumnBuilder(column);
|
|
329
|
+
},
|
|
330
|
+
text(name) {
|
|
331
|
+
const column = {
|
|
332
|
+
name,
|
|
333
|
+
type: 'TEXT',
|
|
334
|
+
nullable: true
|
|
335
|
+
};
|
|
336
|
+
columns.push(column);
|
|
337
|
+
return createColumnBuilder(column);
|
|
338
|
+
},
|
|
339
|
+
integer(name) {
|
|
340
|
+
const column = {
|
|
341
|
+
name,
|
|
342
|
+
type: 'INTEGER',
|
|
343
|
+
nullable: true
|
|
344
|
+
};
|
|
345
|
+
columns.push(column);
|
|
346
|
+
return createColumnBuilder(column);
|
|
347
|
+
},
|
|
348
|
+
boolean(name) {
|
|
349
|
+
const column = {
|
|
350
|
+
name,
|
|
351
|
+
type: 'BOOLEAN',
|
|
352
|
+
nullable: true,
|
|
353
|
+
default: false
|
|
354
|
+
};
|
|
355
|
+
columns.push(column);
|
|
356
|
+
return createColumnBuilder(column);
|
|
357
|
+
},
|
|
358
|
+
datetime(name) {
|
|
359
|
+
const column = {
|
|
360
|
+
name,
|
|
361
|
+
type: 'DATETIME',
|
|
362
|
+
nullable: true
|
|
363
|
+
};
|
|
364
|
+
columns.push(column);
|
|
365
|
+
return createColumnBuilder(column);
|
|
366
|
+
},
|
|
367
|
+
timestamps() {
|
|
368
|
+
this.datetime('created_at').default('CURRENT_TIMESTAMP');
|
|
369
|
+
this.datetime('updated_at').default('CURRENT_TIMESTAMP');
|
|
370
|
+
return this;
|
|
371
|
+
},
|
|
372
|
+
addColumn(name, type) {
|
|
373
|
+
alterations.push({
|
|
374
|
+
type: 'ADD',
|
|
375
|
+
name,
|
|
376
|
+
columnType: type
|
|
377
|
+
});
|
|
378
|
+
return this;
|
|
379
|
+
},
|
|
380
|
+
dropColumn(name) {
|
|
381
|
+
alterations.push({
|
|
382
|
+
type: 'DROP',
|
|
383
|
+
name
|
|
384
|
+
});
|
|
385
|
+
return this;
|
|
386
|
+
},
|
|
387
|
+
toCreateSQL() {
|
|
388
|
+
const columnDefs = columns.map(col => {
|
|
389
|
+
let def = `${col.name} ${col.type}`;
|
|
390
|
+
if (col.primaryKey) {
|
|
391
|
+
def += ' PRIMARY KEY';
|
|
392
|
+
}
|
|
393
|
+
if (col.autoIncrement) {
|
|
394
|
+
def += ' AUTOINCREMENT';
|
|
395
|
+
}
|
|
396
|
+
if (!col.nullable) {
|
|
397
|
+
def += ' NOT NULL';
|
|
398
|
+
}
|
|
399
|
+
if (col.unique) {
|
|
400
|
+
def += ' UNIQUE';
|
|
401
|
+
}
|
|
402
|
+
if (col.default !== undefined) {
|
|
403
|
+
def += ` DEFAULT ${col.default}`;
|
|
404
|
+
}
|
|
405
|
+
return def;
|
|
406
|
+
});
|
|
407
|
+
return `CREATE TABLE ${tableName} (\n ${columnDefs.join(',\n ')}\n)`;
|
|
408
|
+
},
|
|
409
|
+
toAlterSQL() {
|
|
410
|
+
return alterations.map(alt => {
|
|
411
|
+
switch (alt.type) {
|
|
412
|
+
case 'ADD':
|
|
413
|
+
return `ALTER TABLE ${tableName} ADD COLUMN ${alt.name} ${alt.columnType}`;
|
|
414
|
+
case 'DROP':
|
|
415
|
+
return `ALTER TABLE ${tableName} DROP COLUMN ${alt.name}`;
|
|
416
|
+
default:
|
|
417
|
+
throw new Error(`Unsupported alteration type: ${alt.type}`);
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../../../src/database/migration.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/database/model.js"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,gCAHW,eAAe,GACb,MAAM,CA6LlB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Object-Based Model System for Coherent.js
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Core model system using pure JavaScript objects for consistency
|
|
5
|
+
*/
|
|
6
|
+
import { QueryBuilder } from './query-builder.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create model instance
|
|
9
|
+
*
|
|
10
|
+
* @param {DatabaseManager} db - Database manager instance
|
|
11
|
+
* @returns {Object} Model instance
|
|
12
|
+
*/
|
|
13
|
+
export function createModel(db) {
|
|
14
|
+
const models = new Map();
|
|
15
|
+
// Helper functions
|
|
16
|
+
function validateModelDefinition(definition) {
|
|
17
|
+
if (!definition.tableName) {
|
|
18
|
+
throw new Error('Model must have a tableName');
|
|
19
|
+
}
|
|
20
|
+
if (!definition.attributes || typeof definition.attributes !== 'object') {
|
|
21
|
+
throw new Error('Model must have attributes object');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function createInstance(modelName, attributes) {
|
|
25
|
+
const model = models.get(modelName);
|
|
26
|
+
if (!model) {
|
|
27
|
+
throw new Error(`Model '${modelName}' not found`);
|
|
28
|
+
}
|
|
29
|
+
const instance = { ...attributes };
|
|
30
|
+
// Add instance methods
|
|
31
|
+
if (model.methods) {
|
|
32
|
+
Object.entries(model.methods).forEach(([methodName, method]) => {
|
|
33
|
+
instance[methodName] = method.bind(instance);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// Add save method
|
|
37
|
+
instance.save = async () => {
|
|
38
|
+
const primaryKey = model.primaryKey || 'id';
|
|
39
|
+
const id = instance[primaryKey];
|
|
40
|
+
if (id) {
|
|
41
|
+
// Update existing
|
|
42
|
+
await model.updateWhere({ [primaryKey]: id }, instance);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Create new
|
|
46
|
+
const result = await model.query({
|
|
47
|
+
insert: instance
|
|
48
|
+
});
|
|
49
|
+
if (result.insertId) {
|
|
50
|
+
instance[primaryKey] = result.insertId;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return instance;
|
|
54
|
+
};
|
|
55
|
+
// Add delete method
|
|
56
|
+
instance.delete = async () => {
|
|
57
|
+
const primaryKey = model.primaryKey || 'id';
|
|
58
|
+
const id = instance[primaryKey];
|
|
59
|
+
if (!id) {
|
|
60
|
+
throw new Error('Cannot delete instance without primary key');
|
|
61
|
+
}
|
|
62
|
+
return await model.deleteWhere({ [primaryKey]: id });
|
|
63
|
+
};
|
|
64
|
+
return instance;
|
|
65
|
+
}
|
|
66
|
+
function createModel(name, definition) {
|
|
67
|
+
const model = {
|
|
68
|
+
name,
|
|
69
|
+
db,
|
|
70
|
+
...definition,
|
|
71
|
+
// Core query method
|
|
72
|
+
query: async (config) => {
|
|
73
|
+
if (!config.from && definition.tableName) {
|
|
74
|
+
config.from = definition.tableName;
|
|
75
|
+
}
|
|
76
|
+
const result = await QueryBuilder.execute(db, config);
|
|
77
|
+
// Convert results to model instances for SELECT queries
|
|
78
|
+
if (config.select && result.rows) {
|
|
79
|
+
return result.rows.map(row => createInstance(name, row));
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
},
|
|
83
|
+
// Convenience methods
|
|
84
|
+
find: async (id) => {
|
|
85
|
+
const results = await model.query({
|
|
86
|
+
select: '*',
|
|
87
|
+
where: { [definition.primaryKey || 'id']: id },
|
|
88
|
+
limit: 1
|
|
89
|
+
});
|
|
90
|
+
return results.length > 0 ? results[0] : null;
|
|
91
|
+
},
|
|
92
|
+
all: async () => {
|
|
93
|
+
return await model.query({ select: '*' });
|
|
94
|
+
},
|
|
95
|
+
where: async (config) => {
|
|
96
|
+
return await model.query(config);
|
|
97
|
+
},
|
|
98
|
+
create: async (attributes) => {
|
|
99
|
+
const result = await model.query({
|
|
100
|
+
insert: attributes
|
|
101
|
+
});
|
|
102
|
+
// Return created instance with ID
|
|
103
|
+
if (result.insertId) {
|
|
104
|
+
return await model.find(result.insertId);
|
|
105
|
+
}
|
|
106
|
+
return createInstance(name, attributes);
|
|
107
|
+
},
|
|
108
|
+
updateWhere: async (conditions, updates) => {
|
|
109
|
+
const result = await model.query({
|
|
110
|
+
update: updates,
|
|
111
|
+
where: conditions
|
|
112
|
+
});
|
|
113
|
+
return result.affectedRows || 0;
|
|
114
|
+
},
|
|
115
|
+
deleteWhere: async (conditions) => {
|
|
116
|
+
const result = await model.query({
|
|
117
|
+
delete: true,
|
|
118
|
+
where: conditions
|
|
119
|
+
});
|
|
120
|
+
return result.affectedRows || 0;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
// Add static methods if defined
|
|
124
|
+
if (definition.statics) {
|
|
125
|
+
Object.entries(definition.statics).forEach(([methodName, method]) => {
|
|
126
|
+
model[methodName] = method.bind(model);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return model;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
/**
|
|
133
|
+
* Register a model with pure object definition
|
|
134
|
+
*
|
|
135
|
+
* @param {string} name - Model name
|
|
136
|
+
* @param {Object} definition - Model definition object
|
|
137
|
+
* @returns {Object} Enhanced model object
|
|
138
|
+
*/
|
|
139
|
+
registerModel(name, definition) {
|
|
140
|
+
validateModelDefinition(definition);
|
|
141
|
+
const model = createModel(name, definition);
|
|
142
|
+
models.set(name, model);
|
|
143
|
+
return model;
|
|
144
|
+
},
|
|
145
|
+
/**
|
|
146
|
+
* Execute multi-model queries
|
|
147
|
+
*/
|
|
148
|
+
async execute(queryObject) {
|
|
149
|
+
const results = {};
|
|
150
|
+
for (const [modelName, queryConfig] of Object.entries(queryObject)) {
|
|
151
|
+
const model = models.get(modelName);
|
|
152
|
+
if (!model) {
|
|
153
|
+
throw new Error(`Model '${modelName}' not found`);
|
|
154
|
+
}
|
|
155
|
+
results[modelName] = await model.query(queryConfig);
|
|
156
|
+
}
|
|
157
|
+
return results;
|
|
158
|
+
},
|
|
159
|
+
/**
|
|
160
|
+
* Get registered model
|
|
161
|
+
*/
|
|
162
|
+
getModel(name) {
|
|
163
|
+
return models.get(name);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../src/database/model.js"],"names":[],"mappings":"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"}
|