@framers/sql-storage-adapter 0.4.2 → 0.5.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 (135) hide show
  1. package/README.md +94 -2
  2. package/dist/adapters/electron/electronMainAdapter.d.ts +241 -0
  3. package/dist/adapters/electron/electronMainAdapter.d.ts.map +1 -0
  4. package/dist/adapters/electron/electronMainAdapter.js +442 -0
  5. package/dist/adapters/electron/electronMainAdapter.js.map +1 -0
  6. package/dist/adapters/electron/electronRendererAdapter.d.ts +177 -0
  7. package/dist/adapters/electron/electronRendererAdapter.d.ts.map +1 -0
  8. package/dist/adapters/electron/electronRendererAdapter.js +339 -0
  9. package/dist/adapters/electron/electronRendererAdapter.js.map +1 -0
  10. package/dist/adapters/electron/index.d.ts +74 -0
  11. package/dist/adapters/electron/index.d.ts.map +1 -0
  12. package/dist/adapters/electron/index.js +96 -0
  13. package/dist/adapters/electron/index.js.map +1 -0
  14. package/dist/adapters/electron/ipc/channels.d.ts +196 -0
  15. package/dist/adapters/electron/ipc/channels.d.ts.map +1 -0
  16. package/dist/adapters/electron/ipc/channels.js +121 -0
  17. package/dist/adapters/electron/ipc/channels.js.map +1 -0
  18. package/dist/adapters/electron/ipc/index.d.ts +11 -0
  19. package/dist/adapters/electron/ipc/index.d.ts.map +1 -0
  20. package/dist/adapters/electron/ipc/index.js +11 -0
  21. package/dist/adapters/electron/ipc/index.js.map +1 -0
  22. package/dist/adapters/electron/ipc/protocol.d.ts +78 -0
  23. package/dist/adapters/electron/ipc/protocol.d.ts.map +1 -0
  24. package/dist/adapters/electron/ipc/protocol.js +347 -0
  25. package/dist/adapters/electron/ipc/protocol.js.map +1 -0
  26. package/dist/adapters/electron/ipc/types.d.ts +248 -0
  27. package/dist/adapters/electron/ipc/types.d.ts.map +1 -0
  28. package/dist/adapters/electron/ipc/types.js +8 -0
  29. package/dist/adapters/electron/ipc/types.js.map +1 -0
  30. package/dist/adapters/electron/migration/autoMigrator.d.ts +184 -0
  31. package/dist/adapters/electron/migration/autoMigrator.d.ts.map +1 -0
  32. package/dist/adapters/electron/migration/autoMigrator.js +478 -0
  33. package/dist/adapters/electron/migration/autoMigrator.js.map +1 -0
  34. package/dist/adapters/electron/migration/index.d.ts +9 -0
  35. package/dist/adapters/electron/migration/index.d.ts.map +1 -0
  36. package/dist/adapters/electron/migration/index.js +9 -0
  37. package/dist/adapters/electron/migration/index.js.map +1 -0
  38. package/dist/adapters/electron/preload.d.ts +126 -0
  39. package/dist/adapters/electron/preload.d.ts.map +1 -0
  40. package/dist/adapters/electron/preload.js +254 -0
  41. package/dist/adapters/electron/preload.js.map +1 -0
  42. package/dist/adapters/electron/recovery/corruptionDetector.d.ts +214 -0
  43. package/dist/adapters/electron/recovery/corruptionDetector.d.ts.map +1 -0
  44. package/dist/adapters/electron/recovery/corruptionDetector.js +410 -0
  45. package/dist/adapters/electron/recovery/corruptionDetector.js.map +1 -0
  46. package/dist/adapters/electron/recovery/index.d.ts +11 -0
  47. package/dist/adapters/electron/recovery/index.d.ts.map +1 -0
  48. package/dist/adapters/electron/recovery/index.js +11 -0
  49. package/dist/adapters/electron/recovery/index.js.map +1 -0
  50. package/dist/adapters/electron/recovery/walCheckpoint.d.ts +186 -0
  51. package/dist/adapters/electron/recovery/walCheckpoint.d.ts.map +1 -0
  52. package/dist/adapters/electron/recovery/walCheckpoint.js +302 -0
  53. package/dist/adapters/electron/recovery/walCheckpoint.js.map +1 -0
  54. package/dist/adapters/electron/window/index.d.ts +9 -0
  55. package/dist/adapters/electron/window/index.d.ts.map +1 -0
  56. package/dist/adapters/electron/window/index.js +9 -0
  57. package/dist/adapters/electron/window/index.js.map +1 -0
  58. package/dist/adapters/electron/window/windowManager.d.ts +190 -0
  59. package/dist/adapters/electron/window/windowManager.d.ts.map +1 -0
  60. package/dist/adapters/electron/window/windowManager.js +358 -0
  61. package/dist/adapters/electron/window/windowManager.js.map +1 -0
  62. package/dist/core/contracts/context.d.ts +2 -2
  63. package/dist/core/contracts/context.d.ts.map +1 -1
  64. package/dist/core/database.d.ts +19 -0
  65. package/dist/core/database.d.ts.map +1 -1
  66. package/dist/core/database.js +4 -0
  67. package/dist/core/database.js.map +1 -1
  68. package/dist/core/resolver.d.ts +3 -0
  69. package/dist/core/resolver.d.ts.map +1 -1
  70. package/dist/core/resolver.js +39 -3
  71. package/dist/core/resolver.js.map +1 -1
  72. package/dist/features/sync/conflicts/conflictResolver.d.ts +222 -0
  73. package/dist/features/sync/conflicts/conflictResolver.d.ts.map +1 -0
  74. package/dist/features/sync/conflicts/conflictResolver.js +396 -0
  75. package/dist/features/sync/conflicts/conflictResolver.js.map +1 -0
  76. package/dist/features/sync/conflicts/index.d.ts +9 -0
  77. package/dist/features/sync/conflicts/index.d.ts.map +1 -0
  78. package/dist/features/sync/conflicts/index.js +9 -0
  79. package/dist/features/sync/conflicts/index.js.map +1 -0
  80. package/dist/features/sync/crossPlatformSync.d.ts +281 -0
  81. package/dist/features/sync/crossPlatformSync.d.ts.map +1 -0
  82. package/dist/features/sync/crossPlatformSync.js +623 -0
  83. package/dist/features/sync/crossPlatformSync.js.map +1 -0
  84. package/dist/features/sync/devices/deviceManager.d.ts +243 -0
  85. package/dist/features/sync/devices/deviceManager.d.ts.map +1 -0
  86. package/dist/features/sync/devices/deviceManager.js +494 -0
  87. package/dist/features/sync/devices/deviceManager.js.map +1 -0
  88. package/dist/features/sync/devices/index.d.ts +10 -0
  89. package/dist/features/sync/devices/index.d.ts.map +1 -0
  90. package/dist/features/sync/devices/index.js +10 -0
  91. package/dist/features/sync/devices/index.js.map +1 -0
  92. package/dist/features/sync/index.d.ts +37 -0
  93. package/dist/features/sync/index.d.ts.map +1 -0
  94. package/dist/features/sync/index.js +47 -0
  95. package/dist/features/sync/index.js.map +1 -0
  96. package/dist/features/sync/protocol/index.d.ts +11 -0
  97. package/dist/features/sync/protocol/index.d.ts.map +1 -0
  98. package/dist/features/sync/protocol/index.js +11 -0
  99. package/dist/features/sync/protocol/index.js.map +1 -0
  100. package/dist/features/sync/protocol/messages.d.ts +348 -0
  101. package/dist/features/sync/protocol/messages.d.ts.map +1 -0
  102. package/dist/features/sync/protocol/messages.js +216 -0
  103. package/dist/features/sync/protocol/messages.js.map +1 -0
  104. package/dist/features/sync/protocol/vectorClock.d.ts +164 -0
  105. package/dist/features/sync/protocol/vectorClock.d.ts.map +1 -0
  106. package/dist/features/sync/protocol/vectorClock.js +286 -0
  107. package/dist/features/sync/protocol/vectorClock.js.map +1 -0
  108. package/dist/features/sync/tables/index.d.ts +10 -0
  109. package/dist/features/sync/tables/index.d.ts.map +1 -0
  110. package/dist/features/sync/tables/index.js +10 -0
  111. package/dist/features/sync/tables/index.js.map +1 -0
  112. package/dist/features/sync/tables/syncLogManager.d.ts +216 -0
  113. package/dist/features/sync/tables/syncLogManager.d.ts.map +1 -0
  114. package/dist/features/sync/tables/syncLogManager.js +456 -0
  115. package/dist/features/sync/tables/syncLogManager.js.map +1 -0
  116. package/dist/features/sync/transport/httpTransport.d.ts +123 -0
  117. package/dist/features/sync/transport/httpTransport.d.ts.map +1 -0
  118. package/dist/features/sync/transport/httpTransport.js +380 -0
  119. package/dist/features/sync/transport/httpTransport.js.map +1 -0
  120. package/dist/features/sync/transport/index.d.ts +12 -0
  121. package/dist/features/sync/transport/index.d.ts.map +1 -0
  122. package/dist/features/sync/transport/index.js +12 -0
  123. package/dist/features/sync/transport/index.js.map +1 -0
  124. package/dist/features/sync/transport/transport.d.ts +259 -0
  125. package/dist/features/sync/transport/transport.d.ts.map +1 -0
  126. package/dist/features/sync/transport/transport.js +153 -0
  127. package/dist/features/sync/transport/transport.js.map +1 -0
  128. package/dist/features/sync/transport/websocketTransport.d.ts +126 -0
  129. package/dist/features/sync/transport/websocketTransport.d.ts.map +1 -0
  130. package/dist/features/sync/transport/websocketTransport.js +374 -0
  131. package/dist/features/sync/transport/websocketTransport.js.map +1 -0
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +6 -0
  134. package/dist/index.js.map +1 -1
  135. package/package.json +21 -1
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Auto-Migration System for Electron Apps.
3
+ *
4
+ * Automatically runs database migrations when the application version
5
+ * changes. Tracks applied migrations and supports rollback.
6
+ *
7
+ * ## Features
8
+ * - Version detection via package.json or app.getVersion()
9
+ * - Automatic migration on app update
10
+ * - Migration file discovery and ordering
11
+ * - Rollback support
12
+ * - Transaction-wrapped migrations
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const migrator = new AutoMigrator(adapter, {
17
+ * migrationsPath: path.join(__dirname, 'migrations'),
18
+ * runOnVersionChange: true,
19
+ * });
20
+ *
21
+ * await migrator.initialize();
22
+ * await migrator.runPending();
23
+ * ```
24
+ */
25
+ import type { StorageAdapter } from '../../../core/contracts';
26
+ /**
27
+ * Migration file definition.
28
+ */
29
+ export interface MigrationFile {
30
+ /** Migration version/order number */
31
+ version: number;
32
+ /** Migration name */
33
+ name: string;
34
+ /** Full file path */
35
+ path: string;
36
+ /** SQL content (up migration) */
37
+ up: string;
38
+ /** SQL content (down migration, optional) */
39
+ down?: string;
40
+ }
41
+ /**
42
+ * Applied migration record.
43
+ */
44
+ export interface AppliedMigration {
45
+ version: number;
46
+ name: string;
47
+ appliedAt: number;
48
+ appVersion: string;
49
+ checksum: string;
50
+ }
51
+ /**
52
+ * Migration result.
53
+ */
54
+ export interface MigrationResult {
55
+ success: boolean;
56
+ migrationsRun: number;
57
+ migrationsFailed: number;
58
+ duration: number;
59
+ appliedMigrations: string[];
60
+ errors: Array<{
61
+ migration: string;
62
+ error: string;
63
+ }>;
64
+ }
65
+ /**
66
+ * Auto-migrator configuration.
67
+ */
68
+ export interface AutoMigratorConfig {
69
+ /** Path to migrations directory */
70
+ migrationsPath: string;
71
+ /** Run migrations on version change (default: true) */
72
+ runOnVersionChange?: boolean;
73
+ /** Table name for tracking migrations (default: '_migrations') */
74
+ tableName?: string;
75
+ /** Enable verbose logging (default: false) */
76
+ verbose?: boolean;
77
+ /** Get current app version (default: reads from package.json or electron) */
78
+ getAppVersion?: () => string;
79
+ }
80
+ /**
81
+ * Auto Migration Manager.
82
+ *
83
+ * Handles automatic database migrations for Electron applications.
84
+ */
85
+ export declare class AutoMigrator {
86
+ private readonly adapter;
87
+ private readonly config;
88
+ private migrations;
89
+ private isInitialized;
90
+ private lastMigrationResult;
91
+ constructor(adapter: StorageAdapter, config: AutoMigratorConfig);
92
+ /**
93
+ * Initialize the migration system.
94
+ */
95
+ initialize(): Promise<void>;
96
+ /**
97
+ * Create the migrations tracking table.
98
+ */
99
+ private createMigrationsTable;
100
+ /**
101
+ * Load all migration files from the migrations directory.
102
+ */
103
+ private loadMigrations;
104
+ /**
105
+ * Parse a migration file.
106
+ */
107
+ private parseMigrationFile;
108
+ /**
109
+ * Parse a SQL migration file.
110
+ * Supports UP and DOWN sections separated by `-- DOWN`.
111
+ */
112
+ private parseSqlMigration;
113
+ /**
114
+ * Parse a JS/TS migration file.
115
+ * Expects exports: { up: string, down?: string }
116
+ */
117
+ private parseJsMigration;
118
+ /**
119
+ * Run all pending migrations.
120
+ */
121
+ runPending(): Promise<MigrationResult>;
122
+ /**
123
+ * Run a single migration.
124
+ */
125
+ private applyMigration;
126
+ /**
127
+ * Run a specific migration by version.
128
+ */
129
+ runMigrationByVersion(version: number): Promise<void>;
130
+ /**
131
+ * Rollback the last applied migration.
132
+ */
133
+ rollbackLast(): Promise<MigrationResult>;
134
+ /**
135
+ * Rollback to a specific version.
136
+ */
137
+ rollbackTo(targetVersion: number): Promise<MigrationResult>;
138
+ /**
139
+ * Get all applied migrations.
140
+ */
141
+ getAppliedMigrations(): Promise<AppliedMigration[]>;
142
+ /**
143
+ * Get pending migrations.
144
+ */
145
+ getPendingMigrations(): Promise<MigrationFile[]>;
146
+ /**
147
+ * Get migration status.
148
+ */
149
+ getStatus(): Promise<{
150
+ currentVersion: number;
151
+ latestVersion: number;
152
+ pending: string[];
153
+ applied: string[];
154
+ }>;
155
+ /**
156
+ * Check if migrations should run based on version change.
157
+ */
158
+ private shouldRunMigrations;
159
+ /**
160
+ * Default app version getter.
161
+ */
162
+ private defaultGetAppVersion;
163
+ /**
164
+ * Calculate checksum of migration content.
165
+ */
166
+ private calculateChecksum;
167
+ /**
168
+ * Log a message if verbose mode is enabled.
169
+ */
170
+ private log;
171
+ /**
172
+ * Get the last migration result.
173
+ */
174
+ getLastResult(): MigrationResult | null;
175
+ }
176
+ /**
177
+ * Create an Auto Migrator.
178
+ *
179
+ * @param adapter - Storage adapter to manage
180
+ * @param config - Migrator configuration
181
+ * @returns AutoMigrator instance
182
+ */
183
+ export declare function createAutoMigrator(adapter: StorageAdapter, config: AutoMigratorConfig): AutoMigrator;
184
+ //# sourceMappingURL=autoMigrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoMigrator.d.ts","sourceRoot":"","sources":["../../../../src/adapters/electron/migration/autoMigrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,478 @@
1
+ /**
2
+ * Auto-Migration System for Electron Apps.
3
+ *
4
+ * Automatically runs database migrations when the application version
5
+ * changes. Tracks applied migrations and supports rollback.
6
+ *
7
+ * ## Features
8
+ * - Version detection via package.json or app.getVersion()
9
+ * - Automatic migration on app update
10
+ * - Migration file discovery and ordering
11
+ * - Rollback support
12
+ * - Transaction-wrapped migrations
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const migrator = new AutoMigrator(adapter, {
17
+ * migrationsPath: path.join(__dirname, 'migrations'),
18
+ * runOnVersionChange: true,
19
+ * });
20
+ *
21
+ * await migrator.initialize();
22
+ * await migrator.runPending();
23
+ * ```
24
+ */
25
+ import fs from 'fs';
26
+ import path from 'path';
27
+ // ============================================================================
28
+ // Default Configuration
29
+ // ============================================================================
30
+ const DEFAULT_CONFIG = {
31
+ runOnVersionChange: true,
32
+ tableName: '_migrations',
33
+ verbose: false,
34
+ };
35
+ // ============================================================================
36
+ // Auto Migrator
37
+ // ============================================================================
38
+ /**
39
+ * Auto Migration Manager.
40
+ *
41
+ * Handles automatic database migrations for Electron applications.
42
+ */
43
+ export class AutoMigrator {
44
+ constructor(adapter, config) {
45
+ this.adapter = adapter;
46
+ this.migrations = [];
47
+ this.isInitialized = false;
48
+ this.lastMigrationResult = null;
49
+ this.config = {
50
+ ...DEFAULT_CONFIG,
51
+ ...config,
52
+ getAppVersion: config.getAppVersion ?? this.defaultGetAppVersion.bind(this),
53
+ };
54
+ }
55
+ // ============================================================================
56
+ // Initialization
57
+ // ============================================================================
58
+ /**
59
+ * Initialize the migration system.
60
+ */
61
+ async initialize() {
62
+ if (this.isInitialized)
63
+ return;
64
+ // Create migrations table
65
+ await this.createMigrationsTable();
66
+ // Load migration files
67
+ this.migrations = await this.loadMigrations();
68
+ // Check for version change and run if configured
69
+ if (this.config.runOnVersionChange) {
70
+ const shouldRun = await this.shouldRunMigrations();
71
+ if (shouldRun) {
72
+ this.log('App version changed, running migrations...');
73
+ await this.runPending();
74
+ }
75
+ }
76
+ this.isInitialized = true;
77
+ this.log(`AutoMigrator initialized with ${this.migrations.length} migrations`);
78
+ }
79
+ /**
80
+ * Create the migrations tracking table.
81
+ */
82
+ async createMigrationsTable() {
83
+ await this.adapter.exec(`
84
+ CREATE TABLE IF NOT EXISTS ${this.config.tableName} (
85
+ version INTEGER PRIMARY KEY,
86
+ name TEXT NOT NULL,
87
+ applied_at INTEGER NOT NULL,
88
+ app_version TEXT NOT NULL,
89
+ checksum TEXT NOT NULL
90
+ )
91
+ `);
92
+ }
93
+ // ============================================================================
94
+ // Migration Discovery
95
+ // ============================================================================
96
+ /**
97
+ * Load all migration files from the migrations directory.
98
+ */
99
+ async loadMigrations() {
100
+ const migrationsPath = this.config.migrationsPath;
101
+ if (!fs.existsSync(migrationsPath)) {
102
+ this.log(`Migrations directory not found: ${migrationsPath}`);
103
+ return [];
104
+ }
105
+ const files = fs.readdirSync(migrationsPath)
106
+ .filter(f => f.endsWith('.sql') || f.endsWith('.js') || f.endsWith('.ts'))
107
+ .sort();
108
+ const migrations = [];
109
+ for (const file of files) {
110
+ const filePath = path.join(migrationsPath, file);
111
+ const migration = await this.parseMigrationFile(filePath);
112
+ if (migration) {
113
+ migrations.push(migration);
114
+ }
115
+ }
116
+ // Sort by version
117
+ migrations.sort((a, b) => a.version - b.version);
118
+ return migrations;
119
+ }
120
+ /**
121
+ * Parse a migration file.
122
+ */
123
+ async parseMigrationFile(filePath) {
124
+ const fileName = path.basename(filePath);
125
+ const ext = path.extname(filePath);
126
+ // Extract version and name from filename (e.g., "001_create_users.sql")
127
+ const match = fileName.match(/^(\d+)[_-](.+)\.(sql|js|ts)$/);
128
+ if (!match) {
129
+ this.log(`Skipping invalid migration filename: ${fileName}`);
130
+ return null;
131
+ }
132
+ const version = parseInt(match[1], 10);
133
+ const name = match[2];
134
+ if (ext === '.sql') {
135
+ return this.parseSqlMigration(filePath, version, name);
136
+ }
137
+ else {
138
+ return this.parseJsMigration(filePath, version, name);
139
+ }
140
+ }
141
+ /**
142
+ * Parse a SQL migration file.
143
+ * Supports UP and DOWN sections separated by `-- DOWN`.
144
+ */
145
+ parseSqlMigration(filePath, version, name) {
146
+ const content = fs.readFileSync(filePath, 'utf-8');
147
+ // Split on -- DOWN marker
148
+ const parts = content.split(/^--\s*DOWN\s*$/im);
149
+ const up = parts[0].trim();
150
+ const down = parts[1]?.trim();
151
+ return { version, name, path: filePath, up, down };
152
+ }
153
+ /**
154
+ * Parse a JS/TS migration file.
155
+ * Expects exports: { up: string, down?: string }
156
+ */
157
+ async parseJsMigration(filePath, version, name) {
158
+ try {
159
+ // Dynamic import for ESM compatibility
160
+ const module = await import(filePath);
161
+ const exports = module.default ?? module;
162
+ if (!exports.up) {
163
+ this.log(`Migration ${name} missing 'up' export`);
164
+ return null;
165
+ }
166
+ return {
167
+ version,
168
+ name,
169
+ path: filePath,
170
+ up: typeof exports.up === 'function' ? await exports.up() : exports.up,
171
+ down: typeof exports.down === 'function' ? await exports.down() : exports.down,
172
+ };
173
+ }
174
+ catch (error) {
175
+ this.log(`Failed to load migration ${name}: ${error}`);
176
+ return null;
177
+ }
178
+ }
179
+ // ============================================================================
180
+ // Migration Execution
181
+ // ============================================================================
182
+ /**
183
+ * Run all pending migrations.
184
+ */
185
+ async runPending() {
186
+ const startTime = Date.now();
187
+ const applied = await this.getAppliedMigrations();
188
+ const appliedVersions = new Set(applied.map(m => m.version));
189
+ const pending = this.migrations.filter(m => !appliedVersions.has(m.version));
190
+ if (pending.length === 0) {
191
+ this.log('No pending migrations');
192
+ return {
193
+ success: true,
194
+ migrationsRun: 0,
195
+ migrationsFailed: 0,
196
+ duration: Date.now() - startTime,
197
+ appliedMigrations: [],
198
+ errors: [],
199
+ };
200
+ }
201
+ const result = {
202
+ success: true,
203
+ migrationsRun: 0,
204
+ migrationsFailed: 0,
205
+ duration: 0,
206
+ appliedMigrations: [],
207
+ errors: [],
208
+ };
209
+ for (const migration of pending) {
210
+ try {
211
+ await this.applyMigration(migration);
212
+ result.migrationsRun++;
213
+ result.appliedMigrations.push(migration.name);
214
+ this.log(`Applied migration: ${migration.name}`);
215
+ }
216
+ catch (error) {
217
+ result.migrationsFailed++;
218
+ result.success = false;
219
+ result.errors.push({
220
+ migration: migration.name,
221
+ error: error instanceof Error ? error.message : String(error),
222
+ });
223
+ this.log(`Failed migration: ${migration.name} - ${error}`);
224
+ break; // Stop on first failure
225
+ }
226
+ }
227
+ result.duration = Date.now() - startTime;
228
+ this.lastMigrationResult = result;
229
+ return result;
230
+ }
231
+ /**
232
+ * Run a single migration.
233
+ */
234
+ async applyMigration(migration) {
235
+ const appVersion = this.config.getAppVersion();
236
+ const checksum = this.calculateChecksum(migration.up);
237
+ // Run in transaction
238
+ await this.adapter.transaction(async (trx) => {
239
+ // Execute the migration SQL
240
+ await trx.exec(migration.up);
241
+ // Record the migration
242
+ await trx.run(`INSERT INTO ${this.config.tableName} (version, name, applied_at, app_version, checksum) VALUES (?, ?, ?, ?, ?)`, [migration.version, migration.name, Date.now(), appVersion, checksum]);
243
+ });
244
+ }
245
+ /**
246
+ * Run a specific migration by version.
247
+ */
248
+ async runMigrationByVersion(version) {
249
+ const migration = this.migrations.find(m => m.version === version);
250
+ if (!migration) {
251
+ throw new Error(`Migration version ${version} not found`);
252
+ }
253
+ await this.applyMigration(migration);
254
+ }
255
+ // ============================================================================
256
+ // Rollback
257
+ // ============================================================================
258
+ /**
259
+ * Rollback the last applied migration.
260
+ */
261
+ async rollbackLast() {
262
+ const startTime = Date.now();
263
+ const applied = await this.getAppliedMigrations();
264
+ if (applied.length === 0) {
265
+ return {
266
+ success: true,
267
+ migrationsRun: 0,
268
+ migrationsFailed: 0,
269
+ duration: Date.now() - startTime,
270
+ appliedMigrations: [],
271
+ errors: [],
272
+ };
273
+ }
274
+ // Get the last applied migration
275
+ const lastApplied = applied[applied.length - 1];
276
+ const migration = this.migrations.find(m => m.version === lastApplied.version);
277
+ if (!migration) {
278
+ throw new Error(`Migration ${lastApplied.version} not found in migration files`);
279
+ }
280
+ if (!migration.down) {
281
+ throw new Error(`Migration ${migration.name} does not have a rollback script`);
282
+ }
283
+ try {
284
+ await this.adapter.transaction(async (trx) => {
285
+ // Execute rollback SQL
286
+ await trx.exec(migration.down);
287
+ // Remove migration record
288
+ await trx.run(`DELETE FROM ${this.config.tableName} WHERE version = ?`, [migration.version]);
289
+ });
290
+ this.log(`Rolled back migration: ${migration.name}`);
291
+ return {
292
+ success: true,
293
+ migrationsRun: 1,
294
+ migrationsFailed: 0,
295
+ duration: Date.now() - startTime,
296
+ appliedMigrations: [migration.name],
297
+ errors: [],
298
+ };
299
+ }
300
+ catch (error) {
301
+ return {
302
+ success: false,
303
+ migrationsRun: 0,
304
+ migrationsFailed: 1,
305
+ duration: Date.now() - startTime,
306
+ appliedMigrations: [],
307
+ errors: [{
308
+ migration: migration.name,
309
+ error: error instanceof Error ? error.message : String(error),
310
+ }],
311
+ };
312
+ }
313
+ }
314
+ /**
315
+ * Rollback to a specific version.
316
+ */
317
+ async rollbackTo(targetVersion) {
318
+ const startTime = Date.now();
319
+ const applied = await this.getAppliedMigrations();
320
+ const toRollback = applied
321
+ .filter(m => m.version > targetVersion)
322
+ .reverse(); // Rollback in reverse order
323
+ const result = {
324
+ success: true,
325
+ migrationsRun: 0,
326
+ migrationsFailed: 0,
327
+ duration: 0,
328
+ appliedMigrations: [],
329
+ errors: [],
330
+ };
331
+ for (const migration of toRollback) {
332
+ const migrationFile = this.migrations.find(m => m.version === migration.version);
333
+ if (!migrationFile?.down) {
334
+ result.migrationsFailed++;
335
+ result.success = false;
336
+ result.errors.push({
337
+ migration: migration.name,
338
+ error: 'No rollback script available',
339
+ });
340
+ break;
341
+ }
342
+ try {
343
+ await this.adapter.transaction(async (trx) => {
344
+ await trx.exec(migrationFile.down);
345
+ await trx.run(`DELETE FROM ${this.config.tableName} WHERE version = ?`, [migration.version]);
346
+ });
347
+ result.migrationsRun++;
348
+ result.appliedMigrations.push(migration.name);
349
+ }
350
+ catch (error) {
351
+ result.migrationsFailed++;
352
+ result.success = false;
353
+ result.errors.push({
354
+ migration: migration.name,
355
+ error: error instanceof Error ? error.message : String(error),
356
+ });
357
+ break;
358
+ }
359
+ }
360
+ result.duration = Date.now() - startTime;
361
+ return result;
362
+ }
363
+ // ============================================================================
364
+ // Status & Query
365
+ // ============================================================================
366
+ /**
367
+ * Get all applied migrations.
368
+ */
369
+ async getAppliedMigrations() {
370
+ const rows = await this.adapter.all(`SELECT * FROM ${this.config.tableName} ORDER BY version ASC`);
371
+ return rows.map(row => ({
372
+ version: row.version,
373
+ name: row.name,
374
+ appliedAt: row.applied_at,
375
+ appVersion: row.app_version,
376
+ checksum: row.checksum,
377
+ }));
378
+ }
379
+ /**
380
+ * Get pending migrations.
381
+ */
382
+ async getPendingMigrations() {
383
+ const applied = await this.getAppliedMigrations();
384
+ const appliedVersions = new Set(applied.map(m => m.version));
385
+ return this.migrations.filter(m => !appliedVersions.has(m.version));
386
+ }
387
+ /**
388
+ * Get migration status.
389
+ */
390
+ async getStatus() {
391
+ const applied = await this.getAppliedMigrations();
392
+ const pending = await this.getPendingMigrations();
393
+ return {
394
+ currentVersion: applied.length > 0 ? applied[applied.length - 1].version : 0,
395
+ latestVersion: this.migrations.length > 0 ? this.migrations[this.migrations.length - 1].version : 0,
396
+ pending: pending.map(m => m.name),
397
+ applied: applied.map(m => m.name),
398
+ };
399
+ }
400
+ /**
401
+ * Check if migrations should run based on version change.
402
+ */
403
+ async shouldRunMigrations() {
404
+ const pending = await this.getPendingMigrations();
405
+ return pending.length > 0;
406
+ }
407
+ // ============================================================================
408
+ // Utilities
409
+ // ============================================================================
410
+ /**
411
+ * Default app version getter.
412
+ */
413
+ defaultGetAppVersion() {
414
+ try {
415
+ // Try Electron first
416
+ const { app } = require('electron');
417
+ if (app?.getVersion) {
418
+ return app.getVersion();
419
+ }
420
+ }
421
+ catch {
422
+ // Not in Electron or electron not available
423
+ }
424
+ try {
425
+ // Fall back to package.json
426
+ const packagePath = path.join(process.cwd(), 'package.json');
427
+ if (fs.existsSync(packagePath)) {
428
+ const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
429
+ return pkg.version ?? '0.0.0';
430
+ }
431
+ }
432
+ catch {
433
+ // Ignore errors
434
+ }
435
+ return '0.0.0';
436
+ }
437
+ /**
438
+ * Calculate checksum of migration content.
439
+ */
440
+ calculateChecksum(content) {
441
+ // Simple hash for verification
442
+ let hash = 0;
443
+ for (let i = 0; i < content.length; i++) {
444
+ const char = content.charCodeAt(i);
445
+ hash = ((hash << 5) - hash) + char;
446
+ hash = hash & hash; // Convert to 32-bit integer
447
+ }
448
+ return hash.toString(16);
449
+ }
450
+ /**
451
+ * Log a message if verbose mode is enabled.
452
+ */
453
+ log(message) {
454
+ if (this.config.verbose) {
455
+ console.log(`[AutoMigrator] ${message}`);
456
+ }
457
+ }
458
+ /**
459
+ * Get the last migration result.
460
+ */
461
+ getLastResult() {
462
+ return this.lastMigrationResult;
463
+ }
464
+ }
465
+ // ============================================================================
466
+ // Factory Function
467
+ // ============================================================================
468
+ /**
469
+ * Create an Auto Migrator.
470
+ *
471
+ * @param adapter - Storage adapter to manage
472
+ * @param config - Migrator configuration
473
+ * @returns AutoMigrator instance
474
+ */
475
+ export function createAutoMigrator(adapter, config) {
476
+ return new AutoMigrator(adapter, config);
477
+ }
478
+ //# sourceMappingURL=autoMigrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoMigrator.js","sourceRoot":"","sources":["../../../../src/adapters/electron/migration/autoMigrator.ts"],"names":[],"mappings":"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"}