UNPKG

@simplux/angular

Version:

The Angular extension package of simplux. Provides a simple way to use simplux in Angular applications.

45 lines (44 loc) 10.5 kB
import { Observable } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; /** * Create a base which contains methods for interacting with a module. * This base class should be extended from an Angular service. * * For each mutation the service has a method to execute the mutation. * * For each selector the service has a method that returns an observable. * The observable immediately emits the result of the selector applied * to the module's current state when subscribed to. New values are * emitted whenever the state and the selector's result for that state * change. * * @param simpluxModule - the module to create the base class for * @param mutations - the mutations to add to the class * @param selectors - the selectors to add to the class * * @returns a base class that should be extended from an Angular service * * @public */ export function createModuleServiceBaseClass(simpluxModule, mutations, selectors) { return class { constructor() { this.getCurrentState = simpluxModule.state; this.selectState = () => observeState(simpluxModule); Object.assign(this, mutations); Object.assign(this, createObservableSelectors(simpluxModule, selectors)); } }; } function createObservableSelectors(simpluxModule, selectors) { const stateChanges$ = observeState(simpluxModule); return Object.keys(selectors).reduce((acc, selectorName) => { const selector = selectors[selectorName]; acc[selectorName] = ((...args) => stateChanges$.pipe(map((state) => selector.withState(state, ...args)), distinctUntilChanged())); return acc; }, {}); } function observeState(simpluxModule) { return new Observable((sub) => simpluxModule.subscribeToStateChanges((state) => sub.next(state))); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZXMiOlsiQHNpbXBsdXgvYW5ndWxhci9zcmMvc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XHJcbiAgSW1tdXRhYmxlLFxyXG4gIE11dGF0aW9uRGVmaW5pdGlvbnMsXHJcbiAgU2VsZWN0b3JEZWZpbml0aW9ucyxcclxuICBTaW1wbHV4TW9kdWxlLFxyXG4gIFNpbXBsdXhNdXRhdGlvbnMsXHJcbiAgU2ltcGx1eFNlbGVjdG9ycyxcclxufSBmcm9tICdAc2ltcGx1eC9jb3JlJ1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5cclxuLyoqXHJcbiAqIFRoZSBiYXNpYyBtZXRob2RzIGZvciBhIG1vZHVsZSBzZXJ2aWNlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVNlcnZpY2VTdGF0ZTxUU3RhdGU+IHtcclxuICAvKipcclxuICAgKiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgbW9kdWxlJ3MgY3VycmVudCBzdGF0ZS4gVGhlIHNuYXBzaG90IGlzXHJcbiAgICogaW1tdXRhYmxlIGFuZCB3aWxsIHRoZXJlZm9yZSBub3QgYmUgY2hhbmdlZCBldmVuIGlmIHRoZSBtb2R1bGVcclxuICAgKiBpcyB1cGRhdGVkLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgbW9kdWxlJ3MgY3VycmVudCBzdGF0ZVxyXG4gICAqL1xyXG4gIGdldEN1cnJlbnRTdGF0ZTogKCkgPT4gVFN0YXRlXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbiBvYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZXMgb2YgdGhlIG1vZHVsZS4gVGhlIG9ic2VydmFibGVcclxuICAgKiBlbWl0cyB0aGUgbW9kdWxlJ3MgY3VycmVudCBzdGF0ZSBpbW1lZGlhdGVseSB3aGVuIHN1YnNjcmliZWQgdG8uXHJcbiAgICogQWZ0ZXJ3YXJkcyBpdCB3aWxsIGVtaXQgYSBuZXcgdmFsdWUgd2hlbmV2ZXIgdGhlIG1vZHVsZSBnZXRzXHJcbiAgICogdXBkYXRlZC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIGFuIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcyBvZiB0aGUgbW9kdWxlXHJcbiAgICovXHJcbiAgc2VsZWN0U3RhdGU6ICgpID0+IE9ic2VydmFibGU8VFN0YXRlPlxyXG59XHJcblxyXG4vKipcclxuICogSGVscGVyIHR5cGUgdG8gdHJhbnNmb3JtIGEgc2VsZWN0b3IgaW50byBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xyXG4gKiBhbiBvYnNlcnZhYmxlIG9mIHRoZSBzZWxlY3RlZCB2YWx1ZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgT2JzZXJ2YWJsZVNlbGVjdG9yPFRTZWxlY3Rvcj4gPSBUU2VsZWN0b3IgZXh0ZW5kcyAoXHJcbiAgLi4uYXJnczogaW5mZXIgVEFyZ3NcclxuKSA9PiBpbmZlciBUUmV0dXJuXHJcbiAgPyAoLi4uYXJnczogVEFyZ3MpID0+IE9ic2VydmFibGU8VFJldHVybj5cclxuICA6IG5ldmVyXHJcblxyXG4vKipcclxuICogQSBjb2xsZWN0aW9uIG9mIG9ic2VydmFibGUgbW9kdWxlIHNlbGVjdG9ycy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IHR5cGUgTW9kdWxlU2VydmljZVNlbGVjdG9yczxcclxuICBUU3RhdGUsXHJcbiAgVFNlbGVjdG9ycyBleHRlbmRzIFNlbGVjdG9yRGVmaW5pdGlvbnM8VFN0YXRlPixcclxuICBUU2ltcGx1eFNlbGVjdG9ycyBleHRlbmRzIFNpbXBsdXhTZWxlY3RvcnM8VFN0YXRlLCBUU2VsZWN0b3JzPlxyXG4+ID0ge1xyXG4gIFtzZWxlY3Rvck5hbWUgaW4ga2V5b2YgVFNpbXBsdXhTZWxlY3RvcnNdOiBPYnNlcnZhYmxlU2VsZWN0b3I8XHJcbiAgICBUU2ltcGx1eFNlbGVjdG9yc1tzZWxlY3Rvck5hbWVdXHJcbiAgPlxyXG59XHJcblxyXG4vKipcclxuICogQSBzZXJ2aWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgbW9kdWxlLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBNb2R1bGVTZXJ2aWNlPFxyXG4gIFRTdGF0ZSxcclxuICBUTXV0YXRpb25zIGV4dGVuZHMgTXV0YXRpb25EZWZpbml0aW9uczxUU3RhdGU+LFxyXG4gIFRTaW1wbHV4TXV0YXRpb25zIGV4dGVuZHMgU2ltcGx1eE11dGF0aW9uczxUU3RhdGUsIFRNdXRhdGlvbnM+LFxyXG4gIFRTZWxlY3RvcnMgZXh0ZW5kcyBTZWxlY3RvckRlZmluaXRpb25zPFRTdGF0ZT4sXHJcbiAgVFNpbXBsdXhTZWxlY3RvcnMgZXh0ZW5kcyBTaW1wbHV4U2VsZWN0b3JzPFRTdGF0ZSwgVFNlbGVjdG9ycz5cclxuPiA9IE1vZHVsZVNlcnZpY2VTdGF0ZTxUU3RhdGU+ICZcclxuICBUU2ltcGx1eE11dGF0aW9ucyAmXHJcbiAgTW9kdWxlU2VydmljZVNlbGVjdG9yczxUU3RhdGUsIFRTZWxlY3RvcnMsIFRTaW1wbHV4U2VsZWN0b3JzPlxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGJhc2Ugd2hpY2ggY29udGFpbnMgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIG1vZHVsZS5cclxuICogVGhpcyBiYXNlIGNsYXNzIHNob3VsZCBiZSBleHRlbmRlZCBmcm9tIGFuIEFuZ3VsYXIgc2VydmljZS5cclxuICpcclxuICogRm9yIGVhY2ggbXV0YXRpb24gdGhlIHNlcnZpY2UgaGFzIGEgbWV0aG9kIHRvIGV4ZWN1dGUgdGhlIG11dGF0aW9uLlxyXG4gKlxyXG4gKiBGb3IgZWFjaCBzZWxlY3RvciB0aGUgc2VydmljZSBoYXMgYSBtZXRob2QgdGhhdCByZXR1cm5zIGFuIG9ic2VydmFibGUuXHJcbiAqIFRoZSBvYnNlcnZhYmxlIGltbWVkaWF0ZWx5IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIHNlbGVjdG9yIGFwcGxpZWRcclxuICogdG8gdGhlIG1vZHVsZSdzIGN1cnJlbnQgc3RhdGUgd2hlbiBzdWJzY3JpYmVkIHRvLiBOZXcgdmFsdWVzIGFyZVxyXG4gKiBlbWl0dGVkIHdoZW5ldmVyIHRoZSBzdGF0ZSBhbmQgdGhlIHNlbGVjdG9yJ3MgcmVzdWx0IGZvciB0aGF0IHN0YXRlXHJcbiAqIGNoYW5nZS5cclxuICpcclxuICogQHBhcmFtIHNpbXBsdXhNb2R1bGUgLSB0aGUgbW9kdWxlIHRvIGNyZWF0ZSB0aGUgYmFzZSBjbGFzcyBmb3JcclxuICogQHBhcmFtIG11dGF0aW9ucyAtIHRoZSBtdXRhdGlvbnMgdG8gYWRkIHRvIHRoZSBjbGFzc1xyXG4gKiBAcGFyYW0gc2VsZWN0b3JzIC0gdGhlIHNlbGVjdG9ycyB0byBhZGQgdG8gdGhlIGNsYXNzXHJcbiAqXHJcbiAqIEByZXR1cm5zIGEgYmFzZSBjbGFzcyB0aGF0IHNob3VsZCBiZSBleHRlbmRlZCBmcm9tIGFuIEFuZ3VsYXIgc2VydmljZVxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kdWxlU2VydmljZUJhc2VDbGFzczxcclxuICBUU3RhdGUsXHJcbiAgVE11dGF0aW9ucyBleHRlbmRzIE11dGF0aW9uRGVmaW5pdGlvbnM8VFN0YXRlPixcclxuICBUU2ltcGx1eE11dGF0aW9ucyBleHRlbmRzIFNpbXBsdXhNdXRhdGlvbnM8VFN0YXRlLCBUTXV0YXRpb25zPixcclxuICBUU2VsZWN0b3JzIGV4dGVuZHMgU2VsZWN0b3JEZWZpbml0aW9uczxUU3RhdGU+LFxyXG4gIFRTaW1wbHV4U2VsZWN0b3JzIGV4dGVuZHMgU2ltcGx1eFNlbGVjdG9yczxUU3RhdGUsIFRTZWxlY3RvcnM+XHJcbj4oXHJcbiAgc2ltcGx1eE1vZHVsZTogU2ltcGx1eE1vZHVsZTxUU3RhdGU+LFxyXG4gIG11dGF0aW9uczogVFNpbXBsdXhNdXRhdGlvbnMsXHJcbiAgc2VsZWN0b3JzOiBUU2ltcGx1eFNlbGVjdG9ycyxcclxuKTogbmV3ICgpID0+IE1vZHVsZVNlcnZpY2U8XHJcbiAgVFN0YXRlLFxyXG4gIFRNdXRhdGlvbnMsXHJcbiAgVFNpbXBsdXhNdXRhdGlvbnMsXHJcbiAgVFNlbGVjdG9ycyxcclxuICBUU2ltcGx1eFNlbGVjdG9yc1xyXG4+IHtcclxuICByZXR1cm4gY2xhc3Mge1xyXG4gICAgZ2V0Q3VycmVudFN0YXRlID0gc2ltcGx1eE1vZHVsZS5zdGF0ZVxyXG4gICAgc2VsZWN0U3RhdGUgPSAoKSA9PiBvYnNlcnZlU3RhdGUoc2ltcGx1eE1vZHVsZSlcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBtdXRhdGlvbnMpXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgdGhpcyxcclxuICAgICAgICBjcmVhdGVPYnNlcnZhYmxlU2VsZWN0b3JzPFRTdGF0ZSwgVFNlbGVjdG9ycywgVFNpbXBsdXhTZWxlY3RvcnM+KFxyXG4gICAgICAgICAgc2ltcGx1eE1vZHVsZSxcclxuICAgICAgICAgIHNlbGVjdG9ycyxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfSBhcyBhbnlcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlT2JzZXJ2YWJsZVNlbGVjdG9yczxcclxuICBUU3RhdGUsXHJcbiAgVFNlbGVjdG9ycyBleHRlbmRzIFNlbGVjdG9yRGVmaW5pdGlvbnM8VFN0YXRlPixcclxuICBUU2ltcGx1eFNlbGVjdG9ycyBleHRlbmRzIFNpbXBsdXhTZWxlY3RvcnM8VFN0YXRlLCBUU2VsZWN0b3JzPlxyXG4+KFxyXG4gIHNpbXBsdXhNb2R1bGU6IFNpbXBsdXhNb2R1bGU8VFN0YXRlPixcclxuICBzZWxlY3RvcnM6IFRTaW1wbHV4U2VsZWN0b3JzLFxyXG4pOiBNb2R1bGVTZXJ2aWNlU2VsZWN0b3JzPFRTdGF0ZSwgVFNlbGVjdG9ycywgVFNpbXBsdXhTZWxlY3RvcnM+IHtcclxuICBjb25zdCBzdGF0ZUNoYW5nZXMkID0gb2JzZXJ2ZVN0YXRlKHNpbXBsdXhNb2R1bGUpXHJcblxyXG4gIHJldHVybiBPYmplY3Qua2V5cyhzZWxlY3RvcnMpLnJlZHVjZShcclxuICAgIChhY2MsIHNlbGVjdG9yTmFtZToga2V5b2YgVFNlbGVjdG9ycykgPT4ge1xyXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHNlbGVjdG9yc1tzZWxlY3Rvck5hbWVdXHJcbiAgICAgIGFjY1tzZWxlY3Rvck5hbWVdID0gKCguLi5hcmdzOiBhbnlbXSkgPT5cclxuICAgICAgICBzdGF0ZUNoYW5nZXMkLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKHN0YXRlKSA9PiBzZWxlY3Rvci53aXRoU3RhdGUoc3RhdGUsIC4uLmFyZ3MpKSxcclxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgKSkgYXMgYW55XHJcbiAgICAgIHJldHVybiBhY2NcclxuICAgIH0sXHJcbiAgICB7fSBhcyBNb2R1bGVTZXJ2aWNlU2VsZWN0b3JzPFRTdGF0ZSwgVFNlbGVjdG9ycywgVFNpbXBsdXhTZWxlY3RvcnM+LFxyXG4gIClcclxufVxyXG5cclxuZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlPFRTdGF0ZT4oc2ltcGx1eE1vZHVsZTogU2ltcGx1eE1vZHVsZTxUU3RhdGU+KSB7XHJcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPEltbXV0YWJsZTxUU3RhdGU+Pigoc3ViKSA9PlxyXG4gICAgc2ltcGx1eE1vZHVsZS5zdWJzY3JpYmVUb1N0YXRlQ2hhbmdlcygoc3RhdGUpID0+IHN1Yi5uZXh0KHN0YXRlKSksXHJcbiAgKVxyXG59XHJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQXNFMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBTzFDLGFBQW9DLEVBQ3BDLFNBQTRCLEVBQzVCLFNBQTRCO0lBUTVCLE9BQU87UUFJTDtZQUhBLG9CQUFlLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQTtZQUNyQyxnQkFBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUc3QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUM5QixNQUFNLENBQUMsTUFBTSxDQUNYLElBQUksRUFDSix5QkFBeUIsQ0FDdkIsYUFBYSxFQUNiLFNBQVMsQ0FDVixDQUNGLENBQUE7UUFDSCxDQUFDO0tBQ0ssQ0FBQTtBQUNWLENBQUM7QUFFRCxTQUFTLHlCQUF5QixDQUtoQyxhQUFvQyxFQUNwQyxTQUE0QjtJQUU1QixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFakQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxHQUFHLEVBQUUsWUFBOEIsRUFBRSxFQUFFO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUN4QyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FDdEMsYUFBYSxDQUFDLElBQUksQ0FDaEIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQ2xELG9CQUFvQixFQUFFLENBQ3ZCLENBQVEsQ0FBQTtRQUNYLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQyxFQUNELEVBQW1FLENBQ3BFLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQVMsYUFBb0M7SUFDaEUsT0FBTyxJQUFJLFVBQVUsQ0FBb0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUMvQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDbEUsQ0FBQTtBQUNILENBQUMifQ==