bippy 0.0.10 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +29 -11
- package/dist/index.d.ts +29 -11
- package/dist/index.global.js +1 -1
- package/dist/index.js +473 -1
- package/dist/index.mjs +416 -1
- package/dist/score.d.mts +17 -0
- package/dist/score.d.ts +17 -0
- package/dist/score.js +211 -0
- package/dist/score.mjs +205 -0
- package/package.json +11 -3
- package/dist/rsc-shim.d.mts +0 -2
- package/dist/rsc-shim.d.ts +0 -2
- package/dist/rsc-shim.global.js +0 -1
- package/dist/rsc-shim.js +0 -1
- package/dist/rsc-shim.mjs +0 -1
package/dist/score.mjs
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
var ClassComponentTag = 1;
|
|
3
|
+
var FunctionComponentTag = 0;
|
|
4
|
+
var ContextConsumerTag = 9;
|
|
5
|
+
var ForwardRefTag = 11;
|
|
6
|
+
var MemoComponentTag = 14;
|
|
7
|
+
var SimpleMemoComponentTag = 15;
|
|
8
|
+
var HostComponentTag = 5;
|
|
9
|
+
var HostHoistableTag = 26;
|
|
10
|
+
var HostSingletonTag = 27;
|
|
11
|
+
var PerformedWork = 1;
|
|
12
|
+
var Placement = 2;
|
|
13
|
+
var Hydrating = 4096;
|
|
14
|
+
var Update = 4;
|
|
15
|
+
var Cloned = 8;
|
|
16
|
+
var ChildDeletion = 16;
|
|
17
|
+
var ContentReset = 32;
|
|
18
|
+
var Snapshot = 1024;
|
|
19
|
+
var Visibility = 8192;
|
|
20
|
+
var MutationMask = Placement | Update | ChildDeletion | ContentReset | Hydrating | Visibility | Snapshot;
|
|
21
|
+
var isHostFiber = (fiber) => fiber.tag === HostComponentTag || // @ts-expect-error: it exists
|
|
22
|
+
fiber.tag === HostHoistableTag || // @ts-expect-error: it exists
|
|
23
|
+
fiber.tag === HostSingletonTag;
|
|
24
|
+
var didFiberRender = (fiber) => {
|
|
25
|
+
const nextProps = fiber.memoizedProps;
|
|
26
|
+
const prevProps = fiber.alternate?.memoizedProps || {};
|
|
27
|
+
const flags = fiber.flags ?? fiber.effectTag ?? 0;
|
|
28
|
+
switch (fiber.tag) {
|
|
29
|
+
case ClassComponentTag:
|
|
30
|
+
case FunctionComponentTag:
|
|
31
|
+
case ContextConsumerTag:
|
|
32
|
+
case ForwardRefTag:
|
|
33
|
+
case MemoComponentTag:
|
|
34
|
+
case SimpleMemoComponentTag: {
|
|
35
|
+
return (flags & PerformedWork) === PerformedWork;
|
|
36
|
+
}
|
|
37
|
+
default:
|
|
38
|
+
if (!fiber.alternate) return true;
|
|
39
|
+
return prevProps !== nextProps || fiber.alternate.memoizedState !== fiber.memoizedState || fiber.alternate.ref !== fiber.ref;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var didFiberCommit = (fiber) => {
|
|
43
|
+
return Boolean(
|
|
44
|
+
fiber.subtreeFlags & (MutationMask | Cloned) || fiber.deletions
|
|
45
|
+
);
|
|
46
|
+
};
|
|
47
|
+
var getMutatedHostFibers = (fiber) => {
|
|
48
|
+
const mutations = [];
|
|
49
|
+
const visited = /* @__PURE__ */ new WeakSet();
|
|
50
|
+
const traverse = (node) => {
|
|
51
|
+
if (!node || visited.has(node)) return;
|
|
52
|
+
visited.add(node);
|
|
53
|
+
if (isHostFiber(node) && didFiberCommit(node.return ?? node) && didFiberRender(node)) {
|
|
54
|
+
mutations.push(node);
|
|
55
|
+
}
|
|
56
|
+
if (node.child) {
|
|
57
|
+
traverse(node.child);
|
|
58
|
+
}
|
|
59
|
+
if (node.sibling) {
|
|
60
|
+
traverse(node.sibling);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
traverse(fiber);
|
|
64
|
+
return mutations;
|
|
65
|
+
};
|
|
66
|
+
var getNearestHostFiber = (fiber) => {
|
|
67
|
+
let hostFiber = traverseFiber(fiber, isHostFiber);
|
|
68
|
+
if (!hostFiber) {
|
|
69
|
+
hostFiber = traverseFiber(fiber, isHostFiber, true);
|
|
70
|
+
}
|
|
71
|
+
return hostFiber;
|
|
72
|
+
};
|
|
73
|
+
var traverseFiber = (fiber, selector, ascending = false) => {
|
|
74
|
+
if (!fiber) return null;
|
|
75
|
+
if (selector(fiber) === true) return fiber;
|
|
76
|
+
let child = ascending ? fiber.return : fiber.child;
|
|
77
|
+
while (child) {
|
|
78
|
+
const match = traverseFiber(child, selector, ascending);
|
|
79
|
+
if (match) return match;
|
|
80
|
+
child = ascending ? null : child.sibling;
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
};
|
|
84
|
+
var NO_OP = () => {
|
|
85
|
+
};
|
|
86
|
+
var getRDTHook = () => {
|
|
87
|
+
let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
88
|
+
const renderers = /* @__PURE__ */ new Map();
|
|
89
|
+
let i = 0;
|
|
90
|
+
rdtHook ??= {
|
|
91
|
+
checkDCE: NO_OP,
|
|
92
|
+
supportsFiber: true,
|
|
93
|
+
supportsFlight: true,
|
|
94
|
+
renderers,
|
|
95
|
+
onCommitFiberRoot: NO_OP,
|
|
96
|
+
onCommitFiberUnmount: NO_OP,
|
|
97
|
+
onPostCommitFiberRoot: NO_OP,
|
|
98
|
+
inject(renderer) {
|
|
99
|
+
const nextID = ++i;
|
|
100
|
+
renderers.set(nextID, renderer);
|
|
101
|
+
return nextID;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = rdtHook;
|
|
106
|
+
} catch {
|
|
107
|
+
}
|
|
108
|
+
return rdtHook;
|
|
109
|
+
};
|
|
110
|
+
if (typeof window !== "undefined") {
|
|
111
|
+
getRDTHook();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/score.ts
|
|
115
|
+
var fps = 0;
|
|
116
|
+
var lastTime = performance.now();
|
|
117
|
+
var frameCount = 0;
|
|
118
|
+
var inited = false;
|
|
119
|
+
var getFPS = () => {
|
|
120
|
+
const updateFPS = () => {
|
|
121
|
+
frameCount++;
|
|
122
|
+
const now = performance.now();
|
|
123
|
+
if (now - lastTime >= 1e3) {
|
|
124
|
+
fps = frameCount;
|
|
125
|
+
frameCount = 0;
|
|
126
|
+
lastTime = now;
|
|
127
|
+
}
|
|
128
|
+
requestAnimationFrame(updateFPS);
|
|
129
|
+
};
|
|
130
|
+
if (!inited) {
|
|
131
|
+
inited = true;
|
|
132
|
+
updateFPS();
|
|
133
|
+
}
|
|
134
|
+
return fps;
|
|
135
|
+
};
|
|
136
|
+
var truncateFloat = (value, maxLen = 1e4) => {
|
|
137
|
+
if (typeof value === "number" && parseInt(value) !== value) {
|
|
138
|
+
value = ~~(value * maxLen) / maxLen;
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
};
|
|
142
|
+
var THRESHOLD_FPS = 60;
|
|
143
|
+
var getFiberRenderScore = (fiber) => {
|
|
144
|
+
const hostFiber = getNearestHostFiber(fiber);
|
|
145
|
+
const hasMutation = didFiberCommit(fiber);
|
|
146
|
+
const mutatedHostFibers = getMutatedHostFibers(fiber);
|
|
147
|
+
const isVisible = hostFiber && isElementVisible(hostFiber.stateNode) && isElementInViewport(hostFiber.stateNode);
|
|
148
|
+
const fps2 = getFPS();
|
|
149
|
+
let unnecessaryScore = (
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
151
|
+
isVisible || mutatedHostFibers.length || hasMutation ? 0 : 1
|
|
152
|
+
);
|
|
153
|
+
for (const mutatedHostFiber of mutatedHostFibers) {
|
|
154
|
+
const node = mutatedHostFiber.stateNode;
|
|
155
|
+
if (!isElementVisible(node) || !isElementInViewport(node)) {
|
|
156
|
+
unnecessaryScore += 1 / mutatedHostFibers.length;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
unnecessary: truncateFloat(unnecessaryScore),
|
|
161
|
+
slow: fps2 < THRESHOLD_FPS ? truncateFloat((THRESHOLD_FPS - fps2) / THRESHOLD_FPS) : 0
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
var isElementVisible = (el) => {
|
|
165
|
+
const style = window.getComputedStyle(el);
|
|
166
|
+
return style.display !== "none" && style.visibility !== "hidden" && style.contentVisibility !== "hidden" && style.opacity !== "0";
|
|
167
|
+
};
|
|
168
|
+
var initedEventListeners = false;
|
|
169
|
+
var scrollX = null;
|
|
170
|
+
var scrollY = null;
|
|
171
|
+
var innerWidth = null;
|
|
172
|
+
var innerHeight = null;
|
|
173
|
+
var getWindowDimensions = () => {
|
|
174
|
+
if (scrollX === null) scrollX = window.scrollX;
|
|
175
|
+
if (scrollY === null) scrollY = window.scrollY;
|
|
176
|
+
if (innerWidth === null) innerWidth = window.innerWidth;
|
|
177
|
+
if (innerHeight === null) innerHeight = window.innerHeight;
|
|
178
|
+
if (!initedEventListeners) {
|
|
179
|
+
initedEventListeners = true;
|
|
180
|
+
const handleResize = () => {
|
|
181
|
+
scrollX = null;
|
|
182
|
+
scrollY = null;
|
|
183
|
+
innerWidth = null;
|
|
184
|
+
innerHeight = null;
|
|
185
|
+
};
|
|
186
|
+
window.addEventListener("resize", handleResize);
|
|
187
|
+
window.addEventListener("scroll", handleResize);
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
top: scrollY,
|
|
191
|
+
left: scrollX,
|
|
192
|
+
right: scrollX + innerWidth,
|
|
193
|
+
bottom: scrollY + innerHeight
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
var isElementInViewport = (el) => {
|
|
197
|
+
const elTop = el.offsetTop;
|
|
198
|
+
const elLeft = el.offsetLeft;
|
|
199
|
+
const elWidth = el.offsetWidth;
|
|
200
|
+
const elHeight = el.offsetHeight;
|
|
201
|
+
const { top, left, right, bottom } = getWindowDimensions();
|
|
202
|
+
return elTop + elHeight > top && elLeft + elWidth > left && elTop < bottom && elLeft < right;
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export { getFPS, getFiberRenderScore, getWindowDimensions, isElementInViewport, isElementVisible };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bippy",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"description": "a hacky way to get fibers from react",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -28,15 +28,23 @@
|
|
|
28
28
|
".": {
|
|
29
29
|
"import": {
|
|
30
30
|
"types": "./dist/index.d.mts",
|
|
31
|
-
"react-server": "./dist/rsc-shim.mjs",
|
|
32
31
|
"default": "./dist/index.mjs"
|
|
33
32
|
},
|
|
34
33
|
"require": {
|
|
35
34
|
"types": "./dist/index.d.ts",
|
|
36
|
-
"react-server": "./dist/rsc-shim.js",
|
|
37
35
|
"default": "./dist/index.js"
|
|
38
36
|
}
|
|
39
37
|
},
|
|
38
|
+
"./score": {
|
|
39
|
+
"import": {
|
|
40
|
+
"types": "./dist/score.d.mts",
|
|
41
|
+
"default": "./dist/score.mjs"
|
|
42
|
+
},
|
|
43
|
+
"require": {
|
|
44
|
+
"types": "./dist/score.d.ts",
|
|
45
|
+
"default": "./dist/score.js"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
40
48
|
"./dist/*": "./dist/*.js",
|
|
41
49
|
"./dist/*.js": "./dist/*.js",
|
|
42
50
|
"./dist/*.mjs": "./dist/*.mjs"
|
package/dist/rsc-shim.d.mts
DELETED
package/dist/rsc-shim.d.ts
DELETED
package/dist/rsc-shim.global.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var Bippy=function(){"use strict";var r,e,o=Object.getOwnPropertyNames;return(r={"src/rsc-shim.ts"(){throw new Error("This module cannot be imported from a Server Component module. It should only be used from a Client Component.")}},function(){return e||(0,r[o(r)[0]])((e={exports:{}}).exports,e),e.exports})()}();
|
package/dist/rsc-shim.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var e,o,r=Object.getOwnPropertyNames,t=(e={"src/rsc-shim.ts"(){throw new Error("This module cannot be imported from a Server Component module. It should only be used from a Client Component.")}},function(){return o||(0,e[r(e)[0]])((o={exports:{}}).exports,o),o.exports})();module.exports=t;
|
package/dist/rsc-shim.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e,o,r=Object.getOwnPropertyNames,t=(e={"src/rsc-shim.ts"(){throw new Error("This module cannot be imported from a Server Component module. It should only be used from a Client Component.")}},function(){return o||(0,e[r(e)[0]])((o={exports:{}}).exports,o),o.exports})();export{t as default};
|