react_on_rails 16.0.0 → 16.0.1.rc.2

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +124 -77
  3. data/CLAUDE.md +46 -2
  4. data/CONTRIBUTING.md +12 -6
  5. data/Gemfile.development_dependencies +1 -0
  6. data/Gemfile.lock +3 -1
  7. data/LICENSE.md +15 -1
  8. data/README.md +68 -18
  9. data/bin/lefthook/check-trailing-newlines +38 -0
  10. data/bin/lefthook/get-changed-files +26 -0
  11. data/bin/lefthook/prettier-format +26 -0
  12. data/bin/lefthook/ruby-autofix +26 -0
  13. data/bin/lefthook/ruby-lint +27 -0
  14. data/eslint.config.ts +10 -0
  15. data/knip.ts +20 -9
  16. data/lib/generators/react_on_rails/USAGE +65 -0
  17. data/lib/generators/react_on_rails/base_generator.rb +7 -7
  18. data/lib/generators/react_on_rails/generator_helper.rb +4 -0
  19. data/lib/generators/react_on_rails/generator_messages.rb +2 -2
  20. data/lib/generators/react_on_rails/install_generator.rb +115 -7
  21. data/lib/generators/react_on_rails/react_no_redux_generator.rb +16 -4
  22. data/lib/generators/react_on_rails/react_with_redux_generator.rb +83 -14
  23. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.tsx +25 -0
  24. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.tsx +5 -0
  25. data/lib/generators/react_on_rails/templates/base/base/bin/dev +12 -24
  26. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/actions/helloWorldActionCreators.ts +18 -0
  27. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.tsx +24 -0
  28. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/constants/helloWorldConstants.ts +6 -0
  29. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/containers/HelloWorldContainer.ts +20 -0
  30. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/reducers/helloWorldReducer.ts +22 -0
  31. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.client.tsx +23 -0
  32. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.tsx +5 -0
  33. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.ts +18 -0
  34. data/lib/react_on_rails/configuration.rb +10 -6
  35. data/lib/react_on_rails/dev/server_manager.rb +185 -28
  36. data/lib/react_on_rails/doctor.rb +1149 -0
  37. data/lib/react_on_rails/helper.rb +9 -78
  38. data/lib/react_on_rails/pro/NOTICE +21 -0
  39. data/lib/react_on_rails/pro/helper.rb +122 -0
  40. data/lib/react_on_rails/pro/utils.rb +53 -0
  41. data/lib/react_on_rails/react_component/render_options.rb +6 -2
  42. data/lib/react_on_rails/system_checker.rb +659 -0
  43. data/lib/react_on_rails/version.rb +1 -1
  44. data/lib/tasks/doctor.rake +48 -0
  45. data/lib/tasks/generate_packs.rake +127 -4
  46. data/package-lock.json +11984 -0
  47. metadata +26 -6
  48. data/lib/generators/react_on_rails/bin/dev +0 -46
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../react_on_rails"
4
+ require_relative "../react_on_rails/doctor"
5
+
6
+ begin
7
+ require "rainbow"
8
+ rescue LoadError
9
+ # Fallback if Rainbow is not available
10
+ class Rainbow
11
+ def self.method_missing(_method, text)
12
+ SimpleColorWrapper.new(text)
13
+ end
14
+
15
+ def self.respond_to_missing?(_method, _include_private = false)
16
+ true
17
+ end
18
+ end
19
+
20
+ class SimpleColorWrapper
21
+ def initialize(text)
22
+ @text = text
23
+ end
24
+
25
+ def method_missing(_method, *_args)
26
+ self
27
+ end
28
+
29
+ def respond_to_missing?(_method, _include_private = false)
30
+ true
31
+ end
32
+
33
+ def to_s
34
+ @text
35
+ end
36
+ end
37
+ end
38
+
39
+ namespace :react_on_rails do
40
+ desc "Diagnose React on Rails setup and configuration"
41
+ task :doctor do
42
+ verbose = ENV["VERBOSE"] == "true"
43
+ fix = ENV["FIX"] == "true"
44
+
45
+ doctor = ReactOnRails::Doctor.new(verbose: verbose, fix: fix)
46
+ doctor.run_diagnosis
47
+ end
48
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rubocop:disable Metrics/BlockLength
3
4
  namespace :react_on_rails do
4
5
  desc <<~DESC
5
6
  If there is a file inside any directory matching config.components_subdirectory, this command generates corresponding packs.
@@ -21,11 +22,133 @@ namespace :react_on_rails do
21
22
  puts Rainbow("📂 Components subdirectory: #{ReactOnRails.configuration.components_subdirectory}").cyan
22
23
  puts ""
23
24
 
24
- start_time = Time.now
25
- ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
26
- end_time = Time.now
25
+ begin
26
+ start_time = Time.now
27
+ ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
28
+ end_time = Time.now
27
29
 
