react_on_rails 12.0.5.beta.0 → 12.4.0.rc.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 +23 -11
- data/.eslintrc +2 -0
- data/.prettierrc +0 -3
- data/.rubocop.yml +40 -2
- data/CHANGELOG.md +56 -26
- data/CONTRIBUTING.md +3 -2
- data/Gemfile.development_dependencies +4 -3
- data/NEWS.md +9 -4
- data/README.md +28 -323
- data/Rakefile +1 -1
- data/SUMMARY.md +12 -12
- data/docs/{basics → additional-details}/generator-details.md +1 -6
- data/docs/{outdated → additional-details}/manual-installation-overview.md +6 -6
- data/docs/{basics → additional-details}/migrating-from-react-rails.md +0 -0
- data/docs/{additional-reading → additional-details}/recommended-project-structure.md +0 -0
- data/docs/{additional-reading → additional-details}/updating-dependencies.md +0 -0
- data/docs/additional-details/upgrade-webpacker-v3-to-v4.md +10 -0
- data/docs/api/javascript-api.md +2 -2
- data/docs/api/redux-store-api.md +3 -3
- data/docs/api/view-helpers-api.md +7 -8
- data/docs/contributor-info/linters.md +5 -6
- data/docs/contributor-info/pull-requests.md +2 -4
- data/docs/contributor-info/releasing.md +1 -1
- data/docs/{additional-reading → deployment}/elastic-beanstalk.md +0 -0
- data/docs/{basics → deployment}/heroku-deployment.md +0 -0
- data/docs/{basics → guides}/client-vs-server-rendering.md +3 -3
- data/docs/{basics → guides}/configuration.md +45 -25
- data/docs/guides/deployment.md +4 -0
- 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/{outdated → guides}/how-react-on-rails-works.md +9 -8
- 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/guides/rails-webpacker-react-integration-options.md +182 -0
- data/docs/guides/react-on-rails-overview.md +30 -0
- data/docs/{basics → guides}/react-server-rendering.md +3 -3
- data/docs/{basics → guides}/render-functions-and-railscontext.md +0 -0
- data/docs/{basics → guides}/rspec-configuration.md +10 -10
- data/docs/{tutorial.md → guides/tutorial.md} +9 -11
- data/docs/{basics → guides}/upgrading-react-on-rails.md +7 -7
- data/docs/{basics → guides}/webpack-configuration.md +4 -6
- data/docs/home.md +23 -0
- data/docs/{additional-reading → javascript}/angular-js-integration-migration.md +0 -0
- data/docs/{additional-reading → javascript}/asset-pipeline.md +0 -0
- data/docs/{additional-reading → javascript}/capistrano-deployment.md +0 -0
- data/docs/{outdated → javascript}/code-splitting.md +3 -3
- data/docs/{additional-reading → javascript}/converting-from-custom-webpack-config-to-rails-webpacker-config.md +3 -3
- data/docs/{additional-reading → javascript}/credits.md +0 -0
- data/docs/{additional-reading → javascript}/foreman-issues.md +0 -0
- data/docs/{additional-reading → javascript}/images.md +5 -6
- 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}/react-helmet.md +0 -0
- data/docs/{additional-reading → javascript}/react-router.md +0 -0
- data/docs/{additional-reading → javascript}/server-rendering-tips.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/{additional-reading → javascript}/webpack.md +0 -0
- data/docs/{articles.md → misc/articles.md} +1 -1
- data/docs/misc/doctrine.md +5 -5
- data/docs/{coding-style → misc}/style.md +0 -0
- data/docs/{additional-reading → misc}/tips.md +0 -0
- data/docs/outdated/deferred-rendering.md +39 -0
- data/docs/outdated/rails-assets-relative-paths.md +3 -3
- data/docs/outdated/rails-assets.md +8 -8
- data/docs/outdated/rails3.md +2 -2
- data/docs/{additional-reading → rails}/convert-rails-5-api-only-app.md +1 -1
- data/docs/{additional-reading → rails}/rails-engine-integration.md +3 -12
- data/docs/{additional-reading → rails}/rails_view_rendering_from_inline_javascript.md +0 -0
- 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/testimonials.md +6 -6
- data/lib/generators/react_on_rails/base_generator.rb +1 -1
- data/lib/generators/react_on_rails/dev_tests_generator.rb +1 -1
- data/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +4 -1
- data/lib/generators/react_on_rails/templates/dev_tests/spec/{features → system}/hello_world_spec.rb +2 -2
- data/lib/react_on_rails/helper.rb +26 -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/utils.rb +16 -2
- data/lib/react_on_rails/version.rb +1 -1
- data/lib/react_on_rails/webpacker_utils.rb +5 -1
- data/lib/tasks/assets.rake +17 -6
- data/package.json +24 -29
- data/rakelib/release.rake +22 -6
- data/rakelib/task_helpers.rb +15 -2
- data/yarn.lock +2549 -5169
- metadata +56 -49
- data/.release-it.json +0 -3
- data/docs/additional-reading/upgrade-webpacker-v3-to-v4.md +0 -10
- data/docs/basics/deployment.md +0 -4
@@ -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.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/react_on_rails/utils.rb
CHANGED
@@ -158,15 +158,29 @@ module ReactOnRails
|
|
158
158
|
end
|
159
159
|
|
160
160
|
def self.gem_available?(name)
|
161
|
-
Gem
|
161
|
+
Gem.loaded_specs[name].present?
|
162
162
|
rescue Gem::LoadError
|
163
163
|
false
|
164
164
|
rescue StandardError
|
165
165
|
Gem.available?(name).present?
|
166
166
|
end
|
167
167
|
|
168
|
+
# Todo -- remove this for v13, as we don't need both boolean and number
|
168
169
|
def self.react_on_rails_pro?
|
169
|
-
@react_on_rails_pro
|
170
|
+
return @react_on_rails_pro if defined?(@react_on_rails_pro)
|
171
|
+
|
172
|
+
@react_on_rails_pro = gem_available?("react_on_rails_pro")
|
173
|
+
end
|
174
|
+
|
175
|
+
# Return an empty string if React on Rails Pro is not installed
|
176
|
+
def self.react_on_rails_pro_version
|
177
|
+
return @react_on_rails_pro_version if defined?(@react_on_rails_pro_version)
|
178
|
+
|
179
|
+
@react_on_rails_pro_version = if react_on_rails_pro?
|
180
|
+
Gem.loaded_specs["react_on_rails_pro"].version.to_s
|
181
|
+
else
|
182
|
+
""
|
183
|
+
end
|
170
184
|
end
|
171
185
|
|
172
186
|
def self.smart_trim(str, max_length = 1000)
|
@@ -2,8 +2,12 @@
|
|
2
2
|
|
3
3
|
module ReactOnRails
|
4
4
|
module WebpackerUtils
|
5
|
+
# TODO: V13 code should be cleaned up so that the webpacker gem is required.
|
6
|
+
# This check should only be done at startup.
|
5
7
|
def self.using_webpacker?
|
6
|
-
|
8
|
+
return @using_webpacker if defined?(@using_webpacker)
|
9
|
+
|
10
|
+
@using_webpacker = ReactOnRails::Utils.gem_available?("webpacker")
|
7
11
|
end
|
8
12
|
|
9
13
|
def self.webpacker_webpack_production_config_exists?
|
data/lib/tasks/assets.rake
CHANGED
@@ -6,9 +6,10 @@
|
|
6
6
|
require "active_support"
|
7
7
|
|
8
8
|
ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development"
|
9
|
-
ENV["NODE_ENV"] ||= "development"
|
10
9
|
|
11
|
-
|
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?
|
12
13
|
# Ensure that rails/webpacker does not call bin/webpack if we're providing
|
13
14
|
# the build command.
|
14
15
|
ENV["WEBPACKER_PRECOMPILE"] = "false"
|
@@ -47,10 +48,20 @@ namespace :react_on_rails do
|
|
47
48
|
configuration file config/webpack/production.js exists.
|
48
49
|
DESC
|
49
50
|
task webpack: :locale do
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
build_production_command = ReactOnRails.configuration.build_production_command
|
52
|
+
if build_production_command.present?
|
53
|
+
if build_production_command.is_a?(String)
|
54
|
+
sh ReactOnRails::Utils.prepend_cd_node_modules_directory(
|
55
|
+
build_production_command
|
56
|
+
).to_s
|
57
|
+
elsif build_production_command.methods.include?(:call)
|
58
|
+
build_production_command.call
|
59
|
+
else
|
60
|
+
msg = "ReactonRails.configuration.build_production_command is improperly configured. "\
|
61
|
+
"Value = #{build_production_command} with class #{build_production_command.class}"
|
62
|
+
puts Rainbow(msg).red
|
63
|
+
exit!(1)
|
64
|
+
end
|
54
65
|
else
|
55
66
|
msg = <<~MSG
|
56
67
|
React on Rails is aborting webpack compilation from task react_on_rails:assets:webpack
|
data/package.json
CHANGED
@@ -1,56 +1,51 @@
|
|
1
1
|
{
|
2
2
|
"name": "react-on-rails",
|
3
|
-
"version": "12.0
|
3
|
+
"version": "12.4.0-rc.0",
|
4
4
|
"description": "react-on-rails JavaScript for react_on_rails Ruby gem",
|
5
5
|
"main": "node_package/lib/ReactOnRails.js",
|
6
6
|
"directories": {
|
7
7
|
"doc": "docs"
|
8
8
|
},
|
9
9
|
"devDependencies": {
|
10
|
-
"@babel/cli": "^7.
|
11
|
-
"@babel/core": "^7.
|
12
|
-
"@babel/plugin-transform-runtime": "^7.
|
13
|
-
"@babel/plugin-transform-typescript": "^7.
|
14
|
-
"@babel/preset-env": "^7.
|
15
|
-
"@babel/preset-react": "^7.
|
16
|
-
"@babel/types": "^7.
|
17
|
-
"@types/jest": "^
|
18
|
-
"@types/node": "^
|
10
|
+
"@babel/cli": "^7.12.10",
|
11
|
+
"@babel/core": "^7.12.10",
|
12
|
+
"@babel/plugin-transform-runtime": "^7.12.10",
|
13
|
+
"@babel/plugin-transform-typescript": "^7.12.1",
|
14
|
+
"@babel/preset-env": "^7.12.10",
|
15
|
+
"@babel/preset-react": "^7.12.10",
|
16
|
+
"@babel/types": "^7.12.10",
|
17
|
+
"@types/jest": "^26.0.18",
|
18
|
+
"@types/node": "^14.14.11",
|
19
19
|
"@types/react": "^16.9.23",
|
20
20
|
"@types/react-dom": "^16.9.5",
|
21
21
|
"@types/turbolinks": "^5.2.0",
|
22
|
-
"@typescript-eslint/eslint-plugin": "^
|
23
|
-
"@typescript-eslint/parser": "^
|
24
|
-
"babel-loader": "^8.0.2",
|
22
|
+
"@typescript-eslint/eslint-plugin": "^4.10.0",
|
23
|
+
"@typescript-eslint/parser": "^4.10.0",
|
25
24
|
"babelify": "^10.0.0",
|
26
25
|
"blue-tape": "^1.0.0",
|
27
26
|
"create-react-class": "^15.6.0",
|
28
|
-
"eslint": "^
|
29
|
-
"eslint-config-prettier": "^
|
27
|
+
"eslint": "^7.15.0",
|
28
|
+
"eslint-config-prettier": "^7.0.0",
|
30
29
|
"eslint-config-shakacode": "^16.0.1",
|
31
|
-
"eslint-plugin-import": "^2.
|
32
|
-
"eslint-plugin-jsx-a11y": "^6.1
|
33
|
-
"eslint-plugin-prettier": "^3.
|
34
|
-
"eslint-plugin-react": "^7.
|
35
|
-
"jest": "^
|
36
|
-
"jsdom": "^
|
30
|
+
"eslint-plugin-import": "^2.22.1",
|
31
|
+
"eslint-plugin-jsx-a11y": "^6.4.1",
|
32
|
+
"eslint-plugin-prettier": "^3.3.0",
|
33
|
+
"eslint-plugin-react": "^7.21.5",
|
34
|
+
"jest": "^26.6.3",
|
35
|
+
"jsdom": "^16.4.0",
|
37
36
|
"nps": "^5.9.3",
|
38
|
-
"prettier": "^2.
|
37
|
+
"prettier": "^2.2.1",
|
39
38
|
"prettier-eslint-cli": "^5.0.0",
|
40
39
|
"prop-types": "^15.5.10",
|
41
40
|
"react": "^16.5.2",
|
42
41
|
"react-dom": "^16.5.2",
|
43
42
|
"react-transform-hmr": "^1.0.4",
|
44
43
|
"redux": "^4.0.1",
|
45
|
-
"
|
46
|
-
"
|
47
|
-
"tslint-config-prettier": "^1.18.0",
|
48
|
-
"typescript": "^3.8.3",
|
49
|
-
"webpack": "^3.4.1",
|
50
|
-
"webpack-manifest-plugin": "^1.2.1"
|
44
|
+
"ts-jest": "^26.4.4",
|
45
|
+
"typescript": "^4.1.2"
|
51
46
|
},
|
52
47
|
"dependencies": {
|
53
|
-
"@babel/runtime-corejs3": "^7.
|
48
|
+
"@babel/runtime-corejs3": "^7.12.5",
|
54
49
|
"concurrently": "^5.1.0"
|
55
50
|
},
|
56
51
|
"peerDependencies": {
|
data/rakelib/release.rake
CHANGED
@@ -11,6 +11,8 @@ class RaisingMessageHandler
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
# rubocop:disable Metrics/BlockLength
|
15
|
+
|
14
16
|
desc("Releases both the gem and node package using the given version.
|
15
17
|
|
16
18
|
IMPORTANT: the gem version must be in valid rubygem format (no dashes).
|
@@ -19,7 +21,7 @@ for the node package version. This only makes a difference for pre-release
|
|
19
21
|
versions such as `3.0.0.beta.1` (yarn version would be `3.0.0-beta.1`).
|
20
22
|
|
21
23
|
This task depends on the gem-release (ruby gem) and release-it (node package)
|
22
|
-
which are installed via `bundle install` and `yarn`
|
24
|
+
which are installed via `bundle install` and `yarn global add release-it`
|
23
25
|
|
24
26
|
1st argument: The new version in rubygem format (no dashes). Pass no argument to
|
25
27
|
automatically perform a patch version bump.
|
@@ -55,16 +57,30 @@ task :release, %i[gem_version dry_run tools_install] do |_t, args|
|
|
55
57
|
# Update dummy app's Gemfile.lock
|
56
58
|
bundle_install_in(dummy_app_dir)
|
57
59
|
|
58
|
-
# Stage changes so far
|
59
|
-
sh_in_dir(gem_root, "git add .")
|
60
|
-
|
61
60
|
# Will bump the yarn version, commit, tag the commit, push to repo, and release on yarn
|
62
|
-
release_it_command = +"
|
61
|
+
release_it_command = +"release-it"
|
63
62
|
release_it_command << " #{npm_version}" unless npm_version.strip.empty?
|
64
|
-
release_it_command << " --
|
63
|
+
release_it_command << " --ci --npm.publish --no-git.requireCleanWorkingDir"
|
65
64
|
release_it_command << " --dry-run --verbose" if is_dry_run
|
66
65
|
sh_in_dir(gem_root, release_it_command)
|
67
66
|
|
68
67
|
# Release the new gem version
|
69
68
|
sh_in_dir(gem_root, "gem release") unless is_dry_run
|
69
|
+
|
70
|
+
msg = <<~MSG
|
71
|
+
Once you have successfully published, run these commands to update the spec apps:
|
72
|
+
|
73
|
+
cd #{dummy_app_dir}; bundle update react_on_rails
|
74
|
+
cd #{gem_root}#{' '}
|
75
|
+
git commit -a -m 'Update Gemfile.lock for spec app'
|
76
|
+
git push
|
77
|
+
MSG
|
78
|
+
puts msg
|
79
|
+
end
|
80
|
+
# rubocop:enable Metrics/BlockLength
|
81
|
+
|
82
|
+
task :test do
|
83
|
+
unbundled_sh_in_dir(gem_root, "cd #{dummy_app_dir}; bundle update react_on_rails")
|
84
|
+
sh_in_dir(gem_root, "git commit -a -m 'Update Gemfile.lock for spec app'")
|
85
|
+
sh_in_dir(gem_root, "git push")
|
70
86
|
end
|
data/rakelib/task_helpers.rb
CHANGED
@@ -16,13 +16,26 @@ module ReactOnRails
|
|
16
16
|
File.join(gem_root, "spec/dummy")
|
17
17
|
end
|
18
18
|
|
19
|
-
# Executes a string or an array of strings in a shell in the given directory
|
19
|
+
# Executes a string or an array of strings in a shell in the given directory in an unbundled environment
|
20
20
|
def sh_in_dir(dir, *shell_commands)
|
21
21
|
shell_commands.flatten.each { |shell_command| sh %(cd #{dir} && #{shell_command.strip}) }
|
22
22
|
end
|
23
23
|
|
24
|
+
# Executes a string or an array of strings in a shell in the given directory
|
25
|
+
def unbundled_sh_in_dir(dir, *shell_commands)
|
26
|
+
Dir.chdir(dir) do
|
27
|
+
# Without `with_unbundled_env`, running bundle in the child directories won't correctly
|
28
|
+
# update the Gemfile.lock
|
29
|
+
Bundler.with_unbundled_env do
|
30
|
+
shell_commands.flatten.each do |shell_command|
|
31
|
+
sh(shell_command.strip)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
24
37
|
def bundle_install_in(dir)
|
25
|
-
|
38
|
+
unbundled_sh_in_dir(dir, "bundle install")
|
26
39
|
end
|
27
40
|
|
28
41
|
def bundle_install_in_no_turbolinks(dir)
|