react_on_rails 11.0.0 → 12.0.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 (130) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +320 -0
  3. data/.eslintignore +2 -1
  4. data/.eslintrc +30 -2
  5. data/.github/FUNDING.yml +1 -0
  6. data/.gitignore +3 -1
  7. data/.prettierignore +10 -0
  8. data/.prettierrc +23 -0
  9. data/.release-it.json +3 -0
  10. data/.rubocop.yml +39 -11
  11. data/.travis.yml +11 -22
  12. data/CHANGELOG.md +235 -6
  13. data/CONTRIBUTING.md +64 -84
  14. data/Gemfile +3 -5
  15. data/KUDOS.md +4 -1
  16. data/{docs/LICENSE.md → LICENSE.md} +1 -1
  17. data/PROJECTS.md +7 -1
  18. data/REACT-ON-RAILS-PRO-LICENSE +95 -0
  19. data/README.md +233 -630
  20. data/Rakefile +1 -5
  21. data/SUMMARY.md +42 -29
  22. data/book.json +5 -5
  23. data/docs/additional-reading/asset-pipeline.md +8 -16
  24. data/docs/additional-reading/convert-rails-5-api-only-app.md +19 -0
  25. data/docs/additional-reading/credits.md +10 -0
  26. data/docs/additional-reading/images.md +1 -1
  27. data/docs/additional-reading/rails-engine-integration.md +7 -0
  28. data/docs/additional-reading/rails_view_rendering_from_inline_javascript.md +2 -1
  29. data/docs/additional-reading/react-helmet.md +30 -10
  30. data/docs/additional-reading/react-router.md +52 -75
  31. data/docs/additional-reading/server-rendering-tips.md +14 -11
  32. data/docs/additional-reading/upgrade-webpacker-v3-to-v4.md +10 -0
  33. data/docs/additional-reading/webpack.md +2 -2
  34. data/docs/api/javascript-api.md +24 -4
  35. data/docs/api/redux-store-api.md +102 -0
  36. data/docs/api/view-helpers-api.md +133 -0
  37. data/docs/articles.md +20 -0
  38. data/docs/basics/client-vs-server-rendering.md +23 -0
  39. data/docs/basics/configuration.md +145 -61
  40. data/docs/basics/deployment.md +4 -0
  41. data/docs/basics/{generator.md → generator-details.md} +5 -8
  42. data/docs/basics/heroku-deployment.md +24 -0
  43. data/docs/basics/hmr-and-hot-reloading-with-the-webpack-dev-server.md +49 -0
  44. data/docs/basics/i18n.md +45 -23
  45. data/docs/basics/installation-into-an-existing-rails-app.md +59 -0
  46. data/docs/basics/minitest-configuration.md +31 -0
  47. data/docs/basics/react-server-rendering.md +29 -0
  48. data/docs/{additional-reading → basics}/recommended-project-structure.md +38 -10
  49. data/docs/basics/render-functions-and-railscontext.md +205 -0
  50. data/docs/basics/rspec-configuration.md +73 -0
  51. data/docs/basics/upgrading-react-on-rails.md +75 -4
  52. data/docs/basics/webpack-configuration.md +50 -0
  53. data/docs/contributor-info/errors-with-hooks.md +45 -0
  54. data/docs/contributor-info/pull-requests.md +44 -0
  55. data/docs/misc/doctrine.md +2 -2
  56. data/docs/{additional-reading → outdated}/code-splitting.md +19 -9
  57. data/docs/outdated/how-react-on-rails-works.md +44 -0
  58. data/docs/{basics/installation-overview.md → outdated/manual-installation-overview.md} +8 -13
  59. data/docs/{additional-reading → outdated}/rails-assets-relative-paths.md +3 -3
  60. data/docs/{additional-reading → outdated}/rails-assets.md +5 -13
  61. data/docs/testimonials/hvmn.md +25 -0
  62. data/docs/testimonials/resortpass.md +13 -0
  63. data/docs/testimonials/testimonials.md +28 -0
  64. data/docs/tutorial.md +182 -44
  65. data/jest.config.js +4 -0
  66. data/lib/generators/USAGE +1 -1
  67. data/lib/generators/react_on_rails/base_generator.rb +2 -2
  68. data/lib/generators/react_on_rails/dev_tests_generator.rb +3 -2
  69. data/lib/generators/react_on_rails/generator_helper.rb +4 -6
  70. data/lib/generators/react_on_rails/install_generator.rb +2 -0
  71. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +3 -1
  72. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hmr +26 -0
  73. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +20 -40
  74. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +4 -1
  75. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +4 -8
  76. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.js +1 -3
  77. data/lib/react_on_rails/configuration.rb +175 -102
  78. data/lib/react_on_rails/error.rb +2 -0
  79. data/lib/react_on_rails/git_utils.rb +2 -0
  80. data/lib/react_on_rails/{react_on_rails_helper.rb → helper.rb} +201 -225
  81. data/lib/react_on_rails/json_output.rb +1 -1
  82. data/lib/react_on_rails/json_parse_error.rb +28 -0
  83. data/lib/react_on_rails/locales/base.rb +150 -0
  84. data/lib/react_on_rails/locales/to_js.rb +37 -0
  85. data/lib/react_on_rails/locales/to_json.rb +27 -0
  86. data/lib/react_on_rails/prerender_error.rb +56 -18
  87. data/lib/react_on_rails/react_component/render_options.rb +98 -0
  88. data/lib/react_on_rails/server_rendering_js_code.rb +42 -0
  89. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +139 -106
  90. data/lib/react_on_rails/server_rendering_pool.rb +4 -16
  91. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +7 -8
  92. data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +17 -0
  93. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +10 -6
  94. data/lib/react_on_rails/test_helper.rb +18 -7
  95. data/lib/react_on_rails/utils.rb +66 -26
  96. data/lib/react_on_rails/version.rb +1 -1
  97. data/lib/react_on_rails/version_checker.rb +5 -1
  98. data/lib/react_on_rails/version_syntax_converter.rb +14 -12
  99. data/lib/react_on_rails/webpacker_utils.rb +44 -10
  100. data/lib/react_on_rails.rb +8 -3
  101. data/lib/tasks/assets.rake +33 -46
  102. data/lib/tasks/locale.rake +4 -2
  103. data/package-scripts.yml +49 -0
  104. data/package.json +49 -40
  105. data/rakelib/dummy_apps.rake +1 -9
  106. data/rakelib/example_type.rb +3 -1
  107. data/rakelib/examples.rake +3 -0
  108. data/rakelib/lint.rake +2 -7
  109. data/rakelib/node_package.rake +2 -2
  110. data/rakelib/release.rake +4 -8
  111. data/rakelib/run_rspec.rake +5 -18
  112. data/react_on_rails.gemspec +5 -6
  113. data/tsconfig.json +14 -0
  114. data/webpackConfigLoader.js +5 -4
  115. data/yarn.lock +7645 -1821
  116. metadata +71 -61
  117. data/Gemfile.rails32 +0 -74
  118. data/docs/additional-reading/babel.md +0 -5
  119. data/docs/additional-reading/caching-and-performance.md +0 -4
  120. data/docs/additional-reading/heroku-deployment.md +0 -92
  121. data/docs/additional-reading/hot-reloading-rails-development.md +0 -57
  122. data/docs/additional-reading/node-server-rendering.md +0 -5
  123. data/docs/additional-reading/rspec-configuration.md +0 -56
  124. data/docs/api/ruby-api-hot-reload-view-helpers.md +0 -44
  125. data/docs/api/ruby-api.md +0 -8
  126. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-server +0 -12
  127. data/lib/react_on_rails/assets_precompile.rb +0 -150
  128. data/lib/react_on_rails/locales_to_js.rb +0 -134
  129. data/lib/react_on_rails/react_component/options.rb +0 -64
  130. /data/docs/{misc → outdated}/rails3.md +0 -0
