nanodb-orm 0.0.1

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +288 -0
  3. package/dist/constants/index.d.ts +59 -0
  4. package/dist/constants/index.d.ts.map +1 -0
  5. package/dist/constants/index.js +67 -0
  6. package/dist/constants/index.js.map +1 -0
  7. package/dist/core/config.d.ts +17 -0
  8. package/dist/core/config.d.ts.map +1 -0
  9. package/dist/core/config.js +40 -0
  10. package/dist/core/config.js.map +1 -0
  11. package/dist/core/connection.d.ts +29 -0
  12. package/dist/core/connection.d.ts.map +1 -0
  13. package/dist/core/connection.js +77 -0
  14. package/dist/core/connection.js.map +1 -0
  15. package/dist/core/index.d.ts +7 -0
  16. package/dist/core/index.d.ts.map +1 -0
  17. package/dist/core/index.js +26 -0
  18. package/dist/core/index.js.map +1 -0
  19. package/dist/example.d.ts +67 -0
  20. package/dist/example.d.ts.map +1 -0
  21. package/dist/example.js +86 -0
  22. package/dist/example.js.map +1 -0
  23. package/dist/index.d.ts +14 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +41 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/init.d.ts +28 -0
  28. package/dist/init.d.ts.map +1 -0
  29. package/dist/init.js +63 -0
  30. package/dist/init.js.map +1 -0
  31. package/dist/types/errors.d.ts +23 -0
  32. package/dist/types/errors.d.ts.map +1 -0
  33. package/dist/types/errors.js +46 -0
  34. package/dist/types/errors.js.map +1 -0
  35. package/dist/types/index.d.ts +7 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/index.js +23 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/dist/types/types.d.ts +30 -0
  40. package/dist/types/types.d.ts.map +1 -0
  41. package/dist/types/types.js +6 -0
  42. package/dist/types/types.js.map +1 -0
  43. package/dist/utils/index.d.ts +10 -0
  44. package/dist/utils/index.d.ts.map +1 -0
  45. package/dist/utils/index.js +18 -0
  46. package/dist/utils/index.js.map +1 -0
  47. package/dist/utils/logger.d.ts +26 -0
  48. package/dist/utils/logger.d.ts.map +1 -0
  49. package/dist/utils/logger.js +41 -0
  50. package/dist/utils/logger.js.map +1 -0
  51. package/dist/utils/migrations.d.ts +94 -0
  52. package/dist/utils/migrations.d.ts.map +1 -0
  53. package/dist/utils/migrations.js +440 -0
  54. package/dist/utils/migrations.js.map +1 -0
  55. package/dist/utils/schema-introspection.d.ts +183 -0
  56. package/dist/utils/schema-introspection.d.ts.map +1 -0
  57. package/dist/utils/schema-introspection.js +501 -0
  58. package/dist/utils/schema-introspection.js.map +1 -0
  59. package/dist/utils/seeds.d.ts +51 -0
  60. package/dist/utils/seeds.d.ts.map +1 -0
  61. package/dist/utils/seeds.js +209 -0
  62. package/dist/utils/seeds.js.map +1 -0
  63. package/dist/utils/sync.d.ts +57 -0
  64. package/dist/utils/sync.d.ts.map +1 -0
  65. package/dist/utils/sync.js +221 -0
  66. package/dist/utils/sync.js.map +1 -0
  67. package/package.json +53 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Completely Generic Database Migration Utilities
