UNPKG

ngx-remotedata

Version:

RemoteData: Slaying a UI Antipattern with Angular

444 lines (437 loc) 16.9 kB
import { Observable, combineLatest } from 'rxjs'; import * as i0 from '@angular/core'; import { Pipe, NgModule } from '@angular/core'; // ---------------------------- // // Constructor functions // // ---------------------------- const notAsked = () => { return { tag: 'NotAsked' }; }; const inProgress = (value) => { return { tag: 'InProgress', value }; }; const failure = (error, value) => { return { tag: 'Failure', error, value }; }; const success = (value) => { return { tag: 'Success', value }; }; // ---------------------------- // // Guards // // ---------------------------- const isNotAsked = (value) => { return (value !== null && value !== undefined && value.hasOwnProperty('tag') && value.tag === 'NotAsked'); }; const isInProgress = (value) => { return (value !== null && value !== undefined && value.hasOwnProperty('tag') && value.tag === 'InProgress'); }; const isFailure = (value) => { return (value !== null && value !== undefined && value.hasOwnProperty('tag') && value.tag === 'Failure'); }; const isSuccess = (value) => { return (value !== null && value !== undefined && value.hasOwnProperty('tag') && value.tag === 'Success'); }; const isRemoteData = (value) => { const hasRemoteDataTag = (tag) => tag === 'NotAsked' || tag === 'InProgress' || tag === 'Success' || tag === 'Failure'; return (value !== null && value !== undefined && value.hasOwnProperty('tag') && hasRemoteDataTag(value.tag)); }; // ---------------------------- // // Folds // // ---------------------------- const fold = (onNotAsked, onInProgress, onFailure, onSuccess, rd) => { switch (rd.tag) { case 'NotAsked': return onNotAsked(); case 'InProgress': return onInProgress(rd.value); case 'Failure': return onFailure(rd.error, rd.value); case 'Success': return onSuccess(rd.value); } }; const getOrElse = (rd, defaultValue) => { switch (rd.tag) { case 'Success': return rd.value; default: return defaultValue; } }; // ---------------------------- // // Transformations // // ---------------------------- const map = (fn, rd) => isSuccess(rd) ? success(fn(rd.value)) : rd; const mapFailure = (fn, rd) => isFailure(rd) ? failure(fn(rd.error)) : rd; const chain = (fn, rd) => isSuccess(rd) ? fn(rd.value) : rd; // ---------------------------- // // RxJs specific // // ---------------------------- /** * Emits only when source Observable is a Success * @returns Success<T> */ function filterSuccess() { return (source) => new Observable(subscriber => { source.subscribe({ next(value) { if (isSuccess(value)) { subscriber.next(value); } } }); }); } /** * Emits only when source Observable is a Failure * @returns Failure<E, T> */ function filterFailure() { return (source) => new Observable(subscriber => { source.subscribe({ next(value) { if (isFailure(value)) { subscriber.next(value); } } }); }); } const assertIsRemoteData = (rd) => { if (!isRemoteData(rd)) { throw new Error(`Value "${rd}" is not a RemoteData<T> instance. Did you forget to use the async pipe? i.e: state$ | async | isInProgress`); } }; class IsNotAskedPipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isNotAsked(rd); } } IsNotAskedPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsNotAskedPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsNotAskedPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsNotAskedPipe, name: "isNotAsked" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsNotAskedPipe, decorators: [{ type: Pipe, args: [{ name: 'isNotAsked' }] }] }); class IsInProgressPipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isInProgress(rd); } } IsInProgressPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsInProgressPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsInProgressPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsInProgressPipe, name: "isInProgress" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsInProgressPipe, decorators: [{ type: Pipe, args: [{ name: 'isInProgress' }] }] }); class AnyIsInProgressPipe { constructor(cd) { this.cd = cd; this._latestValue = false; this._subscription = null; this._rds$ = []; } transform(rds$) { if (rds$ === null || rds$ === undefined) { return false; } if (this._rds$ === rds$) { return this._latestValue; } else if (this._subscription) { this.dispose(); } this._rds$ = rds$; this._subscription = combineLatest(rds$).subscribe(rds => { this._latestValue = rds.some(isInProgress); this.cd.markForCheck(); }); return this._latestValue; } ngOnDestroy() { this.dispose(); } dispose() { if (this._subscription) { this._subscription.unsubscribe(); } this._rds$ = []; this._latestValue = false; } } AnyIsInProgressPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsInProgressPipe, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); AnyIsInProgressPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: AnyIsInProgressPipe, name: "anyIsInProgress", pure: false }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsInProgressPipe, decorators: [{ type: Pipe, args: [{ name: 'anyIsInProgress', pure: false }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } }); class AnyIsNotAskedPipe { constructor(cd) { this.cd = cd; this._latestValue = false; this._subscription = null; this._rds$ = []; } transform(rds$) { if (rds$ === null || rds$ === undefined) { return false; } if (this._rds$ === rds$) { return this._latestValue; } else if (this._subscription) { this.dispose(); } this._rds$ = rds$; this._subscription = combineLatest(rds$).subscribe(rds => { this._latestValue = rds.some(isNotAsked); this.cd.markForCheck(); }); return this._latestValue; } ngOnDestroy() { this.dispose(); } dispose() { if (this._subscription) { this._subscription.unsubscribe(); } this._rds$ = []; this._latestValue = false; } } AnyIsNotAskedPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsNotAskedPipe, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); AnyIsNotAskedPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: AnyIsNotAskedPipe, name: "anyIsNotAsked", pure: false }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: AnyIsNotAskedPipe, decorators: [{ type: Pipe, args: [{ name: 'anyIsNotAsked', pure: false }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } }); class IsFailurePipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isFailure(rd); } } IsFailurePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsFailurePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsFailurePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsFailurePipe, name: "isFailure" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsFailurePipe, decorators: [{ type: Pipe, args: [{ name: 'isFailure' }] }] }); class IsSuccessPipe { transform(rd) { if (rd === null || rd === undefined) { return false; } assertIsRemoteData(rd); return isSuccess(rd); } } IsSuccessPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsSuccessPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); IsSuccessPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: IsSuccessPipe, name: "isSuccess" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: IsSuccessPipe, decorators: [{ type: Pipe, args: [{ name: 'isSuccess' }] }] }); class HasValuePipe { transform(rd) { if (isSuccess(rd)) { return true; } else if ((isInProgress(rd) || isFailure(rd)) && rd.value !== null && rd.value !== undefined) { return true; } else if (rd === undefined || rd === null) { return false; } assertIsRemoteData(rd); return false; } } HasValuePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: HasValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); HasValuePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: HasValuePipe, name: "hasValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: HasValuePipe, decorators: [{ type: Pipe, args: [{ name: 'hasValue' }] }] }); class GetSuccessPipe { transform(rd, defaultValue) { if (isSuccess(rd)) { return rd.value; } else if (rd === undefined || rd === null) { return defaultValue; } assertIsRemoteData(rd); return defaultValue; } } GetSuccessPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetSuccessPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetSuccessPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetSuccessPipe, name: "successValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetSuccessPipe, decorators: [{ type: Pipe, args: [{ name: 'successValue' }] }] }); class GetInProgressPipe { transform(rd, defaultValue) { if (isInProgress(rd)) { return rd.value; } else if (rd === undefined || rd === null) { return defaultValue; } assertIsRemoteData(rd); return defaultValue; } } GetInProgressPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetInProgressPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetInProgressPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetInProgressPipe, name: "inProgressValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetInProgressPipe, decorators: [{ type: Pipe, args: [{ name: 'inProgressValue' }] }] }); class GetRemoteDataValuePipe { transform(rd) { if (rd === undefined || rd === null) { return undefined; } assertIsRemoteData(rd); return isInProgress(rd) || isSuccess(rd) || isFailure(rd) ? rd.value : undefined; } } GetRemoteDataValuePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetRemoteDataValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetRemoteDataValuePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetRemoteDataValuePipe, name: "remoteDataValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetRemoteDataValuePipe, decorators: [{ type: Pipe, args: [{ name: 'remoteDataValue' }] }] }); class GetFailureErrorPipe { transform(rd) { if (rd === undefined || rd === null) { return undefined; } assertIsRemoteData(rd); return isFailure(rd) ? rd.error : undefined; } } GetFailureErrorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureErrorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetFailureErrorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetFailureErrorPipe, name: "failureError" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureErrorPipe, decorators: [{ type: Pipe, args: [{ name: 'failureError' }] }] }); class GetFailureValuePipe { transform(rd) { if (rd === undefined || rd === null) { return undefined; } assertIsRemoteData(rd); return isFailure(rd) ? rd.value : undefined; } } GetFailureValuePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); GetFailureValuePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: GetFailureValuePipe, name: "failureValue" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: GetFailureValuePipe, decorators: [{ type: Pipe, args: [{ name: 'failureValue' }] }] }); const declarations = [ IsNotAskedPipe, IsInProgressPipe, IsFailurePipe, IsSuccessPipe, HasValuePipe, GetSuccessPipe, GetFailureErrorPipe, GetFailureValuePipe, GetInProgressPipe, GetRemoteDataValuePipe, AnyIsInProgressPipe, AnyIsNotAskedPipe ]; class RemoteDataModule { } RemoteDataModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: RemoteDataModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); RemoteDataModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.7", ngImport: i0, type: RemoteDataModule, declarations: [IsNotAskedPipe, IsInProgressPipe, IsFailurePipe, IsSuccessPipe, HasValuePipe, GetSuccessPipe, GetFailureErrorPipe, GetFailureValuePipe, GetInProgressPipe, GetRemoteDataValuePipe, AnyIsInProgressPipe, AnyIsNotAskedPipe], exports: [IsNotAskedPipe, IsInProgressPipe, IsFailurePipe, IsSuccessPipe, HasValuePipe, GetSuccessPipe, GetFailureErrorPipe, GetFailureValuePipe, GetInProgressPipe, GetRemoteDataValuePipe, AnyIsInProgressPipe, AnyIsNotAskedPipe] }); RemoteDataModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: RemoteDataModule }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: RemoteDataModule, decorators: [{ type: NgModule, args: [{ declarations, imports: [], exports: declarations }] }] }); /* * Public API Surface of lib */ /** * Generated bundle index. Do not edit. */ export { AnyIsInProgressPipe, AnyIsNotAskedPipe, GetFailureErrorPipe, GetFailureValuePipe, GetInProgressPipe, GetRemoteDataValuePipe, GetSuccessPipe, HasValuePipe, IsFailurePipe, IsInProgressPipe, IsNotAskedPipe, IsSuccessPipe, RemoteDataModule, chain, failure, filterFailure, filterSuccess, fold, getOrElse, inProgress, isFailure, isInProgress, isNotAsked, isRemoteData, isSuccess, map, mapFailure, notAsked, success }; //# sourceMappingURL=ngx-remotedata.mjs.map