bippy 0.0.25 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -3,55 +3,146 @@
3
3
  /**
4
4
  * @license bippy
5
5
  *
6
- * Copyright (c) Aiden Bai.
6
+ * Copyright (c) Aiden Bai, Million Software, Inc.
7
7
  *
8
8
  * This source code is licensed under the MIT license found in the
9
9
  * LICENSE file in the root directory of this source tree.
10
10
  */
11
11
 
12
- // src/index.ts
13
- var version = "0.0.25";
12
+ // src/rdt-hook.ts
13
+ var version = "0.1.0";
14
14
  var BIPPY_INSTRUMENTATION_STRING = `bippy-${version}`;
15
- var ClassComponentTag = 1;
15
+ var NO_OP = () => {
16
+ };
17
+ var checkDCE = (fn) => {
18
+ try {
19
+ const code = Function.prototype.toString.call(fn);
20
+ if (code.indexOf("^_^") > -1) {
21
+ setTimeout(() => {
22
+ throw new Error(
23
+ "React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build"
24
+ );
25
+ });
26
+ }
27
+ } catch {
28
+ }
29
+ };
30
+ var installRDTHook = (onActive) => {
31
+ const renderers = /* @__PURE__ */ new Map();
32
+ let i = 0;
33
+ const rdtHook = {
34
+ checkDCE,
35
+ supportsFiber: true,
36
+ supportsFlight: true,
37
+ hasUnsupportedRendererAttached: false,
38
+ renderers,
39
+ onCommitFiberRoot: NO_OP,
40
+ onCommitFiberUnmount: NO_OP,
41
+ onPostCommitFiberRoot: NO_OP,
42
+ inject(renderer) {
43
+ const nextID = ++i;
44
+ renderers.set(nextID, renderer);
45
+ if (!rdtHook._instrumentationIsActive) {
46
+ rdtHook._instrumentationIsActive = true;
47
+ onActive?.();
48
+ }
49
+ return nextID;
50
+ },
51
+ _instrumentationSource: BIPPY_INSTRUMENTATION_STRING,
52
+ _instrumentationIsActive: false
53
+ };
54
+ try {
55
+ Object.defineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
56
+ value: rdtHook
57
+ });
58
+ } catch {
59
+ }
60
+ return rdtHook;
61
+ };
62
+ var hasRDTHook = () => {
63
+ return Object.prototype.hasOwnProperty.call(
64
+ globalThis,
65
+ "__REACT_DEVTOOLS_GLOBAL_HOOK__"
66
+ );
67
+ };
68
+ var getRDTHook = (onActive) => {
69
+ let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
70
+ if (rdtHook) onActive?.();
71
+ if (!hasRDTHook()) {
72
+ rdtHook = installRDTHook(onActive);
73
+ }
74
+ return rdtHook;
75
+ };
76
+ try {
77
+ if (typeof window !== "undefined" && // @ts-expect-error `document` may not be defined in some enviroments
78
+ (window.document?.createElement || window.navigator?.product === "ReactNative") && typeof process !== "undefined" && process.versions != null && process.versions.node != null) {
79
+ installRDTHook();
80
+ }
81
+ } catch {
82
+ }
83
+
84
+ // src/core.ts
16
85
  var FunctionComponentTag = 0;
86
+ var ClassComponentTag = 1;
87
+ var HostRootTag = 3;
88
+ var HostComponentTag = 5;
89
+ var HostTextTag = 6;
90
+ var FragmentTag = 7;
17
91
  var ContextConsumerTag = 9;
18
- var SuspenseComponentTag = 13;
19
- var OffscreenComponentTag = 22;
20
92
  var ForwardRefTag = 11;
93
+ var SuspenseComponentTag = 13;
21
94
  var MemoComponentTag = 14;
22
95
  var SimpleMemoComponentTag = 15;
23
- var HostComponentTag = 5;
96
+ var DehydratedSuspenseComponentTag = 18;
97
+ var OffscreenComponentTag = 22;
98
+ var LegacyHiddenComponentTag = 23;
24
99
  var HostHoistableTag = 26;
25
100
  var HostSingletonTag = 27;
