@@ -816,6 +816,15 @@ describe('ReactFlightDOMBrowser', () => {
816
816
expect ( container . innerHTML ) . toBe ( 'Hi' ) ;
817
817
} ) ;
818
818
819
+ function requireServerRef ( ref ) {
820
+ const metaData = webpackServerMap [ ref . id ] [ ref . name ] ;
821
+ const mod = __webpack_require__ ( metaData . id ) ;
822
+ if ( metaData . name === '*' ) {
823
+ return mod ;
824
+ }
825
+ return mod [ metaData . name ] ;
826
+ }
827
+
819
828
it ( 'can pass a function by reference from server to client' , async ( ) => {
820
829
let actionProxy ;
821
830
@@ -838,11 +847,6 @@ describe('ReactFlightDOMBrowser', () => {
838
847
webpackMap ,
839
848
) ;
840
849
841
- function requireServerRef ( ref ) {
842
- const metaData = webpackServerMap [ ref . id ] [ ref . name ] ;
843
- return __webpack_require__ ( metaData . id ) [ metaData . name ] ;
844
- }
845
-
846
850
const response = ReactServerDOMReader . createFromReadableStream ( stream , {
847
851
async callServer ( ref , args ) {
848
852
const fn = requireServerRef ( ref ) ;
@@ -866,4 +870,46 @@ describe('ReactFlightDOMBrowser', () => {
866
870
const result = await actionProxy ( 'hi' ) ;
867
871
expect ( result ) . toBe ( 'HI' ) ;
868
872
} ) ;
873
+
874
+ it ( 'can bind arguments to a server reference' , async ( ) => {
875
+ let actionProxy ;
876
+
877
+ function Client ( { action} ) {
878
+ actionProxy = action ;
879
+ return 'Click Me' ;
880
+ }
881
+
882
+ const greet = serverExports ( function greet ( a , b , c ) {
883
+ return a + ' ' + b + c ;
884
+ } ) ;
885
+ const ClientRef = clientExports ( Client ) ;
886
+
887
+ const stream = ReactServerDOMWriter . renderToReadableStream (
888
+ < ClientRef action = { greet . bind ( null , 'Hello' , 'World' ) } /> ,
889
+ webpackMap ,
890
+ ) ;
891
+
892
+ const response = ReactServerDOMReader . createFromReadableStream ( stream , {
893
+ async callServer ( ref , args ) {
894
+ const fn = requireServerRef ( ref ) ;
895
+ return fn . apply ( null , args ) ;
896
+ } ,
897
+ } ) ;
898
+
899
+ function App ( ) {
900
+ return use ( response ) ;
901
+ }
902
+
903
+ const container = document . createElement ( 'div' ) ;
904
+ const root = ReactDOMClient . createRoot ( container ) ;
905
+ await act ( async ( ) => {
906
+ root . render ( < App /> ) ;
907
+ } ) ;
908
+ expect ( container . innerHTML ) . toBe ( 'Click Me' ) ;
909
+ expect ( typeof actionProxy ) . toBe ( 'function' ) ;
910
+ expect ( actionProxy ) . not . toBe ( greet ) ;
911
+
912
+ const result = await actionProxy ( '!' ) ;
913
+ expect ( result ) . toBe ( 'Hello World!' ) ;
914
+ } ) ;
869
915
} ) ;
0 commit comments