react_on_rails_pro 16.6.0 → 16.7.0.rc.1

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/.controlplane/rails.yml +2 -2
  3. data/CLAUDE.md +10 -0
  4. data/CONTRIBUTING.md +2 -2
  5. data/Gemfile.development_dependencies +26 -13
  6. data/Gemfile.lock +13 -28
  7. data/Rakefile +0 -5
  8. data/app/helpers/react_on_rails_pro_helper.rb +28 -1
  9. data/lib/react_on_rails_pro/assets_precompile.rb +170 -1
  10. data/lib/react_on_rails_pro/async_props_emitter.rb +80 -0
  11. data/lib/react_on_rails_pro/concerns/stream.rb +1 -1
  12. data/lib/react_on_rails_pro/configuration.rb +114 -17
  13. data/lib/react_on_rails_pro/engine.rb +10 -0
  14. data/lib/react_on_rails_pro/httpx_stream_bidi_patch.rb +42 -0
  15. data/lib/react_on_rails_pro/js_code_builder.rb +121 -0
  16. data/lib/react_on_rails_pro/license_validator.rb +1 -1
  17. data/lib/react_on_rails_pro/pre_seed_renderer_cache.rb +148 -0
  18. data/lib/react_on_rails_pro/prepare_node_renderer_bundles.rb +33 -28
  19. data/lib/react_on_rails_pro/renderer_cache_helpers.rb +276 -0
  20. data/lib/react_on_rails_pro/renderer_cache_path.rb +74 -0
  21. data/lib/react_on_rails_pro/rendering_strategy/node_strategy.rb +29 -0
  22. data/lib/react_on_rails_pro/request.rb +135 -8
  23. data/lib/react_on_rails_pro/rolling_deploy_cache_stager.rb +516 -0
  24. data/lib/react_on_rails_pro/server_rendering_js_code.rb +47 -10
  25. data/lib/react_on_rails_pro/server_rendering_pool/node_rendering_pool.rb +35 -10
  26. data/lib/react_on_rails_pro/stream_request.rb +42 -49
  27. data/lib/react_on_rails_pro/utils.rb +7 -9
  28. data/lib/react_on_rails_pro/version.rb +1 -1
  29. data/lib/react_on_rails_pro.rb +8 -0
  30. data/lib/tasks/assets.rake +36 -3
  31. data/rakelib/run_rspec.rake +6 -6
  32. data/react_on_rails_pro.gemspec +9 -4
  33. data/sig/react_on_rails_pro/configuration.rbs +2 -0
  34. metadata +35 -22
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "async"
4
+ require "async/barrier"
5
+
3
6
  module ReactOnRailsPro
4
7
  class StreamDecorator
5
8
  def initialize(component)
@@ -92,35 +95,54 @@ module ReactOnRailsPro
92
95
  def each_chunk(&block)
93
96
  return enum_for(:each_chunk) unless block
94
97
 
95
- send_bundle = false
96
- error_body = +""
97
- loop do
98
- stream_response = @request_executor.call(send_bundle)
99
-
100
- # Chunks can be merged during streaming, so we separate them by newlines
101
- # Also, we check the status code inside the loop block because calling `status` outside the loop block
102
- # is blocking, it will wait for the response to be fully received
103
- # Look at the spec of `status` in `spec/react_on_rails_pro/stream_spec.rb` for more details
104
- process_response_chunks(stream_response, error_body, &block)
105
- break
106
- rescue HTTPX::HTTPError => e
107
- send_bundle = handle_http_error(e, error_body, send_bundle)
108
- rescue HTTPX::ReadTimeoutError => e
109
- raise ReactOnRailsPro::Error, "Time out error while server side render streaming a component.\n" \
110
- "Original error:\n#{e}\n#{e.backtrace}"
98
+ Sync do
99
+ barrier = Async::Barrier.new
100
+
101
+ send_bundle = false
102
+ error_body = +""
103
+ loop do
104
+ stream_response = @request_executor.call(send_bundle, barrier)
105
+
106
+ # The Node renderer always emits the length-prefixed wire format
107
+ # (`<metadata JSON>\t<content byte length hex>\n<raw content bytes>`)
108
+ # for every response chunk — both the one-shot streaming path and the
109
+ # incremental-rendering path. We check the status code inside the loop
110
+ # block because calling `status` outside of it blocks until the full
111
+ # response has been received. See the `status` spec in
112
+ # `spec/react_on_rails_pro/stream_spec.rb` for more details.
113
+ process_response_chunks(stream_response, error_body, &block)
114
+ break
115
+ rescue HTTPX::HTTPError => e
116
+ send_bundle = handle_http_error(e, error_body, send_bundle)
117
+ rescue HTTPX::ReadTimeoutError => e
118
+ raise ReactOnRailsPro::Error, "Time out error while server side render streaming a component.\n" \
119
+ "Original error:\n#{e}\n#{e.backtrace}"
120
+ end
121
+
122
+ barrier.wait
111
123
  end