26
- var DehydratedSuspenseComponent = 18;
27
- var HostText = 6;
28
- var Fragment = 7;
29
- var LegacyHiddenComponent = 23;
30
- var OffscreenComponent = 22;
31
- var HostRoot = 3;
32
101
  var CONCURRENT_MODE_NUMBER = 60111;
102
+ var ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.element)";
103
+ var TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING = "Symbol(react.transitional.element)";
33
104
  var CONCURRENT_MODE_SYMBOL_STRING = "Symbol(react.concurrent_mode)";
34
105
  var DEPRECATED_ASYNC_MODE_SYMBOL_STRING = "Symbol(react.async_mode)";
35
106
  var PerformedWork = 1;
36
107
  var Placement = 2;
37
- var DidCapture = 128;
38
108
  var Hydrating = 4096;
39
109
  var Update = 4;
40
110
  var Cloned = 8;
41
111
  var ChildDeletion = 16;
42
112
  var ContentReset = 32;
43
- var Ref = 512;
44
113
  var Snapshot = 1024;
45
114
  var Visibility = 8192;
46
115
  var MutationMask = Placement | Update | ChildDeletion | ContentReset | Hydrating | Visibility | Snapshot;
47
116
  var isValidElement = (element) => typeof element === "object" && element != null && "$$typeof" in element && // react 18 uses Symbol.for('react.element'), react 19 uses Symbol.for('react.transitional.element')
