react_on_rails 17.1.0 → 17.2.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.development_dependencies +2 -2
  4. data/Gemfile.lock +65 -73
  5. data/Steepfile +1 -0
  6. data/docs/agent/install-and-upgrade.md +8 -3
  7. data/docs/agent/rsc-adoption.md +3 -0
  8. data/lib/generators/react_on_rails/base_generator.rb +2 -1
  9. data/lib/generators/react_on_rails/generated_webpack_config_pair.rb +84 -0
  10. data/lib/generators/react_on_rails/generator_helper.rb +2 -4
  11. data/lib/generators/react_on_rails/generator_messages.rb +1 -1
  12. data/lib/generators/react_on_rails/install_generator.rb +2 -1
  13. data/lib/generators/react_on_rails/js_dependency_manager.rb +14 -14
  14. data/lib/generators/react_on_rails/pro/USAGE +14 -3
  15. data/lib/generators/react_on_rails/pro_generator.rb +1 -1
  16. data/lib/generators/react_on_rails/pro_setup.rb +41 -213
  17. data/lib/generators/react_on_rails/rsc_setup.rb +7 -16
  18. data/lib/generators/react_on_rails/templates/pro/base/config/initializers/react_on_rails_pro.rb.tt +1 -1
  19. data/lib/react_on_rails/agent_guardrails.rb +217 -39
  20. data/lib/react_on_rails/dev/process_manager.rb +14 -0
  21. data/lib/react_on_rails/dev/server_manager.rb +1727 -103
  22. data/lib/react_on_rails/doctor.rb +875 -44
  23. data/lib/react_on_rails/helper.rb +3 -3
  24. data/lib/react_on_rails/react_component/render_options.rb +5 -7
  25. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +27 -116
  26. data/lib/react_on_rails/utils.rb +65 -0
  27. data/lib/react_on_rails/version.rb +1 -1
  28. data/lib/react_on_rails/version_checker/lockfile_resolution.rb +170 -0
  29. data/lib/react_on_rails/version_checker.rb +43 -22
  30. data/rakelib/run_rspec.rake +6 -1
  31. data/sig/react_on_rails/configuration.rbs +28 -26
  32. data/sig/react_on_rails/controller.rbs +2 -1
  33. data/sig/react_on_rails/dev/process_manager.rbs +1 -0
  34. data/sig/react_on_rails/dev/server_manager.rbs +150 -10
  35. data/sig/react_on_rails/git_utils.rbs +5 -1
  36. data/sig/react_on_rails/locales.rbs +4 -4
  37. data/sig/react_on_rails/prerender_error.rbs +2 -2
  38. data/sig/react_on_rails/test_helper.rbs +15 -1
  39. data/sig/react_on_rails/utils.rbs +2 -2
  40. data/sig/react_on_rails/version_checker/lockfile_resolution.rbs +31 -0
  41. data/sig/react_on_rails/version_checker.rbs +30 -7
  42. metadata +4 -1
@@ -1,38 +1,39 @@
1
1
  module ReactOnRails
2
2
  class Configuration
3
- attr_accessor node_modules_location: String?
4
- attr_accessor server_bundle_js_file: String
5
- attr_accessor prerender: bool
6
- attr_accessor replay_console: bool
3
+ attr_accessor node_modules_location: (String | Pathname)?
4
+ attr_accessor server_bundle_js_file: String?
5
+ attr_accessor prerender: bool?
6
+ attr_accessor replay_console: bool?
7
7
  attr_accessor trace: bool
8
8
  attr_accessor development_mode: bool
9
- attr_accessor logging_on_server: bool
10
- attr_accessor server_renderer_pool_size: Integer
11
- attr_accessor server_renderer_timeout: Integer
12
- attr_accessor raise_on_prerender_error: bool
13
- attr_accessor generated_assets_dir: String
9
+ attr_accessor logging_on_server: bool?
10
+ attr_accessor server_renderer_pool_size: Integer?
11
+ attr_accessor server_renderer_timeout: Integer?
12
+ attr_accessor raise_on_prerender_error: bool?
13
+ attr_accessor generated_assets_dir: String?
14
14
  attr_accessor components_subdirectory: String?
