UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

195 lines 15.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { dirtyCheckDefaultParams, DirtyCheckPlugin, getNestedPath } from './dirtyCheckPlugin'; import { EntityCollectionPlugin } from '../entityCollectionPlugin'; import { auditTime, map, skip } from 'rxjs/operators'; import { merge, Subject } from 'rxjs'; import { coerceArray } from '../../coerceArray'; /** * @template State, P */ export class EntityDirtyCheckPlugin extends EntityCollectionPlugin { /** * @param {?} query * @param {?=} params */ constructor(query, params = {}) { super(query, params.entityIds); this.query = query; this.params = params; this._someDirty = new Subject(); this.someDirty$ = merge(this.query.select((/** * @param {?} state * @return {?} */ state => state.entities)), this._someDirty.asObservable()).pipe(auditTime(0), map((/** * @return {?} */ () => this.checkSomeDirty()))); this.params = Object.assign({}, dirtyCheckDefaultParams, params); // TODO lazy activate? this.activate(); this.selectIds() .pipe(skip(1)) .subscribe((/** * @param {?} ids * @return {?} */ ids => { super.rebase(ids, { afterAdd: (/** * @param {?} plugin * @return {?} */ plugin => plugin.setHead()) }); })); } /** * @template THIS * @this {THIS} * @param {?=} ids * @return {THIS} */ setHead(ids) { if ((/** @type {?} */ (this)).params.entityIds && ids) { /** @type {?} */ const toArray = (/** @type {?} */ (coerceArray(ids))); /** @type {?} */ const someAreWatched = coerceArray((/** @type {?} */ (this)).params.entityIds).some((/** * @param {?} id * @return {?} */ id => toArray.indexOf(id) > -1)); if (someAreWatched === false) { return (/** @type {?} */ (this)); } } (/** @type {?} */ (this)).forEachId(ids, (/** * @param {?} e * @return {?} */ e => e.setHead())); (/** @type {?} */ (this))._someDirty.next(); return (/** @type {?} */ (this)); } /** * @param {?} id * @return {?} */ hasHead(id) { if (this.entities.has(id)) { /** @type {?} */ const entity = this.getEntity(id); return entity.hasHead(); } return false; } /** * @param {?=} ids * @param {?=} params * @return {?} */ reset(ids, params = {}) { this.forEachId(ids, (/** * @param {?} e * @return {?} */ e => e.reset(params))); } /** * @param {?} id * @param {?=} asObservable * @return {?} */ isDirty(id, asObservable = true) { if (this.entities.has(id)) { /** @type {?} */ const entity = this.getEntity(id); return asObservable ? entity.isDirty$ : entity.isDirty(); } return false; } /** * @return {?} */ someDirty() { return this.checkSomeDirty(); } /** * @param {?} id * @param {?} path * @return {?} */ isPathDirty(id, path) { if (this.entities.has(id)) { /** @type {?} */ const head = ((/** @type {?} */ (this.getEntity(id)))).getHead(); /** @type {?} */ const current = this.query.getEntity(id); /** @type {?} */ const currentPathValue = getNestedPath(current, path); /** @type {?} */ const headPathValue = getNestedPath(head, path); return this.params.comparator(currentPathValue, headPathValue); } return null; } /** * @param {?=} ids * @return {?} */ destroy(ids) { this.forEachId(ids, (/** * @param {?} e * @return {?} */ e => e.destroy())); /** complete only when the plugin destroys */ if (!ids) { this._someDirty.complete(); } } /** * @protected * @param {?} id * @return {?} */ instantiatePlugin(id) { return (/** @type {?} */ (new DirtyCheckPlugin(this.query, this.params, id))); } /** * @private * @return {?} */ checkSomeDirty() { /** @type {?} */ const entitiesIds = this.resolvedIds(); for (const id of entitiesIds) { if (this.getEntity(id).isDirty()) { return true; } } return false; } } if (false) { /** * @type {?} * @private */ EntityDirtyCheckPlugin.prototype._someDirty; /** @type {?} */ EntityDirtyCheckPlugin.prototype.someDirty$; /** * @type {?} * @protected */ EntityDirtyCheckPlugin.prototype.query; /** * @type {?} * @private */ EntityDirtyCheckPlugin.prototype.params; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5RGlydHlDaGVja1BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL2RpcnR5Q2hlY2svZW50aXR5RGlydHlDaGVja1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUF3Qix1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBeUIsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0ksT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7O0FBT2hELE1BQU0sT0FBTyxzQkFBcUgsU0FBUSxzQkFBZ0M7Ozs7O0lBT3hLLFlBQXNCLEtBQXlCLEVBQW1CLFNBQTRDLEVBQUU7UUFDOUcsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFEWCxVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUFtQixXQUFNLEdBQU4sTUFBTSxDQUF3QztRQU54RyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNuQyxlQUFVLEdBQXdCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU07Ozs7UUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0SCxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQ1osR0FBRzs7O1FBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLENBQ2pD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ZGlydHlDaGVja0RlZmF1bHRQYXJhbXMsIERpcnR5Q2hlY2tQbHVnaW4sIERpcnR5Q2hlY2tSZXNldFBhcmFtcywgZ2V0TmVzdGVkUGF0aCB9IGZyb20gJy4vZGlydHlDaGVja1BsdWdpbic7XG5pbXBvcnQgeyBFbnRpdHlDb2xsZWN0aW9uUGx1Z2luIH0gZnJvbSAnLi4vZW50aXR5Q29sbGVjdGlvblBsdWdpbic7XG5pbXBvcnQgeyBhdWRpdFRpbWUsIG1hcCwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbnRpdHlTdGF0ZSwgT3JBcnJheSwgZ2V0SURUeXBlLCBnZXRFbnRpdHlUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlFbnRpdHkgfSBmcm9tICcuLi8uLi9xdWVyeUVudGl0eSc7XG5pbXBvcnQgeyBjb2VyY2VBcnJheSB9IGZyb20gJy4uLy4uL2NvZXJjZUFycmF5JztcblxuZXhwb3J0IHR5cGUgRGlydHlDaGVja0NvbGxlY3Rpb25QYXJhbXM8U3RhdGUgZXh0ZW5kcyBFbnRpdHlTdGF0ZT4gPSB7XG4gIGNvbXBhcmF0b3I/OiBEaXJ0eUNoZWNrQ29tcGFyYXRvcjxnZXRFbnRpdHlUeXBlPFN0YXRlPj47XG4gIGVudGl0eUlkcz86IE9yQXJyYXk8Z2V0SURUeXBlPFN0YXRlPj47XG59O1xuXG5leHBvcnQgY2xhc3MgRW50aXR5RGlydHlDaGVja1BsdWdpbjxTdGF0ZSBleHRlbmRzIEVudGl0eVN0YXRlID0gYW55LCBQIGV4dGVuZHMgRGlydHlDaGVja1BsdWdpbjxTdGF0ZT4gPSBEaXJ0eUNoZWNrUGx1Z2luPFN0YXRlPj4gZXh0ZW5kcyBFbnRpdHlDb2xsZWN0aW9uUGx1Z2luPFN0YXRlLCBQPiB7XG4gIHByaXZhdGUgX3NvbWVEaXJ0eSA9IG5ldyBTdWJqZWN0KCk7XG4gIHNvbWVEaXJ0eSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBtZXJnZSh0aGlzLnF1ZXJ5LnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5lbnRpdGllcyksIHRoaXMuX3NvbWVEaXJ0eS5hc09ic2VydmFibGUoKSkucGlwZShcbiAgICBhdWRpdFRpbWUoMCksXG4gICAgbWFwKCgpID0+IHRoaXMuY2hlY2tTb21lRGlydHkoKSlcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcXVlcnk6IFF1ZXJ5RW50aXR5PFN0YXRlPiwgcHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IERpcnR5Q2hlY2tDb2xsZWN0aW9uUGFyYW1zPFN0YXRlPiA9IHt9KSB7XG4gICAgc3VwZXIocXVlcnksIHBhcmFtcy5lbnRpdHlJZHMpO1xuICAgIHRoaXMucGFyYW1zID0geyAuLi5kaXJ0eUNoZWNrRGVmYXVsdFBhcmFtcywgLi4ucGFyYW1zIH07XG4gICAgLy8gVE9ETyBsYXp5IGFjdGl2YXRlP1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICB0aGlzLnNlbGVjdElkcygpXG4gICAgICAucGlwZShza2lwKDEpKVxuICAgICAgLnN1YnNjcmliZShpZHMgPT4ge1xuICAgICAgICBzdXBlci5yZWJhc2UoaWRzLCB7IGFmdGVyQWRkOiBwbHVnaW4gPT4gcGx1Z2luLnNldEhlYWQoKSB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0SGVhZChpZHM/OiBPckFycmF5PGdldElEVHlwZTxTdGF0ZT4+KSB7XG4gICAgaWYgKHRoaXMucGFyYW1zLmVudGl0eUlkcyAmJiBpZHMpIHtcbiAgICAgIGNvbnN0IHRvQXJyYXkgPSBjb2VyY2VBcnJheShpZHMpIGFzIGdldElEVHlwZTxTdGF0ZT5bXTtcbiAgICAgIGNvbnN0IHNvbWVBcmVXYXRjaGVkID0gY29lcmNlQXJyYXkodGhpcy5wYXJhbXMuZW50aXR5SWRzKS5zb21lKGlkID0+IHRvQXJyYXkuaW5kZXhPZihpZCkgPiAtMSk7XG4gICAgICBpZiAoc29tZUFyZVdhdGNoZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvckVhY2hJZChpZHMsIGUgPT4gZS5zZXRIZWFkKCkpO1xuICAgIHRoaXMuX3NvbWVEaXJ0eS5uZXh0KCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBoYXNIZWFkKGlkOiBnZXRJRFR5cGU8U3RhdGU+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZW50aXRpZXMuaGFzKGlkKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHkoaWQpO1xuICAgICAgcmV0dXJuIGVudGl0eS5oYXNIZWFkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmVzZXQoaWRzPzogT3JBcnJheTxnZXRJRFR5cGU8U3RhdGU+PiwgcGFyYW1zOiBEaXJ0eUNoZWNrUmVzZXRQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMuZm9yRWFjaElkKGlkcywgZSA9PiBlLnJlc2V0KHBhcmFtcykpO1xuICB9XG5cbiAgaXNEaXJ0eShpZDogZ2V0SURUeXBlPFN0YXRlPik6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIGlzRGlydHkoaWQ6IGdldElEVHlwZTxTdGF0ZT4sIGFzT2JzZXJ2YWJsZTogdHJ1ZSk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIGlzRGlydHkoaWQ6IGdldElEVHlwZTxTdGF0ZT4sIGFzT2JzZXJ2YWJsZTogZmFsc2UpOiBib29sZWFuO1xuICBpc0RpcnR5KGlkOiBnZXRJRFR5cGU8U3RhdGU+LCBhc09ic2VydmFibGUgPSB0cnVlKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmVudGl0aWVzLmhhcyhpZCkpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5KGlkKTtcbiAgICAgIHJldHVybiBhc09ic2VydmFibGUgPyBlbnRpdHkuaXNEaXJ0eSQgOiBlbnRpdHkuaXNEaXJ0eSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNvbWVEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja1NvbWVEaXJ0eSgpO1xuICB9XG5cbiAgaXNQYXRoRGlydHkoaWQ6IGdldElEVHlwZTxTdGF0ZT4sIHBhdGg6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmVudGl0aWVzLmhhcyhpZCkpIHtcbiAgICAgIGNvbnN0IGhlYWQgPSAodGhpcy5nZXRFbnRpdHkoaWQpIGFzIGFueSkuZ2V0SGVhZCgpO1xuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucXVlcnkuZ2V0RW50aXR5KGlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoVmFsdWUgPSBnZXROZXN0ZWRQYXRoKGN1cnJlbnQsIHBhdGgpO1xuICAgICAgY29uc3QgaGVhZFBhdGhWYWx1ZSA9IGdldE5lc3RlZFBhdGgoaGVhZCwgcGF0aCk7XG5cbiAgICAgIHJldHVybiB0aGlzLnBhcmFtcy5jb21wYXJhdG9yKGN1cnJlbnRQYXRoVmFsdWUsIGhlYWRQYXRoVmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGVzdHJveShpZHM/OiBPckFycmF5PGdldElEVHlwZTxTdGF0ZT4+KSB7XG4gICAgdGhpcy5mb3JFYWNoSWQoaWRzLCBlID0+IGUuZGVzdHJveSgpKTtcbiAgICAvKiogY29tcGxldGUgb25seSB3aGVuIHRoZSBwbHVnaW4gZGVzdHJveXMgKi9cbiAgICBpZiAoIWlkcykge1xuICAgICAgdGhpcy5fc29tZURpcnR5LmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGluc3RhbnRpYXRlUGx1Z2luKGlkOiBnZXRJRFR5cGU8U3RhdGU+KTogUCB7XG4gICAgcmV0dXJuIG5ldyBEaXJ0eUNoZWNrUGx1Z2luKHRoaXMucXVlcnksIHRoaXMucGFyYW1zLCBpZCkgYXMgUDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTb21lRGlydHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZW50aXRpZXNJZHMgPSB0aGlzLnJlc29sdmVkSWRzKCk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBlbnRpdGllc0lkcykge1xuICAgICAgaWYgKHRoaXMuZ2V0RW50aXR5KGlkKS5pc0RpcnR5KCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19