UNPKG

@simplux/core

Version:

The core package of simplux. Contains everything to manage your application state in a simple way.

127 lines (126 loc) 17.6 kB
import { combineReducers, } from 'redux'; let lastStoreId = 0; let proxy; /** * @internal */ export const simpluxStore = _createSimpluxStore(_getStoreProxy); /** * This function is part of the internal simplux API that should only ever * be used by its extension packages. * * @internal */ export function _getStoreProxy() { if (process.env.NODE_ENV !== 'production') { if (!proxy) { throw new Error('simplux must be initialized with a redux store before it can be used!'); } } return proxy; } /** * @internal */ export function _setReduxStore(storeToUse, simpluxStateGetter) { const previousStoreProxy = proxy; if (!storeToUse) { proxy = undefined; return () => { proxy = previousStoreProxy; }; } const id = lastStoreId++; const subscribers = []; proxy = _createReduxStoreProxy(storeToUse, simpluxStateGetter, id, subscribers); if (previousStoreProxy) { _transferSubscribersToNewStore(previousStoreProxy, proxy); _dispatchActionsFromPreviousStore(previousStoreProxy, proxy); } return () => { if (process.env.NODE_ENV !== 'production') { if (!proxy) { return; } if (proxy.id !== id) { throw new Error('cannot cleanup store since another store has been set'); } } proxy = previousStoreProxy; }; function _transferSubscribersToNewStore(previousStoreProxy, newReduxStoreProxy) { for (const subscriber of previousStoreProxy.subscribers) { subscriber.unsubscribe(); newReduxStoreProxy.subscribe(subscriber.handler); } } function _dispatchActionsFromPreviousStore({ actionsToDispatchOnStoreChange }, newReduxStoreProxy) { for (const action of actionsToDispatchOnStoreChange) { newReduxStoreProxy.dispatch(action); } } } /** * @internal */ export function _createReduxStoreProxy(storeToUse, simpluxStateGetter, id, subscribers) { // this is a workaround for a race condition that can happen when loading an // application: if an imported module dispatches actions on the store (e.g. by // calling mutations in the module scope), these actions can get lost if a // new store gets set; this is not what users would expect, so we capture all // actions dispatched before the end of the first microtask queue, which basically // means capturing all actions dispatched during module evaluation; these actions // are then dispatched again on the new store, which restores the expected // behavior of seeing those actions in the new store let shouldCaptureActions = true; const actionsToDispatchOnStoreChange = []; function stopCapture() { return Promise.resolve().then(() => { shouldCaptureActions = false; const actions = actionsToDispatchOnStoreChange; actions.splice(0, actions.length); }); } stopCapture().catch(() => void 0); const dispatch = (action) => { if (shouldCaptureActions) { actionsToDispatchOnStoreChange.push(action); } return storeToUse.dispatch(action); }; return Object.assign(Object.assign({ id, subscribers, actionsToDispatchOnStoreChange }, storeToUse), { dispatch, getState: () => simpluxStateGetter(storeToUse.getState()), subscribe: (handler) => { const unsubscribe = storeToUse.subscribe(handler); const subscriber = { handler, unsubscribe }; subscribers.push(subscriber); return () => { unsubscribe(); const idx = subscribers.indexOf(subscriber); if (idx >= 0) { subscribers.splice(idx, 1); } }; } }); } /** * @internal */ export function _createSimpluxStore(getReduxStoreProxy) { const reducers = {}; let reducer; const rootReducer = (state = {}, action) => reducer ? reducer(state, action) : state; return { rootReducer, getState: () => getReduxStoreProxy().getState(), dispatch: (action) => getReduxStoreProxy().dispatch(action), subscribe: (listener) => getReduxStoreProxy().subscribe(listener), setReducer: (name, reducerToAdd) => { reducers[name] = reducerToAdd; reducer = combineReducers(reducers); getReduxStoreProxy().dispatch({ type: `@simplux/setReducer/${name}` }); }, getReducer: (name) => reducers[name], }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VzIjpbIkBzaW1wbHV4L2NvcmUvc3JjL3N0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWN0aW9uLFxyXG4gIGNvbWJpbmVSZWR1Y2VycyxcclxuICBEaXNwYXRjaCxcclxuICBSZWR1Y2VyLFxyXG4gIFN0b3JlIGFzIFJlZHV4U3RvcmUsXHJcbn0gZnJvbSAncmVkdXgnXHJcblxyXG4vKipcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIF9JbnRlcm5hbFJlZHV4U3RvcmVQcm94eSB7XHJcbiAgaWQ6IG51bWJlclxyXG4gIGdldFN0YXRlOiAoKSA9PiBhbnlcclxuICBkaXNwYXRjaDogUmVkdXhTdG9yZVsnZGlzcGF0Y2gnXVxyXG4gIHN1YnNjcmliZTogUmVkdXhTdG9yZVsnc3Vic2NyaWJlJ11cclxuICBzdWJzY3JpYmVyczogeyBoYW5kbGVyOiAoKSA9PiB2b2lkOyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9W11cclxuICBhY3Rpb25zVG9EaXNwYXRjaE9uU3RvcmVDaGFuZ2U6IEFjdGlvbltdXHJcbn1cclxuXHJcbmxldCBsYXN0U3RvcmVJZCA9IDBcclxubGV0IHByb3h5OiBfSW50ZXJuYWxSZWR1eFN0b3JlUHJveHkgfCB1bmRlZmluZWRcclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjb25zdCBzaW1wbHV4U3RvcmUgPSBfY3JlYXRlU2ltcGx1eFN0b3JlKF9nZXRTdG9yZVByb3h5KVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgaW50ZXJuYWwgc2ltcGx1eCBBUEkgdGhhdCBzaG91bGQgb25seSBldmVyXHJcbiAqIGJlIHVzZWQgYnkgaXRzIGV4dGVuc2lvbiBwYWNrYWdlcy5cclxuICpcclxuICogQGludGVybmFsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX2dldFN0b3JlUHJveHkoKSB7XHJcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcclxuICAgIGlmICghcHJveHkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdzaW1wbHV4IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIHJlZHV4IHN0b3JlIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCEnLFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcHJveHkhXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfc2V0UmVkdXhTdG9yZTxUU3RhdGU+KFxyXG4gIHN0b3JlVG9Vc2U6IFJlZHV4U3RvcmU8VFN0YXRlPixcclxuICBzaW1wbHV4U3RhdGVHZXR0ZXI6IChyb290U3RhdGU6IFRTdGF0ZSkgPT4gYW55LFxyXG4pIHtcclxuICBjb25zdCBwcmV2aW91c1N0b3JlUHJveHkgPSBwcm94eVxyXG5cclxuICBpZiAoIXN0b3JlVG9Vc2UpIHtcclxuICAgIHByb3h5ID0gdW5kZWZpbmVkXHJcbiAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICBwcm94eSA9IHByZXZpb3VzU3RvcmVQcm94eVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgaWQgPSBsYXN0U3RvcmVJZCsrXHJcblxyXG4gIGNvbnN0IHN1YnNjcmliZXJzOiBfSW50ZXJuYWxSZWR1eFN0b3JlUHJveHlbJ3N1YnNjcmliZXJzJ10gPSBbXVxyXG5cclxuICBwcm94eSA9IF9jcmVhdGVSZWR1eFN0b3JlUHJveHkoXHJcbiAgICBzdG9yZVRvVXNlLFxyXG4gICAgc2ltcGx1eFN0YXRlR2V0dGVyLFxyXG4gICAgaWQsXHJcbiAgICBzdWJzY3JpYmVycyxcclxuICApXHJcblxyXG4gIGlmIChwcmV2aW91c1N0b3JlUHJveHkpIHtcclxuICAgIF90cmFuc2ZlclN1YnNjcmliZXJzVG9OZXdTdG9yZShwcmV2aW91c1N0b3JlUHJveHksIHByb3h5KVxyXG4gICAgX2Rpc3BhdGNoQWN0aW9uc0Zyb21QcmV2aW91c1N0b3JlKHByZXZpb3VzU3RvcmVQcm94eSwgcHJveHkpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gKCkgPT4ge1xyXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcclxuICAgICAgaWYgKCFwcm94eSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocHJveHkuaWQgIT09IGlkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgY2xlYW51cCBzdG9yZSBzaW5jZSBhbm90aGVyIHN0b3JlIGhhcyBiZWVuIHNldCcpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm94eSA9IHByZXZpb3VzU3RvcmVQcm94eVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gX3RyYW5zZmVyU3Vic2NyaWJlcnNUb05ld1N0b3JlKFxyXG4gICAgcHJldmlvdXNTdG9yZVByb3h5OiBfSW50ZXJuYWxSZWR1eFN0b3JlUHJveHksXHJcbiAgICBuZXdSZWR1eFN0b3JlUHJveHk6IF9JbnRlcm5hbFJlZHV4U3RvcmVQcm94eSxcclxuICApIHtcclxuICAgIGZvciAoY29uc3Qgc3Vic2NyaWJlciBvZiBwcmV2aW91c1N0b3JlUHJveHkuc3Vic2NyaWJlcnMpIHtcclxuICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpXHJcbiAgICAgIG5ld1JlZHV4U3RvcmVQcm94eS5zdWJzY3JpYmUoc3Vic2NyaWJlci5oYW5kbGVyKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gX2Rpc3BhdGNoQWN0aW9uc0Zyb21QcmV2aW91c1N0b3JlKFxyXG4gICAgeyBhY3Rpb25zVG9EaXNwYXRjaE9uU3RvcmVDaGFuZ2UgfTogX0ludGVybmFsUmVkdXhTdG9yZVByb3h5LFxyXG4gICAgbmV3UmVkdXhTdG9yZVByb3h5OiBfSW50ZXJuYWxSZWR1eFN0b3JlUHJveHksXHJcbiAgKSB7XHJcbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zVG9EaXNwYXRjaE9uU3RvcmVDaGFuZ2UpIHtcclxuICAgICAgbmV3UmVkdXhTdG9yZVByb3h5LmRpc3BhdGNoKGFjdGlvbilcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlUmVkdXhTdG9yZVByb3h5PFRTdGF0ZT4oXHJcbiAgc3RvcmVUb1VzZTogUmVkdXhTdG9yZTxUU3RhdGU+LFxyXG4gIHNpbXBsdXhTdGF0ZUdldHRlcjogKHJvb3RTdGF0ZTogVFN0YXRlKSA9PiBhbnksXHJcbiAgaWQ6IG51bWJlcixcclxuICBzdWJzY3JpYmVyczogX0ludGVybmFsUmVkdXhTdG9yZVByb3h5WydzdWJzY3JpYmVycyddLFxyXG4pOiBfSW50ZXJuYWxSZWR1eFN0b3JlUHJveHkge1xyXG4gIC8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBhIHJhY2UgY29uZGl0aW9uIHRoYXQgY2FuIGhhcHBlbiB3aGVuIGxvYWRpbmcgYW5cclxuICAvLyBhcHBsaWNhdGlvbjogaWYgYW4gaW1wb3J0ZWQgbW9kdWxlIGRpc3BhdGNoZXMgYWN0aW9ucyBvbiB0aGUgc3RvcmUgKGUuZy4gYnlcclxuICAvLyBjYWxsaW5nIG11dGF0aW9ucyBpbiB0aGUgbW9kdWxlIHNjb3BlKSwgdGhlc2UgYWN0aW9ucyBjYW4gZ2V0IGxvc3QgaWYgYVxyXG4gIC8vIG5ldyBzdG9yZSBnZXRzIHNldDsgdGhpcyBpcyBub3Qgd2hhdCB1c2VycyB3b3VsZCBleHBlY3QsIHNvIHdlIGNhcHR1cmUgYWxsXHJcbiAgLy8gYWN0aW9ucyBkaXNwYXRjaGVkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBmaXJzdCBtaWNyb3Rhc2sgcXVldWUsIHdoaWNoIGJhc2ljYWxseVxyXG4gIC8vIG1lYW5zIGNhcHR1cmluZyBhbGwgYWN0aW9ucyBkaXNwYXRjaGVkIGR1cmluZyBtb2R1bGUgZXZhbHVhdGlvbjsgdGhlc2UgYWN0aW9uc1xyXG4gIC8vIGFyZSB0aGVuIGRpc3BhdGNoZWQgYWdhaW4gb24gdGhlIG5ldyBzdG9yZSwgd2hpY2ggcmVzdG9yZXMgdGhlIGV4cGVjdGVkXHJcbiAgLy8gYmVoYXZpb3Igb2Ygc2VlaW5nIHRob3NlIGFjdGlvbnMgaW4gdGhlIG5ldyBzdG9yZVxyXG4gIGxldCBzaG91bGRDYXB0dXJlQWN0aW9ucyA9IHRydWVcclxuICBjb25zdCBhY3Rpb25zVG9EaXNwYXRjaE9uU3RvcmVDaGFuZ2U6IEFjdGlvbltdID0gW11cclxuXHJcbiAgZnVuY3Rpb24gc3RvcENhcHR1cmUoKSB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIHNob3VsZENhcHR1cmVBY3Rpb25zID0gZmFsc2VcclxuICAgICAgY29uc3QgYWN0aW9ucyA9IGFjdGlvbnNUb0Rpc3BhdGNoT25TdG9yZUNoYW5nZVxyXG4gICAgICBhY3Rpb25zLnNwbGljZSgwLCBhY3Rpb25zLmxlbmd0aClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzdG9wQ2FwdHVyZSgpLmNhdGNoKCgpID0+IHZvaWQgMClcclxuXHJcbiAgY29uc3QgZGlzcGF0Y2g6IERpc3BhdGNoID0gKGFjdGlvbikgPT4ge1xyXG4gICAgaWYgKHNob3VsZENhcHR1cmVBY3Rpb25zKSB7XHJcbiAgICAgIGFjdGlvbnNUb0Rpc3BhdGNoT25TdG9yZUNoYW5nZS5wdXNoKGFjdGlvbilcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RvcmVUb1VzZS5kaXNwYXRjaChhY3Rpb24pXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgaWQsXHJcbiAgICBzdWJzY3JpYmVycyxcclxuICAgIGFjdGlvbnNUb0Rpc3BhdGNoT25TdG9yZUNoYW5nZSxcclxuICAgIC4uLnN0b3JlVG9Vc2UsXHJcbiAgICBkaXNwYXRjaCxcclxuICAgIGdldFN0YXRlOiAoKSA9PiBzaW1wbHV4U3RhdGVHZXR0ZXIoc3RvcmVUb1VzZS5nZXRTdGF0ZSgpKSxcclxuICAgIHN1YnNjcmliZTogKGhhbmRsZXIpID0+IHtcclxuICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZVRvVXNlLnN1YnNjcmliZShoYW5kbGVyKVxyXG4gICAgICBjb25zdCBzdWJzY3JpYmVyID0geyBoYW5kbGVyLCB1bnN1YnNjcmliZSB9XHJcbiAgICAgIHN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcilcclxuXHJcbiAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgdW5zdWJzY3JpYmUoKVxyXG5cclxuICAgICAgICBjb25zdCBpZHggPSBzdWJzY3JpYmVycy5pbmRleE9mKHN1YnNjcmliZXIpXHJcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgICBzdWJzY3JpYmVycy5zcGxpY2UoaWR4LCAxKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgX1NpbXBsdXhTdG9yZSB7XHJcbiAgcm9vdFJlZHVjZXI6IFJlZHVjZXJcclxuICBnZXRTdGF0ZTogKCkgPT4gYW55XHJcbiAgZGlzcGF0Y2g6IFJlZHV4U3RvcmVbJ2Rpc3BhdGNoJ11cclxuICBzdWJzY3JpYmU6IFJlZHV4U3RvcmVbJ3N1YnNjcmliZSddXHJcbiAgc2V0UmVkdWNlcjogPFQgPSBhbnk+KG5hbWU6IHN0cmluZywgcmVkdWNlcjogUmVkdWNlcjxUPikgPT4gdm9pZFxyXG4gIGdldFJlZHVjZXI6IDxUID0gYW55PihuYW1lOiBzdHJpbmcpID0+IFJlZHVjZXI8VD5cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9jcmVhdGVTaW1wbHV4U3RvcmUoXHJcbiAgZ2V0UmVkdXhTdG9yZVByb3h5OiAoKSA9PiBfSW50ZXJuYWxSZWR1eFN0b3JlUHJveHksXHJcbik6IF9TaW1wbHV4U3RvcmUge1xyXG4gIGNvbnN0IHJlZHVjZXJzOiB7IFtuYW1lOiBzdHJpbmddOiBSZWR1Y2VyIH0gPSB7fVxyXG4gIGxldCByZWR1Y2VyOiBSZWR1Y2VyIHwgdW5kZWZpbmVkXHJcblxyXG4gIGNvbnN0IHJvb3RSZWR1Y2VyOiBSZWR1Y2VyID0gKHN0YXRlID0ge30sIGFjdGlvbikgPT5cclxuICAgIHJlZHVjZXIgPyByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIDogc3RhdGVcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHJvb3RSZWR1Y2VyLFxyXG4gICAgZ2V0U3RhdGU6ICgpID0+IGdldFJlZHV4U3RvcmVQcm94eSgpLmdldFN0YXRlKCksXHJcbiAgICBkaXNwYXRjaDogKGFjdGlvbikgPT4gZ2V0UmVkdXhTdG9yZVByb3h5KCkuZGlzcGF0Y2goYWN0aW9uKSxcclxuICAgIHN1YnNjcmliZTogKGxpc3RlbmVyKSA9PiBnZXRSZWR1eFN0b3JlUHJveHkoKS5zdWJzY3JpYmUobGlzdGVuZXIpLFxyXG5cclxuICAgIHNldFJlZHVjZXI6IChuYW1lLCByZWR1Y2VyVG9BZGQpID0+IHtcclxuICAgICAgcmVkdWNlcnNbbmFtZV0gPSByZWR1Y2VyVG9BZGRcclxuICAgICAgcmVkdWNlciA9IGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VycylcclxuXHJcbiAgICAgIGdldFJlZHV4U3RvcmVQcm94eSgpLmRpc3BhdGNoKHsgdHlwZTogYEBzaW1wbHV4L3NldFJlZHVjZXIvJHtuYW1lfWAgfSlcclxuICAgIH0sXHJcblxyXG4gICAgZ2V0UmVkdWNlcjogKG5hbWUpID0+IHJlZHVjZXJzW25hbWVdISxcclxuICB9XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxlQUFlLEdBSWhCLE1BQU0sT0FBTyxDQUFBO0FBY2QsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFBO0FBQ25CLElBQUksS0FBMkMsQ0FBQTtBQUUvQzs7R0FFRztBQUNILE1BQU0s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