bippy 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/chunk-6TJRMCM3.js +1 -0
- package/dist/{extract/index.cjs → chunk-XBNRYX4A.js} +142 -474
- package/dist/{extract/index.js → chunk-XCDPKSJZ.cjs} +205 -468
- package/dist/chunk-YZYCWAB2.cjs +2 -0
- package/dist/core-DBUthQlD.d.cts +261 -0
- package/dist/core-DBUthQlD.d.ts +261 -0
- package/dist/core.cjs +229 -740
- package/dist/core.d.cts +3 -196
- package/dist/core.d.ts +3 -196
- package/dist/core.js +1 -687
- package/dist/index.cjs +250 -745
- package/dist/index.d.cts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.global.js +1 -1
- package/dist/index.js +2 -687
- package/dist/inspect.cjs +1560 -0
- package/dist/inspect.d.cts +10 -0
- package/dist/inspect.d.ts +10 -0
- package/dist/inspect.js +1551 -0
- package/package.json +19 -2
- package/dist/extract/index.d.cts +0 -42
- package/dist/extract/index.d.ts +0 -42
- package/dist/extract/index.global.js +0 -9
- package/dist/scan/index.cjs +0 -1079
- package/dist/scan/index.d.cts +0 -24
- package/dist/scan/index.d.ts +0 -24
- package/dist/scan/index.global.js +0 -9
- package/dist/scan/index.js +0 -1071
- package/dist/types-BqcvCznx.d.cts +0 -69
- package/dist/types-BqcvCznx.d.ts +0 -69
package/README.md
CHANGED
|
@@ -28,6 +28,14 @@ onCommitFiberRoot((root) => {
|
|
|
28
28
|
});
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
or, use the `/inspect` subpackage to graphically visualize the fiber tree:
|
|
32
|
+
|
|
33
|
+
```jsx
|
|
34
|
+
import { Inspector } from 'bippy/inspect';
|
|
35
|
+
|
|
36
|
+
<Inspector enabled={true} />
|
|
37
|
+
```
|
|
38
|
+
|
|
31
39
|
<table>
|
|
32
40
|
<tbody>
|
|
33
41
|
<tr>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* @license bippy
|
|
5
3
|
*
|
|
@@ -10,7 +8,7 @@
|
|
|
10
8
|
*/
|
|
11
9
|
|
|
12
10
|
// src/rdt-hook.ts
|
|
13
|
-
var version = "0.2.
|
|
11
|
+
var version = "0.2.2";
|
|
14
12
|
var BIPPY_INSTRUMENTATION_STRING = `bippy-${version}`;
|
|
15
13
|
var NO_OP = () => {
|
|
16
14
|
};
|
|
@@ -99,9 +97,26 @@ var LegacyHiddenComponentTag = 23;
|
|
|
99
97
|
var HostHoistableTag = 26;
|
|
100
98
|
var HostSingletonTag = 27;
|
|
101
99
|
var CONCURRENT_MODE_NUMBER = 60111;
|
|
100
|
+
var ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.element)";
|
|
101
|
+
var TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.transitional.element)";
|
|
102
102
|
var CONCURRENT_MODE_SYMBOL_STRING = "Symbol(react.concurrent_mode)";
|
|
103
103
|
var DEPRECATED_ASYNC_MODE_SYMBOL_STRING = "Symbol(react.async_mode)";
|
|
104
104
|
var PerformedWork = 1;
|
|
105
|
+
var Placement = 2;
|
|
106
|
+
var Hydrating = 4096;
|
|
107
|
+
var Update = 4;
|
|
108
|
+
var Cloned = 8;
|
|
109
|
+
var ChildDeletion = 16;
|
|
110
|
+
var ContentReset = 32;
|
|
111
|
+
var Snapshot = 1024;
|
|
112
|
+
var Visibility = 8192;
|
|
113
|
+
var MutationMask = Placement | Update | ChildDeletion | ContentReset | Hydrating | Visibility | Snapshot;
|
|
114
|
+
var isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && // react 18 uses Symbol.for('react.element'), react 19 uses Symbol.for('react.transitional.element')
|
|
115
|
+
[
|
|
116
|
+
ELEMENT_TYPE_SYMBOL_STRING,
|
|
117
|
+
TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING
|
|
118
|
+
].includes(String(element.$$typeof));
|
|
119
|
+
var isValidFiber = (fiber) => typeof fiber === "object" && fiber != null && "tag" in fiber && "stateNode" in fiber && "return" in fiber && "child" in fiber && "sibling" in fiber && "flags" in fiber;
|
|
105
120
|
var isHostFiber = (fiber) => {
|
|
106
121
|
switch (fiber.tag) {
|
|
107
122
|
case HostComponentTag:
|
|
@@ -126,6 +141,60 @@ var isCompositeFiber = (fiber) => {
|
|
|
126
141
|
return false;
|
|
127
142
|
}
|
|
128
143
|
};
|
|
144
|
+
var traverseContexts = (fiber, selector) => {
|
|
145
|
+
try {
|
|
146
|
+
const nextDependencies = fiber.dependencies;
|
|
147
|
+
const prevDependencies = fiber.alternate?.dependencies;
|
|
148
|
+
if (!nextDependencies || !prevDependencies) return false;
|
|
149
|
+
if (typeof nextDependencies !== "object" || !("firstContext" in nextDependencies) || typeof prevDependencies !== "object" || !("firstContext" in prevDependencies)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
let nextContext = nextDependencies.firstContext;
|
|
153
|
+
let prevContext = prevDependencies.firstContext;
|
|
154
|
+
while (nextContext && typeof nextContext === "object" && "memoizedValue" in nextContext || prevContext && typeof prevContext === "object" && "memoizedValue" in prevContext) {
|
|
155
|
+
if (selector(nextContext, prevContext) === true) return true;
|
|
156
|
+
nextContext = nextContext?.next;
|
|
157
|
+
prevContext = prevContext?.next;
|
|
158
|
+
}
|
|
159
|
+
} catch {
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
};
|
|
163
|
+
var traverseState = (fiber, selector) => {
|
|
164
|
+
try {
|
|
165
|
+
let nextState = fiber.memoizedState;
|
|
166
|
+
let prevState = fiber.alternate?.memoizedState;
|
|
167
|
+
while (nextState || prevState) {
|
|
168
|
+
if (selector(nextState, prevState) === true) return true;
|
|
169
|
+
nextState = nextState?.next;
|
|
170
|
+
prevState = prevState?.next;
|
|
171
|
+
}
|
|
172
|
+
} catch {
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
};
|
|
176
|
+
var traverseEffects = (fiber, selector) => {
|
|
177
|
+
try {
|
|
178
|
+
let nextState = (
|
|
179
|
+
// biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
|
|
180
|
+
fiber.updateQueue?.lastEffect
|
|
181
|
+
);
|
|
182
|
+
let prevState = (
|
|
183
|
+
// biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
|
|
184
|
+
fiber.alternate?.updateQueue?.lastEffect
|
|
185
|
+
);
|
|
186
|
+
while (nextState || prevState) {
|
|
187
|
+
if (selector(nextState, prevState) === true) return true;
|
|
188
|
+
if (nextState?.next === nextState || prevState?.next === prevState) {
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
nextState = nextState?.next;
|
|
192
|
+
prevState = prevState?.next;
|
|
193
|
+
}
|
|
194
|
+
} catch {
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
};
|
|
129
198
|
var traverseProps = (fiber, selector) => {
|
|
130
199
|
try {
|
|
131
200
|
const nextProps = fiber.memoizedProps;
|
|
@@ -161,6 +230,25 @@ var didFiberRender = (fiber) => {
|
|
|
161
230
|
return prevProps !== nextProps || fiber.alternate.memoizedState !== fiber.memoizedState || fiber.alternate.ref !== fiber.ref;
|
|
162
231
|
}
|
|
163
232
|
};
|
|
233
|
+
var didFiberCommit = (fiber) => {
|
|
234
|
+
return Boolean(
|
|
235
|
+
(fiber.flags & (MutationMask | Cloned)) !== 0 || (fiber.subtreeFlags & (MutationMask | Cloned)) !== 0
|
|
236
|
+
);
|
|
237
|
+
};
|
|
238
|
+
var getMutatedHostFibers = (fiber) => {
|
|
239
|
+
const mutations = [];
|
|
240
|
+
const stack = [fiber];
|
|
241
|
+
while (stack.length) {
|
|
242
|
+
const node = stack.pop();
|
|
243
|
+
if (!node) continue;
|
|
244
|
+
if (isHostFiber(node) && didFiberCommit(node) && didFiberRender(node)) {
|
|
245
|
+
mutations.push(node);
|
|
246
|
+
}
|
|
247
|
+
if (node.child) stack.push(node.child);
|
|
248
|
+
if (node.sibling) stack.push(node.sibling);
|
|
249
|
+
}
|
|
250
|
+
return mutations;
|
|
251
|
+
};
|
|
164
252
|
var getFiberStack = (fiber) => {
|
|
165
253
|
const stack = [];
|
|
166
254
|
let currentFiber = fiber;
|
|
@@ -206,6 +294,28 @@ var getNearestHostFiber = (fiber, ascending = false) => {
|
|
|
206
294
|
}
|
|
207
295
|
return hostFiber;
|
|
208
296
|
};
|
|
297
|
+
var getNearestHostFibers = (fiber) => {
|
|
298
|
+
const hostFibers = [];
|
|
299
|
+
const stack = [];
|
|
300
|
+
if (isHostFiber(fiber)) {
|
|
301
|
+
hostFibers.push(fiber);
|
|
302
|
+
} else if (fiber.child) {
|
|
303
|
+
stack.push(fiber.child);
|
|
304
|
+
}
|
|
305
|
+
while (stack.length) {
|
|
306
|
+
const currentNode = stack.pop();
|
|
307
|
+
if (!currentNode) break;
|
|
308
|
+
if (isHostFiber(currentNode)) {
|
|
309
|
+
hostFibers.push(currentNode);
|
|
310
|
+
} else if (currentNode.child) {
|
|
311
|
+
stack.push(currentNode.child);
|
|
312
|
+
}
|
|
313
|
+
if (currentNode.sibling) {
|
|
314
|
+
stack.push(currentNode.sibling);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return hostFibers;
|
|
318
|
+
};
|
|
209
319
|
var traverseFiber = (fiber, selector, ascending = false) => {
|
|
210
320
|
if (!fiber) return null;
|
|
211
321
|
if (selector(fiber) === true) return fiber;
|
|
@@ -217,6 +327,21 @@ var traverseFiber = (fiber, selector, ascending = false) => {
|
|
|
217
327
|
}
|
|
218
328
|
return null;
|
|
219
329
|
};
|
|
330
|
+
var getTimings = (fiber) => {
|
|
331
|
+
const totalTime = fiber?.actualDuration ?? 0;
|
|
332
|
+
let selfTime = totalTime;
|
|
333
|
+
let child = fiber?.child ?? null;
|
|
334
|
+
while (totalTime > 0 && child != null) {
|
|
335
|
+
selfTime -= child.actualDuration ?? 0;
|
|
336
|
+
child = child.sibling;
|
|
337
|
+
}
|
|
338
|
+
return { selfTime, totalTime };
|
|
339
|
+
};
|
|
340
|
+
var hasMemoCache = (fiber) => {
|
|
341
|
+
return Boolean(
|
|
342
|
+
fiber.updateQueue?.memoCache
|
|
343
|
+
);
|
|
344
|
+
};
|
|
220
345
|
var getType = (type) => {
|
|
221
346
|
const currentType = type;
|
|
222
347
|
if (typeof currentType === "function") {
|
|
@@ -241,7 +366,7 @@ var getDisplayName = (type) => {
|
|
|
241
366
|
return unwrappedType.displayName || unwrappedType.name || null;
|
|
242
367
|
};
|
|
243
368
|
var isUsingRDT = () => {
|
|
244
|
-
return "
|
|
369
|
+
return "getFiberRoots" in getRDTHook();
|
|
245
370
|
};
|
|
246
371
|
var detectReactBuildType = (renderer) => {
|
|
247
372
|
try {
|
|
@@ -252,6 +377,10 @@ var detectReactBuildType = (renderer) => {
|
|
|
252
377
|
}
|
|
253
378
|
return "production";
|
|
254
379
|
};
|
|
380
|
+
var isInstrumentationActive = () => {
|
|
381
|
+
const rdtHook = getRDTHook();
|
|
382
|
+
return Boolean(rdtHook._instrumentationIsActive) || isUsingRDT();
|
|
383
|
+
};
|
|
255
384
|
var fiberId = 0;
|
|
256
385
|
var fiberIdMap = /* @__PURE__ */ new WeakMap();
|
|
257
386
|
var setFiberId = (fiber, id = fiberId++) => {
|
|
@@ -501,11 +630,11 @@ var secure = (options, secureOptions = {}) => {
|
|
|
501
630
|
return;
|
|
502
631
|
}
|
|
503
632
|
try {
|
|
504
|
-
const
|
|
505
|
-
if (
|
|
633
|
+
const onCommitFiberRoot2 = options.onCommitFiberRoot;
|
|
634
|
+
if (onCommitFiberRoot2) {
|
|
506
635
|
options.onCommitFiberRoot = (rendererID, root, priority) => {
|
|
507
636
|
try {
|
|
508
|
-
|
|
637
|
+
onCommitFiberRoot2(rendererID, root, priority);
|
|
509
638
|
} catch (err) {
|
|
510
639
|
secureOptions.onError?.(err);
|
|
511
640
|
}
|
|
@@ -545,475 +674,14 @@ var secure = (options, secureOptions = {}) => {
|
|
|
545
674
|
}
|
|
546
675
|
return options;
|
|
547
676
|
};
|
|
548
|
-
|
|
549
|
-
// src/extract/index.ts
|
|
550
|
-
var ReactSpecNodeType = /* @__PURE__ */ ((ReactSpecNodeType2) => {
|
|
551
|
-
ReactSpecNodeType2["Component"] = "component";
|
|
552
|
-
ReactSpecNodeType2["Element"] = "element";
|
|
553
|
-
ReactSpecNodeType2["A11y"] = "a11y";
|
|
554
|
-
return ReactSpecNodeType2;
|
|
555
|
-
})(ReactSpecNodeType || {});
|
|
556
|
-
var fiberRoots = /* @__PURE__ */ new Set();
|
|
557
|
-
var getDpr = () => {
|
|
558
|
-
return Math.min(window.devicePixelRatio || 1, 2);
|
|
559
|
-
};
|
|
560
|
-
var CANVAS_HTML_STR = `<canvas style="position:fixed;top:0;left:0;pointer-events:none;z-index:2147483646" aria-hidden="true"></canvas>`;
|
|
561
|
-
var primaryColor = "115,97,230";
|
|
562
|
-
var lerp = (start, end) => {
|
|
563
|
-
return Math.floor(start + (end - start) * 0.2);
|
|
564
|
-
};
|
|
565
|
-
var init = () => {
|
|
566
|
-
let hasInitedIds = false;
|
|
567
|
-
let prevX;
|
|
568
|
-
let prevY;
|
|
569
|
-
let isAnimating = false;
|
|
570
|
-
const handleFiber = (fiber) => {
|
|
571
|
-
getFiberId(fiber);
|
|
572
|
-
};
|
|
573
|
-
const visit = createFiberVisitor({
|
|
574
|
-
onRender: handleFiber,
|
|
575
|
-
onError(error) {
|
|
576
|
-
console.error(error);
|
|
577
|
-
}
|
|
578
|
-
});
|
|
677
|
+
var onCommitFiberRoot = (handler) => {
|
|
579
678
|
instrument(
|
|
580
|
-
secure(
|
|
581
|
-
{
|
|
582
|
-
|
|
583
|
-
globalThis.__RST__ = true;
|
|
584
|
-
},
|
|
585
|
-
onCommitFiberRoot(rendererID, root) {
|
|
586
|
-
fiberRoots.add(root);
|
|
587
|
-
if (!hasInitedIds) {
|
|
588
|
-
traverseFiber(root, handleFiber);
|
|
589
|
-
hasInitedIds = true;
|
|
590
|
-
return;
|
|
591
|
-
}
|
|
592
|
-
visit(rendererID, root);
|
|
593
|
-
}
|
|
594
|
-
},
|
|
595
|
-
{
|
|
596
|
-
dangerouslyRunInProduction: true,
|
|
597
|
-
onError: (error) => {
|
|
598
|
-
if (error) {
|
|
599
|
-
console.error(error);
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
)
|
|
604
|
-
);
|
|
605
|
-
let focusedElement = null;
|
|
606
|
-
let focusedFiber = null;
|
|
607
|
-
let text = null;
|
|
608
|
-
const draw = async () => {
|
|
609
|
-
if (!ctx) return;
|
|
610
|
-
const currentElement = focusedElement;
|
|
611
|
-
if (!currentElement) {
|
|
612
|
-
clear();
|
|
613
|
-
return false;
|
|
614
|
-
}
|
|
615
|
-
const elements = [currentElement];
|
|
616
|
-
if (focusedFiber) {
|
|
617
|
-
traverseFiber(focusedFiber, (fiber) => {
|
|
618
|
-
if (isHostFiber(fiber)) {
|
|
619
|
-
elements.push(fiber.stateNode);
|
|
620
|
-
}
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
const rectMap = await getRectMap(elements);
|
|
624
|
-
const currentRect = rectMap.get(currentElement);
|
|
625
|
-
if (!currentRect) return false;
|
|
626
|
-
clear();
|
|
627
|
-
let shouldContinueAnimating = false;
|
|
628
|
-
const interpolatedX = prevX !== void 0 ? lerp(prevX, currentRect.x) : currentRect.x;
|
|
629
|
-
const interpolatedY = prevY !== void 0 ? lerp(prevY, currentRect.y) : currentRect.y;
|
|
630
|
-
if (prevX !== void 0 && (Math.abs(interpolatedX - currentRect.x) > 0.1 || Math.abs(interpolatedY - currentRect.y) > 0.1)) {
|
|
631
|
-
shouldContinueAnimating = true;
|
|
632
|
-
}
|
|
633
|
-
for (const element of elements) {
|
|
634
|
-
const rect = rectMap.get(element);
|
|
635
|
-
if (!rect) continue;
|
|
636
|
-
const { width: width2, height: height2 } = rect;
|
|
637
|
-
const x = element === currentElement ? interpolatedX : rect.x;
|
|
638
|
-
const y = element === currentElement ? interpolatedY : rect.y;
|
|
639
|
-
ctx.beginPath();
|
|
640
|
-
ctx.rect(x, y, width2, height2);
|
|
641
|
-
ctx.strokeStyle = `rgba(${primaryColor},0.5)`;
|
|
642
|
-
if (currentElement === element) {
|
|
643
|
-
ctx.fillStyle = `rgba(${primaryColor},0.1)`;
|
|
644
|
-
ctx.strokeStyle = `rgba(${primaryColor})`;
|
|
645
|
-
ctx.fill();
|
|
646
|
-
}
|
|
647
|
-
ctx.stroke();
|
|
648
|
-
}
|
|
649
|
-
if (text) {
|
|
650
|
-
const { width: textWidth } = ctx.measureText(text);
|
|
651
|
-
const textHeight = 11;
|
|
652
|
-
ctx.textRendering = "optimizeSpeed";
|
|
653
|
-
ctx.font = "11px monospace";
|
|
654
|
-
let labelY = interpolatedY - textHeight - 4;
|
|
655
|
-
if (labelY < 0) {
|
|
656
|
-
labelY = 0;
|
|
657
|
-
}
|
|
658
|
-
ctx.fillStyle = `rgba(${primaryColor})`;
|
|
659
|
-
ctx.fillRect(interpolatedX, labelY, textWidth + 4, textHeight + 4);
|
|
660
|
-
ctx.fillStyle = "rgba(255,255,255)";
|
|
661
|
-
ctx.fillText(text, interpolatedX + 2, labelY + textHeight);
|
|
662
|
-
prevX = interpolatedX;
|
|
663
|
-
prevY = interpolatedY;
|
|
664
|
-
}
|
|
665
|
-
return shouldContinueAnimating;
|
|
666
|
-
};
|
|
667
|
-
const animate = async () => {
|
|
668
|
-
if (!isAnimating) return;
|
|
669
|
-
const shouldContinue = await draw();
|
|
670
|
-
if (shouldContinue) {
|
|
671
|
-
requestAnimationFrame(animate);
|
|
672
|
-
} else {
|
|
673
|
-
isAnimating = false;
|
|
674
|
-
}
|
|
675
|
-
};
|
|
676
|
-
const startAnimation = () => {
|
|
677
|
-
if (!isAnimating) {
|
|
678
|
-
isAnimating = true;
|
|
679
|
-
requestAnimationFrame(animate);
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
document.addEventListener("contextmenu", async (event) => {
|
|
683
|
-
if (event.button !== 2) return;
|
|
684
|
-
const target = event.target;
|
|
685
|
-
const fiber = getFiberFromHostInstance(event.target);
|
|
686
|
-
focusedElement = target;
|
|
687
|
-
if (fiber) {
|
|
688
|
-
focusedFiber = fiber;
|
|
689
|
-
const stack = getFiberStack(fiber);
|
|
690
|
-
const displayNames = stack.map((fiber2) => getDisplayName(fiber2));
|
|
691
|
-
const orderedDisplayNames = [];
|
|
692
|
-
let count = 0;
|
|
693
|
-
let nearestCompositeFiber = null;
|
|
694
|
-
let currentFiber = fiber;
|
|
695
|
-
while (currentFiber) {
|
|
696
|
-
if (isCompositeFiber(currentFiber)) {
|
|
697
|
-
nearestCompositeFiber = currentFiber;
|
|
698
|
-
break;
|
|
699
|
-
}
|
|
700
|
-
currentFiber = currentFiber.return;
|
|
701
|
-
}
|
|
702
|
-
for (let i = displayNames.length - 1; i >= 0; i--) {
|
|
703
|
-
const displayName = displayNames[i];
|
|
704
|
-
if (displayName) {
|
|
705
|
-
orderedDisplayNames.push(displayName);
|
|
706
|
-
count++;
|
|
707
|
-
}
|
|
708
|
-
if (count > 2) break;
|
|
679
|
+
secure({
|
|
680
|
+
onCommitFiberRoot: (_, root) => {
|
|
681
|
+
handler(root);
|
|
709
682
|
}
|
|
710
|
-
|
|
711
|
-
const rst = await createRSTWithFiber(
|
|
712
|
-
nearestCompositeFiber || fiber,
|
|
713
|
-
target
|
|
714
|
-
);
|
|
715
|
-
console.log(rst);
|
|
716
|
-
} else {
|
|
717
|
-
focusedFiber = null;
|
|
718
|
-
text = target.tagName.toLowerCase();
|
|
719
|
-
const rst = await createRSTWithElement(target);
|
|
720
|
-
console.log(rst);
|
|
721
|
-
}
|
|
722
|
-
startAnimation();
|
|
723
|
-
});
|
|
724
|
-
const clear = () => {
|
|
725
|
-
if (!ctx) return;
|
|
726
|
-
ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr);
|
|
727
|
-
};
|
|
728
|
-
const host = document.createElement("div");
|
|
729
|
-
host.setAttribute("data-react-scan", "true");
|
|
730
|
-
const shadowRoot = host.attachShadow({ mode: "open" });
|
|
731
|
-
shadowRoot.innerHTML = CANVAS_HTML_STR;
|
|
732
|
-
const canvas = shadowRoot.firstChild;
|
|
733
|
-
if (!canvas) return null;
|
|
734
|
-
let dpr = Math.min(window.devicePixelRatio || 1, 2);
|
|
735
|
-
const { innerWidth, innerHeight } = window;
|
|
736
|
-
canvas.style.width = `${innerWidth}px`;
|
|
737
|
-
canvas.style.height = `${innerHeight}px`;
|
|
738
|
-
const width = innerWidth * dpr;
|
|
739
|
-
const height = innerHeight * dpr;
|
|
740
|
-
canvas.width = width;
|
|
741
|
-
canvas.height = height;
|
|
742
|
-
const ctx = canvas.getContext("2d", { alpha: true });
|
|
743
|
-
if (ctx) {
|
|
744
|
-
ctx.scale(dpr, dpr);
|
|
745
|
-
}
|
|
746
|
-
let isResizeScheduled = false;
|
|
747
|
-
window.addEventListener("resize", () => {
|
|
748
|
-
if (!isResizeScheduled) {
|
|
749
|
-
isResizeScheduled = true;
|
|
750
|
-
setTimeout(() => {
|
|
751
|
-
const width2 = window.innerWidth;
|
|
752
|
-
const height2 = window.innerHeight;
|
|
753
|
-
dpr = getDpr();
|
|
754
|
-
canvas.style.width = `${width2}px`;
|
|
755
|
-
canvas.style.height = `${height2}px`;
|
|
756
|
-
canvas.width = width2 * dpr;
|
|
757
|
-
canvas.height = height2 * dpr;
|
|
758
|
-
if (ctx) {
|
|
759
|
-
ctx.resetTransform();
|
|
760
|
-
ctx.scale(dpr, dpr);
|
|
761
|
-
}
|
|
762
|
-
startAnimation();
|
|
763
|
-
isResizeScheduled = false;
|
|
764
|
-
});
|
|
765
|
-
}
|
|
766
|
-
});
|
|
767
|
-
let isScrollScheduled = false;
|
|
768
|
-
window.addEventListener("scroll", () => {
|
|
769
|
-
if (!isScrollScheduled) {
|
|
770
|
-
isScrollScheduled = true;
|
|
771
|
-
setTimeout(() => {
|
|
772
|
-
requestAnimationFrame(() => {
|
|
773
|
-
startAnimation();
|
|
774
|
-
});
|
|
775
|
-
isScrollScheduled = false;
|
|
776
|
-
}, 16 * 2);
|
|
777
|
-
}
|
|
778
|
-
});
|
|
779
|
-
let prevFocusedElement = null;
|
|
780
|
-
setInterval(() => {
|
|
781
|
-
if (prevFocusedElement === focusedElement) {
|
|
782
|
-
return;
|
|
783
|
-
}
|
|
784
|
-
prevFocusedElement = focusedElement;
|
|
785
|
-
startAnimation();
|
|
786
|
-
}, 16 * 2);
|
|
787
|
-
shadowRoot.appendChild(canvas);
|
|
788
|
-
document.documentElement.appendChild(host);
|
|
789
|
-
};
|
|
790
|
-
init();
|
|
791
|
-
var createRSTWithFiber = async (fiber, element) => {
|
|
792
|
-
const root = await createRSTNode(fiber, element);
|
|
793
|
-
return { root };
|
|
794
|
-
};
|
|
795
|
-
var createRSTWithElement = async (element) => {
|
|
796
|
-
const root = await createRSTNodeFromElement(element);
|
|
797
|
-
return { root };
|
|
798
|
-
};
|
|
799
|
-
var createElementNode = async (element) => {
|
|
800
|
-
const rectMap = await getRectMap([element]);
|
|
801
|
-
const rect = rectMap.get(element) || element.getBoundingClientRect();
|
|
802
|
-
const computedStyle = window.getComputedStyle(element);
|
|
803
|
-
const styles = {};
|
|
804
|
-
Array.from({ length: computedStyle.length }).forEach((_, i) => {
|
|
805
|
-
const prop = computedStyle[i];
|
|
806
|
-
styles[prop] = computedStyle.getPropertyValue(prop);
|
|
807
|
-
});
|
|
808
|
-
return {
|
|
809
|
-
type: "element" /* Element */,
|
|
810
|
-
children: [],
|
|
811
|
-
x: rect.x,
|
|
812
|
-
y: rect.y,
|
|
813
|
-
width: rect.width,
|
|
814
|
-
height: rect.height,
|
|
815
|
-
eventHandlers: {},
|
|
816
|
-
classes: Array.from(element.classList),
|
|
817
|
-
styles,
|
|
818
|
-
element
|
|
819
|
-
};
|
|
820
|
-
};
|
|
821
|
-
var createA11yNode = (base, role, ariaLabel) => {
|
|
822
|
-
return {
|
|
823
|
-
...base,
|
|
824
|
-
type: "a11y" /* A11y */,
|
|
825
|
-
role,
|
|
826
|
-
ariaLabel
|
|
827
|
-
};
|
|
828
|
-
};
|
|
829
|
-
var createRSTNodeFromElement = async (element) => {
|
|
830
|
-
const base = await createElementNode(element);
|
|
831
|
-
for (const attr of Array.from(element.attributes)) {
|
|
832
|
-
if (attr.name.startsWith("on")) {
|
|
833
|
-
base.eventHandlers[attr.name] = attr.value;
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
base.children = await Promise.all(
|
|
837
|
-
Array.from(element.children).map(createRSTNodeFromElement)
|
|
683
|
+
})
|
|
838
684
|
);
|
|
839
|
-
const role = element.getAttribute("role");
|
|
840
|
-
const ariaLabel = element.getAttribute("aria-label");
|
|
841
|
-
if (role || ariaLabel) {
|
|
842
|
-
return createA11yNode(base, role, ariaLabel);
|
|
843
|
-
}
|
|
844
|
-
return base;
|
|
845
|
-
};
|
|
846
|
-
var createRSTNode = async (fiber, element) => {
|
|
847
|
-
if (isCompositeFiber(fiber)) {
|
|
848
|
-
const props = {};
|
|
849
|
-
traverseProps(fiber, (propName, nextValue) => {
|
|
850
|
-
props[propName] = nextValue;
|
|
851
|
-
});
|
|
852
|
-
const children = [];
|
|
853
|
-
const childPromises = [];
|
|
854
|
-
traverseFiber(fiber.child, (childFiber) => {
|
|
855
|
-
if (isHostFiber(childFiber) && childFiber.stateNode) {
|
|
856
|
-
childPromises.push(
|
|
857
|
-
createRSTNode(childFiber, childFiber.stateNode).then((node) => {
|
|
858
|
-
children.push(node);
|
|
859
|
-
})
|
|
860
|
-
);
|
|
861
|
-
} else if (isCompositeFiber(childFiber)) {
|
|
862
|
-
const hostFiber = getNearestHostFiber(childFiber);
|
|
863
|
-
if (hostFiber?.stateNode) {
|
|
864
|
-
childPromises.push(
|
|
865
|
-
createRSTNode(childFiber, hostFiber.stateNode).then((node) => {
|
|
866
|
-
children.push(node);
|
|
867
|
-
})
|
|
868
|
-
);
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
});
|
|
872
|
-
await Promise.all(childPromises);
|
|
873
|
-
return {
|
|
874
|
-
type: "component" /* Component */,
|
|
875
|
-
children,
|
|
876
|
-
props,
|
|
877
|
-
name: getDisplayName(fiber.type)
|
|
878
|
-
};
|
|
879
|
-
}
|
|
880
|
-
if (isHostFiber(fiber)) {
|
|
881
|
-
const base = await createElementNode(element);
|
|
882
|
-
traverseProps(fiber, (propName, value) => {
|
|
883
|
-
if (propName.startsWith("on") && typeof value === "function") {
|
|
884
|
-
base.eventHandlers[propName] = value.toString();
|
|
885
|
-
}
|
|
886
|
-
});
|
|
887
|
-
base.children = [];
|
|
888
|
-
const childPromises = [];
|
|
889
|
-
traverseFiber(fiber.child, (childFiber) => {
|
|
890
|
-
if (isHostFiber(childFiber) && childFiber.stateNode) {
|
|
891
|
-
childPromises.push(
|
|
892
|
-
createRSTNode(childFiber, childFiber.stateNode).then((node) => {
|
|
893
|
-
base.children.push(node);
|
|
894
|
-
})
|
|
895
|
-
);
|
|
896
|
-
} else if (isCompositeFiber(childFiber)) {
|
|
897
|
-
const hostFiber = getNearestHostFiber(childFiber);
|
|
898
|
-
if (hostFiber?.stateNode) {
|
|
899
|
-
childPromises.push(
|
|
900
|
-
createRSTNode(childFiber, hostFiber.stateNode).then((node) => {
|
|
901
|
-
base.children.push(node);
|
|
902
|
-
})
|
|
903
|
-
);
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
});
|
|
907
|
-
await Promise.all(childPromises);
|
|
908
|
-
const role = element.getAttribute("role");
|
|
909
|
-
const ariaLabel = element.getAttribute("aria-label");
|
|
910
|
-
if (role || ariaLabel) {
|
|
911
|
-
return createA11yNode(base, role, ariaLabel);
|
|
912
|
-
}
|
|
913
|
-
return base;
|
|
914
|
-
}
|
|
915
|
-
throw new Error("Unknown fiber type");
|
|
916
|
-
};
|
|
917
|
-
var getRectMap = (elements) => {
|
|
918
|
-
return new Promise((resolve) => {
|
|
919
|
-
const rects = /* @__PURE__ */ new Map();
|
|
920
|
-
const observer = new IntersectionObserver((entries) => {
|
|
921
|
-
for (let i = 0, len = entries.length; i < len; i++) {
|
|
922
|
-
const entry = entries[i];
|
|
923
|
-
const element = entry.target;
|
|
924
|
-
const rect = entry.boundingClientRect;
|
|
925
|
-
if (entry.isIntersecting && rect.width && rect.height) {
|
|
926
|
-
rects.set(element, rect);
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
observer.disconnect();
|
|
930
|
-
resolve(rects);
|
|
931
|
-
});
|
|
932
|
-
for (let i = 0, len = elements.length; i < len; i++) {
|
|
933
|
-
const element = elements[i];
|
|
934
|
-
observer.observe(element);
|
|
935
|
-
}
|
|
936
|
-
});
|
|
937
|
-
};
|
|
938
|
-
var stringifyWithCircularCheck = (value, seen = /* @__PURE__ */ new WeakSet()) => {
|
|
939
|
-
if (value === null || value === void 0) {
|
|
940
|
-
return String(value);
|
|
941
|
-
}
|
|
942
|
-
if (typeof value === "function") {
|
|
943
|
-
return value.toString().slice(0, 50) + (value.toString().length > 50 ? "..." : "");
|
|
944
|
-
}
|
|
945
|
-
if (typeof value !== "object") {
|
|
946
|
-
return JSON.stringify(value);
|
|
947
|
-
}
|
|
948
|
-
if (seen.has(value)) {
|
|
949
|
-
return "[Circular]";
|
|
950
|
-
}
|
|
951
|
-
seen.add(value);
|
|
952
|
-
if (Array.isArray(value)) {
|
|
953
|
-
const items = value.map((item) => stringifyWithCircularCheck(item, seen));
|
|
954
|
-
return `[${items.join(", ")}]`;
|
|
955
|
-
}
|
|
956
|
-
try {
|
|
957
|
-
const pairs = Object.entries(value).map(
|
|
958
|
-
([key, val]) => `${key}: ${stringifyWithCircularCheck(val, seen)}`
|
|
959
|
-
);
|
|
960
|
-
return `{${pairs.join(", ")}}`;
|
|
961
|
-
} catch {
|
|
962
|
-
return "[Object]";
|
|
963
|
-
}
|
|
964
|
-
};
|
|
965
|
-
var printRST = (tree, indent = 0) => {
|
|
966
|
-
const printNode = (node, indent2) => {
|
|
967
|
-
const spaces = " ".repeat(indent2);
|
|
968
|
-
if (node.type === "component" /* Component */ && "props" in node && "name" in node) {
|
|
969
|
-
const props = Object.entries(node.props).map(([key, value]) => `${key}={${stringifyWithCircularCheck(value)}}`).join(" ");
|
|
970
|
-
return `${spaces}<${node.name || "Unknown"}${props ? ` ${props}` : ""}>
|
|
971
|
-
${node.children.map((child) => printNode(child, indent2 + 1)).join("\n")}
|
|
972
|
-
${spaces}</${node.name || "Unknown"}>`;
|
|
973
|
-
}
|
|
974
|
-
const attrs = [];
|
|
975
|
-
if ("classes" in node && node.classes.length > 0) {
|
|
976
|
-
attrs.push(`class="${node.classes.join(" ")}"`);
|
|
977
|
-
}
|
|
978
|
-
if ("eventHandlers" in node) {
|
|
979
|
-
const eventHandlerAttrs = Object.entries(node.eventHandlers).map(
|
|
980
|
-
([event, handler]) => `${event}={${handler.slice(0, 50)}${handler.length > 50 ? "..." : ""}}`
|
|
981
|
-
).join(" ");
|
|
982
|
-
if (eventHandlerAttrs) {
|
|
983
|
-
attrs.push(eventHandlerAttrs);
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
if ("styles" in node) {
|
|
987
|
-
const styleStr = stringifyWithCircularCheck(node.styles);
|
|
988
|
-
if (styleStr !== "{}") {
|
|
989
|
-
attrs.push(`style={${styleStr}}`);
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
if (node.type === "a11y" /* A11y */ && "role" in node && "ariaLabel" in node) {
|
|
993
|
-
if (node.role) attrs.push(`role="${node.role}"`);
|
|
994
|
-
if (node.ariaLabel) attrs.push(`aria-label="${node.ariaLabel}"`);
|
|
995
|
-
}
|
|
996
|
-
if ("x" in node && "y" in node && "width" in node && "height" in node) {
|
|
997
|
-
const dimensions = `x=${Math.round(node.x)} y=${Math.round(node.y)} w=${Math.round(node.width)} h=${Math.round(node.height)}`;
|
|
998
|
-
attrs.push(dimensions);
|
|
999
|
-
}
|
|
1000
|
-
const tagName = "element" in node ? node.element?.tagName.toLowerCase() || "unknown" : "unknown";
|
|
1001
|
-
const attrsStr = attrs.length > 0 ? ` ${attrs.join(" ")}` : "";
|
|
1002
|
-
if (node.children.length === 0) {
|
|
1003
|
-
return `${spaces}<${tagName}${attrsStr} />`;
|
|
1004
|
-
}
|
|
1005
|
-
return `${spaces}<${tagName}${attrsStr}>
|
|
1006
|
-
${node.children.map((child) => printNode(child, indent2 + 1)).join("\n")}
|
|
1007
|
-
${spaces}</${tagName}>`;
|
|
1008
|
-
};
|
|
1009
|
-
if (!("type" in tree.root)) {
|
|
1010
|
-
throw new Error("Invalid RST: root node must have a type");
|
|
1011
|
-
}
|
|
1012
|
-
return printNode(tree.root, indent);
|
|
1013
685
|
};
|
|
1014
686
|
|
|
1015
|
-
|
|
1016
|
-
exports.getRectMap = getRectMap;
|
|
1017
|
-
exports.init = init;
|
|
1018
|
-
exports.primaryColor = primaryColor;
|
|
1019
|
-
exports.printRST = printRST;
|
|
687
|
+
export { BIPPY_INSTRUMENTATION_STRING, CONCURRENT_MODE_NUMBER, CONCURRENT_MODE_SYMBOL_STRING, ClassComponentTag, ContextConsumerTag, DEPRECATED_ASYNC_MODE_SYMBOL_STRING, DehydratedSuspenseComponentTag, ELEMENT_TYPE_SYMBOL_STRING, ForwardRefTag, FragmentTag, FunctionComponentTag, HostComponentTag, HostHoistableTag, HostRootTag, HostSingletonTag, HostTextTag, LegacyHiddenComponentTag, MemoComponentTag, OffscreenComponentTag, SimpleMemoComponentTag, SuspenseComponentTag, TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING, createFiberVisitor, detectReactBuildType, didFiberCommit, didFiberRender, fiberIdMap, getDisplayName, getFiberFromHostInstance, getFiberId, getFiberStack, getMutatedHostFibers, getNearestHostFiber, getNearestHostFibers, getRDTHook, getTimings, getType, hasMemoCache, hasRDTHook, installRDTHook, instrument, isCompositeFiber, isHostFiber, isInstrumentationActive, isUsingRDT, isValidElement, isValidFiber, mountFiberRecursively, onCommitFiberRoot, secure, setFiberId, shouldFilterFiber, traverseContexts, traverseEffects, traverseFiber, traverseProps, traverseRenderedFibers, traverseState, unmountFiber, unmountFiberChildrenRecursively, updateFiberRecursively, version };
|