15
15
  attr_accessor stores_subdirectory: String?
16
- attr_accessor webpack_generated_files: Array[String]
16
+ attr_accessor webpack_generated_files: Array[String]?
17
17
  attr_accessor rendering_extension: String?
18
- attr_accessor build_test_command: String
19
- attr_accessor build_production_command: String
20
- attr_accessor i18n_dir: String?
21
- attr_accessor i18n_yml_dir: String?
22
- attr_accessor i18n_output_format: Symbol?
18
+ attr_accessor build_test_command: String?
19
+ attr_accessor build_production_command: String?
20
+ attr_accessor i18n_dir: (String | Pathname)?
21
+ attr_accessor i18n_yml_dir: (String | Pathname)?
22
+ attr_accessor i18n_output_format: (String | Symbol)?
23
23
  attr_accessor i18n_yml_safe_load_options: Hash[Symbol, untyped]?
24
- attr_accessor random_dom_id: bool
25
- attr_accessor auto_load_bundle: bool
26
- attr_accessor same_bundle_for_client_and_server: bool
24
+ attr_accessor random_dom_id: bool?
25
+ attr_accessor auto_load_bundle: bool?
26
+ attr_accessor same_bundle_for_client_and_server: bool?
27
27
  attr_accessor rendering_props_extension: String?
28
- attr_accessor make_generated_server_bundle_the_entrypoint: bool
28
+ attr_accessor make_generated_server_bundle_the_entrypoint: bool?
29
29
  attr_accessor generated_component_packs_loading_strategy: Symbol?
30
- attr_accessor component_registry_timeout: Integer
30
+ attr_accessor component_registry_timeout: Integer?
31
31
  attr_accessor server_bundle_output_path: String?
32
- attr_accessor enforce_private_server_bundles: bool
32
+ attr_accessor enforce_private_server_bundles: bool?
33
+ attr_accessor check_database_on_dev_start: bool
33
34
 
34
35
  def initialize: (
35
- ?node_modules_location: String?,
36
+ ?node_modules_location: (String | Pathname)?,
36
37
  ?server_bundle_js_file: String?,
37
38
  ?prerender: bool?,
38
39
  ?replay_console: bool?,
@@ -50,9 +51,9 @@ module ReactOnRails
50
51
  ?build_production_command: String?,
51
52
  ?generated_component_packs_loading_strategy: Symbol?,
52
53
  ?same_bundle_for_client_and_server: bool?,
53
- ?i18n_dir: String?,
54
- ?i18n_yml_dir: String?,
55
- ?i18n_output_format: Symbol?,
54
+ ?i18n_dir: (String | Pathname)?,
55
+ ?i18n_yml_dir: (String | Pathname)?,
56
+ ?i18n_output_format: (String | Symbol)?,
56
57
  ?i18n_yml_safe_load_options: Hash[Symbol, untyped]?,
57
58
  ?random_dom_id: bool?,
58
59
  ?rendering_props_extension: String?,
@@ -61,7 +62,8 @@ module ReactOnRails
61
62
  ?auto_load_bundle: bool?,
62
63
  ?component_registry_timeout: Integer?,
63
64
  ?server_bundle_output_path: String?,
64
- ?enforce_private_server_bundles: bool?
65
+ ?enforce_private_server_bundles: bool?,
66
+ ?check_database_on_dev_start: bool?
65
67
  ) -> void
66
68
 
67
69
  def setup_config_values: () -> void
@@ -5,7 +5,8 @@ module ReactOnRails
5
5
 
6
6
  def redux_store: (
7
7
  String store_name,
8
- ?props: Hash[Symbol, untyped] | String
8
+ ?props: Hash[Symbol, untyped] | String,
9
+ ?immediate_hydration: bool
9
10
  ) -> void
10
11
 