112
124
  end
113
125
 
114
- def process_response_chunks(stream_response, error_body)
115
- loop_response_lines(stream_response) do |chunk|
126
+ # Method to start the decoration
127
+ def self.create(&request_block)
128
+ StreamDecorator.new(new(&request_block))
129
+ end
130
+
131
+ private
132
+
133
+ def process_response_chunks(stream_response, error_body, &block)
134
+ parser = ReactOnRails::LengthPrefixedParser.new
135
+ stream_response.each do |chunk|
136
+ stream_response.instance_variable_set(:@react_on_rails_received_first_chunk, true)
137
+
116
138
  if response_has_error_status?(stream_response)
117
139
  error_body << chunk
118
140
  next
119
141
  end
120
142
 
121
- processed_chunk = chunk.strip
122
- yield processed_chunk unless processed_chunk.empty?
143
+ parser.feed(chunk, &block)
123
144
  end
145
+ parser.flush
124
146
  end
125
147
 
126
148
  def response_has_error_status?(response)
@@ -150,34 +172,5 @@ module ReactOnRailsPro
150
172
  raise ReactOnRailsPro::Error, "Unexpected response code from renderer: #{response.status}:\n#{error_body}"
151
173
  end
152
174
  end
153
-
154
- # Method to start the decoration
155
- def self.create(&request_block)
156
- StreamDecorator.new(new(&request_block))
157
- end
158
-
159
- private
160
-
161
- # This method is considered as an override of response.each_line
162
- # It fixes the problem of not yielding the last chunk on error
163
- # You can check the spec of `each_line` in `spec/react_on_rails_pro/stream_spec.rb` for more details
164
- def loop_response_lines(response)
165
- return enum_for(__method__, response) unless block_given?
166
-
167
- line = "".b
168
-
169
- response.each do |chunk|
170
- response.instance_variable_set(:@react_on_rails_received_first_chunk, true)
171
- line << chunk
172
-
173
- while (idx = line.index("\n"))
174
- yield line.byteslice(0..idx - 1)
175
-
176
- line = line.byteslice(idx + 1..-1)
177
- end
178
- end
179
- ensure
180
- yield line unless line.empty?
181
- end
182
175
  end
183
176
  end
@@ -1,10 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # require "English"
4
- # require "open3"
5
- # require "rainbow"
6
- # require "active_support"
7
- # require "active_support/core_ext/string"
3
+ require "react_on_rails_pro/renderer_cache_path"
8
4
 
9
5
  module ReactOnRailsPro
10
6
  module Utils
@@ -120,10 +116,8 @@ module ReactOnRailsPro
120
116
  def self.server_bundle_file_name
121
117
  return @server_bundle_hash if @server_bundle_hash && !Rails.env.development?
122
118
 
123
- @server_bundle_hash = begin
124
- server_bundle_name = ReactOnRails.configuration.server_bundle_js_file
125
- bundle_file_name(server_bundle_name)
126
- end
119
+ server_bundle_name = ReactOnRails.configuration.server_bundle_js_file
120
+ @server_bundle_hash = bundle_file_name(server_bundle_name)
127
121
  end
128
122
 
129
123
  def self.calc_bundle_hash(server_bundle_js_file_path)
@@ -179,6 +173,10 @@ module ReactOnRailsPro
179
173
  }
180
174
  end
181
175
 
176
+ def self.resolve_renderer_cache_dir
177
+ ReactOnRailsPro::RendererCachePath.resolve
178
+ end
179
+
182
180
  def self.mine_type_from_file_name(filename)
183
181
  extension = File.extname(filename)
184
182
  Rack::Mime.mime_type(extension)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReactOnRailsPro
4
- VERSION = "16.6.0"
4
+ VERSION = "16.7.0.rc.1"
5
5
  PROTOCOL_VERSION = "2.0.0"
6
6
  end
@@ -3,12 +3,16 @@
3
3
  require "rails"
4
4
  require "react_on_rails"
5
5
 
6
+ # Apply HTTPX bug fix for stream_bidi plugin
7
+ require "react_on_rails_pro/httpx_stream_bidi_patch"
8
+
6
9
  require "react_on_rails_pro/request"
