@enricai/barnacle 1.6.12 → 1.6.13

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.
Files changed (96) hide show
  1. package/README.md +113 -9
  2. package/dist/api/schemas/submissions.d.ts +14 -0
  3. package/dist/api/schemas/submissions.d.ts.map +1 -1
  4. package/dist/api/schemas/submissions.js +1 -0
  5. package/dist/api/schemas/submissions.js.map +1 -1
  6. package/dist/config.d.ts +33 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +4 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/lib/telemetry/beacon-capture.d.ts +45 -2
  11. package/dist/lib/telemetry/beacon-capture.d.ts.map +1 -1
  12. package/dist/lib/telemetry/beacon-capture.js +36 -0
  13. package/dist/lib/telemetry/beacon-capture.js.map +1 -1
  14. package/dist/lib/telemetry/reconciliation-record.d.ts +41 -1
  15. package/dist/lib/telemetry/reconciliation-record.d.ts.map +1 -1
  16. package/dist/lib/telemetry/reconciliation-record.js +29 -2
  17. package/dist/lib/telemetry/reconciliation-record.js.map +1 -1
  18. package/dist/lib/telemetry/reconciliation-source.d.ts +7 -1
  19. package/dist/lib/telemetry/reconciliation-source.d.ts.map +1 -1
  20. package/dist/lib/telemetry/reconciliation-source.js +21 -5
  21. package/dist/lib/telemetry/reconciliation-source.js.map +1 -1
  22. package/dist/lib/telemetry/run-telemetry.d.ts +67 -0
  23. package/dist/lib/telemetry/run-telemetry.d.ts.map +1 -0
  24. package/dist/lib/telemetry/run-telemetry.js +55 -0
  25. package/dist/lib/telemetry/run-telemetry.js.map +1 -0
  26. package/dist/lib/telemetry/submission-capture.d.ts +11 -4
  27. package/dist/lib/telemetry/submission-capture.d.ts.map +1 -1
  28. package/dist/lib/telemetry/submission-capture.js +1 -0
  29. package/dist/lib/telemetry/submission-capture.js.map +1 -1
  30. package/dist/lib/telemetry/submission-reader.d.ts +11 -3
  31. package/dist/lib/telemetry/submission-reader.d.ts.map +1 -1
  32. package/dist/lib/telemetry/submission-reader.js +32 -8
  33. package/dist/lib/telemetry/submission-reader.js.map +1 -1
  34. package/dist/lib/tracking-click.d.ts.map +1 -1
  35. package/dist/lib/tracking-click.js +19 -0
  36. package/dist/lib/tracking-click.js.map +1 -1
  37. package/dist/plugins/loader.d.ts +20 -0
  38. package/dist/plugins/loader.d.ts.map +1 -1
  39. package/dist/plugins/loader.js +94 -17
  40. package/dist/plugins/loader.js.map +1 -1
  41. package/dist/scraper/deep-locator-actuate.d.ts +94 -0
  42. package/dist/scraper/deep-locator-actuate.d.ts.map +1 -0
  43. package/dist/scraper/deep-locator-actuate.js +216 -0
  44. package/dist/scraper/deep-locator-actuate.js.map +1 -0
  45. package/dist/scraper/deep-locator-candidates.d.ts +105 -18
  46. package/dist/scraper/deep-locator-candidates.d.ts.map +1 -1
  47. package/dist/scraper/deep-locator-candidates.js +238 -46
  48. package/dist/scraper/deep-locator-candidates.js.map +1 -1
  49. package/dist/scraper/deep-locator-click.d.ts +71 -0
  50. package/dist/scraper/deep-locator-click.d.ts.map +1 -0
  51. package/dist/scraper/deep-locator-click.js +71 -0
  52. package/dist/scraper/deep-locator-click.js.map +1 -0
  53. package/dist/scraper/deep-locator-fake.d.ts +344 -14
  54. package/dist/scraper/deep-locator-fake.d.ts.map +1 -1
  55. package/dist/scraper/deep-locator-fake.js +509 -7
  56. package/dist/scraper/deep-locator-fake.js.map +1 -1
  57. package/dist/scraper/deep-locator-scan.d.ts +220 -0
  58. package/dist/scraper/deep-locator-scan.d.ts.map +1 -0
  59. package/dist/scraper/deep-locator-scan.js +386 -0
  60. package/dist/scraper/deep-locator-scan.js.map +1 -0
  61. package/dist/scraper/fake-timer-advance.d.ts +47 -0
  62. package/dist/scraper/fake-timer-advance.d.ts.map +1 -0
  63. package/dist/scraper/fake-timer-advance.js +44 -0
  64. package/dist/scraper/fake-timer-advance.js.map +1 -0
  65. package/dist/scraper/flow-runner.d.ts +36 -1
  66. package/dist/scraper/flow-runner.d.ts.map +1 -1
  67. package/dist/scraper/flow-runner.js +354 -56
  68. package/dist/scraper/flow-runner.js.map +1 -1
  69. package/dist/scraper/frame-target.d.ts +28 -0
  70. package/dist/scraper/frame-target.d.ts.map +1 -1
  71. package/dist/scraper/frame-target.js +30 -0
  72. package/dist/scraper/frame-target.js.map +1 -1
  73. package/dist/scraper/session-browserbase.d.ts +13 -0
  74. package/dist/scraper/session-browserbase.d.ts.map +1 -1
  75. package/dist/scraper/session-browserbase.js +29 -0
  76. package/dist/scraper/session-browserbase.js.map +1 -1
  77. package/dist/scraper/session-ip.d.ts +69 -0
  78. package/dist/scraper/session-ip.d.ts.map +1 -0
  79. package/dist/scraper/session-ip.js +88 -0
  80. package/dist/scraper/session-ip.js.map +1 -0
  81. package/dist/scraper/session-shared.d.ts +9 -0
  82. package/dist/scraper/session-shared.d.ts.map +1 -1
  83. package/dist/scraper/session-shared.js.map +1 -1
  84. package/dist/scraper/submit-control.d.ts +14 -2
  85. package/dist/scraper/submit-control.d.ts.map +1 -1
  86. package/dist/scraper/submit-control.js +33 -2
  87. package/dist/scraper/submit-control.js.map +1 -1
  88. package/dist/scripts/recon-browser.d.ts.map +1 -1
  89. package/dist/scripts/recon-browser.js +32 -0
  90. package/dist/scripts/recon-browser.js.map +1 -1
  91. package/dist/site-plugin.d.ts +20 -0
  92. package/dist/site-plugin.d.ts.map +1 -1
  93. package/dist/testing/integration-runner.d.ts.map +1 -1
  94. package/dist/testing/integration-runner.js +6 -7
  95. package/dist/testing/integration-runner.js.map +1 -1
  96. package/package.json +1 -1
