react_on_rails 13.3.0 → 13.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +5 -4
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  4. data/.github/PULL_REQUEST_TEMPLATE.md +19 -0
  5. data/.github/workflows/lint-js-and-ruby.yml +2 -1
  6. data/.github/workflows/main.yml +17 -18
  7. data/.github/workflows/rspec-package-specs.yml +1 -0
  8. data/.prettierignore +3 -1
  9. data/CHANGELOG.md +106 -56
  10. data/Gemfile.development_dependencies +2 -2
  11. data/README.md +9 -1
  12. data/docs/additional-details/recommended-project-structure.md +6 -6
  13. data/docs/additional-details/tips-for-usage-with-sp6.md +15 -0
  14. data/docs/deployment/heroku-deployment.md +15 -11
  15. data/docs/getting-started.md +28 -27
  16. data/docs/guides/configuration.md +29 -19
  17. data/docs/guides/deployment.md +3 -2
  18. data/docs/guides/file-system-based-automated-bundle-generation.md +57 -51
  19. data/docs/guides/hmr-and-hot-reloading-with-the-webpack-dev-server.md +10 -10
  20. data/docs/guides/how-react-on-rails-works.md +6 -6
  21. data/docs/guides/how-to-conditionally-server-render-based-on-device-type.md +2 -1
  22. data/docs/guides/installation-into-an-existing-rails-app.md +10 -8
  23. data/docs/guides/rails-webpacker-react-integration-options.md +34 -4
  24. data/docs/guides/react-on-rails-overview.md +6 -7
  25. data/docs/guides/rspec-configuration.md +11 -11
  26. data/docs/guides/tutorial.md +89 -83
  27. data/docs/guides/upgrading-react-on-rails.md +2 -2
  28. data/docs/guides/webpack-configuration.md +14 -14
  29. data/docs/home.md +3 -3
  30. data/docs/javascript/asset-pipeline.md +4 -4
  31. data/docs/javascript/converting-from-custom-webpack-config-to-rails-webpacker-config.md +8 -8
  32. data/docs/javascript/server-rendering-tips.md +1 -1
  33. data/docs/javascript/troubleshooting-when-using-shakapacker.md +77 -0
  34. data/docs/outdated/rails-assets-relative-paths.md +1 -1
  35. data/docs/outdated/rails-assets.md +1 -1
  36. data/docs/react-on-rails-pro/react-on-rails-pro.md +1 -1
  37. data/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +41 -0
  38. data/lib/generators/react_on_rails/base_generator.rb +3 -47
  39. data/lib/generators/react_on_rails/bin/dev +2 -5
  40. data/lib/generators/react_on_rails/bin/dev-static +2 -5
  41. data/lib/generators/react_on_rails/generator_messages.rb +40 -0
  42. data/lib/generators/react_on_rails/install_generator.rb +30 -0
  43. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +2 -2
  44. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static +2 -2
  45. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +2 -2
  46. data/lib/generators/react_on_rails/templates/base/base/config/{webpacker.yml → shakapacker.yml} +3 -3
  47. data/lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt +3 -1
  48. data/lib/react_on_rails/configuration.rb +16 -16
  49. data/lib/react_on_rails/helper.rb +26 -27
  50. data/lib/react_on_rails/packs_generator.rb +12 -5
  51. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +1 -3
  52. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +1 -1
  53. data/lib/react_on_rails/test_helper.rb +10 -1
  54. data/lib/react_on_rails/utils.rb +0 -4
  55. data/lib/react_on_rails/version.rb +1 -1
  56. data/lib/react_on_rails/webpacker_utils.rb +8 -3
  57. data/package.json +1 -1
  58. data/rakelib/dummy_apps.rake +6 -1
  59. data/rakelib/run_rspec.rake +1 -15
  60. metadata +7 -3
@@ -313,27 +313,25 @@ module ReactOnRails
313
313
  @rails_context.merge(serverSide: server_side)
314
314
  end
315
315
 
316
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
317
-
318
- private
316
+ def load_pack_for_generated_component(react_component_name, render_options)
317
+ return unless render_options.auto_load_bundle
319
318
 
320
- def load_pack_for_component(component_name)
321
- is_component_pack_present = File.exist?(generated_components_pack_path(component_name))
322
- is_development = ENV["RAILS_ENV"] == "development"
323
-
324
- if is_development && !is_component_pack_present
325
- ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
326
- raise_missing_pack_error(component_name)
319
+ ReactOnRails::WebpackerUtils.raise_nested_entries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
320
+ if Rails.env.development?
321
+ is_component_pack_present = File.exist?(generated_components_pack_path(react_component_name))
322
+ raise_missing_autoloaded_bundle(react_component_name) unless is_component_pack_present
327
323
  end
324
+ append_javascript_pack_tag("generated/#{react_component_name}",
325
+ defer: ReactOnRails.configuration.defer_generated_component_packs)
326
+ append_stylesheet_pack_tag("generated/#{react_component_name}")
327
+ end
328
328
 
329
- ReactOnRails::WebpackerUtils.raise_nested_entries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
329
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
330
330
 
331
- ApplicationController.helpers.append_javascript_pack_tag "generated/#{component_name}"
332
- ApplicationController.helpers.append_stylesheet_pack_tag "generated/#{component_name}"
333
- end
331
+ private
334
332
 
335
- def generated_components_pack_path(component_name)
336
- "#{ReactOnRails::WebpackerUtils.webpacker_source_entry_path}/generated/#{component_name}.js"
333
+ def generated_components_pack_path(react_component_name)
334
+ "#{ReactOnRails::WebpackerUtils.webpacker_source_entry_path}/generated/#{react_component_name}.js"
337
335
  end
338
336
 
