@ethlete/query 6.0.0-next.54 → 6.0.0-next.55

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.
@@ -166,12 +166,13 @@ type DefaultRetryOptions = {
166
166
  */
167
167
  jitter?: number;
168
168
  /**
169
- * Which response statuses are worth retrying, replacing the defaults rather than adding to them.
170
- * A connection failure is status `0`.
169
+ * Which response statuses are worth retrying. A list replaces the defaults; a function gets the
170
+ * status and whether the defaults retry it, so `(status, byDefault) => byDefault || status === 500`
171
+ * adds one. A connection failure is status `0`.
171
172
  *
172
173
  * @default a connection failure (`0`), `408`, `425`, `429`, and every 5xx above `500`
173
174
  */
174
- retryableStatusCodes?: number[];
175
+ retryableStatusCodes?: number[] | ((status: number, isRetryableByDefault: boolean) => boolean);
175
176
  /**
176
177
  * Also retries a request that is not idempotent (see {@link ShouldRetryRequestOptions.idempotent}). A
177
178
  * `POST` whose response was lost may already have been applied, so retrying it can create a
@@ -223,6 +224,7 @@ declare const isQueryErrorResponse: (error: unknown) => error is QueryErrorRespo
223
224
  /**
224
225
  * Every message carried by an error, flattened into a plain list - one entry for a single error,
225
226
  * one per violation for a list (a form response with several field violations), empty for `null`.
227
+ * Blank messages are dropped; an error left with none yields the raw response's message instead.
226
228
  *
227
229
  * The single/list split exists because that is how APIs answer; UI almost never wants to branch on
228
230
  * it. Reach for this when rendering, and keep {@link QueryErrorResponse} for anything that needs
@@ -664,6 +666,11 @@ type QueryStateSubtle<TArgs extends QueryArgs> = {
664
666
  * execution. Set by a feature during creation (`withLongPolling` holds its first round back while disabled).
665
667
  */
666
668
  autoExecuteGuard: WritableSignal<(() => boolean) | null>;
669
+ /**
670
+ * Called by every execution before its request is made; a function it returns is called with that request.
671
+ * Set by a feature during creation (`withOptimisticUpdate` writes the cache before the request leaves).
672
+ */
673
+ beforeExecute: WritableSignal<QueryBeforeExecuteFn<TArgs> | null>;
667
674
  /**
668
675
  * Installs the reactive source that backs `state.args`. The `withArgs` feature uses this so that
669
676
  * `state.args` always reflects the latest args (pulled from the reactive source on read) instead
@@ -673,11 +680,19 @@ type QueryStateSubtle<TArgs extends QueryArgs> = {
673
680
  setArgsSource: (source: () => RequestArgs<TArgs> | null) => void;
674
681
  /** Whether {@link setArgsSource} installed a source. Without one, an execution's args are written to `state.args`. */
675
682
  hasArgsSource: Signal<boolean>;
683
+ /**
684
+ * Writes the args of an `execute({ args })` over the args source. They stay until the source produces new
685
+ * non-null args; a source that turns `null` keeps them.
686
+ */
687
+ setExplicitArgs: (args: RequestArgs<TArgs>) => void;
688
+ /** Whether `args` are the ones {@link setExplicitArgs} wrote last and the source has not replaced yet. */
689
+ isExplicitArgs: (args: RequestArgs<TArgs> | null) => boolean;
676
690
  /** @see SetupQueryStateOptions.devtoolsStats */
677
691
  devtoolsStats: QueryDevtoolsStatsRecorder | null;
678
692
  /** @see SetupQueryStateOptions.devtoolsFormLinks */
679
693
  devtoolsFormLinks: QueryDevtoolsFormLinksRecorder | null;
680
694
  };
695
+ type QueryBeforeExecuteFn<TArgs extends QueryArgs> = (args: RequestArgs<TArgs> | null) => ((request: HttpRequest<TArgs>) => void) | null;
681
696
  type QueryState<TArgs extends QueryArgs> = {
682
697
  rawResponse: WritableSignal<RawResponseType<TArgs> | null>;
683
698
  response: WritableSignal<ResponseType<TArgs> | null>;
@@ -758,10 +773,15 @@ type QueryExecuteOptions<TArgs extends QueryArgs> = {
758
773
  isRefreshable?: boolean;
759
774
  };
760
775
  declare const queryExecute: <TArgs extends QueryArgs>(options: QueryExecuteOptions<TArgs>) => void;
776
+ /**
777
+ * A query over a `withArgs` source that returns `null` is parked. Running it would send `null` args, so the
778
+ * call is dropped with a dev-mode warning.
779
+ */
780
+ declare const skipParkedExecution: <TArgs extends QueryArgs>(state: QueryState<TArgs>, args: RequestArgs<TArgs> | null | undefined, route: unknown) => boolean;
761
781
  /**
762
782
  * Writes the args an execution runs with to `state.args`, so a later bare `execute()` re-sends them.
763
- * A `withArgs` source owns `state.args`, and a `withLongPolling` round must not look like a new
764
- * args value, so neither is written.
783
+ * A `withLongPolling` round must not look like a new args value, so it is not written. Over a `withArgs`
784
+ * source only the caller's own non-null args are written, never what a feature re-sends.
765
785
  */
766
786
  declare const recordExecutionArgs: <TArgs extends QueryArgs>(state: QueryState<TArgs>, args: RequestArgs<TArgs> | null, options?: RunQueryExecuteOptions) => void;
767
787
  /**
@@ -786,6 +806,8 @@ type QueryRefreshCause = {
786
806
  type: 'refresh' | 'invalidation' | 'mutation';
787
807
  /** The URL the refresh was narrowed to (an invalidation's scope, a mutation's URL), or `null`. */
788
808
  url: string | null;
809
+ /** The tag an invalidation was narrowed to, or `null`. */
810
+ tag?: string | null;
789
811
  /** Whether another tab asked for it rather than this one. */
790
812
  otherTab: boolean;
791
813
  };
@@ -907,6 +929,8 @@ type QueryRepositoryRequestOptions<TArgs extends QueryArgs> = {
907
929
  * as `idempotent`; unset, that falls back to the method not being `POST` or `PATCH`.
908
930
  */
909
931
  isRefreshable?: boolean;
932
+ /** @see BaseQueryCreatorOptions.tags */
933
+ tags?: readonly string[];
910
934
  };
