@ethlete/query 6.0.0-next.51 → 6.0.0-next.52

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.
Files changed (31) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/fesm2022/ethlete-query-ngrx-toolkit.mjs +321 -0
  3. package/fesm2022/ethlete-query-ngrx-toolkit.mjs.map +1 -0
  4. package/fesm2022/ethlete-query.mjs +340 -136
  5. package/fesm2022/ethlete-query.mjs.map +1 -1
  6. package/generators/generators.json +5 -0
  7. package/generators/migrate-from-ngrx-toolkit/args-assignability.js +140 -0
  8. package/generators/migrate-from-ngrx-toolkit/consumers.js +453 -0
  9. package/generators/migrate-from-ngrx-toolkit/creators.js +301 -0
  10. package/generators/migrate-from-ngrx-toolkit/facade.js +295 -0
  11. package/generators/migrate-from-ngrx-toolkit/feature.js +513 -0
  12. package/generators/migrate-from-ngrx-toolkit/migration.js +139 -0
  13. package/generators/migrate-from-ngrx-toolkit/report.js +154 -0
  14. package/generators/migrate-from-ngrx-toolkit/schema.json +42 -0
  15. package/generators/migrate-from-ngrx-toolkit/store-removal.js +633 -0
  16. package/generators/migrate-from-ngrx-toolkit/ts-edits.js +128 -0
  17. package/generators/migrate-query-opt-in-features/migration.js +10 -9
  18. package/generators/migrate-to-query-v3/auth-provider-scaffold.js +29 -2
  19. package/generators/migrate-to-query-v3/cleanup-migration.js +22 -1
  20. package/generators/migrate-to-query-v3/legacy-query-creator-migration.js +39 -2
  21. package/generators/migrate-to-query-v3/migration.js +2 -1
  22. package/generators/migrate-to-query-v3/module-graph.js +2 -0
  23. package/generators/migrate-to-query-v3/query-client-migration.js +71 -2
  24. package/generators/migrate-to-query-v3/shared.js +27 -0
  25. package/generators/prep-for-query-v3/migration.js +83 -1
  26. package/migrations/query-field-default-types.md +43 -0
  27. package/migrations/search-query-field-string.md +43 -0
  28. package/migrations.json +16 -0
  29. package/package.json +5 -1
  30. package/types/ethlete-query-ngrx-toolkit.d.ts +143 -0
  31. package/types/ethlete-query.d.ts +129 -34
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, ApplicationRef, untracked, effect, Injector, runInInjectionContext, DestroyRef, computed, InjectionToken, EnvironmentInjector, ElementRef, ErrorHandler, createEnvironmentInjector, signal, linkedSignal, isDevMode, PLATFORM_ID, resource, DOCUMENT, VERSION, provideEnvironmentInitializer, CSP_NONCE, afterNextRender, makeEnvironmentProviders, assertInInjectionContext, ChangeDetectorRef, ViewContainerRef, TemplateRef, Input, Directive, input, Pipe, ViewEncapsulation, Component, NgZone } from '@angular/core';
3
3
  import { UrlTree, Router, RedirectCommand, ActivatedRoute } from '@angular/router';
4
- import { Observable, defer, from, filter, Subject, Subscription, throwError, of, timer, switchMap, tap, retry, catchError, EMPTY as EMPTY$1, take, takeUntil, finalize, mergeMap, toArray, map, race, NEVER, merge, takeWhile, firstValueFrom, concatMap, fromEvent, throttleTime, interval, startWith, pairwise, BehaviorSubject, combineLatest, ReplaySubject, distinctUntilChanged, shareReplay, withLatestFrom, debounceTime } from 'rxjs';
4
+ import { Observable, defer, from, filter, Subject, Subscription, throwError, of, timer, switchMap, tap, retry, catchError, EMPTY as EMPTY$1, take, takeUntil, finalize, mergeMap, toArray, map, race, NEVER, merge, takeWhile, defaultIfEmpty, firstValueFrom, concatMap, fromEvent, throttleTime, interval, startWith, pairwise, BehaviorSubject, combineLatest, ReplaySubject, distinctUntilChanged, shareReplay, withLatestFrom, debounceTime } from 'rxjs';
5
5
  import { defineStaticProvider, RuntimeError, clamp, randomId, defineRootProvider, isObject, injectUnsavedChangesCoordinator, injectRoute, getCookie, setCookie, deleteCookie, CORE_VERSION, createDestroy, computedTillTruthy, defineProvider, toProvideFn, toInjectFn, nextFrame, injectQueryParams, injectQueryParamChanges, clone, equal, ET_PROPERTY_REMOVED, previousSignalValue } from '@ethlete/core';
