@ethlete/query 5.32.2 → 5.32.4
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 +12 -0
- package/fesm2022/ethlete-query.mjs +105 -75
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/lib/experimental/http/query-dependencies.d.ts +3 -1
- package/lib/experimental/http/query-utils.d.ts +5 -3
- package/lib/experimental/http/secure-query-execute.d.ts +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @ethlete/query
|
|
2
2
|
|
|
3
|
+
## 5.32.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`7bac305`](https://github.com/ethlete-io/ethdk/commit/7bac305e9d5777607e8d867ce70660f9162b0a19) Thanks [@TomTomB](https://github.com/TomTomB)! - Remove logging
|
|
8
|
+
|
|
9
|
+
## 5.32.3
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [`dddec28`](https://github.com/ethlete-io/ethdk/commit/dddec287777b0eebaf894766548eafa622309e53) Thanks [@TomTomB](https://github.com/TomTomB)! - Fix race condition during query execution where the args would not yet represent the current state since an effect was still pending
|
|
14
|
+
|
|
3
15
|
## 5.32.2
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -3,7 +3,7 @@ import { createDestroy, computedTillTruthy, syncSignal, getCookie, setCookie, de
|
|
|
3
3
|
import { Observable, takeUntil, startWith, pairwise, tap, switchMap, of, BehaviorSubject, Subject, fromEvent, timer, take, filter, takeWhile, map, shareReplay, ReplaySubject, combineLatest, interval, skip, withLatestFrom, debounceTime, Subscription, retry, throwError, catchError, merge } from 'rxjs';
|
|
4
4
|
import { HttpStatusCode, HttpErrorResponse, HttpEventType, HttpClient, HttpHeaders } from '@angular/common/http';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
6
|
-
import { assertInInjectionContext, inject, Injector, computed, signal, isDevMode, untracked, TemplateRef, ViewContainerRef, ErrorHandler, ChangeDetectorRef, Directive, Input, InjectionToken, ElementRef, Pipe, effect, Component, ChangeDetectionStrategy, ViewEncapsulation, runInInjectionContext, EnvironmentInjector, createEnvironmentInjector, DestroyRef, NgZone } from '@angular/core';
|
|
6
|
+
import { assertInInjectionContext, inject, Injector, computed, signal, isDevMode, untracked, TemplateRef, ViewContainerRef, ErrorHandler, ChangeDetectorRef, Directive, Input, InjectionToken, ElementRef, Pipe, effect, Component, ChangeDetectionStrategy, ViewEncapsulation, runInInjectionContext, EnvironmentInjector, createEnvironmentInjector, DestroyRef, ɵEffectScheduler as _EffectScheduler, NgZone } from '@angular/core';
|
|
7
7
|
import { toSignal, toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
8
|
import { AsyncPipe, JsonPipe, NgClass } from '@angular/common';
|
|
9
9
|
import * as i1$1 from '@angular/forms';
|
|
@@ -1986,10 +1986,10 @@ class QueryDirective {
|
|
|
1986
1986
|
this._viewContainerRef.createEmbeddedView(this._mainTemplateRef, this._viewContext);
|
|
1987
1987
|
}
|
|
1988
1988
|
}
|
|
1989
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
1990
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.
|
|
1989
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: QueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1990
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.1", type: QueryDirective, isStandalone: true, selector: "[etQuery]", inputs: { query: ["etQuery", "query"], cache: ["etQueryCache", "cache"] }, ngImport: i0 }); }
|
|
1991
1991
|
}
|
|
1992
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
1992
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: QueryDirective, decorators: [{
|
|
1993
1993
|
type: Directive,
|
|
1994
1994
|
args: [{
|
|
1995
1995
|
selector: '[etQuery]',
|
|
@@ -2297,10 +2297,10 @@ class InfinityQueryDirective {
|
|
|
2297
2297
|
this._viewContext.currentQuery = null;
|
|
2298
2298
|
this._data$.next([]);
|
|
2299
2299
|
}
|
|
2300
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
2301
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.
|
|
2300
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: InfinityQueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
2301
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.1", type: InfinityQueryDirective, isStandalone: true, selector: "[etInfinityQuery]", inputs: { infinityQuery: ["etInfinityQuery", "infinityQuery"] }, providers: [{ provide: INFINITY_QUERY_TOKEN, useExisting: InfinityQueryDirective }], exportAs: ["etInfinityQuery"], hostDirectives: [{ directive: i1.DelayableDirective }], ngImport: i0 }); }
|
|
2302
2302
|
}
|
|
2303
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
2303
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: InfinityQueryDirective, decorators: [{
|
|
2304
2304
|
type: Directive,
|
|
2305
2305
|
args: [{
|
|
2306
2306
|
selector: '[etInfinityQuery]',
|
|
@@ -2352,10 +2352,10 @@ class InfinityQueryTriggerDirective {
|
|
|
2352
2352
|
});
|
|
2353
2353
|
this._observer.observe(this._elementRef.nativeElement);
|
|
2354
2354
|
}
|
|
2355
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
2356
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.
|
|
2355
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: InfinityQueryTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
2356
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.1", type: InfinityQueryTriggerDirective, isStandalone: true, selector: "[etInfinityQueryTrigger], et-infinity-query-trigger", inputs: { scrollContainerSelector: "scrollContainerSelector" }, ngImport: i0 }); }
|
|
2357
2357
|
}
|
|
2358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
2358
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: InfinityQueryTriggerDirective, decorators: [{
|
|
2359
2359
|
type: Directive,
|
|
2360
2360
|
args: [{
|
|
2361
2361
|
selector: '[etInfinityQueryTrigger], et-infinity-query-trigger',
|
|
@@ -2379,10 +2379,10 @@ class QueryShortNamePipe {
|
|
|
2379
2379
|
}
|
|
2380
2380
|
return route;
|
|
2381
2381
|
}
|
|
2382
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
2383
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
2382
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: QueryShortNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
2383
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: QueryShortNamePipe, isStandalone: true, name: "queryShortName" }); }
|
|
2384
2384
|
}
|
|
2385
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
2385
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: QueryShortNamePipe, decorators: [{
|
|
2386
2386
|
type: Pipe,
|
|
2387
2387
|
args: [{ name: 'queryShortName', standalone: true }]
|
|
2388
2388
|
}] });
|
|
@@ -2673,10 +2673,10 @@ class QueryDevtoolsComponent {
|
|
|
2673
2673
|
clearQueryHistory() {
|
|
2674
2674
|
this.queryHistory$.next([]);
|
|
2675
2675
|
}
|
|
2676
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
2677
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.0", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Query Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}button.et-query-devtools-open-btn{position:fixed;inset-inline-end:20px;inset-block-end:0;z-index:9999;font-family:monospace;border-radius:3px 3px 0 0;line-height:14px;font-size:12px}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid rgb(59.734939759,66.1927710843,74.265060241);list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;grid-template-columns:auto minmax(0,1fr);gap:2px;display:block}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-auth-provider__viewer{border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-left:-12px;margin-right:-12px;margin-bottom:-12px;padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }, { kind: "directive", type: QueryDirective, selector: "[etQuery]", inputs: ["etQuery", "etQueryCache"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
2676
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: QueryDevtoolsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2677
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.1", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Query Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}button.et-query-devtools-open-btn{position:fixed;inset-inline-end:20px;inset-block-end:0;z-index:9999;font-family:monospace;border-radius:3px 3px 0 0;line-height:14px;font-size:12px}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid rgb(59.734939759,66.1927710843,74.265060241);list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid rgb(59.734939759,66.1927710843,74.265060241);background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;grid-template-columns:auto minmax(0,1fr);gap:2px;display:block}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-auth-provider__viewer{border-top:1px solid rgb(59.734939759,66.1927710843,74.265060241);margin-left:-12px;margin-right:-12px;margin-bottom:-12px;padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }, { kind: "directive", type: QueryDirective, selector: "[etQuery]", inputs: ["etQuery", "etQueryCache"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
2678
2678
|
}
|
|
2679
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
2679
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: QueryDevtoolsComponent, decorators: [{
|
|
2680
2680
|
type: Component,
|
|
2681
2681
|
args: [{ selector: 'et-query-devtools', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, host: {
|
|
2682
2682
|
class: 'et-query-devtools',
|
|
@@ -3248,33 +3248,42 @@ const createQuerySnapshotFn = (options) => {
|
|
|
3248
3248
|
* This will also pause polling and auto refresh until new args are set.
|
|
3249
3249
|
*/
|
|
3250
3250
|
const CLEAR_QUERY_ARGS = Symbol('CLEAR_QUERY_ARGS');
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
const queryEffect = (fn, errorMessage, options) => {
|
|
3254
|
-
let lastTriggerTs = 0;
|
|
3255
|
-
let illegalWrites = 0;
|
|
3256
|
-
let isFirstRun = true;
|
|
3251
|
+
/** A angular effect that can be nested inside another effect */
|
|
3252
|
+
const nestedEffect = (fn, options) => {
|
|
3257
3253
|
const activeConsumer = getActiveConsumer();
|
|
3258
3254
|
setActiveConsumer(null);
|
|
3259
3255
|
const eff = effect(() => {
|
|
3260
|
-
|
|
3261
|
-
const now = performance.now();
|
|
3262
|
-
if (now - lastTriggerTs < 100) {
|
|
3263
|
-
illegalWrites++;
|
|
3264
|
-
if (illegalWrites > 5) {
|
|
3265
|
-
throw new Error(errorMessage);
|
|
3266
|
-
}
|
|
3267
|
-
}
|
|
3268
|
-
lastTriggerTs = now;
|
|
3269
|
-
}
|
|
3270
|
-
fn(isFirstRun);
|
|
3271
|
-
if (isFirstRun) {
|
|
3272
|
-
isFirstRun = false;
|
|
3273
|
-
}
|
|
3256
|
+
fn();
|
|
3274
3257
|
}, options);
|
|
3275
3258
|
setActiveConsumer(activeConsumer);
|
|
3276
3259
|
return eff;
|
|
3277
3260
|
};
|
|
3261
|
+
const CIRCULAR_QUERY_DEPENDENCY_ERROR_MESSAGE = 'Query was executed more than 5 times in less than 100ms. This is usually a sign of a circular dependency.';
|
|
3262
|
+
const circularQueryDependencyChecker = () => {
|
|
3263
|
+
let lastTriggerTs = 0;
|
|
3264
|
+
let illegalWrites = 0;
|
|
3265
|
+
// Typing this as number will throw an type error during testing since it is of type Timeout in a node env.
|
|
3266
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3267
|
+
let timeout = null;
|
|
3268
|
+
const check = () => {
|
|
3269
|
+
const now = performance.now();
|
|
3270
|
+
if (now - lastTriggerTs < 100) {
|
|
3271
|
+
illegalWrites++;
|
|
3272
|
+
if (illegalWrites > 5) {
|
|
3273
|
+
throw new Error(CIRCULAR_QUERY_DEPENDENCY_ERROR_MESSAGE);
|
|
3274
|
+
}
|
|
3275
|
+
}
|
|
3276
|
+
lastTriggerTs = now;
|
|
3277
|
+
if (timeout)
|
|
3278
|
+
clearTimeout(timeout);
|
|
3279
|
+
timeout = setTimeout(() => {
|
|
3280
|
+
illegalWrites = 0;
|
|
3281
|
+
}, 100);
|
|
3282
|
+
};
|
|
3283
|
+
return {
|
|
3284
|
+
check,
|
|
3285
|
+
};
|
|
3286
|
+
};
|
|
3278
3287
|
const shouldAutoExecuteQuery = (method) => {
|
|
3279
3288
|
return method === 'GET' || method === 'HEAD' || method === 'OPTIONS';
|
|
3280
3289
|
};
|
|
@@ -3699,7 +3708,7 @@ const withArgs = (args) => {
|
|
|
3699
3708
|
type: "withArgs" /* QueryFeatureType.WithArgs */,
|
|
3700
3709
|
fn: (context) => {
|
|
3701
3710
|
const currArgs = computed(() => args());
|
|
3702
|
-
|
|
3711
|
+
nestedEffect(() => {
|
|
3703
3712
|
const currArgsNow = currArgs();
|
|
3704
3713
|
if (currArgsNow === null)
|
|
3705
3714
|
return;
|
|
@@ -3712,7 +3721,7 @@ const withArgs = (args) => {
|
|
|
3712
3721
|
if (context.flags.shouldAutoExecute)
|
|
3713
3722
|
context.execute({ args: currArgsNow });
|
|
3714
3723
|
});
|
|
3715
|
-
},
|
|
3724
|
+
}, { injector: context.deps.injector });
|
|
3716
3725
|
},
|
|
3717
3726
|
});
|
|
3718
3727
|
};
|
|
@@ -3731,7 +3740,7 @@ const withPolling = (options) => {
|
|
|
3731
3740
|
throw withPollingUsedOnUnsupportedHttpMethod(context.flags.method);
|
|
3732
3741
|
}
|
|
3733
3742
|
let intervalId = null;
|
|
3734
|
-
|
|
3743
|
+
nestedEffect(() => {
|
|
3735
3744
|
const args = context.state.args();
|
|
3736
3745
|
untracked(() => {
|
|
3737
3746
|
if (intervalId !== null)
|
|
@@ -3747,7 +3756,7 @@ const withPolling = (options) => {
|
|
|
3747
3756
|
context.execute({ args });
|
|
3748
3757
|
}, options.interval);
|
|
3749
3758
|
});
|
|
3750
|
-
},
|
|
3759
|
+
}, { injector: context.deps.injector });
|
|
3751
3760
|
context.deps.destroyRef.onDestroy(() => intervalId !== null && clearInterval(intervalId));
|
|
3752
3761
|
},
|
|
3753
3762
|
});
|
|
@@ -3757,14 +3766,14 @@ const withLogging = (options) => {
|
|
|
3757
3766
|
return createQueryFeature({
|
|
3758
3767
|
type: "withLogging" /* QueryFeatureType.WithLogging */,
|
|
3759
3768
|
fn: (context) => {
|
|
3760
|
-
|
|
3769
|
+
nestedEffect(() => {
|
|
3761
3770
|
const event = context.state.latestHttpEvent();
|
|
3762
3771
|
if (event === null)
|
|
3763
3772
|
return;
|
|
3764
3773
|
untracked(() => {
|
|
3765
3774
|
options.logFn(event);
|
|
3766
3775
|
});
|
|
3767
|
-
},
|
|
3776
|
+
}, { injector: context.deps.injector });
|
|
3768
3777
|
},
|
|
3769
3778
|
});
|
|
3770
3779
|
};
|
|
@@ -3773,14 +3782,14 @@ const withErrorHandling = (options) => {
|
|
|
3773
3782
|
return createQueryFeature({
|
|
3774
3783
|
type: "withErrorHandling" /* QueryFeatureType.WithErrorHandling */,
|
|
3775
3784
|
fn: (context) => {
|
|
3776
|
-
|
|
3785
|
+
nestedEffect(() => {
|
|
3777
3786
|
const error = context.state.error();
|
|
3778
3787
|
if (error === null)
|
|
3779
3788
|
return;
|
|
3780
3789
|
untracked(() => {
|
|
3781
3790
|
options.handler(error);
|
|
3782
3791
|
});
|
|
3783
|
-
},
|
|
3792
|
+
}, { injector: context.deps.injector });
|
|
3784
3793
|
},
|
|
3785
3794
|
});
|
|
3786
3795
|
};
|
|
@@ -3789,14 +3798,14 @@ const withSuccessHandling = (options) => {
|
|
|
3789
3798
|
return createQueryFeature({
|
|
3790
3799
|
type: "withSuccessHandling" /* QueryFeatureType.WithSuccessHandling */,
|
|
3791
3800
|
fn: (context) => {
|
|
3792
|
-
|
|
3801
|
+
nestedEffect(() => {
|
|
3793
3802
|
const response = context.state.response();
|
|
3794
3803
|
if (response === null)
|
|
3795
3804
|
return;
|
|
3796
3805
|
untracked(() => {
|
|
3797
3806
|
options.handler(response);
|
|
3798
3807
|
});
|
|
3799
|
-
},
|
|
3808
|
+
}, { injector: context.deps.injector });
|
|
3800
3809
|
},
|
|
3801
3810
|
});
|
|
3802
3811
|
};
|
|
@@ -3815,7 +3824,7 @@ const withAutoRefresh = (options) => {
|
|
|
3815
3824
|
if (context.flags.onlyManualExecution && !options.ignoreOnlyManualExecution) {
|
|
3816
3825
|
throw withAutoRefreshUsedInManualQuery();
|
|
3817
3826
|
}
|
|
3818
|
-
|
|
3827
|
+
nestedEffect(() => {
|
|
3819
3828
|
for (const signal of options.onSignalChanges) {
|
|
3820
3829
|
signal();
|
|
3821
3830
|
}
|
|
@@ -3827,7 +3836,7 @@ const withAutoRefresh = (options) => {
|
|
|
3827
3836
|
return;
|
|
3828
3837
|
context.execute({ args });
|
|
3829
3838
|
});
|
|
3830
|
-
},
|
|
3839
|
+
}, { injector: context.deps.injector });
|
|
3831
3840
|
},
|
|
3832
3841
|
});
|
|
3833
3842
|
};
|
|
@@ -3835,7 +3844,7 @@ const withResponseUpdate = (options) => {
|
|
|
3835
3844
|
return createQueryFeature({
|
|
3836
3845
|
type: "withResponseUpdate" /* QueryFeatureType.WithResponseUpdate */,
|
|
3837
3846
|
fn: (context) => {
|
|
3838
|
-
|
|
3847
|
+
nestedEffect(() => {
|
|
3839
3848
|
const currentResponse = untracked(() => context.state.response());
|
|
3840
3849
|
const response = options.updater({ currentResponse });
|
|
3841
3850
|
if (response === null)
|
|
@@ -3843,7 +3852,7 @@ const withResponseUpdate = (options) => {
|
|
|
3843
3852
|
untracked(() => {
|
|
3844
3853
|
context.state.response.set(response);
|
|
3845
3854
|
});
|
|
3846
|
-
},
|
|
3855
|
+
}, { injector: context.deps.injector });
|
|
3847
3856
|
},
|
|
3848
3857
|
});
|
|
3849
3858
|
};
|
|
@@ -4152,11 +4161,13 @@ const setupQueryDependencies = (options) => {
|
|
|
4152
4161
|
const destroyRef = queryEnvironmentInjector.get(DestroyRef);
|
|
4153
4162
|
const scopeDestroyRef = inject(DestroyRef);
|
|
4154
4163
|
const client = inject(options.clientConfig.token);
|
|
4164
|
+
const effectScheduler = inject(_EffectScheduler);
|
|
4155
4165
|
const dependencies = {
|
|
4156
4166
|
destroyRef,
|
|
4157
4167
|
scopeDestroyRef,
|
|
4158
4168
|
client,
|
|
4159
4169
|
injector: queryEnvironmentInjector,
|
|
4170
|
+
effectScheduler,
|
|
4160
4171
|
};
|
|
4161
4172
|
// cleanup the environment injector when the scope (e.g. the component the query is in) is destroyed
|
|
4162
4173
|
const scopeDestroyListener = scopeDestroyRef.onDestroy(() => {
|
|
@@ -4231,8 +4242,13 @@ const cleanupPreviousExecute = (options) => {
|
|
|
4231
4242
|
|
|
4232
4243
|
const createExecuteFn = (executeOptions) => {
|
|
4233
4244
|
const executeState = setupQueryExecuteState();
|
|
4245
|
+
const circularChecker = circularQueryDependencyChecker();
|
|
4234
4246
|
const reset = () => resetExecuteState({ executeState, executeOptions });
|
|
4235
4247
|
const exec = (executeArgs) => {
|
|
4248
|
+
circularChecker.check();
|
|
4249
|
+
// Make sure all effects are flushed before reading the args.
|
|
4250
|
+
// A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.
|
|
4251
|
+
executeOptions.deps.effectScheduler.flush();
|
|
4236
4252
|
const { args = executeOptions.state.args(), options } = executeArgs ?? {};
|
|
4237
4253
|
cleanupPreviousExecute({ executeOptions, executeState });
|
|
4238
4254
|
queryExecute({ executeOptions, executeState, args, options });
|
|
@@ -4414,17 +4430,18 @@ const createQueryCreator = (options, internals) => {
|
|
|
4414
4430
|
};
|
|
4415
4431
|
|
|
4416
4432
|
const AUTH_HEADER = 'Authorization';
|
|
4417
|
-
const createSecureExecuteFn = (
|
|
4433
|
+
const createSecureExecuteFn = (executeOptions) => {
|
|
4418
4434
|
const executeState = setupQueryExecuteState();
|
|
4419
|
-
const authProvider = inject(
|
|
4435
|
+
const authProvider = inject(executeOptions.creatorInternals.authProvider.token);
|
|
4436
|
+
const circularChecker = circularQueryDependencyChecker();
|
|
4420
4437
|
let authQuerySubscription = Subscription.EMPTY;
|
|
4421
4438
|
const reset = () => {
|
|
4422
4439
|
authQuerySubscription.unsubscribe();
|
|
4423
4440
|
authQuerySubscription = Subscription.EMPTY;
|
|
4424
|
-
resetExecuteState({ executeState, executeOptions:
|
|
4441
|
+
resetExecuteState({ executeState, executeOptions: executeOptions });
|
|
4425
4442
|
};
|
|
4426
4443
|
const error = (query) => {
|
|
4427
|
-
const state =
|
|
4444
|
+
const state = executeOptions.state;
|
|
4428
4445
|
state.error.set(query.error());
|
|
4429
4446
|
state.loading.set(null);
|
|
4430
4447
|
state.response.set(null);
|
|
@@ -4443,41 +4460,49 @@ const createSecureExecuteFn = (options) => {
|
|
|
4443
4460
|
}
|
|
4444
4461
|
const updatedArgs = { ...(args ?? {}), headers };
|
|
4445
4462
|
queryExecute({
|
|
4446
|
-
executeOptions:
|
|
4463
|
+
executeOptions: executeOptions,
|
|
4447
4464
|
executeState,
|
|
4448
4465
|
args: updatedArgs,
|
|
4449
4466
|
options: runOptions,
|
|
4450
4467
|
});
|
|
4451
4468
|
};
|
|
4452
4469
|
const exec = (executeArgs) => {
|
|
4470
|
+
circularChecker.check();
|
|
4471
|
+
// Make sure all effects are flushed before reading the args.
|
|
4472
|
+
// A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.
|
|
4473
|
+
executeOptions.deps.effectScheduler.flush();
|
|
4474
|
+
const execArgsWithDefaults = {
|
|
4475
|
+
args: executeArgs?.args ?? executeOptions.state.args(),
|
|
4476
|
+
options: executeArgs?.options,
|
|
4477
|
+
};
|
|
4453
4478
|
authQuerySubscription.unsubscribe();
|
|
4454
4479
|
authQuerySubscription = Subscription.EMPTY;
|
|
4455
|
-
cleanupPreviousExecute({ executeOptions:
|
|
4480
|
+
cleanupPreviousExecute({ executeOptions: executeOptions, executeState });
|
|
4456
4481
|
const authQuery = authProvider.latestExecutedQuery();
|
|
4457
4482
|
// This might happen if a secure query gets executed while the auth query has just been created.
|
|
4458
4483
|
// This is due to the fact that the query state is being synced with the state inside the http request using effect.
|
|
4459
4484
|
const isAuthQueryFreshlyExecuted = authQuery?.lastTimeExecutedAt() === null;
|
|
4460
4485
|
if (!authQuery || authQuery.loading() || isAuthQueryFreshlyExecuted) {
|
|
4461
|
-
|
|
4462
|
-
authQuerySubscription = toObservable(authProvider.latestExecutedQuery, { injector:
|
|
4486
|
+
executeOptions.state.loading.set({ executeTime: Date.now(), progress: null });
|
|
4487
|
+
authQuerySubscription = toObservable(authProvider.latestExecutedQuery, { injector: executeOptions.deps.injector })
|
|
4463
4488
|
.pipe(switchMap((query) => {
|
|
4464
4489
|
if (!query)
|
|
4465
4490
|
return of(null);
|
|
4466
|
-
return toObservable(query.isAlive, { injector:
|
|
4491
|
+
return toObservable(query.isAlive, { injector: executeOptions.deps.injector }).pipe(tap((isAlive) => {
|
|
4467
4492
|
if (isAlive)
|
|
4468
4493
|
return;
|
|
4469
4494
|
if (query.error()) {
|
|
4470
4495
|
error(query);
|
|
4471
4496
|
}
|
|
4472
4497
|
else if (query.response()) {
|
|
4473
|
-
authAndExec(
|
|
4498
|
+
authAndExec(execArgsWithDefaults);
|
|
4474
4499
|
}
|
|
4475
4500
|
}));
|
|
4476
4501
|
}))
|
|
4477
4502
|
.subscribe();
|
|
4478
4503
|
}
|
|
4479
4504
|
else if (authQuery.response()) {
|
|
4480
|
-
authAndExec(
|
|
4505
|
+
authAndExec(execArgsWithDefaults);
|
|
4481
4506
|
}
|
|
4482
4507
|
else if (authQuery.error()) {
|
|
4483
4508
|
error(authQuery);
|
|
@@ -4570,8 +4595,13 @@ const createSecurePatchQuery = (client, authProvider) => {
|
|
|
4570
4595
|
|
|
4571
4596
|
const createGqlExecuteFn = (executeOptions) => {
|
|
4572
4597
|
const executeState = setupQueryExecuteState();
|
|
4598
|
+
const circularChecker = circularQueryDependencyChecker();
|
|
4573
4599
|
const reset = () => resetExecuteState({ executeState, executeOptions });
|
|
4574
4600
|
const exec = (executeArgs) => {
|
|
4601
|
+
circularChecker.check();
|
|
4602
|
+
// Make sure all effects are flushed before reading the args.
|
|
4603
|
+
// A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.
|
|
4604
|
+
executeOptions.deps.effectScheduler.flush();
|
|
4575
4605
|
const { args = executeOptions.state.args(), options } = executeArgs ?? {};
|
|
4576
4606
|
cleanupPreviousExecute({ executeOptions, executeState });
|
|
4577
4607
|
// TODO: This should get cleaned up
|
|
@@ -4854,10 +4884,10 @@ class ParseHttpErrorCodeToTitleDePipe {
|
|
|
4854
4884
|
constructor() {
|
|
4855
4885
|
this.transform = parseHttpErrorCodeToTitleDe;
|
|
4856
4886
|
}
|
|
4857
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
4858
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
4887
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4888
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, isStandalone: true, name: "parseHttpErrorCodeToTitleDe" }); }
|
|
4859
4889
|
}
|
|
4860
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
4890
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, decorators: [{
|
|
4861
4891
|
type: Pipe,
|
|
4862
4892
|
args: [{
|
|
4863
4893
|
name: 'parseHttpErrorCodeToTitleDe',
|
|
@@ -4868,10 +4898,10 @@ class ParseHttpErrorCodeToMessageDePipe {
|
|
|
4868
4898
|
constructor() {
|
|
4869
4899
|
this.transform = parseHttpErrorCodeToMessageDe;
|
|
4870
4900
|
}
|
|
4871
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
4872
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
4901
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4902
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, isStandalone: true, name: "parseHttpErrorCodeToMessageDe" }); }
|
|
4873
4903
|
}
|
|
4874
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
4904
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, decorators: [{
|
|
4875
4905
|
type: Pipe,
|
|
4876
4906
|
args: [{
|
|
4877
4907
|
name: 'parseHttpErrorCodeToMessageDe',
|
|
@@ -5056,10 +5086,10 @@ class ParseHttpErrorCodeToTitleEnPipe {
|
|
|
5056
5086
|
constructor() {
|
|
5057
5087
|
this.transform = parseHttpErrorCodeToTitleEn;
|
|
5058
5088
|
}
|
|
5059
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
5060
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
5089
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5090
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, isStandalone: true, name: "parseHttpErrorCodeToTitleEn" }); }
|
|
5061
5091
|
}
|
|
5062
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
5092
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, decorators: [{
|
|
5063
5093
|
type: Pipe,
|
|
5064
5094
|
args: [{
|
|
5065
5095
|
name: 'parseHttpErrorCodeToTitleEn',
|
|
@@ -5070,10 +5100,10 @@ class ParseHttpErrorCodeToMessageEnPipe {
|
|
|
5070
5100
|
constructor() {
|
|
5071
5101
|
this.transform = parseHttpErrorCodeToMessageEn;
|
|
5072
5102
|
}
|
|
5073
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
5074
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.
|
|
5103
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5104
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, isStandalone: true, name: "parseHttpErrorCodeToMessageEn" }); }
|
|
5075
5105
|
}
|
|
5076
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
5106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, decorators: [{
|
|
5077
5107
|
type: Pipe,
|
|
5078
5108
|
args: [{
|
|
5079
5109
|
name: 'parseHttpErrorCodeToMessageEn',
|
|
@@ -5209,11 +5239,11 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
5209
5239
|
ParseHttpErrorCodeToMessageEnPipe: ParseHttpErrorCodeToMessageEnPipe,
|
|
5210
5240
|
ParseHttpErrorCodeToTitleDePipe: ParseHttpErrorCodeToTitleDePipe,
|
|
5211
5241
|
ParseHttpErrorCodeToTitleEnPipe: ParseHttpErrorCodeToTitleEnPipe,
|
|
5212
|
-
QUERY_EFFECT_ERROR_MESSAGE: QUERY_EFFECT_ERROR_MESSAGE,
|
|
5213
5242
|
SPEED_BUFFER_TIME_IN_MS: SPEED_BUFFER_TIME_IN_MS,
|
|
5214
5243
|
applyQueryFeatures: applyQueryFeatures,
|
|
5215
5244
|
bearerExpiresInPropertyNotNumber: bearerExpiresInPropertyNotNumber,
|
|
5216
5245
|
buildQueryCacheKey: buildQueryCacheKey,
|
|
5246
|
+
circularQueryDependencyChecker: circularQueryDependencyChecker,
|
|
5217
5247
|
cleanupPreviousExecute: cleanupPreviousExecute,
|
|
5218
5248
|
contentfulGqlLikePaginationAdapter: contentfulGqlLikePaginationAdapter,
|
|
5219
5249
|
cookieLoginTriedButCookieDisabled: cookieLoginTriedButCookieDisabled,
|
|
@@ -5268,6 +5298,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
5268
5298
|
loginCalledWithoutConfig: loginCalledWithoutConfig,
|
|
5269
5299
|
loginWithTokenCalledWithoutConfig: loginWithTokenCalledWithoutConfig,
|
|
5270
5300
|
maybeExecute: maybeExecute,
|
|
5301
|
+
nestedEffect: nestedEffect,
|
|
5271
5302
|
normalizeQueryRepositoryKey: normalizeQueryRepositoryKey,
|
|
5272
5303
|
pagedQueryStackNextPageCalledWithoutPreviousPage: pagedQueryStackNextPageCalledWithoutPreviousPage,
|
|
5273
5304
|
pagedQueryStackPageBiggerThanTotalPages: pagedQueryStackPageBiggerThanTotalPages,
|
|
@@ -5279,7 +5310,6 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
5279
5310
|
provideBearerAuthProvider: provideBearerAuthProvider,
|
|
5280
5311
|
provideQueryClient: provideQueryClient,
|
|
5281
5312
|
provideWebSocketClient: provideWebSocketClient,
|
|
5282
|
-
queryEffect: queryEffect,
|
|
5283
5313
|
queryExecute: queryExecute,
|
|
5284
5314
|
queryFeatureUsedMultipleTimes: queryFeatureUsedMultipleTimes,
|
|
5285
5315
|
queryStackWithArgsUsed: queryStackWithArgsUsed,
|