UNPKG

@angular-extensions/model

Version:

Angular Model - Simple state management with minimalistic API, one way data flow, multiple model support and immutable data exposed as RxJS Observable.

62 lines 7.81 kB
import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; import * as i0 from "@angular/core"; export class Model { constructor(initialData, immutable, sharedSubscription, clone) { this.immutable = immutable; this.clone = clone; this._data = new BehaviorSubject(initialData); this.data$ = this._data.asObservable().pipe(map((data) => this.immutable ? clone ? clone(data) : JSON.parse(JSON.stringify(data)) : data), sharedSubscription ? shareReplay({ bufferSize: 1, refCount: true }) : map((data) => data)); } get() { const data = this._data.getValue(); return this.immutable ? this.clone ? this.clone(data) : JSON.parse(JSON.stringify(data)) : data; } set(data) { if (this.immutable) { const clone = this.clone ? this.clone(data) : JSON.parse(JSON.stringify(data)); this._data.next(clone); } else { this._data.next(data); } } } export class ModelFactory { create(initialData) { return new Model(initialData, true, false); } createMutable(initialData) { return new Model(initialData, false, false); } createMutableWithSharedSubscription(initialData) { return new Model(initialData, false, true); } createWithCustomClone(initialData, clone) { return new Model(initialData, true, false, clone); } createWithConfig(config) { const { initialData, immutable, sharedSubscription, clone } = config; return new Model(initialData, immutable, sharedSubscription, clone); } } ModelFactory.ɵprov = i0.ɵɵdefineInjectable({ factory: function ModelFactory_Factory() { return new ModelFactory(); }, token: ModelFactory, providedIn: "root" }); ModelFactory.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbW9kZWwvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRWxELE1BQU0sT0FBTyxLQUFLO0lBS2hCLFlBQ0UsV0FBZ0IsRUFDUixTQUFrQixFQUMxQixrQkFBMkIsRUFDbkIsS0FBc0I7UUFGdEIsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUVsQixVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUU5QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQ3pDLEdBQUcsQ0FBQyxDQUFDLElBQU8sRUFBRSxFQUFFLENBQ2QsSUFBSSxDQUFDLFNBQVM7WUFDWixDQUFDLENBQUMsS0FBSztnQkFDTCxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDYixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQ1QsRUFDRCxrQkFBa0I7WUFDaEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ2hELENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVELEdBQUc7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLFNBQVM7WUFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO2dCQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUVyQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7SUFDSCxDQUFDO0NBQ0Y7QUFLRCxNQUFNLE9BQU8sWUFBWTtJQUN2QixNQUFNLENBQUMsV0FBYztRQUNuQixPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGFBQWEsQ0FBQyxXQUFjO1FBQzFCLE9BQU8sSUFBSSxLQUFLLENBQUksV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsbUNBQW1DLENBQUMsV0FBYztRQUNoRCxPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELHFCQUFxQixDQUFDLFdBQWMsRUFBRSxLQUFxQjtRQUN6RCxPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUtoQjtRQUNDLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUNyRSxPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQzs7OztZQTVCRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBNb2RlbDxUPiB7XG4gIHByaXZhdGUgX2RhdGE6IEJlaGF2aW9yU3ViamVjdDxUPjtcblxuICBkYXRhJDogT2JzZXJ2YWJsZTxUPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbml0aWFsRGF0YTogYW55LFxuICAgIHByaXZhdGUgaW1tdXRhYmxlOiBib29sZWFuLFxuICAgIHNoYXJlZFN1YnNjcmlwdGlvbjogYm9vbGVhbixcbiAgICBwcml2YXRlIGNsb25lPzogKGRhdGE6IFQpID0+IFRcbiAgKSB7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBCZWhhdmlvclN1YmplY3QoaW5pdGlhbERhdGEpO1xuICAgIHRoaXMuZGF0YSQgPSB0aGlzLl9kYXRhLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICBtYXAoKGRhdGE6IFQpID0+XG4gICAgICAgIHRoaXMuaW1tdXRhYmxlXG4gICAgICAgICAgPyBjbG9uZVxuICAgICAgICAgICAgPyBjbG9uZShkYXRhKVxuICAgICAgICAgICAgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgICAgIDogZGF0YVxuICAgICAgKSxcbiAgICAgIHNoYXJlZFN1YnNjcmlwdGlvblxuICAgICAgICA/IHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSlcbiAgICAgICAgOiBtYXAoKGRhdGE6IFQpID0+IGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIGdldCgpOiBUIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YS5nZXRWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmltbXV0YWJsZVxuICAgICAgPyB0aGlzLmNsb25lXG4gICAgICAgID8gdGhpcy5jbG9uZShkYXRhKVxuICAgICAgICA6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICA6IGRhdGE7XG4gIH1cblxuICBzZXQoZGF0YTogVCkge1xuICAgIGlmICh0aGlzLmltbXV0YWJsZSkge1xuICAgICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lXG4gICAgICAgID8gdGhpcy5jbG9uZShkYXRhKVxuICAgICAgICA6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuXG4gICAgICB0aGlzLl9kYXRhLm5leHQoY2xvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhLm5leHQoZGF0YSk7XG4gICAgfVxuICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1vZGVsRmFjdG9yeTxUPiB7XG4gIGNyZWF0ZShpbml0aWFsRGF0YTogVCk6IE1vZGVsPFQ+IHtcbiAgICByZXR1cm4gbmV3IE1vZGVsPFQ+KGluaXRpYWxEYXRhLCB0cnVlLCBmYWxzZSk7XG4gIH1cblxuICBjcmVhdGVNdXRhYmxlKGluaXRpYWxEYXRhOiBUKTogTW9kZWw8VD4ge1xuICAgIHJldHVybiBuZXcgTW9kZWw8VD4oaW5pdGlhbERhdGEsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBjcmVhdGVNdXRhYmxlV2l0aFNoYXJlZFN1YnNjcmlwdGlvbihpbml0aWFsRGF0YTogVCk6IE1vZGVsPFQ+IHtcbiAgICByZXR1cm4gbmV3IE1vZGVsPFQ+KGluaXRpYWxEYXRhLCBmYWxzZSwgdHJ1ZSk7XG4gIH1cblxuICBjcmVhdGVXaXRoQ3VzdG9tQ2xvbmUoaW5pdGlhbERhdGE6IFQsIGNsb25lOiAoZGF0YTogVCkgPT4gVCkge1xuICAgIHJldHVybiBuZXcgTW9kZWw8VD4oaW5pdGlhbERhdGEsIHRydWUsIGZhbHNlLCBjbG9uZSk7XG4gIH1cblxuICBjcmVhdGVXaXRoQ29uZmlnKGNvbmZpZzoge1xuICAgIGluaXRpYWxEYXRhOiBUO1xuICAgIGltbXV0YWJsZTogYm9vbGVhbjtcbiAgICBzaGFyZWRTdWJzY3JpcHRpb246IGJvb2xlYW47XG4gICAgY2xvbmU6IChkYXRhOiBUKSA9PiBUO1xuICB9KSB7XG4gICAgY29uc3QgeyBpbml0aWFsRGF0YSwgaW1tdXRhYmxlLCBzaGFyZWRTdWJzY3JpcHRpb24sIGNsb25lIH0gPSBjb25maWc7XG4gICAgcmV0dXJuIG5ldyBNb2RlbDxUPihpbml0aWFsRGF0YSwgaW1tdXRhYmxlLCBzaGFyZWRTdWJzY3JpcHRpb24sIGNsb25lKTtcbiAgfVxufVxuIl19