@simplux/core
Version:
The core package of simplux. Contains everything to manage your application state in a simple way.
84 lines (83 loc) • 11.7 kB
JavaScript
/**
* Helper symbol used for identifying simplux effect objects.
*
* @public
*/
// should really be a symbol, but as of TypeScript 4.1 there is a bug
// that causes the symbol to not be properly re-exported in type
// definitions when spreading a effect object onto an export, which can
// cause issues with composite builds
export const SIMPLUX_EFFECT = '[SIMPLUX_EFFECT]';
const mocks = [];
/**
* Create a new effect. An effect is any function that has side effects.
* The main purpose of this function is to allow simple mocking of the
* effect.
*
* @param effect - the effect to create
*
* @returns a function that calls the provided effect and can be mocked
*
* @public
*/
export function createEffect(effect) {
return createEffects({ ['n/a']: effect })['n/a'];
}
/**
* Create new effects. An effect is any function that has side effects.
* The main purpose of this function is to allow simple mocking of the
* effect.
*
* @param effects - the effects to create
*
* @returns functions that call the provided effects and can be mocked
*
* @public
*/
export function createEffects(effects) {
return Object.keys(effects).reduce((res, key) => (Object.assign(Object.assign({}, res), { [key]: _createEffect(effects[key], key) })), {});
function _createEffect(effect, effectName) {
const effectFn = nameFunction(effectName, (...args) => {
const mockDef = mocks.find(({ effectToMock }) => effectToMock === effectFn);
if (mockDef) {
return mockDef.mockFn(...args);
}
return effect(...args);
});
effectFn.effectName = effectName;
effectFn[SIMPLUX_EFFECT] = '';
return effectFn;
// this helper function allows creating a function with a dynamic name (only works with ES6+)
function nameFunction(name, body) {
return {
[name](...args) {
return body(...args);
},
}[name];
}
}
}
/**
* This interface is used for mocking support during testing.
* It is part of the internal simplux API and should not be
* used directly by application code.
*
* @internal
*/
export function _getEffectMocks() {
return mocks;
}
/**
* Checks if an object is a simplux effect.
*
* @param object - the object to check
*
* @returns true if the object is a simplux effect
*
* @internal
*/
export function _isSimpluxEffect(object) {
var _a;
return ((_a = object) === null || _a === void 0 ? void 0 : _a[SIMPLUX_EFFECT]) === '';
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0cy5qcyIsInNvdXJjZXMiOlsiQHNpbXBsdXgvY29yZS9zcmMvZWZmZWN0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZ1bmN0aW9uU2lnbmF0dXJlLCBNdXRhYmxlIH0gZnJvbSAnLi90eXBlcy5qcydcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgc3ltYm9sIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNpbXBsdXggZWZmZWN0IG9iamVjdHMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbi8vIHNob3VsZCByZWFsbHkgYmUgYSBzeW1ib2wsIGJ1dCBhcyBvZiBUeXBlU2NyaXB0IDQuMSB0aGVyZSBpcyBhIGJ1Z1xyXG4vLyB0aGF0IGNhdXNlcyB0aGUgc3ltYm9sIHRvIG5vdCBiZSBwcm9wZXJseSByZS1leHBvcnRlZCBpbiB0eXBlXHJcbi8vIGRlZmluaXRpb25zIHdoZW4gc3ByZWFkaW5nIGEgZWZmZWN0IG9iamVjdCBvbnRvIGFuIGV4cG9ydCwgd2hpY2ggY2FuXHJcbi8vIGNhdXNlIGlzc3VlcyB3aXRoIGNvbXBvc2l0ZSBidWlsZHNcclxuZXhwb3J0IGNvbnN0IFNJTVBMVVhfRUZGRUNUID0gJ1tTSU1QTFVYX0VGRkVDVF0nXHJcblxyXG4vKipcclxuICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbW9ja2luZyBzdXBwb3J0IGR1cmluZyB0ZXN0aW5nLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgX0VmZmVjdE1vY2tEZWZpbml0aW9uIHtcclxuICByZWFkb25seSBlZmZlY3RUb01vY2s6IEZ1bmN0aW9uXHJcbiAgcmVhZG9ubHkgbW9ja0ZuOiBGdW5jdGlvblxyXG59XHJcblxyXG4vKipcclxuICogVGhlIGZ1bmN0aW9ucyB0byB0dXJuIGludG8gZWZmZWN0cy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbHV4RWZmZWN0RGVmaW5pdGlvbnMge1xyXG4gIHJlYWRvbmx5IFtuYW1lOiBzdHJpbmddOiAoLi4uYXJnczogYW55W10pID0+IGFueVxyXG59XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBpZGVudGlmeWluZyBzaW1wbHV4IGVmZmVjdCBvYmplY3RzIGF0IGNvbXBpbGUgdGltZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbHV4RWZmZWN0TWFya2VyPFxyXG4gIFRGdW5jdGlvbiBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XHJcbj4ge1xyXG4gIC8qKlxyXG4gICAqIEEgc3ltYm9sIHRoYXQgYWxsb3dzIGVmZmljaWVudCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIGlkZW50aWZpY2F0aW9uXHJcbiAgICogb2Ygc2ltcGx1eCBlZmZlY3Qgb2JqZWN0cy5cclxuICAgKlxyXG4gICAqIFRoaXMgcHJvcGVydHkgd2lsbCBoYXZlIGFuIGB1bmRlZmluZWRgIHZhbHVlIGF0IHJ1bnRpbWUuXHJcbiAgICpcclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgW1NJTVBMVVhfRUZGRUNUXTogVEZ1bmN0aW9uXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsdXhFZmZlY3RNZXRhZGF0YSB7XHJcbiAgLyoqXHJcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBlZmZlY3QuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZWZmZWN0TmFtZTogc3RyaW5nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHdpdGggc2lkZS1lZmZlY3RzIHRoYXQgY2FuIGJlIGVhc2lseSBtb2NrZWQgZm9yIHRlc3RpbmcuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNpbXBsdXhFZmZlY3Q8XHJcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcclxuPiA9IEZ1bmN0aW9uU2lnbmF0dXJlPFRGdW5jdGlvbj4gJlxyXG4gIFNpbXBsdXhFZmZlY3RNYXJrZXI8VEZ1bmN0aW9uPiAmXHJcbiAgU2ltcGx1eEVmZmVjdE1ldGFkYXRhXHJcblxyXG4vKipcclxuICogQSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucyB3aXRoIHNpZGUtZWZmZWN0cyB0aGF0IGNhbiBiZSBlYXNpbHkgbW9ja2VkIGZvciB0ZXN0aW5nLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTaW1wbHV4RWZmZWN0czxcclxuICBURWZmZWN0RGVmaW5pdGlvbnMgZXh0ZW5kcyBTaW1wbHV4RWZmZWN0RGVmaW5pdGlvbnNcclxuPiA9IHtcclxuICBbZWZmZWN0TmFtZSBpbiBrZXlvZiBURWZmZWN0RGVmaW5pdGlvbnNdOiBTaW1wbHV4RWZmZWN0PFxyXG4gICAgVEVmZmVjdERlZmluaXRpb25zW2VmZmVjdE5hbWVdXHJcbiAgPlxyXG59XHJcblxyXG5jb25zdCBtb2NrczogX0VmZmVjdE1vY2tEZWZpbml0aW9uW10gPSBbXVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBlZmZlY3QuIEFuIGVmZmVjdCBpcyBhbnkgZnVuY3Rpb24gdGhhdCBoYXMgc2lkZSBlZmZlY3RzLlxyXG4gKiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYWxsb3cgc2ltcGxlIG1vY2tpbmcgb2YgdGhlXHJcbiAqIGVmZmVjdC5cclxuICpcclxuICogQHBhcmFtIGVmZmVjdCAtIHRoZSBlZmZlY3QgdG8gY3JlYXRlXHJcbiAqXHJcbiAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgcHJvdmlkZWQgZWZmZWN0IGFuZCBjYW4gYmUgbW9ja2VkXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFZmZlY3Q8VEVmZmVjdEZ1bmN0aW9uIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxyXG4gIGVmZmVjdDogVEVmZmVjdEZ1bmN0aW9uLFxyXG4pOiBTaW1wbHV4RWZmZWN0PFRFZmZlY3RGdW5jdGlvbj4ge1xyXG4gIHJldHVybiBjcmVhdGVFZmZlY3RzKHsgWyduL2EnXTogZWZmZWN0IH0pWyduL2EnXVxyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIG5ldyBlZmZlY3RzLiBBbiBlZmZlY3QgaXMgYW55IGZ1bmN0aW9uIHRoYXQgaGFzIHNpZGUgZWZmZWN0cy5cclxuICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGFsbG93IHNpbXBsZSBtb2NraW5nIG9mIHRoZVxyXG4gKiBlZmZlY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSBlZmZlY3RzIC0gdGhlIGVmZmVjdHMgdG8gY3JlYXRlXHJcbiAqXHJcbiAqIEByZXR1cm5zIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlIHByb3ZpZGVkIGVmZmVjdHMgYW5kIGNhbiBiZSBtb2NrZWRcclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVmZmVjdHM8XHJcbiAgVEVmZmVjdERlZmluaXRpb25zIGV4dGVuZHMgU2ltcGx1eEVmZmVjdERlZmluaXRpb25zXHJcbj4oZWZmZWN0czogVEVmZmVjdERlZmluaXRpb25zKTogU2ltcGx1eEVmZmVjdHM8VEVmZmVjdERlZmluaXRpb25zPiB7XHJcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGVmZmVjdHMpLnJlZHVjZShcclxuICAgIChyZXMsIGtleSkgPT4gKHsgLi4ucmVzLCBba2V5XTogX2NyZWF0ZUVmZmVjdChlZmZlY3RzW2tleV0hLCBrZXkpIH0pLFxyXG4gICAge30gYXMgU2ltcGx1eEVmZmVjdHM8VEVmZmVjdERlZmluaXRpb25zPixcclxuICApXHJcblxyXG4gIGZ1bmN0aW9uIF9jcmVhdGVFZmZlY3Q8VEVmZmVjdEZ1bmN0aW9uIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxyXG4gICAgZWZmZWN0OiBURWZmZWN0RnVuY3Rpb24sXHJcbiAgICBlZmZlY3ROYW1lOiBzdHJpbmcsXHJcbiAgKTogU2ltcGx1eEVmZmVjdDxURWZmZWN0RnVuY3Rpb24+IHtcclxuICAgIGNvbnN0IGVmZmVjdEZuID0gKG5hbWVGdW5jdGlvbihlZmZlY3ROYW1lLCAoLi4uYXJnczogYW55W10pID0+IHtcclxuICAgICAgY29uc3QgbW9ja0RlZiA9IG1vY2tzLmZpbmQoXHJcbiAgICAgICAgKHsgZWZmZWN0VG9Nb2NrIH0pID0+IGVmZmVjdFRvTW9jayA9PT0gZWZmZWN0Rm4sXHJcbiAgICAgIClcclxuXHJcbiAgICAgIGlmIChtb2NrRGVmKSB7XHJcbiAgICAgICAgcmV0dXJuIG1vY2tEZWYubW9ja0ZuKC4uLmFyZ3MpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBlZmZlY3QoLi4uYXJncylcclxuICAgIH0pIGFzIHVua25vd24pIGFzIE11dGFibGU8U2ltcGx1eEVmZmVjdDxURWZmZWN0RnVuY3Rpb24+PlxyXG5cclxuICAgIGVmZmVjdEZuLmVmZmVjdE5hbWUgPSBlZmZlY3ROYW1lXHJcbiAgICBlZmZlY3RGbltTSU1QTFVYX0VGRkVDVF0gPSAnJyBhcyBhbnlcclxuXHJcbiAgICByZXR1cm4gZWZmZWN0Rm4gYXMgU2ltcGx1eEVmZmVjdDxURWZmZWN0RnVuY3Rpb24+XHJcblxyXG4gICAgLy8gdGhpcyBoZWxwZXIgZnVuY3Rpb24gYWxsb3dzIGNyZWF0aW5nIGEgZnVuY3Rpb24gd2l0aCBhIGR5bmFtaWMgbmFtZSAob25seSB3b3JrcyB3aXRoIEVTNispXHJcbiAgICBmdW5jdGlvbiBuYW1lRnVuY3Rpb248VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55PihcclxuICAgICAgbmFtZTogc3RyaW5nLFxyXG4gICAgICBib2R5OiBULFxyXG4gICAgKTogVCB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgW25hbWVdKC4uLmFyZ3M6IGFueVtdKSB7XHJcbiAgICAgICAgICByZXR1cm4gYm9keSguLi5hcmdzKVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH1bbmFtZV0gYXMgVFxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgZm9yIG1vY2tpbmcgc3VwcG9ydCBkdXJpbmcgdGVzdGluZy5cclxuICogSXQgaXMgcGFydCBvZiB0aGUgaW50ZXJuYWwgc2ltcGx1eCBBUEkgYW5kIHNob3VsZCBub3QgYmVcclxuICogdXNlZCBkaXJlY3RseSBieSBhcHBsaWNhdGlvbiBjb2RlLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RWZmZWN0TW9ja3MoKSB7XHJcbiAgcmV0dXJuIG1vY2tzXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgc2ltcGx1eCBlZmZlY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSBvYmplY3QgLSB0aGUgb2JqZWN0IHRvIGNoZWNrXHJcbiAqXHJcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHNpbXBsdXggZWZmZWN0XHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9pc1NpbXBsdXhFZmZlY3Q8XHJcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXHJcbiAgVE90aGVyXHJcbj4oXHJcbiAgb2JqZWN0OiBTaW1wbHV4RWZmZWN0TWFya2VyPFRGdW5jdGlvbj4gfCBUT3RoZXIsXHJcbik6IG9iamVjdCBpcyBTaW1wbHV4RWZmZWN0PFRGdW5jdGlvbj4ge1xyXG4gIHJldHVybiAob2JqZWN0IGFzIGFueSk/LltTSU1QTFVYX0VGRkVDVF0gPT09ICcnXHJcbn1cclxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7O0dBSUc7QUFDSCxxRUFBcUU7QUFDckUsZ0VBQWdFO0FBQ2hFLHVFQUF1RTtBQUN2RSxxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFBO0FBMEVoRCxNQUFNLEtBQUssR0FBNEIsRUFBRSxDQUFBO0FBRXpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixNQUF1QjtJQUV2QixPQUFPLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxhQUFhLENBRTNCLE9BQTJCO0lBQzNCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQ2hDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsaUNBQU0sR0FBRyxLQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUUsRUFBRSxHQUFHLENBQUMsSUFBRyxFQUNwRSxFQUF3QyxDQUN6QyxDQUFBO0lBRUQsU0FBUyxhQUFhLENBQ3BCLE1BQXVCLEVBQ3ZCLFVBQWtCO1FBRWxCLE1BQU0sUUFBUSxHQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFO1lBQzVELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQ3hCLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLFFBQVEsQ0FDaEQsQ0FBQTtZQUVELElBQUksT0FBTyxFQUFFO2dCQUNYLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO2FBQy9CO1lBRUQsT0FBTyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUN4QixDQUFDLENBQXdELENBQUE7UUFFekQsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDaEMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQVMsQ0FBQTtRQUVwQyxPQUFPLFFBQTBDLENBQUE7UUFFakQsNkZBQTZGO1FBQzdGLFNBQVMsWUFBWSxDQUNuQixJQUFZLEVBQ1osSUFBTztZQUVQLE9BQU87Z0JBQ0wsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQVc7b0JBQ25CLE9BQU8sSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUE7Z0JBQ3RCLENBQUM7YUFDRixDQUFDLElBQUksQ0FBTSxDQUFBO1FBQ2QsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWU7SUFDN0IsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBSTlCLE1BQStDOztJQUUvQyxPQUFPLENBQUEsTUFBQyxNQUFjLDBDQUFHLGNBQWMsQ0FBQyxNQUFLLEVBQUUsQ0FBQTtBQUNqRCxDQUFDIn0=