@@ -22,6 +22,11 @@ module ReactOnRails
2222 let ( :old_auto_load_bundle ) { ReactOnRails . configuration . auto_load_bundle }
2323
2424 before do
25+ stub_const ( "ReactOnRailsPro" , Class . new do
26+ def self . configuration
27+ @configuration ||= Struct . new ( :enable_rsc_support , :rsc_rendering_url_path ) . new ( false , nil )
28+ end
29+ end )
2530 ReactOnRails . configuration . server_bundle_js_file = server_bundle_js_file
2631 ReactOnRails . configuration . components_subdirectory = "ror_components"
2732 ReactOnRails . configuration . webpack_generated_files = webpack_generated_files
@@ -209,6 +214,154 @@ module ReactOnRails
209214 end
210215 end
211216
217+ context "when RSC support is enabled" do
218+ let ( :components_directory ) { "ReactServerComponents" }
219+ let ( :rsc_rendering_url_path ) { "/rsc" }
220+
221+ before do
222+ stub_packer_source_path ( component_name : components_directory ,
223+ packer_source_path : packer_source_path )
224+ allow ( ReactOnRails ::Utils ) . to receive ( :react_on_rails_pro? ) . and_return ( true )
225+ allow ( ReactOnRailsPro . configuration ) . to receive_messages (
226+ enable_rsc_support : true ,
227+ rsc_rendering_url_path : rsc_rendering_url_path
228+ )
229+ end
230+
231+ context "when common component is not a client entrypoint" do
232+ before do
233+ described_class . instance . generate_packs_if_stale
234+ end
235+
236+ it "creates pack with server component registration" do
237+ component_name = "ReactServerComponent"
238+ component_pack = "#{ generated_directory } /#{ component_name } .js"
239+ pack_content = File . read ( component_pack )
240+ expected_content = <<~CONTENT . strip
241+ import registerServerComponent from 'react-on-rails/registerServerComponent';
242+
243+ registerServerComponent({
244+ rscRenderingUrlPath: "#{ rsc_rendering_url_path } ",
245+ }, "#{ component_name } ")
246+ CONTENT
247+
248+ expect ( pack_content ) . to eq ( expected_content )
249+ end
250+ end
251+
252+ context "when client component is not a client entrypoint" do
253+ before do
254+ described_class . instance . generate_packs_if_stale
255+ end
256+
257+ it "creates pack with client component registration" do
258+ component_name = "ReactClientComponentWithClientAndServer"
259+ component_pack = "#{ generated_directory } /#{ component_name } .js"
260+ pack_content = File . read ( component_pack )
261+ expect ( pack_content ) . to include ( "import ReactOnRails from 'react-on-rails';" )
262+ expect ( pack_content ) . to include ( "ReactOnRails.register({#{ component_name } });" )
263+ expect ( pack_content ) . not_to include ( "registerServerComponent" )
264+ end
265+ end
266+
267+ context "when server component is a client entrypoint" do
268+ before do
269+ described_class . instance . generate_packs_if_stale
270+ end
271+
272+ it "creates pack with server component registration" do
273+ component_name = "ReactServerComponentWithClientAndServer"
274+ component_pack = "#{ generated_directory } /#{ component_name } .js"
275+ pack_content = File . read ( component_pack )
276+ expected_content = <<~CONTENT . strip
277+ import registerServerComponent from 'react-on-rails/registerServerComponent';
278+
279+ registerServerComponent({
280+ rscRenderingUrlPath: "#{ rsc_rendering_url_path } ",
281+ }, "#{ component_name } ")
282+ CONTENT
283+
284+ expect ( pack_content ) . to eq ( expected_content )
285+ end
286+ end
287+
288+ context "when common component is a client entrypoint" do
289+ before do
290+ described_class . instance . generate_packs_if_stale
291+ end
292+
293+ it "creates pack with client component registration" do
294+ component_name = "ReactClientComponent"
295+ component_pack = "#{ generated_directory } /#{ component_name } .js"
296+ pack_content = File . read ( component_pack )
297+ expect ( pack_content ) . to include ( "import ReactOnRails from 'react-on-rails';" )
298+ expect ( pack_content ) . to include ( "ReactOnRails.register({#{ component_name } });" )
299+ expect ( pack_content ) . not_to include ( "registerServerComponent" )
300+ end
301+ end
302+
303+ context "when RSC support is disabled" do
304+ before do
305+ allow ( ReactOnRailsPro . configuration ) . to receive ( :enable_rsc_support ) . and_return ( false )
306+ described_class . instance . generate_packs_if_stale
307+ end
308+
309+ it "creates pack with client component registration" do
310+ component_name = "ReactServerComponent"
311+ component_pack = "#{ generated_directory } /#{ component_name } .js"
312+ pack_content = File . read ( component_pack )
313+ expect ( pack_content ) . to include ( "import ReactOnRails from 'react-on-rails';" )
314+ expect ( pack_content ) . to include ( "ReactOnRails.register({#{ component_name } });" )
315+ expect ( pack_content ) . not_to include ( "registerServerComponent" )
316+ end
317+ end
318+
319+ context "when not using ReactOnRailsPro" do
320+ before do
321+ allow ( ReactOnRails ::Utils ) . to receive ( :react_on_rails_pro? ) . and_return ( false )
322+ described_class . instance . generate_packs_if_stale
323+ end
324+
325+ it "creates pack with client component registration" do
326+ component_name = "ReactServerComponent"
327+ component_pack = "#{ generated_directory } /#{ component_name } .js"
328+ pack_content = File . read ( component_pack )
329+ expect ( pack_content ) . to include ( "import ReactOnRails from 'react-on-rails';" )
330+ expect ( pack_content ) . to include ( "ReactOnRails.register({#{ component_name } });" )
331+ expect ( pack_content ) . not_to include ( "registerServerComponent" )
332+ end
333+ end
334+
335+ context "when registered on server bundle" do
336+ before do
337+ described_class . instance . generate_packs_if_stale
338+ end
339+
340+ it "register all components using ReactOnRails.register" do
341+ generated_server_bundle_path = File . join (
342+ Pathname ( packer_source_entry_path ) . parent ,
343+ "generated/server-bundle-generated.js"
344+ )
345+ generated_server_bundle_content = File . read ( generated_server_bundle_path )
346+ expected_content = <<~CONTENT . strip
347+ import ReactOnRails from 'react-on-rails';
348+
349+ import ReactClientComponent from '../components/ReactServerComponents/ror_components/ReactClientComponent.jsx';
350+ import ReactServerComponent from '../components/ReactServerComponents/ror_components/ReactServerComponent.jsx';
351+ import ReactClientComponentWithClientAndServer from '../components/ReactServerComponents/ror_components/ReactClientComponentWithClientAndServer.server.jsx';
352+ import ReactServerComponentWithClientAndServer from '../components/ReactServerComponents/ror_components/ReactServerComponentWithClientAndServer.server.jsx';
353+
354+ ReactOnRails.register({ReactClientComponent,
355+ ReactServerComponent,
356+ ReactClientComponentWithClientAndServer,
357+ ReactServerComponentWithClientAndServer});
358+ CONTENT
359+
360+ expect ( generated_server_bundle_content . strip ) . to eq ( expected_content . strip )
361+ end
362+ end
363+ end
364+
212365 context "when pack generator is called" do
213366 let ( :component_name ) { "ComponentWithCommonOnly" }
214367 let ( :component_pack ) { "#{ generated_directory } /#{ component_name } .js" }
0 commit comments