All files / src/store index.js

50% Statements 9/18
75% Branches 3/4
44.44% Functions 4/9
52.94% Lines 9/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84                  1x             1x           2x                                                     1x                             61x 1x   61x       65x                     1x  
// @ts-check
 
import { get, includes, set, some } from "lodash";
import Vuex from "vuex";
import Vue from "vue";
import createPersistedState from "vuex-persistedstate";
 
import ui from "./modules/ui";
 
Vue.use(Vuex);
 
/**
 * @typedef {import('./sources/UserSource').default} UserSource
 */
 
/** @type {V.StoreOptions<BaseVue.StoreState>} */
export const storeOptions = {
  // @ts-ignore route and ui are added later
  state: { user: null },
  getters: {
    /** @param {BaseVue.StoreState} state */
    username: (state) => {
      return get(state, "user.sub", null);
    },
    /** @param {BaseVue.StoreState} state */
    canEdit: (state) => {
      const userRoles = get(state, [ "user", "cern_roles" ]);
      return some([ "editor", "admin" ], (r) => includes(userRoles, r));
    },
    /** @param {BaseVue.StoreState} state */
    canAdmin: (state) => {
      const userRoles = get(state, [ "user", "cern_roles" ]);
      return includes(userRoles, "admin");
    }
  },
  mutations: {
    /**
     * @param {BaseVue.StoreState} state
     * @param {BaseVue.StoreState["user"]} user
     */
    user(state, user) {
      state.user = user;
    }
  },
  modules: { ui },
  plugins: [
    createPersistedState({ paths: [ "ui" ] }),
    /** @param {V.Store<any>} store */
    function(store) {
      Iif (sources.user) {
        set(store, [ "sources", "user" ], sources.user);
        sources.user.setStore(store);
      }
    }
  ]
};
 
/** @type {V.Store<BaseVue.StoreState>|undefined} */
var _storeInstance;
 
/**
 * @return {V.Store<BaseVue.StoreState>}
 */
export function createStore() {
  if (!_storeInstance) {
    _storeInstance = new Vuex.Store(storeOptions);
  }
  return _storeInstance;
}
export default createStore;
 
export function getStore() { return _storeInstance; }
 
/**
 * @brief mainly for test purpose
 */
export function destroyStore() {
  _storeInstance = undefined;
}
 
// UserSource is added dynamically when loading BaseVue
/** @type {{ user?: UserSource }} */
export const sources = {};