11
12
  # Returns html_safe string (ActiveSupport::SafeBuffer)
@@ -7,6 +7,7 @@ module ReactOnRails
7
7
  def self.installed?: (String) -> bool
8
8
  def self.ensure_procfile: (String) -> void
9
9
  def self.run_with_process_manager: (String) -> void
10
+ def self.exec_process_if_available: (String, Array[String]) -> bool
10
11
 
11
12
  private
12
13
 
@@ -3,16 +3,39 @@ module ReactOnRails
3
3
  class ServerManager
4
4
  type mode = :development | :production_like | :static | :hmr
5
5
 
6
- def self.start: (mode, String?, ?verbose: bool, ?route: String?, ?rails_env: String?) -> void
7
- def self.kill_processes: () -> void
8
- def self.development_processes: () -> Hash[String, String]
9
- def self.kill_running_processes: () -> bool
10
- def self.find_process_pids: (String) -> Array[Integer]
11
- def self.terminate_processes: (Array[Integer]) -> void
6
+ # Validated `tmp/react_on_rails/dev-session.json` contents.
7
+ type dev_session = Hash[Symbol, untyped]
8
+
9
+ # The atomically published session handle and its canonical path.
10
+ type dev_session_claim = Hash[Symbol, untyped]
11
+
12
+ # Classified view of this app directory's dev session state, plus the
13
+ # ports the kill path may inspect.
14
+ type dev_session_view = Hash[Symbol, untyped]
15
+
16
+ # [status, blockers] - status is one of :verified, :recovered_stale,
17
+ # :nothing_running, :unverified, :refused.
18
+ type shutdown_result = [Symbol, Array[String]]
19
+
20
+ # Four-bucket listener scan: :owned, :foreign and :unattributable map
21
+ # port => pids, :unavailable is a list of ports whose probe failed.
22
+ type port_listener_scan = Hash[Symbol, untyped]
23
+
24
+ # Enumerated in-root Overmind socket paths plus any reason the directory
25
+ # could not be inspected safely.
26
+ type overmind_socket_discovery = { paths: Array[String], blockers: Array[String] }
27
+
28
+ def self.start: (?mode, ?String?, ?verbose: bool, ?route: String?, ?rails_env: String?, ?skip_database_check: bool, ?open_browser: bool, ?open_browser_once: bool) -> void
29
+ def self.kill_processes: () -> Symbol
30
+ def self.clean_generated_assets_and_caches: () -> bool
31
+ def self.killable_ports: () -> Array[Integer]
32
+ def self.default_killable_ports: () -> Array[Integer]
33
+ def self.terminate_processes: (Array[Integer], ?String) -> void
12
34
  def self.kill_port_processes: (Array[Integer]) -> bool
13
35
  def self.find_port_pids: (Integer) -> Array[Integer]
36
+ def self.find_process_pids: (String) -> Array[Integer]
14
37
  def self.cleanup_socket_files: () -> bool
15
- def self.print_kill_summary: (bool) -> void
38
+ def self.print_kill_summary: (Symbol, ?Array[String]) -> void
16
39
  def self.show_help: () -> void
17
40
  def self.run_from_command_line: (?Array[String]) -> void
18
41
 
@@ -24,9 +47,9 @@ module ReactOnRails
24
47
  def self.help_customization: () -> String
25
48
  def self.help_mode_details: () -> String
26
49
  def self.help_troubleshooting: () -> String
27
- def self.run_production_like: (?_verbose: bool, ?route: String?, ?rails_env: String?) -> void
28
- def self.run_static_development: (String, ?verbose: bool, ?route: String?) -> void
29
- def self.run_development: (String, ?verbose: bool, ?route: String?) -> void
50
+ def self.run_production_like: (?_verbose: bool, ?route: String?, ?rails_env: String?, ?skip_database_check: bool, ?open_browser: bool, ?open_browser_once: bool) -> void
51
+ def self.run_static_development: (String, ?verbose: bool, ?route: String?, ?skip_database_check: bool, ?open_browser: bool, ?open_browser_once: bool) -> void
52
+ def self.run_development: (String, ?verbose: bool, ?route: String?, ?skip_database_check: bool, ?open_browser: bool, ?open_browser_once: bool) -> void
30
53
  def self.print_server_info: (String, Array[String], ?Integer, ?route: String?) -> void
