UNPKG

zerotwo

Version:

Refined state containter for Vue.js

280 lines (229 loc) 6.96 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('vue')) : typeof define === 'function' && define.amd ? define(['exports', 'vue'], factory) : (factory((global.zerotwo = {}),global.Vue)); }(this, (function (exports,Vue) { 'use strict'; Vue = Vue && Vue.hasOwnProperty('default') ? Vue['default'] : Vue; /*! * nano-assign v1.0.0 * (c) 2017-present egoist <0x142857@gmail.com> * Released under the MIT License. */ var index = function(obj) { var arguments$1 = arguments; for (var i = 1; i < arguments.length; i++) { // eslint-disable-next-line guard-for-in, prefer-rest-params for (var p in arguments[i]) { obj[p] = arguments$1[i][p]; } } return obj }; var nanoAssign_common = index; var devtoolHook = typeof window !== 'undefined' && window.__VUE_DEVTOOLS_GLOBAL_HOOK__; function devtoolPlugin(store) { if (!devtoolHook) { return; } store._devtoolHook = devtoolHook; devtoolHook.emit('vuex:init', store); devtoolHook.on('vuex:travel-to-state', function (targetState) { store.replaceState(targetState); }); store.subscribe(function (mutation, state) { devtoolHook.emit('vuex:mutation', mutation, state); }); } var unifyObject = function (type, payload) { if (typeof type === 'object') { return type; } return { type: type, payload: payload }; }; function zerotwo(Vue$$1) { Vue$$1.mixin({ beforeCreate: function beforeCreate() { var store = this.$options.store || this.$parent && this.$parent.$store; if (store) { this.$store = store; } } }); } var createStore = function (ref) { var state = ref.state; var mutations = ref.mutations; var getters = ref.getters; var actions = ref.actions; var plugins = ref.plugins; var getterKeys = getters && Object.keys(getters); var wrappedGetters = {}; if (getterKeys) { var loop = function () { var key = list[i]; wrappedGetters[key] = function () { return getters[key](this._data.$$state, wrappedGetters); }; }; for (var i = 0, list = getterKeys; i < list.length; i += 1) loop(); } var silent = Vue.config.silent; Vue.config.silent = true; var vm = new Vue({ data: { $$state: state }, computed: wrappedGetters }); Vue.config.silent = silent; var subscribers = []; var store = { vm: vm, committing: false, getters: {}, get state() { return vm._data.$$state; }, set state(v) { { throw new Error('[zerotwo] Please do not directly mutation store state, use `store.replaceState(newState) instead!`'); } }, commit: function commit(_type, _payload) { var this$1 = this; var mutation = unifyObject(_type, _payload); var fn = mutations[mutation.type]; if ("development" !== 'production' && !fn) { throw new Error(("[zerotwo] Unknown mutation type: " + (mutation.type))); } this.withCommit(function () { return fn(vm._data.$$state, mutation.payload); }); for (var i = 0, list = subscribers; i < list.length; i += 1) { var sub = list[i]; sub(mutation, this$1.state); } }, dispatch: function dispatch(_type, _payload) { var action = unifyObject(_type, _payload); var fn = actions[action.type]; if ("development" !== 'production' && !fn) { throw new Error(("[zerotwo] Unknown action type: " + (action.type))); } return Promise.resolve(fn({ commit: this.commit.bind(this), dispatch: this.dispatch.bind(this), state: this.state }, action.payload)); }, subscribe: function subscribe(sub) { subscribers.push(sub); }, replaceState: function replaceState(state) { this.withCommit(function () { vm._data.$$state = state; }); }, withCommit: function withCommit(fn) { var committing = this.committing; this.committing = true; fn(); this.committing = committing; } }; if (getterKeys) { var loop$1 = function () { var key$1 = list$1[i$1]; Object.defineProperty(store.getters, key$1, { get: function () { return vm[key$1]; }, enumerable: true }); }; for (var i$1 = 0, list$1 = getterKeys; i$1 < list$1.length; i$1 += 1) loop$1(); } // Strict mode { vm.$watch(function () { return this._data.$$state; }, function () { if (!store.committing) { throw new Error("[zertwo] Do not mutate store state outside mutation handlers."); } }, { deep: true, sync: true }); } if (Vue.config.devtools) { devtoolPlugin(store); } if (plugins) { for (var i$2 = 0, list$2 = plugins; i$2 < list$2.length; i$2 += 1) { var plugin = list$2[i$2]; plugin(store); } } return store; }; var STATE = 'STATE'; var MUTATION = 'MUTATION'; var ACTION = 'ACTION'; var GETTER = 'GETTER'; var getPropsFromStore = function (store, obj) { return Object.keys(obj).reduce(function (res, key) { var def = obj[key]; var name = def.name || key; var value; if (def.type === STATE) { value = store.state[name]; } else if (def.type === MUTATION) { value = function (payload) { return store.commit(name, payload); }; } else if (def.type === ACTION) { value = function (payload) { return store.dispatch(name, payload); }; } else if (def.type === GETTER) { value = typeof name === 'function' ? function () { return name(store.state, store.getters); } : store.getters[name]; } res[name] = value; return res; }, {}); }; var connect = function (obj, Comp) { if ( obj === void 0 ) obj = {}; if (!Comp) { return function (Comp) { return connect(obj, Comp); }; } return { functional: true, name: ("connect-" + (Comp.name || 'unknown')), props: Comp.props, render: function render(h, ctx) { var store = ctx.parent.$store; if ("development" !== 'production' && !store) { console.error('Make sure you have called `Vue.use(zerotwo)` and passed `store` in component options!'); } var props = nanoAssign_common({}, ctx.props, getPropsFromStore(store, obj)); return h(Comp, { data: ctx.data, on: ctx.listeners, props: props }, ctx.children); } }; }; var state = function (name) { return ({ type: STATE, name: name }); }; var mutation = function (name) { return ({ type: MUTATION, name: name }); }; var action = function (name) { return ({ type: ACTION, name: name }); }; var getter = function (name) { return ({ type: GETTER, name: name }); }; exports['default'] = zerotwo; exports.createStore = createStore; exports.connect = connect; exports.state = state; exports.mutation = mutation; exports.action = action; exports.getter = getter; Object.defineProperty(exports, '__esModule', { value: true }); })));