@ethlete/query-devtools 1.0.0-next.14 → 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,177 +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
- private hostEl;
21
- protected readonly groups: AboutGroup[];
22
- protected copied: {
23
- value: _angular_core.Signal<boolean>;
24
- mark: (next: boolean) => void;
25
- clear: () => void;
26
- };
27
- protected copy(): void;
28
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsAboutComponent, never>;
29
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsAboutComponent, "et-query-devtools-about", never, {}, {}, never, never, true, never>;
30
- }
31
-
32
- /** Which of a node's four pasteable forms a copy action asks for. */
33
- type QueryDevtoolsCopyPayload = 'value' | 'key' | 'path' | 'entry';
34
-
35
- /** A JSON value's kind as the value explorer (and its per-node override menu) categorizes it. */
36
- type JsonKind = 'string' | 'number' | 'boolean' | 'null' | 'undefined' | 'array' | 'object';
37
- type JsonEntry = {
38
- k: string;
39
- v: unknown;
40
- };
41
- /** A folded slice of a container's entries, rendered as its own collapsible row. */
42
- type JsonChunk = {
43
- start: number;
44
- end: number;
45
- label: string;
46
- };
47
- declare const kindOf: (value: unknown) => JsonKind;
48
- /**
49
- * A recursive, collapsible, searchable JSON tree used by the query devtools value explorer. Renders
50
- * the *transformed* value the app actually sees (post `transformResponse`). Self-recurses via its
51
- * own selector - both for child entries and for the folded slices of an oversized container, which
52
- * re-enter as the same component with a `chunk` window over the same value.
53
- */
54
- declare class QueryDevtoolsJsonComponent {
55
- private hostEl;
56
- value: _angular_core.InputSignal<unknown>;
57
- nodeKey: _angular_core.InputSignal<string | null>;
58
- depth: _angular_core.InputSignalWithTransform<number, unknown>;
59
- /** Lowercased search term; when set, the containers holding a match auto-expand and matches are highlighted. */
60
- search: _angular_core.InputSignal<string>;
61
- /**
62
- * When set, this node is not the value itself but a folded window over its entries. It shares the
63
- * container's `path` so a child's persisted expansion does not depend on where the slice borders land.
64
- */
65
- chunk: _angular_core.InputSignal<JsonChunk | null>;
66
- /** Full path of this node from the explorer root, used as the key for persisted expansion. */
67
- path: _angular_core.InputSignal<string>;
68
- /** Persisted paths explicitly expanded (overrides the depth default). */
69
- expandedPaths: _angular_core.InputSignal<ReadonlySet<string> | null>;
70
- /** Persisted paths explicitly collapsed (overrides the depth default). */
71
- collapsedPaths: _angular_core.InputSignal<ReadonlySet<string> | null>;
72
- /** When provided, expansion is externally persisted via this callback instead of local state. */
73
- toggleFn: _angular_core.InputSignal<((path: string, expand: boolean) => void) | null>;
74
- /** Same node as {@link path}, but as the array-of-steps an override op targets rather than a display key. */
75
- jsonPath: _angular_core.InputSignal<JsonPath>;
76
- /** The kind of the container holding this node, so its override menu can offer "duplicate this item". */
77
- parentKind: _angular_core.InputSignal<JsonKind | null>;
78
- /** When provided, every node renders an override menu that arms/clears ops through it. */
79
- overrides: _angular_core.InputSignal<QueryDevtoolsOverridesRecorder | null>;
80
- /**
81
- * The declared type of each field, keyed by its path with array indices as `*` (`items.*.id`) - as
82
- * {@link QueryDevtoolsSchemaSeed} produces it. A node with an entry labels itself with it.
83
- */
84
- annotations: _angular_core.InputSignal<ReadonlyMap<string, string> | null>;
85
- /** The containers above this node, so a search does not unfold a value that holds itself again. */
86
- ancestors: _angular_core.InputSignal<readonly unknown[]>;
87
- protected kind: _angular_core.Signal<JsonKind>;
88
- private exotic;
89
- /** One annotation covers every element of an array, so the lookup path forgets which index this is. */
90
- private shapePath;
91
- protected annotation: _angular_core.Signal<string | null>;
92
- protected annotationTitle: _angular_core.Signal<string>;
93
- /**
94
- * A `Date` is object-typed but has nothing to expand into, so it renders as a leaf. A resolved
95
- * header provider is the other way round: a function that does expand.
96
- */
97
- protected isContainer: _angular_core.Signal<boolean>;
98
- /** The entries this node covers: the container's own, or just the window a chunk stands for. */
99
- ownEntries: _angular_core.Signal<JsonEntry[]>;
100
- protected childChunks: _angular_core.Signal<JsonChunk[]>;
101
- /** Entries rendered as rows - empty while they are folded into slices instead. */
102
- protected visibleEntries: _angular_core.Signal<JsonEntry[]>;
103
- /** Slices carry their window in the key so siblings persist independently of the container. */
104
- private togglePath;
105
- private defaultExpanded;
106
- private localExpanded;
107
- private expanded;
108
- protected childAncestors: _angular_core.Signal<unknown[]>;
109
- private hasHit;
110
- protected effectiveExpanded: _angular_core.Signal<boolean>;
111
- /** What the last copy put on the clipboard, or `null` once the tick has expired. */
112
- protected copied: {
113
- value: _angular_core.Signal<QueryDevtoolsCopyPayload | null>;
114
- mark: (next: QueryDevtoolsCopyPayload | null) => void;
115
- clear: () => void;
116
- };
117
- /**
118
- * Whether this node has an address of its own to copy. An explorer root has no key, and a folded
119
- * slice stands for a range of entries rather than one path - neither can name itself.
120
- */
121
- protected addressable: _angular_core.Signal<boolean>;
122
- private valueLabel;
123
- /**
124
- * Doubles as the button's `title` and its `aria-label`, and names what landed while the tick is up -
125
- * a bare `✓` stopped being unambiguous once the menu put four payloads behind one control.
126
- */
127
- protected copyLabel: _angular_core.Signal<string>;
128
- protected preview: _angular_core.Signal<string>;
129
- protected display: _angular_core.Signal<string>;
130
- protected keyHit: _angular_core.Signal<boolean>;
131
- protected valueHit: _angular_core.Signal<boolean>;
132
- constructor();
133
- protected childPath(key: string): string;
134
- protected childJsonPath(key: string): JsonPath;
135
- protected toggle(): void;
136
- /**
137
- * Writes one of the node's four pasteable forms. All of them go through here so the tick stays a
138
- * single readout of what actually landed.
139
- */
140
- protected copy(payload: QueryDevtoolsCopyPayload): void;
141
- /**
142
- * Containers copy their whole subtree as JSON, slices only the entries they cover; leaves copy
143
- * something pasteable - a raw string without the display quotes, so an id or url can go straight
144
- * into a search box. `null` for a subtree that cannot be serialized at all.
145
- */
146
- private copyTextFor;
147
- /** An exotic container copies the entries the tree shows, not the private fields `JSON.stringify` finds. */
148
- private copyableValue;
149
- private chunkValue;
150
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsJsonComponent, never>;
151
- 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; }; "ancestors": { "alias": "ancestors"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
152
- }
153
-
154
- /**
155
- * The value explorer's tree chrome, as a styles-only component the tree mounts itself - a session that
156
- * never opens a JSON view does not inject it.
157
- *
158
- * @internal
159
- */
160
- declare class QueryDevtoolsJsonStylesComponent {
161
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsJsonStylesComponent, never>;
162
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsJsonStylesComponent, "et-query-devtools-json-styles", never, {}, {}, never, never, true, never>;
163
- }
164
-
165
- /**
166
- * A copy confirmation that falls back to `idle` once {@link QUERY_DEVTOOLS_COPIED_RESET_MS} pass; each
167
- * `mark` restarts the countdown. Create it in an injection context.
168
- */
169
- declare const createQueryDevtoolsCopiedTick: <T>(idle: T) => {
170
- value: _angular_core.Signal<T>;
171
- mark: (next: T) => void;
172
- clear: () => void;
173
- };
174
- type QueryDevtoolsCopiedTick<T> = ReturnType<typeof createQueryDevtoolsCopiedTick<T>>;
6
+ import { QueryDevtoolsStats, QueryDevtoolsStatsHandle, QueryDevtoolsEntry, QueryDevtoolsRun, QueryDevtoolsFormHandle, QueryDevtoolsFeature } from '@ethlete/query/devtools-contract';
175
7
 