31
54
  def self.print_procfile_info: (String, ?route: String?) -> void
32
55
  def self.procfile_port: (String) -> Integer
@@ -34,6 +57,123 @@ module ReactOnRails
34
57
  def self.box_bottom: (Integer) -> String
35
58
  def self.box_empty_line: (Integer) -> String
36
59
  def self.format_box_line: (String, Integer) -> String
60
+
61
+ # -- Scoped dev shutdown ------------------------------------------
62
+ def self.dev_session_path: (String) -> String
63
+ def self.dev_session_lock_path: (String) -> String
64
+ def self.current_app_root: () -> String
65
+ def self.app_root_ancestor: (String) -> String?
66
+ def self.inside_dev_app_root?: (untyped, ?String) -> bool
67
+ def self.relative_to_app_root: (String, ?String) -> String
68
+ def self.with_dev_session: () { () -> untyped } -> untyped
69
+ def self.claim_dev_session: (String) -> dev_session_claim?
70
+ def self.write_dev_session: (String, String) -> File
71
+ def self.write_claimed_dev_session: (File, String, String) -> dev_session_claim?
72
+ def self.dev_session_handle_detached?: (String, File) -> bool
73
+ def self.release_dev_session_lock: (File?) -> void
74
+ def self.discard_partial_dev_session: (File?, String) -> void
75
+ def self.warn_dev_session_unrecorded: (untyped) -> void
76
+ def self.warn_dev_session_contended: (File, String, String) -> nil
77
+ def self.open_dev_session_claim_lock: (String) -> File
78
+ def self.abort_dev_session_claim: (String, String) -> bot
79
+ def self.dev_session_payload: (String) -> Hash[String, untyped]
80
+ def self.selected_session_ports: () -> Array[Integer]
81
+ def self.owned_process_group: () -> Integer?
82
+ def self.owned_overmind_socket_path: (String) -> String?
83
+ def self.default_overmind_socket_path: (String) -> String
84
+ def self.release_dev_session: (dev_session_claim?) -> void
85
+ def self.shutdown_dev_session: () -> shutdown_result
86
+ def self.shutdown_ports: (dev_session_view) -> Array[Integer]
87
+ def self.shutdown_failed?: (Symbol?) -> bool
88
+ def self.abort_clean_after_failed_shutdown: () -> bool
89
+ def self.dispatch_dev_shutdown: (dev_session_view) -> shutdown_result
90
+ def self.dev_session_view: (String) -> dev_session_view
91
+ def self.dev_session_path_absent?: (String) -> bool
92
+ def self.open_dev_session_read_lock: (String) -> [Symbol, untyped]
93
+ def self.open_existing_or_create_dev_session_lock: (String) -> File
94
+ def self.open_existing_dev_session_lock: (String) -> File
95
+ def self.open_dev_session: (String) -> [Symbol, untyped]
96
+ def self.classify_dev_session: (String, String, File) -> [Symbol, untyped]
97
+ def self.confirm_locked_dev_session: (String, File, dev_session) -> [Symbol, untyped]
98
+ def self.classify_released_dev_session: (String, File, dev_session) -> [Symbol, untyped]
99
+ def self.parse_dev_session: (untyped) -> dev_session?
100
+ def self.valid_dev_session_document?: (untyped) -> bool
101
+ def self.valid_session_root?: (untyped) -> bool
102
+ def self.valid_session_pid?: (untyped) -> bool
103
+ def self.valid_session_pgid?: (untyped) -> bool
104
+ def self.valid_session_ports?: (untyped) -> bool
105
+ def self.valid_session_socket?: (untyped) -> bool
106
+ def self.lock_dev_session: (File) -> Symbol
107
+ def self.dev_session_replaced?: (String, File) -> bool
108
+ def self.close_session_handle: (dev_session_view?) -> void
109
+ def self.shutdown_live_owner: (dev_session_view) -> shutdown_result
110
+ def self.unreachable_owner_message: (dev_session_view, dev_session) -> String
111
+ def self.request_owner_shutdown: (dev_session_view, Integer?, Array[String]) -> bool
112
+ def self.shutdown_steps: (dev_session_view, Integer?, Array[String]) -> Array[untyped]
113
+ def self.control_overmind_endpoints: (dev_session_view, String, Array[String]) -> bool
114
+ def self.verify_owner_shutdown: (dev_session_view, Integer?, Array[String]) -> shutdown_result
115
+ def self.outstanding_shutdown_blockers: (dev_session_view) -> Array[String]
116
+ def self.owner_shutdown_complete?: (dev_session_view, Integer?, Array[String]) -> bool
117
+ def self.shutdown_settled?: (dev_session_view, Integer?, Array[String]) -> bool
118
+ def self.shutdown_blockers: (dev_session_view, Integer?, Array[String]) -> Array[String]
119
+ def self.owner_release_state: (dev_session_view) -> Symbol
120
+ def self.session_replaced?: (dev_session_view) -> bool
121
+ def self.session_replaced_blocker: (dev_session_view) -> String
122
+ def self.owner_state_blockers: (dev_session_view) -> Array[String]
123
+ def self.endpoint_blockers: (String?) -> Array[String]
124
+ def self.leftover_owned_listeners: (dev_session_view) -> Array[String]
125
+ def self.remove_dev_session_file: (dev_session_view) -> bool
126
+ def self.shutdown_without_owner: (dev_session_view) -> shutdown_result
127
+ def self.shutdown_orphaned_overmind: (dev_session_view, Array[String]) -> shutdown_result
128
+ def self.print_kill_failure: (Symbol, Array[String]) -> void
129
+ def self.live_overmind_endpoint: (String, String?) -> String?
130
+ def self.live_overmind_endpoints: (String, String?) -> Array[String]
131
+ def self.overmind_endpoint_candidates: (String, String?, ?Array[String]) -> Array[String]
132
+ def self.overmind_socket_discovery: (String) -> overmind_socket_discovery
133
+ def self.failed_overmind_socket_discovery: (String, SystemCallError) -> overmind_socket_discovery
134
+ def self.scan_overmind_endpoints: (String, String?) -> Hash[Symbol, Array[String]]
135
+ def self.outstanding_overmind_endpoint_blockers: (dev_session_view) -> Array[String]
136
+ def self.unprobeable_endpoint_blockers: (Array[String]?) -> Array[String]
137
+ def self.unprobeable_endpoint_message: (String) -> String
138
+ def self.live_overmind_endpoint_message: (String) -> String
139
+ def self.overmind_endpoint_ownership: (String, ?String) -> Symbol
140
+ def self.overmind_endpoint_owned?: (String, ?String) -> bool
141
+ def self.overmind_endpoint_state: (String) -> Symbol
142
+ def self.probe_unix_socket: (String) -> Symbol
143
+ def self.overmind_endpoint_alive?: (String) -> bool
144
+ def self.overmind_control: (String, String, ?timeout_secs: Numeric) -> bool
145
+ def self.run_overmind_command: (Array[String], ?timeout_secs: Numeric) -> bool
146
+ def self.spawn_overmind_command: (Array[String]) -> Integer
147
+ def self.execute_overmind_command: (Array[String]) -> bool
148
+ def self.wait_for_overmind_command: (Integer, Numeric) -> (Process::Status | Symbol)?
149
+ def self.terminate_overmind_command: (Integer) -> void
150
+ def self.wait_for_overmind_group_exit: (Integer, Numeric, bool) -> [bool, bool]
151
+ def self.overmind_command_reaped?: (Integer) -> bool
152
+ def self.reap_overmind_command: (Integer) -> untyped
153
+ def self.signalable_pgid: (untyped) -> Integer?
154
+ def self.own_process_group: () -> Integer?
155
+ def self.signal_process_group: (Integer, String) -> bool
156
+ def self.process_group_alive?: (Integer) -> bool
157
+ def self.process_alive?: (Integer) -> bool
158
+ def self.classify_port_listeners: (Array[Integer]) -> port_listener_scan
159
+ def self.report_unsignalled_listeners: (port_listener_scan) -> void
160
+ def self.stop_attributed_pids: (Array[Integer]) -> void
161
+ def self.report_foreign_listeners: (Hash[Integer, Array[Integer]]) -> void
162
+ def self.report_unattributable_listeners: (Hash[Integer, Array[Integer]]) -> void
163
+ def self.report_unavailable_port_probes: (Array[Integer]) -> void
164
+ def self.attribute_pid: (Integer, String) -> Symbol
165
+ def self.signal_permission_attribution: (Integer) -> Symbol
166
+ def self.working_directory_for_pid: (Integer) -> String?
167
+ def self.probe_port_listeners: (Integer) -> [Array[Integer], Symbol]
168
+ def self.default_rails_kill_port: () -> Integer
169
+ def self.default_dev_server_kill_port: () -> Integer
170
+ def self.configured_dev_server_port: () -> Integer?
171
+ def self.configured_renderer_ports_for_kill: () -> Array[Integer]
172
+ def self.renderer_procfile_ports_for_kill: (?String) -> Array[Integer]
173
+ def self.renderer_procfile_default_ports: (String) -> Array[Integer]
174
+ def self.stale_cleanup_candidates: (String) -> Array[String]
175
+ def self.wait_until: (Numeric) { () -> untyped } -> bool
176
+ def self.monotonic_now: () -> Float
37
177
  end
