{"version":3,"file":"index.cjs","sources":["../src/createModule.ts","../src/createStore.ts"],"sourcesContent":["import type { ActionContext, Getter } from 'vuex';\nimport type {\n  ModuleBuilder,\n  Mutation,\n  ActionHandler,\n  ActionType,\n} from './types';\nimport Vue from 'vue';\nconst actionCreator = <P>(\n  moduleName: () => string | undefined,\n  type: string,\n) => (payload: P) => ({\n  type: moduleName() ? `${moduleName()}/${type}` : type,\n  payload,\n});\n\nfunction overrideActionContext<State, RootState, Payload>(\n  action: ActionHandler<State, RootState, Payload>,\n) {\n  return (\n    store: ActionContext<State, RootState>,\n    { payload }: ReturnType<ActionType<Payload>>,\n  ) =>\n    action(\n      {\n        ...store,\n        commit: (type) => store.commit(type, { root: true }),\n        dispatch: (type) => store.dispatch(type, { root: true }),\n      },\n      payload,\n    );\n}\n\n/**\n * Create a {@see ModuleBuilder} instance.\n *\n * ```ts\n * interface RootState {\n *   module_one: {\n *     list: string[]\n *   }\n * }\n * const module = createModule<RootState['module_one'], RootState>({ list: [] });\n *\n * @param initialState - initial module state\n * @typeParam State - Type of module state, usually an key in RootState.\n * @typeParam RootState - Type of root store state\n */\nexport function createModule<State, RootState = any>(\n  initialState: State,\n): ModuleBuilder<State, RootState> {\n  const mutations: Mutation<State, unknown>[] = [];\n  const actions: ActionHandler<State, RootState, unknown>[] = [];\n  const getters: Getter<State, RootState>[] = [];\n\n  let moduleName: string;\n  const getModuleName = () => moduleName;\n\n  return <ModuleBuilder<State, RootState>>{\n    mutation<Payload>(type: string, fn?: Mutation<State, Payload>) {\n      if (!fn) {\n        return this.mutation(`${type}`, (state, value) => {\n          Vue.set(state as any, `${type}`, value);\n        });\n      }\n      fn.toString = () => `${type}`;\n      (mutations as Mutation<State, Payload>[]).push(fn);\n      return actionCreator<Payload>(getModuleName, type);\n    },\n    action<Payload>(\n      type: string,\n      fn: ActionHandler<State, RootState, Payload>,\n    ) {\n      fn.toString = () => `${type}`;\n      (actions as ActionHandler<State, RootState, Payload>[]).push(fn);\n      return actionCreator<Payload>(getModuleName, type);\n    },\n    getter<Payload>(type: string, fn: Getter<State, RootState>) {\n      fn.toString = () => `${type}`;\n      getters.push(fn);\n      return (getter: any): Payload =>\n        getter[`${moduleName}/${type}`] || getter[type];\n    },\n    getModule(name = '') {\n      moduleName = name;\n      return {\n        name: moduleName,\n        namespaced: true,\n        state: initialState,\n        actions: actions.reduce((acc, action) => {\n          acc[action.toString()] = overrideActionContext(action);\n          return acc;\n        }, {}),\n        mutations: mutations.reduce((acc, mutation) => {\n          acc[mutation.toString()] = (store, { payload }) =>\n            mutation(store, payload);\n          return acc;\n        }, {}),\n        getters: getters.reduce((acc, getter) => {\n          acc[getter.toString()] = getter;\n          return acc;\n        }, {}),\n      };\n    },\n  };\n}\n","import Vue from 'vue';\nimport Vuex, { StoreOptions } from 'vuex';\nimport { Store } from 'vuex';\nimport type { ModuleBuilder } from './types';\n\ntype Options<RootState> = StoreOptions<RootState> & {\n  /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n  moduleBuilders?: { [m in keyof RootState]?: ModuleBuilder<any, RootState> };\n};\n\n/**\n * create an instance of {@see Store} and build {@see ModuleBuilder} objects.\n *\n * ```ts\n * const module1 = createModule({ prop1: 1 });\n * const module2 = createModule({ prop2: 2 });\n *\n * const store = createStore({\n *   moduleBuilders: {\n *     module1,\n *     module2,\n *   }\n * })\n * ```\n *\n * @param options - A extended {@see StoreOptions} that includes moduleBuilders Record.\n */\nexport function createStore<RootState = never>(\n  options: Options<RootState>,\n): Store<RootState> {\n  Vue.use(Vuex);\n\n  const modules: [string, ModuleBuilder<RootState>][] = Object.entries(\n    options.moduleBuilders || {},\n  );\n\n  return new Store<RootState>({\n    ...options,\n    modules: {\n      ...(options?.modules || {}),\n      ...modules.reduce((acc, [name, builder]) => {\n        const _m = builder.getModule(name);\n        acc[_m.name] = _m;\n        return acc;\n      }, {}),\n    },\n  });\n}\n"],"names":["Vue","Vuex","Store"],"mappings":"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"}