@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.
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/dist/adapters/baseStorageAdapter.d.ts +204 -0
- package/dist/adapters/baseStorageAdapter.d.ts.map +1 -0
- package/dist/adapters/baseStorageAdapter.js +364 -0
- package/dist/adapters/baseStorageAdapter.js.map +1 -0
- package/dist/adapters/betterSqliteAdapter.d.ts +64 -0
- package/dist/adapters/betterSqliteAdapter.d.ts.map +1 -0
- package/dist/adapters/betterSqliteAdapter.js +206 -0
- package/dist/adapters/betterSqliteAdapter.js.map +1 -0
- package/dist/adapters/capacitorSqliteAdapter.d.ts +33 -0
- package/dist/adapters/capacitorSqliteAdapter.d.ts.map +1 -0
- package/dist/adapters/capacitorSqliteAdapter.js +95 -0
- package/dist/adapters/capacitorSqliteAdapter.js.map +1 -0
- package/dist/adapters/postgresAdapter.d.ts +180 -0
- package/dist/adapters/postgresAdapter.d.ts.map +1 -0
- package/dist/adapters/postgresAdapter.js +271 -0
- package/dist/adapters/postgresAdapter.js.map +1 -0
- package/dist/adapters/sqlJsAdapter.d.ts +28 -0
- package/dist/adapters/sqlJsAdapter.d.ts.map +1 -0
- package/dist/adapters/sqlJsAdapter.js +136 -0
- package/dist/adapters/sqlJsAdapter.js.map +1 -0
- package/dist/adapters/supabase.d.ts +58 -0
- package/dist/adapters/supabase.d.ts.map +1 -0
- package/dist/adapters/supabase.js +385 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/database.d.ts +124 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +136 -0
- package/dist/database.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/resolver.d.ts +24 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +91 -0
- package/dist/resolver.js.map +1 -0
- package/dist/types/context.d.ts +221 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +9 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/events.d.ts +225 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +8 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/extensions.d.ts +73 -0
- package/dist/types/extensions.d.ts.map +1 -0
- package/dist/types/extensions.js +7 -0
- package/dist/types/extensions.js.map +1 -0
- package/dist/types/limitations.d.ts +46 -0
- package/dist/types/limitations.d.ts.map +1 -0
- package/dist/types/limitations.js +154 -0
- package/dist/types/limitations.js.map +1 -0
- package/dist/types.d.ts +235 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cloudBackup.d.ts +219 -0
- package/dist/utils/cloudBackup.d.ts.map +1 -0
- package/dist/utils/cloudBackup.js +289 -0
- package/dist/utils/cloudBackup.js.map +1 -0
- package/dist/utils/dataExport.d.ts +77 -0
- package/dist/utils/dataExport.d.ts.map +1 -0
- package/dist/utils/dataExport.js +212 -0
- package/dist/utils/dataExport.js.map +1 -0
- package/dist/utils/dataImport.d.ts +54 -0
- package/dist/utils/dataImport.d.ts.map +1 -0
- package/dist/utils/dataImport.js +324 -0
- package/dist/utils/dataImport.js.map +1 -0
- package/dist/utils/migration.d.ts +89 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +184 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/parameterUtils.d.ts +9 -0
- package/dist/utils/parameterUtils.d.ts.map +1 -0
- package/dist/utils/parameterUtils.js +17 -0
- package/dist/utils/parameterUtils.js.map +1 -0
- package/dist/utils/syncManager.d.ts +342 -0
- package/dist/utils/syncManager.d.ts.map +1 -0
- package/dist/utils/syncManager.js +533 -0
- package/dist/utils/syncManager.js.map +1 -0
- 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"}
|