@ubio/webvision 3.2.3 → 3.3.1
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/build/global.js +22 -109
- package/build/global.js.map +2 -2
- package/build/page.mjs +22 -109
- package/build/webvision.user.js +1 -1
- package/out/page/dom.d.ts +0 -1
- package/out/page/dom.js +6 -17
- package/out/page/dom.js.map +1 -1
- package/out/page/parser.d.ts +2 -11
- package/out/page/parser.js +9 -75
- package/out/page/parser.js.map +1 -1
- package/out/page/render.d.ts +2 -3
- package/out/page/render.js +7 -17
- package/out/page/render.js.map +1 -1
- package/package.json +1 -1
package/build/global.js
CHANGED
|
@@ -27,15 +27,11 @@ var WebVision = (() => {
|
|
|
27
27
|
VX_DOM_SYMBOL: () => VX_DOM_SYMBOL,
|
|
28
28
|
VX_IGNORE_SYMBOL: () => VX_IGNORE_SYMBOL,
|
|
29
29
|
VX_IGNORE_TAGS: () => VX_IGNORE_TAGS,
|
|
30
|
-
VX_LABEL_ATTRS: () => VX_LABEL_ATTRS,
|
|
31
|
-
VX_LABEL_ATTR_PATTERNS: () => VX_LABEL_ATTR_PATTERNS,
|
|
32
30
|
VX_LAST_REFS_SYMBOL: () => VX_LAST_REFS_SYMBOL,
|
|
33
31
|
VX_NODE_COUNTER_SYMBOL: () => VX_NODE_COUNTER_SYMBOL,
|
|
34
32
|
VX_NODE_REF_SYMBOL: () => VX_NODE_REF_SYMBOL,
|
|
35
|
-
VX_SRC_ATTRS: () => VX_SRC_ATTRS,
|
|
36
33
|
VX_TAG_PREFERENCE: () => VX_TAG_PREFERENCE,
|
|
37
34
|
VX_TREE_SYMBOL: () => VX_TREE_SYMBOL,
|
|
38
|
-
VX_VALUE_ATTRS: () => VX_VALUE_ATTRS,
|
|
39
35
|
VxPageView: () => VxPageView,
|
|
40
36
|
VxTreeParser: () => VxTreeParser,
|
|
41
37
|
VxTreeView: () => VxTreeView,
|
|
@@ -57,7 +53,6 @@ var WebVision = (() => {
|
|
|
57
53
|
isHidden: () => isHidden,
|
|
58
54
|
isInteractive: () => isInteractive,
|
|
59
55
|
isObjectEmpty: () => isObjectEmpty,
|
|
60
|
-
isPopup: () => isPopup,
|
|
61
56
|
isRandomIdentifier: () => isRandomIdentifier,
|
|
62
57
|
isRectInViewport: () => isRectInViewport,
|
|
63
58
|
iterate: () => iterate,
|
|
@@ -173,6 +168,9 @@ var WebVision = (() => {
|
|
|
173
168
|
return y;
|
|
174
169
|
}
|
|
175
170
|
function hasVisibleArea(element) {
|
|
171
|
+
if (!element) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
176
174
|
const rect = element.getBoundingClientRect();
|
|
177
175
|
const area = rect.width * rect.height;
|
|
178
176
|
return area > 64;
|
|
@@ -216,21 +214,6 @@ var WebVision = (() => {
|
|
|
216
214
|
}
|
|
217
215
|
return false;
|
|
218
216
|
}
|
|
219
|
-
function isPopup(el) {
|
|
220
|
-
const style = getComputedStyle(el);
|
|
221
|
-
const zIndex = parseInt(style.zIndex, 10);
|
|
222
|
-
const hasPopupPosition = style.position === "fixed" || style.position === "sticky" || style.position === "absolute" && zIndex >= 1e3;
|
|
223
|
-
if (!hasPopupPosition) {
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
const rect = el.getBoundingClientRect();
|
|
227
|
-
const area = rect.width * rect.height;
|
|
228
|
-
const viewportArea = window.innerWidth * window.innerHeight;
|
|
229
|
-
if (area <= viewportArea * 0.2) {
|
|
230
|
-
return false;
|
|
231
|
-
}
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
217
|
function getViewportSize() {
|
|
235
218
|
return {
|
|
236
219
|
width: window.innerWidth,
|
|
@@ -241,6 +224,9 @@ var WebVision = (() => {
|
|
|
241
224
|
return rect.left < viewport.width && rect.right > 0 && rect.top < viewport.height && rect.bottom > 0;
|
|
242
225
|
}
|
|
243
226
|
function makeOverlaysOpaque(el) {
|
|
227
|
+
if (!el) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
244
230
|
if (!el[ORIGINAL_STYLE_SYMBOL]) {
|
|
245
231
|
el[ORIGINAL_STYLE_SYMBOL] = el.getAttribute("style");
|
|
246
232
|
}
|
|
@@ -456,23 +442,14 @@ var WebVision = (() => {
|
|
|
456
442
|
components.push("." + vxNode.classList.join("."));
|
|
457
443
|
}
|
|
458
444
|
}
|
|
459
|
-
for (const meta of vxNode.meta ?? []) {
|
|
460
|
-
components.push(`[${meta}]`);
|
|
461
|
-
}
|
|
462
445
|
const attrs = [];
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
attrs.push(`${attr}="${truncateAttrValue(value)}"`);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
if (options.renderSrcAttrs) {
|
|
474
|
-
for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {
|
|
475
|
-
attrs.push(`${attr}="${truncateAttrValue(value)}"`);
|
|
446
|
+
const filterAttributes = options.filterAttributes ?? (() => true);
|
|
447
|
+
if (options.renderAttributes) {
|
|
448
|
+
for (const [attr, value] of Object.entries(vxNode.attributes ?? {})) {
|
|
449
|
+
if (!filterAttributes(vxNode, attr, value)) {
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
attrs.push(`${attr}="${value}"`);
|
|
476
453
|
}
|
|
477
454
|
}
|
|
478
455
|
if (htmlStyle) {
|
|
@@ -591,24 +568,6 @@ var WebVision = (() => {
|
|
|
591
568
|
var VX_NODE_COUNTER_SYMBOL = Symbol("vx:counter");
|
|
592
569
|
var VX_IGNORE_SYMBOL = Symbol("vx:ignore");
|
|
593
570
|
var VX_IGNORE_TAGS = ["svg", "script", "noscript", "style", "link", "meta"];
|
|
594
|
-
var VX_LABEL_ATTRS = [
|
|
595
|
-
"title",
|
|
596
|
-
"alt",
|
|
597
|
-
"placeholder",
|
|
598
|
-
"aria-role",
|
|
599
|
-
"aria-label",
|
|
600
|
-
"aria-description",
|
|
601
|
-
"aria-placeholder",
|
|
602
|
-
"aria-valuetext"
|
|
603
|
-
];
|
|
604
|
-
var VX_LABEL_ATTR_PATTERNS = [
|
|
605
|
-
/^data-label/,
|
|
606
|
-
// data-label attributes
|
|
607
|
-
/title-/i
|
|
608
|
-
// title-* attributes
|
|
609
|
-
];
|
|
610
|
-
var VX_VALUE_ATTRS = ["role", "value", "checked", "selected", "disabled", "readonly"];
|
|
611
|
-
var VX_SRC_ATTRS = ["src", "href"];
|
|
612
571
|
var VX_TAG_PREFERENCE = [
|
|
613
572
|
"a",
|
|
614
573
|
"iframe",
|
|
@@ -730,18 +689,12 @@ var WebVision = (() => {
|
|
|
730
689
|
tagName: el.tagName.toLowerCase(),
|
|
731
690
|
id: isRandomIdentifier(id) ? void 0 : id,
|
|
732
691
|
classList: Array.from(el.classList).filter((cls) => !isRandomIdentifier(cls)).slice(0, 4),
|
|
733
|
-
|
|
734
|
-
valueAttrs: this.collectValueAttrs(el),
|
|
735
|
-
srcAttrs: this.collectSrcAttrs(el),
|
|
692
|
+
attributes: this.collectAttributes(el),
|
|
736
693
|
hasVisibleArea: hasVisibleArea(parentEl),
|
|
737
694
|
isInteractive: isInteractive(parentEl),
|
|
738
695
|
isOutsideViewport: !isInViewport,
|
|
739
696
|
isProbeHit,
|
|
740
|
-
isKept: el.matches(VX_KEEP_SELECTOR)
|
|
741
|
-
meta: [
|
|
742
|
-
isPopup(parentEl) ? "popup" : null,
|
|
743
|
-
isInViewport && !isProbeHit ? "occluded" : null
|
|
744
|
-
].filter((_) => _ != null)
|
|
697
|
+
isKept: el.matches(VX_KEEP_SELECTOR)
|
|
745
698
|
});
|
|
746
699
|
const children = [];
|
|
747
700
|
for (const child of iterate(el.childNodes)) {
|
|
@@ -813,18 +766,8 @@ var WebVision = (() => {
|
|
|
813
766
|
const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? "");
|
|
814
767
|
const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? "");
|
|
815
768
|
if (parentRank === -1 && childRank === -1) {
|
|
816
|
-
const parentAttrCount = Object.keys({
|
|
817
|
-
|
|
818
|
-
...parent.valueAttrs,
|
|
819
|
-
...parent.srcAttrs,
|
|
820
|
-
...parent.meta
|
|
821
|
-
}).length;
|
|
822
|
-
const childAttrCount = Object.keys({
|
|
823
|
-
...child.labelAttrs,
|
|
824
|
-
...child.valueAttrs,
|
|
825
|
-
...child.srcAttrs,
|
|
826
|
-
...child.meta
|
|
827
|
-
}).length;
|
|
769
|
+
const parentAttrCount = Object.keys(parent.attributes ?? {}).length;
|
|
770
|
+
const childAttrCount = Object.keys(child.attributes ?? {}).length;
|
|
828
771
|
return parentAttrCount > childAttrCount;
|
|
829
772
|
}
|
|
830
773
|
return parentRank !== -1 && (childRank === -1 || parentRank < childRank);
|
|
@@ -833,9 +776,7 @@ var WebVision = (() => {
|
|
|
833
776
|
return {
|
|
834
777
|
...b,
|
|
835
778
|
...a,
|
|
836
|
-
|
|
837
|
-
valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },
|
|
838
|
-
srcAttrs: { ...b.srcAttrs, ...a.srcAttrs }
|
|
779
|
+
attributes: { ...b.attributes, ...a.attributes }
|
|
839
780
|
};
|
|
840
781
|
}
|
|
841
782
|
shouldOmit(vxNode) {
|
|
@@ -854,7 +795,7 @@ var WebVision = (() => {
|
|
|
854
795
|
}
|
|
855
796
|
const hasText = !!vxNode.textContent;
|
|
856
797
|
const hasChildren = (vxNode.children ?? []).length > 0;
|
|
857
|
-
const hasAttrs =
|
|
798
|
+
const hasAttrs = !isObjectEmpty(vxNode.attributes ?? {});
|
|
858
799
|
if (this.options.unnestDivs) {
|
|
859
800
|
const isDivOrSpan = ["div", "span"].includes(tagName);
|
|
860
801
|
if (isDivOrSpan && hasChildren && !hasAttrs) {
|
|
@@ -874,41 +815,13 @@ var WebVision = (() => {
|
|
|
874
815
|
}
|
|
875
816
|
return false;
|
|
876
817
|
}
|
|
877
|
-
|
|
818
|
+
collectAttributes(el) {
|
|
878
819
|
const attrs = {};
|
|
879
820
|
for (const attr of iterate(el.attributes)) {
|
|
880
|
-
|
|
881
|
-
const value = truncateAttrValue(attr.value);
|
|
882
|
-
if (!value) {
|
|
821
|
+
if (["id", "class", "style"].includes(attr.name.toLowerCase())) {
|
|
883
822
|
continue;
|
|
884
823
|
}
|
|
885
|
-
|
|
886
|
-
attrs[attrName] = value;
|
|
887
|
-
continue;
|
|
888
|
-
}
|
|
889
|
-
if (VX_LABEL_ATTR_PATTERNS.some((pattern) => pattern.test(attrName))) {
|
|
890
|
-
attrs[attrName] = value;
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
return attrs;
|
|
894
|
-
}
|
|
895
|
-
collectValueAttrs(el) {
|
|
896
|
-
const attrs = {};
|
|
897
|
-
for (const attr of VX_VALUE_ATTRS) {
|
|
898
|
-
const value = el[attr] ?? "";
|
|
899
|
-
if (value) {
|
|
900
|
-
attrs[attr] = String(value);
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
return attrs;
|
|
904
|
-
}
|
|
905
|
-
collectSrcAttrs(el) {
|
|
906
|
-
const attrs = {};
|
|
907
|
-
for (const attr of VX_SRC_ATTRS) {
|
|
908
|
-
const value = truncateAttrValue(el[attr] ?? "");
|
|
909
|
-
if (value) {
|
|
910
|
-
attrs[attr] = value;
|
|
911
|
-
}
|
|
824
|
+
attrs[attr.name] = truncateAttrValue(attr.value);
|
|
912
825
|
}
|
|
913
826
|
return attrs;
|
|
914
827
|
}
|
package/build/global.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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()\n .replace(/ref=/gi, '')\n .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 isPopup(el: Element): boolean {\n const style = getComputedStyle(el);\n const zIndex = parseInt(style.zIndex, 10);\n const hasPopupPosition = style.position === 'fixed' ||\n style.position === 'sticky' ||\n (style.position === 'absolute' && zIndex >= 1000);\n if (!hasPopupPosition) {\n return false;\n }\n const rect = el.getBoundingClientRect();\n const area = rect.width * rect.height;\n const viewportArea = window.innerWidth * window.innerHeight;\n if (area <= viewportArea * 0.2) {\n return false;\n }\n return true;\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) {\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 { traverseVxNode } from './traverse.js';\n\nexport interface VxRenderOptions {\n renderStyle?: 'html' | 'text';\n renderTagNames?: boolean;\n renderIds?: boolean;\n renderClassNames?: boolean;\n renderRefs?: boolean;\n renderLabelAttrs?: boolean;\n renderValueAttrs?: boolean;\n renderSrcAttrs?: boolean;\n skipTags?: string[];\n skipNonInteractive?: boolean;\n}\n\nexport function renderVxNode(scope: VxNode, options: VxRenderOptions = {}) {\n const buffer = [];\n for (const { vxNode, depth } of traverseVxNode(scope)) {\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 if (!vxNode.tagName) {\n return [indent, vxNode.textContent].filter(Boolean).join('');\n }\n const tagLine = renderTagLine(vxNode, options);\n const htmlStyle = options.renderStyle === 'html';\n return [\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.toUpperCase());\n }\n if (options.renderRefs) {\n components.push(`[ref=${vxNode.ref}]`);\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 for (const meta of vxNode.meta ?? []) {\n components.push(`[${meta}]`);\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", "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 color = options.useColors ? undefined : '#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, isPopup, 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 = ['role', '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 meta?: string[];\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 this.probeElements = probeViewport();\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 isProbeHit = this.isProbeHit(parentEl);\n const isInViewport = isRectInViewport(rect, this.viewport);\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: !isInViewport,\n isProbeHit,\n isKept: el.matches(VX_KEEP_SELECTOR),\n meta: [\n isPopup(parentEl) ? 'popup' : null,\n (isInViewport && !isProbeHit) ? 'occluded' : null,\n ].filter(_ => _ != null)\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 let ref;\n if (existingRef === undefined) {\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 };\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 ...parent.meta,\n }).length;\n const childAttrCount = Object.keys({\n ...child.labelAttrs,\n ...child.valueAttrs,\n ...child.srcAttrs,\n ...child.meta,\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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",
|
|
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()\n .replace(/ref=/gi, '')\n .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 if (!element) {\n return false;\n }\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) {\n return;\n }\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) {\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';\nimport { traverseVxNode } from './traverse.js';\n\nexport interface VxRenderOptions {\n renderStyle?: 'html' | 'text';\n renderTagNames?: boolean;\n renderIds?: boolean;\n renderClassNames?: boolean;\n renderRefs?: boolean;\n renderAttributes?: boolean;\n filterAttributes?: (node: VxNode, k: string, v: string) => boolean;\n skipTags?: string[];\n skipNonInteractive?: boolean;\n}\n\nexport function renderVxNode(scope: VxNode, options: VxRenderOptions = {}) {\n const buffer = [];\n for (const { vxNode, depth } of traverseVxNode(scope)) {\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 if (!vxNode.tagName) {\n return [indent, vxNode.textContent].filter(Boolean).join('');\n }\n const tagLine = renderTagLine(vxNode, options);\n const htmlStyle = options.renderStyle === 'html';\n return [\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.toUpperCase());\n }\n if (options.renderRefs) {\n components.push(`[ref=${vxNode.ref}]`);\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 const attrs = [];\n const filterAttributes = options.filterAttributes ?? (() => true);\n if (options.renderAttributes) {\n for (const [attr, value] of Object.entries(vxNode.attributes ?? {})) {\n if (!filterAttributes(vxNode, attr, value)) {\n continue;\n }\n attrs.push(`${attr}=\"${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", "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 color = options.useColors ? undefined : '#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_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 attributes?: 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 this.probeElements = probeViewport();\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 isProbeHit = this.isProbeHit(parentEl);\n const isInViewport = isRectInViewport(rect, this.viewport);\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 attributes: this.collectAttributes(el),\n hasVisibleArea: hasVisibleArea(parentEl),\n isInteractive: isInteractive(parentEl),\n isOutsideViewport: !isInViewport,\n isProbeHit,\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 let ref;\n if (existingRef === undefined) {\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 };\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(parent.attributes ?? {}).length;\n const childAttrCount = Object.keys(child.attributes ?? {}).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 attributes: { ...b.attributes, ...a.attributes },\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 = !isObjectEmpty(vxNode.attributes ?? {});\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 collectAttributes(el: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const attr of iterate(el.attributes)) {\n if (['id', 'class', 'style'].includes(attr.name.toLowerCase())) {\n continue;\n }\n attrs[attr.name] = truncateAttrValue(attr.value);\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": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEO,WAAS,gBAAgB,QAAyB;AACrD,QAAI,OAAO,YAAY,UAAU;AAC7B,aAAO;AAAA,IACX;AACA,UAAM,WAAW,OAAO,YAAY,CAAC;AACrC,UAAM,kBAAkB,SAAS,KAAK,WAAS,CAAC,MAAM,OAAO;AAC7D,WAAO,SAAS,SAAS,KAAK,CAAC;AAAA,EACnC;AAEO,WAAS,cAAc,KAAmC;AAC7D,WAAO,CAAC,OAAO,OAAO,GAAG,EAAE,KAAK,WAAS,CAAC,CAAC,KAAK;AAAA,EACpD;AAEO,WAAS,aAAa,KAAqB;AAC9C,WAAO,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EACjC,QAAQ,UAAU,EAAE,EACpB,QAAQ,eAAe,EAAE;AAAA,EAClC;AAEO,YAAU,QAAW,OAA6D;AACrF,QAAI,CAAC,OAAO;AACR;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACtC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM;AAAA,IACV;AAAA,EACJ;;;AC5BA,MAAM,wBAAwB,OAAO,kBAAkB;AAEhD,MAAM,mBAAmB,CAAC,KAAK,UAAU,SAAS,YAAY,UAAU,SAAS,UAAU,UAAU;AACrG,MAAM,oBAAoB;AAAA,IAC7B;AAAA,IAAa;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAY;AAAA,IAAS;AAAA,IAAW;AAAA,IAAY;AAAA,IAAW;AAAA,IAAQ;AAAA,IAAY;AAAA,IAAoB;AAAA,IAAiB;AAAA,IAAU;AAAA,IAAY;AAAA,IAAe;AAAA,IAAa;AAAA,IAAU;AAAA,IAAc;AAAA,IAAU;AAAA,IAAO;AAAA,IAAW;AAAA,IAAS;AAAA,EAAS;AAOpQ,WAAS,SAAS,IAAa;AAClC,UAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAI,MAAM,YAAY,QAAQ;AAC1B,aAAO;AAAA,IACX;AACA,QAAI,MAAM,eAAe,UAAU;AAC/B,aAAO;AAAA,IACX;AACA,QAAI,MAAM,YAAY,KAAK;AACvB,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAEO,WAAS,kBAAkB,IAAqB;AACnD,WAAO,cAAc,GAAG,eAAe,EAAE;AAAA,EAC7C;AAEO,WAAS,cAAc,KAAa;AACvC,WAAO,IACF,QAAQ,YAAY,GAAG,EACvB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAAA,EACd;AAEO,WAAS,kBAAkB,OAAe,QAAQ,KAAK;AAC1D,QAAI,MAAM,MAAM,qBAAqB,GAAG;AACpC,aAAO;AAAA,IACX;AACA,QAAI,MAAM,WAAW,OAAO,GAAG;AAC3B,aAAO;AAAA,IACX;AACA,QAAI,MAAM,SAAS,OAAO;AACtB,aAAO,MAAM,MAAM,GAAG,KAAK,IAAI;AAAA,IACnC;AACA,WAAO;AAAA,EACX;AAEO,WAAS,gBAAgB,OAAe;AAC3C,WAAO,MACF,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,UAAU,GAAG;AAAA,EAC9B;AAEO,WAAS,iBAAiB,IAAa,UAA2B;AACrE,WAAO,GAAG,QAAQ,QAAQ,KAAK,CAAC,CAAC,GAAG,cAAc,QAAQ;AAAA,EAC9D;AAEO,WAAS,aAAa,MAAY;AACrC,QAAI,IAAI;AACR,QAAI,UAAe;AACnB,WAAO,SAAS;AACZ,WAAK,QAAQ,aAAa;AAC1B,gBAAU,QAAQ;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AAEO,WAAS,eAAe,SAAkB;AAC7C,QAAI,CAAC,SAAS;AACV,aAAO;AAAA,IACX;AACA,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,UAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,WAAO,OAAO;AAAA,EAClB;AAEO,WAAS,aAAa,SAA2B;AACpD,QAAI,SAAS,OAAO,GAAG;AACnB,aAAO;AAAA,IACX;AACA,QAAI,CAAC,eAAe,OAAO,GAAG;AAC1B,UAAI,QAAQ,SAAS,WAAW,GAAG;AAC/B,eAAO;AAAA,MACX;AACA,iBAAW,SAAS,QAAQ,QAAQ,QAAQ,GAAG;AAC3C,YAAI,CAAC,aAAa,KAAK,GAAG;AACtB,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAEO,WAAS,cAAc,IAAa;AACvC,UAAM,SAAS;AACf,QAAI,iBAAiB,SAAS,GAAG,QAAQ,YAAY,CAAC,GAAG;AACrD,aAAO;AAAA,IACX;AACA,UAAM,WAAW,OAAO,aAAa,UAAU;AAC/C,QAAI,YAAY,SAAS,QAAQ,KAAK,GAAG;AACrC,aAAO;AAAA,IACX;AACA,UAAM,OAAO,OAAO,aAAa,MAAM,KAAK,OAAO,aAAa,WAAW,KAAK;AAChF,QAAI,kBAAkB,SAAS,IAAI,GAAG;AAClC,aAAO;AAAA,IACX;AACA,QAAI,OAAO,WAAW,MAAM;AACxB,aAAO;AAAA,IACX;AACA,UAAM,SAAS,iBAAiB,MAAM;AACtC,QAAI,OAAO,WAAW,WAAW;AAC7B,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAEO,WAAS,kBAA4B;AACxC,WAAO;AAAA,MACH,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACnB;AAAA,EACJ;AAEO,WAAS,iBAAiB,MAAe,UAAoB;AAChE,WAAO,KAAK,OAAO,SAAS,SACxB,KAAK,QAAQ,KACb,KAAK,MAAM,SAAS,UACpB,KAAK,SAAS;AAAA,EACtB;AAEO,WAAS,mBAAmB,IAAiB;AAChD,QAAI,CAAC,IAAI;AACL;AAAA,IACJ;AACA,QAAI,CAAE,GAAW,qBAAqB,GAAG;AACrC,MAAC,GAAW,qBAAqB,IAAI,GAAG,aAAa,OAAO;AAAA,IAChE;AAEA,UAAM,OAAO,GAAG,sBAAsB;AACtC,QAAI,KAAK,QAAQ,OAAO,KAAK,SAAS,KAAK;AACvC;AAAA,IACJ;AACA,UAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAI,MAAM,kBAAkB,QAAQ;AAChC;AAAA,IACJ;AACA,OAAG,MAAM,YAAY,aAAa,QAAQ,WAAW;AACrD,OAAG,MAAM,YAAY,cAAc,QAAQ,WAAW;AACtD,OAAG,MAAM,YAAY,mBAAmB,QAAQ,WAAW;AAC3D,OAAG,MAAM,YAAY,kBAAkB,UAAU,WAAW;AAC5D,OAAG,MAAM,YAAY,WAAW,KAAK,WAAW;AAChD,OAAG,MAAM,YAAY,UAAU,QAAQ,WAAW;AAClD,UAAM,KAAK,MAAM;AACjB,OAAG,MAAM,YAAY,oBAAoB,YAAY,EAAE,CAAC;AAAA,EAC5D;AAEA,WAAS,YAAY,OAAe;AAChC,UAAM,OAAO,MAAM,MAAM,gBAAgB;AACzC,QAAI,CAAC,MAAM;AACP,aAAO;AAAA,IACX;AACA,UAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,UAAU;AACtD,QAAI,IAAI,KAAK,IAAI,GAAG;AAChB,aAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,IAC9B;AACA,WAAO;AAAA,EACX;AAEO,WAAS,mBAAmB,KAAa;AAC5C,UAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,WAAO,CAAC,MAAM,KAAK,OAAK,WAAW,CAAC,CAAC,KAAK,MAAM,KAAK,OAAK,eAAe,CAAC,CAAC;AAAA,EAC/E;AAEA,WAAS,WAAW,KAAa;AAC7B,QAAI,IAAI,UAAU,GAAG;AACjB,aAAO;AAAA,IACX;AAEA,QAAI,gBAAgB,KAAK,GAAG,GAAG;AAC3B,aAAO;AAAA,IACX;AACA,QAAI,eAAe,KAAK,GAAG,GAAG;AAC1B,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAEA,WAAS,eAAe,KAAa;AAEjC,QAAI,eAAe,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG,GAAG;AAC/C,aAAO;AAAA,IACX;AAEA,QAAI,oBAAoB,KAAK,GAAG,GAAG;AAC/B,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAEO,WAAS,UAAU,IAAiB;AACvC,UAAM,SAAS,iBAAiB,EAAE;AAClC,UAAM,SAAS,SAAS,OAAO,MAAM;AACrC,QAAI,CAAC,MAAM,MAAM,GAAG;AAChB,YAAM,YAAY;AAClB,UAAI,SAAS,YAAY,KAAK;AAC1B,WAAG,MAAM,SAAS,OAAO,SAAS,CAAC;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ;AAEO,WAAS,gBAAgB,IAAa;AACzC,QAAI,QAAQ;AACZ,WAAO,GAAG,eAAe;AACrB,WAAK,GAAG;AACR,eAAS;AAAA,IACb;AACA,WAAO;AAAA,EACX;;;AC/MO,YAAU,eAAe,QAAgB,UAAiC,CAAC,GAA2C;AACzH,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,cAAc,QAAQ,YAAY,QAAQ,UAAU,QAAQ,OAAO,KAAK,IAAI;AAClF,UAAM,EAAE,QAAQ,aAAa,OAAO,MAAM;AAC1C,eAAW,CAACA,QAAO,KAAK,MAAM,YAAY,YAAY,CAAC,GAAG,QAAQ,GAAG;AACjE,UAAI,QAAQ,MAAM;AACd,cAAM,WAAW,QAAQ,KAAK,OAAO,OAAOA,MAAK;AACjD,YAAI,UAAU;AACV;AAAA,QACJ;AAAA,MACJ;AACA,aAAO,eAAe,OAAO;AAAA,QACzB,GAAG;AAAA,QACH,OAAAA;AAAA,QACA,OAAO,QAAQ;AAAA,MACnB,CAAC;AAAA,IACL;AAAA,EACJ;AAEO,YAAU,iBAAiB,SAA6C;AAC3E,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AACA,UAAM;AACN,eAAW,SAAS,QAAQ,QAAQ,QAAQ,GAAG;AAC3C,aAAO,iBAAiB,KAAK;AAAA,IACjC;AACA,QAAI,QAAQ,YAAY;AACpB,iBAAW,SAAS,QAAQ,QAAQ,WAAW,QAAQ,GAAG;AACtD,eAAO,iBAAiB,KAAK;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;;;AC7CO,WAAS,gBAA2B;AACvC,UAAM,EAAE,OAAO,OAAO,IAAI,gBAAgB;AAC1C,UAAM,SAAS,IAAI,SAAS,OAAO,MAAM;AACzC,UAAM,SAAS,oBAAI,IAAa;AAChC,eAAW,MAAM,iBAAiB,SAAS,IAAI,GAAG;AAC9C,YAAM,OAAO,GAAG,sBAAsB;AACtC,aAAO,IAAI,KAAK,MAAM,KAAK,GAAG;AAC9B,aAAO,IAAI,KAAK,OAAO,KAAK,GAAG;AAC/B,aAAO,IAAI,KAAK,MAAM,KAAK,MAAM;AACjC,aAAO,IAAI,KAAK,OAAO,KAAK,MAAM;AAClC,aAAO,IAAI,KAAK,OAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC;AAAA,IACrE;AACA,eAAW,EAAE,GAAG,EAAE,KAAK,OAAO,OAAO,GAAG;AACpC,YAAM,UAAU,SAAS,iBAAiB,GAAG,CAAC;AAC9C,UAAI,SAAS;AACT,eAAO,IAAI,OAAO;AAAA,MACtB;AAAA,IACJ;AACA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC5B;AAEO,MAAM,WAAN,MAAe;AAAA,IAIlB,YAAmB,MAAqB,MAAc;AAAnC;AAAqB;AAFxC,WAAQ,MAAM,oBAAI,IAAyB;AAAA,IAEY;AAAA,IAEvD,CAAC,SAAS;AACN,iBAAW,CAAC,GAAG,GAAG,KAAK,KAAK,IAAI,QAAQ,GAAG;AACvC,mBAAW,KAAK,KAAK;AACjB,gBAAM,EAAE,GAAG,EAAE;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAAA,IAEA,IAAI,GAAW,GAAoB;AAC/B,UAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,MAAM;AAChC,eAAO;AAAA,MACX;AACA,YAAM,MAAM,KAAK,IAAI,IAAI,CAAC;AAC1B,aAAO,MAAM,IAAI,IAAI,CAAC,IAAI;AAAA,IAC9B;AAAA,IAEA,IAAI,GAAW,GAAiB;AAC5B,UAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,MAAM;AAChC;AAAA,MACJ;AACA,YAAM,MAAM,KAAK,IAAI,IAAI,CAAC;AAC1B,UAAI,KAAK;AACL,YAAI,IAAI,CAAC;AAAA,MACb,OAAO;AACH,aAAK,IAAI,IAAI,GAAG,oBAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,MAChC;AAAA,IACJ;AAAA,EAEJ;;;AC/CO,WAAS,aAAa,OAAe,UAA2B,CAAC,GAAG;AACvE,UAAM,SAAS,CAAC;AAChB,eAAW,EAAE,QAAQ,MAAM,KAAK,eAAe,KAAK,GAAG;AACnD,UAAI,QAAQ,sBAAsB,CAAC,OAAO,eAAe;AACrD;AAAA,MACJ;AACA,UAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,OAAO,WAAW,MAAM,GAAG;AACzE;AAAA,MACJ;AACA,YAAM,SAAS,QAAQ,qBAAqB,KAAK,OAAO,OAAO,KAAK;AACpE,aAAO,KAAK,mBAAmB,QAAQ,QAAQ,OAAO,CAAC;AAAA,IAC3D;AACA,WAAO,OAAO,KAAK,IAAI;AAAA,EAC3B;AAEA,WAAS,mBAAmB,QAAgB,QAAgB,UAA2B,CAAC,GAAG;AACvF,QAAI,CAAC,OAAO,SAAS;AACjB,aAAO,CAAC,QAAQ,OAAO,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,EAAE;AAAA,IAC/D;AACA,UAAM,UAAU,cAAc,QAAQ,OAAO;AAC7C,UAAM,YAAY,QAAQ,gBAAgB;AAC1C,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,OAAO,eAAe;AAAA,IAC1B,EAAE,KAAK,EAAE;AAAA,EACb;AAEA,WAAS,cAAc,QAAgB,SAA0B;AAC7D,UAAM,YAAY,QAAQ,gBAAgB;AAC1C,UAAM,aAAmC,CAAC;AAC1C,QAAI,QAAQ,kBAAkB,OAAO,SAAS;AAC1C,iBAAW,KAAK,OAAO,QAAQ,YAAY,CAAC;AAAA,IAChD;AACA,QAAI,QAAQ,YAAY;AACpB,iBAAW,KAAK,QAAQ,OAAO,GAAG,GAAG;AAAA,IACzC;AACA,QAAI,QAAQ,aAAa,OAAO,IAAI;AAChC,UAAI,WAAW;AACX,mBAAW,KAAK,OAAO,OAAO,EAAE,GAAG;AAAA,MACvC,OAAO;AACH,mBAAW,KAAK,IAAI,OAAO,EAAE,EAAE;AAAA,MACnC;AAAA,IACJ;AACA,QAAI,QAAQ,oBAAoB,OAAO,WAAW,QAAQ;AACtD,UAAI,WAAW;AACX,mBAAW,KAAK,UAAU,OAAO,UAAU,KAAK,GAAG,CAAC,GAAG;AAAA,MAC3D,OAAO;AACH,mBAAW,KAAK,MAAM,OAAO,UAAU,KAAK,GAAG,CAAC;AAAA,MACpD;AAAA,IACJ;AACA,UAAM,QAAQ,CAAC;AACf,UAAM,mBAAmB,QAAQ,qBAAqB,MAAM;AAC5D,QAAI,QAAQ,kBAAkB;AAC1B,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC,GAAG;AACjE,YAAI,CAAC,iBAAiB,QAAQ,MAAM,KAAK,GAAG;AACxC;AAAA,QACJ;AACA,cAAM,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG;AAAA,MACnC;AAAA,IACJ;AACA,QAAI,WAAW;AACX,iBAAW,KAAK,GAAG,KAAK;AAAA,IAC5B,OAAO;AACH,iBAAW,KAAK,GAAG,MAAM,IAAI,UAAQ,IAAI,IAAI,GAAG,CAAC;AAAA,IACrD;AACA,WAAO,YAAY,IAAI,WAAW,KAAK,GAAG,CAAC,MAAM,WAAW,KAAK,EAAE;AAAA,EACvE;;;AC/EO,MAAM,gBAAgB,OAAO,QAAQ;AACrC,MAAM,iBAAiB,OAAO,SAAS;AACvC,MAAM,sBAAsB,OAAO,aAAa;AAEvD,iBAAsB,gBAAgB,UAAyB,CAAC,GAAG;AAC/D,UAAM,SAAS,IAAI,aAAa,OAAO;AACvC,WAAO,MAAM;AACb,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,SAAS,OAAO,QAAQ;AAC9B,IAAC,WAAmB,aAAa,IAAI;AACrC,IAAC,WAAmB,cAAc,IAAI;AACtC,WAAO;AAAA,EACX;AAEO,WAAS,cAA0B;AACtC,UAAM,SAAU,WAAmB,cAAc;AACjD,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7C;AACA,WAAO;AAAA,EACX;AAEO,WAAS,eAAe,KAA0B;AACrD,UAAM,SAAU,WAAmB,aAAa;AAChD,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,IACX;AACA,UAAM,gBAAgB,aAAa,GAAG;AACtC,WAAO,OAAO,IAAI,aAAa,KAAK;AAAA,EACxC;;;ACzBO,MAAM,aAAN,MAAiB;AAAA,IAIpB,YACW,OACA,SACA,WACT;AAHS;AACA;AACA;AALX,WAAQ,SAAS,oBAAI,IAAoB;AAOrC,WAAK,YAAY,KAAK;AAAA,IAC1B;AAAA,IAEA,IAAI,YAAY;AACZ,aAAO,KAAK,OAAO;AAAA,IACvB;AAAA,IAEA,CAAC,SAAS,UAAiC,CAAC,GAAwD;AAChG,iBAAW,UAAU,KAAK,OAAO;AAC7B,eAAO,eAAe,QAAQ,OAAO;AAAA,MACzC;AAAA,IACJ;AAAA,IAEQ,YAAY,OAAiB;AACjC,iBAAW,QAAQ,OAAO;AACtB,YAAI,KAAK,KAAK;AACV,eAAK,OAAO,IAAI,KAAK,KAAK,IAAI;AAAA,QAClC;AACA,aAAK,YAAY,KAAK,YAAY,CAAC,CAAC;AAAA,MACxC;AAAA,IACJ;AAAA,IAEA,OAAO,KAAsB;AACzB,YAAM,OAAO,aAAa,GAAG;AAC7B,aAAO,KAAK,OAAO,IAAI,IAAI;AAAA,IAC/B;AAAA,IAEA,SAAS,KAA4B;AACjC,YAAM,OAAO,aAAa,GAAG;AAC7B,aAAO,KAAK,OAAO,IAAI,IAAI,KAAK;AAAA,IACpC;AAAA,IAEA,OAAO,UAA2B,CAAC,GAAG;AAClC,aAAO,KAAK,MAAM,IAAI,UAAQ;AAC1B,eAAO,aAAa,MAAM,OAAO;AAAA,MACrC,CAAC,EAAE,KAAK,IAAI;AAAA,IAChB;AAAA,IAEA,UAAU,UAA8B,CAAC,GAAG;AACxC,UAAI,QAAQ,cAAc;AACtB,qBAAa;AAAA,MACjB;AACA,YAAM,WAAW,CAAC,QAAQ;AAC1B,YAAM,OAAO,KAAK,YAAY,UAAU,QAAQ,UAAU;AAC1D,WAAK,cAAc,MAAM,OAAO;AAAA,IACpC;AAAA,IAEA,cAAc,MAAgB,UAA8B,CAAC,GAAG;AAC5D,iBAAW,OAAO,MAAM;AACpB,cAAM,KAAK,eAAe,GAAG;AAC7B,YAAI,cAAc,SAAS;AACvB,gBAAM,QAAQ,QAAQ,YAAY,SAAY;AAC9C,sBAAY,IAAI,KAAK,KAAK;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAAA,IAEA,YAAY,WAAW,MAAM,YAAuB;AAChD,YAAM,OAAiB,CAAC;AACxB,mBAAa,YAAY,IAAI,SAAO,aAAa,GAAG,CAAC;AACrD,iBAAW,EAAE,OAAO,KAAK,KAAK,SAAS,GAAG;AACtC,YAAI,CAAC,OAAO,KAAK;AACb;AAAA,QACJ;AACA,YAAI,YAAY,gBAAgB,MAAM,GAAG;AACrC;AAAA,QACJ;AACA,YAAI,cAAc,CAAC,WAAW,SAAS,OAAO,GAAG,GAAG;AAChD;AAAA,QACJ;AACA,aAAK,KAAK,OAAO,GAAG;AAAA,MACxB;AACA,aAAO;AAAA,IACX;AAAA,EAEJ;;;ACtFO,MAAM,qBAAqB,OAAO,QAAQ;AAC1C,MAAM,yBAAyB,OAAO,YAAY;AAClD,MAAM,mBAAmB,OAAO,WAAW;AAE3C,MAAM,iBAAiB,CAAC,OAAO,UAAU,YAAY,SAAS,QAAQ,MAAM;AAE5E,MAAM,oBAAoB;AAAA,IAC7B;AAAA,IAAK;AAAA,IAAU;AAAA,IAAS;AAAA,IAAU;AAAA,IAAU;AAAA,IAAY;AAAA,IAAO;AAAA,IAC/D;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9B;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9B;AAAA,IAAW;AAAA,IAAW;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAU;AAAA,IAAO;AAAA,IACzD;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAY;AAAA,IAAU;AAAA,IAAU;AAAA,IAAY;AAAA,IAC7D;AAAA,IAAK;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAc;AAAA,IAAU;AAAA,IAC5C;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAM;AAAA,IAAM;AAAA,IACvC;AAAA,IAAU;AAAA,IAAM;AAAA,IAAO;AAAA,EAC3B;AAEA,MAAM,mBAAmB;AAoClB,MAAM,eAAN,MAAmB;AAAA,IAWtB,YAAmB,UAAyB,CAAC,GAAG;AAA7B;AATnB,WAAQ,UAAU;AAClB,WAAQ,WAAqB,EAAE,OAAO,GAAG,QAAQ,EAAE;AACnD,WAAQ,UAAoB,CAAC;AAC7B,WAAQ,gBAA2B,CAAC;AACpC,WAAQ,YAAY,oBAAI,IAAkB;AAE1C,WAAQ,UAAU;AAClB,WAAQ,eAAe,oBAAI,IAAY;AAGnC,WAAK,UAAU,QAAQ,WAAW;AAAA,IACtC;AAAA,IAEA,QAAQ;AACJ,WAAK,WAAW,gBAAgB;AAChC,WAAK,gBAAgB,cAAc;AACnC,WAAK,aAAa,MAAM;AACxB,WAAK,mBAAmB,SAAS,eAAe;AAChD,YAAM,SAAS,KAAK,UAAU,SAAS,iBAAiB,IAAI;AAC5D,WAAK,UAAU,KAAK,eAAe,MAAM;AAAA,IAC7C;AAAA,IAEA,UAAsB;AAClB,aAAO,IAAI,WAAW,KAAK,SAAS,KAAK,SAAS,KAAK,QAAQ,SAAS;AAAA,IAC5E;AAAA,IAEA,WAAqB;AACjB,aAAO,KAAK;AAAA,IAChB;AAAA,IAEA,YAAY;AACR,aAAO,KAAK;AAAA,IAChB;AAAA,IAEQ,UAAU,MAAY,QAAsC;AAChE,UAAI,CAAC,QAAS,KAAa,gBAAgB,GAAG;AAC1C,eAAO;AAAA,MACX;AACA,UAAI,gBAAgB,MAAM;AAGtB,cAAM,cAAc,cAAc,KAAK,eAAe,EAAE;AACxD,YAAI,aAAa;AACb,iBAAO;AAAA,YACH;AAAA,YACA,gBAAgB,QAAQ;AAAA,YACxB,mBAAmB,QAAQ;AAAA,YAC3B,YAAY,QAAQ;AAAA,UACxB;AAAA,QACJ;AACA,eAAO;AAAA,MACX;AACA,UAAI,gBAAgB,SAAS;AACzB,YAAI,KAAK,QAAQ,gBAAgB;AAC7B,6BAAmB,IAAmB;AAAA,QAC1C;AACA,eAAO,KAAK,aAAa,IAAI;AAAA,MACjC;AACA,aAAO;AAAA,IACX;AAAA,IAEQ,aAAa,IAA4B;AAC7C,YAAM,OAAO,eAAe,SAAS,GAAG,QAAQ,YAAY,CAAC,KAAK,SAAS,EAAE;AAC7E,UAAI,MAAM;AACN,aAAK,eAAe,EAAE;AACtB,eAAO;AAAA,MACX;AAGA,YAAM,WAAW,GAAG,QAAQ,kBAAkB,IAAI,GAAG,QAAQ,QAAQ,KAAK,KAAK;AAC/E,YAAM,OAAO,SAAS,sBAAsB;AAC5C,YAAM,KAAK,GAAG,aAAa,IAAI,KAAK;AACpC,YAAM,aAAa,KAAK,WAAW,QAAQ;AAC3C,YAAM,eAAe,iBAAiB,MAAM,KAAK,QAAQ;AACzD,YAAM,SAAS,KAAK,gBAAgB,IAAI;AAAA,QACpC,SAAS,GAAG,QAAQ,YAAY;AAAA,QAChC,IAAI,mBAAmB,EAAE,IAAI,SAAY;AAAA,QACzC,WAAW,MAAM,KAAK,GAAG,SAAS,EAC7B,OAAO,SAAO,CAAC,mBAAmB,GAAG,CAAC,EACtC,MAAM,GAAG,CAAC;AAAA,QACf,YAAY,KAAK,kBAAkB,EAAE;AAAA,QACrC,gBAAgB,eAAe,QAAQ;AAAA,QACvC,eAAe,cAAc,QAAQ;AAAA,QACrC,mBAAmB,CAAC;AAAA,QACpB;AAAA,QACA,QAAQ,GAAG,QAAQ,gBAAgB;AAAA,MACvC,CAAC;AACD,YAAM,WAAqB,CAAC;AAC5B,iBAAW,SAAS,QAAQ,GAAG,UAAU,GAAG;AACxC,cAAM,YAAY,KAAK,UAAU,OAAO,MAAM;AAC9C,YAAI,aAAa,MAAM;AACnB,mBAAS,KAAK,SAAS;AAAA,QAC3B;AAAA,MACJ;AACA,UAAI,KAAK,QAAQ,qBAAqB,SAAS,GAAG,YAAY;AAC1D,mBAAW,SAAS,QAAQ,GAAG,WAAW,UAAU,GAAG;AACnD,gBAAM,YAAY,KAAK,UAAU,OAAO,MAAM;AAC9C,cAAI,aAAa,MAAM;AACnB,qBAAS,KAAK,SAAS;AAAA,UAC3B;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,SAAS,WAAW,KAAK,CAAC,SAAS,CAAC,GAAG,SAAS;AAChD,eAAO,cAAc,cAAc,SAAS,CAAC,EAAE,eAAe,EAAE;AAAA,MACpE,OAAO;AACH,eAAO,WAAW;AAAA,MACtB;AACA,aAAO;AAAA,IACX;AAAA,IAEQ,gBAAgB,IAAa,MAAmC;AACpE,YAAM,cAAe,GAAW,kBAAkB;AAClD,UAAI;AACJ,UAAI,gBAAgB,QAAW;AAC3B,cAAM,UAAU,KAAK,iBAAiB;AACtC,cAAM,GAAG,KAAK,OAAO,GAAG,OAAO;AAC/B,aAAK,aAAa,IAAI,OAAO;AAC7B,QAAC,GAAW,sBAAsB,IAAI;AACtC,QAAC,GAAW,kBAAkB,IAAI;AAAA,MACtC,OAAO;AACH,cAAM;AAAA,MACV;AACA,YAAM,SAAiB;AAAA,QACnB,GAAG;AAAA,QACH;AAAA,MACJ;AACA,WAAK,UAAU,IAAI,KAAK,EAAE;AAC1B,aAAO;AAAA,IACX;AAAA,IAEQ,eAAe,QAAiC;AACpD,UAAI,CAAC,QAAQ;AACT,eAAO,CAAC;AAAA,MACZ;AACA,YAAM,WAAW,OAAO,YAAY,CAAC;AAErC,YAAM,cAAc,SAAS,QAAQ,WAAS,KAAK,eAAe,KAAK,CAAC;AAExE,UAAI,KAAK,WAAW,MAAM,GAAG;AACzB,eAAO;AAAA,MACX;AACA,aAAO,WAAW;AAElB,UAAI,YAAY,WAAW,GAAG;AAC1B,cAAM,QAAQ,YAAY,CAAC;AAC3B,eAAO,KAAK,oBAAoB,QAAQ,KAAK;AAAA,MACjD;AACA,aAAO,CAAC,MAAM;AAAA,IAClB;AAAA,IAEQ,oBAAoB,QAAgB,OAAyB;AACjE,YAAM,eAAe,KAAK,qBAAqB,QAAQ,KAAK;AAC5D,YAAM,SAAS,eACX,KAAK,cAAc,QAAQ,KAAK,IAChC,KAAK,cAAc,OAAO,MAAM;AACpC,aAAO,KAAK,eAAe;AAAA,QACvB,GAAG;AAAA,QACH,UAAU,MAAM;AAAA,QAChB,aAAa,MAAM;AAAA,MACvB,CAAC;AAAA,IACL;AAAA,IAEQ,qBAAqB,QAAgB,OAAe;AACxD,YAAM,aAAa,kBAAkB,QAAQ,OAAO,WAAW,EAAE;AACjE,YAAM,YAAY,kBAAkB,QAAQ,MAAM,WAAW,EAAE;AAC/D,UAAI,eAAe,MAAM,cAAc,IAAI;AACvC,cAAM,kBAAkB,OAAO,KAAK,OAAO,cAAc,CAAC,CAAC,EAAE;AAC7D,cAAM,iBAAiB,OAAO,KAAK,MAAM,cAAc,CAAC,CAAC,EAAE;AAC3D,eAAO,kBAAkB;AAAA,MAC7B;AACA,aAAO,eAAe,OAAO,cAAc,MAAM,aAAa;AAAA,IAClE;AAAA,IAEQ,cAAc,GAAW,GAAmB;AAChD,aAAO;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,EAAE,GAAG,EAAE,YAAY,GAAG,EAAE,WAAW;AAAA,MACnD;AAAA,IACJ;AAAA,IAEQ,WAAW,QAAyB;AACxC,YAAM,UAAU,OAAO,WAAW;AAClC,UAAI,CAAC,OAAO,gBAAgB;AACxB,eAAO;AAAA,MACX;AACA,UAAI,KAAK,QAAQ,gBAAgB,OAAO,mBAAmB;AACvD,eAAO;AAAA,MACX;AACA,UAAI,KAAK,QAAQ,iBAAiB,CAAC,OAAO,YAAY;AAClD,eAAO;AAAA,MACX;AACA,UAAI,KAAK,QAAQ,cAAc,OAAO,YAAY,OAAO;AACrD,eAAO;AAAA,MACX;AACA,YAAM,UAAU,CAAC,CAAC,OAAO;AACzB,YAAM,eAAe,OAAO,YAAY,CAAC,GAAG,SAAS;AACrD,YAAM,WAAW,CAAC,cAAc,OAAO,cAAc,CAAC,CAAC;AACvD,UAAI,KAAK,QAAQ,YAAY;AACzB,cAAM,cAAc,CAAC,OAAO,MAAM,EAAE,SAAS,OAAO;AACpD,YAAI,eAAe,eAAe,CAAC,UAAU;AACzC,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,UAAI,OAAO,QAAQ;AACf,eAAO;AAAA,MACX;AACA,aAAO,CAAC,WAAW,CAAC,YAAY,CAAC;AAAA,IACrC;AAAA,IAEQ,WAAW,IAAsB;AAErC,iBAAW,WAAW,KAAK,eAAe;AACtC,YAAI,GAAG,SAAS,OAAO,GAAG;AACtB,iBAAO;AAAA,QACX;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,IAEQ,kBAAkB,IAAqC;AAC3D,YAAM,QAAgC,CAAC;AACvC,iBAAW,QAAQ,QAAQ,GAAG,UAAU,GAAG;AACvC,YAAI,CAAC,MAAM,SAAS,OAAO,EAAE,SAAS,KAAK,KAAK,YAAY,CAAC,GAAG;AAC5D;AAAA,QACJ;AACA,cAAM,KAAK,IAAI,IAAI,kBAAkB,KAAK,KAAK;AAAA,MACnD;AACA,aAAO;AAAA,IACX;AAAA,IAEQ,eAAe,MAAY;AAC/B,aAAQ,KAAa,kBAAkB;AACvC,aAAQ,KAAa,sBAAsB;AAC3C,UAAI,gBAAgB,SAAS;AACzB,mBAAW,SAAS,QAAQ,KAAK,QAAQ,GAAG;AACxC,eAAK,eAAe,KAAK;AAAA,QAC7B;AACA,YAAI,KAAK,YAAY;AACjB,qBAAW,SAAS,QAAQ,KAAK,WAAW,QAAQ,GAAG;AACnD,iBAAK,eAAe,KAAK;AAAA,UAC7B;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IAEQ,mBAAmB;AACvB,aAAO,KAAK,aAAa,IAAI,KAAK,OAAO,GAAG;AACxC,aAAK,WAAW;AAAA,MACpB;AACA,aAAO,KAAK;AAAA,IAChB;AAAA,IAEQ,mBAAmB,IAAa;AACpC,UAAI,CAAC,IAAI;AACL;AAAA,MACJ;AACA,YAAM,MAAO,GAAW,sBAAsB;AAC9C,UAAI,QAAQ,QAAW;AACnB,aAAK,aAAa,IAAI,GAAG;AAAA,MAC7B;AACA,iBAAW,SAAS,QAAQ,GAAG,QAAQ,GAAG;AACtC,aAAK,mBAAmB,KAAK;AAAA,MACjC;AACA,UAAI,GAAG,YAAY;AACf,mBAAW,SAAS,QAAQ,GAAG,WAAW,QAAQ,GAAG;AACjD,eAAK,mBAAmB,KAAK;AAAA,QACjC;AAAA,MACJ;AAAA,IACJ;AAAA,EAEJ;;;AC3UO,WAAS,UAAU,GAAW,GAAW,QAAQ,MAAM;AAC1D,QAAI,OAAO;AACP,mBAAa;AAAA,IACjB;AACA,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,MAAM,WAAW;AACvB,UAAM,MAAM,OAAO,GAAG,CAAC;AACvB,UAAM,MAAM,MAAM,GAAG,CAAC;AACtB,UAAM,MAAM,QAAQ;AACpB,UAAM,MAAM,SAAS;AACrB,UAAM,MAAM,YAAY;AACxB,UAAM,MAAM,kBAAkB;AAC9B,UAAM,MAAM,eAAe;AAC3B,UAAM,MAAM,UAAU;AACtB,UAAM,YAAY,oBAAoB;AACtC,cAAU,YAAY,KAAK;AAAA,EAC/B;AAEO,WAAS,eAAe;AAC3B,UAAM,YAAY,oBAAoB;AACtC,cAAU,OAAO;AAAA,EACrB;AAEO,WAAS,sBAAsB;AAClC,QAAI,YAAY,SAAS,cAAc,oBAAoB;AAC3D,QAAI,CAAC,WAAW;AACZ,kBAAY,SAAS,cAAc,KAAK;AACxC,MAAC,UAAkB,gBAAgB,IAAI;AACvC,gBAAU,KAAK;AACf,gBAAU,MAAM,WAAW;AAC3B,gBAAU,MAAM,MAAM;AACtB,gBAAU,MAAM,OAAO;AACvB,gBAAU,MAAM,SAAS;AACzB,gBAAU,MAAM,QAAQ;AACxB,gBAAU,MAAM,SAAS;AACzB,gBAAU,MAAM,gBAAgB;AAChC,eAAS,KAAK,YAAY,SAAS;AAAA,IACvC;AACA,WAAO;AAAA,EACX;;;AC/BO,WAAS,YAAY,IAAa,KAAa,OAAgB;AAClE,QAAI,EAAE,cAAc,UAAU;AAC1B;AAAA,IACJ;AACA,QAAI,cAAc,qBAAqB;AACnC;AAAA,IACJ;AACA,QAAI,cAAc,mBAAmB;AACjC;AAAA,IACJ;AACA,UAAM,YAAY,oBAAoB;AACtC,UAAM,OAAO,GAAG,sBAAsB;AACtC,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,cAAU,YAAY,OAAO;AAC7B,YAAQ,MAAM,WAAW;AACzB,YAAQ,MAAM,MAAM,GAAG,KAAK,GAAG;AAC/B,YAAQ,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,YAAQ,MAAM,QAAQ,GAAG,KAAK,KAAK;AACnC,YAAQ,MAAM,SAAS,GAAG,KAAK,MAAM;AACrC,YAAQ,MAAM,SAAS,aAAa,KAAK;AACzC,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAQ,YAAY,KAAK;AACzB,UAAM,MAAM,WAAW;AACvB,UAAM,MAAM,SAAS;AACrB,UAAM,MAAM,OAAO;AACnB,UAAM,MAAM,kBAAkB,SAAS,eAAe,GAAG;AACzD,UAAM,MAAM,QAAQ;AACpB,UAAM,MAAM,WAAW;AACvB,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,YAAY;AACxB,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,UAAU;AACtB,UAAM,MAAM,YAAY;AACxB,UAAM,cAAc,OAAO,GAAG;AAAA,EAClC;AAEA,WAAS,eAAe,KAAa;AACjC,UAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,UAAM,MAAO,QAAQ,MAAM,QAAQ;AACnC,WAAO,OAAO,GAAG;AAAA,EACrB;;;AC/CO,MAAM,aAAN,MAAiB;AAAA,IAIpB,YAAY,SAAuB;AAFnC,WAAQ,YAAY,oBAAI,IAAwB;AAG5C,iBAAW,UAAU,SAAS;AAC1B,aAAK,UAAU,IAAI,OAAO,SAAS,MAAM;AAAA,MAC7C;AAAA,IACJ;AAAA,IAEA,IAAI,UAAU;AACV,aAAO,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,IACtC;AAAA,IAEA,IAAI,YAAY;AACZ,aAAO,KAAK,QAAQ,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,WAAW,CAAC;AAAA,IACzE;AAAA,IAEA,cAAc,KAA4B;AACtC,YAAM,QAAQ,KAAK,eAAe,GAAG;AACrC,UAAI,SAAS,MAAM;AACf,eAAO;AAAA,MACX;AACA,aAAO,MAAM,SAAS,GAAG;AAAA,IAC7B;AAAA,IAEA,cAAc,SAAoC;AAC9C,aAAO,KAAK,UAAU,IAAI,OAAO,KAAK;AAAA,IAC1C;AAAA,IAEA,eAAe,KAAgC;AAC3C,YAAM,QAAQ,KAAK,QAAQ,KAAK,OAAK,EAAE,OAAO,GAAG,CAAC;AAClD,aAAO,SAAS;AAAA,IACpB;AAAA,IAEA,cAAc,KAAyB;AACnC,YAAM,QAAQ,KAAK,eAAe,GAAG;AACrC,UAAI,SAAS,MAAM;AACf,cAAM,IAAI,MAAM,iCAAiC,GAAG,GAAG;AAAA,MAC3D;AACA,aAAO;AAAA,IACX;AAAA,IAEA,gBAAgB,SAAoC;AAChD,YAAM,QAAQ,KAAK,cAAc,OAAO;AACxC,YAAM,YAAY,OAAO;AACzB,UAAI,aAAa,MAAM;AACnB,eAAO;AAAA,MACX;AACA,aAAO,KAAK,eAAe,SAAS;AAAA,IACxC;AAAA,IAEA,aAAa,SAA0B;AACnC,YAAM,QAAQ,KAAK,cAAc,OAAO;AACxC,UAAI,CAAC,OAAO;AACR,eAAO;AAAA,MACX;AACA,YAAM,cAAc,KAAK,gBAAgB,OAAO;AAChD,YAAM,EAAE,UAAU,IAAI;AACtB,UAAI,eAAe,QAAQ,aAAa,MAAM;AAE1C,eAAO;AAAA,MACX;AACA,YAAM,iBAAiB,CAAC,CAAC,YAAY,SAAS,SAAS;AACvD,aAAO,iBAAiB,KAAK,aAAa,YAAY,OAAO,IAAI;AAAA,IACrE;AAAA,IAEA,UAAU,SAA0B;AAChC,aAAO,KAAK,QAAQ,IAAI,WAAS;AAC7B,cAAM,WAAW,OAAO,OAAO,OAAO;AACtC,eAAO;AAAA,UACH,SAAS,MAAM,OAAO,GAAG,MAAM,YAAY,MAAM,MAAM,SAAS,MAAM,EAAE;AAAA,UACxE;AAAA,QACJ,EAAE,KAAK,MAAM;AAAA,MACjB,CAAC,EAAE,KAAK,MAAM;AAAA,IAClB;AAAA,EAEJ;",
|
|
6
6
|
"names": ["index"]
|
|
7
7
|
}
|
package/build/page.mjs
CHANGED
|
@@ -98,6 +98,9 @@ function getOffsetTop(node) {
|
|
|
98
98
|
return y;
|
|
99
99
|
}
|
|
100
100
|
function hasVisibleArea(element) {
|
|
101
|
+
if (!element) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
101
104
|
const rect = element.getBoundingClientRect();
|
|
102
105
|
const area = rect.width * rect.height;
|
|
103
106
|
return area > 64;
|
|
@@ -141,21 +144,6 @@ function isInteractive(el) {
|
|
|
141
144
|
}
|
|
142
145
|
return false;
|
|
143
146
|
}
|
|
144
|
-
function isPopup(el) {
|
|
145
|
-
const style = getComputedStyle(el);
|
|
146
|
-
const zIndex = parseInt(style.zIndex, 10);
|
|
147
|
-
const hasPopupPosition = style.position === "fixed" || style.position === "sticky" || style.position === "absolute" && zIndex >= 1e3;
|
|
148
|
-
if (!hasPopupPosition) {
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
const rect = el.getBoundingClientRect();
|
|
152
|
-
const area = rect.width * rect.height;
|
|
153
|
-
const viewportArea = window.innerWidth * window.innerHeight;
|
|
154
|
-
if (area <= viewportArea * 0.2) {
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
147
|
function getViewportSize() {
|
|
160
148
|
return {
|
|
161
149
|
width: window.innerWidth,
|
|
@@ -166,6 +154,9 @@ function isRectInViewport(rect, viewport) {
|
|
|
166
154
|
return rect.left < viewport.width && rect.right > 0 && rect.top < viewport.height && rect.bottom > 0;
|
|
167
155
|
}
|
|
168
156
|
function makeOverlaysOpaque(el) {
|
|
157
|
+
if (!el) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
169
160
|
if (!el[ORIGINAL_STYLE_SYMBOL]) {
|
|
170
161
|
el[ORIGINAL_STYLE_SYMBOL] = el.getAttribute("style");
|
|
171
162
|
}
|
|
@@ -381,23 +372,14 @@ function renderTagLine(vxNode, options) {
|
|
|
381
372
|
components.push("." + vxNode.classList.join("."));
|
|
382
373
|
}
|
|
383
374
|
}
|
|
384
|
-
for (const meta of vxNode.meta ?? []) {
|
|
385
|
-
components.push(`[${meta}]`);
|
|
386
|
-
}
|
|
387
375
|
const attrs = [];
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
attrs.push(`${attr}="${truncateAttrValue(value)}"`);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
if (options.renderSrcAttrs) {
|
|
399
|
-
for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {
|
|
400
|
-
attrs.push(`${attr}="${truncateAttrValue(value)}"`);
|
|
376
|
+
const filterAttributes = options.filterAttributes ?? (() => true);
|
|
377
|
+
if (options.renderAttributes) {
|
|
378
|
+
for (const [attr, value] of Object.entries(vxNode.attributes ?? {})) {
|
|
379
|
+
if (!filterAttributes(vxNode, attr, value)) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
attrs.push(`${attr}="${value}"`);
|
|
401
383
|
}
|
|
402
384
|
}
|
|
403
385
|
if (htmlStyle) {
|
|
@@ -516,24 +498,6 @@ var VX_NODE_REF_SYMBOL = Symbol("vx:ref");
|
|
|
516
498
|
var VX_NODE_COUNTER_SYMBOL = Symbol("vx:counter");
|
|
517
499
|
var VX_IGNORE_SYMBOL = Symbol("vx:ignore");
|
|
518
500
|
var VX_IGNORE_TAGS = ["svg", "script", "noscript", "style", "link", "meta"];
|
|
519
|
-
var VX_LABEL_ATTRS = [
|
|
520
|
-
"title",
|
|
521
|
-
"alt",
|
|
522
|
-
"placeholder",
|
|
523
|
-
"aria-role",
|
|
524
|
-
"aria-label",
|
|
525
|
-
"aria-description",
|
|
526
|
-
"aria-placeholder",
|
|
527
|
-
"aria-valuetext"
|
|
528
|
-
];
|
|
529
|
-
var VX_LABEL_ATTR_PATTERNS = [
|
|
530
|
-
/^data-label/,
|
|
531
|
-
// data-label attributes
|
|
532
|
-
/title-/i
|
|
533
|
-
// title-* attributes
|
|
534
|
-
];
|
|
535
|
-
var VX_VALUE_ATTRS = ["role", "value", "checked", "selected", "disabled", "readonly"];
|
|
536
|
-
var VX_SRC_ATTRS = ["src", "href"];
|
|
537
501
|
var VX_TAG_PREFERENCE = [
|
|
538
502
|
"a",
|
|
539
503
|
"iframe",
|
|
@@ -655,18 +619,12 @@ var VxTreeParser = class {
|
|
|
655
619
|
tagName: el.tagName.toLowerCase(),
|
|
656
620
|
id: isRandomIdentifier(id) ? void 0 : id,
|
|
657
621
|
classList: Array.from(el.classList).filter((cls) => !isRandomIdentifier(cls)).slice(0, 4),
|
|
658
|
-
|
|
659
|
-
valueAttrs: this.collectValueAttrs(el),
|
|
660
|
-
srcAttrs: this.collectSrcAttrs(el),
|
|
622
|
+
attributes: this.collectAttributes(el),
|
|
661
623
|
hasVisibleArea: hasVisibleArea(parentEl),
|
|
662
624
|
isInteractive: isInteractive(parentEl),
|
|
663
625
|
isOutsideViewport: !isInViewport,
|
|
664
626
|
isProbeHit,
|
|
665
|
-
isKept: el.matches(VX_KEEP_SELECTOR)
|
|
666
|
-
meta: [
|
|
667
|
-
isPopup(parentEl) ? "popup" : null,
|
|
668
|
-
isInViewport && !isProbeHit ? "occluded" : null
|
|
669
|
-
].filter((_) => _ != null)
|
|
627
|
+
isKept: el.matches(VX_KEEP_SELECTOR)
|
|
670
628
|
});
|
|
671
629
|
const children = [];
|
|
672
630
|
for (const child of iterate(el.childNodes)) {
|
|
@@ -738,18 +696,8 @@ var VxTreeParser = class {
|
|
|
738
696
|
const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? "");
|
|
739
697
|
const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? "");
|
|
740
698
|
if (parentRank === -1 && childRank === -1) {
|
|
741
|
-
const parentAttrCount = Object.keys({
|
|
742
|
-
|
|
743
|
-
...parent.valueAttrs,
|
|
744
|
-
...parent.srcAttrs,
|
|
745
|
-
...parent.meta
|
|
746
|
-
}).length;
|
|
747
|
-
const childAttrCount = Object.keys({
|
|
748
|
-
...child.labelAttrs,
|
|
749
|
-
...child.valueAttrs,
|
|
750
|
-
...child.srcAttrs,
|
|
751
|
-
...child.meta
|
|
752
|
-
}).length;
|
|
699
|
+
const parentAttrCount = Object.keys(parent.attributes ?? {}).length;
|
|
700
|
+
const childAttrCount = Object.keys(child.attributes ?? {}).length;
|
|
753
701
|
return parentAttrCount > childAttrCount;
|
|
754
702
|
}
|
|
755
703
|
return parentRank !== -1 && (childRank === -1 || parentRank < childRank);
|
|
@@ -758,9 +706,7 @@ var VxTreeParser = class {
|
|
|
758
706
|
return {
|
|
759
707
|
...b,
|
|
760
708
|
...a,
|
|
761
|
-
|
|
762
|
-
valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },
|
|
763
|
-
srcAttrs: { ...b.srcAttrs, ...a.srcAttrs }
|
|
709
|
+
attributes: { ...b.attributes, ...a.attributes }
|
|
764
710
|
};
|
|
765
711
|
}
|
|
766
712
|
shouldOmit(vxNode) {
|
|
@@ -779,7 +725,7 @@ var VxTreeParser = class {
|
|
|
779
725
|
}
|
|
780
726
|
const hasText = !!vxNode.textContent;
|
|
781
727
|
const hasChildren = (vxNode.children ?? []).length > 0;
|
|
782
|
-
const hasAttrs =
|
|
728
|
+
const hasAttrs = !isObjectEmpty(vxNode.attributes ?? {});
|
|
783
729
|
if (this.options.unnestDivs) {
|
|
784
730
|
const isDivOrSpan = ["div", "span"].includes(tagName);
|
|
785
731
|
if (isDivOrSpan && hasChildren && !hasAttrs) {
|
|
@@ -799,41 +745,13 @@ var VxTreeParser = class {
|
|
|
799
745
|
}
|
|
800
746
|
return false;
|
|
801
747
|
}
|
|
802
|
-
|
|
748
|
+
collectAttributes(el) {
|
|
803
749
|
const attrs = {};
|
|
804
750
|
for (const attr of iterate(el.attributes)) {
|
|
805
|
-
|
|
806
|
-
const value = truncateAttrValue(attr.value);
|
|
807
|
-
if (!value) {
|
|
751
|
+
if (["id", "class", "style"].includes(attr.name.toLowerCase())) {
|
|
808
752
|
continue;
|
|
809
753
|
}
|
|
810
|
-
|
|
811
|
-
attrs[attrName] = value;
|
|
812
|
-
continue;
|
|
813
|
-
}
|
|
814
|
-
if (VX_LABEL_ATTR_PATTERNS.some((pattern) => pattern.test(attrName))) {
|
|
815
|
-
attrs[attrName] = value;
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
return attrs;
|
|
819
|
-
}
|
|
820
|
-
collectValueAttrs(el) {
|
|
821
|
-
const attrs = {};
|
|
822
|
-
for (const attr of VX_VALUE_ATTRS) {
|
|
823
|
-
const value = el[attr] ?? "";
|
|
824
|
-
if (value) {
|
|
825
|
-
attrs[attr] = String(value);
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
return attrs;
|
|
829
|
-
}
|
|
830
|
-
collectSrcAttrs(el) {
|
|
831
|
-
const attrs = {};
|
|
832
|
-
for (const attr of VX_SRC_ATTRS) {
|
|
833
|
-
const value = truncateAttrValue(el[attr] ?? "");
|
|
834
|
-
if (value) {
|
|
835
|
-
attrs[attr] = value;
|
|
836
|
-
}
|
|
754
|
+
attrs[attr.name] = truncateAttrValue(attr.value);
|
|
837
755
|
}
|
|
838
756
|
return attrs;
|
|
839
757
|
}
|
|
@@ -1032,15 +950,11 @@ export {
|
|
|
1032
950
|
VX_DOM_SYMBOL,
|
|
1033
951
|
VX_IGNORE_SYMBOL,
|
|
1034
952
|
VX_IGNORE_TAGS,
|
|
1035
|
-
VX_LABEL_ATTRS,
|
|
1036
|
-
VX_LABEL_ATTR_PATTERNS,
|
|
1037
953
|
VX_LAST_REFS_SYMBOL,
|
|
1038
954
|
VX_NODE_COUNTER_SYMBOL,
|
|
1039
955
|
VX_NODE_REF_SYMBOL,
|
|
1040
|
-
VX_SRC_ATTRS,
|
|
1041
956
|
VX_TAG_PREFERENCE,
|
|
1042
957
|
VX_TREE_SYMBOL,
|
|
1043
|
-
VX_VALUE_ATTRS,
|
|
1044
958
|
VxPageView,
|
|
1045
959
|
VxTreeParser,
|
|
1046
960
|
VxTreeView,
|
|
@@ -1062,7 +976,6 @@ export {
|
|
|
1062
976
|
isHidden,
|
|
1063
977
|
isInteractive,
|
|
1064
978
|
isObjectEmpty,
|
|
1065
|
-
isPopup,
|
|
1066
979
|
isRandomIdentifier,
|
|
1067
980
|
isRectInViewport,
|
|
1068
981
|
iterate,
|
package/build/webvision.user.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ==UserScript==
|
|
2
2
|
// @name Webvision (console)
|
|
3
3
|
// @namespace https://github.com/ubio/webvision
|
|
4
|
-
// @version 3.
|
|
4
|
+
// @version 3.3.1
|
|
5
5
|
// @description Loads Webvision from dev server into page; window.WebVision in console
|
|
6
6
|
// @match *://*/*
|
|
7
7
|
// @run-at document-end
|
package/out/page/dom.d.ts
CHANGED
|
@@ -14,7 +14,6 @@ export declare function getOffsetTop(node: Node): number;
|
|
|
14
14
|
export declare function hasVisibleArea(element: Element): boolean;
|
|
15
15
|
export declare function isDeepHidden(element: Element): boolean;
|
|
16
16
|
export declare function isInteractive(el: Element): boolean;
|
|
17
|
-
export declare function isPopup(el: Element): boolean;
|
|
18
17
|
export declare function getViewportSize(): Viewport;
|
|
19
18
|
export declare function isRectInViewport(rect: DOMRect, viewport: Viewport): boolean;
|
|
20
19
|
export declare function makeOverlaysOpaque(el: HTMLElement): void;
|
package/out/page/dom.js
CHANGED
|
@@ -60,6 +60,9 @@ export function getOffsetTop(node) {
|
|
|
60
60
|
return y;
|
|
61
61
|
}
|
|
62
62
|
export function hasVisibleArea(element) {
|
|
63
|
+
if (!element) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
63
66
|
const rect = element.getBoundingClientRect();
|
|
64
67
|
const area = rect.width * rect.height;
|
|
65
68
|
return area > 64;
|
|
@@ -103,23 +106,6 @@ export function isInteractive(el) {
|
|
|
103
106
|
}
|
|
104
107
|
return false;
|
|
105
108
|
}
|
|
106
|
-
export function isPopup(el) {
|
|
107
|
-
const style = getComputedStyle(el);
|
|
108
|
-
const zIndex = parseInt(style.zIndex, 10);
|
|
109
|
-
const hasPopupPosition = style.position === 'fixed' ||
|
|
110
|
-
style.position === 'sticky' ||
|
|
111
|
-
(style.position === 'absolute' && zIndex >= 1000);
|
|
112
|
-
if (!hasPopupPosition) {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
const rect = el.getBoundingClientRect();
|
|
116
|
-
const area = rect.width * rect.height;
|
|
117
|
-
const viewportArea = window.innerWidth * window.innerHeight;
|
|
118
|
-
if (area <= viewportArea * 0.2) {
|
|
119
|
-
return false;
|
|
120
|
-
}
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
109
|
export function getViewportSize() {
|
|
124
110
|
return {
|
|
125
111
|
width: window.innerWidth,
|
|
@@ -133,6 +119,9 @@ export function isRectInViewport(rect, viewport) {
|
|
|
133
119
|
rect.bottom > 0;
|
|
134
120
|
}
|
|
135
121
|
export function makeOverlaysOpaque(el) {
|
|
122
|
+
if (!el) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
136
125
|
if (!el[ORIGINAL_STYLE_SYMBOL]) {
|
|
137
126
|
el[ORIGINAL_STYLE_SYMBOL] = el.getAttribute('style');
|
|
138
127
|
}
|
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
|
@@ -3,10 +3,6 @@ export declare const VX_NODE_REF_SYMBOL: unique symbol;
|
|
|
3
3
|
export declare const VX_NODE_COUNTER_SYMBOL: unique symbol;
|
|
4
4
|
export declare const VX_IGNORE_SYMBOL: unique symbol;
|
|
5
5
|
export declare const VX_IGNORE_TAGS: string[];
|
|
6
|
-
export declare const VX_LABEL_ATTRS: string[];
|
|
7
|
-
export declare const VX_LABEL_ATTR_PATTERNS: RegExp[];
|
|
8
|
-
export declare const VX_VALUE_ATTRS: string[];
|
|
9
|
-
export declare const VX_SRC_ATTRS: string[];
|
|
10
6
|
export declare const VX_TAG_PREFERENCE: string[];
|
|
11
7
|
export type VxDomNode = Element | Text;
|
|
12
8
|
export interface VxNode {
|
|
@@ -21,10 +17,7 @@ export interface VxNode {
|
|
|
21
17
|
isOutsideViewport?: boolean;
|
|
22
18
|
isProbeHit?: boolean;
|
|
23
19
|
isKept?: boolean;
|
|
24
|
-
|
|
25
|
-
srcAttrs?: Record<string, string>;
|
|
26
|
-
labelAttrs?: Record<string, string>;
|
|
27
|
-
valueAttrs?: Record<string, string>;
|
|
20
|
+
attributes?: Record<string, string>;
|
|
28
21
|
}
|
|
29
22
|
export interface VxTreeOptions {
|
|
30
23
|
frameId?: string;
|
|
@@ -64,9 +57,7 @@ export declare class VxTreeParser {
|
|
|
64
57
|
private collapseMerge;
|
|
65
58
|
private shouldOmit;
|
|
66
59
|
private isProbeHit;
|
|
67
|
-
private
|
|
68
|
-
private collectValueAttrs;
|
|
69
|
-
private collectSrcAttrs;
|
|
60
|
+
private collectAttributes;
|
|
70
61
|
private clearRecursive;
|
|
71
62
|
private nextCounterValue;
|
|
72
63
|
private collectDomCounters;
|
package/out/page/parser.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getViewportSize, hasVisibleArea, isInteractive,
|
|
1
|
+
import { getViewportSize, hasVisibleArea, isInteractive, isRandomIdentifier, isRectInViewport, makeOverlaysOpaque, normalizeText, truncateAttrValue } from './dom.js';
|
|
2
2
|
import { isHidden } from './dom.js';
|
|
3
3
|
import { probeViewport } from './probe.js';
|
|
4
4
|
import { VxTreeView } from './tree.js';
|
|
@@ -7,22 +7,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');
|
|
9
9
|
export const VX_IGNORE_TAGS = ['svg', 'script', 'noscript', 'style', 'link', 'meta'];
|
|
10
|
-
export const VX_LABEL_ATTRS = [
|
|
11
|
-
'title',
|
|
12
|
-
'alt',
|
|
13
|
-
'placeholder',
|
|
14
|
-
'aria-role',
|
|
15
|
-
'aria-label',
|
|
16
|
-
'aria-description',
|
|
17
|
-
'aria-placeholder',
|
|
18
|
-
'aria-valuetext',
|
|
19
|
-
];
|
|
20
|
-
export const VX_LABEL_ATTR_PATTERNS = [
|
|
21
|
-
/^data-label/, // data-label attributes
|
|
22
|
-
/title-/i, // title-* attributes
|
|
23
|
-
];
|
|
24
|
-
export const VX_VALUE_ATTRS = ['role', 'value', 'checked', 'selected', 'disabled', 'readonly'];
|
|
25
|
-
export const VX_SRC_ATTRS = ['src', 'href'];
|
|
26
10
|
export const VX_TAG_PREFERENCE = [
|
|
27
11
|
'a', 'iframe', 'input', 'button', 'select', 'textarea', 'img', 'label',
|
|
28
12
|
'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
|
|
@@ -108,18 +92,12 @@ export class VxTreeParser {
|
|
|
108
92
|
classList: Array.from(el.classList)
|
|
109
93
|
.filter(cls => !isRandomIdentifier(cls))
|
|
110
94
|
.slice(0, 4),
|
|
111
|
-
|
|
112
|
-
valueAttrs: this.collectValueAttrs(el),
|
|
113
|
-
srcAttrs: this.collectSrcAttrs(el),
|
|
95
|
+
attributes: this.collectAttributes(el),
|
|
114
96
|
hasVisibleArea: hasVisibleArea(parentEl),
|
|
115
97
|
isInteractive: isInteractive(parentEl),
|
|
116
98
|
isOutsideViewport: !isInViewport,
|
|
117
99
|
isProbeHit,
|
|
118
100
|
isKept: el.matches(VX_KEEP_SELECTOR),
|
|
119
|
-
meta: [
|
|
120
|
-
isPopup(parentEl) ? 'popup' : null,
|
|
121
|
-
(isInViewport && !isProbeHit) ? 'occluded' : null,
|
|
122
|
-
].filter(_ => _ != null)
|
|
123
101
|
});
|
|
124
102
|
const children = [];
|
|
125
103
|
for (const child of iterate(el.childNodes)) {
|
|
@@ -199,18 +177,8 @@ export class VxTreeParser {
|
|
|
199
177
|
const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? '');
|
|
200
178
|
const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? '');
|
|
201
179
|
if (parentRank === -1 && childRank === -1) {
|
|
202
|
-
const parentAttrCount = Object.keys({
|
|
203
|
-
|
|
204
|
-
...parent.valueAttrs,
|
|
205
|
-
...parent.srcAttrs,
|
|
206
|
-
...parent.meta,
|
|
207
|
-
}).length;
|
|
208
|
-
const childAttrCount = Object.keys({
|
|
209
|
-
...child.labelAttrs,
|
|
210
|
-
...child.valueAttrs,
|
|
211
|
-
...child.srcAttrs,
|
|
212
|
-
...child.meta,
|
|
213
|
-
}).length;
|
|
180
|
+
const parentAttrCount = Object.keys(parent.attributes ?? {}).length;
|
|
181
|
+
const childAttrCount = Object.keys(child.attributes ?? {}).length;
|
|
214
182
|
return parentAttrCount > childAttrCount;
|
|
215
183
|
}
|
|
216
184
|
return parentRank !== -1 && (childRank === -1 || parentRank < childRank);
|
|
@@ -219,9 +187,7 @@ export class VxTreeParser {
|
|
|
219
187
|
return {
|
|
220
188
|
...b,
|
|
221
189
|
...a,
|
|
222
|
-
|
|
223
|
-
valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },
|
|
224
|
-
srcAttrs: { ...b.srcAttrs, ...a.srcAttrs },
|
|
190
|
+
attributes: { ...b.attributes, ...a.attributes },
|
|
225
191
|
};
|
|
226
192
|
}
|
|
227
193
|
shouldOmit(vxNode) {
|
|
@@ -240,8 +206,7 @@ export class VxTreeParser {
|
|
|
240
206
|
}
|
|
241
207
|
const hasText = !!vxNode.textContent;
|
|
242
208
|
const hasChildren = (vxNode.children ?? []).length > 0;
|
|
243
|
-
const hasAttrs =
|
|
244
|
-
.some(attrs => !isObjectEmpty(attrs ?? {}));
|
|
209
|
+
const hasAttrs = !isObjectEmpty(vxNode.attributes ?? {});
|
|
245
210
|
if (this.options.unnestDivs) {
|
|
246
211
|
const isDivOrSpan = ['div', 'span'].includes(tagName);
|
|
247
212
|
if (isDivOrSpan && hasChildren && !hasAttrs) {
|
|
@@ -262,44 +227,13 @@ export class VxTreeParser {
|
|
|
262
227
|
}
|
|
263
228
|
return false;
|
|
264
229
|
}
|
|
265
|
-
|
|
230
|
+
collectAttributes(el) {
|
|
266
231
|
const attrs = {};
|
|
267
|
-
// Loop through all element attributes
|
|
268
232
|
for (const attr of iterate(el.attributes)) {
|
|
269
|
-
|
|
270
|
-
const value = truncateAttrValue(attr.value);
|
|
271
|
-
if (!value) {
|
|
272
|
-
continue; // Skip empty values
|
|
273
|
-
}
|
|
274
|
-
// Check for exact matches in VX_LABEL_ATTRS
|
|
275
|
-
if (VX_LABEL_ATTRS.includes(attrName)) {
|
|
276
|
-
attrs[attrName] = value;
|
|
233
|
+
if (['id', 'class', 'style'].includes(attr.name.toLowerCase())) {
|
|
277
234
|
continue;
|
|
278
235
|
}
|
|
279
|
-
|
|
280
|
-
if (VX_LABEL_ATTR_PATTERNS.some(pattern => pattern.test(attrName))) {
|
|
281
|
-
attrs[attrName] = value;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
return attrs;
|
|
285
|
-
}
|
|
286
|
-
collectValueAttrs(el) {
|
|
287
|
-
const attrs = {};
|
|
288
|
-
for (const attr of VX_VALUE_ATTRS) {
|
|
289
|
-
const value = el[attr] ?? '';
|
|
290
|
-
if (value) {
|
|
291
|
-
attrs[attr] = String(value);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return attrs;
|
|
295
|
-
}
|
|
296
|
-
collectSrcAttrs(el) {
|
|
297
|
-
const attrs = {};
|
|
298
|
-
for (const attr of VX_SRC_ATTRS) {
|
|
299
|
-
const value = truncateAttrValue(el[attr] ?? '');
|
|
300
|
-
if (value) {
|
|
301
|
-
attrs[attr] = value;
|
|
302
|
-
}
|
|
236
|
+
attrs[attr.name] = truncateAttrValue(attr.value);
|
|
303
237
|
}
|
|
304
238
|
return attrs;
|
|
305
239
|
}
|
package/out/page/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/page/parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/page/parser.ts"],"names":[],"mappings":"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"}
|
package/out/page/render.d.ts
CHANGED
|
@@ -5,9 +5,8 @@ export interface VxRenderOptions {
|
|
|
5
5
|
renderIds?: boolean;
|
|
6
6
|
renderClassNames?: boolean;
|
|
7
7
|
renderRefs?: boolean;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
renderSrcAttrs?: boolean;
|
|
8
|
+
renderAttributes?: boolean;
|
|
9
|
+
filterAttributes?: (node: VxNode, k: string, v: string) => boolean;
|
|
11
10
|
skipTags?: string[];
|
|
12
11
|
skipNonInteractive?: boolean;
|
|
13
12
|
}
|
package/out/page/render.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { truncateAttrValue } from './dom.js';
|
|
2
1
|
import { traverseVxNode } from './traverse.js';
|
|
3
2
|
export function renderVxNode(scope, options = {}) {
|
|
4
3
|
const buffer = [];
|
|
@@ -52,23 +51,14 @@ function renderTagLine(vxNode, options) {
|
|
|
52
51
|
components.push('.' + vxNode.classList.join('.'));
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
|
-
for (const meta of vxNode.meta ?? []) {
|
|
56
|
-
components.push(`[${meta}]`);
|
|
57
|
-
}
|
|
58
54
|
const attrs = [];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
attrs.push(`${attr}="${truncateAttrValue(value)}"`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
if (options.renderSrcAttrs) {
|
|
70
|
-
for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {
|
|
71
|
-
attrs.push(`${attr}="${truncateAttrValue(value)}"`);
|
|
55
|
+
const filterAttributes = options.filterAttributes ?? (() => true);
|
|
56
|
+
if (options.renderAttributes) {
|
|
57
|
+
for (const [attr, value] of Object.entries(vxNode.attributes ?? {})) {
|
|
58
|
+
if (!filterAttributes(vxNode, attr, value)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
attrs.push(`${attr}="${value}"`);
|
|
72
62
|
}
|
|
73
63
|
}
|
|
74
64
|
if (htmlStyle) {
|
package/out/page/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/page/render.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/page/render.ts"],"names":[],"mappings":"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"}
|