7
10
  require "react_on_rails_pro/version"
8
11
  require "react_on_rails_pro/constants"
9
12
  require "react_on_rails_pro/compression_middleware_guard"
10
13
  require "react_on_rails_pro/engine"
11
14
  require "react_on_rails_pro/error"
15
+ require "react_on_rails_pro/renderer_cache_path"
12
16
  require "react_on_rails_pro/utils"
13
17
  require "react_on_rails_pro/configuration"
14
18
  require "react_on_rails_pro/license_public_key"
@@ -18,8 +22,12 @@ require "react_on_rails_pro/stream_cache"
18
22
  require "react_on_rails_pro/server_rendering_pool/pro_rendering"
19
23
  require "react_on_rails_pro/server_rendering_pool/node_rendering_pool"
20
24
  require "react_on_rails_pro/server_rendering_js_code"
25
+ require "react_on_rails_pro/js_code_builder"
26
+ require "react_on_rails_pro/rendering_strategy/node_strategy"
21
27
  require "react_on_rails_pro/assets_precompile"
22
28
  require "react_on_rails_pro/prepare_node_renderer_bundles"
29
+ require "react_on_rails_pro/rolling_deploy_cache_stager"
30
+ require "react_on_rails_pro/pre_seed_renderer_cache"
23
31
  require "react_on_rails_pro/concerns/stream"
24
32
  require "react_on_rails_pro/concerns/rsc_payload_renderer"
25
33
  require "react_on_rails_pro/concerns/async_rendering"
@@ -2,10 +2,43 @@
2
2
 
3
3
  require "active_support"
4
4
 
5
- namespace :react_on_rails_pro do
6
- desc "Copy assets to local node-renderer"
5
+ namespace :react_on_rails_pro do # rubocop:disable Metrics/BlockLength
6
+ desc "Stage the Node Renderer bundle cache. MODE=copy (default; Docker/image builds) " \
7
+ "or MODE=symlink (dev/CI/same-filesystem deploys)."
8
+ task pre_seed_renderer_cache: :environment do
9
+ # Mirrors the guard in `AssetsPrecompile.call`: invoking the staging path against a
10
+ # non-NodeRenderer setup eventually reaches `pool.server_bundle_hash` and fails with
11
+ # a low-level error. Abort early with actionable guidance instead.
12
+ unless ReactOnRailsPro.configuration.node_renderer?
13
+ abort "[ReactOnRailsPro] react_on_rails_pro:pre_seed_renderer_cache requires the Node Renderer. " \
14
+ "Set config.server_renderer = \"NodeRenderer\" in your Pro initializer, or remove this task " \
15
+ "from your deploy pipeline."
16
+ end
17
+
18
+ raw_mode = ENV["MODE"].to_s.downcase
19
+ raw_mode = "copy" if raw_mode.empty?
20
+ valid_modes = ReactOnRailsPro::PreSeedRendererCache::VALID_MODES.map(&:to_s)
21
+ unless valid_modes.include?(raw_mode)
22
+ abort "[ReactOnRailsPro] Unknown MODE=#{raw_mode.inspect}. " \
23
+ "Expected one of: #{valid_modes.join(', ')}"
24
+ end
25
+ ReactOnRailsPro::PreSeedRendererCache.call(mode: raw_mode.to_sym)
26
+ end
27
+
28
+ # Deprecated alias. Delegates to pre_seed_renderer_cache with MODE=symlink so
29
+ # existing Procfile/Dockerfile/deploy-script entries keep working during the
30
+ # deprecation cycle.
31
+ #
32
+ # The warning below fires on every task invocation (it is not guarded by the
33
+ # once-per-process mutex in PrepareNodeRenderBundles). Rake tasks are invoked
34
+ # once per deploy, so repeated output is not a concern here.
35
+ desc "DEPRECATED: use 'pre_seed_renderer_cache' (MODE=copy for Docker, MODE=symlink for same-filesystem)."
7
36
  task pre_stage_bundle_for_node_renderer: :environment do
8
- ReactOnRailsPro::PrepareNodeRenderBundles.call
37
+ warn "[ReactOnRailsPro] The 'react_on_rails_pro:pre_stage_bundle_for_node_renderer' rake task is deprecated. " \
38
+ "Migrate to 'rake react_on_rails_pro:pre_seed_renderer_cache' — use MODE=copy (default) for Docker/image " \
39
+ "builds, or MODE=symlink for same-filesystem deploys (this shim preserves the old symlink behavior). " \
40
+ "Run 'rake react_on_rails:doctor' for a per-file migration suggestion based on where the task is referenced."
41
+ ReactOnRailsPro::PreSeedRendererCache.call(mode: :symlink)
9
42
  end
