@reticlehq/browser 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +5 -0
- package/dist/actions/actions.d.ts +1 -1
- package/dist/actions/actions.d.ts.map +1 -1
- package/dist/actions/actions.js +37 -19
- package/dist/actions/actions.js.map +1 -1
- package/dist/commands/commands.d.ts +2 -0
- package/dist/commands/commands.d.ts.map +1 -1
- package/dist/commands/commands.js +20 -6
- package/dist/commands/commands.js.map +1 -1
- package/dist/dom/a11y.d.ts +17 -6
- package/dist/dom/a11y.d.ts.map +1 -1
- package/dist/dom/a11y.js +68 -32
- package/dist/dom/a11y.js.map +1 -1
- package/dist/dom/auto-anchor.d.ts +10 -10
- package/dist/dom/auto-anchor.js +10 -10
- package/dist/dom/blind-spots.d.ts +14 -0
- package/dist/dom/blind-spots.d.ts.map +1 -0
- package/dist/dom/blind-spots.js +30 -0
- package/dist/dom/blind-spots.js.map +1 -0
- package/dist/dom/chart.d.ts +93 -0
- package/dist/dom/chart.d.ts.map +1 -0
- package/dist/dom/chart.js +119 -0
- package/dist/dom/chart.js.map +1 -0
- package/dist/dom/dom-ignore.d.ts.map +1 -1
- package/dist/dom/dom-ignore.js +7 -2
- package/dist/dom/dom-ignore.js.map +1 -1
- package/dist/dom/query.d.ts +17 -4
- package/dist/dom/query.d.ts.map +1 -1
- package/dist/dom/query.js +185 -30
- package/dist/dom/query.js.map +1 -1
- package/dist/dom/refs.d.ts +25 -2
- package/dist/dom/refs.d.ts.map +1 -1
- package/dist/dom/refs.js +78 -3
- package/dist/dom/refs.js.map +1 -1
- package/dist/dom/snapshot.d.ts +6 -0
- package/dist/dom/snapshot.d.ts.map +1 -1
- package/dist/dom/snapshot.js +6 -1
- package/dist/dom/snapshot.js.map +1 -1
- package/dist/dom/source.d.ts +40 -0
- package/dist/dom/source.d.ts.map +1 -0
- package/dist/dom/source.js +59 -0
- package/dist/dom/source.js.map +1 -0
- package/dist/dom/theme.js +2 -2
- package/dist/dom/theme.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/observers/blind-spots.d.ts +19 -0
- package/dist/observers/blind-spots.d.ts.map +1 -0
- package/dist/observers/blind-spots.js +89 -0
- package/dist/observers/blind-spots.js.map +1 -0
- package/dist/observers/console.d.ts.map +1 -1
- package/dist/observers/console.js +39 -6
- package/dist/observers/console.js.map +1 -1
- package/dist/observers/dom.d.ts.map +1 -1
- package/dist/observers/dom.js +68 -9
- package/dist/observers/dom.js.map +1 -1
- package/dist/observers/focus.d.ts +10 -0
- package/dist/observers/focus.d.ts.map +1 -0
- package/dist/observers/focus.js +49 -0
- package/dist/observers/focus.js.map +1 -0
- package/dist/observers/network-body.d.ts +19 -0
- package/dist/observers/network-body.d.ts.map +1 -0
- package/dist/observers/network-body.js +143 -0
- package/dist/observers/network-body.js.map +1 -0
- package/dist/observers/network-redact.d.ts +8 -0
- package/dist/observers/network-redact.d.ts.map +1 -0
- package/dist/observers/network-redact.js +66 -0
- package/dist/observers/network-redact.js.map +1 -0
- package/dist/observers/network.d.ts +13 -6
- package/dist/observers/network.d.ts.map +1 -1
- package/dist/observers/network.js +288 -162
- package/dist/observers/network.js.map +1 -1
- package/dist/observers/route.d.ts.map +1 -1
- package/dist/observers/route.js +15 -9
- package/dist/observers/route.js.map +1 -1
- package/dist/observers/scroll.d.ts.map +1 -1
- package/dist/observers/scroll.js +35 -8
- package/dist/observers/scroll.js.map +1 -1
- package/dist/observers/state.d.ts +20 -0
- package/dist/observers/state.d.ts.map +1 -0
- package/dist/observers/state.js +87 -0
- package/dist/observers/state.js.map +1 -0
- package/dist/observers/storage.d.ts +9 -0
- package/dist/observers/storage.d.ts.map +1 -1
- package/dist/observers/storage.js +105 -3
- package/dist/observers/storage.js.map +1 -1
- package/dist/observers/types.d.ts +15 -0
- package/dist/observers/types.d.ts.map +1 -1
- package/dist/observers/types.js +29 -1
- package/dist/observers/types.js.map +1 -1
- package/dist/patching/capture-method.d.ts +27 -0
- package/dist/patching/capture-method.d.ts.map +1 -0
- package/dist/patching/capture-method.js +37 -0
- package/dist/patching/capture-method.js.map +1 -0
- package/dist/presenter/presenter-config.d.ts +3 -3
- package/dist/presenter/presenter-config.d.ts.map +1 -1
- package/dist/presenter/presenter-config.js +3 -3
- package/dist/presenter/presenter-config.js.map +1 -1
- package/dist/presenter/presenter-controls.d.ts +1 -1
- package/dist/presenter/presenter-controls.d.ts.map +1 -1
- package/dist/presenter/presenter-controls.js +3 -3
- package/dist/presenter/presenter-controls.js.map +1 -1
- package/dist/presenter/presenter-glow.d.ts +1 -1
- package/dist/presenter/presenter-glow.js +1 -1
- package/dist/presenter/presenter-styles.d.ts +1 -1
- package/dist/presenter/presenter-styles.d.ts.map +1 -1
- package/dist/presenter/presenter-styles.js +12 -3
- package/dist/presenter/presenter-styles.js.map +1 -1
- package/dist/presenter/presenter.d.ts +4 -4
- package/dist/presenter/presenter.d.ts.map +1 -1
- package/dist/presenter/presenter.js +5 -5
- package/dist/presenter/presenter.js.map +1 -1
- package/dist/recorder/recorder.d.ts +8 -8
- package/dist/recorder/recorder.d.ts.map +1 -1
- package/dist/recorder/recorder.js +9 -9
- package/dist/recorder/recorder.js.map +1 -1
- package/dist/registry/capabilities.d.ts +2 -2
- package/dist/registry/capabilities.d.ts.map +1 -1
- package/dist/registry/capabilities.js +1 -1
- package/dist/registry/capabilities.js.map +1 -1
- package/dist/registry/domains.d.ts +1 -1
- package/dist/registry/domains.js +1 -1
- package/dist/registry/emitter.d.ts +2 -2
- package/dist/registry/emitter.js +2 -2
- package/dist/registry/store-adapters.d.ts +128 -0
- package/dist/registry/store-adapters.d.ts.map +1 -0
- package/dist/registry/store-adapters.js +135 -0
- package/dist/registry/store-adapters.js.map +1 -0
- package/dist/registry/stores.d.ts +38 -2
- package/dist/registry/stores.d.ts.map +1 -1
- package/dist/registry/stores.js +109 -8
- package/dist/registry/stores.js.map +1 -1
- package/dist/reticle.d.ts +22 -3
- package/dist/reticle.d.ts.map +1 -1
- package/dist/reticle.js +79 -13
- package/dist/reticle.js.map +1 -1
- package/dist/review/annotator.js +1 -1
- package/dist/review/annotator.js.map +1 -1
- package/dist/review/mark-anchor.d.ts.map +1 -1
- package/dist/review/mark-anchor.js +1 -21
- package/dist/review/mark-anchor.js.map +1 -1
- package/dist/security/serialization.d.ts +29 -3
- package/dist/security/serialization.d.ts.map +1 -1
- package/dist/security/serialization.js +169 -28
- package/dist/security/serialization.js.map +1 -1
- package/dist/timers/clock.d.ts +13 -0
- package/dist/timers/clock.d.ts.map +1 -1
- package/dist/timers/clock.js +76 -6
- package/dist/timers/clock.js.map +1 -1
- package/dist/transport/transport.d.ts +1 -1
- package/dist/transport/transport.d.ts.map +1 -1
- package/dist/transport/transport.js +42 -4
- package/dist/transport/transport.js.map +1 -1
- package/package.json +7 -3
package/dist/dom/query.js
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
1
|
import { queryAllByRole, queryAllByText, queryAllByLabelText, queryAllByPlaceholderText, queryAllByTestId, queryAllByAltText, } from '@testing-library/dom';
|
|
2
|
-
import { ElementState, QueryBy, } from '@reticlehq/core';
|
|
3
|
-
import { describe, getStates } from './a11y.js';
|
|
2
|
+
import { DATA_RETICLE_SOURCE_ATTR, ElementState, QueryBy, REDACTED_VALUE, TRANSPORT_LIMITS, } from '@reticlehq/core';
|
|
3
|
+
import { describe, getStates, isVisible } from './a11y.js';
|
|
4
|
+
import { isSensitiveKey } from '../security/serialization.js';
|
|
4
5
|
import { getCapabilities } from '../registry/capabilities.js';
|
|
5
6
|
import { identifyComponent } from '../registry/adapters.js';
|
|
6
7
|
import { refs } from './refs.js';
|
|
7
8
|
const TESTID_ATTR = 'data-testid';
|
|
8
|
-
const SOURCE_ATTR =
|
|
9
|
+
const SOURCE_ATTR = DATA_RETICLE_SOURCE_ATTR;
|
|
9
10
|
const MAX_PRESENT_TESTIDS = 12;
|
|
10
11
|
/** Bound the fiber-walk fallback so a component-name query can't scan an unbounded DOM. */
|
|
11
12
|
const MAX_COMPONENT_CANDIDATES = 2000;
|
|
12
13
|
/** Likely-actionable elements considered when resolving a component anchor without a source stamp. */
|
|
13
|
-
const COMPONENT_CANDIDATE_SELECTOR =
|
|
14
|
+
const COMPONENT_CANDIDATE_SELECTOR = `[${SOURCE_ATTR}], [${TESTID_ATTR}], button, a, input, select, textarea, [role]`;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a scope to its container. A container of `null` means a scope was GIVEN but resolved to
|
|
17
|
+
* nothing (unmounted, or a selector that matches no element) — the caller must NOT fall back to the
|
|
18
|
+
* whole page, or a scoped query silently widens into a phantom match. `scope === undefined` (no scope)
|
|
19
|
+
* legitimately searches the body.
|
|
20
|
+
*/
|
|
14
21
|
function resolveContainer(scope) {
|
|
15
|
-
const body = document.body;
|
|
16
22
|
if (scope === undefined)
|
|
17
|
-
return body;
|
|
23
|
+
return { container: document.body, scopeMissing: false };
|
|
18
24
|
const byRef = refs.resolve(scope);
|
|
19
25
|
if (byRef instanceof HTMLElement)
|
|
20
|
-
return byRef;
|
|
26
|
+
return { container: byRef, scopeMissing: false };
|
|
21
27
|
try {
|
|
22
28
|
const found = document.querySelector(scope);
|
|
23
29
|
if (found instanceof HTMLElement)
|
|
24
|
-
return found;
|
|
30
|
+
return { container: found, scopeMissing: false };
|
|
25
31
|
}
|
|
26
32
|
catch {
|
|
27
|
-
// invalid selector —
|
|
33
|
+
// invalid selector — treat as a missing scope, never a whole-page search
|
|
28
34
|
}
|
|
29
|
-
return
|
|
35
|
+
return { container: null, scopeMissing: true };
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
32
38
|
* Resolve an element by its SOURCE location — the precise, granular auto-anchor. The babel plugin
|
|
@@ -74,9 +80,8 @@ function findByComponent(container, query) {
|
|
|
74
80
|
}
|
|
75
81
|
return [];
|
|
76
82
|
}
|
|
77
|
-
/** Run the appropriate Testing-Library query
|
|
78
|
-
function
|
|
79
|
-
const container = resolveContainer(query.scope);
|
|
83
|
+
/** Run the appropriate Testing-Library query against ONE root (light DOM or a shadow root). */
|
|
84
|
+
function findIn(container, query) {
|
|
80
85
|
const by = query.by;
|
|
81
86
|
const value = query.value;
|
|
82
87
|
// Explicit `by`+`value` form.
|
|
@@ -95,7 +100,7 @@ function findCandidates(query) {
|
|
|
95
100
|
case QueryBy.ALT:
|
|
96
101
|
return queryAllByAltText(container, value, { exact: false });
|
|
97
102
|
case QueryBy.COMPONENT:
|
|
98
|
-
// value is the component name
|
|
103
|
+
// value is the component name;.source (if present) still takes precedence inside.
|
|
99
104
|
return findByComponent(container, { ...query, component: query.component ?? value });
|
|
100
105
|
default:
|
|
101
106
|
return [];
|
|
@@ -127,25 +132,163 @@ function findCandidates(query) {
|
|
|
127
132
|
return queryAllByAltText(container, query.alt, { exact: false });
|
|
128
133
|
return [];
|
|
129
134
|
}
|
|
130
|
-
|
|
131
|
-
|
|
135
|
+
/**
|
|
136
|
+
* Every open shadow root at or beneath `root`, in document order.
|
|
137
|
+
*
|
|
138
|
+
* A closed root is deliberately unreachable — `element.shadowRoot` is null by design, and the SDK
|
|
139
|
+
* reports that as a blind spot rather than pretending to see through it.
|
|
140
|
+
*/
|
|
141
|
+
function openShadowRootsUnder(root) {
|
|
142
|
+
const found = [];
|
|
143
|
+
const walk = (node) => {
|
|
144
|
+
for (const el of node.querySelectorAll('*')) {
|
|
145
|
+
const shadow = el.shadowRoot;
|
|
146
|
+
if (shadow !== null) {
|
|
147
|
+
found.push(shadow);
|
|
148
|
+
walk(shadow); // nested web components
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
walk(root);
|
|
153
|
+
return found;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* NOTE ON COST. The walk above is a `querySelectorAll('*')` over the container, and `reticle_query` is
|
|
157
|
+
* a hot-path tool, so every query on every app pays it — including the overwhelming majority that hold
|
|
158
|
+
* no web components.
|
|
159
|
+
*
|
|
160
|
+
* A cache invalidated by a MutationObserver was written and then REMOVED, because it is not sound:
|
|
161
|
+
* `attachShadow` on an element that is already in the document mutates only the shadow tree, which an
|
|
162
|
+
* observer watching documentElement's subtree never sees. The cached "no shadow roots here" would
|
|
163
|
+
* persist and the content would be silently missed — a false negative indistinguishable from a genuinely
|
|
164
|
+
* absent element, which is the exact bug the piercing was added to fix.
|
|
165
|
+
*
|
|
166
|
+
* Correctness wins until there is a measurement saying the walk actually matters. The allocation is
|
|
167
|
+
* avoided (iterate the live NodeList rather than copying it); the traversal itself stays.
|
|
168
|
+
*/
|
|
169
|
+
/**
|
|
170
|
+
* Run the query against the light DOM AND every open shadow root beneath the scope.
|
|
171
|
+
*
|
|
172
|
+
* Testing Library only walks the light DOM, so a control inside a web component returned zero matches
|
|
173
|
+
* on a completely healthy page — a miss indistinguishable from a genuinely absent element. The
|
|
174
|
+
* snapshot has always pierced open roots; this makes `query` agree with it.
|
|
175
|
+
*/
|
|
176
|
+
function findCandidates(query) {
|
|
177
|
+
const { container, scopeMissing } = resolveContainer(query.scope);
|
|
178
|
+
// A given-but-missing scope searches NOTHING — never the whole page. The empty result plus the
|
|
179
|
+
// scopeMissing flag is what keeps "gone scope" distinct from "absent element".
|
|
180
|
+
if (container === null)
|
|
181
|
+
return { candidates: [], scopeMissing: true };
|
|
182
|
+
const seen = new Set();
|
|
183
|
+
const out = [];
|
|
184
|
+
const collect = (els) => {
|
|
185
|
+
for (const el of els) {
|
|
186
|
+
if (seen.has(el))
|
|
187
|
+
continue; // reachable from both host and root — count once
|
|
188
|
+
seen.add(el);
|
|
189
|
+
out.push(el);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
collect(findIn(container, query));
|
|
193
|
+
for (const shadow of openShadowRootsUnder(container)) {
|
|
194
|
+
// A ShadowRoot is a DocumentFragment; the Testing-Library queries accept any HTMLElement-like
|
|
195
|
+
// container, and every call site below only reads from it.
|
|
196
|
+
collect(findIn(shadow, query));
|
|
197
|
+
}
|
|
198
|
+
return { candidates: out, scopeMissing };
|
|
199
|
+
}
|
|
200
|
+
/** Longest attribute value returned; one enormous href must not blow the response budget. */
|
|
201
|
+
export const ATTR_VALUE_MAX = 512;
|
|
202
|
+
/** Most attributes projected per element — a guard against a caller asking for everything. */
|
|
203
|
+
const ATTR_KEYS_MAX = 12;
|
|
204
|
+
/**
|
|
205
|
+
* Read the requested attributes off an element.
|
|
206
|
+
*
|
|
207
|
+
* Absent attributes are OMITTED rather than returned empty, so "not present" and "present but blank"
|
|
208
|
+
* stay distinguishable. Credential-bearing names are redacted with the same rule the network and
|
|
209
|
+
* storage paths use — a projection API must not become an exfiltration path.
|
|
210
|
+
*/
|
|
211
|
+
function projectAttrs(el, keys) {
|
|
212
|
+
const out = {};
|
|
213
|
+
for (const key of keys.slice(0, ATTR_KEYS_MAX)) {
|
|
214
|
+
const raw = el.getAttribute(key);
|
|
215
|
+
if (raw === null)
|
|
216
|
+
continue;
|
|
217
|
+
out[key] = isSensitiveKey(key) ? REDACTED_VALUE : raw.slice(0, ATTR_VALUE_MAX);
|
|
218
|
+
}
|
|
219
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
132
220
|
}
|
|
133
|
-
|
|
134
|
-
|
|
221
|
+
function inState(el, state, memo) {
|
|
222
|
+
return getStates(el, isVisible(el, memo)).includes(state);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* How many matches are DESCRIBED, however many are found.
|
|
226
|
+
*
|
|
227
|
+
* describe() is the expensive part of a query: it resolves the accessible name and forces a style
|
|
228
|
+
* computation for every ancestor to decide visibility. Describing every match on a page with
|
|
229
|
+
* thousands of them freezes the main thread for seconds — and then the wire discards all but the
|
|
230
|
+
* first `MAX_COLLECTION_ITEMS` anyway, so the work past that point was never observable by anyone.
|
|
231
|
+
* Matching one to the other means the cost of a broad query is bounded by the transport rather than
|
|
232
|
+
* by the size of the page.
|
|
233
|
+
*/
|
|
234
|
+
const MAX_DESCRIBED = TRANSPORT_LIMITS.MAX_COLLECTION_ITEMS;
|
|
235
|
+
/**
|
|
236
|
+
* Match an element predicate against the live DOM.
|
|
237
|
+
*
|
|
238
|
+
* `count` is every match; `elements` is the described prefix. Keeping those separate is what lets
|
|
239
|
+
* "how many?" stay exact while the answer stays affordable.
|
|
240
|
+
*/
|
|
241
|
+
export function matchQuery(query, state, limit = MAX_DESCRIBED) {
|
|
135
242
|
let elements;
|
|
243
|
+
let scopeMissing = false;
|
|
136
244
|
try {
|
|
137
|
-
|
|
245
|
+
const found = findCandidates(query);
|
|
246
|
+
elements = found.candidates;
|
|
247
|
+
scopeMissing = found.scopeMissing;
|
|
138
248
|
}
|
|
139
249
|
catch {
|
|
140
250
|
elements = [];
|
|
141
251
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
252
|
+
// One visibility cache for the whole (synchronous) query pass. isVisible is an O(depth) forced-style
|
|
253
|
+
// walk; the state filter runs it over EVERY candidate (the count must be exact) — on a match-heavy
|
|
254
|
+
// page (e.g. a 3k-row grid) that is tens of thousands of getComputedStyle calls on the host's main
|
|
255
|
+
// thread. The memo makes each element's ancestors resolve once, then short-circuit for every sibling.
|
|
256
|
+
const visMemo = new Map();
|
|
257
|
+
const filtered = state === undefined ? elements : elements.filter((el) => inState(el, state, visMemo));
|
|
258
|
+
const attrs = query.attrs;
|
|
259
|
+
const described = filtered.slice(0, Math.max(0, Math.min(limit, MAX_DESCRIBED)));
|
|
260
|
+
const descriptors = described.map((el) => {
|
|
261
|
+
const base = describe(el, visMemo);
|
|
262
|
+
if (attrs === undefined || attrs.length === 0)
|
|
263
|
+
return base;
|
|
264
|
+
const projected = projectAttrs(el, attrs);
|
|
265
|
+
return projected === undefined ? base : { ...base, attrs: projected };
|
|
266
|
+
});
|
|
267
|
+
return {
|
|
268
|
+
matched: filtered.length > 0,
|
|
269
|
+
count: filtered.length,
|
|
270
|
+
elements: descriptors,
|
|
271
|
+
...(scopeMissing ? { scopeMissing: true } : {}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/** Resolve `aria-labelledby` (one or more element IDs) to the referenced elements' text — a bare ID is
|
|
275
|
+
* not a human-readable name. Undefined when unset or nothing resolves. */
|
|
276
|
+
function resolveLabelledBy(el) {
|
|
277
|
+
const ids = el.getAttribute('aria-labelledby');
|
|
278
|
+
if (ids === null)
|
|
279
|
+
return undefined;
|
|
280
|
+
const text = ids
|
|
281
|
+
.split(/\s+/)
|
|
282
|
+
.map((id) => id.length > 0 ? (el.ownerDocument.getElementById(id)?.textContent?.trim() ?? '') : '')
|
|
283
|
+
.filter((t) => t.length > 0)
|
|
284
|
+
.join(' ');
|
|
285
|
+
return text.length > 0 ? text : undefined;
|
|
145
286
|
}
|
|
146
287
|
/** Structural clusters of the page — the successor to the raw testid list in zero-match hints. */
|
|
147
288
|
function buildPresentRegions(query) {
|
|
148
|
-
|
|
289
|
+
// For the diagnostic hint we WANT the page's orientation even when the scope is gone, so fall back
|
|
290
|
+
// to the body here (the match path above already reported scopeMissing, so this can't mask it).
|
|
291
|
+
const container = resolveContainer(query.scope).container ?? document.body;
|
|
149
292
|
const regions = [];
|
|
150
293
|
const CONTAINER_ROLES = [
|
|
151
294
|
'list',
|
|
@@ -175,7 +318,7 @@ function buildPresentRegions(query) {
|
|
|
175
318
|
}
|
|
176
319
|
for (const el of containers) {
|
|
177
320
|
const name = el.getAttribute('aria-label') ??
|
|
178
|
-
el
|
|
321
|
+
resolveLabelledBy(el) ?? // aria-labelledby is an element ID — resolve it to the referenced TEXT
|
|
179
322
|
el.getAttribute('data-testid') ??
|
|
180
323
|
undefined;
|
|
181
324
|
const children = el.querySelectorAll('[role]');
|
|
@@ -204,7 +347,7 @@ function buildPresentRegions(query) {
|
|
|
204
347
|
}
|
|
205
348
|
/** Diagnostic hint for a zero-match query: what testids ARE present in the searched scope. */
|
|
206
349
|
function buildEmptyHint(query) {
|
|
207
|
-
const container = resolveContainer(query.scope);
|
|
350
|
+
const container = resolveContainer(query.scope).container ?? document.body;
|
|
208
351
|
const all = container.querySelectorAll(`[${TESTID_ATTR}]`);
|
|
209
352
|
const present = [];
|
|
210
353
|
for (const el of Array.from(all)) {
|
|
@@ -225,12 +368,24 @@ function buildEmptyHint(query) {
|
|
|
225
368
|
knownEmptyState,
|
|
226
369
|
};
|
|
227
370
|
}
|
|
228
|
-
/**
|
|
229
|
-
|
|
230
|
-
|
|
371
|
+
/**
|
|
372
|
+
* Resolve a query to descriptors for the `query` MCP tool.
|
|
373
|
+
*
|
|
374
|
+
* `count` is carried through deliberately: the server reports match totals from it rather than from
|
|
375
|
+
* the array, because the array is capped in transit. Dropping it here — which this function used to
|
|
376
|
+
* do — silently put the server back to counting survivors and calling that the answer.
|
|
377
|
+
*/
|
|
378
|
+
export function runQuery(query, limit) {
|
|
379
|
+
const result = matchQuery(query, undefined, limit);
|
|
380
|
+
const scopeFields = result.scopeMissing === true ? { scopeMissing: true } : {};
|
|
231
381
|
if (result.elements.length === 0) {
|
|
232
|
-
return {
|
|
382
|
+
return {
|
|
383
|
+
elements: result.elements,
|
|
384
|
+
count: result.count,
|
|
385
|
+
hint: buildEmptyHint(query),
|
|
386
|
+
...scopeFields,
|
|
387
|
+
};
|
|
233
388
|
}
|
|
234
|
-
return { elements: result.elements };
|
|
389
|
+
return { elements: result.elements, count: result.count, ...scopeFields };
|
|
235
390
|
}
|
|
236
391
|
//# sourceMappingURL=query.js.map
|
package/dist/dom/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/dom/query.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/dom/query.ts"],"names":[],"mappings":"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"}
|
package/dist/dom/refs.d.ts
CHANGED
|
@@ -1,13 +1,36 @@
|
|
|
1
|
+
import { type Ref } from '@reticlehq/core';
|
|
1
2
|
/**
|
|
2
3
|
* Stable, human-meaningful element handles. Each element gets a ref like `e7`; the same
|
|
3
4
|
* element keeps its ref across snapshots, and a ref re-resolves to its element as long as
|
|
4
5
|
* the element is still in the document.
|
|
5
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* How many ref -> element entries are retained.
|
|
9
|
+
*
|
|
10
|
+
* The forward map is weak, so elements are always collectable; this bounds the BOOKKEEPING, which was
|
|
11
|
+
* not. Refs are minted far more often than an agent asks about them — every meaningful DOM addition,
|
|
12
|
+
* every transitionend, every scroll reveal — and the only eviction used to be "the agent happened to
|
|
13
|
+
* resolve this exact dead ref". A busy app over a long session therefore accumulated entries for
|
|
14
|
+
* elements that had been garbage for hours.
|
|
15
|
+
*
|
|
16
|
+
* Sized generously because eviction is not free of consequence (see refFor): the useful lifetime of a
|
|
17
|
+
* ref is one agent turn, and this is far more than any one turn produces.
|
|
18
|
+
*/
|
|
19
|
+
export declare const MAX_TRACKED_REFS = 10000;
|
|
6
20
|
export declare class RefRegistry {
|
|
7
21
|
#private;
|
|
22
|
+
/** How many reverse entries are currently retained. Exposed so the bound can be asserted. */
|
|
23
|
+
get size(): number;
|
|
8
24
|
/** Get the existing ref for an element, or mint a new one. */
|
|
9
|
-
refFor(el: Element):
|
|
10
|
-
/**
|
|
25
|
+
refFor(el: Element): Ref;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a ref back to its element, or null if it's gone/detached.
|
|
28
|
+
*
|
|
29
|
+
* Takes a plain `string` ON PURPOSE: this is the untrusted-input path — the ref comes from the agent
|
|
30
|
+
* over the wire, and a miss is answered with null rather than an error. Requiring a branded Ref here
|
|
31
|
+
* would force a meaningless cast at every wire boundary and buy nothing; the brand's value is on the
|
|
32
|
+
* MINT (refFor) so our own code cannot pass, say, a sessionId where a handle is expected.
|
|
33
|
+
*/
|
|
11
34
|
resolve(ref: string): Element | null;
|
|
12
35
|
}
|
|
13
36
|
/** Process-wide registry shared by snapshot, query, and the action executor. */
|
package/dist/dom/refs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/dom/refs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,WAAW;;
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/dom/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAClD;;;;GAIG;AACH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAWtC,qBAAa,WAAW;;IAMtB,6FAA6F;IAC7F,IAAI,IAAI,IAAI,MAAM,CAEjB;IAmBD,8DAA8D;IAC9D,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,GAAG;IA4BxB;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAerC;AAED,gFAAgF;AAChF,eAAO,MAAM,IAAI,aAAoB,CAAC"}
|
package/dist/dom/refs.js
CHANGED
|
@@ -1,24 +1,94 @@
|
|
|
1
|
+
import { asRef } from '@reticlehq/core';
|
|
1
2
|
/**
|
|
2
3
|
* Stable, human-meaningful element handles. Each element gets a ref like `e7`; the same
|
|
3
4
|
* element keeps its ref across snapshots, and a ref re-resolves to its element as long as
|
|
4
5
|
* the element is still in the document.
|
|
5
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* How many ref -> element entries are retained.
|
|
9
|
+
*
|
|
10
|
+
* The forward map is weak, so elements are always collectable; this bounds the BOOKKEEPING, which was
|
|
11
|
+
* not. Refs are minted far more often than an agent asks about them — every meaningful DOM addition,
|
|
12
|
+
* every transitionend, every scroll reveal — and the only eviction used to be "the agent happened to
|
|
13
|
+
* resolve this exact dead ref". A busy app over a long session therefore accumulated entries for
|
|
14
|
+
* elements that had been garbage for hours.
|
|
15
|
+
*
|
|
16
|
+
* Sized generously because eviction is not free of consequence (see refFor): the useful lifetime of a
|
|
17
|
+
* ref is one agent turn, and this is far more than any one turn produces.
|
|
18
|
+
*/
|
|
19
|
+
export const MAX_TRACKED_REFS = 10000;
|
|
20
|
+
/**
|
|
21
|
+
* Full-sweep cadence. The deref-sweep is O(retained), and a page legitimately holding ≥ MAX_TRACKED_REFS
|
|
22
|
+
* live elements (a 10k-node dashboard) can never get under the cap that way, so running it on EVERY mint
|
|
23
|
+
* over the cap turned each mint into a 10k-entry scan — measured 264µs vs 0.20µs (1,300x) on the app's
|
|
24
|
+
* main thread, ~2.6% of it forever on a churning page. The cap is instead held by an O(1) oldest-drop per
|
|
25
|
+
* over-cap mint, and the expensive dead-entry sweep runs once per this many mints (amortized O(1)).
|
|
26
|
+
*/
|
|
27
|
+
const SWEEP_EVERY_MINTS = 1000;
|
|
6
28
|
export class RefRegistry {
|
|
7
29
|
#toRef = new WeakMap();
|
|
8
30
|
#fromRef = new Map();
|
|
9
31
|
#seq = 0;
|
|
32
|
+
#mintsSinceSweep = 0;
|
|
33
|
+
/** How many reverse entries are currently retained. Exposed so the bound can be asserted. */
|
|
34
|
+
get size() {
|
|
35
|
+
return this.#fromRef.size;
|
|
36
|
+
}
|
|
37
|
+
/** O(1): drop the least-recently-minted reverse entry. Map iterates in insertion order, so the front
|
|
38
|
+
* is the oldest. A still-live element whose entry is dropped re-registers on its next refFor. */
|
|
39
|
+
#evictOldest() {
|
|
40
|
+
const oldest = this.#fromRef.keys().next();
|
|
41
|
+
if (oldest.done !== true)
|
|
42
|
+
this.#fromRef.delete(oldest.value);
|
|
43
|
+
}
|
|
44
|
+
/** Full pass: drop every entry whose element has been collected or detached (frees genuinely dead
|
|
45
|
+
* bookkeeping), then any remaining excess by age. Amortized — called once per SWEEP_EVERY_MINTS. */
|
|
46
|
+
#sweep() {
|
|
47
|
+
for (const [ref, weak] of this.#fromRef) {
|
|
48
|
+
const el = weak.deref();
|
|
49
|
+
if (el === undefined || !el.isConnected)
|
|
50
|
+
this.#fromRef.delete(ref);
|
|
51
|
+
}
|
|
52
|
+
while (this.#fromRef.size > MAX_TRACKED_REFS)
|
|
53
|
+
this.#evictOldest();
|
|
54
|
+
}
|
|
10
55
|
/** Get the existing ref for an element, or mint a new one. */
|
|
11
56
|
refFor(el) {
|
|
12
57
|
const existing = this.#toRef.get(el);
|
|
13
|
-
if (existing !== undefined)
|
|
58
|
+
if (existing !== undefined) {
|
|
59
|
+
// Re-register if this element's entry was evicted while it was off the agent's radar. Without
|
|
60
|
+
// this, an element that is still on the page could hold a ref that no longer resolves — the
|
|
61
|
+
// eviction would surface as "element not found", which is a wrong answer rather than a slow one.
|
|
62
|
+
// Either way, TOUCH it to the recent end (LRU): an element being surfaced right now must not be
|
|
63
|
+
// the oldest-drop victim of a mint storm before the agent gets to act on it.
|
|
64
|
+
const weak = this.#fromRef.get(existing);
|
|
65
|
+
this.#fromRef.delete(existing);
|
|
66
|
+
this.#fromRef.set(existing, weak ?? new WeakRef(el));
|
|
14
67
|
return existing;
|
|
68
|
+
}
|
|
15
69
|
this.#seq += 1;
|
|
16
|
-
const ref = `e${String(this.#seq)}
|
|
70
|
+
const ref = asRef(`e${String(this.#seq)}`);
|
|
17
71
|
this.#toRef.set(el, ref);
|
|
18
72
|
this.#fromRef.set(ref, new WeakRef(el));
|
|
73
|
+
// Keep bounded cheaply on every mint; run the full dead-entry sweep only periodically.
|
|
74
|
+
this.#mintsSinceSweep += 1;
|
|
75
|
+
if (this.#mintsSinceSweep >= SWEEP_EVERY_MINTS) {
|
|
76
|
+
this.#mintsSinceSweep = 0;
|
|
77
|
+
this.#sweep();
|
|
78
|
+
}
|
|
79
|
+
else if (this.#fromRef.size > MAX_TRACKED_REFS) {
|
|
80
|
+
this.#evictOldest();
|
|
81
|
+
}
|
|
19
82
|
return ref;
|
|
20
83
|
}
|
|
21
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* Resolve a ref back to its element, or null if it's gone/detached.
|
|
86
|
+
*
|
|
87
|
+
* Takes a plain `string` ON PURPOSE: this is the untrusted-input path — the ref comes from the agent
|
|
88
|
+
* over the wire, and a miss is answered with null rather than an error. Requiring a branded Ref here
|
|
89
|
+
* would force a meaningless cast at every wire boundary and buy nothing; the brand's value is on the
|
|
90
|
+
* MINT (refFor) so our own code cannot pass, say, a sessionId where a handle is expected.
|
|
91
|
+
*/
|
|
22
92
|
resolve(ref) {
|
|
23
93
|
const weak = this.#fromRef.get(ref);
|
|
24
94
|
if (weak === undefined)
|
|
@@ -28,6 +98,11 @@ export class RefRegistry {
|
|
|
28
98
|
this.#fromRef.delete(ref);
|
|
29
99
|
return null;
|
|
30
100
|
}
|
|
101
|
+
// LRU touch: a ref the agent just resolved is in ACTIVE use — move it to the most-recent end so an
|
|
102
|
+
// oldest-drop eviction between this resolve and the follow-up act can't reclaim it and turn a live
|
|
103
|
+
// element into a false "ref no longer resolves". O(1) — Map preserves insertion order.
|
|
104
|
+
this.#fromRef.delete(ref);
|
|
105
|
+
this.#fromRef.set(ref, weak);
|
|
31
106
|
return el;
|
|
32
107
|
}
|
|
33
108
|
}
|
package/dist/dom/refs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/dom/refs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACb,MAAM,GAAG,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/dom/refs.ts"],"names":[],"mappings":"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"}
|
package/dist/dom/snapshot.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface SnapshotResult {
|
|
|
9
9
|
status: SnapshotStatus;
|
|
10
10
|
nodes: number;
|
|
11
11
|
truncated: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* True when a `scope` was given but resolved to nothing. The snapshot then covers NOTHING rather
|
|
14
|
+
* than silently falling back to the whole page — an agent snapshotting "the modal" after it closed
|
|
15
|
+
* must not receive the entire page as if it were the modal.
|
|
16
|
+
*/
|
|
17
|
+
scopeMissing?: boolean;
|
|
12
18
|
}
|
|
13
19
|
interface SnapshotOptions {
|
|
14
20
|
scope?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/dom/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyC7D,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/dom/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAyC7D,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAmJD,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAiC3E"}
|
package/dist/dom/snapshot.js
CHANGED
|
@@ -169,8 +169,13 @@ export function buildSnapshot(options = {}) {
|
|
|
169
169
|
const scopeEl = options.scope !== undefined
|
|
170
170
|
? (refs.resolve(options.scope) ?? document.querySelector(options.scope))
|
|
171
171
|
: document.body;
|
|
172
|
-
|
|
172
|
+
// A given-but-missing scope snapshots NOTHING and says so — never a silent whole-page fallback.
|
|
173
|
+
const scopeMissing = options.scope !== undefined && !(scopeEl instanceof Element);
|
|
174
|
+
const root = scopeEl instanceof Element ? scopeEl : document.body;
|
|
173
175
|
const status = buildStatus(root);
|
|
176
|
+
if (scopeMissing) {
|
|
177
|
+
return { tree: '', status, nodes: 0, truncated: false, scopeMissing: true };
|
|
178
|
+
}
|
|
174
179
|
if (mode === SnapshotMode.STATUS) {
|
|
175
180
|
return { tree: '', status, nodes: 0, truncated: false };
|
|
176
181
|
}
|
package/dist/dom/snapshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/dom/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,QAAQ;IACR,MAAM;IACN,SAAS;IACT,UAAU;IACV,OAAO;IACP,UAAU;IACV,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,KAAK;IACL,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE/F,gFAAgF;AAChF,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB;;;;;GAKG;AACH,SAAS,UAAU,CAAC,EAAW;IAC7B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,oBAAoB;YAAE,GAAG,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9E,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/dom/snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where an element is defined in the codebase.
|
|
3
|
+
*
|
|
4
|
+
* This is the single most valuable thing Reticle can hand an agent that has to fix what Reticle just
|
|
5
|
+
* found. Locating the right FILE is what turns a report into an edit; without it the agent pays for a
|
|
6
|
+
* search loop that the instrumentation already knows the answer to.
|
|
7
|
+
*
|
|
8
|
+
* Two lookups, because the callers have very different cost budgets:
|
|
9
|
+
*
|
|
10
|
+
* sourceFromDom — reads the babel-stamped `data-reticle-source` off the nearest ancestor. One
|
|
11
|
+
* native upward walk, bounded by tree depth. Safe to call per element on paths
|
|
12
|
+
* that describe many elements at once (query results, snapshots).
|
|
13
|
+
* sourceFor — prefers a framework adapter's answer (which knows the component that RENDERED
|
|
14
|
+
* the element, not just the nearest stamped host) and falls back to the DOM. The
|
|
15
|
+
* adapter path walks the fiber tree, so this belongs on single-element paths
|
|
16
|
+
* (inspect, act, review) and not in a loop.
|
|
17
|
+
*
|
|
18
|
+
* Both report source independently of how the element is ANCHORED. Anchor answers "how do I find this
|
|
19
|
+
* again", source answers "where is it written" — collapsing the two once meant that adding a
|
|
20
|
+
* data-testid, which Reticle's own docs recommend, silently removed the source pointer.
|
|
21
|
+
*/
|
|
22
|
+
export interface SourceLocation {
|
|
23
|
+
file: string;
|
|
24
|
+
line: number;
|
|
25
|
+
}
|
|
26
|
+
/** Parse a `data-reticle-source="file:line:column"` value into `{ file, line }` (column dropped). */
|
|
27
|
+
export declare function parseSourceAttr(value: string | null): SourceLocation | undefined;
|
|
28
|
+
/** The nearest babel-stamped source at or above this element. Cheap enough to call in bulk. */
|
|
29
|
+
export declare function sourceFromDom(el: Element): SourceLocation | undefined;
|
|
30
|
+
/** Best source for the element: the framework adapter's, else the nearest babel-stamped attribute. */
|
|
31
|
+
export declare function sourceFor(el: Element, adapterSource: SourceLocation | undefined): SourceLocation | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* `file:line` — the form an agent can act on directly.
|
|
34
|
+
*
|
|
35
|
+
* Deliberately a single compact string rather than an object: it costs a couple of dozen bytes on a
|
|
36
|
+
* descriptor that may repeat hundreds of times in one response, and every consumer of it is either
|
|
37
|
+
* opening an editor or printing it.
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatSource(source: SourceLocation | undefined): string | undefined;
|
|
40
|
+
//# sourceMappingURL=source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/dom/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qGAAqG;AACrG,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,SAAS,CAQhF;AAED,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAGrE;AAED,sGAAsG;AACtG,wBAAgB,SAAS,CACvB,EAAE,EAAE,OAAO,EACX,aAAa,EAAE,cAAc,GAAG,SAAS,GACxC,cAAc,GAAG,SAAS,CAG5B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEnF"}
|