react_on_rails 12.1.0 → 12.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|