38
178
  end
39
179
  end
@@ -1,6 +1,10 @@
1
1
  module ReactOnRails
2
2
  module GitUtils
3
- def self.uncommitted_changes?: (String path) -> bool
3
+ interface _MessageHandler
4
+ def add_error: (String message) -> void
5
+ end
6
+
7
+ def self.uncommitted_changes?: (_MessageHandler message_handler, ?git_installed: bool) -> bool
4
8
  def self.git_installed?: () -> bool
5
9
  def self.current_branch: () -> String?
6
10
  def self.rspec_fixture_branches: () -> Array[String]
@@ -1,7 +1,7 @@
1
1
  module ReactOnRails
2
2
  module Locales
3
3
  def self.compile: (?force: bool) -> (ToJs | ToJson)
4
- def self.check_config_directory_exists: (directory: String?, key_name: String, remove_if: String) -> void
4
+ def self.check_config_directory_exists: (directory: (String | Pathname)?, key_name: String, remove_if: String) -> void
5
5
 
6
6
  class Base
7
7
  def initialize: (?force: bool) -> void
@@ -16,15 +16,15 @@ module ReactOnRails
16
16
  def files: () -> Array[String]
17
17
  def file: (String name) -> String
18
18
  def locale_files: () -> Array[String]
19
- def i18n_dir: () -> String?
20
- def i18n_yml_dir: () -> String?
19
+ def i18n_dir: () -> (String | Pathname)?
20
+ def i18n_yml_dir: () -> (String | Pathname)?
21
21
  def default_locale: () -> String