@@ -1,9 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DENSE_FORM_DECOY_TEXTS = exports.DENSE_FORM_TARGET_TEXT = exports.DENSE_FORM_TOTAL_COUNT = exports.NODE_NOT_ACTIONABLE_MESSAGE = void 0;
3
4
  exports.registerDeepLocatorHop = registerDeepLocatorHop;
4
5
  exports.registerDeepLocatorHopElements = registerDeepLocatorHopElements;
5
6
  exports.registerDeepLocatorHangingHop = registerDeepLocatorHangingHop;
7
+ exports.registerDeepLocatorHopLatency = registerDeepLocatorHopLatency;
6
8
  exports.makeFakeDeepLocator = makeFakeDeepLocator;
9
+ exports.makeFakeDomElement = makeFakeDomElement;
10
+ exports.makeSelectorAwareDomRoot = makeSelectorAwareDomRoot;
11
+ exports.buildDenseFormFixture = buildDenseFormFixture;
12
+ exports.makeFakeFrameScan = makeFakeFrameScan;
13
+ exports.makeFakeFrameClickByIndex = makeFakeFrameClickByIndex;
14
+ exports.makeFakeFrameFillByIndex = makeFakeFrameFillByIndex;
15
+ exports.makeFakeFrameSelectByIndex = makeFakeFrameSelectByIndex;
16
+ exports.makeFakeFrameResolutionPage = makeFakeFrameResolutionPage;
17
+ const vitest_1 = require("vitest");
7
18
  function buildHop(elements) {
8
19
  const first = elements[0];
9
20
  if (!first)
@@ -16,6 +27,9 @@ function buildHop(elements) {
16
27
  get filledWith() {
17
28
  return first.filledWith;
18
29
  },
30
+ get selectedWith() {
31
+ return first.selectedWith;
32
+ },
19
33
  get text() {
20
34
  return first.text;
21
35
  },
@@ -31,16 +45,30 @@ function registerDeepLocatorHop(frame, selector, text = "") {
31
45
  }
32
46
  /**
33
47
  * Registers a hop selector with N ordered candidate elements so
34
- * `deepLocator(selector).count()` resolves to `texts.length` and
48
+ * `deepLocator(selector).count()` resolves to `elements.length` and
35
49
  * `nth(i).textContent()`/`nth(i).click()`/`nth(i).fill()` act on element `i`
36
50
  * specifically — the shape a real cross-origin OOPIF hop resolves to when
37
51
  * more than one element matches the inner selector (e.g. `"*"` matching
38
52
  * every node in the iframe), which the single-element
39
- * {@link registerDeepLocatorHop} path can't model.
53
+ * {@link registerDeepLocatorHop} path can't model. Each entry is either a
54
+ * bare string (rendered, `visible: true`) or a
55
+ * {@link FakeDeepLocatorElementSpec} for a candidate that also needs
56
+ * non-default layout state — mixing both in one call models a hop where
57
+ * only some candidates have a layout box, same as a real dense OOPIF form.
40
58
  */
41
- function registerDeepLocatorHopElements(frame, selector, texts) {
42
- const elements = texts.map((text) => ({ clicks: 0, filledWith: null, text }));
43
- const hop = buildHop(elements);
59
+ function registerDeepLocatorHopElements(frame, selector, elements) {
60
+ const built = elements.map((entry) => {
61
+ const spec = typeof entry === "string" ? { text: entry } : entry;
62
+ return {
63
+ clicks: 0,
64
+ filledWith: null,
65
+ selectedWith: null,
66
+ text: spec.text,
67
+ visible: spec.visible ?? true,
68
+ tagName: spec.tagName,
69
+ };
70
+ });
71
+ const hop = buildHop(built);
44
72
  frame.set(selector, hop);
45
73
  return hop;
46
74
  }
@@ -72,6 +100,79 @@ function registerDeepLocatorHangingHop(frame, selector, options) {
72
100
  hangGates.set(hop, { hangOn, deferred });
73
101
  return { hop, release: deferred.resolve };
74
102
  }
103
+ /**
104
+ * Keyed by hop object (not selector), the same pattern {@link hangGates}
105
+ * uses, so a finite per-call delay travels with a hop's return value without
106
+ * widening {@link FakeDeepLocatorHop}'s public shape.
107
+ */
108
+ const latencyGates = new WeakMap();
109
+ /**
110
+ * Charges `repeats` sequential `delayMs` round-trips when `method` is
111
+ * registered against `hop`'s latency profile, immediate otherwise. `repeats`
112
+ * defaults to 1 (a flat per-call cost) — {@link buildFakeDelegate} passes
113
+ * `elementIndex + 1` for the methods that model Stagehand's per-index
114
+ * resolve cost (see {@link INDEXED_RESOLVE_METHODS}), everything else stays
115
+ * flat regardless of which index a caller chained `nth()` onto.
116
+ */
117
+ async function delayIfRegistered(hop, method, repeats = 1) {
118
+ const gate = hop ? latencyGates.get(hop) : undefined;
119
+ if (!gate?.delayOn.has(method))
120
+ return;
121
+ for (let call = 0; call < repeats; call += 1) {
122
+ await new Promise((resolve) => setTimeout(resolve, gate.delayMs));
123
+ }
124
+ }
125
+ /**
126
+ * Attaches a finite per-call delay to an already-registered hop's `delayOn`
127
+ * methods, leaving every other method — and every other hop — immediate.
128
+ * This is the seam a test uses to prove a batched fix collapses N serial
129
+ * round-trips into one: register the same `delayMs` against `"textContent"`/
130
+ * `"click"`/`"fill"`/`"selectOption"`/`"inputValue"` (the legacy per-index
131
+ * paths, charged `index + 1` times — see {@link INDEXED_RESOLVE_METHODS}) and
132
+ * `"scan"`/`"clickByIndex"` (the batched paths, always charged once) on the
133
+ * same hop, then compare how time scales
134
+ * with candidate count/index through each. Unlike
135
+ * {@link registerDeepLocatorHangingHop}, calls resolve on their own after
136
+ * `delayMs` — there is no `release()`.
137
+ */
138
+ function registerDeepLocatorHopLatency(hop, options) {
139
+ const delayOn = new Set(Array.isArray(options.delayOn) ? options.delayOn : [options.delayOn]);
140
+ latencyGates.set(hop, { delayOn, delayMs: options.delayMs });
141
+ }
142
+ /**
143
+ * The literal CDP error message a real `DOM.getBoxModel`/
144
+ * `DOM.scrollIntoViewIfNeeded` failure over "no layout object" arrives as
145
+ * (`understudy/cdp.js`) — exported so both this fake's click rejection and a
146
+ * consuming test assert against the same string bugfix-001's
147
+ * `isNodeNotActionableError` (`deep-locator-scan.ts`) matches.
148
+ */
149
+ exports.NODE_NOT_ACTIONABLE_MESSAGE = "-32000 Node does not have a layout object";
150
+ /**
151
+ * The delegate methods whose real cost scales with the resolved index:
152
+ * Stagehand 3.7.0's `resolveAtIndex(query, index)` calls
153
+ * `resolveAll(query, {limit: index + 1})`, whose `resolveCss` runs
154
+ * `for (let i = 0; i < limit; i += 1) { await this.evaluateElement(...) }`
155
+ * (`selectorResolver.js`) — one serial CDP `Runtime.evaluate` per index, so
156
+ * `nth(k)` pays `k + 1` round-trips, not one. `click()`/`textContent()` call
157
+ * `resolveAtIndex` directly; `fill()`/`selectOption()`/`inputValue()` route
158
+ * through `Locator.resolveNode() -> resolveAtIndex(query, index)` the same
159
+ * way, paying the identical `index + 1` cost — pinned against the installed
160
+ * `@browserbasehq/stagehand` in
161
+ * `deep-locator-stagehand-contract.test.ts`'s `Locator.fill/selectOption/
162
+ * inputValue route through resolveNode()` suite. A write/read-back actuation
163
+ * (`fillDeepLocatorCandidate` in `deep-locator-actuate.ts`: `fill()` then
164
+ * `inputValue()`) therefore pays `2 * (index + 1)` round-trips total, not one
165
+ * flat cost. `count()` resolves the whole match set once regardless of which
166
+ * index a caller later chains `nth()` onto, so it — and the batched
167
+ * `scan`/`clickByIndex` seams — stay a flat one-call cost.
168
+ */
169
+ const INDEXED_RESOLVE_METHODS = new Set([
170
+ "click",
171
+ "textContent",
172
+ "fill",
173
+ "selectOption",
174
+ "inputValue",
175
+ ]);
75
176
  /**
76
177
  * Builds a `deepLocator()`-shaped delegate resolving against `frame`, scoped
77
178
  * to a single `elementIndex` (defaulting to 0, matching the real delegate's
@@ -81,6 +182,14 @@ function registerDeepLocatorHangingHop(frame, selector, options) {
81
182
  * scenario) still resolves once registered. `count()` reports the hop's full
82
183
  * `elements.length` regardless of `elementIndex`, mirroring the real
83
184
  * delegate: `nth(i).count()` still reports the total match count, not `1`.
185
+ * `click()`/`fill()`/`selectOption()` each reject with
186
+ * {@link NODE_NOT_ACTIONABLE_MESSAGE} when the targeted element's `visible`
187
+ * is `false`, reproducing the CDP `-32000` actuation failure on an
188
+ * unrendered node. `click()`/`textContent()`/`fill()`/`selectOption()`/
189
+ * `inputValue()` charge `elementIndex + 1` delay units under a registered
190
+ * latency profile (see {@link INDEXED_RESOLVE_METHODS}), modeling
191
+ * Stagehand's per-index resolve cost — `count()` and the batched
192
+ * `scan`/`clickByIndex` seams stay a flat one-call cost.
84
193
  */
85
194
  function buildFakeDelegate(frame, selector, elementIndex = 0) {
86
195
  const requireElement = () => {
@@ -96,19 +205,50 @@ function buildFakeDelegate(frame, selector, elementIndex = 0) {
96
205
  if (gate?.hangOn.has(method))
97
206
  await gate.deferred.promise;
98
207
  };
208
+ const delayForMethod = (method) => delayIfRegistered(frame.get(selector), method, INDEXED_RESOLVE_METHODS.has(method) ? elementIndex + 1 : 1);
99
209
  return {
100
210
  count: async () => {
211
+ await delayForMethod("count");
101
212
  await awaitReleaseIfHungOn("count");
102
213
  return frame.get(selector)?.elements.length ?? 0;
103
214
  },
104
215
  click: async () => {
216
+ await delayForMethod("click");
105
217
  await awaitReleaseIfHungOn("click");
106
- requireElement().clicks += 1;
218
+ const element = requireElement();
219
+ if (!element.visible)
220
+ throw new Error(exports.NODE_NOT_ACTIONABLE_MESSAGE);
221
+ element.clicks += 1;
107
222
  },
108
223
  fill: async (value) => {
109
- requireElement().filledWith = value;
224
+ await delayForMethod("fill");
225
+ await awaitReleaseIfHungOn("fill");
226
+ const element = requireElement();
227
+ if (!element.visible)
228
+ throw new Error(exports.NODE_NOT_ACTIONABLE_MESSAGE);
229
+ element.filledWith = value;
230
+ },
231
+ selectOption: async (values) => {
232
+ await delayForMethod("selectOption");
233
+ await awaitReleaseIfHungOn("selectOption");
234
+ const element = requireElement();
235
+ if (!element.visible)
236
+ throw new Error(exports.NODE_NOT_ACTIONABLE_MESSAGE);
237
+ if (element.tagName !== undefined && element.tagName !== "select") {
238
+ throw new Error(exports.NODE_NOT_ACTIONABLE_MESSAGE);
239
+ }
240
+ const selected = Array.isArray(values) ? values : [values];
241
+ element.selectedWith = selected;
242
+ return selected;
243
+ },
244
+ inputValue: async () => {
245
+ await delayForMethod("inputValue");
246
+ await awaitReleaseIfHungOn("inputValue");
247
+ const element = requireElement();
248
+ return element.readBackValue ?? element.selectedWith?.[0] ?? element.filledWith ?? "";
110
249
  },
111
250
  textContent: async () => {
251
+ await delayForMethod("textContent");
112
252
  await awaitReleaseIfHungOn("textContent");
113
253
  return requireElement().text;
114
254
  },
@@ -125,4 +265,366 @@ function buildFakeDelegate(frame, selector, elementIndex = 0) {
125
265
  function makeFakeDeepLocator(frame) {
126
266
  return (selector) => buildFakeDelegate(frame, selector);
127
267
  }
268
+ /** Parses one simple-selector clause — a bare tag, `[attr]`, or `[attr=value]` — the three shapes {@link INTERACTIVE_CANDIDATE_SELECTOR} composes via commas. No combinators, descendant selectors, or pseudo-classes: the generated expression only ever calls `querySelectorAll` with a flat, comma-joined clause list. */
269
+ function parseSimpleSelectorClause(clause) {
270
+ const trimmed = clause.trim();
271
+ const attrMatch = /^\[([a-zA-Z-]+)(?:=(.*))?\]$/.exec(trimmed);
272
+ if (!attrMatch)
273
+ return { tag: trimmed.toLowerCase() };
274
+ const [, attr, rawValue] = attrMatch;
275
+ const value = rawValue === undefined ? null : rawValue.replace(/^["']|["']$/g, "");
276
+ return { attr: attr ?? "", value };
277
+ }
278
+ /** Matches `el` against one comma-separated clause of a selector — the attribute-aware step {@link makeSelectorAwareDomRoot}'s `querySelectorAll` and {@link makeFakeDomElement}'s `closest` both need beyond a bare tag-name comparison. */
279
+ function matchesSelectorClause(el, clause) {
280
+ const parsed = parseSimpleSelectorClause(clause);
281
+ if ("tag" in parsed)
282
+ return el.tagName.toLowerCase() === parsed.tag;
283
+ const attrValue = el.getAttribute(parsed.attr);
284
+ if (attrValue === null)
285
+ return false;
286
+ return parsed.value === null || attrValue === parsed.value;
287
+ }
288
+ /** `true` when `el` matches any comma-separated clause of `selector` — the full `querySelectorAll(selector)` predicate. */
289
+ function matchesSelector(el, selector) {
290
+ return selector.split(",").some((clause) => matchesSelectorClause(el, clause));
291
+ }
292
+ /**
293
+ * Builds one fake DOM element. Defaults model a rendered, tag-less `div`
294
+ * with no accessible-name signal — the "structural filler" shape a dense
295
+ * form fixture needs many of — so a caller building a large fixture only
296
+ * spells out the overrides that make a specific element interesting.
297
+ */
298
+ function makeFakeDomElement(textContent = "", options = {}) {
299
+ const tagName = options.tagName ?? "div";
300
+ const attributes = options.attributes ?? {};
301
+ const rect = options.rect ?? { width: 100, height: 20 };
302
+ const computedStyle = options.computedStyle ?? { display: "block", visibility: "visible" };
303
+ const parent = options.parent ?? null;
304
+ const dispatchedEvents = [];
305
+ const el = {
306
+ textContent,
307
+ tagName,
308
+ attributes,
309
+ rect,
310
+ computedStyle,
311
+ parent,
312
+ value: options.value ?? "",
313
+ options: options.options ?? [],
314
+ dispatchedEvents,
315
+ getBoundingClientRect() {
316
+ return rect;
317
+ },
318
+ getAttribute(name) {
319
+ return attributes[name] ?? null;
320
+ },
321
+ closest(selector) {
322
+ const found = (node) => {
323
+ if (!node)
324
+ return null;
325
+ return matchesSelector(node, selector) ? node : found(node.parent);
326
+ };
327
+ return found(el);
328
+ },
329
+ dispatchEvent(event) {
330
+ dispatchedEvents.push(event.type);
331
+ return true;
332
+ },
333
+ focus() { },
334
+ };
335
+ return el;
336
+ }
337
+ /**
338
+ * Builds a selector-aware fake `document` root: `querySelectorAll` supports
339
+ * the exact clause shapes {@link INTERACTIVE_CANDIDATE_SELECTOR} needs (a
340
+ * bare tag, `[attr]`, `[attr=value]`, comma-joined, or `"*"`) instead of
341
+ * `deep-locator-scan.test.ts`'s tag-only `makeRoot`, so a fixture exercising
342
+ * that constant's `[role=button]` / `[tabindex]` clauses actually selects
343
+ * against them.
344
+ */
345
+ function makeSelectorAwareDomRoot(elements) {
346
+ return {
347
+ querySelectorAll(selector) {
348
+ if (selector.trim() === "*")
349
+ return [...elements];
350
+ return elements.filter((el) => matchesSelector(el, selector));
351
+ },
352
+ getElementById(id) {
353
+ return elements.find((el) => el.getAttribute("id") === id) ?? null;
354
+ },
355
+ };
356
+ }
357
+ /** Total node count {@link buildDenseFormFixture} produces — the live-measured `#talemetry_apply_iframe >> *` match count from the uchealth-7 bug report. */
358
+ exports.DENSE_FORM_TOTAL_COUNT = 371;
359
+ /** Accessible name {@link buildDenseFormFixture}'s icon-only target button resolves to — mirrors the live report's `button.c-SocialButton-button-25:has(svg[data-testid='EditIcon'])` control, modeled here as a plain icon-only `button` named via `aria-label` since `:has()` support is not what this fixture is for. */
360
+ exports.DENSE_FORM_TARGET_TEXT = "Manual Application";
361
+ /** Accessible names of {@link buildDenseFormFixture}'s two unrendered decoys — one `display:none`, one a 0x0 layout box — the two shapes a real click rejects with the CDP `-32000 Node does not have a layout object` error. */
362
+ exports.DENSE_FORM_DECOY_TEXTS = ["Upload a Resume/CV", "Use LinkedIn Profile"];
363
+ /**
364
+ * Builds the {@link DENSE_FORM_TOTAL_COUNT}-node dense-OOPIF-shaped fixture
365
+ * the uchealth-7 bug report measured (`#talemetry_apply_iframe >> *`
366
+ * matching 371 elements): mostly structural `div`/`span` filler, a handful
367
+ * of real form controls, an icon-only target button, and two unrendered
368
+ * decoys. Exported (not inlined per test file) so `test-002`'s Stagehand-
369
+ * resolver-contract pin can run the installed dependency's own resolver
370
+ * against the IDENTICAL fixture `deep-locator-scan.dense-form.test.ts`
371
+ * proves {@link buildScanFrameCandidatesExpr} against.
372
+ */
373
+ function buildDenseFormFixture() {
374
+ const [uploadDecoyText, linkedinDecoyText] = exports.DENSE_FORM_DECOY_TEXTS;
375
+ const structuralCount = exports.DENSE_FORM_TOTAL_COUNT -
376
+ 6 /* firstName, country, coverLetter, learnMore, saveDraft, moreOptions */ -
377
+ 1 /* target */ -
378
+ 2 /* decoys */;
379
+ const structural = Array.from({ length: structuralCount }, (_, index) => makeFakeDomElement("", { tagName: index % 2 === 0 ? "div" : "span" }));
380
+ const firstName = makeFakeDomElement("", {
381
+ tagName: "input",
382
+ attributes: { "aria-label": "First Name" },
383
+ });
384
+ const country = makeFakeDomElement("", {
385
+ tagName: "select",
386
+ attributes: { "aria-label": "Country" },
387
+ });
388
+ const coverLetter = makeFakeDomElement("", {
389
+ tagName: "textarea",
390
+ attributes: { "aria-label": "Cover Letter" },
391
+ });
392
+ const learnMore = makeFakeDomElement("Learn more", { tagName: "a", attributes: { href: "#" } });
393
+ const saveDraft = makeFakeDomElement("Save Draft", {
394
+ tagName: "div",
395
+ attributes: { role: "button" },
396
+ });
397
+ const moreOptions = makeFakeDomElement("More options", {
398
+ tagName: "div",
399
+ attributes: { tabindex: "0" },
400
+ });
401
+ const target = makeFakeDomElement("", {
402
+ tagName: "button",
403
+ attributes: { "aria-label": exports.DENSE_FORM_TARGET_TEXT },
404
+ });
405
+ const uploadDecoy = makeFakeDomElement(uploadDecoyText, {
406
+ tagName: "button",
407
+ computedStyle: { display: "none", visibility: "visible" },
408
+ });
409
+ const linkedinDecoy = makeFakeDomElement(linkedinDecoyText, {
410
+ tagName: "button",
411
+ rect: { width: 0, height: 0 },
412
+ });
413
+ const elements = [
414
+ ...structural,
415
+ firstName,
416
+ country,
417
+ coverLetter,
418
+ learnMore,
419
+ saveDraft,
420
+ moreOptions,
421
+ uploadDecoy,
422
+ linkedinDecoy,
423
+ target,
424
+ ];
425
+ return { root: makeSelectorAwareDomRoot(elements), elements };
426
+ }
427
+ /**
428
+ * Fake frame-scoped batched evaluate bound to `selector` — models the seam
429
+ * `resolveDeepLocatorCandidates`'s batched-scan fix calls once per frame via
430
+ * `FrameTarget.evaluate(buildScanFrameCandidatesExpr(innerSelector))`
431
+ * (`deep-locator-scan.ts`). Ignores whatever expression string it's called
432
+ * with — a fake cannot execute browser-side code, and `deep-locator-scan.
433
+ * test.ts`'s `node:vm` test is what proves the expression itself is correct
434
+ * — and instead returns the hop registered at `selector` as
435
+ * `FrameCandidateScanResult[]`, in registration order: the exact payload
436
+ * shape a real `Frame.evaluate` call resolves to. Pass the result into a
437
+ * fake `FrameTarget`'s `evaluate` field so a caller that reads through
438
+ * `target.evaluate(...)` resolves against fixture state instead of a
439
+ * browser.
440
+ */
441
+ function makeFakeFrameScan(frame, selector) {
442
+ return async () => {
443
+ const hop = frame.get(selector);
444
+ await delayIfRegistered(hop, "scan");
445
+ if (!hop)
446
+ return [];
447
+ return hop.elements.map((element, index) => ({
448
+ index,
449
+ text: element.text,
450
+ visible: element.visible,
451
+ }));
452
+ };
453
+ }
454
+ /**
455
+ * Fake frame-scoped batched click-by-index bound to `selector` — models the
456
+ * seam a click-by-index fix would call once per click via a single frame
457
+ * evaluate, instead of the legacy delegate's `nth(index).click()` walking
458
+ * `resolveAtIndex`'s serial per-index loop (see {@link INDEXED_RESOLVE_METHODS}).
459
+ * Same "ignore the expression string, resolve against the hop registry"
460
+ * contract as {@link makeFakeFrameScan}: a fake cannot execute browser-side
461
+ * code, so the `expression` argument is accepted (mirroring `evaluate`'s
462
+ * signature) but never inspected. Increments `elements[index].clicks` when
463
+ * the targeted element is registered and `visible`, so an assertion like
464
+ * `hop.elements[i]?.clicks` reads the same regardless of which click path a
465
+ * consumer routes through. Resolves `{ clicked: false, reason }` — never
466
+ * throws — when `index` doesn't resolve to a registered element (hop
467
+ * unregistered, or `index` out of range) or the element is `visible: false`.
468
+ */
469
+ function makeFakeFrameClickByIndex(frame, selector) {
470
+ return async (index) => {
471
+ const hop = frame.get(selector);
472
+ await delayIfRegistered(hop, "clickByIndex");
473
+ const element = hop?.elements[index];
474
+ if (!element)
475
+ return { clicked: false, reason: `deepLocator: no element at index ${index}` };
476
+ if (!element.visible)
477
+ return { clicked: false, reason: exports.NODE_NOT_ACTIONABLE_MESSAGE };
478
+ element.clicks += 1;
479
+ return { clicked: true };
480
+ };
481
+ }
482
+ /**
483
+ * Resolves a batched write against `hop.elements[index]`, shared by
484
+ * {@link makeFakeFrameFillByIndex} and {@link makeFakeFrameSelectByIndex}:
485
+ * `{ written: false, reason: "out-of-range" }` for an unregistered hop or an
486
+ * out-of-range index, `{ written: false, reason: "not-actionable" }` for a
487
+ * `visible: false` element (never throws, mirroring
488
+ * {@link buildFillFrameCandidateExpr}'s/{@link buildSelectFrameCandidateExpr}'s
489
+ * data-not-exception contract), otherwise writes `value` into `filledWith`
490
+ * and resolves `{ written: true, readBack }` — `readBack` honors
491
+ * `readBackValue` when set, the same "write that doesn't stick" override
492
+ * {@link buildFakeDelegate}'s `inputValue()` already applies.
493
+ */
494
+ function resolveFakeBatchedWrite(hop, index, value) {
495
+ const element = hop?.elements[index];
496
+ if (!element)
497
+ return { written: false, reason: "out-of-range" };
498
+ if (!element.visible)
499
+ return { written: false, reason: "not-actionable" };
500
+ element.filledWith = value;
501
+ return { written: true, readBack: element.readBackValue ?? value };
502
+ }
503
+ /**
504
+ * Fake frame-scoped batched fill-by-index bound to `selector` — models the
505
+ * seam a batched-fill fix would call once per fill via a single frame
506
+ * evaluate (`buildFillFrameCandidateExpr`, `deep-locator-scan.ts`), instead
507
+ * of the legacy delegate's `nth(index).fill()`. Same "ignore the expression
508
+ * string, resolve against the hop registry" contract as
509
+ * {@link makeFakeFrameClickByIndex}: the fake cannot execute browser-side
510
+ * code, so `expression` is accepted (mirroring the real seam's signature)
511
+ * but never inspected — `value` is passed explicitly since it's what a real
512
+ * expression bakes in rather than something the fake could read back out of
513
+ * a string it never parses. See {@link resolveFakeBatchedWrite} for the
514
+ * shared not-actionable/out-of-range/write contract.
515
+ */
516
+ function makeFakeFrameFillByIndex(frame, selector) {
517
+ return async (index, value) => {
518
+ const hop = frame.get(selector);
519
+ await delayIfRegistered(hop, "fillByIndex");
520
+ return resolveFakeBatchedWrite(hop, index, value);
521
+ };
522
+ }
523
+ /**
524
+ * Fake frame-scoped batched select-by-index bound to `selector` — models the
525
+ * seam a batched-select fix would call once per select via a single frame
526
+ * evaluate (`buildSelectFrameCandidateExpr`, `deep-locator-scan.ts`),
527
+ * instead of the legacy delegate's `nth(index).selectOption()`. Writes
528
+ * `optionValue` into the same `filledWith` field {@link makeFakeFrameFillByIndex}
529
+ * does rather than `selectedWith` — the real expression matches and reports a
530
+ * single option `value` (`FrameCandidateWriteResult.readBack` is one string,
531
+ * not the delegate's array-shaped `selectedWith`/multi-value `selectOption()`),
532
+ * so this batched primitive models the same single-value write shape as fill.
533
+ * Same "ignore the expression string" contract as
534
+ * {@link makeFakeFrameClickByIndex}; see {@link resolveFakeBatchedWrite} for
535
+ * the shared not-actionable/out-of-range/write contract.
536
+ */
537
+ function makeFakeFrameSelectByIndex(frame, selector) {
538
+ return async (index, optionValue) => {
539
+ const hop = frame.get(selector);
540
+ await delayIfRegistered(hop, "selectByIndex");
541
+ return resolveFakeBatchedWrite(hop, index, optionValue);
542
+ };
543
+ }
544
+ /**
545
+ * Matches `tryResolveChildFrame`'s iframe-src probe expression
546
+ * (`frame-target.ts:207-211`, `document.querySelector(<selector>)`-shaped)
547
+ * and extracts the CSS selector it was built with — a fake cannot execute
548
+ * browser-side code, so it reads the selector back out of the expression
549
+ * string instead, the same technique
550
+ * `deep-locator-candidates.internal-frame-resolution.test.ts`'s
551
+ * `makeIframeSrcProbe` already uses. The capture group matches a complete
552
+ * `JSON.stringify`-quoted string (escaped-char-or-non-quote, repeated) rather
553
+ * than a lazy `.+?` up to the first `)` — a selector containing its own
554
+ * parens (`:not(...)`, `:has(...)`, `:nth-child(...)`) would otherwise
555
+ * truncate the match at that inner `)` and leave unparsable JSON.
556
+ */
557
+ const IFRAME_SRC_PROBE_PATTERN = /document\.querySelector\(("(?:\\.|[^"\\])*")\)/;
558
+ function parseIframeSrcSelector(expression) {
559
+ const match = IFRAME_SRC_PROBE_PATTERN.exec(String(expression));
560
+ if (!match?.[1])
561
+ return null;
562
+ try {
563
+ return JSON.parse(match[1]);
564
+ }
565
+ catch {
566
+ return null;
567
+ }
568
+ }
569
+ /**
570
+ * Resolves `value` immediately (same-tick, no internal `await`, settling as
571
+ * a microtask) when `probeDelayMs` is `0`, or after a real `setTimeout` when
572
+ * positive. This is the exact dial that decides whether a fake wins or
573
+ * loses a `{ timeoutMs: 0 }` watchdog race: `withWatchdog`'s `Promise.race`
574
+ * (`watchdog.ts`) arms its own reject timer BEFORE the raced operation even
575
+ * starts, so any macrotask-settling probe loses to a zero-delay watchdog
576
+ * regardless of how small its own delay is — only a same-tick microtask
577
+ * resolve can win.
578
+ */
579
+ function resolveAfterProbeDelay(value, probeDelayMs) {
580
+ if (probeDelayMs <= 0)
581
+ return Promise.resolve(value);
582
+ return new Promise((resolve) => setTimeout(() => resolve(value), probeDelayMs));
583
+ }
584
+ /**
585
+ * Builds a fake top `Page` + single child `Frame` pair bound to
586
+ * `iframeSelector` — the shared instrument every OOPIF throughput fixture
587
+ * hand-rolls a variant of (`flow-runner.oopif-click-throughput.test.ts` et
588
+ * al.) but none of which can model production CDP latency at frame-
589
+ * RESOLUTION time: every one of those resolves both of
590
+ * `tryResolveChildFrame`'s probes with no internal `await`, a same-tick
591
+ * microtask that always wins a `{ timeoutMs: 0 }` watchdog race and
592
+ * therefore MASKS the production degrade this fake exists to make
593
+ * testable. `probeDelayMs: 0` (the default) reproduces those fixtures'
594
+ * timing exactly, so nothing that later adopts this factory sees a timing
595
+ * change; a positive value reproduces the production degrade those
596
+ * fixtures structurally cannot.
597
+ */
598
+ function makeFakeFrameResolutionPage(options) {
599
+ const probeDelayMs = options.probeDelayMs ?? 0;
600
+ const iframeProbeSpy = vitest_1.vi.fn();
601
+ const locationProbeSpy = vitest_1.vi.fn();
602
+ const childFrame = {
603
+ evaluate: async (expression) => {
604
+ if (expression === "location.href") {
605
+ locationProbeSpy(expression);
606
+ return resolveAfterProbeDelay(options.childSrc, probeDelayMs);
607
+ }
608
+ return (await options.onFrameEvaluate?.(expression)) ?? null;
609
+ },
610
+ locator: (selector) => ({ selector }),
611
+ };
612
+ const page = {
613
+ evaluate: async (expression) => {
614
+ iframeProbeSpy(expression);
615
+ const matched = parseIframeSrcSelector(expression) === options.iframeSelector;
616
+ return resolveAfterProbeDelay(matched ? { matched: true, src: options.childSrc } : { matched: false, src: null }, probeDelayMs);
617
+ },
618
+ url: () => "",
619
+ title: async () => "",
620
+ locator: (selector) => ({ selector }),
621
+ frames: () => [childFrame],
622
+ };
623
+ return {
624
+ page: page,
625
+ childFrame: childFrame,
626
+ iframeProbeSpy,
627
+ locationProbeSpy,
628
+ };
629
+ }
128
630
  //# sourceMappingURL=deep-locator-fake.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deep-locator-fake.js","sourceRoot":"","sources":["../../src/scraper/deep-locator-fake.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deep-locator-fake.js","sourceRoot":"","sources":["../../src/scraper/deep-locator-fake.ts"],"names":[],"mappings":"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"}