Skip to content

Commit 5d05df3

Browse files
add rsc_bundle_js_file config and update utils spec
1 parent 3352a1a commit 5d05df3

File tree

4 files changed

+51
-54
lines changed

4 files changed

+51
-54
lines changed

lib/react_on_rails/configuration.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def self.configuration
1717
# generated_assets_dirs is deprecated
1818
generated_assets_dir: "",
1919
server_bundle_js_file: "",
20+
rsc_bundle_js_file: "",
2021
prerender: false,
2122
auto_load_bundle: false,
2223
replay_console: true,
@@ -55,7 +56,7 @@ class Configuration
5556
:server_render_method, :random_dom_id, :auto_load_bundle,
5657
:same_bundle_for_client_and_server, :rendering_props_extension,
5758
:make_generated_server_bundle_the_entrypoint,
58-
:defer_generated_component_packs,
59+
:defer_generated_component_packs, :rsc_bundle_js_file,
5960
:force_load
6061

6162
# rubocop:disable Metrics/AbcSize
@@ -71,7 +72,8 @@ def initialize(node_modules_location: nil, server_bundle_js_file: nil, prerender
7172
same_bundle_for_client_and_server: nil,
7273
i18n_dir: nil, i18n_yml_dir: nil, i18n_output_format: nil,
7374
random_dom_id: nil, server_render_method: nil, rendering_props_extension: nil,
74-
components_subdirectory: nil, auto_load_bundle: nil, force_load: nil)
75+
components_subdirectory: nil, auto_load_bundle: nil, force_load: nil,
76+
rsc_bundle_js_file: nil)
7577
self.node_modules_location = node_modules_location.present? ? node_modules_location : Rails.root
7678
self.generated_assets_dirs = generated_assets_dirs
7779
self.generated_assets_dir = generated_assets_dir
@@ -97,6 +99,7 @@ def initialize(node_modules_location: nil, server_bundle_js_file: nil, prerender
9799

98100
# Server rendering:
99101
self.server_bundle_js_file = server_bundle_js_file
102+
self.rsc_bundle_js_file = rsc_bundle_js_file
100103
self.same_bundle_for_client_and_server = same_bundle_for_client_and_server
101104
self.server_renderer_pool_size = self.development_mode ? 1 : server_renderer_pool_size
102105
self.server_renderer_timeout = server_renderer_timeout # seconds
@@ -241,7 +244,7 @@ def ensure_webpack_generated_files_exists
241244

242245
files = ["manifest.json"]
243246
files << server_bundle_js_file if server_bundle_js_file.present?
244-
247+
files << rsc_bundle_js_file if rsc_bundle_js_file.present?
245248
self.webpack_generated_files = files
246249
end
247250

lib/react_on_rails/packer_utils.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ def self.bundle_js_uri_from_packer(bundle_name)
7474
# the webpack-dev-server is provided by the config value
7575
# "same_bundle_for_client_and_server" where a value of true
7676
# would mean that the bundle is created by the webpack-dev-server
77-
is_server_bundle = bundle_name == ReactOnRails.configuration.server_bundle_js_file
77+
is_bundle_running_on_server = (bundle_name == ReactOnRails.configuration.server_bundle_js_file) ||
78+
(bundle_name == ReactOnRails.configuration.rsc_bundle_js_file)
7879

79-
if packer.dev_server.running? && (!is_server_bundle ||
80+
if packer.dev_server.running? && (!is_bundle_running_on_server ||
8081
ReactOnRails.configuration.same_bundle_for_client_and_server)
8182
"#{packer.dev_server.protocol}://#{packer.dev_server.host_with_port}#{hashed_bundle_name}"
8283
else

lib/react_on_rails/utils.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ def self.server_bundle_js_file_path
114114
def self.rsc_bundle_js_file_path
115115
return @rsc_bundle_path if @rsc_bundle_path && !Rails.env.development?
116116

117-
# TODO: make it configurable
118-
bundle_name = "rsc-bundle.js"
117+
bundle_name = ReactOnRails.configuration.rsc_bundle_js_file
119118
@rsc_bundle_path = bundle_js_file_path(bundle_name)
120119
end
121120

spec/react_on_rails/utils_spec.rb

Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ def mock_missing_manifest_entry(bundle_name)
8181
)::Manifest::MissingEntryError)
8282
end
8383

