UNPKG

39.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"core.cjs.development.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","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