UNPKG

39.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"core.esm.js","sources":["../src/reduxStore.ts","../src/validate.ts","../src/dispatcher.ts","../src/bag.ts","../src/rematchStore.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["import * as Redux from 'redux'\nimport {\n\tAction,\n\tConfigRedux,\n\tModelReducers,\n\tNamedModel,\n\tRematchBag,\n\tDevtoolOptions,\n\tModels,\n\tRematchRootState,\n} from './types'\n\n/**\n * Creates 'combined' reducer for each model and then merges those reducers\n * together into a 'root' reducer. It then creates a Redux store with\n * middlewares and enhancers.\n */\nexport default function createReduxStore<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>,\n\tRootState = RematchRootState<TModels, TExtraModels>\n>(bag: RematchBag<TModels, TExtraModels>): Redux.Store<RootState> {\n\tbag.models.forEach((model) => createModelReducer(bag, model))\n\n\tconst rootReducer = createRootReducer<RootState, TModels, TExtraModels>(bag)\n\n\tconst middlewares = Redux.applyMiddleware(...bag.reduxConfig.middlewares)\n\tconst enhancers = bag.reduxConfig.devtoolComposer\n\t\t? bag.reduxConfig.devtoolComposer(...bag.reduxConfig.enhancers, middlewares)\n\t\t: composeEnhancersWithDevtools(bag.reduxConfig.devtoolOptions)(\n\t\t\t\t...bag.reduxConfig.enhancers,\n\t\t\t\tmiddlewares\n\t\t )\n\n\tconst createStore = bag.reduxConfig.createStore || Redux.createStore\n\tconst bagInitialState = bag.reduxConfig.initialState\n\tconst initialState = bagInitialState === undefined ? {} : bagInitialState\n\n\treturn createStore<RootState, Action, any, typeof initialState>(\n\t\trootReducer,\n\t\tinitialState,\n\t\tenhancers\n\t)\n}\n\n/**\n * Creates a combined reducer for a given model. What it means is that:\n * - it forms an action name for each model's reducer as 'modelName/reducerKey'\n * - it creates a mapping from action name to its reducer\n * - it wraps the mapping with a function (combined reducer) that selects and\n * runs a reducer based on the incoming action\n * - if the model also has a base reducer defined, it creates a function which\n * first runs the incoming action through this reducer and then passes the\n * resulting state and the same action to combined reducer\n *\n * The final result - a function, is returned.\n */\nexport function createModelReducer<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>,\n\tTState extends NamedModel<TModels>['state'] = any\n>(bag: RematchBag<TModels, TExtraModels>, model: NamedModel<TModels>): void {\n\tconst modelReducers: ModelReducers<TState> = {}\n\n\t// build action name for each reducer and create mapping from name to reducer\n\tconst modelReducerKeys = Object.keys(model.reducers)\n\tmodelReducerKeys.forEach((reducerKey) => {\n\t\tconst actionName = isAlreadyActionName(reducerKey)\n\t\t\t? reducerKey\n\t\t\t: `${model.name}/${reducerKey}`\n\n\t\tmodelReducers[actionName] = model.reducers[reducerKey]\n\t})\n\n\t// select and run a reducer based on the incoming action\n\tconst combinedReducer = (\n\t\tstate: TState = model.state,\n\t\taction: Action\n\t): TState => {\n\t\tif (action.type in modelReducers) {\n\t\t\treturn modelReducers[action.type](\n\t\t\t\tstate,\n\t\t\t\taction.payload,\n\t\t\t\taction.meta\n\t\t\t\t// we use augmentation because a reducer can return void due immer plugin,\n\t\t\t\t// which makes optional returning the reducer state\n\t\t\t) as TState\n\t\t}\n\n\t\treturn state\n\t}\n\n\tconst modelBaseReducer = model.baseReducer\n\n\t// when baseReducer is defined, run the action first through it\n\tlet reducer = !modelBaseReducer\n\t\t? combinedReducer\n\t\t: (state: TState = model.state, action: Action): TState =>\n\t\t\t\tcombinedReducer(modelBaseReducer(state, action), action)\n\n\tbag.forEachPlugin('onReducer', (onReducer) => {\n\t\treducer = onReducer(reducer, model.name, bag) || reducer\n\t})\n\n\tbag.reduxConfig.reducers[model.name] = reducer\n}\n\n/**\n * It merges all reducers in config using mergeReducers function. Additionally,\n * if user supplied any rootReducers, a wrapper function around merged reducers\n * is created. It first feeds each into its corresponding 'root' reducer (if\n * it's available), and then passes on the resulting state to the merged reducer.\n */\nexport function createRootReducer<\n\tTRootState,\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(bag: RematchBag<TModels, TExtraModels>): Redux.Reducer<TRootState, Action> {\n\tconst { rootReducers } = bag.reduxConfig\n\tconst mergedReducers = mergeReducers<TRootState>(bag.reduxConfig)\n\tlet rootReducer = mergedReducers\n\n\tif (rootReducers && Object.keys(rootReducers).length) {\n\t\trootReducer = (\n\t\t\tstate: TRootState | undefined,\n\t\t\taction: Action\n\t\t): TRootState => {\n\t\t\tconst actionRootReducer = rootReducers[action.type]\n\n\t\t\tif (actionRootReducer) {\n\t\t\t\treturn mergedReducers(actionRootReducer(state, action), action)\n\t\t\t}\n\n\t\t\treturn mergedReducers(state, action)\n\t\t}\n\t}\n\n\tbag.forEachPlugin('onRootReducer', (onRootReducer) => {\n\t\trootReducer = onRootReducer(rootReducer, bag) || rootReducer\n\t})\n\n\treturn rootReducer\n}\n\n/**\n * Merges all reducers defined in config into one function using user supplied\n * or default combineReducers function.\n * If there are no reducers defined, it returns a function that just returns\n * the state for all incoming actions.\n */\nfunction mergeReducers<TRootState>(\n\treduxConfig: ConfigRedux<TRootState>\n): Redux.Reducer<TRootState, Action> {\n\tconst combineReducers = reduxConfig.combineReducers || Redux.combineReducers\n\n\tif (!Object.keys(reduxConfig.reducers).length) {\n\t\treturn (state: any): TRootState => state\n\t}\n\n\treturn combineReducers(reduxConfig.reducers as Redux.ReducersMapObject)\n}\n\n/**\n * Returns Redux Devtools compose method unless it's disabled, in which case it\n * returns default Redux.compose.\n */\nfunction composeEnhancersWithDevtools(\n\tdevtoolOptions: DevtoolOptions = {}\n): (...args: any[]) => Redux.StoreEnhancer {\n\treturn !devtoolOptions.disabled &&\n\t\ttypeof window === 'object' &&\n\t\twindow.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n\t\t? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__(devtoolOptions)\n\t\t: Redux.compose\n}\n\n/**\n * Determines if a reducer key is already an action name, for example -\n * a listener on another model.\n */\nfunction isAlreadyActionName(reducerKey: string): boolean {\n\treturn reducerKey.indexOf('/') > -1\n}\n","import {\n\tConfig,\n\tModelEffects,\n\tModelReducers,\n\tNamedModel,\n\tPlugin,\n\tModels,\n} from './types'\n\n/**\n * If the first item is true, it means there is an error described by\n * the second item.\n */\nexport type Validation = [boolean | undefined, string]\n\n/**\n * Checks if a parameter is a valid object.\n */\nexport const isObject = <T>(obj: T): boolean =>\n\ttypeof obj === 'object' && obj !== null && !Array.isArray(obj)\n\n/**\n * Checks if a parameter is a valid function but only when it's defined.\n * Otherwise, always returns true.\n */\nexport const ifDefinedIsFunction = <T>(func: T): boolean =>\n\t!func || typeof func === 'function'\n\n/**\n * Takes an array of arrays of validations. Collects all errors and throws.\n * Should be used by plugins to keep the validation behaviour the same for all\n * Rematch-related libraries.\n */\nconst validate = (runValidations: () => Validation[]): void => {\n\tif (process.env.NODE_ENV !== 'production') {\n\t\tconst validations = runValidations()\n\t\tconst errors: string[] = []\n\n\t\tvalidations.forEach((validation) => {\n\t\t\tconst isInvalid = validation[0]\n\t\t\tconst errorMessage = validation[1]\n\t\t\tif (isInvalid) {\n\t\t\t\terrors.push(errorMessage)\n\t\t\t}\n\t\t})\n\n\t\tif (errors.length > 0) {\n\t\t\tthrow new Error(errors.join(', '))\n\t\t}\n\t}\n}\n\nexport const validateConfig = <\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(\n\tconfig: Config<TModels, TExtraModels>\n): void => {\n\tvalidate(() => [\n\t\t[!Array.isArray(config.plugins), 'init config.plugins must be an array'],\n\t\t[!isObject(config.models), 'init config.models must be an object'],\n\t\t[\n\t\t\t!isObject(config.redux.reducers),\n\t\t\t'init config.redux.reducers must be an object',\n\t\t],\n\t\t[\n\t\t\t!Array.isArray(config.redux.middlewares),\n\t\t\t'init config.redux.middlewares must be an array',\n\t\t],\n\t\t[\n\t\t\t!Array.isArray(config.redux.enhancers),\n\t\t\t'init config.redux.enhancers must be an array of functions',\n\t\t],\n\t\t[\n\t\t\t!ifDefinedIsFunction(config.redux.combineReducers),\n\t\t\t'init config.redux.combineReducers must be a function',\n\t\t],\n\t\t[\n\t\t\t!ifDefinedIsFunction(config.redux.createStore),\n\t\t\t'init config.redux.createStore must be a function',\n\t\t],\n\t])\n}\n\nexport const validateModel = <TModels extends Models<TModels>>(\n\tmodel: NamedModel<TModels>\n): void => {\n\tvalidate(() => [\n\t\t[!model, 'model config is required'],\n\t\t[typeof model.name !== 'string', 'model \"name\" [string] is required'],\n\t\t[\n\t\t\tmodel.state === undefined && model.baseReducer === undefined,\n\t\t\t'model \"state\" is required',\n\t\t],\n\t\t[\n\t\t\t!ifDefinedIsFunction(model.baseReducer),\n\t\t\t'model \"baseReducer\" must be a function',\n\t\t],\n\t])\n}\n\nexport const validatePlugin = <\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(\n\tplugin: Plugin<TModels, TExtraModels>\n): void => {\n\tvalidate(() => [\n\t\t[\n\t\t\t!ifDefinedIsFunction(plugin.onStoreCreated),\n\t\t\t'Plugin onStoreCreated must be a function',\n\t\t],\n\t\t[!ifDefinedIsFunction(plugin.onModel), 'Plugin onModel must be a function'],\n\t\t[\n\t\t\t!ifDefinedIsFunction(plugin.onReducer),\n\t\t\t'Plugin onReducer must be a function',\n\t\t],\n\t\t[\n\t\t\t!ifDefinedIsFunction(plugin.onRootReducer),\n\t\t\t'Plugin onRootReducer must be a function',\n\t\t],\n\t\t[\n\t\t\t!ifDefinedIsFunction(plugin.createMiddleware),\n\t\t\t'Plugin createMiddleware must be a function',\n\t\t],\n\t])\n}\n\nexport const validateModelReducer = (\n\tmodelName: string,\n\treducers: ModelReducers,\n\treducerName: string\n): void => {\n\tvalidate(() => [\n\t\t[\n\t\t\t!!reducerName.match(/\\/.+\\//),\n\t\t\t`Invalid reducer name (${modelName}/${reducerName})`,\n\t\t],\n\t\t[\n\t\t\ttypeof reducers[reducerName] !== 'function',\n\t\t\t`Invalid reducer (${modelName}/${reducerName}). Must be a function`,\n\t\t],\n\t])\n}\n\nexport const validateModelEffect = <TModels extends Models<TModels>>(\n\tmodelName: string,\n\teffects: ModelEffects<TModels>,\n\teffectName: string\n): void => {\n\tvalidate(() => [\n\t\t[\n\t\t\t!!effectName.match(/\\//),\n\t\t\t`Invalid effect name (${modelName}/${effectName})`,\n\t\t],\n\t\t[\n\t\t\ttypeof effects[effectName] !== 'function',\n\t\t\t`Invalid effect (${modelName}/${effectName}). Must be a function`,\n\t\t],\n\t])\n}\n\nexport default validate\n","import {\n\tAction,\n\tModelEffects,\n\tModelEffectsCreator,\n\tModels,\n\tNamedModel,\n\tRematchBag,\n\tRematchDispatcher,\n\tRematchStore,\n} from './types'\nimport { validateModelEffect, validateModelReducer } from './validate'\n\n/**\n * Builds a dispatcher for given model name and action name. The dispatched\n * action will have a type `modelName/actionName`.\n * Additionally, adds the isEffect property to the created dispatcher.\n * isEffect helps to differentiate effects dispatchers from reducer dispatchers.\n */\nconst createActionDispatcher = <\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(\n\trematch: RematchStore<TModels, TExtraModels>,\n\tmodelName: string,\n\tactionName: string,\n\tisEffect: boolean\n): RematchDispatcher<boolean> => {\n\treturn Object.assign(\n\t\t(payload?: any, meta?: any): Action => {\n\t\t\tconst action: Action = { type: `${modelName}/${actionName}` }\n\n\t\t\tif (typeof payload !== 'undefined') {\n\t\t\t\taction.payload = payload\n\t\t\t}\n\n\t\t\tif (typeof meta !== 'undefined') {\n\t\t\t\taction.meta = meta\n\t\t\t}\n\n\t\t\treturn rematch.dispatch(action)\n\t\t},\n\t\t{\n\t\t\tisEffect,\n\t\t}\n\t)\n}\n\n/**\n * Creates a dispatcher object for a model - it contains a mapping from all\n * reducers to functions which dispatch their corresponding actions.\n */\nexport const createReducerDispatcher = <\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>,\n\tTModel extends NamedModel<TModels>\n>(\n\trematch: RematchStore<TModels, TExtraModels>,\n\tmodel: TModel\n): void => {\n\tconst modelDispatcher = rematch.dispatch[model.name]\n\n\t// map reducer names to dispatch actions\n\tconst modelReducersKeys = Object.keys(model.reducers)\n\tmodelReducersKeys.forEach((reducerName) => {\n\t\tvalidateModelReducer(model.name, model.reducers, reducerName)\n\n\t\tmodelDispatcher[reducerName] = createActionDispatcher(\n\t\t\trematch,\n\t\t\tmodel.name,\n\t\t\treducerName,\n\t\t\tfalse\n\t\t)\n\t})\n}\n\n/**\n * Creates effects dispatcher for a model - it contains a mapping from all\n * effects *names* to functions which dispatch their corresponding actions.\n */\nexport const createEffectDispatcher = <\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>,\n\tTModel extends NamedModel<TModels>\n>(\n\trematch: RematchStore<TModels, TExtraModels>,\n\tbag: RematchBag<TModels, TExtraModels>,\n\tmodel: TModel\n): void => {\n\tconst modelDispatcher = rematch.dispatch[model.name]\n\tlet effects: ModelEffects<TModels> = {}\n\n\t// 'effects' might be actually a function creating effects\n\tif (model.effects) {\n\t\teffects =\n\t\t\ttypeof model.effects === 'function'\n\t\t\t\t? (model.effects as ModelEffectsCreator<TModels>)(rematch.dispatch)\n\t\t\t\t: model.effects\n\t}\n\n\t// map effects names to dispatch actions\n\tconst effectKeys = Object.keys(effects)\n\teffectKeys.forEach((effectName) => {\n\t\tvalidateModelEffect(model.name, effects, effectName)\n\n\t\tbag.effects[`${model.name}/${effectName}`] =\n\t\t\teffects[effectName].bind(modelDispatcher)\n\n\t\tmodelDispatcher[effectName] = createActionDispatcher(\n\t\t\trematch,\n\t\t\tmodel.name,\n\t\t\teffectName,\n\t\t\ttrue\n\t\t)\n\t})\n}\n","import { Config, Model, Models, NamedModel, RematchBag } from './types'\nimport { validateModel } from './validate'\n\n/**\n * Creates and returns a 'Rematch Bag', which is a set of configuration options\n * used by the Rematch library in various functions.\n */\nexport default function createRematchBag<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(config: Config<TModels, TExtraModels>): RematchBag<TModels, TExtraModels> {\n\treturn {\n\t\tmodels: createNamedModels(config.models),\n\t\treduxConfig: config.redux,\n\t\tforEachPlugin(method, fn): void {\n\t\t\tconfig.plugins.forEach((plugin) => {\n\t\t\t\tif (plugin[method]) {\n\t\t\t\t\tfn(plugin[method]!)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\teffects: {},\n\t}\n}\n\n/**\n * Transforms mapping from a model name to a model object, into an array of\n * 'named' models - models with embedded name and default value for reducers\n * if user didn't provide any.\n */\nfunction createNamedModels<TModels extends Models<TModels>>(\n\tmodels: TModels | Partial<TModels>\n): NamedModel<TModels>[] {\n\treturn Object.keys(models).map((modelName: string) => {\n\t\tconst model = createNamedModel(modelName, (models as TModels)[modelName])\n\t\tvalidateModel(model)\n\t\treturn model\n\t})\n}\n\n/**\n * Transforms a model into 'named' model - model which contains 'name' and\n * 'reducers' properties if user didn't provide any.\n */\nfunction createNamedModel<TModels extends Models<TModels>>(\n\tname: string,\n\tmodel: Model<TModels>\n): NamedModel<TModels> {\n\treturn {\n\t\tname,\n\t\treducers: {},\n\t\t...model,\n\t}\n}\n","import { Middleware } from 'redux'\nimport {\n\tAction,\n\tConfig,\n\tExposedFunction,\n\tModels,\n\tNamedModel,\n\tObjectNotAFunction,\n\tPlugin,\n\tRematchBag,\n\tRematchStore,\n\tModelDispatcher,\n\tRematchDispatch,\n} from './types'\nimport createReduxStore, {\n\tcreateModelReducer,\n\tcreateRootReducer,\n} from './reduxStore'\nimport { createReducerDispatcher, createEffectDispatcher } from './dispatcher'\nimport { validateModel } from './validate'\nimport createRematchBag from './bag'\n\nexport default function createRematchStore<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(config: Config<TModels, TExtraModels>): RematchStore<TModels, TExtraModels> {\n\t// setup rematch 'bag' for storing useful values and functions\n\tconst bag = createRematchBag(config)\n\n\t// add middleware for handling effects\n\tbag.reduxConfig.middlewares.push(createEffectsMiddleware(bag))\n\n\t// collect middlewares from plugins\n\tbag.forEachPlugin('createMiddleware', (createMiddleware) => {\n\t\tbag.reduxConfig.middlewares.push(createMiddleware(bag))\n\t})\n\n\tconst reduxStore = createReduxStore(bag)\n\n\tlet rematchStore = {\n\t\t...reduxStore,\n\t\tname: config.name,\n\t\taddModel(model: NamedModel<TModels>) {\n\t\t\tvalidateModel(model)\n\t\t\tcreateModelReducer(bag, model)\n\t\t\tprepareModel(rematchStore, model)\n\t\t\tenhanceModel(rematchStore, bag, model)\n\t\t\treduxStore.replaceReducer(createRootReducer(bag))\n\t\t\treduxStore.dispatch({ type: '@@redux/REPLACE' })\n\t\t},\n\t} as RematchStore<TModels, TExtraModels>\n\n\taddExposed(rematchStore, config.plugins)\n\n\t/**\n\t * generate dispatch[modelName][actionName] for all reducers and effects\n\t *\n\t * Note: To have circular models accessible in effects method with destructing,\n\t * ensure that model generation and effects generation execute in\n\t * different steps.\n\t */\n\tbag.models.forEach((model) => prepareModel(rematchStore, model))\n\tbag.models.forEach((model) => enhanceModel(rematchStore, bag, model))\n\n\tbag.forEachPlugin('onStoreCreated', (onStoreCreated) => {\n\t\trematchStore = onStoreCreated(rematchStore, bag) || rematchStore\n\t})\n\n\treturn rematchStore\n}\n\nfunction createEffectsMiddleware<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(bag: RematchBag<TModels, TExtraModels>): Middleware {\n\treturn (store) =>\n\t\t(next) =>\n\t\t(action: Action): any => {\n\t\t\tif (action.type in bag.effects) {\n\t\t\t\t// first run reducer action if exists\n\t\t\t\tnext(action)\n\n\t\t\t\t// then run the effect and return its result\n\t\t\t\treturn (bag.effects as any)[action.type](\n\t\t\t\t\taction.payload,\n\t\t\t\t\tstore.getState(),\n\t\t\t\t\taction.meta\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn next(action)\n\t\t}\n}\n\nfunction prepareModel<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>,\n\tTModel extends NamedModel<TModels>\n>(rematchStore: RematchStore<TModels, TExtraModels>, model: TModel): void {\n\tconst modelDispatcher = {} as ModelDispatcher<TModel, TModels>\n\n\t// inject model so effects creator can access it\n\trematchStore.dispatch[`${model.name}` as keyof RematchDispatch<TModels>] =\n\t\tmodelDispatcher\n\n\tcreateReducerDispatcher(rematchStore, model)\n}\n\nfunction enhanceModel<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>,\n\tTModel extends NamedModel<TModels>\n>(\n\trematchStore: RematchStore<TModels, TExtraModels>,\n\tbag: RematchBag<TModels, TExtraModels>,\n\tmodel: TModel\n): void {\n\tcreateEffectDispatcher(rematchStore, bag, model)\n\n\tbag.forEachPlugin('onModel', (onModel) => {\n\t\tonModel(model, rematchStore)\n\t})\n}\n\n/**\n * Adds properties exposed by plugins into the Rematch instance. If a exposed\n * property is a function, it passes rematch as the first argument.\n *\n * If you're implementing a plugin in TypeScript, extend Rematch namespace by\n * adding the properties that you exposed from your plugin.\n */\nfunction addExposed<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(\n\tstore: RematchStore<TModels, TExtraModels>,\n\tplugins: Plugin<TModels, TExtraModels>[]\n): void {\n\tplugins.forEach((plugin) => {\n\t\tif (!plugin.exposed) return\n\t\tconst pluginKeys = Object.keys(plugin.exposed)\n\t\tpluginKeys.forEach((key) => {\n\t\t\tif (!plugin.exposed) return\n\t\t\tconst exposedItem = plugin.exposed[key] as\n\t\t\t\t| ExposedFunction<TModels, TExtraModels>\n\t\t\t\t| ObjectNotAFunction\n\t\t\tconst isExposedFunction = typeof exposedItem === 'function'\n\n\t\t\tstore[key] = isExposedFunction\n\t\t\t\t? (...params: any[]): any =>\n\t\t\t\t\t\t(exposedItem as ExposedFunction<TModels, TExtraModels>)(\n\t\t\t\t\t\t\tstore,\n\t\t\t\t\t\t\t...params\n\t\t\t\t\t\t)\n\t\t\t\t: Object.create(plugin.exposed[key])\n\t\t})\n\t})\n}\n","import { InitConfig, Config, Models } from './types'\nimport { validateConfig, validatePlugin } from './validate'\n\nlet count = 0\n\n/**\n * Builds complete Rematch config using default values for properties not\n * supplied by the user. Additionally, applies changes to the config made by\n * the plugins selected by the user.\n */\nexport default function createConfig<\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels>\n>(\n\tinitConfig: InitConfig<TModels, TExtraModels>\n): Config<TModels, TExtraModels> {\n\tconst storeName = initConfig.name ?? `Rematch Store ${count}`\n\n\tcount += 1\n\n\tconst config = {\n\t\tname: storeName,\n\t\tmodels: initConfig.models || {},\n\t\tplugins: initConfig.plugins || [],\n\t\tredux: {\n\t\t\treducers: {},\n\t\t\trootReducers: {},\n\t\t\tenhancers: [],\n\t\t\tmiddlewares: [],\n\t\t\t...initConfig.redux,\n\t\t\tdevtoolOptions: {\n\t\t\t\tname: storeName,\n\t\t\t\t...(initConfig.redux?.devtoolOptions ?? {}),\n\t\t\t},\n\t\t},\n\t} as Config<TModels, TExtraModels>\n\n\tvalidateConfig(config)\n\n\t// Apply changes to the config required by plugins\n\tconfig.plugins.forEach((plugin) => {\n\t\tif (plugin.config) {\n\t\t\t// Collect new models\n\t\t\tconfig.models = merge(config.models, plugin.config.models)\n\n\t\t\t// Collect redux configuration changes\n\t\t\tif (plugin.config.redux) {\n\t\t\t\tconfig.redux.initialState = merge(\n\t\t\t\t\tconfig.redux.initialState,\n\t\t\t\t\tplugin.config.redux.initialState\n\t\t\t\t)\n\n\t\t\t\tconfig.redux.reducers = merge(\n\t\t\t\t\tconfig.redux.reducers,\n\t\t\t\t\tplugin.config.redux.reducers\n\t\t\t\t)\n\n\t\t\t\tconfig.redux.rootReducers = merge(\n\t\t\t\t\tconfig.redux.rootReducers,\n\t\t\t\t\tplugin.config.redux.reducers\n\t\t\t\t)\n\n\t\t\t\tconfig.redux.enhancers = [\n\t\t\t\t\t...config.redux.enhancers,\n\t\t\t\t\t...(plugin.config.redux.enhancers || []),\n\t\t\t\t]\n\n\t\t\t\tconfig.redux.middlewares = [\n\t\t\t\t\t...config.redux.middlewares,\n\t\t\t\t\t...(plugin.config.redux.middlewares || []),\n\t\t\t\t]\n\n\t\t\t\tconfig.redux.combineReducers =\n\t\t\t\t\tconfig.redux.combineReducers || plugin.config.redux.combineReducers\n\n\t\t\t\tconfig.redux.createStore =\n\t\t\t\t\tconfig.redux.createStore || plugin.config.redux.createStore\n\t\t\t}\n\t\t}\n\n\t\tvalidatePlugin(plugin)\n\t})\n\n\treturn config as Config<TModels, TExtraModels>\n}\n\n/**\n * Shallow merges original object with the extra object, giving the precedence\n * to the original object.\n */\nfunction merge<\n\tT extends Record<string, unknown>,\n\tU extends Record<string, unknown> = T\n>(original: T, extra?: U): T | (T & U) {\n\treturn extra ? { ...extra, ...original } : original\n}\n","import createRematchStore from './rematchStore'\nimport { InitConfig, Models, RematchStore, ModelCreator } from './types'\nimport createConfig from './config'\n\n/**\n * Prepares a complete configuration and creates a Rematch store.\n */\nexport const init = <\n\tTModels extends Models<TModels>,\n\tTExtraModels extends Models<TModels> = Record<string, never>\n>(\n\tinitConfig?: InitConfig<TModels, TExtraModels>\n): RematchStore<TModels, TExtraModels> => {\n\tconst config = createConfig(initConfig || {})\n\treturn createRematchStore(config)\n}\n\nexport const createModel: ModelCreator = () => (mo) => mo as any\n\nexport default {\n\tinit,\n\tcreateModel,\n}\n\nexport * from './types'\n"],"names":["createReduxStore","bag","models","forEach","model","createModelReducer","rootReducer","createRootReducer","middlewares","Redux","applyMiddleware","reduxConfig","enhancers","devtoolComposer","composeEnhancersWithDevtools","devtoolOptions","createStore","bagInitialState","initialState","undefined","modelReducers","modelReducerKeys","Object","keys","reducers","reducerKey","actionName","isAlreadyActionName","name","combinedReducer","state","action","type","payload","meta","modelBaseReducer","baseReducer","reducer","forEachPlugin","onReducer","rootReducers","mergedReducers","mergeReducers","length","actionRootReducer","onRootReducer","combineReducers","disabled","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","indexOf","isObject","obj","Array","isArray","ifDefinedIsFunction","func","validate","runValidations","process","env","NODE_ENV","validations","errors","validation","isInvalid","errorMessage","push","Error","join","validateConfig","config","plugins","redux","validateModel","validatePlugin","plugin","onStoreCreated","onModel","createMiddleware","validateModelReducer","modelName","reducerName","match","validateModelEffect","effects","effectName","createActionDispatcher","rematch","isEffect","assign","dispatch","createReducerDispatcher","modelDispatcher","modelReducersKeys","createEffectDispatcher","effectKeys","bind","createRematchBag","createNamedModels","method","fn","map","createNamedModel","createRematchStore","createEffectsMiddleware","reduxStore","rematchStore","addModel","prepareModel","enhanceModel","replaceReducer","addExposed","store","next","getState","exposed","pluginKeys","key","exposedItem","isExposedFunction","params","create","count","createConfig","initConfig","storeName","merge","original","extra","init","createModel","mo"],"mappings":"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"}
\No newline at end of file