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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +338 -0
- data/.eslintignore +2 -1
- data/.eslintrc +32 -3
- data/.github/FUNDING.yml +1 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +23 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +19 -0
- data/.github/workflows/lint-js-and-ruby.yml +54 -0
- data/.github/workflows/main.yml +183 -0
- data/.github/workflows/package-js-tests.yml +35 -0
- data/.github/workflows/rspec-package-specs.yml +46 -0
- data/.gitignore +3 -4
- data/.prettierignore +14 -0
- data/.prettierrc +20 -0
- data/.rubocop.yml +76 -34
- data/.travis.yml +15 -22
- data/CHANGELOG.md +443 -55
- data/CONTRIBUTING.md +62 -80
- data/Gemfile +1 -35
- data/Gemfile.development_dependencies +50 -0
- data/KUDOS.md +4 -1
- data/{docs/LICENSE.md → LICENSE.md} +1 -1
- data/NEWS.md +14 -4
- data/REACT-ON-RAILS-PRO-LICENSE +95 -0
- data/README.md +107 -802
- data/Rakefile +1 -8
- data/SUMMARY.md +51 -29
- data/book.json +5 -5
- data/docs/{basics/generator.md → additional-details/generator-details.md} +5 -13
- data/docs/{basics/installation-overview.md → additional-details/manual-installation-overview.md} +9 -14
- data/docs/{basics → additional-details}/migrating-from-react-rails.md +1 -1
- data/docs/additional-details/recommended-project-structure.md +69 -0
- data/docs/additional-details/tips-for-usage-with-sp6.md +15 -0
- data/docs/additional-details/upgrade-webpacker-v3-to-v4.md +10 -0
- data/docs/api/javascript-api.md +35 -6
- data/docs/api/redux-store-api.md +102 -0
- data/docs/api/view-helpers-api.md +133 -0
- data/docs/contributor-info/errors-with-hooks.md +45 -0
- data/docs/contributor-info/linters.md +5 -6
- data/docs/contributor-info/pull-requests.md +42 -0
- data/docs/contributor-info/releasing.md +1 -1
- data/docs/deployment/heroku-deployment.md +39 -0
- data/docs/getting-started.md +196 -0
- data/docs/guides/client-vs-server-rendering.md +27 -0
- data/docs/guides/configuration.md +289 -0
- data/docs/guides/deployment.md +5 -0
- data/docs/guides/file-system-based-automated-bundle-generation.md +197 -0
- data/docs/guides/hmr-and-hot-reloading-with-the-webpack-dev-server.md +104 -0
- data/docs/guides/how-react-on-rails-works.md +44 -0
- data/docs/guides/how-to-conditionally-server-render-based-on-device-type.md +40 -0
- data/docs/guides/how-to-use-different-files-for-client-and-server-rendering.md +98 -0
- data/docs/guides/i18n.md +87 -0
- data/docs/guides/installation-into-an-existing-rails-app.md +66 -0
- data/docs/guides/minitest-configuration.md +31 -0
- data/docs/guides/rails-webpacker-react-integration-options.md +213 -0
- data/docs/guides/react-on-rails-overview.md +29 -0
- data/docs/guides/react-server-rendering.md +32 -0
- data/docs/guides/render-functions-and-railscontext.md +205 -0
- data/docs/guides/rspec-configuration.md +73 -0
- data/docs/guides/tutorial.md +371 -0
- data/docs/{basics → guides}/upgrading-react-on-rails.md +126 -3
- data/docs/guides/webpack-configuration.md +42 -0
- data/docs/home.md +23 -0
- data/docs/javascript/asset-pipeline.md +12 -0
- data/docs/{additional-reading → javascript}/code-splitting.md +21 -11
- data/docs/javascript/converting-from-custom-webpack-config-to-rails-webpacker-config.md +10 -0
- data/docs/javascript/credits.md +10 -0
- data/docs/{additional-reading → javascript}/images.md +5 -6
- data/docs/javascript/react-helmet.md +100 -0
- data/docs/javascript/react-router.md +90 -0
- data/docs/{additional-reading → javascript}/server-rendering-tips.md +15 -12
- data/docs/javascript/troubleshooting-when-using-shakapacker.md +77 -0
- data/docs/{additional-reading → javascript}/webpack.md +2 -2
- data/docs/misc/articles.md +20 -0
- data/docs/misc/doctrine.md +5 -6
- data/docs/outdated/deferred-rendering.md +39 -0
- data/docs/{additional-reading → outdated}/rails-assets-relative-paths.md +4 -4
- data/docs/{additional-reading → outdated}/rails-assets.md +12 -20
- data/docs/{misc → outdated}/rails3.md +2 -2
- data/docs/rails/convert-rails-5-api-only-app.md +19 -0
- data/docs/rails/rails-engine-integration.md +32 -0
- data/docs/{additional-reading → rails}/rails_view_rendering_from_inline_javascript.md +2 -1
- data/docs/{additional-reading → rails}/turbolinks.md +13 -1
- data/docs/react-on-rails-pro/react-on-rails-pro.md +43 -0
- data/docs/testimonials/hvmn.md +25 -0
- data/docs/testimonials/resortpass.md +13 -0
- data/docs/testimonials/testimonials.md +28 -0
- data/jest.config.js +4 -0
- data/lib/generators/USAGE +1 -1
- data/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +41 -0
- data/lib/generators/react_on_rails/base_generator.rb +55 -43
- data/lib/generators/react_on_rails/bin/dev +30 -0
- data/lib/generators/react_on_rails/bin/dev-static +30 -0
- data/lib/generators/react_on_rails/dev_tests_generator.rb +4 -3
- data/lib/generators/react_on_rails/generator_helper.rb +8 -6
- data/lib/generators/react_on_rails/generator_messages.rb +40 -0
- data/lib/generators/react_on_rails/install_generator.rb +37 -0
- data/lib/generators/react_on_rails/templates/.eslintrc +3 -1
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +4 -6
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static +9 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +21 -40
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +4 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorldServer.js +5 -0
- data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/server-bundle.js +8 -0
- data/lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb +2 -1
- data/lib/generators/react_on_rails/templates/base/base/babel.config.js.tt +32 -0
- data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +20 -4
- data/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +62 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/clientWebpackConfig.js.tt +17 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt +17 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/development.js.tt +25 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/production.js.tt +9 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/serverWebpackConfig.js.tt +117 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/test.js.tt +9 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/webpack.config.js.tt +15 -0
- data/lib/generators/react_on_rails/templates/base/base/config/webpack/webpackConfig.js.tt +36 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +8 -2
- data/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb +1 -1
- data/lib/generators/react_on_rails/templates/dev_tests/spec/{features → system}/hello_world_spec.rb +2 -2
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +6 -9
- data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.js +1 -3
- data/lib/react_on_rails/configuration.rb +198 -145
- data/lib/react_on_rails/error.rb +2 -0
- data/lib/react_on_rails/git_utils.rb +5 -3
- data/lib/react_on_rails/{react_on_rails_helper.rb → helper.rb} +201 -190
- data/lib/react_on_rails/json_output.rb +1 -1
- data/lib/react_on_rails/json_parse_error.rb +28 -0
- data/lib/react_on_rails/locales/base.rb +169 -0
- data/lib/react_on_rails/locales/to_js.rb +33 -0
- data/lib/react_on_rails/locales/to_json.rb +23 -0
- data/lib/react_on_rails/packs_generator.rb +234 -0
- data/lib/react_on_rails/prerender_error.rb +35 -27
- data/lib/react_on_rails/react_component/render_options.rb +64 -9
- data/lib/react_on_rails/server_rendering_js_code.rb +55 -0
- data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +126 -76
- data/lib/react_on_rails/server_rendering_pool.rb +0 -1
- data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +9 -8
- data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +17 -0
- data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +13 -12
- data/lib/react_on_rails/test_helper.rb +24 -3
- data/lib/react_on_rails/utils.rb +94 -25
- data/lib/react_on_rails/version.rb +1 -1
- data/lib/react_on_rails/version_checker.rb +5 -1
- data/lib/react_on_rails/version_syntax_converter.rb +14 -12
- data/lib/react_on_rails/webpacker_utils.rb +105 -5
- data/lib/react_on_rails.rb +8 -2
- data/lib/tasks/assets.rake +28 -60
- data/lib/tasks/generate_packs.rake +11 -0
- data/lib/tasks/locale.rake +5 -4
- data/package-scripts.yml +49 -0
- data/package.json +52 -47
- data/rakelib/docker.rake +0 -5
- data/rakelib/dummy_apps.rake +5 -8
- data/rakelib/example_type.rb +12 -3
- data/rakelib/examples.rake +5 -4
- data/rakelib/lint.rake +5 -16
- data/rakelib/node_package.rake +2 -2
- data/rakelib/release.rake +37 -23
- data/rakelib/run_rspec.rake +16 -44
- data/rakelib/task_helpers.rb +16 -4
- data/react_on_rails.gemspec +6 -22
- data/tsconfig.json +14 -0
- data/webpackConfigLoader.js +5 -4
- data/yarn.lock +5935 -3106
- metadata +122 -272
- data/Gemfile.rails32 +0 -74
- data/docs/additional-reading/asset-pipeline.md +0 -20
- data/docs/additional-reading/babel.md +0 -5
- data/docs/additional-reading/caching-and-performance.md +0 -4
- data/docs/additional-reading/heroku-deployment.md +0 -92
- data/docs/additional-reading/hot-reloading-rails-development.md +0 -57
- data/docs/additional-reading/node-server-rendering.md +0 -5
- data/docs/additional-reading/rails-engine-integration.md +0 -34
- data/docs/additional-reading/react-helmet.md +0 -80
- data/docs/additional-reading/react-router.md +0 -113
- data/docs/additional-reading/recommended-project-structure.md +0 -49
- data/docs/additional-reading/rspec-configuration.md +0 -56
- data/docs/additional-reading/webpack-dev-server.md +0 -15
- data/docs/api/ruby-api-hot-reload-view-helpers.md +0 -44
- data/docs/api/ruby-api.md +0 -8
- data/docs/basics/configuration.md +0 -163
- data/docs/basics/i18n.md +0 -77
- data/docs/tutorial.md +0 -220
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-server +0 -12
- data/lib/react_on_rails/assets_precompile.rb +0 -150
- data/lib/react_on_rails/locales_to_js.rb +0 -134
- data/ruby-lint.yml +0 -25
- /data/docs/{additional-reading → additional-details}/updating-dependencies.md +0 -0
- /data/docs/{additional-reading → deployment}/elastic-beanstalk.md +0 -0
- /data/docs/{additional-reading → javascript}/angular-js-integration-migration.md +0 -0
- /data/docs/{additional-reading → javascript}/capistrano-deployment.md +0 -0
- /data/docs/{additional-reading → javascript}/foreman-issues.md +0 -0
- /data/docs/{additional-reading → javascript}/node-dependencies-and-npm.md +0 -0
- /data/docs/{additional-reading → javascript}/react-and-redux.md +0 -0
- /data/docs/{additional-reading → javascript}/troubleshooting-when-using-webpacker.md +0 -0
- /data/docs/{additional-reading → javascript}/webpack-v1-notes.md +0 -0
- /data/docs/{coding-style → misc}/style.md +0 -0
- /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:
|
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:
|
152
|
-
server_renderer_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
|
-
:
|
173
|
-
:
|
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
|
-
|
185
|
-
|
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.
|
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
|
data/lib/react_on_rails/error.rb
CHANGED
@@ -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
|
-
|
12
|
-
|
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
|