vuex-localstorage
Version:
:dvd: Persist Vuex state with expires by localStorage or some else storage.
138 lines (121 loc) • 3.77 kB
JavaScript
/*!
* VUEX-LOCALSTORAGE v1.0.0
* (c) 2017 crossjs
* Released under the MIT License.
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var index = Date.now();
/**
* createStorage
*
* @param {String} namespace namespace
* @param {Object} [initialState] 初始值/默认值
* @param {Object} [config] 自定义 provider/serialize/deserialize/expires
* @return {Object} get/set 方法
*/
function createStorage (ref) {
if ( ref === void 0 ) ref = {};
var namespace = ref.namespace;
var initialState = ref.initialState; if ( initialState === void 0 ) initialState = {};
var provider = ref.provider; if ( provider === void 0 ) provider = localStorage;
var serialize = ref.serialize; if ( serialize === void 0 ) serialize = JSON.stringify;
var deserialize = ref.deserialize; if ( deserialize === void 0 ) deserialize = JSON.parse;
var expires = ref.expires; if ( expires === void 0 ) expires = 0;
var merge = ref.merge; if ( merge === void 0 ) merge = defaultMerge;
if (!namespace) {
namespace = "vuex-" + (++index);
}
return {
/**
* get
*
* @param {String} key key, defaults to 'default'
* @return {Object} plain object
*/
get: function get (key) {
if ( key === void 0 ) key = 'default';
var state;
try {
var ref = deserialize(provider.getItem((namespace + "-" + key)));
var value = ref.value;
var expires = ref.expires;
if (expires === 0 || expires > Date.now()) {
// always a plain object
state = deserialize(value);
}
} catch (e) {
// console.log(e)
}
return merge(key === 'default' ? initialState : initialState[key], state)
},
/**
* set
*
* @param {String} key key
* @param {Object} value plain object
* @return {undifined}
*/
set: function set (key, value) {
if (arguments.length === 1) {
value = key;
key = 'default';
}
try {
provider.setItem((namespace + "-" + key), serialize({
value: serialize(value),
expires: expires ? expires + Date.now() : expires
}));
} catch (e) {
// console.log(e)
}
}
}
}
function createPersist (ref) {
if ( ref === void 0 ) ref = {};
var namespace = ref.namespace;
var initialState = ref.initialState;
var provider = ref.provider;
var serialize = ref.serialize;
var deserialize = ref.deserialize;
var expires = ref.expires;
var merge = ref.merge; if ( merge === void 0 ) merge = defaultMerge;
var reducer = ref.reducer; if ( reducer === void 0 ) reducer = defaultReducer;
var paths = ref.paths; if ( paths === void 0 ) paths = [];
return function (store) {
var storage = createStorage({
namespace: namespace,
initialState: initialState,
provider: provider,
serialize: serialize,
deserialize: deserialize,
merge: merge,
expires: expires
});
store.replaceState(
merge(store.state, storage.get())
);
store.subscribe(function (mutation, state) {
storage.set(reducer(state, paths));
});
}
}
function defaultMerge () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return Object.assign.apply(Object, [ {} ].concat( args ))
}
function defaultReducer (state, paths) {
return paths.length === 0
? state
: paths.reduce(function (substate, path) {
if (state.hasOwnProperty(path)) {
var obj;
return Object.assign(substate, ( obj = {}, obj[path] = state[path], obj ))
}
return substate
}, {})
}
exports.createStorage = createStorage;
exports['default'] = createPersist;