@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.
- package/README.md +113 -9
- package/dist/api/schemas/submissions.d.ts +14 -0
- package/dist/api/schemas/submissions.d.ts.map +1 -1
- package/dist/api/schemas/submissions.js +1 -0
- package/dist/api/schemas/submissions.js.map +1 -1
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/lib/telemetry/beacon-capture.d.ts +45 -2
- package/dist/lib/telemetry/beacon-capture.d.ts.map +1 -1
- package/dist/lib/telemetry/beacon-capture.js +36 -0
- package/dist/lib/telemetry/beacon-capture.js.map +1 -1
- package/dist/lib/telemetry/reconciliation-record.d.ts +41 -1
- package/dist/lib/telemetry/reconciliation-record.d.ts.map +1 -1
- package/dist/lib/telemetry/reconciliation-record.js +29 -2
- package/dist/lib/telemetry/reconciliation-record.js.map +1 -1
- package/dist/lib/telemetry/reconciliation-source.d.ts +7 -1
- package/dist/lib/telemetry/reconciliation-source.d.ts.map +1 -1
- package/dist/lib/telemetry/reconciliation-source.js +21 -5
- package/dist/lib/telemetry/reconciliation-source.js.map +1 -1
- package/dist/lib/telemetry/run-telemetry.d.ts +67 -0
- package/dist/lib/telemetry/run-telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry/run-telemetry.js +55 -0
- package/dist/lib/telemetry/run-telemetry.js.map +1 -0
- package/dist/lib/telemetry/submission-capture.d.ts +11 -4
- package/dist/lib/telemetry/submission-capture.d.ts.map +1 -1
- package/dist/lib/telemetry/submission-capture.js +1 -0
- package/dist/lib/telemetry/submission-capture.js.map +1 -1
- package/dist/lib/telemetry/submission-reader.d.ts +11 -3
- package/dist/lib/telemetry/submission-reader.d.ts.map +1 -1
- package/dist/lib/telemetry/submission-reader.js +32 -8
- package/dist/lib/telemetry/submission-reader.js.map +1 -1
- package/dist/lib/tracking-click.d.ts.map +1 -1
- package/dist/lib/tracking-click.js +19 -0
- package/dist/lib/tracking-click.js.map +1 -1
- package/dist/plugins/loader.d.ts +20 -0
- package/dist/plugins/loader.d.ts.map +1 -1
- package/dist/plugins/loader.js +94 -17
- package/dist/plugins/loader.js.map +1 -1
- package/dist/scraper/deep-locator-actuate.d.ts +94 -0
- package/dist/scraper/deep-locator-actuate.d.ts.map +1 -0
- package/dist/scraper/deep-locator-actuate.js +216 -0
- package/dist/scraper/deep-locator-actuate.js.map +1 -0
- package/dist/scraper/deep-locator-candidates.d.ts +105 -18
- package/dist/scraper/deep-locator-candidates.d.ts.map +1 -1
- package/dist/scraper/deep-locator-candidates.js +238 -46
- package/dist/scraper/deep-locator-candidates.js.map +1 -1
- package/dist/scraper/deep-locator-click.d.ts +71 -0
- package/dist/scraper/deep-locator-click.d.ts.map +1 -0
- package/dist/scraper/deep-locator-click.js +71 -0
- package/dist/scraper/deep-locator-click.js.map +1 -0
- package/dist/scraper/deep-locator-fake.d.ts +344 -14
- package/dist/scraper/deep-locator-fake.d.ts.map +1 -1
- package/dist/scraper/deep-locator-fake.js +509 -7
- package/dist/scraper/deep-locator-fake.js.map +1 -1
- package/dist/scraper/deep-locator-scan.d.ts +220 -0
- package/dist/scraper/deep-locator-scan.d.ts.map +1 -0
- package/dist/scraper/deep-locator-scan.js +386 -0
- package/dist/scraper/deep-locator-scan.js.map +1 -0
- package/dist/scraper/fake-timer-advance.d.ts +47 -0
- package/dist/scraper/fake-timer-advance.d.ts.map +1 -0
- package/dist/scraper/fake-timer-advance.js +44 -0
- package/dist/scraper/fake-timer-advance.js.map +1 -0
- package/dist/scraper/flow-runner.d.ts +36 -1
- package/dist/scraper/flow-runner.d.ts.map +1 -1
- package/dist/scraper/flow-runner.js +354 -56
- package/dist/scraper/flow-runner.js.map +1 -1
- package/dist/scraper/frame-target.d.ts +28 -0
- package/dist/scraper/frame-target.d.ts.map +1 -1
- package/dist/scraper/frame-target.js +30 -0
- package/dist/scraper/frame-target.js.map +1 -1
- package/dist/scraper/session-browserbase.d.ts +13 -0
- package/dist/scraper/session-browserbase.d.ts.map +1 -1
- package/dist/scraper/session-browserbase.js +29 -0
- package/dist/scraper/session-browserbase.js.map +1 -1
- package/dist/scraper/session-ip.d.ts +69 -0
- package/dist/scraper/session-ip.d.ts.map +1 -0
- package/dist/scraper/session-ip.js +88 -0
- package/dist/scraper/session-ip.js.map +1 -0
- package/dist/scraper/session-shared.d.ts +9 -0
- package/dist/scraper/session-shared.d.ts.map +1 -1
- package/dist/scraper/session-shared.js.map +1 -1
- package/dist/scraper/submit-control.d.ts +14 -2
- package/dist/scraper/submit-control.d.ts.map +1 -1
- package/dist/scraper/submit-control.js +33 -2
- package/dist/scraper/submit-control.js.map +1 -1
- package/dist/scripts/recon-browser.d.ts.map +1 -1
- package/dist/scripts/recon-browser.js +32 -0
- package/dist/scripts/recon-browser.js.map +1 -1
- package/dist/site-plugin.d.ts +20 -0
- package/dist/site-plugin.d.ts.map +1 -1
- package/dist/testing/integration-runner.d.ts.map +1 -1
- package/dist/testing/integration-runner.js +6 -7
- package/dist/testing/integration-runner.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-locator-click.d.ts","sourceRoot":"","sources":["../../src/scraper/deep-locator-click.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAElF,qJAAqJ;AACrJ,MAAM,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,oBAAoB,KAAK,OAAO,CAAC;AAElF,MAAM,WAAW,4BAA4B;IAC3C,iJAAiJ;IACjJ,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+DAA+D;AAC/D,MAAM,WAAW,4BAA4B;IAC3C,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,iHAAiH;IACjH,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACvC,4JAA4J;IAC5J,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,SAAS,oBAAoB,EAAE,EAC3C,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CAoBvC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Candidate-click cascade for `deep-locator-candidates.ts`'s ranked
|
|
4
|
+
* `DeepLocatorCandidate[]`: `flow-runner.ts` used to click only
|
|
5
|
+
* `deepLocatorCandidates[0]` (see the bug report's Issue #2), so a top pick
|
|
6
|
+
* that turned out to be unrendered — a click rejecting with the CDP `-32000
|
|
7
|
+
* Node does not have a layout object` error `isNodeNotActionableError`
|
|
8
|
+
* classifies — scored the whole attempt as a failed click instead of trying
|
|
9
|
+
* the next-ranked candidate. {@link clickFirstActionableCandidate} walks the
|
|
10
|
+
* list instead, so a not-actionable rejection or a caller-supplied deny hit
|
|
11
|
+
* costs only that one candidate, not the attempt.
|
|
12
|
+
*
|
|
13
|
+
* Extracted out of `flow-runner.ts` so the walk is unit-testable against a
|
|
14
|
+
* stub click function — no fake `Page`, no Stagehand — and so
|
|
15
|
+
* `flow-runner.ts`'s own edit stays a call swap (see `bugfix-005`).
|
|
16
|
+
*
|
|
17
|
+
* NOT IMPLEMENTED: escalating to Stagehand's `Locator.sendClickEvent()` (a
|
|
18
|
+
* layout-free actuation) as a rescue for a candidate that's genuinely never
|
|
19
|
+
* going to render. The report asks for skip-and-continue, not a rescue path.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.DEFAULT_CLICK_CANDIDATE_ATTEMPT_CAP = void 0;
|
|
23
|
+
exports.clickFirstActionableCandidate = clickFirstActionableCandidate;
|
|
24
|
+
const deep_locator_scan_1 = require("../scraper/deep-locator-scan");
|
|
25
|
+
/**
|
|
26
|
+
* Upper bound on how many candidates a single {@link clickFirstActionableCandidate}
|
|
27
|
+
* call will actually click. Denied candidates are skipped without a click and
|
|
28
|
+
* don't count against this cap — only a real `click()` invocation does — so a
|
|
29
|
+
* dense post-filter list (a handful of controls, per bugfix-002's visibility
|
|
30
|
+
* filter and bugfix-005's interactive scoping) still resolves in one or two
|
|
31
|
+
* attempts, while a pathological list (371 candidates, the uchealth-7
|
|
32
|
+
* measurement) can't spend the whole step budget clicking its way through
|
|
33
|
+
* every entry.
|
|
34
|
+
*/
|
|
35
|
+
exports.DEFAULT_CLICK_CANDIDATE_ATTEMPT_CAP = 5;
|
|
36
|
+
/**
|
|
37
|
+
* Walks `candidates` in rank order, clicking each via `click` until one
|
|
38
|
+
* succeeds. A candidate refused by `denyCandidate` is skipped without being
|
|
39
|
+
* clicked and doesn't count against `attemptCap`. A click rejection that
|
|
40
|
+
* {@link isNodeNotActionableError} classifies as "not actionable" (unrendered
|
|
41
|
+
* node) is treated as "skip this candidate, try the next"; any other
|
|
42
|
+
* rejection stops the walk immediately and rethrows, so a caller doesn't
|
|
43
|
+
* silently burn the remaining candidates on an error that had nothing to do
|
|
44
|
+
* with actionability (a detached frame, a wedged click's
|
|
45
|
+
* `WatchdogTimeoutError`). Never throws on exhaustion — an exhausted list
|
|
46
|
+
* (every candidate denied or not-actionable, or the cap reached) resolves to
|
|
47
|
+
* `{ clicked: false, candidate: null, triedSelectors }` instead.
|
|
48
|
+
*/
|
|
49
|
+
async function clickFirstActionableCandidate(candidates, click, options = {}) {
|
|
50
|
+
const attemptCap = options.attemptCap ?? exports.DEFAULT_CLICK_CANDIDATE_ATTEMPT_CAP;
|
|
51
|
+
const triedSelectors = [];
|
|
52
|
+
let attempts = 0;
|
|
53
|
+
for (const candidate of candidates) {
|
|
54
|
+
if (attempts >= attemptCap)
|
|
55
|
+
break;
|
|
56
|
+
if (options.denyCandidate?.(candidate))
|
|
57
|
+
continue;
|
|
58
|
+
attempts += 1;
|
|
59
|
+
triedSelectors.push(candidate.selector);
|
|
60
|
+
try {
|
|
61
|
+
await click(candidate);
|
|
62
|
+
return { clicked: true, candidate, triedSelectors };
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (!(0, deep_locator_scan_1.isNodeNotActionableError)(error))
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { clicked: false, candidate: null, triedSelectors };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=deep-locator-click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-locator-click.js","sourceRoot":"","sources":["../../src/scraper/deep-locator-click.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;;AAGH,mEAAuE;AAEvE;;;;;;;;;GASG;AACU,QAAA,mCAAmC,GAAG,CAAC,CAAC;AA+BrD;;;;;;;;;;;;GAYG;AACI,KAAK,wCACV,UAA2C,EAC3C,KAAuB,EACvB,OAAO,GAAiC,EAAE;IAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,QAAA,mCAAmC,CAAC;IAC7E,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,QAAQ,IAAI,UAAU;YAAE,MAAM;QAClC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC;YAAE,SAAS;QAEjD,QAAQ,IAAI,CAAC,CAAC;QACd,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAA,4CAAwB,EAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;QACpD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AAC7D,CAAC"}
|
|
@@ -1,15 +1,58 @@
|
|
|
1
|
+
import type { Page } from "@browserbasehq/stagehand";
|
|
1
2
|
import type { DeepLocatorDelegate } from "@browserbasehq/stagehand/lib/v3/understudy/deepLocator.js";
|
|
3
|
+
import { vi } from "vitest";
|
|
4
|
+
import type { FrameCandidateScanResult, FrameCandidateWriteResult } from "../scraper/deep-locator-scan";
|
|
2
5
|
/**
|
|
3
6
|
* One candidate element registered at a hop selector. `registerDeepLocatorHop`
|
|
4
7
|
* seeds a single-element hop by constructing one of these; multi-candidate
|
|
5
8
|
* hops (`registerDeepLocatorHopElements`) hold an ordered array of them so
|
|
6
9
|
* `nth(i)` can resolve to a distinct element's own click/fill/text state
|
|
7
|
-
* instead of collapsing every index onto shared scalars.
|
|
10
|
+
* instead of collapsing every index onto shared scalars. `visible` models
|
|
11
|
+
* whether the element has a layout box — `false` reproduces the run-7 field
|
|
12
|
+
* condition of a candidate that exists in the DOM but has no rendered
|
|
13
|
+
* geometry (0x0 box, `display:none`), which a real click rejects against
|
|
14
|
+
* with the CDP `-32000 Node does not have a layout object` error
|
|
15
|
+
* ({@link NODE_NOT_ACTIONABLE_MESSAGE}).
|
|
8
16
|
*/
|
|
9
17
|
export interface FakeDeepLocatorElement {
|
|
10
18
|
clicks: number;
|
|
11
19
|
filledWith: string | null;
|
|
20
|
+
selectedWith: string[] | null;
|
|
12
21
|
text: string;
|
|
22
|
+
visible: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* When set, `inputValue()` returns this instead of `filledWith` — models a
|
|
25
|
+
* write that doesn't stick (an SPA re-render normalizes/rejects the typed
|
|
26
|
+
* value) so a read-back-verified actuator
|
|
27
|
+
* (`fillDeepLocatorCandidate`/`selectDeepLocatorCandidateOption` in
|
|
28
|
+
* `deep-locator-actuate.ts`) has a fixture to prove it returns `false`
|
|
29
|
+
* rather than trusting the write blindly. Leave unset to have `inputValue()`
|
|
30
|
+
* mirror whatever was last written.
|
|
31
|
+
*/
|
|
32
|
+
readBackValue?: string;
|
|
33
|
+
/**
|
|
34
|
+
* When set to anything other than `"select"`, `selectOption()` rejects with
|
|
35
|
+
* {@link NODE_NOT_ACTIONABLE_MESSAGE} — mirrors `buildSelectFrameCandidateExpr`
|
|
36
|
+
* (`deep-locator-scan.ts`), whose real `el.options || []` lookup is always
|
|
37
|
+
* empty for a non-`<select>` element, so a real select-write against a
|
|
38
|
+
* decoy `input`/`button` candidate reports `not-actionable` rather than
|
|
39
|
+
* silently succeeding. Left unset (the legacy default), `selectOption()`
|
|
40
|
+
* always succeeds regardless of tag — every existing tag-agnostic
|
|
41
|
+
* registration keeps behaving exactly as it always has.
|
|
42
|
+
*/
|
|
43
|
+
tagName?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Shorthand a caller can pass to {@link registerDeepLocatorHopElements}
|
|
47
|
+
* instead of a bare string when an element also needs non-default layout
|
|
48
|
+
* state — `visible` defaults to `true` (rendered) so every legacy
|
|
49
|
+
* string-only registration keeps behaving exactly as it always has.
|
|
50
|
+
*/
|
|
51
|
+
export interface FakeDeepLocatorElementSpec {
|
|
52
|
+
readonly text: string;
|
|
53
|
+
readonly visible?: boolean;
|
|
54
|
+
/** See {@link FakeDeepLocatorElement.tagName}. Omit to keep `selectOption()` tag-agnostic. */
|
|
55
|
+
readonly tagName?: string;
|
|
13
56
|
}
|
|
14
57
|
/**
|
|
15
58
|
* Shared, in-memory model of a `page.deepLocator()`-reachable hop: the
|
|
@@ -25,6 +68,7 @@ export interface FakeDeepLocatorHop {
|
|
|
25
68
|
readonly elements: FakeDeepLocatorElement[];
|
|
26
69
|
readonly clicks: number;
|
|
27
70
|
readonly filledWith: string | null;
|
|
71
|
+
readonly selectedWith: string[] | null;
|
|
28
72
|
readonly text: string;
|
|
29
73
|
}
|
|
30
74
|
/**
|
|
@@ -42,19 +86,27 @@ export type FakeDeepLocatorFrame = Map<string, FakeDeepLocatorHop>;
|
|
|
42
86
|
export declare function registerDeepLocatorHop(frame: FakeDeepLocatorFrame, selector: string, text?: string): FakeDeepLocatorHop;
|
|
43
87
|
/**
|
|
44
88
|
* Registers a hop selector with N ordered candidate elements so
|
|
45
|
-
* `deepLocator(selector).count()` resolves to `
|
|
89
|
+
* `deepLocator(selector).count()` resolves to `elements.length` and
|
|
46
90
|
* `nth(i).textContent()`/`nth(i).click()`/`nth(i).fill()` act on element `i`
|
|
47
91
|
* specifically — the shape a real cross-origin OOPIF hop resolves to when
|
|
48
92
|
* more than one element matches the inner selector (e.g. `"*"` matching
|
|
49
93
|
* every node in the iframe), which the single-element
|
|
50
|
-
* {@link registerDeepLocatorHop} path can't model.
|
|
94
|
+
* {@link registerDeepLocatorHop} path can't model. Each entry is either a
|
|
95
|
+
* bare string (rendered, `visible: true`) or a
|
|
96
|
+
* {@link FakeDeepLocatorElementSpec} for a candidate that also needs
|
|
97
|
+
* non-default layout state — mixing both in one call models a hop where
|
|
98
|
+
* only some candidates have a layout box, same as a real dense OOPIF form.
|
|
51
99
|
*/
|
|
52
|
-
export declare function registerDeepLocatorHopElements(frame: FakeDeepLocatorFrame, selector: string,
|
|
100
|
+
export declare function registerDeepLocatorHopElements(frame: FakeDeepLocatorFrame, selector: string, elements: ReadonlyArray<string | FakeDeepLocatorElementSpec>): FakeDeepLocatorHop;
|
|
53
101
|
/**
|
|
54
102
|
* The `FakeDeepLocatorDelegate` methods `registerDeepLocatorHangingHop` can
|
|
55
103
|
* pin open, modeling a wedged OOPIF CDP call (the run-6 78-minute hang).
|
|
104
|
+
* `fill`/`selectOption`/`inputValue` model the same wedge for
|
|
105
|
+
* `deep-locator-actuate.ts`'s write/read-back seam — e.g. a wedged `fill`
|
|
106
|
+
* proving `fillDeepLocatorCandidate` rejects via its watchdog instead of
|
|
107
|
+
* hanging.
|
|
56
108
|
*/
|
|
57
|
-
export type HangingDeepLocatorMethod = "click" | "count" | "textContent";
|
|
109
|
+
export type HangingDeepLocatorMethod = "click" | "count" | "textContent" | "fill" | "selectOption" | "inputValue";
|
|
58
110
|
export interface RegisterDeepLocatorHangingHopOptions {
|
|
59
111
|
/** Which method(s) resolve to a never-settling promise until `release()` is called. */
|
|
60
112
|
readonly hangOn: HangingDeepLocatorMethod | readonly HangingDeepLocatorMethod[];
|
|
@@ -78,19 +130,48 @@ export interface FakeDeepLocatorHangingHop {
|
|
|
78
130
|
* wedged `deepLocator().count()`/`.click()` CDP call without a real browser.
|
|
79
131
|
*/
|
|
80
132
|
export declare function registerDeepLocatorHangingHop(frame: FakeDeepLocatorFrame, selector: string, options: RegisterDeepLocatorHangingHopOptions): FakeDeepLocatorHangingHop;
|
|
133
|
+
/**
|
|
134
|
+
* The delegate methods plus {@link makeFakeFrameScan}'s batched evaluate,
|
|
135
|
+
* {@link makeFakeFrameClickByIndex}'s batched click, and
|
|
136
|
+
* {@link makeFakeFrameFillByIndex}'s/{@link makeFakeFrameSelectByIndex}'s
|
|
137
|
+
* batched writes a hop's {@link registerDeepLocatorHopLatency} profile can
|
|
138
|
+
* delay.
|
|
139
|
+
*/
|
|
140
|
+
export type LatencyDeepLocatorMethod = HangingDeepLocatorMethod | "scan" | "clickByIndex" | "fillByIndex" | "selectByIndex";
|
|
141
|
+
export interface RegisterDeepLocatorHopLatencyOptions {
|
|
142
|
+
/** Which method(s) resolve after `delayMs` instead of immediately. */
|
|
143
|
+
readonly delayOn: LatencyDeepLocatorMethod | readonly LatencyDeepLocatorMethod[];
|
|
144
|
+
readonly delayMs: number;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Attaches a finite per-call delay to an already-registered hop's `delayOn`
|
|
148
|
+
* methods, leaving every other method — and every other hop — immediate.
|
|
149
|
+
* This is the seam a test uses to prove a batched fix collapses N serial
|
|
150
|
+
* round-trips into one: register the same `delayMs` against `"textContent"`/
|
|
151
|
+
* `"click"`/`"fill"`/`"selectOption"`/`"inputValue"` (the legacy per-index
|
|
152
|
+
* paths, charged `index + 1` times — see {@link INDEXED_RESOLVE_METHODS}) and
|
|
153
|
+
* `"scan"`/`"clickByIndex"` (the batched paths, always charged once) on the
|
|
154
|
+
* same hop, then compare how time scales
|
|
155
|
+
* with candidate count/index through each. Unlike
|
|
156
|
+
* {@link registerDeepLocatorHangingHop}, calls resolve on their own after
|
|
157
|
+
* `delayMs` — there is no `release()`.
|
|
158
|
+
*/
|
|
159
|
+
export declare function registerDeepLocatorHopLatency(hop: FakeDeepLocatorHop, options: RegisterDeepLocatorHopLatencyOptions): void;
|
|
81
160
|
/**
|
|
82
161
|
* Only the methods `src/scraper/flow-runner.ts`'s deepLocator-routed call
|
|
83
162
|
* sites (`observe-act`, rephrase evidence, the pre-cascade probe) actually
|
|
84
163
|
* invoke, via `deep-locator-candidates.ts`: `count()` to check candidate
|
|
85
|
-
* existence, `click()
|
|
86
|
-
* `
|
|
87
|
-
*
|
|
88
|
-
* `
|
|
89
|
-
* `
|
|
90
|
-
* `
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
164
|
+
* existence, `click()` to act, `textContent()` to read `accessibleText`,
|
|
165
|
+
* `first()`/`nth()` for the same chaining `buildHopSelector`-composed
|
|
166
|
+
* multi-match selectors need. `fill()`/`selectOption()`/`inputValue()` back
|
|
167
|
+
* `deep-locator-actuate.ts`'s fill/select actuation seam — the write
|
|
168
|
+
* primitives and the read-back that confirms a write stuck. `hover`/`type`/
|
|
169
|
+
* `isVisible`/`isChecked`/`innerHtml`/`innerText`/
|
|
170
|
+
* `setInputFiles`/`scrollTo`/`centroid`/`backendNodeId`/`highlight`/
|
|
171
|
+
* `sendClickEvent` are declared on the real `DeepLocatorDelegate` but no
|
|
172
|
+
* planned call site routes through them, so they are omitted here — adding
|
|
173
|
+
* one only when a call site actually needs it keeps this fake from drifting
|
|
174
|
+
* out of sync with what's exercised.
|
|
94
175
|
*
|
|
95
176
|
* `first`/`nth` return `FakeDeepLocatorDelegate` (not the real
|
|
96
177
|
* `DeepLocatorDelegate` class a `Pick` would demand) since a fake has no
|
|
@@ -102,10 +183,20 @@ export interface FakeDeepLocatorDelegate {
|
|
|
102
183
|
click: DeepLocatorDelegate["click"];
|
|
103
184
|
count: DeepLocatorDelegate["count"];
|
|
104
185
|
fill: DeepLocatorDelegate["fill"];
|
|
186
|
+
inputValue: DeepLocatorDelegate["inputValue"];
|
|
187
|
+
selectOption: DeepLocatorDelegate["selectOption"];
|
|
105
188
|
textContent: DeepLocatorDelegate["textContent"];
|
|
106
189
|
first(): FakeDeepLocatorDelegate;
|
|
107
190
|
nth(index: number): FakeDeepLocatorDelegate;
|
|
108
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* The literal CDP error message a real `DOM.getBoxModel`/
|
|
194
|
+
* `DOM.scrollIntoViewIfNeeded` failure over "no layout object" arrives as
|
|
195
|
+
* (`understudy/cdp.js`) — exported so both this fake's click rejection and a
|
|
196
|
+
* consuming test assert against the same string bugfix-001's
|
|
197
|
+
* `isNodeNotActionableError` (`deep-locator-scan.ts`) matches.
|
|
198
|
+
*/
|
|
199
|
+
export declare const NODE_NOT_ACTIONABLE_MESSAGE = "-32000 Node does not have a layout object";
|
|
109
200
|
/**
|
|
110
201
|
* Fake `page.deepLocator` bound to an in-memory hop registry — pass the same
|
|
111
202
|
* `FakeDeepLocatorFrame` into a fake `Page`'s `deepLocator` field so a fix
|
|
@@ -113,4 +204,243 @@ export interface FakeDeepLocatorDelegate {
|
|
|
113
204
|
* fixture state instead of a browser.
|
|
114
205
|
*/
|
|
115
206
|
export declare function makeFakeDeepLocator(frame: FakeDeepLocatorFrame): (selector: string) => FakeDeepLocatorDelegate;
|
|
207
|
+
/**
|
|
208
|
+
* Minimal fake DOM element supporting exactly the surface
|
|
209
|
+
* {@link buildScanFrameCandidatesExpr} (`deep-locator-scan.ts`) touches:
|
|
210
|
+
* `textContent`, `getBoundingClientRect`, `getAttribute`, `closest`, plus a
|
|
211
|
+
* `computedStyle` bag the fake global `getComputedStyle` reads from. Shared
|
|
212
|
+
* here (not duplicated per test file) so `deep-locator-scan.dense-form.
|
|
213
|
+
* test.ts` and Stagehand-contract tests can execute the SAME generated
|
|
214
|
+
* expression against the SAME fixture shape as `deep-locator-scan.test.ts`'s
|
|
215
|
+
* own hand-built fixture. `value`/`dispatchEvent`/`focus` model the write
|
|
216
|
+
* half of that same contract — a generated fill/select expression reads and
|
|
217
|
+
* writes `el.value` and fires bubbling `input`/`change`/`blur` events the
|
|
218
|
+
* same way `flow-runner.ts`'s existing `.value =` + `dispatchEvent` write
|
|
219
|
+
* paths do, so a fake candidate can stand in for a real writable `<input>`/
|
|
220
|
+
* `<select>` instead of only the read-only surface a click/scan needs.
|
|
221
|
+
*/
|
|
222
|
+
export interface FakeDomElement {
|
|
223
|
+
readonly textContent: string;
|
|
224
|
+
readonly tagName: string;
|
|
225
|
+
readonly attributes: Readonly<Record<string, string>>;
|
|
226
|
+
readonly rect: {
|
|
227
|
+
readonly width: number;
|
|
228
|
+
readonly height: number;
|
|
229
|
+
};
|
|
230
|
+
readonly computedStyle: {
|
|
231
|
+
readonly display: string;
|
|
232
|
+
readonly visibility: string;
|
|
233
|
+
};
|
|
234
|
+
readonly parent: FakeDomElement | null;
|
|
235
|
+
value: string;
|
|
236
|
+
/** `<select>`-only: the `<option>` collection {@link buildSelectFrameCandidateExpr}'s (`deep-locator-scan.ts`) value-then-label match reads. Empty for every non-`<select>` fixture. */
|
|
237
|
+
readonly options: readonly {
|
|
238
|
+
readonly value: string;
|
|
239
|
+
readonly textContent: string;
|
|
240
|
+
}[];
|
|
241
|
+
readonly dispatchedEvents: readonly string[];
|
|
242
|
+
getBoundingClientRect(): {
|
|
243
|
+
readonly width: number;
|
|
244
|
+
readonly height: number;
|
|
245
|
+
};
|
|
246
|
+
getAttribute(name: string): string | null;
|
|
247
|
+
closest(selector: string): FakeDomElement | null;
|
|
248
|
+
dispatchEvent(event: {
|
|
249
|
+
readonly type: string;
|
|
250
|
+
}): boolean;
|
|
251
|
+
focus(): void;
|
|
252
|
+
}
|
|
253
|
+
/** Fake `document`/frame-document surface: the two lookups the accessible-name precedence chain needs beyond the matched candidate set itself. */
|
|
254
|
+
export interface FakeDomRoot {
|
|
255
|
+
querySelectorAll(selector: string): FakeDomElement[];
|
|
256
|
+
getElementById(id: string): FakeDomElement | null;
|
|
257
|
+
}
|
|
258
|
+
/** Optional overrides {@link makeFakeDomElement} accepts beyond its default rendered `div`. */
|
|
259
|
+
export interface MakeFakeDomElementOptions {
|
|
260
|
+
readonly tagName?: string;
|
|
261
|
+
readonly attributes?: Record<string, string>;
|
|
262
|
+
readonly rect?: {
|
|
263
|
+
readonly width: number;
|
|
264
|
+
readonly height: number;
|
|
265
|
+
};
|
|
266
|
+
readonly computedStyle?: {
|
|
267
|
+
readonly display: string;
|
|
268
|
+
readonly visibility: string;
|
|
269
|
+
};
|
|
270
|
+
readonly parent?: FakeDomElement | null;
|
|
271
|
+
/** Seeds `value` — the initial `.value` a write expression reads before overwriting it. Defaults to `""`, matching an unfilled `<input>`. */
|
|
272
|
+
readonly value?: string;
|
|
273
|
+
/** Seeds `options` — a `<select>` fixture's option collection. Defaults to `[]`, matching every non-`<select>` element. */
|
|
274
|
+
readonly options?: readonly {
|
|
275
|
+
readonly value: string;
|
|
276
|
+
readonly textContent: string;
|
|
277
|
+
}[];
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Builds one fake DOM element. Defaults model a rendered, tag-less `div`
|
|
281
|
+
* with no accessible-name signal — the "structural filler" shape a dense
|
|
282
|
+
* form fixture needs many of — so a caller building a large fixture only
|
|
283
|
+
* spells out the overrides that make a specific element interesting.
|
|
284
|
+
*/
|
|
285
|
+
export declare function makeFakeDomElement(textContent?: string, options?: MakeFakeDomElementOptions): FakeDomElement;
|
|
286
|
+
/**
|
|
287
|
+
* Builds a selector-aware fake `document` root: `querySelectorAll` supports
|
|
288
|
+
* the exact clause shapes {@link INTERACTIVE_CANDIDATE_SELECTOR} needs (a
|
|
289
|
+
* bare tag, `[attr]`, `[attr=value]`, comma-joined, or `"*"`) instead of
|
|
290
|
+
* `deep-locator-scan.test.ts`'s tag-only `makeRoot`, so a fixture exercising
|
|
291
|
+
* that constant's `[role=button]` / `[tabindex]` clauses actually selects
|
|
292
|
+
* against them.
|
|
293
|
+
*/
|
|
294
|
+
export declare function makeSelectorAwareDomRoot(elements: readonly FakeDomElement[]): FakeDomRoot;
|
|
295
|
+
/** Total node count {@link buildDenseFormFixture} produces — the live-measured `#talemetry_apply_iframe >> *` match count from the uchealth-7 bug report. */
|
|
296
|
+
export declare const DENSE_FORM_TOTAL_COUNT = 371;
|
|
297
|
+
/** 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. */
|
|
298
|
+
export declare const DENSE_FORM_TARGET_TEXT = "Manual Application";
|
|
299
|
+
/** 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. */
|
|
300
|
+
export declare const DENSE_FORM_DECOY_TEXTS: readonly ["Upload a Resume/CV", "Use LinkedIn Profile"];
|
|
301
|
+
/** {@link buildDenseFormFixture}'s return shape: the assembled root plus its flat element list, so a caller can assert against fixture composition (e.g. total count) without re-deriving it from the root. */
|
|
302
|
+
export interface DenseFormFixture {
|
|
303
|
+
readonly root: FakeDomRoot;
|
|
304
|
+
readonly elements: readonly FakeDomElement[];
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Builds the {@link DENSE_FORM_TOTAL_COUNT}-node dense-OOPIF-shaped fixture
|
|
308
|
+
* the uchealth-7 bug report measured (`#talemetry_apply_iframe >> *`
|
|
309
|
+
* matching 371 elements): mostly structural `div`/`span` filler, a handful
|
|
310
|
+
* of real form controls, an icon-only target button, and two unrendered
|
|
311
|
+
* decoys. Exported (not inlined per test file) so `test-002`'s Stagehand-
|
|
312
|
+
* resolver-contract pin can run the installed dependency's own resolver
|
|
313
|
+
* against the IDENTICAL fixture `deep-locator-scan.dense-form.test.ts`
|
|
314
|
+
* proves {@link buildScanFrameCandidatesExpr} against.
|
|
315
|
+
*/
|
|
316
|
+
export declare function buildDenseFormFixture(): DenseFormFixture;
|
|
317
|
+
/**
|
|
318
|
+
* Fake frame-scoped batched evaluate bound to `selector` — models the seam
|
|
319
|
+
* `resolveDeepLocatorCandidates`'s batched-scan fix calls once per frame via
|
|
320
|
+
* `FrameTarget.evaluate(buildScanFrameCandidatesExpr(innerSelector))`
|
|
321
|
+
* (`deep-locator-scan.ts`). Ignores whatever expression string it's called
|
|
322
|
+
* with — a fake cannot execute browser-side code, and `deep-locator-scan.
|
|
323
|
+
* test.ts`'s `node:vm` test is what proves the expression itself is correct
|
|
324
|
+
* — and instead returns the hop registered at `selector` as
|
|
325
|
+
* `FrameCandidateScanResult[]`, in registration order: the exact payload
|
|
326
|
+
* shape a real `Frame.evaluate` call resolves to. Pass the result into a
|
|
327
|
+
* fake `FrameTarget`'s `evaluate` field so a caller that reads through
|
|
328
|
+
* `target.evaluate(...)` resolves against fixture state instead of a
|
|
329
|
+
* browser.
|
|
330
|
+
*/
|
|
331
|
+
export declare function makeFakeFrameScan(frame: FakeDeepLocatorFrame, selector: string): (expression?: unknown) => Promise<FrameCandidateScanResult[]>;
|
|
332
|
+
/**
|
|
333
|
+
* Result of the fake batched click-by-index seam
|
|
334
|
+
* ({@link makeFakeFrameClickByIndex}): `clicked` mirrors whether the click
|
|
335
|
+
* landed on a rendered node. `reason` is set instead of the fake throwing —
|
|
336
|
+
* a single batched evaluate call reports what it observed rather than
|
|
337
|
+
* surfacing a per-call CDP rejection — and carries
|
|
338
|
+
* {@link NODE_NOT_ACTIONABLE_MESSAGE} for the unrendered-node case so a
|
|
339
|
+
* caller can still classify it via {@link isNodeNotActionableError}
|
|
340
|
+
* (`deep-locator-scan.ts`).
|
|
341
|
+
*/
|
|
342
|
+
export interface FakeBatchedClickResult {
|
|
343
|
+
clicked: boolean;
|
|
344
|
+
reason?: string;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Fake frame-scoped batched click-by-index bound to `selector` — models the
|
|
348
|
+
* seam a click-by-index fix would call once per click via a single frame
|
|
349
|
+
* evaluate, instead of the legacy delegate's `nth(index).click()` walking
|
|
350
|
+
* `resolveAtIndex`'s serial per-index loop (see {@link INDEXED_RESOLVE_METHODS}).
|
|
351
|
+
* Same "ignore the expression string, resolve against the hop registry"
|
|
352
|
+
* contract as {@link makeFakeFrameScan}: a fake cannot execute browser-side
|
|
353
|
+
* code, so the `expression` argument is accepted (mirroring `evaluate`'s
|
|
354
|
+
* signature) but never inspected. Increments `elements[index].clicks` when
|
|
355
|
+
* the targeted element is registered and `visible`, so an assertion like
|
|
356
|
+
* `hop.elements[i]?.clicks` reads the same regardless of which click path a
|
|
357
|
+
* consumer routes through. Resolves `{ clicked: false, reason }` — never
|
|
358
|
+
* throws — when `index` doesn't resolve to a registered element (hop
|
|
359
|
+
* unregistered, or `index` out of range) or the element is `visible: false`.
|
|
360
|
+
*/
|
|
361
|
+
export declare function makeFakeFrameClickByIndex(frame: FakeDeepLocatorFrame, selector: string): (index: number, expression?: unknown) => Promise<FakeBatchedClickResult>;
|
|
362
|
+
/**
|
|
363
|
+
* Fake frame-scoped batched fill-by-index bound to `selector` — models the
|
|
364
|
+
* seam a batched-fill fix would call once per fill via a single frame
|
|
365
|
+
* evaluate (`buildFillFrameCandidateExpr`, `deep-locator-scan.ts`), instead
|
|
366
|
+
* of the legacy delegate's `nth(index).fill()`. Same "ignore the expression
|
|
367
|
+
* string, resolve against the hop registry" contract as
|
|
368
|
+
* {@link makeFakeFrameClickByIndex}: the fake cannot execute browser-side
|
|
369
|
+
* code, so `expression` is accepted (mirroring the real seam's signature)
|
|
370
|
+
* but never inspected — `value` is passed explicitly since it's what a real
|
|
371
|
+
* expression bakes in rather than something the fake could read back out of
|
|
372
|
+
* a string it never parses. See {@link resolveFakeBatchedWrite} for the
|
|
373
|
+
* shared not-actionable/out-of-range/write contract.
|
|
374
|
+
*/
|
|
375
|
+
export declare function makeFakeFrameFillByIndex(frame: FakeDeepLocatorFrame, selector: string): (index: number, value: string, expression?: unknown) => Promise<FrameCandidateWriteResult>;
|
|
376
|
+
/**
|
|
377
|
+
* Fake frame-scoped batched select-by-index bound to `selector` — models the
|
|
378
|
+
* seam a batched-select fix would call once per select via a single frame
|
|
379
|
+
* evaluate (`buildSelectFrameCandidateExpr`, `deep-locator-scan.ts`),
|
|
380
|
+
* instead of the legacy delegate's `nth(index).selectOption()`. Writes
|
|
381
|
+
* `optionValue` into the same `filledWith` field {@link makeFakeFrameFillByIndex}
|
|
382
|
+
* does rather than `selectedWith` — the real expression matches and reports a
|
|
383
|
+
* single option `value` (`FrameCandidateWriteResult.readBack` is one string,
|
|
384
|
+
* not the delegate's array-shaped `selectedWith`/multi-value `selectOption()`),
|
|
385
|
+
* so this batched primitive models the same single-value write shape as fill.
|
|
386
|
+
* Same "ignore the expression string" contract as
|
|
387
|
+
* {@link makeFakeFrameClickByIndex}; see {@link resolveFakeBatchedWrite} for
|
|
388
|
+
* the shared not-actionable/out-of-range/write contract.
|
|
389
|
+
*/
|
|
390
|
+
export declare function makeFakeFrameSelectByIndex(frame: FakeDeepLocatorFrame, selector: string): (index: number, optionValue: string, expression?: unknown) => Promise<FrameCandidateWriteResult>;
|
|
391
|
+
/**
|
|
392
|
+
* Options for {@link makeFakeFrameResolutionPage}.
|
|
393
|
+
*/
|
|
394
|
+
export interface MakeFakeFrameResolutionPageOptions {
|
|
395
|
+
/** CSS selector of the `<iframe>` element in the top document — the exact `frameSelector` a caller passes to `resolveFrameTarget`. */
|
|
396
|
+
readonly iframeSelector: string;
|
|
397
|
+
/** Answers both the iframe's `src` attribute and the child frame's own `location.href` — same origin for both, matching every existing hand-rolled OOPIF throughput fixture (`flow-runner.oopif-*-throughput.test.ts`), which only needs the two to diverge post-navigation, not at resolution time. */
|
|
398
|
+
readonly childSrc: string;
|
|
399
|
+
/**
|
|
400
|
+
* Milliseconds each of `tryResolveChildFrame`'s two probes (the iframe-src
|
|
401
|
+
* read and the candidate `location.href` read) waits before resolving.
|
|
402
|
+
* `0` (default) resolves same-tick, matching every existing hand-rolled
|
|
403
|
+
* throughput fixture's fake `evaluate` exactly — which is what lets those
|
|
404
|
+
* fixtures' internal `resolveFrameTarget(..., { timeoutMs: 0 })` pass win
|
|
405
|
+
* a race it would always lose against genuine CDP latency in production
|
|
406
|
+
* (see `deep-locator-candidates.internal-frame-resolution.test.ts`'s
|
|
407
|
+
* docblock). A positive value reproduces that production loss offline —
|
|
408
|
+
* the dial the throughput-only fixtures never needed, but a fix for the
|
|
409
|
+
* zero-budget race itself does.
|
|
410
|
+
*/
|
|
411
|
+
readonly probeDelayMs?: number;
|
|
412
|
+
/**
|
|
413
|
+
* Extra `childFrame.evaluate` handling beyond the `location.href` probe
|
|
414
|
+
* this factory already answers (e.g. a batched-scan/click/fill expression
|
|
415
|
+
* a consuming fixture needs) — tried, undelayed, after the probe, before
|
|
416
|
+
* the default `null` fallback. Omit for a bare resolution-only fixture.
|
|
417
|
+
*/
|
|
418
|
+
readonly onFrameEvaluate?: (expression: unknown) => unknown | Promise<unknown>;
|
|
419
|
+
}
|
|
420
|
+
/** {@link makeFakeFrameResolutionPage}'s return shape. */
|
|
421
|
+
export interface FakeFrameResolutionPage {
|
|
422
|
+
/** Fake top `Page`, castable straight into `resolveFrameTarget`'s `page` parameter. */
|
|
423
|
+
readonly page: Page;
|
|
424
|
+
/** The single child frame `page.frames()` resolves to. */
|
|
425
|
+
readonly childFrame: ReturnType<Page["frames"]>[number];
|
|
426
|
+
/** Fires once per iframe-src probe (`document.querySelector(<iframeSelector>)`-shaped evaluate) the fake page answers. */
|
|
427
|
+
readonly iframeProbeSpy: ReturnType<typeof vi.fn>;
|
|
428
|
+
/** Fires once per `"location.href"` probe the fake child frame answers. */
|
|
429
|
+
readonly locationProbeSpy: ReturnType<typeof vi.fn>;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Builds a fake top `Page` + single child `Frame` pair bound to
|
|
433
|
+
* `iframeSelector` — the shared instrument every OOPIF throughput fixture
|
|
434
|
+
* hand-rolls a variant of (`flow-runner.oopif-click-throughput.test.ts` et
|
|
435
|
+
* al.) but none of which can model production CDP latency at frame-
|
|
436
|
+
* RESOLUTION time: every one of those resolves both of
|
|
437
|
+
* `tryResolveChildFrame`'s probes with no internal `await`, a same-tick
|
|
438
|
+
* microtask that always wins a `{ timeoutMs: 0 }` watchdog race and
|
|
439
|
+
* therefore MASKS the production degrade this fake exists to make
|
|
440
|
+
* testable. `probeDelayMs: 0` (the default) reproduces those fixtures'
|
|
441
|
+
* timing exactly, so nothing that later adopts this factory sees a timing
|
|
442
|
+
* change; a positive value reproduces the production degrade those
|
|
443
|
+
* fixtures structurally cannot.
|
|
444
|
+
*/
|
|
445
|
+
export declare function makeFakeFrameResolutionPage(options: MakeFakeFrameResolutionPageOptions): FakeFrameResolutionPage;
|
|
116
446
|
//# sourceMappingURL=deep-locator-fake.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-locator-fake.d.ts","sourceRoot":"","sources":["../../src/scraper/deep-locator-fake.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"deep-locator-fake.d.ts","sourceRoot":"","sources":["../../src/scraper/deep-locator-fake.ts"],"names":[],"mappings":"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"}
|