@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.
- package/README.md +94 -2
- package/dist/adapters/electron/electronMainAdapter.d.ts +241 -0
- package/dist/adapters/electron/electronMainAdapter.d.ts.map +1 -0
- package/dist/adapters/electron/electronMainAdapter.js +442 -0
- package/dist/adapters/electron/electronMainAdapter.js.map +1 -0
- package/dist/adapters/electron/electronRendererAdapter.d.ts +177 -0
- package/dist/adapters/electron/electronRendererAdapter.d.ts.map +1 -0
- package/dist/adapters/electron/electronRendererAdapter.js +339 -0
- package/dist/adapters/electron/electronRendererAdapter.js.map +1 -0
- package/dist/adapters/electron/index.d.ts +74 -0
- package/dist/adapters/electron/index.d.ts.map +1 -0
- package/dist/adapters/electron/index.js +96 -0
- package/dist/adapters/electron/index.js.map +1 -0
- package/dist/adapters/electron/ipc/channels.d.ts +196 -0
- package/dist/adapters/electron/ipc/channels.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/channels.js +121 -0
- package/dist/adapters/electron/ipc/channels.js.map +1 -0
- package/dist/adapters/electron/ipc/index.d.ts +11 -0
- package/dist/adapters/electron/ipc/index.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/index.js +11 -0
- package/dist/adapters/electron/ipc/index.js.map +1 -0
- package/dist/adapters/electron/ipc/protocol.d.ts +78 -0
- package/dist/adapters/electron/ipc/protocol.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/protocol.js +347 -0
- package/dist/adapters/electron/ipc/protocol.js.map +1 -0
- package/dist/adapters/electron/ipc/types.d.ts +248 -0
- package/dist/adapters/electron/ipc/types.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/types.js +8 -0
- package/dist/adapters/electron/ipc/types.js.map +1 -0
- package/dist/adapters/electron/migration/autoMigrator.d.ts +184 -0
- package/dist/adapters/electron/migration/autoMigrator.d.ts.map +1 -0
- package/dist/adapters/electron/migration/autoMigrator.js +478 -0
- package/dist/adapters/electron/migration/autoMigrator.js.map +1 -0
- package/dist/adapters/electron/migration/index.d.ts +9 -0
- package/dist/adapters/electron/migration/index.d.ts.map +1 -0
- package/dist/adapters/electron/migration/index.js +9 -0
- package/dist/adapters/electron/migration/index.js.map +1 -0
- package/dist/adapters/electron/preload.d.ts +126 -0
- package/dist/adapters/electron/preload.d.ts.map +1 -0
- package/dist/adapters/electron/preload.js +254 -0
- package/dist/adapters/electron/preload.js.map +1 -0
- package/dist/adapters/electron/recovery/corruptionDetector.d.ts +214 -0
- package/dist/adapters/electron/recovery/corruptionDetector.d.ts.map +1 -0
- package/dist/adapters/electron/recovery/corruptionDetector.js +410 -0
- package/dist/adapters/electron/recovery/corruptionDetector.js.map +1 -0
- package/dist/adapters/electron/recovery/index.d.ts +11 -0
- package/dist/adapters/electron/recovery/index.d.ts.map +1 -0
- package/dist/adapters/electron/recovery/index.js +11 -0
- package/dist/adapters/electron/recovery/index.js.map +1 -0
- package/dist/adapters/electron/recovery/walCheckpoint.d.ts +186 -0
- package/dist/adapters/electron/recovery/walCheckpoint.d.ts.map +1 -0
- package/dist/adapters/electron/recovery/walCheckpoint.js +302 -0
- package/dist/adapters/electron/recovery/walCheckpoint.js.map +1 -0
- package/dist/adapters/electron/window/index.d.ts +9 -0
- package/dist/adapters/electron/window/index.d.ts.map +1 -0
- package/dist/adapters/electron/window/index.js +9 -0
- package/dist/adapters/electron/window/index.js.map +1 -0
- package/dist/adapters/electron/window/windowManager.d.ts +190 -0
- package/dist/adapters/electron/window/windowManager.d.ts.map +1 -0
- package/dist/adapters/electron/window/windowManager.js +358 -0
- package/dist/adapters/electron/window/windowManager.js.map +1 -0
- package/dist/core/contracts/context.d.ts +2 -2
- package/dist/core/contracts/context.d.ts.map +1 -1
- package/dist/core/database.d.ts +19 -0
- package/dist/core/database.d.ts.map +1 -1
- package/dist/core/database.js +4 -0
- package/dist/core/database.js.map +1 -1
- package/dist/core/resolver.d.ts +3 -0
- package/dist/core/resolver.d.ts.map +1 -1
- package/dist/core/resolver.js +39 -3
- package/dist/core/resolver.js.map +1 -1
- package/dist/features/sync/conflicts/conflictResolver.d.ts +222 -0
- package/dist/features/sync/conflicts/conflictResolver.d.ts.map +1 -0
- package/dist/features/sync/conflicts/conflictResolver.js +396 -0
- package/dist/features/sync/conflicts/conflictResolver.js.map +1 -0
- package/dist/features/sync/conflicts/index.d.ts +9 -0
- package/dist/features/sync/conflicts/index.d.ts.map +1 -0
- package/dist/features/sync/conflicts/index.js +9 -0
- package/dist/features/sync/conflicts/index.js.map +1 -0
- package/dist/features/sync/crossPlatformSync.d.ts +281 -0
- package/dist/features/sync/crossPlatformSync.d.ts.map +1 -0
- package/dist/features/sync/crossPlatformSync.js +623 -0
- package/dist/features/sync/crossPlatformSync.js.map +1 -0
- package/dist/features/sync/devices/deviceManager.d.ts +243 -0
- package/dist/features/sync/devices/deviceManager.d.ts.map +1 -0
- package/dist/features/sync/devices/deviceManager.js +494 -0
- package/dist/features/sync/devices/deviceManager.js.map +1 -0
- package/dist/features/sync/devices/index.d.ts +10 -0
- package/dist/features/sync/devices/index.d.ts.map +1 -0
- package/dist/features/sync/devices/index.js +10 -0
- package/dist/features/sync/devices/index.js.map +1 -0
- package/dist/features/sync/index.d.ts +37 -0
- package/dist/features/sync/index.d.ts.map +1 -0
- package/dist/features/sync/index.js +47 -0
- package/dist/features/sync/index.js.map +1 -0
- package/dist/features/sync/protocol/index.d.ts +11 -0
- package/dist/features/sync/protocol/index.d.ts.map +1 -0
- package/dist/features/sync/protocol/index.js +11 -0
- package/dist/features/sync/protocol/index.js.map +1 -0
- package/dist/features/sync/protocol/messages.d.ts +348 -0
- package/dist/features/sync/protocol/messages.d.ts.map +1 -0
- package/dist/features/sync/protocol/messages.js +216 -0
- package/dist/features/sync/protocol/messages.js.map +1 -0
- package/dist/features/sync/protocol/vectorClock.d.ts +164 -0
- package/dist/features/sync/protocol/vectorClock.d.ts.map +1 -0
- package/dist/features/sync/protocol/vectorClock.js +286 -0
- package/dist/features/sync/protocol/vectorClock.js.map +1 -0
- package/dist/features/sync/tables/index.d.ts +10 -0
- package/dist/features/sync/tables/index.d.ts.map +1 -0
- package/dist/features/sync/tables/index.js +10 -0
- package/dist/features/sync/tables/index.js.map +1 -0
- package/dist/features/sync/tables/syncLogManager.d.ts +216 -0
- package/dist/features/sync/tables/syncLogManager.d.ts.map +1 -0
- package/dist/features/sync/tables/syncLogManager.js +456 -0
- package/dist/features/sync/tables/syncLogManager.js.map +1 -0
- package/dist/features/sync/transport/httpTransport.d.ts +123 -0
- package/dist/features/sync/transport/httpTransport.d.ts.map +1 -0
- package/dist/features/sync/transport/httpTransport.js +380 -0
- package/dist/features/sync/transport/httpTransport.js.map +1 -0
- package/dist/features/sync/transport/index.d.ts +12 -0
- package/dist/features/sync/transport/index.d.ts.map +1 -0
- package/dist/features/sync/transport/index.js +12 -0
- package/dist/features/sync/transport/index.js.map +1 -0
- package/dist/features/sync/transport/transport.d.ts +259 -0
- package/dist/features/sync/transport/transport.d.ts.map +1 -0
- package/dist/features/sync/transport/transport.js +153 -0
- package/dist/features/sync/transport/transport.js.map +1 -0
- package/dist/features/sync/transport/websocketTransport.d.ts +126 -0
- package/dist/features/sync/transport/websocketTransport.d.ts.map +1 -0
- package/dist/features/sync/transport/websocketTransport.js +374 -0
- package/dist/features/sync/transport/websocketTransport.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- 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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"}
|