react_on_rails 12.1.0 → 12.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +12 -10
- data/.rubocop.yml +2 -1
- data/CHANGELOG.md +39 -17
- data/Gemfile.development_dependencies +1 -1
- data/NEWS.md +9 -4
- data/README.md +18 -316
- data/Rakefile +1 -1
- data/SUMMARY.md +12 -12
- data/docs/additional-details/generator-details.md +1 -1
- data/docs/additional-details/manual-installation-overview.md +2 -2
- data/docs/api/view-helpers-api.md +4 -4
- data/docs/contributor-info/linters.md +1 -1
- data/docs/contributor-info/pull-requests.md +1 -1
- data/docs/{basics → guides}/client-vs-server-rendering.md +1 -1
- data/docs/{basics → guides}/configuration.md +5 -2
- data/docs/{basics → guides}/deployment.md +1 -1
- data/docs/guides/getting-started.md +183 -0
- data/docs/{basics → guides}/hmr-and-hot-reloading-with-the-webpack-dev-server.md +0 -0
- data/docs/{basics → guides}/how-react-on-rails-works.md +3 -1
- data/docs/guides/how-to-conditionally-server-render-based-on-device-type.md +39 -0
- data/docs/guides/how-to-use-different-files-for-client-and-server-rendering.md +98 -0
- data/docs/{basics → guides}/i18n.md +0 -0
- data/docs/{basics → guides}/installation-into-an-existing-rails-app.md +3 -3
- data/docs/{basics → guides}/minitest-configuration.md +0 -0
- data/docs/{rails-webpacker-react-integration-options.md → guides/rails-webpacker-react-integration-options.md} +1 -1
- data/docs/guides/react-on-rails-overview.md +30 -0
- data/docs/{basics → guides}/react-server-rendering.md +2 -2
- data/docs/{basics → guides}/render-functions-and-railscontext.md +0 -0
- data/docs/{basics → guides}/rspec-configuration.md +2 -2
- data/docs/{basics → guides}/tutorial.md +2 -4
- data/docs/{basics → guides}/upgrading-react-on-rails.md +1 -1
- data/docs/{basics → guides}/webpack-configuration.md +1 -1
- data/docs/home.md +19 -378
- data/docs/javascript/code-splitting.md +2 -2
- data/docs/misc/articles.md +1 -1
- data/docs/misc/doctrine.md +3 -3
- data/docs/outdated/rails-assets-relative-paths.md +2 -2
- data/docs/outdated/rails-assets.md +1 -1
- data/docs/rails/convert-rails-5-api-only-app.md +1 -1
- data/docs/rails/rails-engine-integration.md +3 -12
- data/docs/rails/turbolinks.md +13 -1
- data/docs/react-on-rails-pro/react-on-rails-pro.md +43 -0
- data/docs/testimonials/testimonials.md +4 -4
- data/lib/generators/react_on_rails/base_generator.rb +1 -1
- data/lib/react_on_rails/helper.rb +21 -2
- data/lib/react_on_rails/locales/base.rb +7 -9
- data/lib/react_on_rails/react_component/render_options.rb +16 -7
- data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +11 -0
- data/lib/react_on_rails/version.rb +1 -1
- data/lib/tasks/assets.rake +3 -1
- data/package.json +1 -1
- data/rakelib/release.rake +3 -3
- data/yarn.lock +469 -401
- metadata +22 -18
- data/.release-it.json +0 -3
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# rubocop:disable Metrics/ModuleLength
|
4
|
+
# rubocop:disable Metrics/MethodLength
|
4
5
|
# NOTE:
|
5
6
|
# For any heredoc JS:
|
6
7
|
# 1. The white spacing in this file matters!
|
@@ -182,7 +183,7 @@ module ReactOnRails
|
|
182
183
|
# Helper method to take javascript expression and returns the output from evaluating it.
|
183
184
|
# If you have more than one line that needs to be executed, wrap it in an IIFE.
|
184
185
|
# JS exceptions are caught and console messages are handled properly.
|
185
|
-
# Options include:{ prerender:, trace:, raise_on_prerender_error: }
|
186
|
+
# Options include:{ prerender:, trace:, raise_on_prerender_error:, throw_js_errors: }
|
186
187
|
def server_render_js(js_expression, options = {})
|
187
188
|
render_options = ReactOnRails::ReactComponent::RenderOptions
|
188
189
|
.new(react_component_name: "generic-js", options: options)
|
@@ -192,6 +193,8 @@ module ReactOnRails
|
|
192
193
|
var htmlResult = '';
|
193
194
|
var consoleReplayScript = '';
|
194
195
|
var hasErrors = false;
|
196
|
+
var renderingError = null;
|
197
|
+
var renderingErrorObject = {};
|
195
198
|
|
196
199
|
try {
|
197
200
|
htmlResult =
|
@@ -199,9 +202,17 @@ module ReactOnRails
|
|
199
202
|
return #{js_expression};
|
200
203
|
})();
|
201
204
|
} catch(e) {
|
205
|
+
renderingError = e;
|
206
|
+
if (#{render_options.throw_js_errors}) {
|
207
|
+
throw e;
|
208
|
+
}
|
202
209
|
htmlResult = ReactOnRails.handleError({e: e, name: null,
|
203
210
|
jsCode: '#{escape_javascript(js_expression)}', serverSide: true});
|
204
211
|
hasErrors = true;
|
212
|
+
renderingErrorObject = {
|
213
|
+
message: renderingError.message,
|
214
|
+
stack: renderingError.stack,
|
215
|
+
}
|
205
216
|
}
|
206
217
|
|
207
218
|
consoleReplayScript = ReactOnRails.buildConsoleReplay();
|
@@ -209,7 +220,8 @@ module ReactOnRails
|
|
209
220
|
return JSON.stringify({
|
210
221
|
html: htmlResult,
|
211
222
|
consoleReplayScript: consoleReplayScript,
|
212
|
-
hasErrors: hasErrors
|
223
|
+
hasErrors: hasErrors,
|
224
|
+
renderingError: renderingErrorObject
|
213
225
|
});
|
214
226
|
|
215
227
|
})()
|
@@ -524,6 +536,13 @@ module ReactOnRails
|
|
524
536
|
|
525
537
|
controller.is_a?(ActionMailer::Base)
|
526
538
|
end
|
539
|
+
|
540
|
+
if defined?(ScoutApm)
|
541
|
+
include ScoutApm::Tracer
|
542
|
+
instrument_method :react_component, type: "ReactOnRails", name: "react_component"
|
543
|
+
instrument_method :react_component_hash, type: "ReactOnRails", name: "react_component_hash"
|
544
|
+
end
|
527
545
|
end
|
528
546
|
end
|
529
547
|
# rubocop:enable Metrics/ModuleLength
|
548
|
+
# rubocop:enable Metrics/MethodLength
|
@@ -54,15 +54,13 @@ module ReactOnRails
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def locale_files
|
57
|
-
@locale_files ||=
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
57
|
+
@locale_files ||= if i18n_yml_dir.present?
|
58
|
+
Dir["#{i18n_yml_dir}/**/*.yml"]
|
59
|
+
else
|
60
|
+
ReactOnRails::Utils.truthy_presence(
|
61
|
+
Rails.application && Rails.application.config.i18n.load_path
|
62
|
+
).presence
|
63
|
+
end
|
66
64
|
end
|
67
65
|
|
68
66
|
def i18n_dir
|
@@ -11,6 +11,7 @@ module ReactOnRails
|
|
11
11
|
|
12
12
|
NO_PROPS = {}.freeze
|
13
13
|
|
14
|
+
# TODO: remove the required for named params
|
14
15
|
def initialize(react_component_name: required("react_component_name"), options: required("options"))
|
15
16
|
@react_component_name = react_component_name.camelize
|
16
17
|
@options = options
|
@@ -18,12 +19,16 @@ module ReactOnRails
|
|
18
19
|
|
19
20
|
attr_reader :react_component_name
|
20
21
|
|
22
|
+
def throw_js_errors
|
23
|
+
options.fetch(:throw_js_errors, false)
|
24
|
+
end
|
25
|
+
|
21
26
|
def props
|
22
27
|
options.fetch(:props) { NO_PROPS }
|
23
28
|
end
|
24
29
|
|
25
30
|
def random_dom_id
|
26
|
-
|
31
|
+
retrieve_configuration_value_for(:random_dom_id)
|
27
32
|
end
|
28
33
|
|
29
34
|
def dom_id
|
@@ -49,23 +54,23 @@ module ReactOnRails
|
|
49
54
|
end
|
50
55
|
|
51
56
|
def prerender
|
52
|
-
|
57
|
+
retrieve_configuration_value_for(:prerender)
|
53
58
|
end
|
54
59
|
|
55
60
|
def trace
|
56
|
-
|
61
|
+
retrieve_configuration_value_for(:trace)
|
57
62
|
end
|
58
63
|
|
59
64
|
def replay_console
|
60
|
-
|
65
|
+
retrieve_configuration_value_for(:replay_console)
|
61
66
|
end
|
62
67
|
|
63
68
|
def raise_on_prerender_error
|
64
|
-
|
69
|
+
retrieve_configuration_value_for(:raise_on_prerender_error)
|
65
70
|
end
|
66
71
|
|
67
72
|
def logging_on_server
|
68
|
-
|
73
|
+
retrieve_configuration_value_for(:logging_on_server)
|
69
74
|
end
|
70
75
|
|
71
76
|
def to_s
|
@@ -76,6 +81,10 @@ module ReactOnRails
|
|
76
81
|
options[key]
|
77
82
|
end
|
78
83
|
|
84
|
+
def set_option(key, value)
|
85
|
+
options[key] = value
|
86
|
+
end
|
87
|
+
|
79
88
|
private
|
80
89
|
|
81
90
|
attr_reader :options
|
@@ -88,7 +97,7 @@ module ReactOnRails
|
|
88
97
|
"#{base_dom_id}-#{SecureRandom.uuid}"
|
89
98
|
end
|
90
99
|
|
91
|
-
def
|
100
|
+
def retrieve_configuration_value_for(key)
|
92
101
|
options.fetch(key) do
|
93
102
|
ReactOnRails.configuration.public_send(key)
|
94
103
|
end
|
@@ -150,6 +150,10 @@ module ReactOnRails
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def execjs_timer_polyfills
|
153
|
+
if ReactOnRails::Utils.react_on_rails_pro? && ReactOnRailsPro.configuration.include_execjs_polyfills == false
|
154
|
+
return ""
|
155
|
+
end
|
156
|
+
|
153
157
|
<<~JS
|
154
158
|
function getStackTrace () {
|
155
159
|
var stack;
|
@@ -187,8 +191,10 @@ module ReactOnRails
|
|
187
191
|
end
|
188
192
|
|
189
193
|
# Reimplement console methods for replaying on the client
|
194
|
+
# Save a handle to the original console if needed.
|
190
195
|
def console_polyfill
|
191
196
|
<<~JS
|
197
|
+
var debugConsole = console;
|
192
198
|
var console = { history: [] };
|
193
199
|
['error', 'log', 'info', 'warn'].forEach(function (level) {
|
194
200
|
console[level] = function () {
|
@@ -202,6 +208,11 @@ module ReactOnRails
|
|
202
208
|
JS
|
203
209
|
end
|
204
210
|
|
211
|
+
if defined?(ScoutApm)
|
212
|
+
include ScoutApm::Tracer
|
213
|
+
instrument_method :exec_server_render_js, type: "ReactOnRails", name: "ExecJs React Server Rendering"
|
214
|
+
end
|
215
|
+
|
205
216
|
private
|
206
217
|
|
207
218
|
def file_url_to_string(url)
|
data/lib/tasks/assets.rake
CHANGED
@@ -7,7 +7,9 @@ require "active_support"
|
|
7
7
|
|
8
8
|
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
|
9
9
|
|
10
|
-
|
10
|
+
skip_react_on_rails_precompile = %w[no false n f].include?(ENV["REACT_ON_RAILS_PRECOMPILE"])
|
11
|
+
|
12
|
+
if !skip_react_on_rails_precompile && !ReactOnRails::WebpackerUtils.webpacker_webpack_production_config_exists?
|
11
13
|
# Ensure that rails/webpacker does not call bin/webpack if we're providing
|
12
14
|
# the build command.
|
13
15
|
ENV["WEBPACKER_PRECOMPILE"] = "false"
|
data/package.json
CHANGED
data/rakelib/release.rake
CHANGED
@@ -21,7 +21,7 @@ for the node package version. This only makes a difference for pre-release
|
|
21
21
|
versions such as `3.0.0.beta.1` (yarn version would be `3.0.0-beta.1`).
|
22
22
|
|
23
23
|
This task depends on the gem-release (ruby gem) and release-it (node package)
|
24
|
-
which are installed via `bundle install` and `yarn`
|
24
|
+
which are installed via `bundle install` and `yarn global add release-it`
|
25
25
|
|
26
26
|
1st argument: The new version in rubygem format (no dashes). Pass no argument to
|
27
27
|
automatically perform a patch version bump.
|
@@ -58,9 +58,9 @@ task :release, %i[gem_version dry_run tools_install] do |_t, args|
|
|
58
58
|
bundle_install_in(dummy_app_dir)
|
59
59
|
|
60
60
|
# Will bump the yarn version, commit, tag the commit, push to repo, and release on yarn
|
61
|
-
release_it_command = +"
|
61
|
+
release_it_command = +"release-it"
|
62
62
|
release_it_command << " #{npm_version}" unless npm_version.strip.empty?
|
63
|
-
release_it_command << " --
|
63
|
+
release_it_command << " --ci --npm.publish --no-git.requireCleanWorkingDir"
|
64
64
|
release_it_command << " --dry-run --verbose" if is_dry_run
|
65
65
|
sh_in_dir(gem_root, release_it_command)
|
66
66
|
|