You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.8 KiB
59 lines
1.8 KiB
2 years ago
|
// @flow
|
||
|
|
||
|
import { DEFAULT_VERSION } from './constants'
|
||
|
|
||
|
import type { PersistedState, MigrationManifest } from './types'
|
||
|
|
||
|
export default function createMigrate(
|
||
|
migrations: MigrationManifest,
|
||
|
config?: { debug: boolean }
|
||
|
) {
|
||
|
let { debug } = config || {}
|
||
|
return function(
|
||
|
state: PersistedState,
|
||
|
currentVersion: number
|
||
|
): Promise<PersistedState> {
|
||
|
if (!state) {
|
||
|
if (process.env.NODE_ENV !== 'production' && debug)
|
||
|
console.log('redux-persist: no inbound state, skipping migration')
|
||
|
return Promise.resolve(undefined)
|
||
|
}
|
||
|
|
||
|
let inboundVersion: number =
|
||
|
state._persist && state._persist.version !== undefined
|
||
|
? state._persist.version
|
||
|
: DEFAULT_VERSION
|
||
|
if (inboundVersion === currentVersion) {
|
||
|
if (process.env.NODE_ENV !== 'production' && debug)
|
||
|
console.log('redux-persist: versions match, noop migration')
|
||
|
return Promise.resolve(state)
|
||
|
}
|
||
|
if (inboundVersion > currentVersion) {
|
||
|
if (process.env.NODE_ENV !== 'production')
|
||
|
console.error('redux-persist: downgrading version is not supported')
|
||
|
return Promise.resolve(state)
|
||
|
}
|
||
|
|
||
|
let migrationKeys = Object.keys(migrations)
|
||
|
.map(ver => parseInt(ver))
|
||
|
.filter(key => currentVersion >= key && key > inboundVersion)
|
||
|
.sort((a, b) => a - b)
|
||
|
|
||
|
if (process.env.NODE_ENV !== 'production' && debug)
|
||
|
console.log('redux-persist: migrationKeys', migrationKeys)
|
||
|
try {
|
||
|
let migratedState = migrationKeys.reduce((state, 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)
|
||
|
}
|
||
|
}
|
||
|
}
|