@ethlete/query-devtools 1.0.0-next.15 → 1.0.0-next.17

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.
@@ -1,57 +1,53 @@
1
- import * as _ethlete_query from '@ethlete/query';
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
- import { ResizeEdge, DragMoveEvent, ResizeMoveEvent } from '@ethlete/core';
6
- import { QueryDevtoolsStats, QueryDevtoolsStatsHandle, QueryDevtoolsEntry, QueryDevtoolsRun, QueryDevtoolsFormHandle, QueryDevtoolsFeature } from '@ethlete/query/devtools-contract';
7
-
1
+ import * as i0 from "@angular/core";
2
+ import { OnInit } from "@angular/core";
3
+ import { DragMoveEvent, ResizeEdge, ResizeMoveEvent } from "@ethlete/core";
4
+ import { AnyBearerAuthProvider, AnyPagedQueryStack, AnyQueryBatch, AnyQueryBatchItemResult, AnyQuerySnapshot, AnyQueryStack, HttpRequestLoadingProgressState, HttpRequestRetryState, Query, QueryClient, QueryKeyLockState, QueryRefreshCause, QueryRepository, QueryRepositoryCacheEntry, QueryRepositoryEntryDestroyedCause, QuerySequence, QuerySequenceStatus, WebSocketDevtoolsHandle, WebSocketDevtoolsMessage } from "@ethlete/query";
5
+ import { QueryDevtoolsEntry, QueryDevtoolsFeature, QueryDevtoolsFormHandle, QueryDevtoolsRun, QueryDevtoolsStats, QueryDevtoolsStatsHandle } from "@ethlete/query/devtools-contract";
8
6
  /** Whether a path exists only in the newer value, only in the older one, or in both with a new value. */
9
7
  type QueryDevtoolsDiffKind = 'added' | 'removed' | 'changed';
10
8
  /** One difference between two values, located by the path it sits at. */
11
9
  type QueryDevtoolsDiffEntry = {
12
- /** Where the difference sits, e.g. `$.items[2].score` or `$.items[id=7].score`. */
13
- path: string;
14
- kind: QueryDevtoolsDiffKind;
15
- /** The older value, or `null` for an added path. */
16
- before: unknown;
17
- /** The newer value, or `null` for a removed path. */
18
- after: unknown;
10
+ /** Where the difference sits, e.g. `$.items[2].score` or `$.items[id=7].score`. */
11
+ path: string;
12
+ kind: QueryDevtoolsDiffKind;
13
+ /** The older value, or `null` for an added path. */
14
+ before: unknown;
15
+ /** The newer value, or `null` for a removed path. */
16
+ after: unknown;
19
17
  };
20
18
  type QueryDevtoolsDiff = {
21
- entries: QueryDevtoolsDiffEntry[];
22
- /** Whether the walk hit its cap, so {@link entries} is only part of the difference. */
23
- truncated: boolean;
19
+ entries: QueryDevtoolsDiffEntry[];
20
+ /** Whether the walk hit its cap, so {@link entries} is only part of the difference. */
21
+ truncated: boolean;
24
22
  };
25
-
26
23
  /** Which SDK feature a lock name belongs to, or `other` for one the panel did not put there. */
27
24
  type DevtoolsLockKind = 'auth' | 'poll' | 'other';
28
25
  /** Where the tab the panel is open in stands on one lock. */
29
26
  type DevtoolsLockStanding = 'holder' | 'queued' | 'absent' | 'unknown';
30
27
  /** One lock name, with every client that holds or waits for it folded into a single row. */
31
28
  type DevtoolsLockRow = {
32
- /** The raw name, so a lock the panel cannot decode is still greppable from the row. */
33
- name: string;
34
- /** What the name means: the provider for an auth lock, the cache key for a poll lock. */
35
- label: string;
36
- kind: DevtoolsLockKind;
37
- /** The sync channel a poll lock belongs to, or `null` for a name that carries no such part. */
38
- channel: string | null;
39
- /**
40
- * Held plus queued on this name. Every participant requests the same lock and exactly one gets it, so
41
- * this is the number of tabs, workers and service workers taking part - the same arithmetic the auth
42
- * provider's own `instanceCount` does.
43
- */
44
- tabs: number;
45
- standing: DevtoolsLockStanding;
46
- /** This tab's 1-based place in the queue, or `null` unless {@link standing} is `queued`. */
47
- queuePlace: number | null;
29
+ /** The raw name, so a lock the panel cannot decode is still greppable from the row. */
30
+ name: string;
31
+ /** What the name means: the provider for an auth lock, the cache key for a poll lock. */
32
+ label: string;
33
+ kind: DevtoolsLockKind;
34
+ /** The sync channel a poll lock belongs to, or `null` for a name that carries no such part. */
35
+ channel: string | null;
36
+ /**
37
+ * Held plus queued on this name. Every participant requests the same lock and exactly one gets it, so
38
+ * this is the number of tabs, workers and service workers taking part - the same arithmetic the auth
39
+ * provider's own `instanceCount` does.
40
+ */
41
+ tabs: number;
42
+ standing: DevtoolsLockStanding;
43
+ /** This tab's 1-based place in the queue, or `null` unless {@link standing} is `queued`. */
44
+ queuePlace: number | null;
48
45
  };
49
-
50
46
  type AnyQuery = Query<any>;
51
47
  /** The query a detail pane is showing, together with the registry entry it was registered as. */
52
48
  type QueryDevtoolsSelection = {
53
- entry: QueryDevtoolsEntry;
54
- query: AnyQuery;
49
+ entry: QueryDevtoolsEntry;
50
+ query: AnyQuery;
55
51
  };
56
52
  /**
57
53
  * A body the panel can show. Every one of them but `settings` is a tab in the bar: Settings holds nothing
@@ -71,21 +67,21 @@ type DetailTab = 'overview' | 'history' | 'data';
71
67
  type PaneTarget = 'list' | 'drawer';
72
68
  /** The axis a two-pane tab splits along: the panes sit side by side, or stack in a side dock. */
73
69
  type PaneAxis = 'inline' | 'block';
74
- type QueryStatus = 'idle' | 'loading' | 'success' | 'error';
70
+ type QueryStatus = 'idle' | 'parked' | 'loading' | 'success' | 'error';
75
71
  /**
76
- * A facet the Queries list can be narrowed to. The first four describe live state; `gone` is the odd
72
+ * A facet the Queries list can be narrowed to. All but `gone` describe live state; `gone` is the odd
77
73
  * one out - it is the only way a destroyed query's tombstone enters the list at all, which is why it
78
74
  * is off by default rather than just another filter over what is already shown.
79
75
  */
80
- type QueryListFacet = 'error' | 'loading' | 'stale' | 'idle' | 'gone';
76
+ type QueryListFacet = 'error' | 'loading' | 'stale' | 'parked' | 'idle' | 'gone';
81
77
  /**
82
78
  * A chunk of a route as rendered: literal path text, a path param (`name` is the param it fills in) or
83
79
  * the query string of the request that ran. The kind becomes the segment's class.
84
80
  */
85
81
  type RouteSegment = {
86
- text: string;
87
- kind: 'static' | 'param' | 'query';
88
- name?: string;
82
+ text: string;
83
+ kind: 'static' | 'param' | 'query';
84
+ name?: string;
89
85
  };
90
86
  /**
91
87
  * A one-line verdict the panel renders as a chip - which tab refreshes an auth provider's tokens, where
@@ -93,54 +89,54 @@ type RouteSegment = {
93
89
  * as the leader, or how approximate a tab count is.
94
90
  */
95
91
  type QueryDevtoolsChip = {
96
- label: string;
97
- tone: 'success' | 'muted';
98
- title: string;
92
+ label: string;
93
+ tone: 'success' | 'muted';
94
+ title: string;
99
95
  };
100
96
  /** An auth provider's access-token expiry as the auth tab renders it, armed override included. */
101
97
  type QueryDevtoolsTokenLifetime = {
102
- /** Countdown to the expiry the app currently acts on, overridden or not. */
103
- expiresIn: string | null;
104
- /** Countdown to the token's own `exp`, and only set while an override is making it read differently. */
105
- realExpiresIn: string | null;
106
- /** The armed lifetime in seconds, or `null` while the token is on the one it was issued with. */
107
- ttlSeconds: number | null;
108
- /** Whether an override can be applied at all - the token needs an `exp` plus an `iat` or `nbf`. */
109
- overridable: boolean;
98
+ /** Countdown to the expiry the app currently acts on, overridden or not. */
99
+ expiresIn: string | null;
100
+ /** Countdown to the token's own `exp`, and only set while an override is making it read differently. */
101
+ realExpiresIn: string | null;
102
+ /** The armed lifetime in seconds, or `null` while the token is on the one it was issued with. */
103
+ ttlSeconds: number | null;
104
+ /** Whether an override can be applied at all - the token needs an `exp` plus an `iat` or `nbf`. */
105
+ overridable: boolean;
110
106
  };
111
107
  /** A query reachable from a stack or sequence card, rendered as a row that opens the detail drawer. */
112
108
  type QueryLink = {
113
- id: string;
114
- query: AnyQuery;
115
- method: string;
116
- segments: RouteSegment[];
117
- clientBaseUrl: string;
118
- stats?: QueryDevtoolsStatsHandle;
109
+ id: string;
110
+ query: AnyQuery;
111
+ method: string;
112
+ segments: RouteSegment[];
113
+ clientBaseUrl: string;
114
+ stats?: QueryDevtoolsStatsHandle;
119
115
  };
120
116
  /** One settled item of a query batch, with the route the args it was sent with resolve to. */
121
117
  type BatchItemRow = {
122
- result: AnyQueryBatchItemResult;
123
- segments: RouteSegment[];
118
+ result: AnyQueryBatchItemResult;
119
+ segments: RouteSegment[];
124
120
  };
125
121
  /**
126
122
  * A batch's settled items as its card lists them. Capped, and `hidden` says by how much - a bulk run
127
123
  * settles more items than a list can hold, and a truncated one must not read as the whole run.
128
124
  */
129
125
  type BatchItemView = {
130
- rows: BatchItemRow[];
131
- total: number;
132
- hidden: number;
126
+ rows: BatchItemRow[];
127
+ total: number;
128
+ hidden: number;
133
129
  };
134
130
  /**
135
131
  * Query stats plus the numbers the panel derives from them rather than storing: an execution that never
136
132
  * reached the network was answered from the cache, and the averages come from the running totals.
137
133
  */
