@ethlete/query 5.32.2 → 5.32.3
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 +6 -0
- package/fesm2022/ethlete-query.mjs +106 -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,11 @@
|
|
|
1
1
|
# @ethlete/query
|
|
2
2
|
|
|
3
|
+
## 5.32.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`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
|
|
8
|
+
|
|
3
9
|
## 5.32.2
|
|
4
10
|
|
|
5
11
|
### 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);
|
|
@@ -4433,6 +4450,7 @@ const createSecureExecuteFn = (options) => {
|
|
|
4433
4450
|
};
|
|
4434
4451
|
const authAndExec = (executeArgs) => {
|
|
4435
4452
|
const { args, options: runOptions } = executeArgs ?? {};
|
|
4453
|
+
console.log('authAndExec', { executeArgs, args, runOptions });
|
|
4436
4454
|
const tokens = authProvider.tokens();
|
|
4437
4455
|
let headers = args?.headers || new HttpHeaders();
|
|
4438
4456
|
if (!tokens) {
|
|
@@ -4443,41 +4461,49 @@ const createSecureExecuteFn = (options) => {
|
|
|
4443
4461
|
}
|
|
4444
4462
|
const updatedArgs = { ...(args ?? {}), headers };
|
|
4445
4463
|
queryExecute({
|
|
4446
|
-
executeOptions:
|
|
4464
|
+
executeOptions: executeOptions,
|
|
4447
4465
|
executeState,
|
|
4448
4466
|
args: updatedArgs,
|
|
4449
4467
|
options: runOptions,
|
|
4450
4468
|
});
|
|
4451
4469
|
};
|
|
4452
4470
|
const exec = (executeArgs) => {
|
|
4471
|
+
circularChecker.check();
|
|
4472
|
+
// Make sure all effects are flushed before reading the args.
|
|
4473
|
+
// A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.
|
|
4474
|
+
executeOptions.deps.effectScheduler.flush();
|
|
4475
|
+
const execArgsWithDefaults = {
|
|
4476
|
+
args: executeArgs?.args ?? executeOptions.state.args(),
|
|
4477
|
+
options: executeArgs?.options,
|
|
4478
|
+
};
|
|
4453
4479
|
authQuerySubscription.unsubscribe();
|
|
4454
4480
|
authQuerySubscription = Subscription.EMPTY;
|
|
4455
|
-
cleanupPreviousExecute({ executeOptions:
|
|
4481
|
+
cleanupPreviousExecute({ executeOptions: executeOptions, executeState });
|
|
4456
4482
|
const authQuery = authProvider.latestExecutedQuery();
|
|
4457
4483
|
// This might happen if a secure query gets executed while the auth query has just been created.
|
|
4458
4484
|
// This is due to the fact that the query state is being synced with the state inside the http request using effect.
|
|
4459
4485
|
const isAuthQueryFreshlyExecuted = authQuery?.lastTimeExecutedAt() === null;
|
|
4460
4486
|
if (!authQuery || authQuery.loading() || isAuthQueryFreshlyExecuted) {
|
|
4461
|
-
|
|
4462
|
-
authQuerySubscription = toObservable(authProvider.latestExecutedQuery, { injector:
|
|
4487
|
+
executeOptions.state.loading.set({ executeTime: Date.now(), progress: null });
|
|
4488
|
+
authQuerySubscription = toObservable(authProvider.latestExecutedQuery, { injector: executeOptions.deps.injector })
|
|
4463
4489
|
.pipe(switchMap((query) => {
|
|
4464
4490
|
if (!query)
|
|
4465
4491
|
return of(null);
|
|
4466
|
-
return toObservable(query.isAlive, { injector:
|
|
4492
|
+
return toObservable(query.isAlive, { injector: executeOptions.deps.injector }).pipe(tap((isAlive) => {
|
|
4467
4493
|
if (isAlive)
|
|
4468
4494
|
return;
|
|
4469
4495
|
if (query.error()) {
|
|
4470
4496
|
error(query);
|
|
4471
4497
|
}
|
|
4472
4498
|
else if (query.response()) {
|
|
4473
|
-
authAndExec(
|
|
4499
|
+
authAndExec(execArgsWithDefaults);
|
|
4474
4500
|
}
|
|
4475
4501
|
}));
|
|
4476
4502
|
}))
|
|
4477
4503
|
.subscribe();
|
|
4478
4504
|
}
|
|
4479
4505
|
else if (authQuery.response()) {
|
|
4480
|
-
authAndExec(
|
|
4506
|
+
authAndExec(execArgsWithDefaults);
|
|
4481
4507
|
}
|
|
4482
4508
|
else if (authQuery.error()) {
|
|
4483
4509
|
error(authQuery);
|
|
@@ -4570,8 +4596,13 @@ const createSecurePatchQuery = (client, authProvider) => {
|
|
|
4570
4596
|
|
|
4571
4597
|
const createGqlExecuteFn = (executeOptions) => {
|
|
4572
4598
|
const executeState = setupQueryExecuteState();
|
|
4599
|
+
const circularChecker = circularQueryDependencyChecker();
|
|
4573
4600
|
const reset = () => resetExecuteState({ executeState, executeOptions });
|
|
4574
4601
|
const exec = (executeArgs) => {
|
|
4602
|
+
circularChecker.check();
|
|
4603
|
+
// Make sure all effects are flushed before reading the args.
|
|
4604
|
+
// A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.
|
|
4605
|
+
executeOptions.deps.effectScheduler.flush();
|
|
4575
4606
|
const { args = executeOptions.state.args(), options } = executeArgs ?? {};
|
|
4576
4607
|
cleanupPreviousExecute({ executeOptions, executeState });
|
|
4577
4608
|
// TODO: This should get cleaned up
|
|
@@ -4854,10 +4885,10 @@ class ParseHttpErrorCodeToTitleDePipe {
|
|
|
4854
4885
|
constructor() {
|
|
4855
4886
|
this.transform = parseHttpErrorCodeToTitleDe;
|
|
4856
4887
|
}
|
|
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.
|
|
4888
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4889
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, isStandalone: true, name: "parseHttpErrorCodeToTitleDe" }); }
|
|
4859
4890
|
}
|
|
4860
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
4891
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleDePipe, decorators: [{
|
|
4861
4892
|
type: Pipe,
|
|
4862
4893
|
args: [{
|
|
4863
4894
|
name: 'parseHttpErrorCodeToTitleDe',
|
|
@@ -4868,10 +4899,10 @@ class ParseHttpErrorCodeToMessageDePipe {
|
|
|
4868
4899
|
constructor() {
|
|
4869
4900
|
this.transform = parseHttpErrorCodeToMessageDe;
|
|
4870
4901
|
}
|
|
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.
|
|
4902
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4903
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, isStandalone: true, name: "parseHttpErrorCodeToMessageDe" }); }
|
|
4873
4904
|
}
|
|
4874
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
4905
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageDePipe, decorators: [{
|
|
4875
4906
|
type: Pipe,
|
|
4876
4907
|
args: [{
|
|
4877
4908
|
name: 'parseHttpErrorCodeToMessageDe',
|
|
@@ -5056,10 +5087,10 @@ class ParseHttpErrorCodeToTitleEnPipe {
|
|
|
5056
5087
|
constructor() {
|
|
5057
5088
|
this.transform = parseHttpErrorCodeToTitleEn;
|
|
5058
5089
|
}
|
|
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.
|
|
5090
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5091
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, isStandalone: true, name: "parseHttpErrorCodeToTitleEn" }); }
|
|
5061
5092
|
}
|
|
5062
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
5093
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToTitleEnPipe, decorators: [{
|
|
5063
5094
|
type: Pipe,
|
|
5064
5095
|
args: [{
|
|
5065
5096
|
name: 'parseHttpErrorCodeToTitleEn',
|
|
@@ -5070,10 +5101,10 @@ class ParseHttpErrorCodeToMessageEnPipe {
|
|
|
5070
5101
|
constructor() {
|
|
5071
5102
|
this.transform = parseHttpErrorCodeToMessageEn;
|
|
5072
5103
|
}
|
|
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.
|
|
5104
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5105
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, isStandalone: true, name: "parseHttpErrorCodeToMessageEn" }); }
|
|
5075
5106
|
}
|
|
5076
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
5107
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.1", ngImport: i0, type: ParseHttpErrorCodeToMessageEnPipe, decorators: [{
|
|
5077
5108
|
type: Pipe,
|
|
5078
5109
|
args: [{
|
|
5079
5110
|
name: 'parseHttpErrorCodeToMessageEn',
|
|
@@ -5209,11 +5240,11 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
5209
5240
|
ParseHttpErrorCodeToMessageEnPipe: ParseHttpErrorCodeToMessageEnPipe,
|
|
5210
5241
|
ParseHttpErrorCodeToTitleDePipe: ParseHttpErrorCodeToTitleDePipe,
|
|
5211
5242
|
ParseHttpErrorCodeToTitleEnPipe: ParseHttpErrorCodeToTitleEnPipe,
|
|
5212
|
-
QUERY_EFFECT_ERROR_MESSAGE: QUERY_EFFECT_ERROR_MESSAGE,
|
|
5213
5243
|
SPEED_BUFFER_TIME_IN_MS: SPEED_BUFFER_TIME_IN_MS,
|
|
5214
5244
|
applyQueryFeatures: applyQueryFeatures,
|
|
5215
5245
|
bearerExpiresInPropertyNotNumber: bearerExpiresInPropertyNotNumber,
|
|
5216
5246
|
buildQueryCacheKey: buildQueryCacheKey,
|
|
5247
|
+
circularQueryDependencyChecker: circularQueryDependencyChecker,
|
|
5217
5248
|
cleanupPreviousExecute: cleanupPreviousExecute,
|
|
5218
5249
|
contentfulGqlLikePaginationAdapter: contentfulGqlLikePaginationAdapter,
|
|
5219
5250
|
cookieLoginTriedButCookieDisabled: cookieLoginTriedButCookieDisabled,
|
|
@@ -5268,6 +5299,7 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
5268
5299
|
loginCalledWithoutConfig: loginCalledWithoutConfig,
|
|
5269
5300
|
loginWithTokenCalledWithoutConfig: loginWithTokenCalledWithoutConfig,
|
|
5270
5301
|
maybeExecute: maybeExecute,
|
|
5302
|
+
nestedEffect: nestedEffect,
|
|
5271
5303
|
normalizeQueryRepositoryKey: normalizeQueryRepositoryKey,
|
|
5272
5304
|
pagedQueryStackNextPageCalledWithoutPreviousPage: pagedQueryStackNextPageCalledWithoutPreviousPage,
|
|
5273
5305
|
pagedQueryStackPageBiggerThanTotalPages: pagedQueryStackPageBiggerThanTotalPages,
|
|
@@ -5279,7 +5311,6 @@ var index = /*#__PURE__*/Object.freeze({
|
|
|
5279
5311
|
provideBearerAuthProvider: provideBearerAuthProvider,
|
|
5280
5312
|
provideQueryClient: provideQueryClient,
|
|
5281
5313
|
provideWebSocketClient: provideWebSocketClient,
|
|
5282
|
-
queryEffect: queryEffect,
|
|
5283
5314
|
queryExecute: queryExecute,
|
|
5284
5315
|
queryFeatureUsedMultipleTimes: queryFeatureUsedMultipleTimes,
|
|
5285
5316
|
queryStackWithArgsUsed: queryStackWithArgsUsed,
|