911
935
  type QueryRepositoryItem<TArgs extends QueryArgs> = {
912
936
  /** The key of the request (either a cache key for cacheable requests or a UUID for uncacheable requests) */
@@ -937,6 +961,10 @@ type QueryRepositoryCacheEntry = {
937
961
  * consumer that comes back.
938
962
  */
939
963
  isUnused: boolean;
964
+ /** @see QueryRepositoryRequestOptions.isRefreshable */
965
+ isRefreshable: boolean;
966
+ /** The tags the entry's consumers declared. */
967
+ tags: readonly string[];
940
968
  /** The underlying HTTP request. */
941
969
  request: HttpRequest<QueryArgs>;
942
970
  };
@@ -957,10 +985,10 @@ type QueryRepositorySubtle = {
957
985
  evict: (key: QueryKey) => void;
958
986
  };
959
987
  /**
960
- * Narrows which in-use entries a {@link QueryRepository.refreshInUse} call refreshes. Returning
961
- * `false` leaves the entry alone.
988
+ * Narrows which in-use entries a {@link QueryRepository.refreshInUse} call refreshes, given the entry's
989
+ * request and the tags its consumers declared. Returning `false` leaves the entry alone.
962
990
  */
963
- type QueryRepositoryRefreshFilterFn = (request: HttpRequest<QueryArgs>) => boolean;
991
+ type QueryRepositoryRefreshFilterFn = (request: HttpRequest<QueryArgs>, tags?: readonly string[]) => boolean;
964
992
  /** @see QueryRepository.applyExternalResponse */
965
993
  type ApplyExternalResponseOptions = {
966
994
  /** The cache key the response belongs to. */
@@ -999,15 +1027,19 @@ type QueryRepository = {
999
1027
  unbindAllSecure: () => void;
1000
1028
  /**
1001
1029
  * Re-executes every cacheable entry that still has consumers, bypassing the cache and restarting
1002
- * in-flight requests. Entries kept only for their `keepUnusedFor` window are skipped - nobody is
1003
- * looking at them, and they revalidate on their own when a consumer binds again.
1030
+ * in-flight requests. Entries kept only for their `keepUnusedFor` window are not re-executed - nobody is
1031
+ * looking at them, and they revalidate on their own when a consumer binds again. An `invalidation`
1032
+ * marks them stale, so an `allowCache` execution does not serve them either.
1004
1033
  *
1005
1034
  * Pass a filter to narrow it down to a subset of those entries, and a cause to describe what asked
1006
1035
  * for it - which is what the devtools report as the reason a query refetched.
1007
1036
  *
1037
+ * An `invalidation` or `mutation` does not restart a request that one of the same batch already
1038
+ * restarted: `batch` names it, and leaving it out makes the current synchronous turn the batch.
1039
+ *
1008
1040
  * @see QueryClient.refreshQueriesInUse
1009
1041
  */
1010
- refreshInUse: (filter?: QueryRepositoryRefreshFilterFn, cause?: QueryRefreshCause) => void;
1042
+ refreshInUse: (filter?: QueryRepositoryRefreshFilterFn, cause?: QueryRefreshCause, batch?: string) => void;
1011
1043
  /**
1012
1044
  * Writes a response that another tab received onto the matching cache entry, so the same query
1013
1045
  * shows the same data everywhere without a second network request.
@@ -1123,6 +1155,7 @@ declare const QueryFeatureType: {
1123
1155
  readonly WITH_AUTO_REFRESH: "WITH_AUTO_REFRESH";
1124
1156
  readonly WITH_RESPONSE_UPDATE: "WITH_RESPONSE_UPDATE";
1125
1157
  readonly WITH_PAGE_RESET_ON_ERROR: "WITH_PAGE_RESET_ON_ERROR";
1158
+ readonly WITH_OPTIMISTIC_UPDATE: "WITH_OPTIMISTIC_UPDATE";
1126
1159
  };
1127
1160
  type QueryFeatureType = (typeof QueryFeatureType)[keyof typeof QueryFeatureType];
1128
1161
  type QueryFeatureContext<TArgs extends QueryArgs> = {
@@ -1153,7 +1186,8 @@ declare const createQueryFeature: <TArgs extends QueryArgs>(config: {
1153
1186
  *
1154
1187
  * Return `null` to park the query: it is reset (`response()` and `executionState()` become `null`),
1155
1188
  * and polling and auto refresh pause until args are set again. A mutation that is still in flight
1156
- * finishes first and the query parks once it has settled.
1189
+ * finishes first and the query parks once it has settled. `execute({ args })` runs and keeps other args
1190
+ * until this function produces new non-null ones.
1157
1191
  *
1158
1192
  * Changing arguments will automatically trigger a new execution of the query if it is eligible for auto execution (e.g. a GET request).
1159
1193
  */
@@ -1312,7 +1346,7 @@ type WithResponseUpdateFeatureOptions<TArgs extends QueryArgs> = {
1312
1346
  /**
1313
1347
  * A function that will be called with the latest response
1314
1348
  * If the function returns `null`, the response will not be updated.
1315
- * Otherwise, the response will be updated with the returned value.
1349
+ * Otherwise, the returned value becomes `response()` as is: it is not passed through `transformResponse` again.
1316
1350
  * The function will be called in a reactive signal context.
1317
1351
  * If the query get's executed after the response was updated, the response will be set the the fresh data received from the server.
1318
1352
  *
@@ -1322,17 +1356,16 @@ type WithResponseUpdateFeatureOptions<TArgs extends QueryArgs> = {
1322
1356
  * const matchEvents = mySocket.joinRoom('match-events');
1323
1357
  *
1324
1358
  * const myMatchQuery = getMatch(
1325
- * withArgs(() => ({ matchId: 1 })),
1326
- * withResponseUpdate(({ currentResponse }) => {
1327
- * const matchEvent = matchEvents();
1328
- *
1329
- * if (!matchEvent) return null;
1359
+ * withArgs(() => ({ pathParams: { matchId: 1 } })),
1360
+ * withResponseUpdate({
1361
+ * updater: ({ currentResponse }) => {
1362
+ * const matchEvent = matchEvents();
1330
1363
  *
1331
- * // Do some checks here. This is just a very simple example.
1332
- * // To apply partial updates, you can use the spread operator in combination with the current response.
1364
+ * if (!matchEvent || !currentResponse) return null;
1333
1365
  *
1334
- * return matchEvent;
1335
- * })
1366
+ * return { ...currentResponse, score: matchEvent.score };
1367
+ * },
1368
+ * }),
1336
1369
  * )
1337
1370
  */
1338
1371
  updater: (data: WithResponseUpdateFeatureFnData<TArgs>) => ResponseType<TArgs> | null;
@@ -1494,6 +1527,28 @@ type BaseQueryCreatorOptions<TArgs extends QueryArgs = QueryArgs> = {
1494
1527
  * @default true for public queries, false for secure ones
1495
1528
  */
1496
1529
  persistence?: boolean;
1530
+ /**
1531
+ * Tags of a read, for {@link QueryClient.invalidateQueries} `{ tag }` and the `invalidates` option of a
1532
+ * mutation. Derived from the args, so a read is tagged before its request leaves and an invalidation
1533
+ * restarts it even while it is in flight. Has no effect on mutations.
1534
+ *
1535
+ * @example
1536
+ * createGetQuery(client)<GetOpportunityArgs>((p) => `/opportunities/${p.uuid}`, {
1537
+ * tags: ({ args }) => [`opportunity:${args.pathParams.uuid}`],
1538
+ * });
1539
+ */
1540
+ tags?: QueryTagsOption<TArgs>;
1541
+ /**
1542
+ * What a successful mutation invalidates: each target runs {@link QueryClient.invalidateQueries} once the
1543
+ * response landed, here and in the user's other tabs. A failed mutation invalidates nothing. Throws on a
1544
+ * read, which would invalidate on every load.
1545
+ *
1546
+ * @example
1547
+ * createPatchQuery(client)<PatchPersonArgs>((p) => `/opportunities/${p.uuid}/people/${p.peopleUuid}`, {
1548
+ * invalidates: ({ args }) => [{ tag: `opportunity:${args.pathParams.uuid}` }, { url: '/people' }],
1549
+ * });
1550
+ */
1551
+ invalidates?: QueryInvalidatesOption<TArgs>;
1497
1552
  /** Advanced query creator features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */
1498
1553
  subtle?: BaseQueryCreatorOptionsSubtle;
1499
1554
  };
@@ -1591,15 +1646,6 @@ type QueryConfig = {
1591
1646
  * If true, the query will not throw an error because a "withArgs()" feature is missing.
1592
1647
  */
1593
1648
  silenceMissingWithArgsFeatureError?: boolean;
1594
- /**
1595
- * If true, executing with `allowCache` on a request that cannot be cached is ignored instead of throwing
1596
- * `ET301`.
1597
- *
1598
- * For the legacy interop layer: v2 had a single `skipCache` for every method, so it forwards `allowCache`
1599
- * without being able to tell a cacheable request from an uncacheable one. Application code should not set
1600
- * this - on a hand-written `execute()` the error it silences is a real mistake.
1601
- */
1602
- silenceUncacheableAllowCacheError?: boolean;
1603
1649
  /**
1604
1650
  * Keeps `response()` on the previous args' response while a request for new args loads, reported as
1605
1651
  * `executionState().cachedResponse`. Defaults to `true` for queries that execute themselves (GET, HEAD,
@@ -1629,6 +1675,8 @@ type QueryInvalidationCandidate = {
1629
1675
  * @see QueryInvalidationOptions.filter
1630
1676
  */
1631
1677
  type QueryInvalidationFilterFn = (query: QueryInvalidationCandidate) => boolean;
1678
+ /** A root-relative route (`/players`), resolved against the client's `baseUrl`, or an absolute URL. */
1679
+ type QueryInvalidationUrl = `/${string}` | `${string}://${string}`;
1632
1680
  /** @see QueryClient.invalidateQueries */
1633
1681
  type QueryInvalidationOptions = {
1634
1682
  /**
@@ -1638,7 +1686,12 @@ type QueryInvalidationOptions = {
1638
1686
  * Matching is boundary aware rather than a plain prefix test, so `/players` covers `/players`,
1639
1687
  * `/players/1` and `/players?page=2` - but not `/players-archive`.
1640
1688
  */
1641
- url?: string;
1689
+ url?: QueryInvalidationUrl;
1690
+ /**
1691
+ * Narrows the invalidation to the reads that declared this tag (see {@link BaseQueryCreatorOptions.tags}).
1692
+ * Combined with `url`, a read has to match both.
1693
+ */
1694
+ tag?: string;
1642
1695
  /**
1643
1696
  * Narrows the invalidation further, on the built `{ method, url }` of each candidate. Runs after
1644
1697
  * `url` when both are given.
@@ -1675,8 +1728,34 @@ declare const isUnderInvalidatedUrl: (queryUrl: string, invalidatedUrl: string)
1675
1728
  */
1676
1729
  declare const createQueryInvalidationFilter: (options: {
1677
1730
  url: string | null;
1731
+ tag?: string | null;
1678
1732
  filter?: QueryInvalidationFilterFn;
1679
1733
  }) => QueryRepositoryRefreshFilterFn | undefined;
1734
+ /** One thing a mutation invalidates: everything below a URL, or every read that declared a tag. */
1735
+ type QueryInvalidationTarget = {
1736
+ url: QueryInvalidationUrl;
1737
+ } | {
1738
+ tag: string;
1739
+ };
1740
+ /** What a {@link BaseQueryCreatorOptions.invalidates} function is handed after a successful mutation. */
1741
+ type QueryInvalidatesContext<TArgs extends QueryArgs> = {
1742
+ /** The args the mutation was sent with. */
1743
+ args: RequestArgs<TArgs>;
1744
+ /** The mutation's response, or `null` for an empty one (a `204`). */
1745
+ response: ResponseType<TArgs> | null;
1746
+ };
1747
+ type Bivariant<TContext, TResult> = {
1748
+ fn(context: TContext): TResult;
1749
+ }['fn'];
1750
+ /** @see BaseQueryCreatorOptions.invalidates */
1751
+ type QueryInvalidatesOption<TArgs extends QueryArgs> = readonly QueryInvalidationTarget[] | Bivariant<QueryInvalidatesContext<TArgs>, readonly QueryInvalidationTarget[]>;
1752
+ /** What a {@link BaseQueryCreatorOptions.tags} function is handed when the read executes. */
1753
+ type QueryTagsContext<TArgs extends QueryArgs> = {
1754
+ /** The args the read is sent with. */
1755
+ args: RequestArgs<TArgs>;
1756
+ };
1757
+ /** @see BaseQueryCreatorOptions.tags */
1758
+ type QueryTagsOption<TArgs extends QueryArgs> = readonly string[] | Bivariant<QueryTagsContext<TArgs>, readonly string[]>;
1680
1759
 
1681
1760
  /**
1682
1761
  * Schema version of the persisted store, owned by this library. Bumping it makes the storage adapter
@@ -2078,6 +2157,8 @@ type QuerySyncMutationMessage = {
2078
2157
  method: QueryMethod;
2079
2158
  /** The full URL the mutation was sent to. */
2080
2159
  url: string;
2160
+ /** @see QuerySyncInvalidateMessage.batch */
2161
+ batch?: string;
2081
2162
  };
2082
2163
  /** Another tab was told to invalidate queries, explicitly. */
2083
2164
  type QuerySyncInvalidateMessage = {
@@ -2087,6 +2168,16 @@ type QuerySyncInvalidateMessage = {
2087
2168
  * resolved by the tab that sent it - the two tabs run the same client, so its `baseUrl` is ours.
2088
2169
  */
2089
2170
  url: string | null;
2171
+ /**
2172
+ * The tag the invalidation was narrowed to, or `null`. A tab from an older deploy ignores the field and
2173
+ * invalidates by `url` alone, a superset.
2174
+ */
2175
+ tag?: string | null;
2176
+ /**
2177
+ * Shared by the messages one tab posted in the same synchronous turn, so the receiver restarts a read
2178
+ * once for all of them. A tab from an older deploy neither sends nor reads it, and restarts once per message.
2179
+ */
2180
+ batch?: string;
2090
2181
  };
2091
2182
  type QuerySyncMessage = QuerySyncResponseMessage | QuerySyncMutationMessage | QuerySyncInvalidateMessage;
2092
2183
  /** What actually travels over the channel: a message plus the protocol version that produced it. */
@@ -2138,10 +2229,10 @@ type QuerySyncEngine = {
2138
2229
  /** Elects the one tab responsible for a cache key. */
2139
2230
  lockManager: QueryKeyLockManager;
2140
2231
  /**
2141
- * Tells the other tabs to refresh the queries they have in use below `url`, or all of them for
2142
- * `null`. What {@link QueryClient.invalidateQueries} broadcasts.
2232
+ * Tells the other tabs to refresh the queries they have in use below `url` and tagged `tag`, or all
2233
+ * of them for two `null`s. What {@link QueryClient.invalidateQueries} broadcasts.
2143
2234
  */
2144
- postInvalidation: (url: string | null) => void;
2235
+ postInvalidation: (url: string | null, tag?: string | null) => void;
2145
2236
  /** Stops broadcasting and listening, and closes the channel. */
2146
2237
  destroy: () => void;
2147
2238
  };
@@ -2465,18 +2556,20 @@ type QueryClient = {
2465
2556
  * date - after a mutation, or a push message saying something changed server-side - and tells the
2466
2557
  * user's other tabs to do the same.
2467
2558
  *
2468
- * Narrow it by `url`, by `filter`, or leave it open to invalidate everything in use:
2559
+ * Narrow it by `url`, `tag`, `filter`, or leave it open to invalidate everything in use. A mutation
2560
+ * creator's `invalidates` option calls this for you after a successful response.
2469
2561
  *
2470
2562
  * @example
2471
- * await createPlayer.execute({ body });
2563
+ * await executeUntilSettled(createPlayer, { args: { body } });
2472
2564
  *
2473
2565
  * client.invalidateQueries({ url: '/players' }); // /players, /players/1, /players?page=2
2566
+ * client.invalidateQueries({ tag: 'player:1' }); // every read whose `tags` include it
2474
2567
  * client.invalidateQueries(); // everything on screen, here and in the other tabs
2475
2568
  *
2476
2569
  * Same set as {@link QueryClient.refreshQueriesInUse}: reads with at least one
2477
2570
  * consumer, cache bypassed, in-flight requests restarted. Entries sitting out their `keepUnusedFor`
2478
- * window are deliberately left alone - they revalidate on their own when a consumer binds again,
2479
- * and refreshing what nobody is looking at is how an invalidation turns into a request storm.
2571
+ * window are only marked stale - refreshing what nobody is looking at is how an invalidation turns
2572
+ * into a request storm - so the next consumer, or an `allowCache` execution, refetches them.
2480
2573
  *
2481
2574
  * Reaching the other tabs needs the {@link withMultiTabSync} client feature; without it this is a
2482
2575
  * local call, and `otherTabs: false` makes it one deliberately.
@@ -2691,6 +2784,13 @@ type HttpRequestSubtle<TArgs extends QueryArgs> = {
2691
2784
  * instead of retrying into an empty room.
2692
2785
  */
2693
2786
  abort: () => boolean;
2787
+ /** Ends the freshness window of the response it holds, so the next `allowCache` execution sends the request. */
2788
+ markStale: () => void;
2789
+ /**
2790
+ * Replaces the response every query bound to this request shows, without an event and without touching
2791
+ * its freshness. What `withOptimisticUpdate` writes and rolls back.
2792
+ */
2793
+ setResponse: (body: ResponseType<TArgs> | null) => void;
2694
2794
  };
2695
2795
  type HttpRequest<TArgs extends QueryArgs> = {
2696
2796
  /** The HTTP method of the request. */
@@ -2789,7 +2889,7 @@ type QueryArgs = {
2789
2889
  headers?: QueryHeadersInput;
2790
2890
  };
2791
2891
  type ResponseType<T extends QueryArgs | null> = T extends QueryArgs ? T['response'] : never;
2792
- type RawResponseType<T extends QueryArgs | null> = T extends QueryArgs ? T['rawResponse'] extends undefined ? T['response'] : T['rawResponse'] : never;
2892
+ type RawResponseType<T extends QueryArgs | null> = T extends QueryArgs ? 'rawResponse' extends keyof T ? T['rawResponse'] extends undefined ? T['response'] : T['rawResponse'] : T['response'] : never;
2793
2893
  type PathParamsType<T extends QueryArgs | null> = T extends QueryArgs ? T['pathParams'] : never;
2794
2894
  type QueryParamsType<T extends QueryArgs | null> = T extends QueryArgs ? T['queryParams'] : never;
2795
2895
  type BodyType<T extends QueryArgs | null> = T extends QueryArgs ? T['body'] : never;
@@ -2870,6 +2970,11 @@ type Query<TArgs extends QueryArgs> = QueryBase<TArgs> & {
2870
2970
  execute: QueryExecute<TArgs>;
2871
2971
  /** Creates an immutable snapshot of the current query state */
2872
2972
  createSnapshot: () => QuerySnapshot<TArgs>;
2973
+ /**
2974
+ * The full URL (base, path params and query params) of the request the query is bound to. `null`
2975
+ * before the first execution.
2976
+ */
2977
+ url: ObservableSignal<string | null>;
2873
2978
  /** Resets the query state to its initial state */
2874
2979
  reset: () => void;
2875
2980
  /**
@@ -3545,6 +3650,11 @@ declare const isSymfonyListError: (error: unknown) => error is FormViolationView
3545
3650
  declare const QueryRuntimeErrorCode: {
3546
3651
  readonly QUERY_FEATURE_USED_MULTIPLE_TIMES: 0;
3547
3652
  readonly QUERY_CREATED_IN_REACTIVE_CONTEXT: 1;
3653
+ readonly INVALIDATES_USED_ON_READ: 2;
3654
+ readonly QUERY_CREATED_OUTSIDE_INJECTION_CONTEXT: 3;
3655
+ readonly INVALID_BASE_URL: 10;
3656
+ readonly INVALID_ROUTE: 11;
3657
+ readonly PATH_PARAMS_MISSING_IN_ROUTE_FUNCTION: 12;
3548
3658
  readonly WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION: 100;
3549
3659
  readonly WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD: 101;
3550
3660
  readonly WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD: 102;
@@ -3552,10 +3662,12 @@ declare const QueryRuntimeErrorCode: {
3552
3662
  readonly SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT: 104;
3553
3663
  readonly WITH_LONG_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD: 105;
3554
3664
  readonly WITH_LONG_POLLING_USED_WITH_POLLING: 106;
3665
+ readonly WITH_OPTIMISTIC_UPDATE_USED_ON_READ: 107;
3555
3666
  readonly AUTH_EXTRACT_TOKENS_RESPONSE_NOT_OBJECT: 200;
3556
3667
  readonly AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_ACCESS_TOKEN: 201;
3557
3668
  readonly AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_REFRESH_TOKEN: 202;
3558
3669
  readonly AUTH_PROVIDER_FEATURE_USED_MULTIPLE_TIMES: 203;
3670
+ readonly AUTH_ACCESS_TOKEN_EXPIRY_UNREADABLE: 204;
3559
3671
  readonly QUERY_CLIENT_FEATURE_USED_MULTIPLE_TIMES: 250;
3560
3672
  readonly UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM: 300;
3561
3673
  readonly UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM: 301;
@@ -3581,6 +3693,8 @@ declare const QueryRuntimeErrorCode: {
3581
3693
  type QueryRuntimeErrorCode = (typeof QueryRuntimeErrorCode)[keyof typeof QueryRuntimeErrorCode];
3582
3694
  declare const queryFeatureUsedMultipleTimes: (type: string) => RuntimeError<0>;
3583
3695
  declare const queryCreatedInReactiveContext: () => RuntimeError<1>;
3696
+ declare const invalidatesUsedOnRead: (method: string) => RuntimeError<2>;
3697
+ declare const withOptimisticUpdateUsedOnRead: (method: string) => RuntimeError<107>;
3584
3698
  declare const withArgsQueryFeatureMissingButRouteIsFunction: () => RuntimeError<100>;
3585
3699
  declare const withPollingUsedOnUnsupportedHttpMethod: (method: string) => RuntimeError<101>;
3586
3700
  declare const withAutoRefreshUsedOnUnsupportedHttpMethod: (method: string) => RuntimeError<102>;
@@ -3592,6 +3706,7 @@ declare const authExtractTokensResponseNotObject: () => RuntimeError<200>;
3592
3706
  declare const authExtractTokensResponseMissingAccessToken: () => RuntimeError<201>;
3593
3707
  declare const authExtractTokensResponseMissingRefreshToken: () => RuntimeError<202>;
3594
3708
  declare const authProviderFeatureUsedMultipleTimes: (type: string) => RuntimeError<203>;
3709
+ declare const authAccessTokenExpiryUnreadable: (claim: string) => RuntimeError<204>;
3595
3710
  declare const queryClientFeatureUsedMultipleTimes: (type: string) => RuntimeError<250>;
3596
3711
  declare const uncacheableRequestHasCacheKeyParam: (key: string) => RuntimeError<300>;
3597
3712
  declare const uncacheableRequestHasAllowCacheParam: () => RuntimeError<301>;
@@ -3606,17 +3721,127 @@ declare const tokensNotAvailableInsideAuthAndExec: () => RuntimeError<700>;
3606
3721
  declare const invalidStateInsideSecureExecuteFactory: () => RuntimeError<701>;
3607
3722
  declare const circularQueryDependency: () => RuntimeError<800>;
3608
3723
  declare const queryExecutedAfterDestroyMessage: (route: unknown) => string;
3724
+ declare const queryExecutedWhileParkedMessage: (route: unknown) => string;
3609
3725
  declare const legacyPrepareWithoutInjectionContext: (creatorName: string | undefined, method?: "prepare" | "createSubject" | "createSignal") => RuntimeError<950>;
3610
3726
  declare const querySequenceAlreadyRunning: () => RuntimeError<900>;
3611
3727
  declare const queryBatchAlreadyRunning: () => RuntimeError<910>;
3612
3728
  declare const queryBatchWithArgsUsed: () => RuntimeError<911>;
3613
3729
 
3730
+ /** The fixed members of a query group, keyed by the name the group reports them under. */
3731
+ type QueryGroupMembers = Record<string, AnyNewQuery>;
3732
+ type QueryGroupMemberResponse<TQuery> = TQuery extends Query<infer TArgs> ? ResponseType<TArgs> : never;
3733
+ type QueryGroupKey<TMembers extends QueryGroupMembers> = keyof TMembers & string;
3734
+ /** The member that ran last and its current response, which is `null` until it has one. */
3735
+ type QueryGroupLatest<TMembers extends QueryGroupMembers> = {
3736
+ [TKey in QueryGroupKey<TMembers>]: {
3737
+ key: TKey;
3738
+ response: QueryGroupMemberResponse<TMembers[TKey]> | null;
3739
+ };
3740
+ }[QueryGroupKey<TMembers>];
3741
+ /** A settled, successful execution of one member. */
3742
+ type QueryGroupSuccess<TMembers extends QueryGroupMembers> = {
3743
+ [TKey in QueryGroupKey<TMembers>]: {
3744
+ key: TKey;
3745
+ response: QueryGroupMemberResponse<TMembers[TKey]>;
3746
+ };
3747
+ }[QueryGroupKey<TMembers>];
3748
+ /**
3749
+ * A fixed set of queries of which the one executed last wins - an action set like accept/decline or
3750
+ * create/edit/delete. Built by {@link createQueryGroup}.
3751
+ */
3752
+ type QueryGroup<TMembers extends QueryGroupMembers> = {
3753
+ /** The members. Executing one through here records it as {@link QueryGroup.latest}; executing the query you passed in does not. */
3754
+ members: TMembers;
3755
+ /** The loading state of a member that is loading, the latest one first. `null` when none is. */
3756
+ loading: Signal<HttpRequestLoadingState | null>;
3757
+ /** The error of the latest member only, so an older member's failure clears once another one runs. */
3758
+ error: Signal<QueryErrorResponse | null>;
3759
+ /** The member executed last, or `null` before the first execution. */
3760
+ latest: Signal<QueryGroupLatest<TMembers> | null>;
3761
+ /** Re-runs the latest member with its last args. Does nothing before the first execution. */
3762
+ execute: (executeArgs?: {
3763
+ options?: RunQueryExecuteOptions;
3764
+ }) => void;
3765
+ /** Emits once for every member execution through the group that succeeds. Completes when the group's injection context is destroyed. */
3766
+ succeeded$: Observable<QueryGroupSuccess<TMembers>>;
3767
+ };
3768
+ type AnyQueryGroup = QueryGroup<QueryGroupMembers>;
3769
+ /**
3770
+ * Groups a fixed set of queries of which the one executed last wins. The group fits `etQueryButton` and
3771
+ * `et-query-error`'s `[query]`, which retries the member that ran last. Call it in an injection context.
3772
+ *
3773
+ * @example
3774
+ * readonly actions = createQueryGroup({
3775
+ * accept: postAcceptInvitation(withArgs(() => ({ pathParams: { id: this.id() } }))),
3776
+ * decline: postDeclineInvitation(withArgs(() => ({ pathParams: { id: this.id() } }))),
3777
+ * });
3778
+ *
3779
+ * accept() {
3780
+ * this.actions.members.accept.execute();
3781
+ * }
3782
+ */
3783
+ declare const createQueryGroup: <TMembers extends QueryGroupMembers>(members: TMembers) => QueryGroup<TMembers>;
3784
+
3614
3785
  /**
3615
3786
  * `true` on every request `@ethlete/query` sends through `HttpClient`, so an app interceptor can skip
3616
3787
  * query requests: `if (req.context.get(IS_QUERY_REQUEST)) return next(req);`.
3617
3788
  */
3618
3789
  declare const IS_QUERY_REQUEST: HttpContextToken<boolean>;
3619
3790
 
3791
+ /** What {@link WithOptimisticUpdateOptions.update} is handed. */
3792
+ type OptimisticUpdateContext<TArgs extends QueryArgs, TCurrent> = {
3793
+ /** The cached response of the read being updated, as the server sent it (before its `transformResponse`). */
3794
+ current: TCurrent;
3795
+ /** The args the mutation is sent with. */
3796
+ args: RequestArgs<TArgs>;
3797
+ /**
3798
+ * `undefined` before the request. After a successful one, the mutation's response, or `null` for an empty
3799
+ * one (a `204`).
3800
+ */
3801
+ response?: ResponseType<TArgs> | null;
3802
+ };
3803
+ type OptimisticCurrent<TRead extends QueryArgs> = [TRead] extends [never] ? unknown : RawResponseType<TRead>;
3804
+ /** @see withOptimisticUpdate */
3805
+ type WithOptimisticUpdateOptions<TArgs extends QueryArgs, TRead extends QueryArgs = never> = {
3806
+ /**
3807
+ * The read creator whose entries `target` matches. Only types `current`; the entries are found by `target`
3808
+ * alone, so it must not match entries of another read. Without it, `current` is `unknown`.
3809
+ */
3810
+ read?: QueryCreator<TRead>;
3811
+ /** The cache entries to update: every read below a URL, or every read that declared a tag. */
3812
+ target: (context: {
3813
+ args: RequestArgs<TArgs>;
3814
+ }) => QueryInvalidationTarget | readonly QueryInvalidationTarget[];
3815
+ /**
3816
+ * Returns the next response of one matched entry, or `null` to leave it alone. Called before the request,
3817
+ * again with `response` after a successful one (`null` there keeps the earlier result), and again whenever
3818
+ * another optimistic update of the same entry rolls back. Must be pure.
3819
+ */
3820
+ update: (context: OptimisticUpdateContext<TArgs, OptimisticCurrent<TRead>>) => OptimisticCurrent<TRead> | null;
3821
+ };
3822
+ /**
3823
+ * Writes the expected result of a mutation into the cached responses of the reads `target` matches before
3824
+ * the request leaves, and rolls those writes back if it fails or is cancelled. Pair it with the creator's
3825
+ * `invalidates`, whose refetch corrects a wrong guess. The writes stay in this tab; the invalidation reaches
3826
+ * the others.
3827
+ *
3828
+ * A rollback leaves an entry alone that a refetch or another tab wrote in the meantime; other optimistic
3829
+ * updates of the entry still pending are re-applied on top of what it held before.
3830
+ *
3831
+ * @example
3832
+ * patchOpportunityPerson(
3833
+ * withArgs(() => ({ pathParams: { uuid, peopleUuid }, body })),
3834
+ * withOptimisticUpdate({
3835
+ * read: getOpportunity,
3836
+ * target: ({ args }) => ({ tag: `opportunity:${args.pathParams.uuid}` }),
3837
+ * update: ({ current, args }) => ({ ...current, people: toggle(current.people, args.pathParams.peopleUuid) }),
3838
+ * }),
3839
+ * );
3840
+ *
3841
+ * @throws If the query is a read (e.g. a GET request)
3842
+ */
3843
+ declare const withOptimisticUpdate: <TArgs extends QueryArgs, TRead extends QueryArgs = never>(options: WithOptimisticUpdateOptions<TArgs, TRead>) => QueryFeature<TArgs>;
3844
+
3620
3845
  /** The last element of a tuple type - the response of the step a `.then()` callback follows. */
3621
3846
  type LastOf<T extends unknown[]> = T extends [...unknown[], infer L] ? L : never;
3622
3847
  /** The current lifecycle phase of a query sequence. */
@@ -4062,6 +4287,7 @@ type SecureExecuteFactoryOptions<TArgs extends QueryArgs> = {
4062
4287
  authProvider: AnyBearerAuthProvider;
4063
4288
  deps: QueryDependencies;
4064
4289
  state: QueryState<TArgs>;
4290
+ route?: unknown;
4065
4291
  /**
4066
4292
  * Whether the query runs itself rather than only on an explicit `execute()` - the same condition
4067
4293
  * `maybeExecute` and the `withArgs` feature use. Only those are re-run once a new session starts;
@@ -4220,6 +4446,9 @@ type TokenRefreshQueryConfig<TArgs extends QueryArgs> = AuthQueryConfig<TArgs> &
4220
4446
  /**
4221
4447
  * HTTP status codes that should trigger a retry.
4222
4448
  * Code 0 means network error (no internet).
4449
+ *
4450
+ * Unlike `createDefaultRetryFn`, the default retries a `500`: a refresh that fails for good ends the
4451
+ * session, so waiting out a backend error is cheaper than logging the user out.
4223
4452
  * @default [0, 408, 425, 429, 500, 502, 503, 504]
4224
4453
  */
4225
4454
  retryableStatusCodes?: number[];
@@ -4555,7 +4784,9 @@ type TokenExpirationWarningConfig = {
4555
4784
  };
4556
4785
  type TokenExpirationWarningFeature = {
4557
4786
  /**
4558
- * Signal that emits true when token is about to expire
4787
+ * `true` while the access token is inside `warningThreshold` of its expiry and nothing is going to
4788
+ * renew it: there is no refresh query or refresh token, or the scheduled refresh is overdue by 10 s
4789
+ * (or half the refresh buffer, if that is shorter) - it failed, was throttled, or is still in flight. A routine refresh never turns it on.
4559
4790
  */
4560
4791
  isExpiringSoon: Signal<boolean>;
4561
4792
  /**
@@ -4747,7 +4978,8 @@ type BearerAuthExecutionState<TType extends string = string> = BearerAuthExecuti
4747
4978
  /**
4748
4979
  * Whether this tab has a session, and whether it is still finding out.
4749
4980
  *
4750
- * - `unknown` - the provider has not finished its own startup yet. Never observed from a component.
4981
+ * - `unknown` - the provider has not finished its own startup yet. With multi-tab sync and a cookie to
4982
+ * restore from, a joining tab stays here for up to 250 ms after `inject` returns, while it asks the leader.
4751
4983
  * - `restoring` - a session restore is in flight (`withPersistentAuth`'s auto-login).
4752
4984
  * - `authenticated` - tokens are applied.
4753
4985
  * - `anonymous` - no session, and nothing is trying to get one.
@@ -4945,7 +5177,9 @@ type CreateBearerAuthProviderConfig<TBuilders extends readonly AnyQueryBuilder[]
4945
5177
  */
4946
5178
  features?: TFeatures;
4947
5179
  /**
4948
- * A function that decrypts the bearer token
5180
+ * Turns the access token into what `bearerData()` holds. Returning `null` means the token carries no
5181
+ * usable data. The proactive refresh reads the expiry claim off the result, and off the raw JWT
5182
+ * payload when the result has none.
4949
5183
  * @default decryptBearer()
4950
5184
  */
4951
5185
  bearerDecryptFn?: (token: string) => TBearerData;
@@ -4985,14 +5219,17 @@ type BearerAuthProvider<TBuilders extends readonly AnyQueryBuilder[], TFeatures
4985
5219
  */
4986
5220
  isAccessTokenExpired: () => boolean;
4987
5221
  /**
4988
- * The latest executed query (including internal triggers like auto-refresh)
5222
+ * The key and snapshot of the latest auth query run, including the provider's own runs (auto-login,
5223
+ * token refresh). A token revocation does not count. `null` before the first run and after a logout.
5224
+ * To follow one query, prefer `queries.<key>.snapshot()`; for progress, `executionState()`.
4989
5225
  */
4990
5226
  latestExecutedQuery: Signal<{
4991
5227
  key: ExtractQueryKey<TBuilders[number]>;
4992
5228
  snapshot: QuerySnapshot<QueryArgs>;
4993
5229
  } | null>;
4994
5230
  /**
4995
- * The latest non-internal query (user-triggered only)
5231
+ * Like {@link latestExecutedQuery}, but only for runs the app started: an `execute()` without a
5232
+ * `triggeredBy`. `null` before the first such run and after a logout.
4996
5233
  */
4997
5234
  latestNonInternalQuery: Signal<{
4998
5235
  key: ExtractQueryKey<TBuilders[number]>;
@@ -5113,6 +5350,8 @@ type BearerAuthProviderQueryContext<TBearerData = unknown, TBuilders extends rea
5113
5350
  * all, so the provider cannot work it out on its own.
5114
5351
  */
5115
5352
  reportAccessTokenExpiry: (isExpired: () => boolean) => void;
5353
+ /** Hands the provider the claim that carries the access token's expiry. `exp` until reported. */
5354
+ reportExpiresInPropertyName: (claim: string) => void;
5116
5355
  };
5117
5356
  declare const createBearerAuthProvider: <TBuilders extends readonly AnyQueryBuilder[], TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[], TBearerData = unknown>(config: CreateBearerAuthProviderConfig<TBuilders, TFeatures, TBearerData>) => ProviderDefinition<BearerAuthProvider<TBuilders, TFeatures, TBearerData>>;
5118
5357
  type BearerAuthProviderRef<TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[], TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[] = readonly ((context: BearerAuthProviderFeatureContext<unknown, readonly AnyQueryBuilder[]>) => unknown)[], TBearerData = unknown> = ProviderDefinition<BearerAuthProvider<TBuilders, TFeatures, TBearerData>>;
@@ -5547,349 +5786,129 @@ declare const setQueryDevtoolsAuthTabLocal: (options: {
5547
5786
  }) => void;
5548
5787
 
5549
5788
  /**
5550
- * Where one kind of devtools state is kept between page loads. `none` means it is not kept at all -
5551
- * what that costs differs per kind, which is why every kind picks its own.
5789
+ * The kind of object a {@link QueryDevtoolsEntry} describes. Part of the devtools contract consumed
5790
+ * by `<et-query-devtools>` - not a general-purpose query API.
5552
5791
  */
5553
- type QueryDevtoolsStorageScope = 'none' | 'session' | 'local';
5792
+ type QueryDevtoolsEntryKind = 'query' | 'query-stack' | 'paged-query-stack' | 'query-sequence' | 'query-batch' | 'auth-provider' | 'ws-client' | 'query-form';
5554
5793
  /**
5555
- * The devtools' own configuration: where each kind of panel state is kept, and the limits the panel
5556
- * would otherwise hold as constants. Read it as {@link queryDevtoolsSettings}, change it with
5557
- * {@link setQueryDevtoolsSettings}.
5794
+ * One chunk of a parsed query route: either literal text (`param: null`) or a path param, whose name
5795
+ * is in {@link QueryDevtoolsRoutePart.text}. Lets the devtools tell a route's static parts from its
5796
+ * dynamic ones and fill the latter in with the values a query actually used.
5558
5797
  */
5559
- type QueryDevtoolsSettings = {
5560
- /** Panel chrome and view state: dock, sizes, open tab, filters, selections. */
5561
- viewState: QueryDevtoolsStorageScope;
5562
- /** The entry ids sorted to the top of the Queries list. */
5563
- pins: QueryDevtoolsStorageScope;
5798
+ type QueryDevtoolsRoutePart = {
5799
+ text: string;
5800
+ param: string | null;
5801
+ };
5802
+ /**
5803
+ * One of a bearer auth provider's queries, described without instantiating it - which is what lets
5804
+ * tooling build the token-refresh request of a provider whose refresh query has not run yet.
5805
+ */
5806
+ type QueryDevtoolsAuthQuery = {
5807
+ key: string;
5808
+ /** `token-refresh` for the query registered via `withRefreshQuery`, `auth` for the rest. */
5809
+ kind: 'auth' | 'token-refresh';
5810
+ method: string;
5811
+ /** Stringified route with path params rendered as `:name`. */
5812
+ route: string;
5813
+ /** The args a token refresh sends for a given refresh token. Only set on the refresh query. */
5814
+ buildArgs?: (refreshToken: string) => {
5815
+ body?: unknown;
5816
+ };
5817
+ };
5818
+ /**
5819
+ * Descriptive, mostly-static metadata about a registered devtools entry. The live, reactive state
5820
+ * is read from the entry's {@link QueryDevtoolsEntry.handle} instead.
5821
+ */
5822
+ type QueryDevtoolsEntryMeta = {
5823
+ /** Display name of the owning query client, where known. */
5824
+ clientName?: string;
5825
+ /** Base URL of the owning query client, where known. */
5826
+ clientBaseUrl?: string;
5827
+ /** Human readable display name (e.g. an auth provider or web socket client name). */
5828
+ name?: string;
5829
+ /** The connection URL, for web socket clients. */
5830
+ url?: string;
5831
+ /** The GraphQL document string, for GraphQL queries. */
5832
+ gqlQuery?: string;
5833
+ /** Stringified route with path params rendered as `:name`, for queries. */
5834
+ route?: string;
5835
+ /** The same route, split into its literal and path-param parts. */
5836
+ routeParts?: QueryDevtoolsRoutePart[];
5837
+ /** Human readable HTTP/GQL method, for queries (e.g. `GET`, `GQL QUERY`). */
5838
+ method?: string;
5839
+ /** The features applied at creation, with the options each was configured with. */
5840
+ features?: QueryDevtoolsFeature[];
5841
+ /** Whether the query authenticates through a bearer auth provider, for queries. */
5842
+ isSecure?: boolean;
5843
+ /** Name of the bearer auth provider a secure query authenticates with. */
5844
+ authProviderName?: string;
5845
+ /** The provider's own queries, for auth providers. */
5846
+ authQueries?: QueryDevtoolsAuthQuery[];
5564
5847
  /**
5565
- * Armed response overrides, replayed as queries register on the next load. `none` by default: an app
5566
- * that stays tampered with across reloads is hours of debugging the wrong thing.
5848
+ * The batch that created a query, for the one query `createQueryBatch` runs per item. The panel folds
5849
+ * such queries under their batch's own entry instead of listing a row per item, and the registry caps
5850
+ * their tombstones per batch so a bulk run cannot evict everything else it kept.
5567
5851
  */
5568
- overrides: QueryDevtoolsStorageScope;
5569
- /** The library of designed mocks - the authoring, not whether any of them is armed. */
5570
- mocks: QueryDevtoolsStorageScope;
5852
+ batch?: QueryBatchDevtoolsHandle;
5853
+ /** Which of the batch's items the query was created for, for a batch's item query. */
5854
+ batchItemIndex?: number;
5855
+ /** How many of a batch's requests may be in flight at once, for batches. */
5856
+ concurrency?: number;
5857
+ /** Whether a batch's first failure stops the rest of the run, for batches. */
5858
+ stopOnError?: boolean;
5859
+ /** The query config passed at creation, for queries. */
5860
+ queryConfig?: QueryConfig;
5861
+ /** The creator options passed at creation, for queries. */
5862
+ creator?: CreateQueryCreatorOptions;
5863
+ /** The owning client's repository, where known (queries and auth providers). */
5864
+ repository?: QueryRepository;
5571
5865
  /**
5572
- * Which mocks are **armed**, as opposed to the library above. `none` by default: an app that silently
5573
- * serves designed data tomorrow morning is worse than arming them again, so keeping them is a choice
5574
- * someone makes rather than the way the panel ships.
5866
+ * The owning client itself, where known (queries and auth providers). Read for state that hangs off
5867
+ * the client rather than the repository - the multi-tab sync engine, in particular.
5575
5868
  */
5576
- armedMocks: QueryDevtoolsStorageScope;
5577
- /** The faults armed per client, for the same reason and with the same default. */
5578
- armedFaults: QueryDevtoolsStorageScope;
5869
+ client?: QueryClient;
5579
5870
  /**
5580
- * The session vault: the token pairs the panel switches between, and the credentials it logs in with.
5581
- * `local` by default, because a vault that forgets the other user on every reload is not one - and
5582
- * `none` for a machine where nothing of the sort may be kept. Outside a development build `local` is
5583
- * refused and read back as `session`, see {@link queryDevtoolsAllowsLocalAuthSessions}.
5871
+ * The DOM element of the component/directive that created a query, when available. Used by the
5872
+ * devtools "inspect" tool to map a query back to its place in the live UI.
5584
5873
  */
5585
- authSessions: QueryDevtoolsStorageScope;
5586
- /** How many entries the Events log keeps. */
5587
- maxEvents: number;
5588
- /** How many dropped cache entries the Cache tab remembers, per client. */
5589
- maxDroppedCacheEntries: number;
5874
+ element?: HTMLElement | null;
5875
+ };
5876
+ /**
5877
+ * A single entry in the {@link queryDevtoolsEntries} registry. The `handle` is the live object
5878
+ * (query, stack, sequence or auth provider) so its signals stay reactive when read by the UI.
5879
+ */
5880
+ type QueryDevtoolsEntry = {
5881
+ id: string;
5882
+ kind: QueryDevtoolsEntryKind;
5883
+ meta: QueryDevtoolsEntryMeta;
5884
+ handle: unknown;
5885
+ createdAt: number;
5590
5886
  /**
5591
- * How many bodies each query retains, overriding `provideQueryDevtools({ responseHistory })` for the
5592
- * rest of this page. `null` leaves the application's value alone.
5887
+ * When the query behind this entry was destroyed, or `null`/absent while it is still live. A
5888
+ * destroyed entry is kept as a tombstone - a frozen snapshot of what the query last held - so a
5889
+ * request that failed on the way out (a `401` that redirects to login and takes its component with
5890
+ * it) is still readable by the time the panel is opened. Its `handle` answers with constants and
5891
+ * every action on it is inert.
5593
5892
  */
5594
- responseHistory: number | null;
5893
+ destroyedAt?: number | null;
5595
5894
  /**
5596
- * Whether switching to another session reloads the page. On by default: a switch replaces what the
5597
- * query layer holds, and an application that keeps the user anywhere else - a profile service, the
5598
- * router, an open form - is still showing the last one until it boots again.
5895
+ * What the entry has done since it was created - executions, requests, payload sizes. Present for
5896
+ * queries; stacks, sequences and auth providers aggregate the stats of the queries they own instead.
5599
5897
  */
5600
- reloadOnAuthSwitch: boolean;
5898
+ stats?: QueryDevtoolsStatsHandle;
5899
+ /** The query forms this entry's args read, for queries created with a `withArgs` feature. */
5900
+ formLinks?: QueryDevtoolsFormLinksHandle;
5901
+ /**
5902
+ * The response overrides armed on this entry, for queries. Unlike {@link stats}/{@link formLinks} -
5903
+ * whose write side is internal instrumentation the panel only ever reads - the panel itself is what
5904
+ * arms an override, so this exposes the full recorder rather than a read-only handle.
5905
+ */
5906
+ overrides?: QueryDevtoolsOverridesRecorder;
5601
5907
  };
5602
5908
  /**
5603
- * How the devtools are configured. Every consumer reads the live value rather than a copy, so a change
5604
- * in the panel's Settings takes effect without a reload.
5605
- *
5606
- * Part of the devtools contract. **Not part of the general public contract.**
5607
- */
5608
- declare const queryDevtoolsSettings: Signal<QueryDevtoolsSettings>;
5609
- /**
5610
- * The `Storage` a scope names, or `null` for `none` and for a browser that refuses one (private mode,
5611
- * storage disabled, server-side rendering). Callers treat "no storage" and "not persisted" alike.
5612
- *
5613
- * Part of the devtools contract. **Not part of the general public contract.**
5614
- */
5615
- declare const queryDevtoolsStorage: (scope: QueryDevtoolsStorageScope) => Storage | null;
5616
- /**
5617
- * Reads one JSON-encoded devtools key from the store a scope names, or `null`.
5618
- *
5619
- * Part of the devtools contract. **Not part of the general public contract.**
5620
- */
5621
- declare const readQueryDevtoolsStore: <T>(scope: QueryDevtoolsStorageScope, key: string) => T | null;
5622
- /**
5623
- * Writes one devtools key into the store a scope names. A scope of `none` writes nothing.
5624
- *
5625
- * Part of the devtools contract. **Not part of the general public contract.**
5626
- */
5627
- declare const writeQueryDevtoolsStore: (scope: QueryDevtoolsStorageScope, key: string, value: unknown) => void;
5628
- /**
5629
- * Removes one devtools key from **both** stores, whatever the scope currently is - so a scope that
5630
- * changed cannot leave a stale copy behind for the next load to read.
5631
- *
5632
- * Part of the devtools contract. **Not part of the general public contract.**
5633
- */
5634
- declare const clearQueryDevtoolsStore: (key: string) => void;
5635
- /**
5636
- * Whether the session vault may be kept in `localStorage`. Only a development build may: the vault
5637
- * holds live access and refresh tokens plus the credentials somebody typed in, and a deployed
5638
- * application that mounts the panel for its debugging value must not leave those on the machine of
5639
- * whoever opened it. Outside a development build a stored or default `local` reads back as `none`, so a
5640
- * plain login keeps nothing; `session` stays on offer for whoever picks it in Settings.
5641
- *
5642
- * Part of the devtools contract. **Not part of the general public contract.**
5643
- */
5644
- declare const queryDevtoolsAllowsLocalAuthSessions: () => boolean;
5645
- /**
5646
- * Changes part of the devtools configuration and stores it. Values outside the range a field allows are
5647
- * clamped rather than rejected.
5648
- *
5649
- * Overrides are the one field not to set here: their scope moves an existing store, so it goes through
5650
- * `setQueryDevtoolsOverridesScope()` instead.
5651
- *
5652
- * Part of the devtools contract. **Not part of the general public contract.**
5653
- */
5654
- declare const setQueryDevtoolsSettings: (patch: Partial<QueryDevtoolsSettings>) => void;
5655
-
5656
- /**
5657
- * A fault armed on one query client from the devtools panel. Unlike the panel's forced states - which
5658
- * write a query's signals directly - an armed fault is applied inside the request pipeline, so retries,
5659
- * error handling features and the cache all see it exactly as they would see a real one.
5660
- */
5661
- type QueryDevtoolsFault = {
5662
- /** Extra latency in ms added before every attempt starts. `0` disables it. */
5663
- latencyMs: number;
5664
- /**
5665
- * How many upcoming attempts fail before the client is let through again, counted down as they are
5666
- * consumed. `0` disables it.
5667
- */
5668
- failNext: number;
5669
- /** The percentage of attempts that fail, rolled per attempt. `0` disables it, `100` fails everything. */
5670
- failRate: number;
5671
- /** The status an injected failure responds with. */
5672
- status: number;
5673
- };
5674
- /** The neutral fault: nothing armed. */
5675
- declare const EMPTY_QUERY_DEVTOOLS_FAULT: QueryDevtoolsFault;
5676
- /**
5677
- * Statuses worth injecting, and whether the SDK's default retry policy retries them. A picker built from
5678
- * this cannot arm a 500 and then leave you wondering why no retry fired.
5679
- * @see runDefaultQueryRetry
5680
- */
5681
- declare const QUERY_DEVTOOLS_FAULT_STATUSES: {
5682
- status: number;
5683
- label: string;
5684
- retryable: boolean;
5685
- }[];
5686
- /**
5687
- * The faults armed per client name, consumed by the `<et-query-devtools>` UI. Clients with nothing armed
5688
- * are absent rather than present with an {@link EMPTY_QUERY_DEVTOOLS_FAULT}.
5689
- */
5690
- declare const queryDevtoolsFaults: Signal<Record<string, QueryDevtoolsFault>>;
5691
- /**
5692
- * Whether what is armed right now came back from a previous page load rather than being armed by hand.
5693
- * The panel's armed bar says so, because injected failures nobody remembers arming look exactly like a
5694
- * broken API.
5695
- */
5696
- declare const queryDevtoolsFaultsRestored: Signal<boolean>;
5697
- /**
5698
- * Where the armed faults are kept. Switching to a scope that keeps them stores whatever is armed right
5699
- * now; switching to `none` empties the store and leaves this page's faults exactly where they are.
5700
- */
5701
- declare const setQueryDevtoolsFaultsScope: (next: QueryDevtoolsStorageScope) => void;
5702
- /** Whether anything at all is armed on a fault. */
5703
- declare const isQueryDevtoolsFaultArmed: (fault: QueryDevtoolsFault) => boolean;
5704
- /**
5705
- * Arms (or updates) the fault of one client. Only the given fields change; the rest keep their current
5706
- * value. A client whose resulting fault has nothing armed is dropped from {@link queryDevtoolsFaults}.
5707
- *
5708
- * Part of the devtools contract consumed by `<et-query-devtools>`; a fault is a debugging tool, not
5709
- * something an application should arm on itself.
5710
- */
5711
- declare const setQueryDevtoolsFault: (options: {
5712
- clientName: string;
5713
- patch: Partial<QueryDevtoolsFault>;
5714
- }) => void;
5715
- /**
5716
- * Disarms every fault of one client, or of all clients when no name is given.
5717
- *
5718
- * @see setQueryDevtoolsFault
5719
- */
5720
- declare const clearQueryDevtoolsFaults: (clientName?: string) => void;
5721
-
5722
- /**
5723
- * One field of a query form, as the devtools panel reads it: what it holds, what it puts in the URL,
5724
- * and the rules that decide when either changes.
5725
- */
5726
- type QueryDevtoolsFormField = {
5727
- key: string;
5728
- /** The query-param key the field serializes to, with the form's prefix applied. */
5729
- paramKey: string;
5730
- /** The committed value - what the query args are built from. */
5731
- value: unknown;
5732
- /** The live value of the bound control, which differs from {@link value} while a debounce is pending. */
5733
- liveValue: unknown;
5734
- defaultValue: unknown;
5735
- /** Whether the committed value is the default one. */
5736
- isDefault: boolean;
5737
- /** What the field writes to the URL, or `undefined` when it writes nothing. */
5738
- queryParam: unknown;
5739
- /** How long a change waits before it is committed, or `null` when it commits immediately. */
5740
- debounceMs: number | null;
5741
- /** The sibling fields whose change resets this one back to its default. */
5742
- isResetBy: readonly string[];
5743
- /** Whether the field counts towards {@link QueryDevtoolsFormHandle.activeFilterCount}. */
5744
- countsAsFilter: boolean;
5745
- };
5746
- /**
5747
- * The live state of a query form, as `<et-query-devtools>` renders it. Part of the devtools contract -
5748
- * not a general-purpose query-form API.
5749
- */
5750
- type QueryDevtoolsFormHandle = {
5751
- fields: Signal<QueryDevtoolsFormField[]>;
5752
- /** The committed value of the whole form. */
5753
- value: Signal<Record<string, unknown>>;
5754
- /** The value of every field before the most recent commit, or `null` before the first one. */
5755
- previousValue: Signal<Record<string, unknown> | null>;
5756
- defaultValue: Record<string, unknown>;
5757
- /** @see QueryFormSignals.activeFilterCount */
5758
- activeFilterCount: Signal<number>;
5759
- /** Whether every field sits at its default. */
5760
- isAtDefaults: Signal<boolean>;
5761
- /** Whether a change is waiting out its debounce, so the committed value is one edit behind. */
5762
- isCommitPending: Signal<boolean>;
5763
- /** Whether the form is syncing with the URL, i.e. whether `observe()` has been called. */
5764
- isObserving: Signal<boolean>;
5765
- resetField: (key: string) => void;
5766
- resetAll: () => void;
5767
- };
5768
-
5769
- /**
5770
- * The kind of object a {@link QueryDevtoolsEntry} describes. Part of the devtools contract consumed
5771
- * by `<et-query-devtools>` - not a general-purpose query API.
5772
- */
5773
- type QueryDevtoolsEntryKind = 'query' | 'query-stack' | 'paged-query-stack' | 'query-sequence' | 'query-batch' | 'auth-provider' | 'ws-client' | 'query-form';
5774
- /**
5775
- * One chunk of a parsed query route: either literal text (`param: null`) or a path param, whose name
5776
- * is in {@link QueryDevtoolsRoutePart.text}. Lets the devtools tell a route's static parts from its
5777
- * dynamic ones and fill the latter in with the values a query actually used.
5778
- */
5779
- type QueryDevtoolsRoutePart = {
5780
- text: string;
5781
- param: string | null;
5782
- };
5783
- /**
5784
- * One of a bearer auth provider's queries, described without instantiating it - which is what lets
5785
- * tooling build the token-refresh request of a provider whose refresh query has not run yet.
5786
- */
5787
- type QueryDevtoolsAuthQuery = {
5788
- key: string;
5789
- /** `token-refresh` for the query registered via `withRefreshQuery`, `auth` for the rest. */
5790
- kind: 'auth' | 'token-refresh';
5791
- method: string;
5792
- /** Stringified route with path params rendered as `:name`. */
5793
- route: string;
5794
- /** The args a token refresh sends for a given refresh token. Only set on the refresh query. */
5795
- buildArgs?: (refreshToken: string) => {
5796
- body?: unknown;
5797
- };
5798
- };
5799
- /**
5800
- * Descriptive, mostly-static metadata about a registered devtools entry. The live, reactive state
5801
- * is read from the entry's {@link QueryDevtoolsEntry.handle} instead.
5802
- */
5803
- type QueryDevtoolsEntryMeta = {
5804
- /** Display name of the owning query client, where known. */
5805
- clientName?: string;
5806
- /** Base URL of the owning query client, where known. */
5807
- clientBaseUrl?: string;
5808
- /** Human readable display name (e.g. an auth provider or web socket client name). */
5809
- name?: string;
5810
- /** The connection URL, for web socket clients. */
5811
- url?: string;
5812
- /** The GraphQL document string, for GraphQL queries. */
5813
- gqlQuery?: string;
5814
- /** Stringified route with path params rendered as `:name`, for queries. */
5815
- route?: string;
5816
- /** The same route, split into its literal and path-param parts. */
5817
- routeParts?: QueryDevtoolsRoutePart[];
5818
- /** Human readable HTTP/GQL method, for queries (e.g. `GET`, `GQL QUERY`). */
5819
- method?: string;
5820
- /** The features applied at creation, with the options each was configured with. */
5821
- features?: QueryDevtoolsFeature[];
5822
- /** Whether the query authenticates through a bearer auth provider, for queries. */
5823
- isSecure?: boolean;
5824
- /** Name of the bearer auth provider a secure query authenticates with. */
5825
- authProviderName?: string;
5826
- /** The provider's own queries, for auth providers. */
5827
- authQueries?: QueryDevtoolsAuthQuery[];
5828
- /**
5829
- * The batch that created a query, for the one query `createQueryBatch` runs per item. The panel folds
5830
- * such queries under their batch's own entry instead of listing a row per item, and the registry caps
5831
- * their tombstones per batch so a bulk run cannot evict everything else it kept.
5832
- */
5833
- batch?: QueryBatchDevtoolsHandle;
5834
- /** Which of the batch's items the query was created for, for a batch's item query. */
5835
- batchItemIndex?: number;
5836
- /** How many of a batch's requests may be in flight at once, for batches. */
5837
- concurrency?: number;
5838
- /** Whether a batch's first failure stops the rest of the run, for batches. */
5839
- stopOnError?: boolean;
5840
- /** The query config passed at creation, for queries. */
5841
- queryConfig?: QueryConfig;
5842
- /** The creator options passed at creation, for queries. */
5843
- creator?: CreateQueryCreatorOptions;
5844
- /** The owning client's repository, where known (queries and auth providers). */
5845
- repository?: QueryRepository;
5846
- /**
5847
- * The owning client itself, where known (queries and auth providers). Read for state that hangs off
5848
- * the client rather than the repository - the multi-tab sync engine, in particular.
5849
- */
5850
- client?: QueryClient;
5851
- /**
5852
- * The DOM element of the component/directive that created a query, when available. Used by the
5853
- * devtools "inspect" tool to map a query back to its place in the live UI.
5854
- */
5855
- element?: HTMLElement | null;
5856
- };
5857
- /**
5858
- * A single entry in the {@link queryDevtoolsEntries} registry. The `handle` is the live object
5859
- * (query, stack, sequence or auth provider) so its signals stay reactive when read by the UI.
5860
- */
5861
- type QueryDevtoolsEntry = {
5862
- id: string;
5863
- kind: QueryDevtoolsEntryKind;
5864
- meta: QueryDevtoolsEntryMeta;
5865
- handle: unknown;
5866
- createdAt: number;
5867
- /**
5868
- * When the query behind this entry was destroyed, or `null`/absent while it is still live. A
5869
- * destroyed entry is kept as a tombstone - a frozen snapshot of what the query last held - so a
5870
- * request that failed on the way out (a `401` that redirects to login and takes its component with
5871
- * it) is still readable by the time the panel is opened. Its `handle` answers with constants and
5872
- * every action on it is inert.
5873
- */
5874
- destroyedAt?: number | null;
5875
- /**
5876
- * What the entry has done since it was created - executions, requests, payload sizes. Present for
5877
- * queries; stacks, sequences and auth providers aggregate the stats of the queries they own instead.
5878
- */
5879
- stats?: QueryDevtoolsStatsHandle;
5880
- /** The query forms this entry's args read, for queries created with a `withArgs` feature. */
5881
- formLinks?: QueryDevtoolsFormLinksHandle;
5882
- /**
5883
- * The response overrides armed on this entry, for queries. Unlike {@link stats}/{@link formLinks} -
5884
- * whose write side is internal instrumentation the panel only ever reads - the panel itself is what
5885
- * arms an override, so this exposes the full recorder rather than a read-only handle.
5886
- */
5887
- overrides?: QueryDevtoolsOverridesRecorder;
5888
- };
5889
- /**
5890
- * What an instrumentation site hands to the registry. Raw values (`route`, `clientRef`) are rendered
5891
- * into {@link QueryDevtoolsEntryMeta} by the registry rather than at the call site, so the code that
5892
- * renders them is only reachable from {@link provideQueryDevtools}.
5909
+ * What an instrumentation site hands to the registry. Raw values (`route`, `clientRef`) are rendered
5910
+ * into {@link QueryDevtoolsEntryMeta} by the registry rather than at the call site, so the code that
5911
+ * renders them is only reachable from {@link provideQueryDevtools}.
5893
5912
  */
5894
5913
  type QueryDevtoolsRegistration = {
5895
5914
  id?: string;
@@ -5999,483 +6018,717 @@ type QueryDevtoolsAuthSeed = {
5999
6018
  };
6000
6019
 
6001
6020
  /**
6002
- * Whether the client that owns a repository is still alive. A destroyed client's queries survive as
6003
- * tombstones, which keep their `meta.repository`, so this is the only way to tell a dead client from
6004
- * one whose queries all happen to be destroyed.
6021
+ * How an application hands its API description to the devtools, so a designed mock can start from the
6022
+ * real shape of a response instead of a guess. TypeScript types are erased at runtime, so a generated
6023
+ * `.d.ts` is not readable from here - the document the types were generated *from* is.
6005
6024
  *
6006
- * Reads a version signal, so a computed that calls it recomputes as clients come and go.
6025
+ * OpenAPI 3.x, Swagger 2 and a bare JSON Schema document all work: named schemas are read from
6026
+ * `components.schemas`, `definitions` or `$defs`, and routes from `paths`.
6007
6027
  *
6008
- * Part of the devtools contract. **Not part of the general public contract.**
6028
+ * The loader is called at most once, and only when the panel first asks for it - so returning a dynamic
6029
+ * `import()` keeps the document out of the application bundle entirely.
6030
+ *
6031
+ * @example
6032
+ * ```ts
6033
+ * provideQueryDevtools({ schema: () => import('../openapi.json') })
6034
+ * provideQueryDevtools({ schema: () => fetch('/openapi.json').then((res) => res.json()) })
6035
+ * ```
6009
6036
  */
6010
- declare const isQueryDevtoolsRepositoryLive: (repository: QueryRepository) => boolean;
6011
-
6037
+ type QueryDevtoolsSchemaLoader = () => Promise<unknown> | unknown;
6012
6038
  /**
6013
- * A response designed in the devtools panel and served in place of a request. An override edits what came
6014
- * back; a mock replaces the request itself, so it can be armed for a route that has never run - or does
6015
- * not exist yet.
6039
+ * The description each query client is served by. One loader describes every client - which is what a
6040
+ * single-API application wants - and a record keyed by client name (the `name` a client was created
6041
+ * with) describes them one API at a time, so a mock designed against one client never offers another
6042
+ * one's routes.
6043
+ *
6044
+ * @example
6045
+ * ```ts
6046
+ * provideQueryDevtools({
6047
+ * schema: {
6048
+ * hubApiClient: () => import('../hub-openapi.json'),
6049
+ * votingApiClient: () => fetch('/voting/openapi.json').then((res) => res.json()),
6050
+ * },
6051
+ * })
6052
+ * ```
6016
6053
  */
6017
- type QueryDevtoolsMock = {
6018
- /** `clientName|method|pattern` - stable across reloads, and what the armed set holds. */
6019
- id: string;
6020
- /** Display name of the query client this is served for. */
6021
- clientName: string;
6054
+ type QueryDevtoolsSchemaLoaders = QueryDevtoolsSchemaLoader | Record<string, QueryDevtoolsSchemaLoader>;
6055
+ /**
6056
+ * Where the API description stands. `unavailable` means the application never handed one in, which is
6057
+ * what the panel shows the seeding controls on.
6058
+ */
6059
+ type QueryDevtoolsSchemaState = {
6060
+ status: 'unavailable';
6061
+ } | {
6062
+ status: 'idle';
6063
+ } | {
6064
+ status: 'loading';
6065
+ } | {
6066
+ status: 'ready';
6067
+ } | {
6068
+ status: 'error';
6069
+ message: string;
6070
+ };
6071
+ /** One route the description declares, whether or not the application has ever called it. */
6072
+ type QueryDevtoolsSchemaRoute = {
6022
6073
  method: string;
6023
- /** The route with its path params as `:name`, matched against a request's path. */
6074
+ /** The route with its path params as `:name`, so it reads the way a mock's pattern does. */
6024
6075
  pattern: string;
6076
+ /** The operation's summary, its `operationId`, or empty - whatever the document offers as a label. */
6077
+ summary: string;
6078
+ };
6079
+ /**
6080
+ * A body generated from the description, plus everything that could not be read off it with certainty.
6081
+ * A seed is a starting point for the designer, never a claim about what the API returns.
6082
+ */
6083
+ type QueryDevtoolsSchemaSeed = {
6084
+ body: unknown;
6085
+ /** The named schema the body was generated from, when the document named one. */
6086
+ schemaName: string | null;
6025
6087
  /**
6026
- * Query parameters the request must carry for this mock to answer it, as a query string
6027
- * (`page=2&limit=10`). Every declared pair has to match; anything else on the request is ignored. Empty
6028
- * matches whatever the request asks for.
6088
+ * The declared type of each field, keyed by its path with array indices as `*` (`items.*.id`) - so one
6089
+ * entry annotates every element of an array, however many the designer goes on to add.
6029
6090
  */
6030
- query: string;
6031
- /** The status the mock responds with. `400` and above arrive as an `HttpErrorResponse`. */
6032
- status: number;
6033
- body: unknown;
6034
- /** Delay before the mocked response settles, so a mocked route still has a loading state. */
6035
- latencyMs: number;
6036
- /** When the body was captured from a real response, or `null` if it was authored from nothing. */
6037
- capturedAt: number | null;
6091
+ types: ReadonlyMap<string, string>;
6092
+ /** What had to be guessed, skipped or cut short, so a seeded body is never mistaken for the contract. */
6093
+ notes: readonly string[];
6094
+ };
6095
+ /**
6096
+ * How lifelike a seeded body is. `placeholder` names every field after itself, so a seed reads as
6097
+ * obviously unreal; `realistic` fills it with varied sample values, so a list is not three identical
6098
+ * rows; `stress` fills it with what a layout breaks on - long unbreakable words, unicode, huge numbers.
6099
+ */
6100
+ type QueryDevtoolsSeedStyle = 'placeholder' | 'realistic' | 'stress';
6101
+ /**
6102
+ * Where the description of one query client's API stands, for the panel's seeding controls.
6103
+ *
6104
+ * Part of the devtools contract. **Not part of the general public contract.**
6105
+ */
6106
+ declare const queryDevtoolsSchemaState: (clientName: string) => QueryDevtoolsSchemaState;
6107
+ /**
6108
+ * Loads the API description, once. Calling it while it is loading or after it has loaded does nothing;
6109
+ * calling it after a failure retries.
6110
+ *
6111
+ * Part of the devtools contract. **Not part of the general public contract.**
6112
+ */
6113
+ declare const loadQueryDevtoolsSchema: (clientName: string) => void;
6114
+ /**
6115
+ * Every schema one client's description names, sorted - the designer's "seed from a type" list.
6116
+ *
6117
+ * Part of the devtools contract. **Not part of the general public contract.**
6118
+ */
6119
+ declare const queryDevtoolsSchemaNames: (clientName: string) => readonly string[];
6120
+ /**
6121
+ * Generates a body from one schema the client's description names (`MatchView`), or `null` when it names
6122
+ * no such thing. The style decides how lifelike its values are; the shape is the same either way.
6123
+ *
6124
+ * Part of the devtools contract. **Not part of the general public contract.**
6125
+ */
6126
+ declare const seedQueryDevtoolsSchemaBody: (clientName: string, name: string, style?: QueryDevtoolsSeedStyle) => QueryDevtoolsSchemaSeed | null;
6127
+ /** Everything a set of named schemas needs to resolve on its own, lifted out of the description. */
6128
+ type QueryDevtoolsSchemaComponents = {
6038
6129
  /**
6039
- * The schema the body was seeded from, when it came from the application's API description - so the
6040
- * designer can label its fields with their declared types again after a reload.
6130
+ * The named schemas plus everything they transitively `$ref`, keyed as `components.schemas` wants
6131
+ * them. A name the description does not declare is simply absent, which is what a caller checks.
6041
6132
  */
6042
- schemaName?: string | null;
6133
+ schemas: Record<string, unknown>;
6134
+ /** Refs that could not be brought along, so an exported document says why it does not resolve. */
6135
+ notes: readonly string[];
6043
6136
  };
6044
- /** The designed mocks, armed or not. Persisted, because losing an hour of authoring is unacceptable. */
6045
- declare const queryDevtoolsMocks: Signal<readonly QueryDevtoolsMock[]>;
6046
6137
  /**
6047
- * The ids currently being served. Not kept across page loads unless the `armedMocks` setting asks for it -
6048
- * an app that silently serves designed data tomorrow morning is worse than losing which mocks were armed.
6138
+ * Collects the named schemas a set of routes was designed against, ready to be handed back as the
6139
+ * `components.schemas` of an exported document - so a route seeded from `MatchView` can reference
6140
+ * `MatchView` instead of an anonymous shape inferred from one body.
6141
+ *
6142
+ * Part of the devtools contract. **Not part of the general public contract.**
6049
6143
  */
6050
- declare const queryDevtoolsArmedMocks: Signal<ReadonlySet<string>>;
6144
+ declare const collectQueryDevtoolsSchemaComponents: (clientName: string, names: readonly string[]) => QueryDevtoolsSchemaComponents;
6051
6145
  /**
6052
- * Whether what is armed right now came back from a previous page load rather than being armed by hand.
6053
- * The panel's armed bar says so, because mocks nobody remembers arming look exactly like a broken API.
6146
+ * Every route one client's description declares, as the designer offers them - including the ones no
6147
+ * query has ever called, which is the case a mock exists for.
6148
+ *
6149
+ * Part of the devtools contract. **Not part of the general public contract.**
6054
6150
  */
6055
- declare const queryDevtoolsArmedMocksRestored: Signal<boolean>;
6151
+ declare const queryDevtoolsSchemaRoutes: (clientName: string) => readonly QueryDevtoolsSchemaRoute[];
6056
6152
  /**
6057
- * The identity of a designed mock: one per client, method, route **and** declared query. The query is part
6058
- * of it so `/posts?page=1` and `/posts?page=2` can hold different bodies.
6153
+ * Generates a body for one route from the description's own success response - the seed that makes a
6154
+ * designed mock a real view model rather than a guess. `null` when the document does not declare the
6155
+ * route, or declares no JSON response for it.
6156
+ *
6157
+ * Part of the devtools contract. **Not part of the general public contract.**
6059
6158
  */
6060
- declare const queryDevtoolsMockId: (parts: Pick<QueryDevtoolsMock, "clientName" | "method" | "pattern"> & {
6061
- query?: string;
6062
- }) => string;
6159
+ declare const seedQueryDevtoolsSchemaRoute: (target: {
6160
+ clientName: string;
6161
+ method: string;
6162
+ pattern: string;
6163
+ }, style?: QueryDevtoolsSeedStyle) => QueryDevtoolsSchemaSeed | null;
6164
+
6063
6165
  /**
6064
- * The path of a request URL relative to the client's `baseUrl` (base path included), without its query
6065
- * string - what a pattern is matched against. A URL outside `baseUrl`, or no `baseUrl` at all, falls
6066
- * back to the path without its origin.
6166
+ * The reactive list of every registered devtools entry, consumed by the `<et-query-devtools>` UI.
6067
6167
  */
6068
- declare const queryDevtoolsRequestPath: (url: string, baseUrl?: string) => string;
6168
+ declare const queryDevtoolsEntries: Signal<QueryDevtoolsEntry[]>;
6169
+ /** Renders parsed route parts as a template, e.g. `/team/:teamId/players`. */
6170
+ declare const stringifyQueryRouteParts: (parts: QueryDevtoolsRoutePart[]) => string;
6171
+ /**
6172
+ * Forgets destroyed entries the registry is holding - the panel's "clear gone" action. Pass the ids to
6173
+ * drop to forget only those; with no argument every tombstone goes. Live entries are untouched.
6174
+ */
6175
+ declare const clearQueryDevtoolsTombstones: (ids?: Iterable<string>) => void;
6176
+ type QueryDevtoolsOptions = {
6177
+ /**
6178
+ * How many of each query's most recent runs keep their response (or error) body, which is what the
6179
+ * panel's response diff compares. Defaults to `5`. Bodies dominate what the run buffer retains, so
6180
+ * raise this only as far as the reach you actually need - a polling query holds one per run.
6181
+ *
6182
+ * This is the default; the panel's Settings tab can raise it for the rest of a page.
6183
+ */
6184
+ responseHistory?: number;
6185
+ /**
6186
+ * Build information about the application - version, commit SHA, environment name. Shown on the
6187
+ * panel's About tab, included in the session export and exposed on `window.ethlete`, so a bug report
6188
+ * says which build it came from. Generate it rather than typing it:
6189
+ * `nx g @ethlete/core:devtools-about <app>`.
6190
+ */
6191
+ about?: QueryDevtoolsAppInfo;
6192
+ /**
6193
+ * The OpenAPI (or JSON Schema) document behind each query client, so the panel's mock designer can
6194
+ * seed a response from the real shape of a route and label each field with the type it is declared as.
6195
+ * One loader describes every client; a record keyed by client name describes an application whose
6196
+ * clients speak to different APIs. Each loader runs at most once, and only when the designer first
6197
+ * asks for it - see {@link QueryDevtoolsSchemaLoaders}.
6198
+ */
6199
+ schema?: QueryDevtoolsSchemaLoaders;
6200
+ /**
6201
+ * The backends this application can be pointed at, one entry per `localStorage` key it reads at
6202
+ * startup. Declaring them puts a picker next to the floating toggle and on the panel's Settings tab;
6203
+ * picking writes the key and reloads. Nothing else changes - the application still resolves the key
6204
+ * itself, so an env is whatever it already means to it.
6205
+ */
6206
+ apiEnvs?: QueryDevtoolsApiEnvSwitch[];
6207
+ /**
6208
+ * The accounts the panel may log in as, so a session can be switched without typing a login form
6209
+ * again. Declare the slot only - the label, the query and the fields it needs. Whoever runs the app
6210
+ * types the credentials into the panel once, and they stay in that browser: **never put a password in
6211
+ * the repository.**
6212
+ *
6213
+ * Scope an account to the backends it exists on with `envs`, for an API whose users are not the next
6214
+ * one's. Accounts are not offered at all while an `apiEnvs` env marked `production` is the pick.
6215
+ */
6216
+ authAccounts?: QueryDevtoolsAuthAccount[];
6217
+ };
6069
6218
  /**
6070
- * Whether a request carries every query parameter a mock declares. Extra parameters are ignored - a mock
6071
- * says what the request must ask for, not everything it may.
6219
+ * Enables the `@ethlete/query` devtools. Add this to your application providers (e.g. in
6220
+ * `bootstrapApplication`) to make query clients, queries, stacks, sequences and auth providers
6221
+ * appear in the `<et-query-devtools>` panel.
6222
+ *
6223
+ * When omitted, all devtools instrumentation is a no-op: the registry is never installed, so nothing
6224
+ * is retained at runtime and the registry itself is dropped from the bundle.
6225
+ *
6226
+ * The options are read once, on the first call. A second application on the same page keeps the
6227
+ * options of the first one, and this call warns about the ones it declared itself.
6228
+ *
6229
+ * @example
6230
+ * ```ts
6231
+ * bootstrapApplication(AppComponent, {
6232
+ * providers: [provideQueryDevtools()],
6233
+ * });
6234
+ * ```
6072
6235
  */
6073
- declare const matchesQueryDevtoolsMockQuery: (declared: string, url: string) => boolean;
6236
+ declare const provideQueryDevtools: (options?: QueryDevtoolsOptions) => EnvironmentProviders;
6237
+
6074
6238
  /**
6075
- * Whether a request path is the route a pattern describes. A `:param` segment matches any single
6076
- * non-empty segment, which is the whole point: a mock is armed for a route, not for the one URL a query
6077
- * happened to build.
6239
+ * The longest lifetime an armed override may claim, in seconds (7 days). Anything beyond it is never
6240
+ * refreshed at all, which is what arming nothing already does.
6078
6241
  */
6079
- declare const matchesQueryDevtoolsMockPattern: (pattern: string, path: string) => boolean;
6242
+ declare const QUERY_DEVTOOLS_TOKEN_TTL_LIMIT = 604800;
6080
6243
  /**
6081
- * Adds a designed mock, or replaces the one already under its id. Arming is untouched: re-designing a
6082
- * body while it is being served changes what the next request gets.
6244
+ * The access-token lifetime armed per auth provider name, in seconds, consumed by the
6245
+ * `<et-query-devtools>` panel. A provider on its token's real lifetime is absent rather than present
6246
+ * with it.
6083
6247
  */
6084
- declare const saveQueryDevtoolsMock: (mock: QueryDevtoolsMock) => void;
6085
- /** Removes a designed mock, disarming it on the way out. */
6086
- declare const deleteQueryDevtoolsMock: (id: string) => void;
6087
- /** Starts or stops serving one designed mock. Arming a mock that is not in the library does nothing. */
6088
- declare const armQueryDevtoolsMock: (id: string, isArmed: boolean) => void;
6089
- /** Starts serving every mock in the library - the counterpart of {@link clearQueryDevtoolsArmedMocks}. */
6090
- declare const armAllQueryDevtoolsMocks: () => void;
6091
- /** Stops serving every mock, leaving the library alone - the armed bar's one-click way out. */
6092
- declare const clearQueryDevtoolsArmedMocks: () => void;
6248
+ declare const queryDevtoolsTokenTtls: Signal<Record<string, number>>;
6093
6249
  /**
6094
- * Where the armed set is kept. Switching to a scope that keeps it stores whatever is armed right now, so
6095
- * the choice reads as "keep these"; switching to `none` empties the store and leaves this page serving
6096
- * exactly what it was already serving.
6250
+ * Whether an overridden lifetime can be applied to a decoded access token at all. It needs the claim
6251
+ * carrying the expiry - so a lifetime is never invented for a token that declares none - plus `iat` or
6252
+ * `nbf` to measure the new lifetime from.
6097
6253
  */
6098
- declare const setQueryDevtoolsArmedMocksScope: (next: QueryDevtoolsStorageScope) => void;
6099
- /** Empties the designed library and disarms everything - the panel's "Reset devtools". */
6100
- declare const clearQueryDevtoolsMockStore: () => void;
6101
-
6102
- /** One entry id the last page load left ops for, as the panel's banner reports it. */
6103
- type RestoredQueryDevtoolsOverrides = {
6104
- /** The devtools entry id the ops were stored under. */
6105
- id: string;
6106
- /** How many ops were stored for it. */
6107
- count: number;
6108
- /**
6109
- * Whether a query with this id has registered and taken them. `false` means the store outlived the
6110
- * query it was written for - a route that no longer runs, or a creation order that shifted - so those
6111
- * ops are sitting on nothing rather than quietly landing somewhere else.
6112
- */
6113
- armed: boolean;
6114
- };
6254
+ declare const canOverrideQueryDevtoolsTokenTtl: (options: {
6255
+ payload: Record<string, unknown> | null;
6256
+ expiresInPropertyName?: string;
6257
+ }) => boolean;
6115
6258
  /**
6116
- * Whether armed response overrides are stored and replayed on the next page load - that is, whether
6117
- * their scope is anything other than `none`. Off by default.
6259
+ * Presents one auth provider's access token as living `seconds` from the moment it was issued, rather
6260
+ * than as long as it says it does. Everything that reads the expiry sees the shortened lifetime - the
6261
+ * proactive refresh schedule, `withBearerAuthTokenExpirationWarning`, and the panel's own countdown -
6262
+ * so arming 60 seconds makes a real refresh happen a minute after each token is issued, and keeps
6263
+ * happening for every token that refresh brings back.
6264
+ *
6265
+ * It is a lifetime, not a remaining time: `0` presents the current token as long expired, which is what
6266
+ * makes a refresh happen at once. Nothing is persisted, so a reload leaves every provider on its real
6267
+ * lifetime.
6268
+ *
6269
+ * Part of the devtools contract consumed by `<et-query-devtools>`; a token's lifetime is not something
6270
+ * an application should override on itself.
6118
6271
  */
6119
- declare const queryDevtoolsOverridePersistence: Signal<boolean>;
6272
+ declare const setQueryDevtoolsTokenTtl: (options: {
6273
+ providerName: string;
6274
+ seconds: number;
6275
+ }) => void;
6120
6276
  /**
6121
- * Where armed response overrides are kept. Switching to a scope that keeps them captures whatever is
6122
- * armed right now, so the choice reads as "keep these" rather than "keep the next ones"; switching
6123
- * between `session` and `local` moves the store; switching to `none` empties it and leaves every armed
6124
- * op exactly where it is for the rest of this page.
6277
+ * Puts one provider back on its token's real lifetime, or every provider when no name is given.
6278
+ *
6279
+ * @see setQueryDevtoolsTokenTtl
6125
6280
  */
6126
- declare const setQueryDevtoolsOverridesScope: (next: QueryDevtoolsStorageScope) => void;
6281
+ declare const clearQueryDevtoolsTokenTtl: (providerName?: string) => void;
6127
6282
  /**
6128
- * Turns persistence on or off - the panel's "Keep across reloads" toggle. On restores the last scope
6129
- * that kept them (`session` unless Settings picked `local`).
6283
+ * The decoded access token as the devtools want it seen: the claim carrying the expiry rewritten to the
6284
+ * armed lifetime, measured from `iat`. Returns `payload` untouched when nothing is armed for the
6285
+ * provider, or when the token cannot carry the override - see {@link canOverrideQueryDevtoolsTokenTtl}.
6286
+ *
6287
+ * Installed as the token payload patcher by `provideQueryDevtools()`, and called directly by the panel
6288
+ * for its own countdown.
6130
6289
  */
6131
- declare const setQueryDevtoolsOverridePersistence: (value: boolean) => void;
6290
+ declare const applyQueryDevtoolsTokenTtl: <T>(options: {
6291
+ payload: T;
6292
+ providerName: string;
6293
+ expiresInPropertyName?: string;
6294
+ }) => T;
6295
+
6132
6296
  /**
6133
- * Empties the override store in both browser stores and disarms everything a reload brought back,
6134
- * without changing where overrides are kept - the panel's "Reset devtools".
6297
+ * Whether a devtools UI is on the page, which is what the floating pills follow. Kept apart from the
6298
+ * pills themselves so `@ethlete/query-devtools/toggle` can declare itself without pulling the pill
6299
+ * renderer into the bundle an application ships.
6135
6300
  */
6136
- declare const clearQueryDevtoolsOverrideStore: () => void;
6137
6301
  /**
6138
- * The ops this page load inherited from the previous one, and for each id whether a live query has taken
6139
- * it. Overrides that outlive the page that armed them have to announce themselves, because an app being
6140
- * lied to looks exactly like an app that is broken.
6302
+ * Declares a devtools UI on the page, and takes the declaration back when it goes. The floating pills
6303
+ * paint only while one is mounted, so an application that renders no devtools trigger shows no pills
6304
+ * either.
6305
+ *
6306
+ * Part of the devtools contract. **Not part of the general public contract.**
6141
6307
  */
6142
- declare const restoredQueryDevtoolsOverrides: Signal<readonly RestoredQueryDevtoolsOverrides[]>;
6308
+ declare const setQueryDevtoolsUiMounted: (isMounted: boolean) => void;
6309
+
6143
6310
  /**
6144
- * The scope those ops came back from, or `null` when this page inherited none. `local` is the one worth
6145
- * naming in the banner: it means they outlived closing the tab, not just a reload.
6311
+ * Where one kind of devtools state is kept between page loads. `none` means it is not kept at all -
6312
+ * what that costs differs per kind, which is why every kind picks its own.
6146
6313
  */
6147
- declare const queryDevtoolsRestoredOverridesScope: Signal<QueryDevtoolsStorageScope | null>;
6148
- /** Disarms every op this page load inherited and empties the store - the banner's one-click way out. */
6149
- declare const clearRestoredQueryDevtoolsOverrides: () => void;
6150
-
6151
- declare const TRANSFER_KIND = "ethlete-query-overrides";
6314
+ type QueryDevtoolsStorageScope = 'none' | 'session' | 'local';
6152
6315
  /**
6153
- * A whole armed override set, as the devtools panel writes it to the clipboard: pretty-printed JSON so
6154
- * it can be pasted onto another query, into a ticket, or hand-edited on the way. `source` is only ever
6155
- * a human's bearing on where it came from - a paste never resolves against it.
6316
+ * The devtools' own configuration: where each kind of panel state is kept, and the limits the panel
6317
+ * would otherwise hold as constants. Read it as {@link queryDevtoolsSettings}, change it with
6318
+ * {@link setQueryDevtoolsSettings}.
6156
6319
  */
6157
- type QueryDevtoolsOverrideTransfer = {
6158
- kind: typeof TRANSFER_KIND;
6159
- version: number;
6160
- source?: {
6161
- id?: string;
6162
- url?: string;
6163
- };
6164
- ops: OverrideOp[];
6165
- };
6166
- /** What {@link parseQueryDevtoolsOverrideTransfer} makes of a piece of clipboard text. */
6167
- type QueryDevtoolsOverrideTransferParse = {
6168
- ok: true;
6169
- ops: OverrideOp[];
6170
- /** Ops the payload held that this build has no `type` for - a newer panel wrote them. */
6171
- skipped: number;
6172
- source?: {
6173
- id?: string;
6174
- url?: string;
6175
- };
6176
- } | {
6177
- ok: false;
6178
- reason: string;
6320
+ type QueryDevtoolsSettings = {
6321
+ /** Panel chrome and view state: dock, sizes, open tab, filters, selections. */
6322
+ viewState: QueryDevtoolsStorageScope;
6323
+ /** The entry ids sorted to the top of the Queries list. */
6324
+ pins: QueryDevtoolsStorageScope;
6325
+ /**
6326
+ * Armed response overrides, replayed as queries register on the next load. `none` by default: an app
6327
+ * that stays tampered with across reloads is hours of debugging the wrong thing.
6328
+ */
6329
+ overrides: QueryDevtoolsStorageScope;
6330
+ /** The library of designed mocks - the authoring, not whether any of them is armed. */
6331
+ mocks: QueryDevtoolsStorageScope;
6332
+ /**
6333
+ * Which mocks are **armed**, as opposed to the library above. `none` by default: an app that silently
6334
+ * serves designed data tomorrow morning is worse than arming them again, so keeping them is a choice
6335
+ * someone makes rather than the way the panel ships.
6336
+ */
6337
+ armedMocks: QueryDevtoolsStorageScope;
6338
+ /** The faults armed per client, for the same reason and with the same default. */
6339
+ armedFaults: QueryDevtoolsStorageScope;
6340
+ /**
6341
+ * The session vault: the token pairs the panel switches between, and the credentials it logs in with.
6342
+ * `local` by default, because a vault that forgets the other user on every reload is not one - and
6343
+ * `none` for a machine where nothing of the sort may be kept. Outside a development build `local` is
6344
+ * refused and read back as `none`, see {@link queryDevtoolsAllowsLocalAuthSessions}.
6345
+ */
6346
+ authSessions: QueryDevtoolsStorageScope;
6347
+ /** How many entries the Events log keeps. */
6348
+ maxEvents: number;
6349
+ /** How many dropped cache entries the Cache tab remembers, per client. */
6350
+ maxDroppedCacheEntries: number;
6351
+ /**
6352
+ * How many bodies each query retains, overriding `provideQueryDevtools({ responseHistory })` for the
6353
+ * rest of this page. `null` leaves the application's value alone.
6354
+ */
6355
+ responseHistory: number | null;
6356
+ /**
6357
+ * Whether switching to another session reloads the page. On by default: a switch replaces what the
6358
+ * query layer holds, and an application that keeps the user anywhere else - a profile service, the
6359
+ * router, an open form - is still showing the last one until it boots again.
6360
+ */
6361
+ reloadOnAuthSwitch: boolean;
6179
6362
  };
6180
6363
  /**
6181
- * Serializes the ops armed on one query into clipboard text. `reset` never reaches a recorder's list, so
6182
- * what comes out is exactly what a paste can put back.
6364
+ * How the devtools are configured. Every consumer reads the live value rather than a copy, so a change
6365
+ * in the panel's Settings takes effect without a reload.
6366
+ *
6367
+ * Part of the devtools contract. **Not part of the general public contract.**
6183
6368
  */
6184
- declare const serializeQueryDevtoolsOverrideTransfer: (entries: readonly QueryDevtoolsOverrideEntry[], source?: {
6185
- id?: string;
6186
- url?: string;
6187
- }) => string;
6369
+ declare const queryDevtoolsSettings: Signal<QueryDevtoolsSettings>;
6188
6370
  /**
6189
- * Reads clipboard text back into ops. A bare array of ops is accepted alongside the full envelope, so a
6190
- * set pasted out of a ticket and trimmed by hand still lands; an op whose `type` this build doesn't know
6191
- * is counted in `skipped` rather than failing the whole paste, so an older panel can take a newer one's
6192
- * set minus the parts it cannot replay.
6371
+ * The `Storage` a scope names, or `null` for `none` and for a browser that refuses one (private mode,
6372
+ * storage disabled, server-side rendering). Callers treat "no storage" and "not persisted" alike.
6373
+ *
6374
+ * Part of the devtools contract. **Not part of the general public contract.**
6193
6375
  */
6194
- declare const parseQueryDevtoolsOverrideTransfer: (text: string) => QueryDevtoolsOverrideTransferParse;
6376
+ declare const queryDevtoolsStorage: (scope: QueryDevtoolsStorageScope) => Storage | null;
6195
6377
  /**
6196
- * How many of `ops` would not resolve against `raw` - what a paste onto a differently-shaped query
6197
- * reports, so ops sitting on nothing say so instead of looking armed. Replays them the same way the
6198
- * pipeline will, since an earlier op can be what makes a later one's path exist.
6378
+ * Reads one JSON-encoded devtools key from the store a scope names, or `null`.
6379
+ *
6380
+ * Part of the devtools contract. **Not part of the general public contract.**
6199
6381
  */
6200
- declare const countUnresolvedQueryDevtoolsOverrides: (ops: readonly OverrideOp[], raw: unknown) => number;
6201
- /** Arms every op of a parsed set onto a query, on top of whatever it already has armed. */
6202
- declare const armQueryDevtoolsOverrideTransfer: (recorder: QueryDevtoolsOverridesRecorder, ops: readonly OverrideOp[]) => void;
6203
-
6382
+ declare const readQueryDevtoolsStore: <T>(scope: QueryDevtoolsStorageScope, key: string) => T | null;
6204
6383
  /**
6205
- * How an application hands its API description to the devtools, so a designed mock can start from the
6206
- * real shape of a response instead of a guess. TypeScript types are erased at runtime, so a generated
6207
- * `.d.ts` is not readable from here - the document the types were generated *from* is.
6208
- *
6209
- * OpenAPI 3.x, Swagger 2 and a bare JSON Schema document all work: named schemas are read from
6210
- * `components.schemas`, `definitions` or `$defs`, and routes from `paths`.
6384
+ * Writes one devtools key into the store a scope names. A scope of `none` writes nothing.
6211
6385
  *
6212
- * The loader is called at most once, and only when the panel first asks for it - so returning a dynamic
6213
- * `import()` keeps the document out of the application bundle entirely.
6386
+ * Part of the devtools contract. **Not part of the general public contract.**
6387
+ */
6388
+ declare const writeQueryDevtoolsStore: (scope: QueryDevtoolsStorageScope, key: string, value: unknown) => void;
6389
+ /**
6390
+ * Removes one devtools key from **both** stores, whatever the scope currently is - so a scope that
6391
+ * changed cannot leave a stale copy behind for the next load to read.
6214
6392
  *
6215
- * @example
6216
- * ```ts
6217
- * provideQueryDevtools({ schema: () => import('../openapi.json') })
6218
- * provideQueryDevtools({ schema: () => fetch('/openapi.json').then((res) => res.json()) })
6219
- * ```
6393
+ * Part of the devtools contract. **Not part of the general public contract.**
6220
6394
  */
6221
- type QueryDevtoolsSchemaLoader = () => Promise<unknown> | unknown;
6395
+ declare const clearQueryDevtoolsStore: (key: string) => void;
6222
6396
  /**
6223
- * The description each query client is served by. One loader describes every client - which is what a
6224
- * single-API application wants - and a record keyed by client name (the `name` a client was created
6225
- * with) describes them one API at a time, so a mock designed against one client never offers another
6226
- * one's routes.
6397
+ * Whether the session vault may be kept in `localStorage`. Only a development build may: the vault
6398
+ * holds live access and refresh tokens plus the credentials somebody typed in, and a deployed
6399
+ * application that mounts the panel for its debugging value must not leave those on the machine of
6400
+ * whoever opened it. Outside a development build a stored or default `local` reads back as `none`, so a
6401
+ * plain login keeps nothing; `session` stays on offer for whoever picks it in Settings.
6227
6402
  *
6228
- * @example
6229
- * ```ts
6230
- * provideQueryDevtools({
6231
- * schema: {
6232
- * hubApiClient: () => import('../hub-openapi.json'),
6233
- * votingApiClient: () => fetch('/voting/openapi.json').then((res) => res.json()),
6234
- * },
6235
- * })
6236
- * ```
6403
+ * Part of the devtools contract. **Not part of the general public contract.**
6237
6404
  */
6238
- type QueryDevtoolsSchemaLoaders = QueryDevtoolsSchemaLoader | Record<string, QueryDevtoolsSchemaLoader>;
6405
+ declare const queryDevtoolsAllowsLocalAuthSessions: () => boolean;
6239
6406
  /**
6240
- * Where the API description stands. `unavailable` means the application never handed one in, which is
6241
- * what the panel shows the seeding controls on.
6407
+ * Changes part of the devtools configuration and stores it. Values outside the range a field allows are
6408
+ * clamped rather than rejected.
6409
+ *
6410
+ * Overrides are the one field not to set here: their scope moves an existing store, so it goes through
6411
+ * `setQueryDevtoolsOverridesScope()` instead.
6412
+ *
6413
+ * Part of the devtools contract. **Not part of the general public contract.**
6242
6414
  */
6243
- type QueryDevtoolsSchemaState = {
6244
- status: 'unavailable';
6245
- } | {
6246
- status: 'idle';
6247
- } | {
6248
- status: 'loading';
6249
- } | {
6250
- status: 'ready';
6251
- } | {
6252
- status: 'error';
6253
- message: string;
6254
- };
6255
- /** One route the description declares, whether or not the application has ever called it. */
6256
- type QueryDevtoolsSchemaRoute = {
6257
- method: string;
6258
- /** The route with its path params as `:name`, so it reads the way a mock's pattern does. */
6259
- pattern: string;
6260
- /** The operation's summary, its `operationId`, or empty - whatever the document offers as a label. */
6261
- summary: string;
6262
- };
6415
+ declare const setQueryDevtoolsSettings: (patch: Partial<QueryDevtoolsSettings>) => void;
6416
+
6263
6417
  /**
6264
- * A body generated from the description, plus everything that could not be read off it with certainty.
6265
- * A seed is a starting point for the designer, never a claim about what the API returns.
6418
+ * A fault armed on one query client from the devtools panel. Unlike the panel's forced states - which
6419
+ * write a query's signals directly - an armed fault is applied inside the request pipeline, so retries,
6420
+ * error handling features and the cache all see it exactly as they would see a real one.
6266
6421
  */
6267
- type QueryDevtoolsSchemaSeed = {
6268
- body: unknown;
6269
- /** The named schema the body was generated from, when the document named one. */
6270
- schemaName: string | null;
6422
+ type QueryDevtoolsFault = {
6423
+ /** Extra latency in ms added before every attempt starts. `0` disables it. */
6424
+ latencyMs: number;
6271
6425
  /**
6272
- * The declared type of each field, keyed by its path with array indices as `*` (`items.*.id`) - so one
6273
- * entry annotates every element of an array, however many the designer goes on to add.
6426
+ * How many upcoming attempts fail before the client is let through again, counted down as they are
6427
+ * consumed. `0` disables it.
6274
6428
  */
6275
- types: ReadonlyMap<string, string>;
6276
- /** What had to be guessed, skipped or cut short, so a seeded body is never mistaken for the contract. */
6277
- notes: readonly string[];
6429
+ failNext: number;
6430
+ /** The percentage of attempts that fail, rolled per attempt. `0` disables it, `100` fails everything. */
6431
+ failRate: number;
6432
+ /** The status an injected failure responds with. */
6433
+ status: number;
6278
6434
  };
6435
+ /** The neutral fault: nothing armed. */
6436
+ declare const EMPTY_QUERY_DEVTOOLS_FAULT: QueryDevtoolsFault;
6279
6437
  /**
6280
- * How lifelike a seeded body is. `placeholder` names every field after itself, so a seed reads as
6281
- * obviously unreal; `realistic` fills it with varied sample values, so a list is not three identical
6282
- * rows; `stress` fills it with what a layout breaks on - long unbreakable words, unicode, huge numbers.
6438
+ * Statuses worth injecting, and whether the SDK's default retry policy retries them. A picker built from
6439
+ * this cannot arm a 500 and then leave you wondering why no retry fired.
6440
+ * @see runDefaultQueryRetry
6283
6441
  */
6284
- type QueryDevtoolsSeedStyle = 'placeholder' | 'realistic' | 'stress';
6442
+ declare const QUERY_DEVTOOLS_FAULT_STATUSES: {
6443
+ status: number;
6444
+ label: string;
6445
+ retryable: boolean;
6446
+ }[];
6285
6447
  /**
6286
- * Where the description of one query client's API stands, for the panel's seeding controls.
6287
- *
6288
- * Part of the devtools contract. **Not part of the general public contract.**
6448
+ * The faults armed per client name, consumed by the `<et-query-devtools>` UI. Clients with nothing armed
6449
+ * are absent rather than present with an {@link EMPTY_QUERY_DEVTOOLS_FAULT}.
6289
6450
  */
6290
- declare const queryDevtoolsSchemaState: (clientName: string) => QueryDevtoolsSchemaState;
6451
+ declare const queryDevtoolsFaults: Signal<Record<string, QueryDevtoolsFault>>;
6291
6452
  /**
6292
- * Loads the API description, once. Calling it while it is loading or after it has loaded does nothing;
6293
- * calling it after a failure retries.
6453
+ * Whether what is armed right now came back from a previous page load rather than being armed by hand.
6454
+ * The panel's armed bar says so, because injected failures nobody remembers arming look exactly like a
6455
+ * broken API.
6456
+ */
6457
+ declare const queryDevtoolsFaultsRestored: Signal<boolean>;
6458
+ /**
6459
+ * Where the armed faults are kept. Switching to a scope that keeps them stores whatever is armed right
6460
+ * now; switching to `none` empties the store and leaves this page's faults exactly where they are.
6461
+ */
6462
+ declare const setQueryDevtoolsFaultsScope: (next: QueryDevtoolsStorageScope) => void;
6463
+ /** Whether anything at all is armed on a fault. */
6464
+ declare const isQueryDevtoolsFaultArmed: (fault: QueryDevtoolsFault) => boolean;
6465
+ /**
6466
+ * Arms (or updates) the fault of one client. Only the given fields change; the rest keep their current
6467
+ * value. A client whose resulting fault has nothing armed is dropped from {@link queryDevtoolsFaults}.
6294
6468
  *
6295
- * Part of the devtools contract. **Not part of the general public contract.**
6469
+ * Part of the devtools contract consumed by `<et-query-devtools>`; a fault is a debugging tool, not
6470
+ * something an application should arm on itself.
6296
6471
  */
6297
- declare const loadQueryDevtoolsSchema: (clientName: string) => void;
6472
+ declare const setQueryDevtoolsFault: (options: {
6473
+ clientName: string;
6474
+ patch: Partial<QueryDevtoolsFault>;
6475
+ }) => void;
6298
6476
  /**
6299
- * Every schema one client's description names, sorted - the designer's "seed from a type" list.
6477
+ * Disarms every fault of one client, or of all clients when no name is given.
6300
6478
  *
6301
- * Part of the devtools contract. **Not part of the general public contract.**
6479
+ * @see setQueryDevtoolsFault
6302
6480
  */
6303
- declare const queryDevtoolsSchemaNames: (clientName: string) => readonly string[];
6481
+ declare const clearQueryDevtoolsFaults: (clientName?: string) => void;
6482
+
6304
6483
  /**
6305
- * Generates a body from one schema the client's description names (`MatchView`), or `null` when it names
6306
- * no such thing. The style decides how lifelike its values are; the shape is the same either way.
6484
+ * One field of a query form, as the devtools panel reads it: what it holds, what it puts in the URL,
6485
+ * and the rules that decide when either changes.
6486
+ */
6487
+ type QueryDevtoolsFormField = {
6488
+ key: string;
6489
+ /** The query-param key the field serializes to, with the form's prefix applied. */
6490
+ paramKey: string;
6491
+ /** The committed value - what the query args are built from. */
6492
+ value: unknown;
6493
+ /** The live value of the bound control, which differs from {@link value} while a debounce is pending. */
6494
+ liveValue: unknown;
6495
+ defaultValue: unknown;
6496
+ /** Whether the committed value is the default one. */
6497
+ isDefault: boolean;
6498
+ /** What the field writes to the URL, or `undefined` when it writes nothing. */
6499
+ queryParam: unknown;
6500
+ /** How long a change waits before it is committed, or `null` when it commits immediately. */
6501
+ debounceMs: number | null;
6502
+ /** The sibling fields whose change resets this one back to its default. */
6503
+ isResetBy: readonly string[];
6504
+ /** Whether the field counts towards {@link QueryDevtoolsFormHandle.activeFilterCount}. */
6505
+ countsAsFilter: boolean;
6506
+ };
6507
+ /**
6508
+ * The live state of a query form, as `<et-query-devtools>` renders it. Part of the devtools contract -
6509
+ * not a general-purpose query-form API.
6510
+ */
6511
+ type QueryDevtoolsFormHandle = {
6512
+ fields: Signal<QueryDevtoolsFormField[]>;
6513
+ /** The committed value of the whole form. */
6514
+ value: Signal<Record<string, unknown>>;
6515
+ /** The value of every field before the most recent commit, or `null` before the first one. */
6516
+ previousValue: Signal<Record<string, unknown> | null>;
6517
+ defaultValue: Record<string, unknown>;
6518
+ /** @see QueryFormSignals.activeFilterCount */
6519
+ activeFilterCount: Signal<number>;
6520
+ /** Whether every field sits at its default. */
6521
+ isAtDefaults: Signal<boolean>;
6522
+ /** Whether a change is waiting out its debounce, so the committed value is one edit behind. */
6523
+ isCommitPending: Signal<boolean>;
6524
+ /** Whether the form is syncing with the URL, i.e. whether `observe()` has been called. */
6525
+ isObserving: Signal<boolean>;
6526
+ resetField: (key: string) => void;
6527
+ resetAll: () => void;
6528
+ };
6529
+
6530
+ /**
6531
+ * Whether the client that owns a repository is still alive. A destroyed client's queries survive as
6532
+ * tombstones, which keep their `meta.repository`, so this is the only way to tell a dead client from
6533
+ * one whose queries all happen to be destroyed.
6534
+ *
6535
+ * Reads a version signal, so a computed that calls it recomputes as clients come and go.
6307
6536
  *
6308
6537
  * Part of the devtools contract. **Not part of the general public contract.**
6309
6538
  */
6310
- declare const seedQueryDevtoolsSchemaBody: (clientName: string, name: string, style?: QueryDevtoolsSeedStyle) => QueryDevtoolsSchemaSeed | null;
6311
- /** Everything a set of named schemas needs to resolve on its own, lifted out of the description. */
6312
- type QueryDevtoolsSchemaComponents = {
6539
+ declare const isQueryDevtoolsRepositoryLive: (repository: QueryRepository) => boolean;
6540
+
6541
+ /**
6542
+ * A response designed in the devtools panel and served in place of a request. An override edits what came
6543
+ * back; a mock replaces the request itself, so it can be armed for a route that has never run - or does
6544
+ * not exist yet.
6545
+ */
6546
+ type QueryDevtoolsMock = {
6547
+ /** `clientName|method|pattern` - stable across reloads, and what the armed set holds. */
6548
+ id: string;
6549
+ /** Display name of the query client this is served for. */
6550
+ clientName: string;
6551
+ method: string;
6552
+ /** The route with its path params as `:name`, matched against a request's path. */
6553
+ pattern: string;
6313
6554
  /**
6314
- * The named schemas plus everything they transitively `$ref`, keyed as `components.schemas` wants
6315
- * them. A name the description does not declare is simply absent, which is what a caller checks.
6555
+ * Query parameters the request must carry for this mock to answer it, as a query string
6556
+ * (`page=2&limit=10`). Every declared pair has to match; anything else on the request is ignored. Empty
6557
+ * matches whatever the request asks for.
6316
6558
  */
6317
- schemas: Record<string, unknown>;
6318
- /** Refs that could not be brought along, so an exported document says why it does not resolve. */
6319
- notes: readonly string[];
6559
+ query: string;
6560
+ /** The status the mock responds with. `400` and above arrive as an `HttpErrorResponse`. */
6561
+ status: number;
6562
+ body: unknown;
6563
+ /** Delay before the mocked response settles, so a mocked route still has a loading state. */
6564
+ latencyMs: number;
6565
+ /** When the body was captured from a real response, or `null` if it was authored from nothing. */
6566
+ capturedAt: number | null;
6567
+ /**
6568
+ * The schema the body was seeded from, when it came from the application's API description - so the
6569
+ * designer can label its fields with their declared types again after a reload.
6570
+ */
6571
+ schemaName?: string | null;
6320
6572
  };
6573
+ /** The designed mocks, armed or not. Persisted, because losing an hour of authoring is unacceptable. */
6574
+ declare const queryDevtoolsMocks: Signal<readonly QueryDevtoolsMock[]>;
6321
6575
  /**
6322
- * Collects the named schemas a set of routes was designed against, ready to be handed back as the
6323
- * `components.schemas` of an exported document - so a route seeded from `MatchView` can reference
6324
- * `MatchView` instead of an anonymous shape inferred from one body.
6325
- *
6326
- * Part of the devtools contract. **Not part of the general public contract.**
6576
+ * The ids currently being served. Not kept across page loads unless the `armedMocks` setting asks for it -
6577
+ * an app that silently serves designed data tomorrow morning is worse than losing which mocks were armed.
6578
+ */
6579
+ declare const queryDevtoolsArmedMocks: Signal<ReadonlySet<string>>;
6580
+ /**
6581
+ * Whether what is armed right now came back from a previous page load rather than being armed by hand.
6582
+ * The panel's armed bar says so, because mocks nobody remembers arming look exactly like a broken API.
6583
+ */
6584
+ declare const queryDevtoolsArmedMocksRestored: Signal<boolean>;
6585
+ /**
6586
+ * The identity of a designed mock: one per client, method, route **and** declared query. The query is part
6587
+ * of it so `/posts?page=1` and `/posts?page=2` can hold different bodies.
6588
+ */
6589
+ declare const queryDevtoolsMockId: (parts: Pick<QueryDevtoolsMock, "clientName" | "method" | "pattern"> & {
6590
+ query?: string;
6591
+ }) => string;
6592
+ /**
6593
+ * The path of a request URL relative to the client's `baseUrl` (base path included), without its query
6594
+ * string - what a pattern is matched against. A URL outside `baseUrl`, or no `baseUrl` at all, falls
6595
+ * back to the path without its origin.
6327
6596
  */
6328
- declare const collectQueryDevtoolsSchemaComponents: (clientName: string, names: readonly string[]) => QueryDevtoolsSchemaComponents;
6597
+ declare const queryDevtoolsRequestPath: (url: string, baseUrl?: string) => string;
6329
6598
  /**
6330
- * Every route one client's description declares, as the designer offers them - including the ones no
6331
- * query has ever called, which is the case a mock exists for.
6332
- *
6333
- * Part of the devtools contract. **Not part of the general public contract.**
6599
+ * Whether a request carries every query parameter a mock declares. Extra parameters are ignored - a mock
6600
+ * says what the request must ask for, not everything it may.
6334
6601
  */
6335
- declare const queryDevtoolsSchemaRoutes: (clientName: string) => readonly QueryDevtoolsSchemaRoute[];
6602
+ declare const matchesQueryDevtoolsMockQuery: (declared: string, url: string) => boolean;
6336
6603
  /**
6337
- * Generates a body for one route from the description's own success response - the seed that makes a
6338
- * designed mock a real view model rather than a guess. `null` when the document does not declare the
6339
- * route, or declares no JSON response for it.
6340
- *
6341
- * Part of the devtools contract. **Not part of the general public contract.**
6604
+ * Whether a request path is the route a pattern describes. A `:param` segment matches any single
6605
+ * non-empty segment, which is the whole point: a mock is armed for a route, not for the one URL a query
6606
+ * happened to build.
6342
6607
  */
6343
- declare const seedQueryDevtoolsSchemaRoute: (target: {
6344
- clientName: string;
6345
- method: string;
6346
- pattern: string;
6347
- }, style?: QueryDevtoolsSeedStyle) => QueryDevtoolsSchemaSeed | null;
6348
-
6608
+ declare const matchesQueryDevtoolsMockPattern: (pattern: string, path: string) => boolean;
6349
6609
  /**
6350
- * The reactive list of every registered devtools entry, consumed by the `<et-query-devtools>` UI.
6610
+ * Adds a designed mock, or replaces the one already under its id. Arming is untouched: re-designing a
6611
+ * body while it is being served changes what the next request gets.
6351
6612
  */
6352
- declare const queryDevtoolsEntries: Signal<QueryDevtoolsEntry[]>;
6353
- /** Renders parsed route parts as a template, e.g. `/team/:teamId/players`. */
6354
- declare const stringifyQueryRouteParts: (parts: QueryDevtoolsRoutePart[]) => string;
6613
+ declare const saveQueryDevtoolsMock: (mock: QueryDevtoolsMock) => void;
6614
+ /** Removes a designed mock, disarming it on the way out. */
6615
+ declare const deleteQueryDevtoolsMock: (id: string) => void;
6616
+ /** Starts or stops serving one designed mock. Arming a mock that is not in the library does nothing. */
6617
+ declare const armQueryDevtoolsMock: (id: string, isArmed: boolean) => void;
6618
+ /** Starts serving every mock in the library - the counterpart of {@link clearQueryDevtoolsArmedMocks}. */
6619
+ declare const armAllQueryDevtoolsMocks: () => void;
6620
+ /** Stops serving every mock, leaving the library alone - the armed bar's one-click way out. */
6621
+ declare const clearQueryDevtoolsArmedMocks: () => void;
6355
6622
  /**
6356
- * Forgets destroyed entries the registry is holding - the panel's "clear gone" action. Pass the ids to
6357
- * drop to forget only those; with no argument every tombstone goes. Live entries are untouched.
6623
+ * Where the armed set is kept. Switching to a scope that keeps it stores whatever is armed right now, so
6624
+ * the choice reads as "keep these"; switching to `none` empties the store and leaves this page serving
6625
+ * exactly what it was already serving.
6358
6626
  */
6359
- declare const clearQueryDevtoolsTombstones: (ids?: Iterable<string>) => void;
6360
- type QueryDevtoolsOptions = {
6361
- /**
6362
- * How many of each query's most recent runs keep their response (or error) body, which is what the
6363
- * panel's response diff compares. Defaults to `5`. Bodies dominate what the run buffer retains, so
6364
- * raise this only as far as the reach you actually need - a polling query holds one per run.
6365
- *
6366
- * This is the default; the panel's Settings tab can raise it for the rest of a page.
6367
- */
6368
- responseHistory?: number;
6369
- /**
6370
- * Build information about the application - version, commit SHA, environment name. Shown on the
6371
- * panel's About tab, included in the session export and exposed on `window.ethlete`, so a bug report
6372
- * says which build it came from. Generate it rather than typing it:
6373
- * `nx g @ethlete/core:devtools-about <app>`.
6374
- */
6375
- about?: QueryDevtoolsAppInfo;
6376
- /**
6377
- * The OpenAPI (or JSON Schema) document behind each query client, so the panel's mock designer can
6378
- * seed a response from the real shape of a route and label each field with the type it is declared as.
6379
- * One loader describes every client; a record keyed by client name describes an application whose
6380
- * clients speak to different APIs. Each loader runs at most once, and only when the designer first
6381
- * asks for it - see {@link QueryDevtoolsSchemaLoaders}.
6382
- */
6383
- schema?: QueryDevtoolsSchemaLoaders;
6384
- /**
6385
- * The backends this application can be pointed at, one entry per `localStorage` key it reads at
6386
- * startup. Declaring them puts a picker next to the floating toggle and on the panel's Settings tab;
6387
- * picking writes the key and reloads. Nothing else changes - the application still resolves the key
6388
- * itself, so an env is whatever it already means to it.
6389
- */
6390
- apiEnvs?: QueryDevtoolsApiEnvSwitch[];
6627
+ declare const setQueryDevtoolsArmedMocksScope: (next: QueryDevtoolsStorageScope) => void;
6628
+ /** Empties the designed library and disarms everything - the panel's "Reset devtools". */
6629
+ declare const clearQueryDevtoolsMockStore: () => void;
6630
+
6631
+ /** One entry id the last page load left ops for, as the panel's banner reports it. */
6632
+ type RestoredQueryDevtoolsOverrides = {
6633
+ /** The devtools entry id the ops were stored under. */
6634
+ id: string;
6635
+ /** How many ops were stored for it. */
6636
+ count: number;
6391
6637
  /**
6392
- * The accounts the panel may log in as, so a session can be switched without typing a login form
6393
- * again. Declare the slot only - the label, the query and the fields it needs. Whoever runs the app
6394
- * types the credentials into the panel once, and they stay in that browser: **never put a password in
6395
- * the repository.**
6396
- *
6397
- * Scope an account to the backends it exists on with `envs`, for an API whose users are not the next
6398
- * one's. Accounts are not offered at all while an `apiEnvs` env marked `production` is the pick.
6638
+ * Whether a query with this id has registered and taken them. `false` means the store outlived the
6639
+ * query it was written for - a route that no longer runs, or a creation order that shifted - so those
6640
+ * ops are sitting on nothing rather than quietly landing somewhere else.
6399
6641
  */
6400
- authAccounts?: QueryDevtoolsAuthAccount[];
6642
+ armed: boolean;
6401
6643
  };
6402
6644
  /**
6403
- * Enables the `@ethlete/query` devtools. Add this to your application providers (e.g. in
6404
- * `bootstrapApplication`) to make query clients, queries, stacks, sequences and auth providers
6405
- * appear in the `<et-query-devtools>` panel.
6406
- *
6407
- * When omitted, all devtools instrumentation is a no-op: the registry is never installed, so nothing
6408
- * is retained at runtime and the registry itself is dropped from the bundle.
6409
- *
6410
- * The options are read once, on the first call. A second application on the same page keeps the
6411
- * options of the first one, and this call warns about the ones it declared itself.
6412
- *
6413
- * @example
6414
- * ```ts
6415
- * bootstrapApplication(AppComponent, {
6416
- * providers: [provideQueryDevtools()],
6417
- * });
6418
- * ```
6645
+ * Whether armed response overrides are stored and replayed on the next page load - that is, whether
6646
+ * their scope is anything other than `none`. Off by default.
6419
6647
  */
6420
- declare const provideQueryDevtools: (options?: QueryDevtoolsOptions) => EnvironmentProviders;
6421
-
6648
+ declare const queryDevtoolsOverridePersistence: Signal<boolean>;
6422
6649
  /**
6423
- * The longest lifetime an armed override may claim, in seconds (7 days). Anything beyond it is never
6424
- * refreshed at all, which is what arming nothing already does.
6650
+ * Where armed response overrides are kept. Switching to a scope that keeps them captures whatever is
6651
+ * armed right now, so the choice reads as "keep these" rather than "keep the next ones"; switching
6652
+ * between `session` and `local` moves the store; switching to `none` empties it and leaves every armed
6653
+ * op exactly where it is for the rest of this page.
6425
6654
  */
6426
- declare const QUERY_DEVTOOLS_TOKEN_TTL_LIMIT = 604800;
6655
+ declare const setQueryDevtoolsOverridesScope: (next: QueryDevtoolsStorageScope) => void;
6427
6656
  /**
6428
- * The access-token lifetime armed per auth provider name, in seconds, consumed by the
6429
- * `<et-query-devtools>` panel. A provider on its token's real lifetime is absent rather than present
6430
- * with it.
6657
+ * Turns persistence on or off - the panel's "Keep across reloads" toggle. On restores the last scope
6658
+ * that kept them (`session` unless Settings picked `local`).
6431
6659
  */
6432
- declare const queryDevtoolsTokenTtls: Signal<Record<string, number>>;
6660
+ declare const setQueryDevtoolsOverridePersistence: (value: boolean) => void;
6433
6661
  /**
6434
- * Whether an overridden lifetime can be applied to a decoded access token at all. It needs the claim
6435
- * carrying the expiry - so a lifetime is never invented for a token that declares none - plus `iat` or
6436
- * `nbf` to measure the new lifetime from.
6662
+ * Empties the override store in both browser stores and disarms everything a reload brought back,
6663
+ * without changing where overrides are kept - the panel's "Reset devtools".
6437
6664
  */
6438
- declare const canOverrideQueryDevtoolsTokenTtl: (options: {
6439
- payload: Record<string, unknown> | null;
6440
- expiresInPropertyName?: string;
6441
- }) => boolean;
6665
+ declare const clearQueryDevtoolsOverrideStore: () => void;
6442
6666
  /**
6443
- * Presents one auth provider's access token as living `seconds` from the moment it was issued, rather
6444
- * than as long as it says it does. Everything that reads the expiry sees the shortened lifetime - the
6445
- * proactive refresh schedule, `withBearerAuthTokenExpirationWarning`, and the panel's own countdown -
6446
- * so arming 60 seconds makes a real refresh happen a minute after each token is issued, and keeps
6447
- * happening for every token that refresh brings back.
6448
- *
6449
- * It is a lifetime, not a remaining time: `0` presents the current token as long expired, which is what
6450
- * makes a refresh happen at once. Nothing is persisted, so a reload leaves every provider on its real
6451
- * lifetime.
6452
- *
6453
- * Part of the devtools contract consumed by `<et-query-devtools>`; a token's lifetime is not something
6454
- * an application should override on itself.
6667
+ * The ops this page load inherited from the previous one, and for each id whether a live query has taken
6668
+ * it. Overrides that outlive the page that armed them have to announce themselves, because an app being
6669
+ * lied to looks exactly like an app that is broken.
6455
6670
  */
6456
- declare const setQueryDevtoolsTokenTtl: (options: {
6457
- providerName: string;
6458
- seconds: number;
6459
- }) => void;
6671
+ declare const restoredQueryDevtoolsOverrides: Signal<readonly RestoredQueryDevtoolsOverrides[]>;
6460
6672
  /**
6461
- * Puts one provider back on its token's real lifetime, or every provider when no name is given.
6462
- *
6463
- * @see setQueryDevtoolsTokenTtl
6673
+ * The scope those ops came back from, or `null` when this page inherited none. `local` is the one worth
6674
+ * naming in the banner: it means they outlived closing the tab, not just a reload.
6464
6675
  */
6465
- declare const clearQueryDevtoolsTokenTtl: (providerName?: string) => void;
6676
+ declare const queryDevtoolsRestoredOverridesScope: Signal<QueryDevtoolsStorageScope | null>;
6677
+ /** Disarms every op this page load inherited and empties the store - the banner's one-click way out. */
6678
+ declare const clearRestoredQueryDevtoolsOverrides: () => void;
6679
+
6680
+ declare const TRANSFER_KIND = "ethlete-query-overrides";
6466
6681
  /**
6467
- * The decoded access token as the devtools want it seen: the claim carrying the expiry rewritten to the
6468
- * armed lifetime, measured from `iat`. Returns `payload` untouched when nothing is armed for the
6469
- * provider, or when the token cannot carry the override - see {@link canOverrideQueryDevtoolsTokenTtl}.
6470
- *
6471
- * Installed as the token payload patcher by `provideQueryDevtools()`, and called directly by the panel
6472
- * for its own countdown.
6682
+ * A whole armed override set, as the devtools panel writes it to the clipboard: pretty-printed JSON so
6683
+ * it can be pasted onto another query, into a ticket, or hand-edited on the way. `source` is only ever
6684
+ * a human's bearing on where it came from - a paste never resolves against it.
6473
6685
  */
6474
- declare const applyQueryDevtoolsTokenTtl: <T>(options: {
6475
- payload: T;
6476
- providerName: string;
6477
- expiresInPropertyName?: string;
6478
- }) => T;
6686
+ type QueryDevtoolsOverrideTransfer = {
6687
+ kind: typeof TRANSFER_KIND;
6688
+ version: number;
6689
+ source?: {
6690
+ id?: string;
6691
+ url?: string;
6692
+ };
6693
+ ops: OverrideOp[];
6694
+ };
6695
+ /** What {@link parseQueryDevtoolsOverrideTransfer} makes of a piece of clipboard text. */
6696
+ type QueryDevtoolsOverrideTransferParse = {
6697
+ ok: true;
6698
+ ops: OverrideOp[];
6699
+ /** Ops the payload held that this build cannot replay: a `type` a newer panel wrote, or a field missing. */
6700
+ skipped: number;
6701
+ source?: {
6702
+ id?: string;
6703
+ url?: string;
6704
+ };
6705
+ } | {
6706
+ ok: false;
6707
+ reason: string;
6708
+ };
6709
+ /**
6710
+ * Serializes the ops armed on one query into clipboard text. `reset` never reaches a recorder's list, so
6711
+ * what comes out is exactly what a paste can put back.
6712
+ */
6713
+ declare const serializeQueryDevtoolsOverrideTransfer: (entries: readonly QueryDevtoolsOverrideEntry[], source?: {
6714
+ id?: string;
6715
+ url?: string;
6716
+ }) => string;
6717
+ /**
6718
+ * Reads clipboard text back into ops. A bare array of ops is accepted alongside the full envelope, so a
6719
+ * set pasted out of a ticket and trimmed by hand still lands; an op whose `type` this build doesn't know
6720
+ * is counted in `skipped` rather than failing the whole paste, so an older panel can take a newer one's
6721
+ * set minus the parts it cannot replay.
6722
+ */
6723
+ declare const parseQueryDevtoolsOverrideTransfer: (text: string) => QueryDevtoolsOverrideTransferParse;
6724
+ /**
6725
+ * How many of `ops` would not resolve against `raw` - what a paste onto a differently-shaped query
6726
+ * reports, so ops sitting on nothing say so instead of looking armed. Replays them the same way the
6727
+ * pipeline will, since an earlier op can be what makes a later one's path exist.
6728
+ */
6729
+ declare const countUnresolvedQueryDevtoolsOverrides: (ops: readonly OverrideOp[], raw: unknown) => number;
6730
+ /** Arms every op of a parsed set onto a query, on top of whatever it already has armed. */
6731
+ declare const armQueryDevtoolsOverrideTransfer: (recorder: QueryDevtoolsOverridesRecorder, ops: readonly OverrideOp[]) => void;
6479
6732
 
6480
6733
  /**
6481
6734
  * How many destroyed queries the registry keeps. A tombstone holds the last response body it captured,
@@ -6516,20 +6769,6 @@ declare const snapshotQueryDevtoolsHandle: (handle: unknown) => unknown;
6516
6769
  */
6517
6770
  declare const tombstoneOf: (entry: QueryDevtoolsEntry, destroyedAt: number) => QueryDevtoolsEntry;
6518
6771
 
6519
- /**
6520
- * Whether a devtools UI is on the page, which is what the floating pills follow. Kept apart from the
6521
- * pills themselves so `@ethlete/query-devtools/toggle` can declare itself without pulling the pill
6522
- * renderer into the bundle an application ships.
6523
- */
6524
- /**
6525
- * Declares a devtools UI on the page, and takes the declaration back when it goes. The floating pills
6526
- * paint only while one is mounted, so an application that renders no devtools trigger shows no pills
6527
- * either.
6528
- *
6529
- * Part of the devtools contract. **Not part of the general public contract.**
6530
- */
6531
- declare const setQueryDevtoolsUiMounted: (isMounted: boolean) => void;
6532
-
6533
6772
  type TransformedGqlQuery = {
6534
6773
  query: string;
6535
6774
  variables?: string | Record<string, unknown>;
@@ -7285,6 +7524,8 @@ declare class LegacyQuery<Response, Arguments extends BaseArguments | undefined,
7285
7524
  * @internal
7286
7525
  */
7287
7526
  _canBeCached?: boolean);
7527
+ /** The full URL of the request the underlying query is bound to, `null` before the first execution. */
7528
+ get url(): string | null;
7288
7529
  get rawState(): V2QueryState<ResponseType<QueryArgsOf<TNewQuery>>>;
7289
7530
  /**
7290
7531
  * `abort()` resets the underlying query, so it holds no execution state - the shape of a query that has
@@ -8801,7 +9042,7 @@ declare class QueryDevtoolsComponent {
8801
9042
  secure: boolean | undefined;
8802
9043
  route: any;
8803
9044
  reportProgress: boolean | undefined;
8804
- responseType: "text" | "json" | "blob" | "arraybuffer" | undefined;
9045
+ responseType: "json" | "text" | "blob" | "arraybuffer" | undefined;
8805
9046
  withCredentials: boolean | undefined;
8806
9047
  autoRefreshOn: _ethlete_query.QueryAutoRefreshConfig | undefined;
8807
9048
  enableSmartPolling: boolean | undefined;
@@ -8811,7 +9052,7 @@ declare class QueryDevtoolsComponent {
8811
9052
  secure: boolean | undefined;
8812
9053
  route: any;
8813
9054
  reportProgress: boolean | undefined;
8814
- responseType: "text" | "json" | "blob" | "arraybuffer" | undefined;
9055
+ responseType: "json" | "text" | "blob" | "arraybuffer" | undefined;
8815
9056
  withCredentials: boolean | undefined;
8816
9057
  autoRefreshOn: _ethlete_query.QueryAutoRefreshConfig | undefined;
8817
9058
  enableSmartPolling: boolean | undefined;
@@ -9232,15 +9473,15 @@ declare class QueryDirective<Q extends QueryDirectiveType | null> {
9232
9473
  /**
9233
9474
  * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.
9234
9475
  */
9235
- declare const invalidBaseRouteError: (data: unknown) => RuntimeError<1>;
9476
+ declare const invalidBaseRouteError: (base: unknown) => RuntimeError<10>;
9236
9477
  /**
9237
9478
  * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.
9238
9479
  */
9239
- declare const invalidRouteError: (data: unknown) => RuntimeError<2>;
9480
+ declare const invalidRouteError: (route: unknown) => RuntimeError<11>;
9240
9481
  /**
9241
9482
  * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.
9242
9483
  */
9243
- declare const pathParamsMissingInRouteFunctionError: (data: unknown) => RuntimeError<3>;
9484
+ declare const pathParamsMissingInRouteFunctionError: (route: unknown) => RuntimeError<12>;
9244
9485
  /**
9245
9486
  * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.
9246
9487
  */
@@ -9444,7 +9685,7 @@ type QueryFormChange<TFields extends QueryFormFields> = {
9444
9685
  * Options passed to `observe()`. Named distinctly from the legacy
9445
9686
  * `QueryFormObserveOptions` to keep both APIs' barrel exports intact.
9446
9687
  */
9447
- type QueryFormSignalsObserveOptions = {
9688
+ type QueryFormSignalsObserveOptions<TKey extends string = string> = {
9448
9689
  /**
9449
9690
  * Sync the committed value to the URL query params.
9450
9691
  * @default true
@@ -9464,7 +9705,7 @@ type QueryFormSignalsObserveOptions = {
9464
9705
  * Keep the committed value in a storage and restore it when the URL carries none of the persisted fields.
9465
9706
  * Off unless set.
9466
9707
  */
9467
- readonly persistence?: QueryFormPersistence;
9708
+ readonly persistence?: QueryFormPersistence<TKey>;
9468
9709
  };
9469
9710
  /**
9470
9711
  * The storage a query form persists into. `sessionStorage` and `localStorage` satisfy it. Both methods are
@@ -9475,7 +9716,7 @@ type QueryFormStorage = {
9475
9716
  setItem(key: string, value: string): void;
9476
9717
  };
9477
9718
  /** Where and what a query form persists - the `persistence` option of `observe()`. */
9478
- type QueryFormPersistence = {
9719
+ type QueryFormPersistence<TKey extends string = string> = {
9479
9720
  /** The storage key. Scope it per list, e.g. `'players-list'`. */
9480
9721
  readonly key: string;
9481
9722
  /**
@@ -9484,7 +9725,7 @@ type QueryFormPersistence = {
9484
9725
  */
9485
9726
  readonly storage: 'session' | 'local' | QueryFormStorage;
9486
9727
  /** The fields to persist and to check the URL for. Defaults to every field. */
9487
- readonly fields?: readonly string[];
9728
+ readonly fields?: readonly TKey[];
9488
9729
  };
9489
9730
  /**
9490
9731
  * Options for a single programmatic write (`setValue`/`patchValue`/reset).
@@ -9577,7 +9818,7 @@ type QueryFormSignals<TFields extends QueryFormFields> = {
9577
9818
  /** The default value of the whole form. */
9578
9819
  readonly defaultValue: QueryFormModel<TFields>;
9579
9820
  /** Start syncing with the URL. Returns the form, so it can be chained onto the definition. */
9580
- observe(options?: QueryFormSignalsObserveOptions): QueryFormSignals<TFields>;
9821
+ observe(options?: QueryFormSignalsObserveOptions<keyof TFields & string>): QueryFormSignals<TFields>;
9581
9822
  /**
9582
9823
  * Stop syncing and strip the form's params from the URL. A pending debounced edit is committed to `value`
9583
9824
  * but not written to the URL. Only an explicit call strips the params - the
@@ -9668,7 +9909,8 @@ type DateStringQueryFieldConfig = QueryFieldConfig<string | null> & {
9668
9909
  readonly as: 'string';
9669
9910
  };
9670
9911
  /**
9671
- * A single date field. By default it holds a `Date` read from an ISO/`Date`-parseable string in the URL.
9912
+ * A single date field. By default it holds a `Date`, written to the URL as an ISO string and read back from
9913
+ * any `Date`-parseable one.
9672
9914
  * `as: 'string'` types it `string | null` like the `@ethlete/components` date and time controls, so
9673
9915
  * `[formField]` binds it to them; the URL then carries the control's `valueFormat` string verbatim.
9674
9916
  *
@@ -9769,14 +10011,29 @@ type CreateWebSocketClientConfigOptions = {
9769
10011
  withCredentials?: boolean;
9770
10012
  /**
9771
10013
  * The handshake payload, sent on every connect and reconnect. Pass a function to read a fresh value
9772
- * (e.g. the current access token) each time.
10014
+ * each time; it runs outside an injection context, so it cannot call `injectAuthProvider()`. For a
10015
+ * bearer auth provider use {@link authProvider} instead. Setting both is a dev-mode error and
10016
+ * `authProvider` wins.
9773
10017
  *
9774
10018
  * @example
9775
10019
  * ```ts
9776
- * createWebSocketClient({ name: 'match', url, io, auth: () => ({ token: auth.accessToken() }) });
10020
+ * createWebSocketClient({ name: 'match', url, io, auth: () => ({ token: readCookieToken() }) });
9777
10021
  * ```
9778
10022
  */
9779
10023
  auth?: WebSocketClientAuth | (() => WebSocketClientAuth);
10024
+ /**
10025
+ * A bearer auth provider whose session the socket follows. The handshake carries
10026
+ * `{ token: accessToken() }`. The socket does not connect while the session is `'unknown'` or
10027
+ * `'restoring'`, reconnects when a session starts (a login, or a different user), and disconnects and
10028
+ * completes its rooms on logout. A token rotation within a session does not reconnect; the next
10029
+ * reconnect reads the fresh token.
10030
+ *
10031
+ * @example
10032
+ * ```ts
10033
+ * createWebSocketClient({ name: 'match', url, io, authProvider: myAuthProviderRef });
10034
+ * ```
10035
+ */
10036
+ authProvider?: AnyCreateBearerAuthProviderResult;
9780
10037
  };
9781
10038
  /** A default socket io message view */
9782
10039
  type SocketMessageView<TMessageData = unknown> = {
@@ -9831,7 +10088,7 @@ type AnyWebSocketClient<TMessageData extends SocketMessageView = SocketMessageVi
9831
10088
  declare const createWebSocketClient: <TMessageData extends SocketMessageView = SocketMessageView>(options: CreateWebSocketClientConfigOptions) => WebSocketClientResult<TMessageData>;
9832
10089
 
9833
10090
  /** The version of `@ethlete/query` this build was cut from. */
9834
- declare const QUERY_VERSION = "6.0.0-next.54";
10091
+ declare const QUERY_VERSION = "6.0.0-next.55";
9835
10092
 
9836
- export { AuthBearerRefreshStrategy, BasicAuthProvider, BearerAuthFeatureType, BooleanArrayQueryField, CustomHeaderAuthProvider, DEFAULT_KEEP_UNUSED_FOR, DEFAULT_QUERY_PERSISTENCE_MAX_AGE, DEFAULT_QUERY_PERSISTENCE_MAX_ENTRIES, DEFAULT_QUERY_PERSISTENCE_VERSION, DEFAULT_QUERY_PERSISTENCE_WRITE_DELAY, DateArrayQueryField, DateQueryField, EMPTY_QUERY_DEVTOOLS_FAULT, EntityStore, IGNORED_FILTER_COUNT_FIELDS, INFINITY_QUERY_TOKEN, IS_QUERY_REQUEST, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, LegacyQuery, LegacyQueryCreator, MAX_QUERY_BATCH_TOMBSTONES, MAX_QUERY_BATCH_TOMBSTONE_BUCKETS, MAX_QUERY_DEVTOOLS_TOMBSTONES, MAX_UNUSED_ENTRIES, NumberArrayQueryField, ParseHttpErrorCodeToMessageDePipe, ParseHttpErrorCodeToMessageEnPipe, ParseHttpErrorCodeToTitleDePipe, ParseHttpErrorCodeToTitleEnPipe, QUERY_CLIENT_DEVTOOLS_TOKEN, QUERY_DEVTOOLS_FAULT_STATUSES, QUERY_DEVTOOLS_TOKEN_TTL_LIMIT, QUERY_PERSISTENCE_STORE_VERSION, QUERY_SYNC_PROTOCOL_VERSION, QUERY_VERSION, QueryClientFeatureType, QueryDevtoolsComponent, QueryDirective, QueryFeatureType, QueryField, QueryForm, QueryRuntimeErrorCode, QueryShortNamePipe, QueryStateType, QueryStore, SERVER_ERROR_KIND, SERVER_VIOLATION_ERROR_KIND, SPEED_BUFFER_TIME_IN_MS, SearchQueryField, SortQueryField, StringArrayQueryField, V2BearerAuthProvider, V2Query, V2QueryClient, V2QueryCreator, addQueryContainerHandling, addQueryDevtoolsAuthAccount, applyQueryDevtoolsOverrides, applyQueryDevtoolsTokenTtl, applyQueryFeatures, armAllQueryDevtoolsMocks, armQueryDevtoolsMock, armQueryDevtoolsOverrideTransfer, authExtractTokensResponseMissingAccessToken, authExtractTokensResponseMissingRefreshToken, authExtractTokensResponseNotObject, authProviderFeatureUsedMultipleTimes, booleanArrayQueryField, buildQueryCacheKey, buildQueryString, buildRoute, buildTimestampFromSeconds, canOverrideQueryDevtoolsTokenTtl, castQueryCreatorTypes, circularQueryDependency, circularQueryDependencyChecker, clearQueryDevtoolsArmedMocks, clearQueryDevtoolsAuthCredentials, clearQueryDevtoolsAuthSessions, clearQueryDevtoolsFaults, clearQueryDevtoolsMockStore, clearQueryDevtoolsOverrideStore, clearQueryDevtoolsStore, clearQueryDevtoolsTokenTtl, clearQueryDevtoolsTombstones, clearRestoredQueryDevtoolsOverrides, collectLeafPaths, collectQueryDevtoolsSchemaComponents, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, contentfulGqlLikePaginationAdapter, countUnresolvedQueryDevtoolsOverrides, createAuthGuard, createBaseQuery, createBaseQueryCreator, createBearerAuthProvider, createDefaultRetryFn, createDeleteQuery, createExecuteFn, createGetQuery, createGqlMutationViaGet, createGqlMutationViaPost, createGqlQuery, createGqlQueryCreator, createGqlQueryViaGet, createGqlQueryViaPost, createHeadQuery, createHttpRequest, createIndexedDbQueryPersistenceAdapter, createInfinityQueryConfig, createLegacyQueryCreator, createNoopQueryPersistenceAdapter, createOptionsQuery, createPagedQueryStack, createPatchQuery, createPersistentAuthFeature, createPostQuery, createPutQuery, createQuery, createQueryBatch, createQueryClient, createQueryCollection, createQueryCollectionSignal, createQueryCollectionSubject, createQueryCreator, createQueryDevtoolsOverrides, createQueryErrorResponse, createQueryFeature, createQueryInvalidationFilter, createQueryKeyLockManager, createQueryObject, createQueryPersistenceEngine, createQueryRepository, createQuerySnapshotFn, createQueryStack, createQuerySubmission, createQuerySyncTransport, createSecureDeleteQuery, createSecureExecuteFactory, createSecureExecuteFn, createSecureGetQuery, createSecureGqlMutationViaGet, createSecureGqlMutationViaPost, createSecureGqlQuery, createSecureGqlQueryCreator, createSecureGqlQueryViaGet, createSecureGqlQueryViaPost, createSecureHeadQuery, createSecureOptionsQuery, createSecurePatchQuery, createSecurePostQuery, createSecurePutQuery, createSecureQuery, createSecureQueryCreator, createTrackingFeature, createWebSocketClient, dateArrayQueryField, dateQueryField, decryptBearer, deepFreeze, def, defineQueryForm, deleteQueryDevtoolsMock, detectContentTypeHeader, detectPaginationShape, dynLikePaginationAdapter, effectComputed, emptyQueryArgs, ethletePaginationAdapter, executeUntilSettled, executeUntilSettled$, extractExpiresInSeconds, extractFormViolations, extractHtmlErrorMessage, extractQuery, fakePaginationAdapter, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, forgetQueryDevtoolsAuthSession, forgetQueryDevtoolsAuthSessionsFor, generateQueryDevtoolsNumberPreset, generateQueryDevtoolsSampleNumber, generateQueryDevtoolsStringPreset, getDefaultHeaders, getQueryFeatureUsage, getResponseUrl, ggLikePaginationAdapter, gql, gqlDataPropertyMissingInResponse, gqlErrorsInResponse, hasHeader, hasQueryDevtoolsOverridesAtPath, htmlErrorPayload, htmlQueryErrorParser, ignoreAutoRefresh, injectInfinityQueryResponseDelay, insertFrom, invalidBaseRouteError, invalidBodyError, invalidRouteError, invalidStateInsideSecureExecuteFactory, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCreateGqlQueryOptions, isCustomHeaderAuthProvider, isDateShapedLeaf, isEmptyString, isGqlQueryConfig, isHtmlErrorPayload, isIdempotentQueryMethod, isLegacyQuery, isNaN, isPageOutOfRangeError, isQuery, isQueryCollection, isQueryDevtoolsEnabled, isQueryDevtoolsFaultArmed, isQueryDevtoolsRepositoryLive, isQueryErrorResponse, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyListError, isSymfonyPagerfantaOutOfRangeError, isUnderInvalidatedUrl, legacyPrepareWithoutInjectionContext, loadQueryDevtoolsSchema, loginQueryDevtoolsAuthAccount, logoutQueryDevtoolsAuthSession, mapToPaginated, mapViolationsToFormErrors, matchesQueryDevtoolsMockPattern, matchesQueryDevtoolsMockQuery, maybeExecute, measureQueryDevtoolsPayload, mergeHeaders, nestedEffect, numberArrayQueryField, pagedQueryStackNextPageCalledWithoutPreviousPage, pagedQueryStackPageBiggerThanTotalPages, pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToTitleEn, parseQueryDevtoolsOverrideTransfer, pathParamsMissingInRouteFunctionError, provideInfinityQueryResponseDelay, provideLegacyPrepareFallback, provideQueryClientForDevtools, provideQueryDevtools, queryArrayComputed, queryBatchAlreadyRunning, queryBatchWithArgsUsed, queryClientFeatureUsedMultipleTimes, queryComputed, queryComputedTillTruthy, queryCreatedInReactiveContext, queryDevtoolsAbout, queryDevtoolsAllowsLocalAuthSessions, queryDevtoolsApiEnvIds, queryDevtoolsApiEnvIsProduction, queryDevtoolsApiEnvScope, queryDevtoolsApiEnvValues, queryDevtoolsApiEnvs, queryDevtoolsArmedMocks, queryDevtoolsArmedMocksRestored, queryDevtoolsAuthAccountsFor, queryDevtoolsAuthActive, queryDevtoolsAuthFieldsFor, queryDevtoolsAuthOtherScopeCount, queryDevtoolsAuthSessions, queryDevtoolsAuthSessionsFor, queryDevtoolsAuthTabLocal, queryDevtoolsEntries, queryDevtoolsFaults, queryDevtoolsFaultsRestored, queryDevtoolsMockId, queryDevtoolsMocks, queryDevtoolsOverridePersistence, queryDevtoolsRequestPath, queryDevtoolsResponseHistory, queryDevtoolsRestoredOverridesScope, queryDevtoolsSchemaNames, queryDevtoolsSchemaRoutes, queryDevtoolsSchemaState, queryDevtoolsSettings, queryDevtoolsStorage, queryDevtoolsTokenTtls, queryErrorMessage, queryErrorMessages, queryExecute, queryExecutedAfterDestroyMessage, queryFeatureUsedMultipleTimes, queryField, querySequence, querySequenceAlreadyRunning, queryStackWithArgsUsed, queryStackWithResponseUpdateUsed, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, queryStateErrorSignal, queryStateLoadingSignal, queryStateResponseSignal, queryStateSignal, readQueryDevtoolsStore, recordExecutionArgs, registerEthleteVersion, registerQueryErrorParser, removeFrom, removeQueryDevtoolsAuthAccount, renameQueryDevtoolsAuthSession, request, resetExecuteState, resetPageOnError, resolveInvalidationUrl, resolveQueryHeaders, restoredQueryDevtoolsOverrides, saveQueryDevtoolsMock, searchQueryField, seedQueryDevtoolsSchemaBody, seedQueryDevtoolsSchemaRoute, serializeBody, serializeQueryDevtoolsOverrideTransfer, setQueryDevtoolsApiEnv, setQueryDevtoolsAppInfo, setQueryDevtoolsArmedMocksScope, setQueryDevtoolsAuthCredentials, setQueryDevtoolsAuthTabLocal, setQueryDevtoolsFault, setQueryDevtoolsFaultsScope, setQueryDevtoolsOverridePersistence, setQueryDevtoolsOverridesScope, setQueryDevtoolsSettings, setQueryDevtoolsTokenTtl, setQueryDevtoolsUiMounted, setupQueryExecuteState, setupQueryState, shouldAutoExecuteGqlQuery, shouldAutoExecuteQuery, shouldCacheQuery, shouldRetryRequest, silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent, skipPaginationPageParamCalculator, smartDuplicateArrayItem, snapshotQueryDevtoolsHandle, sortQueryField, splitQueryConfig, stringArrayQueryField, stringifyQueryRouteParts, sumQueryDevtoolsStats, switchQueryCollectionState, switchQueryDevtoolsAuthSession, switchQueryState, symfonyQueryErrorParser, tableSortQueryField, takeUntilResponse, toQuerySignal, toQuerySubject, tokensNotAvailableInsideAuthAndExec, tombstoneOf, transformArrayResponse, transformExecStateToQueryState, transformGql, transformMethod, transformPaginatedResponse, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray, transformToTableSort, transformToTableSortQueryParam, uncacheableRequestHasAllowCacheParam, uncacheableRequestHasCacheKeyParam, unwrapGqlResponseWithErrors, unwrapQuerySyncMessage, v2BuildQueryCacheKey, v2ExtractExpiresInSeconds, v2ShouldCacheQuery, v2ShouldRetryRequest, validateWithQuery, validateWithV2Query, withArgs, withArgsQueryFeatureMissingButRouteIsFunction, withAuthenticationQuery, withAutoRefresh, withAutoRefreshUsedInManualQuery, withAutoRefreshUsedOnUnsupportedHttpMethod, withBearerAuthMultiTabSync, withDefaultRetry, withErrorHandling, withEthleteApiErrors, withHtmlErrorParsing, withInactivityLogout, withLogging, withLongPolling, withLongPollingUsedOnUnsupportedHttpMethod, withLongPollingUsedWithPolling, withMultiTabSync, withPageResetOnError, withPersistentAuth, withPolling, withPollingUsedOnUnsupportedHttpMethod, withQueryPersistence, withRefreshQuery, withResponseUpdate, withSuccessHandling, withSymfonyErrors, withTokenExpirationWarning, withTokenRevocation, withTracking, wrapAsObservableSignal, wrapQuerySyncMessage, writeQueryDevtoolsStore };
9837
- export type { AnyBearerAuthProvider, AnyCreateBearerAuthProviderResult, AnyCreateGqlQueryCreatorOptions, AnyCreateQueryClientResult, AnyGqlQueryConfig, AnyInfinityQuery, AnyInfinityQueryConfig, AnyLegacyQuery, AnyLegacyQueryCreator, AnyNewQuery, AnyPagedQueryStack, AnyQueryBatch, AnyQueryBatchItemResult, AnyQueryBuilder, AnyQueryClient, AnyQueryCollection, AnyQueryCollectionData, AnyQueryCollectionResponse, AnyQueryCreator, AnyQueryCreatorCollection, AnyQueryForm, AnyQuerySnapshot, AnyQueryStack, AnyRestQueryConfig, AnyRoute, AnyV2Query, AnyV2QueryCreator, AnyWebSocketClient, AppendItemsLocation, ApplyExternalResponseOptions, ApplyPersistedResponseOptions, AuthGuard, AuthGuardConfig, AuthGuardPermission, AuthGuardPermissionOptions, AuthGuardTarget, AuthProvider, AuthProviderBasicConfig, AuthProviderBearerConfig, AuthProviderCustomHeaderConfig, AuthQueryBuilder, AuthQueryConfig, BaseArguments, BaseQueryCreatorFactoryOptions, BaseQueryCreatorOptions, BaseQueryCreatorOptionsSubtle, BearerAuthActivityCoordination, BearerAuthExecutionState, BearerAuthExecutionStateError, BearerAuthExecutionStateLoading, BearerAuthExecutionStateLogout, BearerAuthExecutionStateSuccess, BearerAuthExecutionStateTokenSeed, BearerAuthFeature, BearerAuthMultiTabSyncConfig, BearerAuthMultiTabSyncFeature, BearerAuthProvider, BearerAuthProviderEarlySetup, BearerAuthProviderEarlySetupContext, BearerAuthProviderEarlySetupResult, BearerAuthProviderFeatureContext, BearerAuthProviderOf, BearerAuthProviderQueryContext, BearerAuthProviderRef, BearerAuthProviderTokens, BearerAuthRefreshCoordination, BearerAuthSession, BearerAuthSessionAdoption, BearerAuthSessionEndCause, BearerAuthSessionStatus, BearerRefreshConfig, BodyType, BuildQueryStringConfig, CacheAdapterFn, Cancelled, ClassValidatorError, ConstructQuery, CreateBaseQueryOptions, CreateBearerAuthProviderConfig, CreateGqlQueryCreatorOptions, CreateGqlQueryExecuteOptions, CreateGqlQueryOptions, CreateHttpRequestDependencies, CreateHttpRequestOptions, CreateIndexedDbQueryPersistenceAdapterOptions, CreateLegacyQueryCreatorOptions, CreateLegacyQueryOptions, CreatePagedQueryStackOptions, CreateQueryBatchOptions, CreateQueryClientConfigOptions, CreateQueryCreatorOptions, CreateQueryExecuteOptions, CreateQueryObjectOptions, CreateQueryOptions, CreateQueryPersistenceEngineOptions, CreateQueryRepositoryConfig, CreateQuerySnapshotOptions, CreateQueryStackOptions, CreateQuerySubmissionConfig, CreateQuerySyncEngineOptions, CreateSecureGqlQueryExecuteOptions, CreateSecureGqlQueryOptions, CreateSecureQueryExecuteOptions, CreateSecureQueryOptions, CreateWebSocketClientConfigOptions, CreateWebSocketClientTransport, DateQueryFieldConfig, DateStringQueryFieldConfig, DefaultRetryOptions, DefineQueryFormConfig, DescribableFeature, DestroyCleanupCallback, EmptyObject, EntityGetParams, EntityIdParams, EntityKey, EntitySetParams, EntityStoreConfig, ExecuteFactory, ExecuteQueryOptions, ExtractQueryArgs, ExtractQueryKey, Failure, FeatureRegistry, GQL, GqlDataWithErrors, GqlEnvelope, GqlError, GqlQueryArgs, GqlQueryConfig, GqlQueryConfigWithoutMethod, GqlQueryMethod, GqlQueryTransport, GqlRawResponseType, GqlTransferOption, GqlTransformer, GqlVariablesType, HttpCancelEvent, HttpErrorEvent, HttpRequest, HttpRequestLoadingProgressState, HttpRequestLoadingState, HttpRequestResponseType, HttpRequestRetryState, HttpRequestSubtle, HttpRequestTransferCacheConfig, InactivityLogoutConfig, InactivityLogoutFeature, InfinityQueryConfig, InfinityQueryConfigType, InfinityQueryOf, InfinityQueryParamLocation, InsertFromConfig, InternalCreateGqlQueryCreatorOptions, InternalCreateQueryCreatorOptions, InternalQueryExecute, InternalSecureCreateGqlQueryCreatorOptions, InternalSecureCreateQueryCreatorOptions, InternalWebSocketRoom, JsonPath, LeaderInstanceCountChangeEventData, LeaderStatusChangeEventData, LegacyArgumentsOfQueryArgs, LegacyQueryPrepareFn, Loading, LogoutEventData, MapViolationsToFormErrorsOptions, Method, ObservableSignal, OptionalQueryFieldOptions, OverrideOp, PageParamCalculatorOptions, PagedQueryStack, PagedQueryStackDirection, PagedQueryStackExecuteOptions, PagedQueryStackResetOptions, PartialXhrState, PathParams, PathParamsType, PersistedQueryBody, PersistedQueryEntry, PersistedQueryEntryMeta, PersistentAuthConfig, PersistentAuthFeature, PollConfig, Prepared, Query, QueryArgs, QueryArgsOf, QueryArgsOfLegacyArguments, QueryAutoRefreshConfig, QueryBase, QueryBatch, QueryBatchDevtoolsHandle, QueryBatchItemCancelled, QueryBatchItemError, QueryBatchItemResult, QueryBatchItemSkipped, QueryBatchItemSuccess, QueryBatchResult, QueryBatchStatus, QueryClient, QueryClientDevtoolsOptions, QueryClientErrorPipelineFeature, QueryClientFeature, QueryClientFeatureContext, QueryClientFeatureFn, QueryClientMultiTabSyncFeature, QueryClientPersistenceFeature, QueryClientRef, QueryClientSubtle, QueryCollectionKeysOf, QueryCollectionOf, QueryCollectionWithNullableQuery, QueryConfig, QueryConfigBase, QueryConfigWithoutMethod, QueryContainerConfig, QueryCreator, QueryCreatorInput, QueryDataOf, QueryDependencies, QueryDevtoolsAbout, QueryDevtoolsApiEnv, QueryDevtoolsApiEnvSwitch, QueryDevtoolsAppInfo, QueryDevtoolsAuthAccount, QueryDevtoolsAuthAccountView, QueryDevtoolsAuthField, QueryDevtoolsAuthLocalAccount, QueryDevtoolsAuthProviderHandle, QueryDevtoolsAuthProviderRegistration, QueryDevtoolsAuthQuery, QueryDevtoolsAuthSeed, QueryDevtoolsAuthSession, QueryDevtoolsEntry, QueryDevtoolsEntryKind, QueryDevtoolsEntryMeta, QueryDevtoolsFault, QueryDevtoolsFaultTarget, QueryDevtoolsFeature, QueryDevtoolsFeatureDescriber, QueryDevtoolsFeatureDetail, QueryDevtoolsFormField, QueryDevtoolsFormHandle, QueryDevtoolsFormLinksHandle, QueryDevtoolsFormLinksRecorder, QueryDevtoolsMock, QueryDevtoolsMockTarget, QueryDevtoolsOptions, QueryDevtoolsOverrideEntry, QueryDevtoolsOverrideTransfer, QueryDevtoolsOverrideTransferParse, QueryDevtoolsOverridesHandle, QueryDevtoolsOverridesRecorder, QueryDevtoolsPayload, QueryDevtoolsRegistrar, QueryDevtoolsRegistration, QueryDevtoolsResolvedFault, QueryDevtoolsResolvedMock, QueryDevtoolsRoutePart, QueryDevtoolsRun, QueryDevtoolsRunError, QueryDevtoolsRunStatus, QueryDevtoolsSchemaComponents, QueryDevtoolsSchemaLoader, QueryDevtoolsSchemaLoaders, QueryDevtoolsSchemaRoute, QueryDevtoolsSchemaSeed, QueryDevtoolsSchemaState, QueryDevtoolsSeedStyle, QueryDevtoolsSettings, QueryDevtoolsStats, QueryDevtoolsStatsHandle, QueryDevtoolsStatsRecorder, QueryDevtoolsStorageScope, QueryDirectiveContext, QueryDirectiveType, QueryEntityConfig, QueryErrorParser, QueryErrorResponse, QueryErrorResponseItem, QueryErrorResponseList, QueryErrorResponseSingle, QueryExecute, QueryExecuteArgs, QueryExecuteEventData, QueryExecuteOptions, QueryExecuteState, QueryExecutionState, QueryExecutionStateFailure, QueryExecutionStateFailureWithCachedResponse, QueryExecutionStateFailureWithNoResponse, QueryExecutionStateLoading, QueryExecutionStateLoadingWithCachedResponse, QueryExecutionStateLoadingWithNoResponse, QueryExecutionStateSuccess, QueryFailureEventData, QueryFeature, QueryFeatureContext, QueryFeatureFlags, QueryFeatureFn, QueryFieldConfig, QueryFieldDef, QueryFieldOptions, QueryFieldValue, QueryFilterConfig, QueryFormBranch, QueryFormBranchWriteOptions, QueryFormChange, QueryFormFields, QueryFormGroup, QueryFormGroupControls, QueryFormModel, QueryFormObserveOptions, QueryFormOf, QueryFormOptions, QueryFormPersistence, QueryFormSignals, QueryFormSignalsObserveOptions, QueryFormSignalsWriteOptions, QueryFormStorage, QueryFormValue, QueryFormValueEvent, QueryFormWriteOptions, QueryHeaders, QueryHeadersInput, QueryInvalidationCandidate, QueryInvalidationFilterFn, QueryInvalidationOptions, QueryKey, QueryKeyLockHold, QueryKeyLockHoldOptions, QueryKeyLockManager, QueryKeyLockState, QueryMethod, QueryMockConfig, QueryMultiTabSyncConfig, QueryOf, QueryParams, QueryParamsType, QueryPersistenceAdapter, QueryPersistenceCandidate, QueryPersistenceConfig, QueryPersistenceEngine, QueryPrepareFn, QueryRefreshCause, QueryRegistry, QueryRegistryEntry, QueryRepository, QueryRepositoryCacheEntry, QueryRepositoryDependencies, QueryRepositoryEntryDestroyedCause, QueryRepositoryEvent, QueryRepositoryItem, QueryRepositoryRefreshFilterFn, QueryRepositoryRequestOptions, QueryRepositorySubtle, QueryResponseOf, QueryRouteOf, QuerySequence, QuerySequenceResult, QuerySequenceStatus, QuerySequenceStepArgs, QuerySnapshot, QueryStack, QueryStackSubtle, QueryState, QueryStateMeta, QueryStateResponseOf, QueryStateSignal, QueryStateSubtle, QueryStateSuccessMeta, QueryStoreIdOf, QueryStoreOf, QuerySubmissionRef, QuerySubtle, QuerySuccessEventData, QuerySyncEngine, QuerySyncEnvelope, QuerySyncInvalidateMessage, QuerySyncMessage, QuerySyncMessageListener, QuerySyncMutation, QuerySyncMutationFilterFn, QuerySyncMutationMessage, QuerySyncRefreshCandidate, QuerySyncRefreshOnMutationConfig, QuerySyncResponseMessage, QuerySyncTransport, QueryTrigger, RawResponseType, ReadonlyQuery, RefreshFailure, RemoveFromConfig, RequestArgs, RequestConfig, RequestError, RequestEvent, RequestHeaders, RequestHeadersMethodMap, RequestHttpEvent, RequestProgress, RequestRetryFn, RequestRetryFnConfig, RequestRetryFnResult, RequiresTransform, ResetExecuteStateOptions, ResetPageOnErrorOperatorConfig, ResponseType, RestQueryConfig, RestoredQueryDevtoolsOverrides, RouteString, RouteType, RunQueryCreator, RunQueryExecuteOptions, SecureExecuteFactoryOptions, ServerValidationError, ServerViolationValidationError, SetupQueryDependenciesOptions, SetupQueryStateOptions, ShouldRetryRequestFn, ShouldRetryRequestOptions, ShouldRetryRequestResult, SocketMessageView, Sort, SortDirection, Success, SymfonyError, SymfonyErrorTrace, TableSortEntry, TokenExpirationWarningConfig, TokenExpirationWarningFeature, TokenRefreshEventData, TokenRefreshQueryBuilder, TokenRefreshQueryConfig, TokenResponse, TokenRevocationConfig, TokenRevocationFeature, TotalPagesExtractorOptions, TrackingConfig, TrackingEventDataMap, TrackingEventHandler, TrackingEventName, TrackingFeature, TransformedGqlQuery, V2CacheAdapterFn, V2PrepareArgsOf, V2QueryArgsOf, V2QueryClientConfig, V2QueryConfig, V2QueryState, V2RouteString, V2RouteType, ValidateWithQueryConfig, ValidateWithV2QueryConfig, WebSocketClient, WebSocketClientAuth, WebSocketClientIo, WebSocketClientIoOptions, WebSocketClientResult, WebSocketClientSocket, WebSocketClientSubtle, WebSocketDevtoolsHandle, WebSocketDevtoolsMessage, WebSocketRoom, WithArgsCheck, WithArgsQueryFeature, WithAutoRefreshFeatureOptions, WithBody, WithConfig, WithErrorHandlingFeatureOptions, WithHeaders, WithInjector, WithLegacyConfig, WithLoggingFeatureOptions, WithLongPollingFeatureOptions, WithMock, WithPageResetOnErrorFeatureOptions, WithPathParams, WithPollingFeatureOptions, WithQueryParams, WithResponseUpdateFeatureFnData, WithResponseUpdateFeatureOptions, WithSuccessHandlingFeatureOptions, WithVariables };
10093
+ export { AuthBearerRefreshStrategy, BasicAuthProvider, BearerAuthFeatureType, BooleanArrayQueryField, CustomHeaderAuthProvider, DEFAULT_KEEP_UNUSED_FOR, DEFAULT_QUERY_PERSISTENCE_MAX_AGE, DEFAULT_QUERY_PERSISTENCE_MAX_ENTRIES, DEFAULT_QUERY_PERSISTENCE_VERSION, DEFAULT_QUERY_PERSISTENCE_WRITE_DELAY, DateArrayQueryField, DateQueryField, EntityStore, IGNORED_FILTER_COUNT_FIELDS, INFINITY_QUERY_TOKEN, IS_QUERY_REQUEST, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, LegacyQuery, LegacyQueryCreator, MAX_UNUSED_ENTRIES, NumberArrayQueryField, ParseHttpErrorCodeToMessageDePipe, ParseHttpErrorCodeToMessageEnPipe, ParseHttpErrorCodeToTitleDePipe, ParseHttpErrorCodeToTitleEnPipe, QUERY_CLIENT_DEVTOOLS_TOKEN, QUERY_PERSISTENCE_STORE_VERSION, QUERY_SYNC_PROTOCOL_VERSION, QUERY_VERSION, QueryClientFeatureType, QueryDevtoolsComponent, QueryDirective, QueryFeatureType, QueryField, QueryForm, QueryRuntimeErrorCode, QueryShortNamePipe, QueryStateType, QueryStore, SERVER_ERROR_KIND, SERVER_VIOLATION_ERROR_KIND, SPEED_BUFFER_TIME_IN_MS, SearchQueryField, SortQueryField, StringArrayQueryField, V2BearerAuthProvider, V2Query, V2QueryClient, V2QueryCreator, addQueryContainerHandling, applyQueryFeatures, authAccessTokenExpiryUnreadable, authExtractTokensResponseMissingAccessToken, authExtractTokensResponseMissingRefreshToken, authExtractTokensResponseNotObject, authProviderFeatureUsedMultipleTimes, booleanArrayQueryField, buildQueryCacheKey, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, circularQueryDependency, circularQueryDependencyChecker, clearQueryDevtoolsTokenTtl, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, contentfulGqlLikePaginationAdapter, createAuthGuard, createBaseQuery, createBaseQueryCreator, createBearerAuthProvider, createDefaultRetryFn, createDeleteQuery, createExecuteFn, createGetQuery, createGqlMutationViaGet, createGqlMutationViaPost, createGqlQuery, createGqlQueryCreator, createGqlQueryViaGet, createGqlQueryViaPost, createHeadQuery, createHttpRequest, createIndexedDbQueryPersistenceAdapter, createInfinityQueryConfig, createLegacyQueryCreator, createNoopQueryPersistenceAdapter, createOptionsQuery, createPagedQueryStack, createPatchQuery, createPersistentAuthFeature, createPostQuery, createPutQuery, createQuery, createQueryBatch, createQueryClient, createQueryCollection, createQueryCollectionSignal, createQueryCollectionSubject, createQueryCreator, createQueryErrorResponse, createQueryFeature, createQueryGroup, createQueryInvalidationFilter, createQueryKeyLockManager, createQueryObject, createQueryPersistenceEngine, createQueryRepository, createQuerySnapshotFn, createQueryStack, createQuerySubmission, createQuerySyncTransport, createSecureDeleteQuery, createSecureExecuteFactory, createSecureExecuteFn, createSecureGetQuery, createSecureGqlMutationViaGet, createSecureGqlMutationViaPost, createSecureGqlQuery, createSecureGqlQueryCreator, createSecureGqlQueryViaGet, createSecureGqlQueryViaPost, createSecureHeadQuery, createSecureOptionsQuery, createSecurePatchQuery, createSecurePostQuery, createSecurePutQuery, createSecureQuery, createSecureQueryCreator, createTrackingFeature, createWebSocketClient, dateArrayQueryField, dateQueryField, decryptBearer, deepFreeze, def, defineQueryForm, detectContentTypeHeader, dynLikePaginationAdapter, effectComputed, emptyQueryArgs, ethletePaginationAdapter, executeUntilSettled, executeUntilSettled$, extractExpiresInSeconds, extractFormViolations, extractHtmlErrorMessage, extractQuery, fakePaginationAdapter, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getQueryFeatureUsage, getResponseUrl, ggLikePaginationAdapter, gql, gqlDataPropertyMissingInResponse, gqlErrorsInResponse, hasHeader, htmlErrorPayload, htmlQueryErrorParser, ignoreAutoRefresh, injectInfinityQueryResponseDelay, insertFrom, invalidBaseRouteError, invalidBodyError, invalidRouteError, invalidStateInsideSecureExecuteFactory, invalidatesUsedOnRead, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCreateGqlQueryOptions, isCustomHeaderAuthProvider, isEmptyString, isGqlQueryConfig, isHtmlErrorPayload, isIdempotentQueryMethod, isLegacyQuery, isNaN, isPageOutOfRangeError, isQuery, isQueryCollection, isQueryErrorResponse, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyListError, isSymfonyPagerfantaOutOfRangeError, isUnderInvalidatedUrl, legacyPrepareWithoutInjectionContext, mapToPaginated, mapViolationsToFormErrors, maybeExecute, mergeHeaders, nestedEffect, numberArrayQueryField, pagedQueryStackNextPageCalledWithoutPreviousPage, pagedQueryStackPageBiggerThanTotalPages, pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToTitleEn, pathParamsMissingInRouteFunctionError, provideInfinityQueryResponseDelay, provideLegacyPrepareFallback, provideQueryClientForDevtools, provideQueryDevtools, queryArrayComputed, queryBatchAlreadyRunning, queryBatchWithArgsUsed, queryClientFeatureUsedMultipleTimes, queryComputed, queryComputedTillTruthy, queryCreatedInReactiveContext, queryErrorMessage, queryErrorMessages, queryExecute, queryExecutedAfterDestroyMessage, queryExecutedWhileParkedMessage, queryFeatureUsedMultipleTimes, queryField, querySequence, querySequenceAlreadyRunning, queryStackWithArgsUsed, queryStackWithResponseUpdateUsed, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, queryStateErrorSignal, queryStateLoadingSignal, queryStateResponseSignal, queryStateSignal, recordExecutionArgs, registerQueryErrorParser, removeFrom, request, resetExecuteState, resetPageOnError, resolveInvalidationUrl, resolveQueryHeaders, searchQueryField, serializeBody, setQueryDevtoolsTokenTtl, setQueryDevtoolsUiMounted, setupQueryExecuteState, setupQueryState, shouldAutoExecuteGqlQuery, shouldAutoExecuteQuery, shouldCacheQuery, shouldRetryRequest, silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent, skipPaginationPageParamCalculator, skipParkedExecution, sortQueryField, splitQueryConfig, stringArrayQueryField, switchQueryCollectionState, switchQueryState, symfonyQueryErrorParser, tableSortQueryField, takeUntilResponse, toQuerySignal, toQuerySubject, tokensNotAvailableInsideAuthAndExec, transformArrayResponse, transformExecStateToQueryState, transformGql, transformMethod, transformPaginatedResponse, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray, transformToTableSort, transformToTableSortQueryParam, uncacheableRequestHasAllowCacheParam, uncacheableRequestHasCacheKeyParam, unwrapGqlResponseWithErrors, unwrapQuerySyncMessage, v2BuildQueryCacheKey, v2ExtractExpiresInSeconds, v2ShouldCacheQuery, v2ShouldRetryRequest, validateWithQuery, validateWithV2Query, withArgs, withArgsQueryFeatureMissingButRouteIsFunction, withAuthenticationQuery, withAutoRefresh, withAutoRefreshUsedInManualQuery, withAutoRefreshUsedOnUnsupportedHttpMethod, withBearerAuthMultiTabSync, withDefaultRetry, withErrorHandling, withEthleteApiErrors, withHtmlErrorParsing, withInactivityLogout, withLogging, withLongPolling, withLongPollingUsedOnUnsupportedHttpMethod, withLongPollingUsedWithPolling, withMultiTabSync, withOptimisticUpdate, withOptimisticUpdateUsedOnRead, withPageResetOnError, withPersistentAuth, withPolling, withPollingUsedOnUnsupportedHttpMethod, withQueryPersistence, withRefreshQuery, withResponseUpdate, withSuccessHandling, withSymfonyErrors, withTokenExpirationWarning, withTokenRevocation, withTracking, wrapAsObservableSignal, wrapQuerySyncMessage, 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 };
10094
+ export type { AnyBearerAuthProvider, AnyCreateBearerAuthProviderResult, AnyCreateGqlQueryCreatorOptions, AnyCreateQueryClientResult, AnyGqlQueryConfig, AnyInfinityQuery, AnyInfinityQueryConfig, AnyLegacyQuery, AnyLegacyQueryCreator, AnyNewQuery, AnyPagedQueryStack, AnyQueryBatch, AnyQueryBatchItemResult, AnyQueryBuilder, AnyQueryClient, AnyQueryCollection, AnyQueryCollectionData, AnyQueryCollectionResponse, AnyQueryCreator, AnyQueryCreatorCollection, AnyQueryForm, AnyQueryGroup, AnyQuerySnapshot, AnyQueryStack, AnyRestQueryConfig, AnyRoute, AnyV2Query, AnyV2QueryCreator, AnyWebSocketClient, AppendItemsLocation, ApplyExternalResponseOptions, ApplyPersistedResponseOptions, AuthGuard, AuthGuardConfig, AuthGuardPermission, AuthGuardPermissionOptions, AuthGuardTarget, AuthProvider, AuthProviderBasicConfig, AuthProviderBearerConfig, AuthProviderCustomHeaderConfig, AuthQueryBuilder, AuthQueryConfig, BaseArguments, BaseQueryCreatorFactoryOptions, BaseQueryCreatorOptions, BaseQueryCreatorOptionsSubtle, BearerAuthActivityCoordination, BearerAuthExecutionState, BearerAuthExecutionStateError, BearerAuthExecutionStateLoading, BearerAuthExecutionStateLogout, BearerAuthExecutionStateSuccess, BearerAuthExecutionStateTokenSeed, BearerAuthFeature, BearerAuthMultiTabSyncConfig, BearerAuthMultiTabSyncFeature, BearerAuthProvider, BearerAuthProviderEarlySetup, BearerAuthProviderEarlySetupContext, BearerAuthProviderEarlySetupResult, BearerAuthProviderFeatureContext, BearerAuthProviderOf, BearerAuthProviderQueryContext, BearerAuthProviderRef, BearerAuthProviderTokens, BearerAuthRefreshCoordination, BearerAuthSession, BearerAuthSessionAdoption, BearerAuthSessionEndCause, BearerAuthSessionStatus, BearerRefreshConfig, BodyType, BuildQueryStringConfig, CacheAdapterFn, Cancelled, ClassValidatorError, ConstructQuery, CreateBaseQueryOptions, CreateBearerAuthProviderConfig, CreateGqlQueryCreatorOptions, CreateGqlQueryExecuteOptions, CreateGqlQueryOptions, CreateHttpRequestDependencies, CreateHttpRequestOptions, CreateIndexedDbQueryPersistenceAdapterOptions, CreateLegacyQueryCreatorOptions, CreateLegacyQueryOptions, CreatePagedQueryStackOptions, CreateQueryBatchOptions, CreateQueryClientConfigOptions, CreateQueryCreatorOptions, CreateQueryExecuteOptions, CreateQueryObjectOptions, CreateQueryOptions, CreateQueryPersistenceEngineOptions, CreateQueryRepositoryConfig, CreateQuerySnapshotOptions, CreateQueryStackOptions, CreateQuerySubmissionConfig, CreateQuerySyncEngineOptions, CreateSecureGqlQueryExecuteOptions, CreateSecureGqlQueryOptions, CreateSecureQueryExecuteOptions, CreateSecureQueryOptions, CreateWebSocketClientConfigOptions, CreateWebSocketClientTransport, DateQueryFieldConfig, DateStringQueryFieldConfig, DefaultRetryOptions, DefineQueryFormConfig, DestroyCleanupCallback, EmptyObject, EntityGetParams, EntityIdParams, EntityKey, EntitySetParams, EntityStoreConfig, ExecuteFactory, ExecuteQueryOptions, ExtractQueryArgs, ExtractQueryKey, Failure, FeatureRegistry, GQL, GqlDataWithErrors, GqlEnvelope, GqlError, GqlQueryArgs, GqlQueryConfig, GqlQueryConfigWithoutMethod, GqlQueryMethod, GqlQueryTransport, GqlRawResponseType, GqlTransferOption, GqlTransformer, GqlVariablesType, HttpCancelEvent, HttpErrorEvent, HttpRequest, HttpRequestLoadingProgressState, HttpRequestLoadingState, HttpRequestResponseType, HttpRequestRetryState, HttpRequestSubtle, HttpRequestTransferCacheConfig, InactivityLogoutConfig, InactivityLogoutFeature, InfinityQueryConfig, InfinityQueryConfigType, InfinityQueryOf, InfinityQueryParamLocation, InsertFromConfig, InternalCreateGqlQueryCreatorOptions, InternalCreateQueryCreatorOptions, InternalQueryExecute, InternalSecureCreateGqlQueryCreatorOptions, InternalSecureCreateQueryCreatorOptions, InternalWebSocketRoom, LeaderInstanceCountChangeEventData, LeaderStatusChangeEventData, LegacyArgumentsOfQueryArgs, LegacyQueryPrepareFn, Loading, LogoutEventData, MapViolationsToFormErrorsOptions, Method, ObservableSignal, OptimisticUpdateContext, OptionalQueryFieldOptions, PageParamCalculatorOptions, PagedQueryStack, PagedQueryStackDirection, PagedQueryStackExecuteOptions, PagedQueryStackResetOptions, PartialXhrState, PathParams, PathParamsType, PersistedQueryBody, PersistedQueryEntry, PersistedQueryEntryMeta, PersistentAuthConfig, PersistentAuthFeature, PollConfig, Prepared, Query, QueryArgs, QueryArgsOf, QueryArgsOfLegacyArguments, QueryAutoRefreshConfig, QueryBase, QueryBatch, QueryBatchDevtoolsHandle, QueryBatchItemCancelled, QueryBatchItemError, QueryBatchItemResult, QueryBatchItemSkipped, QueryBatchItemSuccess, QueryBatchResult, QueryBatchStatus, QueryBeforeExecuteFn, QueryClient, QueryClientDevtoolsOptions, QueryClientErrorPipelineFeature, QueryClientFeature, QueryClientFeatureContext, QueryClientFeatureFn, QueryClientMultiTabSyncFeature, QueryClientPersistenceFeature, QueryClientRef, QueryClientSubtle, QueryCollectionKeysOf, QueryCollectionOf, QueryCollectionWithNullableQuery, QueryConfig, QueryConfigBase, QueryConfigWithoutMethod, QueryContainerConfig, QueryCreator, QueryCreatorInput, QueryDataOf, QueryDependencies, QueryDevtoolsApiEnv, QueryDevtoolsApiEnvSwitch, QueryDevtoolsAppInfo, QueryDevtoolsAuthAccount, QueryDevtoolsAuthField, QueryDevtoolsFeatureDescriber, QueryDevtoolsFeatureDetail, QueryDevtoolsOptions, QueryDevtoolsSchemaLoader, QueryDevtoolsSchemaLoaders, QueryDirectiveContext, QueryDirectiveType, QueryEntityConfig, QueryErrorParser, QueryErrorResponse, QueryErrorResponseItem, QueryErrorResponseList, QueryErrorResponseSingle, QueryExecute, QueryExecuteArgs, QueryExecuteEventData, QueryExecuteOptions, QueryExecuteState, QueryExecutionState, QueryExecutionStateFailure, QueryExecutionStateFailureWithCachedResponse, QueryExecutionStateFailureWithNoResponse, QueryExecutionStateLoading, QueryExecutionStateLoadingWithCachedResponse, QueryExecutionStateLoadingWithNoResponse, QueryExecutionStateSuccess, QueryFailureEventData, QueryFeature, QueryFeatureContext, QueryFeatureFlags, QueryFeatureFn, QueryFieldConfig, QueryFieldDef, QueryFieldOptions, QueryFieldValue, QueryFilterConfig, QueryFormBranch, QueryFormBranchWriteOptions, QueryFormChange, QueryFormFields, QueryFormGroup, QueryFormGroupControls, QueryFormModel, QueryFormObserveOptions, QueryFormOf, QueryFormOptions, QueryFormPersistence, QueryFormSignals, QueryFormSignalsObserveOptions, QueryFormSignalsWriteOptions, QueryFormStorage, QueryFormValue, QueryFormValueEvent, QueryFormWriteOptions, QueryGroup, QueryGroupLatest, QueryGroupMembers, QueryGroupSuccess, QueryHeaders, QueryHeadersInput, QueryInvalidatesContext, QueryInvalidatesOption, QueryInvalidationCandidate, QueryInvalidationFilterFn, QueryInvalidationOptions, QueryInvalidationTarget, QueryInvalidationUrl, QueryKey, QueryKeyLockHold, QueryKeyLockHoldOptions, QueryKeyLockManager, QueryKeyLockState, QueryMethod, QueryMockConfig, QueryMultiTabSyncConfig, QueryOf, QueryParams, QueryParamsType, QueryPersistenceAdapter, QueryPersistenceCandidate, QueryPersistenceConfig, QueryPersistenceEngine, QueryPrepareFn, QueryRefreshCause, QueryRegistry, QueryRegistryEntry, QueryRepository, QueryRepositoryCacheEntry, QueryRepositoryDependencies, QueryRepositoryEntryDestroyedCause, QueryRepositoryEvent, QueryRepositoryItem, QueryRepositoryRefreshFilterFn, QueryRepositoryRequestOptions, QueryRepositorySubtle, QueryResponseOf, QueryRouteOf, QuerySequence, QuerySequenceResult, QuerySequenceStatus, QuerySequenceStepArgs, QuerySnapshot, QueryStack, QueryStackSubtle, QueryState, QueryStateMeta, QueryStateResponseOf, QueryStateSignal, QueryStateSubtle, QueryStateSuccessMeta, QueryStoreIdOf, QueryStoreOf, QuerySubmissionRef, QuerySubtle, QuerySuccessEventData, QuerySyncEngine, QuerySyncEnvelope, QuerySyncInvalidateMessage, QuerySyncMessage, QuerySyncMessageListener, QuerySyncMutation, QuerySyncMutationFilterFn, QuerySyncMutationMessage, QuerySyncRefreshCandidate, QuerySyncRefreshOnMutationConfig, QuerySyncResponseMessage, QuerySyncTransport, QueryTagsContext, QueryTagsOption, QueryTrigger, RawResponseType, ReadonlyQuery, RefreshFailure, RemoveFromConfig, RequestArgs, RequestConfig, RequestError, RequestEvent, RequestHeaders, RequestHeadersMethodMap, RequestHttpEvent, RequestProgress, RequestRetryFn, RequestRetryFnConfig, RequestRetryFnResult, RequiresTransform, ResetExecuteStateOptions, ResetPageOnErrorOperatorConfig, ResponseType, RestQueryConfig, RouteString, RouteType, RunQueryCreator, RunQueryExecuteOptions, SecureExecuteFactoryOptions, ServerValidationError, ServerViolationValidationError, SetupQueryDependenciesOptions, SetupQueryStateOptions, ShouldRetryRequestFn, ShouldRetryRequestOptions, ShouldRetryRequestResult, SocketMessageView, Sort, SortDirection, Success, SymfonyError, SymfonyErrorTrace, TableSortEntry, TokenExpirationWarningConfig, TokenExpirationWarningFeature, TokenRefreshEventData, TokenRefreshQueryBuilder, TokenRefreshQueryConfig, TokenResponse, TokenRevocationConfig, TokenRevocationFeature, TotalPagesExtractorOptions, TrackingConfig, TrackingEventDataMap, TrackingEventHandler, TrackingEventName, TrackingFeature, TransformedGqlQuery, V2CacheAdapterFn, V2PrepareArgsOf, V2QueryArgsOf, V2QueryClientConfig, V2QueryConfig, V2QueryState, V2RouteString, V2RouteType, ValidateWithQueryConfig, ValidateWithV2QueryConfig, WebSocketClient, WebSocketClientAuth, WebSocketClientIo, WebSocketClientIoOptions, WebSocketClientResult, WebSocketClientSocket, WebSocketClientSubtle, WebSocketDevtoolsHandle, WebSocketDevtoolsMessage, WebSocketRoom, WithArgsCheck, WithArgsQueryFeature, WithAutoRefreshFeatureOptions, WithBody, WithConfig, WithErrorHandlingFeatureOptions, WithHeaders, WithInjector, WithLegacyConfig, WithLoggingFeatureOptions, WithLongPollingFeatureOptions, WithMock, WithOptimisticUpdateOptions, WithPageResetOnErrorFeatureOptions, WithPathParams, WithPollingFeatureOptions, WithQueryParams, WithResponseUpdateFeatureFnData, WithResponseUpdateFeatureOptions, WithSuccessHandlingFeatureOptions, WithVariables, DescribableFeature as ɵDescribableFeature, JsonPath as ɵJsonPath, OverrideOp as ɵOverrideOp, QueryDevtoolsAbout as ɵQueryDevtoolsAbout, QueryDevtoolsAuthAccountView as ɵQueryDevtoolsAuthAccountView, QueryDevtoolsAuthLocalAccount as ɵQueryDevtoolsAuthLocalAccount, QueryDevtoolsAuthProviderHandle as ɵQueryDevtoolsAuthProviderHandle, QueryDevtoolsAuthProviderRegistration as ɵQueryDevtoolsAuthProviderRegistration, QueryDevtoolsAuthQuery as ɵQueryDevtoolsAuthQuery, QueryDevtoolsAuthSeed as ɵQueryDevtoolsAuthSeed, QueryDevtoolsAuthSession as ɵQueryDevtoolsAuthSession, QueryDevtoolsEntry as ɵQueryDevtoolsEntry, QueryDevtoolsEntryKind as ɵQueryDevtoolsEntryKind, QueryDevtoolsEntryMeta as ɵQueryDevtoolsEntryMeta, QueryDevtoolsFault as ɵQueryDevtoolsFault, QueryDevtoolsFaultTarget as ɵQueryDevtoolsFaultTarget, QueryDevtoolsFeature as ɵQueryDevtoolsFeature, QueryDevtoolsFormField as ɵQueryDevtoolsFormField, QueryDevtoolsFormHandle as ɵQueryDevtoolsFormHandle, QueryDevtoolsFormLinksHandle as ɵQueryDevtoolsFormLinksHandle, QueryDevtoolsFormLinksRecorder as ɵQueryDevtoolsFormLinksRecorder, QueryDevtoolsMock as ɵQueryDevtoolsMock, QueryDevtoolsMockTarget as ɵQueryDevtoolsMockTarget, QueryDevtoolsOverrideEntry as ɵQueryDevtoolsOverrideEntry, QueryDevtoolsOverrideTransfer as ɵQueryDevtoolsOverrideTransfer, QueryDevtoolsOverrideTransferParse as ɵQueryDevtoolsOverrideTransferParse, QueryDevtoolsOverridesHandle as ɵQueryDevtoolsOverridesHandle, QueryDevtoolsOverridesRecorder as ɵQueryDevtoolsOverridesRecorder, QueryDevtoolsPayload as ɵQueryDevtoolsPayload, QueryDevtoolsRegistrar as ɵQueryDevtoolsRegistrar, QueryDevtoolsRegistration as ɵQueryDevtoolsRegistration, QueryDevtoolsResolvedFault as ɵQueryDevtoolsResolvedFault, QueryDevtoolsResolvedMock as ɵQueryDevtoolsResolvedMock, QueryDevtoolsRoutePart as ɵQueryDevtoolsRoutePart, QueryDevtoolsRun as ɵQueryDevtoolsRun, QueryDevtoolsRunError as ɵQueryDevtoolsRunError, QueryDevtoolsRunStatus as ɵQueryDevtoolsRunStatus, QueryDevtoolsSchemaComponents as ɵQueryDevtoolsSchemaComponents, QueryDevtoolsSchemaRoute as ɵQueryDevtoolsSchemaRoute, QueryDevtoolsSchemaSeed as ɵQueryDevtoolsSchemaSeed, QueryDevtoolsSchemaState as ɵQueryDevtoolsSchemaState, QueryDevtoolsSeedStyle as ɵQueryDevtoolsSeedStyle, QueryDevtoolsSettings as ɵQueryDevtoolsSettings, QueryDevtoolsStats as ɵQueryDevtoolsStats, QueryDevtoolsStatsHandle as ɵQueryDevtoolsStatsHandle, QueryDevtoolsStatsRecorder as ɵQueryDevtoolsStatsRecorder, QueryDevtoolsStorageScope as ɵQueryDevtoolsStorageScope, RestoredQueryDevtoolsOverrides as ɵRestoredQueryDevtoolsOverrides };