48
- ["Symbol(react.element)", "Symbol(react.transitional.element)"].includes(
49
- String(element.$$typeof)
50
- );
51
- var isHostFiber = (fiber) => fiber.tag === HostComponentTag || // @ts-expect-error: it exists
52
- fiber.tag === HostHoistableTag || // @ts-expect-error: it exists
53
- fiber.tag === HostSingletonTag;
54
- var isCompositeFiber = (fiber) => fiber.tag === FunctionComponentTag || fiber.tag === ClassComponentTag || fiber.tag === SimpleMemoComponentTag || fiber.tag === MemoComponentTag || fiber.tag === ForwardRefTag;
117
+ [
118
+ ELEMENT_TYPE_SYMBOL_STRING,
119
+ TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING
120
+ ].includes(String(element.$$typeof));
121
+ var isValidFiber = (fiber) => typeof fiber === "object" && fiber != null && "tag" in fiber && "stateNode" in fiber && "return" in fiber && "child" in fiber && "sibling" in fiber && "flags" in fiber;
122
+ var isHostFiber = (fiber) => {
123
+ switch (fiber.tag) {
124
+ case HostComponentTag:
125
+ // @ts-expect-error: it exists
126
+ case HostHoistableTag:
127
+ // @ts-expect-error: it exists
128
+ case HostSingletonTag:
129
+ return true;
130
+ default:
131
+ return typeof fiber.type === "string";
132
+ }
133
+ };
134
+ var isCompositeFiber = (fiber) => {
135
+ switch (fiber.tag) {
136
+ case FunctionComponentTag:
137
+ case ClassComponentTag:
138
+ case SimpleMemoComponentTag:
139
+ case MemoComponentTag:
140
+ case ForwardRefTag:
141
+ return true;
142
+ default:
143
+ return false;
144
+ }
145
+ };
55
146
  var traverseContexts = (fiber, selector) => {
56
147
  try {
57
148
  const nextDependencies = fiber.dependencies;
@@ -62,11 +153,10 @@ var traverseContexts = (fiber, selector) => {
62
153
  }
63
154
  let nextContext = nextDependencies.firstContext;
64
155
  let prevContext = prevDependencies.firstContext;
65
- while (nextContext && typeof nextContext === "object" && "memoizedValue" in nextContext && prevContext && typeof prevContext === "object" && "memoizedValue" in prevContext) {
66
- if (selector(nextContext, prevContext) === true)
67
- return true;
68
- nextContext = nextContext.next;
69
- prevContext = prevContext.next;
156
+ while (nextContext && typeof nextContext === "object" && "memoizedValue" in nextContext || prevContext && typeof prevContext === "object" && "memoizedValue" in prevContext) {
157
+ if (selector(nextContext, prevContext) === true) return true;
158
+ nextContext = nextContext?.next;
159
+ prevContext = prevContext?.next;
70
160
  }
71
161
  } catch {
72
162
  }
@@ -74,12 +164,34 @@ var traverseContexts = (fiber, selector) => {
74
164
  };
75
165
  var traverseState = (fiber, selector) => {
76
166
  try {
77
- let prevState = fiber.memoizedState;
78
- let nextState = fiber.alternate?.memoizedState;
79
- while (prevState && nextState) {
80
- if (selector(prevState, nextState) === true) return true;
81
- prevState = prevState.next;
82
- nextState = nextState.next;
167
+ let nextState = fiber.memoizedState;
168
+ let prevState = fiber.alternate?.memoizedState;
169
+ while (nextState || prevState) {
170
+ if (selector(nextState, prevState) === true) return true;
171
+ nextState = nextState?.next;
172
+ prevState = prevState?.next;
173
+ }
174
+ } catch {
175
+ }
176
+ return false;
177
+ };
178
+ var traverseEffects = (fiber, selector) => {
179
+ try {
180
+ let nextState = (
181
+ // biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
182
+ fiber.updateQueue?.lastEffect
183
+ );
184
+ let prevState = (
185
+ // biome-ignore lint/suspicious/noExplicitAny: underlying type is unknown
186
+ fiber.alternate?.updateQueue?.lastEffect
187
+ );
188
+ while (nextState || prevState) {
189
+ if (selector(nextState, prevState) === true) return true;
190
+ if (nextState?.next === nextState || prevState?.next === prevState) {
191
+ break;
192
+ }
193
+ nextState = nextState?.next;
194
+ prevState = prevState?.next;
83
195
  }
84
196
  } catch {
85
197
  }
@@ -122,7 +234,7 @@ var didFiberRender = (fiber) => {
122
234
  };
123
235
  var didFiberCommit = (fiber) => {
124
236
  return Boolean(
125
- (fiber.flags & (Update | Placement | ChildDeletion)) !== 0 || (fiber.subtreeFlags & (Update | Placement | ChildDeletion)) !== 0
237
+ (fiber.flags & (MutationMask | Cloned)) !== 0 || (fiber.subtreeFlags & (MutationMask | Cloned)) !== 0
126
238
  );
127
239
  };
128
240
  var getMutatedHostFibers = (fiber) => {
@@ -141,9 +253,10 @@ var getMutatedHostFibers = (fiber) => {
141
253
  };
142
254
  var getFiberStack = (fiber) => {
143
255
  const stack = [];
144
- while (fiber.return) {
145
- stack.push(fiber);
146
- fiber = fiber.return;
256
+ let currentFiber = fiber;
257
+ while (currentFiber.return) {
258
+ stack.push(currentFiber);
259
+ currentFiber = currentFiber.return;
147
260
  }
148
261
  const newStack = new Array(stack.length);
149
262
  for (let i = 0; i < stack.length; i++) {
@@ -153,14 +266,14 @@ var getFiberStack = (fiber) => {
153
266
  };
154
267
  var shouldFilterFiber = (fiber) => {
155
268
  switch (fiber.tag) {
156
- case DehydratedSuspenseComponent:
269
+ case DehydratedSuspenseComponentTag:
157
270
  return true;
158
- case HostText:
159
- case Fragment:
160
- case LegacyHiddenComponent:
161
- case OffscreenComponent:
271
+ case HostTextTag:
272
+ case FragmentTag:
273
+ case LegacyHiddenComponentTag:
274
+ case OffscreenComponentTag:
162
275
  return true;
163
- case HostRoot:
276
+ case HostRootTag:
164
277
  return false;
165
278
  default: {
166
279
  const symbolOrNumber = typeof fiber.type === "object" && fiber.type !== null ? fiber.type.$$typeof : fiber.type;
@@ -176,13 +289,35 @@ var shouldFilterFiber = (fiber) => {
176
289
  }
177
290
  }
178
291
  };
179
- var getNearestHostFiber = (fiber) => {
180
- let hostFiber = traverseFiber(fiber, isHostFiber);
292
+ var getNearestHostFiber = (fiber, ascending = false) => {
293
+ let hostFiber = traverseFiber(fiber, isHostFiber, ascending);
181
294
  if (!hostFiber) {
182
- hostFiber = traverseFiber(fiber, isHostFiber, true);
295
+ hostFiber = traverseFiber(fiber, isHostFiber, !ascending);
183
296
  }
184
297
  return hostFiber;
185
298
  };
299
+ var getNearestHostFibers = (fiber) => {
300
+ const hostFibers = [];
301
+ const stack = [];
302
+ if (isHostFiber(fiber)) {
303
+ hostFibers.push(fiber);
304
+ } else if (fiber.child) {
305
+ stack.push(fiber.child);
306
+ }
307
+ while (stack.length) {
308
+ const currentNode = stack.pop();
309
+ if (!currentNode) break;
310
+ if (isHostFiber(currentNode)) {
311
+ hostFibers.push(currentNode);
312
+ } else if (currentNode.child) {
313
+ stack.push(currentNode.child);
314
+ }
315
+ if (currentNode.sibling) {
316
+ stack.push(currentNode.sibling);
317
+ }
318
+ }
319
+ return hostFibers;
320
+ };
186
321
  var traverseFiber = (fiber, selector, ascending = false) => {
187
322
  if (!fiber) return null;
188
323
  if (selector(fiber) === true) return fiber;
@@ -205,28 +340,36 @@ var getTimings = (fiber) => {
205
340
  return { selfTime, totalTime };
206
341
  };
207
342
  var hasMemoCache = (fiber) => {
208
- return Boolean(fiber.updateQueue?.memoCache);
343
+ return Boolean(
344
+ fiber.updateQueue?.memoCache
345
+ );
209
346
  };
210
347
  var getType = (type) => {
211
- if (typeof type === "function") {
212
- return type;
348
+ const currentType = type;
349
+ if (typeof currentType === "function") {
350
+ return currentType;
213
351
  }
214
- if (typeof type === "object" && type) {
215
- return getType(type.type || type.render);
352
+ if (typeof currentType === "object" && currentType) {
353
+ return getType(
354
+ currentType.type || currentType.render
355
+ );
216
356
  }
217
357
  return null;
218
358
  };
219
359
  var getDisplayName = (type) => {
220
- if (typeof type !== "function" && !(typeof type === "object" && type)) {
360
+ const currentType = type;
361
+ if (typeof currentType !== "function" && !(typeof currentType === "object" && currentType)) {
221
362
  return null;
222
363
  }
223
- const name = type.displayName || type.name || null;
364
+ const name = currentType.displayName || currentType.name || null;
224
365
  if (name) return name;
225
- type = getType(type);
226
- if (!type) return null;
227
- return type.displayName || type.name || null;
366
+ const unwrappedType = getType(currentType);
367
+ if (!unwrappedType) return null;
368
+ return unwrappedType.displayName || unwrappedType.name || null;
369
+ };
370
+ var isUsingRDT = () => {
371
+ return "reactDevtoolsAgent" in getRDTHook();
228
372
  };
229
- var isUsingRDT = () => globalThis.__REACT_DEVTOOLS_BACKEND_MANAGER_INJECTED__ != null;
230
373
  var detectReactBuildType = (renderer) => {
231
374
  try {
232
375
  if (typeof renderer.version === "string" && renderer.bundleType > 0) {
@@ -236,68 +379,32 @@ var detectReactBuildType = (renderer) => {
236
379
  }
237
380
  return "production";
238
381
  };
239
- var checkDCE = (fn) => {
240
- try {
241
- const code = Function.prototype.toString.call(fn);
242
- if (code.indexOf("^_^") > -1) {
243
- setTimeout(() => {
244
- throw new Error(
245
- "React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build"
246
- );
247
- });
248
- }
249
- } catch {
250
- }
382
+ var isInstrumentationActive = () => {
383
+ const rdtHook = getRDTHook();
384
+ return Boolean(rdtHook._instrumentationIsActive) || isUsingRDT();
251
385
  };
252
- var NO_OP = () => {
386
+ var fiberId = 0;
387
+ var fiberIdMap = /* @__PURE__ */ new WeakMap();
388
+ var setFiberId = (fiber, id = fiberId++) => {
389
+ fiberIdMap.set(fiber, id);
253
390
  };
254
- var installRDTHook = (onActive) => {
255
- const renderers = /* @__PURE__ */ new Map();
256
- let i = 0;
257
- const rdtHook = {
258
- checkDCE,
259
- supportsFiber: true,
260
- supportsFlight: true,
261
- renderers,
262
- onCommitFiberRoot: NO_OP,
263
- onCommitFiberUnmount: NO_OP,
264
- onPostCommitFiberRoot: NO_OP,
265
- inject(renderer) {
266
- const nextID = ++i;
267
- renderers.set(nextID, renderer);
268
- if (!rdtHook._instrumentationIsActive) {
269
- rdtHook._instrumentationIsActive = true;
270
- onActive?.();
271
- }
272
- return nextID;
273
- },
274
- _instrumentationSource: BIPPY_INSTRUMENTATION_STRING,
275
- _instrumentationIsActive: false
276
- };
277
- try {
278
- Object.defineProperty(globalThis, "__REACT_DEVTOOLS_GLOBAL_HOOK__", {
279
- configurable: true,
280
- value: rdtHook
281
- });
282
- } catch {
391
+ var getFiberId = (fiber) => {
392
+ let id = fiberIdMap.get(fiber);
393
+ if (!id && fiber.alternate) {
394
+ id = fiberIdMap.get(fiber.alternate);
283
395
  }
284
- return rdtHook;
285
- };
286
- var getRDTHook = (onActive) => {
287
- let rdtHook = globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;
288
- if (rdtHook) onActive?.();
289
- if (!window.hasOwnProperty("__REACT_DEVTOOLS_GLOBAL_HOOK__")) {
290
- rdtHook = installRDTHook(onActive);
396
+ if (!id) {
397
+ id = fiberId++;
398
+ setFiberId(fiber, id);
291
399
  }
292
- return rdtHook;
293
- };
294
- var isInstrumentationActive = () => {
295
- const rdtHook = getRDTHook();
296
- return Boolean(rdtHook._instrumentationIsActive) || isUsingRDT();
400
+ return id;
297
401
  };
298
402
  var mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
299
403
  let fiber = firstChild;
300
404
  while (fiber != null) {
405
+ if (!fiberIdMap.has(fiber)) {
406
+ getFiberId(fiber);
407
+ }
301
408
  const shouldIncludeInTree = !shouldFilterFiber(fiber);
302
409
  if (shouldIncludeInTree && didFiberRender(fiber)) {
303
410
  onRender(fiber, "mount");
@@ -329,7 +436,13 @@ var mountFiberRecursively = (onRender, firstChild, traverseSiblings) => {
329
436
  }
330
437
  };
331
438
  var updateFiberRecursively = (onRender, nextFiber, prevFiber, parentFiber) => {
439
+ if (!fiberIdMap.has(nextFiber)) {
440
+ getFiberId(nextFiber);
441
+ }
332
442
  if (!prevFiber) return;
443
+ if (!fiberIdMap.has(prevFiber)) {
444
+ getFiberId(prevFiber);
445
+ }
333
446
  const isSuspense = nextFiber.tag === SuspenseComponentTag;
334
447
  const shouldIncludeInTree = !shouldFilterFiber(nextFiber);
335
448
  if (shouldIncludeInTree && didFiberRender(nextFiber)) {
@@ -374,7 +487,7 @@ var updateFiberRecursively = (onRender, nextFiber, prevFiber, parentFiber) => {
374
487
  }
375
488
  };
376
489
  var unmountFiber = (onRender, fiber) => {
377
- const isRoot = fiber.tag === HostRoot;
490
+ const isRoot = fiber.tag === HostRootTag;
378
491
  if (isRoot || !shouldFilterFiber(fiber)) {
379
492
  onRender(fiber, "unmount");
380
493
  }
@@ -402,7 +515,7 @@ var createFiberVisitor = ({
402
515
  onError
403
516
  }) => {
404
517
  return (_rendererID, root, state) => {
405
- const rootFiber = root.current;
518
+ const rootFiber = "current" in root ? root.current : root;
406
519
  const onRender = (fiber, phase) => onRenderWithoutState(fiber, phase, state);
407
520
  let rootInstance = rootInstanceMap.get(root);
408
521
  if (!rootInstance) {
@@ -431,103 +544,186 @@ var createFiberVisitor = ({
431
544
  unmountFiber(onRender, rootFiber);
432
545
  }
433
546
  } else {
434
- mountFiberRecursively(onRender, rootFiber, false);
435
- }
436
- } catch (err) {
437
- if (onError) {
438
- onError(err);
439
- } else {
440
- throw err;
547
+ mountFiberRecursively(onRender, rootFiber, true);
441
548
  }
549
+ } catch (error) {
550
+ onError(error);
442
551
  }
443
552
  rootInstance.prevFiber = rootFiber;
444
553
  };
445
554
  };
446
- var instrument = ({
447
- onCommitFiberRoot,
448
- onCommitFiberUnmount,
449
- onPostCommitFiberRoot,
450
- onActive,
451
- name
452
- }) => {
453
- const devtoolsHook = getRDTHook(onActive);
454
- devtoolsHook._instrumentationSource = name ?? BIPPY_INSTRUMENTATION_STRING;
455
- const prevOnCommitFiberRoot = devtoolsHook.onCommitFiberRoot;
456
- if (onCommitFiberRoot) {
457
- devtoolsHook.onCommitFiberRoot = (rendererID, root, priority) => {
458
- if (prevOnCommitFiberRoot)
459
- prevOnCommitFiberRoot(rendererID, root, priority);
460
- onCommitFiberRoot(rendererID, root, priority);
461
- };
462
- }
463
- const prevOnCommitFiberUnmount = devtoolsHook.onCommitFiberUnmount;
464
- if (onCommitFiberUnmount) {
465
- devtoolsHook.onCommitFiberUnmount = (rendererID, root) => {
466
- if (prevOnCommitFiberUnmount) prevOnCommitFiberUnmount(rendererID, root);
467
- onCommitFiberUnmount(rendererID, root);
468
- };
469
- }
470
- const prevOnPostCommitFiberRoot = devtoolsHook.onPostCommitFiberRoot;
471
- if (onPostCommitFiberRoot) {
472
- devtoolsHook.onPostCommitFiberRoot = (rendererID, root) => {
473
- if (prevOnPostCommitFiberRoot) {
474
- prevOnPostCommitFiberRoot(rendererID, root);
555
+ var instrument = (options) => {
556
+ return getRDTHook(() => {
557
+ const rdtHook = getRDTHook();
558
+ options.onActive?.();
559
+ rdtHook._instrumentationSource = options.name ?? BIPPY_INSTRUMENTATION_STRING;
560
+ const prevOnCommitFiberRoot = rdtHook.onCommitFiberRoot;
561
+ if (options.onCommitFiberRoot) {
562
+ rdtHook.onCommitFiberRoot = (rendererID, root, priority) => {
563
+ if (prevOnCommitFiberRoot)
564
+ prevOnCommitFiberRoot(rendererID, root, priority);
565
+ options.onCommitFiberRoot?.(rendererID, root, priority);
566
+ };
567
+ }
568
+ const prevOnCommitFiberUnmount = rdtHook.onCommitFiberUnmount;
569
+ if (options.onCommitFiberUnmount) {
570
+ rdtHook.onCommitFiberUnmount = (rendererID, root) => {
571
+ if (prevOnCommitFiberUnmount)
572
+ prevOnCommitFiberUnmount(rendererID, root);
573
+ options.onCommitFiberUnmount?.(rendererID, root);
574
+ };
575
+ }
576
+ const prevOnPostCommitFiberRoot = rdtHook.onPostCommitFiberRoot;
577
+ if (options.onPostCommitFiberRoot) {
578
+ rdtHook.onPostCommitFiberRoot = (rendererID, root) => {
579
+ if (prevOnPostCommitFiberRoot)
580
+ prevOnPostCommitFiberRoot(rendererID, root);
581
+ options.onPostCommitFiberRoot?.(rendererID, root);
582
+ };
583
+ }
584
+ });
585
+ };
586
+ var getFiberFromHostInstance = (hostInstance) => {
587
+ const rdtHook = getRDTHook();
588
+ for (const renderer of rdtHook.renderers.values()) {
589
+ try {
590
+ const fiber = renderer.findFiberByHostInstance?.(hostInstance);
591
+ if (fiber) return fiber;
592
+ } catch {
593
+ }
594
+ }
595
+ if (typeof hostInstance === "object" && hostInstance != null) {
596
+ if ("_reactRootContainer" in hostInstance) {
597
+ return hostInstance._reactRootContainer?._internalRoot?.current?.child;
598
+ }
599
+ for (const key in hostInstance) {
600
+ if (key.startsWith("__reactInternalInstance$") || key.startsWith("__reactFiber")) {
601
+ return hostInstance[key];
475
602
  }
476
- };
603
+ }
477
604
  }
478
- return devtoolsHook;
605
+ return null;
606
+ };
607
+ var secure = (options, secureOptions = {}) => {
608
+ const onActive = options.onActive;
609
+ const isRDTHookInstalled = hasRDTHook();
610
+ const isRDT = isUsingRDT();
611
+ let timeout;
612
+ let isProduction = false;
613
+ options.onActive = () => {
614
+ clearTimeout(timeout);
615
+ let isSecure = true;
616
+ try {
617
+ onActive?.();
618
+ const rdtHook = getRDTHook();
619
+ for (const renderer of rdtHook.renderers.values()) {
620
+ const [majorVersion] = renderer.version.split(".");
621
+ if (Number(majorVersion) < (secureOptions.minReactMajorVersion ?? 17)) {
622
+ isSecure = false;
623
+ }
624
+ const buildType = detectReactBuildType(renderer);
625
+ if (buildType !== "development") {
626
+ isProduction = true;
627
+ if (!secureOptions.dangerouslyRunInProduction) {
628
+ isSecure = false;
629
+ }
630
+ }
631
+ }
632
+ } catch (err) {
633
+ secureOptions.onError?.(err);
634
+ }
635
+ if (!isSecure) {
636
+ options.onCommitFiberRoot = void 0;
637
+ options.onCommitFiberUnmount = void 0;
638
+ options.onPostCommitFiberRoot = void 0;
639
+ options.onActive = void 0;
640
+ return;
641
+ }
642
+ try {
643
+ const onCommitFiberRoot = options.onCommitFiberRoot;
644
+ if (onCommitFiberRoot) {
645
+ options.onCommitFiberRoot = (rendererID, root, priority) => {
646
+ try {
647
+ onCommitFiberRoot(rendererID, root, priority);
648
+ } catch (err) {
649
+ secureOptions.onError?.(err);
650
+ }
651
+ };
652
+ }
653
+ const onCommitFiberUnmount = options.onCommitFiberUnmount;
654
+ if (onCommitFiberUnmount) {
655
+ options.onCommitFiberUnmount = (rendererID, root) => {
656
+ try {
657
+ onCommitFiberUnmount(rendererID, root);
658
+ } catch (err) {
659
+ secureOptions.onError?.(err);
660
+ }
661
+ };
662
+ }
663
+ const onPostCommitFiberRoot = options.onPostCommitFiberRoot;
664
+ if (onPostCommitFiberRoot) {
665
+ options.onPostCommitFiberRoot = (rendererID, root) => {
666
+ try {
667
+ onPostCommitFiberRoot(rendererID, root);
668
+ } catch (err) {
669
+ secureOptions.onError?.(err);
670
+ }
671
+ };
672
+ }
673
+ } catch (err) {
674
+ secureOptions.onError?.(err);
675
+ }
676
+ };
677
+ if (!isRDTHookInstalled && !isRDT) {
678
+ timeout = setTimeout(() => {
679
+ if (!isProduction) {
680
+ secureOptions.onError?.();
681
+ }
682
+ stop();
683
+ }, secureOptions.installCheckTimeout ?? 100);
684
+ }
685
+ return options;
479
686
  };
480
- var isBrowser = typeof document !== "undefined" && typeof document.createElement === "function";
481
- var isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
482
- if (isBrowser || !isNode) {
483
- installRDTHook();
484
- }
485
687
 
486
688
  exports.BIPPY_INSTRUMENTATION_STRING = BIPPY_INSTRUMENTATION_STRING;
487
689
  exports.CONCURRENT_MODE_NUMBER = CONCURRENT_MODE_NUMBER;
488
690
  exports.CONCURRENT_MODE_SYMBOL_STRING = CONCURRENT_MODE_SYMBOL_STRING;
489
- exports.ChildDeletion = ChildDeletion;
490
691
  exports.ClassComponentTag = ClassComponentTag;
491
- exports.Cloned = Cloned;
492
- exports.ContentReset = ContentReset;
493
692
  exports.ContextConsumerTag = ContextConsumerTag;
494
693
  exports.DEPRECATED_ASYNC_MODE_SYMBOL_STRING = DEPRECATED_ASYNC_MODE_SYMBOL_STRING;
495
- exports.DehydratedSuspenseComponent = DehydratedSuspenseComponent;
496
- exports.DidCapture = DidCapture;
694
+ exports.DehydratedSuspenseComponentTag = DehydratedSuspenseComponentTag;
695
+ exports.ELEMENT_TYPE_SYMBOL_STRING = ELEMENT_TYPE_SYMBOL_STRING;
497
696
  exports.ForwardRefTag = ForwardRefTag;
498
- exports.Fragment = Fragment;
697
+ exports.FragmentTag = FragmentTag;
499
698
  exports.FunctionComponentTag = FunctionComponentTag;
500
699
  exports.HostComponentTag = HostComponentTag;
501
700
  exports.HostHoistableTag = HostHoistableTag;
502
- exports.HostRoot = HostRoot;
701
+ exports.HostRootTag = HostRootTag;
503
702
  exports.HostSingletonTag = HostSingletonTag;
504
- exports.HostText = HostText;
505
- exports.Hydrating = Hydrating;
506
- exports.LegacyHiddenComponent = LegacyHiddenComponent;
703
+ exports.HostTextTag = HostTextTag;
704
+ exports.LegacyHiddenComponentTag = LegacyHiddenComponentTag;
507
705
  exports.MemoComponentTag = MemoComponentTag;
508
- exports.MutationMask = MutationMask;
509
- exports.OffscreenComponent = OffscreenComponent;
510
706
  exports.OffscreenComponentTag = OffscreenComponentTag;
511
- exports.PerformedWork = PerformedWork;
512
- exports.Placement = Placement;
513
- exports.Ref = Ref;
514
707
  exports.SimpleMemoComponentTag = SimpleMemoComponentTag;
515
- exports.Snapshot = Snapshot;
516
708
  exports.SuspenseComponentTag = SuspenseComponentTag;
517
- exports.Update = Update;
518
- exports.Visibility = Visibility;
709
+ exports.TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING = TRANSITIONAL_ELEMENT_TYPE_SYMBOL_STRING;
519
710
  exports.createFiberVisitor = createFiberVisitor;
520
711
  exports.detectReactBuildType = detectReactBuildType;
521
712
  exports.didFiberCommit = didFiberCommit;
522
713
  exports.didFiberRender = didFiberRender;
714
+ exports.fiberIdMap = fiberIdMap;
523
715
  exports.getDisplayName = getDisplayName;
716
+ exports.getFiberFromHostInstance = getFiberFromHostInstance;
717
+ exports.getFiberId = getFiberId;
524
718
  exports.getFiberStack = getFiberStack;
525
719
  exports.getMutatedHostFibers = getMutatedHostFibers;
526
720
  exports.getNearestHostFiber = getNearestHostFiber;
721
+ exports.getNearestHostFibers = getNearestHostFibers;
527
722
  exports.getRDTHook = getRDTHook;
528
723
  exports.getTimings = getTimings;
529
724
  exports.getType = getType;
530
725
  exports.hasMemoCache = hasMemoCache;
726
+ exports.hasRDTHook = hasRDTHook;
531
727
  exports.installRDTHook = installRDTHook;
532
728
  exports.instrument = instrument;
533
729
  exports.isCompositeFiber = isCompositeFiber;
@@ -535,9 +731,13 @@ exports.isHostFiber = isHostFiber;
535
731
  exports.isInstrumentationActive = isInstrumentationActive;
536
732
  exports.isUsingRDT = isUsingRDT;
537
733
  exports.isValidElement = isValidElement;
734
+ exports.isValidFiber = isValidFiber;
538
735
  exports.mountFiberRecursively = mountFiberRecursively;
736
+ exports.secure = secure;
737
+ exports.setFiberId = setFiberId;
539
738
  exports.shouldFilterFiber = shouldFilterFiber;
540
739
  exports.traverseContexts = traverseContexts;
740
+ exports.traverseEffects = traverseEffects;
541
741
  exports.traverseFiber = traverseFiber;
542
742
  exports.traverseProps = traverseProps;
543
743
  exports.traverseState = traverseState;