@datorama/akita
Version:
State Management Tailored-Made for JS Applications
257 lines • 17.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
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
*/
var /**
* @template State, P
*/
EntityDirtyCheckPlugin = /** @class */ (function (_super) {
tslib_1.__extends(EntityDirtyCheckPlugin, _super);
function EntityDirtyCheckPlugin(query, params) {
if (params === void 0) { params = {}; }
var _this = _super.call(this, query, params.entityIds) || this;
_this.query = query;
_this.params = params;
_this._someDirty = new Subject();
_this.someDirty$ = merge(_this.query.select((/**
* @param {?} state
* @return {?}
*/
function (state) { return state.entities; })), _this._someDirty.asObservable()).pipe(auditTime(0), map((/**
* @return {?}
*/
function () { return _this.checkSomeDirty(); })));
_this.params = tslib_1.__assign({}, dirtyCheckDefaultParams, params);
// TODO lazy activate?
_this.activate();
_this.selectIds()
.pipe(skip(1))
.subscribe((/**
* @param {?} ids
* @return {?}
*/
function (ids) {
_super.prototype.rebase.call(_this, ids, { afterAdd: (/**
* @param {?} plugin
* @return {?}
*/
function (plugin) { return plugin.setHead(); }) });
}));
return _this;
}
/**
* @template THIS
* @this {THIS}
* @param {?=} ids
* @return {THIS}
*/
EntityDirtyCheckPlugin.prototype.setHead = /**
* @template THIS
* @this {THIS}
* @param {?=} ids
* @return {THIS}
*/
function (ids) {
if ((/** @type {?} */ (this)).params.entityIds && ids) {
/** @type {?} */
var toArray_1 = (/** @type {?} */ (coerceArray(ids)));
/** @type {?} */
var someAreWatched = coerceArray((/** @type {?} */ (this)).params.entityIds).some((/**
* @param {?} id
* @return {?}
*/
function (id) { return toArray_1.indexOf(id) > -1; }));
if (someAreWatched === false) {
return (/** @type {?} */ (this));
}
}
(/** @type {?} */ (this)).forEachId(ids, (/**
* @param {?} e
* @return {?}
*/
function (e) { return e.setHead(); }));
(/** @type {?} */ (this))._someDirty.next();
return (/** @type {?} */ (this));
};
/**
* @param {?} id
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.hasHead = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (this.entities.has(id)) {
/** @type {?} */
var entity = this.getEntity(id);
return entity.hasHead();
}
return false;
};
/**
* @param {?=} ids
* @param {?=} params
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.reset = /**
* @param {?=} ids
* @param {?=} params
* @return {?}
*/
function (ids, params) {
if (params === void 0) { params = {}; }
this.forEachId(ids, (/**
* @param {?} e
* @return {?}
*/
function (e) { return e.reset(params); }));
};
/**
* @param {?} id
* @param {?=} asObservable
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.isDirty = /**
* @param {?} id
* @param {?=} asObservable
* @return {?}
*/
function (id, asObservable) {
if (asObservable === void 0) { asObservable = true; }
if (this.entities.has(id)) {
/** @type {?} */
var entity = this.getEntity(id);
return asObservable ? entity.isDirty$ : entity.isDirty();
}
return false;
};
/**
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.someDirty = /**
* @return {?}
*/
function () {
return this.checkSomeDirty();
};
/**
* @param {?} id
* @param {?} path
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.isPathDirty = /**
* @param {?} id
* @param {?} path
* @return {?}
*/
function (id, path) {
if (this.entities.has(id)) {
/** @type {?} */
var head = ((/** @type {?} */ (this.getEntity(id)))).getHead();
/** @type {?} */
var current = this.query.getEntity(id);
/** @type {?} */
var currentPathValue = getNestedPath(current, path);
/** @type {?} */
var headPathValue = getNestedPath(head, path);
return this.params.comparator(currentPathValue, headPathValue);
}
return null;
};
/**
* @param {?=} ids
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.destroy = /**
* @param {?=} ids
* @return {?}
*/
function (ids) {
this.forEachId(ids, (/**
* @param {?} e
* @return {?}
*/
function (e) { return e.destroy(); }));
/** complete only when the plugin destroys */
if (!ids) {
this._someDirty.complete();
}
};
/**
* @protected
* @param {?} id
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.instantiatePlugin = /**
* @protected
* @param {?} id
* @return {?}
*/
function (id) {
return (/** @type {?} */ (new DirtyCheckPlugin(this.query, this.params, id)));
};
/**
* @private
* @return {?}
*/
EntityDirtyCheckPlugin.prototype.checkSomeDirty = /**
* @private
* @return {?}
*/
function () {
var e_1, _a;
/** @type {?} */
var entitiesIds = this.resolvedIds();
try {
for (var entitiesIds_1 = tslib_1.__values(entitiesIds), entitiesIds_1_1 = entitiesIds_1.next(); !entitiesIds_1_1.done; entitiesIds_1_1 = entitiesIds_1.next()) {
var id = entitiesIds_1_1.value;
if (this.getEntity(id).isDirty()) {
return true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (entitiesIds_1_1 && !entitiesIds_1_1.done && (_a = entitiesIds_1.return)) _a.call(entitiesIds_1);
}
finally { if (e_1) throw e_1.error; }
}
return false;
};
return EntityDirtyCheckPlugin;
}(EntityCollectionPlugin));
/**
* @template State, P
*/
export { EntityDirtyCheckPlugin };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5RGlydHlDaGVja1BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL2RpcnR5Q2hlY2svZW50aXR5RGlydHlDaGVja1BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBd0IsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQXlCLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQU9oRDs7OztJQUEwSSxrREFBZ0M7SUFPeEssZ0NBQXNCLEtBQXlCLEVBQW1CLE1BQThDO1FBQTlDLHVCQUFBLEVBQUEsV0FBOEM7UUFBaEgsWUFDRSxrQkFBTSxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQVMvQjtRQVZxQixXQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUFtQixZQUFNLEdBQU4sTUFBTSxDQUF3QztRQU54RyxnQkFBVSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbkMsZ0JBQVUsR0FBd0IsS0FBSyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTs7OztRQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSyxDQUFDLFFBQVEsRUFBZCxDQUFjLEVBQUMsRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN0SCxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQ1osR0FBRzs7O1FBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxjQUFjLEVB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LElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ2hDLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7Ozs7Ozs7OztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNILDZCQUFDO0FBQUQsQ0FBQyxBQS9GRCxDQUEwSSxzQkFBc0IsR0ErRi9KOzs7Ozs7Ozs7O0lBOUZDLDRDQUFtQzs7SUFDbkMsNENBR0U7Ozs7O0lBRVUsdUNBQW1DOzs7OztJQUFFLHdDQUErRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcnR5Q2hlY2tDb21wYXJhdG9yLCBkaXJ0eUNoZWNrRGVmYXVsdFBhcmFtcywgRGlydHlDaGVja1BsdWdpbiwgRGlydHlDaGVja1Jlc2V0UGFyYW1zLCBnZXROZXN0ZWRQYXRoIH0gZnJvbSAnLi9kaXJ0eUNoZWNrUGx1Z2luJztcbmltcG9ydCB7IEVudGl0eUNvbGxlY3Rpb25QbHVnaW4gfSBmcm9tICcuLi9lbnRpdHlDb2xsZWN0aW9uUGx1Z2luJztcbmltcG9ydCB7IGF1ZGl0VGltZSwgbWFwLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVudGl0eVN0YXRlLCBPckFycmF5LCBnZXRJRFR5cGUsIGdldEVudGl0eVR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBRdWVyeUVudGl0eSB9IGZyb20gJy4uLy4uL3F1ZXJ5RW50aXR5JztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vLi4vY29lcmNlQXJyYXknO1xuXG5leHBvcnQgdHlwZSBEaXJ0eUNoZWNrQ29sbGVjdGlvblBhcmFtczxTdGF0ZSBleHRlbmRzIEVudGl0eVN0YXRlPiA9IHtcbiAgY29tcGFyYXRvcj86IERpcnR5Q2hlY2tDb21wYXJhdG9yPGdldEVudGl0eVR5cGU8U3RhdGU+PjtcbiAgZW50aXR5SWRzPzogT3JBcnJheTxnZXRJRFR5cGU8U3RhdGU+Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHlEaXJ0eUNoZWNrUGx1Z2luPFN0YXRlIGV4dGVuZHMgRW50aXR5U3RhdGUgPSBhbnksIFAgZXh0ZW5kcyBEaXJ0eUNoZWNrUGx1Z2luPFN0YXRlPiA9IERpcnR5Q2hlY2tQbHVnaW48U3RhdGU+PiBleHRlbmRzIEVudGl0eUNvbGxlY3Rpb25QbHVnaW48U3RhdGUsIFA+IHtcbiAgcHJpdmF0ZSBfc29tZURpcnR5ID0gbmV3IFN1YmplY3QoKTtcbiAgc29tZURpcnR5JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IG1lcmdlKHRoaXMucXVlcnkuc2VsZWN0KHN0YXRlID0+IHN0YXRlLmVudGl0aWVzKSwgdGhpcy5fc29tZURpcnR5LmFzT2JzZXJ2YWJsZSgpKS5waXBlKFxuICAgIGF1ZGl0VGltZSgwKSxcbiAgICBtYXAoKCkgPT4gdGhpcy5jaGVja1NvbWVEaXJ0eSgpKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcnlFbnRpdHk8U3RhdGU+LCBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogRGlydHlDaGVja0NvbGxlY3Rpb25QYXJhbXM8U3RhdGU+ID0ge30pIHtcbiAgICBzdXBlcihxdWVyeSwgcGFyYW1zLmVudGl0eUlkcyk7XG4gICAgdGhpcy5wYXJhbXMgPSB7IC4uLmRpcnR5Q2hlY2tEZWZhdWx0UGFyYW1zLCAuLi5wYXJhbXMgfTtcbiAgICAvLyBUT0RPIGxhenkgYWN0aXZhdGU/XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIHRoaXMuc2VsZWN0SWRzKClcbiAgICAgIC5waXBlKHNraXAoMSkpXG4gICAgICAuc3Vic2NyaWJlKGlkcyA9PiB7XG4gICAgICAgIHN1cGVyLnJlYmFzZShpZHMsIHsgYWZ0ZXJBZGQ6IHBsdWdpbiA9PiBwbHVnaW4uc2V0SGVhZCgpIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBzZXRIZWFkKGlkcz86IE9yQXJyYXk8Z2V0SURUeXBlPFN0YXRlPj4pIHtcbiAgICBpZiAodGhpcy5wYXJhbXMuZW50aXR5SWRzICYmIGlkcykge1xuICAgICAgY29uc3QgdG9BcnJheSA9IGNvZXJjZUFycmF5KGlkcykgYXMgZ2V0SURUeXBlPFN0YXRlPltdO1xuICAgICAgY29uc3Qgc29tZUFyZVdhdGNoZWQgPSBjb2VyY2VBcnJheSh0aGlzLnBhcmFtcy5lbnRpdHlJZHMpLnNvbWUoaWQgPT4gdG9BcnJheS5pbmRleE9mKGlkKSA+IC0xKTtcbiAgICAgIGlmIChzb21lQXJlV2F0Y2hlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZm9yRWFjaElkKGlkcywgZSA9PiBlLnNldEhlYWQoKSk7XG4gICAgdGhpcy5fc29tZURpcnR5Lm5leHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGhhc0hlYWQoaWQ6IGdldElEVHlwZTxTdGF0ZT4pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5lbnRpdGllcy5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmdldEVudGl0eShpZCk7XG4gICAgICByZXR1cm4gZW50aXR5Lmhhc0hlYWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXNldChpZHM/OiBPckFycmF5PGdldElEVHlwZTxTdGF0ZT4+LCBwYXJhbXM6IERpcnR5Q2hlY2tSZXNldFBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5mb3JFYWNoSWQoaWRzLCBlID0+IGUucmVzZXQocGFyYW1zKSk7XG4gIH1cblxuICBpc0RpcnR5KGlkOiBnZXRJRFR5cGU8U3RhdGU+KTogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgaXNEaXJ0eShpZDogZ2V0SURUeXBlPFN0YXRlPiwgYXNPYnNlcnZhYmxlOiB0cnVlKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgaXNEaXJ0eShpZDogZ2V0SURUeXBlPFN0YXRlPiwgYXNPYnNlcnZhYmxlOiBmYWxzZSk6IGJvb2xlYW47XG4gIGlzRGlydHkoaWQ6IGdldElEVHlwZTxTdGF0ZT4sIGFzT2JzZXJ2YWJsZSA9IHRydWUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZW50aXRpZXMuaGFzKGlkKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHkoaWQpO1xuICAgICAgcmV0dXJuIGFzT2JzZXJ2YWJsZSA/IGVudGl0eS5pc0RpcnR5JCA6IGVudGl0eS5pc0RpcnR5KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc29tZURpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNoZWNrU29tZURpcnR5KCk7XG4gIH1cblxuICBpc1BhdGhEaXJ0eShpZDogZ2V0SURUeXBlPFN0YXRlPiwgcGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZW50aXRpZXMuaGFzKGlkKSkge1xuICAgICAgY29uc3QgaGVhZCA9ICh0aGlzLmdldEVudGl0eShpZCkgYXMgYW55KS5nZXRIZWFkKCk7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5xdWVyeS5nZXRFbnRpdHkoaWQpO1xuICAgICAgY29uc3QgY3VycmVudFBhdGhWYWx1ZSA9IGdldE5lc3RlZFBhdGgoY3VycmVudCwgcGF0aCk7XG4gICAgICBjb25zdCBoZWFkUGF0aFZhbHVlID0gZ2V0TmVzdGVkUGF0aChoZWFkLCBwYXRoKTtcblxuICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLmNvbXBhcmF0b3IoY3VycmVudFBhdGhWYWx1ZSwgaGVhZFBhdGhWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBkZXN0cm95KGlkcz86IE9yQXJyYXk8Z2V0SURUeXBlPFN0YXRlPj4pIHtcbiAgICB0aGlzLmZvckVhY2hJZChpZHMsIGUgPT4gZS5kZXN0cm95KCkpO1xuICAgIC8qKiBjb21wbGV0ZSBvbmx5IHdoZW4gdGhlIHBsdWdpbiBkZXN0cm95cyAqL1xuICAgIGlmICghaWRzKSB7XG4gICAgICB0aGlzLl9zb21lRGlydHkuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5zdGFudGlhdGVQbHVnaW4oaWQ6IGdldElEVHlwZTxTdGF0ZT4pOiBQIHtcbiAgICByZXR1cm4gbmV3IERpcnR5Q2hlY2tQbHVnaW4odGhpcy5xdWVyeSwgdGhpcy5wYXJhbXMsIGlkKSBhcyBQO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1NvbWVEaXJ0eSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbnRpdGllc0lkcyA9IHRoaXMucmVzb2x2ZWRJZHMoKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGVudGl0aWVzSWRzKSB7XG4gICAgICBpZiAodGhpcy5nZXRFbnRpdHkoaWQpLmlzRGlydHkoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=