mirror of
https://github.com/reduxjs/redux-devtools.git
synced 2025-07-28 00:49:46 +03:00
Support circular references in persistState
This commit is contained in:
parent
25eab60562
commit
c87cf33c59
|
@ -61,6 +61,7 @@
|
|||
"react": "^0.14.0 || ^15.0.0-rc.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"jsan": "^3.1.2",
|
||||
"lodash": "^4.2.0",
|
||||
"react-redux": "^4.0.0",
|
||||
"redux": "^3.2.1"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import mapValues from 'lodash/mapValues';
|
||||
import identity from 'lodash/identity';
|
||||
import jsan from 'jsan';
|
||||
|
||||
export default function persistState(sessionId, deserializeState = identity, deserializeAction = identity) {
|
||||
if (!sessionId) {
|
||||
|
@ -28,7 +29,7 @@ export default function persistState(sessionId, deserializeState = identity, des
|
|||
try {
|
||||
const json = localStorage.getItem(key);
|
||||
if (json) {
|
||||
finalInitialState = deserialize(JSON.parse(json)) || initialState;
|
||||
finalInitialState = deserialize(jsan.parse(json)) || initialState;
|
||||
next(reducer, initialState);
|
||||
}
|
||||
} catch (e) {
|
||||
|
@ -48,7 +49,7 @@ export default function persistState(sessionId, deserializeState = identity, des
|
|||
store.dispatch(action);
|
||||
|
||||
try {
|
||||
localStorage.setItem(key, JSON.stringify(store.getState()));
|
||||
localStorage.setItem(key, jsan.stringify(store.getState()));
|
||||
} catch (e) {
|
||||
console.warn('Could not write debug session to localStorage:', e);
|
||||
}
|
||||
|
|
|
@ -88,6 +88,27 @@ describe('persistState', () => {
|
|||
expect(store2.getState()).toBe(-2);
|
||||
});
|
||||
|
||||
it('should work with objects with circular references', () => {
|
||||
const circularReducer = (state = { count: 0 }, action) => {
|
||||
if (action.type === 'INCREMENT') {
|
||||
const obj = { count: state.count + 1 };
|
||||
obj.self = obj;
|
||||
return obj;
|
||||
}
|
||||
return state;
|
||||
};
|
||||
|
||||
const store = createStore(circularReducer, compose(instrument(), persistState('id')));
|
||||
expect(store.getState().count).toBe(0);
|
||||
|
||||
store.dispatch({ type: 'INCREMENT' });
|
||||
store.dispatch({ type: 'INCREMENT' });
|
||||
expect(store.getState().count).toBe(2);
|
||||
|
||||
const store2 = createStore(circularReducer, compose(instrument(), persistState('id')));
|
||||
expect(store2.getState().count).toBe(2);
|
||||
});
|
||||
|
||||
it('should warn if read from localStorage fails', () => {
|
||||
const spy = expect.spyOn(console, 'warn');
|
||||
delete global.localStorage.getItem;
|
||||
|
|
Loading…
Reference in New Issue
Block a user