84+
def random_bundle_name
85+
"webpack-bundle-#{SecureRandom.hex(4)}.js"
86+
end
87+
88+
# If bundle names are not provided, random unique names will be used for each bundle.
89+
# This ensures that if server_bundle and rsc_bundle are accidentally swapped in the code,
90+
# the tests will fail since each bundle has a distinct random name that won't match if used incorrectly.
91+
def mock_bundle_configs(server_bundle_name: random_bundle_name, rsc_bundle_name: random_bundle_name)
92+
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
93+
.and_return(server_bundle_name)
94+
allow(ReactOnRails).to receive_message_chain("configuration.rsc_bundle_js_file")
95+
.and_return(rsc_bundle_name)
96+
end
97+
8498
def mock_dev_server_running
8599
allow(ReactOnRails::PackerUtils.packer).to receive_message_chain("dev_server.running?")
86100
.and_return(true)
@@ -123,8 +137,7 @@ def mock_dev_server_running
123137
before do
124138
mock_bundle_in_manifest("webpack-bundle.js", "/webpack/dev/webpack-bundle-0123456789abcdef.js")
125139

126-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
127-
.and_return("server-bundle.js")
140+
mock_bundle_configs(server_bundle_name: "server-bundle.js")
128141
end
129142

130143
it { is_expected.to eq("#{packer_public_output_path}/webpack-bundle-0123456789abcdef.js") }
@@ -183,8 +196,7 @@ def mock_dev_server_running
183196
context "with server file not in manifest", packer_type.to_sym do
184197
it "returns the unhashed server path" do
185198
server_bundle_name = "server-bundle.js"
186-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
187-
.and_return(server_bundle_name)
199+
mock_bundle_configs(server_bundle_name: server_bundle_name)
188200
mock_missing_manifest_entry(server_bundle_name)
189201

190202
path = described_class.server_bundle_js_file_path
@@ -196,8 +208,7 @@ def mock_dev_server_running
196208
context "with server file in the manifest, used for client", packer_type.to_sym do
197209
it "returns the correct path hashed server path" do
198210
Packer = ReactOnRails::PackerUtils.packer # rubocop:disable Lint/ConstantDefinitionInBlock, RSpec/LeakyConstantDeclaration
199-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
200-
.and_return("webpack-bundle.js")
211+
mock_bundle_configs(server_bundle_name: "webpack-bundle.js")
201212
allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
202213
.and_return(true)
203214
mock_bundle_in_manifest("webpack-bundle.js", "webpack/development/webpack-bundle-123456.js")
@@ -211,8 +222,7 @@ def mock_dev_server_running
211222

212223
context "with webpack-dev-server running, and same file used for server and client" do
213224
it "returns the correct path hashed server path" do
214-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
215-
.and_return("webpack-bundle.js")
225+
mock_bundle_configs(server_bundle_name: "webpack-bundle.js")
216226
allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
217227
.and_return(true)
218228
mock_dev_server_running
@@ -228,8 +238,7 @@ def mock_dev_server_running
228238
context "with dev-server running, and server file in the manifest, and separate client/server files",
229239
packer_type.to_sym do
230240
it "returns the correct path hashed server path" do
231-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
232-
.and_return("server-bundle.js")
241+
mock_bundle_configs(server_bundle_name: "server-bundle.js")
233242
allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
234243
.and_return(false)
235244
mock_bundle_in_manifest("server-bundle.js", "webpack/development/server-bundle-123456.js")
@@ -248,29 +257,23 @@ def mock_dev_server_running
248257

249258
context "with server file not in manifest", packer_type.to_sym do
250259
it "returns the unhashed server path" do
251-
server_bundle_name = "rsc-server-bundle.js"
252-
allow(ReactOnRails).to receive_message_chain("configuration.rsc_bundle_js_file")
253-
.and_return(server_bundle_name)
254-
# TODO: fix after adding rsc_bundle_js_file config
255-
mock_missing_manifest_entry("rsc-bundle.js")
260+
server_bundle_name = "rsc-bundle.js"
261+
mock_bundle_configs(rsc_bundle_name: server_bundle_name)
262+
mock_missing_manifest_entry(server_bundle_name)
256263

257264
path = described_class.rsc_bundle_js_file_path
258265

259-
expect(path).to end_with("public/webpack/development/rsc-bundle.js")
266+
expect(path).to end_with("public/webpack/development/#{server_bundle_name}")
260267
end
261268
end
262269

263270
context "with server file in the manifest, used for client", packer_type.to_sym do
264271
it "returns the correct path hashed server path" do
265272
Packer = ReactOnRails::PackerUtils.packer # rubocop:disable Lint/ConstantDefinitionInBlock, RSpec/LeakyConstantDeclaration
266-
allow(ReactOnRails).to receive_message_chain("configuration.rsc_bundle_js_file")
267-
.and_return("webpack-bundle.js")
268-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
269-
.and_return("webpack-server-bundle.js")
273+
mock_bundle_configs(rsc_bundle_name: "webpack-bundle.js")
270274
allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
271275
.and_return(true)
272-
# TODO: fix after adding rsc_bundle_js_file config
273-
mock_bundle_in_manifest("rsc-bundle.js", "webpack/development/webpack-bundle-123456.js")
276+
mock_bundle_in_manifest("webpack-bundle.js", "webpack/development/webpack-bundle-123456.js")
274277
allow(Packer).to receive_message_chain("dev_server.running?")
275278
.and_return(false)
276279

@@ -281,15 +284,11 @@ def mock_dev_server_running
281284

282285
context "with webpack-dev-server running, and same file used for server and client" do
283286
it "returns the correct path hashed server path" do
284-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
285-
.and_return("webpack-bundle.js")
286-
allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
287-
.and_return("webpack-server-bundle.js")
287+
mock_bundle_configs(rsc_bundle_name: "webpack-bundle.js")
288288
allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
289289
.and_return(true)
290290
mock_dev_server_running
291-
# TODO: fix after adding rsc_bundle_js_file config
292-
mock_bundle_in_manifest("rsc-bundle.js", "/webpack/development/webpack-bundle-123456.js")
291+
mock_bundle_in_manifest("webpack-bundle.js", "/webpack/development/webpack-bundle-123456.js")
293292

294293
path = described_class.rsc_bundle_js_file_path
295294

@@ -298,25 +297,20 @@ def mock_dev_server_running
298297
end
299298
end
300299

301-
# TODO: fix after adding rsc_bundle_js_file config
302-
# context "with dev-server running, and server file in the manifest, and separate client/server files",
303-
# packer_type.to_sym do
304-
# it "returns the correct path hashed server path" do
305-
# # TODO: fix after adding rsc_bundle_js_file config
306-
# allow(ReactOnRails).to receive_message_chain("configuration.rsc_bundle_js_file")
307-
# .and_return("rsc-server-bundle.js")
308-
# allow(ReactOnRails).to receive_message_chain("configuration.server_bundle_js_file")
309-
# .and_return("server-bundle.js")
310-
# allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
311-
# .and_return(false)
312-
# mock_bundle_in_manifest("rsc-bundle.js", "webpack/development/server-bundle-123456.js")
313-
# mock_dev_server_running
314-
315-
# path = described_class.rsc_bundle_js_file_path
316-
317-
# expect(path).to end_with("/public/webpack/development/server-bundle-123456.js")
318-
# end
319-
# end
300+
context "with dev-server running, and server file in the manifest, and separate client/server files",
301+
packer_type.to_sym do
302+
it "returns the correct path hashed server path" do
303+
mock_bundle_configs(rsc_bundle_name: "rsc-bundle.js")
304+
allow(ReactOnRails).to receive_message_chain("configuration.same_bundle_for_client_and_server")
305+
.and_return(false)
306+
mock_bundle_in_manifest("rsc-bundle.js", "webpack/development/server-bundle-123456.js")
307+
mock_dev_server_running
308+
309+
path = described_class.rsc_bundle_js_file_path
310+
311+
expect(path).to end_with("/public/webpack/development/server-bundle-123456.js")
312+
end
313+
end
320314
end
321315
end
322316

0 commit comments

Comments
 (0)