3
+ * Uses Drizzle to auto-create tables from schema
4
+ * No hardcoded table names or structures - completely dynamic!
5
+ */
6
+ /**
7
+ * Completely Generic Database Migration Utilities
8
+ * Works with any table structure defined in schema.ts
9
+ * Uses Drizzle's auto-table creation capabilities
10
+ */
11
+ export interface MigrationConfig {
12
+ preserveData?: boolean;
13
+ autoMigrate?: boolean;
14
+ dropTables?: boolean;
15
+ }
16
+ export declare class DatabaseMigrations {
17
+ private static tables;
18
+ private static migrationConfig;
19
+ /**
20
+ * Initialize with schema data
21
+ */
22
+ static initialize(schemaData: {
23
+ tables: Record<string, any>;
24
+ tableNames: string[];
25
+ migrationConfig?: MigrationConfig;
26
+ }): void;
27
+ /**
28
+ * Initialize database schema using Drizzle's auto table creation
29
+ * Completely generic - works with any table structure defined in schema.ts
30
+ */
31
+ static initializeSchema(): Promise<void>;
32
+ /**
33
+ * Create a table using Drizzle's table definition
34
+ * Uses the actual Drizzle table object to ensure correct SQL generation
35
+ */
36
+ private static createTableWithDrizzle;
37
+ /**
38
+ * Validate if table exists and has the correct schema
39
+ */
40
+ private static validateTableSchema;
41
+ /**
42
+ * Get expected column names from Drizzle table definition
43
+ */
44
+ private static getExpectedColumns;
45
+ /**
46
+ * Get actual column names from database table
47
+ */
48
+ private static getActualColumns;
49
+ /**
50
+ * Check if table has any data
51
+ */
52
+ private static tableHasData;
53
+ /**
54
+ * Generate basic CREATE TABLE SQL for SQLite
55
+ * This is a simplified approach that works for most common table structures
56
+ */
57
+ private static generateBasicCreateSql;
58
+ /**
59
+ * Drop all tables
60
+ * Uses the provided schema tables
61
+ */
62
+ static dropAllTables(): Promise<void>;
63
+ /**
64
+ * Reset database (drop and recreate all tables)
65
+ * Completely generic - works with any table structure defined in schema.ts
66
+ */
67
+ static resetDatabase(): Promise<void>;
68
+ /**
69
+ * Check if tables exist in the database
70
+ * Uses the provided schema tables
71
+ */
72
+ static checkTableExistence(): Promise<Record<string, boolean>>;
73
+ /**
74
+ * Validate that database schema matches provided schema
75
+ * Uses the provided schema tables
76
+ */
77
+ static validateSchema(): Promise<{
78
+ isValid: boolean;
79
+ missingTables: string[];
80
+ extraTables: string[];
81
+ errors: string[];
82
+ }>;
83
+ /**
84
+ * Get migration status
85
+ * Uses the provided schema tables
86
+ */
87
+ static getMigrationStatus(): Promise<{
88
+ tablesInSchema: string[];
89
+ tablesInDatabase: Record<string, boolean>;
90
+ missingTables: string[];
91
+ isValid: boolean;
92
+ }>;
93
+ }
94
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../utils/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,MAAM,CAA2B;IAChD,OAAO,CAAC,MAAM,CAAC,eAAe,CAI5B;IAEF;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE;QAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,eAAe,CAAC,EAAE,eAAe,CAAC;KACnC,GAAG,IAAI;IASR;;;OAGG;WACU,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9C;;;OAGG;mBACkB,sBAAsB;IAqD3C;;OAEG;mBACkB,mBAAmB;IAqCxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA8BjC;;OAEG;mBACkB,gBAAgB;IAarC;;OAEG;mBACkB,YAAY;IAcjC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IA8FrC;;;OAGG;WACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3C;;;OAGG;WACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3C;;;OAGG;WACU,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA4BpE;;;OAGG;WACU,cAAc,IAAI,OAAO,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAuCF;;;OAGG;WACU,kBAAkB,IAAI,OAAO,CAAC;QACzC,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CAwBH"}
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+ /**
3
+ * Completely Generic Database Migration Utilities
4
+ * Uses Drizzle to auto-create tables from schema
5
+ * No hardcoded table names or structures - completely dynamic!
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DatabaseMigrations = void 0;
9
+ const drizzle_orm_1 = require("drizzle-orm");
10
+ const connection_1 = require("../core/connection");
11
+ const logger_1 = require("./logger");
12
+ const errors_1 = require("../types/errors");
13
+ class DatabaseMigrations {
14
+ /**
15
+ * Initialize with schema data
16
+ */
17
+ static initialize(schemaData) {
18
+ this.tables = schemaData.tables;
19
+ this.migrationConfig = {
20
+ preserveData: true, // Always preserve data by default
21
+ autoMigrate: true, // Default to auto-migration
22
+ dropTables: false, // Default to not dropping tables
23
+ ...schemaData.migrationConfig, // Override with any provided config
24
+ };
25
+ }
26
+ /**
27
+ * Initialize database schema using Drizzle's auto table creation
28
+ * Completely generic - works with any table structure defined in schema.ts
29
+ */
30
+ static async initializeSchema() {
31
+ try {
32
+ logger_1.logger.info('Auto-creating database schema using Drizzle...');
33
+ const db = connection_1.DatabaseConnection.getInstance();
34
+ // Get all tables from the provided schema
35
+ const tableNames = Object.keys(this.tables);
36
+ logger_1.logger.info(`Found ${tableNames.length} tables in schema: ${tableNames.join(', ')}`);
37
+ // Use Drizzle to auto-create tables
38
+ for (const tableName of tableNames) {
39
+ await this.createTableWithDrizzle(tableName, db);
40
+ }
41
+ logger_1.logger.info('Database schema initialization completed!');
42
+ }
43
+ catch (error) {
44
+ const dbError = new errors_1.DatabaseError('Schema initialization failed', 'init-schema', error);
45
+ logger_1.logger.error(dbError.message, dbError);
46
+ throw dbError;
47
+ }
48
+ }
49
+ /**
50
+ * Create a table using Drizzle's table definition
51
+ * Uses the actual Drizzle table object to ensure correct SQL generation
52
+ */
53
+ static async createTableWithDrizzle(tableName, db) {
54
+ try {
55
+ const table = this.tables[tableName];
56
+ if (!table) {
57
+ throw new Error(`Table ${tableName} not found in provided schema`);
58
+ }
59
+ logger_1.logger.info(`Creating table ${tableName} using Drizzle definition`);
60
+ // Check if table exists and has correct schema
61
+ try {
62
+ const hasCorrectSchema = await this.validateTableSchema(tableName, table, db);
63
+ if (!hasCorrectSchema) {
64
+ if (!this.migrationConfig.autoMigrate) {
65
+ logger_1.logger.warn(`Table ${tableName} needs schema update but auto-migration is disabled`);
66
+ return;
67
+ }
68
+ const hasData = await this.tableHasData(tableName, db);
69
+ if (hasData && this.migrationConfig.preserveData && !this.migrationConfig.dropTables) {
70
+ logger_1.logger.warn(`Table ${tableName} has data and preserveData is enabled. Skipping schema update.`);
71
+ logger_1.logger.warn(`To update schema, set dropTables: true or preserveData: false in migration config`);
72
+ return;
73
+ }
74
+ if (hasData) {
75
+ logger_1.logger.info(`Table ${tableName} has data but will be recreated due to configuration`);
76
+ }
77
+ logger_1.logger.info(`Table ${tableName} needs schema update, recreating...`);
78
+ // Drop and recreate the table with correct schema
79
+ await db.run((0, drizzle_orm_1.sql) `DROP TABLE IF EXISTS ${drizzle_orm_1.sql.identifier(tableName)}`);
80
+ logger_1.logger.info(`Dropped existing table ${tableName}`);
81
+ const basicCreateSql = this.generateBasicCreateSql(tableName, table);
82
+ await db.run(drizzle_orm_1.sql.raw(basicCreateSql));
83
+ logger_1.logger.info(`Table ${tableName} recreated with correct schema`);
84
+ }
85
+ else {
86
+ logger_1.logger.info(`Table ${tableName} already has correct schema`);
87
+ }
88
+ }
89
+ catch (error) {
90
+ logger_1.logger.error(`Error ensuring table ${tableName}:`, error);
91
+ throw error;
92
+ }
93
+ }
94
+ catch (error) {
95
+ logger_1.logger.error(`Failed to create table ${tableName}:`, error);
96
+ throw error;
97
+ }
98
+ }
99
+ /**
100
+ * Validate if table exists and has the correct schema
101
+ */
102
+ static async validateTableSchema(tableName, table, db) {
103
+ try {
104
+ // First check if table exists
105
+ const checkResult = await db.run((0, drizzle_orm_1.sql) `
106
+ SELECT name FROM sqlite_master
107
+ WHERE type='table' AND name=${tableName}
108
+ `);
109
+ if (!checkResult.rows || checkResult.rows.length === 0) {
110
+ logger_1.logger.info(`Table ${tableName} does not exist, needs creation`);
111
+ return false;
112
+ }
113
+ // Get expected columns from the Drizzle table
114
+ const expectedColumns = this.getExpectedColumns(table);
115
+ // Get actual columns from the database
116
+ const actualColumns = await this.getActualColumns(tableName, db);
117
+ logger_1.logger.info(`Expected columns for ${tableName}:`, expectedColumns);
118
+ logger_1.logger.info(`Actual columns for ${tableName}:`, actualColumns);
119
+ // Check if all expected columns exist
120
+ for (const expectedCol of expectedColumns) {
121
+ if (!actualColumns.includes(expectedCol)) {
122
+ logger_1.logger.info(`Table ${tableName} missing column: ${expectedCol}`);
123
+ return false;
124
+ }
125
+ }
126
+ return true;
127
+ }
128
+ catch (error) {
129
+ logger_1.logger.warn(`Error validating schema for table ${tableName}:`, error);
130
+ return false; // If we can't validate, assume it needs recreation
131
+ }
132
+ }
133
+ /**
134
+ * Get expected column names from Drizzle table definition
135
+ */
136
+ static getExpectedColumns(table) {
137
+ const columns = {};
138
+ // Use the same logic as generateBasicCreateSql
139
+ if (table._ && table._.columns) {
140
+ Object.assign(columns, table._.columns);
141
+ }
142
+ else if (table.columns) {
143
+ Object.assign(columns, table.columns);
144
+ }
145
+ else {
146
+ const tableKeys = Object.keys(table).filter(key => !key.startsWith('_') &&
147
+ typeof table[key] === 'object' &&
148
+ table[key] !== null &&
149
+ !Array.isArray(table[key]));
150
+ for (const key of tableKeys) {
151
+ columns[key] = table[key];
152
+ }
153
+ }
154
+ const expectedColumns = [];
155
+ for (const [colName, column] of Object.entries(columns)) {
156
+ const col = column;
157
+ const dbColumnName = col.name || col.columnName || colName;
158
+ expectedColumns.push(dbColumnName);
159
+ }
160
+ return expectedColumns;
161
+ }
162
+ /**
163
+ * Get actual column names from database table
164
+ */
165
+ static async getActualColumns(tableName, db) {
166
+ try {
167
+ const result = await db.run((0, drizzle_orm_1.sql) `PRAGMA table_info(${drizzle_orm_1.sql.identifier(tableName)})`);
168
+ if (result.rows) {
169
+ return result.rows.map((row) => row.name);
170
+ }
171
+ return [];
172
+ }
173
+ catch (error) {
174
+ logger_1.logger.warn(`Error getting table info for ${tableName}:`, error);
175
+ return [];
176
+ }
177
+ }
178
+ /**
179
+ * Check if table has any data
180
+ */
181
+ static async tableHasData(tableName, db) {
182
+ try {
183
+ const result = await db.run((0, drizzle_orm_1.sql) `SELECT COUNT(*) as count FROM ${drizzle_orm_1.sql.identifier(tableName)}`);
184
+ if (result.rows && result.rows.length > 0) {
185
+ const count = result.rows[0].count;
186
+ return count > 0;
187
+ }
188
+ return false;
189
+ }
190
+ catch (error) {
191
+ logger_1.logger.warn(`Error checking data for table ${tableName}:`, error);
192
+ return false; // If we can't check, assume no data
193
+ }
194
+ }
195
+ /**
196
+ * Generate basic CREATE TABLE SQL for SQLite
197
+ * This is a simplified approach that works for most common table structures
198
+ */
199
+ static generateBasicCreateSql(tableName, table) {
200
+ try {
201
+ // Extract column information from Drizzle table with multiple fallback options
202
+ let columns = {};
203
+ if (table._ && table._.columns) {
204
+ columns = table._.columns;
205
+ }
206
+ else if (table.columns) {
207
+ columns = table.columns;
208
+ }
209
+ else {
210
+ // Try to extract columns directly from the table object
211
+ const tableKeys = Object.keys(table).filter(key => !key.startsWith('_') &&
212
+ typeof table[key] === 'object' &&
213
+ table[key] !== null &&
214
+ !Array.isArray(table[key]));
215
+ for (const key of tableKeys) {
216
+ columns[key] = table[key];
217
+ }
218
+ }
219
+ const columnDefs = [];
220
+ const foreignKeys = [];
221
+ for (const [colName, column] of Object.entries(columns)) {
222
+ const col = column;
223
+ // Extract the actual database column name from the Drizzle column
224
+ const dbColumnName = col.name || col.columnName || colName;
225
+ let columnDef = `"${dbColumnName}"`;
226
+ // Determine column type
227
+ if (col.dataType === 'integer' || col.columnType === 'SQLiteInteger' || col.type === 'integer') {
228
+ columnDef += ' INTEGER';
229
+ }
230
+ else if (col.dataType === 'real' || col.columnType === 'SQLiteReal' || col.type === 'real') {
231
+ columnDef += ' REAL';
232
+ }
233
+ else if (col.dataType === 'text' || col.columnType === 'SQLiteText' || col.type === 'text') {
234
+ columnDef += ' TEXT';
235
+ }
236
+ else {
237
+ columnDef += ' TEXT';
238
+ }
239
+ // Add constraints
240
+ if (col.primary) {
241
+ columnDef += ' PRIMARY KEY';
242
+ // Add AUTOINCREMENT for primary key if specified
243
+ if (col.autoIncrement) {
244
+ columnDef += ' AUTOINCREMENT';
245
+ }
246
+ }
247
+ if (col.notNull) {
248
+ columnDef += ' NOT NULL';
249
+ }
250
+ if (col.unique) {
251
+ columnDef += ' UNIQUE';
252
+ }
253
+ if (col.default !== undefined) {
254
+ if (typeof col.default === 'string') {
255
+ columnDef += ` DEFAULT '${col.default}'`;
256
+ }
257
+ else if (col.default?.sql) {
258
+ // Handle SQL expressions like sql`(datetime('now'))`
259
+ columnDef += ` DEFAULT ${col.default.sql}`;
260
+ }
261
+ else if (col.default?.name === 'sql') {
262
+ columnDef += ` DEFAULT ${col.default.value}`;
263
+ }
264
+ else if (typeof col.default === 'number') {
265
+ columnDef += ` DEFAULT ${col.default}`;
266
+ }
267
+ else {
268
+ columnDef += ` DEFAULT ${col.default}`;
269
+ }
270
+ }
271
+ columnDefs.push(columnDef);
272
+ // Handle foreign key references
273
+ if (col.references) {
274
+ const foreignTable = col.references.table || col.references.foreignTable?.tableName || 'unknown';
275
+ const foreignColumn = col.references.column || col.references.columnName || 'id';
276
+ const onDelete = col.references.onDelete || 'CASCADE';
277
+ foreignKeys.push(`FOREIGN KEY ("${dbColumnName}") REFERENCES "${foreignTable}"("${foreignColumn}") ON DELETE ${onDelete}`);
278
+ }
279
+ }
280
+ // Combine column definitions and foreign keys
281
+ const allConstraints = [...columnDefs, ...foreignKeys];
282
+ return `CREATE TABLE IF NOT EXISTS "${tableName}" (
283
+ ${allConstraints.join(',\n ')}
284
+ )`;
285
+ }
286
+ catch (error) {
287
+ logger_1.logger.error(`Error generating SQL for table ${tableName}:`, error);
288
+ throw error;
289
+ }
290
+ }
291
+ /**
292
+ * Drop all tables
293
+ * Uses the provided schema tables
294
+ */
295
+ static async dropAllTables() {
296
+ try {
297
+ logger_1.logger.warn('Dropping all tables...');
298
+ const db = connection_1.DatabaseConnection.getInstance();
299
+ // Get all tables from provided schema
300
+ const tableNames = Object.keys(this.tables);
301
+ // Drop tables in reverse order to handle foreign key constraints
302
+ const reversedTableNames = [...tableNames].reverse();
303
+ for (const tableName of reversedTableNames) {
304
+ try {
305
+ await db.run((0, drizzle_orm_1.sql) `DROP TABLE IF EXISTS ${drizzle_orm_1.sql.identifier(tableName)}`);
306
+ logger_1.logger.info(`Dropped table ${tableName}`);
307
+ }
308
+ catch (error) {
309
+ logger_1.logger.warn(`Failed to drop table ${tableName}:`, error);
310
+ }
311
+ }
312
+ logger_1.logger.info('All tables dropped successfully');
313
+ }
314
+ catch (error) {
315
+ const dbError = new errors_1.DatabaseError('Drop tables failed', 'drop-tables', error);
316
+ logger_1.logger.error(dbError.message, dbError);
317
+ throw dbError;
318
+ }
319
+ }
320
+ /**
321
+ * Reset database (drop and recreate all tables)
322
+ * Completely generic - works with any table structure defined in schema.ts
323
+ */
324
+ static async resetDatabase() {
325
+ try {
326
+ logger_1.logger.warn('Resetting database...');
327
+ await this.dropAllTables();
328
+ await this.initializeSchema();
329
+ logger_1.logger.info('Database reset completed');
330
+ }
331
+ catch (error) {
332
+ const dbError = new errors_1.DatabaseError('Database reset failed', 'reset-db', error);
333
+ logger_1.logger.error(dbError.message, dbError);
334
+ throw dbError;
335
+ }
336
+ }
337
+ /**
338
+ * Check if tables exist in the database
339
+ * Uses the provided schema tables
340
+ */
341
+ static async checkTableExistence() {
342
+ try {
343
+ const db = connection_1.DatabaseConnection.getInstance();
344
+ const tableNames = Object.keys(this.tables);
345
+ const existence = {};
346
+ for (const tableName of tableNames) {
347
+ try {
348
+ // Check if table exists by querying sqlite_master
349
+ const result = await db.run((0, drizzle_orm_1.sql) `
350
+ SELECT name FROM sqlite_master
351
+ WHERE type='table' AND name=${tableName}
352
+ `);
353
+ existence[tableName] = (result.rows && result.rows.length > 0);
354
+ }
355
+ catch (error) {
356
+ logger_1.logger.warn(`Could not check existence of table ${tableName}:`, error);
357
+ existence[tableName] = false;
358
+ }
359
+ }
360
+ return existence;
361
+ }
362
+ catch (error) {
363
+ logger_1.logger.error('Error checking table existence:', error);
364
+ return {};
365
+ }
366
+ }
367
+ /**
368
+ * Validate that database schema matches provided schema
369
+ * Uses the provided schema tables
370
+ */
371
+ static async validateSchema() {
372
+ try {
373
+ const tableNames = Object.keys(this.tables);
374
+ const existence = await this.checkTableExistence();
375
+ const missingTables = [];
376
+ const extraTables = [];
377
+ const errors = [];
378
+ // Check for missing tables
379
+ for (const tableName of tableNames) {
380
+ if (!existence[tableName]) {
381
+ missingTables.push(tableName);
382
+ }
383
+ }
384
+ // Check for extra tables (tables in DB but not in schema.ts)
385
+ // This would require querying the database for all tables
386
+ // For now, we'll focus on missing tables
387
+ const isValid = missingTables.length === 0 && errors.length === 0;
388
+ return {
389
+ isValid,
390
+ missingTables,
391
+ extraTables,
392
+ errors
393
+ };
394
+ }
395
+ catch (error) {
396
+ logger_1.logger.error('Error validating schema:', error);
397
+ return {
398
+ isValid: false,
399
+ missingTables: [],
400
+ extraTables: [],
401
+ errors: [error.message]
402
+ };
403
+ }
404
+ }
405
+ /**
406
+ * Get migration status
407
+ * Uses the provided schema tables
408
+ */
409
+ static async getMigrationStatus() {
410
+ try {
411
+ const tableNames = Object.keys(this.tables);
412
+ const existence = await this.checkTableExistence();
413
+ const missingTables = tableNames.filter(name => !existence[name]);
414
+ const isValid = missingTables.length === 0;
415
+ return {
416
+ tablesInSchema: tableNames,
417
+ tablesInDatabase: existence,
418
+ missingTables,
419
+ isValid
420
+ };
421
+ }
422
+ catch (error) {
423
+ logger_1.logger.error('Error getting migration status:', error);
424
+ return {
425
+ tablesInSchema: [],
426
+ tablesInDatabase: {},
427
+ missingTables: [],
428
+ isValid: false
429
+ };
430
+ }
431
+ }
432
+ }
433
+ exports.DatabaseMigrations = DatabaseMigrations;
434
+ DatabaseMigrations.tables = {};
435
+ DatabaseMigrations.migrationConfig = {
436
+ preserveData: true,
437
+ autoMigrate: true,
438
+ dropTables: false,
439
+ };
440
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../utils/migrations.ts"],"names":[],"mappings":"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"}