@ethlete/query 6.0.0-next.15 → 6.0.0-next.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @ethlete/query
2
2
 
3
+ ## 6.0.0-next.16
4
+
5
+ ### Minor Changes
6
+
7
+ - [`a41491d`](https://github.com/ethlete-io/ethdk/commit/a41491db447152e69902020d19bfc30bccf3b01d) Thanks [@TomTomB](https://github.com/TomTomB)! - Server violations → signal-forms bridge:
8
+ - `@ethlete/query`: `mapViolationsToFormErrors({ fieldTree, error, rewritePath?, onUnmappedViolation? })` maps an API error's violation list onto a signal form's fields (unmapped violations become form-level errors, violation-free failures degrade to a form-level `etServerError`), plus `extractFormViolations(error)`, `executeUntilSettled(query, executeArgs?)` for awaiting one execution as a settled snapshot, and the `isQueryErrorResponse` guard.
9
+ - `@ethlete/components`: `provideFormErrorMessageResolver(resolver)` lets apps centralize/localize the text `et-form-error` renders by error `kind`; the error's own `message` stays the default.
10
+
3
11
  ## 6.0.0-next.15
4
12
 
5
13
  ### Patch Changes
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { isDevMode, DestroyRef, InjectionToken, inject, Injector, EnvironmentInjector, ErrorHandler, createEnvironmentInjector, effect, untracked, signal, linkedSignal, computed, runInInjectionContext, assertInInjectionContext, ChangeDetectorRef, ViewContainerRef, TemplateRef, Input, Directive, ElementRef, input, Pipe, ViewEncapsulation, Component, DOCUMENT, NgZone } from '@angular/core';
3
3
  import { createStaticProvider, RuntimeError, clamp, createDestroy, computedTillTruthy, getCookie, setCookie, deleteCookie, createProvider, nextFrame, randomId, createRootProvider, isObject, injectRoute, getDomain, injectQueryParamChanges, injectQueryParams, clone, equal, ET_PROPERTY_REMOVED, previousSignalValue } from '@ethlete/core';
4
- import { filter, Subject, Subscription, Observable, tap, retry, throwError, timer, catchError, takeUntil, startWith, pairwise, switchMap, of, BehaviorSubject, fromEvent, take, ReplaySubject, map, shareReplay, interval, skip, takeWhile, combineLatest, EMPTY, withLatestFrom, debounceTime, merge, throttleTime } from 'rxjs';
4
+ import { filter, Subject, Subscription, Observable, tap, retry, throwError, timer, catchError, takeUntil, startWith, pairwise, switchMap, of, BehaviorSubject, fromEvent, take, ReplaySubject, map, shareReplay, interval, skip, takeWhile, combineLatest, EMPTY, withLatestFrom, debounceTime, firstValueFrom, merge, throttleTime } from 'rxjs';
5
5
  import { toObservable, takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
6
6
  import { HttpClient, HttpEventType, HttpErrorResponse, HttpHeaders, HttpStatusCode } from '@angular/common/http';
7
7
  import { getActiveConsumer, setActiveConsumer } from '@angular/core/primitives/signals';
@@ -1492,6 +1492,9 @@ const shouldRetryRequest = (options) => {
1492
1492
  return { retry: false };
1493
1493
  };
1494
1494
 
1495
+ const isQueryErrorResponse = (error) => {
1496
+ return typeof error === 'object' && error !== null && 'raw' in error && 'retryState' in error && 'isList' in error;
1497
+ };
1495
1498
  const createQueryErrorResponse = (error) => {
1496
1499
  let err = error instanceof HttpErrorResponse ? error : null;
1497
1500
  if (!err) {
@@ -5258,6 +5261,139 @@ const createPatchQuery = createQueryTemplate('PATCH');
5258
5261
  /** A query creator that creates a secure PATCH query (requires authentication) */
5259
5262
  const createSecurePatchQuery = createSecureQueryTemplate('PATCH');
5260
5263
 
5264
+ /** `kind` of a `ValidationError` created from a single server violation. */
5265
+ const SERVER_VIOLATION_ERROR_KIND = 'etServerViolation';
5266
+ /** `kind` of the form-level fallback error created when a failed request carries no violations. */
5267
+ const SERVER_ERROR_KIND = 'etServerError';
5268
+ /**
5269
+ * Extracts the violation list from a failed request in any of the shapes it may reach you:
5270
+ * a `QueryErrorResponse` (from `query.error()` or a settled snapshot), a raw `HttpErrorResponse`,
5271
+ * an already-unwrapped error body, or a plain violation array. Returns `[]` when the error
5272
+ * carries no violations.
5273
+ */
5274
+ const extractFormViolations = (error) => {
5275
+ if (!error)
5276
+ return [];
5277
+ const body = isQueryErrorResponse(error) ? error.raw.error : error instanceof HttpErrorResponse ? error.error : error;
5278
+ if (isSymfonyFormViolationListError(body)) {
5279
+ return body.violations;
5280
+ }
5281
+ if (isSymfonyListError(body)) {
5282
+ return body;
5283
+ }
5284
+ return [];
5285
+ };
5286
+ /**
5287
+ * Maps a failed request's violations onto a signal-forms field tree as validation errors —
5288
+ * the bridge between an API's violation list (`@ethlete/types` `FormViolationView`) and
5289
+ * signal forms.
5290
+ *
5291
+ * Each violation's `propertyPath` (e.g. `items[2].name`) is resolved against `fieldTree`; a
5292
+ * resolved violation becomes a `ServerViolationValidationError` bound to that field, an
5293
+ * unresolved one becomes a form-level error (customizable via `onUnmappedViolation`). A failed
5294
+ * request that carries no violations at all degrades to form-level `ServerValidationError`s
5295
+ * built from the normalized error message — so returning this function's result from a
5296
+ * `submit()` action never silently succeeds on failure.
5297
+ *
5298
+ * ```ts
5299
+ * await submit(this.form, async (field) => {
5300
+ * const snapshot = await executeUntilSettled(this.createPost, { args: { body: field().value() } });
5301
+ * const error = snapshot.error();
5302
+ *
5303
+ * if (!error) return;
5304
+ *
5305
+ * return mapViolationsToFormErrors({ fieldTree: field, error });
5306
+ * });
5307
+ * ```
5308
+ */
5309
+ const mapViolationsToFormErrors = (options) => {
5310
+ const { fieldTree, error, rewritePath, onUnmappedViolation } = options;
5311
+ if (error === null || error === undefined)
5312
+ return [];
5313
+ const violations = extractFormViolations(error);
5314
+ if (!violations.length) {
5315
+ // An empty violation array is an explicit "nothing to map" — only unrecognized error
5316
+ // shapes degrade to the form-level fallback.
5317
+ if (Array.isArray(error) && !error.length)
5318
+ return [];
5319
+ return createFallbackErrors(error);
5320
+ }
5321
+ const errors = [];
5322
+ for (const violation of violations) {
5323
+ const rawPath = violation.propertyPath;
5324
+ const path = rawPath && rewritePath ? rewritePath(rawPath, violation) : rawPath;
5325
+ const resolvedFieldTree = path ? resolveFieldTreePath(fieldTree, path) : null;
5326
+ if (resolvedFieldTree) {
5327
+ const mappedError = {
5328
+ kind: SERVER_VIOLATION_ERROR_KIND,
5329
+ message: violation.message,
5330
+ fieldTree: resolvedFieldTree,
5331
+ violation,
5332
+ };
5333
+ errors.push(mappedError);
5334
+ }
5335
+ else if (onUnmappedViolation) {
5336
+ const customError = onUnmappedViolation(violation);
5337
+ if (customError) {
5338
+ errors.push(customError);
5339
+ }
5340
+ }
5341
+ else {
5342
+ const unmappedError = {
5343
+ kind: SERVER_VIOLATION_ERROR_KIND,
5344
+ message: violation.message,
5345
+ violation,
5346
+ };
5347
+ errors.push(unmappedError);
5348
+ }
5349
+ }
5350
+ return errors;
5351
+ };
5352
+ const createFallbackErrors = (error) => {
5353
+ const queryError = isQueryErrorResponse(error) ? error : createQueryErrorResponse(error);
5354
+ if (queryError.isList) {
5355
+ return queryError.errors.map((item) => ({ kind: SERVER_ERROR_KIND, message: item.message }));
5356
+ }
5357
+ return [{ kind: SERVER_ERROR_KIND, message: queryError.error.message }];
5358
+ };
5359
+ /** Splits a property path like `items[2].name` or `translations['de'].title` into its segments. */
5360
+ const parsePropertyPath = (path) => {
5361
+ return path
5362
+ .replace(/\[(['"]?)([^\]]*?)\1\]/g, '.$2')
5363
+ .split('.')
5364
+ .filter((segment) => segment.length > 0);
5365
+ };
5366
+ const resolveFieldTreePath = (fieldTree, path) => {
5367
+ let current = fieldTree;
5368
+ for (const segment of parsePropertyPath(path)) {
5369
+ if (current === null || (typeof current !== 'object' && typeof current !== 'function')) {
5370
+ return null;
5371
+ }
5372
+ current = current[segment];
5373
+ }
5374
+ // A field tree node is callable (calling it returns the field state) — anything else means the
5375
+ // path left the tree (e.g. an index past the array's current length).
5376
+ return typeof current === 'function' ? current : null;
5377
+ };
5378
+
5379
+ /**
5380
+ * Executes the query and resolves once that execution has settled (response or error received).
5381
+ * The returned snapshot is frozen to the awaited execution, so a later execution can't swap the
5382
+ * `response()` / `error()` you read from it.
5383
+ *
5384
+ * Designed for imperative flows that need a mutation's outcome in place — e.g. a signal-forms
5385
+ * `submit()` action mapping server violations onto the form via `mapViolationsToFormErrors`.
5386
+ *
5387
+ * The promise stays pending if the execution is cancelled (e.g. `reset()`) and the query is never
5388
+ * executed again — the snapshot settles with whichever execution completes next.
5389
+ */
5390
+ const executeUntilSettled = async (query, executeArgs) => {
5391
+ query.execute(executeArgs);
5392
+ const snapshot = query.createSnapshot();
5393
+ await firstValueFrom(snapshot.isAlive.asObservable().pipe(filter((isAlive) => !isAlive)));
5394
+ return snapshot;
5395
+ };
5396
+
5261
5397
  const setupLeaderElection = () => {
5262
5398
  const destroyRef = inject(DestroyRef);
5263
5399
  const channelName = 'ethlete-auth-leader';
@@ -7521,5 +7657,5 @@ const createWebSocketClient = (options) => {
7521
7657
  * Generated bundle index. Do not edit.
7522
7658
  */
7523
7659
 
7524
- export { BasicAuthProvider, BearerAuthFeatureType, BooleanArrayQueryField, CLEAR_QUERY_ARGS, CustomHeaderAuthProvider, DateArrayQueryField, DateQueryField, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, LegacyQuery, LegacyQueryCreator, NumberArrayQueryField, ParseHttpErrorCodeToMessageDePipe, ParseHttpErrorCodeToMessageEnPipe, ParseHttpErrorCodeToTitleDePipe, ParseHttpErrorCodeToTitleEnPipe, QUERY_CLIENT_DEVTOOLS_TOKEN, QueryDevtoolsComponent, QueryDirective, QueryError, QueryFeatureType, QueryField, QueryForm, QueryRuntimeErrorCode, QueryShortNamePipe, QueryStore, SPEED_BUFFER_TIME_IN_MS, SearchQueryField, SortQueryField, StringArrayQueryField, V2BearerAuthProvider, V2Query, V2QueryClient, V2QueryCreator, addQueryContainerHandling, applyQueryFeatures, authExtractTokensResponseMissingAccessToken, authExtractTokensResponseMissingRefreshToken, authExtractTokensResponseNotObject, authProviderFeatureUsedMultipleTimes, buildErrorMessage, buildQueryCacheKey, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, circularQueryDependency, circularQueryDependencyChecker, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, contentfulGqlLikePaginationAdapter, createBaseQuery, createBaseQueryCreator, createBearerAuthProvider, createDeleteQuery, createExecuteFn, createGetQuery, createGqlExecuteFn, createGqlMutationViaGet, createGqlMutationViaPost, createGqlQuery, createGqlQueryCreator, createGqlQueryViaGet, createGqlQueryViaPost, createHttpRequest, createInfinityQueryConfig, createLegacyQueryCreator, createPagedQueryStack, createPatchQuery, createPersistentAuthFeature, createPostQuery, createPutQuery, createQuery, createQueryClient, createQueryCollection, createQueryCollectionSignal, createQueryCollectionSubject, createQueryContext, createQueryCreator, createQueryErrorResponse, createQueryFeature, createQueryObject, createQueryRepository, createQuerySnapshotFn, createQueryStack, createSecureDeleteQuery, createSecureExecuteFactory, createSecureExecuteFn, createSecureGetQuery, createSecureGqlExecuteFn, createSecureGqlMutationViaGet, createSecureGqlMutationViaPost, createSecureGqlQuery, createSecureGqlQueryCreator, createSecureGqlQueryViaGet, createSecureGqlQueryViaPost, createSecurePatchQuery, createSecurePostQuery, createSecurePutQuery, createSecureQuery, createSecureQueryCreator, createTrackingFeature, createWebSocketClient, decryptBearer, deepFreeze, def, detectContentTypeHeader, dynLikePaginationAdapter, effectComputed, ethletePaginationAdapter, extractExpiresInSeconds, extractQuery, fakePaginationAdapter, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getQueryFeatureUsage, getResponseUrl, ggLikePaginationAdapter, gql, gqlDataPropertyMissingInResponse, hasHeader, ignoreAutoRefresh, injectInfinityQueryResponseDelay, injectQueryContext, insertFrom, invalidBaseRouteError, invalidBodyError, invalidRouteError, invalidStateInsideSecureExecuteFactory, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCreateGqlQueryOptions, isCustomHeaderAuthProvider, isEmptyString, isGqlQueryConfig, isLegacyQuery, isNaN$1 as isNaN, isQuery, isQueryCollection, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyListError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, maybeExecute, mergeHeaders, nestedEffect, pagedQueryStackNextPageCalledWithoutPreviousPage, pagedQueryStackPageBiggerThanTotalPages, pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToTitleEn, pathParamsMissingInRouteFunctionError, provideInfinityQueryResponseDelay, provideQueryClientForDevtools, queryArrayComputed, queryComputed, queryComputedTillTruthy, queryExecute, queryFeatureUsedMultipleTimes, queryStackTotalQueriesAndExpectedQueriesMismatch, queryStackWithArgsUsed, queryStackWithResponseUpdateUsed, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, queryStateErrorSignal, queryStateLoadingSignal, queryStateResponseSignal, queryStateSignal, removeFrom, request, resetExecuteState, resetPageOnError, serializeBody, setupQueryDependencies, setupQueryExecuteState, setupQueryState, shouldAutoExecuteGqlQuery, shouldAutoExecuteQuery, shouldCacheQuery, shouldRetryRequest, silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent, skipPaginationPageParamCalculator, splitQueryConfig, switchQueryCollectionState, switchQueryState, takeUntilResponse, toQuerySignal, toQuerySubject, tokensNotAvailableInsideAuthAndExec, transformArrayResponse, transformExecStateToQueryState, transformGql, transformMethod, transformPaginatedResponse, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray, uncacheableRequestHasAllowCacheParam, uncacheableRequestHasCacheKeyParam, v2BuildQueryCacheKey, v2ExtractExpiresInSeconds, v2ShouldCacheQuery, v2ShouldRetryRequest, withArgs, withArgsQueryFeatureMissingButRouteIsFunction, withAuthenticationQuery, withAutoRefresh, withAutoRefreshUsedInManualQuery, withAutoRefreshUsedOnUnsupportedHttpMethod, withErrorHandling, withInactivityLogout, withLogging, withPersistentAuth, withPolling, withPollingUsedOnUnsupportedHttpMethod, withRefreshQuery, withResponseUpdate, withSuccessHandling, withTokenExpirationWarning, withTokenRevocation, withTracking, wrapAsObservableSignal };
7660
+ export { BasicAuthProvider, BearerAuthFeatureType, BooleanArrayQueryField, CLEAR_QUERY_ARGS, CustomHeaderAuthProvider, DateArrayQueryField, DateQueryField, EntityStore, INFINITY_QUERY_TOKEN, InfinityQuery, InfinityQueryDirective, InfinityQueryTriggerDirective, LegacyQuery, LegacyQueryCreator, NumberArrayQueryField, ParseHttpErrorCodeToMessageDePipe, ParseHttpErrorCodeToMessageEnPipe, ParseHttpErrorCodeToTitleDePipe, ParseHttpErrorCodeToTitleEnPipe, QUERY_CLIENT_DEVTOOLS_TOKEN, QueryDevtoolsComponent, QueryDirective, QueryError, QueryFeatureType, QueryField, QueryForm, QueryRuntimeErrorCode, QueryShortNamePipe, QueryStore, SERVER_ERROR_KIND, SERVER_VIOLATION_ERROR_KIND, SPEED_BUFFER_TIME_IN_MS, SearchQueryField, SortQueryField, StringArrayQueryField, V2BearerAuthProvider, V2Query, V2QueryClient, V2QueryCreator, addQueryContainerHandling, applyQueryFeatures, authExtractTokensResponseMissingAccessToken, authExtractTokensResponseMissingRefreshToken, authExtractTokensResponseNotObject, authProviderFeatureUsedMultipleTimes, buildErrorMessage, buildQueryCacheKey, buildQueryString, buildRoute, buildTimestampFromSeconds, castQueryCreatorTypes, circularQueryDependency, circularQueryDependencyChecker, computeQueryAuthHeader, computeQueryBody, computeQueryHeaders, computeQueryMethod, computeQueryQueryParams, contentfulGqlLikePaginationAdapter, createBaseQuery, createBaseQueryCreator, createBearerAuthProvider, createDeleteQuery, createExecuteFn, createGetQuery, createGqlExecuteFn, createGqlMutationViaGet, createGqlMutationViaPost, createGqlQuery, createGqlQueryCreator, createGqlQueryViaGet, createGqlQueryViaPost, createHttpRequest, createInfinityQueryConfig, createLegacyQueryCreator, createPagedQueryStack, createPatchQuery, createPersistentAuthFeature, createPostQuery, createPutQuery, createQuery, createQueryClient, createQueryCollection, createQueryCollectionSignal, createQueryCollectionSubject, createQueryContext, createQueryCreator, createQueryErrorResponse, createQueryFeature, createQueryObject, createQueryRepository, createQuerySnapshotFn, createQueryStack, createSecureDeleteQuery, createSecureExecuteFactory, createSecureExecuteFn, createSecureGetQuery, createSecureGqlExecuteFn, createSecureGqlMutationViaGet, createSecureGqlMutationViaPost, createSecureGqlQuery, createSecureGqlQueryCreator, createSecureGqlQueryViaGet, createSecureGqlQueryViaPost, createSecurePatchQuery, createSecurePostQuery, createSecurePutQuery, createSecureQuery, createSecureQueryCreator, createTrackingFeature, createWebSocketClient, decryptBearer, deepFreeze, def, detectContentTypeHeader, dynLikePaginationAdapter, effectComputed, ethletePaginationAdapter, executeUntilSettled, extractExpiresInSeconds, extractFormViolations, extractQuery, fakePaginationAdapter, filterFailure, filterNull, filterQueryStates, filterSuccess, forEachHeader, getDefaultHeaders, getQueryFeatureUsage, getResponseUrl, ggLikePaginationAdapter, gql, gqlDataPropertyMissingInResponse, hasHeader, ignoreAutoRefresh, injectInfinityQueryResponseDelay, injectQueryContext, insertFrom, invalidBaseRouteError, invalidBodyError, invalidRouteError, invalidStateInsideSecureExecuteFactory, isAutoRefresh, isBasicAuthProvider, isBearerAuthProvider, isClassValidatorError, isCreateGqlQueryOptions, isCustomHeaderAuthProvider, isEmptyString, isGqlQueryConfig, isLegacyQuery, isNaN$1 as isNaN, isQuery, isQueryCollection, isQueryErrorResponse, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, isRequestError, isSymfonyError, isSymfonyFormViolationListError, isSymfonyListError, isSymfonyPagerfantaOutOfRangeError, mapToPaginated, mapViolationsToFormErrors, maybeExecute, mergeHeaders, nestedEffect, pagedQueryStackNextPageCalledWithoutPreviousPage, pagedQueryStackPageBiggerThanTotalPages, pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage, paginatedEntityValueUpdater, parseAllXhrResponseHeaders, parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleDe, parseHttpErrorCodeToTitleEn, pathParamsMissingInRouteFunctionError, provideInfinityQueryResponseDelay, provideQueryClientForDevtools, queryArrayComputed, queryComputed, queryComputedTillTruthy, queryExecute, queryFeatureUsedMultipleTimes, queryStackTotalQueriesAndExpectedQueriesMismatch, queryStackWithArgsUsed, queryStackWithResponseUpdateUsed, queryStateAlreadyHasKeyError, queryStateCannotTransformError, queryStateDoesNotContainKeyError, queryStateErrorSignal, queryStateLoadingSignal, queryStateResponseSignal, queryStateSignal, removeFrom, request, resetExecuteState, resetPageOnError, serializeBody, setupQueryDependencies, setupQueryExecuteState, setupQueryState, shouldAutoExecuteGqlQuery, shouldAutoExecuteQuery, shouldCacheQuery, shouldRetryRequest, silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent, skipPaginationPageParamCalculator, splitQueryConfig, switchQueryCollectionState, switchQueryState, takeUntilResponse, toQuerySignal, toQuerySubject, tokensNotAvailableInsideAuthAndExec, transformArrayResponse, transformExecStateToQueryState, transformGql, transformMethod, transformPaginatedResponse, transformToBoolean, transformToBooleanArray, transformToDate, transformToDateArray, transformToNumber, transformToNumberArray, transformToSort, transformToSortQueryParam, transformToString, transformToStringArray, uncacheableRequestHasAllowCacheParam, uncacheableRequestHasCacheKeyParam, v2BuildQueryCacheKey, v2ExtractExpiresInSeconds, v2ShouldCacheQuery, v2ShouldRetryRequest, withArgs, withArgsQueryFeatureMissingButRouteIsFunction, withAuthenticationQuery, withAutoRefresh, withAutoRefreshUsedInManualQuery, withAutoRefreshUsedOnUnsupportedHttpMethod, withErrorHandling, withInactivityLogout, withLogging, withPersistentAuth, withPolling, withPollingUsedOnUnsupportedHttpMethod, withRefreshQuery, withResponseUpdate, withSuccessHandling, withTokenExpirationWarning, withTokenRevocation, withTracking, wrapAsObservableSignal };
7525
7661
  //# sourceMappingURL=ethlete-query.mjs.map