6
- import { HttpClient, HttpErrorResponse, HttpEventType, HttpHeaders, HttpResponse, HttpStatusCode } from '@angular/common/http';
6
+ import { getActiveConsumer, setActiveConsumer, SIGNAL, createWatch } from '@angular/core/primitives/signals';
7
+ import { HttpClient, HttpErrorResponse, HttpEventType, HttpHeaders, HttpContextToken, HttpContext, HttpResponse, HttpStatusCode } from '@angular/common/http';
7
8
  import { toObservable, takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
8
- import { getActiveConsumer, setActiveConsumer, SIGNAL } from '@angular/core/primitives/signals';
9
9
  import { isPlatformBrowser, NgClass, AsyncPipe, JsonPipe } from '@angular/common';
10
10
  import { validateAsync, form } from '@angular/forms/signals';
11
11
  import * as i1 from '@angular/forms';
@@ -468,7 +468,7 @@ const wrapAsObservableSignal = (source, defaultInjector) => {
468
468
  const existing = overrides.get(injector);
469
469
  if (existing)
470
470
  return existing;
471
- const override$ = toObservable(source, { injector }).pipe(takeUntilDestroyed(defaultInjector.get(DestroyRef)));
471
+ const override$ = untracked(() => toObservable(source, { injector }).pipe(takeUntilDestroyed(defaultInjector.get(DestroyRef))));
472
472
  overrides.set(injector, override$);
473
473
  return override$;
474
474
  };
@@ -532,6 +532,7 @@ const setupQueryDependencies = (options) => {
532
532
  const QueryRuntimeErrorCode = {
533
533
  // Query
534
534
  QUERY_FEATURE_USED_MULTIPLE_TIMES: 0,
535
+ QUERY_CREATED_IN_REACTIVE_CONTEXT: 1,
535
536
  // Query features
536
537
  WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION: 100,
537
538
  WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD: 101,
@@ -580,8 +581,11 @@ const QueryRuntimeErrorCode = {
580
581
  const queryFeatureUsedMultipleTimes = (type) => {
581
582
  return new RuntimeError(QueryRuntimeErrorCode.QUERY_FEATURE_USED_MULTIPLE_TIMES, `The query feature "${type}()" was used multiple times.`);
582
583
  };
584
+ const queryCreatedInReactiveContext = () => {
585
+ return new RuntimeError(QueryRuntimeErrorCode.QUERY_CREATED_IN_REACTIVE_CONTEXT, `A query was created inside a reactive context (a computed, an effect or a template). Every re-run would create another query that lives until its injector is destroyed. Create the query in a field initializer or constructor and change its args instead.`);
586
+ };
583
587
  const withArgsQueryFeatureMissingButRouteIsFunction = () => {
584
- return new RuntimeError(QueryRuntimeErrorCode.WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION, `This queries route is a function, but a "withArgs()" feature is missing.`);
588
+ return new RuntimeError(QueryRuntimeErrorCode.WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION, `This queries route is a function, but a "withArgs()" feature is missing. Mutations need one too: create the query with "withArgs(() => ({ body: form.value() }))", then call ".execute()". The "silenceMissingWithArgsFeatureError" config is an escape hatch for args that only exist at call time.`);
585
589
  };
586
590
  const withPollingUsedOnUnsupportedHttpMethod = (method) => {
587
591
  return new RuntimeError(QueryRuntimeErrorCode.WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD, `This is a "${method}" request, "withPolling()" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`);
@@ -757,8 +761,8 @@ const createQueryFeature = (config) => {
757
761
  * A query feature that allows you to set the arguments of the query.
758
762
  * The arguments are read within a computed function, so you can use reactive values.
759
763
  *
760
- * Return `null` to park the query: its args are reset to `null`, and polling and auto refresh
761
- * pause until args are set again.
764
+ * Return `null` to park the query: it is reset (`response()` and `executionState()` become `null`),
765
+ * and polling and auto refresh pause until args are set again.
762
766
  *
763
767
  * Changing arguments will automatically trigger a new execution of the query if it is eligible for auto execution (e.g. a GET request).
764
768
  */
@@ -774,10 +778,16 @@ const withArgs = (args) => {
774
778
  // Trigger (auto-)execution whenever the resolved args change.
775
779
  nestedEffect(() => {
776
780
  const currArgsNow = context.state.args();
777
- if (currArgsNow === null)
781
+ if (currArgsNow === null) {
782
+ untracked(() => {
783
+ if (context.state.subtle.request() !== null || context.state.loading() !== null)
784
+ context.execute.reset();
785
+ });
778
786
  return;
787
+ }
779
788
  untracked(() => {
780
- if (context.flags.shouldAutoExecute)
789
+ const guard = context.state.subtle.autoExecuteGuard();
790
+ if (context.flags.shouldAutoExecute && (guard === null || guard()))
781
791
  context.execute({ args: currArgsNow });
782
792
  });
783
793
  }, { injector: context.deps.injector });
@@ -805,6 +815,7 @@ const withPolling = (options) => {
805
815
  { label: 'interval', value: formatQueryDevtoolsDuration(untracked(() => readPollingInterval(options.interval))) },
806
816
  { label: 'execute initially', value: options.executeInitially ? 'yes' : 'no' },
807
817
  ...(options.pauseWhileHidden ? [{ label: 'pause while hidden', value: 'yes' }] : []),
818
+ ...(options.enabled ? [{ label: 'enabled', value: untracked(options.enabled) ? 'yes' : 'no' }] : []),
808
819
  ...(options.refetchOnFocus ? [{ label: 'refetch on focus', value: 'yes' }] : []),
809
820
  ...(options.refetchOnReconnect ? [{ label: 'refetch on reconnect', value: 'yes' }] : []),
810
821
  ],
@@ -850,7 +861,8 @@ const withPolling = (options) => {
850
861
  });
851
862
  }
852
863
  const currentInterval = () => untracked(() => readPollingInterval(options.interval));
853
- const isPaused = () => options.pauseWhileHidden === true && document.hidden;
864
+ const isEnabled = () => (options.enabled ? untracked(options.enabled) : true);
865
+ const isPaused = () => (options.pauseWhileHidden === true && document.hidden) || !isEnabled();
854
866
  const stop = () => {
855
867
  if (intervalId !== null)
856
868
  clearInterval(intervalId);
@@ -865,7 +877,7 @@ const withPolling = (options) => {
865
877
  // mid-flight needs no restart and `executeInitially`/interval semantics stay identical.
866
878
  if (hold && !hold.isHolder())
867
879
  return;
868
- context.execute({ args: currentArgs });
880
+ context.execute({ args: currentArgs, options: { triggeredBy: 'polling' } });
869
881
  };
870
882
  const schedule = (firstDelay) => {
871
883
  stop();
@@ -898,7 +910,7 @@ const withPolling = (options) => {
898
910
  if (isPaused())
899
911
  lastTickAt -= currentInterval();
900
912
  else if (!hold || hold.isHolder())
901
- context.execute({ args });
913
+ context.execute({ args, options: { triggeredBy: 'polling' } });
902
914
  }
903
915
  schedule(currentInterval());
904
916
  });
@@ -914,21 +926,29 @@ const withPolling = (options) => {
914
926
  });
915
927
  }, { injector: context.deps.injector });
916
928
  }
929
+ const resumeOrStop = () => {
930
+ if (!active)
931
+ return;
932
+ if (isPaused()) {
933
+ stop();
934
+ }
935
+ else if (intervalId === null && timeoutId === null) {
936
+ schedule(remainingDelay());
937
+ }
938
+ };
939
+ if (options.enabled) {
940
+ const enabled = options.enabled;
941
+ nestedEffect(() => {
942
+ enabled();
943
+ untracked(resumeOrStop);
944
+ }, { injector: context.deps.injector });
945
+ }
917
946
  const listen = (target, type, listener) => {
918
947
  target.addEventListener(type, listener);
919
948
  context.deps.destroyRef.onDestroy(() => target.removeEventListener(type, listener));
920
949
  };
921
950
  if (options.pauseWhileHidden) {
922
- listen(document, 'visibilitychange', () => {
923
- if (!active)
924
- return;
925
- if (document.hidden) {
926
- stop();
927
- }
928
- else if (intervalId === null && timeoutId === null) {
929
- schedule(remainingDelay());
930
- }
931
- });
951
+ listen(document, 'visibilitychange', resumeOrStop);
932
952
  }
933
953
  const refetchNow = () => {
934
954
  if (!active || isPaused())
@@ -976,6 +996,7 @@ const withLongPolling = (options) => {
976
996
  type: QueryFeatureType.WITH_LONG_POLLING,
977
997
  devtools: () => [
978
998
  { label: 'delay', value: formatQueryDevtoolsDuration(options.delay ?? DEFAULT_LONG_POLLING_DELAY) },
999
+ ...(options.enabled ? [{ label: 'enabled', value: untracked(options.enabled) ? 'yes' : 'no' }] : []),
979
1000
  ...queryDevtoolsFnDetail(options.nextArgs, 'nextArgs'),
980
1001
  ],
981
1002
  fn: (context) => {
@@ -992,16 +1013,31 @@ const withLongPolling = (options) => {
992
1013
  context.state.subtle.defaultRunOptions.set({ keepUnusedFor: 0 });
993
1014
  let timeoutId = null;
994
1015
  let consecutiveErrors = 0;
995
- const stop = () => {
1016
+ let nextRound = null;
1017
+ const isEnabled = () => (options.enabled ? untracked(options.enabled) : true);
1018
+ if (options.enabled)
1019
+ context.state.subtle.autoExecuteGuard.set(isEnabled);
1020
+ const clearTimer = () => {
996
1021
  if (timeoutId !== null)
997
1022
  clearTimeout(timeoutId);
998
1023
  timeoutId = null;
999
1024
  };
1025
+ const stop = () => {
1026
+ clearTimer();
1027
+ nextRound = null;
1028
+ };
1029
+ const runRound = (args) => {
1030
+ nextRound = null;
1031
+ context.execute({ args, options: { triggeredBy: 'long-polling' } });
1032
+ };
1000
1033
  const schedule = (args, wait) => {
1001
- stop();
1034
+ clearTimer();
1035
+ nextRound = { args };
1036
+ if (!isEnabled())
1037
+ return;
1002
1038
  timeoutId = setTimeout(() => {
1003
1039
  timeoutId = null;
1004
- context.execute({ args, options: { triggeredBy: 'long-polling' } });
1040
+ runRound(args);
1005
1041
  }, wait);
1006
1042
  };
1007
1043
  // The chain never writes `state.args`, so what a round was sent with lives on the request itself -
@@ -1036,12 +1072,35 @@ const withLongPolling = (options) => {
1036
1072
  const hasChanged = hasSeenArgs && args !== seenArgs;
1037
1073
  hasSeenArgs = true;
1038
1074
  seenArgs = args;
1039
- if (!hasChanged)
1040
- return;
1041
- consecutiveErrors = 0;
1042
- stop();
1075
+ if (hasChanged) {
1076
+ consecutiveErrors = 0;
1077
+ stop();
1078
+ }
1079
+ const autoStarts = context.flags.shouldAutoExecute && (args !== null || !context.flags.hasWithArgsFeature);
1080
+ if (autoStarts && !isEnabled() && nextRound === null)
1081
+ nextRound = { args };
1043
1082
  });
1044
1083
  }, { injector: context.deps.injector });
1084
+ if (options.enabled) {
1085
+ const enabled = options.enabled;
1086
+ nestedEffect(() => {
1087
+ const on = enabled();
1088
+ untracked(() => {
1089
+ if (!on) {
1090
+ if (timeoutId !== null)
1091
+ return clearTimer();
1092
+ const request = context.state.subtle.request();
1093
+ if (!request?.loading())
1094
+ return;
1095
+ nextRound = { args: request.args };
1096
+ request.subtle.abort();
1097
+ }
1098
+ else if (nextRound !== null && timeoutId === null) {
1099
+ runRound(nextRound.args);
1100
+ }
1101
+ });
1102
+ }, { injector: context.deps.injector });
1103
+ }
1045
1104
  context.deps.destroyRef.onDestroy(stop);
1046
1105
  },
1047
1106
  });
@@ -1100,6 +1159,7 @@ const withAutoRefresh = (options) => {
1100
1159
  devtools: () => [
1101
1160
  { label: 'signals', value: String(options.onSignalChanges.length) },
1102
1161
  ...(options.ignoreOnlyManualExecution ? [{ label: 'ignores manual only', value: 'yes' }] : []),
1162
+ ...(options.enabled ? [{ label: 'enabled', value: untracked(options.enabled) ? 'yes' : 'no' }] : []),
1103
1163
  ],
1104
1164
  fn: (context) => {
1105
1165
  if (!context.flags.shouldAutoExecuteMethod) {
@@ -1113,12 +1173,14 @@ const withAutoRefresh = (options) => {
1113
1173
  signal();
1114
1174
  }
1115
1175
  untracked(() => {
1176
+ if (options.enabled && !options.enabled())
1177
+ return;
1116
1178
  const args = context.state.args();
1117
1179
  // Don't start polling if the query doesn't have args.
1118
1180
  // It should have args because a withArgs feature is present.
1119
1181
  if (args === null && context.flags.hasWithArgsFeature)
1120
1182
  return;
1121
- context.execute({ args });
1183
+ context.execute({ args, options: { triggeredBy: 'auto-refresh' } });
1122
1184
  });
1123
1185
  }, { injector: context.deps.injector });
1124
1186
  },
@@ -1402,11 +1464,19 @@ const neverRetry = () => ({ retry: false });
1402
1464
  const setupQueryState = (options) => {
1403
1465
  const request = signal(null, /* @ts-ignore */
1404
1466
  ...(ngDevMode ? [{ debugName: "request" }] : /* istanbul ignore next */ []));
1405
- const rawResponse = linkedSignal(() => {
1406
- const raw = request()?.response() ?? null;
1407
- return options.devtoolsOverrides ? options.devtoolsOverrides.apply(raw) : raw;
1408
- }, /* @ts-ignore */
1409
- ...(ngDevMode ? [{ debugName: "rawResponse" }] : /* istanbul ignore next */ []));
1467
+ const rawResponse = linkedSignal({ ...(ngDevMode ? { debugName: "rawResponse" } : /* istanbul ignore next */ {}), source: () => {
1468
+ const current = request();
1469
+ const raw = current?.response() ?? null;
1470
+ return {
1471
+ request: current,
1472
+ raw: options.devtoolsOverrides ? options.devtoolsOverrides.apply(raw) : raw,
1473
+ settled: current?.currentEvent()?.type === HttpEventType.Response,
1474
+ };
1475
+ },
1476
+ computation: (current, previous) => {
1477
+ const carriesPrevious = options.keepPreviousResponse && current.request !== null && current.raw === null && !current.settled;
1478
+ return carriesPrevious ? (previous?.value ?? null) : current.raw;
1479
+ } });
1410
1480
  const transformed = computed(() => {
1411
1481
  const raw = rawResponse();
1412
1482
  if (raw === null)
@@ -1457,6 +1527,8 @@ const setupQueryState = (options) => {
1457
1527
  };
1458
1528
  const defaultRunOptions = signal(null, /* @ts-ignore */
1459
1529
  ...(ngDevMode ? [{ debugName: "defaultRunOptions" }] : /* istanbul ignore next */ []));
1530
+ const autoExecuteGuard = signal(null, /* @ts-ignore */
1531
+ ...(ngDevMode ? [{ debugName: "autoExecuteGuard" }] : /* istanbul ignore next */ []));
1460
1532
  options.destroyRef?.onDestroy(() => {
1461
1533
  requestEventsSubscription.unsubscribe();
1462
1534
  requestEvents$.complete();
@@ -1526,6 +1598,7 @@ const setupQueryState = (options) => {
1526
1598
  bindRequestEvents,
1527
1599
  unbindRequestEvents,
1528
1600
  defaultRunOptions,
1601
+ autoExecuteGuard,
1529
1602
  setArgsSource,
1530
1603
  devtoolsStats: options.devtoolsStats ?? null,
1531
1604
  devtoolsFormLinks: options.devtoolsFormLinks ?? null,
@@ -1539,15 +1612,17 @@ const createCancelledError = () => createQueryErrorResponse(new HttpErrorRespons
1539
1612
  const createQuerySnapshotFn = (options) => {
1540
1613
  const { state } = options;
1541
1614
  const context = injectQueryContext();
1542
- const snapshotFn = () => {
1615
+ const snapshotFn = () => untracked(() => {
1543
1616
  const snapshotState = setupQueryState({});
1544
1617
  const isAlive = signal(true, /* @ts-ignore */
1545
1618
  ...(ngDevMode ? [{ debugName: "isAlive" }] : /* istanbul ignore next */ []));
1546
1619
  let cancelSubscription = Subscription.EMPTY;
1620
+ let abortSubscription = Subscription.EMPTY;
1547
1621
  let unregisterScopeListener = null;
1548
1622
  const settle = () => {
1549
1623
  killEffectRef.destroy();
1550
1624
  cancelSubscription.unsubscribe();
1625
+ abortSubscription.unsubscribe();
1551
1626
  unregisterScopeListener?.();
1552
1627
  isAlive.set(false);
1553
1628
  };
@@ -1587,6 +1662,16 @@ const createQuerySnapshotFn = (options) => {
1587
1662
  snapshotState.error.set(createCancelledError());
1588
1663
  settle();
1589
1664
  });
1665
+ const abort = () => untracked(() => {
1666
+ if (!isAlive())
1667
+ return;
1668
+ snapshotState.loading.set(null);
1669
+ snapshotState.latestHttpEvent.set(CANCEL_EVENT);
1670
+ snapshotState.rawResponse.set(null);
1671
+ snapshotState.error.set(null);
1672
+ settle();
1673
+ });
1674
+ abortSubscription = options.execute.aborted$.subscribe(abort);
1590
1675
  cancelSubscription = state.events$
1591
1676
  .pipe(filter((event) => event.type === 'cancel'))
1592
1677
  .subscribe(cancel);
@@ -1607,7 +1692,7 @@ const createQuerySnapshotFn = (options) => {
1607
1692
  executionState: wrapAsObservableSignal(snapshotState.executionState, context.deps.injector),
1608
1693
  };
1609
1694
  return snapshot;
1610
- };
1695
+ });
1611
1696
  return snapshotFn;
1612
1697
  };
1613
1698
 
@@ -1659,9 +1744,12 @@ const applyQueryFeatures = (features, context) => {
1659
1744
  feature.fn(context);
1660
1745
  }
1661
1746
  };
1662
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1663
1747
  const maybeExecute = (options) => {
1664
- if (options.flags.shouldAutoExecute && !options.flags.hasRouteFunction && !options.flags.hasWithArgsFeature) {
1748
+ const guard = options.state.subtle.autoExecuteGuard();
1749
+ if (options.flags.shouldAutoExecute &&
1750
+ !options.flags.hasRouteFunction &&
1751
+ !options.flags.hasWithArgsFeature &&
1752
+ (guard === null || guard())) {
1665
1753
  options.execute();
1666
1754
  }
1667
1755
  };
@@ -1710,6 +1798,7 @@ const createQueryObject = (options) => {
1710
1798
  id: wrappedId,
1711
1799
  createSnapshot,
1712
1800
  reset: execute.reset,
1801
+ abort: execute.abort,
1713
1802
  asReadonly,
1714
1803
  executionState: wrappedExecutionState,
1715
1804
  subtle: {
@@ -1735,14 +1824,15 @@ const createBaseQuery = (options) => {
1735
1824
  const devtoolsStats = createQueryDevtoolsStatsRecorder();
1736
1825
  const devtoolsFormLinks = createQueryDevtoolsFormLinksRecorder();
1737
1826
  const devtoolsOverrides = createQueryDevtoolsOverridesRecorder();
1827
+ const flags = getQueryFeatureUsage(options);
1738
1828
  const state = setupQueryState({
1739
1829
  transformResponse: options.creator?.transformResponse,
1740
1830
  destroyRef: deps.destroyRef,
1831
+ keepPreviousResponse: options.queryConfig.keepPreviousResponse ?? flags.shouldAutoExecuteMethod,
1741
1832
  devtoolsStats,
1742
1833
  devtoolsFormLinks,
1743
1834
  devtoolsOverrides,
1744
1835
  });
1745
- const flags = getQueryFeatureUsage(options);
1746
1836
  const execute = options.executeFactory({
1747
1837
  deps,
1748
1838
  state,
@@ -1757,7 +1847,7 @@ const createBaseQuery = (options) => {
1757
1847
  deps,
1758
1848
  };
1759
1849
  applyQueryFeatures(options.features, featureFnContext);
1760
- maybeExecute({ execute, flags });
1850
+ maybeExecute({ execute, flags, state });
1761
1851
  const query = createQueryObject({ state, execute, deps });
1762
1852
  // Only ever non-null while the devtools are installed, so this whole block - the entry and the
1763
1853
  // per-response payload measuring behind it - is dead code in an app without them.
@@ -1810,6 +1900,43 @@ const createBaseQuery = (options) => {
1810
1900
  });
1811
1901
  };
1812
1902
 
1903
+ const createQueryExecutionAborter = (state) => {
1904
+ const read = () => ({
1905
+ rawResponse: state.rawResponse(),
1906
+ error: state.error(),
1907
+ latestHttpEvent: state.latestHttpEvent(),
1908
+ });
1909
+ let settled = untracked(read);
1910
+ const aborted$ = new Subject();
1911
+ const capture = () => untracked(() => {
1912
+ if (state.loading() === null)
1913
+ settled = read();
1914
+ });
1915
+ // Executions the query did not start itself (a refresh, an invalidation) re-run the bound request
1916
+ // without passing through `capture`.
1917
+ state.events$
1918
+ .pipe(filter((event) => event.type === HttpEventType.Response || event.type === 'error'))
1919
+ .subscribe(capture);
1920
+ const abort = (cancelPending) => untracked(() => {
1921
+ const wasLoading = state.loading() !== null;
1922
+ const request = state.subtle.request();
1923
+ const isRequestActive = !!request?.loading();
1924
+ if (!wasLoading && !isRequestActive)
1925
+ return false;
1926
+ cancelPending?.();
1927
+ aborted$.next();
1928
+ request?.subtle.abort();
1929
+ // `state.error` is derived from `state.rawResponse`, so a write to the response resets an
1930
+ // error set before it. Restore the response first.
1931
+ state.rawResponse.set(settled.rawResponse);
1932
+ state.error.set(settled.error);
1933
+ state.latestHttpEvent.set(settled.latestHttpEvent);
1934
+ state.loading.set(null);
1935
+ return true;
1936
+ });
1937
+ return { capture, abort, aborted$: aborted$.asObservable() };
1938
+ };
1939
+
1813
1940
  /** Resolves a {@link QueryHeadersInput} to `HttpHeaders`, or `undefined` when none is given. */
1814
1941
  const resolveQueryHeaders = (input) => {
1815
1942
  const headers = typeof input === 'function' ? input() : input;
@@ -1977,13 +2104,17 @@ const circularQueryDependencyChecker = () => {
1977
2104
  const createExecuteFn = (executeOptions) => {
1978
2105
  const executeState = setupQueryExecuteState();
1979
2106
  const circularChecker = circularQueryDependencyChecker();
1980
- const reset = () => resetExecuteState({ executeState, executeOptions });
1981
- const exec = (executeArgs) => {
2107
+ const aborter = createQueryExecutionAborter(executeOptions.state);
2108
+ const reset = () => untracked(() => resetExecuteState({ executeState, executeOptions }));
2109
+ const exec = (executeArgs) => untracked(() => {
1982
2110
  const { args = executeOptions.state.args(), options } = executeArgs ?? {};
1983
2111
  circularChecker.check(args);
2112
+ aborter.capture();
1984
2113
  queryExecute({ executeOptions, executeState, args, options });
1985
- };
2114
+ });
1986
2115
  exec['reset'] = reset;
2116
+ exec['abort'] = () => aborter.abort();
2117
+ exec['aborted$'] = aborter.aborted$;
1987
2118
  exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();
1988
2119
  return exec;
1989
2120
  };
@@ -2032,6 +2163,8 @@ const createQueryCreator = (options, internals) => createBaseQueryCreator({
2032
2163
 
2033
2164
  const createBaseQueryCreator = (config) => {
2034
2165
  function queryCreator(...args) {
2166
+ if (getActiveConsumer() !== null)
2167
+ throw queryCreatedInReactiveContext();
2035
2168
  const { features, queryConfig } = splitQueryConfig(args);
2036
2169
  return config.queryFactory({
2037
2170
  creator: config.options,
@@ -2183,6 +2316,12 @@ const decryptBearer$1 = (token) => {
2183
2316
  }
2184
2317
  };
2185
2318
 
2319
+ /**
2320
+ * `true` on every request `@ethlete/query` sends through `HttpClient`, so an app interceptor can skip
2321
+ * query requests: `if (req.context.get(IS_QUERY_REQUEST)) return next(req);`.
2322
+ */
2323
+ const IS_QUERY_REQUEST = /* @__PURE__ */ new HttpContextToken(() => false);
2324
+
2186
2325
  const SPEED_BUFFER_TIME_IN_MS = 2000;
2187
2326
  /**
2188
2327
  * The `statusText` of a response the devtools served instead of sending the request. It is what a log, a
@@ -2249,6 +2388,7 @@ const createHttpRequest = (options) => {
2249
2388
  transferCache: clientOptions?.transferCache,
2250
2389
  responseType: clientOptions?.responseType || 'json',
2251
2390
  headers,
2391
+ context: new HttpContext().set(IS_QUERY_REQUEST, true),
2252
2392
  });
2253
2393
  /**
2254
2394
  * Wraps the request in the fault the devtools have armed for this client, if any.
@@ -2649,18 +2789,18 @@ const createQueryStack = (options) => {
2649
2789
  const responses = queries().map((q) => q.response());
2650
2790
  return transform?.(responses) ?? responses;
2651
2791
  });
2652
- const execute = (options) => {
2792
+ const execute = (options) => untracked(() => {
2653
2793
  for (const query of queries()) {
2654
2794
  query.execute({ options: { allowCache: options?.allowCache } });
2655
2795
  }
2656
- };
2657
- const retryFailed = () => {
2796
+ });
2797
+ const retryFailed = () => untracked(() => {
2658
2798
  for (const query of queries()) {
2659
2799
  if (query.error()) {
2660
2800
  query.execute({ options: { allowCache: false } });
2661
2801
  }
2662
2802
  }
2663
- };
2803
+ });
2664
2804
  const stack = {
2665
2805
  queries: queries.asReadonly(),
2666
2806
  lastQuery: lastQuery.asReadonly(),
@@ -2923,7 +3063,7 @@ const createPagedQueryStack = (options) => {
2923
3063
  return stack.queries().length === 1 && !!stack.lastQuery()?.loading();
2924
3064
  }, /* @ts-ignore */
2925
3065
  ...(ngDevMode ? [{ debugName: "isFirstLoad" }] : /* istanbul ignore next */ []));
2926
- const execute = (options) => {
3066
+ const execute = (options) => untracked(() => {
2927
3067
  const whereFn = options?.where;
2928
3068
  if (whereFn) {
2929
3069
  const queriesToExecute = new Set();
@@ -2960,7 +3100,7 @@ const createPagedQueryStack = (options) => {
2960
3100
  else {
2961
3101
  stack.execute({ allowCache: options?.allowCache });
2962
3102
  }
2963
- };
3103
+ });
2964
3104
  const pagedQuery = {
2965
3105
  maxPagination,
2966
3106
  minPagination,
@@ -4939,6 +5079,7 @@ const EXPIRED_TOKEN_WAIT_MS = 5000;
4939
5079
  const createSecureExecuteFactory = (options) => {
4940
5080
  const executeState = setupQueryExecuteState();
4941
5081
  const circularChecker = circularQueryDependencyChecker();
5082
+ const aborter = createQueryExecutionAborter(options.state);
4942
5083
  let authQuerySubscription = Subscription.EMPTY;
4943
5084
  let tokenRefreshSubscription = Subscription.EMPTY;
4944
5085
  let tokenWaitSubscription = Subscription.EMPTY;
@@ -4948,7 +5089,7 @@ const createSecureExecuteFactory = (options) => {
4948
5089
  /** The access token the last request went out with - what the 401 retry below compares against. */
4949
5090
  let lastRequestedWithToken = null;
4950
5091
  const error$ = toObservable(options.state.error, { injector: options.deps.injector });
4951
- const reset = () => {
5092
+ const cancelPending = () => {
4952
5093
  authQuerySubscription.unsubscribe();
4953
5094
  authQuerySubscription = Subscription.EMPTY;
4954
5095
  tokenRefreshSubscription.unsubscribe();
@@ -4957,6 +5098,9 @@ const createSecureExecuteFactory = (options) => {
4957
5098
  tokenWaitSubscription = Subscription.EMPTY;
4958
5099
  sessionRestartSubscription.unsubscribe();
4959
5100
  sessionRestartSubscription = Subscription.EMPTY;
5101
+ };
5102
+ const reset = () => {
5103
+ cancelPending();
4960
5104
  resetExecuteState({
4961
5105
  executeState,
4962
5106
  executeOptions: { deps: options.deps, state: options.state },
@@ -5057,14 +5201,8 @@ const createSecureExecuteFactory = (options) => {
5057
5201
  circularChecker.check(execArgsWithDefaults.args);
5058
5202
  hasExecuted = true;
5059
5203
  lastExecuteArgs = execArgsWithDefaults;
5060
- authQuerySubscription.unsubscribe();
5061
- authQuerySubscription = Subscription.EMPTY;
5062
- tokenRefreshSubscription.unsubscribe();
5063
- tokenRefreshSubscription = Subscription.EMPTY;
5064
- tokenWaitSubscription.unsubscribe();
5065
- tokenWaitSubscription = Subscription.EMPTY;
5066
- sessionRestartSubscription.unsubscribe();
5067
- sessionRestartSubscription = Subscription.EMPTY;
5204
+ cancelPending();
5205
+ aborter.capture();
5068
5206
  // Retrying with the token that just produced the 401 would 401 again, and that 401 asks for
5069
5207
  // another refresh - an endless refresh/retry loop for as long as the server keeps handing out
5070
5208
  // tokens it rejects. A refresh that did not change the access token is therefore not a reason to
@@ -5134,9 +5272,12 @@ const createSecureExecuteFactory = (options) => {
5134
5272
  throw invalidStateInsideSecureExecuteFactory();
5135
5273
  }
5136
5274
  };
5137
- exec['reset'] = reset;
5138
- exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();
5139
- return exec;
5275
+ const untrackedExec = (executeArgs) => untracked(() => exec(executeArgs));
5276
+ untrackedExec['reset'] = () => untracked(reset);
5277
+ untrackedExec['abort'] = () => aborter.abort(cancelPending);
5278
+ untrackedExec['aborted$'] = aborter.aborted$;
5279
+ untrackedExec['currentRepositoryKey'] = executeState.previousKey.asReadonly();
5280
+ return untrackedExec;
5140
5281
  };
5141
5282
 
5142
5283
  const createSecureExecuteFn = (executeOptions) => {
@@ -5207,26 +5348,40 @@ const createPatchQuery = /* @__PURE__ */ createQueryTemplate('PATCH');
5207
5348
  /** A query creator that creates a secure PATCH query (requires authentication) */
5208
5349
  const createSecurePatchQuery = /* @__PURE__ */ createSecureQueryTemplate('PATCH');
5209
5350
 
5351
+ const isAbortedSnapshot = (snapshot) => snapshot.latestHttpEvent()?.type === 'cancel' && snapshot.error() === null;
5352
+ const executeAndSettle$ = (query, executeArgs, emitAborted) => defer(() => {
5353
+ query.execute(executeArgs);
5354
+ const snapshot = query.createSnapshot();
5355
+ return snapshot.isAlive.asObservable().pipe(filter((isAlive) => !isAlive), take(1),
5356
+ // The stream completes without emitting when the query's injector is torn down mid-execution.
5357
+ defaultIfEmpty(false), map(() => snapshot), filter((settled) => emitAborted || !untracked(() => isAbortedSnapshot(settled))), finalize(() => untracked(() => {
5358
+ if (snapshot.isAlive())
5359
+ query.abort();
5360
+ })));
5361
+ });
5210
5362
  /**
5211
- * Executes the query and resolves once that execution has settled (response or error received).
5212
- * The returned snapshot is frozen to the awaited execution, so a later execution can't swap the
5213
- * `response()` / `error()` you read from it.
5363
+ * Executes the query on subscribe and emits once that execution has settled (response or error
5364
+ * received), then completes. Cold: nothing is sent until it is subscribed to. The emitted snapshot is
5365
+ * frozen to that execution, so a later execution can't swap the `response()` / `error()` you read.
5214
5366
  *
5215
- * Designed for imperative flows that need a mutation's outcome in place - e.g. a signal-forms
5216
- * `submit()` action mapping server violations onto the form via `mapViolationsToFormErrors`.
5367
+ * Unsubscribing before it settles aborts the execution like `query.abort()`, the way unsubscribing
5368
+ * from `HttpClient` cancels its request. An execution stopped by `query.abort()` completes the stream
5369
+ * without a value.
5217
5370
  *
5218
5371
  * A cancelled execution settles too - the entry was evicted, unbound by a logout, or the scope that
5219
5372
  * owns the query was destroyed. The snapshot then reports the execution as a failure whose error
5220
5373
  * says the request was cancelled, and its `latestHttpEvent()` is `{ type: 'cancel' }`.
5221
5374
  */
5222
- const executeUntilSettled = async (query, executeArgs) => {
5223
- query.execute(executeArgs);
5224
- const snapshot = query.createSnapshot();
5225
- // The stream completes without emitting when the query's injector is torn down mid-execution;
5226
- // without a default `firstValueFrom` rejects with an rxjs `EmptyError` nobody catches.
5227
- await firstValueFrom(snapshot.isAlive.asObservable().pipe(filter((isAlive) => !isAlive)), { defaultValue: false });
5228
- return snapshot;
5229
- };
5375
+ const executeUntilSettled$ = (query, executeArgs) => executeAndSettle$(query, executeArgs, false);
5376
+ /**
5377
+ * The Promise form of {@link executeUntilSettled$}, for APIs that require an `async` function - e.g. a
5378
+ * signal-forms `submit()` action mapping server violations onto the form via
5379
+ * `mapViolationsToFormErrors`. Executes immediately. Prefer {@link executeUntilSettled$} in RxJS code.
5380
+ *
5381
+ * An execution stopped by `query.abort()` resolves with a snapshot that has no response, no error, a
5382
+ * `null` `executionState()` and `latestHttpEvent()` `{ type: 'cancel' }`.
5383
+ */
5384
+ const executeUntilSettled = (query, executeArgs) => firstValueFrom(executeAndSettle$(query, executeArgs, true));
5230
5385
 
5231
5386
  /* eslint-disable @typescript-eslint/no-explicit-any */
5232
5387
  const createSequenceState = () => ({
@@ -5726,7 +5881,7 @@ const setupBearerQueryRegistry = (builders, context) => {
5726
5881
  // entry and a repository binding holding the request and response bodies - creating one per login
5727
5882
  // attempt or token refresh grows all of that for as long as the tab lives.
5728
5883
  let query = null;
5729
- const execute = (args, options) => {
5884
+ const execute = (args, options) => untracked(() => {
5730
5885
  query ??= builder.config.queryCreator({ onlyManualExecution: true, injector });
5731
5886
  query.execute({ args, options });
5732
5887
  const snapshot = query.createSnapshot();
@@ -5745,7 +5900,7 @@ const setupBearerQueryRegistry = (builders, context) => {
5745
5900
  currentExecution.set({ id: isRevocation ? null : ++latestExecutionId, type: stateType, snapshot });
5746
5901
  querySnapshot.set(snapshot);
5747
5902
  return snapshot;
5748
- };
5903
+ });
5749
5904
  queries[builder.key] = {
5750
5905
  execute,
5751
5906
  snapshot: querySnapshot.asReadonly(),
@@ -10527,7 +10682,7 @@ const armQueryDevtoolsOverrideTransfer = (recorder, ops) => {
10527
10682
 
10528
10683
  // Generated from package.json by tools/scripts/generate-version.js - do not edit.
10529
10684
  /** The version of `@ethlete/query` this build was cut from. */
10530
- const QUERY_VERSION = '6.0.0-next.51';
10685
+ const QUERY_VERSION = '6.0.0-next.52';
10531
10686
 
10532
10687
  /** How deep a schema is expanded before a nested branch is given up on. */
10533
10688
  const MAX_DEPTH = 12;
@@ -11929,6 +12084,7 @@ const gql = (strings, ...values) => {
11929
12084
  const createGqlExecuteFn = (executeOptions) => {
11930
12085
  const executeState = setupQueryExecuteState();
11931
12086
  const circularChecker = circularQueryDependencyChecker();
12087
+ const aborter = createQueryExecutionAborter(executeOptions.state);
11932
12088
  const reset = () => resetExecuteState({ executeState, executeOptions });
11933
12089
  const exec = (executeArgs) => {
11934
12090
  const { args = executeOptions.state.args(), options } = executeArgs ?? {};
@@ -11962,6 +12118,7 @@ const createGqlExecuteFn = (executeOptions) => {
11962
12118
  queryConfig: executeOptions.queryConfig,
11963
12119
  state: executeOptions.state,
11964
12120
  };
12121
+ aborter.capture();
11965
12122
  queryExecute({
11966
12123
  executeOptions: normalizedOpts,
11967
12124
  executeState,
@@ -11971,6 +12128,8 @@ const createGqlExecuteFn = (executeOptions) => {
11971
12128
  });
11972
12129
  };
11973
12130
  exec['reset'] = reset;
12131
+ exec['abort'] = () => aborter.abort();
12132
+ exec['aborted$'] = aborter.aborted$;
11974
12133
  exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();
11975
12134
  return exec;
11976
12135
  };
@@ -12700,24 +12859,39 @@ function toQuerySignal(source, options) {
12700
12859
  * @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.
12701
12860
  */
12702
12861
  function effectComputed(computation, injector) {
12703
- let initialData = null;
12704
- try {
12705
- initialData = runInInjectionContext(injector, () => computation());
12706
- }
12707
- catch {
12708
- // Ignore errors in the initial computation
12709
- // Angular might throw an error if required inputs are read but not available yet
12710
- }
12711
- const lastResult = signal(initialData, /* @ts-ignore */
12862
+ const lastResult = signal(null, /* @ts-ignore */
12712
12863
  ...(ngDevMode ? [{ debugName: "lastResult" }] : /* istanbul ignore next */ []));
12713
- effect(() => {
12864
+ const rerun = signal(0, /* @ts-ignore */
12865
+ ...(ngDevMode ? [{ debugName: "rerun" }] : /* istanbul ignore next */ []));
12866
+ const createComputationWatch = () => createWatch(() => {
12714
12867
  const data = runInInjectionContext(injector, () => computation());
12715
12868
  untracked(() => {
12716
12869
  if (data === lastResult())
12717
12870
  return;
12718
12871
  lastResult.set(data);
12719
12872
  });
12873
+ }, () => rerun.update((count) => count + 1), true);
12874
+ let watch = createComputationWatch();
12875
+ let initialRunFailed = false;
12876
+ try {
12877
+ watch.run();
12878
+ }
12879
+ catch {
12880
+ // Angular throws for a required input read before it is set; the effect's first run retries.
12881
+ initialRunFailed = true;
12882
+ }
12883
+ effect(() => {
12884
+ rerun();
12885
+ untracked(() => {
12886
+ if (initialRunFailed) {
12887
+ initialRunFailed = false;
12888
+ watch.destroy();
12889
+ watch = createComputationWatch();
12890
+ }
12891
+ watch.run();
12892
+ });
12720
12893
  }, { injector });
12894
+ injector.get(DestroyRef).onDestroy(() => watch.destroy());
12721
12895
  return lastResult.asReadonly();
12722
12896
  }
12723
12897
  /**
@@ -12738,7 +12912,13 @@ function queryComputed(computation, options) {
12738
12912
  */
12739
12913
  function queryComputedTillTruthy(computation, options) {
12740
12914
  const injector = options?.injector ?? inject(Injector);
12741
- const c = computedTillTruthy(effectComputed(computation, injector));
12915
+ let first = null;
12916
+ const c = computedTillTruthy(effectComputed(() => {
12917
+ if (first)
12918
+ return first;
12919
+ first = computation() || null;
12920
+ return first;
12921
+ }, injector));
12742
12922
  const obs = toObservable(c, options);
12743
12923
  addQueryContainerHandling(obs, () => c(), options);
12744
12924
  return c;
@@ -13368,6 +13548,8 @@ class LegacyQuery {
13368
13548
  this._isPollingPaused = false;
13369
13549
  this.isDestroyed = false;
13370
13550
  this._triggeredVia = 'program';
13551
+ this._lastExecuteCalledAt = 0;
13552
+ this._ownLoadExecuteTime = null;
13371
13553
  this._wasAborted = false;
13372
13554
  if (this._isInert) {
13373
13555
  this.state$ = of(transformExecStateToQueryState(null));
@@ -13413,12 +13595,25 @@ class LegacyQuery {
13413
13595
  * never run. The abort flag is the only thing that tells the two apart.
13414
13596
  */
13415
13597
  toQueryState(execState) {
13416
- const state = transformExecStateToQueryState(execState, this._triggeredVia);
13598
+ const state = transformExecStateToQueryState(execState, this.triggerOf(execState));
13417
13599
  if (execState || !this._wasAborted) {
13418
13600
  return state;
13419
13601
  }
13420
13602
  return { type: QueryStateType.Cancelled, meta: state.meta };
13421
13603
  }
13604
+ /**
13605
+ * A load this wrapper did not start - a `refreshQueriesInUse()`, an invalidation - reports as `auto`, the way
13606
+ * v2 reported its background refreshes.
13607
+ */
13608
+ triggerOf(execState) {
13609
+ if (execState?.type !== 'loading')
13610
+ return this._triggeredVia;
13611
+ const { executeTime } = execState.loading;
13612
+ if (this._ownLoadExecuteTime === null && executeTime >= this._lastExecuteCalledAt) {
13613
+ this._ownLoadExecuteTime = executeTime;
13614
+ }
13615
+ return executeTime === this._ownLoadExecuteTime ? this._triggeredVia : 'auto';
13616
+ }
13422
13617
  get isExpired() {
13423
13618
  return this.newQuery.subtle.request()?.isStale();
13424
13619
  }
@@ -13475,11 +13670,16 @@ class LegacyQuery {
13475
13670
  }
13476
13671
  this._triggeredVia = options._triggeredVia ?? 'program';
13477
13672
  this._wasAborted = false;
13673
+ this._lastExecuteCalledAt = Date.now();
13674
+ this._ownLoadExecuteTime = null;
13478
13675
  untracked(() =>
13479
13676
  // v2 had a single `skipCache` for every method, so this cannot tell whether the underlying request is
13480
13677
  // cacheable. The creator is built with `silenceUncacheableAllowCacheError`, which makes `allowCache` inert
13481
13678
  // on a mutation instead of throwing ET301.
13482
13679
  this.newQuery.execute({ args: this._arguments, options: { allowCache: options.skipCache !== true } }));
13680
+ const started = untracked(this.newQuery.executionState);
13681
+ if (started?.type === 'loading')
13682
+ this._ownLoadExecuteTime = started.loading.executeTime;
13483
13683
  return this;
13484
13684
  }
13485
13685
  abort() {
@@ -13627,6 +13827,7 @@ const createInertQuery = () => {
13627
13827
  execute: noop,
13628
13828
  createSnapshot,
13629
13829
  reset: noop,
13830
+ abort: () => false,
13630
13831
  asReadonly: () => ({ ...base, createSnapshot }),
13631
13832
  subtle: {
13632
13833
  destroy: noop,
@@ -15034,7 +15235,6 @@ class InfinityQueryDirective {
15034
15235
  this.cdr = inject(ChangeDetectorRef);
15035
15236
  this.viewContainerRef = inject(ViewContainerRef);
15036
15237
  this.mainTemplateRef = inject((TemplateRef));
15037
- this.errorHandler = inject(ErrorHandler);
15038
15238
  this.injector = inject(Injector);
15039
15239
  this.infinityQueryResponseDelay = injectInfinityQueryResponseDelay({ host: true });
15040
15240
  this._data$ = new BehaviorSubject([]);
@@ -15098,9 +15298,6 @@ class InfinityQueryDirective {
15098
15298
  this.viewContext.loading = false;
15099
15299
  this.viewContext.error = state.error;
15100
15300
  this.viewContext.isFirstLoad = false;
15101
- if (isLegacyQuery(currentQuery)) {
15102
- this.errorHandler.handleError(state.error.httpErrorResponse);
15103
- }
15104
15301
  }
15105
15302
  else if (isQueryStateSuccess(state)) {
15106
15303
  this.viewContext.loading = false;
@@ -15242,7 +15439,6 @@ class QueryDirective {
15242
15439
  return true;
15243
15440
  }
15244
15441
  constructor() {
15245
- this.errorHandler = inject(ErrorHandler);
15246
15442
  this.cdr = inject(ChangeDetectorRef);
15247
15443
  this.viewContext = {
15248
15444
  $implicit: null,
@@ -15305,9 +15501,6 @@ class QueryDirective {
15305
15501
  }
15306
15502
  if (isQueryStateFailure(state)) {
15307
15503
  this.viewContext.error = state.error;
15308
- if (isLegacyQuery(extractQuery(this.query()))) {
15309
- this.errorHandler.handleError(state.error.httpErrorResponse);
15310
- }
15311
15504
  }
15312
15505
  else {
15313
15506
  this.viewContext.error = null;
@@ -16674,6 +16867,7 @@ class QueryForm {
16674
16867
  }), takeUntil(this.destroy$), takeUntil(this.unobserveTrigger$))
16675
16868
  .subscribe();
16676
16869
  let changedFieldsInLastResetLoop = [];
16870
+ let fieldsResetInResetLoop = new Set();
16677
16871
  let currentUniqueChangedFields = [];
16678
16872
  this.currentFormValue$
16679
16873
  .pipe(map((currentValue) => {
@@ -16685,9 +16879,10 @@ class QueryForm {
16685
16879
  if (options?.writeToQueryParams !== false) {
16686
16880
  this._syncViaUrlQueryParams(currentValue, options?.replaceUrl);
16687
16881
  }
16688
- const didResetValues = this.skipNextResets
16689
- ? false
16882
+ const resetFields = this.skipNextResets
16883
+ ? []
16690
16884
  : this._handleQueryFormResets(previousValue ?? null, currentValue);
16885
+ const didResetValues = resetFields.length > 0;
16691
16886
  this.skipNextResets = false;
16692
16887
  this.skipNextResetsFor = undefined;
16693
16888
  const changedFields = Object.keys(currentValue).filter((key) => !equal(previousValue?.[key], currentValue[key]));
@@ -16698,8 +16893,11 @@ class QueryForm {
16698
16893
  if (didResetValues) {
16699
16894
  this.didValueChanges$.next(true);
16700
16895
  changedFieldsInLastResetLoop = changedFields;
16896
+ resetFields.forEach((key) => fieldsResetInResetLoop.add(key));
16701
16897
  }
16702
- currentUniqueChangedFields = [...new Set(changedFields)];
16898
+ currentUniqueChangedFields = [...new Set(changedFields)].filter((key) => !fieldsResetInResetLoop.has(key));
16899
+ if (!didResetValues)
16900
+ fieldsResetInResetLoop = new Set();
16703
16901
  }), switchMap(({ currentValue, previousValue }) => {
16704
16902
  const skipDebounce = this.skipNextDebounce;
16705
16903
  this.skipNextDebounce = false;
@@ -16724,6 +16922,8 @@ class QueryForm {
16724
16922
  }), tap(({ currentValue, previousValue }) => {
16725
16923
  if (changedFieldsInLastResetLoop.length)
16726
16924
  return;
16925
+ if (equal(this._changes$.value.currentValue, currentValue))
16926
+ return;
16727
16927
  this._changes$.next({
16728
16928
  previousValue: previousValue ?? null,
16729
16929
  currentValue: currentValue,
@@ -16859,7 +17059,7 @@ class QueryForm {
16859
17059
  return this.form;
16860
17060
  }
16861
17061
  _handleQueryFormResets(previousValue, currentValue) {
16862
- let didResetValues = false;
17062
+ const resetFields = [];
16863
17063
  for (const formFieldKey in this._fields) {
16864
17064
  const field = this._fields[formFieldKey];
16865
17065
  if (!field)
@@ -16884,12 +17084,12 @@ class QueryForm {
16884
17084
  continue;
16885
17085
  }
16886
17086
  this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
16887
- didResetValues = true;
17087
+ resetFields.push(formFieldKey);
16888
17088
  break;
16889
17089
  }
16890
17090
  }
16891
17091
  }
16892
- return didResetValues;
17092
+ return resetFields;
16893
17093
  }
16894
17094
  getDefaultValue(key) {
16895
17095
  const val = this.defaultValues[key];
@@ -17078,20 +17278,16 @@ const buildDefaults = (fields) => {
17078
17278
  };
17079
17279
  const MAX_RESET_PASSES = 10;
17080
17280
  const changedKeysBetween = (previous, current) => Object.keys(current).filter((key) => !equal(previous?.[key], current[key]));
17081
- /** Best-effort URL string → value coercion, mirroring the auto-transform of the legacy QueryForm. */
17281
+ /** Reads a URL string into the type of the field's default; `null` means the default's type cannot hold it. */
17082
17282
  const autoCoerce = (raw, defaultValue) => {
17083
17283
  if (typeof raw !== 'string')
17084
17284
  return raw;
17085
17285
  if (Array.isArray(defaultValue))
17086
17286
  return [raw];
17087
- const defaultIsNumber = typeof defaultValue === 'number';
17088
- const looksNumeric = raw.trim() === raw && !/^-?0\d/.test(raw) && !raw.endsWith('.') && !isNaN(Number(raw));
17089
- if (defaultIsNumber || (looksNumeric && raw !== '')) {
17287
+ if (typeof defaultValue === 'number')
17090
17288
  return transformToNumber(raw);
17091
- }
17092
- if (raw === 'true' || raw === 'false') {
17093
- return transformToBoolean(raw);
17094
- }
17289
+ if (typeof defaultValue === 'boolean')
17290
+ return raw === 'true' ? true : raw === 'false' ? false : null;
17095
17291
  return raw;
17096
17292
  };
17097
17293
  /** Shortest-debounce-wins; `null` means commit immediately. */
@@ -17737,34 +17933,32 @@ const normalizeConfig = (config) => {
17737
17933
  isResetBy: isResetBy === undefined ? undefined : Array.isArray(isResetBy) ? isResetBy : [isResetBy],
17738
17934
  };
17739
17935
  };
17936
+ function queryField(config) {
17937
+ return {
17938
+ defaultValue: null,
17939
+ ...normalizeConfig(config),
17940
+ };
17941
+ }
17740
17942
  /**
17741
- * A generic query-form field. Defaults to `null` and, unless a transform is
17742
- * given, relies on the auto-coercion when reading back from the URL.
17743
- *
17744
- * @example
17745
- * queryField<number>({ defaultValue: 1, isResetBy: ['search'] })
17746
- */
17747
- const queryField = (config) => ({
17748
- defaultValue: null,
17749
- ...normalizeConfig(config),
17750
- });
17751
- /**
17752
- * A debounced free-text search field. Debounces typing by 300ms but applies
17753
- * clearing immediately (`disableDebounceIfFalsy`). Reads the URL value back as the raw string.
17943
+ * A debounced free-text search field, typed `string` like every text control; `''` is empty and writes no
17944
+ * URL param. Debounces typing by 300ms but applies clearing immediately (`disableDebounceIfFalsy`). Not counted
17945
+ * by `activeFilterCount`, whatever its key.
17754
17946
  */
17755
17947
  const searchQueryField = (config) => ({
17756
- defaultValue: null,
17948
+ defaultValue: '',
17757
17949
  debounce: 300,
17758
17950
  disableDebounceIfFalsy: true,
17759
- queryParamToValue: (raw) => (typeof raw === 'string' ? raw : null),
17951
+ skipInFilterCount: true,
17952
+ queryParamToValue: (raw) => (typeof raw === 'string' ? raw : ''),
17760
17953
  ...normalizeConfig(config),
17761
17954
  });
17762
17955
  /**
17763
- * A sort field serialized as `"active:direction"` (e.g. `"name:asc"`). Matches
17764
- * the wire format the table system's URL adapter uses, so the two interoperate.
17956
+ * A sort field serialized as `"active:direction"` (e.g. `"name:asc"`). Not counted by `activeFilterCount`,
17957
+ * whatever its key.
17765
17958
  */
17766
17959
  const sortQueryField = (config) => ({
17767
17960
  defaultValue: null,
17961
+ skipInFilterCount: true,
17768
17962
  queryParamToValue: transformToSort,
17769
17963
  valueToQueryParam: transformToSortQueryParam,
17770
17964
  ...normalizeConfig(config),
@@ -17787,12 +17981,22 @@ const booleanArrayQueryField = (config) => ({
17787
17981
  queryParamToValue: transformToBooleanArray,
17788
17982
  ...normalizeConfig(config),
17789
17983
  });
17790
- /** A single date field (expects an ISO/`Date`-parseable string in the URL). */
17791
- const dateQueryField = (config) => ({
17792
- defaultValue: null,
17793
- queryParamToValue: transformToDate,
17794
- ...normalizeConfig(config),
17795
- });
17984
+ function dateQueryField(config) {
17985
+ if (config?.as === 'string') {
17986
+ const { as: _as, ...rest } = config;
17987
+ return {
17988
+ defaultValue: null,
17989
+ queryParamToValue: (raw) => (typeof raw === 'string' && raw !== '' ? raw : null),
17990
+ ...normalizeConfig(rest),
17991
+ };
17992
+ }
17993
+ const { as: _as, ...rest } = config ?? {};
17994
+ return {
17995
+ defaultValue: null,
17996
+ queryParamToValue: transformToDate,
17997
+ ...normalizeConfig(rest),
17998
+ };
17999
+ }
17796
18000
  /** A field holding a list of dates. */
17797
18001
  const dateArrayQueryField = (config) => ({
17798
18002
  defaultValue: null,
@@ -18029,5 +18233,5 @@ const createWebSocketClient = (options) => {
18029
18233
  * Generated bundle index. Do not edit.
18030
18234
  */
18031
18235
 
18032
- 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, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, LegacyQuery, LegacyQueryCreator, MAX_QUERY_BATCH_TOMBSTONES, 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, collectQueryFormLinks, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, consumeSuppressQueryStackDevtools, contentfulGqlLikePaginationAdapter, countUnresolvedQueryDevtoolsOverrides, createAuthGuard, createBaseQuery, createBaseQueryCreator, createBearerAuthProvider, createDefaultRetryFn, createDeleteQuery, createExecuteFn, createGetQuery, createGqlExecuteFn, createGqlMutationViaGet, createGqlMutationViaPost, createGqlQuery, createGqlQueryCreator, createGqlQueryViaGet, createGqlQueryViaPost, createHeadQuery, createHttpRequest, createIndexedDbQueryPersistenceAdapter, createInfinityQueryConfig, createLegacyQueryCreator, createNoopQueryPersistenceAdapter, createOptionsQuery, createPagedQueryStack, createPatchQuery, createPersistentAuthFeature, createPostQuery, createPutQuery, createQuery, createQueryBatch, createQueryClient, createQueryCollection, createQueryCollectionSignal, createQueryCollectionSubject, createQueryContext, createQueryCreator, createQueryDevtoolsFormLinks, createQueryDevtoolsFormLinksRecorder, createQueryDevtoolsOverrides, createQueryDevtoolsOverridesRecorder, createQueryDevtoolsStats, createQueryDevtoolsStatsRecorder, createQueryErrorResponse, createQueryFeature, createQueryInvalidationFilter, createQueryKeyLockManager, createQueryObject, createQueryPersistenceEngine, createQueryRepository, createQuerySnapshotFn, createQueryStack, createQuerySubmission, createQuerySyncEngine, createQuerySyncTransport, createSecureDeleteQuery, createSecureExecuteFactory, createSecureExecuteFn, createSecureGetQuery, createSecureGqlExecuteFn, createSecureGqlMutationViaGet, createSecureGqlMutationViaPost, createSecureGqlQuery, createSecureGqlQueryCreator, createSecureGqlQueryViaGet, createSecureGqlQueryViaPost, createSecureHeadQuery, createSecureOptionsQuery, createSecurePatchQuery, createSecurePostQuery, createSecurePutQuery, createSecureQuery, createSecureQueryCreator, createTrackingFeature, createWebSocketClient, currentQueryDevtoolsBatch, dateArrayQueryField, dateQueryField, decryptBearer, deepFreeze, def, defineQueryForm, deleteQueryDevtoolsMock, describeQueryDevtoolsFeatures, detectContentTypeHeader, detectPaginationShape, dynLikePaginationAdapter, effectComputed, emptyQueryArgs, ethletePaginationAdapter, executeUntilSettled, extractExpiresInSeconds, extractFormViolations, extractHtmlErrorMessage, extractQuery, fakePaginationAdapter, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, forgetQueryDevtoolsAuthSession, forgetQueryDevtoolsAuthSessionsFor, formatQueryDevtoolsDuration, generateQueryDevtoolsNumberPreset, generateQueryDevtoolsSampleNumber, generateQueryDevtoolsStringPreset, getBearerAuthProviderName, getDefaultHeaders, getQueryClientName, getQueryFeatureUsage, getResponseUrl, ggLikePaginationAdapter, gql, gqlDataPropertyMissingInResponse, gqlErrorsInResponse, gqlTransformerFor, hasHeader, hasQueryDevtoolsOverridesAtPath, htmlErrorPayload, htmlQueryErrorParser, ignoreAutoRefresh, initQueryDevtoolsAuthSessions, initQueryDevtoolsFaults, initQueryDevtoolsMocks, initQueryDevtoolsOverridePersistence, initQueryDevtoolsSettings, injectInfinityQueryResponseDelay, injectQueryContext, insertFrom, invalidBaseRouteError, invalidBodyError, invalidRouteError, invalidStateInsideSecureExecuteFactory, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCreateGqlQueryOptions, isCustomHeaderAuthProvider, isDateShapedLeaf, isEmptyString, isGqlQueryConfig, isHtmlErrorPayload, isIdempotentQueryMethod, isLegacyQuery, isNaN$1 as isNaN, isPageOutOfRangeError, isQuery, isQueryCollection, isQueryDevtoolsEnabled, isQueryDevtoolsFaultArmed, isQueryDevtoolsRepositoryLive, isQueryDevtoolsRequestInterceptionEnabled, isQueryErrorResponse, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyListError, isSymfonyPagerfantaOutOfRangeError, isUnderInvalidatedUrl, legacyPrepareFallbackInjector, legacyPrepareWithoutInjectionContext, loadQueryDevtoolsSchema, loginQueryDevtoolsAuthAccount, logoutQueryDevtoolsAuthSession, mapToPaginated, mapViolationsToFormErrors, matchesQueryDevtoolsMockPattern, matchesQueryDevtoolsMockQuery, maybeExecute, measureQueryDevtoolsPayload, mergeHeaders, nestedEffect, noteQueryFormRead, noteQueryFormReads, numberArrayQueryField, pagedQueryStackNextPageCalledWithoutPreviousPage, pagedQueryStackPageBiggerThanTotalPages, pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToTitleEn, parseQueryDevtoolsOverrideTransfer, parseQueryRoute, patchQueryDevtoolsTokenPayload, pathParamsMissingInRouteFunctionError, provideInfinityQueryResponseDelay, provideLegacyPrepareFallback, provideQueryClientForDevtools, provideQueryDevtools, queryArrayComputed, queryBatchAlreadyRunning, queryBatchWithArgsUsed, queryClientFeatureUsedMultipleTimes, queryComputed, queryComputedTillTruthy, queryDevtoolsAbout, queryDevtoolsAllowsLocalAuthSessions, queryDevtoolsApiEnvIds, queryDevtoolsApiEnvIsProduction, queryDevtoolsApiEnvScope, queryDevtoolsApiEnvValues, queryDevtoolsApiEnvs, queryDevtoolsArmedMocks, queryDevtoolsArmedMocksRestored, queryDevtoolsAuthAccountsFor, queryDevtoolsAuthActive, queryDevtoolsAuthFieldsFor, queryDevtoolsAuthOtherScopeCount, queryDevtoolsAuthProviders, queryDevtoolsAuthSessions, queryDevtoolsAuthSessionsFor, queryDevtoolsAuthTabLocal, queryDevtoolsEntries, queryDevtoolsFaults, queryDevtoolsFaultsRestored, queryDevtoolsFnDetail, 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, readQueryDevtoolsAuthSeed, readQueryDevtoolsAuthSeedFor, readQueryDevtoolsStore, registerEthleteVersion, registerLiveQueryDevtoolsRepository, registerQueryDevtoolsAuthProvider, registerQueryDevtoolsEntry, registerQueryErrorParser, releaseQueryDevtoolsOverridePersistence, removeFrom, removeQueryDevtoolsAuthAccount, renameQueryDevtoolsAuthSession, request, resetExecuteState, resetPageOnError, resolveInvalidationUrl, resolveQueryDevtoolsFault, resolveQueryDevtoolsFaultForAttempt, resolveQueryDevtoolsMock, resolveQueryDevtoolsMockForAttempt, resolveQueryHeaders, restoredQueryDevtoolsOverrides, runDefaultQueryRetry, runInQueryDevtoolsBatch, runQueryErrorParsers, saveQueryDevtoolsMock, searchQueryField, seedQueryDevtoolsSchemaBody, seedQueryDevtoolsSchemaRoute, serializeBody, serializeQueryDevtoolsOverrideTransfer, setDefaultQueryRetryFn, setQueryDevtoolsApiEnv, setQueryDevtoolsApiEnvs, setQueryDevtoolsAppInfo, setQueryDevtoolsArmedMocksScope, setQueryDevtoolsAuthCredentials, setQueryDevtoolsAuthProviderRegistrar, setQueryDevtoolsAuthSeedReader, setQueryDevtoolsAuthTabLocal, setQueryDevtoolsFault, setQueryDevtoolsFaultResolver, setQueryDevtoolsFaultsScope, setQueryDevtoolsFormLinksFactory, setQueryDevtoolsMockResolver, setQueryDevtoolsOverridePersistence, setQueryDevtoolsOverridesFactory, setQueryDevtoolsOverridesScope, setQueryDevtoolsRegistrar, setQueryDevtoolsResponseHistory, setQueryDevtoolsSchemaLoader, setQueryDevtoolsSettings, setQueryDevtoolsStatsFactory, setQueryDevtoolsTokenPayloadPatcher, setQueryDevtoolsTokenTtl, setQueryDevtoolsUiMounted, setupQueryDependencies, setupQueryExecuteState, setupQueryState, shouldAutoExecuteGqlQuery, shouldAutoExecuteQuery, shouldCacheQuery, shouldRetryRequest, silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent, skipPaginationPageParamCalculator, smartDuplicateArrayItem, snapshotQueryDevtoolsHandle, sortQueryField, splitQueryConfig, stringArrayQueryField, stringifyQueryRouteParts, sumQueryDevtoolsStats, suppressNextQueryStackDevtools, switchQueryCollectionState, switchQueryDevtoolsAuthSession, switchQueryState, symfonyQueryErrorParser, takeUntilResponse, toQuerySignal, toQuerySubject, tokensNotAvailableInsideAuthAndExec, tombstoneOf, trackQueryDevtoolsAuthProvider, transformArrayResponse, transformExecStateToQueryState, transformGql, transformMethod, transformPaginatedResponse, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray, 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, withQueryDevtoolsOverridePersistence, withQueryPersistence, withRefreshQuery, withResponseUpdate, withSuccessHandling, withSymfonyErrors, withTokenExpirationWarning, withTokenRevocation, withTracking, wrapAsObservableSignal, wrapQuerySyncMessage, writeQueryDevtoolsStore };
18236
+ 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_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, collectQueryFormLinks, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, consumeSuppressQueryStackDevtools, contentfulGqlLikePaginationAdapter, countUnresolvedQueryDevtoolsOverrides, createAuthGuard, createBaseQuery, createBaseQueryCreator, createBearerAuthProvider, createDefaultRetryFn, createDeleteQuery, createExecuteFn, createGetQuery, createGqlExecuteFn, createGqlMutationViaGet, createGqlMutationViaPost, createGqlQuery, createGqlQueryCreator, createGqlQueryViaGet, createGqlQueryViaPost, createHeadQuery, createHttpRequest, createIndexedDbQueryPersistenceAdapter, createInfinityQueryConfig, createLegacyQueryCreator, createNoopQueryPersistenceAdapter, createOptionsQuery, createPagedQueryStack, createPatchQuery, createPersistentAuthFeature, createPostQuery, createPutQuery, createQuery, createQueryBatch, createQueryClient, createQueryCollection, createQueryCollectionSignal, createQueryCollectionSubject, createQueryContext, createQueryCreator, createQueryDevtoolsFormLinks, createQueryDevtoolsFormLinksRecorder, createQueryDevtoolsOverrides, createQueryDevtoolsOverridesRecorder, createQueryDevtoolsStats, createQueryDevtoolsStatsRecorder, createQueryErrorResponse, createQueryFeature, createQueryInvalidationFilter, createQueryKeyLockManager, createQueryObject, createQueryPersistenceEngine, createQueryRepository, createQuerySnapshotFn, createQueryStack, createQuerySubmission, createQuerySyncEngine, createQuerySyncTransport, createSecureDeleteQuery, createSecureExecuteFactory, createSecureExecuteFn, createSecureGetQuery, createSecureGqlExecuteFn, createSecureGqlMutationViaGet, createSecureGqlMutationViaPost, createSecureGqlQuery, createSecureGqlQueryCreator, createSecureGqlQueryViaGet, createSecureGqlQueryViaPost, createSecureHeadQuery, createSecureOptionsQuery, createSecurePatchQuery, createSecurePostQuery, createSecurePutQuery, createSecureQuery, createSecureQueryCreator, createTrackingFeature, createWebSocketClient, currentQueryDevtoolsBatch, dateArrayQueryField, dateQueryField, decryptBearer, deepFreeze, def, defineQueryForm, deleteQueryDevtoolsMock, describeQueryDevtoolsFeatures, detectContentTypeHeader, detectPaginationShape, dynLikePaginationAdapter, effectComputed, emptyQueryArgs, ethletePaginationAdapter, executeUntilSettled, executeUntilSettled$, extractExpiresInSeconds, extractFormViolations, extractHtmlErrorMessage, extractQuery, fakePaginationAdapter, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, forgetQueryDevtoolsAuthSession, forgetQueryDevtoolsAuthSessionsFor, formatQueryDevtoolsDuration, generateQueryDevtoolsNumberPreset, generateQueryDevtoolsSampleNumber, generateQueryDevtoolsStringPreset, getBearerAuthProviderName, getDefaultHeaders, getQueryClientName, getQueryFeatureUsage, getResponseUrl, ggLikePaginationAdapter, gql, gqlDataPropertyMissingInResponse, gqlErrorsInResponse, gqlTransformerFor, hasHeader, hasQueryDevtoolsOverridesAtPath, htmlErrorPayload, htmlQueryErrorParser, ignoreAutoRefresh, initQueryDevtoolsAuthSessions, initQueryDevtoolsFaults, initQueryDevtoolsMocks, initQueryDevtoolsOverridePersistence, initQueryDevtoolsSettings, injectInfinityQueryResponseDelay, injectQueryContext, insertFrom, invalidBaseRouteError, invalidBodyError, invalidRouteError, invalidStateInsideSecureExecuteFactory, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCreateGqlQueryOptions, isCustomHeaderAuthProvider, isDateShapedLeaf, isEmptyString, isGqlQueryConfig, isHtmlErrorPayload, isIdempotentQueryMethod, isLegacyQuery, isNaN$1 as isNaN, isPageOutOfRangeError, isQuery, isQueryCollection, isQueryDevtoolsEnabled, isQueryDevtoolsFaultArmed, isQueryDevtoolsRepositoryLive, isQueryDevtoolsRequestInterceptionEnabled, isQueryErrorResponse, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyListError, isSymfonyPagerfantaOutOfRangeError, isUnderInvalidatedUrl, legacyPrepareFallbackInjector, legacyPrepareWithoutInjectionContext, loadQueryDevtoolsSchema, loginQueryDevtoolsAuthAccount, logoutQueryDevtoolsAuthSession, mapToPaginated, mapViolationsToFormErrors, matchesQueryDevtoolsMockPattern, matchesQueryDevtoolsMockQuery, maybeExecute, measureQueryDevtoolsPayload, mergeHeaders, nestedEffect, noteQueryFormRead, noteQueryFormReads, numberArrayQueryField, pagedQueryStackNextPageCalledWithoutPreviousPage, pagedQueryStackPageBiggerThanTotalPages, pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToTitleEn, parseQueryDevtoolsOverrideTransfer, parseQueryRoute, patchQueryDevtoolsTokenPayload, 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, queryDevtoolsAuthProviders, queryDevtoolsAuthSessions, queryDevtoolsAuthSessionsFor, queryDevtoolsAuthTabLocal, queryDevtoolsEntries, queryDevtoolsFaults, queryDevtoolsFaultsRestored, queryDevtoolsFnDetail, 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, readQueryDevtoolsAuthSeed, readQueryDevtoolsAuthSeedFor, readQueryDevtoolsStore, registerEthleteVersion, registerLiveQueryDevtoolsRepository, registerQueryDevtoolsAuthProvider, registerQueryDevtoolsEntry, registerQueryErrorParser, releaseQueryDevtoolsOverridePersistence, removeFrom, removeQueryDevtoolsAuthAccount, renameQueryDevtoolsAuthSession, request, resetExecuteState, resetPageOnError, resolveInvalidationUrl, resolveQueryDevtoolsFault, resolveQueryDevtoolsFaultForAttempt, resolveQueryDevtoolsMock, resolveQueryDevtoolsMockForAttempt, resolveQueryHeaders, restoredQueryDevtoolsOverrides, runDefaultQueryRetry, runInQueryDevtoolsBatch, runQueryErrorParsers, saveQueryDevtoolsMock, searchQueryField, seedQueryDevtoolsSchemaBody, seedQueryDevtoolsSchemaRoute, serializeBody, serializeQueryDevtoolsOverrideTransfer, setDefaultQueryRetryFn, setQueryDevtoolsApiEnv, setQueryDevtoolsApiEnvs, setQueryDevtoolsAppInfo, setQueryDevtoolsArmedMocksScope, setQueryDevtoolsAuthCredentials, setQueryDevtoolsAuthProviderRegistrar, setQueryDevtoolsAuthSeedReader, setQueryDevtoolsAuthTabLocal, setQueryDevtoolsFault, setQueryDevtoolsFaultResolver, setQueryDevtoolsFaultsScope, setQueryDevtoolsFormLinksFactory, setQueryDevtoolsMockResolver, setQueryDevtoolsOverridePersistence, setQueryDevtoolsOverridesFactory, setQueryDevtoolsOverridesScope, setQueryDevtoolsRegistrar, setQueryDevtoolsResponseHistory, setQueryDevtoolsSchemaLoader, setQueryDevtoolsSettings, setQueryDevtoolsStatsFactory, setQueryDevtoolsTokenPayloadPatcher, setQueryDevtoolsTokenTtl, setQueryDevtoolsUiMounted, setupQueryDependencies, setupQueryExecuteState, setupQueryState, shouldAutoExecuteGqlQuery, shouldAutoExecuteQuery, shouldCacheQuery, shouldRetryRequest, silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent, skipPaginationPageParamCalculator, smartDuplicateArrayItem, snapshotQueryDevtoolsHandle, sortQueryField, splitQueryConfig, stringArrayQueryField, stringifyQueryRouteParts, sumQueryDevtoolsStats, suppressNextQueryStackDevtools, switchQueryCollectionState, switchQueryDevtoolsAuthSession, switchQueryState, symfonyQueryErrorParser, takeUntilResponse, toQuerySignal, toQuerySubject, tokensNotAvailableInsideAuthAndExec, tombstoneOf, trackQueryDevtoolsAuthProvider, transformArrayResponse, transformExecStateToQueryState, transformGql, transformMethod, transformPaginatedResponse, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray, 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, withQueryDevtoolsOverridePersistence, withQueryPersistence, withRefreshQuery, withResponseUpdate, withSuccessHandling, withSymfonyErrors, withTokenExpirationWarning, withTokenRevocation, withTracking, wrapAsObservableSignal, wrapQuerySyncMessage, writeQueryDevtoolsStore };
18033
18237
  //# sourceMappingURL=ethlete-query.mjs.map