UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

171 lines 11.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { queryConfigKey } from './queryConfig'; import { isString } from './isString'; import { isFunction } from './isFunction'; import { isDev } from './env'; import { __queries__ } from './stores'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { compareKeys } from './compareKeys'; /** * @template S */ export class Query { /** * @param {?} store */ constructor(store) { this.store = store; this.__store__ = store; if (isDev()) { // @internal __queries__[store.storeName] = this; } } /** * @template R * @param {?=} project * @return {?} */ select(project) { /** @type {?} */ let mapFn; if (isFunction(project)) { mapFn = project; } else if (isString(project)) { mapFn = (/** * @param {?} state * @return {?} */ state => state[project]); } else if (Array.isArray(project)) { return (/** @type {?} */ (this.store ._select((/** * @param {?} state * @return {?} */ state => state)) .pipe(distinctUntilChanged(compareKeys(project)), map((/** * @param {?} state * @return {?} */ state => { if (isFunction(project[0])) { return ((/** @type {?} */ (project))).map((/** * @param {?} func * @return {?} */ func => func(state))); } return ((/** @type {?} */ (project))).reduce((/** * @param {?} acc * @param {?} k * @return {?} */ (acc, k) => { acc[(/** @type {?} */ (k))] = state[k]; return acc; }), {}); }))))); } else { mapFn = (/** * @param {?} state * @return {?} */ state => state); } return this.store._select(mapFn); } /** * Select the loading state * * \@example * * this.query.selectLoading().subscribe(isLoading => {}) * @return {?} */ selectLoading() { return this.select((/** * @param {?} state * @return {?} */ state => ((/** @type {?} */ (state))).loading)); } /** * Select the error state * * \@example * * this.query.selectError().subscribe(error => {}) * @template ErrorType * @return {?} */ selectError() { return this.select((/** * @param {?} state * @return {?} */ state => ((/** @type {?} */ (state))).error)); } /** * Get the store's value * * \@example * * this.query.getValue() * * @return {?} */ getValue() { return this.store._value(); } /** * Select the cache state * * \@example * * this.query.selectHasCache().pipe( * switchMap(hasCache => { * return hasCache ? of() : http().pipe(res => store.set(res)) * }) * ) * @return {?} */ selectHasCache() { return this.store._cache().asObservable(); } /** * Whether we've cached data * * \@example * * this.query.getHasCache() * * @return {?} */ getHasCache() { return this.store._cache().value; } // @internal /** * @return {?} */ get config() { return this.constructor[queryConfigKey]; } } if (false) { /** @type {?} */ Query.prototype.__store__; /** * @type {?} * @protected */ Query.prototype.store; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGF0b3JhbWEvYWtpdGEvIiwic291cmNlcyI6WyJzcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQXNCLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFHNUMsTUFBTSxPQUFPLEtBQUs7Ozs7SUFJaEIsWUFBc0IsS0FBZTtRQUFmLFVBQUssR0FBTCxLQUFLLENBQVU7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxLQUFLLEVBQUUsRUFBRTtZQUNYLFlBQVk7WUFDWixXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUNyQztJQUNILENBQUM7Ozs7OztJQW1CRCxNQUFNLENBQUksT0FBMkU7O1lBQy9FLEtBQUs7UUFDVCxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN2QixLQUFLLEdBQUcsT0FBTyxDQUFDO1NBQ2pCO2FBQU0sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsS0FBSzs7OztZQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBLENBQUM7U0FDakM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsT0FBTyxtQkFBQSxJQUFJLENBQUMsS0FBSztpQkFDZCxPQUFPOzs7O1lBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUM7aUJBQ3ZCLElBQUksQ0FDSCxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDMUMsR0FBRzs7OztZQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNWLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMxQixPQUFPLENBQUMsbUJBQUEsT0FBTyxFQUF5QixDQUFDLENBQUMsR0FBRzs7OztvQkFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDO2lCQUNwRTtnQkFFRCxPQUFPLENBQUMsbUJBQUEsT0FBTyxFQUFlLENBQUMsQ0FBQyxNQUFNOzs7OztnQkFBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDaEQsR0FBRyxDQUFDLG1CQUFBLENBQUMsRUFBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QixPQUFPLEdBQUcsQ0FBQztnQkFDYixDQUFDLEdBQUUsRUFBRSxDQUFDLENBQUM7WUFDVCxDQUFDLEVBQUMsQ0FDSCxFQUFPLENBQUM7U0FDWjthQUFNO1lBQ0wsS0FBSzs7OztZQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFBLENBQUM7U0FDeEI7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7Ozs7Ozs7OztJQVNELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLG1CQUFBLEtBQUssRUFBNEIsQ0FBQyxDQUFDLE9BQU8sRUFBQyxDQUFDO0lBQzNFLENBQUM7Ozs7Ozs7Ozs7SUFTRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTTs7OztRQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxtQkFBQSxLQUFLLEVBQTRCLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUN6RSxDQUFDOzs7Ozs7Ozs7O0lBVUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDOzs7Ozs7Ozs7Ozs7O0lBYUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QyxDQUFDOzs7Ozs7Ozs7O0lBVUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFHRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGOzs7SUF6SEMsMEJBQW9COzs7OztJQUVSLHNCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0b3JlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBxdWVyeUNvbmZpZ0tleSwgUXVlcnlDb25maWdPcHRpb25zIH0gZnJvbSAnLi9xdWVyeUNvbmZpZyc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4vaXNTdHJpbmcnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4vaXNGdW5jdGlvbic7XG5pbXBvcnQgeyBpc0RldiB9IGZyb20gJy4vZW52JztcbmltcG9ydCB7IF9fcXVlcmllc19fIH0gZnJvbSAnLi9zdG9yZXMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNvbXBhcmVLZXlzIH0gZnJvbSAnLi9jb21wYXJlS2V5cyc7XG5pbXBvcnQgeyBSZXR1cm5UeXBlcyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnk8Uz4ge1xuICAvLyBAaW50ZXJuYWxcbiAgX19zdG9yZV9fOiBTdG9yZTxTPjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3RvcmU6IFN0b3JlPFM+KSB7XG4gICAgdGhpcy5fX3N0b3JlX18gPSBzdG9yZTtcbiAgICBpZiAoaXNEZXYoKSkge1xuICAgICAgLy8gQGludGVybmFsXG4gICAgICBfX3F1ZXJpZXNfX1tzdG9yZS5zdG9yZU5hbWVdID0gdGhpcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IGEgc2xpY2UgZnJvbSB0aGUgc3RvcmVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5zZWxlY3QoKVxuICAgKiB0aGlzLnF1ZXJ5LnNlbGVjdChzdGF0ZSA9PiBzdGF0ZS5lbnRpdGllcylcbiAgICogdGhpcy5xdWVyeS5zZWxlY3QoJ3Rva2VuJyk7XG4gICAqIHRoaXMucXVlcnkuc2VsZWN0KFsnbmFtZScsICdlbWFpbCddKVxuICAgKiB0aGlzLnF1ZXJ5LnNlbGVjdChbc3RhdGUgPT4gc3RhdGUubmFtZSwgc3RhdGUgPT4gc3RhdGUuYWdlXSlcbiAgICpcbiAgICovXG4gIHNlbGVjdDxLIGV4dGVuZHMga2V5b2YgUz4oa2V5OiBLKTogT2JzZXJ2YWJsZTxTW0tdPjtcbiAgc2VsZWN0PFI+KHByb2plY3Q6IChzdG9yZTogUykgPT4gUik6IE9ic2VydmFibGU8Uj47XG4gIHNlbGVjdDxLIGV4dGVuZHMga2V5b2YgUz4oc3RhdGVLZXlzOiBLW10pOiBPYnNlcnZhYmxlPFBpY2s8UywgSz4+O1xuICBzZWxlY3Q8UiBleHRlbmRzIFsoc3RhdGU6IFMpID0+IGFueV0gfCBBcnJheTwoc3RhdGU6IFMpID0+IGFueT4+KHNlbGVjdG9yRm5zOiBSKTogT2JzZXJ2YWJsZTxSZXR1cm5UeXBlczxSPj47XG4gIHNlbGVjdCgpOiBPYnNlcnZhYmxlPFM+O1xuICBzZWxlY3Q8Uj4ocHJvamVjdD86ICgoc3RvcmU6IFMpID0+IFIpIHwga2V5b2YgUyB8IChrZXlvZiBTKVtdIHwgKChzdGF0ZTogUykgPT4gYW55KVtdKTogT2JzZXJ2YWJsZTxSIHwgUyB8IGFueVtdPiB7XG4gICAgbGV0IG1hcEZuO1xuICAgIGlmIChpc0Z1bmN0aW9uKHByb2plY3QpKSB7XG4gICAgICBtYXBGbiA9IHByb2plY3Q7XG4gICAgfSBlbHNlIGlmIChpc1N0cmluZyhwcm9qZWN0KSkge1xuICAgICAgbWFwRm4gPSBzdGF0ZSA9PiBzdGF0ZVtwcm9qZWN0XTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocHJvamVjdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlXG4gICAgICAgIC5fc2VsZWN0KHN0YXRlID0+IHN0YXRlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChjb21wYXJlS2V5cyhwcm9qZWN0KSksXG4gICAgICAgICAgbWFwKHN0YXRlID0+IHtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHByb2plY3RbMF0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiAocHJvamVjdCBhcyAoKHN0YXRlOiBTKSA9PiBhbnkpW10pLm1hcChmdW5jID0+IGZ1bmMoc3RhdGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIChwcm9qZWN0IGFzIChrZXlvZiBTKVtdKS5yZWR1Y2UoKGFjYywgaykgPT4ge1xuICAgICAgICAgICAgICBhY2NbayBhcyBhbnldID0gc3RhdGVba107XG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKSBhcyBhbnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcEZuID0gc3RhdGUgPT4gc3RhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuX3NlbGVjdChtYXBGbik7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHRoZSBsb2FkaW5nIHN0YXRlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0TG9hZGluZygpLnN1YnNjcmliZShpc0xvYWRpbmcgPT4ge30pXG4gICAqL1xuICBzZWxlY3RMb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChzdGF0ZSA9PiAoc3RhdGUgYXMgUyAmIHsgbG9hZGluZzogYm9vbGVhbiB9KS5sb2FkaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGVycm9yIHN0YXRlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0RXJyb3IoKS5zdWJzY3JpYmUoZXJyb3IgPT4ge30pXG4gICAqL1xuICBzZWxlY3RFcnJvcjxFcnJvclR5cGUgPSBhbnk+KCk6IE9ic2VydmFibGU8RXJyb3JUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KHN0YXRlID0+IChzdGF0ZSBhcyBTICYgeyBlcnJvcjogRXJyb3JUeXBlIH0pLmVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0b3JlJ3MgdmFsdWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5nZXRWYWx1ZSgpXG4gICAqXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBTIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5fdmFsdWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3QgdGhlIGNhY2hlIHN0YXRlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRoaXMucXVlcnkuc2VsZWN0SGFzQ2FjaGUoKS5waXBlKFxuICAgKiAgIHN3aXRjaE1hcChoYXNDYWNoZSA9PiB7XG4gICAqICAgICByZXR1cm4gaGFzQ2FjaGUgPyBvZigpIDogaHR0cCgpLnBpcGUocmVzID0+IHN0b3JlLnNldChyZXMpKVxuICAgKiAgIH0pXG4gICAqIClcbiAgICovXG4gIHNlbGVjdEhhc0NhY2hlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLl9jYWNoZSgpLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UndmUgY2FjaGVkIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogdGhpcy5xdWVyeS5nZXRIYXNDYWNoZSgpXG4gICAqXG4gICAqL1xuICBnZXRIYXNDYWNoZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5fY2FjaGUoKS52YWx1ZTtcbiAgfVxuXG4gIC8vIEBpbnRlcm5hbFxuICBnZXQgY29uZmlnKCk6IFF1ZXJ5Q29uZmlnT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3JbcXVlcnlDb25maWdLZXldO1xuICB9XG59XG4iXX0=