@ethlete/query-devtools 1.0.0-next.13 → 1.0.0-next.14

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.
@@ -17,10 +17,13 @@ type AboutGroup = {
17
17
  * `provideQueryDevtools({ about })`. A section rather than a tab body, so it can be shown anywhere.
18
18
  */
19
19
  declare class QueryDevtoolsAboutComponent {
20
+ private hostEl;
20
21
  protected readonly groups: AboutGroup[];
21
- protected copied: _angular_core.WritableSignal<boolean>;
22
- private copiedReset$;
23
- constructor();
22
+ protected copied: {
23
+ value: _angular_core.Signal<boolean>;
24
+ mark: (next: boolean) => void;
25
+ clear: () => void;
26
+ };
24
27
  protected copy(): void;
25
28
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<QueryDevtoolsAboutComponent, never>;
26
29
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsAboutComponent, "et-query-devtools-about", never, {}, {}, never, never, true, never>;
@@ -49,10 +52,11 @@ declare const kindOf: (value: unknown) => JsonKind;
49
52
  * re-enter as the same component with a `chunk` window over the same value.
50
53
  */
51
54
  declare class QueryDevtoolsJsonComponent {
55
+ private hostEl;
52
56
  value: _angular_core.InputSignal<unknown>;
53
57
  nodeKey: _angular_core.InputSignal<string | null>;
54
58
  depth: _angular_core.InputSignalWithTransform<number, unknown>;
55
- /** Lowercased search term; when set, the tree auto-expands and matches are highlighted. */
59
+ /** Lowercased search term; when set, the containers holding a match auto-expand and matches are highlighted. */
56
60
  search: _angular_core.InputSignal<string>;
57
61
  /**
58
62
  * When set, this node is not the value itself but a folded window over its entries. It shares the
@@ -78,6 +82,8 @@ declare class QueryDevtoolsJsonComponent {
78
82
  * {@link QueryDevtoolsSchemaSeed} produces it. A node with an entry labels itself with it.
79
83
  */
80
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[]>;
81
87
  protected kind: _angular_core.Signal<JsonKind>;
82
88
  private exotic;
83
89
  /** One annotation covers every element of an array, so the lookup path forgets which index this is. */
@@ -99,12 +105,15 @@ declare class QueryDevtoolsJsonComponent {
99
105
  private defaultExpanded;
100
106
  private localExpanded;
101
107
  private expanded;
102
- /** Only slices that actually contain a match unfold while searching, so a filter stays cheap. */
103
- private chunkHasHit;
108
+ protected childAncestors: _angular_core.Signal<unknown[]>;
109
+ private hasHit;
104
110
  protected effectiveExpanded: _angular_core.Signal<boolean>;
105
111
  /** 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$;
112
+ protected copied: {
113
+ value: _angular_core.Signal<QueryDevtoolsCopyPayload | null>;
114
+ mark: (next: QueryDevtoolsCopyPayload | null) => void;
115
+ clear: () => void;
116
+ };
108
117
  /**
109
118
  * Whether this node has an address of its own to copy. An explorer root has no key, and a folded
110
119
  * slice stands for a range of entries rather than one path - neither can name itself.
@@ -138,9 +147,8 @@ declare class QueryDevtoolsJsonComponent {
138
147
  /** An exotic container copies the entries the tree shows, not the private fields `JSON.stringify` finds. */
139
148
  private copyableValue;
140
149
  private chunkValue;
141
- private flagCopied;
142
150
  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>;
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>;
144
152
  }
145
153
 
146
154
  /**
@@ -154,6 +162,17 @@ declare class QueryDevtoolsJsonStylesComponent {
154
162
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsJsonStylesComponent, "et-query-devtools-json-styles", never, {}, {}, never, never, true, never>;
155
163
  }
156
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>>;
175
+
157
176
  /** Whether a path exists only in the newer value, only in the older one, or in both with a new value. */
158
177
  type QueryDevtoolsDiffKind = 'added' | 'removed' | 'changed';
159
178
  /** One difference between two values, located by the path it sits at. */
@@ -324,11 +343,8 @@ type EventLogItem = {
324
343
  url: string | null;
325
344
  isSecure: boolean;
326
345
  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;
346
+ /** Weak, so the log never keeps a destroyed request alive. `null` for an event that is not one request. */
347
+ request: WeakRef<object> | null;
332
348
  /** What asked for a refresh, for a `queries-refreshed` row. `null` for every other type. */
333
349
  cause: QueryRefreshCause | null;
334
350
  /** Why a cache entry was torn down, for an `entry-destroyed` row. `null` for every other type. */
@@ -466,6 +482,7 @@ type QueryDevtoolsHost = {
466
482
  /** 1-second tick driving every countdown/freshness readout across tabs. */
467
483
  clock: Signal<number>;
468
484
  findQuery(id: string | null): QueryDevtoolsSelection | null;
485
+ eventQueryId(event: EventLogItem): string | null;
469
486
  queryLinkFor(entry: QueryDevtoolsEntry | undefined, query?: AnyQuery): QueryLink;
470
487
  asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
471
488
  asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
@@ -612,11 +629,11 @@ type QueryDevtoolsHost = {
612
629
  run: QueryDevtoolsRun;
613
630
  error: QueryDevtoolsRunError;
614
631
  } | null;
615
- copiedReport: Signal<boolean>;
616
- copiedInsomnia: Signal<boolean>;
617
- copiedCurl: Signal<boolean>;
618
- copiedGql: Signal<boolean>;
619
- copiedRoute: Signal<boolean>;
632
+ copiedReport: QueryDevtoolsCopiedTick<boolean>;
633
+ copiedInsomnia: QueryDevtoolsCopiedTick<boolean>;
634
+ copiedCurl: QueryDevtoolsCopiedTick<boolean>;
635
+ copiedGql: QueryDevtoolsCopiedTick<boolean>;
636
+ copiedRoute: QueryDevtoolsCopiedTick<boolean>;
620
637
  copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
621
638
  copyInsomniaRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
622
639
  copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
@@ -836,14 +853,8 @@ declare class QueryDevtoolsTimelineStylesComponent {
836
853
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<QueryDevtoolsTimelineStylesComponent, "et-query-devtools-timeline-styles", never, {}, {}, never, never, true, never>;
837
854
  }
838
855
 
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
856
  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
857
  type DevtoolsLayout = DevtoolsDock | 'popout';
846
- /** The floating panel's position and size, in CSS px from the viewport's top-left. */
847
858
  type FloatRect = {
848
859
  x: number;
849
860
  y: number;
@@ -899,21 +910,10 @@ type ViewportSize = {
899
910
  * thing that drags the panel back, so it may never be the part that leaves.
900
911
  */
901
912
  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
913
  declare const settledFloatRect: (rect: FloatRect, viewport: ViewportSize) => {
909
914
  rect: FloatRect;
910
915
  collapsed: boolean;
911
916
  };
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
917
  declare const resizedFloatRect: (base: FloatRect, { move, viewport }: {
918
918
  move: ResizeMoveEvent;
919
919
  viewport: ViewportSize;
@@ -941,11 +941,9 @@ declare class QueryDevtoolsComponent implements OnInit {
941
941
  * `<et-query-devtools-lazy>`, which downloads the panel on the click that was meant to open it.
942
942
  */
943
943
  startOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
944
- /** The panel itself, so a pop-out can move it into another window's document. */
945
944
  private panelEl;
946
945
  private eventIdCounter;
947
946
  private lastSelectionKey;
948
- /** Where the gear goes back to, so opening Settings does not lose the tab it was opened over. */
949
947
  private tabBeforeSettings;
950
948
  readonly persisted: PersistedState;
951
949
  protected readonly tabs: ({
@@ -991,10 +989,6 @@ declare class QueryDevtoolsComponent implements OnInit {
991
989
  id: "about";
992
990
  label: string;
993
991
  })[];
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
992
  private readonly PINNED_TABS;
999
993
  protected readonly shortcut: "⌘⌥Q" | "Ctrl+Alt+Q";
1000
994
  protected readonly LAYOUTS: readonly [{
@@ -1028,24 +1022,18 @@ declare class QueryDevtoolsComponent implements OnInit {
1028
1022
  readonly label: "Pop out";
1029
1023
  readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
1030
1024
  }];
1031
- protected open: WritableSignal<boolean>;
1025
+ protected open: _angular_core.WritableSignal<boolean>;
1032
1026
  private panelHeight;
1033
1027
  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>;
1028
+ protected activeTab: _angular_core.WritableSignal<DevtoolsTab>;
1029
+ protected listWidth: _angular_core.WritableSignal<number | null>;
1030
+ protected drawerWidth: _angular_core.WritableSignal<number | null>;
1031
+ protected listHeight: _angular_core.WritableSignal<number | null>;
1032
+ protected drawerHeight: _angular_core.WritableSignal<number | null>;
1044
1033
  private drag;
1034
+ private floatGesture;
1045
1035
  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. */
1036
+ protected dock: _angular_core.WritableSignal<DevtoolsDock>;
1049
1037
  protected currentLayout: _angular_core.Signal<{
1050
1038
  readonly id: "bottom";
1051
1039
  readonly glyph: "⬓";
@@ -1077,46 +1065,32 @@ declare class QueryDevtoolsComponent implements OnInit {
1077
1065
  readonly label: "Pop out";
1078
1066
  readonly hint: "Move the panel into a window of its own - the same live panel, on your other screen";
1079
1067
  }>;
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. */
1068
+ protected reservesSpace: _angular_core.WritableSignal<boolean>;
1086
1069
  private floatRect;
1087
- /** The rect a resize gesture started from, or `null` outside one. */
1088
1070
  private floatResizeBase;
1089
1071
  /**
1090
1072
  * Whether the float is shoved off an edge with only its peek showing. Persisted with the rect, since
1091
1073
  * restoring the rect without it would either strand the panel off screen or silently un-park it.
1092
1074
  */
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>;
1075
+ protected floatParked: _angular_core.WritableSignal<boolean>;
1076
+ protected popOutBlocked: _angular_core.WritableSignal<boolean>;
1099
1077
  /**
1100
1078
  * Whether the panel currently lives in a window of its own. Deliberately not persisted: a reload
1101
1079
  * cannot re-adopt a window the previous document opened, so it always starts docked.
1102
1080
  */
1103
- protected poppedOut: WritableSignal<boolean>;
1081
+ protected poppedOut: _angular_core.WritableSignal<boolean>;
1104
1082
  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
1083
  private narrowViewport;
1110
- /** Whether the panel is docked to a side edge, which is what sizes it along the inline axis. */
1111
1084
  private sideDocked;
1112
- /** Which axis the two-pane tabs split along. The stylesheet keys the stacked layout off the same value. */
1113
1085
  protected paneAxis: _angular_core.Signal<PaneAxis>;
1114
1086
  private popup;
1115
- /** Stops mirroring the host document's stylesheets into the pop-up. @see syncStylesInto */
1087
+ /** Ends everything tied to one pop-out window: a pending `load`, its `pagehide`, shortcut and visibility. */
1088
+ private popOutEnded$;
1089
+ private popupVisible;
1090
+ private isPanelVisible;
1116
1091
  private popOutStyleSync;
1117
1092
  protected panelBlockSize: _angular_core.Signal<number | null>;
1118
1093
  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
1094
  protected panelInsetBlock: _angular_core.Signal<number | null>;
1121
1095
  protected panelInsetInline: _angular_core.Signal<number | null>;
1122
1096
  /**
@@ -1124,7 +1098,6 @@ declare class QueryDevtoolsComponent implements OnInit {
1124
1098
  * `max-block-size: 90vh`) and it is the clamped size the page has to give up.
1125
1099
  */
1126
1100
  private panelSize;
1127
- /** Which padding a docked panel asks of the page and how much, or `null` when it asks for none. */
1128
1101
  private pageReservation;
1129
1102
  /**
1130
1103
  * The viewport edge a docked panel covers, reserved for overlays whatever {@link reservesSpace} says:
@@ -1133,109 +1106,84 @@ declare class QueryDevtoolsComponent implements OnInit {
1133
1106
  * writing direction cannot change under a dock switch.
1134
1107
  */
1135
1108
  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>;
1109
+ detailTab: _angular_core.WritableSignal<DetailTab>;
1110
+ selectedClientName: _angular_core.WritableSignal<string | null>;
1111
+ selectedQueryId: _angular_core.WritableSignal<string | null>;
1112
+ selectedFormId: _angular_core.WritableSignal<string | null>;
1142
1113
  /**
1143
1114
  * The type annotations of each seeded mock body, by mock id. It lives here rather than on the Mocks
1144
1115
  * tab because a tab is destroyed the moment another one is selected, and a body seeded from an inline
1145
1116
  * schema has no `schemaName` to recover its labels from.
1146
1117
  */
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. */
1118
+ seededTypes: _angular_core.WritableSignal<Record<string, ReadonlyMap<string, string>>>;
1119
+ stackSelectedQueryId: _angular_core.WritableSignal<string | null>;
1120
+ sequenceSelectedQueryId: _angular_core.WritableSignal<string | null>;
1121
+ batchSelectedQueryId: _angular_core.WritableSignal<string | null>;
1122
+ eventSelectedQueryId: _angular_core.WritableSignal<string | null>;
1123
+ formSelectedQueryId: _angular_core.WritableSignal<string | null>;
1124
+ timelineSelectedQueryId: _angular_core.WritableSignal<string | null>;
1125
+ queryFilter: _angular_core.WritableSignal<string>;
1126
+ queryFacets: _angular_core.WritableSignal<ReadonlySet<QueryListFacet>>;
1127
+ queryRecentFirst: _angular_core.WritableSignal<boolean>;
1128
+ queryTreeView: _angular_core.WritableSignal<boolean>;
1129
+ collapsedQueryPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
1130
+ pinnedQueryIds: _angular_core.WritableSignal<ReadonlySet<string>>;
1131
+ eventLog: _angular_core.WritableSignal<EventLogItem[]>;
1132
+ private eventOwners;
1133
+ droppedCacheEntries: _angular_core.WritableSignal<DroppedCacheEntry[]>;
1134
+ eventClient: _angular_core.WritableSignal<string | null>;
1135
+ eventErrorsOnly: _angular_core.WritableSignal<boolean>;
1136
+ socketFilter: _angular_core.WritableSignal<string>;
1192
1137
  private expandedCacheKey;
1193
- /** The socket whose emit box last failed, so the message shows on that card and no other. */
1194
1138
  private socketEmitError;
1195
- /** Keys (`<entryId>:<stepIndex>`) of the sequence steps whose in/out detail is expanded. */
1196
1139
  private expandedSteps;
1197
- /** Keys (`<entryId>:<itemIndex>`) of the batch items whose args/response detail is expanded. */
1198
1140
  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>;
1141
+ expandedQueryGroups: _angular_core.WritableSignal<ReadonlySet<string>>;
1142
+ jsonSearch: _angular_core.WritableSignal<string>;
1203
1143
  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. */
1144
+ jsonExpandedPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
1145
+ jsonCollapsedPaths: _angular_core.WritableSignal<ReadonlySet<string>>;
1208
1146
  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. */
1147
+ diffRunIndex: _angular_core.WritableSignal<number | null>;
1148
+ diffBaseRunIndex: _angular_core.WritableSignal<number | null>;
1149
+ errorRunIndex: _angular_core.WritableSignal<number | null>;
1218
1150
  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>;
1151
+ editorMode: _angular_core.WritableSignal<"none" | "response" | "args">;
1152
+ responseDraft: _angular_core.WritableSignal<string>;
1153
+ argsDraft: _angular_core.WritableSignal<string>;
1223
1154
  /**
1224
1155
  * The text the currently open editor was seeded with. The textareas bind `value` to this and not to
1225
1156
  * the live draft: a `value` binding fed by the draft is written back on every keystroke, and writing
1226
1157
  * a textarea's `value` puts the caret at the end.
1227
1158
  */
1228
1159
  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. */
1160
+ editError: _angular_core.WritableSignal<string | null>;
1231
1161
  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$;
1162
+ copiedReport: {
1163
+ value: _angular_core.Signal<boolean>;
1164
+ mark: (next: boolean) => void;
1165
+ clear: () => void;
1166
+ };
1167
+ copiedInsomnia: {
1168
+ value: _angular_core.Signal<boolean>;
1169
+ mark: (next: boolean) => void;
1170
+ clear: () => void;
1171
+ };
1172
+ copiedCurl: {
1173
+ value: _angular_core.Signal<boolean>;
1174
+ mark: (next: boolean) => void;
1175
+ clear: () => void;
1176
+ };
1177
+ copiedGql: {
1178
+ value: _angular_core.Signal<boolean>;
1179
+ mark: (next: boolean) => void;
1180
+ clear: () => void;
1181
+ };
1182
+ copiedRoute: {
1183
+ value: _angular_core.Signal<boolean>;
1184
+ mark: (next: boolean) => void;
1185
+ clear: () => void;
1186
+ };
1239
1187
  /**
1240
1188
  * 1-second tick driving the cache freshness countdowns. Gated the way the locks poll is: an ungated
1241
1189
  * `interval` is a periodic macrotask zone.js counts forever, so a mounted panel would tick the host
@@ -1243,32 +1191,25 @@ declare class QueryDevtoolsComponent implements OnInit {
1243
1191
  * sits inside `@if (open())`, so there is nothing to drive while the panel is shut or the tab hidden.
1244
1192
  */
1245
1193
  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
1194
  private probeLocks;
1251
1195
  private probeId;
1252
1196
  private probeHold;
1253
1197
  private lockSnapshot;
1254
1198
  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>;
1199
+ protected inspectActive: _angular_core.WritableSignal<boolean>;
1257
1200
  /** @internal */
1258
- inspectHover: WritableSignal<{
1201
+ inspectHover: _angular_core.WritableSignal<{
1259
1202
  rect: DOMRect;
1260
1203
  entries: QueryDevtoolsEntry[];
1261
1204
  } | 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">;
1205
+ protected locatedRect: _angular_core.WritableSignal<DOMRect | null>;
1206
+ locateState: _angular_core.WritableSignal<"idle" | "located" | "offscreen">;
1265
1207
  private locate$;
1266
- /** When set (via inspect), the Queries list is filtered to exactly these entry ids. */
1267
- inspectFilterIds: WritableSignal<string[] | null>;
1208
+ inspectFilterIds: _angular_core.WritableSignal<string[] | null>;
1268
1209
  private queryEntries;
1269
1210
  /**
1270
1211
  * 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 -
1212
+ * the tab bar's error flags, the tamper dot, the timeline -
1272
1213
  * reads this rather than {@link queryEntries}, so a tombstone never inflates a live number.
1273
1214
  */
1274
1215
  private liveQueryEntries;
@@ -1279,7 +1220,6 @@ declare class QueryDevtoolsComponent implements OnInit {
1279
1220
  formEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
1280
1221
  authEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
1281
1222
  wsEntries: _angular_core.Signal<QueryDevtoolsEntry[]>;
1282
- /** Unique client names present across queries and auth providers, for the Queries-tab picker. */
1283
1223
  clientNames: _angular_core.Signal<string[]>;
1284
1224
  /**
1285
1225
  * Unique repositories (with their client name + base URL) used by the Cache and Events tabs. A
@@ -1287,47 +1227,18 @@ declare class QueryDevtoolsComponent implements OnInit {
1287
1227
  * and its **Evict all** long after its injector died.
1288
1228
  */
1289
1229
  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
1230
  faultClients: _angular_core.Signal<{
1295
1231
  name: string;
1296
1232
  baseUrl: string;
1297
1233
  fault: _ethlete_query.QueryDevtoolsFault;
1298
1234
  armed: boolean;
1299
1235
  }[]>;
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
1236
  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
1237
  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
1238
  scopedQueries: _angular_core.Signal<QueryDevtoolsEntry[]>;
1318
- /** How many runs every query has recorded, for the Timeline tab's badge. */
1319
1239
  private runTotals;
1320
- /** Cache entries across every client, for the Cache tab's badge. */
1321
1240
  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
1241
  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
1242
  protected visibleTabs: _angular_core.Signal<({
1332
1243
  id: "queries";
1333
1244
  label: string;
@@ -1371,7 +1282,6 @@ declare class QueryDevtoolsComponent implements OnInit {
1371
1282
  id: "about";
1372
1283
  label: string;
1373
1284
  })[]>;
1374
- /** The empty tabs, which the bar offers behind "More" instead. */
1375
1285
  protected overflowTabs: _angular_core.Signal<({
1376
1286
  id: "queries";
1377
1287
  label: string;
@@ -1460,19 +1370,11 @@ declare class QueryDevtoolsComponent implements OnInit {
1460
1370
  client: QueryClient | null;
1461
1371
  dropped: DroppedCacheEntry[];
1462
1372
  }[]>;
1463
- /** Map of a component's host element to the query entries it created (for the inspect tool). */
1464
1373
  private elementQueryMap;
1465
- /** Disarms every client's fault - the shell's "Faults armed" banner offers this above every tab. */
1466
1374
  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
1375
  protected faultsRestored: _angular_core.Signal<boolean>;
1469
1376
  protected mocksRestored: _angular_core.Signal<boolean>;
1470
- /** Stops serving every designed mock - the shell's "Mocks armed" banner offers the same way out. */
1471
1377
  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
1378
  protected restoredOverrides: _angular_core.Signal<{
1477
1379
  queries: number;
1478
1380
  ops: number;
@@ -1480,32 +1382,19 @@ declare class QueryDevtoolsComponent implements OnInit {
1480
1382
  orphaned: string[];
1481
1383
  fromLocalStorage: boolean;
1482
1384
  } | null>;
1483
- /** Drops everything the reload re-armed, and empties the store it came from. */
1484
1385
  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
1386
  protected readonly FLOAT_RESIZE_EDGES: ResizeEdge[];
1487
1387
  constructor();
1488
1388
  ngOnInit(): void;
1489
- /** @see queryDevtoolsOverridePersistence */
1490
1389
  overridesPersist(): boolean;
1491
1390
  toggleOverridesPersist(): void;
1492
- /** Where armed overrides are kept, as the drawer's toggle and the Settings picker both name it. */
1493
1391
  overridesScopeLabel(): string;
1494
1392
  /**
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.
1393
+ * Puts layout, filters, selections, pins and stored overrides back the way they ship; the settings stay.
1394
+ * Resets the live state too, or the persistence effects write it straight back.
1501
1395
  */
1502
1396
  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
1397
  protected toggleSettings(): void;
1508
- /** Opens the first query the reload re-armed, so the banner leads somewhere rather than just warning. */
1509
1398
  protected reviewRestoredOverrides(id: string): void;
1510
1399
  /**
1511
1400
  * Closing while popped out docks back instead: the panel a pop-out shows is the very element the
@@ -1515,17 +1404,13 @@ declare class QueryDevtoolsComponent implements OnInit {
1515
1404
  protected floatPanel(): void;
1516
1405
  protected selectLayout(layout: DevtoolsLayout): void;
1517
1406
  /**
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.
1407
+ * Moves the panel element into a pop-up window. The host document's `<style>` tags and root theming
1408
+ * tokens must be copied over with it, or the pop-out renders unstyled.
1523
1409
  */
1524
1410
  popOut(): void;
1525
1411
  selectClient(name: string | null): void;
1526
1412
  clearInspectFilter(): void;
1527
1413
  toggleFacet(facet: QueryListFacet): void;
1528
- /** Drops the search term and the status chips, keeping the client / inspection scope. */
1529
1414
  clearQueryFilters(): void;
1530
1415
  isQueryPinned(entry: QueryDevtoolsEntry): boolean;
1531
1416
  toggleQueryPath(key: string): void;
@@ -1533,11 +1418,8 @@ declare class QueryDevtoolsComponent implements OnInit {
1533
1418
  protected toggleInspect(): void;
1534
1419
  protected startResize(event: PointerEvent): void;
1535
1420
  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
1421
  protected endFloatMove(): void;
1538
- /** A click on the title bar of a parked panel brings it back - the gesture that parked it, reversed. */
1539
1422
  protected restoreFloat(): void;
1540
- /** A resize reports a delta from where the pointer went down, so the rect it started from is kept. */
1541
1423
  protected startFloatResize(): void;
1542
1424
  protected resizeFloat(move: ResizeMoveEvent): void;
1543
1425
  protected endFloatResize(): void;
@@ -1545,16 +1427,9 @@ declare class QueryDevtoolsComponent implements OnInit {
1545
1427
  pane: PaneTarget;
1546
1428
  container: HTMLElement;
1547
1429
  }): void;
1548
- /** Hands a pane back to the stylesheet's proportional default, on the axis it is being sized along. */
1549
1430
  resetPaneSize(pane: PaneTarget): void;
1550
1431
  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
1432
  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
1433
  requestUrl(query: AnyQuery): string | null;
1559
1434
  /**
1560
1435
  * The args of a query. A query executed imperatively (`execute({ args })`, a sequence step, an auth
@@ -1563,80 +1438,37 @@ declare class QueryDevtoolsComponent implements OnInit {
1563
1438
  */
1564
1439
  queryArgs(query: AnyQuery): Omit<any, "response" | "rawResponse"> | null;
1565
1440
  /**
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.
1441
+ * The headers the last run sent, or what the args and client resolve to now for a query that has not
1442
+ * run; `null` while a header provider throws. Client headers and the secure `Authorization` never
1443
+ * reach the args, so the args alone cannot answer this.
1574
1444
  */
1575
1445
  requestHeaders(query: AnyQuery): {
1576
1446
  [k: string]: string;
1577
1447
  } | null;
1578
1448
  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
1449
  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
1450
  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
1451
  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
1452
  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
1453
  retryCause(status: number): string;
1600
1454
  formatPercent(percentage: number): string;
1601
- /** A countdown in whole seconds, spelled out the way the cache freshness column does. */
1602
1455
  formatCountdown(ms: number | null): string;
1603
1456
  queryActivity(entry: QueryDevtoolsEntry): QueryActivity;
1604
1457
  linkActivity(link: QueryLink): QueryActivity;
1605
1458
  stackActivity(stack: AnyQueryStack | AnyPagedQueryStack): QueryActivity;
1606
1459
  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
1460
  resetStats(entry: QueryDevtoolsEntry): void;
1609
- /** A query's runs, newest first - the order a history is read in. */
1610
1461
  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
1462
  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
1463
  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
1464
  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
1465
  diffRunRole(entry: QueryDevtoolsEntry, run: QueryDevtoolsRun): 'base' | 'compare' | null;
1629
1466
  responseDiff(entry: QueryDevtoolsEntry): {
1630
1467
  before: QueryDevtoolsRun;
1631
1468
  after: QueryDevtoolsRun;
1632
1469
  diff: QueryDevtoolsDiff;
1633
1470
  } | null;
1634
- /** Whether the diff header's older/newer control has a pair to move to. */
1635
1471
  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
1472
  stepRunDiff(entry: QueryDevtoolsEntry, older: boolean): void;
1641
1473
  toggleRunError(run: QueryDevtoolsRun): void;
1642
1474
  /**
@@ -1648,17 +1480,10 @@ declare class QueryDevtoolsComponent implements OnInit {
1648
1480
  run: QueryDevtoolsRun;
1649
1481
  error: _ethlete_query.QueryDevtoolsRunError;
1650
1482
  } | null;
1651
- /** Opens a query in the Queries tab - the Events tab is a way in, not a dead end. */
1652
1483
  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
1484
  inlineValue(value: unknown): string;
1655
1485
  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
1486
  formatTransferred(bytes: number, isEstimated: boolean): string;
1661
- /** A transfer rate, given in bytes per second the way `HttpRequestLoadingProgressState.speed` reports it. */
1662
1487
  formatSpeed(bytesPerSecond: number): string;
1663
1488
  formatDuration(ms: number | null): string;
1664
1489
  /**
@@ -1668,46 +1493,17 @@ declare class QueryDevtoolsComponent implements OnInit {
1668
1493
  */
1669
1494
  executeQuery(selection: QueryDevtoolsSelection, allowCache: boolean): void;
1670
1495
  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
1496
  copyReport(entry: QueryDevtoolsEntry, query: AnyQuery): void;
1677
- /** Copies one query as an Insomnia collection, for `Import > From Clipboard`. */
1678
1497
  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
1498
  copyCurlRequest(entry: QueryDevtoolsEntry, query: AnyQuery): void;
1684
- /** Copies the GraphQL document as displayed — dedented, so it pastes straight into a playground. */
1685
1499
  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
1500
  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
1501
  copyableRouteTitle(entry: QueryDevtoolsEntry, query: AnyQuery): string;
1693
- /** Copies {@link copyableRoute} - the endpoint on its own, where the exports are a whole document. */
1694
1502
  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
1503
  downloadInsomniaCollection(items: {
1700
1504
  entry: QueryDevtoolsEntry;
1701
1505
  query: AnyQuery;
1702
1506
  }[], 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
1507
  protected downloadSession(): void;
1712
1508
  openResponseEditor(query: AnyQuery): void;
1713
1509
  openArgsEditor({ entry, query }: QueryDevtoolsSelection): void;
@@ -1720,32 +1516,14 @@ declare class QueryDevtoolsComponent implements OnInit {
1720
1516
  clearForced(query: AnyQuery): void;
1721
1517
  refetchCacheEntry(entry: QueryRepositoryCacheEntry): void;
1722
1518
  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
1519
  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
1520
  toggleCacheValue(clientName: string, key: string): void;
1733
1521
  isCacheValueExpanded(clientName: string, key: string): boolean;
1734
1522
  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
1523
  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
1524
  cachePersistence(entry: QueryRepositoryCacheEntry): string;
1745
- /** How many responses this client has on disk, which is usually more than it has in memory. */
1746
1525
  persistedCount(client: QueryClient): number;
1747
1526
  clearPersistedQueries(client: QueryClient): void;
1748
- /** The path + query of a request URL (origin stripped), for readable cache/event identifiers. */
1749
1527
  requestPath(url: string): string;
1750
1528
  asStack(entry: QueryDevtoolsEntry): AnyQueryStack;
1751
1529
  asPagedStack(entry: QueryDevtoolsEntry): AnyPagedQueryStack;
@@ -1753,17 +1531,8 @@ declare class QueryDevtoolsComponent implements OnInit {
1753
1531
  asBatch(entry: QueryDevtoolsEntry): AnyQueryBatch;
1754
1532
  asAuth(entry: QueryDevtoolsEntry): AnyBearerAuthProvider;
1755
1533
  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
1534
  socketMessages(ws: WebSocketDevtoolsHandle): WebSocketDevtoolsMessage[];
1761
- /** How the message log labels a direction: what the client sent, versus what the server pushed. */
1762
1535
  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
1536
  emitSocketMessage(options: {
1768
1537
  entry: QueryDevtoolsEntry;
1769
1538
  event: string;
@@ -1771,98 +1540,50 @@ declare class QueryDevtoolsComponent implements OnInit {
1771
1540
  }): void;
1772
1541
  socketEmitErrorFor(entryId: string): string | null;
1773
1542
  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
1543
  queriesDrivenByForm(entry: QueryDevtoolsEntry): QueryLink[];
1779
- /** The reverse: the forms whose value a query's args read. */
1780
1544
  formsDrivingQuery(entry: QueryDevtoolsEntry): QueryDevtoolsEntry[];
1781
1545
  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
1546
  refreshesFor(entryId: string): {
1787
1547
  id: number;
1788
1548
  timestamp: number;
1789
1549
  label: string;
1790
1550
  }[];
1791
- /** What asked for a refresh, on one line. */
1792
1551
  causeLabel(cause: QueryRefreshCause): string;
1793
- /** Derives the per-step status of a sequence step from its live progress signals. */
1794
1552
  sequenceStepStatus(sequence: QuerySequence<unknown[]>, index: number): QuerySequenceStatus;
1795
1553
  authTokenPayload(auth: AnyBearerAuthProvider): Record<string, unknown> | null;
1796
1554
  queriesForStack(stack: AnyQueryStack | AnyPagedQueryStack): QueryLink[];
1797
1555
  authQueryKeys(auth: AnyBearerAuthProvider): string[];
1798
- /** Where this tab stands on one lock, as a chip. @see lockRows */
1799
1556
  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
1557
  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
1558
  authTokenLifetime(entry: QueryDevtoolsEntry): QueryDevtoolsTokenLifetime;
1811
1559
  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
1560
  stepSnapshot(sequence: QuerySequence<unknown[]>, index: number): AnyQuerySnapshot | null;
1814
1561
  toggleQueryGroup(key: string): void;
1815
1562
  expandQueryGroup(key: string): void;
1816
1563
  isStepExpanded(entryId: string, index: number): boolean;
1817
1564
  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
1565
  batchRouteSegments(entry: QueryDevtoolsEntry): RouteSegment[];
1820
1566
  batchOf(entry: QueryDevtoolsEntry): QueryDevtoolsEntry | null;
1821
1567
  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
1568
  batchItemQueryId(entry: QueryDevtoolsEntry, index: number): string | null;
1827
1569
  batchItems(entry: QueryDevtoolsEntry): BatchItemView;
1828
1570
  batchThroughput(batch: AnyQueryBatch): string | null;
1829
1571
  isBatchItemExpanded(entryId: string, index: number): boolean;
1830
1572
  toggleBatchItem(entryId: string, index: number): void;
1831
- /** Dedents a GraphQL document (template-literal indentation) for readable display. */
1832
1573
  gqlDocument(doc: string): string;
1833
1574
  featureLabel(type: string): string;
1834
- /** A feature and its options on one line, for a report or a chip's tooltip. */
1835
1575
  featureSummary(feature: QueryDevtoolsFeature): string;
1836
- /** The features of the client behind a cache tab card, or `null` for a client without any. */
1837
1576
  clientFeatures(client: QueryClient | null | undefined): QueryDevtoolsFeature[] | null;
1838
1577
  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
1578
  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
1579
  locateQuery(entry: QueryDevtoolsEntry): void;
1850
- /** Downloads a file a tab generated. @see QueryDevtoolsHost.downloadTextFile */
1851
1580
  downloadTextFile(file: {
1852
1581
  name: string;
1853
1582
  content: string;
1854
1583
  type: string;
1855
1584
  }): 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
- */
1585
+ eventQueryId(event: EventLogItem): string | null;
1861
1586
  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
1587
  private argsRouteSegments;
1867
1588
  private renderRoute;
1868
1589
  /**
@@ -1871,40 +1592,16 @@ declare class QueryDevtoolsComponent implements OnInit {
1871
1592
  * the platform offers no way to ask for one's own client id.
1872
1593
  */
1873
1594
  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
1595
  private steppedDiffPair;
1892
1596
  private diffEnds;
1893
1597
  private isTabPrimary;
1894
- /** Moves the panel into a pop-up whose document has finished loading. @see popOut */
1895
1598
  private mountPopOut;
1896
1599
  /**
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.
1600
+ * The chrome tokens as the app resolves them now: the pop-out has no ancestor carrying the host theme.
1601
+ * Empty on a browser that does not enumerate custom properties.
1904
1602
  */
1905
1603
  private chromeTokens;
1906
1604
  private inlineStyleOf;
1907
- /** Whether a `<head>` child carries CSS the pop-out needs a copy of. */
1908
1605
  private isStyleNode;
1909
1606
  /**
1910
1607
  * Copies the host document's stylesheets into the pop-up and keeps mirroring them while it is
@@ -1913,53 +1610,19 @@ declare class QueryDevtoolsComponent implements OnInit {
1913
1610
  * over there - so a one-time copy would leave everything first used after the pop-out unstyled.
1914
1611
  */
1915
1612
  private syncStylesInto;
1916
- /** Brings the panel back into the host element and closes the window it was living in. */
1917
1613
  private dockBack;
1918
- /** A registered query as a row that opens the detail drawer. */
1919
1614
  private queryLinkFor;
1920
- /** The activity of one entry, or the total of a group of them (a stack's queries, a whole tab). */
1921
1615
  private activityOf;
1922
- /** An activity summary on one line, for a report. `null` for a query that has not run. */
1923
1616
  private activitySummary;
1924
- /** {@link routeSegments} as a plain string, for the places that cannot render markup. */
1925
1617
  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
1618
  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
1619
  private insomniaTokenRefreshes;
1937
1620
  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
1621
  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
1622
  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
1623
  private insomniaHeaders;
1955
1624
  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
1625
  private sessionAuthQueryKeys;
1962
- /** Every registered entry, described by whatever its kind carries. */
1963
1626
  private sessionEntries;
1964
1627
  private sessionQuery;
1965
1628
  private sessionActivity;
@@ -1975,37 +1638,20 @@ declare class QueryDevtoolsComponent implements OnInit {
1975
1638
  private sessionSocket;
1976
1639
  private sessionEvents;
1977
1640
  private sessionFaults;
1978
- /** Only the armed ones: a capture taken while the panel was answering requests has to say which. */
1979
1641
  private sessionMocks;
1980
1642
  private downloadFile;
1981
1643
  private stepKey;
1982
1644
  private paneSize;
1983
- /** The panel's size is the distance from the pointer to the edge it is docked to. */
1984
1645
  private applyResize;
1985
- /** A pane's size is the distance from the pointer to the container edge that pane sits against. */
1986
1646
  private applyPaneResize;
1987
1647
  private closePopup;
1988
1648
  private updateInspectHover;
1989
1649
  private selectInspectedQuery;
1990
1650
  private selectionKey;
1991
- /** Writes to the clipboard and ticks `copied` on success. `html` is omitted for plain-text payloads. */
1992
1651
  private writeToClipboard;
1993
1652
  private responseStatus;
1994
1653
  private findQuery;
1995
1654
  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
1655
  private measureResponse;
2010
1656
  private refreshedRequestOf;
2011
1657
  private pushEventItem;
@@ -2016,7 +1662,7 @@ declare class QueryDevtoolsComponent implements OnInit {
2016
1662
  declare const QUERY_DEVTOOLS_IMPORTS: readonly [typeof QueryDevtoolsComponent];
2017
1663
 
2018
1664
  /** The version of `@ethlete/query-devtools` this build was cut from. */
2019
- declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.13";
1665
+ declare const QUERY_DEVTOOLS_VERSION = "1.0.0-next.14";
2020
1666
 
2021
1667
  export { QUERY_DEVTOOLS_IMPORTS, QUERY_DEVTOOLS_VERSION, QueryDevtoolsAboutComponent, QueryDevtoolsComponent, QueryDevtoolsJsonComponent, QueryDevtoolsJsonStylesComponent, QueryDevtoolsSettingsComponent, QueryDevtoolsTimelineStylesComponent, clampFloatToPeek, kindOf, resizedFloatRect, settledFloatRect };
2022
1668
  export type { JsonKind };