30
+ puts ""
31
+ puts Rainbow("✨ Pack generation completed in #{((end_time - start_time) * 1000).round(1)}ms").green
32
+ rescue ReactOnRails::Error => e
33
+ handle_react_on_rails_error(e)
34
+ exit 1
35
+ rescue StandardError => e
36
+ handle_standard_error(e)
37
+ exit 1
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ # rubocop:disable Metrics/AbcSize
44
+ def handle_react_on_rails_error(error)
45
+ puts ""
46
+ puts Rainbow("❌ REACT ON RAILS ERROR").red.bold
47
+ puts Rainbow("=" * 80).red
48
+ puts Rainbow("🚨 Pack generation failed with the following error:").red
49
+ puts ""
50
+ puts Rainbow("📋 ERROR DETAILS:").yellow
51
+ puts Rainbow(" Type: #{error.class.name}").white
52
+ puts Rainbow(" Message: #{error.message}").white
53
+ puts ""
54
+
55
+ highlight_main_error(error)
56
+ show_common_solutions(error)
57
+ show_debugging_steps
58
+ show_documentation_links
59
+ end
60
+ # rubocop:enable Metrics/AbcSize
61
+
62
+ def highlight_main_error(error)
63
+ return unless error.message.include?("**ERROR**")
64
+
65
+ error_lines = error.message.split("\n")
66
+ error_lines.each do |line|
67
+ next unless line.include?("**ERROR**")
68
+
69
+ puts Rainbow("🔥 MAIN ISSUE:").red.bold
70
+ puts Rainbow(" #{line.gsub('**ERROR**', '').strip}").yellow
71
+ end
72
+ end
73
+
74
+ # rubocop:disable Metrics/AbcSize
75
+ def show_common_solutions(error)
76
+ puts ""
77
+ puts Rainbow("💡 COMMON SOLUTIONS:").green.bold
78
+
79
+ case error.message
80
+ when /client specific definition.*overrides the common definition/
81
+ puts Rainbow(" • You have both common and client/server specific component files").white
82
+ puts Rainbow(" • Delete the common component file (e.g., Component.jsx)").white
83
+ puts Rainbow(" • Keep only the client/server specific files " \
84
+ "(Component.client.jsx, Component.server.jsx)").white
85
+ puts Rainbow(" • See: https://www.shakacode.com/react-on-rails/docs/guides/" \
86
+ "file-system-based-automated-bundle-generation.md").cyan
87
+
88
+ when /Cannot find component/
89
+ puts Rainbow(" • Check that your component file exists in the expected location").white
90
+ puts Rainbow(" • Verify the component is exported as default export").white
91
+ puts Rainbow(" • Ensure the file extension is .jsx or .js").white
92
+
93
+ when /CSS module.*not found/
94
+ puts Rainbow(" • Check that the CSS module file exists").white
95
+ puts Rainbow(" • Verify the import path is correct").white
96
+ puts Rainbow(" • Ensure all CSS classes referenced in the component exist").white
97
+
98
+ else
99
+ puts Rainbow(" • Check component file structure and naming").white
100
+ puts Rainbow(" • Verify all imports and exports are correct").white
101
+ puts Rainbow(" • Run with --trace for more detailed error information").white
102
+ end
103
+ end
104
+ # rubocop:enable Metrics/AbcSize
105
+
106
+ def show_debugging_steps
107
+ puts ""
108
+ puts Rainbow("🔧 DEBUGGING STEPS:").blue.bold
109
+ components_path = "app/javascript/src/**/#{ReactOnRails.configuration.components_subdirectory}/"
110
+ puts Rainbow(" 1. Check component files in: #{components_path}").white
111
+ puts Rainbow(" 2. Verify component exports: export default ComponentName").white
112
+ puts Rainbow(" 3. Check for conflicting common/client/server files").white
113
+ puts Rainbow(" 4. Run: rake react_on_rails:generate_packs --trace").white
114
+ puts Rainbow(" 5. Check Rails logs for additional details").white
115
+ end
116
+
117
+ def show_documentation_links
118
+ puts ""
119
+ puts Rainbow("📚 DOCUMENTATION:").magenta.bold
120
+ puts Rainbow(" • File-system based components: https://www.shakacode.com/react-on-rails/docs/" \
121
+ "guides/file-system-based-automated-bundle-generation.md").cyan
122
+ puts Rainbow(" • Component registration: https://www.shakacode.com/react-on-rails/docs/").cyan
123
+ puts Rainbow("=" * 80).red
124
+ end
125
+
126
+ # rubocop:disable Metrics/AbcSize
127
+ def handle_standard_error(error)
128
+ puts ""
129
+ puts Rainbow("❌ UNEXPECTED ERROR").red.bold
130
+ puts Rainbow("=" * 80).red
131
+ puts Rainbow("🚨 An unexpected error occurred during pack generation:").red
132
+ puts ""
133
+ puts Rainbow("📋 ERROR DETAILS:").yellow
134
+ puts Rainbow(" Type: #{error.class.name}").white
135
+ puts Rainbow(" Message: #{error.message}").white
136
+ puts Rainbow(" Backtrace:").white
137
+ error.backtrace.first(10).each { |line| puts Rainbow(" #{line}").white }
138
+ puts Rainbow(" ... (run with --trace for full backtrace)").white
139
+ puts ""
140
+ puts Rainbow("🔧 DEBUGGING STEPS:").blue.bold
141
+ puts Rainbow(" 1. Run: rake react_on_rails:generate_packs --trace").white
142
+ puts Rainbow(" 2. Check Rails logs: tail -f log/development.log").white
143
+ puts Rainbow(" 3. Verify all dependencies are installed: bundle install && npm install").white
144
+ puts Rainbow(" 4. Clear cache: rm -rf tmp/cache").white
28
145
  puts ""
29
- puts Rainbow(" Pack generation completed in #{((end_time - start_time) * 1000).round(1)}ms").green
146
+ puts Rainbow("📞 GET HELP:").magenta.bold
147
+ puts Rainbow(" • Create an issue: https://github.com/shakacode/react_on_rails/issues").cyan
148
+ puts Rainbow(" • Community discussions: https://github.com/shakacode/react_on_rails/discussions").cyan
149
+ puts Rainbow(" • Professional support: https://www.shakacode.com/react-on-rails-pro").cyan
150
+ puts Rainbow("=" * 80).red
30
151
  end
152
+ # rubocop:enable Metrics/AbcSize
31
153
  end
154
+ # rubocop:enable Metrics/BlockLength