UNPKG

redux-dynamic-modules

Version:

Modularize the redux app by dynamically loading reducers, state and sagas

1,157 lines (1,060 loc) 42.5 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("react"), require("react-redux"), require("redux")); else if(typeof define === 'function' && define.amd) define(["react", "react-redux", "redux"], factory); else if(typeof exports === 'object') exports["redux-dynamic-modules"] = factory(require("react"), require("react-redux"), require("redux")); else root["redux-dynamic-modules"] = factory(root["react"], root["react-redux"], root["redux"]); })(window, function(__WEBPACK_EXTERNAL_MODULE_react__, __WEBPACK_EXTERNAL_MODULE_react_redux__, __WEBPACK_EXTERNAL_MODULE_redux__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./lib/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "../../node_modules/redux-devtools-extension/developmentOnly.js": /*!**********************************************************************************************************!*\ !*** C:/Users/alebet/git/redux-dynamic-modules/node_modules/redux-devtools-extension/developmentOnly.js ***! \**********************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var compose = __webpack_require__(/*! redux */ "redux").compose; exports.__esModule = true; exports.composeWithDevTools = ( "development" !== 'production' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() { if (arguments.length === 0) return undefined; if (typeof arguments[0] === 'object') return compose; return compose.apply(null, arguments); } ); exports.devToolsEnhancer = ( "development" !== 'production' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() { return function(noop) { return noop; } } ); /***/ }), /***/ "../../node_modules/redux-dynamic-middlewares/lib/index.js": /*!*****************************************************************************************************!*\ !*** C:/Users/alebet/git/redux-dynamic-modules/node_modules/redux-dynamic-middlewares/lib/index.js ***! \*****************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.createDynamicMiddlewares = exports.resetMiddlewares = exports.removeMiddleware = exports.addMiddleware = undefined; var _redux = __webpack_require__(/*! redux */ "redux"); var createDynamicMiddlewares = function createDynamicMiddlewares() { var allDynamicMiddlewares = []; var enhancer = function enhancer(store) { return function (next) { return function (action) { var chain = allDynamicMiddlewares.map(function (middleware) { return middleware(store); }); return _redux.compose.apply(undefined, chain)(next)(action); }; }; }; var addMiddleware = function addMiddleware() { for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) { middlewares[_key] = arguments[_key]; } allDynamicMiddlewares = [].concat(allDynamicMiddlewares, middlewares); }; var removeMiddleware = function removeMiddleware(middleware) { var index = allDynamicMiddlewares.findIndex(function (d) { return d === middleware; }); if (index === -1) { // eslint-disable-next-line no-console console.error('Middleware does not exist!', middleware); return; } allDynamicMiddlewares = allDynamicMiddlewares.filter(function (_, mdwIndex) { return mdwIndex !== index; }); }; var resetMiddlewares = function resetMiddlewares() { allDynamicMiddlewares = []; }; return { enhancer: enhancer, addMiddleware: addMiddleware, removeMiddleware: removeMiddleware, resetMiddlewares: resetMiddlewares }; }; var dynamicMiddlewaresInstance = createDynamicMiddlewares(); exports.default = dynamicMiddlewaresInstance.enhancer; var addMiddleware = dynamicMiddlewaresInstance.addMiddleware, removeMiddleware = dynamicMiddlewaresInstance.removeMiddleware, resetMiddlewares = dynamicMiddlewaresInstance.resetMiddlewares; exports.addMiddleware = addMiddleware; exports.removeMiddleware = removeMiddleware; exports.resetMiddlewares = resetMiddlewares; exports.createDynamicMiddlewares = createDynamicMiddlewares; /***/ }), /***/ "../redux-dynamic-modules-core/lib/Managers/MiddlewareManager.js": /*!************************************************!*\ !*** .-core/lib/Managers/MiddlewareManager.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; //inspired from https://github.com/pofigizm/redux-dynamic-middlewares exports.__esModule = true; var redux_dynamic_middlewares_1 = __webpack_require__(/*! redux-dynamic-middlewares */ "../../node_modules/redux-dynamic-middlewares/lib/index.js"); exports.getMiddlewareManager = function () { var dynamicMiddlewaresInstance = redux_dynamic_middlewares_1.createDynamicMiddlewares(); var add = function (middlewares) { dynamicMiddlewaresInstance.addMiddleware.apply(dynamicMiddlewaresInstance, middlewares); return middlewares; }; var remove = function (middlewares) { middlewares.forEach(dynamicMiddlewaresInstance.removeMiddleware); return middlewares; }; return { getItems: function () { return []; }, enhancer: dynamicMiddlewaresInstance.enhancer, add: add, remove: remove, dispose: function () { dynamicMiddlewaresInstance.resetMiddlewares(); } }; }; /***/ }), /***/ "../redux-dynamic-modules-core/lib/Managers/ModuleManager.js": /*!********************************************!*\ !*** .-core/lib/Managers/ModuleManager.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; exports.__esModule = true; var ReducerManager_1 = __webpack_require__(/*! ./ReducerManager */ "../redux-dynamic-modules-core/lib/Managers/ReducerManager.js"); function getModuleManager(middlewareManager, extensions, advancedCombineReducers) { var _dispatch = null; var _reducerManager; var _modules = []; var _moduleIds = new Set(); var _seedReducers = function () { _dispatch({ type: "@@Internal/ModuleManager/SeedReducers" }); }; var _dispatchActions = function (actions) { if (!actions) { return; } if (!_dispatch) { throw new Error("setDispatch should be called on ModuleManager before adding any modules."); } actions.forEach(_dispatch); }; var _addMiddlewares = function (middlewares) { if (!middlewares) { return; } middlewareManager.add(middlewares); }; var _removeMiddlewares = function (middlewares) { if (!middlewares) { return; } middlewareManager.remove(middlewares); }; var _addReducers = function (reducerMap) { if (!reducerMap) { return; } if (!_reducerManager) { _reducerManager = ReducerManager_1.getRefCountedReducerManager( // @ts-ignore ReducerManager_1.getReducerManager(reducerMap, advancedCombineReducers)); } else { for (var key in reducerMap) { _reducerManager.add(key, reducerMap[key]); } } }; var _removeReducers = function (reducerMap) { if (!reducerMap || !_reducerManager) { return; } for (var key in reducerMap) { _reducerManager.remove(key); } }; // Create reduce function which redirects to _reducers.reduce var _reduce = function (s, a) { if (_reducerManager) { return _reducerManager.reduce(s, a); } return s || null; }; var moduleManager = { getReducer: _reduce, setDispatch: function (dispatch) { _dispatch = dispatch; }, getItems: function () { return []; }, add: function (modulesToAdd) { if (!modulesToAdd || modulesToAdd.length === 0) { return; } modulesToAdd = modulesToAdd.filter(function (module) { return module; }); var justAddedModules = []; modulesToAdd.forEach(function (module) { if (!_moduleIds.has(module.id)) { _moduleIds.add(module.id); _modules.push(module); _addReducers(module.reducerMap); var middlewares = module.middlewares; if (middlewares) { _addMiddlewares(middlewares); } justAddedModules.push(module); } }); /* Fire an action so that the newly added reducers can seed their initial state */ _seedReducers(); // add the sagas and dispatch actions at the end so all the reducers are registered justAddedModules.forEach(function (module) { // Let the extensions know we added a module extensions.forEach(function (p) { if (p.onModuleAdded) { p.onModuleAdded(module); } }); // Dispatch the initial actions var moduleAddedAction = { type: "@@Internal/ModuleManager/ModuleAdded", payload: module.id }; _dispatchActions(module.initialActions ? __spreadArrays([moduleAddedAction], module.initialActions) : [moduleAddedAction]); }); }, remove: function (modulesToRemove) { if (!modulesToRemove) { return; } modulesToRemove = modulesToRemove .filter(function (module) { return module; }) .reverse(); modulesToRemove.forEach(function (module) { if (_moduleIds.has(module.id)) { _dispatchActions(module.finalActions); _removeReducers(module.reducerMap); _removeMiddlewares(module.middlewares); // Let the extensions know we removed a module extensions.forEach(function (p) { if (p.onModuleRemoved) { p.onModuleRemoved(module); } }); _moduleIds["delete"](module.id); _modules = _modules.filter(function (m) { return m.id !== module.id; }); _dispatchActions([ { type: "@@Internal/ModuleManager/ModuleRemoved", payload: module.id }, ]); } }); }, dispose: function () { moduleManager.remove(_modules); } }; return moduleManager; } exports.getModuleManager = getModuleManager; /***/ }), /***/ "../redux-dynamic-modules-core/lib/Managers/ReducerManager.js": /*!*********************************************!*\ !*** .-core/lib/Managers/ReducerManager.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; exports.__esModule = true; var redux_1 = __webpack_require__(/*! redux */ "redux"); var RefCounter_1 = __webpack_require__(/*! ../Utils/RefCounter */ "../redux-dynamic-modules-core/lib/Utils/RefCounter.js"); /** * Adds reference counting to reducer manager and adds/remove keys only when ref count is zero */ function getRefCountedReducerManager(manager) { var reducerKeyRefCounter = RefCounter_1.getStringRefCounter(); for (var key in manager.getReducerMap()) { reducerKeyRefCounter.add(key); } return { reduce: manager.reduce, getReducerMap: manager.getReducerMap, add: function (key, reducer) { if (reducerKeyRefCounter.getCount(key) === 0) { manager.add(key, reducer); } reducerKeyRefCounter.add(key); }, remove: function (key) { reducerKeyRefCounter.remove(key); if (reducerKeyRefCounter.getCount(key) === 0) { manager.remove(key); } } }; } exports.getRefCountedReducerManager = getRefCountedReducerManager; /** * Create a combined reducer as in the fashion of Redux's combineReducers() function, * but allows for the dynamic registration of additional reducers * @param initialReducers The initial set of reducers * @returns An object with three functions: the reducer, an addReducer function, and a removeReducer function */ function getReducerManager(initialReducers, reducerCombiner) { if (reducerCombiner === void 0) { reducerCombiner = redux_1.combineReducers; } var combinedReducer = reducerCombiner(initialReducers); var reducers = __assign({}, initialReducers); var keysToRemove = []; var reduce = function (state, action) { if (keysToRemove.length > 0) { state = __assign({}, state); for (var _i = 0, keysToRemove_1 = keysToRemove; _i < keysToRemove_1.length; _i++) { var key = keysToRemove_1[_i]; delete state[key]; } keysToRemove = []; } if (state === undefined) { state = {}; } return combinedReducer(state, action); }; return { getReducerMap: function () { return reducers; }, reduce: reduce, add: function (key, reducer) { if (!key || reducers[key]) { return; } reducers[key] = reducer; combinedReducer = getCombinedReducer(reducers, reducerCombiner); }, remove: function (key) { if (!key || !reducers[key]) { return; } delete reducers[key]; keysToRemove.push(key); combinedReducer = getCombinedReducer(reducers, reducerCombiner); } }; } exports.getReducerManager = getReducerManager; function getCombinedReducer(reducerMap, reducerCombiner) { if (reducerCombiner === void 0) { reducerCombiner = redux_1.combineReducers; } if (!reducerMap || Object.keys(reducerMap).length === 0) { return function (state, action) { return state || null; }; } return reducerCombiner(reducerMap); } /***/ }), /***/ "../redux-dynamic-modules-core/lib/Managers/RefCountedManager.js": /*!************************************************!*\ !*** .-core/lib/Managers/RefCountedManager.js ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; exports.__esModule = true; var RefCounter_1 = __webpack_require__(/*! ../Utils/RefCounter */ "../redux-dynamic-modules-core/lib/Utils/RefCounter.js"); /** * Enhances the given items with ref counting for add remove purposes */ function getRefCountedManager(manager, equals, retained // Decides if the item is retained even when the ref count reaches 0 ) { var refCounter = RefCounter_1.getObjectRefCounter(equals, retained); var items = manager.getItems(); // Set initial ref counting items.forEach(function (item) { return refCounter.add(item); }); var ret = __assign({}, manager); // Wrap add method ret.add = function (items) { if (!items) { return; } var nonNullItems = items.filter(function (i) { return i; }); var notAddedItems = nonNullItems.filter(function (i) { return refCounter.getCount(i) === 0; }); manager.add(notAddedItems); nonNullItems.forEach(refCounter.add); }; // Wrap remove ret.remove = function (items) { if (!items) { return; } items.forEach(function (item) { if (item) { refCounter.remove(item); if (refCounter.getCount(item) === 0) { manager.remove([item]); } } }); }; ret.dispose = function () { manager.dispose(); }; return ret; } exports.getRefCountedManager = getRefCountedManager; /***/ }), /***/ "../redux-dynamic-modules-core/lib/ModuleStore.js": /*!*********************************!*\ !*** .-core/lib/ModuleStore.js ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; exports.__esModule = true; var redux_1 = __webpack_require__(/*! redux */ "redux"); var developmentOnly_1 = __webpack_require__(/*! redux-devtools-extension/developmentOnly */ "../../node_modules/redux-devtools-extension/developmentOnly.js"); var MiddlewareManager_1 = __webpack_require__(/*! ./Managers/MiddlewareManager */ "../redux-dynamic-modules-core/lib/Managers/MiddlewareManager.js"); var ModuleManager_1 = __webpack_require__(/*! ./Managers/ModuleManager */ "../redux-dynamic-modules-core/lib/Managers/ModuleManager.js"); var RefCountedManager_1 = __webpack_require__(/*! ./Managers/RefCountedManager */ "../redux-dynamic-modules-core/lib/Managers/RefCountedManager.js"); var Flatten_1 = __webpack_require__(/*! ./Utils/Flatten */ "../redux-dynamic-modules-core/lib/Utils/Flatten.js"); function createStore(moduleStoreSettings) { var initialModules = []; for (var _i = 1; _i < arguments.length; _i++) { initialModules[_i - 1] = arguments[_i]; } var _a = moduleStoreSettings.initialState, initialState = _a === void 0 ? {} : _a, _b = moduleStoreSettings.extensions, extensions = _b === void 0 ? [] : _b, _c = moduleStoreSettings.enhancers, enhancers = _c === void 0 ? [] : _c, _d = moduleStoreSettings.advancedComposeEnhancers, advancedComposeEnhancers = _d === void 0 ? developmentOnly_1.composeWithDevTools({}) : _d, advancedCombineReducers = moduleStoreSettings.advancedCombineReducers; var extensionMiddleware = extensions.reduce(function (mw, p) { if (p.middleware) { mw.push.apply(mw, p.middleware); } return mw; }, []); var middlewareManager = RefCountedManager_1.getRefCountedManager(MiddlewareManager_1.getMiddlewareManager(), function (a, b) { return a === b; }); var enhancer = advancedComposeEnhancers.apply(void 0, __spreadArrays(enhancers, [redux_1.applyMiddleware.apply(void 0, __spreadArrays(extensionMiddleware, [middlewareManager.enhancer]))])); var moduleManager = RefCountedManager_1.getRefCountedManager(ModuleManager_1.getModuleManager(middlewareManager, extensions, advancedCombineReducers), function (a, b) { return a.id === b.id; }, function (a) { return a.retained; }); // Create store var store = redux_1.createStore(moduleManager.getReducer, initialState, enhancer); moduleManager.setDispatch(store.dispatch); var addModules = function (modulesToBeAdded) { var flattenedModules = Flatten_1.flatten(modulesToBeAdded); moduleManager.add(flattenedModules); return { remove: function () { moduleManager.remove(flattenedModules); } }; }; var addModule = function (moduleToBeAdded) { return addModules([moduleToBeAdded]); }; extensions.forEach(function (p) { if (p.onModuleManagerCreated) { p.onModuleManagerCreated({ addModule: addModule, addModules: addModules }); } }); store.addModule = addModule; store.addModules = addModules; store.dispose = function () { // get all added modules and remove them moduleManager.dispose(); middlewareManager.dispose(); extensions.forEach(function (p) { if (p.dispose) { p.dispose(); } }); }; store.addModules(initialModules); return store; } exports.createStore = createStore; /***/ }), /***/ "../redux-dynamic-modules-core/lib/Utils/ComparableMap.js": /*!*****************************************!*\ !*** .-core/lib/Utils/ComparableMap.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; /** * We will use it where we can not use the default Map as the Map class do not allow custom compare function * @param equals Optional, a comparer to use */ function getMap(equals) { var keys = []; var values = {}; return { /** * Current set of keys */ keys: keys, /** * Gets value for given key */ get: function (key) { if (!key) { return undefined; } var index = keys.findIndex(function (k) { return k && equals(k, key); }); if (index === -1) { return undefined; } return values[index]; }, /** * Adds the given key and value */ add: function (key, value) { if (!key) { return; } var index = keys.findIndex(function (k) { return k && equals(k, key); }); if (index === -1) { keys.push(key); values[keys.length - 1] = value; } }, /** * Removes the given key and returns the value object if key was found */ remove: function (key) { if (!key) { return undefined; } var index = keys.findIndex(function (k) { return k && equals(k, key); }); if (index === -1) { return undefined; } delete keys[index]; var value = values[index]; delete values[index]; return value; } }; } exports.getMap = getMap; /***/ }), /***/ "../redux-dynamic-modules-core/lib/Utils/Flatten.js": /*!***********************************!*\ !*** .-core/lib/Utils/Flatten.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; exports.__esModule = true; function flatten(arr) { if (arr) { var res = arr.slice(); var i = 0; while (i < res.length) { if (Array.isArray(res[i])) { res.splice.apply(res, __spreadArrays([i, 1], res[i])); } else { i++; } } return res; } return arr; } exports.flatten = flatten; /***/ }), /***/ "../redux-dynamic-modules-core/lib/Utils/RefCounter.js": /*!**************************************!*\ !*** .-core/lib/Utils/RefCounter.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; /** Ref counts given object */ function getObjectRefCounter(equals, retained) { if (!equals) { equals = function (a, b) { return a === b; }; } if (!retained) { retained = function () { return false; }; } var objects = []; var counts = []; return { /** * Gets ref count of given T */ getCount: function (obj) { if (obj === undefined || obj === null) { return 0; } var index = objects.findIndex(function (o) { return o && equals(o, obj); }); if (index === -1) { return 0; } return counts[index]; }, /** * Add given T or increments ref count */ add: function (obj) { if (obj === undefined || obj === null) { return; } var index = objects.findIndex(function (o) { return o && equals(o, obj); }); var count = 1; if (index === -1) { index = objects.length; objects.push(obj); } else { count = counts[index] + 1; } // If item is retained then keep it for inifinty if (retained(obj)) { count = Infinity; } counts[index] = count; }, /** * Decreases ref count for given T, if refcount reaches to zero removes the T and returns true */ remove: function (obj) { if (retained(obj)) { return false; } var index = objects.findIndex(function (o) { return o && equals(o, obj); }); if (index === -1) { return false; } if (counts[index] === 1) { delete objects[index]; delete counts[index]; return true; } counts[index] = counts[index] - 1; return false; } }; } exports.getObjectRefCounter = getObjectRefCounter; /** * Ref counts strings */ function getStringRefCounter() { var values = {}; return { /** * Returns current ref count for the key */ getCount: function (key) { if (key === undefined || key === null) { return 0; } return values[key] || 0; }, /** * Adds given key for ref counting or increments ref count */ add: function (key) { if (key === undefined || key === null) { return; } if (!values[key]) { values[key] = 1; } else { values[key]++; } }, /** * Decreases ref count for the given key, if the ref count reaches 0 removes the key and returns true */ remove: function (key) { if (key === undefined || key === null) { return false; } if (!values[key]) { return false; } if (values[key] === 1) { delete values[key]; return true; } values[key]--; return false; } }; } exports.getStringRefCounter = getStringRefCounter; /***/ }), /***/ "../redux-dynamic-modules-core/lib/index.js": /*!***************************!*\ !*** .-core/lib/index.js ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } exports.__esModule = true; __export(__webpack_require__(/*! ./ModuleStore */ "../redux-dynamic-modules-core/lib/ModuleStore.js")); __export(__webpack_require__(/*! ./Utils/ComparableMap */ "../redux-dynamic-modules-core/lib/Utils/ComparableMap.js")); __export(__webpack_require__(/*! ./Utils/RefCounter */ "../redux-dynamic-modules-core/lib/Utils/RefCounter.js")); __export(__webpack_require__(/*! ./Managers/MiddlewareManager */ "../redux-dynamic-modules-core/lib/Managers/MiddlewareManager.js")); __export(__webpack_require__(/*! ./Managers/RefCountedManager */ "../redux-dynamic-modules-core/lib/Managers/RefCountedManager.js")); //Dummy change to keep lerna happy /***/ }), /***/ "../redux-dynamic-modules-react/lib/DynamicModuleLoader.js": /*!******************************************!*\ !*** .-react/lib/DynamicModuleLoader.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; exports.__esModule = true; var React = __webpack_require__(/*! react */ "react"); //@ts-ignore // ReactReduxContext is not officially exported var react_redux_1 = __webpack_require__(/*! react-redux */ "react-redux"); /** * The DynamicModuleLoader adds a way to register a module on mount * When this component is initialized, the reducer and saga from the module passed as props will be registered with the system * On unmount, they will be unregistered */ var DynamicModuleLoader = /** @class */ (function (_super) { __extends(DynamicModuleLoader, _super); function DynamicModuleLoader() { return _super !== null && _super.apply(this, arguments) || this; } DynamicModuleLoader.prototype.render = function () { var _this = this; return (React.createElement(react_redux_1.ReactReduxContext.Consumer, null, function (reactReduxContext) { return (React.createElement(DynamicModuleLoaderImpl, __assign({}, _this.props, { reactReduxContext: reactReduxContext }))); })); }; return DynamicModuleLoader; }(React.Component)); exports.DynamicModuleLoader = DynamicModuleLoader; var DynamicModuleLoaderImpl = /** @class */ (function (_super) { __extends(DynamicModuleLoaderImpl, _super); function DynamicModuleLoaderImpl(props) { var _this = _super.call(this, props) || this; /** Flag that indicates we need to create a store/provider because a parent store was not provided */ _this._providerInitializationNeeded = false; /** * Unregister sagas and reducers */ _this._cleanup = function () { if (_this._addedModules) { _this._addedModules.remove(); _this._addedModules = undefined; } }; if (props.reactReduxContext == null) { var message = "Tried to render DynamicModuleLoader, but no ReactReduxContext was provided"; console.error(message); throw new Error(message); } _this._store = props.reactReduxContext ? props.reactReduxContext.store : undefined; // We are not in strict mode, let's add the modules ASAP if (!_this.props.strictMode) { _this._addModules(); _this.state = { readyToRender: true }; } else { // We are in strict mode, so have to wait for CDM to add modules. // Thus, we cannot render the children at this time _this.state = { readyToRender: false }; } return _this; } DynamicModuleLoaderImpl.prototype.render = function () { if (this.state.readyToRender) { if (this._providerInitializationNeeded) { return (React.createElement(react_redux_1.Provider, { store: this._store }, React.createElement(DynamicModuleLoader, __assign({}, this.props)))); } return (React.createElement(React.Fragment, null, this._renderLoader(), React.createElement(AddedModulesCleanup, { cleanup: this._cleanup }))); } return null; }; /** * Render a Redux provider */ DynamicModuleLoaderImpl.prototype._renderLoader = function () { return this.props.children ? typeof this.props.children === "function" ? this.props.children() : this.props.children : null; }; DynamicModuleLoaderImpl.prototype._addModules = function () { var _a = this.props, createStore = _a.createStore, modules = _a.modules; if (!this._store) { // If we need to create a store, do that here. We will skip adding the modules and render DML again if (createStore) { this._store = createStore(); this._providerInitializationNeeded = true; } else { throw new Error("Store could not be resolved from React context"); } } else { // Add the modules here this._addedModules = this._store.addModules(modules); } }; DynamicModuleLoaderImpl.prototype.componentDidMount = function () { if (this.props.strictMode) { this._addModules(); this.setState({ readyToRender: true }); } }; return DynamicModuleLoaderImpl; }(React.Component)); /** * This component is rendered as the last child of DynamicModuleLoaderImpl * so react runs willUnmount on connected(react-redux) children before this * cleanup and allows them to unsubscribe from store before dynamic reducers * removing (and avoid errors in selectors) */ var AddedModulesCleanup = /** @class */ (function (_super) { __extends(AddedModulesCleanup, _super); function AddedModulesCleanup() { return _super !== null && _super.apply(this, arguments) || this; } AddedModulesCleanup.prototype.render = function () { return null; }; AddedModulesCleanup.prototype.componentWillUnmount = function () { this.props.cleanup(); }; return AddedModulesCleanup; }(React.Component)); /***/ }), /***/ "../redux-dynamic-modules-react/lib/index.js": /*!****************************!*\ !*** .-react/lib/index.js ***! \****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } exports.__esModule = true; __export(__webpack_require__(/*! redux-dynamic-modules-core */ "../redux-dynamic-modules-core/lib/index.js")); __export(__webpack_require__(/*! ./DynamicModuleLoader */ "../redux-dynamic-modules-react/lib/DynamicModuleLoader.js")); /***/ }), /***/ "./lib/index.js": /*!**********************!*\ !*** ./lib/index.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } exports.__esModule = true; __export(__webpack_require__(/*! redux-dynamic-modules-core */ "../redux-dynamic-modules-core/lib/index.js")); __export(__webpack_require__(/*! redux-dynamic-modules-react */ "../redux-dynamic-modules-react/lib/index.js")); /***/ }), /***/ "react": /*!************************!*\ !*** external "react" ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_react__; /***/ }), /***/ "react-redux": /*!******************************!*\ !*** external "react-redux" ***! \******************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_react_redux__; /***/ }), /***/ "redux": /*!************************!*\ !*** external "redux" ***! \************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_redux__; /***/ }) /******/ }); }); //# sourceMappingURL=redux-dynamic-modules.js.map