react_on_rails 11.0.5 → 13.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +338 -0
  3. data/.eslintignore +2 -1
  4. data/.eslintrc +32 -3
  5. data/.github/FUNDING.yml +1 -0
  6. data/.github/ISSUE_TEMPLATE/bug_report.md +23 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +19 -0
  9. data/.github/workflows/lint-js-and-ruby.yml +54 -0
  10. data/.github/workflows/main.yml +183 -0
  11. data/.github/workflows/package-js-tests.yml +35 -0
  12. data/.github/workflows/rspec-package-specs.yml +46 -0
  13. data/.gitignore +3 -4
  14. data/.prettierignore +14 -0
  15. data/.prettierrc +20 -0
  16. data/.rubocop.yml +76 -34
  17. data/.travis.yml +15 -22
  18. data/CHANGELOG.md +443 -55
  19. data/CONTRIBUTING.md +62 -80
  20. data/Gemfile +1 -35
  21. data/Gemfile.development_dependencies +50 -0
  22. data/KUDOS.md +4 -1
  23. data/{docs/LICENSE.md → LICENSE.md} +1 -1
  24. data/NEWS.md +14 -4
  25. data/REACT-ON-RAILS-PRO-LICENSE +95 -0
  26. data/README.md +107 -802
  27. data/Rakefile +1 -8
  28. data/SUMMARY.md +51 -29
  29. data/book.json +5 -5
  30. data/docs/{basics/generator.md → additional-details/generator-details.md} +5 -13
  31. data/docs/{basics/installation-overview.md → additional-details/manual-installation-overview.md} +9 -14
  32. data/docs/{basics → additional-details}/migrating-from-react-rails.md +1 -1
  33. data/docs/additional-details/recommended-project-structure.md +69 -0
  34. data/docs/additional-details/tips-for-usage-with-sp6.md +15 -0
  35. data/docs/additional-details/upgrade-webpacker-v3-to-v4.md +10 -0
  36. data/docs/api/javascript-api.md +35 -6
  37. data/docs/api/redux-store-api.md +102 -0
  38. data/docs/api/view-helpers-api.md +133 -0
  39. data/docs/contributor-info/errors-with-hooks.md +45 -0
  40. data/docs/contributor-info/linters.md +5 -6
  41. data/docs/contributor-info/pull-requests.md +42 -0
  42. data/docs/contributor-info/releasing.md +1 -1
  43. data/docs/deployment/heroku-deployment.md +39 -0
  44. data/docs/getting-started.md +196 -0
  45. data/docs/guides/client-vs-server-rendering.md +27 -0
  46. data/docs/guides/configuration.md +289 -0
  47. data/docs/guides/deployment.md +5 -0
  48. data/docs/guides/file-system-based-automated-bundle-generation.md +197 -0
  49. data/docs/guides/hmr-and-hot-reloading-with-the-webpack-dev-server.md +104 -0
  50. data/docs/guides/how-react-on-rails-works.md +44 -0
  51. data/docs/guides/how-to-conditionally-server-render-based-on-device-type.md +40 -0
  52. data/docs/guides/how-to-use-different-files-for-client-and-server-rendering.md +98 -0
  53. data/docs/guides/i18n.md +87 -0
  54. data/docs/guides/installation-into-an-existing-rails-app.md +66 -0
  55. data/docs/guides/minitest-configuration.md +31 -0
  56. data/docs/guides/rails-webpacker-react-integration-options.md +213 -0
  57. data/docs/guides/react-on-rails-overview.md +29 -0
  58. data/docs/guides/react-server-rendering.md +32 -0
  59. data/docs/guides/render-functions-and-railscontext.md +205 -0
  60. data/docs/guides/rspec-configuration.md +73 -0
  61. data/docs/guides/tutorial.md +371 -0
  62. data/docs/{basics → guides}/upgrading-react-on-rails.md +126 -3
  63. data/docs/guides/webpack-configuration.md +42 -0
  64. data/docs/home.md +23 -0
  65. data/docs/javascript/asset-pipeline.md +12 -0
  66. data/docs/{additional-reading → javascript}/code-splitting.md +21 -11
  67. data/docs/javascript/converting-from-custom-webpack-config-to-rails-webpacker-config.md +10 -0
  68. data/docs/javascript/credits.md +10 -0
  69. data/docs/{additional-reading → javascript}/images.md +5 -6
  70. data/docs/javascript/react-helmet.md +100 -0
  71. data/docs/javascript/react-router.md +90 -0
  72. data/docs/{additional-reading → javascript}/server-rendering-tips.md +15 -12
  73. data/docs/javascript/troubleshooting-when-using-shakapacker.md +77 -0
  74. data/docs/{additional-reading → javascript}/webpack.md +2 -2
  75. data/docs/misc/articles.md +20 -0
  76. data/docs/misc/doctrine.md +5 -6
  77. data/docs/outdated/deferred-rendering.md +39 -0
  78. data/docs/{additional-reading → outdated}/rails-assets-relative-paths.md +4 -4
  79. data/docs/{additional-reading → outdated}/rails-assets.md +12 -20
  80. data/docs/{misc → outdated}/rails3.md +2 -2
  81. data/docs/rails/convert-rails-5-api-only-app.md +19 -0
  82. data/docs/rails/rails-engine-integration.md +32 -0
  83. data/docs/{additional-reading → rails}/rails_view_rendering_from_inline_javascript.md +2 -1
  84. data/docs/{additional-reading → rails}/turbolinks.md +13 -1
  85. data/docs/react-on-rails-pro/react-on-rails-pro.md +43 -0
  86. data/docs/testimonials/hvmn.md +25 -0
  87. data/docs/testimonials/resortpass.md +13 -0
  88. data/docs/testimonials/testimonials.md +28 -0
  89. data/jest.config.js +4 -0
  90. data/lib/generators/USAGE +1 -1
  91. data/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +41 -0
  92. data/lib/generators/react_on_rails/base_generator.rb +55 -43
  93. data/lib/generators/react_on_rails/bin/dev +30 -0
  94. data/lib/generators/react_on_rails/bin/dev-static +30 -0
  95. data/lib/generators/react_on_rails/dev_tests_generator.rb +4 -3
  96. data/lib/generators/react_on_rails/generator_helper.rb +8 -6
  97. data/lib/generators/react_on_rails/generator_messages.rb +40 -0
  98. data/lib/generators/react_on_rails/install_generator.rb +37 -0
  99. data/lib/generators/react_on_rails/templates/.eslintrc +3 -1
  100. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +4 -6
  101. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static +9 -0
  102. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +21 -40
  103. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +4 -0
  104. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorldServer.js +5 -0
  105. data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/server-bundle.js +8 -0
  106. data/lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb +2 -1
  107. data/lib/generators/react_on_rails/templates/base/base/babel.config.js.tt +32 -0
  108. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +20 -4
  109. data/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +62 -0
  110. data/lib/generators/react_on_rails/templates/base/base/config/webpack/clientWebpackConfig.js.tt +17 -0
  111. data/lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt +17 -0
  112. data/lib/generators/react_on_rails/templates/base/base/config/webpack/development.js.tt +25 -0
  113. data/lib/generators/react_on_rails/templates/base/base/config/webpack/production.js.tt +9 -0
  114. data/lib/generators/react_on_rails/templates/base/base/config/webpack/serverWebpackConfig.js.tt +117 -0
  115. data/lib/generators/react_on_rails/templates/base/base/config/webpack/test.js.tt +9 -0
  116. data/lib/generators/react_on_rails/templates/base/base/config/webpack/webpack.config.js.tt +15 -0
  117. data/lib/generators/react_on_rails/templates/base/base/config/webpack/webpackConfig.js.tt +36 -0
  118. data/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +8 -2
  119. data/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb +1 -1
  120. data/lib/generators/react_on_rails/templates/dev_tests/spec/{features → system}/hello_world_spec.rb +2 -2
  121. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +6 -9
  122. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.js +1 -3
  123. data/lib/react_on_rails/configuration.rb +198 -145
  124. data/lib/react_on_rails/error.rb +2 -0
  125. data/lib/react_on_rails/git_utils.rb +5 -3
  126. data/lib/react_on_rails/{react_on_rails_helper.rb → helper.rb} +201 -190
  127. data/lib/react_on_rails/json_output.rb +1 -1
  128. data/lib/react_on_rails/json_parse_error.rb +28 -0
  129. data/lib/react_on_rails/locales/base.rb +169 -0
  130. data/lib/react_on_rails/locales/to_js.rb +33 -0
  131. data/lib/react_on_rails/locales/to_json.rb +23 -0
  132. data/lib/react_on_rails/packs_generator.rb +234 -0
  133. data/lib/react_on_rails/prerender_error.rb +35 -27
  134. data/lib/react_on_rails/react_component/render_options.rb +64 -9
  135. data/lib/react_on_rails/server_rendering_js_code.rb +55 -0
  136. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +126 -76
  137. data/lib/react_on_rails/server_rendering_pool.rb +0 -1
  138. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +9 -8
  139. data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +17 -0
  140. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +13 -12
  141. data/lib/react_on_rails/test_helper.rb +24 -3
  142. data/lib/react_on_rails/utils.rb +94 -25
  143. data/lib/react_on_rails/version.rb +1 -1
  144. data/lib/react_on_rails/version_checker.rb +5 -1
  145. data/lib/react_on_rails/version_syntax_converter.rb +14 -12
  146. data/lib/react_on_rails/webpacker_utils.rb +105 -5
  147. data/lib/react_on_rails.rb +8 -2
  148. data/lib/tasks/assets.rake +28 -60
  149. data/lib/tasks/generate_packs.rake +11 -0
  150. data/lib/tasks/locale.rake +5 -4
  151. data/package-scripts.yml +49 -0
  152. data/package.json +52 -47
  153. data/rakelib/docker.rake +0 -5
  154. data/rakelib/dummy_apps.rake +5 -8
  155. data/rakelib/example_type.rb +12 -3
  156. data/rakelib/examples.rake +5 -4
  157. data/rakelib/lint.rake +5 -16
  158. data/rakelib/node_package.rake +2 -2
  159. data/rakelib/release.rake +37 -23
  160. data/rakelib/run_rspec.rake +16 -44
  161. data/rakelib/task_helpers.rb +16 -4
  162. data/react_on_rails.gemspec +6 -22
  163. data/tsconfig.json +14 -0
  164. data/webpackConfigLoader.js +5 -4
  165. data/yarn.lock +5935 -3106
  166. metadata +122 -272
  167. data/Gemfile.rails32 +0 -74
  168. data/docs/additional-reading/asset-pipeline.md +0 -20
  169. data/docs/additional-reading/babel.md +0 -5
  170. data/docs/additional-reading/caching-and-performance.md +0 -4
  171. data/docs/additional-reading/heroku-deployment.md +0 -92
  172. data/docs/additional-reading/hot-reloading-rails-development.md +0 -57
  173. data/docs/additional-reading/node-server-rendering.md +0 -5
  174. data/docs/additional-reading/rails-engine-integration.md +0 -34
  175. data/docs/additional-reading/react-helmet.md +0 -80
  176. data/docs/additional-reading/react-router.md +0 -113
  177. data/docs/additional-reading/recommended-project-structure.md +0 -49
  178. data/docs/additional-reading/rspec-configuration.md +0 -56
  179. data/docs/additional-reading/webpack-dev-server.md +0 -15
  180. data/docs/api/ruby-api-hot-reload-view-helpers.md +0 -44
  181. data/docs/api/ruby-api.md +0 -8
  182. data/docs/basics/configuration.md +0 -163
  183. data/docs/basics/i18n.md +0 -77
  184. data/docs/tutorial.md +0 -220
  185. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-server +0 -12
  186. data/lib/react_on_rails/assets_precompile.rb +0 -150
  187. data/lib/react_on_rails/locales_to_js.rb +0 -134
  188. data/ruby-lint.yml +0 -25
  189. /data/docs/{additional-reading → additional-details}/updating-dependencies.md +0 -0
  190. /data/docs/{additional-reading → deployment}/elastic-beanstalk.md +0 -0
  191. /data/docs/{additional-reading → javascript}/angular-js-integration-migration.md +0 -0
  192. /data/docs/{additional-reading → javascript}/capistrano-deployment.md +0 -0
  193. /data/docs/{additional-reading → javascript}/foreman-issues.md +0 -0
  194. /data/docs/{additional-reading → javascript}/node-dependencies-and-npm.md +0 -0
  195. /data/docs/{additional-reading → javascript}/react-and-redux.md +0 -0
  196. /data/docs/{additional-reading → javascript}/troubleshooting-when-using-webpacker.md +0 -0
  197. /data/docs/{additional-reading → javascript}/webpack-v1-notes.md +0 -0
  198. /data/docs/{coding-style → misc}/style.md +0 -0
  199. /data/docs/{additional-reading → misc}/tips.md +0 -0
