@ubio/webvision 2.1.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/page.mjs CHANGED
@@ -311,6 +311,9 @@ var VxTreeParser = class {
311
311
  parseDocument() {
312
312
  return this.parseNode(document.documentElement, null);
313
313
  }
314
+ getTree() {
315
+ return new VxTreeView(this.vxNodes, this.refRange);
316
+ }
314
317
  getNodes() {
315
318
  return this.vxNodes;
316
319
  }
@@ -592,14 +595,32 @@ function* traverseVxNode(vxNode, depth = 0) {
592
595
  function renderVxNode(scope, options = {}) {
593
596
  const buffer = [];
594
597
  const whitelistRefs = options.whitelistRefs ?? [];
598
+ const stack = [];
595
599
  for (const { vxNode, depth } of traverseVxNode(scope)) {
596
600
  if (whitelistRefs.length > 0) {
597
601
  if (!whitelistRefs.includes(vxNode.ref)) {
598
602
  continue;
599
603
  }
600
604
  }
601
- const indent = " ".repeat(depth);
602
- buffer.push(renderIndentedLine(indent, vxNode, options));
605
+ while (depth < stack.length) {
606
+ stack.pop();
607
+ }
608
+ const parentState = stack[depth - 1];
609
+ const parentIndentLevel = parentState?.indentLevel ?? 0;
610
+ const parentContributes = parentState?.contributes ?? false;
611
+ let currentIndentLevel;
612
+ if (depth === 0) {
613
+ currentIndentLevel = 0;
614
+ } else {
615
+ currentIndentLevel = parentIndentLevel + (parentContributes ? 1 : 0);
616
+ }
617
+ const indent = " ".repeat(currentIndentLevel);
618
+ const line = renderIndentedLine(indent, vxNode, options);
619
+ if (line.trim()) {
620
+ buffer.push(line);
621
+ }
622
+ const contributes = !!(options.renderNonInteractive || vxNode.isInteractive);
623
+ stack.push({ indentLevel: currentIndentLevel, contributes });
603
624
  }
604
625
  return buffer.join("\n");
605
626
  }
@@ -607,7 +628,7 @@ function renderIndentedLine(indent, vxNode, options = {}) {
607
628
  if (!vxNode.tagName) {
608
629
  return [indent, vxNode.textContent].filter(Boolean).join("");
609
630
  }
610
- const tagLine = renderTagLine(vxNode, options);
631
+ const tagLine = !options.renderNonInteractive && !vxNode.isInteractive ? "" : renderTagLine(vxNode, options);
611
632
  const htmlStyle = options.renderStyle === "html";
612
633
  return [
613
634
  indent,
@@ -674,15 +695,11 @@ var VX_DOM_SYMBOL = Symbol("vx:dom");
674
695
  var VX_TREE_SYMBOL = Symbol("vx:tree");
675
696
  function captureSnapshot(options = {}) {
676
697
  const parser = new VxTreeParser(options);
677
- const vxNodes = parser.getNodes();
678
698
  const domMap = parser.getDomMap();
679
- const vxTree = new VxTreeView(vxNodes);
699
+ const vxTree = parser.getTree();
680
700
  globalThis[VX_DOM_SYMBOL] = domMap;
681
701
  globalThis[VX_TREE_SYMBOL] = vxTree;
682
- return {
683
- nodes: vxNodes,
684
- refRange: parser.getRefRange()
685
- };
702
+ return vxTree;
686
703
  }
687
704
  function getSnapshot() {
688
705
  const vxTree = globalThis[VX_TREE_SYMBOL];
@@ -701,8 +718,9 @@ function resolveDomNode(ref) {
701
718
 
702
719
  // src/page/tree.ts
703
720
  var VxTreeView = class {
704
- constructor(nodes) {
721
+ constructor(nodes, refRange) {
705
722
  this.nodes = nodes;
723
+ this.refRange = refRange;
706
724
  this.refMap = /* @__PURE__ */ new Map();
707
725
  this.buildRefMap(nodes);
708
726
  }
@@ -734,7 +752,7 @@ var VxTreeView = class {
734
752
  for (const ref of refs) {
735
753
  const el = resolveDomNode(ref);
736
754
  if (el instanceof Element) {
737
- highlightEl(el);
755
+ highlightEl(el, ref);
738
756
  }
739
757
  }
740
758
  return refs;
@@ -762,7 +780,7 @@ var VxPageView = class {
762
780
  this.vxTreeMap = /* @__PURE__ */ new Map();
763
781
  for (const frame of vxFrames) {
764
782
  this.vxFrameMap.set(frame.frameId, frame);
765
- this.vxTreeMap.set(frame.frameId, new VxTreeView(frame.nodes));
783
+ this.vxTreeMap.set(frame.frameId, new VxTreeView(frame.nodes, frame.refRange));
766
784
  }
767
785
  }
768
786
  findFrameByFrameId(frameId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ubio/webvision",
3
- "version": "2.1.1",
3
+ "version": "2.3.0",
4
4
  "main": "out/main/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1,6 +0,0 @@
1
- export declare class Counter {
2
- value: number;
3
- constructor(value?: number);
4
- next(): number;
5
- current(): number;
6
- }
@@ -1,13 +0,0 @@
1
- export class Counter {
2
- constructor(value = 0) {
3
- this.value = value;
4
- }
5
- next() {
6
- this.value += 1;
7
- return this.value;
8
- }
9
- current() {
10
- return this.value;
11
- }
12
- }
13
- //# sourceMappingURL=counter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/page/counter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,OAAO;IAEhB,YAAmB,QAAQ,CAAC;QAAT,UAAK,GAAL,KAAK,CAAI;IAAG,CAAC;IAEhC,IAAI;QACA,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;CAEJ"}
package/out/page/dom.d.ts DELETED
@@ -1,21 +0,0 @@
1
- export declare const INTERACTIVE_TAGS: string[];
2
- export declare const INTERACTIVE_ROLES: string[];
3
- export interface Viewport {
4
- width: number;
5
- height: number;
6
- }
7
- export declare function isHidden(el: Element): boolean;
8
- export declare function getNormalizedText(el: Element): string;
9
- export declare function normalizeText(str: string): string;
10
- export declare function truncateAttrValue(value: string, limit?: number): string;
11
- export declare function escapeAttribute(value: string): string;
12
- export declare function containsSelector(el: Element, selector: string): boolean;
13
- export declare function getOffsetTop(node: Node): number;
14
- export declare function hasVisibleArea(element: Element): boolean;
15
- export declare function isDeepHidden(element: Element): boolean;
16
- export declare function isInteractive(el: Element): boolean;
17
- export declare function getViewportSize(): Viewport;
18
- export declare function isRectInViewport(rect: DOMRect, viewport: Viewport): boolean;
19
- export declare function makeOverlaysOpaque(el: HTMLElement): void;
20
- export declare function isRandomIdentifier(str: string): boolean;
21
- export declare function fixZIndex(el: HTMLElement): void;
package/out/page/dom.js DELETED
@@ -1,172 +0,0 @@
1
- const ORIGINAL_STYLE_SYMBOL = Symbol('vx:originalStyle');
2
- export const INTERACTIVE_TAGS = ['a', 'button', 'input', 'textarea', 'select', 'label'];
3
- export const INTERACTIVE_ROLES = [
4
- 'button', 'link', 'checkbox', 'radio', 'textbox', 'combobox', 'listbox', 'menu', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'optgroup', 'progressbar', 'scrollbar', 'slider', 'spinbutton', 'switch', 'tab', 'tablist', 'timer', 'toolbar'
5
- ];
6
- export function isHidden(el) {
7
- const style = getComputedStyle(el);
8
- if (style.display === 'none') {
9
- return true;
10
- }
11
- if (style.visibility === 'hidden') {
12
- return true;
13
- }
14
- if (style.opacity === '0') {
15
- return true;
16
- }
17
- return false;
18
- }
19
- export function getNormalizedText(el) {
20
- return normalizeText(el.textContent ?? '');
21
- }
22
- export function normalizeText(str) {
23
- return str
24
- .replace(/\p{Cf}/gu, ' ')
25
- .replace(/\s+/g, ' ')
26
- .trim();
27
- }
28
- export function truncateAttrValue(value, limit = 100) {
29
- if (value.match(/^(javascript:)?void/)) {
30
- return '';
31
- }
32
- if (value.startsWith('data:')) {
33
- return '';
34
- }
35
- if (value.length > limit) {
36
- return value.slice(0, limit) + '…';
37
- }
38
- return value;
39
- }
40
- export function escapeAttribute(value) {
41
- return value
42
- .replace(/&/g, '&amp;') // Escape ampersand first!
43
- .replace(/"/g, '&quot;') // Escape double quotes
44
- .replace(/'/g, '&#39;') // Escape single quotes
45
- .replace(/</g, '&lt;') // Escape less than
46
- .replace(/>/g, '&gt;') // Escape greater than
47
- .replace(/\r?\n/g, ' '); // Replace newlines with space
48
- }
49
- export function containsSelector(el, selector) {
50
- return el.matches(selector) || !!el.querySelector(selector);
51
- }
52
- export function getOffsetTop(node) {
53
- let y = 0;
54
- let current = node;
55
- while (current) {
56
- y += current.offsetTop ?? 0;
57
- current = current.offsetParent;
58
- }
59
- return y;
60
- }
61
- export function hasVisibleArea(element) {
62
- const rect = element.getBoundingClientRect();
63
- const area = rect.width * rect.height;
64
- return area > 64;
65
- }
66
- export function isDeepHidden(element) {
67
- if (isHidden(element)) {
68
- return true;
69
- }
70
- if (!hasVisibleArea(element)) {
71
- return [...element.children].every(el => isDeepHidden(el));
72
- }
73
- return false;
74
- }
75
- export function isInteractive(el) {
76
- const htmlEl = el;
77
- if (INTERACTIVE_TAGS.includes(el.tagName.toLowerCase())) {
78
- return true;
79
- }
80
- const tabindex = htmlEl.getAttribute('tabindex');
81
- if (tabindex && parseInt(tabindex) >= 0) {
82
- return true;
83
- }
84
- const role = htmlEl.getAttribute('role') ?? htmlEl.getAttribute('aria-role') ?? '';
85
- if (INTERACTIVE_ROLES.includes(role)) {
86
- return true;
87
- }
88
- if (htmlEl.onclick != null) {
89
- return true;
90
- }
91
- return false;
92
- }
93
- export function getViewportSize() {
94
- return {
95
- width: window.innerWidth,
96
- height: window.innerHeight,
97
- };
98
- }
99
- export function isRectInViewport(rect, viewport) {
100
- return rect.left < viewport.width &&
101
- rect.right > 0 &&
102
- rect.top < viewport.height &&
103
- rect.bottom > 0;
104
- }
105
- export function makeOverlaysOpaque(el) {
106
- if (!el[ORIGINAL_STYLE_SYMBOL]) {
107
- el[ORIGINAL_STYLE_SYMBOL] = el.getAttribute('style');
108
- }
109
- // Only apply to big elements
110
- const rect = el.getBoundingClientRect();
111
- if (rect.width < 500 || rect.height < 500) {
112
- return;
113
- }
114
- const style = getComputedStyle(el);
115
- if (style.pointerEvents === 'none') {
116
- return;
117
- }
118
- el.style.setProperty('animation', 'none', 'important');
119
- el.style.setProperty('transition', 'none', 'important');
120
- el.style.setProperty('backdrop-filter', 'none', 'important');
121
- el.style.setProperty('mix-blend-mode', 'normal', 'important');
122
- el.style.setProperty('opacity', '1', 'important');
123
- el.style.setProperty('filter', 'none', 'important');
124
- const bg = style.backgroundColor;
125
- el.style.setProperty('background-color', removeAlpha(bg));
126
- }
127
- function removeAlpha(color) {
128
- const rgba = color.match(/^rgba\((.*)\)$/);
129
- if (!rgba) {
130
- return color;
131
- }
132
- const [r, g, b, a] = rgba[1].split(',').map(parseFloat);
133
- if (a > 0 && a < 1) {
134
- return `rgba(${r},${g},${b},1)`;
135
- }
136
- return color;
137
- }
138
- export function isRandomIdentifier(str) {
139
- const words = str.split(/[_-]/g);
140
- return !words.some(w => isWordLike(w)) || words.some(w => isRandomString(w));
141
- }
142
- function isWordLike(str) {
143
- if (str.length <= 2) {
144
- return false;
145
- }
146
- // Words don't usually have a lot of vowels or consonants in a row
147
- if (/[^eyuioa]{4,}/.test(str)) {
148
- return false;
149
- }
150
- if (/[eyuioa]{4,}/.test(str)) {
151
- return false;
152
- }
153
- return true;
154
- }
155
- function isRandomString(str) {
156
- // Hex strings will often consist of at least one digit and A-F letters
157
- if (/^[0-9a-f]+$/i.test(str) && /[0-9]/.test(str)) {
158
- return true;
159
- }
160
- // Digits separated by non-digits are a sign of random ids
161
- if (/[0-9][^0-9]+[0-9]/.test(str)) {
162
- return true;
163
- }
164
- return false;
165
- }
166
- export function fixZIndex(el) {
167
- const style = getComputedStyle(el);
168
- if (Number(style.zIndex) > 2147483600) {
169
- el.style.setProperty('z-index', '2147483600', 'important');
170
- }
171
- }
172
- //# sourceMappingURL=dom.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/page/dom.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { VxNode } from './parser.js';
2
- import { VxRenderOptions } from './render.js';
3
- export interface VxFrame {
4
- frameId: number;
5
- iframeRef?: number;
6
- refRange: [number, number];
7
- nodes: VxNode[];
8
- isOmitted?: boolean;
9
- }
10
- export declare class VxPageView<T extends VxFrame> {
11
- readonly vxFrames: T[];
12
- private vxFrameMap;
13
- private vxTreeMap;
14
- constructor(vxFrames: T[]);
15
- findFrameByFrameId(frameId: number): T | null;
16
- getFrameByFrameId(frameId: number): T;
17
- findFrameByRef(ref: number): T | null;
18
- getFrameByRef(ref: number): T;
19
- findParentFrame(frameId: number): T | null;
20
- isFrameShown(frameId: number): boolean;
21
- renderAll(options: VxRenderOptions): string;
22
- }
package/out/page/frame.js DELETED
@@ -1,69 +0,0 @@
1
- import { VxTreeView } from './tree.js';
2
- export class VxPageView {
3
- constructor(vxFrames) {
4
- this.vxFrames = vxFrames;
5
- this.vxFrameMap = new Map();
6
- this.vxTreeMap = new Map();
7
- for (const frame of vxFrames) {
8
- this.vxFrameMap.set(frame.frameId, frame);
9
- this.vxTreeMap.set(frame.frameId, new VxTreeView(frame.nodes));
10
- }
11
- }
12
- findFrameByFrameId(frameId) {
13
- return this.vxFrameMap.get(frameId) ?? null;
14
- }
15
- getFrameByFrameId(frameId) {
16
- const vxFrame = this.vxFrameMap.get(frameId);
17
- if (vxFrame == null) {
18
- throw new Error(`[VX] Frame not found for [frameId=${frameId}]`);
19
- }
20
- return vxFrame;
21
- }
22
- findFrameByRef(ref) {
23
- const vxFrame = this.vxFrames.find(frame => ref >= frame.refRange[0] && ref <= frame.refRange[1]);
24
- if (!vxFrame) {
25
- return null;
26
- }
27
- return this.vxFrameMap.get(vxFrame.frameId) ?? null;
28
- }
29
- getFrameByRef(ref) {
30
- const vxFrame = this.findFrameByRef(ref);
31
- if (vxFrame == null) {
32
- throw new Error(`[VX] Frame not found for [ref=${ref}]`);
33
- }
34
- return vxFrame;
35
- }
36
- findParentFrame(frameId) {
37
- const frame = this.getFrameByFrameId(frameId);
38
- const iframeRef = frame?.iframeRef;
39
- if (iframeRef == null) {
40
- return null;
41
- }
42
- return this.findFrameByRef(iframeRef);
43
- }
44
- isFrameShown(frameId) {
45
- const frame = this.getFrameByFrameId(frameId);
46
- if (!frame) {
47
- return false;
48
- }
49
- const parentFrame = this.findParentFrame(frameId);
50
- const { iframeRef } = frame;
51
- if (parentFrame == null || iframeRef == null) {
52
- return true;
53
- }
54
- const vxTree = this.vxTreeMap.get(frameId);
55
- const existsInParent = !!vxTree?.findNode(iframeRef);
56
- return existsInParent ? this.isFrameShown(parentFrame.frameId) : false;
57
- }
58
- renderAll(options) {
59
- return this.vxFrames.map(frame => {
60
- const vxTree = this.vxTreeMap.get(frame.frameId);
61
- const rendered = vxTree?.render(options);
62
- return [
63
- `FRAME ${frame.frameId}`,
64
- rendered,
65
- ].join('\n\n');
66
- }).join('\n\n');
67
- }
68
- }
69
- //# sourceMappingURL=frame.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/page/frame.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- export * from './counter.js';
2
- export * from './dom.js';
3
- export * from './frame.js';
4
- export * from './overlay.js';
5
- export * from './parser.js';
6
- export * from './probe.js';
7
- export * from './render.js';
8
- export * from './snapshot.js';
9
- export * from './traverse.js';
10
- export * from './tree.js';
11
- export * from './util.js';
package/out/page/index.js DELETED
@@ -1,12 +0,0 @@
1
- export * from './counter.js';
2
- export * from './dom.js';
3
- export * from './frame.js';
4
- export * from './overlay.js';
5
- export * from './parser.js';
6
- export * from './probe.js';
7
- export * from './render.js';
8
- export * from './snapshot.js';
9
- export * from './traverse.js';
10
- export * from './tree.js';
11
- export * from './util.js';
12
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/page/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC"}
@@ -1,3 +0,0 @@
1
- export declare function showPoint(x: number, y: number, clear?: boolean): void;
2
- export declare function clearOverlay(): void;
3
- export declare function highlightEl(el: Element, ref?: number): void;
@@ -1,75 +0,0 @@
1
- import { VX_IGNORE_SYMBOL } from './parser.js';
2
- export function showPoint(x, y, clear = true) {
3
- if (clear) {
4
- clearOverlay();
5
- }
6
- const point = document.createElement('div');
7
- point.style.position = 'absolute';
8
- point.style.left = `${x}px`;
9
- point.style.top = `${y}px`;
10
- point.style.width = '32px';
11
- point.style.height = '32px';
12
- point.style.transform = 'translate(-50%, -50%)';
13
- point.style.backgroundColor = 'red';
14
- point.style.borderRadius = '100%';
15
- point.style.opacity = '0.5';
16
- const container = getOverlayContainer();
17
- container.appendChild(point);
18
- }
19
- export function clearOverlay() {
20
- const container = getOverlayContainer();
21
- container.remove();
22
- }
23
- export function highlightEl(el, ref = 0) {
24
- if (!(el instanceof Element)) {
25
- return;
26
- }
27
- const container = getOverlayContainer();
28
- const color = getColor(ref);
29
- const rect = el.getBoundingClientRect();
30
- const overlay = document.createElement('div');
31
- container.appendChild(overlay);
32
- overlay.style.position = 'absolute';
33
- overlay.style.top = `${rect.top}px`;
34
- overlay.style.left = `${rect.left}px`;
35
- overlay.style.width = `${rect.width}px`;
36
- overlay.style.height = `${rect.height}px`;
37
- overlay.style.border = `2px solid ${color}`;
38
- const label = document.createElement('div');
39
- overlay.appendChild(label);
40
- label.style.position = 'absolute';
41
- label.style.bottom = `100%`;
42
- label.style.left = `0`;
43
- label.style.backgroundColor = color;
44
- label.style.color = 'white';
45
- label.style.fontSize = '10px';
46
- label.style.fontFamily = 'monospace';
47
- label.style.fontWeight = 'normal';
48
- label.style.fontStyle = 'normal';
49
- label.style.opacity = '0.8';
50
- label.style.padding = '0 2px';
51
- label.style.transform = 'translateY(50%)';
52
- label.textContent = String(ref);
53
- }
54
- function getOverlayContainer() {
55
- let container = document.querySelector('#webvision-overlay');
56
- if (!container) {
57
- container = document.createElement('div');
58
- container[VX_IGNORE_SYMBOL] = true;
59
- container.id = 'webvision-overlay';
60
- container.style.position = 'fixed';
61
- container.style.top = '0';
62
- container.style.left = '0';
63
- container.style.bottom = '0';
64
- container.style.right = '0';
65
- container.style.zIndex = '2147483647'; // Maximum z-index value
66
- container.style.pointerEvents = 'none';
67
- document.body.appendChild(container);
68
- }
69
- return container;
70
- }
71
- function getColor(index) {
72
- const hue = (index * 120 * .382) % 360;
73
- return `hsl(${hue}, 85%, 50%)`;
74
- }
75
- //# sourceMappingURL=overlay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/page/overlay.ts"],"names":[],"mappings":"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"}
@@ -1,59 +0,0 @@
1
- export declare const VX_NODE_SYMBOL: unique symbol;
2
- export declare const VX_IGNORE_SYMBOL: unique symbol;
3
- export declare const VX_IGNORE_TAGS: string[];
4
- export declare const VX_LABEL_ATTRS: string[];
5
- export declare const VX_VALUE_ATTRS: string[];
6
- export declare const VX_SRC_ATTRS: string[];
7
- export declare const VX_TAG_PREFERENCE: string[];
8
- export type VxDomNode = Element | Text;
9
- export interface VxNode {
10
- ref: number;
11
- tagName?: string;
12
- children?: VxNode[];
13
- id?: string;
14
- classList?: string[];
15
- textContent?: string;
16
- hasVisibleArea?: boolean;
17
- isInteractive?: boolean;
18
- isOutsideViewport?: boolean;
19
- isProbeHit?: boolean;
20
- isKept?: boolean;
21
- srcAttrs?: Record<string, string>;
22
- labelAttrs?: Record<string, string>;
23
- valueAttrs?: Record<string, string>;
24
- }
25
- export interface VxTreeOptions {
26
- startRef?: number;
27
- skipImages?: boolean;
28
- viewportOnly?: boolean;
29
- probeViewport?: boolean;
30
- opaqueOverlays?: boolean;
31
- unnestDivs?: boolean;
32
- }
33
- export type VxTransform = (vxNode: VxNode) => VxNode;
34
- export declare class VxTreeParser {
35
- options: VxTreeOptions;
36
- private counter;
37
- private viewport;
38
- private refRange;
39
- private vxNodes;
40
- private probeElements;
41
- private domRefMap;
42
- constructor(options?: VxTreeOptions);
43
- private parseDocument;
44
- getNodes(): VxNode[];
45
- getRefRange(): [number, number];
46
- getDomMap(): Map<number, Node>;
47
- private parseNode;
48
- private parseElement;
49
- private makeNode;
50
- private pruneRecursive;
51
- private collapseSingleChild;
52
- private collapsePreferParent;
53
- private collapseMerge;
54
- private shouldOmit;
55
- private isProbeHit;
56
- private collectLabelAttrs;
57
- private collectValueAttrs;
58
- private collectSrcAttrs;
59
- }
@@ -1,249 +0,0 @@
1
- import { Counter } from './counter.js';
2
- import { fixZIndex, getViewportSize, hasVisibleArea, isInteractive, isRandomIdentifier, isRectInViewport, makeOverlaysOpaque, normalizeText, truncateAttrValue } from './dom.js';
3
- import { isHidden } from './dom.js';
4
- import { probeViewport } from './probe.js';
5
- import { isObjectEmpty } from './util.js';
6
- export const VX_NODE_SYMBOL = Symbol('vx:node');
7
- export const VX_IGNORE_SYMBOL = Symbol('vx:ignore');
8
- export const VX_IGNORE_TAGS = ['svg', 'script', 'noscript', 'style', 'link', 'meta'];
9
- export const VX_LABEL_ATTRS = ['title', 'alt', 'placeholder', 'aria-label'];
10
- export const VX_VALUE_ATTRS = ['value', 'checked', 'selected', 'disabled', 'readonly'];
11
- export const VX_SRC_ATTRS = ['src', 'href'];
12
- export const VX_TAG_PREFERENCE = [
13
- 'a', 'iframe', 'input', 'button', 'select', 'textarea', 'img', 'label',
14
- 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
15
- 'ul', 'ol', 'li', 'dl', 'dt', 'dd',
16
- 'section', 'article', 'main', 'header', 'footer', 'nav', 'aside',
17
- 'form', 'input', 'textarea', 'select', 'option', 'fieldset', 'legend',
18
- 'p', 'pre', 'code', 'blockquote', 'figure', 'figcaption',
19
- 'table', 'thead', 'tbody', 'tr', 'td', 'th',
20
- 'strong', 'em', 'sub', 'sup',
21
- ];
22
- const VX_KEEP_SELECTOR = 'a, button, input, textarea, select, label, iframe';
23
- export class VxTreeParser {
24
- constructor(options = {}) {
25
- this.options = options;
26
- this.probeElements = [];
27
- this.domRefMap = new Map();
28
- const { startRef = 0 } = options;
29
- this.viewport = getViewportSize();
30
- this.counter = new Counter(startRef);
31
- if (options.probeViewport) {
32
- this.probeElements = probeViewport(8);
33
- }
34
- const vxRoot = this.parseDocument();
35
- this.refRange = [startRef, this.counter.current()];
36
- this.vxNodes = this.pruneRecursive(vxRoot);
37
- }
38
- parseDocument() {
39
- return this.parseNode(document.documentElement, null);
40
- }
41
- getNodes() {
42
- return this.vxNodes;
43
- }
44
- getRefRange() {
45
- return this.refRange;
46
- }
47
- getDomMap() {
48
- return this.domRefMap;
49
- }
50
- parseNode(node, parent) {
51
- if (node[VX_IGNORE_SYMBOL]) {
52
- return null;
53
- }
54
- if (node instanceof Text) {
55
- // Single instances of Text nodes can only occur in "text"
56
- // (e.g. when regular text is interspersed with links and other elements)
57
- const textContent = normalizeText(node.textContent ?? '');
58
- if (textContent) {
59
- return this.makeNode(node, {
60
- textContent,
61
- hasVisibleArea: parent?.hasVisibleArea,
62
- isOutsideViewport: parent?.isOutsideViewport,
63
- isProbeHit: parent?.isProbeHit,
64
- });
65
- }
66
- return null;
67
- }
68
- if (node instanceof Element) {
69
- if (this.options.opaqueOverlays) {
70
- makeOverlaysOpaque(node);
71
- }
72
- fixZIndex(node);
73
- return this.parseElement(node);
74
- }
75
- return null;
76
- }
77
- parseElement(el) {
78
- if (VX_IGNORE_TAGS.includes(el.tagName.toLowerCase())) {
79
- return null;
80
- }
81
- if (isHidden(el)) {
82
- return null;
83
- }
84
- const rect = el.getBoundingClientRect();
85
- const id = el.getAttribute('id') ?? '';
86
- const vxNode = this.makeNode(el, {
87
- tagName: el.tagName.toLowerCase(),
88
- id: isRandomIdentifier(id) ? undefined : id,
89
- classList: Array.from(el.classList)
90
- .filter(cls => !isRandomIdentifier(cls))
91
- .slice(0, 4),
92
- labelAttrs: this.collectLabelAttrs(el),
93
- valueAttrs: this.collectValueAttrs(el),
94
- srcAttrs: this.collectSrcAttrs(el),
95
- hasVisibleArea: hasVisibleArea(el),
96
- isInteractive: isInteractive(el),
97
- isOutsideViewport: !isRectInViewport(rect, this.viewport),
98
- isProbeHit: this.isProbeHit(el),
99
- isKept: el.matches(VX_KEEP_SELECTOR),
100
- });
101
- const children = [...el.childNodes]
102
- .map(child => this.parseNode(child, vxNode))
103
- .filter(_ => _ != null);
104
- // Special case: if the only child is a text node, return a single node with the text content
105
- if (children.length === 1 && !children[0]?.tagName) {
106
- vxNode.textContent = normalizeText(children[0].textContent ?? '');
107
- }
108
- else {
109
- vxNode.children = children;
110
- }
111
- return vxNode;
112
- }
113
- makeNode(node, spec) {
114
- const ref = this.counter.next();
115
- const vxNode = {
116
- ...spec,
117
- ref,
118
- };
119
- this.domRefMap.set(ref, node);
120
- node[VX_NODE_SYMBOL] = vxNode;
121
- return vxNode;
122
- }
123
- pruneRecursive(vxNode) {
124
- if (!vxNode) {
125
- return [];
126
- }
127
- const children = vxNode.children ?? [];
128
- // Recursively prune children
129
- const newChildren = children.flatMap(child => this.pruneRecursive(child));
130
- // If the node itself is omitted, replace it with children
131
- if (this.shouldOmit(vxNode)) {
132
- return newChildren;
133
- }
134
- vxNode.children = newChildren;
135
- // Collapse single-child elements
136
- if (newChildren.length === 1) {
137
- const child = newChildren[0];
138
- return this.collapseSingleChild(vxNode, child);
139
- }
140
- return [vxNode];
141
- }
142
- collapseSingleChild(parent, child) {
143
- const preferParent = this.collapsePreferParent(parent, child);
144
- const merged = preferParent ?
145
- this.collapseMerge(parent, child) :
146
- this.collapseMerge(child, parent);
147
- return this.pruneRecursive({
148
- ...merged,
149
- children: child.children,
150
- textContent: child.textContent,
151
- });
152
- }
153
- collapsePreferParent(parent, child) {
154
- const parentRank = VX_TAG_PREFERENCE.indexOf(parent.tagName ?? '');
155
- const childRank = VX_TAG_PREFERENCE.indexOf(child.tagName ?? '');
156
- if (parentRank === -1 && childRank === -1) {
157
- const parentAttrCount = Object.keys({
158
- ...parent.labelAttrs,
159
- ...parent.valueAttrs,
160
- ...parent.srcAttrs,
161
- }).length;
162
- const childAttrCount = Object.keys({
163
- ...child.labelAttrs,
164
- ...child.valueAttrs,
165
- ...child.srcAttrs,
166
- }).length;
167
- return parentAttrCount > childAttrCount;
168
- }
169
- return parentRank !== -1 && (childRank === -1 || parentRank < childRank);
170
- }
171
- collapseMerge(a, b) {
172
- return {
173
- ...b,
174
- ...a,
175
- labelAttrs: { ...b.labelAttrs, ...a.labelAttrs },
176
- valueAttrs: { ...b.valueAttrs, ...a.valueAttrs },
177
- srcAttrs: { ...b.srcAttrs, ...a.srcAttrs },
178
- };
179
- }
180
- shouldOmit(vxNode) {
181
- const tagName = vxNode.tagName ?? '';
182
- if (!vxNode.hasVisibleArea) {
183
- return true;
184
- }
185
- if (this.options.viewportOnly && vxNode.isOutsideViewport) {
186
- return true;
187
- }
188
- if (this.options.probeViewport && !vxNode.isProbeHit) {
189
- return true;
190
- }
191
- if (this.options.skipImages && vxNode.tagName === 'img') {
192
- return true;
193
- }
194
- const hasText = !!vxNode.textContent;
195
- const hasChildren = (vxNode.children ?? []).length > 0;
196
- const hasAttrs = [vxNode.labelAttrs, vxNode.valueAttrs, vxNode.srcAttrs]
197
- .some(attrs => !isObjectEmpty(attrs ?? {}));
198
- if (this.options.unnestDivs) {
199
- const isDivOrSpan = ['div', 'span'].includes(tagName);
200
- if (isDivOrSpan && hasChildren && !hasAttrs) {
201
- return true;
202
- }
203
- }
204
- if (vxNode.isKept) {
205
- return false;
206
- }
207
- return !hasText && !hasAttrs && !hasChildren;
208
- }
209
- isProbeHit(el) {
210
- // TODO this is a bit brute-forcish, consider improving
211
- for (const probeEl of this.probeElements) {
212
- if (el.contains(probeEl) || probeEl.contains(el)) {
213
- return true;
214
- }
215
- }
216
- return false;
217
- }
218
- collectLabelAttrs(el) {
219
- const attrs = {};
220
- for (const attr of VX_LABEL_ATTRS) {
221
- const value = truncateAttrValue(el.getAttribute(attr) ?? '');
222
- if (value) {
223
- attrs[attr] = value;
224
- }
225
- }
226
- return attrs;
227
- }
228
- collectValueAttrs(el) {
229
- const attrs = {};
230
- for (const attr of VX_VALUE_ATTRS) {
231
- const value = el[attr] ?? '';
232
- if (value) {
233
- attrs[attr] = String(value);
234
- }
235
- }
236
- return attrs;
237
- }
238
- collectSrcAttrs(el) {
239
- const attrs = {};
240
- for (const attr of VX_SRC_ATTRS) {
241
- const value = truncateAttrValue(el[attr] ?? '');
242
- if (value) {
243
- attrs[attr] = value;
244
- }
245
- }
246
- return attrs;
247
- }
248
- }
249
- //# sourceMappingURL=parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/page/parser.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Scans the viewport by picking elements in regular intervals.
3
- */
4
- export declare function probeViewport(gridSize?: number): Element[];
5
- export declare function checkOccluded(element: Element, gridSize?: number): boolean;
package/out/page/probe.js DELETED
@@ -1,36 +0,0 @@
1
- import { getViewportSize } from './dom.js';
2
- /**
3
- * Scans the viewport by picking elements in regular intervals.
4
- */
5
- export function probeViewport(gridSize = 32) {
6
- const { width, height } = getViewportSize();
7
- const elements = [];
8
- for (let y = (gridSize / 2); y < height; y += gridSize) {
9
- for (let x = (gridSize / 2); x < width; x += gridSize) {
10
- const element = document.elementFromPoint(x, y);
11
- if (element && !elements.includes(element)) {
12
- elements.push(element);
13
- }
14
- }
15
- }
16
- return elements;
17
- }
18
- export function checkOccluded(element, gridSize = 8) {
19
- let total = 0;
20
- let hits = 0;
21
- const { top, left, width, height } = element.getBoundingClientRect();
22
- for (let x = left + (gridSize / 2); x < left + width; x += gridSize) {
23
- for (let y = top + (gridSize / 2); y < top + height; y += gridSize) {
24
- total++;
25
- const el = document.elementFromPoint(x, y);
26
- if (!el) {
27
- continue;
28
- }
29
- if (element.contains(el) || el.contains(element)) {
30
- hits++;
31
- }
32
- }
33
- }
34
- return (hits / total) < 0.5;
35
- }
36
- //# sourceMappingURL=probe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/page/probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,EAAE;IACvC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChD,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,QAAQ,GAAG,CAAC;IACxD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IACrE,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;YACjE,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACN,SAAS;YACb,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/C,IAAI,EAAE,CAAC;YACX,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AAChC,CAAC"}
@@ -1,13 +0,0 @@
1
- import { VxNode } from './parser.js';
2
- export interface VxRenderOptions {
3
- renderStyle?: 'html' | 'text';
4
- renderTagNames?: boolean;
5
- renderIds?: boolean;
6
- renderClassNames?: boolean;
7
- renderRefs?: boolean | 'all';
8
- renderLabelAttrs?: boolean;
9
- renderValueAttrs?: boolean;
10
- renderSrcAttrs?: boolean;
11
- whitelistRefs?: number[];
12
- }
13
- export declare function renderVxNode(scope: VxNode, options?: VxRenderOptions): string;
@@ -1,86 +0,0 @@
1
- import { truncateAttrValue } from './dom.js';
2
- import { traverseVxNode } from './traverse.js';
3
- import { isContainerNode } from './util.js';
4
- export function renderVxNode(scope, options = {}) {
5
- const buffer = [];
6
- const whitelistRefs = options.whitelistRefs ?? [];
7
- for (const { vxNode, depth } of traverseVxNode(scope)) {
8
- if (whitelistRefs.length > 0) {
9
- if (!whitelistRefs.includes(vxNode.ref)) {
10
- continue;
11
- }
12
- }
13
- const indent = ' '.repeat(depth);
14
- buffer.push(renderIndentedLine(indent, vxNode, options));
15
- }
16
- return buffer.join('\n');
17
- }
18
- function renderIndentedLine(indent, vxNode, options = {}) {
19
- if (!vxNode.tagName) {
20
- return [indent, vxNode.textContent].filter(Boolean).join('');
21
- }
22
- const tagLine = renderTagLine(vxNode, options);
23
- const htmlStyle = options.renderStyle === 'html';
24
- return [
25
- indent,
26
- tagLine,
27
- htmlStyle ? '' : ' ',
28
- vxNode.textContent ?? '',
29
- ].join('');
30
- }
31
- function renderTagLine(vxNode, options) {
32
- const htmlStyle = options.renderStyle === 'html';
33
- const components = [];
34
- if (options.renderTagNames && vxNode.tagName) {
35
- components.push(vxNode.tagName);
36
- }
37
- if (options.renderIds && vxNode.id) {
38
- if (htmlStyle) {
39
- components.push(`id="${vxNode.id}"`);
40
- }
41
- else {
42
- components.push(`#${vxNode.id}`);
43
- }
44
- }
45
- if (options.renderClassNames && vxNode.classList?.length) {
46
- if (htmlStyle) {
47
- components.push(`class="${vxNode.classList.join(' ')}"`);
48
- }
49
- else {
50
- components.push('.' + vxNode.classList.join('.'));
51
- }
52
- }
53
- if (options.renderRefs) {
54
- const isRenderRef = [
55
- options.renderRefs === 'all',
56
- options.renderRefs === true && !isContainerNode(vxNode),
57
- ].some(Boolean);
58
- if (isRenderRef) {
59
- components.push(`[@${vxNode.ref}]`);
60
- }
61
- }
62
- const attrs = [];
63
- if (options.renderLabelAttrs) {
64
- for (const [attr, value] of Object.entries(vxNode.labelAttrs ?? {})) {
65
- attrs.push(`${attr}="${truncateAttrValue(value)}"`);
66
- }
67
- }
68
- if (options.renderValueAttrs) {
69
- for (const [attr, value] of Object.entries(vxNode.valueAttrs ?? {})) {
70
- attrs.push(`${attr}="${truncateAttrValue(value)}"`);
71
- }
72
- }
73
- if (options.renderSrcAttrs) {
74
- for (const [attr, value] of Object.entries(vxNode.srcAttrs ?? {})) {
75
- attrs.push(`${attr}="${truncateAttrValue(value)}"`);
76
- }
77
- }
78
- if (htmlStyle) {
79
- components.push(...attrs);
80
- }
81
- else {
82
- components.push(...attrs.map(attr => `[${attr}]`));
83
- }
84
- return htmlStyle ? `<${components.join(' ')}>` : components.join('');
85
- }
86
- //# sourceMappingURL=render.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/page/render.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import { VxTreeOptions } from './parser.js';
2
- import { VxTreeView } from './tree.js';
3
- export declare const VX_DOM_SYMBOL: unique symbol;
4
- export declare const VX_TREE_SYMBOL: unique symbol;
5
- export declare function captureSnapshot(options?: VxTreeOptions): {
6
- nodes: import("./parser.js").VxNode[];
7
- refRange: [number, number];
8
- };
9
- export declare function getSnapshot(): VxTreeView;
10
- export declare function resolveDomNode(ref: number): Node | null;
@@ -1,31 +0,0 @@
1
- import { VxTreeParser } from './parser.js';
2
- import { VxTreeView } from './tree.js';
3
- export const VX_DOM_SYMBOL = Symbol('vx:dom');
4
- export const VX_TREE_SYMBOL = Symbol('vx:tree');
5
- export function captureSnapshot(options = {}) {
6
- const parser = new VxTreeParser(options);
7
- const vxNodes = parser.getNodes();
8
- const domMap = parser.getDomMap();
9
- const vxTree = new VxTreeView(vxNodes);
10
- globalThis[VX_DOM_SYMBOL] = domMap;
11
- globalThis[VX_TREE_SYMBOL] = vxTree;
12
- return {
13
- nodes: vxNodes,
14
- refRange: parser.getRefRange(),
15
- };
16
- }
17
- export function getSnapshot() {
18
- const vxTree = globalThis[VX_TREE_SYMBOL];
19
- if (!vxTree) {
20
- throw new Error('[VX] Snapshot not found');
21
- }
22
- return vxTree;
23
- }
24
- export function resolveDomNode(ref) {
25
- const domMap = globalThis[VX_DOM_SYMBOL];
26
- if (!domMap) {
27
- return null;
28
- }
29
- return domMap.get(ref) ?? null;
30
- }
31
- //# sourceMappingURL=snapshot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/page/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAEhD,MAAM,UAAU,eAAe,CAAC,UAAyB,EAAE;IACvD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,UAAkB,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;IAC3C,UAAkB,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IAC7C,OAAO;QACH,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE;KACjC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,WAAW;IACvB,MAAM,MAAM,GAAI,UAAkB,CAAC,cAAc,CAAe,CAAC;IACjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,MAAM,MAAM,GAAI,UAAkB,CAAC,aAAa,CAAsB,CAAC;IACvE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AACnC,CAAC"}
@@ -1,5 +0,0 @@
1
- import { VxNode } from './parser.js';
2
- export declare function traverseVxNode(vxNode: VxNode, depth?: number): IterableIterator<{
3
- vxNode: VxNode;
4
- depth: number;
5
- }>;
@@ -1,7 +0,0 @@
1
- export function* traverseVxNode(vxNode, depth = 0) {
2
- yield { vxNode, depth };
3
- for (const child of vxNode.children ?? []) {
4
- yield* traverseVxNode(child, depth + 1);
5
- }
6
- }
7
- //# sourceMappingURL=traverse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/page/traverse.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,CAAC,CAAC,cAAc,CAAC,MAAc,EAAE,KAAK,GAAG,CAAC;IACrD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACxB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACxC,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC"}
@@ -1,22 +0,0 @@
1
- import { VxNode } from './parser.js';
2
- import { VxRenderOptions } from './render.js';
3
- export interface VxHighlightOptions {
4
- highlight?: boolean;
5
- clearOverlay?: boolean;
6
- includeAll?: boolean;
7
- filterRefs?: number[];
8
- }
9
- export declare class VxTreeView {
10
- readonly nodes: VxNode[];
11
- private refMap;
12
- constructor(nodes: VxNode[]);
13
- traverse(): IterableIterator<{
14
- vxNode: VxNode;
15
- depth: number;
16
- }>;
17
- private buildRefMap;
18
- findNode(ref: number): VxNode | null;
19
- render(options?: VxRenderOptions): string;
20
- highlight(options?: VxHighlightOptions): number[];
21
- collectRefs(leafOnly?: boolean, filterRefs?: number[]): number[];
22
- }
package/out/page/tree.js DELETED
@@ -1,59 +0,0 @@
1
- import { clearOverlay, highlightEl } from './overlay.js';
2
- import { renderVxNode } from './render.js';
3
- import { resolveDomNode } from './snapshot.js';
4
- import { traverseVxNode } from './traverse.js';
5
- import { isContainerNode } from './util.js';
6
- export class VxTreeView {
7
- constructor(nodes) {
8
- this.nodes = nodes;
9
- this.refMap = new Map();
10
- this.buildRefMap(nodes);
11
- }
12
- *traverse() {
13
- for (const vxNode of this.nodes) {
14
- yield* traverseVxNode(vxNode, 0);
15
- }
16
- }
17
- buildRefMap(nodes) {
18
- for (const node of nodes) {
19
- this.refMap.set(node.ref, node);
20
- this.buildRefMap(node.children ?? []);
21
- }
22
- }
23
- findNode(ref) {
24
- return this.refMap.get(ref) ?? null;
25
- }
26
- render(options = {}) {
27
- return this.nodes.map(node => {
28
- return renderVxNode(node, options);
29
- }).join('\n');
30
- }
31
- highlight(options = {}) {
32
- if (options.clearOverlay) {
33
- clearOverlay();
34
- }
35
- const leafOnly = !options.includeAll;
36
- const refs = this.collectRefs(leafOnly, options.filterRefs);
37
- for (const ref of refs) {
38
- const el = resolveDomNode(ref);
39
- if (el instanceof Element) {
40
- highlightEl(el);
41
- }
42
- }
43
- return refs;
44
- }
45
- collectRefs(leafOnly = true, filterRefs) {
46
- const refs = [];
47
- for (const { vxNode } of this.traverse()) {
48
- if (leafOnly && isContainerNode(vxNode)) {
49
- continue;
50
- }
51
- if (filterRefs && !filterRefs.includes(vxNode.ref)) {
52
- continue;
53
- }
54
- refs.push(vxNode.ref);
55
- }
56
- return refs;
57
- }
58
- }
59
- //# sourceMappingURL=tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/page/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAS5C,MAAM,OAAO,UAAU;IAInB,YAAqB,KAAe;QAAf,UAAK,GAAL,KAAK,CAAU;QAF5B,WAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QAGvC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,CAAC,QAAQ;QACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,KAAe;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,UAA2B,EAAE;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACzB,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,UAA8B,EAAE;QACtC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,YAAY,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,EAAE,YAAY,OAAO,EAAE,CAAC;gBACxB,WAAW,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,QAAQ,GAAG,IAAI,EAAE,UAAqB;QAC9C,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACvC,IAAI,QAAQ,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,SAAS;YACb,CAAC;YACD,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,SAAS;YACb,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CAEJ"}
@@ -1,3 +0,0 @@
1
- import { VxNode } from './parser.js';
2
- export declare function isContainerNode(vxNode: VxNode): boolean;
3
- export declare function isObjectEmpty(obj: Record<string, any>): boolean;
package/out/page/util.js DELETED
@@ -1,9 +0,0 @@
1
- export function isContainerNode(vxNode) {
2
- const children = vxNode.children ?? [];
3
- const hasTextChildren = children.some(child => !child.tagName);
4
- return children.length > 0 && !hasTextChildren;
5
- }
6
- export function isObjectEmpty(obj) {
7
- return !Object.values(obj).some(value => !!value);
8
- }
9
- //# sourceMappingURL=util.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/page/util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/D,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAwB;IAClD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC"}