diff --git a/addons/dexie-export-import/src/export.ts b/addons/dexie-export-import/src/export.ts index 3dfcdfbe2..de89bac81 100644 --- a/addons/dexie-export-import/src/export.ts +++ b/addons/dexie-export-import/src/export.ts @@ -9,6 +9,7 @@ export interface ExportOptions { numRowsPerChunk?: number; prettyJson?: boolean; filter?: (table: string, value: any, key?: any) => boolean; + transform?: (table: string, value: any, key?: any) => ({value: any, key?: any}); progressCallback?: (progress: ExportProgress) => boolean; } @@ -76,6 +77,7 @@ export async function exportDB(db: Dexie, options?: ExportOptions): Promise filter(tableName, value)) : values; - const tsonValues = filteredValues.map(value => TSON.encapsulate(value)); + const transformedValues = transform ? + filteredValues.map(value => transform(tableName, value).value) : + filteredValues; + + const tsonValues = transformedValues.map(value => TSON.encapsulate(value)); if (TSON.mustFinalize()) { await Dexie.waitFor(TSON.finalize(tsonValues)); } @@ -149,7 +155,7 @@ export async function exportDB(db: Dexie, options?: ExportOptions): Promise 0 ? Dexie.getByKeyPath(values[values.length -1], primKey.keyPath as string) : null; @@ -157,6 +163,10 @@ export async function exportDB(db: Dexie, options?: ExportOptions): Promise [key, values[i]]); if (filter) keyvals = keyvals.filter(([key, value]) => filter(tableName, value, key)); + if (transform) keyvals = keyvals.map(([key, value]) => { + const transformResult = transform(tableName, value, key); + return [transformResult.key, transformResult.value]; + }); const tsonTuples = keyvals.map(tuple => TSON.encapsulate(tuple)); if (TSON.mustFinalize()) { diff --git a/addons/dexie-export-import/src/import.ts b/addons/dexie-export-import/src/import.ts index 10007c9d7..385e6b074 100644 --- a/addons/dexie-export-import/src/import.ts +++ b/addons/dexie-export-import/src/import.ts @@ -8,6 +8,7 @@ export interface StaticImportOptions { noTransaction?: boolean; chunkSizeBytes?: number; // Default: DEFAULT_KILOBYTES_PER_CHUNK ( 1MB ) filter?: (table: string, value: any, key?: any) => boolean; + transform?: (table: string, value: any, key?: any) => ({value: any, key?: any}); progressCallback?: (progress: ImportProgress) => boolean; } @@ -21,6 +22,7 @@ export interface ImportOptions extends StaticImportOptions { noTransaction?: boolean; chunkSizeBytes?: number; // Default: DEFAULT_KILOBYTES_PER_CHUNK ( 1MB ) filter?: (table: string, value: any, key?: any) => boolean; + transform?: (table: string, value: any, key?: any) => ({value: any, key?: any}); progressCallback?: (progress: ImportProgress) => boolean; } @@ -138,11 +140,21 @@ export async function importInto(db: Dexie, exportedData: Blob | JsonStream filter(tableName, value)) : rows.filter(([key, value]) => filter(tableName, value, key)) : rows; + if (transform) { + filteredRows = filteredRows.map(tableExport.inbound ? + value => transform(tableName, value).value : + ([key, value]) => { + const res = transform(tableName, value, key) + return [res.key, res.value]; + }); + } const [keys, values] = tableExport.inbound ? [undefined, filteredRows] : [filteredRows.map(row=>row[0]), rows.map(row=>row[1])];