@ubio/webvision 3.1.7 → 3.1.9
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 +173 -0
- package/build/global.js +65 -23
- package/build/global.js.map +3 -3
- package/build/page.mjs +64 -23
- package/build/webvision.user.js +35 -0
- package/out/page/dom.js +10 -1
- package/out/page/dom.js.map +1 -1
- package/out/page/parser.d.ts +5 -0
- package/out/page/parser.js +23 -5
- package/out/page/parser.js.map +1 -1
- package/out/page/snapshot.js +1 -1
- package/out/page/snapshot.js.map +1 -1
- package/out/page/traverse.js +7 -1
- package/out/page/traverse.js.map +1 -1
- package/out/page/util.d.ts +1 -0
- package/out/page/util.js +10 -0
- package/out/page/util.js.map +1 -1
- package/package.json +8 -5
package/README.md
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# WebVision
|
|
2
|
+
|
|
3
|
+
**Structured, ref-addressable views of the live DOM** for automation, debugging, and tooling.
|
|
4
|
+
|
|
5
|
+
WebVision walks the browser document, builds a compact **VX tree** (semantic nodes with stable refs), and can **render** it as text, **highlight** regions on the page, and **resolve** refs back to real DOM nodes. It is designed for scenarios where you need a consistent, inspectable snapshot of “what’s on screen” without shipping a full browser automation stack.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why use it?
|
|
10
|
+
|
|
11
|
+
- **Stable refs** — Each meaningful node gets a ref you can use to talk about “that button” or “that heading” across snapshots and tools.
|
|
12
|
+
- **Readable dumps** — Turn the tree into a line-oriented string (tags, ids, classes, key attrs, text) for LLMs, logs, or diffing.
|
|
13
|
+
- **Visual debugging** — Draw overlays on elements that correspond to VX nodes.
|
|
14
|
+
- **Shadow DOM** — Open shadow roots are flattened into the tree by default (see [Shadow DOM](#shadow-dom)).
|
|
15
|
+
- **Ships for browser and Node-oriented bundles** — ESM page bundle, IIFE global, optional Tampermonkey userscript for the **page** console.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @ubio/webvision
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Build artifacts (`out/page`, `build/*`) are included in the published package. Run `npm run compile` after cloning the repo if you develop from source.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Quick start (ESM)
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
import { captureSnapshot } from '@ubio/webvision';
|
|
33
|
+
|
|
34
|
+
const tree = await captureSnapshot();
|
|
35
|
+
console.log(tree.render({ renderRefs: true, renderTagNames: true }));
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`captureSnapshot()` parses `document`, stores the latest tree and ref→DOM map on `globalThis`, and returns a **`VxTreeView`**.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Core API
|
|
43
|
+
|
|
44
|
+
| Export | Role |
|
|
45
|
+
|--------|------|
|
|
46
|
+
| `captureSnapshot(options?)` | Parse the page; returns `VxTreeView`; updates last snapshot. |
|
|
47
|
+
| `getSnapshot()` | Return the last `VxTreeView` (throws if none). |
|
|
48
|
+
| `resolveDomNode(ref)` | Map a ref string to a DOM `Node` or `null`. |
|
|
49
|
+
| `renderVxNode(node, options?)` | Render a single `VxNode` subtree as text. |
|
|
50
|
+
|
|
51
|
+
### `VxTreeView`
|
|
52
|
+
|
|
53
|
+
| Method / property | Description |
|
|
54
|
+
|-------------------|-------------|
|
|
55
|
+
| `render(options?)` | String dump of the frame’s tree (see `VxRenderOptions` in source). |
|
|
56
|
+
| `nodeCount` | Number of ref’d nodes in the map. |
|
|
57
|
+
| `highlight(options?)` | Overlay borders for refs (needs snapshot first). |
|
|
58
|
+
| `findNode(ref)` | Get the `VxNode` for a ref. |
|
|
59
|
+
|
|
60
|
+
### Example: snapshot, render, highlight
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
import { captureSnapshot, resolveDomNode } from '@ubio/webvision';
|
|
64
|
+
|
|
65
|
+
const tree = await captureSnapshot();
|
|
66
|
+
|
|
67
|
+
console.log(tree.render({
|
|
68
|
+
renderRefs: true,
|
|
69
|
+
renderTagNames: true,
|
|
70
|
+
renderIds: true,
|
|
71
|
+
}));
|
|
72
|
+
|
|
73
|
+
tree.highlight({ clearOverlay: true });
|
|
74
|
+
|
|
75
|
+
const el = resolveDomNode('0abc'); // example ref from render output
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Parser options (`VxTreeOptions`)
|
|
79
|
+
|
|
80
|
+
Passed to `captureSnapshot({ ... })`:
|
|
81
|
+
|
|
82
|
+
| Option | Default | Meaning |
|
|
83
|
+
|--------|---------|---------|
|
|
84
|
+
| `flattenShadowDom` | `true` | Include **open** shadow roots after light-DOM children; set `false` for light DOM only. |
|
|
85
|
+
| `viewportOnly` | `false` | Drop nodes outside the viewport. |
|
|
86
|
+
| `probeViewport` | `false` | Extra viewport probing (see `probe.ts`). |
|
|
87
|
+
| `skipImages` | `false` | Omit `img` nodes when omitting. |
|
|
88
|
+
| `opaqueOverlays` | `false` | Try to flatten opaque overlays for parsing. |
|
|
89
|
+
| `unnestDivs` | `false` | Aggressive pruning of bare div/spans. |
|
|
90
|
+
| `frameId` / `iframeRef` | — | Multi-frame scenarios. |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Shadow DOM
|
|
95
|
+
|
|
96
|
+
Open shadow trees are walked **after** each host’s light DOM children so the rendered tree matches a **flattened** structural view. **Closed** shadow roots cannot be accessed from script.
|
|
97
|
+
|
|
98
|
+
To restore the previous behavior (ignore shadow trees):
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
await captureSnapshot({ flattenShadowDom: false });
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Package exports
|
|
107
|
+
|
|
108
|
+
| Import path | Output | Use case |
|
|
109
|
+
|-------------|--------|----------|
|
|
110
|
+
| `@ubio/webvision` | `out/page` (TypeScript build) | Types + ESM in TS projects. |
|
|
111
|
+
| `@ubio/webvision/page` | `build/page.mjs` | Single ESM bundle of the page module. |
|
|
112
|
+
| `@ubio/webvision/global` | `build/global.js` | IIFE; exposes `globalThis.WebVision` in the browser. |
|
|
113
|
+
|
|
114
|
+
Generate bundles from source:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npm run compile:page # build/page.mjs
|
|
118
|
+
npm run compile:global # build/global.js + source map
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Browser console: Tampermonkey
|
|
124
|
+
|
|
125
|
+
For **`window.WebVision`** in the **page** DevTools console (not the extension isolated world), use the generated userscript.
|
|
126
|
+
|
|
127
|
+
1. **Build** (from repo root):
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm run compile:userscript
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Produces `build/global.js` and `build/webvision.user.js`.
|
|
134
|
+
|
|
135
|
+
2. **Default workflow (hot reload)**
|
|
136
|
+
- Terminal A: `npm run serve:build` — serves `build/` at `http://127.0.0.1:3847`.
|
|
137
|
+
- Terminal B: `npm run dev:global` — rebuilds `global.js` on TS changes.
|
|
138
|
+
- Install **`build/webvision.user.js`** in Tampermonkey (Dashboard → install).
|
|
139
|
+
- Reload the tab; the script fetches `global.js` with a cache-busting query and injects it into the page.
|
|
140
|
+
|
|
141
|
+
3. **Offline / no server** — embed the bundle when generating:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
WEBVISION_INLINE=1 npm run compile:userscript
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Reinstall the userscript after each rebuild (large file).
|
|
148
|
+
|
|
149
|
+
4. **Custom URL** when building:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
WEBVISION_INJECT_URL=https://your.cdn/webvision/global.js npm run compile:userscript
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Requires `@grant GM.xmlHttpRequest` and matching `// @connect` for the host (generated for you for `http`/`https` URLs).
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Development
|
|
160
|
+
|
|
161
|
+
| Script | Purpose |
|
|
162
|
+
|--------|---------|
|
|
163
|
+
| `npm run compile` | Clean, `tsc`, bundle `page.mjs` + `global.js` + `webvision.user.js`. |
|
|
164
|
+
| `npm run dev` | Parallel `tsc -w` and esbuild watch for `page.mjs`. |
|
|
165
|
+
| `npm run dev:global` | Watch rebuild `build/global.js`. |
|
|
166
|
+
| `npm run dev:userscript` | One-shot userscript build, then `dev:global` watch. |
|
|
167
|
+
| `npm run lint` | ESLint. |
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
ISC
|
package/build/global.js
CHANGED
|
@@ -59,6 +59,7 @@ var WebVision = (() => {
|
|
|
59
59
|
isObjectEmpty: () => isObjectEmpty,
|
|
60
60
|
isRandomIdentifier: () => isRandomIdentifier,
|
|
61
61
|
isRectInViewport: () => isRectInViewport,
|
|
62
|
+
iterate: () => iterate,
|
|
62
63
|
makeOverlaysOpaque: () => makeOverlaysOpaque,
|
|
63
64
|
normalizeRef: () => normalizeRef,
|
|
64
65
|
normalizeText: () => normalizeText,
|
|
@@ -71,6 +72,31 @@ var WebVision = (() => {
|
|
|
71
72
|
truncateAttrValue: () => truncateAttrValue
|
|
72
73
|
});
|
|
73
74
|
|
|
75
|
+
// src/page/util.ts
|
|
76
|
+
function isContainerNode(vxNode) {
|
|
77
|
+
if (vxNode.tagName === "select") {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
const children = vxNode.children ?? [];
|
|
81
|
+
const hasTextChildren = children.some((child) => !child.tagName);
|
|
82
|
+
return children.length > 0 && !hasTextChildren;
|
|
83
|
+
}
|
|
84
|
+
function isObjectEmpty(obj) {
|
|
85
|
+
return !Object.values(obj).some((value) => !!value);
|
|
86
|
+
}
|
|
87
|
+
function normalizeRef(ref) {
|
|
88
|
+
return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, "");
|
|
89
|
+
}
|
|
90
|
+
function* iterate(items) {
|
|
91
|
+
if (!items) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (let i = 0; i < items.length; i += 1) {
|
|
95
|
+
const item = items[i];
|
|
96
|
+
yield item;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
74
100
|
// src/page/dom.ts
|
|
75
101
|
var ORIGINAL_STYLE_SYMBOL = Symbol("vx:originalStyle");
|
|
76
102
|
var INTERACTIVE_TAGS = ["a", "button", "input", "textarea", "select", "label", "option", "optgroup"];
|
|
@@ -155,7 +181,15 @@ var WebVision = (() => {
|
|
|
155
181
|
return true;
|
|
156
182
|
}
|
|
157
183
|
if (!hasVisibleArea(element)) {
|
|
158
|
-
|
|
184
|
+
if (element.children.length === 0) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
for (const child of iterate(element.children)) {
|
|
188
|
+
if (!isDeepHidden(child)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
159
193
|
}
|
|
160
194
|
return false;
|
|
161
195
|
}
|
|
@@ -291,9 +325,14 @@ var WebVision = (() => {
|
|
|
291
325
|
return;
|
|
292
326
|
}
|
|
293
327
|
yield element;
|
|
294
|
-
for (const child of element.children) {
|
|
328
|
+
for (const child of iterate(element.children)) {
|
|
295
329
|
yield* traverseElements(child);
|
|
296
330
|
}
|
|
331
|
+
if (element.shadowRoot) {
|
|
332
|
+
for (const child of iterate(element.shadowRoot.children)) {
|
|
333
|
+
yield* traverseElements(child);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
297
336
|
}
|
|
298
337
|
|
|
299
338
|
// src/page/probe.ts
|
|
@@ -350,22 +389,6 @@ var WebVision = (() => {
|
|
|
350
389
|
}
|
|
351
390
|
};
|
|
352
391
|
|
|
353
|
-
// src/page/util.ts
|
|
354
|
-
function isContainerNode(vxNode) {
|
|
355
|
-
if (vxNode.tagName === "select") {
|
|
356
|
-
return false;
|
|
357
|
-
}
|
|
358
|
-
const children = vxNode.children ?? [];
|
|
359
|
-
const hasTextChildren = children.some((child) => !child.tagName);
|
|
360
|
-
return children.length > 0 && !hasTextChildren;
|
|
361
|
-
}
|
|
362
|
-
function isObjectEmpty(obj) {
|
|
363
|
-
return !Object.values(obj).some((value) => !!value);
|
|
364
|
-
}
|
|
365
|
-
function normalizeRef(ref) {
|
|
366
|
-
return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, "");
|
|
367
|
-
}
|
|
368
|
-
|
|
369
392
|
// src/page/render.ts
|
|
370
393
|
function renderVxNode(scope, options = {}) {
|
|
371
394
|
const buffer = [];
|
|
@@ -477,7 +500,7 @@ var WebVision = (() => {
|
|
|
477
500
|
var VX_LAST_REFS_SYMBOL = Symbol("vx:lastRefs");
|
|
478
501
|
async function captureSnapshot(options = {}) {
|
|
479
502
|
const parser = new VxTreeParser(options);
|
|
480
|
-
|
|
503
|
+
parser.parse();
|
|
481
504
|
const domMap = parser.getDomMap();
|
|
482
505
|
const vxTree = parser.getTree();
|
|
483
506
|
globalThis[VX_DOM_SYMBOL] = domMap;
|
|
@@ -730,12 +753,20 @@ var WebVision = (() => {
|
|
|
730
753
|
isKept: el.matches(VX_KEEP_SELECTOR)
|
|
731
754
|
});
|
|
732
755
|
const children = [];
|
|
733
|
-
for (const child of el.childNodes) {
|
|
756
|
+
for (const child of iterate(el.childNodes)) {
|
|
734
757
|
const childNode = this.parseNode(child, vxNode);
|
|
735
758
|
if (childNode != null) {
|
|
736
759
|
children.push(childNode);
|
|
737
760
|
}
|
|
738
761
|
}
|
|
762
|
+
if (this.options.flattenShadowDom !== false && el.shadowRoot) {
|
|
763
|
+
for (const child of iterate(el.shadowRoot.childNodes)) {
|
|
764
|
+
const childNode = this.parseNode(child, vxNode);
|
|
765
|
+
if (childNode != null) {
|
|
766
|
+
children.push(childNode);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
739
770
|
if (children.length === 1 && !children[0]?.tagName) {
|
|
740
771
|
vxNode.textContent = normalizeText(children[0].textContent ?? "");
|
|
741
772
|
} else {
|
|
@@ -854,7 +885,7 @@ var WebVision = (() => {
|
|
|
854
885
|
}
|
|
855
886
|
collectLabelAttrs(el) {
|
|
856
887
|
const attrs = {};
|
|
857
|
-
for (const attr of el.attributes) {
|
|
888
|
+
for (const attr of iterate(el.attributes)) {
|
|
858
889
|
const attrName = attr.name;
|
|
859
890
|
const value = truncateAttrValue(attr.value);
|
|
860
891
|
if (!value) {
|
|
@@ -894,9 +925,14 @@ var WebVision = (() => {
|
|
|
894
925
|
delete node[VX_NODE_REF_SYMBOL];
|
|
895
926
|
delete node[VX_NODE_COUNTER_SYMBOL];
|
|
896
927
|
if (node instanceof Element) {
|
|
897
|
-
for (const child of node.children) {
|
|
928
|
+
for (const child of iterate(node.children)) {
|
|
898
929
|
this.clearRecursive(child);
|
|
899
930
|
}
|
|
931
|
+
if (node.shadowRoot) {
|
|
932
|
+
for (const child of iterate(node.shadowRoot.children)) {
|
|
933
|
+
this.clearRecursive(child);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
900
936
|
}
|
|
901
937
|
}
|
|
902
938
|
nextCounterValue() {
|
|
@@ -913,9 +949,14 @@ var WebVision = (() => {
|
|
|
913
949
|
if (cnt !== void 0) {
|
|
914
950
|
this.usedCounters.add(cnt);
|
|
915
951
|
}
|
|
916
|
-
for (const child of el.children
|
|
952
|
+
for (const child of iterate(el.children)) {
|
|
917
953
|
this.collectDomCounters(child);
|
|
918
954
|
}
|
|
955
|
+
if (el.shadowRoot) {
|
|
956
|
+
for (const child of iterate(el.shadowRoot.children)) {
|
|
957
|
+
this.collectDomCounters(child);
|
|
958
|
+
}
|
|
959
|
+
}
|
|
919
960
|
}
|
|
920
961
|
};
|
|
921
962
|
|
|
@@ -1070,4 +1111,5 @@ var WebVision = (() => {
|
|
|
1070
1111
|
};
|
|
1071
1112
|
return __toCommonJS(index_exports);
|
|
1072
1113
|
})();
|
|
1114
|
+
globalThis.WebVision = WebVision;
|
|
1073
1115
|
//# sourceMappingURL=global.js.map
|
package/build/global.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/page/index.ts", "../src/page/
|
|
4
|
-
"sourcesContent": ["export * from './dom.js';\nexport * from './highlight.js';\nexport * from './overlay.js';\nexport * from './page.js';\nexport * from './parser.js';\nexport * from './probe.js';\nexport * from './render.js';\nexport * from './snapshot.js';\nexport * from './traverse.js';\nexport * from './tree.js';\nexport * from './util.js';\n", "const ORIGINAL_STYLE_SYMBOL = Symbol('vx:originalStyle');\n\nexport const INTERACTIVE_TAGS = ['a', 'button', 'input', 'textarea', 'select', 'label', 'option', 'optgroup'];\nexport const INTERACTIVE_ROLES = [\n 'clickable', 'button', 'link', 'checkbox', 'radio', 'textbox', 'combobox', 'listbox', 'menu', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'optgroup', 'progressbar', 'scrollbar', 'slider', 'spinbutton', 'switch', 'tab', 'tablist', 'timer', 'toolbar'];\n\nexport interface Viewport {\n width: number;\n height: number;\n}\n\nexport function isHidden(el: Element) {\n const style = getComputedStyle(el);\n if (style.display === 'none') {\n return true;\n }\n if (style.visibility === 'hidden') {\n return true;\n }\n if (style.opacity === '0') {\n return true;\n }\n return false;\n}\n\nexport function getNormalizedText(el: Element): string {\n return normalizeText(el.textContent ?? '');\n}\n\nexport function normalizeText(str: string) {\n return str\n .replace(/\\p{Cf}/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nexport function truncateAttrValue(value: string, limit = 100) {\n if (value.match(/^(javascript:)?void/)) {\n return '';\n }\n if (value.startsWith('data:')) {\n return '';\n }\n if (value.length > limit) {\n return value.slice(0, limit) + '\u2026';\n }\n return value;\n}\n\nexport function escapeAttribute(value: string) {\n return value\n .replace(/&/g, '&') // Escape ampersand first!\n .replace(/\"/g, '"') // Escape double quotes\n .replace(/'/g, ''') // Escape single quotes\n .replace(/</g, '<') // Escape less than\n .replace(/>/g, '>') // Escape greater than\n .replace(/\\r?\\n/g, ' '); // Replace newlines with space\n}\n\nexport function containsSelector(el: Element, selector: string): boolean {\n return el.matches(selector) || !!el.querySelector(selector);\n}\n\nexport function getOffsetTop(node: Node) {\n let y = 0;\n let current: any = node;\n while (current) {\n y += current.offsetTop ?? 0;\n current = current.offsetParent;\n }\n return y;\n}\n\nexport function hasVisibleArea(element: Element) {\n const rect = element.getBoundingClientRect();\n const area = rect.width * rect.height;\n return area > 64;\n}\n\nexport function isDeepHidden(element: Element): boolean {\n if (isHidden(element)) {\n return true;\n }\n if (!hasVisibleArea(element)) {\n return [...element.children].every(el => isDeepHidden(el));\n }\n return false;\n}\n\nexport function isInteractive(el: Element) {\n const htmlEl = el as HTMLElement;\n if (INTERACTIVE_TAGS.includes(el.tagName.toLowerCase())) {\n return true;\n }\n const tabindex = htmlEl.getAttribute('tabindex');\n if (tabindex && parseInt(tabindex) >= 0) {\n return true;\n }\n const role = htmlEl.getAttribute('role') ?? htmlEl.getAttribute('aria-role') ?? '';\n if (INTERACTIVE_ROLES.includes(role)) {\n return true;\n }\n if (htmlEl.onclick != null) {\n return true;\n }\n const styles = getComputedStyle(htmlEl);\n if (styles.cursor === 'pointer') {\n return true;\n }\n return false;\n}\n\nexport function getViewportSize(): Viewport {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nexport function isRectInViewport(rect: DOMRect, viewport: Viewport) {\n return rect.left < viewport.width &&\n rect.right > 0 &&\n rect.top < viewport.height &&\n rect.bottom > 0;\n}\n\nexport function makeOverlaysOpaque(el: HTMLElement) {\n if (!(el as any)[ORIGINAL_STYLE_SYMBOL]) {\n (el as any)[ORIGINAL_STYLE_SYMBOL] = el.getAttribute('style');\n }\n // Only apply to big elements\n const rect = el.getBoundingClientRect();\n if (rect.width < 500 || rect.height < 500) {\n return;\n }\n const style = getComputedStyle(el);\n if (style.pointerEvents === 'none') {\n return;\n }\n el.style.setProperty('animation', 'none', 'important');\n el.style.setProperty('transition', 'none', 'important');\n el.style.setProperty('backdrop-filter', 'none', 'important');\n el.style.setProperty('mix-blend-mode', 'normal', 'important');\n el.style.setProperty('opacity', '1', 'important');\n el.style.setProperty('filter', 'none', 'important');\n const bg = style.backgroundColor;\n el.style.setProperty('background-color', removeAlpha(bg));\n}\n\nfunction removeAlpha(color: string) {\n const rgba = color.match(/^rgba\\((.*)\\)$/);\n if (!rgba) {\n return color;\n }\n const [r, g, b, a] = rgba[1].split(',').map(parseFloat);\n if (a > 0 && a < 1) {\n return `rgba(${r},${g},${b},1)`;\n }\n return color;\n}\n\nexport function isRandomIdentifier(str: string) {\n const words = str.split(/[_-]/g);\n return !words.some(w => isWordLike(w)) || words.some(w => isRandomString(w));\n}\n\nfunction isWordLike(str: string) {\n if (str.length <= 2) {\n return false;\n }\n // Words don't usually have a lot of vowels or consonants in a row\n if (/[^eyuioa]{4,}/.test(str)) {\n return false;\n }\n if (/[eyuioa]{4,}/.test(str)) {\n return false;\n }\n return true;\n}\n\nfunction isRandomString(str: string) {\n // Hex strings will often consist of at least one digit and A-F letters\n if (/^[0-9a-f]+$/i.test(str) && /[0-9]/.test(str)) {\n return true;\n }\n // Digits separated by non-digits are a sign of random ids\n if (/[0-9][^0-9]+[0-9]/.test(str)) {\n return true;\n }\n return false;\n}\n\nexport function fixZIndex(el: HTMLElement) {\n const _style = getComputedStyle(el);\n const zIndex = parseInt(_style.zIndex);\n if (!isNaN(zIndex)) {\n const maxZIndex = 2147483647;\n if (zIndex > maxZIndex - 200) {\n el.style.zIndex = String(zIndex - 1);\n }\n }\n}\n\nexport function getElementDepth(el: Element) {\n let depth = 0;\n while (el.parentElement) {\n el = el.parentElement;\n depth += 1;\n }\n return depth;\n}\n", "import { VxNode } from './parser.js';\n\nexport type TraverseSkipFunction = (vxNode: VxNode, depth: number, index: number) => boolean;\nexport type TraverseTransformFunction = (vxNode: VxNode, depth: number, index: number) => VxNode;\n\nexport interface TraverseVxNodeOptions {\n depth?: number;\n index?: number;\n transform?: TraverseTransformFunction;\n skip?: TraverseSkipFunction;\n}\n\nexport interface TraverseVxNodeResult {\n vxNode: VxNode;\n depth: number;\n index: number;\n}\n\nexport function* traverseVxNode(vxNode: VxNode, options: TraverseVxNodeOptions = {}): IterableIterator<TraverseVxNodeResult> {\n const depth = options.depth ?? 0;\n const index = options.index ?? 0;\n const transformed = options.transform ? options.transform(vxNode, depth, index) : vxNode;\n yield { vxNode: transformed, depth, index };\n for (const [index, child] of (transformed.children ?? []).entries()) {\n if (options.skip) {\n const skipping = options.skip(child, depth, index);\n if (skipping) {\n continue;\n }\n }\n yield* traverseVxNode(child, {\n ...options,\n index,\n depth: depth + 1,\n });\n }\n}\n\nexport function* traverseElements(element: Element): IterableIterator<Element> {\n if (!element) {\n return;\n }\n yield element;\n for (const child of element.children) {\n yield* traverseElements(child);\n }\n}\n", "import { getViewportSize } from './dom.js';\nimport { traverseElements } from './traverse.js';\n\n/**\n * Returns elements that have at least one corner visible in the viewport\n * and not occluded by other elements.\n */\nexport function probeViewport(): Element[] {\n const { width, height } = getViewportSize();\n const points = new PointSet(width, height);\n const result = new Set<Element>();\n for (const el of traverseElements(document.body)) {\n const rect = el.getBoundingClientRect();\n points.add(rect.left, rect.top);\n points.add(rect.right, rect.top);\n points.add(rect.left, rect.bottom);\n points.add(rect.right, rect.bottom);\n points.add(rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n for (const { x, y } of points.getAll()) {\n const element = document.elementFromPoint(x, y);\n if (element && !result.has(element)) {\n result.add(element);\n }\n }\n return Array.from(result);\n}\n\nexport class PointSet {\n\n private map = new Map<number, Set<number>>();\n\n constructor(public maxX: number, public maxY: number) {}\n\n *getAll() {\n for (const [y, set] of this.map.entries()) {\n for (const x of set) {\n yield { x, y };\n }\n }\n }\n\n has(x: number, y: number): boolean {\n if (x > this.maxX || y > this.maxY) {\n return false;\n }\n const set = this.map.get(y);\n return set ? set.has(x) : false;\n }\n\n add(x: number, y: number): void {\n if (x > this.maxX || y > this.maxY) {\n return;\n }\n const set = this.map.get(y);\n if (set) {\n set.add(x);\n } else {\n this.map.set(y, new Set([x]));\n }\n }\n\n}\n", "import { VxNode } from './parser.js';\n\nexport function isContainerNode(vxNode: VxNode): boolean {\n if (vxNode.tagName === 'select') {\n return false;\n }\n const children = vxNode.children ?? [];\n const hasTextChildren = children.some(child => !child.tagName);\n return children.length > 0 && !hasTextChildren;\n}\n\nexport function isObjectEmpty(obj: Record<string, any>): boolean {\n return !Object.values(obj).some(value => !!value);\n}\n\nexport function normalizeRef(ref: string): string {\n return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, '');\n}\n", "import { truncateAttrValue } from './dom.js';\nimport { VxNode } from './parser.js';\nimport { TraverseTransformFunction, traverseVxNode } from './traverse.js';\nimport { isContainerNode } from './util.js';\n\nexport interface VxRenderOptions {\n renderStyle?: 'html' | 'text';\n renderTagNames?: boolean;\n renderIds?: boolean;\n renderClassNames?: boolean;\n renderRefs?: boolean | 'all';\n renderLabelAttrs?: boolean;\n renderValueAttrs?: boolean;\n renderSrcAttrs?: boolean;\n renderDiff?: boolean;\n skipTags?: string[];\n skipNonInteractive?: boolean;\n maxSiblingTags?: Record<string, number>;\n}\n\nexport function renderVxNode(scope: VxNode, options: VxRenderOptions = {}) {\n const buffer = [];\n const transform = createRenderTransform(options);\n for (const { vxNode, depth } of traverseVxNode(scope, { transform })) {\n if (options.skipNonInteractive && !vxNode.isInteractive) {\n continue;\n }\n if (options.skipTags && options.skipTags.includes(vxNode.tagName ?? 'text')) {\n continue;\n }\n const indent = options.skipNonInteractive ? '' : ' '.repeat(depth);\n buffer.push(renderIndentedLine(indent, vxNode, options));\n }\n return buffer.join('\\n');\n}\n\nfunction renderIndentedLine(indent: string, vxNode: VxNode, options: VxRenderOptions = {}) {\n const diffPrefix = options.renderDiff ? (vxNode.isNew ? '+ ' : ' ') : '';\n if (!vxNode.tagName) {\n return [diffPrefix, indent, vxNode.textContent].filter(Boolean).join('');\n }\n const tagLine = renderTagLine(vxNode, options);\n const htmlStyle = options.renderStyle === 'html';\n return [\n diffPrefix,\n indent,\n tagLine,\n htmlStyle ? '' : ' ',\n vxNode.textContent ?? '',\n ].join('');\n}\n\nfunction renderTagLine(vxNode: VxNode, options: VxRenderOptions) {\n const htmlStyle = options.renderStyle === 'html';\n const components: Array<string | null> = [];\n if (options.renderTagNames && vxNode.tagName) {\n components.push(vxNode.tagName);\n }\n if (options.renderIds && vxNode.id) {\n if (htmlStyle) {\n components.push(`id=\"${vxNode.id}\"`);\n } else {\n components.push(`#${vxNode.id}`);\n }\n }\n if (options.renderClassNames && vxNode.classList?.length) {\n if (htmlStyle) {\n components.push(`class=\"${vxNode.classList.join(' ')}\"`);\n } else {\n components.push('.' + vxNode.classList.join('.'));\n }\n }\n if (options.renderRefs) {\n const isRenderRef = [\n options.renderRefs === 'all',\n options.renderRefs === true && !isContainerNode(vxNode),\n ].some(Boolean);\n if (isRenderRef) {\n components.push(`[@${vxNode.ref}]`);\n }\n }\n const attrs = [];\n if (options.renderLabelAttrs) {\n for (const [attr, value] of Object.entries(vxNode.labelAttrs ?? {})) {\n attrs.push(`${attr}=\"${truncateAttrValue(value)}\"`);\n }\n }\n if (options.renderValueAttrs) {\n for (const [attr, value] of Object.entries(vxNode.valueAttrs ?? {})) {\n attrs.push(`${attr}=\"${truncateAttrValue(value)}\"`);\n }\n }\n if (options.renderSrcAttrs) {\n for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {\n attrs.push(`${attr}=\"${truncateAttrValue(value)}\"`);\n }\n }\n if (htmlStyle) {\n components.push(...attrs);\n } else {\n components.push(...attrs.map(attr => `[${attr}]`));\n }\n return htmlStyle ? `<${components.join(' ')}>` : components.join('');\n}\n\nfunction createRenderTransform(options: VxRenderOptions): TraverseTransformFunction {\n const { maxSiblingTags } = options;\n return (vxNode: VxNode) => {\n if (maxSiblingTags) {\n const children: VxNode[] = [];\n const counts: Record<string, number> = {};\n for (const child of vxNode.children ?? []) {\n const tagName = child.tagName ?? '';\n const count = (counts[tagName] ?? 0) + 1;\n counts[tagName] = count;\n const maxCount = maxSiblingTags[tagName] ?? Infinity;\n if (count > maxCount) {\n continue;\n }\n children.push(child);\n }\n return { ...vxNode, children };\n }\n return vxNode;\n };\n}\n", "import { VxTreeOptions, VxTreeParser } from './parser.js';\nimport { VxTreeView } from './tree.js';\nimport { normalizeRef } from './util.js';\n\nexport const VX_DOM_SYMBOL = Symbol('vx:dom');\nexport const VX_TREE_SYMBOL = Symbol('vx:tree');\nexport const VX_LAST_REFS_SYMBOL = Symbol('vx:lastRefs');\n\nexport async function captureSnapshot(options: VxTreeOptions = {}) {\n const parser = new VxTreeParser(options);\n await parser.parse();\n const domMap = parser.getDomMap();\n const vxTree = parser.getTree();\n (globalThis as any)[VX_DOM_SYMBOL] = domMap;\n (globalThis as any)[VX_TREE_SYMBOL] = vxTree;\n return vxTree;\n}\n\nexport function getSnapshot(): VxTreeView {\n const vxTree = (globalThis as any)[VX_TREE_SYMBOL] as VxTreeView;\n if (!vxTree) {\n throw new Error('[VX] Snapshot not found');\n }\n return vxTree;\n}\n\nexport function resolveDomNode(ref: string): Node | null {\n const domMap = (globalThis as any)[VX_DOM_SYMBOL] as Map<string, Node>;\n if (!domMap) {\n return null;\n }\n const normalizedRef = normalizeRef(ref);\n return domMap.get(normalizedRef) ?? null;\n}\n", "import { highlightEl, VxHighlightOptions } from './highlight.js';\nimport { clearOverlay } from './overlay.js';\nimport { VxNode } from './parser.js';\nimport { renderVxNode, VxRenderOptions } from './render.js';\nimport { resolveDomNode } from './snapshot.js';\nimport { traverseVxNode, TraverseVxNodeOptions } from './traverse.js';\nimport { isContainerNode, normalizeRef } from './util.js';\n\nexport class VxTreeView {\n\n private refMap = new Map<string, VxNode>();\n\n constructor(\n public nodes: VxNode[],\n public frameId: string,\n public iframeRef?: string,\n ) {\n this.buildRefMap(nodes);\n }\n\n get nodeCount() {\n return this.refMap.size;\n }\n\n *traverse(options: TraverseVxNodeOptions = {}): IterableIterator<{ vxNode: VxNode; depth: number }> {\n for (const vxNode of this.nodes) {\n yield* traverseVxNode(vxNode, options);\n }\n }\n\n private buildRefMap(nodes: VxNode[]) {\n for (const node of nodes) {\n if (node.ref) {\n this.refMap.set(node.ref, node);\n }\n this.buildRefMap(node.children ?? []);\n }\n }\n\n hasRef(ref: string): boolean {\n const nref = normalizeRef(ref);\n return this.refMap.has(nref);\n }\n\n findNode(ref: string): VxNode | null {\n const nref = normalizeRef(ref);\n return this.refMap.get(nref) ?? null;\n }\n\n render(options: VxRenderOptions = {}) {\n return this.nodes.map(node => {\n return renderVxNode(node, options);\n }).join('\\n');\n }\n\n highlight(options: VxHighlightOptions = {}) {\n if (options.clearOverlay) {\n clearOverlay();\n }\n const leafOnly = !options.includeAll;\n const refs = this.collectRefs(leafOnly, options.filterRefs);\n this.highlightRefs(refs, options);\n }\n\n highlightRefs(refs: string[], options: VxHighlightOptions = {}) {\n for (const ref of refs) {\n const el = resolveDomNode(ref);\n if (el instanceof Element) {\n const vxNode = this.findNode(ref);\n const isNew = vxNode?.isNew ?? false;\n const color = options.useColors ? undefined : (isNew ? '#0a0' : '#060');\n highlightEl(el, ref, color);\n }\n }\n }\n\n collectRefs(leafOnly = true, filterRefs?: string[]) {\n const refs: string[] = [];\n filterRefs = filterRefs?.map(ref => normalizeRef(ref));\n for (const { vxNode } of this.traverse()) {\n if (!vxNode.ref) {\n continue;\n }\n if (leafOnly && isContainerNode(vxNode)) {\n continue;\n }\n if (filterRefs && !filterRefs.includes(vxNode.ref)) {\n continue;\n }\n refs.push(vxNode.ref);\n }\n return refs;\n }\n\n}\n", "import { getViewportSize, hasVisibleArea, isInteractive, isRandomIdentifier, isRectInViewport, makeOverlaysOpaque, normalizeText, truncateAttrValue, Viewport } from './dom.js';\nimport { isHidden } from './dom.js';\nimport { probeViewport } from './probe.js';\nimport { VxTreeView } from './tree.js';\nimport { isObjectEmpty } from './util.js';\n\nexport const VX_NODE_REF_SYMBOL = Symbol('vx:ref');\nexport const VX_NODE_COUNTER_SYMBOL = Symbol('vx:counter');\nexport const VX_IGNORE_SYMBOL = Symbol('vx:ignore');\n\nexport const VX_IGNORE_TAGS = ['svg', 'script', 'noscript', 'style', 'link', 'meta'];\n\nexport const VX_LABEL_ATTRS = [\n 'title',\n 'alt',\n 'placeholder',\n 'aria-role',\n 'aria-label',\n 'aria-description',\n 'aria-placeholder',\n 'aria-valuetext',\n];\nexport const VX_LABEL_ATTR_PATTERNS = [\n /^data-label/, // data-label attributes\n /title-/i, // title-* attributes\n];\nexport const VX_VALUE_ATTRS = ['value', 'checked', 'selected', 'disabled', 'readonly'];\nexport const VX_SRC_ATTRS = ['src', 'href'];\n\nexport const VX_TAG_PREFERENCE = [\n 'a', 'iframe', 'input', 'button', 'select', 'textarea', 'img', 'label',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'ul', 'ol', 'li', 'dl', 'dt', 'dd',\n 'section', 'article', 'main', 'header', 'footer', 'nav', 'aside',\n 'form', 'input', 'textarea', 'select', 'option', 'fieldset', 'legend',\n 'p', 'pre', 'code', 'blockquote', 'figure', 'figcaption',\n 'table', 'thead', 'tbody', 'tr', 'td', 'th',\n 'strong', 'em', 'sub', 'sup',\n];\n\nconst VX_KEEP_SELECTOR = 'a, button, input, textarea, select, label, iframe, option, optgroup';\n\nexport type VxDomNode = Element | Text;\n\nexport interface VxNode {\n ref?: string;\n tagName?: string;\n children?: VxNode[];\n id?: string;\n classList?: string[];\n textContent?: string;\n hasVisibleArea?: boolean;\n isInteractive?: boolean;\n isOutsideViewport?: boolean;\n isProbeHit?: boolean;\n isKept?: boolean;\n isNew?: boolean;\n srcAttrs?: Record<string, string>;\n labelAttrs?: Record<string, string>;\n valueAttrs?: Record<string, string>;\n}\n\nexport interface VxTreeOptions {\n frameId?: string;\n iframeRef?: string;\n skipImages?: boolean;\n viewportOnly?: boolean;\n probeViewport?: boolean;\n opaqueOverlays?: boolean;\n unnestDivs?: boolean;\n}\n\nexport type VxTransform = (vxNode: VxNode) => VxNode;\n\nexport class VxTreeParser {\n\n private frameId = '';\n private viewport: Viewport = { width: 0, height: 0 };\n private vxNodes: VxNode[] = [];\n private probeElements: Element[] = [];\n private domRefMap = new Map<string, Node>();\n\n private counter = 0;\n private usedCounters = new Set<number>();\n\n constructor(public options: VxTreeOptions = {}) {\n this.frameId = options.frameId ?? '';\n }\n\n parse() {\n this.viewport = getViewportSize();\n if (this.options.probeViewport) {\n this.probeElements = probeViewport();\n }\n this.usedCounters.clear();\n this.collectDomCounters(document.documentElement);\n const vxRoot = this.parseNode(document.documentElement, null)!;\n this.vxNodes = this.pruneRecursive(vxRoot);\n }\n\n getTree(): VxTreeView {\n return new VxTreeView(this.vxNodes, this.frameId, this.options.iframeRef);\n }\n\n getNodes(): VxNode[] {\n return this.vxNodes;\n }\n\n getDomMap() {\n return this.domRefMap;\n }\n\n private parseNode(node: Node, parent: VxNode | null): VxNode | null {\n if (!node || (node as any)[VX_IGNORE_SYMBOL]) {\n return null;\n }\n if (node instanceof Text) {\n // Single instances of Text nodes can only occur in \"text\"\n // (e.g. when regular text is interspersed with links and other elements)\n const textContent = normalizeText(node.textContent ?? '');\n if (textContent) {\n return {\n textContent,\n hasVisibleArea: parent?.hasVisibleArea,\n isOutsideViewport: parent?.isOutsideViewport,\n isProbeHit: parent?.isProbeHit,\n };\n }\n return null;\n }\n if (node instanceof Element) {\n if (this.options.opaqueOverlays) {\n makeOverlaysOpaque(node as HTMLElement);\n }\n return this.parseElement(node);\n }\n return null;\n }\n\n private parseElement(el: Element): VxNode | null {\n const skip = VX_IGNORE_TAGS.includes(el.tagName.toLowerCase()) || isHidden(el);\n if (skip) {\n this.clearRecursive(el);\n return null;\n }\n // OPTION and OPTGROUP are special cases, we evaluate their rects and visibility\n // checks using their parent SELECT element\n const parentEl = el.matches('option, optgroup') ? el.closest('select') ?? el : el;\n const rect = parentEl.getBoundingClientRect();\n const id = el.getAttribute('id') ?? '';\n const vxNode = this.makeElementNode(el, {\n tagName: el.tagName.toLowerCase(),\n id: isRandomIdentifier(id) ? undefined : id,\n classList: Array.from(el.classList)\n .filter(cls => !isRandomIdentifier(cls))\n .slice(0, 4),\n labelAttrs: this.collectLabelAttrs(el),\n valueAttrs: this.collectValueAttrs(el),\n srcAttrs: this.collectSrcAttrs(el),\n hasVisibleArea: hasVisibleArea(parentEl),\n isInteractive: isInteractive(parentEl),\n isOutsideViewport: !isRectInViewport(rect, this.viewport),\n isProbeHit: this.isProbeHit(parentEl),\n isKept: el.matches(VX_KEEP_SELECTOR),\n });\n const children: VxNode[] = [];\n for (const child of el.childNodes) {\n const childNode = this.parseNode(child, vxNode);\n if (childNode != null) {\n children.push(childNode);\n }\n }\n // Special case: if the only child is a text node, return a single node with the text content\n if (children.length === 1 && !children[0]?.tagName) {\n vxNode.textContent = normalizeText(children[0].textContent ?? '');\n } else {\n vxNode.children = children;\n }\n return vxNode;\n }\n\n private makeElementNode(el: Element, spec: Omit<VxNode, 'ref'>): VxNode {\n const existingRef = (el as any)[VX_NODE_REF_SYMBOL];\n const isNew = existingRef === undefined;\n let ref;\n if (isNew) {\n const counter = this.nextCounterValue();\n ref = `${this.frameId}${counter}`;\n this.usedCounters.add(counter);\n (el as any)[VX_NODE_COUNTER_SYMBOL] = counter;\n (el as any)[VX_NODE_REF_SYMBOL] = ref;\n } else {\n ref = existingRef;\n }\n const vxNode: VxNode = {\n ...spec,\n ref,\n isNew,\n };\n this.domRefMap.set(ref, el);\n return vxNode;\n }\n\n private pruneRecursive(vxNode: VxNode | null): VxNode[] {\n if (!vxNode) {\n return [];\n }\n const children = vxNode.children ?? [];\n // Recursively prune children\n const newChildren = children.flatMap(child => this.pruneRecursive(child));\n // If the node itself is omitted, replace it with children\n if (this.shouldOmit(vxNode)) {\n return newChildren;\n }\n vxNode.children = newChildren;\n // Collapse single-child elements\n if (newChildren.length === 1) {\n const child = newChildren[0];\n return this.collapseSingleChild(vxNode, child);\n }\n return [vxNode];\n }\n\n private collapseSingleChild(parent: VxNode, child: VxNode): VxNode[] {\n const preferParent = this.collapsePreferParent(parent, child);\n const merged = preferParent ?\n this.collapseMerge(parent, child) :\n this.collapseMerge(child, parent);\n return this.pruneRecursive({\n ...merged,\n children: child.children,\n textContent: child.textContent,\n });\n }\n\n private collapsePreferParent(parent: VxNode, child: VxNode) {\n const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? '');\n const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? '');\n if (parentRank === -1 && childRank === -1) {\n const parentAttrCount = Object.keys({\n ...parent.labelAttrs,\n ...parent.valueAttrs,\n ...parent.srcAttrs,\n }).length;\n const childAttrCount = Object.keys({\n ...child.labelAttrs,\n ...child.valueAttrs,\n ...child.srcAttrs,\n }).length;\n return parentAttrCount > childAttrCount;\n }\n return parentRank !== -1 && (childRank === -1 || parentRank < childRank);\n }\n\n private collapseMerge(a: VxNode, b: VxNode): VxNode {\n return {\n ...b,\n ...a,\n labelAttrs: { ...b.labelAttrs, ...a.labelAttrs },\n valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },\n srcAttrs: { ...b.srcAttrs, ...a.srcAttrs },\n };\n }\n\n private shouldOmit(vxNode: VxNode): boolean {\n const tagName = vxNode.tagName ?? '';\n if (!vxNode.hasVisibleArea) {\n return true;\n }\n if (this.options.viewportOnly && vxNode.isOutsideViewport) {\n return true;\n }\n if (this.options.probeViewport && !vxNode.isProbeHit) {\n return true;\n }\n if (this.options.skipImages && vxNode.tagName === 'img') {\n return true;\n }\n const hasText = !!vxNode.textContent;\n const hasChildren = (vxNode.children ?? []).length > 0;\n const hasAttrs = [vxNode.labelAttrs, vxNode.valueAttrs, vxNode.srcAttrs]\n .some(attrs => !isObjectEmpty(attrs ?? {}));\n if (this.options.unnestDivs) {\n const isDivOrSpan = ['div', 'span'].includes(tagName);\n if (isDivOrSpan && hasChildren && !hasAttrs) {\n return true;\n }\n }\n if (vxNode.isKept) {\n return false;\n }\n return !hasText && !hasAttrs && !hasChildren;\n }\n\n private isProbeHit(el: Element): boolean {\n // TODO this is a bit brute-forcish, consider improving\n for (const probeEl of this.probeElements) {\n if (el.contains(probeEl)) {\n return true;\n }\n }\n return false;\n }\n\n private collectLabelAttrs(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n // Loop through all element attributes\n for (const attr of el.attributes) {\n const attrName = attr.name;\n const value = truncateAttrValue(attr.value);\n if (!value) {\n continue; // Skip empty values\n }\n // Check for exact matches in VX_LABEL_ATTRS\n if (VX_LABEL_ATTRS.includes(attrName)) {\n attrs[attrName] = value;\n continue;\n }\n // Check for regex pattern matches\n if (VX_LABEL_ATTR_PATTERNS.some(pattern => pattern.test(attrName))) {\n attrs[attrName] = value;\n }\n }\n return attrs;\n }\n\n private collectValueAttrs(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of VX_VALUE_ATTRS) {\n const value = (el as any)[attr] ?? '';\n if (value) {\n attrs[attr] = String(value);\n }\n }\n return attrs;\n }\n\n private collectSrcAttrs(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of VX_SRC_ATTRS) {\n const value = truncateAttrValue((el as any)[attr] ?? '');\n if (value) {\n attrs[attr] = value;\n }\n }\n return attrs;\n }\n\n private clearRecursive(node: Node) {\n delete (node as any)[VX_NODE_REF_SYMBOL];\n delete (node as any)[VX_NODE_COUNTER_SYMBOL];\n if (node instanceof Element) {\n for (const child of node.children) {\n this.clearRecursive(child as Element);\n }\n }\n }\n\n private nextCounterValue() {\n while (this.usedCounters.has(this.counter)) {\n this.counter += 1;\n }\n return this.counter;\n }\n\n private collectDomCounters(el: Element) {\n if (!el) {\n return;\n }\n const cnt = (el as any)[VX_NODE_COUNTER_SYMBOL];\n if (cnt !== undefined) {\n this.usedCounters.add(cnt);\n }\n for (const child of el.children ?? []) {\n this.collectDomCounters(child as Element);\n }\n }\n\n}\n", "import { VX_IGNORE_SYMBOL } from './parser.js';\n\nexport function showPoint(x: number, y: number, clear = true) {\n if (clear) {\n clearOverlay();\n }\n const point = document.createElement('div');\n point.style.position = 'absolute';\n point.style.left = `${x}px`;\n point.style.top = `${y}px`;\n point.style.width = '32px';\n point.style.height = '32px';\n point.style.transform = 'translate(-50%, -50%)';\n point.style.backgroundColor = 'red';\n point.style.borderRadius = '100%';\n point.style.opacity = '0.5';\n const container = getOverlayContainer();\n container.appendChild(point);\n}\n\nexport function clearOverlay() {\n const container = getOverlayContainer();\n container.remove();\n}\n\nexport function getOverlayContainer() {\n let container = document.querySelector('#webvision-overlay') as HTMLElement;\n if (!container) {\n container = document.createElement('div');\n (container as any)[VX_IGNORE_SYMBOL] = true;\n container.id = 'webvision-overlay';\n container.style.position = 'fixed';\n container.style.top = '0';\n container.style.left = '0';\n container.style.bottom = '0';\n container.style.right = '0';\n container.style.zIndex = '2147483647'; // Maximum z-index value\n container.style.pointerEvents = 'none';\n document.body.appendChild(container);\n }\n return container;\n}\n", "import { getOverlayContainer } from './overlay.js';\n\nexport interface VxHighlightOptions {\n highlight?: boolean;\n clearOverlay?: boolean;\n includeAll?: boolean;\n filterRefs?: string[];\n useColors?: boolean;\n}\n\nexport function highlightEl(el: Element, ref: string, color?: string) {\n if (!(el instanceof Element)) {\n return;\n }\n if (el instanceof HTMLOptGroupElement) {\n return;\n }\n if (el instanceof HTMLOptionElement) {\n return;\n }\n const container = getOverlayContainer();\n const rect = el.getBoundingClientRect();\n const overlay = document.createElement('div');\n container.appendChild(overlay);\n overlay.style.position = 'absolute';\n overlay.style.top = `${rect.top}px`;\n overlay.style.left = `${rect.left}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.border = `2px solid ${color}`;\n const label = document.createElement('div');\n overlay.appendChild(label);\n label.style.position = 'absolute';\n label.style.bottom = `100%`;\n label.style.left = `0`;\n label.style.backgroundColor = color ?? getRandomColor(ref);\n label.style.color = 'white';\n label.style.fontSize = '10px';\n label.style.fontFamily = 'monospace';\n label.style.fontWeight = 'normal';\n label.style.fontStyle = 'normal';\n label.style.opacity = '0.8';\n label.style.padding = '0 2px';\n label.style.transform = 'translateY(50%)';\n label.textContent = String(ref);\n}\n\nfunction getRandomColor(ref: string) {\n const index = ref.charCodeAt(0);\n const hue = (index * 120 * .382) % 360;\n return `hsl(${hue}, 85%, 50%)`;\n}\n", "import { VxNode } from './parser.js';\nimport { VxRenderOptions } from './render.js';\nimport { VxTreeView } from './tree.js';\n\nexport class VxPageView {\n\n private vxTreeMap = new Map<string, VxTreeView>();\n\n constructor(vxTrees: VxTreeView[]) {\n for (const vxTree of vxTrees) {\n this.vxTreeMap.set(vxTree.frameId, vxTree);\n }\n }\n\n get vxTrees() {\n return [...this.vxTreeMap.values()];\n }\n\n get nodeCount() {\n return this.vxTrees.reduce((acc, vxTree) => acc + vxTree.nodeCount, 0);\n }\n\n findNodeByRef(ref: string): VxNode | null {\n const frame = this.findFrameByRef(ref);\n if (frame == null) {\n return null;\n }\n return frame.findNode(ref);\n }\n\n findFrameById(frameId: string): VxTreeView | null {\n return this.vxTreeMap.get(frameId) ?? null;\n }\n\n findFrameByRef(ref: string): VxTreeView | null {\n const frame = this.vxTrees.find(f => f.hasRef(ref));\n return frame ?? null;\n }\n\n getFrameByRef(ref: string): VxTreeView {\n const frame = this.findFrameByRef(ref);\n if (frame == null) {\n throw new Error(`[VX] Frame not found for [ref=${ref}]`);\n }\n return frame;\n }\n\n findParentFrame(frameId: string): VxTreeView | null {\n const frame = this.findFrameById(frameId);\n const iframeRef = frame?.iframeRef;\n if (iframeRef == null) {\n return null;\n }\n return this.findFrameByRef(iframeRef);\n }\n\n isFrameShown(frameId: string): boolean {\n const frame = this.findFrameById(frameId);\n if (!frame) {\n return false;\n }\n const parentFrame = this.findParentFrame(frameId);\n const { iframeRef } = frame;\n if (parentFrame == null || iframeRef == null) {\n // Top level document is always shown\n return true;\n }\n const existsInParent = !!parentFrame.findNode(iframeRef);\n return existsInParent ? this.isFrameShown(parentFrame.frameId) : false;\n }\n\n renderAll(options: VxRenderOptions) {\n return this.vxTrees.map(frame => {\n const rendered = frame?.render(options);\n return [\n `FRAME ${frame.frameId}${frame.iframeRef ? ` [@${frame.iframeRef}]` : ''}`,\n rendered,\n ].join('\\n\\n');\n }).join('\\n\\n');\n }\n\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../src/page/index.ts", "../src/page/util.ts", "../src/page/dom.ts", "../src/page/traverse.ts", "../src/page/probe.ts", "../src/page/render.ts", "../src/page/snapshot.ts", "../src/page/tree.ts", "../src/page/parser.ts", "../src/page/overlay.ts", "../src/page/highlight.ts", "../src/page/page.ts"],
|
|
4
|
+
"sourcesContent": ["export * from './dom.js';\nexport * from './highlight.js';\nexport * from './overlay.js';\nexport * from './page.js';\nexport * from './parser.js';\nexport * from './probe.js';\nexport * from './render.js';\nexport * from './snapshot.js';\nexport * from './traverse.js';\nexport * from './tree.js';\nexport * from './util.js';\n", "import { VxNode } from './parser.js';\n\nexport function isContainerNode(vxNode: VxNode): boolean {\n if (vxNode.tagName === 'select') {\n return false;\n }\n const children = vxNode.children ?? [];\n const hasTextChildren = children.some(child => !child.tagName);\n return children.length > 0 && !hasTextChildren;\n}\n\nexport function isObjectEmpty(obj: Record<string, any>): boolean {\n return !Object.values(obj).some(value => !!value);\n}\n\nexport function normalizeRef(ref: string): string {\n return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, '');\n}\n\nexport function* iterate<T>(items: ArrayLike<T> | null | undefined): IterableIterator<T> {\n if (!items) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n yield item;\n }\n}\n", "import { iterate } from './util.js';\n\nconst ORIGINAL_STYLE_SYMBOL = Symbol('vx:originalStyle');\n\nexport const INTERACTIVE_TAGS = ['a', 'button', 'input', 'textarea', 'select', 'label', 'option', 'optgroup'];\nexport const INTERACTIVE_ROLES = [\n 'clickable', 'button', 'link', 'checkbox', 'radio', 'textbox', 'combobox', 'listbox', 'menu', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'optgroup', 'progressbar', 'scrollbar', 'slider', 'spinbutton', 'switch', 'tab', 'tablist', 'timer', 'toolbar'];\n\nexport interface Viewport {\n width: number;\n height: number;\n}\n\nexport function isHidden(el: Element) {\n const style = getComputedStyle(el);\n if (style.display === 'none') {\n return true;\n }\n if (style.visibility === 'hidden') {\n return true;\n }\n if (style.opacity === '0') {\n return true;\n }\n return false;\n}\n\nexport function getNormalizedText(el: Element): string {\n return normalizeText(el.textContent ?? '');\n}\n\nexport function normalizeText(str: string) {\n return str\n .replace(/\\p{Cf}/gu, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nexport function truncateAttrValue(value: string, limit = 100) {\n if (value.match(/^(javascript:)?void/)) {\n return '';\n }\n if (value.startsWith('data:')) {\n return '';\n }\n if (value.length > limit) {\n return value.slice(0, limit) + '\u2026';\n }\n return value;\n}\n\nexport function escapeAttribute(value: string) {\n return value\n .replace(/&/g, '&') // Escape ampersand first!\n .replace(/\"/g, '"') // Escape double quotes\n .replace(/'/g, ''') // Escape single quotes\n .replace(/</g, '<') // Escape less than\n .replace(/>/g, '>') // Escape greater than\n .replace(/\\r?\\n/g, ' '); // Replace newlines with space\n}\n\nexport function containsSelector(el: Element, selector: string): boolean {\n return el.matches(selector) || !!el.querySelector(selector);\n}\n\nexport function getOffsetTop(node: Node) {\n let y = 0;\n let current: any = node;\n while (current) {\n y += current.offsetTop ?? 0;\n current = current.offsetParent;\n }\n return y;\n}\n\nexport function hasVisibleArea(element: Element) {\n const rect = element.getBoundingClientRect();\n const area = rect.width * rect.height;\n return area > 64;\n}\n\nexport function isDeepHidden(element: Element): boolean {\n if (isHidden(element)) {\n return true;\n }\n if (!hasVisibleArea(element)) {\n if (element.children.length === 0) {\n return true;\n }\n for (const child of iterate(element.children)) {\n if (!isDeepHidden(child)) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\nexport function isInteractive(el: Element) {\n const htmlEl = el as HTMLElement;\n if (INTERACTIVE_TAGS.includes(el.tagName.toLowerCase())) {\n return true;\n }\n const tabindex = htmlEl.getAttribute('tabindex');\n if (tabindex && parseInt(tabindex) >= 0) {\n return true;\n }\n const role = htmlEl.getAttribute('role') ?? htmlEl.getAttribute('aria-role') ?? '';\n if (INTERACTIVE_ROLES.includes(role)) {\n return true;\n }\n if (htmlEl.onclick != null) {\n return true;\n }\n const styles = getComputedStyle(htmlEl);\n if (styles.cursor === 'pointer') {\n return true;\n }\n return false;\n}\n\nexport function getViewportSize(): Viewport {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nexport function isRectInViewport(rect: DOMRect, viewport: Viewport) {\n return rect.left < viewport.width &&\n rect.right > 0 &&\n rect.top < viewport.height &&\n rect.bottom > 0;\n}\n\nexport function makeOverlaysOpaque(el: HTMLElement) {\n if (!(el as any)[ORIGINAL_STYLE_SYMBOL]) {\n (el as any)[ORIGINAL_STYLE_SYMBOL] = el.getAttribute('style');\n }\n // Only apply to big elements\n const rect = el.getBoundingClientRect();\n if (rect.width < 500 || rect.height < 500) {\n return;\n }\n const style = getComputedStyle(el);\n if (style.pointerEvents === 'none') {\n return;\n }\n el.style.setProperty('animation', 'none', 'important');\n el.style.setProperty('transition', 'none', 'important');\n el.style.setProperty('backdrop-filter', 'none', 'important');\n el.style.setProperty('mix-blend-mode', 'normal', 'important');\n el.style.setProperty('opacity', '1', 'important');\n el.style.setProperty('filter', 'none', 'important');\n const bg = style.backgroundColor;\n el.style.setProperty('background-color', removeAlpha(bg));\n}\n\nfunction removeAlpha(color: string) {\n const rgba = color.match(/^rgba\\((.*)\\)$/);\n if (!rgba) {\n return color;\n }\n const [r, g, b, a] = rgba[1].split(',').map(parseFloat);\n if (a > 0 && a < 1) {\n return `rgba(${r},${g},${b},1)`;\n }\n return color;\n}\n\nexport function isRandomIdentifier(str: string) {\n const words = str.split(/[_-]/g);\n return !words.some(w => isWordLike(w)) || words.some(w => isRandomString(w));\n}\n\nfunction isWordLike(str: string) {\n if (str.length <= 2) {\n return false;\n }\n // Words don't usually have a lot of vowels or consonants in a row\n if (/[^eyuioa]{4,}/.test(str)) {\n return false;\n }\n if (/[eyuioa]{4,}/.test(str)) {\n return false;\n }\n return true;\n}\n\nfunction isRandomString(str: string) {\n // Hex strings will often consist of at least one digit and A-F letters\n if (/^[0-9a-f]+$/i.test(str) && /[0-9]/.test(str)) {\n return true;\n }\n // Digits separated by non-digits are a sign of random ids\n if (/[0-9][^0-9]+[0-9]/.test(str)) {\n return true;\n }\n return false;\n}\n\nexport function fixZIndex(el: HTMLElement) {\n const _style = getComputedStyle(el);\n const zIndex = parseInt(_style.zIndex);\n if (!isNaN(zIndex)) {\n const maxZIndex = 2147483647;\n if (zIndex > maxZIndex - 200) {\n el.style.zIndex = String(zIndex - 1);\n }\n }\n}\n\nexport function getElementDepth(el: Element) {\n let depth = 0;\n while (el.parentElement) {\n el = el.parentElement;\n depth += 1;\n }\n return depth;\n}\n", "import { VxNode } from './parser.js';\nimport { iterate } from './util.js';\n\nexport type TraverseSkipFunction = (vxNode: VxNode, depth: number, index: number) => boolean;\nexport type TraverseTransformFunction = (vxNode: VxNode, depth: number, index: number) => VxNode;\n\nexport interface TraverseVxNodeOptions {\n depth?: number;\n index?: number;\n transform?: TraverseTransformFunction;\n skip?: TraverseSkipFunction;\n}\n\nexport interface TraverseVxNodeResult {\n vxNode: VxNode;\n depth: number;\n index: number;\n}\n\nexport function* traverseVxNode(vxNode: VxNode, options: TraverseVxNodeOptions = {}): IterableIterator<TraverseVxNodeResult> {\n const depth = options.depth ?? 0;\n const index = options.index ?? 0;\n const transformed = options.transform ? options.transform(vxNode, depth, index) : vxNode;\n yield { vxNode: transformed, depth, index };\n for (const [index, child] of (transformed.children ?? []).entries()) {\n if (options.skip) {\n const skipping = options.skip(child, depth, index);\n if (skipping) {\n continue;\n }\n }\n yield* traverseVxNode(child, {\n ...options,\n index,\n depth: depth + 1,\n });\n }\n}\n\nexport function* traverseElements(element: Element): IterableIterator<Element> {\n if (!element) {\n return;\n }\n yield element;\n for (const child of iterate(element.children)) {\n yield* traverseElements(child);\n }\n if (element.shadowRoot) {\n for (const child of iterate(element.shadowRoot.children)) {\n yield* traverseElements(child);\n }\n }\n}\n", "import { getViewportSize } from './dom.js';\nimport { traverseElements } from './traverse.js';\n\n/**\n * Returns elements that have at least one corner visible in the viewport\n * and not occluded by other elements.\n */\nexport function probeViewport(): Element[] {\n const { width, height } = getViewportSize();\n const points = new PointSet(width, height);\n const result = new Set<Element>();\n for (const el of traverseElements(document.body)) {\n const rect = el.getBoundingClientRect();\n points.add(rect.left, rect.top);\n points.add(rect.right, rect.top);\n points.add(rect.left, rect.bottom);\n points.add(rect.right, rect.bottom);\n points.add(rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n for (const { x, y } of points.getAll()) {\n const element = document.elementFromPoint(x, y);\n if (element && !result.has(element)) {\n result.add(element);\n }\n }\n return Array.from(result);\n}\n\nexport class PointSet {\n\n private map = new Map<number, Set<number>>();\n\n constructor(public maxX: number, public maxY: number) {}\n\n *getAll() {\n for (const [y, set] of this.map.entries()) {\n for (const x of set) {\n yield { x, y };\n }\n }\n }\n\n has(x: number, y: number): boolean {\n if (x > this.maxX || y > this.maxY) {\n return false;\n }\n const set = this.map.get(y);\n return set ? set.has(x) : false;\n }\n\n add(x: number, y: number): void {\n if (x > this.maxX || y > this.maxY) {\n return;\n }\n const set = this.map.get(y);\n if (set) {\n set.add(x);\n } else {\n this.map.set(y, new Set([x]));\n }\n }\n\n}\n", "import { truncateAttrValue } from './dom.js';\nimport { VxNode } from './parser.js';\nimport { TraverseTransformFunction, traverseVxNode } from './traverse.js';\nimport { isContainerNode } from './util.js';\n\nexport interface VxRenderOptions {\n renderStyle?: 'html' | 'text';\n renderTagNames?: boolean;\n renderIds?: boolean;\n renderClassNames?: boolean;\n renderRefs?: boolean | 'all';\n renderLabelAttrs?: boolean;\n renderValueAttrs?: boolean;\n renderSrcAttrs?: boolean;\n renderDiff?: boolean;\n skipTags?: string[];\n skipNonInteractive?: boolean;\n maxSiblingTags?: Record<string, number>;\n}\n\nexport function renderVxNode(scope: VxNode, options: VxRenderOptions = {}) {\n const buffer = [];\n const transform = createRenderTransform(options);\n for (const { vxNode, depth } of traverseVxNode(scope, { transform })) {\n if (options.skipNonInteractive && !vxNode.isInteractive) {\n continue;\n }\n if (options.skipTags && options.skipTags.includes(vxNode.tagName ?? 'text')) {\n continue;\n }\n const indent = options.skipNonInteractive ? '' : ' '.repeat(depth);\n buffer.push(renderIndentedLine(indent, vxNode, options));\n }\n return buffer.join('\\n');\n}\n\nfunction renderIndentedLine(indent: string, vxNode: VxNode, options: VxRenderOptions = {}) {\n const diffPrefix = options.renderDiff ? (vxNode.isNew ? '+ ' : ' ') : '';\n if (!vxNode.tagName) {\n return [diffPrefix, indent, vxNode.textContent].filter(Boolean).join('');\n }\n const tagLine = renderTagLine(vxNode, options);\n const htmlStyle = options.renderStyle === 'html';\n return [\n diffPrefix,\n indent,\n tagLine,\n htmlStyle ? '' : ' ',\n vxNode.textContent ?? '',\n ].join('');\n}\n\nfunction renderTagLine(vxNode: VxNode, options: VxRenderOptions) {\n const htmlStyle = options.renderStyle === 'html';\n const components: Array<string | null> = [];\n if (options.renderTagNames && vxNode.tagName) {\n components.push(vxNode.tagName);\n }\n if (options.renderIds && vxNode.id) {\n if (htmlStyle) {\n components.push(`id=\"${vxNode.id}\"`);\n } else {\n components.push(`#${vxNode.id}`);\n }\n }\n if (options.renderClassNames && vxNode.classList?.length) {\n if (htmlStyle) {\n components.push(`class=\"${vxNode.classList.join(' ')}\"`);\n } else {\n components.push('.' + vxNode.classList.join('.'));\n }\n }\n if (options.renderRefs) {\n const isRenderRef = [\n options.renderRefs === 'all',\n options.renderRefs === true && !isContainerNode(vxNode),\n ].some(Boolean);\n if (isRenderRef) {\n components.push(`[@${vxNode.ref}]`);\n }\n }\n const attrs = [];\n if (options.renderLabelAttrs) {\n for (const [attr, value] of Object.entries(vxNode.labelAttrs ?? {})) {\n attrs.push(`${attr}=\"${truncateAttrValue(value)}\"`);\n }\n }\n if (options.renderValueAttrs) {\n for (const [attr, value] of Object.entries(vxNode.valueAttrs ?? {})) {\n attrs.push(`${attr}=\"${truncateAttrValue(value)}\"`);\n }\n }\n if (options.renderSrcAttrs) {\n for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {\n attrs.push(`${attr}=\"${truncateAttrValue(value)}\"`);\n }\n }\n if (htmlStyle) {\n components.push(...attrs);\n } else {\n components.push(...attrs.map(attr => `[${attr}]`));\n }\n return htmlStyle ? `<${components.join(' ')}>` : components.join('');\n}\n\nfunction createRenderTransform(options: VxRenderOptions): TraverseTransformFunction {\n const { maxSiblingTags } = options;\n return (vxNode: VxNode) => {\n if (maxSiblingTags) {\n const children: VxNode[] = [];\n const counts: Record<string, number> = {};\n for (const child of vxNode.children ?? []) {\n const tagName = child.tagName ?? '';\n const count = (counts[tagName] ?? 0) + 1;\n counts[tagName] = count;\n const maxCount = maxSiblingTags[tagName] ?? Infinity;\n if (count > maxCount) {\n continue;\n }\n children.push(child);\n }\n return { ...vxNode, children };\n }\n return vxNode;\n };\n}\n", "import { VxTreeOptions, VxTreeParser } from './parser.js';\nimport { VxTreeView } from './tree.js';\nimport { normalizeRef } from './util.js';\n\nexport const VX_DOM_SYMBOL = Symbol('vx:dom');\nexport const VX_TREE_SYMBOL = Symbol('vx:tree');\nexport const VX_LAST_REFS_SYMBOL = Symbol('vx:lastRefs');\n\nexport async function captureSnapshot(options: VxTreeOptions = {}) {\n const parser = new VxTreeParser(options);\n parser.parse();\n const domMap = parser.getDomMap();\n const vxTree = parser.getTree();\n (globalThis as any)[VX_DOM_SYMBOL] = domMap;\n (globalThis as any)[VX_TREE_SYMBOL] = vxTree;\n return vxTree;\n}\n\nexport function getSnapshot(): VxTreeView {\n const vxTree = (globalThis as any)[VX_TREE_SYMBOL] as VxTreeView;\n if (!vxTree) {\n throw new Error('[VX] Snapshot not found');\n }\n return vxTree;\n}\n\nexport function resolveDomNode(ref: string): Node | null {\n const domMap = (globalThis as any)[VX_DOM_SYMBOL] as Map<string, Node>;\n if (!domMap) {\n return null;\n }\n const normalizedRef = normalizeRef(ref);\n return domMap.get(normalizedRef) ?? null;\n}\n", "import { highlightEl, VxHighlightOptions } from './highlight.js';\nimport { clearOverlay } from './overlay.js';\nimport { VxNode } from './parser.js';\nimport { renderVxNode, VxRenderOptions } from './render.js';\nimport { resolveDomNode } from './snapshot.js';\nimport { traverseVxNode, TraverseVxNodeOptions } from './traverse.js';\nimport { isContainerNode, normalizeRef } from './util.js';\n\nexport class VxTreeView {\n\n private refMap = new Map<string, VxNode>();\n\n constructor(\n public nodes: VxNode[],\n public frameId: string,\n public iframeRef?: string,\n ) {\n this.buildRefMap(nodes);\n }\n\n get nodeCount() {\n return this.refMap.size;\n }\n\n *traverse(options: TraverseVxNodeOptions = {}): IterableIterator<{ vxNode: VxNode; depth: number }> {\n for (const vxNode of this.nodes) {\n yield* traverseVxNode(vxNode, options);\n }\n }\n\n private buildRefMap(nodes: VxNode[]) {\n for (const node of nodes) {\n if (node.ref) {\n this.refMap.set(node.ref, node);\n }\n this.buildRefMap(node.children ?? []);\n }\n }\n\n hasRef(ref: string): boolean {\n const nref = normalizeRef(ref);\n return this.refMap.has(nref);\n }\n\n findNode(ref: string): VxNode | null {\n const nref = normalizeRef(ref);\n return this.refMap.get(nref) ?? null;\n }\n\n render(options: VxRenderOptions = {}) {\n return this.nodes.map(node => {\n return renderVxNode(node, options);\n }).join('\\n');\n }\n\n highlight(options: VxHighlightOptions = {}) {\n if (options.clearOverlay) {\n clearOverlay();\n }\n const leafOnly = !options.includeAll;\n const refs = this.collectRefs(leafOnly, options.filterRefs);\n this.highlightRefs(refs, options);\n }\n\n highlightRefs(refs: string[], options: VxHighlightOptions = {}) {\n for (const ref of refs) {\n const el = resolveDomNode(ref);\n if (el instanceof Element) {\n const vxNode = this.findNode(ref);\n const isNew = vxNode?.isNew ?? false;\n const color = options.useColors ? undefined : (isNew ? '#0a0' : '#060');\n highlightEl(el, ref, color);\n }\n }\n }\n\n collectRefs(leafOnly = true, filterRefs?: string[]) {\n const refs: string[] = [];\n filterRefs = filterRefs?.map(ref => normalizeRef(ref));\n for (const { vxNode } of this.traverse()) {\n if (!vxNode.ref) {\n continue;\n }\n if (leafOnly && isContainerNode(vxNode)) {\n continue;\n }\n if (filterRefs && !filterRefs.includes(vxNode.ref)) {\n continue;\n }\n refs.push(vxNode.ref);\n }\n return refs;\n }\n\n}\n", "import { getViewportSize, hasVisibleArea, isInteractive, isRandomIdentifier, isRectInViewport, makeOverlaysOpaque, normalizeText, truncateAttrValue, Viewport } from './dom.js';\nimport { isHidden } from './dom.js';\nimport { probeViewport } from './probe.js';\nimport { VxTreeView } from './tree.js';\nimport { isObjectEmpty, iterate } from './util.js';\n\nexport const VX_NODE_REF_SYMBOL = Symbol('vx:ref');\nexport const VX_NODE_COUNTER_SYMBOL = Symbol('vx:counter');\nexport const VX_IGNORE_SYMBOL = Symbol('vx:ignore');\n\nexport const VX_IGNORE_TAGS = ['svg', 'script', 'noscript', 'style', 'link', 'meta'];\n\nexport const VX_LABEL_ATTRS = [\n 'title',\n 'alt',\n 'placeholder',\n 'aria-role',\n 'aria-label',\n 'aria-description',\n 'aria-placeholder',\n 'aria-valuetext',\n];\nexport const VX_LABEL_ATTR_PATTERNS = [\n /^data-label/, // data-label attributes\n /title-/i, // title-* attributes\n];\nexport const VX_VALUE_ATTRS = ['value', 'checked', 'selected', 'disabled', 'readonly'];\nexport const VX_SRC_ATTRS = ['src', 'href'];\n\nexport const VX_TAG_PREFERENCE = [\n 'a', 'iframe', 'input', 'button', 'select', 'textarea', 'img', 'label',\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'ul', 'ol', 'li', 'dl', 'dt', 'dd',\n 'section', 'article', 'main', 'header', 'footer', 'nav', 'aside',\n 'form', 'input', 'textarea', 'select', 'option', 'fieldset', 'legend',\n 'p', 'pre', 'code', 'blockquote', 'figure', 'figcaption',\n 'table', 'thead', 'tbody', 'tr', 'td', 'th',\n 'strong', 'em', 'sub', 'sup',\n];\n\nconst VX_KEEP_SELECTOR = 'a, button, input, textarea, select, label, iframe, option, optgroup';\n\nexport type VxDomNode = Element | Text;\n\nexport interface VxNode {\n ref?: string;\n tagName?: string;\n children?: VxNode[];\n id?: string;\n classList?: string[];\n textContent?: string;\n hasVisibleArea?: boolean;\n isInteractive?: boolean;\n isOutsideViewport?: boolean;\n isProbeHit?: boolean;\n isKept?: boolean;\n isNew?: boolean;\n srcAttrs?: Record<string, string>;\n labelAttrs?: Record<string, string>;\n valueAttrs?: Record<string, string>;\n}\n\nexport interface VxTreeOptions {\n frameId?: string;\n iframeRef?: string;\n skipImages?: boolean;\n viewportOnly?: boolean;\n probeViewport?: boolean;\n opaqueOverlays?: boolean;\n unnestDivs?: boolean;\n /**\n * When true (default), open shadow roots are traversed after the host\u2019s light DOM children\n * so the tree matches a flattened view (closed shadow roots are still inaccessible).\n */\n flattenShadowDom?: boolean;\n}\n\nexport type VxTransform = (vxNode: VxNode) => VxNode;\n\nexport class VxTreeParser {\n\n private frameId = '';\n private viewport: Viewport = { width: 0, height: 0 };\n private vxNodes: VxNode[] = [];\n private probeElements: Element[] = [];\n private domRefMap = new Map<string, Node>();\n\n private counter = 0;\n private usedCounters = new Set<number>();\n\n constructor(public options: VxTreeOptions = {}) {\n this.frameId = options.frameId ?? '';\n }\n\n parse() {\n this.viewport = getViewportSize();\n if (this.options.probeViewport) {\n this.probeElements = probeViewport();\n }\n this.usedCounters.clear();\n this.collectDomCounters(document.documentElement);\n const vxRoot = this.parseNode(document.documentElement, null)!;\n this.vxNodes = this.pruneRecursive(vxRoot);\n }\n\n getTree(): VxTreeView {\n return new VxTreeView(this.vxNodes, this.frameId, this.options.iframeRef);\n }\n\n getNodes(): VxNode[] {\n return this.vxNodes;\n }\n\n getDomMap() {\n return this.domRefMap;\n }\n\n private parseNode(node: Node, parent: VxNode | null): VxNode | null {\n if (!node || (node as any)[VX_IGNORE_SYMBOL]) {\n return null;\n }\n if (node instanceof Text) {\n // Single instances of Text nodes can only occur in \"text\"\n // (e.g. when regular text is interspersed with links and other elements)\n const textContent = normalizeText(node.textContent ?? '');\n if (textContent) {\n return {\n textContent,\n hasVisibleArea: parent?.hasVisibleArea,\n isOutsideViewport: parent?.isOutsideViewport,\n isProbeHit: parent?.isProbeHit,\n };\n }\n return null;\n }\n if (node instanceof Element) {\n if (this.options.opaqueOverlays) {\n makeOverlaysOpaque(node as HTMLElement);\n }\n return this.parseElement(node);\n }\n return null;\n }\n\n private parseElement(el: Element): VxNode | null {\n const skip = VX_IGNORE_TAGS.includes(el.tagName.toLowerCase()) || isHidden(el);\n if (skip) {\n this.clearRecursive(el);\n return null;\n }\n // OPTION and OPTGROUP are special cases, we evaluate their rects and visibility\n // checks using their parent SELECT element\n const parentEl = el.matches('option, optgroup') ? el.closest('select') ?? el : el;\n const rect = parentEl.getBoundingClientRect();\n const id = el.getAttribute('id') ?? '';\n const vxNode = this.makeElementNode(el, {\n tagName: el.tagName.toLowerCase(),\n id: isRandomIdentifier(id) ? undefined : id,\n classList: Array.from(el.classList)\n .filter(cls => !isRandomIdentifier(cls))\n .slice(0, 4),\n labelAttrs: this.collectLabelAttrs(el),\n valueAttrs: this.collectValueAttrs(el),\n srcAttrs: this.collectSrcAttrs(el),\n hasVisibleArea: hasVisibleArea(parentEl),\n isInteractive: isInteractive(parentEl),\n isOutsideViewport: !isRectInViewport(rect, this.viewport),\n isProbeHit: this.isProbeHit(parentEl),\n isKept: el.matches(VX_KEEP_SELECTOR),\n });\n const children: VxNode[] = [];\n for (const child of iterate(el.childNodes)) {\n const childNode = this.parseNode(child, vxNode);\n if (childNode != null) {\n children.push(childNode);\n }\n }\n if (this.options.flattenShadowDom !== false && el.shadowRoot) {\n for (const child of iterate(el.shadowRoot.childNodes)) {\n const childNode = this.parseNode(child, vxNode);\n if (childNode != null) {\n children.push(childNode);\n }\n }\n }\n // Special case: if the only child is a text node, return a single node with the text content\n if (children.length === 1 && !children[0]?.tagName) {\n vxNode.textContent = normalizeText(children[0].textContent ?? '');\n } else {\n vxNode.children = children;\n }\n return vxNode;\n }\n\n private makeElementNode(el: Element, spec: Omit<VxNode, 'ref'>): VxNode {\n const existingRef = (el as any)[VX_NODE_REF_SYMBOL];\n const isNew = existingRef === undefined;\n let ref;\n if (isNew) {\n const counter = this.nextCounterValue();\n ref = `${this.frameId}${counter}`;\n this.usedCounters.add(counter);\n (el as any)[VX_NODE_COUNTER_SYMBOL] = counter;\n (el as any)[VX_NODE_REF_SYMBOL] = ref;\n } else {\n ref = existingRef;\n }\n const vxNode: VxNode = {\n ...spec,\n ref,\n isNew,\n };\n this.domRefMap.set(ref, el);\n return vxNode;\n }\n\n private pruneRecursive(vxNode: VxNode | null): VxNode[] {\n if (!vxNode) {\n return [];\n }\n const children = vxNode.children ?? [];\n // Recursively prune children\n const newChildren = children.flatMap(child => this.pruneRecursive(child));\n // If the node itself is omitted, replace it with children\n if (this.shouldOmit(vxNode)) {\n return newChildren;\n }\n vxNode.children = newChildren;\n // Collapse single-child elements\n if (newChildren.length === 1) {\n const child = newChildren[0];\n return this.collapseSingleChild(vxNode, child);\n }\n return [vxNode];\n }\n\n private collapseSingleChild(parent: VxNode, child: VxNode): VxNode[] {\n const preferParent = this.collapsePreferParent(parent, child);\n const merged = preferParent ?\n this.collapseMerge(parent, child) :\n this.collapseMerge(child, parent);\n return this.pruneRecursive({\n ...merged,\n children: child.children,\n textContent: child.textContent,\n });\n }\n\n private collapsePreferParent(parent: VxNode, child: VxNode) {\n const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? '');\n const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? '');\n if (parentRank === -1 && childRank === -1) {\n const parentAttrCount = Object.keys({\n ...parent.labelAttrs,\n ...parent.valueAttrs,\n ...parent.srcAttrs,\n }).length;\n const childAttrCount = Object.keys({\n ...child.labelAttrs,\n ...child.valueAttrs,\n ...child.srcAttrs,\n }).length;\n return parentAttrCount > childAttrCount;\n }\n return parentRank !== -1 && (childRank === -1 || parentRank < childRank);\n }\n\n private collapseMerge(a: VxNode, b: VxNode): VxNode {\n return {\n ...b,\n ...a,\n labelAttrs: { ...b.labelAttrs, ...a.labelAttrs },\n valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },\n srcAttrs: { ...b.srcAttrs, ...a.srcAttrs },\n };\n }\n\n private shouldOmit(vxNode: VxNode): boolean {\n const tagName = vxNode.tagName ?? '';\n if (!vxNode.hasVisibleArea) {\n return true;\n }\n if (this.options.viewportOnly && vxNode.isOutsideViewport) {\n return true;\n }\n if (this.options.probeViewport && !vxNode.isProbeHit) {\n return true;\n }\n if (this.options.skipImages && vxNode.tagName === 'img') {\n return true;\n }\n const hasText = !!vxNode.textContent;\n const hasChildren = (vxNode.children ?? []).length > 0;\n const hasAttrs = [vxNode.labelAttrs, vxNode.valueAttrs, vxNode.srcAttrs]\n .some(attrs => !isObjectEmpty(attrs ?? {}));\n if (this.options.unnestDivs) {\n const isDivOrSpan = ['div', 'span'].includes(tagName);\n if (isDivOrSpan && hasChildren && !hasAttrs) {\n return true;\n }\n }\n if (vxNode.isKept) {\n return false;\n }\n return !hasText && !hasAttrs && !hasChildren;\n }\n\n private isProbeHit(el: Element): boolean {\n // TODO this is a bit brute-forcish, consider improving\n for (const probeEl of this.probeElements) {\n if (el.contains(probeEl)) {\n return true;\n }\n }\n return false;\n }\n\n private collectLabelAttrs(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n // Loop through all element attributes\n for (const attr of iterate(el.attributes)) {\n const attrName = attr.name;\n const value = truncateAttrValue(attr.value);\n if (!value) {\n continue; // Skip empty values\n }\n // Check for exact matches in VX_LABEL_ATTRS\n if (VX_LABEL_ATTRS.includes(attrName)) {\n attrs[attrName] = value;\n continue;\n }\n // Check for regex pattern matches\n if (VX_LABEL_ATTR_PATTERNS.some(pattern => pattern.test(attrName))) {\n attrs[attrName] = value;\n }\n }\n return attrs;\n }\n\n private collectValueAttrs(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of VX_VALUE_ATTRS) {\n const value = (el as any)[attr] ?? '';\n if (value) {\n attrs[attr] = String(value);\n }\n }\n return attrs;\n }\n\n private collectSrcAttrs(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of VX_SRC_ATTRS) {\n const value = truncateAttrValue((el as any)[attr] ?? '');\n if (value) {\n attrs[attr] = value;\n }\n }\n return attrs;\n }\n\n private clearRecursive(node: Node) {\n delete (node as any)[VX_NODE_REF_SYMBOL];\n delete (node as any)[VX_NODE_COUNTER_SYMBOL];\n if (node instanceof Element) {\n for (const child of iterate(node.children)) {\n this.clearRecursive(child);\n }\n if (node.shadowRoot) {\n for (const child of iterate(node.shadowRoot.children)) {\n this.clearRecursive(child);\n }\n }\n }\n }\n\n private nextCounterValue() {\n while (this.usedCounters.has(this.counter)) {\n this.counter += 1;\n }\n return this.counter;\n }\n\n private collectDomCounters(el: Element) {\n if (!el) {\n return;\n }\n const cnt = (el as any)[VX_NODE_COUNTER_SYMBOL];\n if (cnt !== undefined) {\n this.usedCounters.add(cnt);\n }\n for (const child of iterate(el.children)) {\n this.collectDomCounters(child);\n }\n if (el.shadowRoot) {\n for (const child of iterate(el.shadowRoot.children)) {\n this.collectDomCounters(child);\n }\n }\n }\n\n}\n", "import { VX_IGNORE_SYMBOL } from './parser.js';\n\nexport function showPoint(x: number, y: number, clear = true) {\n if (clear) {\n clearOverlay();\n }\n const point = document.createElement('div');\n point.style.position = 'absolute';\n point.style.left = `${x}px`;\n point.style.top = `${y}px`;\n point.style.width = '32px';\n point.style.height = '32px';\n point.style.transform = 'translate(-50%, -50%)';\n point.style.backgroundColor = 'red';\n point.style.borderRadius = '100%';\n point.style.opacity = '0.5';\n const container = getOverlayContainer();\n container.appendChild(point);\n}\n\nexport function clearOverlay() {\n const container = getOverlayContainer();\n container.remove();\n}\n\nexport function getOverlayContainer() {\n let container = document.querySelector('#webvision-overlay') as HTMLElement;\n if (!container) {\n container = document.createElement('div');\n (container as any)[VX_IGNORE_SYMBOL] = true;\n container.id = 'webvision-overlay';\n container.style.position = 'fixed';\n container.style.top = '0';\n container.style.left = '0';\n container.style.bottom = '0';\n container.style.right = '0';\n container.style.zIndex = '2147483647'; // Maximum z-index value\n container.style.pointerEvents = 'none';\n document.body.appendChild(container);\n }\n return container;\n}\n", "import { getOverlayContainer } from './overlay.js';\n\nexport interface VxHighlightOptions {\n highlight?: boolean;\n clearOverlay?: boolean;\n includeAll?: boolean;\n filterRefs?: string[];\n useColors?: boolean;\n}\n\nexport function highlightEl(el: Element, ref: string, color?: string) {\n if (!(el instanceof Element)) {\n return;\n }\n if (el instanceof HTMLOptGroupElement) {\n return;\n }\n if (el instanceof HTMLOptionElement) {\n return;\n }\n const container = getOverlayContainer();\n const rect = el.getBoundingClientRect();\n const overlay = document.createElement('div');\n container.appendChild(overlay);\n overlay.style.position = 'absolute';\n overlay.style.top = `${rect.top}px`;\n overlay.style.left = `${rect.left}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.border = `2px solid ${color}`;\n const label = document.createElement('div');\n overlay.appendChild(label);\n label.style.position = 'absolute';\n label.style.bottom = `100%`;\n label.style.left = `0`;\n label.style.backgroundColor = color ?? getRandomColor(ref);\n label.style.color = 'white';\n label.style.fontSize = '10px';\n label.style.fontFamily = 'monospace';\n label.style.fontWeight = 'normal';\n label.style.fontStyle = 'normal';\n label.style.opacity = '0.8';\n label.style.padding = '0 2px';\n label.style.transform = 'translateY(50%)';\n label.textContent = String(ref);\n}\n\nfunction getRandomColor(ref: string) {\n const index = ref.charCodeAt(0);\n const hue = (index * 120 * .382) % 360;\n return `hsl(${hue}, 85%, 50%)`;\n}\n", "import { VxNode } from './parser.js';\nimport { VxRenderOptions } from './render.js';\nimport { VxTreeView } from './tree.js';\n\nexport class VxPageView {\n\n private vxTreeMap = new Map<string, VxTreeView>();\n\n constructor(vxTrees: VxTreeView[]) {\n for (const vxTree of vxTrees) {\n this.vxTreeMap.set(vxTree.frameId, vxTree);\n }\n }\n\n get vxTrees() {\n return [...this.vxTreeMap.values()];\n }\n\n get nodeCount() {\n return this.vxTrees.reduce((acc, vxTree) => acc + vxTree.nodeCount, 0);\n }\n\n findNodeByRef(ref: string): VxNode | null {\n const frame = this.findFrameByRef(ref);\n if (frame == null) {\n return null;\n }\n return frame.findNode(ref);\n }\n\n findFrameById(frameId: string): VxTreeView | null {\n return this.vxTreeMap.get(frameId) ?? null;\n }\n\n findFrameByRef(ref: string): VxTreeView | null {\n const frame = this.vxTrees.find(f => f.hasRef(ref));\n return frame ?? null;\n }\n\n getFrameByRef(ref: string): VxTreeView {\n const frame = this.findFrameByRef(ref);\n if (frame == null) {\n throw new Error(`[VX] Frame not found for [ref=${ref}]`);\n }\n return frame;\n }\n\n findParentFrame(frameId: string): VxTreeView | null {\n const frame = this.findFrameById(frameId);\n const iframeRef = frame?.iframeRef;\n if (iframeRef == null) {\n return null;\n }\n return this.findFrameByRef(iframeRef);\n }\n\n isFrameShown(frameId: string): boolean {\n const frame = this.findFrameById(frameId);\n if (!frame) {\n return false;\n }\n const parentFrame = this.findParentFrame(frameId);\n const { iframeRef } = frame;\n if (parentFrame == null || iframeRef == null) {\n // Top level document is always shown\n return true;\n }\n const existsInParent = !!parentFrame.findNode(iframeRef);\n return existsInParent ? this.isFrameShown(parentFrame.frameId) : false;\n }\n\n renderAll(options: VxRenderOptions) {\n return this.vxTrees.map(frame => {\n const rendered = frame?.render(options);\n return [\n `FRAME ${frame.frameId}${frame.iframeRef ? ` [@${frame.iframeRef}]` : ''}`,\n rendered,\n ].join('\\n\\n');\n }).join('\\n\\n');\n }\n\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["index"]
|
|
7
7
|
}
|
package/build/page.mjs
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
|
+
// src/page/util.ts
|
|
2
|
+
function isContainerNode(vxNode) {
|
|
3
|
+
if (vxNode.tagName === "select") {
|
|
4
|
+
return false;
|
|
5
|
+
}
|
|
6
|
+
const children = vxNode.children ?? [];
|
|
7
|
+
const hasTextChildren = children.some((child) => !child.tagName);
|
|
8
|
+
return children.length > 0 && !hasTextChildren;
|
|
9
|
+
}
|
|
10
|
+
function isObjectEmpty(obj) {
|
|
11
|
+
return !Object.values(obj).some((value) => !!value);
|
|
12
|
+
}
|
|
13
|
+
function normalizeRef(ref) {
|
|
14
|
+
return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, "");
|
|
15
|
+
}
|
|
16
|
+
function* iterate(items) {
|
|
17
|
+
if (!items) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (let i = 0; i < items.length; i += 1) {
|
|
21
|
+
const item = items[i];
|
|
22
|
+
yield item;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
1
26
|
// src/page/dom.ts
|
|
2
27
|
var ORIGINAL_STYLE_SYMBOL = Symbol("vx:originalStyle");
|
|
3
28
|
var INTERACTIVE_TAGS = ["a", "button", "input", "textarea", "select", "label", "option", "optgroup"];
|
|
@@ -82,7 +107,15 @@ function isDeepHidden(element) {
|
|
|
82
107
|
return true;
|
|
83
108
|
}
|
|
84
109
|
if (!hasVisibleArea(element)) {
|
|
85
|
-
|
|
110
|
+
if (element.children.length === 0) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
for (const child of iterate(element.children)) {
|
|
114
|
+
if (!isDeepHidden(child)) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
86
119
|
}
|
|
87
120
|
return false;
|
|
88
121
|
}
|
|
@@ -218,9 +251,14 @@ function* traverseElements(element) {
|
|
|
218
251
|
return;
|
|
219
252
|
}
|
|
220
253
|
yield element;
|
|
221
|
-
for (const child of element.children) {
|
|
254
|
+
for (const child of iterate(element.children)) {
|
|
222
255
|
yield* traverseElements(child);
|
|
223
256
|
}
|
|
257
|
+
if (element.shadowRoot) {
|
|
258
|
+
for (const child of iterate(element.shadowRoot.children)) {
|
|
259
|
+
yield* traverseElements(child);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
224
262
|
}
|
|
225
263
|
|
|
226
264
|
// src/page/probe.ts
|
|
@@ -277,22 +315,6 @@ var PointSet = class {
|
|
|
277
315
|
}
|
|
278
316
|
};
|
|
279
317
|
|
|
280
|
-
// src/page/util.ts
|
|
281
|
-
function isContainerNode(vxNode) {
|
|
282
|
-
if (vxNode.tagName === "select") {
|
|
283
|
-
return false;
|
|
284
|
-
}
|
|
285
|
-
const children = vxNode.children ?? [];
|
|
286
|
-
const hasTextChildren = children.some((child) => !child.tagName);
|
|
287
|
-
return children.length > 0 && !hasTextChildren;
|
|
288
|
-
}
|
|
289
|
-
function isObjectEmpty(obj) {
|
|
290
|
-
return !Object.values(obj).some((value) => !!value);
|
|
291
|
-
}
|
|
292
|
-
function normalizeRef(ref) {
|
|
293
|
-
return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, "");
|
|
294
|
-
}
|
|
295
|
-
|
|
296
318
|
// src/page/render.ts
|
|
297
319
|
function renderVxNode(scope, options = {}) {
|
|
298
320
|
const buffer = [];
|
|
@@ -404,7 +426,7 @@ var VX_TREE_SYMBOL = Symbol("vx:tree");
|
|
|
404
426
|
var VX_LAST_REFS_SYMBOL = Symbol("vx:lastRefs");
|
|
405
427
|
async function captureSnapshot(options = {}) {
|
|
406
428
|
const parser = new VxTreeParser(options);
|
|
407
|
-
|
|
429
|
+
parser.parse();
|
|
408
430
|
const domMap = parser.getDomMap();
|
|
409
431
|
const vxTree = parser.getTree();
|
|
410
432
|
globalThis[VX_DOM_SYMBOL] = domMap;
|
|
@@ -657,12 +679,20 @@ var VxTreeParser = class {
|
|
|
657
679
|
isKept: el.matches(VX_KEEP_SELECTOR)
|
|
658
680
|
});
|
|
659
681
|
const children = [];
|
|
660
|
-
for (const child of el.childNodes) {
|
|
682
|
+
for (const child of iterate(el.childNodes)) {
|
|
661
683
|
const childNode = this.parseNode(child, vxNode);
|
|
662
684
|
if (childNode != null) {
|
|
663
685
|
children.push(childNode);
|
|
664
686
|
}
|
|
665
687
|
}
|
|
688
|
+
if (this.options.flattenShadowDom !== false && el.shadowRoot) {
|
|
689
|
+
for (const child of iterate(el.shadowRoot.childNodes)) {
|
|
690
|
+
const childNode = this.parseNode(child, vxNode);
|
|
691
|
+
if (childNode != null) {
|
|
692
|
+
children.push(childNode);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
666
696
|
if (children.length === 1 && !children[0]?.tagName) {
|
|
667
697
|
vxNode.textContent = normalizeText(children[0].textContent ?? "");
|
|
668
698
|
} else {
|
|
@@ -781,7 +811,7 @@ var VxTreeParser = class {
|
|
|
781
811
|
}
|
|
782
812
|
collectLabelAttrs(el) {
|
|
783
813
|
const attrs = {};
|
|
784
|
-
for (const attr of el.attributes) {
|
|
814
|
+
for (const attr of iterate(el.attributes)) {
|
|
785
815
|
const attrName = attr.name;
|
|
786
816
|
const value = truncateAttrValue(attr.value);
|
|
787
817
|
if (!value) {
|
|
@@ -821,9 +851,14 @@ var VxTreeParser = class {
|
|
|
821
851
|
delete node[VX_NODE_REF_SYMBOL];
|
|
822
852
|
delete node[VX_NODE_COUNTER_SYMBOL];
|
|
823
853
|
if (node instanceof Element) {
|
|
824
|
-
for (const child of node.children) {
|
|
854
|
+
for (const child of iterate(node.children)) {
|
|
825
855
|
this.clearRecursive(child);
|
|
826
856
|
}
|
|
857
|
+
if (node.shadowRoot) {
|
|
858
|
+
for (const child of iterate(node.shadowRoot.children)) {
|
|
859
|
+
this.clearRecursive(child);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
827
862
|
}
|
|
828
863
|
}
|
|
829
864
|
nextCounterValue() {
|
|
@@ -840,9 +875,14 @@ var VxTreeParser = class {
|
|
|
840
875
|
if (cnt !== void 0) {
|
|
841
876
|
this.usedCounters.add(cnt);
|
|
842
877
|
}
|
|
843
|
-
for (const child of el.children
|
|
878
|
+
for (const child of iterate(el.children)) {
|
|
844
879
|
this.collectDomCounters(child);
|
|
845
880
|
}
|
|
881
|
+
if (el.shadowRoot) {
|
|
882
|
+
for (const child of iterate(el.shadowRoot.children)) {
|
|
883
|
+
this.collectDomCounters(child);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
846
886
|
}
|
|
847
887
|
};
|
|
848
888
|
|
|
@@ -1034,6 +1074,7 @@ export {
|
|
|
1034
1074
|
isObjectEmpty,
|
|
1035
1075
|
isRandomIdentifier,
|
|
1036
1076
|
isRectInViewport,
|
|
1077
|
+
iterate,
|
|
1037
1078
|
makeOverlaysOpaque,
|
|
1038
1079
|
normalizeRef,
|
|
1039
1080
|
normalizeText,
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// ==UserScript==
|
|
2
|
+
// @name Webvision (console)
|
|
3
|
+
// @namespace https://github.com/ubio/webvision
|
|
4
|
+
// @version 3.1.9
|
|
5
|
+
// @description Loads Webvision from dev server into page; window.WebVision in console
|
|
6
|
+
// @match *://*/*
|
|
7
|
+
// @run-at document-end
|
|
8
|
+
// @connect 127.0.0.1
|
|
9
|
+
// @grant GM.xmlHttpRequest
|
|
10
|
+
// ==/UserScript==
|
|
11
|
+
|
|
12
|
+
(() => {
|
|
13
|
+
const base = "http://127.0.0.1:3847/global.js";
|
|
14
|
+
const u = new URL(base);
|
|
15
|
+
u.searchParams.set('t', String(Date.now()));
|
|
16
|
+
GM.xmlHttpRequest({
|
|
17
|
+
method: 'GET',
|
|
18
|
+
url: u.href,
|
|
19
|
+
onload(res) {
|
|
20
|
+
if (res.status < 200 || res.status >= 300) {
|
|
21
|
+
console.error('[Webvision] HTTP', res.status, base);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
let code = res.responseText;
|
|
25
|
+
code = code.replace(/\n\/\/# sourceMappingURL=[^\n]*/u, '');
|
|
26
|
+
const s = document.createElement('script');
|
|
27
|
+
s.textContent = code;
|
|
28
|
+
(document.head || document.documentElement).appendChild(s);
|
|
29
|
+
},
|
|
30
|
+
onerror() {
|
|
31
|
+
console.error('[Webvision] Failed to load', base, '(run npm run serve:build and npm run dev:global?)');
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
})();
|
|
35
|
+
|
package/out/page/dom.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { iterate } from './util.js';
|
|
1
2
|
const ORIGINAL_STYLE_SYMBOL = Symbol('vx:originalStyle');
|
|
2
3
|
export const INTERACTIVE_TAGS = ['a', 'button', 'input', 'textarea', 'select', 'label', 'option', 'optgroup'];
|
|
3
4
|
export const INTERACTIVE_ROLES = [
|
|
@@ -68,7 +69,15 @@ export function isDeepHidden(element) {
|
|
|
68
69
|
return true;
|
|
69
70
|
}
|
|
70
71
|
if (!hasVisibleArea(element)) {
|
|
71
|
-
|
|
72
|
+
if (element.children.length === 0) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
for (const child of iterate(element.children)) {
|
|
76
|
+
if (!isDeepHidden(child)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
72
81
|
}
|
|
73
82
|
return false;
|
|
74
83
|
}
|
package/out/page/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/page/dom.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/page/dom.ts"],"names":[],"mappings":"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"}
|
package/out/page/parser.d.ts
CHANGED
|
@@ -34,6 +34,11 @@ export interface VxTreeOptions {
|
|
|
34
34
|
probeViewport?: boolean;
|
|
35
35
|
opaqueOverlays?: boolean;
|
|
36
36
|
unnestDivs?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* When true (default), open shadow roots are traversed after the host’s light DOM children
|
|
39
|
+
* so the tree matches a flattened view (closed shadow roots are still inaccessible).
|
|
40
|
+
*/
|
|
41
|
+
flattenShadowDom?: boolean;
|
|
37
42
|
}
|
|
38
43
|
export type VxTransform = (vxNode: VxNode) => VxNode;
|
|
39
44
|
export declare class VxTreeParser {
|
package/out/page/parser.js
CHANGED
|
@@ -2,7 +2,7 @@ import { getViewportSize, hasVisibleArea, isInteractive, isRandomIdentifier, isR
|
|
|
2
2
|
import { isHidden } from './dom.js';
|
|
3
3
|
import { probeViewport } from './probe.js';
|
|
4
4
|
import { VxTreeView } from './tree.js';
|
|
5
|
-
import { isObjectEmpty } from './util.js';
|
|
5
|
+
import { isObjectEmpty, iterate } from './util.js';
|
|
6
6
|
export const VX_NODE_REF_SYMBOL = Symbol('vx:ref');
|
|
7
7
|
export const VX_NODE_COUNTER_SYMBOL = Symbol('vx:counter');
|
|
8
8
|
export const VX_IGNORE_SYMBOL = Symbol('vx:ignore');
|
|
@@ -118,12 +118,20 @@ export class VxTreeParser {
|
|
|
118
118
|
isKept: el.matches(VX_KEEP_SELECTOR),
|
|
119
119
|
});
|
|
120
120
|
const children = [];
|
|
121
|
-
for (const child of el.childNodes) {
|
|
121
|
+
for (const child of iterate(el.childNodes)) {
|
|
122
122
|
const childNode = this.parseNode(child, vxNode);
|
|
123
123
|
if (childNode != null) {
|
|
124
124
|
children.push(childNode);
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
|
+
if (this.options.flattenShadowDom !== false && el.shadowRoot) {
|
|
128
|
+
for (const child of iterate(el.shadowRoot.childNodes)) {
|
|
129
|
+
const childNode = this.parseNode(child, vxNode);
|
|
130
|
+
if (childNode != null) {
|
|
131
|
+
children.push(childNode);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
127
135
|
// Special case: if the only child is a text node, return a single node with the text content
|
|
128
136
|
if (children.length === 1 && !children[0]?.tagName) {
|
|
129
137
|
vxNode.textContent = normalizeText(children[0].textContent ?? '');
|
|
@@ -253,7 +261,7 @@ export class VxTreeParser {
|
|
|
253
261
|
collectLabelAttrs(el) {
|
|
254
262
|
const attrs = {};
|
|
255
263
|
// Loop through all element attributes
|
|
256
|
-
for (const attr of el.attributes) {
|
|
264
|
+
for (const attr of iterate(el.attributes)) {
|
|
257
265
|
const attrName = attr.name;
|
|
258
266
|
const value = truncateAttrValue(attr.value);
|
|
259
267
|
if (!value) {
|
|
@@ -295,9 +303,14 @@ export class VxTreeParser {
|
|
|
295
303
|
delete node[VX_NODE_REF_SYMBOL];
|
|
296
304
|
delete node[VX_NODE_COUNTER_SYMBOL];
|
|
297
305
|
if (node instanceof Element) {
|
|
298
|
-
for (const child of node.children) {
|
|
306
|
+
for (const child of iterate(node.children)) {
|
|
299
307
|
this.clearRecursive(child);
|
|
300
308
|
}
|
|
309
|
+
if (node.shadowRoot) {
|
|
310
|
+
for (const child of iterate(node.shadowRoot.children)) {
|
|
311
|
+
this.clearRecursive(child);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
301
314
|
}
|
|
302
315
|
}
|
|
303
316
|
nextCounterValue() {
|
|
@@ -314,9 +327,14 @@ export class VxTreeParser {
|
|
|
314
327
|
if (cnt !== undefined) {
|
|
315
328
|
this.usedCounters.add(cnt);
|
|
316
329
|
}
|
|
317
|
-
for (const child of el.children
|
|
330
|
+
for (const child of iterate(el.children)) {
|
|
318
331
|
this.collectDomCounters(child);
|
|
319
332
|
}
|
|
333
|
+
if (el.shadowRoot) {
|
|
334
|
+
for (const child of iterate(el.shadowRoot.children)) {
|
|
335
|
+
this.collectDomCounters(child);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
320
338
|
}
|
|
321
339
|
}
|
|
322
340
|
//# sourceMappingURL=parser.js.map
|
package/out/page/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/page/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAY,MAAM,UAAU,CAAC;AAChL,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAErF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,OAAO;IACP,KAAK;IACL,aAAa;IACb,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;CACnB,CAAC;AACF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,aAAa,EAAE,wBAAwB;IACvC,SAAS,EAAE,qBAAqB;CACnC,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO;IACtE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAClC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAClC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO;IAChE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ;IACrE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY;IACxD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAC3C,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK;CAC/B,CAAC;AAEF,MAAM,gBAAgB,GAAG,qEAAqE,CAAC;AAkC/F,MAAM,OAAO,YAAY;IAWrB,YAAmB,UAAyB,EAAE;QAA3B,YAAO,GAAP,OAAO,CAAoB;QATtC,YAAO,GAAG,EAAE,CAAC;QACb,aAAQ,GAAa,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC7C,YAAO,GAAa,EAAE,CAAC;QACvB,kBAAa,GAAc,EAAE,CAAC;QAC9B,cAAS,GAAG,IAAI,GAAG,EAAgB,CAAC;QAEpC,YAAO,GAAG,CAAC,CAAC;QACZ,iBAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QAGrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,eAAe,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,aAAa,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAE,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACH,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9E,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAEO,SAAS,CAAC,IAAU,EAAE,MAAqB;QAC/C,IAAI,CAAC,IAAI,IAAK,IAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;YACvB,0DAA0D;YAC1D,yEAAyE;YACzE,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC1D,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO;oBACH,WAAW;oBACX,cAAc,EAAE,MAAM,EAAE,cAAc;oBACtC,iBAAiB,EAAE,MAAM,EAAE,iBAAiB;oBAC5C,UAAU,EAAE,MAAM,EAAE,UAAU;iBACjC,CAAC;YACN,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;gBAC9B,kBAAkB,CAAC,IAAmB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,EAAW;QAC5B,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,gFAAgF;QAChF,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE;YACpC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;YACjC,EAAE,EAAE,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YAC3C,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;iBAC9B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;iBACvC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAChB,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAClC,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC;YACxC,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC;YACtC,iBAAiB,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;YACzD,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACrC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,6FAA6F;QAC7F,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YACjD,MAAM,CAAC,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,eAAe,CAAC,EAAW,EAAE,IAAyB;QAC1D,MAAM,WAAW,GAAI,EAAU,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,WAAW,KAAK,SAAS,CAAC;QACxC,IAAI,GAAG,CAAC;QACR,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxC,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,EAAU,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC;YAC7C,EAAU,CAAC,kBAAkB,CAAC,GAAG,GAAG,CAAC;QAC1C,CAAC;aAAM,CAAC;YACJ,GAAG,GAAG,WAAW,CAAC;QACtB,CAAC;QACD,MAAM,MAAM,GAAW;YACnB,GAAG,IAAI;YACP,GAAG;YACH,KAAK;SACR,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,cAAc,CAAC,MAAqB;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACvC,6BAA6B;QAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,0DAA0D;QAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,WAAW,CAAC;QACvB,CAAC;QACD,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC9B,iCAAiC;QACjC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAEO,mBAAmB,CAAC,MAAc,EAAE,KAAa;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC;YACvB,GAAG,MAAM;YACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;SACjC,CAAC,CAAC;IACP,CAAC;IAEO,oBAAoB,CAAC,MAAc,EAAE,KAAa;QACtD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACxC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC;gBAChC,GAAG,MAAM,CAAC,UAAU;gBACpB,GAAG,MAAM,CAAC,UAAU;gBACpB,GAAG,MAAM,CAAC,QAAQ;aACrB,CAAC,CAAC,MAAM,CAAC;YACV,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC;gBAC/B,GAAG,KAAK,CAAC,UAAU;gBACnB,GAAG,KAAK,CAAC,UAAU;gBACnB,GAAG,KAAK,CAAC,QAAQ;aACpB,CAAC,CAAC,MAAM,CAAC;YACV,OAAO,eAAe,GAAG,cAAc,CAAC;QAC5C,CAAC;QACD,OAAO,UAAU,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,SAAS,CAAC,CAAC;IAC7E,CAAC;IAEO,aAAa,CAAC,CAAS,EAAE,CAAS;QACtC,OAAO;YACH,GAAG,CAAC;YACJ,GAAG,CAAC;YACJ,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE;YAChD,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE;YAChD,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE;SAC7C,CAAC;IACN,CAAC;IAEO,UAAU,CAAC,MAAc;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;QACrC,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC;aACnE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,WAAW,IAAI,WAAW,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC;IACjD,CAAC;IAEO,UAAU,CAAC,EAAW;QAC1B,uDAAuD;QACvD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iBAAiB,CAAC,EAAW;QACjC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,sCAAsC;QACtC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,SAAS,CAAC,oBAAoB;YAClC,CAAC;YACD,4CAA4C;YAC5C,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;gBACxB,SAAS;YACb,CAAC;YACD,kCAAkC;YAClC,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACjE,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YAC5B,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iBAAiB,CAAC,EAAW;QACjC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAChC,MAAM,KAAK,GAAI,EAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,eAAe,CAAC,EAAW;QAC/B,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAE,EAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACL,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,cAAc,CAAC,IAAU;QAC7B,OAAQ,IAAY,CAAC,kBAAkB,CAAC,CAAC;QACzC,OAAQ,IAAY,CAAC,sBAAsB,CAAC,CAAC;QAC7C,IAAI,IAAI,YAAY,OAAO,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,IAAI,CAAC,cAAc,CAAC,KAAgB,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;IACL,CAAC;IAEO,gBAAgB;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEO,kBAAkB,CAAC,EAAW;QAClC,IAAI,CAAC,EAAE,EAAE,CAAC;YACN,OAAO;QACX,CAAC;QACD,MAAM,GAAG,GAAI,EAAU,CAAC,sBAAsB,CAAC,CAAC;QAChD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,kBAAkB,CAAC,KAAgB,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;CAEJ"}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/page/parser.ts"],"names":[],"mappings":"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"}
|
package/out/page/snapshot.js
CHANGED
|
@@ -5,7 +5,7 @@ export const VX_TREE_SYMBOL = Symbol('vx:tree');
|
|
|
5
5
|
export const VX_LAST_REFS_SYMBOL = Symbol('vx:lastRefs');
|
|
6
6
|
export async function captureSnapshot(options = {}) {
|
|
7
7
|
const parser = new VxTreeParser(options);
|
|
8
|
-
|
|
8
|
+
parser.parse();
|
|
9
9
|
const domMap = parser.getDomMap();
|
|
10
10
|
const vxTree = parser.getTree();
|
|
11
11
|
globalThis[VX_DOM_SYMBOL] = domMap;
|
package/out/page/snapshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/page/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAyB,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/page/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAyB,EAAE;IAC7D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAC/B,UAAkB,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;IAC3C,UAAkB,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IAC7C,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW;IACvB,MAAM,MAAM,GAAI,UAAkB,CAAC,cAAc,CAAe,CAAC;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,MAAM,MAAM,GAAI,UAAkB,CAAC,aAAa,CAAsB,CAAC;IACvE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC"}
|
package/out/page/traverse.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { iterate } from './util.js';
|
|
1
2
|
export function* traverseVxNode(vxNode, options = {}) {
|
|
2
3
|
const depth = options.depth ?? 0;
|
|
3
4
|
const index = options.index ?? 0;
|
|
@@ -22,8 +23,13 @@ export function* traverseElements(element) {
|
|
|
22
23
|
return;
|
|
23
24
|
}
|
|
24
25
|
yield element;
|
|
25
|
-
for (const child of element.children) {
|
|
26
|
+
for (const child of iterate(element.children)) {
|
|
26
27
|
yield* traverseElements(child);
|
|
27
28
|
}
|
|
29
|
+
if (element.shadowRoot) {
|
|
30
|
+
for (const child of iterate(element.shadowRoot.children)) {
|
|
31
|
+
yield* traverseElements(child);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
28
34
|
}
|
|
29
35
|
//# sourceMappingURL=traverse.js.map
|
package/out/page/traverse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/page/traverse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/page/traverse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,MAAM,SAAS,CAAC,CAAC,cAAc,CAAC,MAAc,EAAE,UAAiC,EAAE;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACzF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,QAAQ,EAAE,CAAC;gBACX,SAAS;YACb,CAAC;QACL,CAAC;QACD,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE;YACzB,GAAG,OAAO;YACV,KAAK;YACL,KAAK,EAAE,KAAK,GAAG,CAAC;SACnB,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,gBAAgB,CAAC,OAAgB;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO;IACX,CAAC;IACD,MAAM,OAAO,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;AACL,CAAC"}
|
package/out/page/util.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ import { VxNode } from './parser.js';
|
|
|
2
2
|
export declare function isContainerNode(vxNode: VxNode): boolean;
|
|
3
3
|
export declare function isObjectEmpty(obj: Record<string, any>): boolean;
|
|
4
4
|
export declare function normalizeRef(ref: string): string;
|
|
5
|
+
export declare function iterate<T>(items: ArrayLike<T> | null | undefined): IterableIterator<T>;
|
package/out/page/util.js
CHANGED
|
@@ -12,4 +12,14 @@ export function isObjectEmpty(obj) {
|
|
|
12
12
|
export function normalizeRef(ref) {
|
|
13
13
|
return String(ref).toLowerCase().trim().replace(/[^a-z0-9]/gi, '');
|
|
14
14
|
}
|
|
15
|
+
export function* iterate(items) {
|
|
16
|
+
if (!items) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
20
|
+
for (let i = 0; i < items.length; i += 1) {
|
|
21
|
+
const item = items[i];
|
|
22
|
+
yield item;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
15
25
|
//# sourceMappingURL=util.js.map
|
package/out/page/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/page/util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAwB;IAClD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC"}
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/page/util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAwB;IAClD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,OAAO,CAAI,KAAsC;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO;IACX,CAAC;IACD,4DAA4D;IAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,CAAC;IACf,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ubio/webvision",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.9",
|
|
4
4
|
"main": "out/main/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -17,9 +17,13 @@
|
|
|
17
17
|
"dev": "npm run clean && run-p dev:*",
|
|
18
18
|
"dev:ts": "tsc -b -w",
|
|
19
19
|
"dev:esbuild": "esbuild src/page/index.ts --bundle --outfile=build/page.mjs --target=es2022 --format=esm --watch",
|
|
20
|
-
"
|
|
20
|
+
"dev:global": "esbuild src/page/index.ts --bundle --format=iife --global-name=WebVision --outfile=build/global.js --sourcemap --target=es2020 --footer:js=globalThis.WebVision=WebVision; --watch",
|
|
21
|
+
"dev:userscript": "run-s compile:userscript dev:global",
|
|
22
|
+
"serve:build": "npx --yes serve build -l 3847",
|
|
23
|
+
"compile": "npm run clean && tsc -b && run-p compile:page compile:userscript",
|
|
21
24
|
"compile:page": "esbuild src/page/index.ts --bundle --outfile=build/page.mjs --target=es2022 --format=esm",
|
|
22
|
-
"compile:global": "esbuild src/page/index.ts --bundle --format=iife --global-name=WebVision --outfile=build/global.js --sourcemap --target=es2020",
|
|
25
|
+
"compile:global": "esbuild src/page/index.ts --bundle --format=iife --global-name=WebVision --outfile=build/global.js --sourcemap --target=es2020 --footer:js=globalThis.WebVision=WebVision;",
|
|
26
|
+
"compile:userscript": "node scripts/build-userscript.mjs",
|
|
23
27
|
"add:build": "git add ./build",
|
|
24
28
|
"lint": "eslint --cache",
|
|
25
29
|
"test": "NODE_ENV=test mocha",
|
|
@@ -30,8 +34,7 @@
|
|
|
30
34
|
"lint",
|
|
31
35
|
"compile",
|
|
32
36
|
"compile:page",
|
|
33
|
-
"compile:
|
|
34
|
-
"add:build"
|
|
37
|
+
"compile:userscript"
|
|
35
38
|
],
|
|
36
39
|
"license": "ISC",
|
|
37
40
|
"devDependencies": {
|