339
337
  def build_react_component_result_for_server_rendered_string(
@@ -446,7 +444,7 @@ module ReactOnRails
446
444
  # Create the HTML rendering part
447
445
  result = server_rendered_react_component(render_options)
448
446
 
449
- load_pack_for_component react_component_name if render_options.auto_load_bundle
447
+ load_pack_for_generated_component(react_component_name, render_options)
450
448
 
451
449
  {
452
450
  render_options: render_options,
@@ -551,16 +549,6 @@ module ReactOnRails
551
549
  result
552
550
  end
553
551
 
554
- def raise_missing_pack_error(component_name)
555
- msg = <<~MSG
556
- **ERROR** ReactOnRails: Generated missing pack for Component: #{component_name}. Please restart the webpack dev server or webpack in watch mode, to ensure webpack generates the chunks corresponding to #{component_name} component. If the problem persists
557
- 1. Verify `components_subdirectory` is configured in `config/initializers/react_on_rails`.
558
- 2. Component: #{component_name} is placed inside the configured `components_subdirectory`.
559
- MSG
560
-
561
- raise ReactOnRails::Error, msg
562
- end
563
-
564
552
  def replay_console_option(val)
565
553
  val.nil? ? ReactOnRails.configuration.replay_console : val
566
554
  end
@@ -577,6 +565,17 @@ module ReactOnRails
577
565
  instrument_method :react_component, type: "ReactOnRails", name: "react_component"
578
566
  instrument_method :react_component_hash, type: "ReactOnRails", name: "react_component_hash"
579
567
  end
568
+
569
+ def raise_missing_autoloaded_bundle(react_component_name)
570
+ msg = <<~MSG
571
+ **ERROR** ReactOnRails: Component "#{react_component_name}" is configured as "auto_load_bundle: true"
572
+ but the generated component entrypoint, which should have been at #{generated_components_pack_path(react_component_name)},
573
+ is missing. You might want to check that this component is in a directory named "#{ReactOnRails.configuration.components_subdirectory}"
574
+ & that "bundle exec rake react_on_rails:generate_packs" has been run.
575
+ MSG
576
+
577
+ raise ReactOnRails::Error, msg
578
+ end
580
579
  end
581
580
  end
582
581
  # rubocop:enable Metrics/ModuleLength
@@ -13,6 +13,8 @@ module ReactOnRails
13
13
  end
14
14
 
15
15
  def generate_packs_if_stale
16
+ return unless ReactOnRails.configuration.auto_load_bundle
17
+
16
18
  are_generated_files_present_and_up_to_date = Dir.exist?(generated_packs_directory_path) &&
17
19
  File.exist?(generated_server_bundle_file_path) &&
18
20
  !stale_or_missing_packs?
@@ -78,6 +80,8 @@ module ReactOnRails
78
80
  end
79
81
 
80
82
  def add_generated_pack_to_server_bundle
83
+ return if ReactOnRails.configuration.make_generated_server_bundle_the_entrypoint
84
+
81
85
  relative_path_to_generated_server_bundle = relative_path(server_bundle_entrypoint,
82
86
  generated_server_bundle_file_path)
83
87
  content = <<~FILE_CONTENT
@@ -93,11 +97,15 @@ module ReactOnRails
93
97
  end
94
98
 
95
99
  def generated_server_bundle_file_path
100
+ return server_bundle_entrypoint if ReactOnRails.configuration.make_generated_server_bundle_the_entrypoint
101
+
96
102
  generated_server_bundle_file_path = server_bundle_entrypoint.sub(".js", "-generated.js")
97
103
  generated_server_bundle_file_name = component_name(generated_server_bundle_file_path)
98
- source_entry_path = ReactOnRails::WebpackerUtils.webpacker_source_entry_path
104
+ source_entrypoint_parent = Pathname(ReactOnRails::WebpackerUtils.webpacker_source_entry_path).parent
105
+ generated_nonentrypoints_path = "#{source_entrypoint_parent}/generated"
99
106
 
100
- "#{source_entry_path}/#{generated_server_bundle_file_name}.js"
107
+ FileUtils.mkdir_p(generated_nonentrypoints_path)
108
+ "#{generated_nonentrypoints_path}/#{generated_server_bundle_file_name}.js"
101
109
  end
102
110
 
103
111
  def clean_generated_packs_directory
@@ -214,12 +222,11 @@ module ReactOnRails
214
222
 
215
223
  def stale_or_missing_packs?
216
224
  component_files = common_component_to_path.values + client_component_to_path.values
217
- most_recent_mtime = Utils.find_most_recent_mtime(component_files)
225
+ most_recent_mtime = Utils.find_most_recent_mtime(component_files).to_i
218
226
 
219
227
  component_files.each_with_object([]).any? do |file|
220
228
  path = generated_pack_path(file)
221
-
222
- !File.exist?(path) || File.mtime(path) < most_recent_mtime
229
+ !File.exist?(path) || File.mtime(path).to_i < most_recent_mtime
223
230
  end
224
231
  end
225
232
  end
@@ -113,9 +113,7 @@ module ReactOnRails
113
113
 
114
114
  def eval_js(js_code, _render_options)
115
115
  @js_context_pool.with do |js_context|
116
- result = js_context.eval(js_code)
117
- js_context.eval("console.history = []")
118
- result
116
+ js_context.eval(js_code)
119
117
  end
120
118
  end
121
119
 
@@ -37,7 +37,7 @@ module ReactOnRails
37
37
  # All done if no stale files!
38
38
  return if stale_gen_files.empty?
39
39
 
40
- ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
40
+ ReactOnRails::PacksGenerator.instance.generate_packs_if_stale if ReactOnRails.configuration.auto_load_bundle
41
41
 
42
42
  # Inform the developer that we're ensuring gen assets are ready.
43
43
  puts_start_compile_check_message(stale_gen_files)
@@ -35,8 +35,17 @@ module ReactOnRails
35
35
  def self.configure_rspec_to_compile_assets(config, *metatags)
36
36
  metatags = %i[js server_rendering controller] if metatags.empty?
37
37
 
38
+ # Supported since RSpec 3.5.0
39
+ supports_first_matching_example = config.respond_to?(:when_first_matching_example_defined)
40
+
38
41
  metatags.each do |metatag|
39
- config.before(:example, metatag) { ReactOnRails::TestHelper.ensure_assets_compiled }
42
+ if supports_first_matching_example
43
+ config.when_first_matching_example_defined(metatag) do
44
+ ReactOnRails::TestHelper.ensure_assets_compiled
45
+ end
46
+ else
47
+ config.before(:example, metatag) { ReactOnRails::TestHelper.ensure_assets_compiled }
48
+ end
40
49
  end
41
50
  end
42
51
 
@@ -219,9 +219,5 @@ module ReactOnRails
219
219
 
220
220
  puts "Prepended\n#{text_to_prepend}to #{file}."
221
221
  end
222
-
223
- def self.semver_to_string(ary)
224
- "#{ary[0]}.#{ary[1]}.#{ary[2]}"
225
- end
226
222
  end
227
223
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReactOnRails
4
- VERSION = "13.3.0"
4
+ VERSION = "13.4.0"
5
5
  end
@@ -27,9 +27,10 @@ module ReactOnRails
27
27
  @shakapacker_version_as_array = [match[1].to_i, match[2].to_i, match[3].to_i]
28
28
  end
29
29
 
30
- def self.shackapacker_version_requirement_met?(ary)
31
- ary[0] >= shakapacker_version_as_array[0] && ary[1] >= shakapacker_version_as_array[1] &&
32
- ary[2] >= shakapacker_version_as_array[2]
30
+ def self.shackapacker_version_requirement_met?(required_version)
31
+ req_ver = semver_to_string(required_version)
32
+
33
+ Gem::Version.new(shakapacker_version) >= Gem::Version.new(req_ver)
33
34
  end
34
35
 
35
36
  # This returns either a URL for the webpack-dev-server, non-server bundle or
@@ -136,5 +137,9 @@ module ReactOnRails
136
137
 
137
138
  raise ReactOnRails::Error, msg
138
139
  end
140
+
141
+ def self.semver_to_string(ary)
142
+ "#{ary[0]}.#{ary[1]}.#{ary[2]}"
143
+ end
139
144
  end
140
145
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-on-rails",
3
- "version": "13.3.0",
3
+ "version": "13.4.0",
4
4
  "description": "react-on-rails JavaScript for react_on_rails Ruby gem",
5
5
  "main": "node_package/lib/ReactOnRails.js",
6
6
  "directories": {
@@ -16,7 +16,12 @@ namespace :dummy_apps do
16
16
  bundle_install_in(dummy_app_dir)
17
17
  end
18
18
 
19
- task dummy_apps: %i[dummy_app node_package] do
19
+ task :generate_packs do
20
+ dummy_app_dir = File.join(gem_root, "spec/dummy")
21
+ sh_in_dir(dummy_app_dir, "bundle exec rake react_on_rails:generate_packs")
22
+ end
23
+
24
+ task dummy_apps: %i[dummy_app node_package generate_packs] do
20
25
  puts "Prepared all Dummy Apps"
21
26
  end
22
27
  end
@@ -20,15 +20,11 @@ namespace :run_rspec do
20
20
 
21
21
  desc "Runs dummy rspec with turbolinks"
22
22
  task dummy: ["dummy_apps:dummy_app"] do
23
- clean_gen_assets(spec_dummy_dir)
24
- bundle_install_in(dummy_app_dir)
25
23
  run_tests_in(spec_dummy_dir)
26
24
  end
27
25
 
28
26
  desc "Runs dummy rspec without turbolinks"
29
27
  task dummy_no_turbolinks: ["dummy_apps:dummy_app"] do
30
- clean_gen_assets(spec_dummy_dir)
31
- bundle_install_in(dummy_app_dir)
32
28
  run_tests_in(spec_dummy_dir,
33
29
  env_vars: "DISABLE_TURBOLINKS=TRUE",
34
30
  command_name: "dummy_no_turbolinks")
@@ -47,15 +43,10 @@ namespace :run_rspec do
47
43
  ExampleType.all.each { |example_type| Rake::Task[example_type.rspec_task_name].invoke }
48
44
  end
49
45
 
50
- desc "(HACK) Run RSpec on spec/empty_spec in order to have SimpleCov generate a coverage report from cache"
51
- task :empty do
52
- sh %(#{ENV['USE_COVERALLS'] ? 'COVERAGE=true' : ''} rspec spec/empty_spec.rb)
53
- end
54
-
55
46
  Coveralls::RakeTask.new if ENV["USE_COVERALLS"] == "TRUE"
56
47
 
57
48
  desc "run all tests no examples"
58
- task all_but_examples: %i[gem dummy_no_turbolinks dummy empty js_tests] do
49
+ task all_but_examples: %i[gem dummy_no_turbolinks dummy js_tests] do
59
50
  puts "Completed all RSpec tests"
60
51
  end
61
52
 
@@ -110,8 +101,3 @@ def run_tests_in(dir, options = {})
110
101
  env_vars << "COVERAGE=true" if ENV["USE_COVERALLS"]
111
102
  sh_in_dir(path.realpath, "#{env_vars} bundle exec rspec #{rspec_args}")
112
103
  end
113
-
114
- def clean_gen_assets(dir)
115
- path = calc_path(dir)
116
- sh_in_dir(path.realpath, "yarn run build:clean")
117
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_on_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.3.0
4
+ version: 13.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-29 00:00:00.000000000 Z
11
+ date: 2023-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -124,6 +124,7 @@ files:
124
124
  - ".github/FUNDING.yml"
125
125
  - ".github/ISSUE_TEMPLATE/bug_report.md"
126
126
  - ".github/ISSUE_TEMPLATE/feature_request.md"
127
+ - ".github/PULL_REQUEST_TEMPLATE.md"
127
128
  - ".github/workflows/lint-js-and-ruby.yml"
128
129
  - ".github/workflows/main.yml"
129
130
  - ".github/workflows/package-js-tests.yml"
@@ -156,6 +157,7 @@ files:
156
157
  - docs/additional-details/manual-installation-overview.md
157
158
  - docs/additional-details/migrating-from-react-rails.md
158
159
  - docs/additional-details/recommended-project-structure.md
160
+ - docs/additional-details/tips-for-usage-with-sp6.md
159
161
  - docs/additional-details/updating-dependencies.md
160
162
  - docs/additional-details/upgrade-webpacker-v3-to-v4.md
161
163
  - docs/api/javascript-api.md
@@ -202,6 +204,7 @@ files:
202
204
  - docs/javascript/react-helmet.md
203
205
  - docs/javascript/react-router.md
204
206
  - docs/javascript/server-rendering-tips.md
207
+ - docs/javascript/troubleshooting-when-using-shakapacker.md
205
208
  - docs/javascript/troubleshooting-when-using-webpacker.md
206
209
  - docs/javascript/webpack-v1-notes.md
207
210
  - docs/javascript/webpack.md
@@ -224,6 +227,7 @@ files:
224
227
  - docs/testimonials/testimonials.md
225
228
  - jest.config.js
226
229
  - lib/generators/USAGE
230
+ - lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb
227
231
  - lib/generators/react_on_rails/base_generator.rb
228
232
  - lib/generators/react_on_rails/bin/dev
229
233
  - lib/generators/react_on_rails/bin/dev-static
@@ -246,6 +250,7 @@ files:
246
250
  - lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb
247
251
  - lib/generators/react_on_rails/templates/base/base/babel.config.js.tt
248
252
  - lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb
253
+ - lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml
249
254
  - lib/generators/react_on_rails/templates/base/base/config/webpack/clientWebpackConfig.js.tt
250
255
  - lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt
251
256
  - lib/generators/react_on_rails/templates/base/base/config/webpack/development.js.tt
@@ -254,7 +259,6 @@ files:
254
259
  - lib/generators/react_on_rails/templates/base/base/config/webpack/test.js.tt
255
260
  - lib/generators/react_on_rails/templates/base/base/config/webpack/webpack.config.js.tt
256
261
  - lib/generators/react_on_rails/templates/base/base/config/webpack/webpackConfig.js.tt
257
- - lib/generators/react_on_rails/templates/base/base/config/webpacker.yml
258
262
  - lib/generators/react_on_rails/templates/dev_tests/.eslintrc
259
263
  - lib/generators/react_on_rails/templates/dev_tests/.rspec
260
264
  - lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb