@memlab/lens 1.0.0 → 1.0.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/LICENSE +21 -0
- package/dist/config/config.d.ts +22 -0
- package/dist/core/dom-observer.d.ts +10 -0
- package/dist/core/event-listener-tracker.d.ts +33 -0
- package/dist/core/react-fiber-analysis.d.ts +4 -0
- package/dist/core/react-memory-scan.d.ts +36 -0
- package/{src/core/types.ts → dist/core/types.d.ts} +56 -80
- package/{src/index.ts → dist/core/valid-component-name.d.ts} +2 -7
- package/dist/extensions/basic-extension.d.ts +30 -0
- package/dist/extensions/dom-visualization-extension.d.ts +17 -0
- package/dist/index.d.ts +1 -0
- package/dist/memlens.lib.bundle.js +1695 -0
- package/dist/memlens.lib.bundle.min.js +1 -0
- package/dist/memlens.lib.d.ts +12 -0
- package/dist/memlens.run.bundle.js +2673 -0
- package/dist/memlens.run.bundle.min.js +1 -0
- package/dist/memlens.run.d.ts +1 -0
- package/dist/tests/bundle/lib.bundle.test.d.ts +1 -0
- package/dist/tests/bundle/run.bundle.start.head.test.d.ts +1 -0
- package/dist/tests/bundle/run.bundle.start.test.d.ts +1 -0
- package/dist/tests/bundle/run.bundle.test.d.ts +1 -0
- package/dist/tests/fiber/dev.fiber.complex.dev.test.d.ts +1 -0
- package/dist/tests/fiber/dev.fiber.complex.list.dev.test.d.ts +1 -0
- package/dist/tests/fiber/dev.fiber.complex.prod.test.d.ts +1 -0
- package/dist/tests/fiber/dev.fiber.name.dev.test.d.ts +1 -0
- package/dist/tests/fiber/dev.fiber.name.prod.test.d.ts +1 -0
- package/dist/tests/utils/test-utils.d.ts +11 -0
- package/dist/utils/intersection-observer.d.ts +18 -0
- package/dist/utils/react-fiber-utils.d.ts +56 -0
- package/dist/utils/utils.d.ts +26 -0
- package/dist/utils/weak-ref-utils.d.ts +67 -0
- package/dist/visual/components/component-stack-panel.d.ts +11 -0
- package/dist/visual/components/control-widget.d.ts +13 -0
- package/dist/visual/components/overlay-rectangle.d.ts +11 -0
- package/dist/visual/components/status-text.d.ts +2 -0
- package/dist/visual/components/toggle-button.d.ts +3 -0
- package/dist/visual/components/visual-overlay.d.ts +1 -0
- package/dist/visual/dom-element-visualizer-interactive.d.ts +26 -0
- package/{src/core/valid-component-name.ts → dist/visual/dom-element-visualizer.d.ts} +5 -7
- package/dist/visual/visual-utils.d.ts +16 -0
- package/package.json +5 -1
- package/explainer.md +0 -54
- package/playwright.config.ts +0 -21
- package/src/config/config.ts +0 -32
- package/src/core/dom-observer.ts +0 -189
- package/src/core/event-listener-tracker.ts +0 -171
- package/src/core/react-fiber-analysis.ts +0 -123
- package/src/core/react-memory-scan.ts +0 -366
- package/src/extensions/basic-extension.ts +0 -41
- package/src/extensions/dom-visualization-extension.ts +0 -42
- package/src/memlens.lib.js.flow +0 -75
- package/src/memlens.lib.ts +0 -22
- package/src/memlens.run.ts +0 -21
- package/src/tests/bundle/lib.bundle.test.ts +0 -31
- package/src/tests/bundle/run.bundle.start.head.test.ts +0 -48
- package/src/tests/bundle/run.bundle.start.test.ts +0 -48
- package/src/tests/bundle/run.bundle.test.ts +0 -51
- package/src/tests/fiber/dev.fiber.complex.dev.test.ts +0 -92
- package/src/tests/fiber/dev.fiber.complex.list.dev.test.ts +0 -118
- package/src/tests/fiber/dev.fiber.complex.prod.test.ts +0 -92
- package/src/tests/fiber/dev.fiber.name.dev.test.ts +0 -77
- package/src/tests/fiber/dev.fiber.name.prod.test.ts +0 -79
- package/src/tests/lib/babel.prod.js +0 -4
- package/src/tests/lib/react-dom-v18.dev.js +0 -29926
- package/src/tests/lib/react-dom-v18.prod.js +0 -269
- package/src/tests/lib/react-v18.dev.js +0 -3345
- package/src/tests/lib/react-v18.prod.js +0 -33
- package/src/tests/manual/playwright-open-manual.js +0 -40
- package/src/tests/manual/todo-list/todo-with-run.bundle.html +0 -80
- package/src/tests/utils/test-utils.ts +0 -28
- package/src/utils/intersection-observer.ts +0 -65
- package/src/utils/react-fiber-utils.ts +0 -212
- package/src/utils/utils.ts +0 -201
- package/src/utils/weak-ref-utils.ts +0 -308
- package/src/visual/components/component-stack-panel.ts +0 -85
- package/src/visual/components/control-widget.ts +0 -96
- package/src/visual/components/overlay-rectangle.ts +0 -167
- package/src/visual/components/status-text.ts +0 -53
- package/src/visual/components/toggle-button.ts +0 -57
- package/src/visual/components/visual-overlay.ts +0 -19
- package/src/visual/dom-element-visualizer-interactive.ts +0 -358
- package/src/visual/dom-element-visualizer.ts +0 -130
- package/src/visual/visual-utils.ts +0 -89
- package/tsconfig.json +0 -18
- package/webpack.config.js +0 -105
|
@@ -0,0 +1,2673 @@
|
|
|
1
|
+
/******/ (() => { // webpackBootstrap
|
|
2
|
+
/******/ "use strict";
|
|
3
|
+
/******/ var __webpack_modules__ = ({
|
|
4
|
+
|
|
5
|
+
/***/ 23:
|
|
6
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
10
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
11
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
12
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
13
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
14
|
+
};
|
|
15
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
16
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
17
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
18
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
19
|
+
};
|
|
20
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
21
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
22
|
+
};
|
|
23
|
+
var _DOMVisualizationExtension_domVirtualizer;
|
|
24
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
25
|
+
exports.DOMVisualizationExtension = void 0;
|
|
26
|
+
const dom_element_visualizer_1 = __importDefault(__webpack_require__(150));
|
|
27
|
+
const dom_element_visualizer_interactive_1 = __importDefault(__webpack_require__(271));
|
|
28
|
+
const basic_extension_1 = __webpack_require__(860);
|
|
29
|
+
const USE_INTERACTIVE_VISUALIZER = true;
|
|
30
|
+
class DOMVisualizationExtension extends basic_extension_1.BasicExtension {
|
|
31
|
+
constructor(scanner) {
|
|
32
|
+
super(scanner);
|
|
33
|
+
_DOMVisualizationExtension_domVirtualizer.set(this, void 0);
|
|
34
|
+
if (USE_INTERACTIVE_VISUALIZER) {
|
|
35
|
+
__classPrivateFieldSet(this, _DOMVisualizationExtension_domVirtualizer, new dom_element_visualizer_interactive_1.default(), "f");
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
__classPrivateFieldSet(this, _DOMVisualizationExtension_domVirtualizer, new dom_element_visualizer_1.default(), "f");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
42
|
+
afterScan(_analysisResult) {
|
|
43
|
+
// const start = Date.now();
|
|
44
|
+
const scanner = this.scanner;
|
|
45
|
+
if (scanner.isDevMode()) {
|
|
46
|
+
const detachedDOMInfo = scanner.getDetachedDOMInfo();
|
|
47
|
+
__classPrivateFieldGet(this, _DOMVisualizationExtension_domVirtualizer, "f").repaint(detachedDOMInfo);
|
|
48
|
+
}
|
|
49
|
+
// const end = Date.now();
|
|
50
|
+
// console.log(`repaint took ${end - start}ms`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.DOMVisualizationExtension = DOMVisualizationExtension;
|
|
54
|
+
_DOMVisualizationExtension_domVirtualizer = new WeakMap();
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/***/ }),
|
|
58
|
+
|
|
59
|
+
/***/ 54:
|
|
60
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
64
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
65
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
66
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
67
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
68
|
+
};
|
|
69
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
70
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
71
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
72
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
73
|
+
};
|
|
74
|
+
var _DOMObserver_instances, _DOMObserver_elementCount, _DOMObserver_detachedElementCount, _DOMObserver_mutationObserver, _DOMObserver_trackedElements, _DOMObserver_trackedElementSet, _DOMObserver_consolidateInterval, _DOMObserver_observeCallback, _DOMObserver_consolidateElementRefs, _DOMObserver_getTotalDOMElementCount, _DOMObserver_getDetachedElementCount, _DOMObserver_gatherAllElementsInRemovedSubtree;
|
|
75
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
76
|
+
exports.DOMObserver = void 0;
|
|
77
|
+
/**
|
|
78
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
79
|
+
*
|
|
80
|
+
* This source code is licensed under the MIT license found in the
|
|
81
|
+
* LICENSE file in the root directory of this source tree.
|
|
82
|
+
*
|
|
83
|
+
* @format
|
|
84
|
+
* @oncall memory_lab
|
|
85
|
+
*/
|
|
86
|
+
const weak_ref_utils_1 = __webpack_require__(313);
|
|
87
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
88
|
+
// if false, we only capture the top-most element of a removed subtree
|
|
89
|
+
const CAPTURE_ALL_REMOVED_ELEMENTS = true;
|
|
90
|
+
const IS_WEAK_REF_NATIVE = (0, weak_ref_utils_1.isWeakAPINative)();
|
|
91
|
+
const IS_MUTATION_OBSERVER_SUPPORTED = window.MutationObserver !== undefined;
|
|
92
|
+
class DOMObserver {
|
|
93
|
+
constructor() {
|
|
94
|
+
_DOMObserver_instances.add(this);
|
|
95
|
+
_DOMObserver_elementCount.set(this, void 0);
|
|
96
|
+
_DOMObserver_detachedElementCount.set(this, void 0);
|
|
97
|
+
_DOMObserver_mutationObserver.set(this, void 0);
|
|
98
|
+
_DOMObserver_trackedElements.set(this, void 0);
|
|
99
|
+
_DOMObserver_trackedElementSet.set(this, void 0);
|
|
100
|
+
_DOMObserver_consolidateInterval.set(this, void 0);
|
|
101
|
+
_DOMObserver_observeCallback.set(this, void 0);
|
|
102
|
+
__classPrivateFieldSet(this, _DOMObserver_elementCount, 0, "f");
|
|
103
|
+
__classPrivateFieldSet(this, _DOMObserver_detachedElementCount, 0, "f");
|
|
104
|
+
__classPrivateFieldSet(this, _DOMObserver_trackedElements, [], "f");
|
|
105
|
+
__classPrivateFieldSet(this, _DOMObserver_trackedElementSet, new WeakSet(), "f");
|
|
106
|
+
__classPrivateFieldSet(this, _DOMObserver_observeCallback, [], "f");
|
|
107
|
+
this.startMonitoring();
|
|
108
|
+
}
|
|
109
|
+
register(callback) {
|
|
110
|
+
__classPrivateFieldGet(this, _DOMObserver_observeCallback, "f").push(callback);
|
|
111
|
+
}
|
|
112
|
+
startMonitoring() {
|
|
113
|
+
if (!IS_WEAK_REF_NATIVE || !IS_MUTATION_OBSERVER_SUPPORTED) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (__classPrivateFieldGet(this, _DOMObserver_mutationObserver, "f") != null) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
__classPrivateFieldSet(this, _DOMObserver_mutationObserver, new MutationObserver(mutationsList => {
|
|
120
|
+
let newlyAdded = [];
|
|
121
|
+
const updateCallback = (node) => {
|
|
122
|
+
if (node == null) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (node.nodeType != Node.ELEMENT_NODE) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const element = node;
|
|
129
|
+
if ((0, visual_utils_1.isVisualizerElement)(element)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (CAPTURE_ALL_REMOVED_ELEMENTS) {
|
|
133
|
+
const diff = __classPrivateFieldGet(this, _DOMObserver_instances, "m", _DOMObserver_gatherAllElementsInRemovedSubtree).call(this, element);
|
|
134
|
+
newlyAdded = [...newlyAdded, ...diff];
|
|
135
|
+
}
|
|
136
|
+
else if (!__classPrivateFieldGet(this, _DOMObserver_trackedElementSet, "f").has(element)) {
|
|
137
|
+
const ref = new WeakRef(element);
|
|
138
|
+
__classPrivateFieldGet(this, _DOMObserver_trackedElements, "f").push(ref);
|
|
139
|
+
__classPrivateFieldGet(this, _DOMObserver_trackedElementSet, "f").add(element);
|
|
140
|
+
newlyAdded.push(ref);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
mutationsList.forEach(mutation => {
|
|
144
|
+
mutation.addedNodes.forEach(updateCallback);
|
|
145
|
+
mutation.removedNodes.forEach(updateCallback);
|
|
146
|
+
});
|
|
147
|
+
__classPrivateFieldGet(this, _DOMObserver_observeCallback, "f").forEach(cb => cb(newlyAdded));
|
|
148
|
+
}), "f");
|
|
149
|
+
const waitForBodyAndObserve = () => {
|
|
150
|
+
var _a;
|
|
151
|
+
if (document.body) {
|
|
152
|
+
// observe changes in DOM tree
|
|
153
|
+
(_a = __classPrivateFieldGet(this, _DOMObserver_mutationObserver, "f")) === null || _a === void 0 ? void 0 : _a.observe(document.body, {
|
|
154
|
+
childList: true, // Detect direct additions/removals
|
|
155
|
+
subtree: true, // Observe all descendants
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
setTimeout(waitForBodyAndObserve, 0);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
waitForBodyAndObserve();
|
|
163
|
+
// starts consolidating removedElements weak references;
|
|
164
|
+
__classPrivateFieldSet(this, _DOMObserver_consolidateInterval, window.setInterval(() => {
|
|
165
|
+
__classPrivateFieldGet(this, _DOMObserver_instances, "m", _DOMObserver_consolidateElementRefs).call(this);
|
|
166
|
+
}, 3000), "f");
|
|
167
|
+
}
|
|
168
|
+
stopMonitoring() {
|
|
169
|
+
if (__classPrivateFieldGet(this, _DOMObserver_mutationObserver, "f") != null) {
|
|
170
|
+
__classPrivateFieldGet(this, _DOMObserver_mutationObserver, "f").disconnect();
|
|
171
|
+
__classPrivateFieldSet(this, _DOMObserver_mutationObserver, null, "f");
|
|
172
|
+
}
|
|
173
|
+
if (__classPrivateFieldGet(this, _DOMObserver_consolidateInterval, "f") != null) {
|
|
174
|
+
window.clearInterval(__classPrivateFieldGet(this, _DOMObserver_consolidateInterval, "f"));
|
|
175
|
+
__classPrivateFieldSet(this, _DOMObserver_consolidateInterval, null, "f");
|
|
176
|
+
}
|
|
177
|
+
// TODO: clean up memory
|
|
178
|
+
}
|
|
179
|
+
getDOMElements() {
|
|
180
|
+
return [...__classPrivateFieldGet(this, _DOMObserver_trackedElements, "f")];
|
|
181
|
+
}
|
|
182
|
+
getStats() {
|
|
183
|
+
try {
|
|
184
|
+
__classPrivateFieldSet(this, _DOMObserver_elementCount, __classPrivateFieldGet(this, _DOMObserver_instances, "m", _DOMObserver_getTotalDOMElementCount).call(this), "f");
|
|
185
|
+
__classPrivateFieldSet(this, _DOMObserver_detachedElementCount, __classPrivateFieldGet(this, _DOMObserver_instances, "m", _DOMObserver_getDetachedElementCount).call(this), "f");
|
|
186
|
+
}
|
|
187
|
+
catch (ex) {
|
|
188
|
+
// do nothing
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
elements: __classPrivateFieldGet(this, _DOMObserver_elementCount, "f"),
|
|
192
|
+
detachedElements: __classPrivateFieldGet(this, _DOMObserver_detachedElementCount, "f"),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.DOMObserver = DOMObserver;
|
|
197
|
+
_DOMObserver_elementCount = new WeakMap(), _DOMObserver_detachedElementCount = new WeakMap(), _DOMObserver_mutationObserver = new WeakMap(), _DOMObserver_trackedElements = new WeakMap(), _DOMObserver_trackedElementSet = new WeakMap(), _DOMObserver_consolidateInterval = new WeakMap(), _DOMObserver_observeCallback = new WeakMap(), _DOMObserver_instances = new WeakSet(), _DOMObserver_consolidateElementRefs = function _DOMObserver_consolidateElementRefs() {
|
|
198
|
+
const consolidatedList = [];
|
|
199
|
+
const trackedElements = new Set();
|
|
200
|
+
for (const ref of __classPrivateFieldGet(this, _DOMObserver_trackedElements, "f")) {
|
|
201
|
+
const element = ref.deref();
|
|
202
|
+
if (element != null && !trackedElements.has(element)) {
|
|
203
|
+
consolidatedList.push(ref);
|
|
204
|
+
trackedElements.add(element);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
__classPrivateFieldSet(this, _DOMObserver_trackedElements, consolidatedList, "f");
|
|
208
|
+
}, _DOMObserver_getTotalDOMElementCount = function _DOMObserver_getTotalDOMElementCount() {
|
|
209
|
+
var _a, _b;
|
|
210
|
+
return (__classPrivateFieldSet(this, _DOMObserver_elementCount, (_b = (_a = document === null || document === void 0 ? void 0 : document.getElementsByTagName('*')) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0, "f"));
|
|
211
|
+
}, _DOMObserver_getDetachedElementCount = function _DOMObserver_getDetachedElementCount() {
|
|
212
|
+
let count = 0;
|
|
213
|
+
for (const ref of __classPrivateFieldGet(this, _DOMObserver_trackedElements, "f")) {
|
|
214
|
+
const element = ref.deref();
|
|
215
|
+
if (element && element.isConnected === false) {
|
|
216
|
+
++count;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return (__classPrivateFieldSet(this, _DOMObserver_detachedElementCount, count, "f"));
|
|
220
|
+
}, _DOMObserver_gatherAllElementsInRemovedSubtree = function _DOMObserver_gatherAllElementsInRemovedSubtree(node) {
|
|
221
|
+
const queue = [node];
|
|
222
|
+
const visited = new Set();
|
|
223
|
+
const newlyAdded = [];
|
|
224
|
+
while (queue.length > 0) {
|
|
225
|
+
const current = queue.pop();
|
|
226
|
+
if (current == null || visited.has(current)) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if ((current === null || current === void 0 ? void 0 : current.nodeType) !== Node.ELEMENT_NODE) {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const element = current;
|
|
233
|
+
if ((0, visual_utils_1.isVisualizerElement)(element)) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
visited.add(element);
|
|
237
|
+
if (!__classPrivateFieldGet(this, _DOMObserver_trackedElementSet, "f").has(element)) {
|
|
238
|
+
const ref = new WeakRef(element);
|
|
239
|
+
__classPrivateFieldGet(this, _DOMObserver_trackedElements, "f").push(ref);
|
|
240
|
+
__classPrivateFieldGet(this, _DOMObserver_trackedElementSet, "f").add(element);
|
|
241
|
+
newlyAdded.push(ref);
|
|
242
|
+
}
|
|
243
|
+
const list = element.childNodes;
|
|
244
|
+
for (let i = 0; i < list.length; ++i) {
|
|
245
|
+
queue.push(list[i]);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return newlyAdded;
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
/***/ }),
|
|
253
|
+
|
|
254
|
+
/***/ 150:
|
|
255
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
259
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
260
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
261
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
262
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
263
|
+
};
|
|
264
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
265
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
266
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
267
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
268
|
+
};
|
|
269
|
+
var _DOMElementVisualizer_instances, _DOMElementVisualizer_canvas, _DOMElementVisualizer_paint, _DOMElementVisualizer_cleanupExistingCanvas, _DOMElementVisualizer_tryToAttachCanvas, _DOMElementVisualizer_createAndAppendCanvas, _DOMElementVisualizer_paintKey, _DOMElementVisualizer_paintRectangles, _DOMElementVisualizer_cleanup;
|
|
270
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
271
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
272
|
+
class DOMElementVisualizer {
|
|
273
|
+
constructor() {
|
|
274
|
+
_DOMElementVisualizer_instances.add(this);
|
|
275
|
+
_DOMElementVisualizer_canvas.set(this, void 0);
|
|
276
|
+
__classPrivateFieldSet(this, _DOMElementVisualizer_canvas, null, "f");
|
|
277
|
+
}
|
|
278
|
+
repaint(domElementInfoList) {
|
|
279
|
+
__classPrivateFieldGet(this, _DOMElementVisualizer_instances, "m", _DOMElementVisualizer_cleanup).call(this);
|
|
280
|
+
__classPrivateFieldGet(this, _DOMElementVisualizer_instances, "m", _DOMElementVisualizer_paint).call(this, domElementInfoList);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
_DOMElementVisualizer_canvas = new WeakMap(), _DOMElementVisualizer_instances = new WeakSet(), _DOMElementVisualizer_paint = function _DOMElementVisualizer_paint(domElementInfoList) {
|
|
284
|
+
if (!__classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f")) {
|
|
285
|
+
const canvas = __classPrivateFieldGet(this, _DOMElementVisualizer_instances, "m", _DOMElementVisualizer_createAndAppendCanvas).call(this);
|
|
286
|
+
__classPrivateFieldSet(this, _DOMElementVisualizer_canvas, canvas, "f");
|
|
287
|
+
}
|
|
288
|
+
__classPrivateFieldGet(this, _DOMElementVisualizer_instances, "m", _DOMElementVisualizer_paintRectangles).call(this, domElementInfoList);
|
|
289
|
+
}, _DOMElementVisualizer_cleanupExistingCanvas = function _DOMElementVisualizer_cleanupExistingCanvas() {
|
|
290
|
+
// Clean up any existing canvas
|
|
291
|
+
if (__classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f")) {
|
|
292
|
+
const ctx = __classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f").getContext('2d');
|
|
293
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.clearRect(0, 0, __classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f").width, __classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f").height);
|
|
294
|
+
__classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f").remove();
|
|
295
|
+
__classPrivateFieldSet(this, _DOMElementVisualizer_canvas, null, "f");
|
|
296
|
+
}
|
|
297
|
+
}, _DOMElementVisualizer_tryToAttachCanvas = function _DOMElementVisualizer_tryToAttachCanvas(canvas) {
|
|
298
|
+
if (document.body) {
|
|
299
|
+
document.body.appendChild(canvas);
|
|
300
|
+
}
|
|
301
|
+
}, _DOMElementVisualizer_createAndAppendCanvas = function _DOMElementVisualizer_createAndAppendCanvas() {
|
|
302
|
+
// Create and insert the canvas element
|
|
303
|
+
const canvas = (0, visual_utils_1.createVisualizerElement)('canvas');
|
|
304
|
+
canvas.id = 'overlayCanvas';
|
|
305
|
+
__classPrivateFieldGet(this, _DOMElementVisualizer_instances, "m", _DOMElementVisualizer_tryToAttachCanvas).call(this, canvas);
|
|
306
|
+
// Style the canvas to cover the entire page
|
|
307
|
+
canvas.style.position = 'absolute';
|
|
308
|
+
canvas.style.top = '0';
|
|
309
|
+
canvas.style.left = '0';
|
|
310
|
+
canvas.style.width = '100%';
|
|
311
|
+
canvas.style.height = '100%';
|
|
312
|
+
canvas.style.pointerEvents = 'none';
|
|
313
|
+
canvas.style.zIndex = '99999';
|
|
314
|
+
// Set canvas dimensions to match the window dimensions
|
|
315
|
+
canvas.width = window.innerWidth;
|
|
316
|
+
canvas.height = window.innerHeight;
|
|
317
|
+
return canvas;
|
|
318
|
+
}, _DOMElementVisualizer_paintKey = function _DOMElementVisualizer_paintKey(info) {
|
|
319
|
+
const { boundingRect } = info;
|
|
320
|
+
return JSON.stringify({ boundingRect });
|
|
321
|
+
}, _DOMElementVisualizer_paintRectangles = function _DOMElementVisualizer_paintRectangles(domElementInfoList) {
|
|
322
|
+
const canvas = __classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f");
|
|
323
|
+
if (!canvas) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
// Get the 2D drawing context
|
|
327
|
+
const ctx = canvas.getContext('2d');
|
|
328
|
+
if (ctx == null) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
// Set rectangle styles
|
|
332
|
+
ctx.strokeStyle = 'rgba(75, 192, 192, 0.8)';
|
|
333
|
+
ctx.lineWidth = 2;
|
|
334
|
+
ctx.fillStyle = 'rgba(75, 192, 192, 0.05)';
|
|
335
|
+
ctx.font = '11px Inter, system-ui, -apple-system, sans-serif';
|
|
336
|
+
const paintedInfo = new Set();
|
|
337
|
+
// Draw the rectangles
|
|
338
|
+
domElementInfoList.forEach((info) => {
|
|
339
|
+
var _a;
|
|
340
|
+
const rect = info.boundingRect;
|
|
341
|
+
if (rect == null) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const key = __classPrivateFieldGet(this, _DOMElementVisualizer_instances, "m", _DOMElementVisualizer_paintKey).call(this, info);
|
|
345
|
+
if (paintedInfo.has(key)) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
paintedInfo.add(key);
|
|
349
|
+
ctx.fillRect(rect.left, rect.top, rect.width, rect.height);
|
|
350
|
+
ctx.strokeRect(rect.left, rect.top, rect.width, rect.height);
|
|
351
|
+
const component = (_a = info.componentStack) === null || _a === void 0 ? void 0 : _a[0];
|
|
352
|
+
if (component) {
|
|
353
|
+
// attach detached element id key so that it is easy to search in heap snapshot
|
|
354
|
+
const element = info.element.deref();
|
|
355
|
+
const elementId = element === null || element === void 0 ? void 0 : element.detachedElementId;
|
|
356
|
+
const elementIdText = elementId ? ` (${elementId})` : '';
|
|
357
|
+
const text = `${component}${elementIdText}`;
|
|
358
|
+
ctx.fillStyle = 'rgba(74, 131, 224, 1)';
|
|
359
|
+
ctx.fillText(text, rect.left + 5, rect.top + 15); // Draw the name
|
|
360
|
+
ctx.fillStyle = 'rgba(75, 192, 192, 0.05)';
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
}, _DOMElementVisualizer_cleanup = function _DOMElementVisualizer_cleanup() {
|
|
364
|
+
var _a;
|
|
365
|
+
const canvas = __classPrivateFieldGet(this, _DOMElementVisualizer_canvas, "f");
|
|
366
|
+
if (canvas) {
|
|
367
|
+
const ctx = canvas.getContext('2d');
|
|
368
|
+
ctx === null || ctx === void 0 ? void 0 : ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
369
|
+
(_a = canvas.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(canvas);
|
|
370
|
+
}
|
|
371
|
+
__classPrivateFieldSet(this, _DOMElementVisualizer_canvas, null, "f");
|
|
372
|
+
};
|
|
373
|
+
exports["default"] = DOMElementVisualizer;
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
/***/ }),
|
|
377
|
+
|
|
378
|
+
/***/ 271:
|
|
379
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
383
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
384
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
385
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
386
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
387
|
+
};
|
|
388
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
389
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
390
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
391
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
392
|
+
};
|
|
393
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
394
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
395
|
+
};
|
|
396
|
+
var _DOMElementVisualizerInteractive_instances, _DOMElementVisualizerInteractive_elementIdToRectangle, _DOMElementVisualizerInteractive_visualizationOverlayDiv, _DOMElementVisualizerInteractive_controlWidget, _DOMElementVisualizerInteractive_blockedElementIds, _DOMElementVisualizerInteractive_currentVisualData, _DOMElementVisualizerInteractive_hideAllRef, _DOMElementVisualizerInteractive_updateDataCallbacks, _DOMElementVisualizerInteractive_listenToKeyboardEvent, _DOMElementVisualizerInteractive_initVisualizerData, _DOMElementVisualizerInteractive_getOutlineElementByElementId, _DOMElementVisualizerInteractive_getElementIdSet, _DOMElementVisualizerInteractive_getComponentStackForElement, _DOMElementVisualizerInteractive_traverseUpOutlineElements, _DOMElementVisualizerInteractive_removeVisualizerElement, _DOMElementVisualizerInteractive_cleanup, _DOMElementVisualizerInteractive_getZIndex, _DOMElementVisualizerInteractive_paint, _DOMElementVisualizerInteractive_updateVisualizerData;
|
|
397
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
398
|
+
const dom_element_visualizer_1 = __importDefault(__webpack_require__(150));
|
|
399
|
+
const visual_overlay_1 = __webpack_require__(368);
|
|
400
|
+
const control_widget_1 = __webpack_require__(341);
|
|
401
|
+
const overlay_rectangle_1 = __webpack_require__(701);
|
|
402
|
+
const utils_1 = __webpack_require__(476);
|
|
403
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
404
|
+
class DOMElementVisualizerInteractive extends dom_element_visualizer_1.default {
|
|
405
|
+
constructor() {
|
|
406
|
+
super();
|
|
407
|
+
_DOMElementVisualizerInteractive_instances.add(this);
|
|
408
|
+
_DOMElementVisualizerInteractive_elementIdToRectangle.set(this, void 0);
|
|
409
|
+
_DOMElementVisualizerInteractive_visualizationOverlayDiv.set(this, void 0);
|
|
410
|
+
_DOMElementVisualizerInteractive_controlWidget.set(this, void 0);
|
|
411
|
+
_DOMElementVisualizerInteractive_blockedElementIds.set(this, void 0);
|
|
412
|
+
_DOMElementVisualizerInteractive_currentVisualData.set(this, void 0);
|
|
413
|
+
_DOMElementVisualizerInteractive_hideAllRef.set(this, void 0);
|
|
414
|
+
_DOMElementVisualizerInteractive_updateDataCallbacks.set(this, []);
|
|
415
|
+
__classPrivateFieldSet(this, _DOMElementVisualizerInteractive_hideAllRef, { value: false }, "f");
|
|
416
|
+
__classPrivateFieldSet(this, _DOMElementVisualizerInteractive_visualizationOverlayDiv, (0, visual_overlay_1.createOverlayDiv)(), "f");
|
|
417
|
+
(0, visual_utils_1.tryToAttachOverlay)(__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_visualizationOverlayDiv, "f"));
|
|
418
|
+
__classPrivateFieldSet(this, _DOMElementVisualizerInteractive_controlWidget, (0, control_widget_1.createControlWidget)(__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_visualizationOverlayDiv, "f"), __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_hideAllRef, "f"), cb => {
|
|
419
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_updateDataCallbacks, "f").push(cb);
|
|
420
|
+
}), "f");
|
|
421
|
+
(0, visual_utils_1.tryToAttachOverlay)(__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_controlWidget, "f"));
|
|
422
|
+
__classPrivateFieldSet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, new Map(), "f");
|
|
423
|
+
__classPrivateFieldSet(this, _DOMElementVisualizerInteractive_currentVisualData, __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_initVisualizerData).call(this), "f");
|
|
424
|
+
__classPrivateFieldSet(this, _DOMElementVisualizerInteractive_blockedElementIds, new Set(), "f");
|
|
425
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_listenToKeyboardEvent).call(this);
|
|
426
|
+
}
|
|
427
|
+
repaint(domElementInfoList) {
|
|
428
|
+
// this.#controlWidget.remove();
|
|
429
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_visualizationOverlayDiv, "f").remove();
|
|
430
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_cleanup).call(this, domElementInfoList);
|
|
431
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_paint).call(this, domElementInfoList);
|
|
432
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_updateVisualizerData).call(this);
|
|
433
|
+
(0, visual_utils_1.tryToAttachOverlay)(__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_visualizationOverlayDiv, "f"));
|
|
434
|
+
// tryToAttachOverlay(this.#controlWidget);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
_DOMElementVisualizerInteractive_elementIdToRectangle = new WeakMap(), _DOMElementVisualizerInteractive_visualizationOverlayDiv = new WeakMap(), _DOMElementVisualizerInteractive_controlWidget = new WeakMap(), _DOMElementVisualizerInteractive_blockedElementIds = new WeakMap(), _DOMElementVisualizerInteractive_currentVisualData = new WeakMap(), _DOMElementVisualizerInteractive_hideAllRef = new WeakMap(), _DOMElementVisualizerInteractive_updateDataCallbacks = new WeakMap(), _DOMElementVisualizerInteractive_instances = new WeakSet(), _DOMElementVisualizerInteractive_listenToKeyboardEvent = function _DOMElementVisualizerInteractive_listenToKeyboardEvent() {
|
|
438
|
+
document.addEventListener('keydown', event => {
|
|
439
|
+
if (event.key === 'd' || event.key === 'D') {
|
|
440
|
+
if (__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").selectedElementId != null) {
|
|
441
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_blockedElementIds, "f").add(__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").selectedElementId);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
}, _DOMElementVisualizerInteractive_initVisualizerData = function _DOMElementVisualizerInteractive_initVisualizerData() {
|
|
446
|
+
const data = {
|
|
447
|
+
detachedDOMElementsCount: 0,
|
|
448
|
+
totalDOMElementsCount: (0, utils_1.getDOMElementCount)(),
|
|
449
|
+
selectedElementId: null,
|
|
450
|
+
selectedReactComponentStack: [],
|
|
451
|
+
pinnedElementId: null,
|
|
452
|
+
setPinnedElementId: (pinnedElementId) => {
|
|
453
|
+
var _a, _b;
|
|
454
|
+
if (data.pinnedElementId == pinnedElementId) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
// unpin the original pinned element
|
|
458
|
+
const oldPin = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_getOutlineElementByElementId).call(this, data.pinnedElementId);
|
|
459
|
+
(_a = oldPin === null || oldPin === void 0 ? void 0 : oldPin.__unpinned) === null || _a === void 0 ? void 0 : _a.call(oldPin);
|
|
460
|
+
// pin the newly pinned element
|
|
461
|
+
const newPin = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_getOutlineElementByElementId).call(this, pinnedElementId);
|
|
462
|
+
(_b = newPin === null || newPin === void 0 ? void 0 : newPin.__pinned) === null || _b === void 0 ? void 0 : _b.call(newPin);
|
|
463
|
+
data.pinnedElementId = pinnedElementId;
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
return data;
|
|
467
|
+
}, _DOMElementVisualizerInteractive_getOutlineElementByElementId = function _DOMElementVisualizerInteractive_getOutlineElementByElementId(elementId) {
|
|
468
|
+
if (elementId == null) {
|
|
469
|
+
return null;
|
|
470
|
+
}
|
|
471
|
+
const info = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get(elementId);
|
|
472
|
+
if (info == null) {
|
|
473
|
+
return null;
|
|
474
|
+
}
|
|
475
|
+
return info.visualizerElementRef.deref();
|
|
476
|
+
}, _DOMElementVisualizerInteractive_getElementIdSet = function _DOMElementVisualizerInteractive_getElementIdSet(domElementInfoList) {
|
|
477
|
+
const elementIdSet = new Set();
|
|
478
|
+
for (const info of domElementInfoList) {
|
|
479
|
+
const element = info.element.deref();
|
|
480
|
+
if (element == null) {
|
|
481
|
+
continue;
|
|
482
|
+
}
|
|
483
|
+
const elementId = element.detachedElementId;
|
|
484
|
+
if (elementId == null) {
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
elementIdSet.add(elementId);
|
|
488
|
+
}
|
|
489
|
+
return elementIdSet;
|
|
490
|
+
}, _DOMElementVisualizerInteractive_getComponentStackForElement = function _DOMElementVisualizerInteractive_getComponentStackForElement(elementId) {
|
|
491
|
+
const ret = [];
|
|
492
|
+
if (elementId == null) {
|
|
493
|
+
return ret;
|
|
494
|
+
}
|
|
495
|
+
const visualizer = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get(elementId);
|
|
496
|
+
if (visualizer == null) {
|
|
497
|
+
return ret;
|
|
498
|
+
}
|
|
499
|
+
const element = visualizer.elementInfo.element.deref();
|
|
500
|
+
if (element == null) {
|
|
501
|
+
return ret;
|
|
502
|
+
}
|
|
503
|
+
// traverse parent elements
|
|
504
|
+
let currentElement = element;
|
|
505
|
+
while (currentElement) {
|
|
506
|
+
if (currentElement.isConnected) {
|
|
507
|
+
break;
|
|
508
|
+
}
|
|
509
|
+
const elementId = currentElement.detachedElementId;
|
|
510
|
+
const info = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get(elementId);
|
|
511
|
+
if (info == null) {
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
ret.push(info);
|
|
515
|
+
currentElement = currentElement.parentElement;
|
|
516
|
+
}
|
|
517
|
+
return ret;
|
|
518
|
+
}, _DOMElementVisualizerInteractive_traverseUpOutlineElements = function _DOMElementVisualizerInteractive_traverseUpOutlineElements(elementId, callback) {
|
|
519
|
+
const visualizer = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get(elementId);
|
|
520
|
+
if (visualizer == null) {
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
const visitedElementIds = new Set();
|
|
524
|
+
let currentElement = visualizer.elementInfo.element.deref();
|
|
525
|
+
while (currentElement) {
|
|
526
|
+
if (currentElement.isConnected) {
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
const elementIdStr = currentElement.detachedElementId;
|
|
530
|
+
const elementId = parseInt(elementIdStr, 10);
|
|
531
|
+
if (visitedElementIds.has(elementId)) {
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
visitedElementIds.add(elementId);
|
|
535
|
+
const visualizerInfo = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get(elementId);
|
|
536
|
+
if (visualizerInfo == null) {
|
|
537
|
+
break;
|
|
538
|
+
}
|
|
539
|
+
const visualizerElement = visualizerInfo.visualizerElementRef.deref();
|
|
540
|
+
if (visualizerElement == null) {
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
callback(visualizerElement);
|
|
544
|
+
currentElement = currentElement.parentElement;
|
|
545
|
+
}
|
|
546
|
+
}, _DOMElementVisualizerInteractive_removeVisualizerElement = function _DOMElementVisualizerInteractive_removeVisualizerElement(elementId) {
|
|
547
|
+
var _a;
|
|
548
|
+
const visualizer = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get(elementId);
|
|
549
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").delete(elementId);
|
|
550
|
+
if (visualizer == null) {
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
const visualizerElement = visualizer.visualizerElementRef.deref();
|
|
554
|
+
if (visualizerElement == null) {
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
// invoke the overlay specific code to clean
|
|
558
|
+
(_a = visualizerElement === null || visualizerElement === void 0 ? void 0 : visualizerElement.__cleanup) === null || _a === void 0 ? void 0 : _a.call(visualizerElement);
|
|
559
|
+
visualizerElement.remove();
|
|
560
|
+
}, _DOMElementVisualizerInteractive_cleanup = function _DOMElementVisualizerInteractive_cleanup(domElementInfoList) {
|
|
561
|
+
// first pass remove all those painted visualizer for elements
|
|
562
|
+
// that either 1) is GCed or 2) is connected to the DOM tree
|
|
563
|
+
for (const [elementId, elementVistualizer,] of __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").entries()) {
|
|
564
|
+
if (elementId == null) {
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
const element = elementVistualizer.elementInfo.element.deref();
|
|
568
|
+
if (element == null) {
|
|
569
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_removeVisualizerElement).call(this, elementId);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
// second pass remove all those outlines that won't be painted later
|
|
573
|
+
const willPaintElementIdSet = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_getElementIdSet).call(this, domElementInfoList);
|
|
574
|
+
for (const [elementId] of __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").entries()) {
|
|
575
|
+
if (elementId == null) {
|
|
576
|
+
continue;
|
|
577
|
+
}
|
|
578
|
+
if (willPaintElementIdSet.has(elementId) &&
|
|
579
|
+
!__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_blockedElementIds, "f").has(elementId)) {
|
|
580
|
+
continue;
|
|
581
|
+
}
|
|
582
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_removeVisualizerElement).call(this, elementId);
|
|
583
|
+
}
|
|
584
|
+
}, _DOMElementVisualizerInteractive_getZIndex = function _DOMElementVisualizerInteractive_getZIndex(info) {
|
|
585
|
+
var _a;
|
|
586
|
+
const zIndexBase = 9999;
|
|
587
|
+
const element = info.element.deref();
|
|
588
|
+
if (element == null) {
|
|
589
|
+
return 0;
|
|
590
|
+
}
|
|
591
|
+
const elementId = element.detachedElementId;
|
|
592
|
+
if (elementId == null) {
|
|
593
|
+
return 0;
|
|
594
|
+
}
|
|
595
|
+
const rectangle = (_a = info.boundingRect) !== null && _a !== void 0 ? _a : { width: 50, height: 50 };
|
|
596
|
+
let ret = zIndexBase;
|
|
597
|
+
// element with a higher element id (created later) has a higher z-index
|
|
598
|
+
ret += parseInt(elementId, 10);
|
|
599
|
+
// element with bigger area will have a lower z-index
|
|
600
|
+
ret += Math.floor(10000000 / (rectangle.width * rectangle.height));
|
|
601
|
+
return ret;
|
|
602
|
+
}, _DOMElementVisualizerInteractive_paint = function _DOMElementVisualizerInteractive_paint(domElementInfoList) {
|
|
603
|
+
for (const info of domElementInfoList) {
|
|
604
|
+
const element = info.element.deref();
|
|
605
|
+
if (element == null) {
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
const elementId = element.detachedElementId;
|
|
609
|
+
if (elementId == null) {
|
|
610
|
+
continue;
|
|
611
|
+
}
|
|
612
|
+
if (__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_blockedElementIds, "f").has(elementId)) {
|
|
613
|
+
continue;
|
|
614
|
+
}
|
|
615
|
+
if (__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").has(elementId)) {
|
|
616
|
+
continue;
|
|
617
|
+
}
|
|
618
|
+
if (element == null) {
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
if (element.isConnected) {
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
const zIndex = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_getZIndex).call(this, info);
|
|
625
|
+
const visualizerElementRef = (0, overlay_rectangle_1.createOverlayRectangle)(elementId, info, __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_visualizationOverlayDiv, "f"), (selectedId) => {
|
|
626
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").selectedElementId = selectedId;
|
|
627
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_updateVisualizerData).call(this);
|
|
628
|
+
if (selectedId == null) {
|
|
629
|
+
return;
|
|
630
|
+
}
|
|
631
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_traverseUpOutlineElements).call(this, selectedId, element => {
|
|
632
|
+
var _a;
|
|
633
|
+
(_a = element === null || element === void 0 ? void 0 : element.__selected) === null || _a === void 0 ? void 0 : _a.call(element);
|
|
634
|
+
});
|
|
635
|
+
}, (unselectedId) => {
|
|
636
|
+
if (__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").selectedElementId === unselectedId) {
|
|
637
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").selectedElementId = null;
|
|
638
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_updateVisualizerData).call(this);
|
|
639
|
+
}
|
|
640
|
+
if (unselectedId == null) {
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_traverseUpOutlineElements).call(this, unselectedId, element => {
|
|
644
|
+
var _a;
|
|
645
|
+
(_a = element === null || element === void 0 ? void 0 : element.__unselected) === null || _a === void 0 ? void 0 : _a.call(element);
|
|
646
|
+
});
|
|
647
|
+
}, (clickedId) => {
|
|
648
|
+
if (__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").pinnedElementId === clickedId) {
|
|
649
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").setPinnedElementId(null);
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f").setPinnedElementId(clickedId);
|
|
653
|
+
}
|
|
654
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_instances, "m", _DOMElementVisualizerInteractive_updateVisualizerData).call(this);
|
|
655
|
+
}, zIndex);
|
|
656
|
+
if (visualizerElementRef == null ||
|
|
657
|
+
visualizerElementRef.deref() == null) {
|
|
658
|
+
return null;
|
|
659
|
+
}
|
|
660
|
+
const visualizer = {
|
|
661
|
+
elementInfo: info,
|
|
662
|
+
visualizerElementRef,
|
|
663
|
+
};
|
|
664
|
+
__classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").set(elementId, visualizer);
|
|
665
|
+
}
|
|
666
|
+
}, _DOMElementVisualizerInteractive_updateVisualizerData = function _DOMElementVisualizerInteractive_updateVisualizerData() {
|
|
667
|
+
var _a, _b, _c;
|
|
668
|
+
const data = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f");
|
|
669
|
+
if (data.pinnedElementId != null) {
|
|
670
|
+
data.selectedElementId = data.pinnedElementId;
|
|
671
|
+
}
|
|
672
|
+
data.detachedDOMElementsCount = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").size;
|
|
673
|
+
data.totalDOMElementsCount = (0, utils_1.getDOMElementCount)();
|
|
674
|
+
const selectedElementInfo = (_b = __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_elementIdToRectangle, "f").get((_a = data.selectedElementId) !== null && _a !== void 0 ? _a : -1)) === null || _b === void 0 ? void 0 : _b.elementInfo;
|
|
675
|
+
data.selectedReactComponentStack =
|
|
676
|
+
(_c = selectedElementInfo === null || selectedElementInfo === void 0 ? void 0 : selectedElementInfo.componentStack) !== null && _c !== void 0 ? _c : [];
|
|
677
|
+
for (const cb of __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_updateDataCallbacks, "f")) {
|
|
678
|
+
cb(Object.assign({}, __classPrivateFieldGet(this, _DOMElementVisualizerInteractive_currentVisualData, "f")));
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
exports["default"] = DOMElementVisualizerInteractive;
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
/***/ }),
|
|
685
|
+
|
|
686
|
+
/***/ 282:
|
|
687
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
691
|
+
if (k2 === undefined) k2 = k;
|
|
692
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
693
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
694
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
695
|
+
}
|
|
696
|
+
Object.defineProperty(o, k2, desc);
|
|
697
|
+
}) : (function(o, m, k, k2) {
|
|
698
|
+
if (k2 === undefined) k2 = k;
|
|
699
|
+
o[k2] = m[k];
|
|
700
|
+
}));
|
|
701
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
702
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
703
|
+
}) : function(o, v) {
|
|
704
|
+
o["default"] = v;
|
|
705
|
+
});
|
|
706
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
707
|
+
var ownKeys = function(o) {
|
|
708
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
709
|
+
var ar = [];
|
|
710
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
711
|
+
return ar;
|
|
712
|
+
};
|
|
713
|
+
return ownKeys(o);
|
|
714
|
+
};
|
|
715
|
+
return function (mod) {
|
|
716
|
+
if (mod && mod.__esModule) return mod;
|
|
717
|
+
var result = {};
|
|
718
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
719
|
+
__setModuleDefault(result, mod);
|
|
720
|
+
return result;
|
|
721
|
+
};
|
|
722
|
+
})();
|
|
723
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
724
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
725
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
726
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
727
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
728
|
+
};
|
|
729
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
730
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
731
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
732
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
733
|
+
};
|
|
734
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
735
|
+
var t = {};
|
|
736
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
737
|
+
t[p] = s[p];
|
|
738
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
739
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
740
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
741
|
+
t[p[i]] = s[p[i]];
|
|
742
|
+
}
|
|
743
|
+
return t;
|
|
744
|
+
};
|
|
745
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
746
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
747
|
+
};
|
|
748
|
+
var _ReactMemoryScan_instances, _ReactMemoryScan_elementWeakRefs, _ReactMemoryScan_isActivated, _ReactMemoryScan_intervalId, _ReactMemoryScan_elementToBoundingRects, _ReactMemoryScan_elementToComponentStack, _ReactMemoryScan_knownFiberNodes, _ReactMemoryScan_fiberAnalyzer, _ReactMemoryScan_isDevMode, _ReactMemoryScan_subscribers, _ReactMemoryScan_extensions, _ReactMemoryScan_scanIntervalMs, _ReactMemoryScan_domObserver, _ReactMemoryScan_eventListenerTracker, _ReactMemoryScan_log, _ReactMemoryScan_notifySubscribers, _ReactMemoryScan_notifyExtensionsBeforeScan, _ReactMemoryScan_notifyExtensionsAfterScan, _ReactMemoryScan_scanCycle, _ReactMemoryScan_updateElementToComponentInfo, _ReactMemoryScan_getTrackedDOMRefs, _ReactMemoryScan_runGC, _ReactMemoryScan_scanEventListenerLeaks;
|
|
749
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
750
|
+
const utils = __importStar(__webpack_require__(476));
|
|
751
|
+
const react_fiber_analysis_1 = __importDefault(__webpack_require__(302));
|
|
752
|
+
const react_fiber_utils_1 = __webpack_require__(737);
|
|
753
|
+
const dom_observer_1 = __webpack_require__(54);
|
|
754
|
+
const config_1 = __webpack_require__(346);
|
|
755
|
+
const event_listener_tracker_1 = __webpack_require__(953);
|
|
756
|
+
class ReactMemoryScan {
|
|
757
|
+
constructor(options = {}) {
|
|
758
|
+
var _a, _b, _c, _d;
|
|
759
|
+
_ReactMemoryScan_instances.add(this);
|
|
760
|
+
_ReactMemoryScan_elementWeakRefs.set(this, void 0);
|
|
761
|
+
_ReactMemoryScan_isActivated.set(this, void 0);
|
|
762
|
+
_ReactMemoryScan_intervalId.set(this, void 0);
|
|
763
|
+
_ReactMemoryScan_elementToBoundingRects.set(this, void 0);
|
|
764
|
+
_ReactMemoryScan_elementToComponentStack.set(this, void 0);
|
|
765
|
+
_ReactMemoryScan_knownFiberNodes.set(this, void 0);
|
|
766
|
+
_ReactMemoryScan_fiberAnalyzer.set(this, void 0);
|
|
767
|
+
_ReactMemoryScan_isDevMode.set(this, void 0);
|
|
768
|
+
_ReactMemoryScan_subscribers.set(this, void 0);
|
|
769
|
+
_ReactMemoryScan_extensions.set(this, void 0);
|
|
770
|
+
_ReactMemoryScan_scanIntervalMs.set(this, void 0);
|
|
771
|
+
_ReactMemoryScan_domObserver.set(this, void 0);
|
|
772
|
+
_ReactMemoryScan_eventListenerTracker.set(this, void 0);
|
|
773
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_elementWeakRefs, [], "f");
|
|
774
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_isActivated, false, "f");
|
|
775
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_elementToBoundingRects, new WeakMap(), "f");
|
|
776
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_elementToComponentStack, new WeakMap(), "f");
|
|
777
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_knownFiberNodes, [], "f");
|
|
778
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_eventListenerTracker, options.trackEventListenerLeaks
|
|
779
|
+
? event_listener_tracker_1.EventListenerTracker.getInstance()
|
|
780
|
+
: null, "f");
|
|
781
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_fiberAnalyzer, new react_fiber_analysis_1.default(), "f");
|
|
782
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_intervalId, 0, "f");
|
|
783
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_isDevMode, (_a = options.isDevMode) !== null && _a !== void 0 ? _a : false, "f");
|
|
784
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_subscribers, (_b = options.subscribers) !== null && _b !== void 0 ? _b : [], "f");
|
|
785
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_extensions, (_c = options.extensions) !== null && _c !== void 0 ? _c : [], "f");
|
|
786
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_scanIntervalMs, (_d = options.scanIntervalMs) !== null && _d !== void 0 ? _d : config_1.config.performance.scanIntervalMs, "f");
|
|
787
|
+
}
|
|
788
|
+
subscribe(callback) {
|
|
789
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_subscribers, "f").push(callback);
|
|
790
|
+
return () => this.unsubscribe(callback);
|
|
791
|
+
}
|
|
792
|
+
unsubscribe(callback) {
|
|
793
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_subscribers, __classPrivateFieldGet(this, _ReactMemoryScan_subscribers, "f").filter(cb => cb !== callback), "f");
|
|
794
|
+
}
|
|
795
|
+
registerExtension(extension) {
|
|
796
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_extensions, "f").push(extension);
|
|
797
|
+
return () => this.unregisterExtension(extension);
|
|
798
|
+
}
|
|
799
|
+
unregisterExtension(extension) {
|
|
800
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_extensions, __classPrivateFieldGet(this, _ReactMemoryScan_extensions, "f").filter(e => e !== extension), "f");
|
|
801
|
+
}
|
|
802
|
+
start() {
|
|
803
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_isActivated, true, "f");
|
|
804
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_intervalId, setInterval(__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_scanCycle).bind(this), __classPrivateFieldGet(this, _ReactMemoryScan_scanIntervalMs, "f")), "f");
|
|
805
|
+
if (config_1.config.features.enableMutationObserver) {
|
|
806
|
+
if (__classPrivateFieldGet(this, _ReactMemoryScan_domObserver, "f") == null) {
|
|
807
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_domObserver, new dom_observer_1.DOMObserver(), "f");
|
|
808
|
+
// NOTE: do not update the fiber or component information here
|
|
809
|
+
// with this.#domObserver.register as those elements in the delta
|
|
810
|
+
// list may be unmounted or just attached and their shape and
|
|
811
|
+
// component info is not correct or not set yet
|
|
812
|
+
}
|
|
813
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_domObserver, "f").startMonitoring();
|
|
814
|
+
}
|
|
815
|
+
console.log('[Memory] Tracking React and DOM memory...');
|
|
816
|
+
}
|
|
817
|
+
pause() {
|
|
818
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_isActivated, false, "f");
|
|
819
|
+
}
|
|
820
|
+
stop() {
|
|
821
|
+
var _a;
|
|
822
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_isActivated, false, "f");
|
|
823
|
+
clearInterval(__classPrivateFieldGet(this, _ReactMemoryScan_intervalId, "f"));
|
|
824
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_elementWeakRefs, [], "f");
|
|
825
|
+
(_a = __classPrivateFieldGet(this, _ReactMemoryScan_domObserver, "f")) === null || _a === void 0 ? void 0 : _a.stopMonitoring();
|
|
826
|
+
}
|
|
827
|
+
recordBoundingRectangles(elementRefs) {
|
|
828
|
+
for (const elemRef of elementRefs) {
|
|
829
|
+
const element = elemRef.deref();
|
|
830
|
+
if (element == null || __classPrivateFieldGet(this, _ReactMemoryScan_elementToBoundingRects, "f").has(element)) {
|
|
831
|
+
continue;
|
|
832
|
+
}
|
|
833
|
+
const rect = utils.getBoundingClientRect(element);
|
|
834
|
+
if (rect != null) {
|
|
835
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_elementToBoundingRects, "f").set(element, rect);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
getDetachedDOMInfo() {
|
|
840
|
+
var _a;
|
|
841
|
+
const detachedDOMElements = [];
|
|
842
|
+
for (const weakRef of __classPrivateFieldGet(this, _ReactMemoryScan_elementWeakRefs, "f")) {
|
|
843
|
+
const element = weakRef.deref();
|
|
844
|
+
if (element == null || element.isConnected) {
|
|
845
|
+
continue;
|
|
846
|
+
}
|
|
847
|
+
// add a unique id to that detach dom element
|
|
848
|
+
const elem = element;
|
|
849
|
+
if (elem.detachedElementId == null) {
|
|
850
|
+
const elementId = ReactMemoryScan.nextElementId++;
|
|
851
|
+
elem.detachedElementIdStr = `memory-id-${elementId}@`;
|
|
852
|
+
elem.detachedElementId = elementId;
|
|
853
|
+
}
|
|
854
|
+
const componentStack = (_a = __classPrivateFieldGet(this, _ReactMemoryScan_elementToComponentStack, "f").get(element)) !== null && _a !== void 0 ? _a : [];
|
|
855
|
+
detachedDOMElements.push({
|
|
856
|
+
element: weakRef,
|
|
857
|
+
boundingRect: __classPrivateFieldGet(this, _ReactMemoryScan_elementToBoundingRects, "f").get(element),
|
|
858
|
+
componentStack,
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
return detachedDOMElements;
|
|
862
|
+
}
|
|
863
|
+
isDevMode() {
|
|
864
|
+
return __classPrivateFieldGet(this, _ReactMemoryScan_isDevMode, "f");
|
|
865
|
+
}
|
|
866
|
+
getCachedComponentName(elementRef) {
|
|
867
|
+
var _a;
|
|
868
|
+
const FALLBACK_NAME = '<Unknown>';
|
|
869
|
+
const element = elementRef.deref();
|
|
870
|
+
if (element == null) {
|
|
871
|
+
return FALLBACK_NAME;
|
|
872
|
+
}
|
|
873
|
+
const componentStack = __classPrivateFieldGet(this, _ReactMemoryScan_elementToComponentStack, "f").get(element);
|
|
874
|
+
if (componentStack == null) {
|
|
875
|
+
return FALLBACK_NAME;
|
|
876
|
+
}
|
|
877
|
+
return (_a = componentStack[0]) !== null && _a !== void 0 ? _a : FALLBACK_NAME;
|
|
878
|
+
}
|
|
879
|
+
updateFiberNodes(fiberNodes) {
|
|
880
|
+
const knownFiberSet = new WeakSet();
|
|
881
|
+
for (const fiberNode of __classPrivateFieldGet(this, _ReactMemoryScan_knownFiberNodes, "f")) {
|
|
882
|
+
const fiber = fiberNode.deref();
|
|
883
|
+
if (fiber != null) {
|
|
884
|
+
knownFiberSet.add(fiber);
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
const newFiberSet = new WeakSet();
|
|
888
|
+
for (const fiberNode of fiberNodes) {
|
|
889
|
+
const fiber = fiberNode.deref();
|
|
890
|
+
if (fiber != null) {
|
|
891
|
+
newFiberSet.add(fiber);
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
const leakedFibers = [];
|
|
895
|
+
const newExistingFibers = [];
|
|
896
|
+
// clean up and compact the existing fiber node lists
|
|
897
|
+
for (const fiberRef of __classPrivateFieldGet(this, _ReactMemoryScan_knownFiberNodes, "f")) {
|
|
898
|
+
const fiber = fiberRef.deref();
|
|
899
|
+
if (fiber == null) {
|
|
900
|
+
continue;
|
|
901
|
+
}
|
|
902
|
+
if (!newFiberSet.has(fiber)) {
|
|
903
|
+
leakedFibers.push(fiberRef);
|
|
904
|
+
}
|
|
905
|
+
else {
|
|
906
|
+
newExistingFibers.push(fiberRef);
|
|
907
|
+
if (fiber.return == null) {
|
|
908
|
+
leakedFibers.push(fiberRef);
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
// add new fibers to the existing list
|
|
913
|
+
for (const fiberRef of fiberNodes) {
|
|
914
|
+
const fiber = fiberRef.deref();
|
|
915
|
+
if (fiber == null) {
|
|
916
|
+
continue;
|
|
917
|
+
}
|
|
918
|
+
if (!knownFiberSet.has(fiber)) {
|
|
919
|
+
newExistingFibers.push(fiberRef);
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
__classPrivateFieldSet(this, _ReactMemoryScan_knownFiberNodes, newExistingFibers, "f");
|
|
923
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_log).call(this, 'known fibers: ', __classPrivateFieldGet(this, _ReactMemoryScan_knownFiberNodes, "f").length);
|
|
924
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_log).call(this, 'leaked fibers: ', leakedFibers.length);
|
|
925
|
+
return leakedFibers;
|
|
926
|
+
}
|
|
927
|
+
packLeakedFibers(leakedFibers) {
|
|
928
|
+
const ret = [];
|
|
929
|
+
for (const leakedFiber of leakedFibers) {
|
|
930
|
+
ret.push(new LeakedFiber(leakedFiber));
|
|
931
|
+
}
|
|
932
|
+
return ret;
|
|
933
|
+
}
|
|
934
|
+
scan() {
|
|
935
|
+
const start = Date.now();
|
|
936
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_runGC).call(this);
|
|
937
|
+
const weakRefList = __classPrivateFieldGet(this, _ReactMemoryScan_elementWeakRefs, "f");
|
|
938
|
+
// TODO: associate elements with URL and other metadata
|
|
939
|
+
const allElements = __classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_getTrackedDOMRefs).call(this);
|
|
940
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_updateElementToComponentInfo).call(this, allElements);
|
|
941
|
+
this.recordBoundingRectangles(allElements);
|
|
942
|
+
utils.updateWeakRefList(weakRefList, allElements);
|
|
943
|
+
const scanResult = __classPrivateFieldGet(this, _ReactMemoryScan_fiberAnalyzer, "f").scan(weakRefList, __classPrivateFieldGet(this, _ReactMemoryScan_elementToComponentStack, "f"));
|
|
944
|
+
const leakedFibers = this.updateFiberNodes(scanResult.fiberNodes);
|
|
945
|
+
scanResult.leakedFibers = leakedFibers;
|
|
946
|
+
// scan for event listener leaks
|
|
947
|
+
// TODO: show the results in the UI widget
|
|
948
|
+
scanResult.eventListenerLeaks = __classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_scanEventListenerLeaks).call(this);
|
|
949
|
+
window.leakedFibers = this.packLeakedFibers(leakedFibers);
|
|
950
|
+
const end = Date.now();
|
|
951
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_log).call(this, `scan took ${end - start}ms`);
|
|
952
|
+
return scanResult;
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
_ReactMemoryScan_elementWeakRefs = new WeakMap(), _ReactMemoryScan_isActivated = new WeakMap(), _ReactMemoryScan_intervalId = new WeakMap(), _ReactMemoryScan_elementToBoundingRects = new WeakMap(), _ReactMemoryScan_elementToComponentStack = new WeakMap(), _ReactMemoryScan_knownFiberNodes = new WeakMap(), _ReactMemoryScan_fiberAnalyzer = new WeakMap(), _ReactMemoryScan_isDevMode = new WeakMap(), _ReactMemoryScan_subscribers = new WeakMap(), _ReactMemoryScan_extensions = new WeakMap(), _ReactMemoryScan_scanIntervalMs = new WeakMap(), _ReactMemoryScan_domObserver = new WeakMap(), _ReactMemoryScan_eventListenerTracker = new WeakMap(), _ReactMemoryScan_instances = new WeakSet(), _ReactMemoryScan_log = function _ReactMemoryScan_log(...args) {
|
|
956
|
+
if (__classPrivateFieldGet(this, _ReactMemoryScan_isDevMode, "f") && config_1.config.features.enableConsoleLogs) {
|
|
957
|
+
utils.consoleLog(...args);
|
|
958
|
+
}
|
|
959
|
+
}, _ReactMemoryScan_notifySubscribers = function _ReactMemoryScan_notifySubscribers(result) {
|
|
960
|
+
for (const subscriber of __classPrivateFieldGet(this, _ReactMemoryScan_subscribers, "f")) {
|
|
961
|
+
subscriber(result);
|
|
962
|
+
}
|
|
963
|
+
const duration = result.end - result.start;
|
|
964
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_log).call(this, 'duration: ', `${duration} ms`);
|
|
965
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
966
|
+
const { scanner, leakedFibers, fiberNodes } = result, rest = __rest(result, ["scanner", "leakedFibers", "fiberNodes"]);
|
|
967
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_log).call(this, rest);
|
|
968
|
+
}, _ReactMemoryScan_notifyExtensionsBeforeScan = function _ReactMemoryScan_notifyExtensionsBeforeScan() {
|
|
969
|
+
for (const extension of __classPrivateFieldGet(this, _ReactMemoryScan_extensions, "f")) {
|
|
970
|
+
extension === null || extension === void 0 ? void 0 : extension.beforeScan();
|
|
971
|
+
}
|
|
972
|
+
}, _ReactMemoryScan_notifyExtensionsAfterScan = function _ReactMemoryScan_notifyExtensionsAfterScan(result) {
|
|
973
|
+
for (const extension of __classPrivateFieldGet(this, _ReactMemoryScan_extensions, "f")) {
|
|
974
|
+
extension === null || extension === void 0 ? void 0 : extension.afterScan(result);
|
|
975
|
+
}
|
|
976
|
+
}, _ReactMemoryScan_scanCycle = function _ReactMemoryScan_scanCycle() {
|
|
977
|
+
if (!__classPrivateFieldGet(this, _ReactMemoryScan_isActivated, "f")) {
|
|
978
|
+
return;
|
|
979
|
+
}
|
|
980
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_notifyExtensionsBeforeScan).call(this);
|
|
981
|
+
const start = performance.now();
|
|
982
|
+
const stats = this.scan();
|
|
983
|
+
const end = performance.now();
|
|
984
|
+
// inform subscribers and extensions
|
|
985
|
+
const analysiResult = Object.assign(Object.assign({}, stats), { start,
|
|
986
|
+
end, scanner: this });
|
|
987
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_notifySubscribers).call(this, analysiResult);
|
|
988
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_instances, "m", _ReactMemoryScan_notifyExtensionsAfterScan).call(this, analysiResult);
|
|
989
|
+
}, _ReactMemoryScan_updateElementToComponentInfo = function _ReactMemoryScan_updateElementToComponentInfo(elements) {
|
|
990
|
+
for (const elemRef of elements) {
|
|
991
|
+
const element = elemRef.deref();
|
|
992
|
+
if (element == null || __classPrivateFieldGet(this, _ReactMemoryScan_elementToComponentStack, "f").has(element)) {
|
|
993
|
+
continue;
|
|
994
|
+
}
|
|
995
|
+
const fiberNode = (0, react_fiber_utils_1.getFiberNodeFromElement)(element);
|
|
996
|
+
if (fiberNode == null) {
|
|
997
|
+
continue;
|
|
998
|
+
}
|
|
999
|
+
__classPrivateFieldGet(this, _ReactMemoryScan_elementToComponentStack, "f").set(element, (0, react_fiber_utils_1.getReactComponentStack)(fiberNode));
|
|
1000
|
+
}
|
|
1001
|
+
}, _ReactMemoryScan_getTrackedDOMRefs = function _ReactMemoryScan_getTrackedDOMRefs() {
|
|
1002
|
+
if (__classPrivateFieldGet(this, _ReactMemoryScan_domObserver, "f") == null) {
|
|
1003
|
+
return utils.getDOMElements();
|
|
1004
|
+
}
|
|
1005
|
+
return [...utils.getDOMElements(), ...__classPrivateFieldGet(this, _ReactMemoryScan_domObserver, "f").getDOMElements()];
|
|
1006
|
+
}, _ReactMemoryScan_runGC = function _ReactMemoryScan_runGC() {
|
|
1007
|
+
if ((window === null || window === void 0 ? void 0 : window.gc) != null) {
|
|
1008
|
+
window.gc();
|
|
1009
|
+
}
|
|
1010
|
+
}, _ReactMemoryScan_scanEventListenerLeaks = function _ReactMemoryScan_scanEventListenerLeaks() {
|
|
1011
|
+
var _a;
|
|
1012
|
+
if (__classPrivateFieldGet(this, _ReactMemoryScan_eventListenerTracker, "f") == null) {
|
|
1013
|
+
return [];
|
|
1014
|
+
}
|
|
1015
|
+
// Scan for event listener leaks
|
|
1016
|
+
const detachedListeners = __classPrivateFieldGet(this, _ReactMemoryScan_eventListenerTracker, "f").scan(this.getCachedComponentName.bind(this));
|
|
1017
|
+
const eventListenerLeaks = [];
|
|
1018
|
+
for (const [componentName, listeners] of detachedListeners.entries()) {
|
|
1019
|
+
const typeCount = new Map();
|
|
1020
|
+
for (const listener of listeners) {
|
|
1021
|
+
const count = (_a = typeCount.get(listener.type)) !== null && _a !== void 0 ? _a : 0;
|
|
1022
|
+
typeCount.set(listener.type, count + 1);
|
|
1023
|
+
}
|
|
1024
|
+
for (const [type, count] of typeCount.entries()) {
|
|
1025
|
+
eventListenerLeaks.push({
|
|
1026
|
+
type,
|
|
1027
|
+
componentName,
|
|
1028
|
+
count,
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
return eventListenerLeaks;
|
|
1033
|
+
};
|
|
1034
|
+
ReactMemoryScan.nextElementId = 0;
|
|
1035
|
+
exports["default"] = ReactMemoryScan;
|
|
1036
|
+
class LeakedFiber {
|
|
1037
|
+
constructor(fiber) {
|
|
1038
|
+
this.leakedFiber = fiber;
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
/***/ }),
|
|
1044
|
+
|
|
1045
|
+
/***/ 302:
|
|
1046
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
1047
|
+
|
|
1048
|
+
|
|
1049
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
1050
|
+
if (k2 === undefined) k2 = k;
|
|
1051
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
1052
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
1053
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
1054
|
+
}
|
|
1055
|
+
Object.defineProperty(o, k2, desc);
|
|
1056
|
+
}) : (function(o, m, k, k2) {
|
|
1057
|
+
if (k2 === undefined) k2 = k;
|
|
1058
|
+
o[k2] = m[k];
|
|
1059
|
+
}));
|
|
1060
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
1061
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
1062
|
+
}) : function(o, v) {
|
|
1063
|
+
o["default"] = v;
|
|
1064
|
+
});
|
|
1065
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
1066
|
+
var ownKeys = function(o) {
|
|
1067
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
1068
|
+
var ar = [];
|
|
1069
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
1070
|
+
return ar;
|
|
1071
|
+
};
|
|
1072
|
+
return ownKeys(o);
|
|
1073
|
+
};
|
|
1074
|
+
return function (mod) {
|
|
1075
|
+
if (mod && mod.__esModule) return mod;
|
|
1076
|
+
var result = {};
|
|
1077
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
1078
|
+
__setModuleDefault(result, mod);
|
|
1079
|
+
return result;
|
|
1080
|
+
};
|
|
1081
|
+
})();
|
|
1082
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1083
|
+
/**
|
|
1084
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
1085
|
+
*
|
|
1086
|
+
* This source code is licensed under the MIT license found in the
|
|
1087
|
+
* LICENSE file in the root directory of this source tree.
|
|
1088
|
+
*
|
|
1089
|
+
* @format
|
|
1090
|
+
* @oncall memory_lab
|
|
1091
|
+
*/
|
|
1092
|
+
const utils = __importStar(__webpack_require__(476));
|
|
1093
|
+
const react_fiber_utils_1 = __webpack_require__(737);
|
|
1094
|
+
const valid_component_name_1 = __webpack_require__(847);
|
|
1095
|
+
class ReactFiberAnalyzer {
|
|
1096
|
+
scan(elementWeakRefList, elementToComponentStack) {
|
|
1097
|
+
var _a;
|
|
1098
|
+
const visitedRootFibers = new Set();
|
|
1099
|
+
const components = new Set();
|
|
1100
|
+
const componentToFiberNodeCount = new Map();
|
|
1101
|
+
const detachedComponentToFiberNodeCount = new Map();
|
|
1102
|
+
const topDownVisited = new Set();
|
|
1103
|
+
const analyzedFibers = new Set();
|
|
1104
|
+
const fiberNodes = [];
|
|
1105
|
+
let totalElements = 0;
|
|
1106
|
+
let totalDetachedElements = 0;
|
|
1107
|
+
function analyzeFiber(fiberNode) {
|
|
1108
|
+
(0, react_fiber_utils_1.traverseFiber)(fiberNode, (fiberNode) => {
|
|
1109
|
+
// skip if the fiber node has already been analyzed
|
|
1110
|
+
if (analyzedFibers.has(fiberNode)) {
|
|
1111
|
+
return true;
|
|
1112
|
+
}
|
|
1113
|
+
analyzedFibers.add(fiberNode);
|
|
1114
|
+
// traverse the fiber tree up to find the component name
|
|
1115
|
+
const displayName = (0, react_fiber_utils_1.getDisplayNameOfFiberNode)(fiberNode);
|
|
1116
|
+
if (displayName != null && (0, valid_component_name_1.isValidComponentName)(displayName)) {
|
|
1117
|
+
components.add(displayName);
|
|
1118
|
+
utils.addCountbyKey(componentToFiberNodeCount, displayName, 1);
|
|
1119
|
+
return true;
|
|
1120
|
+
}
|
|
1121
|
+
}, true);
|
|
1122
|
+
}
|
|
1123
|
+
for (const weakRef of elementWeakRefList) {
|
|
1124
|
+
const elem = weakRef.deref();
|
|
1125
|
+
if (elem == null) {
|
|
1126
|
+
continue;
|
|
1127
|
+
}
|
|
1128
|
+
// elements stats
|
|
1129
|
+
++totalElements;
|
|
1130
|
+
// TODO: simplify this logic
|
|
1131
|
+
if (!elem.isConnected) {
|
|
1132
|
+
if (elementToComponentStack.has(elem)) {
|
|
1133
|
+
const componentStack = (_a = elementToComponentStack.get(elem)) !== null && _a !== void 0 ? _a : [];
|
|
1134
|
+
// set component name
|
|
1135
|
+
const component = componentStack[0];
|
|
1136
|
+
elem.__component_name = component;
|
|
1137
|
+
utils.addCountbyKey(detachedComponentToFiberNodeCount, component, 1);
|
|
1138
|
+
}
|
|
1139
|
+
++totalDetachedElements;
|
|
1140
|
+
}
|
|
1141
|
+
// analyze fiber nodes
|
|
1142
|
+
const fiberNode = (0, react_fiber_utils_1.getFiberNodeFromElement)(elem);
|
|
1143
|
+
if (fiberNode == null) {
|
|
1144
|
+
continue;
|
|
1145
|
+
}
|
|
1146
|
+
analyzeFiber(fiberNode);
|
|
1147
|
+
// try to traverse each fiber node in the entire fiber tree
|
|
1148
|
+
const rootFiber = (0, react_fiber_utils_1.getTopMostFiberWithChild)(fiberNode);
|
|
1149
|
+
if (rootFiber == null) {
|
|
1150
|
+
continue;
|
|
1151
|
+
}
|
|
1152
|
+
if (visitedRootFibers.has(rootFiber)) {
|
|
1153
|
+
continue;
|
|
1154
|
+
}
|
|
1155
|
+
visitedRootFibers.add(rootFiber);
|
|
1156
|
+
// start traversing fiber tree from the know root host
|
|
1157
|
+
(0, react_fiber_utils_1.traverseFiber)(rootFiber, (node) => {
|
|
1158
|
+
if (topDownVisited.has(node)) {
|
|
1159
|
+
return true;
|
|
1160
|
+
}
|
|
1161
|
+
topDownVisited.add(node);
|
|
1162
|
+
fiberNodes.push(new WeakRef(node));
|
|
1163
|
+
analyzeFiber(node);
|
|
1164
|
+
}, false);
|
|
1165
|
+
}
|
|
1166
|
+
topDownVisited.clear();
|
|
1167
|
+
analyzedFibers.clear();
|
|
1168
|
+
visitedRootFibers.clear();
|
|
1169
|
+
return {
|
|
1170
|
+
components,
|
|
1171
|
+
componentToFiberNodeCount,
|
|
1172
|
+
totalElements,
|
|
1173
|
+
totalDetachedElements,
|
|
1174
|
+
detachedComponentToFiberNodeCount,
|
|
1175
|
+
fiberNodes,
|
|
1176
|
+
leakedFibers: [],
|
|
1177
|
+
};
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
exports["default"] = ReactFiberAnalyzer;
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
/***/ }),
|
|
1184
|
+
|
|
1185
|
+
/***/ 313:
|
|
1186
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
/**
|
|
1190
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
1191
|
+
*
|
|
1192
|
+
* This source code is licensed under the MIT license found in the
|
|
1193
|
+
* LICENSE file in the root directory of this source tree.
|
|
1194
|
+
*
|
|
1195
|
+
* @format
|
|
1196
|
+
* @oncall memory_lab
|
|
1197
|
+
*/
|
|
1198
|
+
var _a, _b, _c;
|
|
1199
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1200
|
+
exports.WeakMapPlus = exports.WeakMapNoOp = exports.WeakSetNoOp = exports.WeakRefNoOp = void 0;
|
|
1201
|
+
exports.getNativeWeakMap = getNativeWeakMap;
|
|
1202
|
+
exports.getNativeWeakMapOrFallback = getNativeWeakMapOrFallback;
|
|
1203
|
+
exports.getNativeWeakSet = getNativeWeakSet;
|
|
1204
|
+
exports.getNativeWeakSetOrFallback = getNativeWeakSetOrFallback;
|
|
1205
|
+
exports.getNativeWeakRef = getNativeWeakRef;
|
|
1206
|
+
exports.getNativeWeakRefOrFallback = getNativeWeakRefOrFallback;
|
|
1207
|
+
exports.isWeakMapNative = isWeakMapNative;
|
|
1208
|
+
exports.isWeakSetNative = isWeakSetNative;
|
|
1209
|
+
exports.isWeakRefNative = isWeakRefNative;
|
|
1210
|
+
exports.isWeakAPINative = isWeakAPINative;
|
|
1211
|
+
const globalScope = typeof window !== 'undefined' ? window : self;
|
|
1212
|
+
const _weakMap = (_a = globalScope.WeakMap) !== null && _a !== void 0 ? _a : null;
|
|
1213
|
+
const _weakMapIsNative = isWeakMapNative();
|
|
1214
|
+
const _weakSet = (_b = globalScope.WeakSet) !== null && _b !== void 0 ? _b : null;
|
|
1215
|
+
const _weakSetIsNative = isWeakSetNative();
|
|
1216
|
+
const _weakRef = (_c = globalScope.WeakRef) !== null && _c !== void 0 ? _c : null;
|
|
1217
|
+
const _weakRefIsNative = isWeakRefNative();
|
|
1218
|
+
const _weakAPIsAreNative = _weakMapIsNative && _weakSetIsNative && _weakRefIsNative;
|
|
1219
|
+
class WeakRefNoOp {
|
|
1220
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1221
|
+
constructor(_targetObject) {
|
|
1222
|
+
// to be overridden
|
|
1223
|
+
}
|
|
1224
|
+
deref() {
|
|
1225
|
+
return undefined;
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
exports.WeakRefNoOp = WeakRefNoOp;
|
|
1229
|
+
class WeakSetNoOp {
|
|
1230
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1231
|
+
constructor(_iterable) {
|
|
1232
|
+
// to be overridden
|
|
1233
|
+
}
|
|
1234
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1235
|
+
add(_value) {
|
|
1236
|
+
return this;
|
|
1237
|
+
}
|
|
1238
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1239
|
+
delete(_value) {
|
|
1240
|
+
return false;
|
|
1241
|
+
}
|
|
1242
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1243
|
+
has(_value) {
|
|
1244
|
+
return false;
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
exports.WeakSetNoOp = WeakSetNoOp;
|
|
1248
|
+
class WeakMapNoOp {
|
|
1249
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1250
|
+
constructor(_iterable) {
|
|
1251
|
+
// to be overridden
|
|
1252
|
+
}
|
|
1253
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1254
|
+
delete(_key) {
|
|
1255
|
+
return false;
|
|
1256
|
+
}
|
|
1257
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1258
|
+
get(_key) {
|
|
1259
|
+
return undefined;
|
|
1260
|
+
}
|
|
1261
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1262
|
+
has(_key) {
|
|
1263
|
+
return false;
|
|
1264
|
+
}
|
|
1265
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1266
|
+
set(_key, _value) {
|
|
1267
|
+
return this;
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
exports.WeakMapNoOp = WeakMapNoOp;
|
|
1271
|
+
function getNativeWeakMap() {
|
|
1272
|
+
return _weakMapIsNative ? _weakMap : null;
|
|
1273
|
+
}
|
|
1274
|
+
function getNativeWeakMapOrFallback() {
|
|
1275
|
+
return _weakMapIsNative && _weakMap ? _weakMap : WeakMapNoOp;
|
|
1276
|
+
}
|
|
1277
|
+
function getNativeWeakSet() {
|
|
1278
|
+
return _weakSetIsNative ? _weakSet : null;
|
|
1279
|
+
}
|
|
1280
|
+
function getNativeWeakSetOrFallback() {
|
|
1281
|
+
return _weakSetIsNative && _weakSet ? _weakSet : WeakSetNoOp;
|
|
1282
|
+
}
|
|
1283
|
+
function getNativeWeakRef() {
|
|
1284
|
+
return _weakRefIsNative ? _weakRef : null;
|
|
1285
|
+
}
|
|
1286
|
+
function getNativeWeakRefOrFallback() {
|
|
1287
|
+
return _weakRefIsNative && _weakRef ? _weakRef : WeakRefNoOp;
|
|
1288
|
+
}
|
|
1289
|
+
function normalize(input) {
|
|
1290
|
+
return typeof input.replace === 'function'
|
|
1291
|
+
? input.replace(/\n/g, ' ').replace(/\s+/g, ' ')
|
|
1292
|
+
: null;
|
|
1293
|
+
}
|
|
1294
|
+
function isWeakMapNative() {
|
|
1295
|
+
return (_weakMap !== null &&
|
|
1296
|
+
typeof _weakMap.toString === 'function' &&
|
|
1297
|
+
normalize(_weakMap.toString()) === 'function WeakMap() { [native code] }');
|
|
1298
|
+
}
|
|
1299
|
+
function isWeakSetNative() {
|
|
1300
|
+
return (_weakSet !== null &&
|
|
1301
|
+
typeof _weakSet.toString === 'function' &&
|
|
1302
|
+
normalize(_weakSet.toString()) === 'function WeakSet() { [native code] }');
|
|
1303
|
+
}
|
|
1304
|
+
function isWeakRefNative() {
|
|
1305
|
+
return (_weakRef !== null &&
|
|
1306
|
+
typeof _weakRef.toString === 'function' &&
|
|
1307
|
+
normalize(_weakRef.toString()) === 'function WeakRef() { [native code] }');
|
|
1308
|
+
}
|
|
1309
|
+
function isWeakAPINative() {
|
|
1310
|
+
return _weakAPIsAreNative;
|
|
1311
|
+
}
|
|
1312
|
+
class WeakMapPlus {
|
|
1313
|
+
constructor(options = {}) {
|
|
1314
|
+
this.strongMap = null;
|
|
1315
|
+
this.noopMap = false;
|
|
1316
|
+
this.entriesMap = new Map();
|
|
1317
|
+
this.keyToId = new WeakMap();
|
|
1318
|
+
const { fallback = 'strong', cleanupMs = 1000 } = options;
|
|
1319
|
+
this.isWeak = _weakAPIsAreNative;
|
|
1320
|
+
this.fallbackMode = fallback;
|
|
1321
|
+
if (!this.isWeak) {
|
|
1322
|
+
if (fallback === 'strong') {
|
|
1323
|
+
this.strongMap = new Map();
|
|
1324
|
+
}
|
|
1325
|
+
else if (fallback === 'noop') {
|
|
1326
|
+
this.noopMap = true;
|
|
1327
|
+
}
|
|
1328
|
+
this.cleanupInterval = -1;
|
|
1329
|
+
}
|
|
1330
|
+
else {
|
|
1331
|
+
this.cleanupInterval = setInterval(() => this.cleanup(), cleanupMs);
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
getOrCreateId(key) {
|
|
1335
|
+
let id = this.keyToId.get(key);
|
|
1336
|
+
if (!id) {
|
|
1337
|
+
id = Symbol();
|
|
1338
|
+
this.keyToId.set(key, id);
|
|
1339
|
+
}
|
|
1340
|
+
return id;
|
|
1341
|
+
}
|
|
1342
|
+
set(key, value) {
|
|
1343
|
+
var _a;
|
|
1344
|
+
if (!this.isWeak) {
|
|
1345
|
+
if (this.noopMap)
|
|
1346
|
+
return this;
|
|
1347
|
+
(_a = this.strongMap) === null || _a === void 0 ? void 0 : _a.set(key, value);
|
|
1348
|
+
return this;
|
|
1349
|
+
}
|
|
1350
|
+
const id = this.getOrCreateId(key);
|
|
1351
|
+
this.entriesMap.set(id, { ref: new WeakRef(key), value });
|
|
1352
|
+
return this;
|
|
1353
|
+
}
|
|
1354
|
+
get(key) {
|
|
1355
|
+
var _a, _b;
|
|
1356
|
+
if (!this.isWeak) {
|
|
1357
|
+
if (this.noopMap)
|
|
1358
|
+
return undefined;
|
|
1359
|
+
return (_a = this.strongMap) === null || _a === void 0 ? void 0 : _a.get(key);
|
|
1360
|
+
}
|
|
1361
|
+
const id = this.keyToId.get(key);
|
|
1362
|
+
if (!id)
|
|
1363
|
+
return undefined;
|
|
1364
|
+
const entry = this.entriesMap.get(id);
|
|
1365
|
+
const derefKey = (_b = entry === null || entry === void 0 ? void 0 : entry.ref) === null || _b === void 0 ? void 0 : _b.deref();
|
|
1366
|
+
return derefKey ? entry === null || entry === void 0 ? void 0 : entry.value : undefined;
|
|
1367
|
+
}
|
|
1368
|
+
has(key) {
|
|
1369
|
+
var _a, _b;
|
|
1370
|
+
if (!this.isWeak) {
|
|
1371
|
+
if (this.noopMap)
|
|
1372
|
+
return false;
|
|
1373
|
+
return (_b = (_a = this.strongMap) === null || _a === void 0 ? void 0 : _a.has(key)) !== null && _b !== void 0 ? _b : false;
|
|
1374
|
+
}
|
|
1375
|
+
const id = this.keyToId.get(key);
|
|
1376
|
+
if (!id)
|
|
1377
|
+
return false;
|
|
1378
|
+
const entry = this.entriesMap.get(id);
|
|
1379
|
+
return !!(entry && entry.ref.deref());
|
|
1380
|
+
}
|
|
1381
|
+
delete(key) {
|
|
1382
|
+
var _a, _b;
|
|
1383
|
+
if (!this.isWeak) {
|
|
1384
|
+
if (this.noopMap)
|
|
1385
|
+
return false;
|
|
1386
|
+
return (_b = (_a = this.strongMap) === null || _a === void 0 ? void 0 : _a.delete(key)) !== null && _b !== void 0 ? _b : false;
|
|
1387
|
+
}
|
|
1388
|
+
const id = this.keyToId.get(key);
|
|
1389
|
+
if (!id)
|
|
1390
|
+
return false;
|
|
1391
|
+
this.keyToId.delete(key);
|
|
1392
|
+
return this.entriesMap.delete(id);
|
|
1393
|
+
}
|
|
1394
|
+
*liveEntries() {
|
|
1395
|
+
for (const [, entry] of this.entriesMap) {
|
|
1396
|
+
const key = entry.ref.deref();
|
|
1397
|
+
if (key) {
|
|
1398
|
+
yield [key, entry.value];
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
entries() {
|
|
1403
|
+
var _a, _b;
|
|
1404
|
+
if (!this.isWeak) {
|
|
1405
|
+
if (this.noopMap)
|
|
1406
|
+
return [][Symbol.iterator]();
|
|
1407
|
+
return (_b = (_a = this.strongMap) === null || _a === void 0 ? void 0 : _a.entries()) !== null && _b !== void 0 ? _b : [][Symbol.iterator]();
|
|
1408
|
+
}
|
|
1409
|
+
return this.liveEntries();
|
|
1410
|
+
}
|
|
1411
|
+
keys() {
|
|
1412
|
+
return (function* (self) {
|
|
1413
|
+
for (const [key] of self.entries())
|
|
1414
|
+
yield key;
|
|
1415
|
+
})(this);
|
|
1416
|
+
}
|
|
1417
|
+
values() {
|
|
1418
|
+
return (function* (self) {
|
|
1419
|
+
for (const [, value] of self.entries())
|
|
1420
|
+
yield value;
|
|
1421
|
+
})(this);
|
|
1422
|
+
}
|
|
1423
|
+
[Symbol.iterator]() {
|
|
1424
|
+
return this.entries();
|
|
1425
|
+
}
|
|
1426
|
+
get size() {
|
|
1427
|
+
var _a, _b;
|
|
1428
|
+
if (!this.isWeak) {
|
|
1429
|
+
if (this.noopMap)
|
|
1430
|
+
return 0;
|
|
1431
|
+
return (_b = (_a = this.strongMap) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : 0;
|
|
1432
|
+
}
|
|
1433
|
+
let count = 0;
|
|
1434
|
+
// eslint-disable-next-line
|
|
1435
|
+
for (const _ of this.liveEntries()) {
|
|
1436
|
+
count++;
|
|
1437
|
+
}
|
|
1438
|
+
return count;
|
|
1439
|
+
}
|
|
1440
|
+
getFallbackMode() {
|
|
1441
|
+
return this.fallbackMode;
|
|
1442
|
+
}
|
|
1443
|
+
cleanup() {
|
|
1444
|
+
if (!this.isWeak)
|
|
1445
|
+
return;
|
|
1446
|
+
for (const [id, entry] of this.entriesMap) {
|
|
1447
|
+
if (!entry.ref.deref()) {
|
|
1448
|
+
this.entriesMap.delete(id);
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
}
|
|
1452
|
+
destroy() {
|
|
1453
|
+
if (this.isWeak) {
|
|
1454
|
+
clearInterval(this.cleanupInterval);
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
exports.WeakMapPlus = WeakMapPlus;
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
/***/ }),
|
|
1462
|
+
|
|
1463
|
+
/***/ 341:
|
|
1464
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1468
|
+
exports.createControlWidget = createControlWidget;
|
|
1469
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
1470
|
+
const status_text_1 = __webpack_require__(775);
|
|
1471
|
+
const toggle_button_1 = __webpack_require__(946);
|
|
1472
|
+
const component_stack_panel_1 = __webpack_require__(904);
|
|
1473
|
+
function createControlWidget(overlayDiv, hideAllRef, registerDataUpdateCallback) {
|
|
1474
|
+
const controlWidget = (0, visual_utils_1.createVisualizerElement)('div');
|
|
1475
|
+
controlWidget.style.position = 'fixed';
|
|
1476
|
+
controlWidget.style.top = '50px';
|
|
1477
|
+
controlWidget.style.right = '50px';
|
|
1478
|
+
controlWidget.style.width = '400px';
|
|
1479
|
+
controlWidget.style.background = 'rgba(0, 0, 0, 0.7)';
|
|
1480
|
+
controlWidget.style.border = 'none';
|
|
1481
|
+
controlWidget.style.borderRadius = '8px';
|
|
1482
|
+
controlWidget.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.3)';
|
|
1483
|
+
controlWidget.style.zIndex = '999999999';
|
|
1484
|
+
controlWidget.style.display = 'flex';
|
|
1485
|
+
controlWidget.style.flexDirection = 'column';
|
|
1486
|
+
controlWidget.style.textShadow = 'none';
|
|
1487
|
+
controlWidget.style.boxSizing = 'border-box';
|
|
1488
|
+
controlWidget.style.font = '9px Inter, system-ui, -apple-system, sans-serif';
|
|
1489
|
+
controlWidget.id = 'memory-visualization-control-widget';
|
|
1490
|
+
// Create header section
|
|
1491
|
+
const header = (0, visual_utils_1.createVisualizerElement)('div');
|
|
1492
|
+
header.style.display = 'flex';
|
|
1493
|
+
header.style.alignItems = 'center';
|
|
1494
|
+
header.style.justifyContent = 'flex-start';
|
|
1495
|
+
header.style.padding = '0 8px';
|
|
1496
|
+
header.style.height = '36px';
|
|
1497
|
+
controlWidget.appendChild(header);
|
|
1498
|
+
// Create component stack panel
|
|
1499
|
+
const componentStackPanel = (0, component_stack_panel_1.createComponentStackPanel)(registerDataUpdateCallback);
|
|
1500
|
+
controlWidget.appendChild(componentStackPanel);
|
|
1501
|
+
supportDragging(controlWidget);
|
|
1502
|
+
const toggleButton = (0, toggle_button_1.createToggleButton)(overlayDiv, hideAllRef);
|
|
1503
|
+
header.appendChild(toggleButton);
|
|
1504
|
+
const statusText = (0, status_text_1.createStatusText)(registerDataUpdateCallback);
|
|
1505
|
+
header.appendChild(statusText);
|
|
1506
|
+
return controlWidget;
|
|
1507
|
+
}
|
|
1508
|
+
function supportDragging(controlWidget) {
|
|
1509
|
+
let isDragging = false;
|
|
1510
|
+
let offsetX = 0;
|
|
1511
|
+
let offsetY = 0;
|
|
1512
|
+
controlWidget.addEventListener('mousedown', e => {
|
|
1513
|
+
// Only allow dragging from the header
|
|
1514
|
+
if (!e.target.closest('#memory-visualization-control-widget > div:first-child')) {
|
|
1515
|
+
return;
|
|
1516
|
+
}
|
|
1517
|
+
isDragging = true;
|
|
1518
|
+
offsetX = e.clientX - controlWidget.offsetLeft;
|
|
1519
|
+
offsetY = e.clientY - controlWidget.offsetTop;
|
|
1520
|
+
controlWidget.style.cursor = 'move';
|
|
1521
|
+
});
|
|
1522
|
+
document.addEventListener('mousemove', e => {
|
|
1523
|
+
if (isDragging) {
|
|
1524
|
+
controlWidget.style.left = `${e.clientX - offsetX}px`;
|
|
1525
|
+
controlWidget.style.top = `${e.clientY - offsetY}px`;
|
|
1526
|
+
controlWidget.style.right = '';
|
|
1527
|
+
}
|
|
1528
|
+
});
|
|
1529
|
+
document.addEventListener('mouseup', () => {
|
|
1530
|
+
isDragging = false;
|
|
1531
|
+
controlWidget.style.cursor = 'default';
|
|
1532
|
+
});
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
/***/ }),
|
|
1537
|
+
|
|
1538
|
+
/***/ 346:
|
|
1539
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
/**
|
|
1543
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
1544
|
+
*
|
|
1545
|
+
* This source code is licensed under the MIT license found in the
|
|
1546
|
+
* LICENSE file in the root directory of this source tree.
|
|
1547
|
+
*
|
|
1548
|
+
* @format
|
|
1549
|
+
* @oncall memory_lab
|
|
1550
|
+
*/
|
|
1551
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1552
|
+
exports.config = exports.featureFlags = exports.performanceConfig = void 0;
|
|
1553
|
+
// Performance Configuration
|
|
1554
|
+
exports.performanceConfig = {
|
|
1555
|
+
scanIntervalMs: 1000,
|
|
1556
|
+
maxComponentStackDepth: 100,
|
|
1557
|
+
memoryMeasurementIntervalMs: 5000,
|
|
1558
|
+
};
|
|
1559
|
+
// Feature Flags
|
|
1560
|
+
exports.featureFlags = {
|
|
1561
|
+
enableMutationObserver: true,
|
|
1562
|
+
enableMemoryTracking: true,
|
|
1563
|
+
enableComponentStack: true,
|
|
1564
|
+
enableConsoleLogs: window === null || window === void 0 ? void 0 : window.TEST_MEMORY_SCAN,
|
|
1565
|
+
};
|
|
1566
|
+
// overall Config
|
|
1567
|
+
exports.config = {
|
|
1568
|
+
performance: exports.performanceConfig,
|
|
1569
|
+
features: exports.featureFlags,
|
|
1570
|
+
};
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
/***/ }),
|
|
1574
|
+
|
|
1575
|
+
/***/ 368:
|
|
1576
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1580
|
+
exports.createOverlayDiv = createOverlayDiv;
|
|
1581
|
+
/**
|
|
1582
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
1583
|
+
*
|
|
1584
|
+
* This source code is licensed under the MIT license found in the
|
|
1585
|
+
* LICENSE file in the root directory of this source tree.
|
|
1586
|
+
*
|
|
1587
|
+
* @format
|
|
1588
|
+
* @oncall memory_lab
|
|
1589
|
+
*/
|
|
1590
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
1591
|
+
function createOverlayDiv() {
|
|
1592
|
+
const overlayDiv = (0, visual_utils_1.createVisualizerElement)('div');
|
|
1593
|
+
overlayDiv.style.position = 'absolute';
|
|
1594
|
+
overlayDiv.style.top = '0px';
|
|
1595
|
+
overlayDiv.style.left = '0px';
|
|
1596
|
+
overlayDiv.id = 'memory-visualization-overlay';
|
|
1597
|
+
return overlayDiv;
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
/***/ }),
|
|
1602
|
+
|
|
1603
|
+
/***/ 476:
|
|
1604
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1608
|
+
exports.getDOMElements = getDOMElements;
|
|
1609
|
+
exports.getDOMElementCount = getDOMElementCount;
|
|
1610
|
+
exports.getMeaningfulName = getMeaningfulName;
|
|
1611
|
+
exports.isMinifiedName = isMinifiedName;
|
|
1612
|
+
exports.addCountbyKey = addCountbyKey;
|
|
1613
|
+
exports.updateWeakRefList = updateWeakRefList;
|
|
1614
|
+
exports.getBoundingClientRect = getBoundingClientRect;
|
|
1615
|
+
exports.consoleLog = consoleLog;
|
|
1616
|
+
exports.hasRunInSession = hasRunInSession;
|
|
1617
|
+
exports.setRunInSession = setRunInSession;
|
|
1618
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
1619
|
+
function getDOMElements() {
|
|
1620
|
+
const elements = Array.from(document.querySelectorAll('*'));
|
|
1621
|
+
const ret = [];
|
|
1622
|
+
for (const element of elements) {
|
|
1623
|
+
if ((0, visual_utils_1.isVisualizerElement)(element)) {
|
|
1624
|
+
continue;
|
|
1625
|
+
}
|
|
1626
|
+
ret.push(new WeakRef(element));
|
|
1627
|
+
}
|
|
1628
|
+
return ret;
|
|
1629
|
+
}
|
|
1630
|
+
function getDOMElementCount() {
|
|
1631
|
+
const elements = Array.from(document.querySelectorAll('*'));
|
|
1632
|
+
let ret = 0;
|
|
1633
|
+
for (const element of elements) {
|
|
1634
|
+
if ((0, visual_utils_1.isVisualizerElement)(element)) {
|
|
1635
|
+
continue;
|
|
1636
|
+
}
|
|
1637
|
+
++ret;
|
|
1638
|
+
}
|
|
1639
|
+
return ret;
|
|
1640
|
+
}
|
|
1641
|
+
function getMeaningfulName(name) {
|
|
1642
|
+
if (name == null) {
|
|
1643
|
+
return null;
|
|
1644
|
+
}
|
|
1645
|
+
const isMinified = isMinifiedName(name);
|
|
1646
|
+
return isMinified ? null : name;
|
|
1647
|
+
}
|
|
1648
|
+
/**
|
|
1649
|
+
* Determines if a given function or class name is minified.
|
|
1650
|
+
*
|
|
1651
|
+
* @param {string} name - The function or class name to check.
|
|
1652
|
+
* @return {boolean} - Returns true if the name is likely minified, otherwise false.
|
|
1653
|
+
*/
|
|
1654
|
+
function isMinifiedName(name) {
|
|
1655
|
+
if (name.length >= 5) {
|
|
1656
|
+
return false;
|
|
1657
|
+
}
|
|
1658
|
+
// Minified names are often very short, e.g., "a", "b", "c"
|
|
1659
|
+
if (name.length <= 3) {
|
|
1660
|
+
return true;
|
|
1661
|
+
}
|
|
1662
|
+
// Names with non-alphanumeric characters (except $ and _) are unlikely to be minified
|
|
1663
|
+
if (/[^a-zA-Z0-9$_]/.test(name)) {
|
|
1664
|
+
return false;
|
|
1665
|
+
}
|
|
1666
|
+
// Minified names rarely have meaningful words (detect camelCase or PascalCase)
|
|
1667
|
+
const hasMeaningfulPattern = /^[A-Z][a-z]+([A-Z][a-z]*)*$|^[a-z]+([A-Z][a-z]*)*$/.test(name);
|
|
1668
|
+
return !hasMeaningfulPattern;
|
|
1669
|
+
}
|
|
1670
|
+
function addCountbyKey(map, key, count) {
|
|
1671
|
+
var _a;
|
|
1672
|
+
map.set(key, ((_a = map.get(key)) !== null && _a !== void 0 ? _a : 0) + count);
|
|
1673
|
+
}
|
|
1674
|
+
function updateWeakRefList(weakRefList, elementRefs) {
|
|
1675
|
+
consolidateWeakRefList(weakRefList);
|
|
1676
|
+
const set = getElementsSet(weakRefList);
|
|
1677
|
+
for (const elementRef of elementRefs) {
|
|
1678
|
+
const element = elementRef.deref();
|
|
1679
|
+
if (element == null || set.has(element)) {
|
|
1680
|
+
continue;
|
|
1681
|
+
}
|
|
1682
|
+
set.add(element);
|
|
1683
|
+
weakRefList.push(new WeakRef(element));
|
|
1684
|
+
}
|
|
1685
|
+
return weakRefList;
|
|
1686
|
+
}
|
|
1687
|
+
function getElementsSet(weakRefList) {
|
|
1688
|
+
const set = new Set();
|
|
1689
|
+
for (const weakRef of weakRefList) {
|
|
1690
|
+
set.add(weakRef.deref());
|
|
1691
|
+
}
|
|
1692
|
+
return set;
|
|
1693
|
+
}
|
|
1694
|
+
function consolidateWeakRefList(weakRefList) {
|
|
1695
|
+
const alternative = [];
|
|
1696
|
+
for (const weakRef of weakRefList) {
|
|
1697
|
+
const element = weakRef.deref();
|
|
1698
|
+
if (element == null) {
|
|
1699
|
+
continue;
|
|
1700
|
+
}
|
|
1701
|
+
alternative.push(weakRef);
|
|
1702
|
+
}
|
|
1703
|
+
while (weakRefList.length > 0) {
|
|
1704
|
+
weakRefList.pop();
|
|
1705
|
+
}
|
|
1706
|
+
for (const weakRef of alternative) {
|
|
1707
|
+
weakRefList.push(weakRef);
|
|
1708
|
+
}
|
|
1709
|
+
return weakRefList;
|
|
1710
|
+
}
|
|
1711
|
+
function getBoundingClientRect(element) {
|
|
1712
|
+
if (element == null) {
|
|
1713
|
+
return null;
|
|
1714
|
+
}
|
|
1715
|
+
if (typeof element.getBoundingClientRect !== 'function') {
|
|
1716
|
+
return null;
|
|
1717
|
+
}
|
|
1718
|
+
let rect = null;
|
|
1719
|
+
try {
|
|
1720
|
+
rect = element.getBoundingClientRect();
|
|
1721
|
+
}
|
|
1722
|
+
catch (_a) {
|
|
1723
|
+
// do nothing
|
|
1724
|
+
}
|
|
1725
|
+
if (rect == null) {
|
|
1726
|
+
return null;
|
|
1727
|
+
}
|
|
1728
|
+
const scrollTop = window.scrollY;
|
|
1729
|
+
const scrollLeft = window.scrollX;
|
|
1730
|
+
const ret = {};
|
|
1731
|
+
ret.bottom = rect.bottom;
|
|
1732
|
+
ret.height = rect.height;
|
|
1733
|
+
ret.left = rect.left;
|
|
1734
|
+
ret.right = rect.right;
|
|
1735
|
+
ret.top = rect.top;
|
|
1736
|
+
ret.width = rect.width;
|
|
1737
|
+
ret.x = rect.x;
|
|
1738
|
+
ret.y = rect.y;
|
|
1739
|
+
ret.scrollLeft = scrollLeft;
|
|
1740
|
+
ret.scrollTop = scrollTop;
|
|
1741
|
+
return ret;
|
|
1742
|
+
}
|
|
1743
|
+
const _console = console;
|
|
1744
|
+
const _consoleLog = _console.log;
|
|
1745
|
+
function consoleLog(...args) {
|
|
1746
|
+
_consoleLog.apply(_console, args);
|
|
1747
|
+
}
|
|
1748
|
+
const SESSION_STORAGE_KEY = 'memory_lens_session';
|
|
1749
|
+
function isSessionStorageAvailable() {
|
|
1750
|
+
try {
|
|
1751
|
+
const testKey = '__memory_lens_session_test__';
|
|
1752
|
+
sessionStorage.setItem(testKey, '1');
|
|
1753
|
+
sessionStorage.removeItem(testKey);
|
|
1754
|
+
return true;
|
|
1755
|
+
}
|
|
1756
|
+
catch (_a) {
|
|
1757
|
+
return false;
|
|
1758
|
+
}
|
|
1759
|
+
}
|
|
1760
|
+
function hasRunInSession() {
|
|
1761
|
+
if (!isSessionStorageAvailable()) {
|
|
1762
|
+
return false;
|
|
1763
|
+
}
|
|
1764
|
+
try {
|
|
1765
|
+
return sessionStorage.getItem(SESSION_STORAGE_KEY) === 'true';
|
|
1766
|
+
}
|
|
1767
|
+
catch (_a) {
|
|
1768
|
+
return false;
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
function setRunInSession() {
|
|
1772
|
+
if (!isSessionStorageAvailable()) {
|
|
1773
|
+
return;
|
|
1774
|
+
}
|
|
1775
|
+
try {
|
|
1776
|
+
sessionStorage.setItem(SESSION_STORAGE_KEY, 'true');
|
|
1777
|
+
}
|
|
1778
|
+
catch (_a) {
|
|
1779
|
+
// do nothing
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
|
|
1783
|
+
|
|
1784
|
+
/***/ }),
|
|
1785
|
+
|
|
1786
|
+
/***/ 498:
|
|
1787
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
1788
|
+
|
|
1789
|
+
|
|
1790
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1791
|
+
exports.isVisualizerElement = isVisualizerElement;
|
|
1792
|
+
exports.createVisualizerElement = createVisualizerElement;
|
|
1793
|
+
exports.tryToAttachOverlay = tryToAttachOverlay;
|
|
1794
|
+
exports.addTrackedListener = addTrackedListener;
|
|
1795
|
+
exports.removeAllListeners = removeAllListeners;
|
|
1796
|
+
exports.debounce = debounce;
|
|
1797
|
+
const VISUALIZER_DATA_ATTR = 'data-visualizer';
|
|
1798
|
+
function setVisualizerElement(element) {
|
|
1799
|
+
element.setAttribute(VISUALIZER_DATA_ATTR, 'true');
|
|
1800
|
+
element.setAttribute('data-visualcompletion', 'ignore');
|
|
1801
|
+
}
|
|
1802
|
+
function isVisualizerElement(element) {
|
|
1803
|
+
return element.getAttribute(VISUALIZER_DATA_ATTR) === 'true';
|
|
1804
|
+
}
|
|
1805
|
+
function createVisualizerElement(tag) {
|
|
1806
|
+
const element = document.createElement(tag);
|
|
1807
|
+
setVisualizerElement(element);
|
|
1808
|
+
return element;
|
|
1809
|
+
}
|
|
1810
|
+
function tryToAttachOverlay(overlayDiv) {
|
|
1811
|
+
if (document.body) {
|
|
1812
|
+
document.body.appendChild(overlayDiv);
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
const listenerMap = new WeakMap();
|
|
1816
|
+
function addTrackedListener(elRef, type, cb, options) {
|
|
1817
|
+
var _a;
|
|
1818
|
+
const el = elRef.deref();
|
|
1819
|
+
if (!el)
|
|
1820
|
+
return;
|
|
1821
|
+
el.addEventListener(type, cb, options);
|
|
1822
|
+
if (!listenerMap.has(el)) {
|
|
1823
|
+
listenerMap.set(el, []);
|
|
1824
|
+
}
|
|
1825
|
+
(_a = listenerMap.get(el)) === null || _a === void 0 ? void 0 : _a.push({ type, cb, options });
|
|
1826
|
+
}
|
|
1827
|
+
function removeAllListeners(elRef) {
|
|
1828
|
+
const el = elRef.deref();
|
|
1829
|
+
if (!el)
|
|
1830
|
+
return;
|
|
1831
|
+
const listeners = listenerMap.get(el);
|
|
1832
|
+
if (!listeners)
|
|
1833
|
+
return;
|
|
1834
|
+
for (const { type, cb, options } of listeners) {
|
|
1835
|
+
el.removeEventListener(type, cb, options);
|
|
1836
|
+
}
|
|
1837
|
+
listenerMap.delete(el);
|
|
1838
|
+
}
|
|
1839
|
+
function debounce(callback, delay) {
|
|
1840
|
+
let timer = null;
|
|
1841
|
+
return (...args) => {
|
|
1842
|
+
if (timer) {
|
|
1843
|
+
clearTimeout(timer);
|
|
1844
|
+
}
|
|
1845
|
+
timer = setTimeout(() => {
|
|
1846
|
+
callback(...args);
|
|
1847
|
+
}, delay);
|
|
1848
|
+
};
|
|
1849
|
+
}
|
|
1850
|
+
|
|
1851
|
+
|
|
1852
|
+
/***/ }),
|
|
1853
|
+
|
|
1854
|
+
/***/ 701:
|
|
1855
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
1856
|
+
|
|
1857
|
+
|
|
1858
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1859
|
+
exports.createOverlayRectangle = createOverlayRectangle;
|
|
1860
|
+
const intersection_observer_1 = __webpack_require__(979);
|
|
1861
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
1862
|
+
const MAX_Z_INDEX = `${Math.pow(2, 30) - 1}`;
|
|
1863
|
+
// Set up intersection observer
|
|
1864
|
+
const observerManager = intersection_observer_1.IntersectionObserverManager.getInstance();
|
|
1865
|
+
function createLabelDiv() {
|
|
1866
|
+
const labelDiv = (0, visual_utils_1.createVisualizerElement)('div');
|
|
1867
|
+
labelDiv.style.color = 'white';
|
|
1868
|
+
labelDiv.style.background = 'rgba(75, 192, 192, 0.8)';
|
|
1869
|
+
labelDiv.style.textShadow = 'none';
|
|
1870
|
+
labelDiv.style.font = '9px Inter, system-ui, -apple-system, sans-serif';
|
|
1871
|
+
labelDiv.style.padding = '2px 6px';
|
|
1872
|
+
labelDiv.style.borderRadius = '2px';
|
|
1873
|
+
labelDiv.style.whiteSpace = 'nowrap'; // Force single-line text
|
|
1874
|
+
labelDiv.style.position = 'absolute'; // Allows positioning above parent
|
|
1875
|
+
labelDiv.style.bottom = '100%'; // Places it just above the parent
|
|
1876
|
+
labelDiv.style.left = '0'; // Align left with parent
|
|
1877
|
+
labelDiv.style.marginBottom = '2px'; // Small space between label and parent
|
|
1878
|
+
labelDiv.style.display = 'none';
|
|
1879
|
+
labelDiv.style.zIndex = MAX_Z_INDEX;
|
|
1880
|
+
return labelDiv;
|
|
1881
|
+
}
|
|
1882
|
+
const labelDiv = createLabelDiv();
|
|
1883
|
+
function createOverlayRectangle(elementId, info, container, setSelectedId, setUnSelectedId, setClickedId, zIndex) {
|
|
1884
|
+
var _a, _b;
|
|
1885
|
+
const rect = info.boundingRect;
|
|
1886
|
+
if (!rect)
|
|
1887
|
+
return null;
|
|
1888
|
+
const div = (0, visual_utils_1.createVisualizerElement)('div');
|
|
1889
|
+
div.style.position = 'absolute';
|
|
1890
|
+
div.style.width = `${rect.width}px`;
|
|
1891
|
+
div.style.height = `${rect.height}px`;
|
|
1892
|
+
div.style.top = `${rect.top + rect.scrollTop}px`;
|
|
1893
|
+
div.style.left = `${rect.left + rect.scrollLeft}px`;
|
|
1894
|
+
div.style.border = '1px dotted rgba(75, 192, 192, 0.8)';
|
|
1895
|
+
div.style.borderRadius = '1px';
|
|
1896
|
+
div.style.zIndex = zIndex.toString();
|
|
1897
|
+
const componentStack = (_a = info.componentStack) !== null && _a !== void 0 ? _a : [];
|
|
1898
|
+
const componentName = (_b = componentStack[0]) !== null && _b !== void 0 ? _b : '';
|
|
1899
|
+
let pinned = false;
|
|
1900
|
+
let selected = false;
|
|
1901
|
+
const divRef = new WeakRef(div);
|
|
1902
|
+
(0, visual_utils_1.addTrackedListener)(divRef, 'mouseover', () => {
|
|
1903
|
+
var _a;
|
|
1904
|
+
// note that elementIdStr should not be genearated in the
|
|
1905
|
+
// inside the function scope of createOverlayRectangle
|
|
1906
|
+
// to avoid unnecessary retainer path in the heap snapshot
|
|
1907
|
+
const elementIdStr = `memory-id-${elementId}@`;
|
|
1908
|
+
labelDiv.remove();
|
|
1909
|
+
(_a = divRef.deref()) === null || _a === void 0 ? void 0 : _a.appendChild(labelDiv);
|
|
1910
|
+
labelDiv.textContent = `${componentName} (${elementIdStr})`;
|
|
1911
|
+
labelDiv.style.display = 'inline-block';
|
|
1912
|
+
setSelectedId(elementId);
|
|
1913
|
+
});
|
|
1914
|
+
(0, visual_utils_1.addTrackedListener)(divRef, 'mouseout', () => {
|
|
1915
|
+
labelDiv.style.display = 'none';
|
|
1916
|
+
labelDiv.remove();
|
|
1917
|
+
setUnSelectedId(elementId);
|
|
1918
|
+
});
|
|
1919
|
+
(0, visual_utils_1.addTrackedListener)(divRef, 'click', () => {
|
|
1920
|
+
setClickedId(elementId);
|
|
1921
|
+
});
|
|
1922
|
+
div.__selected = () => {
|
|
1923
|
+
selected = true;
|
|
1924
|
+
styleOnInteraction(divRef, { selected, pinned });
|
|
1925
|
+
};
|
|
1926
|
+
div.__unselected = () => {
|
|
1927
|
+
selected = false;
|
|
1928
|
+
styleOnInteraction(divRef, { selected, pinned });
|
|
1929
|
+
};
|
|
1930
|
+
div.__pinned = () => {
|
|
1931
|
+
pinned = true;
|
|
1932
|
+
styleOnInteraction(divRef, { selected, pinned });
|
|
1933
|
+
};
|
|
1934
|
+
div.__unpinned = () => {
|
|
1935
|
+
pinned = false;
|
|
1936
|
+
styleOnInteraction(divRef, { selected, pinned });
|
|
1937
|
+
};
|
|
1938
|
+
observerManager.observe(divRef, (entry) => {
|
|
1939
|
+
if (!entry.isIntersecting) {
|
|
1940
|
+
div.style.visibility = 'hidden';
|
|
1941
|
+
}
|
|
1942
|
+
else {
|
|
1943
|
+
div.style.visibility = 'visible';
|
|
1944
|
+
}
|
|
1945
|
+
});
|
|
1946
|
+
div.__cleanup = () => {
|
|
1947
|
+
const div = divRef.deref();
|
|
1948
|
+
if (div == null) {
|
|
1949
|
+
return;
|
|
1950
|
+
}
|
|
1951
|
+
(0, visual_utils_1.removeAllListeners)(divRef);
|
|
1952
|
+
observerManager.unobserve(divRef);
|
|
1953
|
+
div.__cleanup = null;
|
|
1954
|
+
div.__selected = null;
|
|
1955
|
+
div.__unselected = null;
|
|
1956
|
+
div.__pinned = null;
|
|
1957
|
+
div.__unpinned = null;
|
|
1958
|
+
};
|
|
1959
|
+
container.appendChild(div);
|
|
1960
|
+
return divRef;
|
|
1961
|
+
}
|
|
1962
|
+
function styleOnInteraction(divRef, state) {
|
|
1963
|
+
const div = divRef.deref();
|
|
1964
|
+
if (div == null) {
|
|
1965
|
+
return;
|
|
1966
|
+
}
|
|
1967
|
+
const { pinned, selected } = state;
|
|
1968
|
+
if (!pinned) {
|
|
1969
|
+
if (selected) {
|
|
1970
|
+
div.style.border = '1px solid rgba(75, 192, 192, 0.8)';
|
|
1971
|
+
div.style.background = 'rgba(75, 192, 192, 0.02)';
|
|
1972
|
+
}
|
|
1973
|
+
else {
|
|
1974
|
+
div.style.border = '1px dotted rgba(75, 192, 192, 0.8)';
|
|
1975
|
+
div.style.background = '';
|
|
1976
|
+
}
|
|
1977
|
+
}
|
|
1978
|
+
else {
|
|
1979
|
+
// pinned
|
|
1980
|
+
div.style.border = '1px solid rgba(255, 215, 0, 0.9)';
|
|
1981
|
+
div.style.background = 'rgba(255, 215, 0, 0.08)';
|
|
1982
|
+
}
|
|
1983
|
+
}
|
|
1984
|
+
|
|
1985
|
+
|
|
1986
|
+
/***/ }),
|
|
1987
|
+
|
|
1988
|
+
/***/ 737:
|
|
1989
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
1993
|
+
exports.traverseFiber = exports.getTopMostFiberWithChild = exports.getTopMostHostFiber = exports.getNearestHostFiber = exports.isHostFiber = exports.MutationMask = exports.Visibility = exports.Snapshot = exports.Ref = exports.ContentReset = exports.ChildDeletion = exports.Cloned = exports.Update = exports.Hydrating = exports.DidCapture = exports.Placement = exports.PerformedWork = exports.DEPRECATED_ASYNC_MODE_SYMBOL_STRING = exports.CONCURRENT_MODE_SYMBOL_STRING = exports.CONCURRENT_MODE_NUMBER = exports.HostRoot = exports.OffscreenComponent = exports.LegacyHiddenComponent = exports.Fragment = exports.HostText = exports.DehydratedSuspenseComponent = exports.HostSingletonTag = exports.HostHoistableTag = exports.HostComponentTag = exports.SimpleMemoComponentTag = exports.MemoComponentTag = exports.ForwardRefTag = exports.OffscreenComponentTag = exports.SuspenseComponentTag = exports.ContextConsumerTag = exports.FunctionComponentTag = exports.ClassComponentTag = void 0;
|
|
1994
|
+
exports.getFiberNodeFromElement = getFiberNodeFromElement;
|
|
1995
|
+
exports.getReactComponentStack = getReactComponentStack;
|
|
1996
|
+
exports.getDisplayNameOfFiberNode = getDisplayNameOfFiberNode;
|
|
1997
|
+
exports.isFunctionalComponent = isFunctionalComponent;
|
|
1998
|
+
exports.extractReactComponentName = extractReactComponentName;
|
|
1999
|
+
const utils_1 = __webpack_require__(476);
|
|
2000
|
+
const valid_component_name_1 = __webpack_require__(847);
|
|
2001
|
+
exports.ClassComponentTag = 1;
|
|
2002
|
+
exports.FunctionComponentTag = 0;
|
|
2003
|
+
exports.ContextConsumerTag = 9;
|
|
2004
|
+
exports.SuspenseComponentTag = 13;
|
|
2005
|
+
exports.OffscreenComponentTag = 22;
|
|
2006
|
+
exports.ForwardRefTag = 11;
|
|
2007
|
+
exports.MemoComponentTag = 14;
|
|
2008
|
+
exports.SimpleMemoComponentTag = 15;
|
|
2009
|
+
exports.HostComponentTag = 5;
|
|
2010
|
+
exports.HostHoistableTag = 26;
|
|
2011
|
+
exports.HostSingletonTag = 27;
|
|
2012
|
+
exports.DehydratedSuspenseComponent = 18;
|
|
2013
|
+
exports.HostText = 6;
|
|
2014
|
+
exports.Fragment = 7;
|
|
2015
|
+
exports.LegacyHiddenComponent = 23;
|
|
2016
|
+
exports.OffscreenComponent = 22;
|
|
2017
|
+
exports.HostRoot = 3;
|
|
2018
|
+
exports.CONCURRENT_MODE_NUMBER = 0xeacf;
|
|
2019
|
+
exports.CONCURRENT_MODE_SYMBOL_STRING = 'Symbol(react.concurrent_mode)';
|
|
2020
|
+
exports.DEPRECATED_ASYNC_MODE_SYMBOL_STRING = 'Symbol(react.async_mode)';
|
|
2021
|
+
// https://github.com/facebook/react/blob/main/packages/react-reconciler/src/ReactFiberFlags.js
|
|
2022
|
+
exports.PerformedWork = 0b1;
|
|
2023
|
+
exports.Placement = 0b10;
|
|
2024
|
+
exports.DidCapture = 0b10000000;
|
|
2025
|
+
exports.Hydrating = 0b1000000000000;
|
|
2026
|
+
exports.Update = 0b100;
|
|
2027
|
+
exports.Cloned = 0b1000;
|
|
2028
|
+
exports.ChildDeletion = 0b10000;
|
|
2029
|
+
exports.ContentReset = 0b100000;
|
|
2030
|
+
exports.Ref = 0b1000000000;
|
|
2031
|
+
exports.Snapshot = 0b10000000000;
|
|
2032
|
+
exports.Visibility = 0b10000000000000;
|
|
2033
|
+
exports.MutationMask = exports.Placement |
|
|
2034
|
+
exports.Update |
|
|
2035
|
+
exports.ChildDeletion |
|
|
2036
|
+
exports.ContentReset |
|
|
2037
|
+
exports.Hydrating |
|
|
2038
|
+
exports.Visibility |
|
|
2039
|
+
exports.Snapshot;
|
|
2040
|
+
/**
|
|
2041
|
+
* @see https://reactnative.dev/architecture/glossary#host-view-tree-and-host-view
|
|
2042
|
+
*/
|
|
2043
|
+
const isHostFiber = (fiber) => fiber.tag === exports.HostComponentTag ||
|
|
2044
|
+
// @ts-expect-error: it exists
|
|
2045
|
+
fiber.tag === exports.HostHoistableTag ||
|
|
2046
|
+
// @ts-expect-error: it exists
|
|
2047
|
+
fiber.tag === exports.HostSingletonTag ||
|
|
2048
|
+
typeof fiber.type === 'string';
|
|
2049
|
+
exports.isHostFiber = isHostFiber;
|
|
2050
|
+
const getNearestHostFiber = (fiber) => {
|
|
2051
|
+
let hostFiber = (0, exports.traverseFiber)(fiber, exports.isHostFiber);
|
|
2052
|
+
if (!hostFiber) {
|
|
2053
|
+
hostFiber = (0, exports.traverseFiber)(fiber, exports.isHostFiber, true);
|
|
2054
|
+
}
|
|
2055
|
+
return hostFiber;
|
|
2056
|
+
};
|
|
2057
|
+
exports.getNearestHostFiber = getNearestHostFiber;
|
|
2058
|
+
const getTopMostHostFiber = (fiber) => {
|
|
2059
|
+
let topMostHostFiber = null;
|
|
2060
|
+
function checkFiber(fiber) {
|
|
2061
|
+
if ((0, exports.isHostFiber)(fiber)) {
|
|
2062
|
+
topMostHostFiber = fiber;
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2065
|
+
(0, exports.traverseFiber)(fiber, checkFiber, true);
|
|
2066
|
+
return topMostHostFiber;
|
|
2067
|
+
};
|
|
2068
|
+
exports.getTopMostHostFiber = getTopMostHostFiber;
|
|
2069
|
+
const getTopMostFiberWithChild = (fiber) => {
|
|
2070
|
+
let topMostFiber = null;
|
|
2071
|
+
function checkFiber(fiber) {
|
|
2072
|
+
if (fiber.child != null) {
|
|
2073
|
+
topMostFiber = fiber;
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
(0, exports.traverseFiber)(fiber, checkFiber, true);
|
|
2077
|
+
return topMostFiber;
|
|
2078
|
+
};
|
|
2079
|
+
exports.getTopMostFiberWithChild = getTopMostFiberWithChild;
|
|
2080
|
+
const traverseFiber = (fiber, selector, ascending = false) => {
|
|
2081
|
+
if (!fiber) {
|
|
2082
|
+
return null;
|
|
2083
|
+
}
|
|
2084
|
+
if (selector(fiber) === true) {
|
|
2085
|
+
return fiber;
|
|
2086
|
+
}
|
|
2087
|
+
let next = ascending ? fiber.return : fiber.child;
|
|
2088
|
+
while (next) {
|
|
2089
|
+
const match = (0, exports.traverseFiber)(next, selector, ascending);
|
|
2090
|
+
if (match) {
|
|
2091
|
+
return match;
|
|
2092
|
+
}
|
|
2093
|
+
next = ascending ? null : next.sibling;
|
|
2094
|
+
}
|
|
2095
|
+
return null;
|
|
2096
|
+
};
|
|
2097
|
+
exports.traverseFiber = traverseFiber;
|
|
2098
|
+
// React internal property keys
|
|
2099
|
+
const internalKeys = [
|
|
2100
|
+
'__reactFiber$', // React 17+
|
|
2101
|
+
'__reactInternalInstance$', // React 16
|
|
2102
|
+
'_reactRootContainer', // React Root
|
|
2103
|
+
];
|
|
2104
|
+
const getOwnPropertyNames = Object.getOwnPropertyNames.bind(Object);
|
|
2105
|
+
function getFiberNodeFromElement(element) {
|
|
2106
|
+
for (const prefix of internalKeys) {
|
|
2107
|
+
// Use Object.keys only as fallback since it's slower
|
|
2108
|
+
const key = getOwnPropertyNames(element).find(k => k.startsWith(prefix));
|
|
2109
|
+
if (key) {
|
|
2110
|
+
return element[key];
|
|
2111
|
+
}
|
|
2112
|
+
}
|
|
2113
|
+
return null;
|
|
2114
|
+
}
|
|
2115
|
+
function getReactComponentStack(node) {
|
|
2116
|
+
const stack = [];
|
|
2117
|
+
const visited = new Set();
|
|
2118
|
+
let fiber = node;
|
|
2119
|
+
while (fiber) {
|
|
2120
|
+
if (visited.has(fiber)) {
|
|
2121
|
+
break;
|
|
2122
|
+
}
|
|
2123
|
+
visited.add(fiber);
|
|
2124
|
+
const name = getDisplayNameOfFiberNode(fiber);
|
|
2125
|
+
if (name) {
|
|
2126
|
+
stack.push(name);
|
|
2127
|
+
}
|
|
2128
|
+
fiber = fiber.return;
|
|
2129
|
+
}
|
|
2130
|
+
return stack;
|
|
2131
|
+
}
|
|
2132
|
+
function getDisplayNameOfFiberNode(node) {
|
|
2133
|
+
var _a, _b, _c, _d;
|
|
2134
|
+
const elementType = (_a = node.type) !== null && _a !== void 0 ? _a : node.elementType;
|
|
2135
|
+
// Try to get name from displayName or name properties
|
|
2136
|
+
let displayName = (_b = elementType === null || elementType === void 0 ? void 0 : elementType.displayName) !== null && _b !== void 0 ? _b : elementType === null || elementType === void 0 ? void 0 : elementType.name;
|
|
2137
|
+
// Handle class components and forwardRef
|
|
2138
|
+
if (displayName == null) {
|
|
2139
|
+
if (elementType === null || elementType === void 0 ? void 0 : elementType.render) {
|
|
2140
|
+
// Class components
|
|
2141
|
+
const render = elementType === null || elementType === void 0 ? void 0 : elementType.render;
|
|
2142
|
+
displayName = (_c = render === null || render === void 0 ? void 0 : render.displayName) !== null && _c !== void 0 ? _c : render === null || render === void 0 ? void 0 : render.name;
|
|
2143
|
+
}
|
|
2144
|
+
else if (elementType === null || elementType === void 0 ? void 0 : elementType.type) {
|
|
2145
|
+
// ForwardRef components
|
|
2146
|
+
displayName = (_d = elementType.type.displayName) !== null && _d !== void 0 ? _d : elementType.type.name;
|
|
2147
|
+
}
|
|
2148
|
+
}
|
|
2149
|
+
// Handle anonymous functions
|
|
2150
|
+
if (!displayName && typeof elementType === 'function') {
|
|
2151
|
+
displayName = elementType.name;
|
|
2152
|
+
}
|
|
2153
|
+
const ret = (0, utils_1.getMeaningfulName)(extractReactComponentName(displayName));
|
|
2154
|
+
return (0, valid_component_name_1.isValidComponentName)(ret) ? ret : null;
|
|
2155
|
+
}
|
|
2156
|
+
function isFunctionalComponent(node) {
|
|
2157
|
+
const elementType = node === null || node === void 0 ? void 0 : node.elementType;
|
|
2158
|
+
return typeof elementType === 'function';
|
|
2159
|
+
}
|
|
2160
|
+
// dom-element [from component.react] --> component.react
|
|
2161
|
+
function extractReactComponentName(displayName) {
|
|
2162
|
+
if (typeof displayName !== 'string') {
|
|
2163
|
+
return null;
|
|
2164
|
+
}
|
|
2165
|
+
if (!displayName.includes('[') || !displayName.includes(']')) {
|
|
2166
|
+
return displayName;
|
|
2167
|
+
}
|
|
2168
|
+
const startIndex = displayName.indexOf('[');
|
|
2169
|
+
const endIndex = displayName.indexOf(']');
|
|
2170
|
+
if (startIndex > endIndex) {
|
|
2171
|
+
return displayName;
|
|
2172
|
+
}
|
|
2173
|
+
const name = displayName.substring(startIndex + 1, endIndex);
|
|
2174
|
+
if (name.startsWith('from ')) {
|
|
2175
|
+
return name.substring('from '.length);
|
|
2176
|
+
}
|
|
2177
|
+
return name;
|
|
2178
|
+
}
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
/***/ }),
|
|
2182
|
+
|
|
2183
|
+
/***/ 775:
|
|
2184
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
2185
|
+
|
|
2186
|
+
|
|
2187
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2188
|
+
exports.createStatusText = createStatusText;
|
|
2189
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
2190
|
+
function formatBytes(bytes) {
|
|
2191
|
+
if (bytes === 0)
|
|
2192
|
+
return '0 B';
|
|
2193
|
+
const k = 1024;
|
|
2194
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
2195
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
2196
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
2197
|
+
}
|
|
2198
|
+
function createStatusText(registerDataUpdateCallback) {
|
|
2199
|
+
const statusWidget = (0, visual_utils_1.createVisualizerElement)('div');
|
|
2200
|
+
statusWidget.style.marginLeft = '10px';
|
|
2201
|
+
statusWidget.style.color = 'white';
|
|
2202
|
+
statusWidget.style.fontSize = '10px';
|
|
2203
|
+
statusWidget.style.fontFamily = 'Inter, system-ui, sans-serif';
|
|
2204
|
+
statusWidget.style.overflow = 'hidden';
|
|
2205
|
+
statusWidget.style.whiteSpace = 'nowrap';
|
|
2206
|
+
statusWidget.style.textOverflow = 'ellipsis';
|
|
2207
|
+
statusWidget.textContent = '';
|
|
2208
|
+
registerDataUpdateCallback((data) => {
|
|
2209
|
+
var _a, _b, _c, _d;
|
|
2210
|
+
const performance = window.performance;
|
|
2211
|
+
const memory = performance === null || performance === void 0 ? void 0 : performance.memory;
|
|
2212
|
+
const usedHeap = (_a = memory === null || memory === void 0 ? void 0 : memory.usedJSHeapSize) !== null && _a !== void 0 ? _a : 0;
|
|
2213
|
+
const totalHeap = (_b = memory === null || memory === void 0 ? void 0 : memory.totalJSHeapSize) !== null && _b !== void 0 ? _b : 0;
|
|
2214
|
+
const totalElements = (_c = data.totalDOMElementsCount) !== null && _c !== void 0 ? _c : 0;
|
|
2215
|
+
const detachedElements = (_d = data.detachedDOMElementsCount) !== null && _d !== void 0 ? _d : 0;
|
|
2216
|
+
statusWidget.textContent =
|
|
2217
|
+
`DOM: ${totalElements} total, ${detachedElements} detached | ` +
|
|
2218
|
+
`Heap: ${formatBytes(usedHeap)} / ${formatBytes(totalHeap)}`;
|
|
2219
|
+
});
|
|
2220
|
+
return statusWidget;
|
|
2221
|
+
}
|
|
2222
|
+
|
|
2223
|
+
|
|
2224
|
+
/***/ }),
|
|
2225
|
+
|
|
2226
|
+
/***/ 847:
|
|
2227
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
2228
|
+
|
|
2229
|
+
|
|
2230
|
+
/**
|
|
2231
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2232
|
+
*
|
|
2233
|
+
* This source code is licensed under the MIT license found in the
|
|
2234
|
+
* LICENSE file in the root directory of this source tree.
|
|
2235
|
+
*
|
|
2236
|
+
* @format
|
|
2237
|
+
* @oncall memory_lab
|
|
2238
|
+
*/
|
|
2239
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2240
|
+
exports.isValidComponentName = isValidComponentName;
|
|
2241
|
+
const displayNameBlockList = new Set();
|
|
2242
|
+
function isValidComponentName(name) {
|
|
2243
|
+
return name != null && !displayNameBlockList.has(name);
|
|
2244
|
+
}
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
/***/ }),
|
|
2248
|
+
|
|
2249
|
+
/***/ 860:
|
|
2250
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
2251
|
+
|
|
2252
|
+
|
|
2253
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2254
|
+
exports.BasicExtension = void 0;
|
|
2255
|
+
/**
|
|
2256
|
+
* Base class for React Memory Scanner extensions.
|
|
2257
|
+
* Extensions can hook into the scanning process before and after analysis.
|
|
2258
|
+
*/
|
|
2259
|
+
class BasicExtension {
|
|
2260
|
+
constructor(scanner) {
|
|
2261
|
+
this.scanner = scanner;
|
|
2262
|
+
}
|
|
2263
|
+
/**
|
|
2264
|
+
* Hook that runs before the memory scan starts.
|
|
2265
|
+
* Override this method to perform any setup or pre-scan operations.
|
|
2266
|
+
*/
|
|
2267
|
+
beforeScan() {
|
|
2268
|
+
// to be overridden
|
|
2269
|
+
}
|
|
2270
|
+
/**
|
|
2271
|
+
* Hook that runs after the memory scan completes.
|
|
2272
|
+
* Override this method to process or modify the analysis results.
|
|
2273
|
+
* @param analysisResult - The results from the memory scan
|
|
2274
|
+
*/
|
|
2275
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2276
|
+
afterScan(_analysisResult) {
|
|
2277
|
+
// to be overridden
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
exports.BasicExtension = BasicExtension;
|
|
2281
|
+
|
|
2282
|
+
|
|
2283
|
+
/***/ }),
|
|
2284
|
+
|
|
2285
|
+
/***/ 904:
|
|
2286
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
2287
|
+
|
|
2288
|
+
|
|
2289
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2290
|
+
exports.createComponentStackPanel = createComponentStackPanel;
|
|
2291
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
2292
|
+
function createComponentStackPanel(registerDataUpdateCallback) {
|
|
2293
|
+
const panel = (0, visual_utils_1.createVisualizerElement)('div');
|
|
2294
|
+
panel.style.width = '100%';
|
|
2295
|
+
// Ensure max height is at most 80% of viewport height
|
|
2296
|
+
panel.style.maxHeight = '80vh';
|
|
2297
|
+
panel.style.background = 'rgba(0, 0, 0, 0.5)';
|
|
2298
|
+
panel.style.borderTop = '1px solid rgba(255, 255, 255, 0.1)';
|
|
2299
|
+
panel.style.display = 'none';
|
|
2300
|
+
panel.style.flexDirection = 'column';
|
|
2301
|
+
panel.style.padding = '8px';
|
|
2302
|
+
panel.style.boxSizing = 'border-box';
|
|
2303
|
+
panel.style.borderRadius = '8px';
|
|
2304
|
+
panel.style.overflowY = 'scroll';
|
|
2305
|
+
panel.style.overflowX = 'hidden';
|
|
2306
|
+
panel.style.textShadow = 'none';
|
|
2307
|
+
panel.style.font = '9px Inter, system-ui, -apple-system, sans-serif';
|
|
2308
|
+
panel.style.color = 'white';
|
|
2309
|
+
panel.id = 'memory-visualization-component-stack-panel';
|
|
2310
|
+
let pinned = false;
|
|
2311
|
+
panel.addEventListener('mouseenter', () => {
|
|
2312
|
+
pinned = true;
|
|
2313
|
+
});
|
|
2314
|
+
panel.addEventListener('mouseleave', () => {
|
|
2315
|
+
pinned = false;
|
|
2316
|
+
});
|
|
2317
|
+
// Register data update callback to update component stack panel
|
|
2318
|
+
registerDataUpdateCallback((0, visual_utils_1.debounce)((data) => {
|
|
2319
|
+
var _a;
|
|
2320
|
+
if (pinned) {
|
|
2321
|
+
return;
|
|
2322
|
+
}
|
|
2323
|
+
panel.style.display = data.selectedElementId != null ? 'flex' : 'none';
|
|
2324
|
+
panel.innerHTML = '';
|
|
2325
|
+
if (data.selectedElementId == null ||
|
|
2326
|
+
!((_a = data.selectedReactComponentStack) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
2327
|
+
return;
|
|
2328
|
+
}
|
|
2329
|
+
const title = (0, visual_utils_1.createVisualizerElement)('div');
|
|
2330
|
+
title.textContent = 'Component Stack:';
|
|
2331
|
+
title.style.fontWeight = 'bold';
|
|
2332
|
+
title.style.marginBottom = '8px';
|
|
2333
|
+
panel.appendChild(title);
|
|
2334
|
+
let actualComponentStackLength = 0;
|
|
2335
|
+
data.selectedReactComponentStack.forEach((component) => {
|
|
2336
|
+
const componentDiv = (0, visual_utils_1.createVisualizerElement)('div');
|
|
2337
|
+
componentDiv.style.marginBottom = '4px';
|
|
2338
|
+
componentDiv.textContent = component;
|
|
2339
|
+
panel.appendChild(componentDiv);
|
|
2340
|
+
++actualComponentStackLength;
|
|
2341
|
+
});
|
|
2342
|
+
if (actualComponentStackLength === 0) {
|
|
2343
|
+
title.remove();
|
|
2344
|
+
}
|
|
2345
|
+
}, 1));
|
|
2346
|
+
return panel;
|
|
2347
|
+
}
|
|
2348
|
+
|
|
2349
|
+
|
|
2350
|
+
/***/ }),
|
|
2351
|
+
|
|
2352
|
+
/***/ 933:
|
|
2353
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
2354
|
+
|
|
2355
|
+
|
|
2356
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
2357
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
2358
|
+
};
|
|
2359
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2360
|
+
/**
|
|
2361
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2362
|
+
*
|
|
2363
|
+
* This source code is licensed under the MIT license found in the
|
|
2364
|
+
* LICENSE file in the root directory of this source tree.
|
|
2365
|
+
*
|
|
2366
|
+
* @format
|
|
2367
|
+
* @oncall memory_lab
|
|
2368
|
+
*/
|
|
2369
|
+
const react_memory_scan_1 = __importDefault(__webpack_require__(282));
|
|
2370
|
+
const dom_visualization_extension_1 = __webpack_require__(23);
|
|
2371
|
+
const utils_1 = __webpack_require__(476);
|
|
2372
|
+
if (!(0, utils_1.hasRunInSession)()) {
|
|
2373
|
+
const memoryScan = new react_memory_scan_1.default({ isDevMode: true });
|
|
2374
|
+
const domVisualizer = new dom_visualization_extension_1.DOMVisualizationExtension(memoryScan);
|
|
2375
|
+
memoryScan.registerExtension(domVisualizer);
|
|
2376
|
+
memoryScan.start();
|
|
2377
|
+
(0, utils_1.setRunInSession)();
|
|
2378
|
+
}
|
|
2379
|
+
|
|
2380
|
+
|
|
2381
|
+
/***/ }),
|
|
2382
|
+
|
|
2383
|
+
/***/ 946:
|
|
2384
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
2385
|
+
|
|
2386
|
+
|
|
2387
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2388
|
+
exports.createToggleButton = createToggleButton;
|
|
2389
|
+
/**
|
|
2390
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2391
|
+
*
|
|
2392
|
+
* This source code is licensed under the MIT license found in the
|
|
2393
|
+
* LICENSE file in the root directory of this source tree.
|
|
2394
|
+
*
|
|
2395
|
+
* @format
|
|
2396
|
+
* @oncall memory_lab
|
|
2397
|
+
*/
|
|
2398
|
+
const visual_utils_1 = __webpack_require__(498);
|
|
2399
|
+
function createToggleButton(overlayDiv, hideAllRef) {
|
|
2400
|
+
const toggleWrapper = (0, visual_utils_1.createVisualizerElement)('div');
|
|
2401
|
+
toggleWrapper.style.width = '40px';
|
|
2402
|
+
toggleWrapper.style.height = '24px';
|
|
2403
|
+
toggleWrapper.style.borderRadius = '9999px';
|
|
2404
|
+
toggleWrapper.style.backgroundColor = '#34C759'; // ON by default
|
|
2405
|
+
toggleWrapper.style.cursor = 'pointer';
|
|
2406
|
+
toggleWrapper.style.position = 'relative';
|
|
2407
|
+
toggleWrapper.style.transition = 'background-color 0.3s ease';
|
|
2408
|
+
const knob = (0, visual_utils_1.createVisualizerElement)('div');
|
|
2409
|
+
knob.style.width = '18px';
|
|
2410
|
+
knob.style.height = '18px';
|
|
2411
|
+
knob.style.backgroundColor = 'white';
|
|
2412
|
+
knob.style.borderRadius = '50%';
|
|
2413
|
+
knob.style.position = 'absolute';
|
|
2414
|
+
knob.style.top = '3px';
|
|
2415
|
+
knob.style.left = '3px'; // ON position
|
|
2416
|
+
knob.style.transition = 'left 0.25s ease';
|
|
2417
|
+
toggleWrapper.appendChild(knob);
|
|
2418
|
+
toggleWrapper.addEventListener('click', () => {
|
|
2419
|
+
hideAllRef.value = !hideAllRef.value;
|
|
2420
|
+
if (hideAllRef.value) {
|
|
2421
|
+
// OFF state
|
|
2422
|
+
overlayDiv.style.display = 'none';
|
|
2423
|
+
overlayDiv.style.pointerEvents = 'none';
|
|
2424
|
+
overlayDiv.style.userSelect = 'none';
|
|
2425
|
+
knob.style.left = '19px';
|
|
2426
|
+
toggleWrapper.style.backgroundColor = '#FF3B30'; // Apple red
|
|
2427
|
+
}
|
|
2428
|
+
else {
|
|
2429
|
+
// ON state
|
|
2430
|
+
overlayDiv.style.display = 'block';
|
|
2431
|
+
overlayDiv.style.pointerEvents = 'auto';
|
|
2432
|
+
overlayDiv.style.userSelect = 'auto';
|
|
2433
|
+
knob.style.left = '3px';
|
|
2434
|
+
toggleWrapper.style.backgroundColor = '#34C759'; // Apple green
|
|
2435
|
+
}
|
|
2436
|
+
});
|
|
2437
|
+
return toggleWrapper;
|
|
2438
|
+
}
|
|
2439
|
+
|
|
2440
|
+
|
|
2441
|
+
/***/ }),
|
|
2442
|
+
|
|
2443
|
+
/***/ 953:
|
|
2444
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
2445
|
+
|
|
2446
|
+
|
|
2447
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2448
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
2449
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
2450
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
2451
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
2452
|
+
};
|
|
2453
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2454
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
2455
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
2456
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
2457
|
+
};
|
|
2458
|
+
var _EventListenerTracker_instances, _EventListenerTracker_listenerMap, _EventListenerTracker_detachedListeners, _EventListenerTracker_originalAddEventListener, _EventListenerTracker_originalRemoveEventListener, _EventListenerTracker_patchEventListeners, _EventListenerTracker_unpatchEventListeners;
|
|
2459
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2460
|
+
exports.EventListenerTracker = void 0;
|
|
2461
|
+
const react_fiber_utils_1 = __webpack_require__(737);
|
|
2462
|
+
const weak_ref_utils_1 = __webpack_require__(313);
|
|
2463
|
+
class EventListenerTracker {
|
|
2464
|
+
constructor() {
|
|
2465
|
+
_EventListenerTracker_instances.add(this);
|
|
2466
|
+
_EventListenerTracker_listenerMap.set(this, void 0);
|
|
2467
|
+
_EventListenerTracker_detachedListeners.set(this, void 0);
|
|
2468
|
+
_EventListenerTracker_originalAddEventListener.set(this, void 0);
|
|
2469
|
+
_EventListenerTracker_originalRemoveEventListener.set(this, void 0);
|
|
2470
|
+
__classPrivateFieldSet(this, _EventListenerTracker_listenerMap, new weak_ref_utils_1.WeakMapPlus({ fallback: 'noop', cleanupMs: 100 }), "f");
|
|
2471
|
+
__classPrivateFieldSet(this, _EventListenerTracker_detachedListeners, new Map(), "f");
|
|
2472
|
+
__classPrivateFieldSet(this, _EventListenerTracker_originalAddEventListener, EventTarget.prototype.addEventListener, "f");
|
|
2473
|
+
__classPrivateFieldSet(this, _EventListenerTracker_originalRemoveEventListener, EventTarget.prototype.removeEventListener, "f");
|
|
2474
|
+
__classPrivateFieldGet(this, _EventListenerTracker_instances, "m", _EventListenerTracker_patchEventListeners).call(this);
|
|
2475
|
+
}
|
|
2476
|
+
static getInstance() {
|
|
2477
|
+
if (!EventListenerTracker.instance) {
|
|
2478
|
+
EventListenerTracker.instance = new EventListenerTracker();
|
|
2479
|
+
}
|
|
2480
|
+
return EventListenerTracker.instance;
|
|
2481
|
+
}
|
|
2482
|
+
addListener(el, type, cb, options) {
|
|
2483
|
+
el.addEventListener(type, cb, options);
|
|
2484
|
+
}
|
|
2485
|
+
removeListener(el, type, cb, options) {
|
|
2486
|
+
el.removeEventListener(type, cb, options);
|
|
2487
|
+
}
|
|
2488
|
+
scan(getComponentName) {
|
|
2489
|
+
const detachedListeners = new Map();
|
|
2490
|
+
for (const [el, listeners] of __classPrivateFieldGet(this, _EventListenerTracker_listenerMap, "f").entries()) {
|
|
2491
|
+
if (el instanceof Element && !el.isConnected) {
|
|
2492
|
+
for (const listener of listeners) {
|
|
2493
|
+
// Skip if the callback has been garbage collected
|
|
2494
|
+
if (!listener.cb.deref())
|
|
2495
|
+
continue;
|
|
2496
|
+
const componentName = getComponentName(new WeakRef(el));
|
|
2497
|
+
if (!detachedListeners.has(componentName)) {
|
|
2498
|
+
detachedListeners.set(componentName, []);
|
|
2499
|
+
}
|
|
2500
|
+
const groups = detachedListeners.get(componentName);
|
|
2501
|
+
let group = groups === null || groups === void 0 ? void 0 : groups.find(g => g.type === listener.type);
|
|
2502
|
+
if (!group) {
|
|
2503
|
+
group = {
|
|
2504
|
+
type: listener.type,
|
|
2505
|
+
count: 0,
|
|
2506
|
+
entries: [],
|
|
2507
|
+
};
|
|
2508
|
+
groups === null || groups === void 0 ? void 0 : groups.push(group);
|
|
2509
|
+
}
|
|
2510
|
+
group.count++;
|
|
2511
|
+
group.entries.push(new WeakRef(listener));
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
__classPrivateFieldSet(this, _EventListenerTracker_detachedListeners, detachedListeners, "f");
|
|
2516
|
+
return detachedListeners;
|
|
2517
|
+
}
|
|
2518
|
+
getDetachedListeners() {
|
|
2519
|
+
return __classPrivateFieldGet(this, _EventListenerTracker_detachedListeners, "f");
|
|
2520
|
+
}
|
|
2521
|
+
destroy() {
|
|
2522
|
+
__classPrivateFieldGet(this, _EventListenerTracker_instances, "m", _EventListenerTracker_unpatchEventListeners).call(this);
|
|
2523
|
+
__classPrivateFieldGet(this, _EventListenerTracker_listenerMap, "f").destroy();
|
|
2524
|
+
__classPrivateFieldGet(this, _EventListenerTracker_detachedListeners, "f").clear();
|
|
2525
|
+
EventListenerTracker.instance = null;
|
|
2526
|
+
}
|
|
2527
|
+
}
|
|
2528
|
+
exports.EventListenerTracker = EventListenerTracker;
|
|
2529
|
+
_EventListenerTracker_listenerMap = new WeakMap(), _EventListenerTracker_detachedListeners = new WeakMap(), _EventListenerTracker_originalAddEventListener = new WeakMap(), _EventListenerTracker_originalRemoveEventListener = new WeakMap(), _EventListenerTracker_instances = new WeakSet(), _EventListenerTracker_patchEventListeners = function _EventListenerTracker_patchEventListeners() {
|
|
2530
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
2531
|
+
const self = this;
|
|
2532
|
+
EventTarget.prototype.addEventListener = function (type, listener, options) {
|
|
2533
|
+
var _a;
|
|
2534
|
+
__classPrivateFieldGet(self, _EventListenerTracker_originalAddEventListener, "f").call(this, type, listener, options);
|
|
2535
|
+
if (this instanceof Element) {
|
|
2536
|
+
const fiber = (0, react_fiber_utils_1.getFiberNodeFromElement)(this);
|
|
2537
|
+
const entry = {
|
|
2538
|
+
type,
|
|
2539
|
+
cb: new WeakRef(listener),
|
|
2540
|
+
options,
|
|
2541
|
+
fiber: fiber ? new WeakRef(fiber) : undefined,
|
|
2542
|
+
};
|
|
2543
|
+
const listeners = (_a = __classPrivateFieldGet(self, _EventListenerTracker_listenerMap, "f").get(this)) !== null && _a !== void 0 ? _a : [];
|
|
2544
|
+
listeners.push(entry);
|
|
2545
|
+
__classPrivateFieldGet(self, _EventListenerTracker_listenerMap, "f").set(this, listeners);
|
|
2546
|
+
}
|
|
2547
|
+
};
|
|
2548
|
+
EventTarget.prototype.removeEventListener = function (type, listener, options) {
|
|
2549
|
+
__classPrivateFieldGet(self, _EventListenerTracker_originalRemoveEventListener, "f").call(this, type, listener, options);
|
|
2550
|
+
if (this instanceof Element) {
|
|
2551
|
+
const listeners = __classPrivateFieldGet(self, _EventListenerTracker_listenerMap, "f").get(this);
|
|
2552
|
+
if (listeners) {
|
|
2553
|
+
const index = listeners.findIndex(entry => entry.type === type &&
|
|
2554
|
+
entry.cb.deref() === listener &&
|
|
2555
|
+
entry.options === options);
|
|
2556
|
+
if (index !== -1) {
|
|
2557
|
+
listeners.splice(index, 1);
|
|
2558
|
+
}
|
|
2559
|
+
if (listeners.length === 0) {
|
|
2560
|
+
__classPrivateFieldGet(self, _EventListenerTracker_listenerMap, "f").delete(this);
|
|
2561
|
+
}
|
|
2562
|
+
else {
|
|
2563
|
+
__classPrivateFieldGet(self, _EventListenerTracker_listenerMap, "f").set(this, listeners);
|
|
2564
|
+
}
|
|
2565
|
+
}
|
|
2566
|
+
}
|
|
2567
|
+
};
|
|
2568
|
+
}, _EventListenerTracker_unpatchEventListeners = function _EventListenerTracker_unpatchEventListeners() {
|
|
2569
|
+
EventTarget.prototype.addEventListener = __classPrivateFieldGet(this, _EventListenerTracker_originalAddEventListener, "f");
|
|
2570
|
+
EventTarget.prototype.removeEventListener =
|
|
2571
|
+
__classPrivateFieldGet(this, _EventListenerTracker_originalRemoveEventListener, "f");
|
|
2572
|
+
};
|
|
2573
|
+
EventListenerTracker.instance = null;
|
|
2574
|
+
|
|
2575
|
+
|
|
2576
|
+
/***/ }),
|
|
2577
|
+
|
|
2578
|
+
/***/ 979:
|
|
2579
|
+
/***/ ((__unused_webpack_module, exports) => {
|
|
2580
|
+
|
|
2581
|
+
|
|
2582
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
2583
|
+
exports.IntersectionObserverManager = void 0;
|
|
2584
|
+
/**
|
|
2585
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2586
|
+
*
|
|
2587
|
+
* This source code is licensed under the MIT license found in the
|
|
2588
|
+
* LICENSE file in the root directory of this source tree.
|
|
2589
|
+
*
|
|
2590
|
+
* @format
|
|
2591
|
+
* @oncall memory_lab
|
|
2592
|
+
*/
|
|
2593
|
+
class IntersectionObserverManager {
|
|
2594
|
+
constructor() {
|
|
2595
|
+
this.observedElements = new Map();
|
|
2596
|
+
this.observer = new IntersectionObserver(entries => {
|
|
2597
|
+
entries.forEach((entry) => {
|
|
2598
|
+
const element = entry.target;
|
|
2599
|
+
const callback = this.observedElements.get(element);
|
|
2600
|
+
if (callback) {
|
|
2601
|
+
callback(entry);
|
|
2602
|
+
}
|
|
2603
|
+
});
|
|
2604
|
+
}, {
|
|
2605
|
+
// Only trigger when element is completely out of viewport
|
|
2606
|
+
threshold: 0,
|
|
2607
|
+
// Add some margin to trigger before element is completely out of view
|
|
2608
|
+
rootMargin: '50px',
|
|
2609
|
+
});
|
|
2610
|
+
}
|
|
2611
|
+
static getInstance() {
|
|
2612
|
+
if (!IntersectionObserverManager.instance) {
|
|
2613
|
+
IntersectionObserverManager.instance = new IntersectionObserverManager();
|
|
2614
|
+
}
|
|
2615
|
+
return IntersectionObserverManager.instance;
|
|
2616
|
+
}
|
|
2617
|
+
observe(elementRef, callback) {
|
|
2618
|
+
const element = elementRef.deref();
|
|
2619
|
+
if (element == null) {
|
|
2620
|
+
return;
|
|
2621
|
+
}
|
|
2622
|
+
this.observedElements.set(element, callback);
|
|
2623
|
+
this.observer.observe(element);
|
|
2624
|
+
}
|
|
2625
|
+
unobserve(elementRef) {
|
|
2626
|
+
const element = elementRef.deref();
|
|
2627
|
+
if (element == null) {
|
|
2628
|
+
return;
|
|
2629
|
+
}
|
|
2630
|
+
this.observedElements.delete(element);
|
|
2631
|
+
this.observer.unobserve(element);
|
|
2632
|
+
}
|
|
2633
|
+
}
|
|
2634
|
+
exports.IntersectionObserverManager = IntersectionObserverManager;
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
/***/ })
|
|
2638
|
+
|
|
2639
|
+
/******/ });
|
|
2640
|
+
/************************************************************************/
|
|
2641
|
+
/******/ // The module cache
|
|
2642
|
+
/******/ var __webpack_module_cache__ = {};
|
|
2643
|
+
/******/
|
|
2644
|
+
/******/ // The require function
|
|
2645
|
+
/******/ function __webpack_require__(moduleId) {
|
|
2646
|
+
/******/ // Check if module is in cache
|
|
2647
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
2648
|
+
/******/ if (cachedModule !== undefined) {
|
|
2649
|
+
/******/ return cachedModule.exports;
|
|
2650
|
+
/******/ }
|
|
2651
|
+
/******/ // Create a new module (and put it into the cache)
|
|
2652
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
2653
|
+
/******/ // no module.id needed
|
|
2654
|
+
/******/ // no module.loaded needed
|
|
2655
|
+
/******/ exports: {}
|
|
2656
|
+
/******/ };
|
|
2657
|
+
/******/
|
|
2658
|
+
/******/ // Execute the module function
|
|
2659
|
+
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
2660
|
+
/******/
|
|
2661
|
+
/******/ // Return the exports of the module
|
|
2662
|
+
/******/ return module.exports;
|
|
2663
|
+
/******/ }
|
|
2664
|
+
/******/
|
|
2665
|
+
/************************************************************************/
|
|
2666
|
+
/******/
|
|
2667
|
+
/******/ // startup
|
|
2668
|
+
/******/ // Load entry module and return exports
|
|
2669
|
+
/******/ // This entry module is referenced by other modules so it can't be inlined
|
|
2670
|
+
/******/ var __webpack_exports__ = __webpack_require__(933);
|
|
2671
|
+
/******/
|
|
2672
|
+
/******/ })()
|
|
2673
|
+
;
|