@@ -1,103 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # NOTE: ReactOnRails::Utils.using_webpacker? always will return false when called here.
3
+ # rubocop:disable Metrics/ClassLength
4
4
 
5
5
  module ReactOnRails
6
6
  def self.configure
7
7
  yield(configuration)
8
- setup_config_values
8
+ configuration.setup_config_values
9
9
  end
10
10
 
11
11
  DEFAULT_GENERATED_ASSETS_DIR = File.join(%w[public webpack], Rails.env).freeze
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
- end
23
-
24
- def self.check_server_render_method_is_only_execjs
25
- return if @configuration.server_render_method.blank? ||
26
- @configuration.server_render_method == "ExecJS"
27
-
28
- msg = <<-MSG.strip_heredoc
29
- Error configuring /config/react_on_rails.rb: invalid value for `config.server_render_method`.
30
- If you wish to use a server render method other than ExecJS, contact justin@shakacode.com
31
- for details.
32
- MSG
33
- raise ReactOnRails::Error, msg
34
- end
35
-
36
- def self.check_i18n_directory_exists
37
- return if @configuration.i18n_dir.nil?
38
- return if Dir.exist?(@configuration.i18n_dir)
39
-
40
- msg = <<-MSG.strip_heredoc
41
- Error configuring /config/react_on_rails.rb: invalid value for `config.i18n_dir`.
42
- Directory does not exist: #{@configuration.i18n_dir}. Set to value to nil or comment it
43
- out if not using the React on Rails i18n feature.
44
- MSG
45
- raise ReactOnRails::Error, msg
46
- end
47
-
48
- def self.check_i18n_yml_directory_exists
49
- return if @configuration.i18n_yml_dir.nil?
50
- return if Dir.exist?(@configuration.i18n_yml_dir)
51
-
52
- msg = <<-MSG.strip_heredoc
53
- Error configuring /config/react_on_rails.rb: invalid value for `config.i18n_yml_dir`.
54
- Directory does not exist: #{@configuration.i18n_yml_dir}. Set to value to nil or comment it
55
- out if not using this i18n with React on Rails, or if you want to use all translation files.
56
- MSG
57
- raise ReactOnRails::Error, msg
58
- end
59
-
60
- def self.ensure_generated_assets_dir_present
61
- return if @configuration.generated_assets_dir.present?
62
-
63
- @configuration.generated_assets_dir = DEFAULT_GENERATED_ASSETS_DIR
64
- puts "ReactOnRails: Set generated_assets_dir to default: #{DEFAULT_GENERATED_ASSETS_DIR}"
65
- end
66
-
67
- def self.configure_generated_assets_dirs_deprecation
68
- return if @configuration.generated_assets_dirs.blank?
69
-
70
- puts "[DEPRECATION] ReactOnRails: Use config.generated_assets_dir rather than "\
71
- "generated_assets_dirs"
72
- if @configuration.generated_assets_dir.blank?
73
- @configuration.generated_assets_dir = @configuration.generated_assets_dirs
74
- else
75
- puts "[DEPRECATION] ReactOnRails. You have both generated_assets_dirs and "\
76
- "generated_assets_dir defined. Define ONLY generated_assets_dir"
77
- end
78
- end
79
-
80
- def self.ensure_webpack_generated_files_exists
81
- return unless @configuration.webpack_generated_files.empty?
82
-
83
- files = ["hello-world-bundle.js"]
84
- files << @configuration.server_bundle_js_file if @configuration.server_bundle_js_file.present?
85
-
86
- @configuration.webpack_generated_files = files
87
- end
88
-
89
- def self.ensure_server_bundle_js_file_has_no_path
90
- return unless @configuration.server_bundle_js_file.include?(File::SEPARATOR)
91
-
92
- puts "[DEPRECATION] ReactOnRails: remove path from server_bundle_js_file in configuration. "\
93
- "All generated files must go in #{@configuration.generated_assets_dir}"
94
- @configuration.server_bundle_js_file = File.basename(@configuration.server_bundle_js_file)
95
- end
96
-
97
- def self.configure_skip_display_none_deprecation
98
- return if @configuration.skip_display_none.nil?
99
- puts "[DEPRECATION] ReactOnRails: remove skip_display_none from configuration."
100
- end
12
+ DEFAULT_SERVER_RENDER_TIMEOUT = 20
13
+ DEFAULT_POOL_SIZE = 1
14
+ DEFAULT_RANDOM_DOM_ID = true # for backwards compatability
101
15
 
