ngrx-store-persist
Version:
ngrx-store-persist depends on @ngrx/store and angular 2+
76 lines • 10.6 kB
JavaScript
import * as deepmerge from "deepmerge";
import { validateStateKeys } from "./helpers";
import { config } from "./options";
const INIT_ACTION = '@ngrx/store/init';
const UPDATE_ACTION = '@ngrx/store/update-reducers';
export function storageSync(reducer) {
const stateKeys = validateStateKeys(config.keys);
const rehydratedState = rehydrateApplicationState(stateKeys, config.storage);
return function (state, action) {
let nextState;
if ((action.type === INIT_ACTION) && !state) {
nextState = reducer(state, action);
}
else {
nextState = Object.assign({}, state);
}
if (action.type === INIT_ACTION || action.type === UPDATE_ACTION) {
// @ts-ignore
const overwriteMerge = (destinationArray, sourceArray) => sourceArray;
const options = {
arrayMerge: overwriteMerge
};
nextState = deepmerge(nextState, rehydratedState, options);
}
nextState = reducer(nextState, action);
if (action.type !== INIT_ACTION) {
syncStateUpdate(nextState, stateKeys, config.storage);
}
return nextState;
};
}
export const rehydrateApplicationState = (keys, storage) => {
return keys.reduce((acc, curr) => {
let key = curr;
if (storage !== undefined) {
let stateSlice = storage.getItem(key);
if (stateSlice) {
const isObjectRegex = new RegExp('{|\\[');
let raw = stateSlice;
if (stateSlice === 'null' || isObjectRegex.test(stateSlice.charAt(0))) {
raw = JSON.parse(stateSlice);
}
return Object.assign({}, acc, {
[key]: raw
});
}
}
return acc;
}, {});
};
export const syncStateUpdate = (state, keys, storage) => {
keys.forEach(key => {
let stateSlice = state[key];
let replacer = undefined;
let space = undefined;
if (typeof stateSlice !== 'undefined' && storage !== undefined) {
try {
storage.setItem(key, typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
}
catch (e) {
console.warn('Unable to save state to localStorage:', e);
}
}
else if (typeof stateSlice === 'undefined') {
try {
storage.removeItem(key);
}
catch (e) {
console.warn(`Exception on removing/cleaning undefined '${key}' state`, e);
}
}
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0b3JhZ2Utc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVqQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyw2QkFBNkIsQ0FBQztBQUVwRCxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQVk7SUFDcEMsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0UsT0FBTyxVQUFVLEtBQVUsRUFBRSxNQUFXO1FBQ3BDLElBQUksU0FBUyxDQUFDO1FBRWQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDekMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILFNBQVMscUJBQU8sS0FBSyxDQUFDLENBQUM7U0FDMUI7UUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFO1lBQzlELGFBQWE7WUFDYixNQUFNLGNBQWMsR0FBRyxDQUFDLGdCQUFxQixFQUFFLFdBQWdCLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNoRixNQUFNLE9BQU8sR0FBc0I7Z0JBQy9CLFVBQVUsRUFBRSxjQUFjO2FBQzdCLENBQUM7WUFDRixTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDOUQ7UUFFRCxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQzdCLGVBQWUsQ0FDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULE1BQU0sQ0FBQyxPQUFPLENBQ2pCLENBQUM7U0FDTDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUNyQyxJQUFXLEVBQ1gsT0FBZ0IsRUFDbEIsRUFBRTtJQUNBLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUM3QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFFZixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDdkIsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxJQUFJLFVBQVUsRUFBRTtnQkFDWixNQUFNLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDO2dCQUVyQixJQUFJLFVBQVUsS0FBSyxNQUFNLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25FLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNoQztnQkFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDMUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHO2lCQUNiLENBQUMsQ0FBQzthQUNOO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUMzQixLQUFVLEVBQ1YsSUFBVyxFQUNYLE9BQWdCLEVBQ2xCLEVBQUU7SUFDQSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2YsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUN6QixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUM7UUFFdEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUM1RCxJQUFJO2dCQUNBLE9BQU8sQ0FBQyxPQUFPLENBQ1gsR0FBRyxFQUNILE9BQU8sVUFBVSxLQUFLLFFBQVE7b0JBQzFCLENBQUMsQ0FBQyxVQUFVO29CQUNaLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQ3BELENBQUM7YUFDTDtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDNUQ7U0FDSjthQUFNLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFO1lBQzFDLElBQUk7Z0JBQ0EsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUMzQjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLE9BQU8sQ0FBQyxJQUFJLENBQ1IsNkNBQTZDLEdBQUcsU0FBUyxFQUN6RCxDQUFDLENBQ0osQ0FBQzthQUNMO1NBQ0o7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRlZXBtZXJnZSBmcm9tIFwiZGVlcG1lcmdlXCI7XHJcbmltcG9ydCB7dmFsaWRhdGVTdGF0ZUtleXN9IGZyb20gXCIuL2hlbHBlcnNcIjtcclxuaW1wb3J0IHtjb25maWd9IGZyb20gXCIuL29wdGlvbnNcIjtcclxuXHJcbmNvbnN0IElOSVRfQUNUSU9OID0gJ0BuZ3J4L3N0b3JlL2luaXQnO1xyXG5jb25zdCBVUERBVEVfQUNUSU9OID0gJ0BuZ3J4L3N0b3JlL3VwZGF0ZS1yZWR1Y2Vycyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZVN5bmMocmVkdWNlcjogYW55KSB7XHJcbiAgICBjb25zdCBzdGF0ZUtleXMgPSB2YWxpZGF0ZVN0YXRlS2V5cyhjb25maWcua2V5cyk7XHJcbiAgICBjb25zdCByZWh5ZHJhdGVkU3RhdGUgPSByZWh5ZHJhdGVBcHBsaWNhdGlvblN0YXRlKHN0YXRlS2V5cywgY29uZmlnLnN0b3JhZ2UpO1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoc3RhdGU6IGFueSwgYWN0aW9uOiBhbnkpIHtcclxuICAgICAgICBsZXQgbmV4dFN0YXRlO1xyXG5cclxuICAgICAgICBpZiAoKGFjdGlvbi50eXBlID09PSBJTklUX0FDVElPTikgJiYgIXN0YXRlKSB7XHJcbiAgICAgICAgICAgIG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV4dFN0YXRlID0gey4uLnN0YXRlfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBJTklUX0FDVElPTiB8fCBhY3Rpb24udHlwZSA9PT0gVVBEQVRFX0FDVElPTikge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJ3cml0ZU1lcmdlID0gKGRlc3RpbmF0aW9uQXJyYXk6IGFueSwgc291cmNlQXJyYXk6IGFueSkgPT4gc291cmNlQXJyYXk7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnM6IGRlZXBtZXJnZS5PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2VcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgbmV4dFN0YXRlID0gZGVlcG1lcmdlKG5leHRTdGF0ZSwgcmVoeWRyYXRlZFN0YXRlLCBvcHRpb25zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5leHRTdGF0ZSA9IHJlZHVjZXIobmV4dFN0YXRlLCBhY3Rpb24pO1xyXG5cclxuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgIT09IElOSVRfQUNUSU9OKSB7XHJcbiAgICAgICAgICAgIHN5bmNTdGF0ZVVwZGF0ZShcclxuICAgICAgICAgICAgICAgIG5leHRTdGF0ZSxcclxuICAgICAgICAgICAgICAgIHN0YXRlS2V5cyxcclxuICAgICAgICAgICAgICAgIGNvbmZpZy5zdG9yYWdlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHJlaHlkcmF0ZUFwcGxpY2F0aW9uU3RhdGUgPSAoXHJcbiAgICBrZXlzOiBhbnlbXSxcclxuICAgIHN0b3JhZ2U6IFN0b3JhZ2VcclxuKSA9PiB7XHJcbiAgICByZXR1cm4ga2V5cy5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xyXG4gICAgICAgIGxldCBrZXkgPSBjdXJyO1xyXG5cclxuICAgICAgICBpZiAoc3RvcmFnZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxldCBzdGF0ZVNsaWNlID0gc3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgICAgICAgIGlmIChzdGF0ZVNsaWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc09iamVjdFJlZ2V4ID0gbmV3IFJlZ0V4cCgne3xcXFxcWycpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHJhdyA9IHN0YXRlU2xpY2U7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlU2xpY2UgPT09ICdudWxsJyB8fCBpc09iamVjdFJlZ2V4LnRlc3Qoc3RhdGVTbGljZS5jaGFyQXQoMCkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmF3ID0gSlNPTi5wYXJzZShzdGF0ZVNsaWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYWNjLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgW2tleV06IHJhd1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9KTtcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzeW5jU3RhdGVVcGRhdGUgPSAoXHJcbiAgICBzdGF0ZTogYW55LFxyXG4gICAga2V5czogYW55W10sXHJcbiAgICBzdG9yYWdlOiBTdG9yYWdlXHJcbikgPT4ge1xyXG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgbGV0IHN0YXRlU2xpY2UgPSBzdGF0ZVtrZXldO1xyXG4gICAgICAgIGxldCByZXBsYWNlciA9IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgc3BhY2UgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGVTbGljZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RvcmFnZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzdGF0ZVNsaWNlID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRlU2xpY2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShzdGF0ZVNsaWNlLCByZXBsYWNlciwgc3BhY2UpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBzYXZlIHN0YXRlIHRvIGxvY2FsU3RvcmFnZTonLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0YXRlU2xpY2UgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgIGBFeGNlcHRpb24gb24gcmVtb3ZpbmcvY2xlYW5pbmcgdW5kZWZpbmVkICcke2tleX0nIHN0YXRlYCxcclxuICAgICAgICAgICAgICAgICAgICBlXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn07XHJcbiJdfQ==