@datorama/akita
Version:
State Management Tailored-Made for JS Applications
195 lines • 15.1 kB
JavaScript
/**
* @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