102
16
  def self.configuration
103
17
  @configuration ||= Configuration.new(
@@ -109,19 +23,21 @@ module ReactOnRails
109
23
  prerender: false,
110
24
  replay_console: true,
111
25
  logging_on_server: true,
112
- raise_on_prerender_error: false,
26
+ raise_on_prerender_error: Rails.env.development?,
113
27
  trace: Rails.env.development?,
114
28
  development_mode: Rails.env.development?,
115
- server_renderer_pool_size: 1,
116
- server_renderer_timeout: 20,
29
+ server_renderer_pool_size: DEFAULT_POOL_SIZE,
30
+ server_renderer_timeout: DEFAULT_SERVER_RENDER_TIMEOUT,
117
31
  skip_display_none: nil,
118
32
  # skip_display_none is deprecated
119
33
  webpack_generated_files: %w[manifest.json],
120
34
  rendering_extension: nil,
121
35
  server_render_method: nil,
122
- symlink_non_digested_assets_regex: nil,
123
36
  build_test_command: "",
124
- build_production_command: ""
37
+ build_production_command: "",
38
+ random_dom_id: DEFAULT_RANDOM_DOM_ID,
39
+ same_bundle_for_client_and_server: false,
40
+ i18n_output_format: nil
125
41
  )
126
42
  end
