@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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config/config.d.ts +22 -0
  3. package/dist/core/dom-observer.d.ts +10 -0
  4. package/dist/core/event-listener-tracker.d.ts +33 -0
  5. package/dist/core/react-fiber-analysis.d.ts +4 -0
  6. package/dist/core/react-memory-scan.d.ts +36 -0
  7. package/{src/core/types.ts → dist/core/types.d.ts} +56 -80
  8. package/{src/index.ts → dist/core/valid-component-name.d.ts} +2 -7
  9. package/dist/extensions/basic-extension.d.ts +30 -0
  10. package/dist/extensions/dom-visualization-extension.d.ts +17 -0
  11. package/dist/index.d.ts +1 -0
  12. package/dist/memlens.lib.bundle.js +1695 -0
  13. package/dist/memlens.lib.bundle.min.js +1 -0
  14. package/dist/memlens.lib.d.ts +12 -0
  15. package/dist/memlens.run.bundle.js +2673 -0
  16. package/dist/memlens.run.bundle.min.js +1 -0
  17. package/dist/memlens.run.d.ts +1 -0
  18. package/dist/tests/bundle/lib.bundle.test.d.ts +1 -0
  19. package/dist/tests/bundle/run.bundle.start.head.test.d.ts +1 -0
  20. package/dist/tests/bundle/run.bundle.start.test.d.ts +1 -0
  21. package/dist/tests/bundle/run.bundle.test.d.ts +1 -0
  22. package/dist/tests/fiber/dev.fiber.complex.dev.test.d.ts +1 -0
  23. package/dist/tests/fiber/dev.fiber.complex.list.dev.test.d.ts +1 -0
  24. package/dist/tests/fiber/dev.fiber.complex.prod.test.d.ts +1 -0
  25. package/dist/tests/fiber/dev.fiber.name.dev.test.d.ts +1 -0
  26. package/dist/tests/fiber/dev.fiber.name.prod.test.d.ts +1 -0
  27. package/dist/tests/utils/test-utils.d.ts +11 -0
  28. package/dist/utils/intersection-observer.d.ts +18 -0
  29. package/dist/utils/react-fiber-utils.d.ts +56 -0
  30. package/dist/utils/utils.d.ts +26 -0
  31. package/dist/utils/weak-ref-utils.d.ts +67 -0
  32. package/dist/visual/components/component-stack-panel.d.ts +11 -0
  33. package/dist/visual/components/control-widget.d.ts +13 -0
  34. package/dist/visual/components/overlay-rectangle.d.ts +11 -0
  35. package/dist/visual/components/status-text.d.ts +2 -0
  36. package/dist/visual/components/toggle-button.d.ts +3 -0
  37. package/dist/visual/components/visual-overlay.d.ts +1 -0
  38. package/dist/visual/dom-element-visualizer-interactive.d.ts +26 -0
  39. package/{src/core/valid-component-name.ts → dist/visual/dom-element-visualizer.d.ts} +5 -7
  40. package/dist/visual/visual-utils.d.ts +16 -0
  41. package/package.json +5 -1
  42. package/explainer.md +0 -54
  43. package/playwright.config.ts +0 -21
  44. package/src/config/config.ts +0 -32
  45. package/src/core/dom-observer.ts +0 -189
  46. package/src/core/event-listener-tracker.ts +0 -171
  47. package/src/core/react-fiber-analysis.ts +0 -123
  48. package/src/core/react-memory-scan.ts +0 -366
  49. package/src/extensions/basic-extension.ts +0 -41
  50. package/src/extensions/dom-visualization-extension.ts +0 -42
  51. package/src/memlens.lib.js.flow +0 -75
  52. package/src/memlens.lib.ts +0 -22
  53. package/src/memlens.run.ts +0 -21
  54. package/src/tests/bundle/lib.bundle.test.ts +0 -31
  55. package/src/tests/bundle/run.bundle.start.head.test.ts +0 -48
  56. package/src/tests/bundle/run.bundle.start.test.ts +0 -48
  57. package/src/tests/bundle/run.bundle.test.ts +0 -51
  58. package/src/tests/fiber/dev.fiber.complex.dev.test.ts +0 -92
  59. package/src/tests/fiber/dev.fiber.complex.list.dev.test.ts +0 -118
  60. package/src/tests/fiber/dev.fiber.complex.prod.test.ts +0 -92
  61. package/src/tests/fiber/dev.fiber.name.dev.test.ts +0 -77
  62. package/src/tests/fiber/dev.fiber.name.prod.test.ts +0 -79
  63. package/src/tests/lib/babel.prod.js +0 -4
  64. package/src/tests/lib/react-dom-v18.dev.js +0 -29926
  65. package/src/tests/lib/react-dom-v18.prod.js +0 -269
  66. package/src/tests/lib/react-v18.dev.js +0 -3345
  67. package/src/tests/lib/react-v18.prod.js +0 -33
  68. package/src/tests/manual/playwright-open-manual.js +0 -40
  69. package/src/tests/manual/todo-list/todo-with-run.bundle.html +0 -80
  70. package/src/tests/utils/test-utils.ts +0 -28
  71. package/src/utils/intersection-observer.ts +0 -65
  72. package/src/utils/react-fiber-utils.ts +0 -212
  73. package/src/utils/utils.ts +0 -201
  74. package/src/utils/weak-ref-utils.ts +0 -308
  75. package/src/visual/components/component-stack-panel.ts +0 -85
  76. package/src/visual/components/control-widget.ts +0 -96
  77. package/src/visual/components/overlay-rectangle.ts +0 -167
  78. package/src/visual/components/status-text.ts +0 -53
  79. package/src/visual/components/toggle-button.ts +0 -57
  80. package/src/visual/components/visual-overlay.ts +0 -19
  81. package/src/visual/dom-element-visualizer-interactive.ts +0 -358
  82. package/src/visual/dom-element-visualizer.ts +0 -130
  83. package/src/visual/visual-utils.ts +0 -89
  84. package/tsconfig.json +0 -18
  85. 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
+ ;