@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.
@@ -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 { JsonPath, QueryDevtoolsOverridesRecorder, QueryRefreshCause, QueryRepositoryEntryDestroyedCause, Query, QueryRepositoryCacheEntry, HttpRequestRetryState, HttpRequestLoadingProgressState, QueryDevtoolsStats, QueryDevtoolsStatsHandle, QueryDevtoolsEntry, AnyQueryBatchItemResult, QueryRepository, QueryClient, QueryKeyLockState, QueryDevtoolsFeature, QueryDevtoolsFault, AnyQueryStack, AnyPagedQueryStack, QuerySequence, AnyQueryBatch, AnyBearerAuthProvider, WebSocketDevtoolsHandle, QueryDevtoolsFormHandle, QuerySequenceStatus, AnyQuerySnapshot, QueryDevtoolsRun, QueryDevtoolsRunError, WebSocketDevtoolsMessage, QueryDevtoolsStorageScope, QueryDevtoolsApiEnvSwitch } 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
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
- * The registered query the request belonged to when the event fired, so the row can open it. Resolved
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
- * The dragged sizes of the two-pane tabs, in px, one pair per axis - a side dock stacks the panes, so
1037
- * the same divider sizes them along the block axis there and a dock switch has to keep both. `null`
1038
- * keeps the stylesheet's proportional default, which is also what a double-click on a divider restores.
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
- /** Which edge the panel is docked to, or `float` for a window of its own inside the page. */
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
- /** Stops mirroring the host document's stylesheets into the pop-up. @see syncStylesInto */
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
- /** Which section of the query detail is showing. Shared by the Queries tab and both drawers. */
1137
- detailTab: WritableSignal<DetailTab>;
1138
- selectedClientName: WritableSignal<string | null>;
1139
- selectedQueryId: WritableSignal<string | null>;
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
- /** Free-text narrowing of the Queries list. Every whitespace-separated term has to match. */
1155
- queryFilter: WritableSignal<string>;
1156
- /** The status facets the Queries list is narrowed to. Empty means no status narrowing. */
1157
- queryFacets: WritableSignal<ReadonlySet<QueryListFacet>>;
1158
- /**
1159
- * Which way the Queries list sorts by last-executed time. Only the direction is switchable - the field
1160
- * is not, because "which one just ran" is the question the column exists to answer.
1161
- */
1162
- queryRecentFirst: WritableSignal<boolean>;
1163
- /**
1164
- * Whether the Queries list is arranged as a tree of route paths. Off by default: the flat list is
1165
- * still the right shape for "what ran just now", which is what the tab is opened for most of the time.
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
- /** Keys of the Queries-list groups the user opened - the tab is rebuilt on every switch back. */
1200
- expandedQueryGroups: WritableSignal<ReadonlySet<string>>;
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
- /** Path-keyed value-explorer expansion overrides (persisted so open trees survive a reload). */
1205
- jsonExpandedPaths: WritableSignal<ReadonlySet<string>>;
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
- /** The run whose response the diff is comparing, by run index, or `null` while no diff is open. */
1210
- diffRunIndex: WritableSignal<number | null>;
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
- /** JIT editor state (response / args editing on the selected query). */
1220
- editorMode: WritableSignal<"none" | "response" | "args">;
1221
- responseDraft: WritableSignal<string>;
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
- /** Transient "Copied!" feedback for the copy-report, copy-as-Insomnia / cURL and copy-document actions. */
1233
- copiedReport: WritableSignal<boolean>;
1234
- copiedInsomnia: WritableSignal<boolean>;
1235
- copiedCurl: WritableSignal<boolean>;
1236
- copiedGql: WritableSignal<boolean>;
1237
- copiedRoute: WritableSignal<boolean>;
1238
- private copiedReset$;
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
- /** "Inspect" mode: hover the live UI to find the query that a component created. */
1256
- protected inspectActive: WritableSignal<boolean>;
1257
- /** @internal */
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
- /** When set (via inspect), the Queries list is filtered to exactly these entry ids. */
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, the identity match behind an event row -
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.QueryDevtoolsFault;
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 the panel back the way it ships: layout, filters, selections, pins and the stored overrides.
1496
- * The settings themselves stay - a panel behaving oddly is a reason to reset its state, not to lose the
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 window of its own - the same element, adopted by the pop-up's document, so
1519
- * every signal binding in it keeps updating from the app it is inspecting.
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 a query's request carries, as a plain `name: value` record, or `null` for a query that
1567
- * has none the panel can read. The set the last run sent, so it stays readable after the token it
1568
- * used was replaced; for a query that has not run, what its current args and its client resolve to
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.QueryDevtoolsRunError;
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 panel's chrome tokens as the app currently resolves them, so a pop-out keeps the surface it was
1898
- * docked in. Its own CSS resolves them from the host app's theme, and that theme is set on an ancestor
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.13";
1007
+ declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.15";
2020
1008
 
2021
- export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsAboutComponent, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsJsonStylesComponent, QueryDevtoolsSettingsComponent, QueryDevtoolsTimelineStylesComponent, clampFloatToPeek, kindOf, resizedFloatRect, settledFloatRect };
2022
- export type { JsonKind };
1009
+ export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsComponent };