UNPKG

vuex-localstorage

Version:

:dvd: Persist Vuex state with expires by localStorage or some else storage.

138 lines (121 loc) 3.77 kB
/*! * VUEX-LOCALSTORAGE v1.0.0 * (c) 2017 crossjs * Released under the MIT License. */ 'use strict'; 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;