react_on_rails 16.2.0.beta.3 → 16.2.0.beta.8

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -5
  3. data/CLAUDE.md +59 -0
  4. data/CONTRIBUTING.md +49 -1
  5. data/Gemfile.development_dependencies +1 -1
  6. data/Gemfile.lock +25 -10
  7. data/SWITCHING_CI_CONFIGS.md +55 -6
  8. data/Steepfile +51 -0
  9. data/bin/ci-rerun-failures +68 -22
  10. data/bin/ci-run-failed-specs +26 -2
  11. data/bin/ci-switch-config +262 -34
  12. data/bin/lefthook/check-trailing-newlines +2 -12
  13. data/bin/lefthook/eslint-lint +0 -10
  14. data/bin/lefthook/prettier-format +0 -10
  15. data/bin/lefthook/ruby-autofix +3 -6
  16. data/knip.ts +35 -9
  17. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt +32 -52
  18. data/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +5 -1
  19. data/lib/react_on_rails/configuration.rb +56 -12
  20. data/lib/react_on_rails/controller.rb +3 -3
  21. data/lib/react_on_rails/dev/server_manager.rb +11 -4
  22. data/lib/react_on_rails/doctor.rb +249 -2
  23. data/lib/react_on_rails/helper.rb +12 -3
  24. data/lib/react_on_rails/pro_helper.rb +2 -44
  25. data/lib/react_on_rails/react_component/render_options.rb +7 -7
  26. data/lib/react_on_rails/utils.rb +40 -0
  27. data/lib/react_on_rails/version.rb +1 -1
  28. data/react_on_rails_pro/CHANGELOG.md +142 -29
  29. data/react_on_rails_pro/CONTRIBUTING.md +2 -13
  30. data/react_on_rails_pro/Gemfile.development_dependencies +1 -0
  31. data/react_on_rails_pro/Gemfile.lock +24 -3
  32. data/react_on_rails_pro/README.md +559 -38
  33. data/react_on_rails_pro/docs/code-splitting-loadable-components.md +1 -1
  34. data/react_on_rails_pro/docs/contributors-info/releasing.md +2 -2
  35. data/react_on_rails_pro/docs/installation.md +129 -109
  36. data/react_on_rails_pro/docs/node-renderer/basics.md +29 -22
  37. data/react_on_rails_pro/docs/node-renderer/error-reporting-and-tracing.md +8 -8
  38. data/react_on_rails_pro/docs/node-renderer/js-configuration.md +25 -23
  39. data/react_on_rails_pro/docs/node-renderer/troubleshooting.md +2 -0
  40. data/react_on_rails_pro/docs/updating.md +209 -15
  41. data/react_on_rails_pro/lib/react_on_rails_pro/concerns/stream.rb +58 -4
  42. data/react_on_rails_pro/lib/react_on_rails_pro/configuration.rb +17 -3
  43. data/react_on_rails_pro/lib/react_on_rails_pro/license_public_key.rb +9 -9
  44. data/react_on_rails_pro/lib/react_on_rails_pro/request.rb +41 -25
  45. data/react_on_rails_pro/lib/react_on_rails_pro/stream_request.rb +27 -7
  46. data/react_on_rails_pro/lib/react_on_rails_pro/utils.rb +3 -3
  47. data/react_on_rails_pro/lib/react_on_rails_pro/version.rb +1 -1
  48. data/react_on_rails_pro/package-scripts.yml +1 -1
  49. data/react_on_rails_pro/package.json +5 -8
  50. data/react_on_rails_pro/packages/node-renderer/src/integrations/api.ts +1 -1
  51. data/react_on_rails_pro/packages/node-renderer/src/master/restartWorkers.ts +39 -17
  52. data/react_on_rails_pro/packages/node-renderer/src/master.ts +15 -4
  53. data/react_on_rails_pro/packages/node-renderer/src/shared/configBuilder.ts +44 -5
  54. data/react_on_rails_pro/packages/node-renderer/src/shared/utils.ts +4 -2
  55. data/react_on_rails_pro/packages/node-renderer/src/worker/handleGracefulShutdown.ts +49 -0
  56. data/react_on_rails_pro/packages/node-renderer/src/worker/vm.ts +3 -3
  57. data/react_on_rails_pro/packages/node-renderer/src/worker.ts +5 -2
  58. data/react_on_rails_pro/packages/node-renderer/tests/helper.ts +8 -8
  59. data/react_on_rails_pro/packages/node-renderer/tests/testingNodeRendererConfigs.js +1 -1
  60. data/react_on_rails_pro/packages/node-renderer/tests/worker.test.ts +19 -19
  61. data/react_on_rails_pro/rakelib/public_key_management.rake +6 -5
  62. data/react_on_rails_pro/rakelib/rbs.rake +47 -0
  63. data/react_on_rails_pro/react_on_rails_pro.gemspec +1 -0
  64. data/react_on_rails_pro/sig/react_on_rails_pro/cache.rbs +13 -0
  65. data/react_on_rails_pro/sig/react_on_rails_pro/configuration.rbs +100 -0
  66. data/react_on_rails_pro/sig/react_on_rails_pro/error.rbs +4 -0
  67. data/react_on_rails_pro/sig/react_on_rails_pro/utils.rbs +7 -0
  68. data/react_on_rails_pro/sig/react_on_rails_pro.rbs +5 -0
  69. data/react_on_rails_pro/spec/dummy/Gemfile.lock +23 -3
  70. data/react_on_rails_pro/spec/dummy/app/controllers/pages_controller.rb +3 -3
  71. data/react_on_rails_pro/spec/dummy/bin/dev +4 -8
  72. data/react_on_rails_pro/spec/dummy/client/node-renderer.js +4 -4
  73. data/react_on_rails_pro/spec/dummy/config/environments/production.rb +1 -1
  74. data/react_on_rails_pro/spec/dummy/config/initializers/react_on_rails.rb +28 -12
  75. data/react_on_rails_pro/spec/dummy/config.ru +1 -1
  76. data/react_on_rails_pro/spec/dummy/package.json +2 -2
  77. data/react_on_rails_pro/spec/dummy/spec/helpers/react_on_rails_pro_helper_spec.rb +40 -11
  78. data/react_on_rails_pro/spec/dummy/spec/rails_helper.rb +1 -1
  79. data/react_on_rails_pro/spec/dummy/spec/requests/renderer_console_logging_spec.rb +5 -5
  80. data/react_on_rails_pro/spec/dummy/spec/system/integration_spec.rb +15 -10
  81. data/react_on_rails_pro/spec/dummy/spec/system/renderer_integration_spec.rb +3 -3
  82. data/react_on_rails_pro/spec/dummy/yarn.lock +4 -4
  83. data/react_on_rails_pro/spec/execjs-compatible-dummy/config/environments/production.rb +1 -1
  84. data/react_on_rails_pro/spec/execjs-compatible-dummy/config/initializers/react_on_rails.rb +16 -43
  85. data/react_on_rails_pro/spec/react_on_rails_pro/assets_precompile_spec.rb +15 -18
  86. data/react_on_rails_pro/spec/react_on_rails_pro/cache_spec.rb +1 -1
  87. data/react_on_rails_pro/spec/react_on_rails_pro/configuration_spec.rb +5 -3
  88. data/react_on_rails_pro/spec/react_on_rails_pro/license_validator_spec.rb +27 -12
  89. data/react_on_rails_pro/spec/react_on_rails_pro/request_spec.rb +0 -27
  90. data/react_on_rails_pro/spec/react_on_rails_pro/spec_helper.rb +1 -1
  91. data/react_on_rails_pro/spec/react_on_rails_pro/stream_decorator_spec.rb +89 -0
  92. data/react_on_rails_pro/spec/react_on_rails_pro/stream_spec.rb +144 -0
  93. data/react_on_rails_pro/spec/react_on_rails_pro/support/caching.rb +1 -1
  94. data/react_on_rails_pro/spec/react_on_rails_pro/support/mock_block_helper.rb +4 -2
  95. data/sig/react_on_rails/controller.rbs +1 -1
  96. data/sig/react_on_rails/error.rbs +4 -0
  97. data/sig/react_on_rails/helper.rbs +2 -2
  98. data/sig/react_on_rails/json_parse_error.rbs +10 -0
  99. data/sig/react_on_rails/prerender_error.rbs +21 -0
  100. data/sig/react_on_rails/smart_error.rbs +28 -0
  101. data/sig/react_on_rails.rbs +3 -24
  102. metadata +14 -4
  103. data/lib/react_on_rails/pro_utils.rb +0 -37
  104. data/react_on_rails_pro/spec/dummy/client/app/ror-auto-load-components/TestingStreamableComponent.jsx +0 -15
