@@ -30,6 +30,7 @@ let React;
30
30
let ReactDOMClient ;
31
31
let ReactServerDOMWriter ;
32
32
let ReactServerDOMReader ;
33
+ let ReactServerDOMHooks ;
33
34
34
35
describe ( 'ReactFlightDOM' , ( ) => {
35
36
beforeEach ( ( ) => {
@@ -42,6 +43,7 @@ describe('ReactFlightDOM', () => {
42
43
ReactDOMClient = require ( 'react-dom/client' ) ;
43
44
ReactServerDOMWriter = require ( 'react-server-dom-webpack/writer.node.server' ) ;
44
45
ReactServerDOMReader = require ( 'react-server-dom-webpack' ) ;
46
+ ReactServerDOMHooks = require ( 'react-server-dom-webpack/flight-hooks' ) ;
45
47
} ) ;
46
48
47
49
function getTestStream ( ) {
@@ -545,4 +547,105 @@ describe('ReactFlightDOM', () => {
545
547
expect ( inputB . tagName ) . toBe ( 'INPUT' ) ;
546
548
expect ( inputB . value ) . toBe ( 'goodbye' ) ;
547
549
} ) ;
550
+
551
+ // @gate enableServerContext
552
+ it ( 'supports useServerContextsForRefetch' , async ( ) => {
553
+ let ServerContext = React . createServerContext ( 'ServerContext' , 'default' ) ;
554
+
555
+ function Foo ( ) {
556
+ return (
557
+ < >
558
+ < ServerContext . Provider value = "hi this is server outer" >
559
+ < ServerContext . Provider value = "hi this is server" >
560
+ < Bar value = "" />
561
+ </ ServerContext . Provider >
562
+ < ServerContext . Provider value = "hi this is server2" >
563
+ < Bar value = "2" />
564
+ </ ServerContext . Provider >
565
+ < Bar value = "outer" />
566
+ </ ServerContext . Provider >
567
+ < ServerContext . Provider value = "hi this is server outer2" >
568
+ < Bar value = "outer2" />
569
+ </ ServerContext . Provider >
570
+ < Bar value = "default" />
571
+ </ >
572
+ ) ;
573
+ }
574
+ const contextsForRefetch = [ ] ;
575
+ function ClientBaz ( ) {
576
+ const context = React . useContext ( ServerContext ) ;
577
+ contextsForRefetch . push (
578
+ ReactServerDOMHooks . useServerContextsForRefetch ( ) ,
579
+ ) ;
580
+ return < span > { context } </ span > ;
581
+ }
582
+ function ClientBar ( { value} ) {
583
+ return (
584
+ < ServerContext . Provider
585
+ value = { 'hi this is client' + ( value ? ' ' + value : '' ) } >
586
+ < ClientBaz />
587
+ </ ServerContext . Provider >
588
+ ) ;
589
+ }
590
+ const Bar = moduleReference ( ClientBar ) ;
591
+
592
+ const { writable, readable} = getTestStream ( ) ;
593
+ const { pipe} = ReactServerDOMWriter . renderToPipeableStream (
594
+ < Foo /> ,
595
+ webpackMap ,
596
+ ) ;
597
+ pipe ( writable ) ;
598
+
599
+ // Reset modules
600
+ jest . resetModules ( ) ;
601
+ act = require ( 'jest-react' ) . act ;
602
+ Stream = require ( 'stream' ) ;
603
+ React = require ( 'react' ) ;
604
+ ReactDOMClient = require ( 'react-dom/client' ) ;
605
+ ReactServerDOMWriter = require ( 'react-server-dom-webpack/writer.node.server' ) ;
606
+ ReactServerDOMReader = require ( 'react-server-dom-webpack' ) ;
607
+ ReactServerDOMHooks = require ( 'react-server-dom-webpack/flight-hooks' ) ;
608
+
609
+ ServerContext = React . createServerContext ( 'ServerContext' , 'default' ) ;
610
+
611
+ const response = ReactServerDOMReader . createFromReadableStream ( readable ) ;
612
+
613
+ const container = document . createElement ( 'div' ) ;
614
+ const root = ReactDOMClient . createRoot ( container ) ;
615
+
616
+ function App ( { response : res } ) {
617
+ return res . readRoot ( ) ;
618
+ }
619
+
620
+ await act ( async ( ) => {
621
+ root . render ( < App response = { response } /> ) ;
622
+ } ) ;
623
+
624
+ expect ( container . innerHTML ) . toBe (
625
+ '<span>hi this is client</span>' +
626
+ '<span>hi this is client 2</span>' +
627
+ '<span>hi this is client outer</span>' +
628
+ '<span>hi this is client outer2</span>' +
629
+ '<span>hi this is client default</span>' ,
630
+ ) ;
631
+
632
+ const outer = [ 'ServerContext' , 'hi this is server outer' , null ] ;
633
+ expect ( contextsForRefetch [ 0 ] ) . toEqual ( [
634
+ 'ServerContext' ,
635
+ 'hi this is server' ,
636
+ outer ,
637
+ ] ) ;
638
+ expect ( contextsForRefetch [ 1 ] ) . toEqual ( [
639
+ 'ServerContext' ,
640
+ 'hi this is server2' ,
641
+ outer ,
642
+ ] ) ;
643
+ expect ( contextsForRefetch [ 2 ] ) . toEqual ( outer ) ;
644
+ expect ( contextsForRefetch [ 3 ] ) . toEqual ( [
645
+ 'ServerContext' ,
646
+ 'hi this is server outer2' ,
647
+ null ,
648
+ ] ) ;
649
+ expect ( contextsForRefetch [ 4 ] ) . toEqual ( null ) ;
650
+ } ) ;
548
651
} ) ;
0 commit comments