{ "version": 3, "sources": ["libs/rx-utils/src/lib/subscription-list.ts", "libs/rx-utils/src/lib/one-result.ts", "libs/rx-utils/src/lib/scrollable.ts", "libs/rx-utils/src/lib/filter-null-and-undefined.ts", "libs/rx-utils/src/lib/switch-when.ts"], "sourcesContent": ["import { Observable, Subscription } from 'rxjs';\n\nexport class SubscriptionList {\n static new(): SubscriptionList {\n return new SubscriptionList();\n }\n\n static fromList(list: Subscription[]): SubscriptionList {\n return new SubscriptionList(Array.from(list));\n }\n\n private constructor(private readonly subscriptions: Subscription[] = []) {}\n\n destroy(): void {\n this.subscriptions.forEach((s) => s.unsubscribe());\n }\n\n add(inputs: Observable, subscriptionFunction?: (T: any) => void): void {\n this.subscriptions.push(inputs.subscribe(subscriptionFunction));\n }\n\n addSub(subscription: Subscription): void {\n this.subscriptions.push(subscription);\n }\n\n asList(): Subscription[] {\n return Array.from(this.subscriptions);\n }\n\n addAll(...subs: Subscription[]): void {\n this.subscriptions.push(...subs);\n }\n}\n", "import { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\n\n/**\n * @deprecated Use firstValueFrom or lastValueFrom from RXJS\n */\nexport function oneResultFrom(ob: Observable): Promise {\n return ob.pipe(take(1)).toPromise();\n}\n\nexport function oneResultFromEach(ob: [Observable]): Promise[];\nexport function oneResultFromEach(ob: [Observable, Observable]): [Promise, Promise];\nexport function oneResultFromEach(\n ob: [Observable, Observable, Observable],\n): [Promise, Promise, Promise];\nexport function oneResultFromEach(\n ob: [Observable, Observable, Observable, Observable],\n): [Promise, Promise, Promise, Promise];\n\nexport function oneResultFromEach(ob: Observable[]): Promise[] {\n return ob.map((o) => oneResultFrom(o));\n}\n", "import { asapScheduler, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n map,\n observeOn,\n shareReplay,\n startWith,\n switchMap,\n take,\n takeWhile,\n} from 'rxjs/operators';\n\n/**\n * @param criteria$ An observable of metadata that \"resets\" the scroll operation back to the start. This could include search terms, filters, sort order, etc.\n * @param callback A function that takes in the paging metadata, fetches the next page, and returns the new items and metadata.\n * @param trigger$ An observable used to trigger the next page of items to be fetched.\n * @returns An observable state containing the paged items and the paging metadata.\n *\n * @example\n *\n * // Examples of criteria\n * const searchText$ = new BehaviorSubject('');\n * const critera$ = searchText$.pipe(distinctUntilChanged(), debounceTime(500));\n *\n * const filters$ = ...\n * const sortOrder$ = ...\n * const criteria$ = combineLatest([searchText$, filters$, sortOrder$]).pipe(debounceTime(500));\n *\n * // Example of callback\n * (criteria, cursor) => {\n * const { searchText, filters, sortOrder } = criteria;\n * return someApiCall(searchText, filters, sortOrder, cursor).pipe(\n * map(response => ({\n * // You must normalize your response fields to \"items\", \"cursor\", and \"hasMore\"\n * items: response.someItems,\n * cursor: response.cursor,\n * hasMore: response.hasMore,\n * })\n * );\n * }\n *\n * // Example of trigger\n * const trigger$ = new Subject();\n */\nexport const scrollable = (\n criteria$: Observable,\n callback: (\n criteria: Criteria,\n cursor: string,\n ) => Observable<{ items: ItemType[]; cursor: string; hasMore: boolean; totalResults?: number }>,\n trigger$: Observable,\n) => {\n return criteria$.pipe(\n observeOn(asapScheduler),\n switchMap((criteria: Criteria) => {\n let cursor: string = null;\n let hasMore = true;\n let items: ItemType[] = [];\n return trigger$.pipe(\n startWith(true),\n takeWhile(() => hasMore),\n switchMap(() => {\n return callback(criteria, cursor).pipe(\n take(1),\n map((result) => {\n cursor = result.cursor;\n hasMore = result.hasMore;\n if (result.items) {\n items = [...items, ...result.items];\n }\n return {\n items,\n loading: false,\n hasMore,\n empty: items.length === 0 && !hasMore,\n totalResults: result.totalResults || null,\n criteria,\n };\n }),\n startWith({ items, loading: true, hasMore: true, empty: false, totalResults: null, criteria }),\n );\n }),\n );\n }),\n shareReplay({ refCount: true, bufferSize: 1 }),\n );\n};\n\nexport class Scrollable {\n readonly state$ = scrollable(this.criteria$, this.callback, this.trigger$);\n readonly items$ = this.state$.pipe(\n map((value) => value.items),\n distinctUntilChanged(),\n );\n readonly loading$ = this.state$.pipe(\n map((value) => value.loading),\n distinctUntilChanged(),\n );\n readonly hasMore$ = this.state$.pipe(\n map((value) => value.hasMore),\n distinctUntilChanged(),\n );\n readonly empty$ = this.state$.pipe(\n map((value) => value.empty),\n distinctUntilChanged(),\n );\n readonly totalResults$ = this.state$.pipe(map((value) => value.totalResults));\n\n /**\n * @param criteria$ An observable of metadata that \"resets\" the scroll operation back to the start. This could include search terms, filters, sort order, etc.\n * @param callback A function that takes in the paging metadata, fetches the next page, and returns the new items and metadata.\n * @param trigger$ A subject used to trigger the next page of items to be fetched.\n *\n * @see scrollable for more information on these parameters and examples of their use.\n */\n constructor(\n private readonly criteria$: Observable,\n private readonly callback: (\n criteria: Criteria,\n cursor: string,\n ) => Observable<{ items: ItemType[]; cursor: string; hasMore: boolean; totalResults?: number }>,\n private readonly trigger$ = new Subject(),\n ) {}\n\n loadMore(): void {\n this.trigger$.next();\n }\n}\n", "import { filter } from 'rxjs/operators';\n\n/**\n * Provide to an observable pipe to filter out emitted values that are undefined or null.\n *\n * The filter function is a type guard so the type of the returned observable will be refined to not include undefined or null.\n *\n * ```\n * o$: Observable = ...\n * // The explicit type below for o2$ isn't required (it can be inferred)\n * // but it is used here to demonstrate the type refinement\n * o2$: Observable = o$.pipe(\n * tap((v) => {\n * // v might be undefined or null here\n * })\n * filterNullAndUndefined(),\n * map((v) => {\n * // v will not be undefined or null here\n * }),\n * )\n * ```\n */\nexport function filterNullAndUndefined() {\n return filter(isNotNullOrUndefined);\n}\n\nexport function isNotNullOrUndefined(x: T | undefined | null): x is T {\n return x !== undefined && x !== null;\n}\n", "import { MonoTypeOperatorFunction, ObservableInput, of, switchMap } from 'rxjs';\n\ntype validatorFn = (value: T) => boolean;\n\n/**\n * RxJs operator to switch to a new Observable when a condition is met.\n * @param next new Observable to switch to.\n * @param when validator function to determine when to switch. The source Observable value is passed to this function.\n * @returns the resulting Observable.\n * @example\n * ```ts\n * const source = of('first value');\n * const next = of('alternate value');\n * const result = source.pipe(switchWhen(next, (value) => value === 'first value'));\n * result.subscribe((value) => console.log(value)); // logs 'alternate value'\n * ```\n */\nexport function switchWhen(next: ObservableInput, when: validatorFn): MonoTypeOperatorFunction {\n return switchMap((value) => {\n if (when?.(value)) {\n return next;\n }\n return of(value);\n });\n}\n\n/**\n * RxJs operator to switch to a new Observable when the value of the source Observable is falsy.\n * @param next new Observable to switch to.\n * @returns the resulting Observable.\n * @example\n * ```ts\n * const source = of('');\n * const next = of('alternate value');\n * const result = source.pipe(switchWhenFalsy(next));\n * result.subscribe((value) => console.log(value)); // logs 'alternate value'\n * ```\n */\nexport function switchWhenFalsy(next: ObservableInput): MonoTypeOperatorFunction {\n return switchWhen(next, (value) => !value);\n}\n"], "mappings": "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", "names": ["SubscriptionList", "new", "fromList", "list", "Array", "from", "constructor", "subscriptions", "destroy", "forEach", "s", "unsubscribe", "add", "inputs", "subscriptionFunction", "push", "subscribe", "addSub", "subscription", "asList", "addAll", "subs", "oneResultFrom", "ob", "pipe", "take", "toPromise", "oneResultFromEach", "map", "o", "scrollable", "criteria$", "callback", "trigger$", "pipe", "observeOn", "asapScheduler", "switchMap", "criteria", "cursor", "hasMore", "items", "startWith", "takeWhile", "take", "map", "result", "loading", "empty", "length", "totalResults", "shareReplay", "refCount", "bufferSize", "Scrollable", "constructor", "Subject", "state$", "items$", "value", "distinctUntilChanged", "loading$", "hasMore$", "empty$", "totalResults$", "loadMore", "next", "filterNullAndUndefined", "filter", "isNotNullOrUndefined", "x", "switchWhen", "next", "when", "switchMap", "value", "of", "switchWhenFalsy"] }