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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +53 -41
  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 +7 -49
  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.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-05-19 00:00:00.000000000 Z
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 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:
@@ -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: '0'
356
+ version: 1.3.1
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