@@ -0,0 +1,4 @@
1
+ module ReactOnRails
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -21,7 +21,7 @@ module ReactOnRails
21
21
  # Returns html_safe string (ActiveSupport::SafeBuffer)
22
22
  def redux_store: (
23
23
  String store_name,
24
- ?Hash[Symbol, untyped] props
24
+ ?Hash[Symbol, untyped] | String props
25
25
  ) -> safe_buffer
26
26
 
27
27
  # Returns html_safe string (ActiveSupport::SafeBuffer)
@@ -33,7 +33,7 @@ module ReactOnRails
33
33
  ?Hash[Symbol, untyped] options
34
34
  ) -> safe_buffer
35
35
 
36
- def sanitized_props_string: (untyped props) -> String
36
+ def sanitized_props_string: (Hash[Symbol, untyped] | String props) -> String
37
37
 
38
38
  def rails_context: (
39
39
  ?server_side: bool
@@ -0,0 +1,10 @@
1
+ module ReactOnRails
2
+ class JsonParseError < ::ReactOnRails::Error
3
+ attr_reader json: String
4
+
5
+ def initialize: (parse_error: StandardError, json: String) -> void
6
+ def to_honeybadger_context: () -> Hash[Symbol, untyped]
7
+ def raven_context: () -> Hash[Symbol, untyped]
8
+ def to_error_context: () -> Hash[Symbol, untyped]
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module ReactOnRails
2
+ class PrerenderError < ::ReactOnRails::Error
3
+ MAX_ERROR_SNIPPET_TO_LOG: Integer
4
+
5
+ attr_reader component_name: String?
6
+ attr_reader err: StandardError?
7
+ attr_reader props: String?
8
+ attr_reader js_code: String?
9
+ attr_reader console_messages: String?
10
+
11
+ def initialize: (?component_name: String?, ?err: StandardError?, ?props: String?, ?js_code: String?, ?console_messages: String?) -> void
12
+ def to_honeybadger_context: () -> Hash[Symbol, untyped]
13
+ def raven_context: () -> Hash[Symbol, untyped]
14
+ def to_error_context: () -> Hash[Symbol, untyped]
15
+
16
+ private
17
+
18
+ def calc_message: (String? component_name, String? console_messages, StandardError? err, String? js_code, String? props) -> [String?, String]
19
+ def build_troubleshooting_suggestions: (String? component_name, StandardError? err, String? console_messages) -> String
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ module ReactOnRails
2
+ class SmartError < Error
3
+ attr_reader error_type: Symbol
4
+ attr_reader component_name: String?
5
+ attr_reader props: String?
6
+ attr_reader js_code: String?
7
+ attr_reader additional_context: Hash[Symbol, untyped]
8
+
9
+ def initialize: (error_type: Symbol, ?component_name: String?, ?props: String?, ?js_code: String?, **untyped additional_context) -> void
10
+ def solution: () -> String
11
+
12
+ private
13
+
14
+ def build_error_message: () -> String
15
+ def error_type_title: () -> String
16
+ def error_description: () -> String
17
+ def component_not_registered_solution: () -> String
18
+ def missing_auto_loaded_bundle_solution: () -> String
19
+ def hydration_mismatch_solution: () -> String
20
+ def server_rendering_error_solution: () -> String
21
+ def redux_store_not_found_solution: () -> String
22
+ def configuration_error_solution: () -> String
23
+ def default_solution: () -> String
24
+ def additional_info: () -> String
25
+ def troubleshooting_section: () -> String
26
+ def find_similar_components: (String name) -> Array[String]
27
+ end
28
+ end
@@ -9,30 +9,9 @@ module ReactOnRails
9
9
  def self.configure: () { (Configuration) -> void } -> void
10
10
  def self.configuration: () -> Configuration
11
11
 
12
+ # Error classes are defined in separate RBS files:
13
+ # - sig/react_on_rails/prerender_error.rbs
14
+ # - sig/react_on_rails/json_parse_error.rbs
12
15
  class Error < StandardError
13
16
  end
14
-
15
- class PrerenderError < Error
16
- attr_reader component_name: String?
17
- attr_reader js_code: String?
18
- attr_reader err: Hash[Symbol, untyped]?
19
- attr_reader props: (Hash[Symbol, untyped] | String)?
20
- attr_reader console_messages: Array[String]?
21
-
22
- def initialize: (
23
- ?component_name: String?,
24
- ?js_code: String?,
25
- ?err: Hash[Symbol, untyped]?,
26
- ?props: (Hash[Symbol, untyped] | String)?,
27
- ?console_messages: Array[String]?
28
- ) -> void
29
-
30
- def to_honeybadger_context: () -> Hash[Symbol, untyped]
31
- def raven_context: () -> Hash[Symbol, untyped]
32
- def to_error_context: () -> Hash[Symbol, untyped]
33
- end
34
-
35
- class JsonParseError < Error
36
- def initialize: (Hash[Symbol, untyped] err) -> void
37
- end
38
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_on_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.2.0.beta.3
4
+ version: 16.2.0.beta.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-11-11 00:00:00.000000000 Z
11
+ date: 2025-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -137,6 +137,7 @@ files:
137
137
  - Rakefile
138
138
  - SUMMARY.md
139
139
  - SWITCHING_CI_CONFIGS.md
140
+ - Steepfile
140
141
  - TODO.md
141
142
  - WARP.md
142
143
  - app/helpers/react_on_rails_helper.rb
@@ -243,7 +244,6 @@ files:
243
244
  - lib/react_on_rails/packs_generator.rb
244
245
  - lib/react_on_rails/prerender_error.rb
245
246
  - lib/react_on_rails/pro_helper.rb
246
- - lib/react_on_rails/pro_utils.rb
247
247
  - lib/react_on_rails/react_component/render_options.rb
248
248
  - lib/react_on_rails/server_rendering_js_code.rb
249
249
  - lib/react_on_rails/server_rendering_pool.rb
@@ -378,6 +378,7 @@ files:
378
378
  - react_on_rails_pro/packages/node-renderer/src/worker.ts
379
379
  - react_on_rails_pro/packages/node-renderer/src/worker/authHandler.ts
380
380
  - react_on_rails_pro/packages/node-renderer/src/worker/checkProtocolVersionHandler.ts
381
+ - react_on_rails_pro/packages/node-renderer/src/worker/handleGracefulShutdown.ts
381
382
  - react_on_rails_pro/packages/node-renderer/src/worker/handleRenderRequest.ts
382
383
  - react_on_rails_pro/packages/node-renderer/src/worker/types.ts
383
384
  - react_on_rails_pro/packages/node-renderer/src/worker/vm.ts
@@ -430,6 +431,7 @@ files:
430
431
  - react_on_rails_pro/rakelib/dummy_apps.rake
431
432
  - react_on_rails_pro/rakelib/lint.rake
432
433
  - react_on_rails_pro/rakelib/public_key_management.rake
434
+ - react_on_rails_pro/rakelib/rbs.rake
433
435
  - react_on_rails_pro/rakelib/run_rspec.rake
434
436
  - react_on_rails_pro/rakelib/task_helpers.rb
435
437
  - react_on_rails_pro/rakelib/yard.rake
@@ -439,6 +441,11 @@ files:
439
441
  - react_on_rails_pro/script/preinstall.js
440
442
  - react_on_rails_pro/script/setup
441
443
  - react_on_rails_pro/script/test
444
+ - react_on_rails_pro/sig/react_on_rails_pro.rbs
445
+ - react_on_rails_pro/sig/react_on_rails_pro/cache.rbs
446
+ - react_on_rails_pro/sig/react_on_rails_pro/configuration.rbs
447
+ - react_on_rails_pro/sig/react_on_rails_pro/error.rbs
448
+ - react_on_rails_pro/sig/react_on_rails_pro/utils.rbs
442
449
  - react_on_rails_pro/spec/.rubocop.yml
443
450
  - react_on_rails_pro/spec/dummy/.browserslistrc
444
451
  - react_on_rails_pro/spec/dummy/.gitignore
@@ -749,7 +756,6 @@ files:
749
756
  - react_on_rails_pro/spec/dummy/client/app/ror-auto-load-components/SetTimeoutLoggingApp.server.jsx
750
757
  - react_on_rails_pro/spec/dummy/client/app/ror-auto-load-components/SimpleComponent.jsx
751
758
  - react_on_rails_pro/spec/dummy/client/app/ror-auto-load-components/StreamAsyncComponents.jsx
752
- - react_on_rails_pro/spec/dummy/client/app/ror-auto-load-components/TestingStreamableComponent.jsx
753
759
  - react_on_rails_pro/spec/dummy/client/app/routes/routes.jsx
754
760
  - react_on_rails_pro/spec/dummy/client/app/ssr-computations/userQuery.ssr-computation.ts
755
761
  - react_on_rails_pro/spec/dummy/client/app/store/composeInitialState.js
@@ -966,10 +972,14 @@ files:
966
972
  - sig/react_on_rails.rbs
967
973
  - sig/react_on_rails/configuration.rbs
968
974
  - sig/react_on_rails/controller.rbs
975
+ - sig/react_on_rails/error.rbs
969
976
  - sig/react_on_rails/git_utils.rbs
970
977
  - sig/react_on_rails/helper.rbs
978
+ - sig/react_on_rails/json_parse_error.rbs
971
979
  - sig/react_on_rails/packer_utils.rbs
980
+ - sig/react_on_rails/prerender_error.rbs
972
981
  - sig/react_on_rails/server_rendering_pool.rbs
982
+ - sig/react_on_rails/smart_error.rbs
973
983
  - sig/react_on_rails/test_helper.rbs
974
984
  - sig/react_on_rails/utils.rbs
975
985
  - sig/react_on_rails/version_checker.rbs
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ReactOnRails
4
- module ProUtils
5
- PRO_ONLY_OPTIONS = %i[immediate_hydration].freeze
6
-
7
- # Checks if React on Rails Pro features are available
8
- # @return [Boolean] true if Pro is installed and licensed, false otherwise
9
- def self.support_pro_features?
10
- ReactOnRails::Utils.react_on_rails_pro?
11
- end
12
-
13
- def self.disable_pro_render_options_if_not_licensed(raw_options)
14
- if support_pro_features?
15
- return {
16
- raw_options: raw_options,
17
- explicitly_disabled_pro_options: []
18
- }
19
- end
20
-
21
- raw_options_after_disable = raw_options.dup
22
-
23
- explicitly_disabled_pro_options = PRO_ONLY_OPTIONS.select do |option|
24
- # Use global configuration if it's not overridden in the options
25
- next ReactOnRails.configuration.send(option) if raw_options[option].nil?
26
-
27
- raw_options[option]
28
- end
29
- explicitly_disabled_pro_options.each { |option| raw_options_after_disable[option] = false }
30
-
31
- {
32
- raw_options: raw_options_after_disable,
33
- explicitly_disabled_pro_options: explicitly_disabled_pro_options
34
- }
35
- end
36
- end
37
- end
@@ -1,15 +0,0 @@
1
- 'use client';
2
-
3
- import React from 'react';
4
-
5
- // Simple test component for streaming SSR tests
6
- function TestingStreamableComponent({ helloWorldData }) {
7
- return (
8
- <div>
9
- <div>Chunk 1: Stream React Server Components</div>
10
- <div>Hello, {helloWorldData.name}!</div>
11
- </div>
12
- );
13
- }
14
-
15
- export default TestingStreamableComponent;