From 4763343b6bdc65ae1ab2d7c449d6da8fa4ce2618 Mon Sep 17 00:00:00 2001 From: qkudev Date: Sun, 22 Jan 2023 12:55:15 +0100 Subject: [PATCH 1/3] feat: async migrations --- src/createMigrate.ts | 24 +++++++++--------------- src/types.ts | 4 +++- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/createMigrate.ts b/src/createMigrate.ts index 78dcce05..7354b5d8 100644 --- a/src/createMigrate.ts +++ b/src/createMigrate.ts @@ -8,14 +8,14 @@ export default function createMigrate( config?: { debug: boolean } ): (state: PersistedState, currentVersion: number) => Promise { const { debug } = config || {} - return function( + return async function ( state: PersistedState, currentVersion: number ): Promise { if (!state) { if (process.env.NODE_ENV !== 'production' && debug) console.log('redux-persist: no inbound state, skipping migration') - return Promise.resolve(undefined) + return undefined } const inboundVersion: number = @@ -25,7 +25,7 @@ export default function createMigrate( if (inboundVersion === currentVersion) { if (process.env.NODE_ENV !== 'production' && debug) console.log('redux-persist: versions match, noop migration') - return Promise.resolve(state) + return state } if (inboundVersion > currentVersion) { if (process.env.NODE_ENV !== 'production') @@ -40,18 +40,12 @@ export default function createMigrate( if (process.env.NODE_ENV !== 'production' && debug) console.log('redux-persist: migrationKeys', migrationKeys) - try { - const migratedState: any = migrationKeys.reduce((state: any, versionKey) => { - if (process.env.NODE_ENV !== 'production' && debug) - console.log( - 'redux-persist: running migration for versionKey', - versionKey - ) - return migrations[versionKey](state) - }, state) - return Promise.resolve(migratedState) - } catch (err) { - return Promise.reject(err) + let migratedState: any = state + + for (const versionKey of migrationKeys) { + migratedState = await migrations[versionKey](migratedState) } + + return migratedState } } diff --git a/src/types.ts b/src/types.ts index 8e83b67e..73237c51 100644 --- a/src/types.ts +++ b/src/types.ts @@ -84,7 +84,9 @@ export interface WebStorage extends Storage { } export interface MigrationManifest { - [key: string]: (state: PersistedState) => PersistedState; + [key: string]: + | ((state: PersistedState) => PersistedState) + | ((state: PersistedState) => Promise) } /** From 35707ebf7d54f2a9de91c428671b93ce12ccc982 Mon Sep 17 00:00:00 2001 From: qkudev Date: Sun, 22 Jan 2023 12:58:48 +0100 Subject: [PATCH 2/3] feat: async migrations. debug logging --- src/createMigrate.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/createMigrate.ts b/src/createMigrate.ts index 7354b5d8..9ca36226 100644 --- a/src/createMigrate.ts +++ b/src/createMigrate.ts @@ -43,6 +43,11 @@ export default function createMigrate( let migratedState: any = state for (const versionKey of migrationKeys) { + if (process.env.NODE_ENV !== 'production' && debug) + console.log( + 'redux-persist: running migration for versionKey', + versionKey + ) migratedState = await migrations[versionKey](migratedState) } From b5207c993f6cc6bb0518054c751b09f8796fa94e Mon Sep 17 00:00:00 2001 From: qkudev Date: Mon, 23 Jan 2023 09:46:42 +0100 Subject: [PATCH 3/3] feature: async migrations. docs --- docs/migrations.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/migrations.md b/docs/migrations.md index 83f5415d..97a8be99 100644 --- a/docs/migrations.md +++ b/docs/migrations.md @@ -13,7 +13,8 @@ const migrations = { device: undefined } }, - 1: (state) => { + // Async functions are allowed + 1: async (state) => { // migration to keep only device state return { device: state.device