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