22
22
  def convert: () -> void
23
23
  def generate_file: (String template, String path) -> void
24
24
  def generate_translations: () -> [String, String]
25
25
  def format: (untyped input) -> Symbol
26
26
  def flatten_defaults: (Hash[untyped, untyped] val) -> Hash[Symbol, Hash[Symbol, untyped]]
27
- def flatten: (Hash[untyped, untyped] translations) -> Hash[Symbol, untyped]
27
+ def flatten: [Key] (Hash[Key, untyped] translations) -> Hash[Key | Symbol, untyped]
28
28
  def template_translations: () -> String
29
29
  def template_default: () -> String
30
30
  end
@@ -9,14 +9,14 @@ module ReactOnRails
9
9
  attr_reader js_code: String?
10
10
  attr_reader console_messages: String?
11
11
 
12
- def initialize: (?component_name: String?, ?err: StandardError?, ?props: String?, ?js_code: String?, ?console_messages: String?) -> void
12
+ def initialize: (?component_name: String?, ?err: StandardError?, ?props: (String | Hash[untyped, untyped])?, ?js_code: String?, ?console_messages: String?) -> void
13
13
  def to_honeybadger_context: () -> Hash[Symbol, untyped]
14
14
  def raven_context: () -> Hash[Symbol, untyped]
