Awesome
redux-storage-decorator-migrate
Migrate decorator for redux-storage to version the storage with migration
Installation
npm install --save redux-storage-decorator-migrate
Usage
Versioned storage with migrations.
import migrate from 'redux-storage-decorator-migrate'
engine = migrate(engine, 3);
engine.addMigration(1, (state) => { /* migration step for 1 */ return state; });
engine.addMigration(2, (state) => { /* migration step for 2 */ return state; });
engine.addMigration(3, (state) => { /* migration step for 3 */ return state; });
Usage with redux-storage-decorator-filter
and other decorators
import * as storage from 'redux-storage'
import createEngine from 'redux-storage-engine-localstorage'
import filter from 'redux-storage-decorator-filter'
import debounce from 'redux-storage-decorator-debounce'
import migrate from 'redux-storage-decorator-migrate'
const reducer = storage.reducer(reducers)
const stateVersionProp = '_stateVersion'
const whitelist = [stateVersionProp] // <-- Don't forget to whitelist your state version property
const blacklist = []
const engine = migrate(
debounce(
filter(
createEngine('your.storage.identifier'),
whitelist,
blacklist
), 1000
), 0
)
// Your first migration:
engine.addMigration(1, (state) => { /* migration step for 1 */ return state; });
Testing migrations without a store (applying against ad-hoc state)
import {buildMigrationEngine} from 'redux-storage-decorator-migrate'
const versionKey = 'redux-storage-decorators-migrate-version'
const someTestState = {
[versionKey]: 0,
myFancyStateProperty: 'A'
}
const someExampleMigration = {
version: 1,
migration: (state) => ({...state, myFancyStateProperty: 'B'})
}
const migrationEngine = buildMigrationEngine(1, versionKey, [someExampleMigration])
const migratedState = migrationEngine(someTestState)
console.log(migratedState.myFancyStateProperty)
// B
Advanced Usage
Handling your migration engine explicitly:
import migrate, {buildMigrationEngine} from 'redux-storage-decorator-migrate'
const versionKey = 'redux-storage-decorators-migrate-version'
const migrations = [{
version: 1,
migration: (state) => ({ /* migration step for 1 */ return state; })
}, {
version: 2,
migration: (state) => ({ /* migration step for 2 */ return state; })
}]
const migrationEngine = buildMigrationEngine(1, versionKey, migrations)
engine = migrate(engine, 3, versionKey, migrations, migrationEngine);
engine.addMigration(3, (state) => { /* migration step for 3 */ return state; }); // still possible
// Migrate redux's initialState if provided
const migratedInitialState = migrationEngine(initialState || {});
// Redux store creation
const reduxStore = createStore(reduxStorage.reducer(combineReducers(reducers)), migratedInitialState, compose(...enhancers));
License
MIT