vuex-composition-maphooks
Version:
To support vuex-composition map* helper functions
2 lines (1 loc) • 2.62 kB
JavaScript
import{useStore}from"vuex";const useState=normalizeNamespace((n,e)=>{const t={},s=useStore();return e&&!isValidMap(e)&&console.error("[vuex] useState: mapper parameter must be either an Array or an Object"),e&&normalizeMap(e).forEach(({key:e,val:a})=>{t[e]=function(){let e=s.state,t=s.getters;if("string"==typeof n&&n){var r=getModuleByNamespace(s,"useState",n);if(!r)return;e=r.state,t=r.context.getters}return"function"==typeof a?a.call(this,e,t):e[a]},t[e].vuex=!0}),t}),useGetters=normalizeNamespace((r,e)=>{const a={},n=useStore();return e&&!isValidMap(e)&&console.error("[vuex] useGetters: mapper parameter must be either an Array or an Object"),e&&normalizeMap(e).forEach(({key:e,val:t})=>{t=r+t,a[e]=function(){if(!r||"string"!=typeof r||getModuleByNamespace(n,"useGetters",r)){if(t in n.getters)return n.getters[t];console.error("[vuex] unknown getter: "+t)}},a[e].vuex=!0}),a}),useMutations=normalizeNamespace((n,e)=>{const t={},s=useStore();return e&&!isValidMap(e)&&console.error("[vuex] useMutations: mapper parameter must be either an Array or an Object"),e&&normalizeMap(e).forEach(({key:e,val:a})=>{t[e]=function(...e){let t=s.commit;if(n&&"string"==typeof n){var r=getModuleByNamespace(s,"useMutations",n);if(!r)return;t=r.context.commit}return"function"==typeof a?a.apply(this,[t].concat(e)):t.apply(s,[a].concat(e))}}),t}),useActions=normalizeNamespace((n,e)=>{const t={},s=(e&&!isValidMap(e)&&console.error("[vuex] useActions: mapper parameter must be an Array"),useStore());return e&&normalizeMap(e).forEach(({key:e,val:a})=>{t[e]=function(...e){let t=s.dispatch;if(n&&"string"==typeof n){var r=getModuleByNamespace(s,"useActions",n);if(!r)return;t=r.context.dispatch}return"function"==typeof a?a.apply(this,[t].concat(e)):t.apply(s,[a].concat(e))}}),t}),createNamespacedHelpers=e=>({useState:useState.bind(null,e),useGetters:useGetters.bind(null,e),useMutations:useMutations.bind(null,e),useActions:useActions.bind(null,e)});function isObject(e){return"object"==typeof e&&null!==e}function normalizeMap(t){return isValidMap(t)?Array.isArray(t)?t.map(e=>({key:normalizeKey(e),val:e})):Object.keys(t).map(e=>({key:t[e],val:e})):[]}function normalizeKey(e){return e.includes("/")?e.split("/")[1]:e}function isValidMap(e){return Array.isArray(e)||isObject(e)}function normalizeNamespace(r){return(e,t)=>("string"!=typeof e?(t=e,e=""):"/"!==e.charAt(e.length-1)&&(e+="/"),r(e,t))}function getModuleByNamespace(e,t,r){e=e._modulesNamespaceMap[r];return e||console.error(`[vuex] module namespace not found in ${t}(): `+r),e}export{createNamespacedHelpers,useActions,useGetters,useMutations,useState};