ngx-remotedata
Version:
RemoteData: Slaying a UI Antipattern with Angular
444 lines (437 loc) • 16.9 kB
JavaScript
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