@ethlete/query 6.0.0-next.59 → 6.0.0-next.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs +1 -6
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs +371 -353
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs.map +1 -1
- package/fesm2022/ethlete-query-testing.mjs +525 -612
- package/fesm2022/ethlete-query-testing.mjs.map +1 -1
- package/fesm2022/ethlete-query.mjs +13466 -18089
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/package.json +2 -2
- package/types/ethlete-query-devtools-contract.d.ts +2 -1
- package/types/ethlete-query-ngrx-toolkit.d.ts +78 -90
- package/types/ethlete-query-testing.d.ts +218 -227
- package/types/ethlete-query.d.ts +6935 -7083
- package/fesm2022/ethlete-query-devtools-contract.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethlete-query-ngrx-toolkit.mjs","sources":["../../../../libs/query/ngrx-toolkit/toolkit-pipe-transform.ts","../../../../libs/query/ngrx-toolkit/suspense.pipe.ts","../../../../libs/query/ngrx-toolkit/suspense-multi.pipe.ts","../../../../libs/query/ngrx-toolkit/ngrx-toolkit.module.ts","../../../../libs/query/ngrx-toolkit/toolkit-types.ts","../../../../libs/query/ngrx-toolkit/toolkit-handle.ts","../../../../libs/query/ngrx-toolkit/toolkit-call.ts","../../../../libs/query/ngrx-toolkit/toolkit-join.ts","../../../../libs/query/ngrx-toolkit/ethlete-query-ngrx-toolkit.ts"],"sourcesContent":["import { ChangeDetectorRef, DestroyRef, inject } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\n\nexport type CreateToolkitPipeTransformOptions<TValue, TState> = {\n initialState: TState;\n disposedState: TState;\n state$: (value: TValue) => Observable<TState>;\n};\n\nexport const createToolkitPipeTransform = <TValue extends object, TState>(\n options: CreateToolkitPipeTransformOptions<TValue, TState>,\n) => {\n const cdr = inject(ChangeDetectorRef);\n let subscription = Subscription.EMPTY;\n let current: TValue | null = null;\n let state = options.initialState;\n\n const dispose = () => {\n subscription.unsubscribe();\n current = null;\n state = options.disposedState;\n };\n\n const subscribe = (value: TValue) => {\n current = value;\n subscription = options.state$(value).subscribe((next) => {\n state = next;\n cdr.markForCheck();\n });\n };\n\n inject(DestroyRef).onDestroy(dispose);\n\n return (value: TValue | null | undefined) => {\n if (!current && value) subscribe(value);\n\n if (current !== value) {\n dispose();\n if (value) subscribe(value);\n }\n\n return state;\n };\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { combineLatest, map, Observable, startWith } from 'rxjs';\nimport { createToolkitPipeTransform } from './toolkit-pipe-transform';\nimport { AnyMappedEntityState, ToolkitPollingOptions } from './toolkit-types';\n\ntype ExtractFrom<T> = T extends Observable<infer U> ? U : never;\n\n/** What `suspense` and `suspenseMulti` render for a handle: every stream's current value, plus the handle's methods. */\nexport type ToolkitSuspenseState<T extends AnyMappedEntityState | null | undefined> = T extends AnyMappedEntityState\n ? {\n args: ExtractFrom<T['args$']>;\n cachedResponse: ExtractFrom<T['cachedResponse$']> | null;\n callState: ExtractFrom<T['callState$']>;\n error: ExtractFrom<T['error$']>;\n isError: ExtractFrom<T['isError$']>;\n isInit: ExtractFrom<T['isInit$']>;\n isLoading: ExtractFrom<T['isLoading$']>;\n isSuccess: ExtractFrom<T['isSuccess$']>;\n response: ExtractFrom<T['response$']>;\n timestamp: ExtractFrom<T['timestamp$']>;\n refresh: () => void;\n remove: () => void;\n startPolling: (options: ToolkitPollingOptions) => void;\n stopPolling: () => void;\n }\n : T;\n\ntype AnySuspenseState = ToolkitSuspenseState<AnyMappedEntityState>;\n\nconst noop = () => undefined;\n\nconst DEFAULT_STATE: AnySuspenseState = {\n args: null,\n cachedResponse: null,\n callState: null,\n error: null,\n isError: false,\n isInit: false,\n isLoading: false,\n isSuccess: false,\n response: null,\n timestamp: null,\n refresh: noop,\n remove: noop,\n startPolling: noop,\n stopPolling: noop,\n};\n\nexport const suspenseState$ = (handle: AnyMappedEntityState): Observable<AnySuspenseState> =>\n combineLatest({\n args: handle.args$,\n cachedResponse: handle.cachedResponse$.pipe(startWith(null)),\n callState: handle.callState$,\n error: handle.error$,\n isError: handle.isError$,\n isInit: handle.isInit$,\n isLoading: handle.isLoading$,\n isSuccess: handle.isSuccess$,\n response: handle.response$,\n timestamp: handle.timestamp$,\n }).pipe(\n map((values) => ({\n ...values,\n refresh: handle.refresh,\n remove: handle.remove,\n startPolling: handle.startPolling,\n stopPolling: handle.stopPolling,\n })),\n );\n\n/** Subscribes to a toolkit handle and renders its current state, like the `suspense` pipe of `@tomtomb/ngrx-toolkit`. */\n@Pipe({ name: 'suspense', pure: false })\nexport class SuspensePipe implements PipeTransform {\n transform = createToolkitPipeTransform<AnyMappedEntityState, AnySuspenseState | null>({\n initialState: DEFAULT_STATE,\n disposedState: null,\n state$: suspenseState$,\n }) as <T extends AnyMappedEntityState>(value: T | null | undefined) => ToolkitSuspenseState<T>;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { combineLatest, map } from 'rxjs';\nimport { suspenseState$, ToolkitSuspenseState } from './suspense.pipe';\nimport { createToolkitPipeTransform } from './toolkit-pipe-transform';\nimport { AnyMappedEntityState } from './toolkit-types';\n\ntype AnyHandleRecord = Record<string, AnyMappedEntityState | null | undefined>;\n\nexport type ToolkitSuspenseMultiState<T extends AnyHandleRecord> = {\n [K in keyof T]: ToolkitSuspenseState<T[K]>;\n};\n\nconst suspenseMultiState$ = (handles: AnyHandleRecord) =>\n combineLatest(\n Object.entries(handles).flatMap(([key, handle]) =>\n handle ? [suspenseState$(handle).pipe(map((state) => [key, state] as const))] : [],\n ),\n ).pipe(map((states) => Object.fromEntries(states)));\n\n/**\n * Subscribes to a record of toolkit handles and renders each one's current state, like the `suspenseMulti` pipe of\n * `@tomtomb/ngrx-toolkit`. Nothing renders until every non-null handle has emitted.\n */\n@Pipe({ name: 'suspenseMulti', pure: false })\nexport class SuspenseMultiPipe implements PipeTransform {\n transform = createToolkitPipeTransform<AnyHandleRecord, Record<string, unknown>>({\n initialState: {},\n disposedState: {},\n state$: suspenseMultiState$,\n }) as <T extends AnyHandleRecord>(value: T | null | undefined) => ToolkitSuspenseMultiState<T>;\n}\n","import { NgModule } from '@angular/core';\nimport { SuspenseMultiPipe } from './suspense-multi.pipe';\nimport { SuspensePipe } from './suspense.pipe';\n\n/** Exports the `suspense` and `suspenseMulti` pipes, like the `NgRxToolkitModule` of `@tomtomb/ngrx-toolkit`. */\n@NgModule({\n imports: [SuspensePipe, SuspenseMultiPipe],\n exports: [SuspensePipe, SuspenseMultiPipe],\n})\nexport class NgRxToolkitModule {}\n","import { AnyQueryCreator, QueryArgsOf, QueryHeaders, ResponseType } from '@ethlete/query';\nimport { Observable, Subject } from 'rxjs';\n\n/** The call state of a toolkit handle, as `@tomtomb/ngrx-toolkit` names it. */\nexport const CallState = {\n INIT: 'INIT',\n LOADING: 'LOADING',\n SUCCESS: 'SUCCESS',\n ERROR: 'ERROR',\n} as const;\n\nexport type CallState = (typeof CallState)[keyof typeof CallState];\n\n/** The error shape of `@tomtomb/ngrx-toolkit`: the HTTP status, the error message and the response body. */\nexport type ToolkitError<T = unknown> = {\n status: number | string;\n message: string;\n data: T | null;\n};\n\nexport type ToolkitActionOptions = {\n headers?: QueryHeaders;\n extras?: { skipCache?: boolean };\n};\n\n/**\n * The toolkit-shaped args of a query creator: `queryParams` holds the path params, `params` the query string and\n * `body` the body, the way `@tomtomb/ngrx-toolkit` action groups named them.\n */\nexport type ActionCallArgs<TCreator extends AnyQueryCreator> = {\n [\n K in keyof QueryArgsOf<TCreator> as K extends 'pathParams'\n ? 'queryParams'\n : K extends 'queryParams'\n ? 'params'\n : K extends 'body'\n ? 'body'\n : never\n ]: QueryArgsOf<TCreator>[K];\n} & { actionOptions?: ToolkitActionOptions };\n\nexport type ToolkitPollingOptions = {\n intervalDuration: number;\n killSwitch: Subject<boolean>;\n};\n\n/** The handle `toolkitCall` returns, shaped like the `MappedEntityState` of `@tomtomb/ngrx-toolkit`. */\nexport type MappedEntityState<TCreator extends AnyQueryCreator> = {\n response$: Observable<ResponseType<QueryArgsOf<TCreator>> | null>;\n cachedResponse$: Observable<ResponseType<QueryArgsOf<TCreator>>>;\n error$: Observable<ToolkitError | null>;\n args$: Observable<ActionCallArgs<TCreator> | null>;\n isInit$: Observable<boolean | null>;\n isLoading$: Observable<boolean | null>;\n isSuccess$: Observable<boolean | null>;\n isError$: Observable<boolean | null>;\n timestamp$: Observable<number | null>;\n callState$: Observable<CallState | null>;\n refresh: () => void;\n remove: () => void;\n startPolling: (options: ToolkitPollingOptions) => void;\n stopPolling: () => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyMappedEntityState = MappedEntityState<any>;\n","import { computed, DestroyRef, effect, EnvironmentInjector, isDevMode, signal, untracked } from '@angular/core';\nimport {\n AnyQueryCreator,\n QueryArgsOf,\n QueryErrorResponse,\n QueryExecutionState,\n RequestArgs,\n ResponseType,\n} from '@ethlete/query';\nimport {\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n interval,\n map,\n Observable,\n of,\n startWith,\n Subject,\n Subscription,\n takeUntil,\n} from 'rxjs';\nimport {\n ActionCallArgs,\n AnyMappedEntityState,\n CallState,\n MappedEntityState,\n ToolkitError,\n ToolkitPollingOptions,\n} from './toolkit-types';\n\ntype ToolkitHandleSnapshot = {\n args: unknown;\n callState: CallState | null;\n response: unknown;\n error: ToolkitError | null;\n timestamp: number | null;\n};\n\nexport type ToolkitHandleEntry = {\n handle: AnyMappedEntityState;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n call: (args: ActionCallArgs<any>) => void;\n releaseWhenSettled: () => void;\n};\n\nconst EMPTY_SNAPSHOT: ToolkitHandleSnapshot = {\n args: null,\n callState: null,\n response: null,\n error: null,\n timestamp: null,\n};\n\nconst toCallState = (state: QueryExecutionState<never> | null): CallState => {\n switch (state?.type) {\n case 'success':\n return CallState.SUCCESS;\n case 'failure':\n return CallState.ERROR;\n default:\n return CallState.LOADING;\n }\n};\n\nconst toToolkitError = (error: QueryErrorResponse): ToolkitError => ({\n status: error.raw.status,\n message: error.raw.message,\n data: error.raw.error ?? null,\n});\n\nconst handleReleasedMessage = (method: 'refresh' | 'startPolling') =>\n `${method}() was called on a toolkit handle that a newer toolkitCall() released. Args that cannot be hashed ` +\n `(FormData, Blob, Map, ...) never share a handle, so the next call for the same creator releases the previous ` +\n `handle once its request settles. The call was ignored - call toolkitCall() again with the args instead of ` +\n `reusing the old handle. This warning is shown once per handle.`;\n\nexport const toQueryArgs = (args: Record<string, unknown>) => {\n const actionOptions = args['actionOptions'] as { headers?: unknown } | undefined;\n const queryArgs: Record<string, unknown> = {};\n\n if (args['queryParams'] !== undefined) queryArgs['pathParams'] = args['queryParams'];\n if (args['params'] !== undefined) queryArgs['queryParams'] = args['params'];\n if (args['body'] !== undefined) queryArgs['body'] = args['body'];\n if (actionOptions?.headers !== undefined) queryArgs['headers'] = actionOptions.headers;\n\n return queryArgs as RequestArgs<never>;\n};\n\nexport const createToolkitHandle = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n injector: EnvironmentInjector,\n): ToolkitHandleEntry => {\n const query = creator({ injector, onlyManualExecution: true, silenceMissingWithArgsFeatureError: true });\n\n const calledArgs = signal<ActionCallArgs<TCreator> | null>(null);\n const toolkitError = computed(() => {\n const error = query.error();\n\n return error ? toToolkitError(error) : null;\n });\n const snapshot = computed<ToolkitHandleSnapshot>(() => {\n const currentArgs = calledArgs();\n\n if (!currentArgs) return EMPTY_SNAPSHOT;\n\n const state = query.executionState();\n const callState = toCallState(state);\n\n return {\n args: currentArgs,\n callState,\n response: state?.type === 'success' ? state.response : null,\n error: callState === CallState.ERROR ? toolkitError() : null,\n timestamp: Date.now(),\n };\n });\n\n const changes = new Subject<ToolkitHandleSnapshot>();\n\n const changesEffect = effect(\n () => {\n const current = snapshot();\n untracked(() => changes.next(current));\n },\n { injector },\n );\n\n let releasedSnapshot: ToolkitHandleSnapshot | null = null;\n let warnedAboutRelease = false;\n\n const ignoredAfterRelease = (method: 'refresh' | 'startPolling') => {\n if (!releasedSnapshot) return false;\n\n if (isDevMode() && !warnedAboutRelease) {\n warnedAboutRelease = true;\n console.warn(handleReleasedMessage(method));\n }\n\n return true;\n };\n\n const select = <T>(pick: (current: ToolkitHandleSnapshot) => T): Observable<T> =>\n defer(() => (releasedSnapshot ? of(releasedSnapshot) : changes.pipe(startWith(untracked(snapshot))))).pipe(\n map(pick),\n distinctUntilChanged(),\n );\n\n const call = (args: ActionCallArgs<TCreator>) => {\n calledArgs.set(args);\n query.execute({ args: toQueryArgs(args as Record<string, unknown>) });\n };\n\n const refresh = () => {\n if (ignoredAfterRelease('refresh')) return;\n\n const lastArgs = untracked(calledArgs);\n\n if (lastArgs) call(lastArgs);\n };\n\n let pollingSubscription = Subscription.EMPTY;\n\n const stopPolling = () => pollingSubscription.unsubscribe();\n\n const startPolling = ({ intervalDuration, killSwitch }: ToolkitPollingOptions) => {\n if (ignoredAfterRelease('startPolling') || !pollingSubscription.closed) return;\n\n pollingSubscription = interval(intervalDuration)\n .pipe(\n takeUntil(killSwitch),\n finalize(() => (pollingSubscription = Subscription.EMPTY)),\n )\n .subscribe(() => refresh());\n };\n\n const remove = () => {\n stopPolling();\n calledArgs.set(null);\n query.reset();\n };\n\n const removeDestroyListener = injector.get(DestroyRef).onDestroy(() => {\n stopPolling();\n changes.complete();\n });\n\n const release = () => {\n releasedSnapshot = untracked(snapshot);\n stopPolling();\n changesEffect.destroy();\n removeDestroyListener();\n changes.complete();\n query.subtle.destroy();\n };\n\n const releaseWhenSettled = () => {\n const releaseEffect = effect(\n () => {\n if (snapshot().callState === CallState.LOADING) return;\n\n releaseEffect.destroy();\n untracked(release);\n },\n { injector },\n );\n };\n\n type TResponse = ResponseType<QueryArgsOf<TCreator>>;\n\n const response$ = select((current) => current.response as TResponse | null);\n\n const handle: MappedEntityState<TCreator> = {\n response$,\n cachedResponse$: response$.pipe(filter((response): response is TResponse => !!response)),\n error$: select((current) => current.error),\n args$: select((current) => current.args as ActionCallArgs<TCreator> | null),\n isInit$: select((current) => current.callState === CallState.INIT),\n isLoading$: select((current) => current.callState === CallState.LOADING),\n isSuccess$: select((current) => current.callState === CallState.SUCCESS),\n isError$: select((current) => current.callState === CallState.ERROR),\n timestamp$: select((current) => current.timestamp),\n callState$: select((current) => current.callState),\n refresh,\n remove,\n startPolling,\n stopPolling,\n };\n\n return { handle, call, releaseWhenSettled };\n};\n","import { assertInInjectionContext, EnvironmentInjector, inject, Injector } from '@angular/core';\nimport { AnyQueryCreator, QueryHeaders, RequestArgs, resolveQueryHeaders } from '@ethlete/query';\nimport { createToolkitHandle, ToolkitHandleEntry, toQueryArgs } from './toolkit-handle';\nimport { ActionCallArgs, MappedEntityState } from './toolkit-types';\n\nexport type ToolkitCallOptions = {\n /**\n * The injector the handle's query lives in. Required outside an injection context, which is where a\n * `providedIn: 'root'` facade calls from; pass the facade's `inject(Injector)`.\n */\n injector?: Injector;\n};\n\ntype ToolkitRegistry = {\n shared: WeakMap<AnyQueryCreator, Map<string, ToolkitHandleEntry>>;\n latestUnshared: WeakMap<AnyQueryCreator, ToolkitHandleEntry>;\n};\n\nconst registries = /* @__PURE__ */ new WeakMap<EnvironmentInjector, ToolkitRegistry>();\n\nclass UnhashableValueError extends Error {}\n\nconst isPlainObject = (value: object) => {\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n};\n\nconst hashableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(hashableValue);\n if (typeof value !== 'object' || value === null) return value;\n if (value instanceof Date) return { '\\u0000date': value.getTime() };\n if (!isPlainObject(value)) throw new UnhashableValueError();\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, hashableValue((value as Record<string, unknown>)[key])]),\n );\n};\n\nconst hashableHeaders = (headers: QueryHeaders | undefined) => {\n const resolved = resolveQueryHeaders(headers);\n\n return resolved\n ?.keys()\n .map((name) => name.toLowerCase())\n .sort()\n .map((name) => [name, resolved.getAll(name)]);\n};\n\n/**\n * Returns `null` for args holding a value JSON cannot represent (FormData, Blob, Map, ...). Those never share a handle,\n * and each one is released once the next one for the same creator starts and its own call has settled.\n */\nconst hashArgs = (args: RequestArgs<never>) => {\n const { headers, ...rest } = args as { headers?: QueryHeaders };\n\n try {\n return JSON.stringify([hashableValue(rest), hashableHeaders(headers) ?? null]);\n } catch (error) {\n if (error instanceof UnhashableValueError) return null;\n\n throw error;\n }\n};\n\nconst resolveEnvironmentInjector = (fn: (...args: never[]) => unknown, options?: ToolkitCallOptions) => {\n if (options?.injector) return options.injector.get(EnvironmentInjector);\n\n assertInInjectionContext(fn);\n\n return inject(EnvironmentInjector);\n};\n\nconst resolveEntry = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n injector: EnvironmentInjector,\n) => {\n let registry = registries.get(injector);\n\n if (!registry) {\n registry = { shared: new WeakMap(), latestUnshared: new WeakMap() };\n registries.set(injector, registry);\n }\n\n const key = hashArgs(toQueryArgs(args as Record<string, unknown>));\n\n if (key === null) {\n const entry = createToolkitHandle(creator, injector);\n\n registry.latestUnshared.get(creator)?.releaseWhenSettled();\n registry.latestUnshared.set(creator, entry);\n\n return entry;\n }\n\n let entries = registry.shared.get(creator);\n\n if (!entries) {\n entries = new Map();\n registry.shared.set(creator, entries);\n }\n\n let entry = entries.get(key);\n\n if (!entry) {\n entry = createToolkitHandle(creator, injector);\n entries.set(key, entry);\n }\n\n return entry;\n};\n\n/**\n * Returns the handle for a creator and args without executing it - the `FacadeBase.select(group, actionId)` of\n * `@tomtomb/ngrx-toolkit`. Args that build the same request (in any key order, other keys ignored) give the same\n * handle `toolkitCall` returns, so `toolkitSelect(getTeam, args, { injector }).refresh()` re-runs a request another\n * component started.\n */\nexport const toolkitSelect = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n options?: ToolkitCallOptions,\n): MappedEntityState<TCreator> =>\n resolveEntry(creator, args, resolveEnvironmentInjector(toolkitSelect, options)).handle;\n\n/**\n * Executes a query creator with toolkit-shaped args and returns its handle - the `FacadeBase.call(group, args)` of\n * `@tomtomb/ngrx-toolkit`. Every call sends the request again, unless one with equal args is still in flight, which it\n * joins; equal args return the same handle, which lives as long as the injector.\n *\n * @example\n * ```ts\n * @Injectable({ providedIn: 'root' })\n * export class TeamFacade {\n * private injector = inject(Injector);\n *\n * getTeam(args: ActionCallArgs<typeof getTeam>) {\n * return toolkitCall(getTeam, args, { injector: this.injector });\n * }\n * }\n * ```\n */\nexport const toolkitCall = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n options?: ToolkitCallOptions,\n): MappedEntityState<TCreator> => {\n const entry = resolveEntry(creator, args, resolveEnvironmentInjector(toolkitCall, options));\n\n entry.call(args);\n\n return entry.handle;\n};\n","import { combineLatest, map, Observable } from 'rxjs';\nimport { ToolkitError } from './toolkit-types';\n\n/** Emits `true` while any of the given loading streams is `true`. Nullish entries are skipped. */\nexport const joinLoading = (observables: (Observable<boolean | null> | null | undefined)[]): Observable<boolean> =>\n combineLatest(observables.filter((o): o is Observable<boolean | null> => !!o)).pipe(\n map((values) => values.some((value) => !!value)),\n );\n\n/** Emits every non-null error of the given error streams, or `null` when there is none. Nullish entries are skipped. */\nexport const joinErrors = (\n observables: (Observable<ToolkitError | null> | null | undefined)[],\n): Observable<ToolkitError[] | null> =>\n combineLatest(observables.filter((o): o is Observable<ToolkitError | null> => !!o)).pipe(\n map((values) => {\n const errors = values.filter((value): value is ToolkitError => !!value);\n\n return errors.length ? errors : null;\n }),\n );\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ethlete-query-ngrx-toolkit.mjs","names":[],"sources":["../../../../libs/query/ngrx-toolkit/toolkit-pipe-transform.ts","../../../../libs/query/ngrx-toolkit/suspense.pipe.ts","../../../../libs/query/ngrx-toolkit/suspense-multi.pipe.ts","../../../../libs/query/ngrx-toolkit/ngrx-toolkit.module.ts","../../../../libs/query/ngrx-toolkit/toolkit-types.ts","../../../../libs/query/ngrx-toolkit/toolkit-handle.ts","../../../../libs/query/ngrx-toolkit/toolkit-call.ts","../../../../libs/query/ngrx-toolkit/toolkit-join.ts"],"sourcesContent":["import { ChangeDetectorRef, DestroyRef, inject } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\n\nexport type CreateToolkitPipeTransformOptions<TValue, TState> = {\n initialState: TState;\n disposedState: TState;\n state$: (value: TValue) => Observable<TState>;\n};\n\nexport const createToolkitPipeTransform = <TValue extends object, TState>(\n options: CreateToolkitPipeTransformOptions<TValue, TState>,\n) => {\n const cdr = inject(ChangeDetectorRef);\n let subscription = Subscription.EMPTY;\n let current: TValue | null = null;\n let state = options.initialState;\n\n const dispose = () => {\n subscription.unsubscribe();\n current = null;\n state = options.disposedState;\n };\n\n const subscribe = (value: TValue) => {\n current = value;\n subscription = options.state$(value).subscribe((next) => {\n state = next;\n cdr.markForCheck();\n });\n };\n\n inject(DestroyRef).onDestroy(dispose);\n\n return (value: TValue | null | undefined) => {\n if (!current && value) subscribe(value);\n\n if (current !== value) {\n dispose();\n if (value) subscribe(value);\n }\n\n return state;\n };\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { combineLatest, map, Observable, startWith } from 'rxjs';\nimport { createToolkitPipeTransform } from './toolkit-pipe-transform';\nimport { AnyMappedEntityState, ToolkitPollingOptions } from './toolkit-types';\n\ntype ExtractFrom<T> = T extends Observable<infer U> ? U : never;\n\n/** What `suspense` and `suspenseMulti` render for a handle: every stream's current value, plus the handle's methods. */\nexport type ToolkitSuspenseState<T extends AnyMappedEntityState | null | undefined> = T extends AnyMappedEntityState\n ? {\n args: ExtractFrom<T['args$']>;\n cachedResponse: ExtractFrom<T['cachedResponse$']> | null;\n callState: ExtractFrom<T['callState$']>;\n error: ExtractFrom<T['error$']>;\n isError: ExtractFrom<T['isError$']>;\n isInit: ExtractFrom<T['isInit$']>;\n isLoading: ExtractFrom<T['isLoading$']>;\n isSuccess: ExtractFrom<T['isSuccess$']>;\n response: ExtractFrom<T['response$']>;\n timestamp: ExtractFrom<T['timestamp$']>;\n refresh: () => void;\n remove: () => void;\n startPolling: (options: ToolkitPollingOptions) => void;\n stopPolling: () => void;\n }\n : T;\n\ntype AnySuspenseState = ToolkitSuspenseState<AnyMappedEntityState>;\n\nconst noop = () => undefined;\n\nconst DEFAULT_STATE: AnySuspenseState = {\n args: null,\n cachedResponse: null,\n callState: null,\n error: null,\n isError: false,\n isInit: false,\n isLoading: false,\n isSuccess: false,\n response: null,\n timestamp: null,\n refresh: noop,\n remove: noop,\n startPolling: noop,\n stopPolling: noop,\n};\n\nexport const suspenseState$ = (handle: AnyMappedEntityState): Observable<AnySuspenseState> =>\n combineLatest({\n args: handle.args$,\n cachedResponse: handle.cachedResponse$.pipe(startWith(null)),\n callState: handle.callState$,\n error: handle.error$,\n isError: handle.isError$,\n isInit: handle.isInit$,\n isLoading: handle.isLoading$,\n isSuccess: handle.isSuccess$,\n response: handle.response$,\n timestamp: handle.timestamp$,\n }).pipe(\n map((values) => ({\n ...values,\n refresh: handle.refresh,\n remove: handle.remove,\n startPolling: handle.startPolling,\n stopPolling: handle.stopPolling,\n })),\n );\n\n/** Subscribes to a toolkit handle and renders its current state, like the `suspense` pipe of `@tomtomb/ngrx-toolkit`. */\n@Pipe({ name: 'suspense', pure: false })\nexport class SuspensePipe implements PipeTransform {\n transform = createToolkitPipeTransform<AnyMappedEntityState, AnySuspenseState | null>({\n initialState: DEFAULT_STATE,\n disposedState: null,\n state$: suspenseState$,\n }) as <T extends AnyMappedEntityState>(value: T | null | undefined) => ToolkitSuspenseState<T>;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { combineLatest, map } from 'rxjs';\nimport { suspenseState$, ToolkitSuspenseState } from './suspense.pipe';\nimport { createToolkitPipeTransform } from './toolkit-pipe-transform';\nimport { AnyMappedEntityState } from './toolkit-types';\n\ntype AnyHandleRecord = Record<string, AnyMappedEntityState | null | undefined>;\n\nexport type ToolkitSuspenseMultiState<T extends AnyHandleRecord> = {\n [K in keyof T]: ToolkitSuspenseState<T[K]>;\n};\n\nconst suspenseMultiState$ = (handles: AnyHandleRecord) =>\n combineLatest(\n Object.entries(handles).flatMap(([key, handle]) =>\n handle ? [suspenseState$(handle).pipe(map((state) => [key, state] as const))] : [],\n ),\n ).pipe(map((states) => Object.fromEntries(states)));\n\n/**\n * Subscribes to a record of toolkit handles and renders each one's current state, like the `suspenseMulti` pipe of\n * `@tomtomb/ngrx-toolkit`. Nothing renders until every non-null handle has emitted.\n */\n@Pipe({ name: 'suspenseMulti', pure: false })\nexport class SuspenseMultiPipe implements PipeTransform {\n transform = createToolkitPipeTransform<AnyHandleRecord, Record<string, unknown>>({\n initialState: {},\n disposedState: {},\n state$: suspenseMultiState$,\n }) as <T extends AnyHandleRecord>(value: T | null | undefined) => ToolkitSuspenseMultiState<T>;\n}\n","import { NgModule } from '@angular/core';\nimport { SuspenseMultiPipe } from './suspense-multi.pipe';\nimport { SuspensePipe } from './suspense.pipe';\n\n/** Exports the `suspense` and `suspenseMulti` pipes, like the `NgRxToolkitModule` of `@tomtomb/ngrx-toolkit`. */\n@NgModule({\n imports: [SuspensePipe, SuspenseMultiPipe],\n exports: [SuspensePipe, SuspenseMultiPipe],\n})\nexport class NgRxToolkitModule {}\n","import { AnyQueryCreator, QueryArgsOf, QueryHeaders, ResponseType } from '@ethlete/query';\nimport { Observable, Subject } from 'rxjs';\n\n/** The call state of a toolkit handle, as `@tomtomb/ngrx-toolkit` names it. */\nexport const CallState = {\n INIT: 'INIT',\n LOADING: 'LOADING',\n SUCCESS: 'SUCCESS',\n ERROR: 'ERROR',\n} as const;\n\nexport type CallState = (typeof CallState)[keyof typeof CallState];\n\n/** The error shape of `@tomtomb/ngrx-toolkit`: the HTTP status, the error message and the response body. */\nexport type ToolkitError<T = unknown> = {\n status: number | string;\n message: string;\n data: T | null;\n};\n\nexport type ToolkitActionOptions = {\n headers?: QueryHeaders;\n extras?: { skipCache?: boolean };\n};\n\n/**\n * The toolkit-shaped args of a query creator: `queryParams` holds the path params, `params` the query string and\n * `body` the body, the way `@tomtomb/ngrx-toolkit` action groups named them.\n */\nexport type ActionCallArgs<TCreator extends AnyQueryCreator> = {\n [\n K in keyof QueryArgsOf<TCreator> as K extends 'pathParams'\n ? 'queryParams'\n : K extends 'queryParams'\n ? 'params'\n : K extends 'body'\n ? 'body'\n : never\n ]: QueryArgsOf<TCreator>[K];\n} & { actionOptions?: ToolkitActionOptions };\n\nexport type ToolkitPollingOptions = {\n intervalDuration: number;\n killSwitch: Subject<boolean>;\n};\n\n/** The handle `toolkitCall` returns, shaped like the `MappedEntityState` of `@tomtomb/ngrx-toolkit`. */\nexport type MappedEntityState<TCreator extends AnyQueryCreator> = {\n response$: Observable<ResponseType<QueryArgsOf<TCreator>> | null>;\n cachedResponse$: Observable<ResponseType<QueryArgsOf<TCreator>>>;\n error$: Observable<ToolkitError | null>;\n args$: Observable<ActionCallArgs<TCreator> | null>;\n isInit$: Observable<boolean | null>;\n isLoading$: Observable<boolean | null>;\n isSuccess$: Observable<boolean | null>;\n isError$: Observable<boolean | null>;\n timestamp$: Observable<number | null>;\n callState$: Observable<CallState | null>;\n refresh: () => void;\n remove: () => void;\n startPolling: (options: ToolkitPollingOptions) => void;\n stopPolling: () => void;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyMappedEntityState = MappedEntityState<any>;\n","import { computed, DestroyRef, effect, EnvironmentInjector, isDevMode, signal, untracked } from '@angular/core';\nimport {\n AnyQueryCreator,\n QueryArgsOf,\n QueryErrorResponse,\n QueryExecutionState,\n RequestArgs,\n ResponseType,\n} from '@ethlete/query';\nimport {\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n interval,\n map,\n Observable,\n of,\n startWith,\n Subject,\n Subscription,\n takeUntil,\n} from 'rxjs';\nimport {\n ActionCallArgs,\n AnyMappedEntityState,\n CallState,\n MappedEntityState,\n ToolkitError,\n ToolkitPollingOptions,\n} from './toolkit-types';\n\ntype ToolkitHandleSnapshot = {\n args: unknown;\n callState: CallState | null;\n response: unknown;\n error: ToolkitError | null;\n timestamp: number | null;\n};\n\nexport type ToolkitHandleEntry = {\n handle: AnyMappedEntityState;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n call: (args: ActionCallArgs<any>) => void;\n releaseWhenSettled: () => void;\n};\n\nconst EMPTY_SNAPSHOT: ToolkitHandleSnapshot = {\n args: null,\n callState: null,\n response: null,\n error: null,\n timestamp: null,\n};\n\nconst toCallState = (state: QueryExecutionState<never> | null): CallState => {\n switch (state?.type) {\n case 'success':\n return CallState.SUCCESS;\n case 'failure':\n return CallState.ERROR;\n default:\n return CallState.LOADING;\n }\n};\n\nconst toToolkitError = (error: QueryErrorResponse): ToolkitError => ({\n status: error.raw.status,\n message: error.raw.message,\n data: error.raw.error ?? null,\n});\n\nconst handleReleasedMessage = (method: 'refresh' | 'startPolling') =>\n `${method}() was called on a toolkit handle that a newer toolkitCall() released. Args that cannot be hashed ` +\n `(FormData, Blob, Map, ...) never share a handle, so the next call for the same creator releases the previous ` +\n `handle once its request settles. The call was ignored - call toolkitCall() again with the args instead of ` +\n `reusing the old handle. This warning is shown once per handle.`;\n\nexport const toQueryArgs = (args: Record<string, unknown>) => {\n const actionOptions = args['actionOptions'] as { headers?: unknown } | undefined;\n const queryArgs: Record<string, unknown> = {};\n\n if (args['queryParams'] !== undefined) queryArgs['pathParams'] = args['queryParams'];\n if (args['params'] !== undefined) queryArgs['queryParams'] = args['params'];\n if (args['body'] !== undefined) queryArgs['body'] = args['body'];\n if (actionOptions?.headers !== undefined) queryArgs['headers'] = actionOptions.headers;\n\n return queryArgs as RequestArgs<never>;\n};\n\nexport const createToolkitHandle = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n injector: EnvironmentInjector,\n): ToolkitHandleEntry => {\n const query = creator({ injector, onlyManualExecution: true, silenceMissingWithArgsFeatureError: true });\n\n const calledArgs = signal<ActionCallArgs<TCreator> | null>(null);\n const toolkitError = computed(() => {\n const error = query.error();\n\n return error ? toToolkitError(error) : null;\n });\n const snapshot = computed<ToolkitHandleSnapshot>(() => {\n const currentArgs = calledArgs();\n\n if (!currentArgs) return EMPTY_SNAPSHOT;\n\n const state = query.executionState();\n const callState = toCallState(state);\n\n return {\n args: currentArgs,\n callState,\n response: state?.type === 'success' ? state.response : null,\n error: callState === CallState.ERROR ? toolkitError() : null,\n timestamp: Date.now(),\n };\n });\n\n const changes = new Subject<ToolkitHandleSnapshot>();\n\n const changesEffect = effect(\n () => {\n const current = snapshot();\n untracked(() => changes.next(current));\n },\n { injector },\n );\n\n let releasedSnapshot: ToolkitHandleSnapshot | null = null;\n let warnedAboutRelease = false;\n\n const ignoredAfterRelease = (method: 'refresh' | 'startPolling') => {\n if (!releasedSnapshot) return false;\n\n if (isDevMode() && !warnedAboutRelease) {\n warnedAboutRelease = true;\n console.warn(handleReleasedMessage(method));\n }\n\n return true;\n };\n\n const select = <T>(pick: (current: ToolkitHandleSnapshot) => T): Observable<T> =>\n defer(() => (releasedSnapshot ? of(releasedSnapshot) : changes.pipe(startWith(untracked(snapshot))))).pipe(\n map(pick),\n distinctUntilChanged(),\n );\n\n const call = (args: ActionCallArgs<TCreator>) => {\n calledArgs.set(args);\n query.execute({ args: toQueryArgs(args as Record<string, unknown>) });\n };\n\n const refresh = () => {\n if (ignoredAfterRelease('refresh')) return;\n\n const lastArgs = untracked(calledArgs);\n\n if (lastArgs) call(lastArgs);\n };\n\n let pollingSubscription = Subscription.EMPTY;\n\n const stopPolling = () => pollingSubscription.unsubscribe();\n\n const startPolling = ({ intervalDuration, killSwitch }: ToolkitPollingOptions) => {\n if (ignoredAfterRelease('startPolling') || !pollingSubscription.closed) return;\n\n pollingSubscription = interval(intervalDuration)\n .pipe(\n takeUntil(killSwitch),\n finalize(() => (pollingSubscription = Subscription.EMPTY)),\n )\n .subscribe(() => refresh());\n };\n\n const remove = () => {\n stopPolling();\n calledArgs.set(null);\n query.reset();\n };\n\n const removeDestroyListener = injector.get(DestroyRef).onDestroy(() => {\n stopPolling();\n changes.complete();\n });\n\n const release = () => {\n releasedSnapshot = untracked(snapshot);\n stopPolling();\n changesEffect.destroy();\n removeDestroyListener();\n changes.complete();\n query.subtle.destroy();\n };\n\n const releaseWhenSettled = () => {\n const releaseEffect = effect(\n () => {\n if (snapshot().callState === CallState.LOADING) return;\n\n releaseEffect.destroy();\n untracked(release);\n },\n { injector },\n );\n };\n\n type TResponse = ResponseType<QueryArgsOf<TCreator>>;\n\n const response$ = select((current) => current.response as TResponse | null);\n\n const handle: MappedEntityState<TCreator> = {\n response$,\n cachedResponse$: response$.pipe(filter((response): response is TResponse => !!response)),\n error$: select((current) => current.error),\n args$: select((current) => current.args as ActionCallArgs<TCreator> | null),\n isInit$: select((current) => current.callState === CallState.INIT),\n isLoading$: select((current) => current.callState === CallState.LOADING),\n isSuccess$: select((current) => current.callState === CallState.SUCCESS),\n isError$: select((current) => current.callState === CallState.ERROR),\n timestamp$: select((current) => current.timestamp),\n callState$: select((current) => current.callState),\n refresh,\n remove,\n startPolling,\n stopPolling,\n };\n\n return { handle, call, releaseWhenSettled };\n};\n","import { assertInInjectionContext, EnvironmentInjector, inject, Injector } from '@angular/core';\nimport { AnyQueryCreator, QueryHeaders, RequestArgs, resolveQueryHeaders } from '@ethlete/query';\nimport { createToolkitHandle, ToolkitHandleEntry, toQueryArgs } from './toolkit-handle';\nimport { ActionCallArgs, MappedEntityState } from './toolkit-types';\n\nexport type ToolkitCallOptions = {\n /**\n * The injector the handle's query lives in. Required outside an injection context, which is where a\n * `providedIn: 'root'` facade calls from; pass the facade's `inject(Injector)`.\n */\n injector?: Injector;\n};\n\ntype ToolkitRegistry = {\n shared: WeakMap<AnyQueryCreator, Map<string, ToolkitHandleEntry>>;\n latestUnshared: WeakMap<AnyQueryCreator, ToolkitHandleEntry>;\n};\n\nconst registries = /* @__PURE__ */ new WeakMap<EnvironmentInjector, ToolkitRegistry>();\n\nclass UnhashableValueError extends Error {}\n\nconst isPlainObject = (value: object) => {\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n};\n\nconst hashableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(hashableValue);\n if (typeof value !== 'object' || value === null) return value;\n if (value instanceof Date) return { '\\u0000date': value.getTime() };\n if (!isPlainObject(value)) throw new UnhashableValueError();\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, hashableValue((value as Record<string, unknown>)[key])]),\n );\n};\n\nconst hashableHeaders = (headers: QueryHeaders | undefined) => {\n const resolved = resolveQueryHeaders(headers);\n\n return resolved\n ?.keys()\n .map((name) => name.toLowerCase())\n .sort()\n .map((name) => [name, resolved.getAll(name)]);\n};\n\n/**\n * Returns `null` for args holding a value JSON cannot represent (FormData, Blob, Map, ...). Those never share a handle,\n * and each one is released once the next one for the same creator starts and its own call has settled.\n */\nconst hashArgs = (args: RequestArgs<never>) => {\n const { headers, ...rest } = args as { headers?: QueryHeaders };\n\n try {\n return JSON.stringify([hashableValue(rest), hashableHeaders(headers) ?? null]);\n } catch (error) {\n if (error instanceof UnhashableValueError) return null;\n\n throw error;\n }\n};\n\nconst resolveEnvironmentInjector = (fn: (...args: never[]) => unknown, options?: ToolkitCallOptions) => {\n if (options?.injector) return options.injector.get(EnvironmentInjector);\n\n assertInInjectionContext(fn);\n\n return inject(EnvironmentInjector);\n};\n\nconst resolveEntry = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n injector: EnvironmentInjector,\n) => {\n let registry = registries.get(injector);\n\n if (!registry) {\n registry = { shared: new WeakMap(), latestUnshared: new WeakMap() };\n registries.set(injector, registry);\n }\n\n const key = hashArgs(toQueryArgs(args as Record<string, unknown>));\n\n if (key === null) {\n const entry = createToolkitHandle(creator, injector);\n\n registry.latestUnshared.get(creator)?.releaseWhenSettled();\n registry.latestUnshared.set(creator, entry);\n\n return entry;\n }\n\n let entries = registry.shared.get(creator);\n\n if (!entries) {\n entries = new Map();\n registry.shared.set(creator, entries);\n }\n\n let entry = entries.get(key);\n\n if (!entry) {\n entry = createToolkitHandle(creator, injector);\n entries.set(key, entry);\n }\n\n return entry;\n};\n\n/**\n * Returns the handle for a creator and args without executing it - the `FacadeBase.select(group, actionId)` of\n * `@tomtomb/ngrx-toolkit`. Args that build the same request (in any key order, other keys ignored) give the same\n * handle `toolkitCall` returns, so `toolkitSelect(getTeam, args, { injector }).refresh()` re-runs a request another\n * component started.\n */\nexport const toolkitSelect = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n options?: ToolkitCallOptions,\n): MappedEntityState<TCreator> =>\n resolveEntry(creator, args, resolveEnvironmentInjector(toolkitSelect, options)).handle;\n\n/**\n * Executes a query creator with toolkit-shaped args and returns its handle - the `FacadeBase.call(group, args)` of\n * `@tomtomb/ngrx-toolkit`. Every call sends the request again, unless one with equal args is still in flight, which it\n * joins; equal args return the same handle, which lives as long as the injector.\n *\n * @example\n * ```ts\n * @Injectable({ providedIn: 'root' })\n * export class TeamFacade {\n * private injector = inject(Injector);\n *\n * getTeam(args: ActionCallArgs<typeof getTeam>) {\n * return toolkitCall(getTeam, args, { injector: this.injector });\n * }\n * }\n * ```\n */\nexport const toolkitCall = <TCreator extends AnyQueryCreator>(\n creator: TCreator,\n args: ActionCallArgs<TCreator>,\n options?: ToolkitCallOptions,\n): MappedEntityState<TCreator> => {\n const entry = resolveEntry(creator, args, resolveEnvironmentInjector(toolkitCall, options));\n\n entry.call(args);\n\n return entry.handle;\n};\n","import { combineLatest, map, Observable } from 'rxjs';\nimport { ToolkitError } from './toolkit-types';\n\n/** Emits `true` while any of the given loading streams is `true`. Nullish entries are skipped. */\nexport const joinLoading = (observables: (Observable<boolean | null> | null | undefined)[]): Observable<boolean> =>\n combineLatest(observables.filter((o): o is Observable<boolean | null> => !!o)).pipe(\n map((values) => values.some((value) => !!value)),\n );\n\n/** Emits every non-null error of the given error streams, or `null` when there is none. Nullish entries are skipped. */\nexport const joinErrors = (\n observables: (Observable<ToolkitError | null> | null | undefined)[],\n): Observable<ToolkitError[] | null> =>\n combineLatest(observables.filter((o): o is Observable<ToolkitError | null> => !!o)).pipe(\n map((values) => {\n const errors = values.filter((value): value is ToolkitError => !!value);\n\n return errors.length ? errors : null;\n }),\n );\n"],"mappings":"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"}
|