10
43
 
11
44
  desc "Copy assets to remote node-renderer"
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # TODO: This file is not used for CI
4
- require "coveralls/rake/task" if ENV["USE_COVERALLS"] == "TRUE"
5
4
 
6
5
  require "pathname"
7
6
  require "active_support/core_ext/string"
@@ -23,13 +22,15 @@ namespace :run_rspec do
23
22
  run_tests_in(spec_dummy_dir)
24
23
  end
25
24
 
26
- desc "(HACK) Run RSpec on spec/empty_spec in order to have SimpleCov generate a coverage report from cache"
25
+ desc "(HACK) Run RSpec on spec/empty_spec.rb set COVERAGE=true to generate a SimpleCov report from cache"
27
26
  task :empty do
28
- sh %(#{ENV['USE_COVERALLS'] ? 'COVERAGE=true' : ''} rspec spec/empty_spec.rb)
27
+ if ENV["COVERAGE"] == "true"
28
+ sh "bundle exec rspec spec/empty_spec.rb"
29
+ else
30
+ puts "Skipping run_rspec:empty (set COVERAGE=true to generate a SimpleCov report from cache)"
31
+ end
29
32
  end
30
33
 
31
- Coveralls::RakeTask.new if ENV["USE_COVERALLS"] == "TRUE"
32
-
33
34
  desc "run all tests"
34
35
  task run_rspec: %i[gem dummy empty js_tests] do
35
36
  puts "Completed all RSpec tests"
@@ -71,7 +72,6 @@ def run_tests_in(dir, options = {})
71
72
  command_name = options.fetch(:command_name, path.basename)
72
73
  rspec_args = options.fetch(:rspec_args, "")
73
74
  env_vars = +"#{options.fetch(:env_vars, '')} TEST_ENV_COMMAND_NAME=\"#{command_name}\""
74
- env_vars << "COVERAGE=true" if ENV["USE_COVERALLS"]
75
75
  sh_in_dir(path.realpath, "#{env_vars} bundle exec rspec #{rspec_args}")
76
76
  end
77
77
 
@@ -16,9 +16,14 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.summary = "Rails with react server rendering with webpack. Performance helpers"
18
18
  s.description = "See README.md"
19
- s.homepage = "https://github.com/shakacode/react_on_rails_pro"
19
+ s.homepage = "https://reactonrails.com/docs/pro/"
20
20
  s.license = "UNLICENSED"
21
21
  s.metadata["rubygems_mfa_required"] = "true"
22
+ s.metadata["bug_tracker_uri"] = "https://github.com/shakacode/react_on_rails/issues"
23
+ s.metadata["changelog_uri"] = "https://github.com/shakacode/react_on_rails/blob/main/CHANGELOG.md"
24
+ s.metadata["documentation_uri"] = "https://reactonrails.com/docs/pro/"
25
+ s.metadata["homepage_uri"] = "https://reactonrails.com/docs/pro/"
26
+ s.metadata["source_code_uri"] = "https://github.com/shakacode/react_on_rails/tree/main/react_on_rails_pro"
22
27
 
23
28
  s.files = Dir.chdir(__dir__) do
24
29
  `git ls-files -z`.split("\x0").reject do |f|
@@ -32,14 +37,14 @@ Gem::Specification.new do |s|
32
37
  s.required_ruby_version = ">= 3.0"
33
38
 
34
39
  s.add_runtime_dependency "addressable"
40
+ s.add_runtime_dependency "async", ">= 2.29"
35
41
  s.add_runtime_dependency "connection_pool"
36
42
  s.add_runtime_dependency "execjs", "~> 2.9"
37
- s.add_runtime_dependency "httpx", "~> 1.5"
38
43
  # Needed to avoid this bug at httpx versions >= 1.6.0:
39
44
  # https://github.com/HoneyryderChuck/httpx/issues/118
40
45
  s.add_runtime_dependency "http-2", ">= 1.1.1"
41
- s.add_runtime_dependency "jwt", "~> 2.7"
42
- s.add_runtime_dependency "async", ">= 2.29"
46
+ s.add_runtime_dependency "httpx", "~> 1.5"
47
+ s.add_runtime_dependency "jwt", ">= 2.7"
43
48
  s.add_runtime_dependency "rainbow"
44
49
  s.add_runtime_dependency "react_on_rails", ReactOnRails::VERSION
45
50
  s.add_development_dependency "bundler"
@@ -96,5 +96,7 @@ module ReactOnRailsPro
96
96
  def validate_remote_bundle_cache_adapter: () -> void
97
97
 
98
98
  def setup_renderer_password: () -> void
99
+
100
+ def validate_renderer_password_for_production: () -> void
99
101
  end
100
102
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_on_rails_pro
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.6.0
4
+ version: 16.7.0.rc.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-04-09 00:00:00.000000000 Z
11
+ date: 2026-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -25,47 +25,47 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: connection_pool
28
+ name: async
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '2.29'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '2.29'
41
41
  - !ruby/object:Gem::Dependency
42
- name: execjs
42
+ name: connection_pool
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '2.9'
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '2.9'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: httpx
56
+ name: execjs
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.5'
61
+ version: '2.9'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.5'
68
+ version: '2.9'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: http-2
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -81,33 +81,33 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.1.1
83
83
  - !ruby/object:Gem::Dependency
84
- name: jwt
84
+ name: httpx
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.7'
89
+ version: '1.5'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.7'
96
+ version: '1.5'
97
97
  - !ruby/object:Gem::Dependency
98
- name: async
98
+ name: jwt
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '2.29'
103
+ version: '2.7'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: '2.29'
110
+ version: '2.7'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rainbow
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 16.6.0
131
+ version: 16.7.0.rc.1
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 16.6.0
138
+ version: 16.7.0.rc.1
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: bundler
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -228,6 +228,7 @@ files:
228
228
  - eslint.config.mjs
229
229
  - lib/react_on_rails_pro.rb
230
230
  - lib/react_on_rails_pro/assets_precompile.rb
231
+ - lib/react_on_rails_pro/async_props_emitter.rb
231
232
  - lib/react_on_rails_pro/async_value.rb
232
233
  - lib/react_on_rails_pro/cache.rb
233
234
  - lib/react_on_rails_pro/compression_middleware_guard.rb
@@ -238,13 +239,20 @@ files:
238
239
  - lib/react_on_rails_pro/constants.rb
239
240
  - lib/react_on_rails_pro/engine.rb
240
241
  - lib/react_on_rails_pro/error.rb
242
+ - lib/react_on_rails_pro/httpx_stream_bidi_patch.rb
241
243
  - lib/react_on_rails_pro/immediate_async_value.rb
244
+ - lib/react_on_rails_pro/js_code_builder.rb
242
245
  - lib/react_on_rails_pro/license_public_key.rb
243
246
  - lib/react_on_rails_pro/license_task_formatter.rb
244
247
  - lib/react_on_rails_pro/license_validator.rb
248
+ - lib/react_on_rails_pro/pre_seed_renderer_cache.rb
245
249
  - lib/react_on_rails_pro/prepare_node_renderer_bundles.rb
250
+ - lib/react_on_rails_pro/renderer_cache_helpers.rb
251
+ - lib/react_on_rails_pro/renderer_cache_path.rb
246
252
  - lib/react_on_rails_pro/rendering_error.rb
253
+ - lib/react_on_rails_pro/rendering_strategy/node_strategy.rb
247
254
  - lib/react_on_rails_pro/request.rb
255
+ - lib/react_on_rails_pro/rolling_deploy_cache_stager.rb
248
256
  - lib/react_on_rails_pro/routes.rb
249
257
  - lib/react_on_rails_pro/server_rendering_js_code.rb
250
258
  - lib/react_on_rails_pro/server_rendering_pool/node_rendering_pool.rb
@@ -276,11 +284,16 @@ files:
276
284
  - sig/react_on_rails_pro/immediate_async_value.rbs
277
285
  - sig/react_on_rails_pro/license_validator.rbs
278
286
  - sig/react_on_rails_pro/utils.rbs
279
- homepage: https://github.com/shakacode/react_on_rails_pro
287
+ homepage: https://reactonrails.com/docs/pro/
280
288
  licenses:
281
289
  - UNLICENSED
282
290
  metadata:
283
291
  rubygems_mfa_required: 'true'
292
+ bug_tracker_uri: https://github.com/shakacode/react_on_rails/issues
293
+ changelog_uri: https://github.com/shakacode/react_on_rails/blob/main/CHANGELOG.md
294
+ documentation_uri: https://reactonrails.com/docs/pro/
295
+ homepage_uri: https://reactonrails.com/docs/pro/
296
+ source_code_uri: https://github.com/shakacode/react_on_rails/tree/main/react_on_rails_pro
284
297
  post_install_message:
285
298
  rdoc_options: []
286
299
  require_paths: