@framers/sql-storage-adapter 0.1.0

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/dist/adapters/baseStorageAdapter.d.ts +204 -0
  4. package/dist/adapters/baseStorageAdapter.d.ts.map +1 -0
  5. package/dist/adapters/baseStorageAdapter.js +364 -0
  6. package/dist/adapters/baseStorageAdapter.js.map +1 -0
  7. package/dist/adapters/betterSqliteAdapter.d.ts +64 -0
  8. package/dist/adapters/betterSqliteAdapter.d.ts.map +1 -0
  9. package/dist/adapters/betterSqliteAdapter.js +206 -0
  10. package/dist/adapters/betterSqliteAdapter.js.map +1 -0
  11. package/dist/adapters/capacitorSqliteAdapter.d.ts +33 -0
  12. package/dist/adapters/capacitorSqliteAdapter.d.ts.map +1 -0
  13. package/dist/adapters/capacitorSqliteAdapter.js +95 -0
  14. package/dist/adapters/capacitorSqliteAdapter.js.map +1 -0
  15. package/dist/adapters/postgresAdapter.d.ts +180 -0
  16. package/dist/adapters/postgresAdapter.d.ts.map +1 -0
  17. package/dist/adapters/postgresAdapter.js +271 -0
  18. package/dist/adapters/postgresAdapter.js.map +1 -0
  19. package/dist/adapters/sqlJsAdapter.d.ts +28 -0
  20. package/dist/adapters/sqlJsAdapter.d.ts.map +1 -0
  21. package/dist/adapters/sqlJsAdapter.js +136 -0
  22. package/dist/adapters/sqlJsAdapter.js.map +1 -0
  23. package/dist/adapters/supabase.d.ts +58 -0
  24. package/dist/adapters/supabase.d.ts.map +1 -0
  25. package/dist/adapters/supabase.js +385 -0
  26. package/dist/adapters/supabase.js.map +1 -0
  27. package/dist/database.d.ts +124 -0
  28. package/dist/database.d.ts.map +1 -0
  29. package/dist/database.js +136 -0
  30. package/dist/database.js.map +1 -0
  31. package/dist/index.d.ts +17 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +25 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/resolver.d.ts +24 -0
  36. package/dist/resolver.d.ts.map +1 -0
  37. package/dist/resolver.js +91 -0
  38. package/dist/resolver.js.map +1 -0
  39. package/dist/types/context.d.ts +221 -0
  40. package/dist/types/context.d.ts.map +1 -0
  41. package/dist/types/context.js +9 -0
  42. package/dist/types/context.js.map +1 -0
  43. package/dist/types/events.d.ts +225 -0
  44. package/dist/types/events.d.ts.map +1 -0
  45. package/dist/types/events.js +8 -0
  46. package/dist/types/events.js.map +1 -0
  47. package/dist/types/extensions.d.ts +73 -0
  48. package/dist/types/extensions.d.ts.map +1 -0
  49. package/dist/types/extensions.js +7 -0
  50. package/dist/types/extensions.js.map +1 -0
  51. package/dist/types/limitations.d.ts +46 -0
  52. package/dist/types/limitations.d.ts.map +1 -0
  53. package/dist/types/limitations.js +154 -0
  54. package/dist/types/limitations.js.map +1 -0
  55. package/dist/types.d.ts +235 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +18 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/cloudBackup.d.ts +219 -0
  60. package/dist/utils/cloudBackup.d.ts.map +1 -0
  61. package/dist/utils/cloudBackup.js +289 -0
  62. package/dist/utils/cloudBackup.js.map +1 -0
  63. package/dist/utils/dataExport.d.ts +77 -0
  64. package/dist/utils/dataExport.d.ts.map +1 -0
  65. package/dist/utils/dataExport.js +212 -0
  66. package/dist/utils/dataExport.js.map +1 -0
  67. package/dist/utils/dataImport.d.ts +54 -0
  68. package/dist/utils/dataImport.d.ts.map +1 -0
  69. package/dist/utils/dataImport.js +324 -0
  70. package/dist/utils/dataImport.js.map +1 -0
  71. package/dist/utils/migration.d.ts +89 -0
  72. package/dist/utils/migration.d.ts.map +1 -0
  73. package/dist/utils/migration.js +184 -0
  74. package/dist/utils/migration.js.map +1 -0
  75. package/dist/utils/parameterUtils.d.ts +9 -0
  76. package/dist/utils/parameterUtils.d.ts.map +1 -0
  77. package/dist/utils/parameterUtils.js +17 -0
  78. package/dist/utils/parameterUtils.js.map +1 -0
  79. package/dist/utils/syncManager.d.ts +342 -0
  80. package/dist/utils/syncManager.d.ts.map +1 -0
  81. package/dist/utils/syncManager.js +533 -0
  82. package/dist/utils/syncManager.js.map +1 -0
  83. package/package.json +108 -0
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Data import utilities for cross-adapter migration and restoration.
3
+ * Supports importing from JSON, SQL dumps, and CSV files.
4
+ */
5
+ /**
6
+ * Import data from exported JSON format.
7
+ */
8
+ export async function importData(adapter, data, options = {}) {
9
+ const startTime = Date.now();
10
+ const { dropTables = false, skipSchema = false, skipData = false, batchSize = 100, tables, onConflict = 'error', } = options;
11
+ const errors = [];
12
+ let tablesImported = 0;
13
+ let rowsImported = 0;
14
+ // Determine tables to import from both schema and data
15
+ let tablesToImport;
16
+ if (tables) {
17
+ tablesToImport = tables;
18
+ }
19
+ else {
20
+ const dataTables = Object.keys(data.data);
21
+ const schemaTables = data.schema?.map(s => s.name) || [];
22
+ tablesToImport = Array.from(new Set([...dataTables, ...schemaTables]));
23
+ }
24
+ try {
25
+ // Import schema
26
+ if (!skipSchema && data.schema) {
27
+ for (const tableSchema of data.schema) {
28
+ if (!tablesToImport.includes(tableSchema.name))
29
+ continue;
30
+ try {
31
+ if (dropTables) {
32
+ await adapter.run(`DROP TABLE IF EXISTS ${escapeIdentifier(tableSchema.name)}`);
33
+ }
34
+ await createTable(adapter, tableSchema);
35
+ // Only count if we're not also importing data (to avoid double counting)
36
+ if (skipData) {
37
+ tablesImported++;
38
+ }
39
+ }
40
+ catch (error) {
41
+ const errorMsg = `Schema error for ${tableSchema.name}: ${error.message}`;
42
+ errors.push(errorMsg);
43
+ // If we're in error mode, fail fast
44
+ if (onConflict === 'error') {
45
+ return {
46
+ success: false,
47
+ tablesImported,
48
+ rowsImported,
49
+ errors,
50
+ duration: Date.now() - startTime,
51
+ };
52
+ }
53
+ }
54
+ }
55
+ }
56
+ // Import data
57
+ if (!skipData) {
58
+ for (const [tableName, rows] of Object.entries(data.data)) {
59
+ if (!tablesToImport.includes(tableName))
60
+ continue;
61
+ if (!Array.isArray(rows) || rows.length === 0)
62
+ continue;
63
+ try {
64
+ const imported = await importTableData(adapter, tableName, rows, {
65
+ batchSize,
66
+ onConflict,
67
+ });
68
+ rowsImported += imported;
69
+ tablesImported++;
70
+ }
71
+ catch (error) {
72
+ errors.push(`Data error for ${tableName}: ${error.message}`);
73
+ }
74
+ }
75
+ }
76
+ return {
77
+ success: errors.length === 0,
78
+ tablesImported,
79
+ rowsImported,
80
+ errors: errors.length > 0 ? errors : undefined,
81
+ duration: Date.now() - startTime,
82
+ };
83
+ }
84
+ catch (error) {
85
+ return {
86
+ success: false,
87
+ tablesImported,
88
+ rowsImported,
89
+ errors: [...errors, `Fatal error: ${error.message}`],
90
+ duration: Date.now() - startTime,
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * Import data from JSON string.
96
+ */
97
+ export async function importFromJSON(adapter, jsonString, options = {}) {
98
+ try {
99
+ const data = JSON.parse(jsonString);
100
+ return await importData(adapter, data, options);
101
+ }
102
+ catch (error) {
103
+ return {
104
+ success: false,
105
+ tablesImported: 0,
106
+ rowsImported: 0,
107
+ errors: [`JSON parse error: ${error.message}`],
108
+ duration: 0,
109
+ };
110
+ }
111
+ }
112
+ /**
113
+ * Import data from SQL dump.
114
+ */
115
+ export async function importFromSQL(adapter, sqlDump, options = {}) {
116
+ const startTime = Date.now();
117
+ const errors = [];
118
+ let statementsExecuted = 0;
119
+ try {
120
+ // Remove comments first
121
+ const withoutComments = sqlDump
122
+ .split('\n')
123
+ .filter(line => !line.trim().startsWith('--'))
124
+ .join('\n');
125
+ // Split SQL dump into individual statements
126
+ // Handle both inline and multi-line statements
127
+ const statements = withoutComments
128
+ .split(';')
129
+ .map(s => s.trim())
130
+ .filter(s => s.length > 0);
131
+ for (const statement of statements) {
132
+ try {
133
+ // Skip if filtering by tables
134
+ if (options.tables) {
135
+ const matchesTable = options.tables.some(table => statement.toLowerCase().includes(table.toLowerCase()));
136
+ if (!matchesTable)
137
+ continue;
138
+ }
139
+ // Execute the statement
140
+ await adapter.run(statement);
141
+ statementsExecuted++;
142
+ }
143
+ catch (error) {
144
+ errors.push(`SQL error in statement: ${error.message}`);
145
+ }
146
+ }
147
+ return {
148
+ success: errors.length === 0,
149
+ tablesImported: statementsExecuted,
150
+ rowsImported: 0, // Cannot accurately count from SQL
151
+ errors: errors.length > 0 ? errors : undefined,
152
+ duration: Date.now() - startTime,
153
+ };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ success: false,
158
+ tablesImported: 0,
159
+ rowsImported: 0,
160
+ errors: [...errors, `Fatal error: ${error.message}`],
161
+ duration: Date.now() - startTime,
162
+ };
163
+ }
164
+ }
165
+ /**
166
+ * Import data from CSV.
167
+ */
168
+ export async function importFromCSV(adapter, tableName, csvContent, options = {}) {
169
+ const startTime = Date.now();
170
+ try {
171
+ const rows = parseCSV(csvContent);
172
+ if (rows.length === 0) {
173
+ return {
174
+ success: true,
175
+ tablesImported: 0,
176
+ rowsImported: 0,
177
+ duration: Date.now() - startTime,
178
+ };
179
+ }
180
+ const imported = await importTableData(adapter, tableName, rows, {
181
+ batchSize: options.batchSize || 100,
182
+ onConflict: options.onConflict || 'error',
183
+ });
184
+ return {
185
+ success: true,
186
+ tablesImported: 1,
187
+ rowsImported: imported,
188
+ duration: Date.now() - startTime,
189
+ };
190
+ }
191
+ catch (error) {
192
+ return {
193
+ success: false,
194
+ tablesImported: 0,
195
+ rowsImported: 0,
196
+ errors: [`CSV import error: ${error.message}`],
197
+ duration: Date.now() - startTime,
198
+ };
199
+ }
200
+ }
201
+ /**
202
+ * Migrate data from one adapter to another.
203
+ */
204
+ export async function migrateAdapter(sourceAdapter, targetAdapter, options = {}) {
205
+ const { exportData } = await import('./dataExport.js');
206
+ // Export from source
207
+ const exportedData = await exportData(sourceAdapter, {
208
+ tables: options.tables,
209
+ includeSchema: !options.skipSchema,
210
+ });
211
+ // Import to target
212
+ return await importData(targetAdapter, exportedData, options);
213
+ }
214
+ /**
215
+ * Create table from schema.
216
+ */
217
+ async function createTable(adapter, schema) {
218
+ if (schema.columns.length === 0) {
219
+ throw new Error(`Cannot create table ${schema.name} without column definitions`);
220
+ }
221
+ const columnDefs = schema.columns.map(col => {
222
+ let def = `${escapeIdentifier(col.name)} ${col.type}`;
223
+ if (!col.nullable)
224
+ def += ' NOT NULL';
225
+ if (col.defaultValue)
226
+ def += ` DEFAULT ${col.defaultValue}`;
227
+ return def;
228
+ });
229
+ const createSQL = `CREATE TABLE IF NOT EXISTS ${escapeIdentifier(schema.name)} (
230
+ ${columnDefs.join(',\n ')}
231
+ )`;
232
+ await adapter.run(createSQL);
233
+ }
234
+ /**
235
+ * Import rows into a table.
236
+ */
237
+ async function importTableData(adapter, tableName, rows, options) {
238
+ let imported = 0;
239
+ const { batchSize, onConflict } = options;
240
+ // Process in batches
241
+ for (let i = 0; i < rows.length; i += batchSize) {
242
+ const batch = rows.slice(i, i + batchSize);
243
+ for (const row of batch) {
244
+ const record = row;
245
+ const columns = Object.keys(record);
246
+ const placeholders = columns.map(() => '?');
247
+ let insertSQL = `INSERT `;
248
+ // Handle conflicts (SQLite syntax)
249
+ if (onConflict === 'replace') {
250
+ insertSQL = `INSERT OR REPLACE `;
251
+ }
252
+ else if (onConflict === 'ignore') {
253
+ insertSQL = `INSERT OR IGNORE `;
254
+ }
255
+ insertSQL += `INTO ${escapeIdentifier(tableName)} (${columns.map(escapeIdentifier).join(', ')}) VALUES (${placeholders.join(', ')})`;
256
+ try {
257
+ await adapter.run(insertSQL, columns.map(col => record[col]));
258
+ imported++;
259
+ }
260
+ catch (error) {
261
+ if (onConflict === 'error') {
262
+ throw error;
263
+ }
264
+ // Otherwise silently skip
265
+ }
266
+ }
267
+ }
268
+ return imported;
269
+ }
270
+ /**
271
+ * Parse CSV content into rows.
272
+ */
273
+ function parseCSV(content) {
274
+ const lines = content.split('\n').filter(line => line.trim().length > 0);
275
+ if (lines.length === 0)
276
+ return [];
277
+ const headers = parseCSVLine(lines[0]);
278
+ const rows = [];
279
+ for (let i = 1; i < lines.length; i++) {
280
+ const values = parseCSVLine(lines[i]);
281
+ const row = {};
282
+ headers.forEach((header, idx) => {
283
+ row[header] = values[idx] ?? null;
284
+ });
285
+ rows.push(row);
286
+ }
287
+ return rows;
288
+ }
289
+ /**
290
+ * Parse a single CSV line.
291
+ */
292
+ function parseCSVLine(line) {
293
+ const values = [];
294
+ let current = '';
295
+ let inQuotes = false;
296
+ for (let i = 0; i < line.length; i++) {
297
+ const char = line[i];
298
+ if (char === '"') {
299
+ if (inQuotes && line[i + 1] === '"') {
300
+ current += '"';
301
+ i++;
302
+ }
303
+ else {
304
+ inQuotes = !inQuotes;
305
+ }
306
+ }
307
+ else if (char === ',' && !inQuotes) {
308
+ values.push(current);
309
+ current = '';
310
+ }
311
+ else {
312
+ current += char;
313
+ }
314
+ }
315
+ values.push(current);
316
+ return values;
317
+ }
318
+ /**
319
+ * Escape SQL identifier.
320
+ */
321
+ function escapeIdentifier(identifier) {
322
+ return `"${identifier.replace(/"/g, '""')}"`;
323
+ }
324
+ //# sourceMappingURL=dataImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataImport.js","sourceRoot":"","sources":["../../src/utils/dataImport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * High-level migration utilities for moving data between adapters.
3
+ * Simplifies common migration scenarios like local → Supabase, Supabase → local, etc.
4
+ */
5
+ import type { StorageAdapter } from '../types';
6
+ import { type ImportResult, type DataImportOptions } from './dataImport';
7
+ /**
8
+ * Migration strategy for handling conflicts and errors.
9
+ */
10
+ export interface MigrationStrategy {
11
+ /** Whether to drop existing tables */
12
+ dropExisting?: boolean;
13
+ /** How to handle conflicts during import */
14
+ onConflict?: 'replace' | 'ignore' | 'error';
15
+ /** Whether to verify data after migration */
16
+ verify?: boolean;
17
+ /** Batch size for operations */
18
+ batchSize?: number;
19
+ /** Tables to migrate (all if not specified) */
20
+ tables?: string[];
21
+ }
22
+ /**
23
+ * Migration result with detailed statistics.
24
+ */
25
+ export interface MigrationResult extends ImportResult {
26
+ sourceAdapter: string;
27
+ targetAdapter: string;
28
+ verification?: VerificationResult;
29
+ }
30
+ /**
31
+ * Verification result after migration.
32
+ */
33
+ export interface VerificationResult {
34
+ passed: boolean;
35
+ tableCounts: Record<string, {
36
+ source: number;
37
+ target: number;
38
+ match: boolean;
39
+ }>;
40
+ errors?: string[];
41
+ }
42
+ /**
43
+ * Migrate from Better-SQLite3 (local) to Supabase.
44
+ */
45
+ export declare function migrateLocalToSupabase(localAdapter: StorageAdapter, supabaseAdapter: StorageAdapter, strategy?: MigrationStrategy): Promise<MigrationResult>;
46
+ /**
47
+ * Migrate from Supabase to Better-SQLite3 (local).
48
+ */
49
+ export declare function migrateSupabaseToLocal(supabaseAdapter: StorageAdapter, localAdapter: StorageAdapter, strategy?: MigrationStrategy): Promise<MigrationResult>;
50
+ /**
51
+ * Migrate from Supabase to PostgreSQL.
52
+ */
53
+ export declare function migrateSupabaseToPostgres(supabaseAdapter: StorageAdapter, postgresAdapter: StorageAdapter, strategy?: MigrationStrategy): Promise<MigrationResult>;
54
+ /**
55
+ * Migrate from SQL.js (browser) to Capacitor SQLite (mobile).
56
+ */
57
+ export declare function migrateBrowserToMobile(sqlJsAdapter: StorageAdapter, capacitorAdapter: StorageAdapter, strategy?: MigrationStrategy): Promise<MigrationResult>;
58
+ /**
59
+ * Generic migration between any two adapters.
60
+ */
61
+ export declare function migrateAdapters(sourceAdapter: StorageAdapter, targetAdapter: StorageAdapter, strategy?: MigrationStrategy): Promise<MigrationResult>;
62
+ /**
63
+ * Create a backup of an adapter to JSON file.
64
+ */
65
+ export declare function createBackup(adapter: StorageAdapter, options?: {
66
+ tables?: string[];
67
+ pretty?: boolean;
68
+ }): Promise<string>;
69
+ /**
70
+ * Restore from a backup JSON string.
71
+ */
72
+ export declare function restoreFromBackup(adapter: StorageAdapter, backupJSON: string, options?: DataImportOptions): Promise<ImportResult>;
73
+ /**
74
+ * Clone an adapter's data to another adapter.
75
+ */
76
+ export declare function cloneAdapter(sourceAdapter: StorageAdapter, targetAdapter: StorageAdapter, options?: MigrationStrategy): Promise<MigrationResult>;
77
+ /**
78
+ * Sync data between two adapters (bidirectional).
79
+ * NOTE: This is a simple implementation - for production use, implement proper conflict resolution.
80
+ */
81
+ export declare function syncAdapters(adapter1: StorageAdapter, adapter2: StorageAdapter, strategy?: MigrationStrategy): Promise<{
82
+ toAdapter2: MigrationResult;
83
+ toAdapter1: MigrationResult;
84
+ }>;
85
+ /**
86
+ * Get migration summary for display.
87
+ */
88
+ export declare function formatMigrationResult(result: MigrationResult): string;
89
+ //# sourceMappingURL=migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * High-level migration utilities for moving data between adapters.
3
+ * Simplifies common migration scenarios like local → Supabase, Supabase → local, etc.
4
+ */
5
+ import { exportData, exportAsJSON } from './dataExport';
6
+ import { migrateAdapter } from './dataImport';
7
+ /**
8
+ * Migrate from Better-SQLite3 (local) to Supabase.
9
+ */
10
+ export async function migrateLocalToSupabase(localAdapter, supabaseAdapter, strategy = {}) {
11
+ return await executeMigration(localAdapter, supabaseAdapter, 'better-sqlite3', 'supabase', strategy);
12
+ }
13
+ /**
14
+ * Migrate from Supabase to Better-SQLite3 (local).
15
+ */
16
+ export async function migrateSupabaseToLocal(supabaseAdapter, localAdapter, strategy = {}) {
17
+ return await executeMigration(supabaseAdapter, localAdapter, 'supabase', 'better-sqlite3', strategy);
18
+ }
19
+ /**
20
+ * Migrate from Supabase to PostgreSQL.
21
+ */
22
+ export async function migrateSupabaseToPostgres(supabaseAdapter, postgresAdapter, strategy = {}) {
23
+ return await executeMigration(supabaseAdapter, postgresAdapter, 'supabase', 'postgres', strategy);
24
+ }
25
+ /**
26
+ * Migrate from SQL.js (browser) to Capacitor SQLite (mobile).
27
+ */
28
+ export async function migrateBrowserToMobile(sqlJsAdapter, capacitorAdapter, strategy = {}) {
29
+ return await executeMigration(sqlJsAdapter, capacitorAdapter, 'sql.js', 'capacitor-sqlite', strategy);
30
+ }
31
+ /**
32
+ * Generic migration between any two adapters.
33
+ */
34
+ export async function migrateAdapters(sourceAdapter, targetAdapter, strategy = {}) {
35
+ return await executeMigration(sourceAdapter, targetAdapter, 'unknown', 'unknown', strategy);
36
+ }
37
+ /**
38
+ * Execute migration with strategy.
39
+ */
40
+ async function executeMigration(sourceAdapter, targetAdapter, sourceName, targetName, strategy) {
41
+ const importOptions = {
42
+ dropTables: strategy.dropExisting,
43
+ onConflict: strategy.onConflict,
44
+ batchSize: strategy.batchSize,
45
+ tables: strategy.tables,
46
+ };
47
+ const result = await migrateAdapter(sourceAdapter, targetAdapter, importOptions);
48
+ const migrationResult = {
49
+ ...result,
50
+ sourceAdapter: sourceName,
51
+ targetAdapter: targetName,
52
+ };
53
+ // Verify migration if requested
54
+ if (strategy.verify && result.success) {
55
+ migrationResult.verification = await verifyMigration(sourceAdapter, targetAdapter, strategy.tables);
56
+ }
57
+ return migrationResult;
58
+ }
59
+ /**
60
+ * Verify migration by comparing row counts.
61
+ */
62
+ async function verifyMigration(sourceAdapter, targetAdapter, tables) {
63
+ const errors = [];
64
+ const tableCounts = {};
65
+ try {
66
+ // Get list of tables
67
+ const sourceData = await exportData(sourceAdapter, { tables, includeSchema: false });
68
+ const targetData = await exportData(targetAdapter, { tables, includeSchema: false });
69
+ // Compare counts for each table
70
+ for (const tableName of Object.keys(sourceData.data)) {
71
+ const sourceCount = sourceData.data[tableName]?.length || 0;
72
+ const targetCount = targetData.data[tableName]?.length || 0;
73
+ const match = sourceCount === targetCount;
74
+ tableCounts[tableName] = {
75
+ source: sourceCount,
76
+ target: targetCount,
77
+ match,
78
+ };
79
+ if (!match) {
80
+ errors.push(`Table ${tableName}: source has ${sourceCount} rows, target has ${targetCount} rows`);
81
+ }
82
+ }
83
+ // Check for missing tables in target
84
+ for (const tableName of Object.keys(targetData.data)) {
85
+ if (!sourceData.data[tableName]) {
86
+ errors.push(`Table ${tableName} exists in target but not in source`);
87
+ }
88
+ }
89
+ return {
90
+ passed: errors.length === 0,
91
+ tableCounts,
92
+ errors: errors.length > 0 ? errors : undefined,
93
+ };
94
+ }
95
+ catch (error) {
96
+ return {
97
+ passed: false,
98
+ tableCounts,
99
+ errors: [`Verification failed: ${error.message}`],
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Create a backup of an adapter to JSON file.
105
+ */
106
+ export async function createBackup(adapter, options = {}) {
107
+ return await exportAsJSON(adapter, {
108
+ tables: options.tables,
109
+ includeSchema: true,
110
+ pretty: options.pretty ?? true,
111
+ });
112
+ }
113
+ /**
114
+ * Restore from a backup JSON string.
115
+ */
116
+ export async function restoreFromBackup(adapter, backupJSON, options = {}) {
117
+ const { importFromJSON } = await import('./dataImport.js');
118
+ return await importFromJSON(adapter, backupJSON, options);
119
+ }
120
+ /**
121
+ * Clone an adapter's data to another adapter.
122
+ */
123
+ export async function cloneAdapter(sourceAdapter, targetAdapter, options = {}) {
124
+ return await migrateAdapters(sourceAdapter, targetAdapter, {
125
+ ...options,
126
+ verify: options.verify ?? true,
127
+ });
128
+ }
129
+ /**
130
+ * Sync data between two adapters (bidirectional).
131
+ * NOTE: This is a simple implementation - for production use, implement proper conflict resolution.
132
+ */
133
+ export async function syncAdapters(adapter1, adapter2, strategy = {}) {
134
+ // Export data from both adapters (unused currently, but kept for future bidirectional sync)
135
+ // const data1 = await exportData(adapter1, { tables: strategy.tables });
136
+ // const data2 = await exportData(adapter2, { tables: strategy.tables });
137
+ // Find differences and sync
138
+ const toAdapter2 = await migrateAdapters(adapter1, adapter2, {
139
+ ...strategy,
140
+ onConflict: 'replace',
141
+ });
142
+ const toAdapter1 = await migrateAdapters(adapter2, adapter1, {
143
+ ...strategy,
144
+ onConflict: 'replace',
145
+ });
146
+ return { toAdapter2, toAdapter1 };
147
+ }
148
+ /**
149
+ * Get migration summary for display.
150
+ */
151
+ export function formatMigrationResult(result) {
152
+ const lines = [];
153
+ lines.push('='.repeat(60));
154
+ lines.push('Migration Result');
155
+ lines.push('='.repeat(60));
156
+ lines.push(`Source: ${result.sourceAdapter}`);
157
+ lines.push(`Target: ${result.targetAdapter}`);
158
+ lines.push(`Status: ${result.success ? '✅ SUCCESS' : '❌ FAILED'}`);
159
+ lines.push(`Duration: ${result.duration}ms`);
160
+ lines.push(`Tables: ${result.tablesImported}`);
161
+ lines.push(`Rows: ${result.rowsImported}`);
162
+ if (result.errors && result.errors.length > 0) {
163
+ lines.push('\nErrors:');
164
+ result.errors.forEach(err => lines.push(` ❌ ${err}`));
165
+ }
166
+ if (result.verification) {
167
+ lines.push('\nVerification:');
168
+ lines.push(`Status: ${result.verification.passed ? '✅ PASSED' : '❌ FAILED'}`);
169
+ if (Object.keys(result.verification.tableCounts).length > 0) {
170
+ lines.push('\nTable Counts:');
171
+ for (const [table, counts] of Object.entries(result.verification.tableCounts)) {
172
+ const status = counts.match ? '✅' : '❌';
173
+ lines.push(` ${status} ${table}: source=${counts.source}, target=${counts.target}`);
174
+ }
175
+ }
176
+ if (result.verification.errors && result.verification.errors.length > 0) {
177
+ lines.push('\nVerification Errors:');
178
+ result.verification.errors.forEach(err => lines.push(` ❌ ${err}`));
179
+ }
180
+ }
181
+ lines.push('='.repeat(60));
182
+ return lines.join('\n');
183
+ }
184
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { StorageParameters } from '../types';
2
+ /**
3
+ * Normalises parameter payloads into a tuple of named/object parameters and positional arrays.
4
+ */
5
+ export declare const normaliseParameters: (parameters?: StorageParameters) => {
6
+ named?: Record<string, unknown>;
7
+ positional?: Array<unknown>;
8
+ };
9
+ //# sourceMappingURL=parameterUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/parameterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,iBAAiB,KAC7B;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;CAehE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Normalises parameter payloads into a tuple of named/object parameters and positional arrays.
3
+ */
4
+ export const normaliseParameters = (parameters) => {
5
+ if (parameters == null) {
6
+ return {};
7
+ }
8
+ if (Array.isArray(parameters)) {
9
+ return { positional: parameters };
10
+ }
11
+ if (typeof parameters === 'object') {
12
+ return { named: parameters };
13
+ }
14
+ // Fall back to positional when unknown primitive is provided.
15
+ return { positional: [parameters] };
16
+ };
17
+ //# sourceMappingURL=parameterUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterUtils.js","sourceRoot":"","sources":["../../src/utils/parameterUtils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAA8B,EACoC,EAAE;IACpE,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,UAAqC,EAAE,CAAC;IAC1D,CAAC;IAED,8DAA8D;IAC9D,OAAO,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;AACtC,CAAC,CAAC"}