react-rails 2.7.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +85 -42
  4. data/lib/assets/javascripts/react_ujs.js +1 -1
  5. data/lib/assets/react-source/development/react-server.js +333 -10
  6. data/lib/assets/react-source/development/react.js +19 -28
  7. data/lib/assets/react-source/production/react-server.js +1 -1
  8. data/lib/assets/react-source/production/react.js +1 -1
  9. data/lib/generators/react/component_generator.rb +126 -121
  10. data/lib/generators/react/install_generator.rb +50 -72
  11. data/lib/generators/templates/component.es6.jsx +8 -8
  12. data/lib/generators/templates/component.js.jsx +14 -14
  13. data/lib/generators/templates/react_server_rendering.rb +3 -1
  14. data/lib/react/jsx/babel_transformer.rb +12 -6
  15. data/lib/react/jsx/jsx_transformer.rb +7 -5
  16. data/lib/react/jsx/processor.rb +3 -1
  17. data/lib/react/jsx/sprockets_strategy.rb +17 -11
  18. data/lib/react/jsx/template.rb +7 -6
  19. data/lib/react/jsx.rb +9 -7
  20. data/lib/react/rails/asset_variant.rb +7 -6
  21. data/lib/react/rails/component_mount.rb +37 -29
  22. data/lib/react/rails/controller_lifecycle.rb +2 -0
  23. data/lib/react/rails/controller_renderer.rb +3 -1
  24. data/lib/react/rails/railtie.rb +19 -22
  25. data/lib/react/rails/test_helper.rb +3 -1
  26. data/lib/react/rails/version.rb +3 -1
  27. data/lib/react/rails/view_helper.rb +3 -1
  28. data/lib/react/rails.rb +9 -7
  29. data/lib/react/server_rendering/bundle_renderer.rb +34 -39
  30. data/lib/react/server_rendering/environment_container.rb +2 -0
  31. data/lib/react/server_rendering/exec_js_renderer.rb +15 -6
  32. data/lib/react/server_rendering/manifest_container.rb +6 -2
  33. data/lib/react/server_rendering/separate_server_bundle_container.rb +19 -0
  34. data/lib/react/server_rendering/yaml_manifest_container.rb +4 -2
  35. data/lib/react/server_rendering.rb +11 -9
  36. data/lib/react-rails.rb +8 -6
  37. data/lib/react.rb +2 -0
  38. metadata +5 -47
  39. 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("No compiled asset for #{logical_path}, was it precompiled?")
14
- asset_full_path = ::Rails.root.join('public', @manifest.dir, asset_path)
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('manifest.yml'))
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('public', ::Rails.application.config.assets.prefix, asset_name)
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
- require 'connection_pool'
2
- require 'react/server_rendering/exec_js_renderer'
3
- require 'react/server_rendering/bundle_renderer'
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
- :pool_size, :pool_timeout
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
- @@pool = ConnectionPool.new(options) { self.renderer.new(self.renderer_options) }
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
- @@pool.with do |renderer|
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
- @@pool.with { |renderer| yield(renderer) }
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
- js_message.backtrace.join("\n")].join("\n")
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
- require 'react'
2
- require 'react/jsx'
3
- require 'react/rails'
4
- require 'react/server_rendering'
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, 'react/rails/test_helper'
10
+ autoload :TestHelper, "react/rails/test_helper"
9
11
  end
10
- end
12
+ end
data/lib/react.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  # Recursively camelize `props`, returning a new Hash
3
5
  # @param props [Object] If it's a Hash or Array, it will be recursed. Otherwise it will be returned.
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.7.1
4
+ version: 3.0.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-05-19 00:00:00.000000000 Z
14
+ date: 2023-08-14 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 Webpacker.
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/webpacker_manifest_container.rb
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:
@@ -397,7 +355,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
397
355
  - !ruby/object:Gem::Version
398
356
  version: '0'
399
357
  requirements: []
400
- rubygems_version: 3.4.12
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