@@ -21,12 +21,24 @@ if (typeof File === 'undefined' || typeof FormData === 'undefined') {
21
21
function normalizeCodeLocInfo ( str ) {
22
22
return (
23
23
str &&
24
- str . replace ( / \n + (?: a t | i n ) ( [ \S ] + ) [ ^ \n ] * / g , function ( m , name ) {
25
- return '\n in ' + name + ( / \d / . test ( m ) ? ' (at **)' : '' ) ;
24
+ str . replace ( / ^ + (?: a t | i n ) ( [ \S ] + ) [ ^ \n ] * / gm , function ( m , name ) {
25
+ return ' in ' + name + ( / \d / . test ( m ) ? ' (at **)' : '' ) ;
26
26
} )
27
27
) ;
28
28
}
29
29
30
+ function getDebugInfo ( obj ) {
31
+ const debugInfo = obj . _debugInfo ;
32
+ if ( debugInfo ) {
33
+ for ( let i = 0 ; i < debugInfo . length ; i ++ ) {
34
+ if ( typeof debugInfo [ i ] . stack === 'string' ) {
35
+ debugInfo [ i ] . stack = normalizeCodeLocInfo ( debugInfo [ i ] . stack ) ;
36
+ }
37
+ }
38
+ }
39
+ return debugInfo ;
40
+ }
41
+
30
42
const heldValues = [ ] ;
31
43
let finalizationCallback ;
32
44
function FinalizationRegistryMock ( callback ) {
@@ -221,8 +233,19 @@ describe('ReactFlight', () => {
221
233
await act ( async ( ) => {
222
234
const rootModel = await ReactNoopFlightClient . read ( transport ) ;
223
235
const greeting = rootModel . greeting ;
224
- expect ( greeting . _debugInfo ) . toEqual (
225
- __DEV__ ? [ { name : 'Greeting' , env : 'Server' , owner : null } ] : undefined ,
236
+ expect ( getDebugInfo ( greeting ) ) . toEqual (
237
+ __DEV__
238
+ ? [
239
+ {
240
+ name : 'Greeting' ,
241
+ env : 'Server' ,
242
+ owner : null ,
243
+ stack : gate ( flag => flag . enableOwnerStacks )
244
+ ? ' in Object.<anonymous> (at **)'
245
+ : undefined ,
246
+ } ,
247
+ ]
248
+ : undefined ,
226
249
) ;
227
250
ReactNoop . render ( greeting ) ;
228
251
} ) ;
@@ -248,8 +271,19 @@ describe('ReactFlight', () => {
248
271
249
272
await act ( async ( ) => {
250
273
const promise = ReactNoopFlightClient . read ( transport ) ;
251
- expect ( promise . _debugInfo ) . toEqual (
252
- __DEV__ ? [ { name : 'Greeting' , env : 'Server' , owner : null } ] : undefined ,
274
+ expect ( getDebugInfo ( promise ) ) . toEqual (
275
+ __DEV__
276
+ ? [
277
+ {
278
+ name : 'Greeting' ,
279
+ env : 'Server' ,
280
+ owner : null ,
281
+ stack : gate ( flag => flag . enableOwnerStacks )
282
+ ? ' in Object.<anonymous> (at **)'
283
+ : undefined ,
284
+ } ,
285
+ ]
286
+ : undefined ,
253
287
) ;
254
288
ReactNoop . render ( await promise ) ;
255
289
} ) ;
@@ -2233,9 +2267,11 @@ describe('ReactFlight', () => {
2233
2267
return < span > !</ span > ;
2234
2268
}
2235
2269
2236
- const lazy = React . lazy ( async ( ) => ( {
2237
- default : < ThirdPartyLazyComponent /> ,
2238
- } ) ) ;
2270
+ const lazy = React . lazy ( async function myLazy ( ) {
2271
+ return {
2272
+ default : < ThirdPartyLazyComponent /> ,
2273
+ } ;
2274
+ } ) ;
2239
2275
2240
2276
function ThirdPartyComponent ( ) {
2241
2277
return < span > stranger</ span > ;
@@ -2269,31 +2305,61 @@ describe('ReactFlight', () => {
2269
2305
2270
2306
await act ( async ( ) => {
2271
2307
const promise = ReactNoopFlightClient . read ( transport ) ;
2272
- expect ( promise . _debugInfo ) . toEqual (
2308
+ expect ( getDebugInfo ( promise ) ) . toEqual (
2273
2309
__DEV__
2274
- ? [ { name : 'ServerComponent' , env : 'Server' , owner : null } ]
2310
+ ? [
2311
+ {
2312
+ name : 'ServerComponent' ,
2313
+ env : 'Server' ,
2314
+ owner : null ,
2315
+ stack : gate ( flag => flag . enableOwnerStacks )
2316
+ ? ' in Object.<anonymous> (at **)'
2317
+ : undefined ,
2318
+ } ,
2319
+ ]
2275
2320
: undefined ,
2276
2321
) ;
2277
2322
const result = await promise ;
2278
2323
const thirdPartyChildren = await result . props . children [ 1 ] ;
2279
2324
// We expect the debug info to be transferred from the inner stream to the outer.
2280
- expect ( thirdPartyChildren [ 0 ] . _debugInfo ) . toEqual (
2325
+ expect ( getDebugInfo ( thirdPartyChildren [ 0 ] ) ) . toEqual (
2281
2326
__DEV__
2282
- ? [ { name : 'ThirdPartyComponent' , env : 'third-party' , owner : null } ]
2327
+ ? [
2328
+ {
2329
+ name : 'ThirdPartyComponent' ,
2330
+ env : 'third-party' ,
2331
+ owner : null ,
2332
+ stack : gate ( flag => flag . enableOwnerStacks )
2333
+ ? ' in Object.<anonymous> (at **)'
2334
+ : undefined ,
2335
+ } ,
2336
+ ]
2283
2337
: undefined ,
2284
2338
) ;
2285
- expect ( thirdPartyChildren [ 1 ] . _debugInfo ) . toEqual (
2339
+ expect ( getDebugInfo ( thirdPartyChildren [ 1 ] ) ) . toEqual (
2286
2340
__DEV__
2287
- ? [ { name : 'ThirdPartyLazyComponent' , env : 'third-party' , owner : null } ]
2341
+ ? [
2342
+ {
2343
+ name : 'ThirdPartyLazyComponent' ,
2344
+ env : 'third-party' ,
2345
+ owner : null ,
2346
+ stack : gate ( flag => flag . enableOwnerStacks )
2347
+ ? ' in myLazy (at **)\n in lazyInitializer (at **)'
2348
+ : undefined ,
2349
+ } ,
2350
+ ]
2288
2351
: undefined ,
2289
2352
) ;
2290
- expect ( thirdPartyChildren [ 2 ] . _debugInfo ) . toEqual (
2353
+ expect ( getDebugInfo ( thirdPartyChildren [ 2 ] ) ) . toEqual (
2291
2354
__DEV__
2292
2355
? [
2293
2356
{
2294
2357
name : 'ThirdPartyFragmentComponent' ,
2295
2358
env : 'third-party' ,
2296
2359
owner : null ,
2360
+ stack : gate ( flag => flag . enableOwnerStacks )
2361
+ ? ' in Object.<anonymous> (at **)'
2362
+ : undefined ,
2297
2363
} ,
2298
2364
]
2299
2365
: undefined ,
@@ -2357,24 +2423,47 @@ describe('ReactFlight', () => {
2357
2423
2358
2424
await act ( async ( ) => {
2359
2425
const promise = ReactNoopFlightClient . read ( transport ) ;
2360
- expect ( promise . _debugInfo ) . toEqual (
2426
+ expect ( getDebugInfo ( promise ) ) . toEqual (
2361
2427
__DEV__
2362
- ? [ { name : 'ServerComponent' , env : 'Server' , owner : null } ]
2428
+ ? [
2429
+ {
2430
+ name : 'ServerComponent' ,
2431
+ env : 'Server' ,
2432
+ owner : null ,
2433
+ stack : gate ( flag => flag . enableOwnerStacks )
2434
+ ? ' in Object.<anonymous> (at **)'
2435
+ : undefined ,
2436
+ } ,
2437
+ ]
2363
2438
: undefined ,
2364
2439
) ;
2365
2440
const result = await promise ;
2366
2441
const thirdPartyFragment = await result . props . children ;
2367
- expect ( thirdPartyFragment . _debugInfo ) . toEqual (
2368
- __DEV__ ? [ { name : 'Keyed' , env : 'Server' , owner : null } ] : undefined ,
2442
+ expect ( getDebugInfo ( thirdPartyFragment ) ) . toEqual (
2443
+ __DEV__
2444
+ ? [
2445
+ {
2446
+ name : 'Keyed' ,
2447
+ env : 'Server' ,
2448
+ owner : null ,
2449
+ stack : gate ( flag => flag . enableOwnerStacks )
2450
+ ? ' in ServerComponent (at **)'
2451
+ : undefined ,
2452
+ } ,
2453
+ ]
2454
+ : undefined ,
2369
2455
) ;
2370
2456
// We expect the debug info to be transferred from the inner stream to the outer.
2371
- expect ( thirdPartyFragment . props . children . _debugInfo ) . toEqual (
2457
+ expect ( getDebugInfo ( thirdPartyFragment . props . children ) ) . toEqual (
2372
2458
__DEV__
2373
2459
? [
2374
2460
{
2375
2461
name : 'ThirdPartyAsyncIterableComponent' ,
2376
2462
env : 'third-party' ,
2377
2463
owner : null ,
2464
+ stack : gate ( flag => flag . enableOwnerStacks )
2465
+ ? ' in Object.<anonymous> (at **)'
2466
+ : undefined ,
2378
2467
} ,
2379
2468
]
2380
2469
: undefined ,
@@ -2467,10 +2556,24 @@ describe('ReactFlight', () => {
2467
2556
// We've rendered down to the span.
2468
2557
expect ( greeting . type ) . toBe ( 'span' ) ;
2469
2558
if ( __DEV__ ) {
2470
- const greetInfo = { name : 'Greeting' , env : 'Server' , owner : null } ;
2471
- expect ( greeting . _debugInfo ) . toEqual ( [
2559
+ const greetInfo = {
2560
+ name : 'Greeting' ,
2561
+ env : 'Server' ,
2562
+ owner : null ,
2563
+ stack : gate ( flag => flag . enableOwnerStacks )
2564
+ ? ' in Object.<anonymous> (at **)'
2565
+ : undefined ,
2566
+ } ;
2567
+ expect ( getDebugInfo ( greeting ) ) . toEqual ( [
2472
2568
greetInfo ,
2473
- { name : 'Container' , env : 'Server' , owner : greetInfo } ,
2569
+ {
2570
+ name : 'Container' ,
2571
+ env : 'Server' ,
2572
+ owner : greetInfo ,
2573
+ stack : gate ( flag => flag . enableOwnerStacks )
2574
+ ? ' in Greeting (at **)'
2575
+ : undefined ,
2576
+ } ,
2474
2577
] ) ;
2475
2578
// The owner that created the span was the outer server component.
2476
2579
// We expect the debug info to be referentially equal to the owner.
0 commit comments