react-rails 2.7.1 → 3.0.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/CHANGELOG.md +9 -0
- data/README.md +53 -41
- data/lib/assets/javascripts/react_ujs.js +1 -1
- data/lib/assets/react-source/development/react-server.js +333 -10
- data/lib/assets/react-source/development/react.js +19 -28
- data/lib/assets/react-source/production/react-server.js +1 -1
- data/lib/assets/react-source/production/react.js +1 -1
- data/lib/generators/react/component_generator.rb +126 -121
- data/lib/generators/react/install_generator.rb +50 -72
- data/lib/generators/templates/component.es6.jsx +8 -8
- data/lib/generators/templates/component.js.jsx +14 -14
- data/lib/generators/templates/react_server_rendering.rb +3 -1
- data/lib/react/jsx/babel_transformer.rb +12 -6
- data/lib/react/jsx/jsx_transformer.rb +7 -5
- data/lib/react/jsx/processor.rb +3 -1
- data/lib/react/jsx/sprockets_strategy.rb +17 -11
- data/lib/react/jsx/template.rb +7 -6
- data/lib/react/jsx.rb +9 -7
- data/lib/react/rails/asset_variant.rb +7 -6
- data/lib/react/rails/component_mount.rb +37 -29
- data/lib/react/rails/controller_lifecycle.rb +2 -0
- data/lib/react/rails/controller_renderer.rb +3 -1
- data/lib/react/rails/railtie.rb +19 -22
- data/lib/react/rails/test_helper.rb +3 -1
- data/lib/react/rails/version.rb +3 -1
- data/lib/react/rails/view_helper.rb +3 -1
- data/lib/react/rails.rb +9 -7
- data/lib/react/server_rendering/bundle_renderer.rb +34 -39
- data/lib/react/server_rendering/environment_container.rb +2 -0
- data/lib/react/server_rendering/exec_js_renderer.rb +15 -6
- data/lib/react/server_rendering/manifest_container.rb +6 -2
- data/lib/react/server_rendering/separate_server_bundle_container.rb +19 -0
- data/lib/react/server_rendering/yaml_manifest_container.rb +4 -2
- data/lib/react/server_rendering.rb +11 -9
- data/lib/react-rails.rb +8 -6
- data/lib/react.rb +2 -0
- metadata +7 -49
- data/lib/react/server_rendering/webpacker_manifest_container.rb +0 -96
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module React
|
2
4
|
module ServerRendering
|
3
5
|
# Get asset content by reading the compiled file from disk using a Sprockets::Manifest.
|
@@ -10,8 +12,10 @@ module React
|
|
10
12
|
end
|
11
13
|
|
12
14
|
def find_asset(logical_path)
|
13
|
-
asset_path = @manifest.assets[logical_path] || raise(
|
14
|
-
|
15
|
+
asset_path = @manifest.assets[logical_path] || raise(
|
16
|
+
"No compiled asset for #{logical_path}, was it precompiled?"
|
17
|
+
)
|
18
|
+
asset_full_path = ::Rails.root.join("public", @manifest.dir, asset_path)
|
15
19
|
File.read(asset_full_path)
|
16
20
|
end
|
17
21
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "open-uri"
|
4
|
+
|
5
|
+
module React
|
6
|
+
module ServerRendering
|
7
|
+
# Get a compiled file from Shakapacker's output path
|
8
|
+
class SeparateServerBundleContainer
|
9
|
+
def self.compatible?
|
10
|
+
!!defined?(Shakapacker)
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_asset(filename)
|
14
|
+
asset_path = Shakapacker.config.public_output_path.join(filename).to_s
|
15
|
+
File.read(asset_path)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module React
|
2
4
|
module ServerRendering
|
3
5
|
# Get asset content by reading the compiled file from disk using the generated manifest.yml file
|
@@ -6,7 +8,7 @@ module React
|
|
6
8
|
# but sometimes, they're compiled to other directories (or other servers)
|
7
9
|
class YamlManifestContainer
|
8
10
|
def initialize
|
9
|
-
@assets = YAML.load_file(public_asset_path(
|
11
|
+
@assets = YAML.load_file(public_asset_path("manifest.yml"))
|
10
12
|
end
|
11
13
|
|
12
14
|
def find_asset(logical_path)
|
@@ -21,7 +23,7 @@ module React
|
|
21
23
|
private
|
22
24
|
|
23
25
|
def public_asset_path(asset_name)
|
24
|
-
asset_path = File.join(
|
26
|
+
asset_path = File.join("public", ::Rails.application.config.assets.prefix, asset_name)
|
25
27
|
::Rails.root.join(asset_path)
|
26
28
|
end
|
27
29
|
end
|
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "connection_pool"
|
4
|
+
require "react/server_rendering/exec_js_renderer"
|
5
|
+
require "react/server_rendering/bundle_renderer"
|
4
6
|
|
5
7
|
module React
|
6
8
|
module ServerRendering
|
7
9
|
mattr_accessor :renderer, :renderer_options,
|
8
|
-
|
10
|
+
:pool_size, :pool_timeout
|
9
11
|
|
10
12
|
self.renderer_options = {}
|
11
13
|
|
@@ -14,7 +16,7 @@ module React
|
|
14
16
|
# @return [void]
|
15
17
|
def self.reset_pool
|
16
18
|
options = { size: pool_size, timeout: pool_timeout }
|
17
|
-
|
19
|
+
@pool = ConnectionPool.new(options) { renderer.new(renderer_options) }
|
18
20
|
end
|
19
21
|
|
20
22
|
# Check a renderer out of the pool and use it to render the component.
|
@@ -23,21 +25,21 @@ module React
|
|
23
25
|
# @param prerender_options [Hash] Renderer-specific options
|
24
26
|
# @return [String] Prerendered HTML from `component_name`
|
25
27
|
def self.render(component_name, props, prerender_options)
|
26
|
-
|
28
|
+
@pool.with do |renderer|
|
27
29
|
renderer.render(component_name, props, prerender_options)
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
33
|
# Yield a renderer for an arbitrary block
|
32
|
-
def self.with_renderer
|
33
|
-
|
34
|
+
def self.with_renderer(&block)
|
35
|
+
@pool.with(&block)
|
34
36
|
end
|
35
37
|
|
36
38
|
# Raised when something went wrong during server rendering.
|
37
39
|
class PrerenderError < RuntimeError
|
38
40
|
def initialize(component_name, props, js_message)
|
39
41
|
message = ["Encountered error \"#{js_message.inspect}\" when prerendering #{component_name} with #{props}",
|
40
|
-
|
42
|
+
js_message.backtrace.join("\n")].join("\n")
|
41
43
|
super(message)
|
42
44
|
end
|
43
45
|
end
|
data/lib/react-rails.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "react"
|
4
|
+
require "react/jsx"
|
5
|
+
require "react/rails"
|
6
|
+
require "react/server_rendering"
|
5
7
|
|
6
8
|
module React
|
7
9
|
module Rails
|
8
|
-
autoload :TestHelper,
|
10
|
+
autoload :TestHelper, "react/rails/test_helper"
|
9
11
|
end
|
10
|
-
end
|
12
|
+
end
|
data/lib/react.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: react-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.rc.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul O’Shannessy
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2023-
|
14
|
+
date: 2023-07-31 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: appraisal
|
@@ -153,20 +153,6 @@ dependencies:
|
|
153
153
|
- - "~>"
|
154
154
|
- !ruby/object:Gem::Version
|
155
155
|
version: 3.0.0
|
156
|
-
- !ruby/object:Gem::Dependency
|
157
|
-
name: webdrivers
|
158
|
-
requirement: !ruby/object:Gem::Requirement
|
159
|
-
requirements:
|
160
|
-
- - ">="
|
161
|
-
- !ruby/object:Gem::Version
|
162
|
-
version: '0'
|
163
|
-
type: :development
|
164
|
-
prerelease: false
|
165
|
-
version_requirements: !ruby/object:Gem::Requirement
|
166
|
-
requirements:
|
167
|
-
- - ">="
|
168
|
-
- !ruby/object:Gem::Version
|
169
|
-
version: '0'
|
170
156
|
- !ruby/object:Gem::Dependency
|
171
157
|
name: capybara
|
172
158
|
requirement: !ruby/object:Gem::Requirement
|
@@ -209,20 +195,6 @@ dependencies:
|
|
209
195
|
- - "~>"
|
210
196
|
- !ruby/object:Gem::Version
|
211
197
|
version: '2.5'
|
212
|
-
- !ruby/object:Gem::Dependency
|
213
|
-
name: rails
|
214
|
-
requirement: !ruby/object:Gem::Requirement
|
215
|
-
requirements:
|
216
|
-
- - ">="
|
217
|
-
- !ruby/object:Gem::Version
|
218
|
-
version: '3.2'
|
219
|
-
type: :development
|
220
|
-
prerelease: false
|
221
|
-
version_requirements: !ruby/object:Gem::Requirement
|
222
|
-
requirements:
|
223
|
-
- - ">="
|
224
|
-
- !ruby/object:Gem::Version
|
225
|
-
version: '3.2'
|
226
198
|
- !ruby/object:Gem::Dependency
|
227
199
|
name: pry-byebug
|
228
200
|
requirement: !ruby/object:Gem::Requirement
|
@@ -237,20 +209,6 @@ dependencies:
|
|
237
209
|
- - ">="
|
238
210
|
- !ruby/object:Gem::Version
|
239
211
|
version: '0'
|
240
|
-
- !ruby/object:Gem::Dependency
|
241
|
-
name: turbolinks
|
242
|
-
requirement: !ruby/object:Gem::Requirement
|
243
|
-
requirements:
|
244
|
-
- - ">="
|
245
|
-
- !ruby/object:Gem::Version
|
246
|
-
version: '0'
|
247
|
-
type: :development
|
248
|
-
prerelease: false
|
249
|
-
version_requirements: !ruby/object:Gem::Requirement
|
250
|
-
requirements:
|
251
|
-
- - ">="
|
252
|
-
- !ruby/object:Gem::Version
|
253
|
-
version: '0'
|
254
212
|
- !ruby/object:Gem::Dependency
|
255
213
|
name: connection_pool
|
256
214
|
requirement: !ruby/object:Gem::Requirement
|
@@ -322,7 +280,7 @@ dependencies:
|
|
322
280
|
- !ruby/object:Gem::Version
|
323
281
|
version: 0.7.0
|
324
282
|
description: Render components in views or controller actions. Server-side rendering
|
325
|
-
powered by ExecJS. Transform JSX in the asset pipeline or use
|
283
|
+
powered by ExecJS. Transform JSX in the asset pipeline or use Shakapacker.
|
326
284
|
email:
|
327
285
|
- paul@oshannessy.com
|
328
286
|
- rmosolgo@gmail.com
|
@@ -376,7 +334,7 @@ files:
|
|
376
334
|
- lib/react/server_rendering/environment_container.rb
|
377
335
|
- lib/react/server_rendering/exec_js_renderer.rb
|
378
336
|
- lib/react/server_rendering/manifest_container.rb
|
379
|
-
- lib/react/server_rendering/
|
337
|
+
- lib/react/server_rendering/separate_server_bundle_container.rb
|
380
338
|
- lib/react/server_rendering/yaml_manifest_container.rb
|
381
339
|
homepage: https://github.com/reactjs/react-rails
|
382
340
|
licenses:
|
@@ -393,11 +351,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
393
351
|
version: '0'
|
394
352
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
395
353
|
requirements:
|
396
|
-
- - "
|
354
|
+
- - ">"
|
397
355
|
- !ruby/object:Gem::Version
|
398
|
-
version:
|
356
|
+
version: 1.3.1
|
399
357
|
requirements: []
|
400
|
-
rubygems_version: 3.
|
358
|
+
rubygems_version: 3.2.32
|
401
359
|
signing_key:
|
402
360
|
specification_version: 4
|
403
361
|
summary: React integration for Ruby on Rails
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'open-uri'
|
2
|
-
|
3
|
-
module React
|
4
|
-
module ServerRendering
|
5
|
-
# Get a compiled file from Webpacker. It may come from:
|
6
|
-
#
|
7
|
-
# - webpack-dev-server
|
8
|
-
# - compiled pack
|
9
|
-
class WebpackerManifestContainer
|
10
|
-
|
11
|
-
begin
|
12
|
-
MAJOR, MINOR, PATCH, _ = Bundler.locked_gems.specs.find { |gem_spec| gem_spec.name == 'webpacker' || gem_spec.name == 'shakapacker' }.version.segments
|
13
|
-
rescue
|
14
|
-
MAJOR, MINOR, PATCH, _ = [0,0,0]
|
15
|
-
end
|
16
|
-
|
17
|
-
# This pattern matches the code that initializes the dev-server client.
|
18
|
-
CLIENT_REQUIRE = %r{__webpack_require__\(.*webpack-dev-server\/client\/index\.js.*\n}
|
19
|
-
|
20
|
-
def self.compatible?
|
21
|
-
!!defined?(Webpacker)
|
22
|
-
end
|
23
|
-
|
24
|
-
if MAJOR < 3
|
25
|
-
def find_asset(logical_path)
|
26
|
-
# raises if not found
|
27
|
-
asset_path = manifest.lookup(logical_path).to_s
|
28
|
-
if asset_path.start_with?('http')
|
29
|
-
# Get a file from the webpack-dev-server
|
30
|
-
dev_server_asset = URI.open(asset_path).read
|
31
|
-
# Remove `webpack-dev-server/client/index.js` code which causes ExecJS to 💥
|
32
|
-
dev_server_asset.sub!(CLIENT_REQUIRE, '//\0')
|
33
|
-
dev_server_asset
|
34
|
-
else
|
35
|
-
# Read the already-compiled pack:
|
36
|
-
full_path = file_path(logical_path).to_s
|
37
|
-
File.read(full_path)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
else
|
41
|
-
def find_asset(logical_path)
|
42
|
-
asset_path = Webpacker.manifest.lookup(logical_path).to_s
|
43
|
-
if Webpacker.dev_server.running?
|
44
|
-
ds = Webpacker.dev_server
|
45
|
-
# Remove the protocol and host from the asset path. Sometimes webpacker includes this, sometimes it does not
|
46
|
-
asset_path.slice!("#{ds.protocol}://#{ds.host_with_port}")
|
47
|
-
dev_server_asset = URI.open("#{ds.protocol}://#{ds.host_with_port}#{asset_path}").read
|
48
|
-
dev_server_asset.sub!(CLIENT_REQUIRE, '//\0')
|
49
|
-
dev_server_asset
|
50
|
-
else
|
51
|
-
File.read(file_path(logical_path))
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
if MAJOR < 3
|
57
|
-
def manifest
|
58
|
-
Webpacker::Manifest
|
59
|
-
end
|
60
|
-
else
|
61
|
-
def manifest
|
62
|
-
Webpacker.manifest
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
if MAJOR < 3
|
67
|
-
def config
|
68
|
-
Webpacker::Configuration
|
69
|
-
end
|
70
|
-
else
|
71
|
-
def config
|
72
|
-
Webpacker.config
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
if (MAJOR == 1 && MINOR >= 2) || MAJOR == 2
|
77
|
-
def file_path path
|
78
|
-
manifest.lookup_path(path)
|
79
|
-
end
|
80
|
-
elsif MAJOR >= 3
|
81
|
-
def file_path path
|
82
|
-
::Rails.root.join('public', manifest.lookup!(path)[1..-1])
|
83
|
-
end
|
84
|
-
else # 1.0 and 1.1 support
|
85
|
-
def file_path path
|
86
|
-
File.join(output_path, manifest.lookup(path).split('/')[2..-1])
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
def output_path
|
91
|
-
# Webpack1 /:output/:entry, Webpack3 /public/:output
|
92
|
-
config.respond_to?(:output_path) ? config.output_path : 'public'
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|