react-rails 2.2.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +12 -1
- data/lib/assets/react-source/development-with-addons/react-server.js +9575 -8721
- data/lib/assets/react-source/development-with-addons/react.js +7442 -6590
- data/lib/assets/react-source/development/react-server.js +5207 -4597
- data/lib/assets/react-source/development/react.js +5242 -4652
- data/lib/assets/react-source/production-with-addons/react-server.js +8 -7
- data/lib/assets/react-source/production-with-addons/react.js +8 -7
- data/lib/assets/react-source/production/react-server.js +7 -7
- data/lib/assets/react-source/production/react.js +7 -7
- data/lib/generators/react/component_generator.rb +34 -28
- data/lib/generators/react/install_generator.rb +19 -10
- data/lib/generators/templates/react_server_rendering.rb +1 -1
- data/lib/react/jsx/babel_transformer.rb +2 -2
- data/lib/react/jsx/jsx_transformer.rb +2 -3
- data/lib/react/jsx/sprockets_strategy.rb +10 -10
- data/lib/react/rails/component_mount.rb +1 -1
- data/lib/react/rails/controller_lifecycle.rb +0 -1
- data/lib/react/rails/railtie.rb +12 -12
- data/lib/react/rails/version.rb +1 -1
- data/lib/react/server_rendering.rb +1 -1
- data/lib/react/server_rendering/bundle_renderer.rb +11 -11
- data/lib/react/server_rendering/exec_js_renderer.rb +4 -4
- data/lib/react/server_rendering/manifest_container.rb +1 -1
- data/lib/react/server_rendering/webpacker_manifest_container.rb +76 -16
- data/lib/react/server_rendering/yaml_manifest_container.rb +2 -2
- metadata +3 -3
data/lib/react/rails/version.rb
CHANGED
@@ -13,7 +13,7 @@ module React
|
|
13
13
|
# This will clear all state such as loaded code, JS VM state, or options.
|
14
14
|
# @return [void]
|
15
15
|
def self.reset_pool
|
16
|
-
options = {size: pool_size, timeout: pool_timeout}
|
16
|
+
options = { size: pool_size, timeout: pool_timeout }
|
17
17
|
@@pool = ConnectionPool.new(options) { self.renderer.new(self.renderer_options) }
|
18
18
|
end
|
19
19
|
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require 'react/server_rendering/environment_container'
|
2
|
+
require 'react/server_rendering/manifest_container'
|
3
|
+
require 'react/server_rendering/webpacker_manifest_container'
|
4
|
+
require 'react/server_rendering/yaml_manifest_container'
|
5
5
|
|
6
6
|
module React
|
7
7
|
module ServerRendering
|
@@ -11,14 +11,14 @@ module React
|
|
11
11
|
# - implements console replay
|
12
12
|
class BundleRenderer < ExecJSRenderer
|
13
13
|
# Reimplement console methods for replaying on the client
|
14
|
-
CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__),
|
15
|
-
CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__),
|
16
|
-
CONSOLE_RESET = File.read(File.join(File.dirname(__FILE__),
|
17
|
-
TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__),
|
14
|
+
CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/console_polyfill.js'))
|
15
|
+
CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/console_replay.js'))
|
16
|
+
CONSOLE_RESET = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/console_reset.js'))
|
17
|
+
TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/timeout_polyfill.js'))
|
18
18
|
|
19
19
|
def initialize(options={})
|
20
20
|
@replay_console = options.fetch(:replay_console, true)
|
21
|
-
filenames = options.fetch(:files, [
|
21
|
+
filenames = options.fetch(:files, ['server_rendering.js'])
|
22
22
|
js_code = CONSOLE_POLYFILL.dup
|
23
23
|
js_code << TIMEOUT_POLYFILL.dup
|
24
24
|
js_code << options.fetch(:code, '')
|
@@ -41,11 +41,11 @@ module React
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def before_render(component_name, props, prerender_options)
|
44
|
-
@replay_console ? CONSOLE_RESET :
|
44
|
+
@replay_console ? CONSOLE_RESET : ''
|
45
45
|
end
|
46
46
|
|
47
47
|
def after_render(component_name, props, prerender_options)
|
48
|
-
@replay_console ? CONSOLE_REPLAY :
|
48
|
+
@replay_console ? CONSOLE_REPLAY : ''
|
49
49
|
end
|
50
50
|
|
51
51
|
class << self
|
@@ -9,7 +9,7 @@ module React
|
|
9
9
|
attr_reader :context
|
10
10
|
|
11
11
|
def initialize(options={})
|
12
|
-
js_code = options[:code] || raise(
|
12
|
+
js_code = options[:code] || raise('Pass `code:` option to instantiate a JS context!')
|
13
13
|
@context = ExecJS.compile(GLOBAL_WRAPPER + js_code)
|
14
14
|
end
|
15
15
|
|
@@ -23,8 +23,8 @@ module React
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# Hooks for inserting JS before/after rendering
|
26
|
-
def before_render(component_name, props, prerender_options);
|
27
|
-
def after_render(component_name, props, prerender_options);
|
26
|
+
def before_render(component_name, props, prerender_options); ''; end
|
27
|
+
def after_render(component_name, props, prerender_options); ''; end
|
28
28
|
|
29
29
|
# Handle Node.js & other ExecJS contexts
|
30
30
|
GLOBAL_WRAPPER = <<-JS
|
@@ -40,7 +40,7 @@ module React
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def main_render(component_name, props, prerender_options)
|
43
|
-
render_function = prerender_options.fetch(:render_function,
|
43
|
+
render_function = prerender_options.fetch(:render_function, 'renderToString')
|
44
44
|
"this.ReactRailsUJS.serverRender('#{render_function}', '#{component_name}', #{props})"
|
45
45
|
end
|
46
46
|
|
@@ -11,7 +11,7 @@ module React
|
|
11
11
|
|
12
12
|
def find_asset(logical_path)
|
13
13
|
asset_path = @manifest.assets[logical_path] || raise("No compiled asset for #{logical_path}, was it precompiled?")
|
14
|
-
asset_full_path = ::Rails.root.join(
|
14
|
+
asset_full_path = ::Rails.root.join('public', @manifest.dir, asset_path)
|
15
15
|
File.read(asset_full_path)
|
16
16
|
end
|
17
17
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'open-uri'
|
2
2
|
|
3
3
|
module React
|
4
4
|
module ServerRendering
|
@@ -7,27 +7,87 @@ module React
|
|
7
7
|
# - webpack-dev-server
|
8
8
|
# - compiled pack
|
9
9
|
class WebpackerManifestContainer
|
10
|
+
|
11
|
+
begin
|
12
|
+
MAJOR, MINOR, PATCH, _ = Bundler.locked_gems.specs.find { |gem_spec| gem_spec.name == 'webpacker' }.version.segments
|
13
|
+
rescue
|
14
|
+
MAJOR, MINOR, PATCH, _ = [0,0,0]
|
15
|
+
end
|
16
|
+
|
10
17
|
# This pattern matches the code that initializes the dev-server client.
|
11
18
|
CLIENT_REQUIRE = %r{__webpack_require__\(.*webpack-dev-server\/client\/index\.js.*\n}
|
12
19
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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 = 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
|
+
dev_server_asset = open("#{ds.protocol}://#{ds.host_with_port}#{asset_path}").read
|
46
|
+
dev_server_asset.sub!(CLIENT_REQUIRE, '//\0')
|
47
|
+
dev_server_asset
|
48
|
+
else
|
49
|
+
File.read(file_path(logical_path))
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|
28
53
|
|
29
|
-
|
30
|
-
|
54
|
+
if MAJOR < 3
|
55
|
+
def manifest
|
56
|
+
Webpacker::Manifest
|
57
|
+
end
|
58
|
+
else
|
59
|
+
def manifest
|
60
|
+
Webpacker.manifest
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
if MAJOR < 3
|
65
|
+
def config
|
66
|
+
Webpacker::Configuration
|
67
|
+
end
|
68
|
+
else
|
69
|
+
def config
|
70
|
+
Webpacker.config
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
if (MAJOR == 1 && MINOR >= 2) || MAJOR == 2
|
75
|
+
def file_path path
|
76
|
+
manifest.lookup_path(path)
|
77
|
+
end
|
78
|
+
elsif MAJOR == 3
|
79
|
+
def file_path path
|
80
|
+
::Rails.root.join('public', manifest.lookup(path)[1..-1])
|
81
|
+
end
|
82
|
+
else # 1.0 and 1.1 support
|
83
|
+
def file_path path
|
84
|
+
File.join(output_path, manifest.lookup(path).split('/')[2..-1])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def output_path
|
89
|
+
# Webpack1 /:output/:entry, Webpack3 /public/:output
|
90
|
+
config.respond_to?(:output_path) ? config.output_path : 'public'
|
31
91
|
end
|
32
92
|
end
|
33
93
|
end
|
@@ -6,7 +6,7 @@ module React
|
|
6
6
|
# but sometimes, they're compiled to other directories (or other servers)
|
7
7
|
class YamlManifestContainer
|
8
8
|
def initialize
|
9
|
-
@assets = YAML.load_file(public_asset_path(
|
9
|
+
@assets = YAML.load_file(public_asset_path('manifest.yml'))
|
10
10
|
end
|
11
11
|
|
12
12
|
def find_asset(logical_path)
|
@@ -21,7 +21,7 @@ module React
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def public_asset_path(asset_name)
|
24
|
-
asset_path = File.join(
|
24
|
+
asset_path = File.join('public', ::Rails.application.config.assets.prefix, asset_name)
|
25
25
|
::Rails.root.join(asset_path)
|
26
26
|
end
|
27
27
|
end
|
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: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul O’Shannessy
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-09-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: appraisal
|
@@ -326,7 +326,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
326
326
|
version: '0'
|
327
327
|
requirements: []
|
328
328
|
rubyforge_project:
|
329
|
-
rubygems_version: 2.5.
|
329
|
+
rubygems_version: 2.5.1
|
330
330
|
signing_key:
|
331
331
|
specification_version: 4
|
332
332
|
summary: React integration for Ruby on Rails
|