@ethlete/query 6.0.0-next.54 → 6.0.0-next.56
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 +61 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs +6 -0
- package/fesm2022/ethlete-query-devtools-contract.mjs.map +1 -0
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs +2 -2
- package/fesm2022/ethlete-query-ngrx-toolkit.mjs.map +1 -1
- package/fesm2022/ethlete-query-testing.mjs +42 -21
- package/fesm2022/ethlete-query-testing.mjs.map +1 -1
- package/fesm2022/ethlete-query.mjs +2059 -1289
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/generators/generators.json +10 -0
- package/generators/migrate-query-client-features/migration.js +10 -8
- package/generators/migrate-to-query-v3/legacy-query-creator-migration.js +1 -1
- package/generators/migrate-to-query-v3/report.js +1 -1
- package/generators/move-devtools-contract-imports/migration.js +155 -0
- package/generators/move-devtools-contract-imports/moved-names.js +153 -0
- package/generators/move-devtools-contract-imports/schema.json +26 -0
- package/generators/report-legacy-query-apis/migration.js +256 -0
- package/generators/report-legacy-query-apis/schema.json +25 -0
- package/migrations.json +26 -0
- package/package.json +12 -16
- package/types/ethlete-query-devtools-contract.d.ts +1 -0
- package/types/ethlete-query-ngrx-toolkit.d.ts +2 -2
- package/types/ethlete-query-testing.d.ts +42 -82
- package/types/ethlete-query.d.ts +1092 -815
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,66 @@
|
|
|
1
1
|
# @ethlete/query
|
|
2
2
|
|
|
3
|
+
## 6.0.0-next.56
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- A web socket client with an `authProvider` now reconnects on user switches and logouts, rejoins rooms after login and drops stale emits; the bearer auth provider gains `sessionId()`.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Add the internal `ɵresetQueryDevtoolsForTesting()`, which undoes `provideQueryDevtools()` so a spec that shares a worker with another sees the devtools disabled again.
|
|
12
|
+
- Fix a query form's `activeFilterCount` staying stale when a function `defaultValue` re-resolves to the value already committed.
|
|
13
|
+
- Fix `keepUnusedFor: Infinity` evicting at once, hanging `executeUntilSettled`, leftover optimistic updates, `gql` printing `false`, GET variable order splitting the cache, and legacy `request()` bugs.
|
|
14
|
+
|
|
15
|
+
## 6.0.0-next.55
|
|
16
|
+
|
|
17
|
+
### Major Changes
|
|
18
|
+
|
|
19
|
+
- The devtools contract moved from `@ethlete/query` to the new `@ethlete/query/devtools-contract` entry point, and `et update` rewrites the imports; `provideQueryDevtools` and its option types stay put.
|
|
20
|
+
- `setupQueryTest` rethrows non-request errors, `setupAuthTest` retries 401s by default, `mintTestToken` is exported, `isExpiringSoon` ignores routine refreshes, and dates reach the URL as ISO strings.
|
|
21
|
+
- Route errors are renumbered to `ET010`-`ET012` and invalidation URLs must start with `/`; `withResponseUpdate` now works on GraphQL and transformed queries, and misconfigured clients and creators fail early.
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- Add `createQueryGroup`, a fixed set of queries of which the one executed last drives `loading()`, `error()`, `latest()`, the retry target `execute()` and `succeeded$`.
|
|
26
|
+
- Add `invalidates` to mutation creators and `tags` to read creators, plus `invalidateQueries({ tag })`, so a mutation declares what it makes stale.
|
|
27
|
+
- Add `withOptimisticUpdate`, which writes a mutation's expected result into the cached reads its `target` matches before the request and rolls it back on failure.
|
|
28
|
+
- Add the optional, report-only `report-legacy-query-apis` generator (`nx g @ethlete/query:report-legacy-query-apis`; `et update` does not run it), which lists every query collection, infinity query and entity store in `query-v3-migration-tasks.md`, and point the entity follow-up of `migrate-to-query-v3` at `invalidates`, `tags` and `withOptimisticUpdate`.
|
|
29
|
+
- Queries expose the resolved request URL as `url()` (interop queries as `query.url`), and `retryableStatusCodes` also takes a `(status, isRetryableByDefault) => boolean` predicate to add a status to the defaults.
|
|
30
|
+
- `createWebSocketClient` accepts an `authProvider`: the handshake carries its access token, the socket waits for the session restore, reconnects on login, and disconnects and completes its rooms on logout.
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- Peer dependencies are ranges (`^22.1.0` for Angular, `^7.8.0` for RxJS, ...) instead of the workspace's exact versions. The test-only `vite` and `@analogjs/vite-plugin-angular` peers are gone. `report-legacy-query-apis` now lists every `*etQuery` / `[etQuery]` template site.
|
|
35
|
+
- Queries and snapshots no longer create ten effects each up front: one shared effect starts on the first `asObservable()` call, and a late subscriber gets the current value synchronously.
|
|
36
|
+
- Mark every migration with a `level`, so `et update` runs only the required ones.
|
|
37
|
+
- Fix bearer auth event handlers that end the session or create a query throwing NG0602. The handlers now run untracked. The query devtools also skip an invalid stored account, and the provider that registers no longer fails.
|
|
38
|
+
- Document `latestExecutedQuery` and `latestNonInternalQuery` on the bearer auth provider.
|
|
39
|
+
- `createQueryBatch`: a `concurrency` of `NaN` falls back to the default of 4 instead of leaving the run stuck forever.
|
|
40
|
+
- Creators that differ in `responseType`, `withCredentials`, `reportErrors`, `reportProgress` or `retryFn` no longer share one cache entry on the same URL.
|
|
41
|
+
- Keep queries that differ only in `responseType` or `withCredentials` in separate cache entries.
|
|
42
|
+
- The `migrate-query-client-features` migration no longer records a "createQueryClient already has a features array" task for a client that has a `features` array and neither `multiTabSync` nor `persistence`, so running it again over its own output reports nothing.
|
|
43
|
+
- `queryErrorMessages` and `queryErrorMessage` drop blank messages and fall back to the raw response message, and the devtools token TTL override honors a custom `expiresInPropertyName`.
|
|
44
|
+
- Serve a devtools mock whose declared query parameter is one of several values the request repeats.
|
|
45
|
+
- Skip a pasted or stored devtools override that lacks a field its type replays with, instead of arming it and corrupting the response.
|
|
46
|
+
- Fall back to five retained bodies when `provideQueryDevtools({ responseHistory })` is `NaN`, instead of dropping every body.
|
|
47
|
+
- Keep a placeholder or realistic devtools seed inside a schema's `maximum`, and a placeholder string inside its `minLength`/`maxLength`.
|
|
48
|
+
- Keep the args, response and execution state of `execute({ args })` on a query whose `withArgs` returns `null`.
|
|
49
|
+
- A query form now commits `undefined`, `NaN` or an invalid `Date` as the field default, and reads a repeated or non-finite URL param for a single-value field as the default.
|
|
50
|
+
- Stop a GraphQL field named `query` or `mutation` inside an anonymous operation from being sent as its `operationName`.
|
|
51
|
+
- Mark an unused entry waiting out `keepUnusedFor` stale on an invalidation, so an `allowCache` execution refetches it instead of serving pre-mutation data.
|
|
52
|
+
- Legacy `*etQuery`: `scope` now holds the collection key when the directive is given a query collection, instead of always `null`.
|
|
53
|
+
- Freshness: a `cache-control` carrying both `s-maxage` and `max-age` now takes its window from `max-age`.
|
|
54
|
+
- Freshness: a `cacheAdapter` answering `NaN` no longer keeps the response fresh forever; it counts as no freshness window, like `null`.
|
|
55
|
+
- `createPagedQueryStack`: `direction()` reads `'next'` again after an args change reloads the stack, as it already did after `reset()`.
|
|
56
|
+
- A bare `execute()` on a query whose `withArgs` source returns `null` now does nothing and warns in dev mode, instead of a request with `null` args.
|
|
57
|
+
- `et migrations` offers `report-legacy-query-apis` as an optional migration, with the number of files that still use a legacy query collection, infinity query or entity store.
|
|
58
|
+
- Routes with an existing query string now append params with `&`, sort fields keep colons, and GraphQL operations with directives send their `operationName`.
|
|
59
|
+
- Restart a read once when a mutation's refresh and its `invalidates` targets all match it, in the mutating tab and in the other tabs.
|
|
60
|
+
- The JSDoc example of the `createWebSocketClient` `auth` option no longer reads the token from the auth provider: the function runs outside an injection context, so it reads the token from the app's own store.
|
|
61
|
+
- Stop a reactive `joinRoom` from joining its room a second time when a signal it reads changes without changing the room name, which left the room joined after the consumer was destroyed.
|
|
62
|
+
- `RawResponseType` resolves to the `response` type when the args declare no `rawResponse`, instead of `unknown`.
|
|
63
|
+
|
|
3
64
|
## 6.0.0-next.54
|
|
4
65
|
|
|
5
66
|
### Patch Changes
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ɵEMPTY_QUERY_DEVTOOLS_FAULT as EMPTY_QUERY_DEVTOOLS_FAULT, ɵMAX_QUERY_BATCH_TOMBSTONES as MAX_QUERY_BATCH_TOMBSTONES, ɵMAX_QUERY_BATCH_TOMBSTONE_BUCKETS as MAX_QUERY_BATCH_TOMBSTONE_BUCKETS, ɵMAX_QUERY_DEVTOOLS_TOMBSTONES as MAX_QUERY_DEVTOOLS_TOMBSTONES, ɵQUERY_DEVTOOLS_FAULT_STATUSES as QUERY_DEVTOOLS_FAULT_STATUSES, ɵQUERY_DEVTOOLS_TOKEN_TTL_LIMIT as QUERY_DEVTOOLS_TOKEN_TTL_LIMIT, ɵaddQueryDevtoolsAuthAccount as addQueryDevtoolsAuthAccount, ɵapplyQueryDevtoolsOverrides as applyQueryDevtoolsOverrides, ɵapplyQueryDevtoolsTokenTtl as applyQueryDevtoolsTokenTtl, ɵarmAllQueryDevtoolsMocks as armAllQueryDevtoolsMocks, ɵarmQueryDevtoolsMock as armQueryDevtoolsMock, ɵarmQueryDevtoolsOverrideTransfer as armQueryDevtoolsOverrideTransfer, ɵcanOverrideQueryDevtoolsTokenTtl as canOverrideQueryDevtoolsTokenTtl, ɵclearQueryDevtoolsArmedMocks as clearQueryDevtoolsArmedMocks, ɵclearQueryDevtoolsAuthCredentials as clearQueryDevtoolsAuthCredentials, ɵclearQueryDevtoolsAuthSessions as clearQueryDevtoolsAuthSessions, ɵclearQueryDevtoolsFaults as clearQueryDevtoolsFaults, ɵclearQueryDevtoolsMockStore as clearQueryDevtoolsMockStore, ɵclearQueryDevtoolsOverrideStore as clearQueryDevtoolsOverrideStore, ɵclearQueryDevtoolsStore as clearQueryDevtoolsStore, ɵclearQueryDevtoolsTombstones as clearQueryDevtoolsTombstones, ɵclearRestoredQueryDevtoolsOverrides as clearRestoredQueryDevtoolsOverrides, ɵcollectLeafPaths as collectLeafPaths, ɵcollectQueryDevtoolsSchemaComponents as collectQueryDevtoolsSchemaComponents, ɵcountUnresolvedQueryDevtoolsOverrides as countUnresolvedQueryDevtoolsOverrides, ɵcreateQueryDevtoolsOverrides as createQueryDevtoolsOverrides, ɵdeleteQueryDevtoolsMock as deleteQueryDevtoolsMock, ɵdetectPaginationShape as detectPaginationShape, ɵforgetQueryDevtoolsAuthSession as forgetQueryDevtoolsAuthSession, ɵforgetQueryDevtoolsAuthSessionsFor as forgetQueryDevtoolsAuthSessionsFor, ɵgenerateQueryDevtoolsNumberPreset as generateQueryDevtoolsNumberPreset, ɵgenerateQueryDevtoolsSampleNumber as generateQueryDevtoolsSampleNumber, ɵgenerateQueryDevtoolsStringPreset as generateQueryDevtoolsStringPreset, ɵhasQueryDevtoolsOverridesAtPath as hasQueryDevtoolsOverridesAtPath, ɵisDateShapedLeaf as isDateShapedLeaf, ɵisQueryDevtoolsEnabled as isQueryDevtoolsEnabled, ɵisQueryDevtoolsFaultArmed as isQueryDevtoolsFaultArmed, ɵisQueryDevtoolsRepositoryLive as isQueryDevtoolsRepositoryLive, ɵloadQueryDevtoolsSchema as loadQueryDevtoolsSchema, ɵloginQueryDevtoolsAuthAccount as loginQueryDevtoolsAuthAccount, ɵlogoutQueryDevtoolsAuthSession as logoutQueryDevtoolsAuthSession, ɵmatchesQueryDevtoolsMockPattern as matchesQueryDevtoolsMockPattern, ɵmatchesQueryDevtoolsMockQuery as matchesQueryDevtoolsMockQuery, ɵmeasureQueryDevtoolsPayload as measureQueryDevtoolsPayload, ɵparseQueryDevtoolsOverrideTransfer as parseQueryDevtoolsOverrideTransfer, ɵqueryDevtoolsAbout as queryDevtoolsAbout, ɵqueryDevtoolsAllowsLocalAuthSessions as queryDevtoolsAllowsLocalAuthSessions, ɵqueryDevtoolsApiEnvIds as queryDevtoolsApiEnvIds, ɵqueryDevtoolsApiEnvIsProduction as queryDevtoolsApiEnvIsProduction, ɵqueryDevtoolsApiEnvScope as queryDevtoolsApiEnvScope, ɵqueryDevtoolsApiEnvValues as queryDevtoolsApiEnvValues, ɵqueryDevtoolsApiEnvs as queryDevtoolsApiEnvs, ɵqueryDevtoolsArmedMocks as queryDevtoolsArmedMocks, ɵqueryDevtoolsArmedMocksRestored as queryDevtoolsArmedMocksRestored, ɵqueryDevtoolsAuthAccountsFor as queryDevtoolsAuthAccountsFor, ɵqueryDevtoolsAuthActive as queryDevtoolsAuthActive, ɵqueryDevtoolsAuthFieldsFor as queryDevtoolsAuthFieldsFor, ɵqueryDevtoolsAuthOtherScopeCount as queryDevtoolsAuthOtherScopeCount, ɵqueryDevtoolsAuthSessions as queryDevtoolsAuthSessions, ɵqueryDevtoolsAuthSessionsFor as queryDevtoolsAuthSessionsFor, ɵqueryDevtoolsAuthTabLocal as queryDevtoolsAuthTabLocal, ɵqueryDevtoolsEntries as queryDevtoolsEntries, ɵqueryDevtoolsFaults as queryDevtoolsFaults, ɵqueryDevtoolsFaultsRestored as queryDevtoolsFaultsRestored, ɵqueryDevtoolsMockId as queryDevtoolsMockId, ɵqueryDevtoolsMocks as queryDevtoolsMocks, ɵqueryDevtoolsOverridePersistence as queryDevtoolsOverridePersistence, ɵqueryDevtoolsRequestPath as queryDevtoolsRequestPath, ɵqueryDevtoolsResponseHistory as queryDevtoolsResponseHistory, ɵqueryDevtoolsRestoredOverridesScope as queryDevtoolsRestoredOverridesScope, ɵqueryDevtoolsSchemaNames as queryDevtoolsSchemaNames, ɵqueryDevtoolsSchemaRoutes as queryDevtoolsSchemaRoutes, ɵqueryDevtoolsSchemaState as queryDevtoolsSchemaState, ɵqueryDevtoolsSettings as queryDevtoolsSettings, ɵqueryDevtoolsStorage as queryDevtoolsStorage, ɵqueryDevtoolsTokenTtls as queryDevtoolsTokenTtls, ɵreadQueryDevtoolsStore as readQueryDevtoolsStore, ɵregisterEthleteVersion as registerEthleteVersion, ɵremoveQueryDevtoolsAuthAccount as removeQueryDevtoolsAuthAccount, ɵrenameQueryDevtoolsAuthSession as renameQueryDevtoolsAuthSession, ɵrestoredQueryDevtoolsOverrides as restoredQueryDevtoolsOverrides, ɵsaveQueryDevtoolsMock as saveQueryDevtoolsMock, ɵseedQueryDevtoolsSchemaBody as seedQueryDevtoolsSchemaBody, ɵseedQueryDevtoolsSchemaRoute as seedQueryDevtoolsSchemaRoute, ɵserializeQueryDevtoolsOverrideTransfer as serializeQueryDevtoolsOverrideTransfer, ɵsetQueryDevtoolsApiEnv as setQueryDevtoolsApiEnv, ɵsetQueryDevtoolsAppInfo as setQueryDevtoolsAppInfo, ɵsetQueryDevtoolsArmedMocksScope as setQueryDevtoolsArmedMocksScope, ɵsetQueryDevtoolsAuthCredentials as setQueryDevtoolsAuthCredentials, ɵsetQueryDevtoolsAuthTabLocal as setQueryDevtoolsAuthTabLocal, ɵsetQueryDevtoolsFault as setQueryDevtoolsFault, ɵsetQueryDevtoolsFaultsScope as setQueryDevtoolsFaultsScope, ɵsetQueryDevtoolsOverridePersistence as setQueryDevtoolsOverridePersistence, ɵsetQueryDevtoolsOverridesScope as setQueryDevtoolsOverridesScope, ɵsetQueryDevtoolsSettings as setQueryDevtoolsSettings, ɵsmartDuplicateArrayItem as smartDuplicateArrayItem, ɵsnapshotQueryDevtoolsHandle as snapshotQueryDevtoolsHandle, ɵstringifyQueryRouteParts as stringifyQueryRouteParts, ɵsumQueryDevtoolsStats as sumQueryDevtoolsStats, ɵswitchQueryDevtoolsAuthSession as switchQueryDevtoolsAuthSession, ɵtombstoneOf as tombstoneOf, ɵwriteQueryDevtoolsStore as writeQueryDevtoolsStore } from '@ethlete/query';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generated bundle index. Do not edit.
|
|
5
|
+
*/
|
|
6
|
+
//# sourceMappingURL=ethlete-query-devtools-contract.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ethlete-query-devtools-contract.mjs","sources":["../../../../libs/query/devtools-contract/ethlete-query-devtools-contract.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAAA;;AAEG"}
|
|
@@ -356,8 +356,8 @@ const resolveEntry = (creator, args, injector) => {
|
|
|
356
356
|
const toolkitSelect = (creator, args, options) => resolveEntry(creator, args, resolveEnvironmentInjector(toolkitSelect, options)).handle;
|
|
357
357
|
/**
|
|
358
358
|
* Executes a query creator with toolkit-shaped args and returns its handle - the `FacadeBase.call(group, args)` of
|
|
359
|
-
* `@tomtomb/ngrx-toolkit`. Every call sends the request again
|
|
360
|
-
* long as the injector.
|
|
359
|
+
* `@tomtomb/ngrx-toolkit`. Every call sends the request again, unless one with equal args is still in flight, which it
|
|
360
|
+
* joins; equal args return the same handle, which lives as long as the injector.
|
|
361
361
|
*
|
|
362
362
|
* @example
|
|
363
363
|
* ```ts
|
|
@@ -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; equal args return the same handle, which lives as\n * 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","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,7 +1,7 @@
|
|
|
1
1
|
import { DestroyRef, ErrorHandler, Injector } from '@angular/core';
|
|
2
2
|
import { TestBed } from '@angular/core/testing';
|
|
3
|
-
import { createBearerAuthProvider, withAuthenticationQuery, withRefreshQuery, createQueryClient, createDeleteQuery, createPatchQuery, createPutQuery, createPostQuery, createGetQuery } from '@ethlete/query';
|
|
4
|
-
import { provideHttpClient, HttpClient } from '@angular/common/http';
|
|
3
|
+
import { createBearerAuthProvider, withAuthenticationQuery, withRefreshQuery, isQueryErrorResponse, createQueryClient, createDeleteQuery, createPatchQuery, createPutQuery, createPostQuery, createGetQuery } from '@ethlete/query';
|
|
4
|
+
import { HttpErrorResponse, provideHttpClient, HttpClient } from '@angular/common/http';
|
|
5
5
|
import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing';
|
|
6
6
|
import { provideRouter } from '@angular/router';
|
|
7
7
|
|
|
@@ -21,7 +21,7 @@ const expectFlushAndWait = (httpTesting, url, response, statusOpts) => {
|
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
const setupAuthTest = (config) => {
|
|
24
|
-
const { querySetup, loginPath = '/auth/login', refreshPath = '/auth/refresh', autoRetryOn401 =
|
|
24
|
+
const { querySetup, loginPath = '/auth/login', refreshPath = '/auth/refresh', autoRetryOn401 = true, extractLoginTokens = (response) => ({
|
|
25
25
|
accessToken: response.accessToken,
|
|
26
26
|
refreshToken: response.refreshToken,
|
|
27
27
|
}), extractRefreshTokens = (response) => ({
|
|
@@ -90,7 +90,7 @@ const setupAuthTest = (config) => {
|
|
|
90
90
|
});
|
|
91
91
|
};
|
|
92
92
|
return {
|
|
93
|
-
auth,
|
|
93
|
+
auth: auth,
|
|
94
94
|
login: loginHelper,
|
|
95
95
|
refresh: refreshHelper,
|
|
96
96
|
makeSecureRequest,
|
|
@@ -408,15 +408,7 @@ const createFakeQueryPersistenceStore = () => {
|
|
|
408
408
|
};
|
|
409
409
|
};
|
|
410
410
|
|
|
411
|
-
let originalWarn = null;
|
|
412
411
|
let originalError = null;
|
|
413
|
-
const filteredWarn = (...args) => {
|
|
414
|
-
const message = args[0];
|
|
415
|
-
if (typeof message === 'string' && message.includes('auto-refresh')) {
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
originalWarn?.(...args);
|
|
419
|
-
};
|
|
420
412
|
const filteredError = (...args) => {
|
|
421
413
|
const message = args[0];
|
|
422
414
|
if (message && typeof message === 'object' && 'name' in message && message.name === 'HttpErrorResponse') {
|
|
@@ -433,25 +425,27 @@ const filteredError = (...args) => {
|
|
|
433
425
|
// Capture only what is not already the wrapper, so repeated calls reinstall the one filter instead
|
|
434
426
|
// of nesting a new closure over the previous one and stranding the pristine handlers.
|
|
435
427
|
const installConsoleFilters = () => {
|
|
436
|
-
if (console.warn !== filteredWarn)
|
|
437
|
-
originalWarn = console.warn;
|
|
438
428
|
if (console.error !== filteredError)
|
|
439
429
|
originalError = console.error;
|
|
440
|
-
console.warn = filteredWarn;
|
|
441
430
|
console.error = filteredError;
|
|
442
431
|
};
|
|
443
432
|
const restoreConsole = () => {
|
|
444
|
-
if (originalWarn && console.warn === filteredWarn)
|
|
445
|
-
console.warn = originalWarn;
|
|
446
433
|
if (originalError && console.error === filteredError)
|
|
447
434
|
console.error = originalError;
|
|
448
|
-
originalWarn = null;
|
|
449
435
|
originalError = null;
|
|
450
436
|
};
|
|
437
|
+
const isFailedRequestError = (error) => error instanceof HttpErrorResponse || isQueryErrorResponse(error);
|
|
438
|
+
const requestErrorHandler = {
|
|
439
|
+
handleError: (error) => {
|
|
440
|
+
if (isFailedRequestError(error))
|
|
441
|
+
return;
|
|
442
|
+
throw error;
|
|
443
|
+
},
|
|
444
|
+
};
|
|
451
445
|
const setupQueryTest = (config) => {
|
|
452
446
|
const baseUrl = config?.baseUrl ?? 'https://api.test.com';
|
|
453
447
|
const name = config?.name ?? 'test';
|
|
454
|
-
const mockErrorHandler = config?.mockErrorHandler
|
|
448
|
+
const mockErrorHandler = config?.mockErrorHandler ?? true;
|
|
455
449
|
installConsoleFilters();
|
|
456
450
|
const providers = [
|
|
457
451
|
provideHttpClient(),
|
|
@@ -461,7 +455,7 @@ const setupQueryTest = (config) => {
|
|
|
461
455
|
if (mockErrorHandler) {
|
|
462
456
|
providers.push({
|
|
463
457
|
provide: ErrorHandler,
|
|
464
|
-
useValue: { handleError: () => undefined },
|
|
458
|
+
useValue: mockErrorHandler === 'all' ? { handleError: () => undefined } : requestErrorHandler,
|
|
465
459
|
});
|
|
466
460
|
}
|
|
467
461
|
TestBed.configureTestingModule({ providers });
|
|
@@ -469,6 +463,7 @@ const setupQueryTest = (config) => {
|
|
|
469
463
|
return TestBed.runInInjectionContext(() => {
|
|
470
464
|
const { inject } = queryClientRef;
|
|
471
465
|
const queryClient = inject();
|
|
466
|
+
TestBed.inject(DestroyRef).onDestroy(restoreConsole);
|
|
472
467
|
if (!queryClient) {
|
|
473
468
|
throw new Error('Failed to create query client in test setup');
|
|
474
469
|
}
|
|
@@ -565,6 +560,9 @@ const createWebSocketTestDouble = () => {
|
|
|
565
560
|
get active() {
|
|
566
561
|
return active;
|
|
567
562
|
},
|
|
563
|
+
get sendBuffer() {
|
|
564
|
+
return buffered;
|
|
565
|
+
},
|
|
568
566
|
};
|
|
569
567
|
return {
|
|
570
568
|
io: (url, options) => {
|
|
@@ -615,9 +613,32 @@ const createWebSocketTestDouble = () => {
|
|
|
615
613
|
};
|
|
616
614
|
};
|
|
617
615
|
|
|
616
|
+
const toBase64Url = (json) => {
|
|
617
|
+
const encoded = btoa(encodeURIComponent(json).replace(/%([0-9A-F]{2})/g, (_, hex) => String.fromCharCode(parseInt(hex, 16))));
|
|
618
|
+
return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
619
|
+
};
|
|
620
|
+
let mintCount = 0;
|
|
621
|
+
/**
|
|
622
|
+
* Mints an unsigned JWT the bearer auth provider can decode, with `iat`, `exp` and a unique `jti`.
|
|
623
|
+
* Hand it to `setTokens()` to put the app's own provider into a session.
|
|
624
|
+
*
|
|
625
|
+
* @example
|
|
626
|
+
* ```ts
|
|
627
|
+
* TestBed.runInInjectionContext(() => authProviderRef.inject().setTokens(mintTestToken({ claims: { sub: '1' } }), 'refresh'));
|
|
628
|
+
* ```
|
|
629
|
+
*/
|
|
630
|
+
const mintTestToken = (options = {}) => {
|
|
631
|
+
const { expiresInMs = 15 * 60 * 1000, claims = {} } = options;
|
|
632
|
+
const iat = Math.floor(Date.now() / 1000);
|
|
633
|
+
const exp = Math.floor((Date.now() + expiresInMs) / 1000);
|
|
634
|
+
const header = toBase64Url(JSON.stringify({ alg: 'none', typ: 'JWT' }));
|
|
635
|
+
const payload = toBase64Url(JSON.stringify({ iat, exp, jti: ++mintCount, ...claims }));
|
|
636
|
+
return `${header}.${payload}.`;
|
|
637
|
+
};
|
|
638
|
+
|
|
618
639
|
/**
|
|
619
640
|
* Generated bundle index. Do not edit.
|
|
620
641
|
*/
|
|
621
642
|
|
|
622
|
-
export { createFakeQueryPersistenceStore, createWebSocketTestDouble, expectAndFlush, expectFlushAndWait, flushMultiTabSync, installFakeBroadcastChannel, installFakeWebLocks, setupAuthTest, setupQueryTest };
|
|
643
|
+
export { createFakeQueryPersistenceStore, createWebSocketTestDouble, expectAndFlush, expectFlushAndWait, flushMultiTabSync, installFakeBroadcastChannel, installFakeWebLocks, mintTestToken, setupAuthTest, setupQueryTest };
|
|
623
644
|
//# sourceMappingURL=ethlete-query-testing.mjs.map
|