15
15
  def to_error_context: () -> Hash[Symbol, untyped]
16
16
 
17
17
  private
18
18
 
19
- def calc_message: (String? component_name, String? console_messages, StandardError? err, String? js_code, String? props) -> [String?, String]
19
+ def calc_message: (String? component_name, String? console_messages, StandardError? err, String? js_code, (String | Hash[untyped, untyped])? props) -> [String?, String]
20
20
  def build_troubleshooting_suggestions: (String? component_name, StandardError? err, String? console_messages) -> String
21
21
  end
22
22
  end
@@ -1,7 +1,21 @@
1
1
  module ReactOnRails
2
2
  module TestHelper
3
+ interface _AssetsStatusChecker
4
+ def stale_generated_webpack_files: () -> Array[String | Pathname]
5
+ end
6
+
7
+ interface _AssetsCompiler
8
+ def compile_assets: () -> void
9
+ end
10
+
3
11
  def self.configure_rspec_to_compile_assets: (untyped config) -> void
4
- def self.ensure_assets_compiled: (?force_compile: bool) -> void
12
+ def self.ensure_assets_compiled: (
13
+ ?webpack_assets_status_checker: _AssetsStatusChecker?,
14
+ ?webpack_assets_compiler: _AssetsCompiler?,
15
+ ?source_path: (String | Pathname)?,
16
+ ?generated_assets_full_path: (String | Pathname)?,
17
+ ?webpack_generated_files: Array[String]?
18
+ ) -> void
5
19
  def self.webpack_assets_compiled?: () -> bool
6
20
 
7
21
  module EnsureAssetsCompiled
@@ -12,10 +12,10 @@ module ReactOnRails
12
12
  def self.react_on_rails_pro_version: () -> String?
13
13
  def self.rsc_support_enabled?: () -> bool
14
14
  def self.full_text_errors_enabled?: () -> bool
15
- def self.smart_trim: (String str, ?Integer max_length) -> String
15
+ def self.smart_trim: (_ToS str, ?Integer max_length) -> String
16
16
  def self.find_most_recent_mtime: (Array[String] files) -> Time?
17
17
  def self.prepend_to_file_if_text_not_present: (file: String, text_to_prepend: String, regex: Regexp) -> void
18
- def self.detect_package_manager: () -> String
18
+ def self.detect_package_manager: () -> (:npm | :yarn | :pnpm | :bun)
19
19
  def self.default_troubleshooting_section: () -> String
20
20
  def self.server_bundle_js_file_path: () -> String
21
21
  def self.running_on_windows?: () -> bool
@@ -0,0 +1,31 @@
1
+ module ReactOnRails
2
+ class VersionChecker
3
+ module LockfileResolution
4
+ def self.version: (String dir, String package_name) -> String?
5
+ def self.berry_yarn_version: (String content, String package_name) -> String?
6
+ def self.guard: [T] () { () -> T } -> T?
7
+ def self.log_ignored: (Exception error) -> void
8
+
9
+ module PnpmLockfile
10
+ def self.version: (String path, String package_name) -> String?
11
+ def self.dependencies: (Hash[String, untyped] doc) -> Hash[String, untyped]?
12
+ def self.project_document: (String path) -> Hash[String, untyped]?
13
+ def self.strip_peer_suffix: (String? version) -> String?
14
+ end
15
+
16
+ module BunLockfile
17
+ STRING_LITERAL: Regexp
18
+ LINE_COMMENT: Regexp
19
+ BLOCK_COMMENT: Regexp
20
+ TRAILING_COMMA: Regexp
21
+
22
+ def self.version: (String path, String package_name) -> String?
23
+ def self.jsonc_to_json: (String content) -> String
24
+ end
25
+
26
+ module BerryYarnLockfile
27
+ def self.version: (String content, String package_name) -> String?
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,12 +1,35 @@
1
1
  module ReactOnRails