127
43
 
@@ -133,8 +49,9 @@ module ReactOnRails
133
49
  :generated_assets_dirs, :generated_assets_dir,
134
50
  :webpack_generated_files, :rendering_extension, :build_test_command,
135
51
  :build_production_command,
136
- :i18n_dir, :i18n_yml_dir,
137
- :server_render_method, :symlink_non_digested_assets_regex
52
+ :i18n_dir, :i18n_yml_dir, :i18n_output_format,
53
+ :server_render_method, :random_dom_id,
54
+ :same_bundle_for_client_and_server
138
55
 
139
56
  def initialize(node_modules_location: nil, server_bundle_js_file: nil, prerender: nil,
140
57
  replay_console: nil,
@@ -145,17 +62,19 @@ module ReactOnRails
145
62
  generated_assets_dir: nil, webpack_generated_files: nil,
146
63
  rendering_extension: nil, build_test_command: nil,
147
64
  build_production_command: nil,
148
- i18n_dir: nil, i18n_yml_dir: nil,
149
- server_render_method: nil, symlink_non_digested_assets_regex: nil)
65
+ same_bundle_for_client_and_server: nil,
66
+ i18n_dir: nil, i18n_yml_dir: nil, i18n_output_format: nil,
67
+ random_dom_id: nil, server_render_method: nil)
150
68
  self.node_modules_location = node_modules_location.present? ? node_modules_location : Rails.root
151
- self.server_bundle_js_file = server_bundle_js_file
152
69
  self.generated_assets_dirs = generated_assets_dirs
153
70
  self.generated_assets_dir = generated_assets_dir
154
71
  self.build_test_command = build_test_command
155
72
  self.build_production_command = build_production_command
156
73
  self.i18n_dir = i18n_dir
157
74
  self.i18n_yml_dir = i18n_yml_dir
75
+ self.i18n_output_format = i18n_output_format
158
76
 
77
+ self.random_dom_id = random_dom_id
159
78
  self.prerender = prerender
160
79
  self.replay_console = replay_console
161
80
  self.logging_on_server = logging_on_server
@@ -169,6 +88,8 @@ module ReactOnRails
169
88
  self.skip_display_none = skip_display_none
170
89
 
171
90
  # Server rendering:
