11import type { Fiber } from 'react-reconciler' ;
22import type * as React from 'react' ;
33import { type Signal , signal } from '@preact/signals' ;
4- import { getDisplayName , getTimings , getType , isCompositeFiber } from 'bippy' ;
4+ import {
5+ getDisplayName ,
6+ getTimings ,
7+ getType ,
8+ isCompositeFiber ,
9+ traverseFiber ,
10+ } from 'bippy' ;
511import { createInstrumentation , type Render } from './instrumentation' ;
612import {
713 type ActiveOutline ,
@@ -18,11 +24,7 @@ import {
1824import { createToolbar } from './web/toolbar' ;
1925import type { InternalInteraction } from './monitor/types' ;
2026import { type getSession } from './monitor/utils' ;
21- import {
22- isValidFiber ,
23- type RenderData ,
24- updateFiberRenderData ,
25- } from './utils' ;
27+ import { type RenderData , updateFiberRenderData } from './utils' ;
2628import { playGeigerClickSound } from './web/geiger' ;
2729
2830export interface Options {
@@ -275,6 +277,30 @@ export const reportRender = (fiber: Fiber, renders: Array<Render>) => {
275277 }
276278} ;
277279
280+ export const isValidFiber = ( fiber : Fiber ) => {
281+ if ( ignoredProps . has ( fiber . memoizedProps ) ) {
282+ return false ;
283+ }
284+
285+ const allowList = ReactScanInternals . componentAllowList ;
286+ const shouldAllow =
287+ allowList ?. has ( fiber . type ) ?? allowList ?. has ( fiber . elementType ) ;
288+
289+ if ( shouldAllow ) {
290+ const parent = traverseFiber (
291+ fiber ,
292+ ( node ) => {
293+ const options =
294+ allowList ?. get ( node . type ) ?? allowList ?. get ( node . elementType ) ;
295+ return options ?. includeChildren ;
296+ } ,
297+ true ,
298+ ) ;
299+ if ( ! parent && ! shouldAllow ) return false ;
300+ }
301+ return true ;
302+ } ;
303+
278304export const start = ( ) => {
279305 if ( typeof window === 'undefined' ) return ;
280306 const options = ReactScanInternals . options . value ;
@@ -304,14 +330,15 @@ export const start = () => {
304330 } ;
305331
306332 // TODO: dynamic enable, and inspect-off check
307- const instrumentation = createInstrumentation ( {
308- kind : 'devtool' ,
333+ const instrumentation = createInstrumentation ( 'devtools' , {
309334 onCommitStart ( ) {
310335 ReactScanInternals . options . value . onCommitStart ?.( ) ;
311336 } ,
312- isValidFiber ( fiber ) {
313- return isValidFiber ( fiber ) ;
337+ onError ( error ) {
338+ // eslint-disable-next-line no-console
339+ console . error ( '[React Scan] Error instrumenting:' , error ) ;
314340 } ,
341+ isValidFiber,
315342 onRender ( fiber , renders ) {
316343 if ( ReactScanInternals . instrumentation ?. isPaused . value ) {
317344 // don't draw if it's paused
0 commit comments