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.
- package/LICENSE +21 -0
- package/README.md +288 -0
- package/dist/constants/index.d.ts +59 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +67 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +40 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/connection.d.ts +29 -0
- package/dist/core/connection.d.ts.map +1 -0
- package/dist/core/connection.js +77 -0
- package/dist/core/connection.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +26 -0
- package/dist/core/index.js.map +1 -0
- package/dist/example.d.ts +67 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +86 -0
- package/dist/example.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +28 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +63 -0
- package/dist/init.js.map +1 -0
- package/dist/types/errors.d.ts +23 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +46 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/types.d.ts +30 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +6 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +41 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/migrations.d.ts +94 -0
- package/dist/utils/migrations.d.ts.map +1 -0
- package/dist/utils/migrations.js +440 -0
- package/dist/utils/migrations.js.map +1 -0
- package/dist/utils/schema-introspection.d.ts +183 -0
- package/dist/utils/schema-introspection.d.ts.map +1 -0
- package/dist/utils/schema-introspection.js +501 -0
- package/dist/utils/schema-introspection.js.map +1 -0
- package/dist/utils/seeds.d.ts +51 -0
- package/dist/utils/seeds.d.ts.map +1 -0
- package/dist/utils/seeds.js +209 -0
- package/dist/utils/seeds.js.map +1 -0
- package/dist/utils/sync.d.ts +57 -0
- package/dist/utils/sync.d.ts.map +1 -0
- package/dist/utils/sync.js +221 -0
- package/dist/utils/sync.js.map +1 -0
- 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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"}
|