91
+ self.server_bundle_js_file = server_bundle_js_file
92
+ self.same_bundle_for_client_and_server = same_bundle_for_client_and_server
172
93
  self.server_renderer_pool_size = self.development_mode ? 1 : server_renderer_pool_size
173
94
  self.server_renderer_timeout = server_renderer_timeout # seconds
174
95
 
@@ -176,7 +97,159 @@ module ReactOnRails
176
97
  self.rendering_extension = rendering_extension
177
98
 
178
99
  self.server_render_method = server_render_method
179
- self.symlink_non_digested_assets_regex = symlink_non_digested_assets_regex
100
+ end
101
+
102
+ # on ReactOnRails
103
+ def setup_config_values
104
+ ensure_webpack_generated_files_exists
105
+ configure_generated_assets_dirs_deprecation
106
+ configure_skip_display_none_deprecation
107
+ ensure_generated_assets_dir_present
108
+ check_i18n_directory_exists
109
+ check_i18n_yml_directory_exists
110
+ check_server_render_method_is_only_execjs
111
+ error_if_using_webpacker_and_generated_assets_dir_not_match_public_output_path
112
+ check_deprecated_settings
113
+ end
114
+
115
+ private
116
+
117
+ def check_deprecated_settings
118
+ if build_production_command.present? &&
119
+ ReactOnRails::WebpackerUtils.webpacker_webpack_production_config_exists?
120
+ msg = <<~MSG
121
+ Setting ReactOnRails configuration for `build_production_command` is
122
+ not necessary if you have config/webpack/production.js. When that file
123
+ exists, React on Rails DOES NOT modify the standard assets:precompile.
124
+ If you want React on Rails to modify to the standard assets:precompile
125
+ to use your config/initializers/react_on_rails.rb config.build_production_command
126
+ then delete the config/webpack/production.js.
127
+ MSG
128
+ Rails.logger.warn(msg)
129
+ end
130
+ #
131
+ # msg = <<~MSG
132
+ # ReactOnRails configuration for `build_production_command` is removed.
133
+ # Move this command into `bin/webpack` converting the script to a shell script.
134
+ # MSG
135
+ # raise ReactOnRails::Error, msg
136
+ # Commenting out until v13 when
137
+ # https://github.com/rails/webpacker/issues/2640 gets resolved
138
+ # if node_modules_location.present?
139
+ # Rails.logger.warn("ReactOnRails configuration for `node_modules_location` is deprecated. "\
140
+ # "Instead, prepend a `cd client` (or whichever location) before your test command.")
141
+ # end
142
+ #
143
+ # return unless build_production_command.present?
144
+ #
145
+ # msg = <<~MSG
146
+ # ReactOnRails configuration for `build_production_command` is removed.
147
+ # Move this command into `bin/webpack` converting the script to a shell script.
148
+ # MSG
149
+ # raise ReactOnRails::Error, msg
150
+ end
151
+
152
+ def error_if_using_webpacker_and_generated_assets_dir_not_match_public_output_path
153
+ return unless ReactOnRails::WebpackerUtils.using_webpacker?
154
+
155
+ return if generated_assets_dir.blank?
156
+
157
+ webpacker_public_output_path = ReactOnRails::WebpackerUtils.webpacker_public_output_path
158
+
159
+ if File.expand_path(generated_assets_dir) == webpacker_public_output_path.to_s
160
+ Rails.logger.warn("You specified generated_assets_dir in `config/initializers/react_on_rails.rb` "\
161
+ "with Webpacker. Remove this line from your configuration file.")
162
+ else
163
+ msg = <<~MSG
164
+ Error configuring /config/initializers/react_on_rails.rb: You are using webpacker
165
+ and your specified value for generated_assets_dir = #{generated_assets_dir}
166
+ that does not match the value for public_output_path specified in
167
+ webpacker.yml = #{webpacker_public_output_path}. You should remove the configuration
168
+ value for "generated_assets_dir" from your config/initializers/react_on_rails.rb file.
169
+ MSG
170
+ raise ReactOnRails::Error, msg
171
+ end
172
+ end
173
+
174
+ def check_server_render_method_is_only_execjs
175
+ return if server_render_method.blank? ||
176
+ server_render_method == "ExecJS"
177
+
178
+ msg = <<-MSG.strip_heredoc
179
+ Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.server_render_method`.
180
+ If you wish to use a server render method other than ExecJS, contact justin@shakacode.com
181
+ for details.
182
+ MSG
183
+ raise ReactOnRails::Error, msg
184
+ end
185
+
186
+ def check_i18n_directory_exists
187
+ return if i18n_dir.nil?
188
+ return if Dir.exist?(i18n_dir)
189
+
190
+ msg = <<-MSG.strip_heredoc
191
+ Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.i18n_dir`.
192
+ Directory does not exist: #{i18n_dir}. Set to value to nil or comment it
193
+ out if not using the React on Rails i18n feature.
194
+ MSG
195
+ raise ReactOnRails::Error, msg
196
+ end
197
+
198
+ def check_i18n_yml_directory_exists
199
+ return if i18n_yml_dir.nil?
200
+ return if Dir.exist?(i18n_yml_dir)
201
+
202
+ msg = <<-MSG.strip_heredoc
203
+ Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.i18n_yml_dir`.
204
+ Directory does not exist: #{i18n_yml_dir}. Set to value to nil or comment it
205
+ out if not using this i18n with React on Rails, or if you want to use all translation files.
206
+ MSG
207
+ raise ReactOnRails::Error, msg
208
+ end
209
+
210
+ def ensure_generated_assets_dir_present
211
+ return if generated_assets_dir.present? || ReactOnRails::WebpackerUtils.using_webpacker?
212
+
213
+ self.generated_assets_dir = DEFAULT_GENERATED_ASSETS_DIR
214
+ Rails.logger.warn "ReactOnRails: Set generated_assets_dir to default: #{DEFAULT_GENERATED_ASSETS_DIR}"
215
+ end
216
+
217
+ def configure_generated_assets_dirs_deprecation
218
+ return if generated_assets_dirs.blank?
219
+
220
+ if ReactOnRails::WebpackerUtils.using_webpacker?
221
+ webpacker_public_output_path = ReactOnRails::WebpackerUtils.webpacker_public_output_path
222
+ Rails.logger.warn "Error configuring config/initializers/react_on_rails. Define neither the "\
223
+ "generated_assets_dirs no the generated_assets_dir when using Webpacker. This is defined by "\
224
+ "public_output_path specified in webpacker.yml = #{webpacker_public_output_path}."
225
+ return
226
+ end
227
+
228
+ Rails.logger.warn "[DEPRECATION] ReactOnRails: Use config.generated_assets_dir rather than "\
229
+ "generated_assets_dirs"
230
+ if generated_assets_dir.blank?
231
+ self.generated_assets_dir = generated_assets_dirs
232
+ else
233
+ Rails.logger.warn "[DEPRECATION] ReactOnRails. You have both generated_assets_dirs and "\
234
+ "generated_assets_dir defined. Define ONLY generated_assets_dir if NOT using Webpacker"\
235
+ " and define neither if using Webpacker"
236
+ end
237
+ end
238
+
239
+ def ensure_webpack_generated_files_exists
240
+ return unless webpack_generated_files.empty?
241
+
242
+ files = ["manifest.json"]
243
+ files << server_bundle_js_file if server_bundle_js_file.present?
244
+
245
+ self.webpack_generated_files = files
246
+ end
247
+
248
+ def configure_skip_display_none_deprecation
249
+ return if skip_display_none.nil?
250
+
251
+ Rails.logger.warn "[DEPRECATION] ReactOnRails: remove skip_display_none from configuration."
180
252
  end
181
253
  end
182
254
  end
255
+ # 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,8 +6,10 @@ 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?
12
+
11
13
  error = if !$CHILD_STATUS.success?
12
14
  "You do not have Git installed. Please install Git, and commit your changes before continuing"
13
15
  else