176
8
  /** Whether a path exists only in the newer value, only in the older one, or in both with a new value. */
177
9
  type QueryDevtoolsDiffKind = 'added' | 'removed' | 'changed';
@@ -379,27 +211,6 @@ type CacheRow = {
379
211
  bytes: number;
380
212
  isEstimatedBytes: boolean;
381
213
  };
382
- /** A repository the panel found, together with the client name/base URL it was registered under. */
383
- type RepositoryInfo = {
384
- repository: QueryRepository;
385
- name: string;
386
- baseUrl: string;
387
- client: QueryClient | null;
388
- };
389
- /** One client's cache, as the Cache tab lists it - every entry measured, with the client's poll states. */
390
- type CacheView = {
391
- name: string;
392
- baseUrl: string;
393
- repository: QueryRepository;
394
- rows: CacheRow[];
395
- bytes: number;
396
- isEstimatedBytes: boolean;
397
- unused: number;
398
- pollStates: Record<string, QueryKeyLockState>;
399
- client: QueryClient | null;
400
- /** The entries this client has lost since the panel was loaded, newest first. */
401
- dropped: DroppedCacheEntry[];
402
- };
403
214
  /** What each tab holds, as its badge reports it: how many entries, and how many of them are failing. */
404
215
  type TabBadge = {
405
216
  count: number;
@@ -407,452 +218,6 @@ type TabBadge = {
407
218
  errorNoun?: string;
408
219
  };
409
220
 
410
- /**
411
- * Everything a tab or the shared detail drawer reads from - or writes back into - the always-mounted
412
- * `<et-query-devtools>` panel: cross-tab registries, the JIT editor, copy/export actions, the value
413
- * explorer and pane sizing. A tab component only ever exists while it is the active one, so anything a
414
- * tab needs to survive being switched away from (a drawer's own selection, the persisted panel chrome)
415
- * has to live here instead of on the tab itself. Every member below is named and shaped exactly like the
416
- * panel's own field/method it stands in for.
417
- *
418
- * @see injectQueryDevtoolsHost
419
- */
420
- type QueryDevtoolsHost = {
421
- selectTab(tab: DevtoolsTab): void;
422
- /** Jumps to the Queries tab with this query selected - the Events tab is a way in, not a dead end. */
423
- selectQuery(id: string): void;
424
- /** Jumps to the Forms tab with this form selected. */
425
- selectForm(id: string): void;
426
- queryEntries: Signal<QueryDevtoolsEntry[]>;
427
- stackEntries: Signal<QueryDevtoolsEntry[]>;
428
- sequenceEntries: Signal<QueryDevtoolsEntry[]>;
429
- batchEntries: Signal<QueryDevtoolsEntry[]>;
430
- formEntries: Signal<QueryDevtoolsEntry[]>;
431
- authEntries: Signal<QueryDevtoolsEntry[]>;
432
- wsEntries: Signal<QueryDevtoolsEntry[]>;
433
- repositories: Signal<RepositoryInfo[]>;
434
- /**
435
- * The cache per client, with every entry's size measured. Reading each response inside the computed is
436
- * what keeps the totals current: a cache mutation bumps `cacheVersion`, but a response landing in an
437
- * entry that is already there does not.
438
- */
439
- cacheView: Signal<CacheView[]>;
440
- refetchCacheEntry(entry: QueryRepositoryCacheEntry): void;
441
- evictCacheEntry(repository: QueryRepository, key: string): void;
442
- /** Drops every entry of one client, consumers included - the cold-start check that does not need a reload. */
443
- evictAllCacheEntries(repository: QueryRepository): void;
444
- toggleCacheValue(clientName: string, key: string): void;
445
- isCacheValueExpanded(clientName: string, key: string): boolean;
446
- cacheFreshness(entry: QueryRepositoryCacheEntry): string;
447
- cacheSync(entry: QueryRepositoryCacheEntry, pollStates: Record<string, unknown>): string;
448
- cachePersistence(entry: QueryRepositoryCacheEntry): string;
449
- /** How many responses this client has on disk, which is usually more than it has in memory. */
450
- persistedCount(client: QueryClient): number;
451
- clearPersistedQueries(client: QueryClient): void;
452
- /** The features of the client behind a cache tab card, or `null` for a client without any. */
453
- clientFeatures(client: QueryClient | null | undefined): QueryDevtoolsFeature[] | null;
454
- /**
455
- * Every Web Lock held or queued across this origin, decoded, or `null` in a browser without the Web
456
- * Locks API. Empty while the Locks tab has not read its first snapshot - it polls, because Web Locks
457
- * has no change event to listen to.
458
- */
459
- lockRows: Signal<DevtoolsLockRow[] | null>;
460
- /** Where this tab stands on one lock, as a chip: whether it holds it, waits for it, or is not in it. */
461
- lockStanding(row: DevtoolsLockRow): QueryDevtoolsChip;
462
- /** Unique client names present across queries and auth providers, for the Queries/Timeline pickers. */
463
- clientNames: Signal<string[]>;
464
- /** What each tab holds - also drives the tab bar's own badges, so it lives here rather than per-tab. */
465
- tabBadges: Signal<Record<DevtoolsTab, TabBadge>>;
466
- /**
467
- * Every client the Faults tab can arm, with the fault it currently carries. Also feeds the
468
- * cross-tab "Faults armed" banner and the session export, so it lives here rather than on the tab.
469
- */
470
- faultClients: Signal<{
471
- name: string;
472
- baseUrl: string;
473
- fault: QueryDevtoolsFault;
474
- armed: boolean;
475
- }[]>;
476
- /**
477
- * The queries in scope before the Queries tab's own search box and status chips narrow them further:
478
- * either the picked client's, or exactly the inspected element's. Also what the Timeline tab scopes
479
- * its runs to, which is why this lives here rather than on the Queries tab alone.
480
- */
481
- scopedQueries: Signal<QueryDevtoolsEntry[]>;
482
- /** 1-second tick driving every countdown/freshness readout across tabs. */
483
- clock: Signal<number>;
484
- findQuery(id: string | null): QueryDevtoolsSelection | null;
485
- eventQueryId(event: EventLogItem): string | null;
486
- queryLinkFor(entry: QueryDevtoolsEntry | undefined, query?: AnyQuery): QueryLink;
487
- asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
488
- asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
489
- asSequence(entry: QueryDevtoolsEntry): QuerySequence<unknown[]>;
490
- asBatch(entry: QueryDevtoolsEntry): AnyQueryBatch;
491
- asAuth(entry: QueryDevtoolsEntry): AnyBearerAuthProvider;
492
- asWs(entry: QueryDevtoolsEntry): WebSocketDevtoolsHandle;
493
- asForm(entry: QueryDevtoolsEntry): QueryDevtoolsFormHandle;
494
- authTokenPayload(auth: AnyBearerAuthProvider): Record<string, unknown> | null;
495
- authQueryKeys(auth: AnyBearerAuthProvider): string[];
496
- /** The access-token expiry the app acts on, plus the lifetime the panel has armed over it. */
497
- authTokenLifetime(entry: QueryDevtoolsEntry): QueryDevtoolsTokenLifetime;
498
- /** The multi-tab leadership chip, or `null` for a provider without `withBearerAuthMultiTabSync`. */
499
- authLeadership(auth: AnyBearerAuthProvider): QueryDevtoolsChip | null;
500
- queryStatus(query: AnyQuery): 'idle' | 'loading' | 'success' | 'error';
501
- isStale(query: AnyQuery): boolean;
502
- /** Whether an entry is showing an armed response override or a devtools-faulted outcome. */
503
- isTampered(entry: QueryDevtoolsEntry): boolean;
504
- /** Whether armed response overrides are stored and replayed on the next load. */
505
- overridesPersist(): boolean;
506
- toggleOverridesPersist(): void;
507
- /** Where they are kept, named for a title or a hint (`sessionStorage`, `localStorage`, `not kept`). */
508
- overridesScopeLabel(): string;
509
- /** Puts the panel's layout, filters, pins and stored overrides back to defaults, keeping the settings. */
510
- resetDevtools(): void;
511
- requestProgress(query: AnyQuery): RequestProgress | null;
512
- retryCause(status: number): string;
513
- requestUrl(query: AnyQuery): string | null;
514
- requestPath(url: string): string;
515
- queryArgs(query: AnyQuery): unknown;
516
- /**
517
- * The headers the query's last run sent, or - before it has run - the ones its args and its client
518
- * resolve to now. `null` when there are none, or while a header provider cannot resolve yet.
519
- */
520
- requestHeaders(query: AnyQuery): Record<string, string> | null;
521
- routeSegments(entry: QueryDevtoolsEntry | undefined, query: AnyQuery): RouteSegment[];
522
- queryActivity(entry: QueryDevtoolsEntry): QueryActivity;
523
- linkActivity(link: QueryLink): QueryActivity;
524
- stackActivity(stack: AnyQueryStack | AnyPagedQueryStack): QueryActivity;
525
- sequenceActivity(sequence: QuerySequence<unknown[]>): QueryActivity;
526
- queriesForStack(stack: AnyQueryStack | AnyPagedQueryStack): QueryLink[];
527
- queriesForSequence(sequence: QuerySequence<unknown[]>): QueryLink[];
528
- /**
529
- * The queries a form feeds, discovered from the reads its `value()` recorded while their args were
530
- * built - so a form that nothing consumes yet reads as exactly that.
531
- */
532
- queriesDrivenByForm(entry: QueryDevtoolsEntry): QueryLink[];
533
- sequenceStepStatus(sequence: QuerySequence<unknown[]>, index: number): QuerySequenceStatus;
534
- stepSnapshot(sequence: QuerySequence<unknown[]>, index: number): AnyQuerySnapshot | null;
535
- /** Whether a sequence step's in/out detail (`<entryId>:<stepIndex>`) is expanded - persisted. */
536
- isStepExpanded(entryId: string, index: number): boolean;
537
- toggleStep(entryId: string, index: number): void;
538
- /** A batch's route with its path params left as `:name` - a batch fills them in per item, not once. */
539
- batchRouteSegments(entry: QueryDevtoolsEntry): RouteSegment[];
540
- /**
541
- * The batch entry that created a query, or `null` for a query no batch did. What lets the Queries list
542
- * fold a bulk run's items under one row instead of listing whatever it has in flight.
543
- */
544
- batchOf(entry: QueryDevtoolsEntry): QueryDevtoolsEntry | null;
545
- /**
546
- * The item queries a batch has in flight. Only those: a batch destroys each item's query the moment
547
- * that item settles, so a settled item is read from {@link batchItems} instead.
548
- */
549
- queriesForBatch(entry: QueryDevtoolsEntry): QueryLink[];
550
- /** A batch's settled items, failures first and capped - see {@link BatchItemView}. */
551
- batchItems(entry: QueryDevtoolsEntry): BatchItemView;
552
- /**
553
- * The registry entry of one of a batch's items, or `null` once it has fallen out of the batch's capped
554
- * tombstone tail - which is what makes an item row openable only while its query is still kept.
555
- */
556
- batchItemQueryId(entry: QueryDevtoolsEntry, index: number): string | null;
557
- /** An item's throughput line (`12.4 items/s · ~8s left`), or `null` before there is a rate to show. */
558
- batchThroughput(batch: AnyQueryBatch): string | null;
559
- /** Whether a batch item's args/response detail (`<entryId>:<itemIndex>`) is expanded - persisted. */
560
- isBatchItemExpanded(entryId: string, index: number): boolean;
561
- toggleBatchItem(entryId: string, index: number): void;
562
- /** Keys of the Queries-list groups of identical rows the user opened - persisted. */
563
- expandedQueryGroups: Signal<ReadonlySet<string>>;
564
- toggleQueryGroup(key: string): void;
565
- expandQueryGroup(key: string): void;
566
- /** Which way the Queries list sorts by last-executed time - persisted. */
567
- queryRecentFirst: WritableSignal<boolean>;
568
- /** Whether the Queries list is arranged as a tree of route paths instead of a flat list - persisted. */
569
- queryTreeView: WritableSignal<boolean>;
570
- /** The path folders the user closed. Collapsed, not expanded - a tree opens open. */
571
- collapsedQueryPaths: Signal<ReadonlySet<string>>;
572
- toggleQueryPath(key: string): void;
573
- /** The element a query was created in, or `null` for one created outside a component/directive. */
574
- locatableElement(entry: QueryDevtoolsEntry): HTMLElement | null;
575
- locateQuery(entry: QueryDevtoolsEntry): void;
576
- locateState: Signal<'idle' | 'located' | 'offscreen'>;
577
- resetStats(entry: QueryDevtoolsEntry): void;
578
- executeQuery(selection: QueryDevtoolsSelection, allowCache: boolean): void;
579
- resetQuery(query: AnyQuery): void;
580
- formatDuration(ms: number | null): string;
581
- formatBytes(bytes: number): string;
582
- formatTransferred(bytes: number, isEstimated: boolean): string;
583
- formatSpeed(bytesPerSecond: number): string;
584
- formatPercent(percentage: number): string;
585
- formatCountdown(ms: number | null): string;
586
- formatTime(timestamp: number | null): string;
587
- gqlDocument(doc: string): string;
588
- inlineValue(value: unknown): string;
589
- featureLabel(type: string): string;
590
- featureSummary(feature: QueryDevtoolsFeature): string;
591
- detailTab: WritableSignal<DetailTab>;
592
- editorMode: WritableSignal<'none' | 'response' | 'args'>;
593
- responseDraft: WritableSignal<string>;
594
- argsDraft: WritableSignal<string>;
595
- /** The text the currently open editor was seeded with - not a signal, see the field's own doc. */
596
- editorSeed: string;
597
- editError: Signal<string | null>;
598
- openResponseEditor(query: AnyQuery): void;
599
- openArgsEditor(selection: QueryDevtoolsSelection): void;
600
- applyResponse(query: AnyQuery): void;
601
- applyArgs(query: AnyQuery): void;
602
- cancelEditor(): void;
603
- forceLoading(query: AnyQuery): void;
604
- forceError(query: AnyQuery): void;
605
- forceEmpty(query: AnyQuery): void;
606
- clearForced(query: AnyQuery): void;
607
- diffRunIndex: WritableSignal<number | null>;
608
- /** The run the diff compares against, or `null` to derive it - see the panel's own field. */
609
- diffBaseRunIndex: WritableSignal<number | null>;
610
- toggleRunDiff(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): void;
611
- /** Which end of the open diff a run is, or `null` if it is not one of the two. */
612
- diffRunRole(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): 'base' | 'compare' | null;
613
- responseDiff(entry: QueryDevtoolsEntry): {
614
- before: QueryDevtoolsRun;
615
- after: QueryDevtoolsRun;
616
- diff: QueryDevtoolsDiff;
617
- } | null;
618
- canDiffRun(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): boolean;
619
- queryRuns(entry: QueryDevtoolsEntry): QueryDevtoolsRun[];
620
- runStatus(run: QueryDevtoolsRun): string;
621
- /** How many bodies a query retains, which is what bounds how far back a diff can reach. */
622
- retainedResponseCount: Signal<number>;
623
- /** Moves the whole response diff one run older or newer, from the diff header. */
624
- canStepRunDiff(entry: QueryDevtoolsEntry, older: boolean): boolean;
625
- stepRunDiff(entry: QueryDevtoolsEntry, older: boolean): void;
626
- errorRunIndex: WritableSignal<number | null>;
627
- toggleRunError(run: QueryDevtoolsRun): void;
628
- pickedRunError(entry: QueryDevtoolsEntry): {
629
- run: QueryDevtoolsRun;
630
- error: QueryDevtoolsRunError;
631
- } | null;
632
- copiedReport: QueryDevtoolsCopiedTick<boolean>;
633
- copiedInsomnia: QueryDevtoolsCopiedTick<boolean>;
634
- copiedCurl: QueryDevtoolsCopiedTick<boolean>;
635
- copiedGql: QueryDevtoolsCopiedTick<boolean>;
636
- copiedRoute: QueryDevtoolsCopiedTick<boolean>;
637
- copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
638
- copyInsomniaRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
639
- copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
640
- copyGqlDocument(doc: string): void;
641
- /** The absolute URL of the last request, or the rendered route for a query that has not run. */
642
- copyableRoute(entry: QueryDevtoolsEntry, query: AnyQuery): string;
643
- copyableRouteTitle(entry: QueryDevtoolsEntry, query: AnyQuery): string;
644
- copyRoute(entry: QueryDevtoolsEntry, query: AnyQuery): void;
645
- refreshesFor(entryId: string): {
646
- id: number;
647
- timestamp: number;
648
- label: string;
649
- }[];
650
- /** What asked for a refresh, on one line - shared by the drawer's "Refetched by" and the Events tab. */
651
- causeLabel(cause: QueryRefreshCause): string;
652
- formsDrivingQuery(entry: QueryDevtoolsEntry): QueryDevtoolsEntry[];
653
- /** Shared value-explorer search term, read (and set) from every drawer's Data sub-tab. */
654
- jsonSearch: WritableSignal<string>;
655
- jsonSearchTerm: Signal<string>;
656
- jsonExpandedPaths: Signal<ReadonlySet<string>>;
657
- jsonCollapsedPaths: Signal<ReadonlySet<string>>;
658
- toggleJsonPath(path: string, expand: boolean): void;
659
- selectedClientName: WritableSignal<string | null>;
660
- selectedQueryId: WritableSignal<string | null>;
661
- selectedQuery: Signal<{
662
- entry: QueryDevtoolsEntry;
663
- query: AnyQuery;
664
- } | null>;
665
- queryFilter: WritableSignal<string>;
666
- queryFacets: WritableSignal<ReadonlySet<QueryListFacet>>;
667
- /** The entry ids sorted to the top of the Queries list. Persisted apart from the rest - see the panel. */
668
- pinnedQueryIds: Signal<ReadonlySet<string>>;
669
- isQueryPinned(entry: QueryDevtoolsEntry): boolean;
670
- toggleQueryPin(entry: QueryDevtoolsEntry): void;
671
- /** When set (via inspect), the Queries list is filtered to exactly these entry ids. */
672
- inspectFilterIds: WritableSignal<string[] | null>;
673
- selectClient(name: string | null): void;
674
- clearInspectFilter(): void;
675
- toggleFacet(facet: QueryListFacet): void;
676
- /** Drops the search term and the status chips, keeping the client / inspection scope. */
677
- clearQueryFilters(): void;
678
- /**
679
- * Downloads the given queries (already scoped/filtered by the caller) as one Insomnia collection,
680
- * filed into a folder per query client.
681
- */
682
- downloadInsomniaCollection(items: {
683
- entry: QueryDevtoolsEntry;
684
- query: AnyQuery;
685
- }[], clientLabel: string | null): void;
686
- /** Downloads a file a tab generated. The panel does it because the panel owns the download injector. */
687
- downloadTextFile(file: {
688
- name: string;
689
- content: string;
690
- type: string;
691
- }): void;
692
- stackSelectedQueryId: WritableSignal<string | null>;
693
- stackSelectedQuery: Signal<{
694
- entry: QueryDevtoolsEntry;
695
- query: AnyQuery;
696
- } | null>;
697
- sequenceSelectedQueryId: WritableSignal<string | null>;
698
- sequenceSelectedQuery: Signal<{
699
- entry: QueryDevtoolsEntry;
700
- query: AnyQuery;
701
- } | null>;
702
- batchSelectedQueryId: WritableSignal<string | null>;
703
- batchSelectedQuery: Signal<{
704
- entry: QueryDevtoolsEntry;
705
- query: AnyQuery;
706
- } | null>;
707
- eventSelectedQueryId: WritableSignal<string | null>;
708
- eventSelectedQuery: Signal<{
709
- entry: QueryDevtoolsEntry;
710
- query: AnyQuery;
711
- } | null>;
712
- formSelectedQueryId: WritableSignal<string | null>;
713
- formSelectedQuery: Signal<{
714
- entry: QueryDevtoolsEntry;
715
- query: AnyQuery;
716
- } | null>;
717
- /** The form whose detail the Forms tab has expanded - persisted. */
718
- selectedFormId: WritableSignal<string | null>;
719
- /** The rolling event log - persisted only in the sense that it survives a tab switch, not a reload. */
720
- eventLog: WritableSignal<EventLogItem[]>;
721
- /** The client (by base URL) the event log is scoped to, or `null` for all of them - persisted. */
722
- eventClient: WritableSignal<string | null>;
723
- /** Whether the event log is narrowed to failures - persisted. */
724
- eventErrorsOnly: WritableSignal<boolean>;
725
- /** Free-text narrowing of every socket's message log - persisted. */
726
- socketFilter: WritableSignal<string>;
727
- socketMessages(ws: WebSocketDevtoolsHandle): WebSocketDevtoolsMessage[];
728
- socketDirectionLabel(message: WebSocketDevtoolsMessage): string;
729
- emitSocketMessage(options: {
730
- entry: QueryDevtoolsEntry;
731
- event: string;
732
- data: string;
733
- }): void;
734
- /** The message an emit box last failed with, if this is the socket it failed on. */
735
- socketEmitErrorFor(entryId: string): string | null;
736
- timelineSelectedQueryId: WritableSignal<string | null>;
737
- timelineSelectedQuery: Signal<{
738
- entry: QueryDevtoolsEntry;
739
- query: AnyQuery;
740
- } | null>;
741
- /**
742
- * The type annotations of each seeded mock body, by mock id. A mock only stores the *name* it was
743
- * seeded from, and a body seeded from an inline schema has none, so this is the only thing that can
744
- * label such a body - and it has to outlive the Mocks tab being switched away from.
745
- */
746
- seededTypes: WritableSignal<Record<string, ReadonlyMap<string, string>>>;
747
- paneAxis: Signal<PaneAxis>;
748
- listWidth: Signal<number | null>;
749
- drawerWidth: Signal<number | null>;
750
- listHeight: Signal<number | null>;
751
- drawerHeight: Signal<number | null>;
752
- startPaneResize(event: PointerEvent, target: {
753
- pane: PaneTarget;
754
- container: HTMLElement;
755
- }): void;
756
- resetPaneSize(pane: PaneTarget): void;
757
- };
758
-
759
- type ScopeKey = 'viewState' | 'pins' | 'overrides' | 'mocks' | 'armedMocks' | 'armedFaults' | 'authSessions';
760
- type ScopeRow = {
761
- key: ScopeKey;
762
- label: string;
763
- /** What is kept, and what `none` costs - the one thing a scope picker cannot show on its own. */
764
- hint: string;
765
- /**
766
- * What to say on the scopes that let this state outlive the page that armed it - a picker cannot show
767
- * that an app is about to start lying to itself before anyone opens the panel.
768
- */
769
- warn?: {
770
- scopes: QueryDevtoolsStorageScope[];
771
- text: string;
772
- };
773
- };
774
- type LimitKey = 'maxEvents' | 'maxDroppedCacheEntries';
775
- type LimitRow = {
776
- key: LimitKey;
777
- label: string;
778
- min: number;
779
- max: number;
780
- step: number;
781
- hint: string;
782
- };
783
- /**
784
- * Every panel-wide switch in one place - the storage each kind of state uses, the limits the panel would
785
- * otherwise hold as constants, and the toggles their own tabs also carry.
786
- */
787
- declare class QueryDevtoolsSettingsComponent {
788
- private document;
789
- protected host: QueryDevtoolsHost;
790
- protected readonly SCOPE_ROWS: ScopeRow[];
791
- protected readonly SCOPES: {
792
- value: QueryDevtoolsStorageScope;
793
- label: string;
794
- }[];
795
- 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.";
796
- protected readonly LIMIT_ROWS: LimitRow[];
797
- protected readonly ARM_ALL_MOCKS: () => void;
798
- protected readonly DISARM_ALL_MOCKS: () => void;
799
- protected readonly DISARM_ALL_FAULTS: (clientName?: string) => void;
800
- /** What queries actually retain, which is the application's value unless this panel raised it. */
801
- protected responseHistory: _angular_core.Signal<number>;
802
- protected mockCount: _angular_core.Signal<number>;
803
- protected sessionCount: _angular_core.Signal<number>;
804
- protected armedMockCount: _angular_core.Signal<number>;
805
- protected armedFaultCount: _angular_core.Signal<number>;
806
- /** The same keys the Events tab's own picker offers - see {@link queryDevtoolsEventClients}. */
807
- protected eventClients: _angular_core.Signal<string[]>;
808
- protected resetConfirming: _angular_core.WritableSignal<boolean>;
809
- protected readonly FORGET_SESSIONS: () => void;
810
- /** The backends the application declared, or an empty list - the card renders only for a declared one. */
811
- protected apiEnvs: _angular_core.Signal<QueryDevtoolsApiEnvSwitch[]>;
812
- /** The env id (or typed URL) a switch's key holds, or `null` while the application picks for itself. */
813
- protected apiEnvValue(apiSwitch: QueryDevtoolsApiEnvSwitch): string | null;
814
- /** The env a switch falls back to with nothing stored, described for the default button. */
815
- protected apiEnvFallback(apiSwitch: QueryDevtoolsApiEnvSwitch): {
816
- label: string;
817
- production: boolean;
818
- };
819
- /** Whether the pick in force - the stored env, or the fallback behind an unwritten key - is production. */
820
- protected apiEnvIsProduction(apiSwitch: QueryDevtoolsApiEnvSwitch): boolean;
821
- /** A stored value no declared env carries, which is a URL somebody typed in below. */
822
- protected apiEnvCustomUrl(apiSwitch: QueryDevtoolsApiEnvSwitch): string;
823
- /** Writes the application's own key and reloads - it is read before Angular boots, so nothing else can. */
824
- protected pickApiEnv(apiSwitch: QueryDevtoolsApiEnvSwitch, value: string | null): void;
825
- protected setCustomApiUrl(apiSwitch: QueryDevtoolsApiEnvSwitch, value: string): void;
826
- protected settings(): _ethlete_query.QueryDevtoolsSettings;
827
- protected scopeOf(key: ScopeKey): QueryDevtoolsStorageScope;
828
- protected limitOf(key: LimitKey): number;
829
- /** What the picked scope means beyond where the state is kept, or `null` while it means nothing extra. */
830
- protected warningFor(row: ScopeRow, scope: QueryDevtoolsStorageScope): string | null;
831
- /** Why one scope is not on offer for a row, for the button's title, or `null` while it is. */
832
- 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;
833
- protected setScope(key: ScopeKey, scope: QueryDevtoolsStorageScope): void;
834
- protected setLimit(key: LimitKey, value: string): void;
835
- protected setResponseHistory(value: string): void;
836
- /** Hands retention back to `provideQueryDevtools({ responseHistory })`. */
837
- protected clearResponseHistory(): void;
838
- protected reset(): void;
839
- protected toggleGoneQueries(): void;
840
- protected showsGoneQueries(): boolean;
841
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsSettingsComponent, never>;
842
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsSettingsComponent, "et-query-devtools-settings", never, {}, {}, never, never, true, never>;
843
- }
844
-
845
- /**
846
- * The waterfall's grid, axis and bars, as a styles-only component the panel mounts when the Timeline tab
847
- * is first opened.
848
- *
849
- * @internal
850
- */
851
- declare class QueryDevtoolsTimelineStylesComponent {
852
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsTimelineStylesComponent, never>;
853
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsTimelineStylesComponent, "et-query-devtools-timeline-styles", never, {}, {}, never, never, true, never>;
854
- }
855
-
856
221
  type DevtoolsDock = 'bottom' | 'top' | 'left' | 'right' | 'float';
857
222
  type DevtoolsLayout = DevtoolsDock | 'popout';
858
223
  type FloatRect = {
@@ -900,24 +265,6 @@ type PersistedState = {
900
265
  jsonExpanded?: string[];
901
266
  jsonCollapsed?: string[];
902
267
  };
903
- type ViewportSize = {
904
- width: number;
905
- height: number;
906
- };
907
- /**
908
- * The loosest a float may sit: shoved off an edge with only {@link FLOAT_PEEK} left, which is what a
909
- * drag and a parked panel are held to. **North is never a parking edge** - the title bar is the only
910
- * thing that drags the panel back, so it may never be the part that leaves.
911
- */
912
- declare const clampFloatToPeek: (rect: FloatRect, viewport: ViewportSize) => FloatRect;
913
- declare const settledFloatRect: (rect: FloatRect, viewport: ViewportSize) => {
914
- rect: FloatRect;
915
- collapsed: boolean;
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
@@ -1197,11 +544,6 @@ declare class QueryDevtoolsComponent implements OnInit {
1197
544
  private lockSnapshot;
1198
545
  lockRows: _angular_core.Signal<DevtoolsLockRow[] | null>;
1199
546
  protected inspectActive: _angular_core.WritableSignal<boolean>;
1200
- /** @internal */
1201
- inspectHover: _angular_core.WritableSignal<{
1202
- rect: DOMRect;
1203
- entries: QueryDevtoolsEntry[];
1204
- } | null>;
1205
547
  protected locatedRect: _angular_core.WritableSignal<DOMRect | null>;
1206
548
  locateState: _angular_core.WritableSignal<"idle" | "located" | "offscreen">;
1207
549
  private locate$;
@@ -1230,7 +572,7 @@ declare class QueryDevtoolsComponent implements OnInit {
1230
572
  faultClients: _angular_core.Signal<{
1231
573
  name: string;
1232
574
  baseUrl: string;
1233
- fault: _ethlete_query.QueryDevtoolsFault;
575
+ fault: _ethlete_query.ɵQueryDevtoolsFault;
1234
576
  armed: boolean;
1235
577
  }[]>;
1236
578
  protected armedFaultClients: _angular_core.Signal<string[] | null>;
@@ -1478,7 +820,7 @@ declare class QueryDevtoolsComponent implements OnInit {
1478
820
  */
1479
821
  pickedRunError(entry: QueryDevtoolsEntry): {
1480
822
  run: QueryDevtoolsRun;
1481
- error: _ethlete_query.QueryDevtoolsRunError;
823
+ error: _ethlete_query.ɵQueryDevtoolsRunError;
1482
824
  } | null;
1483
825
  selectQuery(id: string): void;
1484
826
  inlineValue(value: unknown): string;
@@ -1662,7 +1004,6 @@ declare class QueryDevtoolsComponent implements OnInit {
1662
1004
  declare const QUERY_DEVTOOLS_IMPORTS: readonly [typeof QueryDevtoolsComponent];
1663
1005
 
1664
1006
  /** The version of `@ethlete/query-devtools` this build was cut from. */
1665
- declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.14";
1007
+ declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.15";
1666
1008
 
1667
- export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsAboutComponent, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsJsonStylesComponent, QueryDevtoolsSettingsComponent, QueryDevtoolsTimelineStylesComponent, clampFloatToPeek, kindOf, resizedFloatRect, settledFloatRect };
1668
- export type { JsonKind };
1009
+ export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsComponent };