@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
JavaScript
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