@ethlete/query-devtools 1.0.0-next.13 → 1.0.0-next.15
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 +33 -0
- package/fesm2022/ethlete-query-devtools-lazy.mjs +12 -5
- package/fesm2022/ethlete-query-devtools-lazy.mjs.map +1 -1
- package/fesm2022/ethlete-query-devtools-toggle.mjs +12 -4
- package/fesm2022/ethlete-query-devtools-toggle.mjs.map +1 -1
- package/fesm2022/ethlete-query-devtools.mjs +1073 -1460
- package/fesm2022/ethlete-query-devtools.mjs.map +1 -1
- package/package.json +4 -12
- package/types/ethlete-query-devtools-toggle.d.ts +7 -3
- package/types/ethlete-query-devtools.d.ts +100 -1113
|
@@ -1,158 +1,9 @@
|
|
|
1
|
-
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { Signal, WritableSignal, OnInit } from '@angular/core';
|
|
3
1
|
import * as _ethlete_query from '@ethlete/query';
|
|
4
|
-
import {
|
|
2
|
+
import { QueryRefreshCause, QueryRepositoryEntryDestroyedCause, Query, QueryRepositoryCacheEntry, HttpRequestRetryState, HttpRequestLoadingProgressState, AnyQueryBatchItemResult, QueryRepository, QueryKeyLockState, QueryClient, AnyQueryStack, AnyPagedQueryStack, QuerySequence, AnyQueryBatch, AnyBearerAuthProvider, WebSocketDevtoolsHandle, WebSocketDevtoolsMessage, QuerySequenceStatus, AnyQuerySnapshot } from '@ethlete/query';
|
|
3
|
+
import * as _angular_core from '@angular/core';
|
|
4
|
+
import { OnInit } from '@angular/core';
|
|
5
5
|
import { ResizeEdge, DragMoveEvent, ResizeMoveEvent } from '@ethlete/core';
|
|
6
|
-
|
|
7
|
-
type AboutRow = {
|
|
8
|
-
label: string;
|
|
9
|
-
value: string;
|
|
10
|
-
};
|
|
11
|
-
type AboutGroup = {
|
|
12
|
-
title: string;
|
|
13
|
-
rows: AboutRow[];
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* What is running: the loaded `@ethlete/*` versions, the Angular version and whatever the app handed to
|
|
17
|
-
* `provideQueryDevtools({ about })`. A section rather than a tab body, so it can be shown anywhere.
|
|
18
|
-
*/
|
|
19
|
-
declare class QueryDevtoolsAboutComponent {
|
|
20
|
-
protected readonly groups: AboutGroup[];
|
|
21
|
-
protected copied: _angular_core.WritableSignal<boolean>;
|
|
22
|
-
private copiedReset$;
|
|
23
|
-
constructor();
|
|
24
|
-
protected copy(): void;
|
|
25
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsAboutComponent, never>;
|
|
26
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsAboutComponent, "et-query-devtools-about", never, {}, {}, never, never, true, never>;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/** Which of a node's four pasteable forms a copy action asks for. */
|
|
30
|
-
type QueryDevtoolsCopyPayload = 'value' | 'key' | 'path' | 'entry';
|
|
31
|
-
|
|
32
|
-
/** A JSON value's kind as the value explorer (and its per-node override menu) categorizes it. */
|
|
33
|
-
type JsonKind = 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'array' | 'object';
|
|
34
|
-
type JsonEntry = {
|
|
35
|
-
k: string;
|
|
36
|
-
v: unknown;
|
|
37
|
-
};
|
|
38
|
-
/** A folded slice of a container's entries, rendered as its own collapsible row. */
|
|
39
|
-
type JsonChunk = {
|
|
40
|
-
start: number;
|
|
41
|
-
end: number;
|
|
42
|
-
label: string;
|
|
43
|
-
};
|
|
44
|
-
declare const kindOf: (value: unknown) => JsonKind;
|
|
45
|
-
/**
|
|
46
|
-
* A recursive, collapsible, searchable JSON tree used by the query devtools value explorer. Renders
|
|
47
|
-
* the *transformed* value the app actually sees (post `transformResponse`). Self-recurses via its
|
|
48
|
-
* own selector - both for child entries and for the folded slices of an oversized container, which
|
|
49
|
-
* re-enter as the same component with a `chunk` window over the same value.
|
|
50
|
-
*/
|
|
51
|
-
declare class QueryDevtoolsJsonComponent {
|
|
52
|
-
value: _angular_core.InputSignal<unknown>;
|
|
53
|
-
nodeKey: _angular_core.InputSignal<string | null>;
|
|
54
|
-
depth: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
55
|
-
/** Lowercased search term; when set, the tree auto-expands and matches are highlighted. */
|
|
56
|
-
search: _angular_core.InputSignal<string>;
|
|
57
|
-
/**
|
|
58
|
-
* When set, this node is not the value itself but a folded window over its entries. It shares the
|
|
59
|
-
* container's `path` so a child's persisted expansion does not depend on where the slice borders land.
|
|
60
|
-
*/
|
|
61
|
-
chunk: _angular_core.InputSignal<JsonChunk | null>;
|
|
62
|
-
/** Full path of this node from the explorer root, used as the key for persisted expansion. */
|
|
63
|
-
path: _angular_core.InputSignal<string>;
|
|
64
|
-
/** Persisted paths explicitly expanded (overrides the depth default). */
|
|
65
|
-
expandedPaths: _angular_core.InputSignal<ReadonlySet<string> | null>;
|
|
66
|
-
/** Persisted paths explicitly collapsed (overrides the depth default). */
|
|
67
|
-
collapsedPaths: _angular_core.InputSignal<ReadonlySet<string> | null>;
|
|
68
|
-
/** When provided, expansion is externally persisted via this callback instead of local state. */
|
|
69
|
-
toggleFn: _angular_core.InputSignal<((path: string, expand: boolean) => void) | null>;
|
|
70
|
-
/** Same node as {@link path}, but as the array-of-steps an override op targets rather than a display key. */
|
|
71
|
-
jsonPath: _angular_core.InputSignal<JsonPath>;
|
|
72
|
-
/** The kind of the container holding this node, so its override menu can offer "duplicate this item". */
|
|
73
|
-
parentKind: _angular_core.InputSignal<JsonKind | null>;
|
|
74
|
-
/** When provided, every node renders an override menu that arms/clears ops through it. */
|
|
75
|
-
overrides: _angular_core.InputSignal<QueryDevtoolsOverridesRecorder | null>;
|
|
76
|
-
/**
|
|
77
|
-
* The declared type of each field, keyed by its path with array indices as `*` (`items.*.id`) - as
|
|
78
|
-
* {@link QueryDevtoolsSchemaSeed} produces it. A node with an entry labels itself with it.
|
|
79
|
-
*/
|
|
80
|
-
annotations: _angular_core.InputSignal<ReadonlyMap<string, string> | null>;
|
|
81
|
-
protected kind: _angular_core.Signal<JsonKind>;
|
|
82
|
-
private exotic;
|
|
83
|
-
/** One annotation covers every element of an array, so the lookup path forgets which index this is. */
|
|
84
|
-
private shapePath;
|
|
85
|
-
protected annotation: _angular_core.Signal<string | null>;
|
|
86
|
-
protected annotationTitle: _angular_core.Signal<string>;
|
|
87
|
-
/**
|
|
88
|
-
* A `Date` is object-typed but has nothing to expand into, so it renders as a leaf. A resolved
|
|
89
|
-
* header provider is the other way round: a function that does expand.
|
|
90
|
-
*/
|
|
91
|
-
protected isContainer: _angular_core.Signal<boolean>;
|
|
92
|
-
/** The entries this node covers: the container's own, or just the window a chunk stands for. */
|
|
93
|
-
ownEntries: _angular_core.Signal<JsonEntry[]>;
|
|
94
|
-
protected childChunks: _angular_core.Signal<JsonChunk[]>;
|
|
95
|
-
/** Entries rendered as rows - empty while they are folded into slices instead. */
|
|
96
|
-
protected visibleEntries: _angular_core.Signal<JsonEntry[]>;
|
|
97
|
-
/** Slices carry their window in the key so siblings persist independently of the container. */
|
|
98
|
-
private togglePath;
|
|
99
|
-
private defaultExpanded;
|
|
100
|
-
private localExpanded;
|
|
101
|
-
private expanded;
|
|
102
|
-
/** Only slices that actually contain a match unfold while searching, so a filter stays cheap. */
|
|
103
|
-
private chunkHasHit;
|
|
104
|
-
protected effectiveExpanded: _angular_core.Signal<boolean>;
|
|
105
|
-
/** What the last copy put on the clipboard, or `null` once the tick has expired. */
|
|
106
|
-
protected copied: _angular_core.WritableSignal<QueryDevtoolsCopyPayload | null>;
|
|
107
|
-
private copiedReset$;
|
|
108
|
-
/**
|
|
109
|
-
* Whether this node has an address of its own to copy. An explorer root has no key, and a folded
|
|
110
|
-
* slice stands for a range of entries rather than one path - neither can name itself.
|
|
111
|
-
*/
|
|
112
|
-
protected addressable: _angular_core.Signal<boolean>;
|
|
113
|
-
private valueLabel;
|
|
114
|
-
/**
|
|
115
|
-
* Doubles as the button's `title` and its `aria-label`, and names what landed while the tick is up -
|
|
116
|
-
* a bare `✓` stopped being unambiguous once the menu put four payloads behind one control.
|
|
117
|
-
*/
|
|
118
|
-
protected copyLabel: _angular_core.Signal<string>;
|
|
119
|
-
protected preview: _angular_core.Signal<string>;
|
|
120
|
-
protected display: _angular_core.Signal<string>;
|
|
121
|
-
protected keyHit: _angular_core.Signal<boolean>;
|
|
122
|
-
protected valueHit: _angular_core.Signal<boolean>;
|
|
123
|
-
constructor();
|
|
124
|
-
protected childPath(key: string): string;
|
|
125
|
-
protected childJsonPath(key: string): JsonPath;
|
|
126
|
-
protected toggle(): void;
|
|
127
|
-
/**
|
|
128
|
-
* Writes one of the node's four pasteable forms. All of them go through here so the tick stays a
|
|
129
|
-
* single readout of what actually landed.
|
|
130
|
-
*/
|
|
131
|
-
protected copy(payload: QueryDevtoolsCopyPayload): void;
|
|
132
|
-
/**
|
|
133
|
-
* Containers copy their whole subtree as JSON, slices only the entries they cover; leaves copy
|
|
134
|
-
* something pasteable - a raw string without the display quotes, so an id or url can go straight
|
|
135
|
-
* into a search box. `null` for a subtree that cannot be serialized at all.
|
|
136
|
-
*/
|
|
137
|
-
private copyTextFor;
|
|
138
|
-
/** An exotic container copies the entries the tree shows, not the private fields `JSON.stringify` finds. */
|
|
139
|
-
private copyableValue;
|
|
140
|
-
private chunkValue;
|
|
141
|
-
private flagCopied;
|
|
142
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsJsonComponent, never>;
|
|
143
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsJsonComponent, "et-query-devtools-json", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "nodeKey": { "alias": "nodeKey"; "required": false; "isSignal": true; }; "depth": { "alias": "depth"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "chunk": { "alias": "chunk"; "required": false; "isSignal": true; }; "path": { "alias": "path"; "required": false; "isSignal": true; }; "expandedPaths": { "alias": "expandedPaths"; "required": false; "isSignal": true; }; "collapsedPaths": { "alias": "collapsedPaths"; "required": false; "isSignal": true; }; "toggleFn": { "alias": "toggleFn"; "required": false; "isSignal": true; }; "jsonPath": { "alias": "jsonPath"; "required": false; "isSignal": true; }; "parentKind": { "alias": "parentKind"; "required": false; "isSignal": true; }; "overrides": { "alias": "overrides"; "required": false; "isSignal": true; }; "annotations": { "alias": "annotations"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* The value explorer's tree chrome, as a styles-only component the tree mounts itself - a session that
|
|
148
|
-
* never opens a JSON view does not inject it.
|
|
149
|
-
*
|
|
150
|
-
* @internal
|
|
151
|
-
*/
|
|
152
|
-
declare class QueryDevtoolsJsonStylesComponent {
|
|
153
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsJsonStylesComponent, never>;
|
|
154
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsJsonStylesComponent, "et-query-devtools-json-styles", never, {}, {}, never, never, true, never>;
|
|
155
|
-
}
|
|
6
|
+
import { QueryDevtoolsStats, QueryDevtoolsStatsHandle, QueryDevtoolsEntry, QueryDevtoolsRun, QueryDevtoolsFormHandle, QueryDevtoolsFeature } from '@ethlete/query/devtools-contract';
|
|
156
7
|
|
|
157
8
|
/** Whether a path exists only in the newer value, only in the older one, or in both with a new value. */
|
|
158
9
|
type QueryDevtoolsDiffKind = 'added' | 'removed' | 'changed';
|
|
@@ -324,11 +175,8 @@ type EventLogItem = {
|
|
|
324
175
|
url: string | null;
|
|
325
176
|
isSecure: boolean;
|
|
326
177
|
status: number | null;
|
|
327
|
-
/**
|
|
328
|
-
|
|
329
|
-
* here rather than at click time so the log holds an id instead of a reference to the request itself.
|
|
330
|
-
*/
|
|
331
|
-
queryId: string | null;
|
|
178
|
+
/** Weak, so the log never keeps a destroyed request alive. `null` for an event that is not one request. */
|
|
179
|
+
request: WeakRef<object> | null;
|
|
332
180
|
/** What asked for a refresh, for a `queries-refreshed` row. `null` for every other type. */
|
|
333
181
|
cause: QueryRefreshCause | null;
|
|
334
182
|
/** Why a cache entry was torn down, for an `entry-destroyed` row. `null` for every other type. */
|
|
@@ -363,27 +211,6 @@ type CacheRow = {
|
|
|
363
211
|
bytes: number;
|
|
364
212
|
isEstimatedBytes: boolean;
|
|
365
213
|
};
|
|
366
|
-
/** A repository the panel found, together with the client name/base URL it was registered under. */
|
|
367
|
-
type RepositoryInfo = {
|
|
368
|
-
repository: QueryRepository;
|
|
369
|
-
name: string;
|
|
370
|
-
baseUrl: string;
|
|
371
|
-
client: QueryClient | null;
|
|
372
|
-
};
|
|
373
|
-
/** One client's cache, as the Cache tab lists it - every entry measured, with the client's poll states. */
|
|
374
|
-
type CacheView = {
|
|
375
|
-
name: string;
|
|
376
|
-
baseUrl: string;
|
|
377
|
-
repository: QueryRepository;
|
|
378
|
-
rows: CacheRow[];
|
|
379
|
-
bytes: number;
|
|
380
|
-
isEstimatedBytes: boolean;
|
|
381
|
-
unused: number;
|
|
382
|
-
pollStates: Record<string, QueryKeyLockState>;
|
|
383
|
-
client: QueryClient | null;
|
|
384
|
-
/** The entries this client has lost since the panel was loaded, newest first. */
|
|
385
|
-
dropped: DroppedCacheEntry[];
|
|
386
|
-
};
|
|
387
214
|
/** What each tab holds, as its badge reports it: how many entries, and how many of them are failing. */
|
|
388
215
|
type TabBadge = {
|
|
389
216
|
count: number;
|
|
@@ -391,459 +218,8 @@ type TabBadge = {
|
|
|
391
218
|
errorNoun?: string;
|
|
392
219
|
};
|
|
393
220
|
|
|
394
|
-
/**
|
|
395
|
-
* Everything a tab or the shared detail drawer reads from - or writes back into - the always-mounted
|
|
396
|
-
* `<et-query-devtools>` panel: cross-tab registries, the JIT editor, copy/export actions, the value
|
|
397
|
-
* explorer and pane sizing. A tab component only ever exists while it is the active one, so anything a
|
|
398
|
-
* tab needs to survive being switched away from (a drawer's own selection, the persisted panel chrome)
|
|
399
|
-
* has to live here instead of on the tab itself. Every member below is named and shaped exactly like the
|
|
400
|
-
* panel's own field/method it stands in for.
|
|
401
|
-
*
|
|
402
|
-
* @see injectQueryDevtoolsHost
|
|
403
|
-
*/
|
|
404
|
-
type QueryDevtoolsHost = {
|
|
405
|
-
selectTab(tab: DevtoolsTab): void;
|
|
406
|
-
/** Jumps to the Queries tab with this query selected - the Events tab is a way in, not a dead end. */
|
|
407
|
-
selectQuery(id: string): void;
|
|
408
|
-
/** Jumps to the Forms tab with this form selected. */
|
|
409
|
-
selectForm(id: string): void;
|
|
410
|
-
queryEntries: Signal<QueryDevtoolsEntry[]>;
|
|
411
|
-
stackEntries: Signal<QueryDevtoolsEntry[]>;
|
|
412
|
-
sequenceEntries: Signal<QueryDevtoolsEntry[]>;
|
|
413
|
-
batchEntries: Signal<QueryDevtoolsEntry[]>;
|
|
414
|
-
formEntries: Signal<QueryDevtoolsEntry[]>;
|
|
415
|
-
authEntries: Signal<QueryDevtoolsEntry[]>;
|
|
416
|
-
wsEntries: Signal<QueryDevtoolsEntry[]>;
|
|
417
|
-
repositories: Signal<RepositoryInfo[]>;
|
|
418
|
-
/**
|
|
419
|
-
* The cache per client, with every entry's size measured. Reading each response inside the computed is
|
|
420
|
-
* what keeps the totals current: a cache mutation bumps `cacheVersion`, but a response landing in an
|
|
421
|
-
* entry that is already there does not.
|
|
422
|
-
*/
|
|
423
|
-
cacheView: Signal<CacheView[]>;
|
|
424
|
-
refetchCacheEntry(entry: QueryRepositoryCacheEntry): void;
|
|
425
|
-
evictCacheEntry(repository: QueryRepository, key: string): void;
|
|
426
|
-
/** Drops every entry of one client, consumers included - the cold-start check that does not need a reload. */
|
|
427
|
-
evictAllCacheEntries(repository: QueryRepository): void;
|
|
428
|
-
toggleCacheValue(clientName: string, key: string): void;
|
|
429
|
-
isCacheValueExpanded(clientName: string, key: string): boolean;
|
|
430
|
-
cacheFreshness(entry: QueryRepositoryCacheEntry): string;
|
|
431
|
-
cacheSync(entry: QueryRepositoryCacheEntry, pollStates: Record<string, unknown>): string;
|
|
432
|
-
cachePersistence(entry: QueryRepositoryCacheEntry): string;
|
|
433
|
-
/** How many responses this client has on disk, which is usually more than it has in memory. */
|
|
434
|
-
persistedCount(client: QueryClient): number;
|
|
435
|
-
clearPersistedQueries(client: QueryClient): void;
|
|
436
|
-
/** The features of the client behind a cache tab card, or `null` for a client without any. */
|
|
437
|
-
clientFeatures(client: QueryClient | null | undefined): QueryDevtoolsFeature[] | null;
|
|
438
|
-
/**
|
|
439
|
-
* Every Web Lock held or queued across this origin, decoded, or `null` in a browser without the Web
|
|
440
|
-
* Locks API. Empty while the Locks tab has not read its first snapshot - it polls, because Web Locks
|
|
441
|
-
* has no change event to listen to.
|
|
442
|
-
*/
|
|
443
|
-
lockRows: Signal<DevtoolsLockRow[] | null>;
|
|
444
|
-
/** Where this tab stands on one lock, as a chip: whether it holds it, waits for it, or is not in it. */
|
|
445
|
-
lockStanding(row: DevtoolsLockRow): QueryDevtoolsChip;
|
|
446
|
-
/** Unique client names present across queries and auth providers, for the Queries/Timeline pickers. */
|
|
447
|
-
clientNames: Signal<string[]>;
|
|
448
|
-
/** What each tab holds - also drives the tab bar's own badges, so it lives here rather than per-tab. */
|
|
449
|
-
tabBadges: Signal<Record<DevtoolsTab, TabBadge>>;
|
|
450
|
-
/**
|
|
451
|
-
* Every client the Faults tab can arm, with the fault it currently carries. Also feeds the
|
|
452
|
-
* cross-tab "Faults armed" banner and the session export, so it lives here rather than on the tab.
|
|
453
|
-
*/
|
|
454
|
-
faultClients: Signal<{
|
|
455
|
-
name: string;
|
|
456
|
-
baseUrl: string;
|
|
457
|
-
fault: QueryDevtoolsFault;
|
|
458
|
-
armed: boolean;
|
|
459
|
-
}[]>;
|
|
460
|
-
/**
|
|
461
|
-
* The queries in scope before the Queries tab's own search box and status chips narrow them further:
|
|
462
|
-
* either the picked client's, or exactly the inspected element's. Also what the Timeline tab scopes
|
|
463
|
-
* its runs to, which is why this lives here rather than on the Queries tab alone.
|
|
464
|
-
*/
|
|
465
|
-
scopedQueries: Signal<QueryDevtoolsEntry[]>;
|
|
466
|
-
/** 1-second tick driving every countdown/freshness readout across tabs. */
|
|
467
|
-
clock: Signal<number>;
|
|
468
|
-
findQuery(id: string | null): QueryDevtoolsSelection | null;
|
|
469
|
-
queryLinkFor(entry: QueryDevtoolsEntry | undefined, query?: AnyQuery): QueryLink;
|
|
470
|
-
asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
|
|
471
|
-
asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
|
|
472
|
-
asSequence(entry: QueryDevtoolsEntry): QuerySequence<unknown[]>;
|
|
473
|
-
asBatch(entry: QueryDevtoolsEntry): AnyQueryBatch;
|
|
474
|
-
asAuth(entry: QueryDevtoolsEntry): AnyBearerAuthProvider;
|
|
475
|
-
asWs(entry: QueryDevtoolsEntry): WebSocketDevtoolsHandle;
|
|
476
|
-
asForm(entry: QueryDevtoolsEntry): QueryDevtoolsFormHandle;
|
|
477
|
-
authTokenPayload(auth: AnyBearerAuthProvider): Record<string, unknown> | null;
|
|
478
|
-
authQueryKeys(auth: AnyBearerAuthProvider): string[];
|
|
479
|
-
/** The access-token expiry the app acts on, plus the lifetime the panel has armed over it. */
|
|
480
|
-
authTokenLifetime(entry: QueryDevtoolsEntry): QueryDevtoolsTokenLifetime;
|
|
481
|
-
/** The multi-tab leadership chip, or `null` for a provider without `withBearerAuthMultiTabSync`. */
|
|
482
|
-
authLeadership(auth: AnyBearerAuthProvider): QueryDevtoolsChip | null;
|
|
483
|
-
queryStatus(query: AnyQuery): 'idle' | 'loading' | 'success' | 'error';
|
|
484
|
-
isStale(query: AnyQuery): boolean;
|
|
485
|
-
/** Whether an entry is showing an armed response override or a devtools-faulted outcome. */
|
|
486
|
-
isTampered(entry: QueryDevtoolsEntry): boolean;
|
|
487
|
-
/** Whether armed response overrides are stored and replayed on the next load. */
|
|
488
|
-
overridesPersist(): boolean;
|
|
489
|
-
toggleOverridesPersist(): void;
|
|
490
|
-
/** Where they are kept, named for a title or a hint (`sessionStorage`, `localStorage`, `not kept`). */
|
|
491
|
-
overridesScopeLabel(): string;
|
|
492
|
-
/** Puts the panel's layout, filters, pins and stored overrides back to defaults, keeping the settings. */
|
|
493
|
-
resetDevtools(): void;
|
|
494
|
-
requestProgress(query: AnyQuery): RequestProgress | null;
|
|
495
|
-
retryCause(status: number): string;
|
|
496
|
-
requestUrl(query: AnyQuery): string | null;
|
|
497
|
-
requestPath(url: string): string;
|
|
498
|
-
queryArgs(query: AnyQuery): unknown;
|
|
499
|
-
/**
|
|
500
|
-
* The headers the query's last run sent, or - before it has run - the ones its args and its client
|
|
501
|
-
* resolve to now. `null` when there are none, or while a header provider cannot resolve yet.
|
|
502
|
-
*/
|
|
503
|
-
requestHeaders(query: AnyQuery): Record<string, string> | null;
|
|
504
|
-
routeSegments(entry: QueryDevtoolsEntry | undefined, query: AnyQuery): RouteSegment[];
|
|
505
|
-
queryActivity(entry: QueryDevtoolsEntry): QueryActivity;
|
|
506
|
-
linkActivity(link: QueryLink): QueryActivity;
|
|
507
|
-
stackActivity(stack: AnyQueryStack | AnyPagedQueryStack): QueryActivity;
|
|
508
|
-
sequenceActivity(sequence: QuerySequence<unknown[]>): QueryActivity;
|
|
509
|
-
queriesForStack(stack: AnyQueryStack | AnyPagedQueryStack): QueryLink[];
|
|
510
|
-
queriesForSequence(sequence: QuerySequence<unknown[]>): QueryLink[];
|
|
511
|
-
/**
|
|
512
|
-
* The queries a form feeds, discovered from the reads its `value()` recorded while their args were
|
|
513
|
-
* built - so a form that nothing consumes yet reads as exactly that.
|
|
514
|
-
*/
|
|
515
|
-
queriesDrivenByForm(entry: QueryDevtoolsEntry): QueryLink[];
|
|
516
|
-
sequenceStepStatus(sequence: QuerySequence<unknown[]>, index: number): QuerySequenceStatus;
|
|
517
|
-
stepSnapshot(sequence: QuerySequence<unknown[]>, index: number): AnyQuerySnapshot | null;
|
|
518
|
-
/** Whether a sequence step's in/out detail (`<entryId>:<stepIndex>`) is expanded - persisted. */
|
|
519
|
-
isStepExpanded(entryId: string, index: number): boolean;
|
|
520
|
-
toggleStep(entryId: string, index: number): void;
|
|
521
|
-
/** A batch's route with its path params left as `:name` - a batch fills them in per item, not once. */
|
|
522
|
-
batchRouteSegments(entry: QueryDevtoolsEntry): RouteSegment[];
|
|
523
|
-
/**
|
|
524
|
-
* The batch entry that created a query, or `null` for a query no batch did. What lets the Queries list
|
|
525
|
-
* fold a bulk run's items under one row instead of listing whatever it has in flight.
|
|
526
|
-
*/
|
|
527
|
-
batchOf(entry: QueryDevtoolsEntry): QueryDevtoolsEntry | null;
|
|
528
|
-
/**
|
|
529
|
-
* The item queries a batch has in flight. Only those: a batch destroys each item's query the moment
|
|
530
|
-
* that item settles, so a settled item is read from {@link batchItems} instead.
|
|
531
|
-
*/
|
|
532
|
-
queriesForBatch(entry: QueryDevtoolsEntry): QueryLink[];
|
|
533
|
-
/** A batch's settled items, failures first and capped - see {@link BatchItemView}. */
|
|
534
|
-
batchItems(entry: QueryDevtoolsEntry): BatchItemView;
|
|
535
|
-
/**
|
|
536
|
-
* The registry entry of one of a batch's items, or `null` once it has fallen out of the batch's capped
|
|
537
|
-
* tombstone tail - which is what makes an item row openable only while its query is still kept.
|
|
538
|
-
*/
|
|
539
|
-
batchItemQueryId(entry: QueryDevtoolsEntry, index: number): string | null;
|
|
540
|
-
/** An item's throughput line (`12.4 items/s · ~8s left`), or `null` before there is a rate to show. */
|
|
541
|
-
batchThroughput(batch: AnyQueryBatch): string | null;
|
|
542
|
-
/** Whether a batch item's args/response detail (`<entryId>:<itemIndex>`) is expanded - persisted. */
|
|
543
|
-
isBatchItemExpanded(entryId: string, index: number): boolean;
|
|
544
|
-
toggleBatchItem(entryId: string, index: number): void;
|
|
545
|
-
/** Keys of the Queries-list groups of identical rows the user opened - persisted. */
|
|
546
|
-
expandedQueryGroups: Signal<ReadonlySet<string>>;
|
|
547
|
-
toggleQueryGroup(key: string): void;
|
|
548
|
-
expandQueryGroup(key: string): void;
|
|
549
|
-
/** Which way the Queries list sorts by last-executed time - persisted. */
|
|
550
|
-
queryRecentFirst: WritableSignal<boolean>;
|
|
551
|
-
/** Whether the Queries list is arranged as a tree of route paths instead of a flat list - persisted. */
|
|
552
|
-
queryTreeView: WritableSignal<boolean>;
|
|
553
|
-
/** The path folders the user closed. Collapsed, not expanded - a tree opens open. */
|
|
554
|
-
collapsedQueryPaths: Signal<ReadonlySet<string>>;
|
|
555
|
-
toggleQueryPath(key: string): void;
|
|
556
|
-
/** The element a query was created in, or `null` for one created outside a component/directive. */
|
|
557
|
-
locatableElement(entry: QueryDevtoolsEntry): HTMLElement | null;
|
|
558
|
-
locateQuery(entry: QueryDevtoolsEntry): void;
|
|
559
|
-
locateState: Signal<'idle' | 'located' | 'offscreen'>;
|
|
560
|
-
resetStats(entry: QueryDevtoolsEntry): void;
|
|
561
|
-
executeQuery(selection: QueryDevtoolsSelection, allowCache: boolean): void;
|
|
562
|
-
resetQuery(query: AnyQuery): void;
|
|
563
|
-
formatDuration(ms: number | null): string;
|
|
564
|
-
formatBytes(bytes: number): string;
|
|
565
|
-
formatTransferred(bytes: number, isEstimated: boolean): string;
|
|
566
|
-
formatSpeed(bytesPerSecond: number): string;
|
|
567
|
-
formatPercent(percentage: number): string;
|
|
568
|
-
formatCountdown(ms: number | null): string;
|
|
569
|
-
formatTime(timestamp: number | null): string;
|
|
570
|
-
gqlDocument(doc: string): string;
|
|
571
|
-
inlineValue(value: unknown): string;
|
|
572
|
-
featureLabel(type: string): string;
|
|
573
|
-
featureSummary(feature: QueryDevtoolsFeature): string;
|
|
574
|
-
detailTab: WritableSignal<DetailTab>;
|
|
575
|
-
editorMode: WritableSignal<'none' | 'response' | 'args'>;
|
|
576
|
-
responseDraft: WritableSignal<string>;
|
|
577
|
-
argsDraft: WritableSignal<string>;
|
|
578
|
-
/** The text the currently open editor was seeded with - not a signal, see the field's own doc. */
|
|
579
|
-
editorSeed: string;
|
|
580
|
-
editError: Signal<string | null>;
|
|
581
|
-
openResponseEditor(query: AnyQuery): void;
|
|
582
|
-
openArgsEditor(selection: QueryDevtoolsSelection): void;
|
|
583
|
-
applyResponse(query: AnyQuery): void;
|
|
584
|
-
applyArgs(query: AnyQuery): void;
|
|
585
|
-
cancelEditor(): void;
|
|
586
|
-
forceLoading(query: AnyQuery): void;
|
|
587
|
-
forceError(query: AnyQuery): void;
|
|
588
|
-
forceEmpty(query: AnyQuery): void;
|
|
589
|
-
clearForced(query: AnyQuery): void;
|
|
590
|
-
diffRunIndex: WritableSignal<number | null>;
|
|
591
|
-
/** The run the diff compares against, or `null` to derive it - see the panel's own field. */
|
|
592
|
-
diffBaseRunIndex: WritableSignal<number | null>;
|
|
593
|
-
toggleRunDiff(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): void;
|
|
594
|
-
/** Which end of the open diff a run is, or `null` if it is not one of the two. */
|
|
595
|
-
diffRunRole(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): 'base' | 'compare' | null;
|
|
596
|
-
responseDiff(entry: QueryDevtoolsEntry): {
|
|
597
|
-
before: QueryDevtoolsRun;
|
|
598
|
-
after: QueryDevtoolsRun;
|
|
599
|
-
diff: QueryDevtoolsDiff;
|
|
600
|
-
} | null;
|
|
601
|
-
canDiffRun(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): boolean;
|
|
602
|
-
queryRuns(entry: QueryDevtoolsEntry): QueryDevtoolsRun[];
|
|
603
|
-
runStatus(run: QueryDevtoolsRun): string;
|
|
604
|
-
/** How many bodies a query retains, which is what bounds how far back a diff can reach. */
|
|
605
|
-
retainedResponseCount: Signal<number>;
|
|
606
|
-
/** Moves the whole response diff one run older or newer, from the diff header. */
|
|
607
|
-
canStepRunDiff(entry: QueryDevtoolsEntry, older: boolean): boolean;
|
|
608
|
-
stepRunDiff(entry: QueryDevtoolsEntry, older: boolean): void;
|
|
609
|
-
errorRunIndex: WritableSignal<number | null>;
|
|
610
|
-
toggleRunError(run: QueryDevtoolsRun): void;
|
|
611
|
-
pickedRunError(entry: QueryDevtoolsEntry): {
|
|
612
|
-
run: QueryDevtoolsRun;
|
|
613
|
-
error: QueryDevtoolsRunError;
|
|
614
|
-
} | null;
|
|
615
|
-
copiedReport: Signal<boolean>;
|
|
616
|
-
copiedInsomnia: Signal<boolean>;
|
|
617
|
-
copiedCurl: Signal<boolean>;
|
|
618
|
-
copiedGql: Signal<boolean>;
|
|
619
|
-
copiedRoute: Signal<boolean>;
|
|
620
|
-
copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
621
|
-
copyInsomniaRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
622
|
-
copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
623
|
-
copyGqlDocument(doc: string): void;
|
|
624
|
-
/** The absolute URL of the last request, or the rendered route for a query that has not run. */
|
|
625
|
-
copyableRoute(entry: QueryDevtoolsEntry, query: AnyQuery): string;
|
|
626
|
-
copyableRouteTitle(entry: QueryDevtoolsEntry, query: AnyQuery): string;
|
|
627
|
-
copyRoute(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
628
|
-
refreshesFor(entryId: string): {
|
|
629
|
-
id: number;
|
|
630
|
-
timestamp: number;
|
|
631
|
-
label: string;
|
|
632
|
-
}[];
|
|
633
|
-
/** What asked for a refresh, on one line - shared by the drawer's "Refetched by" and the Events tab. */
|
|
634
|
-
causeLabel(cause: QueryRefreshCause): string;
|
|
635
|
-
formsDrivingQuery(entry: QueryDevtoolsEntry): QueryDevtoolsEntry[];
|
|
636
|
-
/** Shared value-explorer search term, read (and set) from every drawer's Data sub-tab. */
|
|
637
|
-
jsonSearch: WritableSignal<string>;
|
|
638
|
-
jsonSearchTerm: Signal<string>;
|
|
639
|
-
jsonExpandedPaths: Signal<ReadonlySet<string>>;
|
|
640
|
-
jsonCollapsedPaths: Signal<ReadonlySet<string>>;
|
|
641
|
-
toggleJsonPath(path: string, expand: boolean): void;
|
|
642
|
-
selectedClientName: WritableSignal<string | null>;
|
|
643
|
-
selectedQueryId: WritableSignal<string | null>;
|
|
644
|
-
selectedQuery: Signal<{
|
|
645
|
-
entry: QueryDevtoolsEntry;
|
|
646
|
-
query: AnyQuery;
|
|
647
|
-
} | null>;
|
|
648
|
-
queryFilter: WritableSignal<string>;
|
|
649
|
-
queryFacets: WritableSignal<ReadonlySet<QueryListFacet>>;
|
|
650
|
-
/** The entry ids sorted to the top of the Queries list. Persisted apart from the rest - see the panel. */
|
|
651
|
-
pinnedQueryIds: Signal<ReadonlySet<string>>;
|
|
652
|
-
isQueryPinned(entry: QueryDevtoolsEntry): boolean;
|
|
653
|
-
toggleQueryPin(entry: QueryDevtoolsEntry): void;
|
|
654
|
-
/** When set (via inspect), the Queries list is filtered to exactly these entry ids. */
|
|
655
|
-
inspectFilterIds: WritableSignal<string[] | null>;
|
|
656
|
-
selectClient(name: string | null): void;
|
|
657
|
-
clearInspectFilter(): void;
|
|
658
|
-
toggleFacet(facet: QueryListFacet): void;
|
|
659
|
-
/** Drops the search term and the status chips, keeping the client / inspection scope. */
|
|
660
|
-
clearQueryFilters(): void;
|
|
661
|
-
/**
|
|
662
|
-
* Downloads the given queries (already scoped/filtered by the caller) as one Insomnia collection,
|
|
663
|
-
* filed into a folder per query client.
|
|
664
|
-
*/
|
|
665
|
-
downloadInsomniaCollection(items: {
|
|
666
|
-
entry: QueryDevtoolsEntry;
|
|
667
|
-
query: AnyQuery;
|
|
668
|
-
}[], clientLabel: string | null): void;
|
|
669
|
-
/** Downloads a file a tab generated. The panel does it because the panel owns the download injector. */
|
|
670
|
-
downloadTextFile(file: {
|
|
671
|
-
name: string;
|
|
672
|
-
content: string;
|
|
673
|
-
type: string;
|
|
674
|
-
}): void;
|
|
675
|
-
stackSelectedQueryId: WritableSignal<string | null>;
|
|
676
|
-
stackSelectedQuery: Signal<{
|
|
677
|
-
entry: QueryDevtoolsEntry;
|
|
678
|
-
query: AnyQuery;
|
|
679
|
-
} | null>;
|
|
680
|
-
sequenceSelectedQueryId: WritableSignal<string | null>;
|
|
681
|
-
sequenceSelectedQuery: Signal<{
|
|
682
|
-
entry: QueryDevtoolsEntry;
|
|
683
|
-
query: AnyQuery;
|
|
684
|
-
} | null>;
|
|
685
|
-
batchSelectedQueryId: WritableSignal<string | null>;
|
|
686
|
-
batchSelectedQuery: Signal<{
|
|
687
|
-
entry: QueryDevtoolsEntry;
|
|
688
|
-
query: AnyQuery;
|
|
689
|
-
} | null>;
|
|
690
|
-
eventSelectedQueryId: WritableSignal<string | null>;
|
|
691
|
-
eventSelectedQuery: Signal<{
|
|
692
|
-
entry: QueryDevtoolsEntry;
|
|
693
|
-
query: AnyQuery;
|
|
694
|
-
} | null>;
|
|
695
|
-
formSelectedQueryId: WritableSignal<string | null>;
|
|
696
|
-
formSelectedQuery: Signal<{
|
|
697
|
-
entry: QueryDevtoolsEntry;
|
|
698
|
-
query: AnyQuery;
|
|
699
|
-
} | null>;
|
|
700
|
-
/** The form whose detail the Forms tab has expanded - persisted. */
|
|
701
|
-
selectedFormId: WritableSignal<string | null>;
|
|
702
|
-
/** The rolling event log - persisted only in the sense that it survives a tab switch, not a reload. */
|
|
703
|
-
eventLog: WritableSignal<EventLogItem[]>;
|
|
704
|
-
/** The client (by base URL) the event log is scoped to, or `null` for all of them - persisted. */
|
|
705
|
-
eventClient: WritableSignal<string | null>;
|
|
706
|
-
/** Whether the event log is narrowed to failures - persisted. */
|
|
707
|
-
eventErrorsOnly: WritableSignal<boolean>;
|
|
708
|
-
/** Free-text narrowing of every socket's message log - persisted. */
|
|
709
|
-
socketFilter: WritableSignal<string>;
|
|
710
|
-
socketMessages(ws: WebSocketDevtoolsHandle): WebSocketDevtoolsMessage[];
|
|
711
|
-
socketDirectionLabel(message: WebSocketDevtoolsMessage): string;
|
|
712
|
-
emitSocketMessage(options: {
|
|
713
|
-
entry: QueryDevtoolsEntry;
|
|
714
|
-
event: string;
|
|
715
|
-
data: string;
|
|
716
|
-
}): void;
|
|
717
|
-
/** The message an emit box last failed with, if this is the socket it failed on. */
|
|
718
|
-
socketEmitErrorFor(entryId: string): string | null;
|
|
719
|
-
timelineSelectedQueryId: WritableSignal<string | null>;
|
|
720
|
-
timelineSelectedQuery: Signal<{
|
|
721
|
-
entry: QueryDevtoolsEntry;
|
|
722
|
-
query: AnyQuery;
|
|
723
|
-
} | null>;
|
|
724
|
-
/**
|
|
725
|
-
* The type annotations of each seeded mock body, by mock id. A mock only stores the *name* it was
|
|
726
|
-
* seeded from, and a body seeded from an inline schema has none, so this is the only thing that can
|
|
727
|
-
* label such a body - and it has to outlive the Mocks tab being switched away from.
|
|
728
|
-
*/
|
|
729
|
-
seededTypes: WritableSignal<Record<string, ReadonlyMap<string, string>>>;
|
|
730
|
-
paneAxis: Signal<PaneAxis>;
|
|
731
|
-
listWidth: Signal<number | null>;
|
|
732
|
-
drawerWidth: Signal<number | null>;
|
|
733
|
-
listHeight: Signal<number | null>;
|
|
734
|
-
drawerHeight: Signal<number | null>;
|
|
735
|
-
startPaneResize(event: PointerEvent, target: {
|
|
736
|
-
pane: PaneTarget;
|
|
737
|
-
container: HTMLElement;
|
|
738
|
-
}): void;
|
|
739
|
-
resetPaneSize(pane: PaneTarget): void;
|
|
740
|
-
};
|
|
741
|
-
|
|
742
|
-
type ScopeKey = 'viewState' | 'pins' | 'overrides' | 'mocks' | 'armedMocks' | 'armedFaults' | 'authSessions';
|
|
743
|
-
type ScopeRow = {
|
|
744
|
-
key: ScopeKey;
|
|
745
|
-
label: string;
|
|
746
|
-
/** What is kept, and what `none` costs - the one thing a scope picker cannot show on its own. */
|
|
747
|
-
hint: string;
|
|
748
|
-
/**
|
|
749
|
-
* What to say on the scopes that let this state outlive the page that armed it - a picker cannot show
|
|
750
|
-
* that an app is about to start lying to itself before anyone opens the panel.
|
|
751
|
-
*/
|
|
752
|
-
warn?: {
|
|
753
|
-
scopes: QueryDevtoolsStorageScope[];
|
|
754
|
-
text: string;
|
|
755
|
-
};
|
|
756
|
-
};
|
|
757
|
-
type LimitKey = 'maxEvents' | 'maxDroppedCacheEntries';
|
|
758
|
-
type LimitRow = {
|
|
759
|
-
key: LimitKey;
|
|
760
|
-
label: string;
|
|
761
|
-
min: number;
|
|
762
|
-
max: number;
|
|
763
|
-
step: number;
|
|
764
|
-
hint: string;
|
|
765
|
-
};
|
|
766
|
-
/**
|
|
767
|
-
* Every panel-wide switch in one place - the storage each kind of state uses, the limits the panel would
|
|
768
|
-
* otherwise hold as constants, and the toggles their own tabs also carry.
|
|
769
|
-
*/
|
|
770
|
-
declare class QueryDevtoolsSettingsComponent {
|
|
771
|
-
private document;
|
|
772
|
-
protected host: QueryDevtoolsHost;
|
|
773
|
-
protected readonly SCOPE_ROWS: ScopeRow[];
|
|
774
|
-
protected readonly SCOPES: {
|
|
775
|
-
value: QueryDevtoolsStorageScope;
|
|
776
|
-
label: string;
|
|
777
|
-
}[];
|
|
778
|
-
protected readonly INDEXED_DB_TITLE = "Unavailable: these are read synchronously - view state before the first render, overrides before the first fetch - and IndexedDB cannot answer in time. Only the mock library could tolerate an async store, and it is not wired to one yet.";
|
|
779
|
-
protected readonly LIMIT_ROWS: LimitRow[];
|
|
780
|
-
protected readonly ARM_ALL_MOCKS: () => void;
|
|
781
|
-
protected readonly DISARM_ALL_MOCKS: () => void;
|
|
782
|
-
protected readonly DISARM_ALL_FAULTS: (clientName?: string) => void;
|
|
783
|
-
/** What queries actually retain, which is the application's value unless this panel raised it. */
|
|
784
|
-
protected responseHistory: _angular_core.Signal<number>;
|
|
785
|
-
protected mockCount: _angular_core.Signal<number>;
|
|
786
|
-
protected sessionCount: _angular_core.Signal<number>;
|
|
787
|
-
protected armedMockCount: _angular_core.Signal<number>;
|
|
788
|
-
protected armedFaultCount: _angular_core.Signal<number>;
|
|
789
|
-
/** The same keys the Events tab's own picker offers - see {@link queryDevtoolsEventClients}. */
|
|
790
|
-
protected eventClients: _angular_core.Signal<string[]>;
|
|
791
|
-
protected resetConfirming: _angular_core.WritableSignal<boolean>;
|
|
792
|
-
protected readonly FORGET_SESSIONS: () => void;
|
|
793
|
-
/** The backends the application declared, or an empty list - the card renders only for a declared one. */
|
|
794
|
-
protected apiEnvs: _angular_core.Signal<QueryDevtoolsApiEnvSwitch[]>;
|
|
795
|
-
/** The env id (or typed URL) a switch's key holds, or `null` while the application picks for itself. */
|
|
796
|
-
protected apiEnvValue(apiSwitch: QueryDevtoolsApiEnvSwitch): string | null;
|
|
797
|
-
/** The env a switch falls back to with nothing stored, described for the default button. */
|
|
798
|
-
protected apiEnvFallback(apiSwitch: QueryDevtoolsApiEnvSwitch): {
|
|
799
|
-
label: string;
|
|
800
|
-
production: boolean;
|
|
801
|
-
};
|
|
802
|
-
/** Whether the pick in force - the stored env, or the fallback behind an unwritten key - is production. */
|
|
803
|
-
protected apiEnvIsProduction(apiSwitch: QueryDevtoolsApiEnvSwitch): boolean;
|
|
804
|
-
/** A stored value no declared env carries, which is a URL somebody typed in below. */
|
|
805
|
-
protected apiEnvCustomUrl(apiSwitch: QueryDevtoolsApiEnvSwitch): string;
|
|
806
|
-
/** Writes the application's own key and reloads - it is read before Angular boots, so nothing else can. */
|
|
807
|
-
protected pickApiEnv(apiSwitch: QueryDevtoolsApiEnvSwitch, value: string | null): void;
|
|
808
|
-
protected setCustomApiUrl(apiSwitch: QueryDevtoolsApiEnvSwitch, value: string): void;
|
|
809
|
-
protected settings(): _ethlete_query.QueryDevtoolsSettings;
|
|
810
|
-
protected scopeOf(key: ScopeKey): QueryDevtoolsStorageScope;
|
|
811
|
-
protected limitOf(key: LimitKey): number;
|
|
812
|
-
/** What the picked scope means beyond where the state is kept, or `null` while it means nothing extra. */
|
|
813
|
-
protected warningFor(row: ScopeRow, scope: QueryDevtoolsStorageScope): string | null;
|
|
814
|
-
/** Why one scope is not on offer for a row, for the button's title, or `null` while it is. */
|
|
815
|
-
protected unavailableReason(row: ScopeRow, scope: QueryDevtoolsStorageScope): "Unavailable outside a development build: live access and refresh tokens, and the credentials you typed in, must not outlive this tab on a deployed origin. The vault keeps nothing here unless you pick Session, which keeps it for as long as the tab." | null;
|
|
816
|
-
protected setScope(key: ScopeKey, scope: QueryDevtoolsStorageScope): void;
|
|
817
|
-
protected setLimit(key: LimitKey, value: string): void;
|
|
818
|
-
protected setResponseHistory(value: string): void;
|
|
819
|
-
/** Hands retention back to `provideQueryDevtools({ responseHistory })`. */
|
|
820
|
-
protected clearResponseHistory(): void;
|
|
821
|
-
protected reset(): void;
|
|
822
|
-
protected toggleGoneQueries(): void;
|
|
823
|
-
protected showsGoneQueries(): boolean;
|
|
824
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsSettingsComponent, never>;
|
|
825
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsSettingsComponent, "et-query-devtools-settings", never, {}, {}, never, never, true, never>;
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
/**
|
|
829
|
-
* The waterfall's grid, axis and bars, as a styles-only component the panel mounts when the Timeline tab
|
|
830
|
-
* is first opened.
|
|
831
|
-
*
|
|
832
|
-
* @internal
|
|
833
|
-
*/
|
|
834
|
-
declare class QueryDevtoolsTimelineStylesComponent {
|
|
835
|
-
static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsTimelineStylesComponent, never>;
|
|
836
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsTimelineStylesComponent, "et-query-devtools-timeline-styles", never, {}, {}, never, never, true, never>;
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
/**
|
|
840
|
-
* Where the panel sits: attached to an edge, or floating over the page as a window of its own. A
|
|
841
|
-
* pop-out is not one of these - that is a real browser window, not a position in this document.
|
|
842
|
-
*/
|
|
843
221
|
type DevtoolsDock = 'bottom' | 'top' | 'left' | 'right' | 'float';
|
|
844
|
-
/** What the layout menu offers, in the order it lists them. `popout` is a window, not a position. */
|
|
845
222
|
type DevtoolsLayout = DevtoolsDock | 'popout';
|
|
846
|
-
/** The floating panel's position and size, in CSS px from the viewport's top-left. */
|
|
847
223
|
type FloatRect = {
|
|
848
224
|
x: number;
|
|
849
225
|
y: number;
|
|
@@ -889,35 +265,6 @@ type PersistedState = {
|
|
|
889
265
|
jsonExpanded?: string[];
|
|
890
266
|
jsonCollapsed?: string[];
|
|
891
267
|
};
|
|
892
|
-
type ViewportSize = {
|
|
893
|
-
width: number;
|
|
894
|
-
height: number;
|
|
895
|
-
};
|
|
896
|
-
/**
|
|
897
|
-
* The loosest a float may sit: shoved off an edge with only {@link FLOAT_PEEK} left, which is what a
|
|
898
|
-
* drag and a parked panel are held to. **North is never a parking edge** - the title bar is the only
|
|
899
|
-
* thing that drags the panel back, so it may never be the part that leaves.
|
|
900
|
-
*/
|
|
901
|
-
declare const clampFloatToPeek: (rect: FloatRect, viewport: ViewportSize) => FloatRect;
|
|
902
|
-
/**
|
|
903
|
-
* Where a float settles when the pointer is released. Dragged more than halfway off an edge, it stays
|
|
904
|
-
* parked there with {@link FLOAT_PEEK} showing - the panel gets out of the way of the thing you are
|
|
905
|
-
* debugging without being closed. Anything short of halfway is pulled back in, so a slightly clumsy
|
|
906
|
-
* drag does not park it.
|
|
907
|
-
*/
|
|
908
|
-
declare const settledFloatRect: (rect: FloatRect, viewport: ViewportSize) => {
|
|
909
|
-
rect: FloatRect;
|
|
910
|
-
collapsed: boolean;
|
|
911
|
-
};
|
|
912
|
-
/**
|
|
913
|
-
* The rect a resize gesture from `edge` produces, given where the panel was when the gesture started.
|
|
914
|
-
* A west or north drag grows away from the edge that stays pinned, so the origin follows whatever
|
|
915
|
-
* size the drag settled on - including when the size hit its floor and the origin must stop with it.
|
|
916
|
-
*/
|
|
917
|
-
declare const resizedFloatRect: (base: FloatRect, { move, viewport }: {
|
|
918
|
-
move: ResizeMoveEvent;
|
|
919
|
-
viewport: ViewportSize;
|
|
920
|
-
}) => FloatRect;
|
|
921
268
|
/**
|
|
922
269
|
* A floating, dockable panel that inspects the live state of the signals-first `@ethlete/query`
|
|
923
270
|
* system: queries, stacks, sequences, bearer auth providers, the repository cache and a rolling
|
|
@@ -941,11 +288,9 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
941
288
|
* `<et-query-devtools-lazy>`, which downloads the panel on the click that was meant to open it.
|
|
942
289
|
*/
|
|
943
290
|
startOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
944
|
-
/** The panel itself, so a pop-out can move it into another window's document. */
|
|
945
291
|
private panelEl;
|
|
946
292
|
private eventIdCounter;
|
|
947
293
|
private lastSelectionKey;
|
|
948
|
-
/** Where the gear goes back to, so opening Settings does not lose the tab it was opened over. */
|
|
949
294
|
private tabBeforeSettings;
|
|
950
295
|
readonly persisted: PersistedState;
|
|
951
296
|
protected readonly tabs: ({
|
|
@@ -991,10 +336,6 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
991
336
|
id: "about";
|
|
992
337
|
label: string;
|
|
993
338
|
})[];
|
|
994
|
-
/**
|
|
995
|
-
* Tabs the bar keeps whether they hold anything or not: the one the panel opens on, and the one that
|
|
996
|
-
* arms faults - which has entries to arm rather than to count.
|
|
997
|
-
*/
|
|
998
339
|
private readonly PINNED_TABS;
|
|
999
340
|
protected readonly shortcut: "⌘⌥Q" | "Ctrl+Alt+Q";
|
|
1000
341
|
protected readonly LAYOUTS: readonly [{
|
|
@@ -1028,24 +369,18 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1028
369
|
readonly label: "Pop out";
|
|
1029
370
|
readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
|
|
1030
371
|
}];
|
|
1031
|
-
protected open: WritableSignal<boolean>;
|
|
372
|
+
protected open: _angular_core.WritableSignal<boolean>;
|
|
1032
373
|
private panelHeight;
|
|
1033
374
|
private panelWidth;
|
|
1034
|
-
protected activeTab: WritableSignal<DevtoolsTab>;
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
*/
|
|
1040
|
-
protected listWidth: WritableSignal<number | null>;
|
|
1041
|
-
protected drawerWidth: WritableSignal<number | null>;
|
|
1042
|
-
protected listHeight: WritableSignal<number | null>;
|
|
1043
|
-
protected drawerHeight: WritableSignal<number | null>;
|
|
375
|
+
protected activeTab: _angular_core.WritableSignal<DevtoolsTab>;
|
|
376
|
+
protected listWidth: _angular_core.WritableSignal<number | null>;
|
|
377
|
+
protected drawerWidth: _angular_core.WritableSignal<number | null>;
|
|
378
|
+
protected listHeight: _angular_core.WritableSignal<number | null>;
|
|
379
|
+
protected drawerHeight: _angular_core.WritableSignal<number | null>;
|
|
1044
380
|
private drag;
|
|
381
|
+
private floatGesture;
|
|
1045
382
|
protected resizing: _angular_core.Signal<boolean>;
|
|
1046
|
-
|
|
1047
|
-
protected dock: WritableSignal<DevtoolsDock>;
|
|
1048
|
-
/** The entry the layout button shows, so it names where the panel is rather than where it could go. */
|
|
383
|
+
protected dock: _angular_core.WritableSignal<DevtoolsDock>;
|
|
1049
384
|
protected currentLayout: _angular_core.Signal<{
|
|
1050
385
|
readonly id: "bottom";
|
|
1051
386
|
readonly glyph: "⬓";
|
|
@@ -1077,46 +412,32 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1077
412
|
readonly label: "Pop out";
|
|
1078
413
|
readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
|
|
1079
414
|
}>;
|
|
1080
|
-
|
|
1081
|
-
* Whether a docked panel takes its size out of the page instead of covering it - so the last rows of a
|
|
1082
|
-
* long page can still be scrolled to. Only docks can: a float sits wherever it was dragged.
|
|
1083
|
-
*/
|
|
1084
|
-
protected reservesSpace: WritableSignal<boolean>;
|
|
1085
|
-
/** Where the floating panel sits and how big it is. Kept while docked, so a return to float restores it. */
|
|
415
|
+
protected reservesSpace: _angular_core.WritableSignal<boolean>;
|
|
1086
416
|
private floatRect;
|
|
1087
|
-
/** The rect a resize gesture started from, or `null` outside one. */
|
|
1088
417
|
private floatResizeBase;
|
|
1089
418
|
/**
|
|
1090
419
|
* Whether the float is shoved off an edge with only its peek showing. Persisted with the rect, since
|
|
1091
420
|
* restoring the rect without it would either strand the panel off screen or silently un-park it.
|
|
1092
421
|
*/
|
|
1093
|
-
protected floatParked: WritableSignal<boolean>;
|
|
1094
|
-
|
|
1095
|
-
* The browser refused the last pop-out. `window.open` returns `null` with no error to catch, so
|
|
1096
|
-
* without this the button simply did nothing - and floating is the fallback it should have offered.
|
|
1097
|
-
*/
|
|
1098
|
-
protected popOutBlocked: WritableSignal<boolean>;
|
|
422
|
+
protected floatParked: _angular_core.WritableSignal<boolean>;
|
|
423
|
+
protected popOutBlocked: _angular_core.WritableSignal<boolean>;
|
|
1099
424
|
/**
|
|
1100
425
|
* Whether the panel currently lives in a window of its own. Deliberately not persisted: a reload
|
|
1101
426
|
* cannot re-adopt a window the previous document opened, so it always starts docked.
|
|
1102
427
|
*/
|
|
1103
|
-
protected poppedOut: WritableSignal<boolean>;
|
|
428
|
+
protected poppedOut: _angular_core.WritableSignal<boolean>;
|
|
1104
429
|
protected floating: _angular_core.Signal<boolean>;
|
|
1105
|
-
/**
|
|
1106
|
-
* Below `md` a side-by-side split cannot fit: the list alone asks for `22rem` and the drawer for
|
|
1107
|
-
* `26rem`, which is wider than a phone. Narrow gets the same stacked layout a right dock does.
|
|
1108
|
-
*/
|
|
1109
430
|
private narrowViewport;
|
|
1110
|
-
/** Whether the panel is docked to a side edge, which is what sizes it along the inline axis. */
|
|
1111
431
|
private sideDocked;
|
|
1112
|
-
/** Which axis the two-pane tabs split along. The stylesheet keys the stacked layout off the same value. */
|
|
1113
432
|
protected paneAxis: _angular_core.Signal<PaneAxis>;
|
|
1114
433
|
private popup;
|
|
1115
|
-
/**
|
|
434
|
+
/** Ends everything tied to one pop-out window: a pending `load`, its `pagehide`, shortcut and visibility. */
|
|
435
|
+
private popOutEnded$;
|
|
436
|
+
private popupVisible;
|
|
437
|
+
private isPanelVisible;
|
|
1116
438
|
private popOutStyleSync;
|
|
1117
439
|
protected panelBlockSize: _angular_core.Signal<number | null>;
|
|
1118
440
|
protected panelInlineSize: _angular_core.Signal<number | null>;
|
|
1119
|
-
/** The floating panel's offset from the viewport's top-left, or `null` while it is docked. */
|
|
1120
441
|
protected panelInsetBlock: _angular_core.Signal<number | null>;
|
|
1121
442
|
protected panelInsetInline: _angular_core.Signal<number | null>;
|
|
1122
443
|
/**
|
|
@@ -1124,7 +445,6 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1124
445
|
* `max-block-size: 90vh`) and it is the clamped size the page has to give up.
|
|
1125
446
|
*/
|
|
1126
447
|
private panelSize;
|
|
1127
|
-
/** Which padding a docked panel asks of the page and how much, or `null` when it asks for none. */
|
|
1128
448
|
private pageReservation;
|
|
1129
449
|
/**
|
|
1130
450
|
* The viewport edge a docked panel covers, reserved for overlays whatever {@link reservesSpace} says:
|
|
@@ -1133,109 +453,84 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1133
453
|
* writing direction cannot change under a dock switch.
|
|
1134
454
|
*/
|
|
1135
455
|
private overlayReservation;
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
/** The form whose detail the Forms tab has expanded. */
|
|
1141
|
-
selectedFormId: WritableSignal<string | null>;
|
|
456
|
+
detailTab: _angular_core.WritableSignal<DetailTab>;
|
|
457
|
+
selectedClientName: _angular_core.WritableSignal<string | null>;
|
|
458
|
+
selectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
459
|
+
selectedFormId: _angular_core.WritableSignal<string | null>;
|
|
1142
460
|
/**
|
|
1143
461
|
* The type annotations of each seeded mock body, by mock id. It lives here rather than on the Mocks
|
|
1144
462
|
* tab because a tab is destroyed the moment another one is selected, and a body seeded from an inline
|
|
1145
463
|
* schema has no `schemaName` to recover its labels from.
|
|
1146
464
|
*/
|
|
1147
|
-
seededTypes: WritableSignal<Record<string, ReadonlyMap<string, string>>>;
|
|
1148
|
-
stackSelectedQueryId: WritableSignal<string | null>;
|
|
1149
|
-
sequenceSelectedQueryId: WritableSignal<string | null>;
|
|
1150
|
-
batchSelectedQueryId: WritableSignal<string | null>;
|
|
1151
|
-
eventSelectedQueryId: WritableSignal<string | null>;
|
|
1152
|
-
formSelectedQueryId: WritableSignal<string | null>;
|
|
1153
|
-
timelineSelectedQueryId: WritableSignal<string | null>;
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
*/
|
|
1167
|
-
queryTreeView: WritableSignal<boolean>;
|
|
1168
|
-
/**
|
|
1169
|
-
* The path folders the user closed. Collapsed rather than expanded, because a tree that opens closed
|
|
1170
|
-
* shows nothing but the top segment of every route - which answers no question the flat list didn't.
|
|
1171
|
-
*/
|
|
1172
|
-
collapsedQueryPaths: WritableSignal<ReadonlySet<string>>;
|
|
1173
|
-
/**
|
|
1174
|
-
* The entry ids sorted to the top of the Queries list. Ids are derived from a stable descriptor plus a
|
|
1175
|
-
* per-descriptor sequence number, so a pin survives a reload as long as queries are created in the same
|
|
1176
|
-
* order - the same property the restored selection already relies on.
|
|
1177
|
-
*/
|
|
1178
|
-
pinnedQueryIds: WritableSignal<ReadonlySet<string>>;
|
|
1179
|
-
eventLog: WritableSignal<EventLogItem[]>;
|
|
1180
|
-
/**
|
|
1181
|
-
* The cache entries that are gone, newest first. Kept here rather than in the repository, which stays
|
|
1182
|
-
* lean in production - it emits the teardown and forgets it.
|
|
1183
|
-
*/
|
|
1184
|
-
droppedCacheEntries: WritableSignal<DroppedCacheEntry[]>;
|
|
1185
|
-
/** The client (by base URL) the event log is scoped to, or `null` for all of them. */
|
|
1186
|
-
eventClient: WritableSignal<string | null>;
|
|
1187
|
-
/** Whether the event log is narrowed to failures - the rows a bug report is about. */
|
|
1188
|
-
eventErrorsOnly: WritableSignal<boolean>;
|
|
1189
|
-
/** Free-text narrowing of every socket's message log. Matches the event, the room and the direction. */
|
|
1190
|
-
socketFilter: WritableSignal<string>;
|
|
1191
|
-
/** The cache entry whose response is expanded, as `<client>|<key>`, or `null` while none is. */
|
|
465
|
+
seededTypes: _angular_core.WritableSignal<Record<string, ReadonlyMap<string, string>>>;
|
|
466
|
+
stackSelectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
467
|
+
sequenceSelectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
468
|
+
batchSelectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
469
|
+
eventSelectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
470
|
+
formSelectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
471
|
+
timelineSelectedQueryId: _angular_core.WritableSignal<string | null>;
|
|
472
|
+
queryFilter: _angular_core.WritableSignal<string>;
|
|
473
|
+
queryFacets: _angular_core.WritableSignal<ReadonlySet<QueryListFacet>>;
|
|
474
|
+
queryRecentFirst: _angular_core.WritableSignal<boolean>;
|
|
475
|
+
queryTreeView: _angular_core.WritableSignal<boolean>;
|
|
476
|
+
collapsedQueryPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
477
|
+
pinnedQueryIds: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
478
|
+
eventLog: _angular_core.WritableSignal<EventLogItem[]>;
|
|
479
|
+
private eventOwners;
|
|
480
|
+
droppedCacheEntries: _angular_core.WritableSignal<DroppedCacheEntry[]>;
|
|
481
|
+
eventClient: _angular_core.WritableSignal<string | null>;
|
|
482
|
+
eventErrorsOnly: _angular_core.WritableSignal<boolean>;
|
|
483
|
+
socketFilter: _angular_core.WritableSignal<string>;
|
|
1192
484
|
private expandedCacheKey;
|
|
1193
|
-
/** The socket whose emit box last failed, so the message shows on that card and no other. */
|
|
1194
485
|
private socketEmitError;
|
|
1195
|
-
/** Keys (`<entryId>:<stepIndex>`) of the sequence steps whose in/out detail is expanded. */
|
|
1196
486
|
private expandedSteps;
|
|
1197
|
-
/** Keys (`<entryId>:<itemIndex>`) of the batch items whose args/response detail is expanded. */
|
|
1198
487
|
private expandedBatchItems;
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
/** Shared value-explorer search term. */
|
|
1202
|
-
jsonSearch: WritableSignal<string>;
|
|
488
|
+
expandedQueryGroups: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
489
|
+
jsonSearch: _angular_core.WritableSignal<string>;
|
|
1203
490
|
jsonSearchTerm: _angular_core.Signal<string>;
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
jsonCollapsedPaths: WritableSignal<ReadonlySet<string>>;
|
|
1207
|
-
/** Bound callback passed into the value explorer to persist per-path expansion. Assigned in the constructor. */
|
|
491
|
+
jsonExpandedPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
492
|
+
jsonCollapsedPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
1208
493
|
toggleJsonPath: (path: string, expand: boolean) => void;
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
* The run the diff compares it *against*, or `null` to derive that side - the newest older run that
|
|
1213
|
-
* still holds a body, which is what one click on **Diff** gives you.
|
|
1214
|
-
*/
|
|
1215
|
-
diffBaseRunIndex: WritableSignal<number | null>;
|
|
1216
|
-
errorRunIndex: WritableSignal<number | null>;
|
|
1217
|
-
/** How many bodies a query retains, which is what bounds how far back a diff can reach. */
|
|
494
|
+
diffRunIndex: _angular_core.WritableSignal<number | null>;
|
|
495
|
+
diffBaseRunIndex: _angular_core.WritableSignal<number | null>;
|
|
496
|
+
errorRunIndex: _angular_core.WritableSignal<number | null>;
|
|
1218
497
|
retainedResponseCount: _angular_core.Signal<number>;
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
argsDraft: WritableSignal<string>;
|
|
498
|
+
editorMode: _angular_core.WritableSignal<"none" | "response" | "args">;
|
|
499
|
+
responseDraft: _angular_core.WritableSignal<string>;
|
|
500
|
+
argsDraft: _angular_core.WritableSignal<string>;
|
|
1223
501
|
/**
|
|
1224
502
|
* The text the currently open editor was seeded with. The textareas bind `value` to this and not to
|
|
1225
503
|
* the live draft: a `value` binding fed by the draft is written back on every keystroke, and writing
|
|
1226
504
|
* a textarea's `value` puts the caret at the end.
|
|
1227
505
|
*/
|
|
1228
506
|
editorSeed: string;
|
|
1229
|
-
editError: WritableSignal<string | null>;
|
|
1230
|
-
/** The args the open editor was seeded from, so applying can put back what the draft cannot carry. */
|
|
507
|
+
editError: _angular_core.WritableSignal<string | null>;
|
|
1231
508
|
private editedArgsSource;
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
509
|
+
copiedReport: {
|
|
510
|
+
value: _angular_core.Signal<boolean>;
|
|
511
|
+
mark: (next: boolean) => void;
|
|
512
|
+
clear: () => void;
|
|
513
|
+
};
|
|
514
|
+
copiedInsomnia: {
|
|
515
|
+
value: _angular_core.Signal<boolean>;
|
|
516
|
+
mark: (next: boolean) => void;
|
|
517
|
+
clear: () => void;
|
|
518
|
+
};
|
|
519
|
+
copiedCurl: {
|
|
520
|
+
value: _angular_core.Signal<boolean>;
|
|
521
|
+
mark: (next: boolean) => void;
|
|
522
|
+
clear: () => void;
|
|
523
|
+
};
|
|
524
|
+
copiedGql: {
|
|
525
|
+
value: _angular_core.Signal<boolean>;
|
|
526
|
+
mark: (next: boolean) => void;
|
|
527
|
+
clear: () => void;
|
|
528
|
+
};
|
|
529
|
+
copiedRoute: {
|
|
530
|
+
value: _angular_core.Signal<boolean>;
|
|
531
|
+
mark: (next: boolean) => void;
|
|
532
|
+
clear: () => void;
|
|
533
|
+
};
|
|
1239
534
|
/**
|
|
1240
535
|
* 1-second tick driving the cache freshness countdowns. Gated the way the locks poll is: an ungated
|
|
1241
536
|
* `interval` is a periodic macrotask zone.js counts forever, so a mounted panel would tick the host
|
|
@@ -1243,32 +538,20 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1243
538
|
* sits inside `@if (open())`, so there is nothing to drive while the panel is shut or the tab hidden.
|
|
1244
539
|
*/
|
|
1245
540
|
private clock;
|
|
1246
|
-
/**
|
|
1247
|
-
* The probe lock behind every Locks row's "this tab" answer, and the last snapshot read through it.
|
|
1248
|
-
* Both only exist while the Locks tab is on screen - see the polling stream in the constructor.
|
|
1249
|
-
*/
|
|
1250
541
|
private probeLocks;
|
|
1251
542
|
private probeId;
|
|
1252
543
|
private probeHold;
|
|
1253
544
|
private lockSnapshot;
|
|
1254
545
|
lockRows: _angular_core.Signal<DevtoolsLockRow[] | null>;
|
|
1255
|
-
|
|
1256
|
-
protected
|
|
1257
|
-
|
|
1258
|
-
inspectHover: WritableSignal<{
|
|
1259
|
-
rect: DOMRect;
|
|
1260
|
-
entries: QueryDevtoolsEntry[];
|
|
1261
|
-
} | null>;
|
|
1262
|
-
/** Inspect run backwards: the box drawn over the element the selected query was created in. */
|
|
1263
|
-
protected locatedRect: WritableSignal<DOMRect | null>;
|
|
1264
|
-
locateState: WritableSignal<"idle" | "located" | "offscreen">;
|
|
546
|
+
protected inspectActive: _angular_core.WritableSignal<boolean>;
|
|
547
|
+
protected locatedRect: _angular_core.WritableSignal<DOMRect | null>;
|
|
548
|
+
locateState: _angular_core.WritableSignal<"idle" | "located" | "offscreen">;
|
|
1265
549
|
private locate$;
|
|
1266
|
-
|
|
1267
|
-
inspectFilterIds: WritableSignal<string[] | null>;
|
|
550
|
+
inspectFilterIds: _angular_core.WritableSignal<string[] | null>;
|
|
1268
551
|
private queryEntries;
|
|
1269
552
|
/**
|
|
1270
553
|
* The queries that still exist. Everything that measures what the application is doing right now -
|
|
1271
|
-
* the tab bar's error flags, the tamper dot, the timeline
|
|
554
|
+
* the tab bar's error flags, the tamper dot, the timeline -
|
|
1272
555
|
* reads this rather than {@link queryEntries}, so a tombstone never inflates a live number.
|
|
1273
556
|
*/
|
|
1274
557
|
private liveQueryEntries;
|
|
@@ -1279,7 +562,6 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1279
562
|
formEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
|
|
1280
563
|
authEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
|
|
1281
564
|
wsEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
|
|
1282
|
-
/** Unique client names present across queries and auth providers, for the Queries-tab picker. */
|
|
1283
565
|
clientNames: _angular_core.Signal<string[]>;
|
|
1284
566
|
/**
|
|
1285
567
|
* Unique repositories (with their client name + base URL) used by the Cache and Events tabs. A
|
|
@@ -1287,47 +569,18 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1287
569
|
* and its **Evict all** long after its injector died.
|
|
1288
570
|
*/
|
|
1289
571
|
private repositories;
|
|
1290
|
-
/**
|
|
1291
|
-
* Every client the Faults tab can arm, with the fault it currently carries. Clients with nothing armed
|
|
1292
|
-
* read as {@link EMPTY_QUERY_DEVTOOLS_FAULT} so the inputs always have a value to show.
|
|
1293
|
-
*/
|
|
1294
572
|
faultClients: _angular_core.Signal<{
|
|
1295
573
|
name: string;
|
|
1296
574
|
baseUrl: string;
|
|
1297
|
-
fault: _ethlete_query
|
|
575
|
+
fault: _ethlete_query.ɵQueryDevtoolsFault;
|
|
1298
576
|
armed: boolean;
|
|
1299
577
|
}[]>;
|
|
1300
|
-
/**
|
|
1301
|
-
* The names of the clients currently carrying a fault, or `null` when none do - so a template can `@if`
|
|
1302
|
-
* on it. Armed faults are the one state where the panel is lying to the app on purpose, and a badge on a
|
|
1303
|
-
* tab that isn't open cannot say that: whichever tab you are reading, a red response has to be
|
|
1304
|
-
* attributable to the injection rather than to the API.
|
|
1305
|
-
*/
|
|
1306
578
|
protected armedFaultClients: _angular_core.Signal<string[] | null>;
|
|
1307
|
-
/**
|
|
1308
|
-
* The routes currently answered by a designed mock, for the shell's banner. A mocked response is a
|
|
1309
|
-
* stronger lie than an override - nothing was sent at all - so it is named above every tab, not just
|
|
1310
|
-
* badged on the one that armed it.
|
|
1311
|
-
*/
|
|
1312
579
|
protected armedMockRoutes: _angular_core.Signal<string[] | null>;
|
|
1313
|
-
/**
|
|
1314
|
-
* The queries the list is scoped to before the search box and the status chips narrow them further:
|
|
1315
|
-
* either the picked client's, or exactly the inspected element's.
|
|
1316
|
-
*/
|
|
1317
580
|
scopedQueries: _angular_core.Signal<QueryDevtoolsEntry[]>;
|
|
1318
|
-
/** How many runs every query has recorded, for the Timeline tab's badge. */
|
|
1319
581
|
private runTotals;
|
|
1320
|
-
/** Cache entries across every client, for the Cache tab's badge. */
|
|
1321
582
|
private cacheEntryCount;
|
|
1322
|
-
/**
|
|
1323
|
-
* What each tab holds, so a failing query in a tab that is not open is still visible. Reading it
|
|
1324
|
-
* subscribes the tab bar to every entry's live state - which is the point of the badges.
|
|
1325
|
-
*/
|
|
1326
583
|
protected tabBadges: _angular_core.Signal<Record<DevtoolsTab, TabBadge>>;
|
|
1327
|
-
/**
|
|
1328
|
-
* The tabs the bar shows: the pinned ones, the one that is open, and every tab that currently holds
|
|
1329
|
-
* something.
|
|
1330
|
-
*/
|
|
1331
584
|
protected visibleTabs: _angular_core.Signal<({
|
|
1332
585
|
id: "queries";
|
|
1333
586
|
label: string;
|
|
@@ -1371,7 +624,6 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1371
624
|
id: "about";
|
|
1372
625
|
label: string;
|
|
1373
626
|
})[]>;
|
|
1374
|
-
/** The empty tabs, which the bar offers behind "More" instead. */
|
|
1375
627
|
protected overflowTabs: _angular_core.Signal<({
|
|
1376
628
|
id: "queries";
|
|
1377
629
|
label: string;
|
|
@@ -1460,19 +712,11 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1460
712
|
client: QueryClient | null;
|
|
1461
713
|
dropped: DroppedCacheEntry[];
|
|
1462
714
|
}[]>;
|
|
1463
|
-
/** Map of a component's host element to the query entries it created (for the inspect tool). */
|
|
1464
715
|
private elementQueryMap;
|
|
1465
|
-
/** Disarms every client's fault - the shell's "Faults armed" banner offers this above every tab. */
|
|
1466
716
|
protected readonly CLEAR_FAULTS: (clientName?: string) => void;
|
|
1467
|
-
/** Whether what is armed came back from a previous page load, which is what the bars have to say. */
|
|
1468
717
|
protected faultsRestored: _angular_core.Signal<boolean>;
|
|
1469
718
|
protected mocksRestored: _angular_core.Signal<boolean>;
|
|
1470
|
-
/** Stops serving every designed mock - the shell's "Mocks armed" banner offers the same way out. */
|
|
1471
719
|
protected readonly DISARM_MOCKS: () => void;
|
|
1472
|
-
/**
|
|
1473
|
-
* What the previous page load left armed: how many ops came back, how many queries took them, and the
|
|
1474
|
-
* ids nothing claimed. `null` when this page inherited nothing, so a template can `@if` on it.
|
|
1475
|
-
*/
|
|
1476
720
|
protected restoredOverrides: _angular_core.Signal<{
|
|
1477
721
|
queries: number;
|
|
1478
722
|
ops: number;
|
|
@@ -1480,32 +724,19 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1480
724
|
orphaned: string[];
|
|
1481
725
|
fromLocalStorage: boolean;
|
|
1482
726
|
} | null>;
|
|
1483
|
-
/** Drops everything the reload re-armed, and empties the store it came from. */
|
|
1484
727
|
protected readonly DROP_RESTORED_OVERRIDES: () => void;
|
|
1485
|
-
/** Every edge, so a float resizes the way a window does rather than only from one corner. */
|
|
1486
728
|
protected readonly FLOAT_RESIZE_EDGES: ResizeEdge[];
|
|
1487
729
|
constructor();
|
|
1488
730
|
ngOnInit(): void;
|
|
1489
|
-
/** @see queryDevtoolsOverridePersistence */
|
|
1490
731
|
overridesPersist(): boolean;
|
|
1491
732
|
toggleOverridesPersist(): void;
|
|
1492
|
-
/** Where armed overrides are kept, as the drawer's toggle and the Settings picker both name it. */
|
|
1493
733
|
overridesScopeLabel(): string;
|
|
1494
734
|
/**
|
|
1495
|
-
* Puts
|
|
1496
|
-
*
|
|
1497
|
-
* scopes and limits that were chosen deliberately.
|
|
1498
|
-
*
|
|
1499
|
-
* Resetting the live state is the point, not just clearing the keys: the persistence effects would
|
|
1500
|
-
* write the current state straight back into whatever store the scopes name.
|
|
735
|
+
* Puts layout, filters, selections, pins and stored overrides back the way they ship; the settings stay.
|
|
736
|
+
* Resets the live state too, or the persistence effects write it straight back.
|
|
1501
737
|
*/
|
|
1502
738
|
resetDevtools(): void;
|
|
1503
|
-
/**
|
|
1504
|
-
* Opens Settings over whatever tab is showing, and the same click closes it again. Settings is not in
|
|
1505
|
-
* the tab bar - see {@link DevtoolsTab}.
|
|
1506
|
-
*/
|
|
1507
739
|
protected toggleSettings(): void;
|
|
1508
|
-
/** Opens the first query the reload re-armed, so the banner leads somewhere rather than just warning. */
|
|
1509
740
|
protected reviewRestoredOverrides(id: string): void;
|
|
1510
741
|
/**
|
|
1511
742
|
* Closing while popped out docks back instead: the panel a pop-out shows is the very element the
|
|
@@ -1515,17 +746,13 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1515
746
|
protected floatPanel(): void;
|
|
1516
747
|
protected selectLayout(layout: DevtoolsLayout): void;
|
|
1517
748
|
/**
|
|
1518
|
-
* Moves the panel into a
|
|
1519
|
-
*
|
|
1520
|
-
*
|
|
1521
|
-
* The panel's styles are global `<style>` tags in the host document, and the theming tokens it reads
|
|
1522
|
-
* hang off the root element, so both are copied over; without them the pop-out renders unstyled.
|
|
749
|
+
* Moves the panel element into a pop-up window. The host document's `<style>` tags and root theming
|
|
750
|
+
* tokens must be copied over with it, or the pop-out renders unstyled.
|
|
1523
751
|
*/
|
|
1524
752
|
popOut(): void;
|
|
1525
753
|
selectClient(name: string | null): void;
|
|
1526
754
|
clearInspectFilter(): void;
|
|
1527
755
|
toggleFacet(facet: QueryListFacet): void;
|
|
1528
|
-
/** Drops the search term and the status chips, keeping the client / inspection scope. */
|
|
1529
756
|
clearQueryFilters(): void;
|
|
1530
757
|
isQueryPinned(entry: QueryDevtoolsEntry): boolean;
|
|
1531
758
|
toggleQueryPath(key: string): void;
|
|
@@ -1533,11 +760,8 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1533
760
|
protected toggleInspect(): void;
|
|
1534
761
|
protected startResize(event: PointerEvent): void;
|
|
1535
762
|
protected moveFloat(move: DragMoveEvent): void;
|
|
1536
|
-
/** Parks the panel where a drag left it, or pulls it back in if the drag stopped short of an edge. */
|
|
1537
763
|
protected endFloatMove(): void;
|
|
1538
|
-
/** A click on the title bar of a parked panel brings it back - the gesture that parked it, reversed. */
|
|
1539
764
|
protected restoreFloat(): void;
|
|
1540
|
-
/** A resize reports a delta from where the pointer went down, so the rect it started from is kept. */
|
|
1541
765
|
protected startFloatResize(): void;
|
|
1542
766
|
protected resizeFloat(move: ResizeMoveEvent): void;
|
|
1543
767
|
protected endFloatResize(): void;
|
|
@@ -1545,16 +769,9 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1545
769
|
pane: PaneTarget;
|
|
1546
770
|
container: HTMLElement;
|
|
1547
771
|
}): void;
|
|
1548
|
-
/** Hands a pane back to the stylesheet's proportional default, on the axis it is being sized along. */
|
|
1549
772
|
resetPaneSize(pane: PaneTarget): void;
|
|
1550
773
|
protected inspectLabel(entries: QueryDevtoolsEntry[]): string;
|
|
1551
|
-
/**
|
|
1552
|
-
* A query's route, split so the template can tell its static path from its path params (each carrying
|
|
1553
|
-
* the value the query used, or `:<name>` while it has none yet) and from the query string of the
|
|
1554
|
-
* request that ran - which is what tells two requests to the same endpoint apart.
|
|
1555
|
-
*/
|
|
1556
774
|
routeSegments(entry: QueryDevtoolsEntry | undefined, query: AnyQuery): RouteSegment[];
|
|
1557
|
-
/** The full URL of the request a query last made, or `null` while it has not executed. */
|
|
1558
775
|
requestUrl(query: AnyQuery): string | null;
|
|
1559
776
|
/**
|
|
1560
777
|
* The args of a query. A query executed imperatively (`execute({ args })`, a sequence step, an auth
|
|
@@ -1563,80 +780,37 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1563
780
|
*/
|
|
1564
781
|
queryArgs(query: AnyQuery): Omit<any, "response" | "rawResponse"> | null;
|
|
1565
782
|
/**
|
|
1566
|
-
* The headers
|
|
1567
|
-
*
|
|
1568
|
-
*
|
|
1569
|
-
* now. `null` while a header provider throws - a secure query's needs an access token.
|
|
1570
|
-
*
|
|
1571
|
-
* The args tree cannot answer this on its own: a `withArgs` query reads its args from the feature's
|
|
1572
|
-
* source, which the secure `Authorization` provider is never written back to, and client-level
|
|
1573
|
-
* headers are merged in per execution rather than being part of the args at all.
|
|
783
|
+
* The headers the last run sent, or what the args and client resolve to now for a query that has not
|
|
784
|
+
* run; `null` while a header provider throws. Client headers and the secure `Authorization` never
|
|
785
|
+
* reach the args, so the args alone cannot answer this.
|
|
1574
786
|
*/
|
|
1575
787
|
requestHeaders(query: AnyQuery): {
|
|
1576
788
|
[k: string]: string;
|
|
1577
789
|
} | null;
|
|
1578
790
|
queryStatus(query: AnyQuery): QueryStatus;
|
|
1579
|
-
/**
|
|
1580
|
-
* A request in flight is already refreshing, so reporting it as stale on top of `loading` is noise -
|
|
1581
|
-
* the same precedence the cache tab's freshness column applies.
|
|
1582
|
-
*/
|
|
1583
791
|
isStale(query: AnyQuery): boolean;
|
|
1584
|
-
/**
|
|
1585
|
-
* Whether an entry is showing something other than what the server actually sent - an armed response
|
|
1586
|
-
* override, or a devtools fault that decided its last completed run. Deliberately not "a fault is
|
|
1587
|
-
* armed nearby": an armed-but-idle fault (a `failRate` under 100, say) mostly lets requests through
|
|
1588
|
-
* untouched, so that would over-claim for the vast majority of queries on that client.
|
|
1589
|
-
*/
|
|
1590
792
|
isTampered(entry: QueryDevtoolsEntry): boolean;
|
|
1591
|
-
/** Whether a designed mock is armed for this query's own route, so nothing it shows came off the wire. */
|
|
1592
793
|
isMocked(entry: QueryDevtoolsEntry): boolean;
|
|
1593
|
-
/**
|
|
1594
|
-
* What a query's current request is doing beyond being loading, or `null` when there is nothing beyond
|
|
1595
|
-
* the status dot to say - so the readout only takes up room while it carries something.
|
|
1596
|
-
*/
|
|
1597
794
|
requestProgress(query: AnyQuery): RequestProgress | null;
|
|
1598
|
-
/** Why a retry was scheduled, as the panel spells it out. A status of 0 never reached the server. */
|
|
1599
795
|
retryCause(status: number): string;
|
|
1600
796
|
formatPercent(percentage: number): string;
|
|
1601
|
-
/** A countdown in whole seconds, spelled out the way the cache freshness column does. */
|
|
1602
797
|
formatCountdown(ms: number | null): string;
|
|
1603
798
|
queryActivity(entry: QueryDevtoolsEntry): QueryActivity;
|
|
1604
799
|
linkActivity(link: QueryLink): QueryActivity;
|
|
1605
800
|
stackActivity(stack: AnyQueryStack | AnyPagedQueryStack): QueryActivity;
|
|
1606
801
|
sequenceActivity(sequence: QuerySequence<unknown[]>): QueryActivity;
|
|
1607
|
-
/** Clears an entry's counters and run history, so the next interaction can be measured on its own. */
|
|
1608
802
|
resetStats(entry: QueryDevtoolsEntry): void;
|
|
1609
|
-
/** A query's runs, newest first - the order a history is read in. */
|
|
1610
803
|
queryRuns(entry: QueryDevtoolsEntry): QueryDevtoolsRun[];
|
|
1611
|
-
/**
|
|
1612
|
-
* What a run's status dot and timeline bar colour by. `pending` reuses the panel's loading colour;
|
|
1613
|
-
* `aborted` matches no rule and so falls back to the neutral one.
|
|
1614
|
-
*/
|
|
1615
804
|
runStatus(run: QueryDevtoolsRun): "loading" | "success" | "error" | "aborted";
|
|
1616
|
-
/**
|
|
1617
|
-
* Whether a run can be an end of the diff: it still holds its body, and so does some other run of the
|
|
1618
|
-
* same query. Deliberately not "an *older* run" - a free pair means the oldest body held is pickable
|
|
1619
|
-
* too, as the base of a comparison against something newer.
|
|
1620
|
-
*/
|
|
1621
805
|
canDiffRun(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): boolean;
|
|
1622
|
-
/**
|
|
1623
|
-
* Arms a run as one end of the diff, or - with one end already armed - as the other. Clicking either
|
|
1624
|
-
* end clears both.
|
|
1625
|
-
*/
|
|
1626
806
|
toggleRunDiff(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): void;
|
|
1627
|
-
/** Which end of the comparison a run is, so a row says so and the two ends read differently. */
|
|
1628
807
|
diffRunRole(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): 'base' | 'compare' | null;
|
|
1629
808
|
responseDiff(entry: QueryDevtoolsEntry): {
|
|
1630
809
|
before: QueryDevtoolsRun;
|
|
1631
810
|
after: QueryDevtoolsRun;
|
|
1632
811
|
diff: QueryDevtoolsDiff;
|
|
1633
812
|
} | null;
|
|
1634
|
-
/** Whether the diff header's older/newer control has a pair to move to. */
|
|
1635
813
|
canStepRunDiff(entry: QueryDevtoolsEntry, older: boolean): boolean;
|
|
1636
|
-
/**
|
|
1637
|
-
* Moves the whole comparison one run older or newer, so re-picking a pair does not mean scrolling back
|
|
1638
|
-
* up to the runs table. Within the handful of retained bodies there are only a few pairs to walk.
|
|
1639
|
-
*/
|
|
1640
814
|
stepRunDiff(entry: QueryDevtoolsEntry, older: boolean): void;
|
|
1641
815
|
toggleRunError(run: QueryDevtoolsRun): void;
|
|
1642
816
|
/**
|
|
@@ -1646,19 +820,12 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1646
820
|
*/
|
|
1647
821
|
pickedRunError(entry: QueryDevtoolsEntry): {
|
|
1648
822
|
run: QueryDevtoolsRun;
|
|
1649
|
-
error: _ethlete_query
|
|
823
|
+
error: _ethlete_query.ɵQueryDevtoolsRunError;
|
|
1650
824
|
} | null;
|
|
1651
|
-
/** Opens a query in the Queries tab - the Events tab is a way in, not a dead end. */
|
|
1652
825
|
selectQuery(id: string): void;
|
|
1653
|
-
/** A value on one line, for a diff row or a form field. The full tree would bury the row it sits in. */
|
|
1654
826
|
inlineValue(value: unknown): string;
|
|
1655
827
|
formatBytes(bytes: number): string;
|
|
1656
|
-
/**
|
|
1657
|
-
* A transferred size, marked `≈` when any part of it was measured from a decoded body instead of read
|
|
1658
|
-
* from a `content-length` header - such a size ignores transport compression.
|
|
1659
|
-
*/
|
|
1660
828
|
formatTransferred(bytes: number, isEstimated: boolean): string;
|
|
1661
|
-
/** A transfer rate, given in bytes per second the way `HttpRequestLoadingProgressState.speed` reports it. */
|
|
1662
829
|
formatSpeed(bytesPerSecond: number): string;
|
|
1663
830
|
formatDuration(ms: number | null): string;
|
|
1664
831
|
/**
|
|
@@ -1668,46 +835,17 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1668
835
|
*/
|
|
1669
836
|
executeQuery(selection: QueryDevtoolsSelection, allowCache: boolean): void;
|
|
1670
837
|
resetQuery(query: AnyQuery): void;
|
|
1671
|
-
/**
|
|
1672
|
-
* Copies a shareable report (path, args, status, slimmed response) for handing to an API dev.
|
|
1673
|
-
* Writes both rich `text/html` (Slack applies formatting on paste - it does not parse markdown) and
|
|
1674
|
-
* a plain-text fallback.
|
|
1675
|
-
*/
|
|
1676
838
|
copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
1677
|
-
/** Copies one query as an Insomnia collection, for `Import > From Clipboard`. */
|
|
1678
839
|
copyInsomniaRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
1679
|
-
/**
|
|
1680
|
-
* Copies one query as a `curl` command - what goes into a terminal, a ticket or a chat message, where
|
|
1681
|
-
* an Insomnia collection is too heavy to be read at all.
|
|
1682
|
-
*/
|
|
1683
840
|
copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
1684
|
-
/** Copies the GraphQL document as displayed — dedented, so it pastes straight into a playground. */
|
|
1685
841
|
copyGqlDocument(doc: string): void;
|
|
1686
|
-
/**
|
|
1687
|
-
* The endpoint of a query as one string: the absolute URL its last request used, or - for a query
|
|
1688
|
-
* that has not run - the rendered route on screen.
|
|
1689
|
-
*/
|
|
1690
842
|
copyableRoute(entry: QueryDevtoolsEntry, query: AnyQuery): string;
|
|
1691
|
-
/** Names which of the two strings {@link copyableRoute} is offering, so the button says what it copies. */
|
|
1692
843
|
copyableRouteTitle(entry: QueryDevtoolsEntry, query: AnyQuery): string;
|
|
1693
|
-
/** Copies {@link copyableRoute} - the endpoint on its own, where the exports are a whole document. */
|
|
1694
844
|
copyRoute(entry: QueryDevtoolsEntry, query: AnyQuery): void;
|
|
1695
|
-
/**
|
|
1696
|
-
* Downloads the given queries (already scoped/filtered by the caller) as one Insomnia collection,
|
|
1697
|
-
* filed into a folder per query client.
|
|
1698
|
-
*/
|
|
1699
845
|
downloadInsomniaCollection(items: {
|
|
1700
846
|
entry: QueryDevtoolsEntry;
|
|
1701
847
|
query: AnyQuery;
|
|
1702
848
|
}[], clientLabel: string | null): void;
|
|
1703
|
-
/**
|
|
1704
|
-
* Downloads the whole panel as one JSON file: every registered entry with what it ran and what it
|
|
1705
|
-
* holds, the event log, the cache totals and anything armed in the Faults tab. Unlike **Copy report**
|
|
1706
|
-
* this is not scoped to one query - it is the attachment for a bug report about a screen.
|
|
1707
|
-
*
|
|
1708
|
-
* Deliberately unfiltered apart from credentials: a report is read by someone who was not there, and a
|
|
1709
|
-
* dump that silently left out the client you were not looking at is worse than no dump.
|
|
1710
|
-
*/
|
|
1711
849
|
protected downloadSession(): void;
|
|
1712
850
|
openResponseEditor(query: AnyQuery): void;
|
|
1713
851
|
openArgsEditor({ entry, query }: QueryDevtoolsSelection): void;
|
|
@@ -1720,32 +858,14 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1720
858
|
clearForced(query: AnyQuery): void;
|
|
1721
859
|
refetchCacheEntry(entry: QueryRepositoryCacheEntry): void;
|
|
1722
860
|
evictCacheEntry(repository: QueryRepository, key: string): void;
|
|
1723
|
-
/**
|
|
1724
|
-
* Drops every entry of one client, consumers included - the cold-start check that does not need a
|
|
1725
|
-
* reload. A query still bound to an evicted entry requests again on its next execution.
|
|
1726
|
-
*/
|
|
1727
861
|
evictAllCacheEntries(repository: QueryRepository): void;
|
|
1728
|
-
/**
|
|
1729
|
-
* Expands the response held under a cache key, which is the only way to read an entry no live query is
|
|
1730
|
-
* bound to any more - the Queries tab has nothing to select for it.
|
|
1731
|
-
*/
|
|
1732
862
|
toggleCacheValue(clientName: string, key: string): void;
|
|
1733
863
|
isCacheValueExpanded(clientName: string, key: string): boolean;
|
|
1734
864
|
cacheFreshness(entry: QueryRepositoryCacheEntry): string;
|
|
1735
|
-
/**
|
|
1736
|
-
* What multi-tab sync is doing for a cache entry: whether this tab is the one polling the key, and
|
|
1737
|
-
* how long ago it last took a response from another tab. Empty when the client has no sync.
|
|
1738
|
-
*/
|
|
1739
865
|
cacheSync(entry: QueryRepositoryCacheEntry, pollStates: Record<string, QueryKeyLockState>): string;
|
|
1740
|
-
/**
|
|
1741
|
-
* Whether a cache entry is showing data that came off the disk rather than the network - the answer
|
|
1742
|
-
* to "why is this here already?" on a cold start. Empty when the client does not persist responses.
|
|
1743
|
-
*/
|
|
1744
866
|
cachePersistence(entry: QueryRepositoryCacheEntry): string;
|
|
1745
|
-
/** How many responses this client has on disk, which is usually more than it has in memory. */
|
|
1746
867
|
persistedCount(client: QueryClient): number;
|
|
1747
868
|
clearPersistedQueries(client: QueryClient): void;
|
|
1748
|
-
/** The path + query of a request URL (origin stripped), for readable cache/event identifiers. */
|
|
1749
869
|
requestPath(url: string): string;
|
|
1750
870
|
asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
|
|
1751
871
|
asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
|
|
@@ -1753,17 +873,8 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1753
873
|
asBatch(entry: QueryDevtoolsEntry): AnyQueryBatch;
|
|
1754
874
|
asAuth(entry: QueryDevtoolsEntry): AnyBearerAuthProvider;
|
|
1755
875
|
asWs(entry: QueryDevtoolsEntry): WebSocketDevtoolsHandle;
|
|
1756
|
-
/**
|
|
1757
|
-
* A socket's messages, narrowed by the filter box. Every whitespace-separated term has to match the
|
|
1758
|
-
* event, the room or the direction, so `out join` finds the room joins the client sent.
|
|
1759
|
-
*/
|
|
1760
876
|
socketMessages(ws: WebSocketDevtoolsHandle): WebSocketDevtoolsMessage[];
|
|
1761
|
-
/** How the message log labels a direction: what the client sent, versus what the server pushed. */
|
|
1762
877
|
socketDirectionLabel(message: WebSocketDevtoolsMessage): "↑ sent" | "↓ received";
|
|
1763
|
-
/**
|
|
1764
|
-
* Sends a message as the app would, so a server that only answers a client that asked can be provoked
|
|
1765
|
-
* from the panel. An empty payload sends nothing rather than `""` - a plain event is a valid message.
|
|
1766
|
-
*/
|
|
1767
878
|
emitSocketMessage(options: {
|
|
1768
879
|
entry: QueryDevtoolsEntry;
|
|
1769
880
|
event: string;
|
|
@@ -1771,98 +882,50 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1771
882
|
}): void;
|
|
1772
883
|
socketEmitErrorFor(entryId: string): string | null;
|
|
1773
884
|
asForm(entry: QueryDevtoolsEntry): QueryDevtoolsFormHandle;
|
|
1774
|
-
/**
|
|
1775
|
-
* The queries a form feeds, discovered from the reads its `value()` recorded while their args were
|
|
1776
|
-
* built - so a form that nothing consumes yet reads as exactly that.
|
|
1777
|
-
*/
|
|
1778
885
|
queriesDrivenByForm(entry: QueryDevtoolsEntry): QueryLink[];
|
|
1779
|
-
/** The reverse: the forms whose value a query's args read. */
|
|
1780
886
|
formsDrivingQuery(entry: QueryDevtoolsEntry): QueryDevtoolsEntry[];
|
|
1781
887
|
selectForm(id: string): void;
|
|
1782
|
-
/**
|
|
1783
|
-
* The refreshes that re-executed a query, newest first - the answer to "why did this refetch?". Read
|
|
1784
|
-
* off the event log, so it goes back exactly as far as the log does.
|
|
1785
|
-
*/
|
|
1786
888
|
refreshesFor(entryId: string): {
|
|
1787
889
|
id: number;
|
|
1788
890
|
timestamp: number;
|
|
1789
891
|
label: string;
|
|
1790
892
|
}[];
|
|
1791
|
-
/** What asked for a refresh, on one line. */
|
|
1792
893
|
causeLabel(cause: QueryRefreshCause): string;
|
|
1793
|
-
/** Derives the per-step status of a sequence step from its live progress signals. */
|
|
1794
894
|
sequenceStepStatus(sequence: QuerySequence<unknown[]>, index: number): QuerySequenceStatus;
|
|
1795
895
|
authTokenPayload(auth: AnyBearerAuthProvider): Record<string, unknown> | null;
|
|
1796
896
|
queriesForStack(stack: AnyQueryStack | AnyPagedQueryStack): QueryLink[];
|
|
1797
897
|
authQueryKeys(auth: AnyBearerAuthProvider): string[];
|
|
1798
|
-
/** Where this tab stands on one lock, as a chip. @see lockRows */
|
|
1799
898
|
lockStanding(row: DevtoolsLockRow): QueryDevtoolsChip;
|
|
1800
|
-
/**
|
|
1801
|
-
* Which tab refreshes this provider's tokens, as a chip: whether it is this one, how many tabs are
|
|
1802
|
-
* in the election, and - when there is no election - why every tab reads as the leader.
|
|
1803
|
-
*/
|
|
1804
899
|
authLeadership(auth: AnyBearerAuthProvider): QueryDevtoolsChip | null;
|
|
1805
|
-
/**
|
|
1806
|
-
* The access token's expiry as the app sees it, plus whatever the panel is doing to it: an armed
|
|
1807
|
-
* lifetime replaces the countdown, and the token's own is reported next to it so the card never claims
|
|
1808
|
-
* a refresh is due at a time the API would disagree with.
|
|
1809
|
-
*/
|
|
1810
900
|
authTokenLifetime(entry: QueryDevtoolsEntry): QueryDevtoolsTokenLifetime;
|
|
1811
901
|
queriesForSequence(sequence: QuerySequence<unknown[]>): QueryLink[];
|
|
1812
|
-
/** The snapshot of a sequence step, once it has run (holds the args in and the response/error out). */
|
|
1813
902
|
stepSnapshot(sequence: QuerySequence<unknown[]>, index: number): AnyQuerySnapshot | null;
|
|
1814
903
|
toggleQueryGroup(key: string): void;
|
|
1815
904
|
expandQueryGroup(key: string): void;
|
|
1816
905
|
isStepExpanded(entryId: string, index: number): boolean;
|
|
1817
906
|
toggleStep(entryId: string, index: number): void;
|
|
1818
|
-
/** A batch's route with its path params left as `:name` - a batch fills them in per item, not once. */
|
|
1819
907
|
batchRouteSegments(entry: QueryDevtoolsEntry): RouteSegment[];
|
|
1820
908
|
batchOf(entry: QueryDevtoolsEntry): QueryDevtoolsEntry | null;
|
|
1821
909
|
queriesForBatch(entry: QueryDevtoolsEntry): QueryLink[];
|
|
1822
|
-
/**
|
|
1823
|
-
* The registry entry of one of a batch's items, or `null` once it has fallen out of the batch's capped
|
|
1824
|
-
* tombstone tail - which is what makes an item row openable only while its query is still kept.
|
|
1825
|
-
*/
|
|
1826
910
|
batchItemQueryId(entry: QueryDevtoolsEntry, index: number): string | null;
|
|
1827
911
|
batchItems(entry: QueryDevtoolsEntry): BatchItemView;
|
|
1828
912
|
batchThroughput(batch: AnyQueryBatch): string | null;
|
|
1829
913
|
isBatchItemExpanded(entryId: string, index: number): boolean;
|
|
1830
914
|
toggleBatchItem(entryId: string, index: number): void;
|
|
1831
|
-
/** Dedents a GraphQL document (template-literal indentation) for readable display. */
|
|
1832
915
|
gqlDocument(doc: string): string;
|
|
1833
916
|
featureLabel(type: string): string;
|
|
1834
|
-
/** A feature and its options on one line, for a report or a chip's tooltip. */
|
|
1835
917
|
featureSummary(feature: QueryDevtoolsFeature): string;
|
|
1836
|
-
/** The features of the client behind a cache tab card, or `null` for a client without any. */
|
|
1837
918
|
clientFeatures(client: QueryClient | null | undefined): QueryDevtoolsFeature[] | null;
|
|
1838
919
|
formatTime(timestamp: number | null): string;
|
|
1839
|
-
/**
|
|
1840
|
-
* The element a query was created in, which is what {@link locateQuery} can point at. `null` for a
|
|
1841
|
-
* query created outside a component or directive injector - a root service, a resolver, a guard.
|
|
1842
|
-
*/
|
|
1843
920
|
locatableElement(entry: QueryDevtoolsEntry): HTMLElement | null;
|
|
1844
|
-
/**
|
|
1845
|
-
* Scrolls the element the selected query was created in into view and draws the inspect box over it -
|
|
1846
|
-
* inspect run backwards. Where a query was *created* is not necessarily where its data is rendered,
|
|
1847
|
-
* which is what the button's "created here" wording is for.
|
|
1848
|
-
*/
|
|
1849
921
|
locateQuery(entry: QueryDevtoolsEntry): void;
|
|
1850
|
-
/** Downloads a file a tab generated. @see QueryDevtoolsHost.downloadTextFile */
|
|
1851
922
|
downloadTextFile(file: {
|
|
1852
923
|
name: string;
|
|
1853
924
|
content: string;
|
|
1854
925
|
type: string;
|
|
1855
926
|
}): void;
|
|
1856
|
-
|
|
1857
|
-
* The headers an execution of this request would resolve to now: the client's with the per-request
|
|
1858
|
-
* ones merged on top, providers called. `undefined` when a provider throws, which for a secure query
|
|
1859
|
-
* means no access token is available yet.
|
|
1860
|
-
*/
|
|
927
|
+
eventQueryId(event: EventLogItem): string | null;
|
|
1861
928
|
private resolvedHeaders;
|
|
1862
|
-
/**
|
|
1863
|
-
* The same route rendered from a set of args rather than from a query, which is what a batch item leaves
|
|
1864
|
-
* behind: the batch destroys its query the moment the item settles.
|
|
1865
|
-
*/
|
|
1866
929
|
private argsRouteSegments;
|
|
1867
930
|
private renderRoute;
|
|
1868
931
|
/**
|
|
@@ -1871,40 +934,16 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1871
934
|
* the platform offers no way to ask for one's own client id.
|
|
1872
935
|
*/
|
|
1873
936
|
private holdProbeLock;
|
|
1874
|
-
/**
|
|
1875
|
-
* The two runs the diff compares, oldest first - normalised by run index, so picking a pair in either
|
|
1876
|
-
* order reads the same way round as the `#before → #after` header prints it.
|
|
1877
|
-
*
|
|
1878
|
-
* `null` unless a run is picked, so a closed diff costs nothing to walk.
|
|
1879
|
-
*/
|
|
1880
|
-
/**
|
|
1881
|
-
* The two runs the comparison spans, oldest first - normalised by run index, so picking a pair in
|
|
1882
|
-
* either order reads the same way round as the `#before → #after` header prints it. With only one end
|
|
1883
|
-
* armed, `after` is absent unless an older body-holding run can stand in for the base.
|
|
1884
|
-
*
|
|
1885
|
-
* `null` unless a run is armed, so a closed diff costs nothing to walk.
|
|
1886
|
-
*/
|
|
1887
|
-
/**
|
|
1888
|
-
* The pair one step older or newer than the current comparison, keeping whatever gap it has, or `null`
|
|
1889
|
-
* at either end of the retained bodies.
|
|
1890
|
-
*/
|
|
1891
937
|
private steppedDiffPair;
|
|
1892
938
|
private diffEnds;
|
|
1893
939
|
private isTabPrimary;
|
|
1894
|
-
/** Moves the panel into a pop-up whose document has finished loading. @see popOut */
|
|
1895
940
|
private mountPopOut;
|
|
1896
941
|
/**
|
|
1897
|
-
* The
|
|
1898
|
-
*
|
|
1899
|
-
* the pop-out does not have - inherited afresh over there, the panel would take the document's theme
|
|
1900
|
-
* (usually the light one) rather than the one it was just being read against.
|
|
1901
|
-
*
|
|
1902
|
-
* Empty on a browser that does not enumerate custom properties, which leaves the tokens to be
|
|
1903
|
-
* inherited as before.
|
|
942
|
+
* The chrome tokens as the app resolves them now: the pop-out has no ancestor carrying the host theme.
|
|
943
|
+
* Empty on a browser that does not enumerate custom properties.
|
|
1904
944
|
*/
|
|
1905
945
|
private chromeTokens;
|
|
1906
946
|
private inlineStyleOf;
|
|
1907
|
-
/** Whether a `<head>` child carries CSS the pop-out needs a copy of. */
|
|
1908
947
|
private isStyleNode;
|
|
1909
948
|
/**
|
|
1910
949
|
* Copies the host document's stylesheets into the pop-up and keeps mirroring them while it is
|
|
@@ -1913,53 +952,19 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1913
952
|
* over there - so a one-time copy would leave everything first used after the pop-out unstyled.
|
|
1914
953
|
*/
|
|
1915
954
|
private syncStylesInto;
|
|
1916
|
-
/** Brings the panel back into the host element and closes the window it was living in. */
|
|
1917
955
|
private dockBack;
|
|
1918
|
-
/** A registered query as a row that opens the detail drawer. */
|
|
1919
956
|
private queryLinkFor;
|
|
1920
|
-
/** The activity of one entry, or the total of a group of them (a stack's queries, a whole tab). */
|
|
1921
957
|
private activityOf;
|
|
1922
|
-
/** An activity summary on one line, for a report. `null` for a query that has not run. */
|
|
1923
958
|
private activitySummary;
|
|
1924
|
-
/** {@link routeSegments} as a plain string, for the places that cannot render markup. */
|
|
1925
959
|
private queryRoute;
|
|
1926
|
-
/**
|
|
1927
|
-
* Describes a query the way a replay outside the app needs it: the URL, headers and body of the
|
|
1928
|
-
* request it last made, or - for a query that has not run - what its current args would send.
|
|
1929
|
-
*/
|
|
1930
960
|
private exportedRequest;
|
|
1931
|
-
/**
|
|
1932
|
-
* The token refreshes the given requests authenticate with - one per auth provider they name, and
|
|
1933
|
-
* only for a provider that is logged in, since a refresh request without a refresh token has
|
|
1934
|
-
* nothing to send.
|
|
1935
|
-
*/
|
|
1936
961
|
private insomniaTokenRefreshes;
|
|
1937
962
|
private insomniaTokenRefresh;
|
|
1938
|
-
/**
|
|
1939
|
-
* Where the access token sits in the refresh response. A provider's `extractTokens` can pull it out
|
|
1940
|
-
* of any shape, so the path is recovered by finding the live token in the last auth response - with
|
|
1941
|
-
* the default extractor's `$.accessToken` as the fallback.
|
|
1942
|
-
*/
|
|
1943
963
|
private accessTokenPath;
|
|
1944
|
-
/**
|
|
1945
|
-
* How long Insomnia may reuse a stored refresh response: the access token's own lifetime with a
|
|
1946
|
-
* margin, so the chain refreshes shortly before the token it hands out would expire. Capped at an
|
|
1947
|
-
* hour - a long-lived (or bogus) `exp` should still hand out a token minted this session.
|
|
1948
|
-
*/
|
|
1949
964
|
private accessTokenMaxAge;
|
|
1950
|
-
/**
|
|
1951
|
-
* The headers a replay needs, including the ones the query client adds. Header providers can throw
|
|
1952
|
-
* (a secure query's needs an access token), in which case the request is exported without them.
|
|
1953
|
-
*/
|
|
1954
965
|
private insomniaHeaders;
|
|
1955
966
|
private sessionClients;
|
|
1956
|
-
/**
|
|
1957
|
-
* A bearer auth provider's login and token-refresh queries are ordinary registered queries, so the
|
|
1958
|
-
* export has to be told which ones they are before it can leave their bodies out. The provider's own
|
|
1959
|
-
* entry lists them by client, method and route, which is what a query entry is matched on.
|
|
1960
|
-
*/
|
|
1961
967
|
private sessionAuthQueryKeys;
|
|
1962
|
-
/** Every registered entry, described by whatever its kind carries. */
|
|
1963
968
|
private sessionEntries;
|
|
1964
969
|
private sessionQuery;
|
|
1965
970
|
private sessionActivity;
|
|
@@ -1975,37 +980,20 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
1975
980
|
private sessionSocket;
|
|
1976
981
|
private sessionEvents;
|
|
1977
982
|
private sessionFaults;
|
|
1978
|
-
/** Only the armed ones: a capture taken while the panel was answering requests has to say which. */
|
|
1979
983
|
private sessionMocks;
|
|
1980
984
|
private downloadFile;
|
|
1981
985
|
private stepKey;
|
|
1982
986
|
private paneSize;
|
|
1983
|
-
/** The panel's size is the distance from the pointer to the edge it is docked to. */
|
|
1984
987
|
private applyResize;
|
|
1985
|
-
/** A pane's size is the distance from the pointer to the container edge that pane sits against. */
|
|
1986
988
|
private applyPaneResize;
|
|
1987
989
|
private closePopup;
|
|
1988
990
|
private updateInspectHover;
|
|
1989
991
|
private selectInspectedQuery;
|
|
1990
992
|
private selectionKey;
|
|
1991
|
-
/** Writes to the clipboard and ticks `copied` on success. `html` is omitted for plain-text payloads. */
|
|
1992
993
|
private writeToClipboard;
|
|
1993
994
|
private responseStatus;
|
|
1994
995
|
private findQuery;
|
|
1995
996
|
private pushEvent;
|
|
1996
|
-
/**
|
|
1997
|
-
* The registered query an event's request belongs to. A request is shared by every query on the same
|
|
1998
|
-
* cache key, so the first owner is as good as any - they all show the same response.
|
|
1999
|
-
*
|
|
2000
|
-
* The url fallback is what makes a row clickable when the query is already gone: an error that fires
|
|
2001
|
-
* as the component holding it is being destroyed (a `401` that redirects to login) has no live owner
|
|
2002
|
-
* left to match on identity, and its tombstone holds a copy of the request rather than the request.
|
|
2003
|
-
*/
|
|
2004
|
-
private resolveEventQueryId;
|
|
2005
|
-
/**
|
|
2006
|
-
* The size of a settled request's response, taken from its `content-length` when the response carried
|
|
2007
|
-
* one and measured from the decoded body otherwise.
|
|
2008
|
-
*/
|
|
2009
997
|
private measureResponse;
|
|
2010
998
|
private refreshedRequestOf;
|
|
2011
999
|
private pushEventItem;
|
|
@@ -2016,7 +1004,6 @@ declare class QueryDevtoolsComponent implements OnInit {
|
|
|
2016
1004
|
declare const QUERY_DEVTOOLS_IMPORTS: readonly [typeof QueryDevtoolsComponent];
|
|
2017
1005
|
|
|
2018
1006
|
/** The version of `@ethlete/query-devtools` this build was cut from. */
|
|
2019
|
-
declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.
|
|
1007
|
+
declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.15";
|
|
2020
1008
|
|
|
2021
|
-
export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION,
|
|
2022
|
-
export type { JsonKind };
|
|
1009
|
+
export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsComponent };
|