2
- module VersionChecker
3
- def self.log_if_gem_and_node_package_versions_differ: () -> void
2
+ class VersionChecker
3
+ VERSION_PARTS_REGEX: Regexp
4
4
 
5
- private
5
+ attr_reader node_package_version: untyped
6
6
 
7
- def self.node_package_version: () -> String?
8
- def self.gem_version: () -> String
9
- def self.node_package_version_different_from_gem?: () -> bool
10
- def self.pr_1683_warning: () -> String
7
+ def self.build: () -> VersionChecker
8
+ def initialize: (untyped node_package_version) -> void
9
+ def validate_version_and_package_compatibility!: () -> void
10
+
11
+ class NodePackageVersion
12
+ attr_reader package_json: untyped
13
+ attr_reader yarn_lock: untyped
14
+ attr_reader package_lock: untyped
15
+
16
+ def self.build: () -> NodePackageVersion
17
+ def self.package_json_path: () -> untyped
18
+ def self.yarn_lock_path: () -> String
19
+ def self.package_lock_path: () -> String
20
+ def initialize: (untyped package_json, ?untyped yarn_lock, ?untyped package_lock) -> void
21
+ def raw: () -> String?
22
+ def react_on_rails_package?: () -> bool
23
+ def react_on_rails_pro_package?: () -> bool
24
+ def package_name: () -> String
25
+ def semver_wildcard?: () -> bool
26
+ def special_version_string?: () -> bool
27
+ def wildcard_or_x_range?: () -> untyped
28
+ def range_operator?: () -> bool
29
+ def range_syntax?: () -> bool
30
+ def local_path_or_url?: () -> bool
31
+ def workspace_protocol?: () -> bool
32
+ def parts: () -> Array[String]?
33
+ end
11
34
  end
12
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_on_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 17.1.0
4
+ version: 17.2.0.rc.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
@@ -132,6 +132,7 @@ files:
132
132
  - lib/generators/react_on_rails/base_generator.rb
133
133
  - lib/generators/react_on_rails/demo_page_config.rb
134
134
  - lib/generators/react_on_rails/dev_tests_generator.rb
135
+ - lib/generators/react_on_rails/generated_webpack_config_pair.rb
135
136
  - lib/generators/react_on_rails/generator_helper.rb
136
137
  - lib/generators/react_on_rails/generator_messages.rb
137
138
  - lib/generators/react_on_rails/generator_messages/ci_section.rb
@@ -289,6 +290,7 @@ files:
289
290
  - lib/react_on_rails/utils.rb
290
291
  - lib/react_on_rails/version.rb
291
292
  - lib/react_on_rails/version_checker.rb
293
+ - lib/react_on_rails/version_checker/lockfile_resolution.rb
292
294
  - lib/react_on_rails/version_synchronizer.rb
293
295
  - lib/react_on_rails/version_syntax_converter.rb
294
296
  - lib/tasks/agent_guardrails.rake
@@ -337,6 +339,7 @@ files:
337
339
  - sig/react_on_rails/typescript_response_types/generated_file_writer.rbs
338
340
  - sig/react_on_rails/utils.rbs
339
341
  - sig/react_on_rails/version_checker.rbs
342
+ - sig/react_on_rails/version_checker/lockfile_resolution.rbs
340
343
  - skills/doctor-fix-loop/SKILL.md
341
344
  - skills/install-and-upgrade/SKILL.md
342
345
  - skills/rsc-adoption/SKILL.md