@@ -1,139 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Metrics/ClassLength
4
+
3
5
  module ReactOnRails
4
6
  def self.configure
5
7
  yield(configuration)
6
- setup_config_values
8
+ configuration.setup_config_values
7
9
  end
8
10
 
9
11
  DEFAULT_GENERATED_ASSETS_DIR = File.join(%w[public webpack], Rails.env).freeze
10
- DEFAULT_SERVER_RENDER_TIMEOUT = 20
11
- DEFAULT_POOL_SIZE = 1
12
-
13
- def self.setup_config_values
14
- ensure_webpack_generated_files_exists
15
- configure_generated_assets_dirs_deprecation
16
- configure_skip_display_none_deprecation
17
- ensure_generated_assets_dir_present
18
- ensure_server_bundle_js_file_has_no_path
19
- check_i18n_directory_exists
20
- check_i18n_yml_directory_exists
21
- check_server_render_method_is_only_execjs
22
- error_if_using_webpacker_and_generated_assets_dir_not_match_public_output_path
23
- end
24
-
25
- def self.error_if_using_webpacker_and_generated_assets_dir_not_match_public_output_path
26
- return unless ReactOnRails::WebpackerUtils.using_webpacker?
27
-
28
- return if @configuration.generated_assets_dir.blank?
29
-
30
- webpacker_public_output_path = ReactOnRails::WebpackerUtils.webpacker_public_output_path
31
-
32
- if File.expand_path(@configuration.generated_assets_dir) == webpacker_public_output_path.to_s
33
- Rails.logger.warn("You specified /config/initializers/react_on_rails.rb generated_assets_dir "\
34
- "with Webpacker. Remove this line from your configuration file.")
35
- else
36
- msg = <<-MSG.strip_heredoc
37
- Error configuring /config/initializers/react_on_rails.rb: You are using webpacker
38
- and your specified value for generated_assets_dir = #{@configuration.generated_assets_dir}
39
- that does not match the value for public_output_path specified in
40
- webpacker.yml = #{webpacker_public_output_path}. You should remove the configuration
41
- value for "generated_assets_dir" from your config/initializers/react_on_rails.rb file.
42
- MSG
43
- raise ReactOnRails::Error, msg
44
- end
45
- end
46
-
47
- def self.check_server_render_method_is_only_execjs
48
- return if @configuration.server_render_method.blank? ||
49
- @configuration.server_render_method == "ExecJS"
50
-
51
- msg = <<-MSG.strip_heredoc
52
- Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.server_render_method`.
53
- If you wish to use a server render method other than ExecJS, contact justin@shakacode.com
54
- for details.
55
- MSG
56
- raise ReactOnRails::Error, msg
57
- end
58
-
59
- def self.check_i18n_directory_exists
60
- return if @configuration.i18n_dir.nil?
61
- return if Dir.exist?(@configuration.i18n_dir)
62
-
63
- msg = <<-MSG.strip_heredoc
64
- Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.i18n_dir`.
65
- Directory does not exist: #{@configuration.i18n_dir}. Set to value to nil or comment it
66
- out if not using the React on Rails i18n feature.
67
- MSG
68
- raise ReactOnRails::Error, msg
69
- end
70
-
71
- def self.check_i18n_yml_directory_exists
72
- return if @configuration.i18n_yml_dir.nil?
73
- return if Dir.exist?(@configuration.i18n_yml_dir)
74
-
75
- msg = <<-MSG.strip_heredoc
76
- Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.i18n_yml_dir`.
77
- Directory does not exist: #{@configuration.i18n_yml_dir}. Set to value to nil or comment it
78
- out if not using this i18n with React on Rails, or if you want to use all translation files.
79
- MSG
80
- raise ReactOnRails::Error, msg
81
- end
82
-
83
- def self.ensure_generated_assets_dir_present
84
- return if @configuration.generated_assets_dir.present? || ReactOnRails::WebpackerUtils.using_webpacker?
85
-
86
- @configuration.generated_assets_dir = DEFAULT_GENERATED_ASSETS_DIR
87
- Rails.logger.warn "ReactOnRails: Set generated_assets_dir to default: #{DEFAULT_GENERATED_ASSETS_DIR}"
88
- end
89
-
90
- def self.configure_generated_assets_dirs_deprecation
91
- return if @configuration.generated_assets_dirs.blank?
92
-
93
- if ReactOnRails::WebpackerUtils.using_webpacker?
94
- webpacker_public_output_path = ReactOnRails::WebpackerUtils.webpacker_public_output_path
95
- Rails.logger.warn "Error configuring config/initializers/react_on_rails. Define neither the "\
96
- "generated_assets_dirs no the generated_assets_dir when using Webpacker. This is defined by "\
97
- "public_output_path specified in webpacker.yml = #{webpacker_public_output_path}."
98
- return
99
- end
100
-
101
- Rails.logger.warn "[DEPRECATION] ReactOnRails: Use config.generated_assets_dir rather than "\
102
- "generated_assets_dirs"
103
- if @configuration.generated_assets_dir.blank?
104
- @configuration.generated_assets_dir = @configuration.generated_assets_dirs
105
- else
106
- Rails.logger.warn "[DEPRECATION] ReactOnRails. You have both generated_assets_dirs and "\
107
- "generated_assets_dir defined. Define ONLY generated_assets_dir if NOT using Webpacker"\
108
- " and define neither if using Webpacker"
109
- end
110
- end
111
-
112
- def self.ensure_webpack_generated_files_exists
113
- return unless @configuration.webpack_generated_files.empty?
114
-
115
- files = ["hello-world-bundle.js"]
116
- files << @configuration.server_bundle_js_file if @configuration.server_bundle_js_file.present?
117
-
118
- @configuration.webpack_generated_files = files
119
- end
120
-
121
- def self.ensure_server_bundle_js_file_has_no_path
122
- return unless @configuration.server_bundle_js_file.include?(File::SEPARATOR)
123
-
124
- assets_dir = ReactOnRails::Utils.generated_assets_full_path
125
- @configuration.server_bundle_js_file = File.basename(@configuration.server_bundle_js_file)
126
-
127
- Rails.logger_warn do
128
- "[DEPRECATION] ReactOnRails: remove path from server_bundle_js_file in configuration. "\
129
- "All generated files must go in #{assets_dir}. Using file basename #{@configuration.server_bundle_js_file}"
130
- end
131
- end
132
-
133
- def self.configure_skip_display_none_deprecation
134
- return if @configuration.skip_display_none.nil?
135
- Rails.logger.warn "[DEPRECATION] ReactOnRails: remove skip_display_none from configuration."
136
- end
137
12
 
138
13
  def self.configuration
139
14
  @configuration ||= Configuration.new(
@@ -143,55 +18,67 @@ module ReactOnRails
143
18
  generated_assets_dir: "",
144
19
  server_bundle_js_file: "",
145
20
  prerender: false,
21
+ auto_load_bundle: false,
146
22
  replay_console: true,
147
23
  logging_on_server: true,
148
- raise_on_prerender_error: false,
24
+ raise_on_prerender_error: Rails.env.development?,
149
25
  trace: Rails.env.development?,
150
26
  development_mode: Rails.env.development?,
151
- server_renderer_pool_size: DEFAULT_POOL_SIZE,
152
- server_renderer_timeout: DEFAULT_SERVER_RENDER_TIMEOUT,
27
+ server_renderer_pool_size: 1,
28
+ server_renderer_timeout: 20,
153
29
  skip_display_none: nil,
154
30
  # skip_display_none is deprecated
155
31
  webpack_generated_files: %w[manifest.json],
156
32
  rendering_extension: nil,
33
+ rendering_props_extension: nil,
157
34
  server_render_method: nil,
158
- symlink_non_digested_assets_regex: nil,
159
35
  build_test_command: "",
160
- build_production_command: ""
36
+ build_production_command: "",
37
+ random_dom_id: true,
38
+ same_bundle_for_client_and_server: false,
39
+ i18n_output_format: nil,
40
+ components_subdirectory: nil,
41
+ make_generated_server_bundle_the_entrypoint: false,
42
+ defer_generated_component_packs: true
161
43
  )
162
44
  end
163
45
 
164
46
  class Configuration
165
47
  attr_accessor :node_modules_location, :server_bundle_js_file, :prerender, :replay_console,
166
- :trace, :development_mode,
167
- :logging_on_server, :server_renderer_pool_size,
48
+ :trace, :development_mode, :logging_on_server, :server_renderer_pool_size,
168
49
  :server_renderer_timeout, :skip_display_none, :raise_on_prerender_error,
169
- :generated_assets_dirs, :generated_assets_dir,
50
+ :generated_assets_dirs, :generated_assets_dir, :components_subdirectory,
170
51
  :webpack_generated_files, :rendering_extension, :build_test_command,
171
- :build_production_command,
172
- :i18n_dir, :i18n_yml_dir,
173
- :server_render_method, :symlink_non_digested_assets_regex
52
+ :build_production_command, :i18n_dir, :i18n_yml_dir, :i18n_output_format,
53
+ :server_render_method, :random_dom_id, :auto_load_bundle,
54
+ :same_bundle_for_client_and_server, :rendering_props_extension,
55
+ :make_generated_server_bundle_the_entrypoint,
56
+ :defer_generated_component_packs
174
57
 
58
+ # rubocop:disable Metrics/AbcSize
175
59
  def initialize(node_modules_location: nil, server_bundle_js_file: nil, prerender: nil,
176
- replay_console: nil,
60
+ replay_console: nil, make_generated_server_bundle_the_entrypoint: nil,
177
61
  trace: nil, development_mode: nil,
178
62
  logging_on_server: nil, server_renderer_pool_size: nil,
179
63
  server_renderer_timeout: nil, raise_on_prerender_error: true,
180
64
  skip_display_none: nil, generated_assets_dirs: nil,
181
65
  generated_assets_dir: nil, webpack_generated_files: nil,
182
66
  rendering_extension: nil, build_test_command: nil,
183
- build_production_command: nil,
184
- i18n_dir: nil, i18n_yml_dir: nil,
185
- server_render_method: nil, symlink_non_digested_assets_regex: nil)
67
+ build_production_command: nil, defer_generated_component_packs: nil,
68
+ same_bundle_for_client_and_server: nil,
69
+ i18n_dir: nil, i18n_yml_dir: nil, i18n_output_format: nil,
70
+ random_dom_id: nil, server_render_method: nil, rendering_props_extension: nil,
71
+ components_subdirectory: nil, auto_load_bundle: nil)
186
72
  self.node_modules_location = node_modules_location.present? ? node_modules_location : Rails.root
187
- self.server_bundle_js_file = server_bundle_js_file
188
73
  self.generated_assets_dirs = generated_assets_dirs
189
74
  self.generated_assets_dir = generated_assets_dir
190
75
  self.build_test_command = build_test_command
191
76
  self.build_production_command = build_production_command
192
77
  self.i18n_dir = i18n_dir
193
78
  self.i18n_yml_dir = i18n_yml_dir
79
+ self.i18n_output_format = i18n_output_format
194
80
 
81
+ self.random_dom_id = random_dom_id
195
82
  self.prerender = prerender
196
83
  self.replay_console = replay_console
197
84
  self.logging_on_server = logging_on_server
@@ -203,8 +90,11 @@ module ReactOnRails
203
90
  self.trace = trace.nil? ? Rails.env.development? : trace
204
91
  self.raise_on_prerender_error = raise_on_prerender_error
205
92
  self.skip_display_none = skip_display_none
93
+ self.rendering_props_extension = rendering_props_extension
206
94
 
207
95
  # Server rendering:
96
+ self.server_bundle_js_file = server_bundle_js_file
97
+ self.same_bundle_for_client_and_server = same_bundle_for_client_and_server
208
98
  self.server_renderer_pool_size = self.development_mode ? 1 : server_renderer_pool_size
209
99
  self.server_renderer_timeout = server_renderer_timeout # seconds
210
100
 
@@ -212,7 +102,170 @@ module ReactOnRails
212
102
  self.rendering_extension = rendering_extension
213
103
 
214
104
  self.server_render_method = server_render_method
215
- self.symlink_non_digested_assets_regex = symlink_non_digested_assets_regex
105
+ self.components_subdirectory = components_subdirectory
106
+ self.auto_load_bundle = auto_load_bundle
107
+ self.make_generated_server_bundle_the_entrypoint = make_generated_server_bundle_the_entrypoint
108
+ self.defer_generated_component_packs = defer_generated_component_packs
109
+ end
110
+ # rubocop:enable Metrics/AbcSize
111
+
112
+ # on ReactOnRails
113
+ def setup_config_values
114
+ check_autobundling_requirements_if_configured
115
+ ensure_webpack_generated_files_exists
116
+ configure_generated_assets_dirs_deprecation
117
+ configure_skip_display_none_deprecation
118
+ ensure_generated_assets_dir_present
119
+ check_server_render_method_is_only_execjs
120
+ error_if_using_webpacker_and_generated_assets_dir_not_match_public_output_path
121
+ # check_deprecated_settings
122
+ adjust_precompile_task
123
+ end
124
+
125
+ private
126
+
127
+ def check_autobundling_requirements_if_configured
128
+ raise_missing_components_subdirectory if auto_load_bundle && !components_subdirectory.present?
129
+ return unless components_subdirectory.present?
130
+
131
+ ReactOnRails::WebpackerUtils.raise_shakapacker_not_installed unless ReactOnRails::WebpackerUtils.using_webpacker?
132
+ ReactOnRails::WebpackerUtils.raise_shakapacker_version_incompatible_for_autobundling unless
133
+ ReactOnRails::WebpackerUtils.shackapacker_version_requirement_met?(
134
+ ReactOnRails::PacksGenerator::MINIMUM_SHAKAPACKER_VERSION
135
+ )
136
+ ReactOnRails::WebpackerUtils.raise_nested_entries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
137
+ end
138
+
139
+ def adjust_precompile_task
140
+ skip_react_on_rails_precompile = %w[no false n f].include?(ENV["REACT_ON_RAILS_PRECOMPILE"])
141
+
142
+ return if skip_react_on_rails_precompile || build_production_command.blank?
143
+
144
+ if Webpacker.config.webpacker_precompile?
145
+ msg = <<~MSG
146
+
147
+ React on Rails and Shakapacker error in configuration!
148
+ In order to use config/react_on_rails.rb config.build_production_command,
149
+ you must edit config/webpacker.yml to include this value in the default configuration:
150
+ 'webpacker_precompile: false'
151
+
152
+ Alternatively, remove the config/react_on_rails.rb config.build_production_command and the
153
+ default bin/webpacker script will be used for assets:precompile.
154
+
155
+ MSG
156
+ raise ReactOnRails::Error, msg
157
+ end
158
+
159
+ precompile_tasks = lambda {
160
+ Rake::Task["react_on_rails:generate_packs"].invoke
161
+ Rake::Task["react_on_rails:assets:webpack"].invoke
162
+ puts "Invoking task webpacker:clean from React on Rails"
163
+
164
+ # VERSIONS is per the shakacode/shakapacker clean method definition.
165
+ # We set it very big so that it is not used, and then clean just
166
+ # removes files older than 1 hour.
167
+ versions = 100_000
168
+ Rake::Task["webpacker:clean"].invoke(versions)
169
+ }
170
+
171
+ if Rake::Task.task_defined?("assets:precompile")
172
+ Rake::Task["assets:precompile"].enhance do
173
+ precompile_tasks.call
174
+ end
175
+ else
176
+ Rake::Task.define_task("assets:precompile") do
177
+ precompile_tasks.call
178
+ end
179
+ end
180
+ end
181
+
182
+ def error_if_using_webpacker_and_generated_assets_dir_not_match_public_output_path
183
+ return unless ReactOnRails::WebpackerUtils.using_webpacker?
184
+
185
+ return if generated_assets_dir.blank?
186
+
187
+ webpacker_public_output_path = ReactOnRails::WebpackerUtils.webpacker_public_output_path
188
+
189
+ if File.expand_path(generated_assets_dir) == webpacker_public_output_path.to_s
190
+ Rails.logger.warn("You specified generated_assets_dir in `config/initializers/react_on_rails.rb` "\
191
+ "with Webpacker. Remove this line from your configuration file.")
192
+ else
193
+ msg = <<~MSG
194
+ Error configuring /config/initializers/react_on_rails.rb: You are using webpacker
195
+ and your specified value for generated_assets_dir = #{generated_assets_dir}
196
+ that does not match the value for public_output_path specified in
197
+ webpacker.yml = #{webpacker_public_output_path}. You should remove the configuration
198
+ value for "generated_assets_dir" from your config/initializers/react_on_rails.rb file.
199
+ MSG
200
+ raise ReactOnRails::Error, msg
201
+ end
202
+ end
203
+
204
+ def check_server_render_method_is_only_execjs
205
+ return if server_render_method.blank? ||
206
+ server_render_method == "ExecJS"
207
+
208
+ msg = <<-MSG.strip_heredoc
209
+ Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.server_render_method`.
210
+ If you wish to use a server render method other than ExecJS, contact justin@shakacode.com
211
+ for details.
212
+ MSG
213
+ raise ReactOnRails::Error, msg
214
+ end
215
+
216
+ def ensure_generated_assets_dir_present
217
+ return if generated_assets_dir.present? || ReactOnRails::WebpackerUtils.using_webpacker?
218
+
219
+ self.generated_assets_dir = DEFAULT_GENERATED_ASSETS_DIR
220
+ Rails.logger.warn "ReactOnRails: Set generated_assets_dir to default: #{DEFAULT_GENERATED_ASSETS_DIR}"
221
+ end
222
+
223
+ def configure_generated_assets_dirs_deprecation
224
+ return if generated_assets_dirs.blank?
225
+
226
+ if ReactOnRails::WebpackerUtils.using_webpacker?
227
+ webpacker_public_output_path = ReactOnRails::WebpackerUtils.webpacker_public_output_path
228
+ Rails.logger.warn "Error configuring config/initializers/react_on_rails. Define neither the "\
229
+ "generated_assets_dirs no the generated_assets_dir when using Webpacker. This is defined by "\
230
+ "public_output_path specified in webpacker.yml = #{webpacker_public_output_path}."
231
+ return
232
+ end
233
+
234
+ Rails.logger.warn "[DEPRECATION] ReactOnRails: Use config.generated_assets_dir rather than "\
235
+ "generated_assets_dirs"
236
+ if generated_assets_dir.blank?
237
+ self.generated_assets_dir = generated_assets_dirs
238
+ else
239
+ Rails.logger.warn "[DEPRECATION] ReactOnRails. You have both generated_assets_dirs and "\
240
+ "generated_assets_dir defined. Define ONLY generated_assets_dir if NOT using Webpacker"\
241
+ " and define neither if using Webpacker"
242
+ end
243
+ end
244
+
245
+ def ensure_webpack_generated_files_exists
246
+ return unless webpack_generated_files.empty?
247
+
248
+ files = ["manifest.json"]
249
+ files << server_bundle_js_file if server_bundle_js_file.present?
250
+
251
+ self.webpack_generated_files = files
252
+ end
253
+
254
+ def configure_skip_display_none_deprecation
255
+ return if skip_display_none.nil?
256
+
257
+ Rails.logger.warn "[DEPRECATION] ReactOnRails: remove skip_display_none from configuration."
258
+ end
259
+
260
+ def raise_missing_components_subdirectory
261
+ msg = <<~MSG
262
+ **ERROR** ReactOnRails: auto_load_bundle is set to true, yet components_subdirectory is unconfigured.\
263
+ Please set components_subdirectory to the desired directory. For more information, please see \
264
+ https://www.shakacode.com/react-on-rails/docs/guides/file-system-based-automated-bundle-generation.md
265
+ MSG
266
+
267
+ raise ReactOnRails::Error, msg
216
268
  end
217
269
  end
218
270
  end
271
+ # rubocop:enable Metrics/ClassLength
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ReactOnRails
2
4
  class Error < StandardError
3
5
  end
@@ -6,12 +6,14 @@ module ReactOnRails
6
6
  module GitUtils
7
7
  def self.uncommitted_changes?(message_handler)
8
8
  return false if ENV["COVERAGE"] == "true"
9
+
9
10
  status = `git status --porcelain`
10
11
  return false if $CHILD_STATUS.success? && status.empty?
11
- error = if !$CHILD_STATUS.success?
12
- "You do not have Git installed. Please install Git, and commit your changes before continuing"
13
- else
12
+
13
+ error = if $CHILD_STATUS.success?
14
14
  "You have uncommitted code. Please commit or stash your changes before continuing"
15
+ else
16
+ "You do not have Git installed. Please install Git, and commit your changes before continuing"
15
17
  end
16
18
  message_handler.add_error(error)
17
19
  true