138
134
  type QueryActivity = {
139
- stats: QueryDevtoolsStats;
140
- cacheServed: number;
141
- avgDurationMs: number | null;
142
- avgResponseBytes: number | null;
143
- hasActivity: boolean;
135
+ stats: QueryDevtoolsStats;
136
+ cacheServed: number;
137
+ avgDurationMs: number | null;
138
+ avgResponseBytes: number | null;
139
+ hasActivity: boolean;
144
140
  };
145
141
  /**
146
142
  * What a query's request is doing beyond `loading`: which attempt it is on, the backoff it is waiting
@@ -148,12 +144,12 @@ type QueryActivity = {
148
144
  * backoff and a plain slow one are the same yellow dot.
149
145
  */
150
146
  type RequestProgress = {
151
- /** @see HttpRequestSubtle.attempts */
152
- attempts: number;
153
- retry: HttpRequestRetryState | null;
154
- /** How much of the pending backoff is left, or `null` when none is pending. */
155
- retryInMs: number | null;
156
- progress: HttpRequestLoadingProgressState | null;
147
+ /** @see HttpRequestSubtle.attempts */
148
+ attempts: number;
149
+ retry: HttpRequestRetryState | null;
150
+ /** How much of the pending backoff is left, or `null` when none is pending. */
151
+ retryInMs: number | null;
152
+ progress: HttpRequestLoadingProgressState | null;
157
153
  };
158
154
  /**
159
155
  * One request a refresh re-executed, as an event row lists it. A cache key is shared by every query
@@ -161,37 +157,37 @@ type RequestProgress = {
161
157
  * can still find the refresh under "Refetched by". Empty for a request no registered query holds.
162
158
  */
163
159
  type RefreshedRequest = {
164
- queryIds: string[];
165
- method: string;
166
- path: string;
160
+ queryIds: string[];
161
+ method: string;
162
+ path: string;
167
163
  };
168
164
  type EventLogItem = {
169
- id: number;
170
- timestamp: number;
171
- client: string;
172
- type: 'entry-created' | 'request-success' | 'request-error' | 'entry-destroyed' | 'unbind-all-secure' | 'queries-refreshed';
173
- /** `null` for events that are not about a single request, e.g. the logout-wide secure unbind. */
174
- method: string | null;
175
- url: string | null;
176
- isSecure: boolean;
177
- status: number | 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;
180
- /** What asked for a refresh, for a `queries-refreshed` row. `null` for every other type. */
181
- cause: QueryRefreshCause | null;
182
- /** Why a cache entry was torn down, for an `entry-destroyed` row. `null` for every other type. */
183
- destroyCause: QueryRepositoryEntryDestroyedCause | null;
184
- /** The requests that refresh re-executed - the fan-out the panel could not show before. */
185
- refreshed: RefreshedRequest[] | null;
186
- /**
187
- * How long the request took and how big its response was, read off the request as the event fired.
188
- * Both `null` for an event that is not one request settling, and the size also for a failure - an
189
- * error body is not a payload worth a column.
190
- */
191
- durationMs: number | null;
192
- bytes: number | null;
193
- /** @see QueryDevtoolsStats.hasEstimatedBytes */
194
- isEstimatedBytes: boolean;
165
+ id: number;
166
+ timestamp: number;
167
+ client: string;
168
+ type: 'entry-created' | 'request-success' | 'request-error' | 'entry-destroyed' | 'unbind-all-secure' | 'queries-refreshed';
169
+ /** `null` for events that are not about a single request, e.g. the logout-wide secure unbind. */
170
+ method: string | null;
171
+ url: string | null;
172
+ isSecure: boolean;
173
+ status: number | null;
174
+ /** Weak, so the log never keeps a destroyed request alive. `null` for an event that is not one request. */
175
+ request: WeakRef<object> | null;
176
+ /** What asked for a refresh, for a `queries-refreshed` row. `null` for every other type. */
177
+ cause: QueryRefreshCause | null;
178
+ /** Why a cache entry was torn down, for an `entry-destroyed` row. `null` for every other type. */
179
+ destroyCause: QueryRepositoryEntryDestroyedCause | null;
180
+ /** The requests that refresh re-executed - the fan-out the panel could not show before. */
181
+ refreshed: RefreshedRequest[] | null;
182
+ /**
183
+ * How long the request took and how big its response was, read off the request as the event fired.
184
+ * Both `null` for an event that is not one request settling, and the size also for a failure - an
185
+ * error body is not a payload worth a column.
186
+ */
187
+ durationMs: number | null;
188
+ bytes: number | null;
189
+ /** @see QueryDevtoolsStats.hasEstimatedBytes */
190
+ isEstimatedBytes: boolean;
195
191
  };
196
192
  /**
197
193
  * A cache entry that is gone, as the Cache tab still lists it. Deliberately not a {@link CacheRow}: a
@@ -199,71 +195,70 @@ type EventLogItem = {
199
195
  * seven columns of dashes. What is left worth showing is what it was and why it went.
200
196
  */
201
197
  type DroppedCacheEntry = {
202
- client: string;
203
- method: string;
204
- url: string;
205
- cause: QueryRepositoryEntryDestroyedCause;
206
- at: number;
198
+ client: string;
199
+ method: string;
200
+ url: string;
201
+ cause: QueryRepositoryEntryDestroyedCause;
202
+ at: number;
207
203
  };
208
204
  /** One cache entry as the Cache tab lists it: the repository's own snapshot plus its measured size. */
209
205
  type CacheRow = {
210
- entry: QueryRepositoryCacheEntry;
211
- bytes: number;
212
- isEstimatedBytes: boolean;
206
+ entry: QueryRepositoryCacheEntry;
207
+ bytes: number;
208
+ isEstimatedBytes: boolean;
213
209
  };
214
210
  /** What each tab holds, as its badge reports it: how many entries, and how many of them are failing. */
215
211
  type TabBadge = {
216
- count: number;
217
- errors: number;
218
- errorNoun?: string;
212
+ count: number;
213
+ errors: number;
214
+ errorNoun?: string;
219
215
  };
220
-
221
216
  type DevtoolsDock = 'bottom' | 'top' | 'left' | 'right' | 'float';
222
217
  type DevtoolsLayout = DevtoolsDock | 'popout';
223
218
  type FloatRect = {
224
- x: number;
225
- y: number;
226
- width: number;
227
- height: number;
219
+ x: number;
220
+ y: number;
221
+ width: number;
222
+ height: number;
228
223
  };
229
224
  type PersistedState = {
230
- open?: boolean;
231
- height?: number;
232
- width?: number;
233
- listWidth?: number | null;
234
- drawerWidth?: number | null;
235
- listHeight?: number | null;
236
- drawerHeight?: number | null;
237
- dock?: DevtoolsDock;
238
- reservesSpace?: boolean;
239
- floatRect?: FloatRect;
240
- floatParked?: boolean;
241
- activeTab?: DevtoolsTab;
242
- detailTab?: DetailTab;
243
- selectedClientName?: string | null;
244
- selectedQueryId?: string | null;
245
- stackSelectedQueryId?: string | null;
246
- sequenceSelectedQueryId?: string | null;
247
- batchSelectedQueryId?: string | null;
248
- eventSelectedQueryId?: string | null;
249
- formSelectedQueryId?: string | null;
250
- timelineSelectedQueryId?: string | null;
251
- selectedFormId?: string | null;
252
- inspectFilterIds?: string[] | null;
253
- queryFilter?: string;
254
- queryFacets?: QueryListFacet[];
255
- queryRecentFirst?: boolean;
256
- queryTreeView?: boolean;
257
- collapsedQueryPaths?: string[];
258
- eventClient?: string | null;
259
- eventErrorsOnly?: boolean;
260
- socketFilter?: string;
261
- jsonSearch?: string;
262
- expandedSteps?: string[];
263
- expandedBatchItems?: string[];
264
- expandedQueryGroups?: string[];
265
- jsonExpanded?: string[];
266
- jsonCollapsed?: string[];
225
+ open?: boolean;
226
+ height?: number;
227
+ width?: number;
228
+ listWidth?: number | null;
229
+ drawerWidth?: number | null;
230
+ listHeight?: number | null;
231
+ drawerHeight?: number | null;
232
+ dock?: DevtoolsDock;
233
+ reservesSpace?: boolean;
234
+ floatRect?: FloatRect;
235
+ floatParked?: boolean;
236
+ activeTab?: DevtoolsTab;
237
+ detailTab?: DetailTab;
238
+ selectedClientName?: string | null;
239
+ selectedQueryId?: string | null;
240
+ stackSelectedQueryId?: string | null;
241
+ sequenceSelectedQueryId?: string | null;
242
+ batchSelectedQueryId?: string | null;
243
+ eventSelectedQueryId?: string | null;
244
+ formSelectedQueryId?: string | null;
245
+ timelineSelectedQueryId?: string | null;
246
+ selectedFormId?: string | null;
247
+ inspectFilterIds?: string[] | null;
248
+ queryFilter?: string;
249
+ queryFacets?: QueryListFacet[];
250
+ queryRecentFirst?: boolean;
251
+ queryTreeView?: boolean;
252
+ collapsedQueryPaths?: string[];
253
+ eventClient?: string | null;
254
+ eventErrorsOnly?: boolean;
255
+ socketFilter?: string;
256
+ jsonSearch?: string;
257
+ expandedSteps?: string[];
258
+ expandedBatchItems?: string[];
259
+ expandedQueryGroups?: string[];
260
+ jsonExpanded?: string[];
261
+ jsonCollapsed?: string[];
267
262
  };
268
263
  /**
269
264
  * A floating, dockable panel that inspects the live state of the signals-first `@ethlete/query`
@@ -273,737 +268,749 @@ type PersistedState = {
273
268
  * Requires `provideQueryDevtools()` in the application providers - without it the registry stays
274
269
  * empty and the panel shows nothing.
275
270
  */
276
- declare class QueryDevtoolsComponent implements OnInit {
277
- private hostEl;
278
- private renderer;
279
- private download;
280
- private styleManager;
281
- private zone;
282
- private destroyRef;
283
- private document;
284
- private viewport;
285
- private isDocumentVisible;
286
- /**
287
- * Opens the panel as soon as it is created, whatever the stored view state says. Set by
288
- * `<et-query-devtools-lazy>`, which downloads the panel on the click that was meant to open it.
289
- */
290
- startOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
291
- private panelEl;
292
- private eventIdCounter;
293
- private lastSelectionKey;
294
- private tabBeforeSettings;
295
- readonly persisted: PersistedState;
296
- protected readonly tabs: ({
297
- id: "queries";
298
- label: string;
299
- } | {
300
- id: "stacks";
301
- label: string;
302
- } | {
303
- id: "sequences";
304
- label: string;
305
- } | {
306
- id: "batches";
307
- label: string;
308
- } | {
309
- id: "forms";
310
- label: string;
311
- } | {
312
- id: "auth";
313
- label: string;
314
- } | {
315
- id: "ws";
316
- label: string;
317
- } | {
318
- id: "cache";
319
- label: string;
320
- } | {
321
- id: "locks";
322
- label: string;
323
- } | {
324
- id: "timeline";
325
- label: string;
326
- } | {
327
- id: "events";
328
- label: string;
329
- } | {
330
- id: "faults";
331
- label: string;
332
- } | {
333
- id: "mocks";
334
- label: string;
335
- } | {
336
- id: "about";
337
- label: string;
338
- })[];
339
- private readonly PINNED_TABS;
340
- protected readonly shortcut: "⌘⌥Q" | "Ctrl+Alt+Q";
341
- protected readonly LAYOUTS: readonly [{
342
- readonly id: "bottom";
343
- readonly glyph: "⬓";
344
- readonly label: "Bottom";
345
- readonly hint: "Dock to the bottom edge";
346
- }, {
347
- readonly id: "top";
348
- readonly glyph: "⬒";
349
- readonly label: "Top";
350
- readonly hint: "Dock to the top edge";
351
- }, {
352
- readonly id: "left";
353
- readonly glyph: "◧";
354
- readonly label: "Left";
355
- readonly hint: "Dock to the left edge";
356
- }, {
357
- readonly id: "right";
358
- readonly glyph: "◨";
359
- readonly label: "Right";
360
- readonly hint: "Dock to the right edge";
361
- }, {
362
- readonly id: "float";
363
- readonly glyph: "❐";
364
- readonly label: "Float";
365
- readonly hint: "A window inside the page - move it, resize it, shove it off an edge to park it";
366
- }, {
367
- readonly id: "popout";
368
- readonly glyph: "⧉";
369
- readonly label: "Pop out";
370
- readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
371
- }];
372
- protected open: _angular_core.WritableSignal<boolean>;
373
- private panelHeight;
374
- private panelWidth;
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>;
380
- private drag;
381
- private floatGesture;
382
- protected resizing: _angular_core.Signal<boolean>;
383
- protected dock: _angular_core.WritableSignal<DevtoolsDock>;
384
- protected currentLayout: _angular_core.Signal<{
385
- readonly id: "bottom";
386
- readonly glyph: "⬓";
387
- readonly label: "Bottom";
388
- readonly hint: "Dock to the bottom edge";
389
- } | {
390
- readonly id: "top";
391
- readonly glyph: "⬒";
392
- readonly label: "Top";
393
- readonly hint: "Dock to the top edge";
394
- } | {
395
- readonly id: "left";
396
- readonly glyph: "◧";
397
- readonly label: "Left";
398
- readonly hint: "Dock to the left edge";
399
- } | {
400
- readonly id: "right";
401
- readonly glyph: "◨";
402
- readonly label: "Right";
403
- readonly hint: "Dock to the right edge";
404
- } | {
405
- readonly id: "float";
406
- readonly glyph: "❐";
407
- readonly label: "Float";
408
- readonly hint: "A window inside the page - move it, resize it, shove it off an edge to park it";
409
- } | {
410
- readonly id: "popout";
411
- readonly glyph: "⧉";
412
- readonly label: "Pop out";
413
- readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
414
- }>;
415
- protected reservesSpace: _angular_core.WritableSignal<boolean>;
416
- private floatRect;
417
- private floatResizeBase;
418
- /**
419
- * Whether the float is shoved off an edge with only its peek showing. Persisted with the rect, since
420
- * restoring the rect without it would either strand the panel off screen or silently un-park it.
421
- */
422
- protected floatParked: _angular_core.WritableSignal<boolean>;
423
- protected popOutBlocked: _angular_core.WritableSignal<boolean>;
424
- /**
425
- * Whether the panel currently lives in a window of its own. Deliberately not persisted: a reload
426
- * cannot re-adopt a window the previous document opened, so it always starts docked.
427
- */
428
- protected poppedOut: _angular_core.WritableSignal<boolean>;
429
- protected floating: _angular_core.Signal<boolean>;
430
- private narrowViewport;
431
- private sideDocked;
432
- protected paneAxis: _angular_core.Signal<PaneAxis>;
433
- private popup;
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;
438
- private popOutStyleSync;
439
- protected panelBlockSize: _angular_core.Signal<number | null>;
440
- protected panelInlineSize: _angular_core.Signal<number | null>;
441
- protected panelInsetBlock: _angular_core.Signal<number | null>;
442
- protected panelInsetInline: _angular_core.Signal<number | null>;
443
- /**
444
- * The panel's rendered size, not its dragged one - the stylesheet clamps a dock (`min-block-size`,
445
- * `max-block-size: 90vh`) and it is the clamped size the page has to give up.
446
- */
447
- private panelSize;
448
- private pageReservation;
449
- /**
450
- * The viewport edge a docked panel covers, reserved for overlays whatever {@link reservesSpace} says:
451
- * page content can be scrolled out from under the panel, a dialog or a menu cannot. A dock edge is
452
- * logical, so which physical edge a side dock covers flips in RTL - read from the panel, since the
453
- * writing direction cannot change under a dock switch.
454
- */
455
- private overlayReservation;
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>;
460
- /**
461
- * The type annotations of each seeded mock body, by mock id. It lives here rather than on the Mocks
462
- * tab because a tab is destroyed the moment another one is selected, and a body seeded from an inline
463
- * schema has no `schemaName` to recover its labels from.
464
- */
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>;
484
- private expandedCacheKey;
485
- private socketEmitError;
486
- private expandedSteps;
487
- private expandedBatchItems;
488
- expandedQueryGroups: _angular_core.WritableSignal<ReadonlySet<string>>;
489
- jsonSearch: _angular_core.WritableSignal<string>;
490
- jsonSearchTerm: _angular_core.Signal<string>;
491
- jsonExpandedPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
492
- jsonCollapsedPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
493
- toggleJsonPath: (path: string, expand: boolean) => void;
494
- diffRunIndex: _angular_core.WritableSignal<number | null>;
495
- diffBaseRunIndex: _angular_core.WritableSignal<number | null>;
496
- errorRunIndex: _angular_core.WritableSignal<number | null>;
497
- retainedResponseCount: _angular_core.Signal<number>;
498
- editorMode: _angular_core.WritableSignal<"none" | "response" | "args">;
499
- responseDraft: _angular_core.WritableSignal<string>;
500
- argsDraft: _angular_core.WritableSignal<string>;
501
- /**
502
- * The text the currently open editor was seeded with. The textareas bind `value` to this and not to
503
- * the live draft: a `value` binding fed by the draft is written back on every keystroke, and writing
504
- * a textarea's `value` puts the caret at the end.
505
- */
506
- editorSeed: string;
507
- editError: _angular_core.WritableSignal<string | null>;
508
- private editedArgsSource;
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;
271
+ export declare class QueryDevtoolsComponent implements OnInit {
272
+ private hostEl;
273
+ private renderer;
274
+ private download;
275
+ private styleManager;
276
+ private zone;
277
+ private destroyRef;
278
+ private document;
279
+ private injector;
280
+ private viewport;
281
+ private isDocumentVisible;
282
+ /**
283
+ * Opens the panel as soon as it is created, whatever the stored view state says. Set by
284
+ * `<et-query-devtools-lazy>`, which downloads the panel on the click that was meant to open it.
285
+ */
286
+ startOpen: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
287
+ private panelEl;
288
+ private toggle;
289
+ private tabButtons;
290
+ private focusBeforeOpen;
291
+ private eventIdCounter;
292
+ private lastSelectionKey;
293
+ private tabBeforeSettings;
294
+ readonly persisted: PersistedState;
295
+ protected readonly tabs: ({
296
+ id: "queries";
297
+ label: string;
298
+ } | {
299
+ id: "stacks";
300
+ label: string;
301
+ } | {
302
+ id: "sequences";
303
+ label: string;
304
+ } | {
305
+ id: "batches";
306
+ label: string;
307
+ } | {
308
+ id: "forms";
309
+ label: string;
310
+ } | {
311
+ id: "auth";
312
+ label: string;
313
+ } | {
314
+ id: "ws";
315
+ label: string;
316
+ } | {
317
+ id: "cache";
318
+ label: string;
319
+ } | {
320
+ id: "locks";
321
+ label: string;
322
+ } | {
323
+ id: "timeline";
324
+ label: string;
325
+ } | {
326
+ id: "events";
327
+ label: string;
328
+ } | {
329
+ id: "faults";
330
+ label: string;
331
+ } | {
332
+ id: "mocks";
333
+ label: string;
334
+ } | {
335
+ id: "about";
336
+ label: string;
337
+ })[];
338
+ private readonly PINNED_TABS;
339
+ protected readonly shortcut: "⌘⌥Q" | "Ctrl+Alt+Q";
340
+ protected readonly LAYOUTS: readonly [{
341
+ readonly id: "bottom";
342
+ readonly glyph: "⬓";
343
+ readonly label: "Bottom";
344
+ readonly hint: "Dock to the bottom edge";
345
+ }, {
346
+ readonly id: "top";
347
+ readonly glyph: "⬒";
348
+ readonly label: "Top";
349
+ readonly hint: "Dock to the top edge";
350
+ }, {
351
+ readonly id: "left";
352
+ readonly glyph: "◧";
353
+ readonly label: "Left";
354
+ readonly hint: "Dock to the left edge";
355
+ }, {
356
+ readonly id: "right";
357
+ readonly glyph: "◨";
358
+ readonly label: "Right";
359
+ readonly hint: "Dock to the right edge";
360
+ }, {
361
+ readonly id: "float";
362
+ readonly glyph: "❐";
363
+ readonly label: "Float";
364
+ readonly hint: "A window inside the page - move it, resize it, shove it off an edge to park it";
365
+ }, {
366
+ readonly id: "popout";
367
+ readonly glyph: "⧉";
368
+ readonly label: "Pop out";
369
+ readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
370
+ }];
371
+ protected open: import("@angular/core").WritableSignal<boolean>;
372
+ private panelHeight;
373
+ private panelWidth;
374
+ protected activeTab: import("@angular/core").WritableSignal<DevtoolsTab>;
375
+ protected listWidth: import("@angular/core").WritableSignal<number | null>;
376
+ protected drawerWidth: import("@angular/core").WritableSignal<number | null>;
377
+ protected listHeight: import("@angular/core").WritableSignal<number | null>;
378
+ protected drawerHeight: import("@angular/core").WritableSignal<number | null>;
379
+ private drag;
380
+ private floatGesture;
381
+ protected resizing: import("@angular/core").Signal<boolean>;
382
+ protected dock: import("@angular/core").WritableSignal<DevtoolsDock>;
383
+ protected currentLayout: import("@angular/core").Signal<{
384
+ readonly id: "bottom";
385
+ readonly glyph: "⬓";
386
+ readonly label: "Bottom";
387
+ readonly hint: "Dock to the bottom edge";
388
+ } | {
389
+ readonly id: "top";
390
+ readonly glyph: "⬒";
391
+ readonly label: "Top";
392
+ readonly hint: "Dock to the top edge";
393
+ } | {
394
+ readonly id: "left";
395
+ readonly glyph: "◧";
396
+ readonly label: "Left";
397
+ readonly hint: "Dock to the left edge";
398
+ } | {
399
+ readonly id: "right";
400
+ readonly glyph: "◨";
401
+ readonly label: "Right";
402
+ readonly hint: "Dock to the right edge";
403
+ } | {
404
+ readonly id: "float";
405
+ readonly glyph: "❐";
406
+ readonly label: "Float";
407
+ readonly hint: "A window inside the page - move it, resize it, shove it off an edge to park it";
408
+ } | {
409
+ readonly id: "popout";
410
+ readonly glyph: "⧉";
411
+ readonly label: "Pop out";
412
+ readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
413
+ }>;
414
+ protected reservesSpace: import("@angular/core").WritableSignal<boolean>;
415
+ private floatRect;
416
+ private floatResizeBase;
417
+ /**
418
+ * Whether the float is shoved off an edge with only its peek showing. Persisted with the rect, since
419
+ * restoring the rect without it would either strand the panel off screen or silently un-park it.
420
+ */
421
+ protected floatParked: import("@angular/core").WritableSignal<boolean>;
422
+ protected popOutBlocked: import("@angular/core").WritableSignal<boolean>;
423
+ /**
424
+ * Whether the panel currently lives in a window of its own. Deliberately not persisted: a reload
425
+ * cannot re-adopt a window the previous document opened, so it always starts docked.
426
+ */
427
+ protected poppedOut: import("@angular/core").WritableSignal<boolean>;
428
+ protected floating: import("@angular/core").Signal<boolean>;
429
+ private narrowViewport;
430
+ private sideDocked;
431
+ protected paneAxis: import("@angular/core").Signal<PaneAxis>;
432
+ private popup;
433
+ /** Ends everything tied to one pop-out window: a pending `load`, its `pagehide`, shortcut and visibility. */
434
+ private popOutEnded$;
435
+ private popupVisible;
436
+ private isPanelVisible;
437
+ private popOutStyleSync;
438
+ protected panelBlockSize: import("@angular/core").Signal<number | null>;
439
+ protected panelInlineSize: import("@angular/core").Signal<number | null>;
440
+ protected panelInsetBlock: import("@angular/core").Signal<number | null>;
441
+ protected panelInsetInline: import("@angular/core").Signal<number | null>;
442
+ /**
443
+ * The panel's rendered size, not its dragged one - the stylesheet clamps a dock (`min-block-size`,
444
+ * `max-block-size: 90vh`) and it is the clamped size the page has to give up.
445
+ */
446
+ private panelSize;
447
+ private pageReservation;
448
+ /**
449
+ * The viewport edge a docked panel covers, reserved for overlays whatever {@link reservesSpace} says:
450
+ * page content can be scrolled out from under the panel, a dialog or a menu cannot. A dock edge is
451
+ * logical, so which physical edge a side dock covers flips in RTL - read from the panel, since the
452
+ * writing direction cannot change under a dock switch.
453
+ */
454
+ private overlayReservation;
455
+ detailTab: import("@angular/core").WritableSignal<DetailTab>;
456
+ selectedClientName: import("@angular/core").WritableSignal<string | null>;
457
+ selectedQueryId: import("@angular/core").WritableSignal<string | null>;
458
+ selectedFormId: import("@angular/core").WritableSignal<string | null>;
459
+ /**
460
+ * The type annotations of each seeded mock body, by mock id. It lives here rather than on the Mocks
461
+ * tab because a tab is destroyed the moment another one is selected, and a body seeded from an inline
462
+ * schema has no `schemaName` to recover its labels from.
463
+ */
464
+ seededTypes: import("@angular/core").WritableSignal<Record<string, ReadonlyMap<string, string>>>;
465
+ stackSelectedQueryId: import("@angular/core").WritableSignal<string | null>;
466
+ sequenceSelectedQueryId: import("@angular/core").WritableSignal<string | null>;
467
+ batchSelectedQueryId: import("@angular/core").WritableSignal<string | null>;
468
+ eventSelectedQueryId: import("@angular/core").WritableSignal<string | null>;
469
+ formSelectedQueryId: import("@angular/core").WritableSignal<string | null>;
470
+ timelineSelectedQueryId: import("@angular/core").WritableSignal<string | null>;
471
+ queryFilter: import("@angular/core").WritableSignal<string>;
472
+ queryFacets: import("@angular/core").WritableSignal<ReadonlySet<QueryListFacet>>;
473
+ queryRecentFirst: import("@angular/core").WritableSignal<boolean>;
474
+ queryTreeView: import("@angular/core").WritableSignal<boolean>;
475
+ collapsedQueryPaths: import("@angular/core").WritableSignal<ReadonlySet<string>>;
476
+ pinnedQueryIds: import("@angular/core").WritableSignal<ReadonlySet<string>>;
477
+ eventLog: import("@angular/core").WritableSignal<EventLogItem[]>;
478
+ private eventOwners;
479
+ droppedCacheEntries: import("@angular/core").WritableSignal<DroppedCacheEntry[]>;
480
+ eventClient: import("@angular/core").WritableSignal<string | null>;
481
+ eventErrorsOnly: import("@angular/core").WritableSignal<boolean>;
482
+ socketFilter: import("@angular/core").WritableSignal<string>;
483
+ private expandedCacheKey;
484
+ private socketEmitError;
485
+ private expandedSteps;
486
+ private expandedBatchItems;
487
+ expandedQueryGroups: import("@angular/core").WritableSignal<ReadonlySet<string>>;
488
+ jsonSearch: import("@angular/core").WritableSignal<string>;
489
+ jsonSearchTerm: import("@angular/core").Signal<string>;
490
+ jsonExpandedPaths: import("@angular/core").WritableSignal<ReadonlySet<string>>;
491
+ jsonCollapsedPaths: import("@angular/core").WritableSignal<ReadonlySet<string>>;
492
+ toggleJsonPath: (path: string, expand: boolean) => void;
493
+ diffRunIndex: import("@angular/core").WritableSignal<number | null>;
494
+ diffBaseRunIndex: import("@angular/core").WritableSignal<number | null>;
495
+ errorRunIndex: import("@angular/core").WritableSignal<number | null>;
496
+ retainedResponseCount: import("@angular/core").Signal<number>;
497
+ editorMode: import("@angular/core").WritableSignal<"none" | "response" | "args">;
498
+ responseDraft: import("@angular/core").WritableSignal<string>;
499
+ argsDraft: import("@angular/core").WritableSignal<string>;
500
+ /**
501
+ * The text the currently open editor was seeded with. The textareas bind `value` to this and not to
502
+ * the live draft: a `value` binding fed by the draft is written back on every keystroke, and writing
503
+ * a textarea's `value` puts the caret at the end.
504
+ */
505
+ editorSeed: string;
506
+ editError: import("@angular/core").WritableSignal<string | null>;
507
+ private editedArgsSource;
508
+ copiedReport: {
509
+ value: import("@angular/core").Signal<boolean>;
510
+ mark: (next: boolean) => void;
511
+ clear: () => void;
512
+ };
513
+ copiedInsomnia: {
514
+ value: import("@angular/core").Signal<boolean>;
515
+ mark: (next: boolean) => void;
516
+ clear: () => void;
517
+ };
518
+ copiedCurl: {
519
+ value: import("@angular/core").Signal<boolean>;
520
+ mark: (next: boolean) => void;
521
+ clear: () => void;
522
+ };
523
+ copiedGql: {
524
+ value: import("@angular/core").Signal<boolean>;
525
+ mark: (next: boolean) => void;
526
+ clear: () => void;
527
+ };
528
+ copiedRoute: {
529
+ value: import("@angular/core").Signal<boolean>;
530
+ mark: (next: boolean) => void;
531
+ clear: () => void;
532
+ };
533
+ /**
534
+ * 1-second tick driving the cache freshness countdowns. Gated the way the locks poll is: an ungated
535
+ * `interval` is a periodic macrotask zone.js counts forever, so a mounted panel would tick the host
536
+ * application once a second and keep `ApplicationRef.whenStable()` from ever resolving. Every reader
537
+ * sits inside `@if (open())`, so there is nothing to drive while the panel is shut or the tab hidden.
538
+ */
539
+ private clock;
540
+ private probeLocks;
541
+ private probeId;
542
+ private probeHold;
543
+ private lockSnapshot;
544
+ lockRows: import("@angular/core").Signal<DevtoolsLockRow[] | null>;
545
+ protected inspectActive: import("@angular/core").WritableSignal<boolean>;
546
+ protected locatedRect: import("@angular/core").WritableSignal<DOMRect | null>;
547
+ locateState: import("@angular/core").WritableSignal<"idle" | "located" | "offscreen">;
548
+ private locate$;
549
+ inspectFilterIds: import("@angular/core").WritableSignal<string[] | null>;
550
+ private queryEntries;
551
+ private argsSourceQueries;
552
+ /**
553
+ * The queries that still exist. Everything that measures what the application is doing right now -
554
+ * the tab bar's error flags, the tamper dot, the timeline -
555
+ * reads this rather than {@link queryEntries}, so a tombstone never inflates a live number.
556
+ */
557
+ private liveQueryEntries;
558
+ protected panelTampered: import("@angular/core").Signal<boolean>;
559
+ stackEntries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
560
+ sequenceEntries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
561
+ batchEntries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
562
+ formEntries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
563
+ authEntries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
564
+ wsEntries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
565
+ clientNames: import("@angular/core").Signal<string[]>;
566
+ /**
567
+ * Unique repositories (with their client name + base URL) used by the Cache and Events tabs. A
568
+ * tombstone keeps its `meta.repository`, so a destroyed client would otherwise keep its Cache card
569
+ * and its **Evict all** long after its injector died.
570
+ */
571
+ private repositories;
572
+ faultClients: import("@angular/core").Signal<{
573
+ name: string;
574
+ baseUrl: string;
575
+ fault: import("@ethlete/query").ɵQueryDevtoolsFault;
576
+ armed: boolean;
577
+ }[]>;
578
+ protected armedFaultClients: import("@angular/core").Signal<string[] | null>;
579
+ protected armedMockRoutes: import("@angular/core").Signal<string[] | null>;
580
+ scopedQueries: import("@angular/core").Signal<QueryDevtoolsEntry[]>;
581
+ private runTotals;
582
+ private cacheEntryCount;
583
+ protected tabBadges: import("@angular/core").Signal<Record<DevtoolsTab, TabBadge>>;
584
+ protected visibleTabs: import("@angular/core").Signal<({
585
+ id: "queries";
586
+ label: string;
587
+ } | {
588
+ id: "stacks";
589
+ label: string;
590
+ } | {
591
+ id: "sequences";
592
+ label: string;
593
+ } | {
594
+ id: "batches";
595
+ label: string;
596
+ } | {
597
+ id: "forms";
598
+ label: string;
599
+ } | {
600
+ id: "auth";
601
+ label: string;
602
+ } | {
603
+ id: "ws";
604
+ label: string;
605
+ } | {
606
+ id: "cache";
607
+ label: string;
608
+ } | {
609
+ id: "locks";
610
+ label: string;
611
+ } | {
612
+ id: "timeline";
613
+ label: string;
614
+ } | {
615
+ id: "events";
616
+ label: string;
617
+ } | {
618
+ id: "faults";
619
+ label: string;
620
+ } | {
621
+ id: "mocks";
622
+ label: string;
623
+ } | {
624
+ id: "about";
625
+ label: string;
626
+ })[]>;
627
+ protected overflowTabs: import("@angular/core").Signal<({
628
+ id: "queries";
629
+ label: string;
630
+ } | {
631
+ id: "stacks";
632
+ label: string;
633
+ } | {
634
+ id: "sequences";
635
+ label: string;
636
+ } | {
637
+ id: "batches";
638
+ label: string;
639
+ } | {
640
+ id: "forms";
641
+ label: string;
642
+ } | {
643
+ id: "auth";
644
+ label: string;
645
+ } | {
646
+ id: "ws";
647
+ label: string;
648
+ } | {
649
+ id: "cache";
650
+ label: string;
651
+ } | {
652
+ id: "locks";
653
+ label: string;
654
+ } | {
655
+ id: "timeline";
656
+ label: string;
657
+ } | {
658
+ id: "events";
659
+ label: string;
660
+ } | {
661
+ id: "faults";
662
+ label: string;
663
+ } | {
664
+ id: "mocks";
665
+ label: string;
666
+ } | {
667
+ id: "about";
668
+ label: string;
669
+ })[]>;
670
+ selectedQuery: import("@angular/core").Signal<{
671
+ entry: QueryDevtoolsEntry;
672
+ query: AnyQuery;
673
+ } | null>;
674
+ stackSelectedQuery: import("@angular/core").Signal<{
675
+ entry: QueryDevtoolsEntry;
676
+ query: AnyQuery;
677
+ } | null>;
678
+ sequenceSelectedQuery: import("@angular/core").Signal<{
679
+ entry: QueryDevtoolsEntry;
680
+ query: AnyQuery;
681
+ } | null>;
682
+ batchSelectedQuery: import("@angular/core").Signal<{
683
+ entry: QueryDevtoolsEntry;
684
+ query: AnyQuery;
685
+ } | null>;
686
+ eventSelectedQuery: import("@angular/core").Signal<{
687
+ entry: QueryDevtoolsEntry;
688
+ query: AnyQuery;
689
+ } | null>;
690
+ formSelectedQuery: import("@angular/core").Signal<{
691
+ entry: QueryDevtoolsEntry;
692
+ query: AnyQuery;
693
+ } | null>;
694
+ timelineSelectedQuery: import("@angular/core").Signal<{
695
+ entry: QueryDevtoolsEntry;
696
+ query: AnyQuery;
697
+ } | null>;
698
+ /**
699
+ * The cache per client, with every entry's size measured. Reading each response inside the computed is
700
+ * what keeps the totals current: a cache mutation bumps `cacheVersion`, but a response landing in an
701
+ * entry that is already there does not.
702
+ */
703
+ cacheView: import("@angular/core").Signal<{
704
+ name: string;
705
+ baseUrl: string;
706
+ repository: QueryRepository;
707
+ rows: CacheRow[];
708
+ bytes: number;
709
+ isEstimatedBytes: boolean;
710
+ unused: number;
711
+ pollStates: Record<string, QueryKeyLockState>;
712
+ client: QueryClient | null;
713
+ dropped: DroppedCacheEntry[];
714
+ }[]>;
715
+ private elementQueryMap;
716
+ protected readonly CLEAR_FAULTS: (clientName?: string) => void;
717
+ protected faultsRestored: import("@angular/core").Signal<boolean>;
718
+ protected mocksRestored: import("@angular/core").Signal<boolean>;
719
+ protected readonly DISARM_MOCKS: () => void;
720
+ protected restoredOverrides: import("@angular/core").Signal<{
721
+ queries: number;
722
+ ops: number;
723
+ firstId: string | null;
724
+ orphaned: string[];
725
+ fromLocalStorage: boolean;
726
+ } | null>;
727
+ protected readonly DROP_RESTORED_OVERRIDES: () => void;
728
+ protected readonly hiddenInAutomation: boolean;
729
+ protected readonly FLOAT_RESIZE_EDGES: ResizeEdge[];
730
+ constructor();
731
+ ngOnInit(): void;
732
+ overridesPersist(): boolean;
733
+ toggleOverridesPersist(): void;
734
+ overridesScopeLabel(): string;
735
+ /**
736
+ * Puts layout, filters, selections, pins and stored overrides back the way they ship; the settings stay.
737
+ * Resets the live state too, or the persistence effects write it straight back.
738
+ */
739
+ resetDevtools(): void;
740
+ protected toggleSettings(): void;
741
+ protected reviewRestoredOverrides(id: string): void;
742
+ /**
743
+ * Closing while popped out docks back instead: the panel a pop-out shows is the very element the
744
+ * `@if` below would destroy, so it has to come home before it can be closed.
745
+ */
746
+ protected toggleOpen(): void;
747
+ protected floatPanel(): void;
748
+ protected selectLayout(layout: DevtoolsLayout): void;
749
+ /**
750
+ * Moves the panel element into a pop-up window. The host document's `<style>` tags and root theming
751
+ * tokens must be copied over with it, or the pop-out renders unstyled.
752
+ */
753
+ popOut(): void;
754
+ selectClient(name: string | null): void;
755
+ clearInspectFilter(): void;
756
+ toggleFacet(facet: QueryListFacet): void;
757
+ clearQueryFilters(): void;
758
+ isQueryPinned(entry: QueryDevtoolsEntry): boolean;
759
+ toggleQueryPath(key: string): void;
760
+ toggleQueryPin(entry: QueryDevtoolsEntry): void;
761
+ protected toggleInspect(): void;
762
+ protected startResize(event: PointerEvent): void;
763
+ protected moveFloat(move: DragMoveEvent): void;
764
+ protected endFloatMove(): void;
765
+ protected restoreFloat(): void;
766
+ protected startFloatResize(): void;
767
+ protected resizeFloat(move: ResizeMoveEvent): void;
768
+ protected endFloatResize(): void;
769
+ startPaneResize(event: PointerEvent, target: {
770
+ pane: PaneTarget;
771
+ container: HTMLElement;
772
+ }): void;
773
+ resetPaneSize(pane: PaneTarget): void;
774
+ protected inspectLabel(entries: QueryDevtoolsEntry[]): string;
775
+ routeSegments(entry: QueryDevtoolsEntry | undefined, query: AnyQuery): RouteSegment[];
776
+ requestUrl(query: AnyQuery): string | null;
777
+ /**
778
+ * The args of a query. A query executed imperatively (`execute({ args })`, a sequence step, an auth
779
+ * query) never writes them to its own `args` signal - only the `withArgs` feature does - so the args
780
+ * its current request was built from stand in.
781
+ */
782
+ queryArgs(query: AnyQuery): Omit<any, "response" | "rawResponse"> | null;
783
+ /**
784
+ * The headers the last run sent, or what the args and client resolve to now for a query that has not
785
+ * run; `null` while a header provider throws. Client headers and the secure `Authorization` never
786
+ * reach the args, so the args alone cannot answer this.
787
+ */
788
+ requestHeaders(query: AnyQuery): {
789
+ [k: string]: string;
790
+ } | null;
791
+ queryStatus(query: AnyQuery): QueryStatus;
792
+ isParked(query: AnyQuery): boolean;
793
+ isStale(query: AnyQuery): boolean;
794
+ isTampered(entry: QueryDevtoolsEntry): boolean;
795
+ isMocked(entry: QueryDevtoolsEntry): boolean;
796
+ requestProgress(query: AnyQuery): RequestProgress | null;
797
+ retryCause(status: number): string;
798
+ formatPercent(percentage: number): string;
799
+ formatCountdown(ms: number | null): string;
800
+ queryActivity(entry: QueryDevtoolsEntry): QueryActivity;
801
+ linkActivity(link: QueryLink): QueryActivity;
802
+ stackActivity(stack: AnyQueryStack | AnyPagedQueryStack): QueryActivity;
803
+ sequenceActivity(sequence: QuerySequence<unknown[]>): QueryActivity;
804
+ resetStats(entry: QueryDevtoolsEntry): void;
805
+ queryRuns(entry: QueryDevtoolsEntry): QueryDevtoolsRun[];
806
+ runStatus(run: QueryDevtoolsRun): "loading" | "success" | "error" | "aborted";
807
+ canDiffRun(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): boolean;
808
+ toggleRunDiff(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): void;
809
+ diffRunRole(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): 'base' | 'compare' | null;
810
+ responseDiff(entry: QueryDevtoolsEntry): {
811
+ before: QueryDevtoolsRun;
812
+ after: QueryDevtoolsRun;
813
+ diff: QueryDevtoolsDiff;
814
+ } | null;
815
+ canStepRunDiff(entry: QueryDevtoolsEntry, older: boolean): boolean;
816
+ stepRunDiff(entry: QueryDevtoolsEntry, older: boolean): void;
817
+ toggleRunError(run: QueryDevtoolsRun): void;
818
+ /**
819
+ * The error body of the picked run. Read off the run rather than off `query.error()`, which is the
820
+ * only other place a failure is legible and is blanked by anything that resets the query - a logout
821
+ * resets every secure query, so a 401 is gone from there by the time it is looked for.
822
+ */
823
+ pickedRunError(entry: QueryDevtoolsEntry): {
824
+ run: QueryDevtoolsRun;
825
+ error: import("@ethlete/query").ɵQueryDevtoolsRunError;
826
+ } | null;
827
+ selectQuery(id: string): void;
828
+ inlineValue(value: unknown): string;
829
+ formatBytes(bytes: number): string;
830
+ formatTransferred(bytes: number, isEstimated: boolean): string;
831
+ formatSpeed(bytesPerSecond: number): string;
832
+ formatDuration(ms: number | null): string;
833
+ /**
834
+ * Replays a query with the args the panel is already showing. `execute()` would otherwise default to
835
+ * `state.args()`, which only `withArgs` ever writes - so a query executed imperatively, by a sequence
836
+ * step or as an auth query would replay with no args at all and a function route would throw.
837
+ */
838
+ executeQuery(selection: QueryDevtoolsSelection, allowCache: boolean): void;
839
+ resetQuery(query: AnyQuery): void;
840
+ copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
841
+ copyInsomniaRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
842
+ copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
843
+ copyGqlDocument(doc: string): void;
844
+ copyableRoute(entry: QueryDevtoolsEntry, query: AnyQuery): string;
845
+ copyableRouteTitle(entry: QueryDevtoolsEntry, query: AnyQuery): string;
846
+ copyRoute(entry: QueryDevtoolsEntry, query: AnyQuery): void;
847
+ downloadInsomniaCollection(items: {
848
+ entry: QueryDevtoolsEntry;
849
+ query: AnyQuery;
850
+ }[], clientLabel: string | null): void;
851
+ protected downloadSession(): void;
852
+ openResponseEditor(query: AnyQuery): void;
853
+ openArgsEditor({ entry, query }: QueryDevtoolsSelection): void;
854
+ applyResponse(query: AnyQuery): void;
855
+ applyArgs(query: AnyQuery): void;
856
+ cancelEditor(): void;
857
+ forceLoading(query: AnyQuery): void;
858
+ forceError(query: AnyQuery): void;
859
+ forceEmpty(query: AnyQuery): void;
860
+ clearForced(query: AnyQuery): void;
861
+ refetchCacheEntry(entry: QueryRepositoryCacheEntry): void;
862
+ evictCacheEntry(repository: QueryRepository, key: string): void;
863
+ evictAllCacheEntries(repository: QueryRepository): void;
864
+ toggleCacheValue(clientName: string, key: string): void;
865
+ isCacheValueExpanded(clientName: string, key: string): boolean;
866
+ cacheFreshness(entry: QueryRepositoryCacheEntry): string;
867
+ cacheSync(entry: QueryRepositoryCacheEntry, pollStates: Record<string, QueryKeyLockState>): string;
868
+ cachePersistence(entry: QueryRepositoryCacheEntry): string;
869
+ persistedCount(client: QueryClient): number;
870
+ clearPersistedQueries(client: QueryClient): void;
871
+ requestPath(url: string): string;
872
+ asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
873
+ asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
874
+ asSequence(entry: QueryDevtoolsEntry): QuerySequence<unknown[]>;
875
+ asBatch(entry: QueryDevtoolsEntry): AnyQueryBatch;
876
+ asAuth(entry: QueryDevtoolsEntry): AnyBearerAuthProvider;
877
+ asWs(entry: QueryDevtoolsEntry): WebSocketDevtoolsHandle;
878
+ socketMessages(ws: WebSocketDevtoolsHandle): WebSocketDevtoolsMessage[];
879
+ socketDirectionLabel(message: WebSocketDevtoolsMessage): "↑ sent" | "↓ received";
880
+ emitSocketMessage(options: {
881
+ entry: QueryDevtoolsEntry;
882
+ event: string;
883
+ data: string;
884
+ }): void;
885
+ socketEmitErrorFor(entryId: string): string | null;
886
+ asForm(entry: QueryDevtoolsEntry): QueryDevtoolsFormHandle;
887
+ queriesDrivenByForm(entry: QueryDevtoolsEntry): QueryLink[];
888
+ formsDrivingQuery(entry: QueryDevtoolsEntry): QueryDevtoolsEntry[];
889
+ selectForm(id: string): void;
890
+ refreshesFor(entryId: string): {
891
+ id: number;
892
+ timestamp: number;
893
+ label: string;
894
+ }[];
895
+ causeLabel(cause: QueryRefreshCause): string;
896
+ sequenceStepStatus(sequence: QuerySequence<unknown[]>, index: number): QuerySequenceStatus;
897
+ authTokenPayload(auth: AnyBearerAuthProvider): Record<string, unknown> | null;
898
+ queriesForStack(stack: AnyQueryStack | AnyPagedQueryStack): QueryLink[];
899
+ authQueryKeys(auth: AnyBearerAuthProvider): string[];
900
+ lockStanding(row: DevtoolsLockRow): QueryDevtoolsChip;
901
+ authLeadership(auth: AnyBearerAuthProvider): QueryDevtoolsChip | null;
902
+ authTokenLifetime(entry: QueryDevtoolsEntry): QueryDevtoolsTokenLifetime;
903
+ queriesForSequence(sequence: QuerySequence<unknown[]>): QueryLink[];
904
+ stepSnapshot(sequence: QuerySequence<unknown[]>, index: number): AnyQuerySnapshot | null;
905
+ toggleQueryGroup(key: string): void;
906
+ expandQueryGroup(key: string): void;
907
+ isStepExpanded(entryId: string, index: number): boolean;
908
+ toggleStep(entryId: string, index: number): void;
909
+ batchRouteSegments(entry: QueryDevtoolsEntry): RouteSegment[];
910
+ batchOf(entry: QueryDevtoolsEntry): QueryDevtoolsEntry | null;
911
+ queriesForBatch(entry: QueryDevtoolsEntry): QueryLink[];
912
+ batchItemQueryId(entry: QueryDevtoolsEntry, index: number): string | null;
913
+ batchItems(entry: QueryDevtoolsEntry): BatchItemView;
914
+ batchThroughput(batch: AnyQueryBatch): string | null;
915
+ isBatchItemExpanded(entryId: string, index: number): boolean;
916
+ toggleBatchItem(entryId: string, index: number): void;
917
+ gqlDocument(doc: string): string;
918
+ featureLabel(type: string): string;
919
+ featureSummary(feature: QueryDevtoolsFeature): string;
920
+ clientFeatures(client: QueryClient | null | undefined): QueryDevtoolsFeature[] | null;
921
+ formatTime(timestamp: number | null): string;
922
+ locatableElement(entry: QueryDevtoolsEntry): HTMLElement | null;
923
+ locateQuery(entry: QueryDevtoolsEntry): void;
924
+ downloadTextFile(file: {
925
+ name: string;
926
+ content: string;
927
+ type: string;
928
+ }): void;
929
+ eventQueryId(event: EventLogItem): string | null;
930
+ private openPanel;
931
+ private closePanel;
932
+ private resolvedHeaders;
933
+ private argsRouteSegments;
934
+ private renderRoute;
935
+ /**
936
+ * Takes - or gives back - the lock whose name only this tab can have produced. Its `clientId` in the
937
+ * snapshot is what tells this tab's rows from another tab's: `LockInfo` carries no tab identity, and
938
+ * the platform offers no way to ask for one's own client id.
939
+ */
940
+ private holdProbeLock;
941
+ private steppedDiffPair;
942
+ private diffEnds;
943
+ private isTabPrimary;
944
+ private mountPopOut;
945
+ /**
946
+ * The chrome tokens as the app resolves them now: the pop-out has no ancestor carrying the host theme.
947
+ * Empty on a browser that does not enumerate custom properties.
948
+ */
949
+ private chromeTokens;
950
+ private inlineStyleOf;
951
+ private isStyleNode;
952
+ /**
953
+ * Copies the host document's stylesheets into the pop-up and keeps mirroring them while it is
954
+ * open. Styles keep arriving after the move: Angular inserts a component's CSS and the style
955
+ * manager mounts overlay strategy CSS the first time each is used - e.g. the first menu opened
956
+ * over there - so a one-time copy would leave everything first used after the pop-out unstyled.
957
+ */
958
+ private syncStylesInto;
959
+ private dockBack;
960
+ private queryLinkFor;
961
+ private activityOf;
962
+ private activitySummary;
963
+ private queryRoute;
964
+ private exportedRequest;
965
+ private insomniaTokenRefreshes;
966
+ private insomniaTokenRefresh;
967
+ private accessTokenPath;
968
+ private accessTokenMaxAge;
969
+ private insomniaHeaders;
970
+ private sessionClients;
971
+ private sessionAuthQueryKeys;
972
+ private sessionEntries;
973
+ private sessionQuery;
974
+ private sessionActivity;
975
+ private sessionSequence;
976
+ private sessionBatch;
977
+ private sessionForm;
978
+ /**
979
+ * An auth provider without its tokens. A session report is a file that gets attached to a ticket, and
980
+ * the access token is the one thing in the panel that must never travel with it - which is why only
981
+ * its presence and its remaining lifetime are exported.
982
+ */
983
+ private sessionAuth;
984
+ private sessionSocket;
985
+ private sessionEvents;
986
+ private sessionFaults;
987
+ private sessionMocks;
988
+ private downloadFile;
989
+ private stepKey;
990
+ private paneSize;
991
+ private applyResize;
992
+ private applyPaneResize;
993
+ private closePopup;
994
+ private updateInspectHover;
995
+ private selectInspectedQuery;
996
+ private selectionKey;
997
+ private writeToClipboard;
998
+ private responseStatus;
999
+ private findQuery;
1000
+ private pushEvent;
1001
+ private measureResponse;
1002
+ private refreshedRequestOf;
1003
+ private pushEventItem;
1004
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryDevtoolsComponent, never>;
1005
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryDevtoolsComponent, "et-query-devtools", never, {
1006
+ "startOpen": {
1007
+ "alias": "startOpen";
1008
+ "required": false;
1009
+ "isSignal": true;
533
1010
  };
534
- /**
535
- * 1-second tick driving the cache freshness countdowns. Gated the way the locks poll is: an ungated
536
- * `interval` is a periodic macrotask zone.js counts forever, so a mounted panel would tick the host
537
- * application once a second and keep `ApplicationRef.whenStable()` from ever resolving. Every reader
538
- * sits inside `@if (open())`, so there is nothing to drive while the panel is shut or the tab hidden.
539
- */
540
- private clock;
541
- private probeLocks;
542
- private probeId;
543
- private probeHold;
544
- private lockSnapshot;
545
- lockRows: _angular_core.Signal<DevtoolsLockRow[] | null>;
546
- protected inspectActive: _angular_core.WritableSignal<boolean>;
547
- protected locatedRect: _angular_core.WritableSignal<DOMRect | null>;
548
- locateState: _angular_core.WritableSignal<"idle" | "located" | "offscreen">;
549
- private locate$;
550
- inspectFilterIds: _angular_core.WritableSignal<string[] | null>;
551
- private queryEntries;
552
- /**
553
- * The queries that still exist. Everything that measures what the application is doing right now -
554
- * the tab bar's error flags, the tamper dot, the timeline -
555
- * reads this rather than {@link queryEntries}, so a tombstone never inflates a live number.
556
- */
557
- private liveQueryEntries;
558
- protected panelTampered: _angular_core.Signal<boolean>;
559
- stackEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
560
- sequenceEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
561
- batchEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
562
- formEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
563
- authEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
564
- wsEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
565
- clientNames: _angular_core.Signal<string[]>;
566
- /**
567
- * Unique repositories (with their client name + base URL) used by the Cache and Events tabs. A
568
- * tombstone keeps its `meta.repository`, so a destroyed client would otherwise keep its Cache card
569
- * and its **Evict all** long after its injector died.
570
- */
571
- private repositories;
572
- faultClients: _angular_core.Signal<{
573
- name: string;
574
- baseUrl: string;
575
- fault: _ethlete_query.ɵQueryDevtoolsFault;
576
- armed: boolean;
577
- }[]>;
578
- protected armedFaultClients: _angular_core.Signal<string[] | null>;
579
- protected armedMockRoutes: _angular_core.Signal<string[] | null>;
580
- scopedQueries: _angular_core.Signal<QueryDevtoolsEntry[]>;
581
- private runTotals;
582
- private cacheEntryCount;
583
- protected tabBadges: _angular_core.Signal<Record<DevtoolsTab, TabBadge>>;
584
- protected visibleTabs: _angular_core.Signal<({
585
- id: "queries";
586
- label: string;
587
- } | {
588
- id: "stacks";
589
- label: string;
590
- } | {
591
- id: "sequences";
592
- label: string;
593
- } | {
594
- id: "batches";
595
- label: string;
596
- } | {
597
- id: "forms";
598
- label: string;
599
- } | {
600
- id: "auth";
601
- label: string;
602
- } | {
603
- id: "ws";
604
- label: string;
605
- } | {
606
- id: "cache";
607
- label: string;
608
- } | {
609
- id: "locks";
610
- label: string;
611
- } | {
612
- id: "timeline";
613
- label: string;
614
- } | {
615
- id: "events";
616
- label: string;
617
- } | {
618
- id: "faults";
619
- label: string;
620
- } | {
621
- id: "mocks";
622
- label: string;
623
- } | {
624
- id: "about";
625
- label: string;
626
- })[]>;
627
- protected overflowTabs: _angular_core.Signal<({
628
- id: "queries";
629
- label: string;
630
- } | {
631
- id: "stacks";
632
- label: string;
633
- } | {
634
- id: "sequences";
635
- label: string;
636
- } | {
637
- id: "batches";
638
- label: string;
639
- } | {
640
- id: "forms";
641
- label: string;
642
- } | {
643
- id: "auth";
644
- label: string;
645
- } | {
646
- id: "ws";
647
- label: string;
648
- } | {
649
- id: "cache";
650
- label: string;
651
- } | {
652
- id: "locks";
653
- label: string;
654
- } | {
655
- id: "timeline";
656
- label: string;
657
- } | {
658
- id: "events";
659
- label: string;
660
- } | {
661
- id: "faults";
662
- label: string;
663
- } | {
664
- id: "mocks";
665
- label: string;
666
- } | {
667
- id: "about";
668
- label: string;
669
- })[]>;
670
- selectedQuery: _angular_core.Signal<{
671
- entry: QueryDevtoolsEntry;
672
- query: AnyQuery;
673
- } | null>;
674
- stackSelectedQuery: _angular_core.Signal<{
675
- entry: QueryDevtoolsEntry;
676
- query: AnyQuery;
677
- } | null>;
678
- sequenceSelectedQuery: _angular_core.Signal<{
679
- entry: QueryDevtoolsEntry;
680
- query: AnyQuery;
681
- } | null>;
682
- batchSelectedQuery: _angular_core.Signal<{
683
- entry: QueryDevtoolsEntry;
684
- query: AnyQuery;
685
- } | null>;
686
- eventSelectedQuery: _angular_core.Signal<{
687
- entry: QueryDevtoolsEntry;
688
- query: AnyQuery;
689
- } | null>;
690
- formSelectedQuery: _angular_core.Signal<{
691
- entry: QueryDevtoolsEntry;
692
- query: AnyQuery;
693
- } | null>;
694
- timelineSelectedQuery: _angular_core.Signal<{
695
- entry: QueryDevtoolsEntry;
696
- query: AnyQuery;
697
- } | null>;
698
- /**
699
- * The cache per client, with every entry's size measured. Reading each response inside the computed is
700
- * what keeps the totals current: a cache mutation bumps `cacheVersion`, but a response landing in an
701
- * entry that is already there does not.
702
- */
703
- cacheView: _angular_core.Signal<{
704
- name: string;
705
- baseUrl: string;
706
- repository: QueryRepository;
707
- rows: CacheRow[];
708
- bytes: number;
709
- isEstimatedBytes: boolean;
710
- unused: number;
711
- pollStates: Record<string, QueryKeyLockState>;
712
- client: QueryClient | null;
713
- dropped: DroppedCacheEntry[];
714
- }[]>;
715
- private elementQueryMap;
716
- protected readonly CLEAR_FAULTS: (clientName?: string) => void;
717
- protected faultsRestored: _angular_core.Signal<boolean>;
718
- protected mocksRestored: _angular_core.Signal<boolean>;
719
- protected readonly DISARM_MOCKS: () => void;
720
- protected restoredOverrides: _angular_core.Signal<{
721
- queries: number;
722
- ops: number;
723
- firstId: string | null;
724
- orphaned: string[];
725
- fromLocalStorage: boolean;
726
- } | null>;
727
- protected readonly DROP_RESTORED_OVERRIDES: () => void;
728
- protected readonly FLOAT_RESIZE_EDGES: ResizeEdge[];
729
- constructor();
730
- ngOnInit(): void;
731
- overridesPersist(): boolean;
732
- toggleOverridesPersist(): void;
733
- overridesScopeLabel(): string;
734
- /**
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.
737
- */
738
- resetDevtools(): void;
739
- protected toggleSettings(): void;
740
- protected reviewRestoredOverrides(id: string): void;
741
- /**
742
- * Closing while popped out docks back instead: the panel a pop-out shows is the very element the
743
- * `@if` below would destroy, so it has to come home before it can be closed.
744
- */
745
- protected toggleOpen(): void;
746
- protected floatPanel(): void;
747
- protected selectLayout(layout: DevtoolsLayout): void;
748
- /**
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.
751
- */
752
- popOut(): void;
753
- selectClient(name: string | null): void;
754
- clearInspectFilter(): void;
755
- toggleFacet(facet: QueryListFacet): void;
756
- clearQueryFilters(): void;
757
- isQueryPinned(entry: QueryDevtoolsEntry): boolean;
758
- toggleQueryPath(key: string): void;
759
- toggleQueryPin(entry: QueryDevtoolsEntry): void;
760
- protected toggleInspect(): void;
761
- protected startResize(event: PointerEvent): void;
762
- protected moveFloat(move: DragMoveEvent): void;
763
- protected endFloatMove(): void;
764
- protected restoreFloat(): void;
765
- protected startFloatResize(): void;
766
- protected resizeFloat(move: ResizeMoveEvent): void;
767
- protected endFloatResize(): void;
768
- startPaneResize(event: PointerEvent, target: {
769
- pane: PaneTarget;
770
- container: HTMLElement;
771
- }): void;
772
- resetPaneSize(pane: PaneTarget): void;
773
- protected inspectLabel(entries: QueryDevtoolsEntry[]): string;
774
- routeSegments(entry: QueryDevtoolsEntry | undefined, query: AnyQuery): RouteSegment[];
775
- requestUrl(query: AnyQuery): string | null;
776
- /**
777
- * The args of a query. A query executed imperatively (`execute({ args })`, a sequence step, an auth
778
- * query) never writes them to its own `args` signal - only the `withArgs` feature does - so the args
779
- * its current request was built from stand in.
780
- */
781
- queryArgs(query: AnyQuery): Omit<any, "response" | "rawResponse"> | null;
782
- /**
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.
786
- */
787
- requestHeaders(query: AnyQuery): {
788
- [k: string]: string;
789
- } | null;
790
- queryStatus(query: AnyQuery): QueryStatus;
791
- isStale(query: AnyQuery): boolean;
792
- isTampered(entry: QueryDevtoolsEntry): boolean;
793
- isMocked(entry: QueryDevtoolsEntry): boolean;
794
- requestProgress(query: AnyQuery): RequestProgress | null;
795
- retryCause(status: number): string;
796
- formatPercent(percentage: number): string;
797
- formatCountdown(ms: number | null): string;
798
- queryActivity(entry: QueryDevtoolsEntry): QueryActivity;
799
- linkActivity(link: QueryLink): QueryActivity;
800
- stackActivity(stack: AnyQueryStack | AnyPagedQueryStack): QueryActivity;
801
- sequenceActivity(sequence: QuerySequence<unknown[]>): QueryActivity;
802
- resetStats(entry: QueryDevtoolsEntry): void;
803
- queryRuns(entry: QueryDevtoolsEntry): QueryDevtoolsRun[];
804
- runStatus(run: QueryDevtoolsRun): "loading" | "success" | "error" | "aborted";
805
- canDiffRun(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): boolean;
806
- toggleRunDiff(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): void;
807
- diffRunRole(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): 'base' | 'compare' | null;
808
- responseDiff(entry: QueryDevtoolsEntry): {
809
- before: QueryDevtoolsRun;
810
- after: QueryDevtoolsRun;
811
- diff: QueryDevtoolsDiff;
812
- } | null;
813
- canStepRunDiff(entry: QueryDevtoolsEntry, older: boolean): boolean;
814
- stepRunDiff(entry: QueryDevtoolsEntry, older: boolean): void;
815
- toggleRunError(run: QueryDevtoolsRun): void;
816
- /**
817
- * The error body of the picked run. Read off the run rather than off `query.error()`, which is the
818
- * only other place a failure is legible and is blanked by anything that resets the query - a logout
819
- * resets every secure query, so a 401 is gone from there by the time it is looked for.
820
- */
821
- pickedRunError(entry: QueryDevtoolsEntry): {
822
- run: QueryDevtoolsRun;
823
- error: _ethlete_query.ɵQueryDevtoolsRunError;
824
- } | null;
825
- selectQuery(id: string): void;
826
- inlineValue(value: unknown): string;
827
- formatBytes(bytes: number): string;
828
- formatTransferred(bytes: number, isEstimated: boolean): string;
829
- formatSpeed(bytesPerSecond: number): string;
830
- formatDuration(ms: number | null): string;
831
- /**
832
- * Replays a query with the args the panel is already showing. `execute()` would otherwise default to
833
- * `state.args()`, which only `withArgs` ever writes - so a query executed imperatively, by a sequence
834
- * step or as an auth query would replay with no args at all and a function route would throw.
835
- */
836
- executeQuery(selection: QueryDevtoolsSelection, allowCache: boolean): void;
837
- resetQuery(query: AnyQuery): void;
838
- copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
839
- copyInsomniaRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
840
- copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
841
- copyGqlDocument(doc: string): void;
842
- copyableRoute(entry: QueryDevtoolsEntry, query: AnyQuery): string;
843
- copyableRouteTitle(entry: QueryDevtoolsEntry, query: AnyQuery): string;
844
- copyRoute(entry: QueryDevtoolsEntry, query: AnyQuery): void;
845
- downloadInsomniaCollection(items: {
846
- entry: QueryDevtoolsEntry;
847
- query: AnyQuery;
848
- }[], clientLabel: string | null): void;
849
- protected downloadSession(): void;
850
- openResponseEditor(query: AnyQuery): void;
851
- openArgsEditor({ entry, query }: QueryDevtoolsSelection): void;
852
- applyResponse(query: AnyQuery): void;
853
- applyArgs(query: AnyQuery): void;
854
- cancelEditor(): void;
855
- forceLoading(query: AnyQuery): void;
856
- forceError(query: AnyQuery): void;
857
- forceEmpty(query: AnyQuery): void;
858
- clearForced(query: AnyQuery): void;
859
- refetchCacheEntry(entry: QueryRepositoryCacheEntry): void;
860
- evictCacheEntry(repository: QueryRepository, key: string): void;
861
- evictAllCacheEntries(repository: QueryRepository): void;
862
- toggleCacheValue(clientName: string, key: string): void;
863
- isCacheValueExpanded(clientName: string, key: string): boolean;
864
- cacheFreshness(entry: QueryRepositoryCacheEntry): string;
865
- cacheSync(entry: QueryRepositoryCacheEntry, pollStates: Record<string, QueryKeyLockState>): string;
866
- cachePersistence(entry: QueryRepositoryCacheEntry): string;
867
- persistedCount(client: QueryClient): number;
868
- clearPersistedQueries(client: QueryClient): void;
869
- requestPath(url: string): string;
870
- asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
871
- asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
872
- asSequence(entry: QueryDevtoolsEntry): QuerySequence<unknown[]>;
873
- asBatch(entry: QueryDevtoolsEntry): AnyQueryBatch;
874
- asAuth(entry: QueryDevtoolsEntry): AnyBearerAuthProvider;
875
- asWs(entry: QueryDevtoolsEntry): WebSocketDevtoolsHandle;
876
- socketMessages(ws: WebSocketDevtoolsHandle): WebSocketDevtoolsMessage[];
877
- socketDirectionLabel(message: WebSocketDevtoolsMessage): "↑ sent" | "↓ received";
878
- emitSocketMessage(options: {
879
- entry: QueryDevtoolsEntry;
880
- event: string;
881
- data: string;
882
- }): void;
883
- socketEmitErrorFor(entryId: string): string | null;
884
- asForm(entry: QueryDevtoolsEntry): QueryDevtoolsFormHandle;
885
- queriesDrivenByForm(entry: QueryDevtoolsEntry): QueryLink[];
886
- formsDrivingQuery(entry: QueryDevtoolsEntry): QueryDevtoolsEntry[];
887
- selectForm(id: string): void;
888
- refreshesFor(entryId: string): {
889
- id: number;
890
- timestamp: number;
891
- label: string;
892
- }[];
893
- causeLabel(cause: QueryRefreshCause): string;
894
- sequenceStepStatus(sequence: QuerySequence<unknown[]>, index: number): QuerySequenceStatus;
895
- authTokenPayload(auth: AnyBearerAuthProvider): Record<string, unknown> | null;
896
- queriesForStack(stack: AnyQueryStack | AnyPagedQueryStack): QueryLink[];
897
- authQueryKeys(auth: AnyBearerAuthProvider): string[];
898
- lockStanding(row: DevtoolsLockRow): QueryDevtoolsChip;
899
- authLeadership(auth: AnyBearerAuthProvider): QueryDevtoolsChip | null;
900
- authTokenLifetime(entry: QueryDevtoolsEntry): QueryDevtoolsTokenLifetime;
901
- queriesForSequence(sequence: QuerySequence<unknown[]>): QueryLink[];
902
- stepSnapshot(sequence: QuerySequence<unknown[]>, index: number): AnyQuerySnapshot | null;
903
- toggleQueryGroup(key: string): void;
904
- expandQueryGroup(key: string): void;
905
- isStepExpanded(entryId: string, index: number): boolean;
906
- toggleStep(entryId: string, index: number): void;
907
- batchRouteSegments(entry: QueryDevtoolsEntry): RouteSegment[];
908
- batchOf(entry: QueryDevtoolsEntry): QueryDevtoolsEntry | null;
909
- queriesForBatch(entry: QueryDevtoolsEntry): QueryLink[];
910
- batchItemQueryId(entry: QueryDevtoolsEntry, index: number): string | null;
911
- batchItems(entry: QueryDevtoolsEntry): BatchItemView;
912
- batchThroughput(batch: AnyQueryBatch): string | null;
913
- isBatchItemExpanded(entryId: string, index: number): boolean;
914
- toggleBatchItem(entryId: string, index: number): void;
915
- gqlDocument(doc: string): string;
916
- featureLabel(type: string): string;
917
- featureSummary(feature: QueryDevtoolsFeature): string;
918
- clientFeatures(client: QueryClient | null | undefined): QueryDevtoolsFeature[] | null;
919
- formatTime(timestamp: number | null): string;
920
- locatableElement(entry: QueryDevtoolsEntry): HTMLElement | null;
921
- locateQuery(entry: QueryDevtoolsEntry): void;
922
- downloadTextFile(file: {
923
- name: string;
924
- content: string;
925
- type: string;
926
- }): void;
927
- eventQueryId(event: EventLogItem): string | null;
928
- private resolvedHeaders;
929
- private argsRouteSegments;
930
- private renderRoute;
931
- /**
932
- * Takes - or gives back - the lock whose name only this tab can have produced. Its `clientId` in the
933
- * snapshot is what tells this tab's rows from another tab's: `LockInfo` carries no tab identity, and
934
- * the platform offers no way to ask for one's own client id.
935
- */
936
- private holdProbeLock;
937
- private steppedDiffPair;
938
- private diffEnds;
939
- private isTabPrimary;
940
- private mountPopOut;
941
- /**
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.
944
- */
945
- private chromeTokens;
946
- private inlineStyleOf;
947
- private isStyleNode;
948
- /**
949
- * Copies the host document's stylesheets into the pop-up and keeps mirroring them while it is
950
- * open. Styles keep arriving after the move: Angular inserts a component's CSS and the style
951
- * manager mounts overlay strategy CSS the first time each is used - e.g. the first menu opened
952
- * over there - so a one-time copy would leave everything first used after the pop-out unstyled.
953
- */
954
- private syncStylesInto;
955
- private dockBack;
956
- private queryLinkFor;
957
- private activityOf;
958
- private activitySummary;
959
- private queryRoute;
960
- private exportedRequest;
961
- private insomniaTokenRefreshes;
962
- private insomniaTokenRefresh;
963
- private accessTokenPath;
964
- private accessTokenMaxAge;
965
- private insomniaHeaders;
966
- private sessionClients;
967
- private sessionAuthQueryKeys;
968
- private sessionEntries;
969
- private sessionQuery;
970
- private sessionActivity;
971
- private sessionSequence;
972
- private sessionBatch;
973
- private sessionForm;
974
- /**
975
- * An auth provider without its tokens. A session report is a file that gets attached to a ticket, and
976
- * the access token is the one thing in the panel that must never travel with it - which is why only
977
- * its presence and its remaining lifetime are exported.
978
- */
979
- private sessionAuth;
980
- private sessionSocket;
981
- private sessionEvents;
982
- private sessionFaults;
983
- private sessionMocks;
984
- private downloadFile;
985
- private stepKey;
986
- private paneSize;
987
- private applyResize;
988
- private applyPaneResize;
989
- private closePopup;
990
- private updateInspectHover;
991
- private selectInspectedQuery;
992
- private selectionKey;
993
- private writeToClipboard;
994
- private responseStatus;
995
- private findQuery;
996
- private pushEvent;
997
- private measureResponse;
998
- private refreshedRequestOf;
999
- private pushEventItem;
1000
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsComponent, never>;
1001
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsComponent, "et-query-devtools", never, { "startOpen": { "alias": "startOpen"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1011
+ }, {}, never, never, true, never>;
1002
1012
  }
1003
-
1004
- declare const QUERY_DEVTOOLS_IMPORTS: readonly [typeof QueryDevtoolsComponent];
1005
-
1013
+ export declare const QUERY_DEVTOOLS_IMPORTS: readonly [typeof QueryDevtoolsComponent];
1006
1014
  /** The version of `@ethlete/query-devtools` this build was cut from. */
1007
- declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.15";
1008
-
1009
- export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsComponent };
1015
+ export declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.17";
1016
+ export {};