react_on_rails 15.0.0.rc.2 → 16.0.1.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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +103 -34
  3. data/CLAUDE.md +102 -0
  4. data/CODING_AGENTS.md +312 -0
  5. data/CONTRIBUTING.md +378 -3
  6. data/Gemfile.lock +2 -1
  7. data/LICENSE.md +30 -4
  8. data/LICENSES/README.md +14 -0
  9. data/REACT-ON-RAILS-PRO-LICENSE.md +129 -0
  10. data/README.md +70 -20
  11. data/TODO.md +135 -0
  12. data/eslint.config.ts +5 -0
  13. data/knip.ts +20 -9
  14. data/lib/generators/USAGE +4 -5
  15. data/lib/generators/react_on_rails/USAGE +65 -0
  16. data/lib/generators/react_on_rails/base_generator.rb +263 -57
  17. data/lib/generators/react_on_rails/dev_tests_generator.rb +1 -0
  18. data/lib/generators/react_on_rails/generator_helper.rb +35 -1
  19. data/lib/generators/react_on_rails/generator_messages.rb +138 -17
  20. data/lib/generators/react_on_rails/install_generator.rb +336 -26
  21. data/lib/generators/react_on_rails/react_no_redux_generator.rb +19 -6
  22. data/lib/generators/react_on_rails/react_with_redux_generator.rb +111 -18
  23. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +5 -0
  24. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-prod-assets +8 -0
  25. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static-assets +2 -0
  26. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +0 -5
  27. data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/server-bundle.js +1 -8
  28. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.jsx +21 -0
  29. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.client.tsx +25 -0
  30. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.module.css +4 -0
  31. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.jsx +5 -0
  32. data/lib/generators/react_on_rails/templates/base/base/app/javascript/src/HelloWorld/ror_components/HelloWorld.server.tsx +5 -0
  33. data/lib/generators/react_on_rails/templates/base/base/app/views/hello_world/index.html.erb.tt +1 -1
  34. data/lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb +4 -2
  35. data/lib/generators/react_on_rails/templates/base/base/babel.config.js.tt +5 -2
  36. data/lib/generators/react_on_rails/templates/base/base/bin/dev +34 -0
  37. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt +3 -3
  38. data/lib/generators/react_on_rails/templates/base/base/config/shakapacker.yml +76 -7
  39. data/lib/generators/react_on_rails/templates/base/base/config/webpack/commonWebpackConfig.js.tt +1 -1
  40. data/lib/generators/react_on_rails/templates/base/base/config/webpack/development.js.tt +8 -8
  41. data/lib/generators/react_on_rails/templates/base/base/config/webpack/production.js.tt +2 -2
  42. data/lib/generators/react_on_rails/templates/base/base/config/webpack/test.js.tt +2 -2
  43. data/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb +0 -2
  44. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/actions/helloWorldActionCreators.ts +18 -0
  45. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +0 -6
  46. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.module.css +4 -0
  47. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.tsx +24 -0
  48. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/constants/helloWorldConstants.ts +6 -0
  49. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/containers/HelloWorldContainer.ts +20 -0
  50. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/reducers/helloWorldReducer.ts +22 -0
  51. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.client.tsx +23 -0
  52. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.jsx +5 -0
  53. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/HelloWorldApp.server.tsx +5 -0
  54. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.ts +18 -0
  55. data/lib/react_on_rails/configuration.rb +15 -11
  56. data/lib/react_on_rails/controller.rb +5 -3
  57. data/lib/react_on_rails/dev/file_manager.rb +78 -0
  58. data/lib/react_on_rails/dev/pack_generator.rb +27 -0
  59. data/lib/react_on_rails/dev/process_manager.rb +61 -0
  60. data/lib/react_on_rails/dev/server_manager.rb +487 -0
  61. data/lib/react_on_rails/dev.rb +20 -0
  62. data/lib/react_on_rails/doctor.rb +1149 -0
  63. data/lib/react_on_rails/engine.rb +6 -0
  64. data/lib/react_on_rails/git_utils.rb +12 -2
  65. data/lib/react_on_rails/helper.rb +19 -44
  66. data/lib/react_on_rails/packer_utils.rb +4 -18
  67. data/lib/react_on_rails/packs_generator.rb +134 -8
  68. data/lib/react_on_rails/pro/NOTICE +21 -0
  69. data/lib/react_on_rails/pro/helper.rb +122 -0
  70. data/lib/react_on_rails/pro/utils.rb +53 -0
  71. data/lib/react_on_rails/react_component/render_options.rb +8 -4
  72. data/lib/react_on_rails/server_rendering_js_code.rb +0 -1
  73. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +1 -0
  74. data/lib/react_on_rails/system_checker.rb +659 -0
  75. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +1 -0
  76. data/lib/react_on_rails/utils.rb +16 -1
  77. data/lib/react_on_rails/version.rb +1 -1
  78. data/lib/react_on_rails/version_syntax_converter.rb +1 -1
  79. data/lib/react_on_rails.rb +1 -0
  80. data/lib/tasks/doctor.rake +51 -0
  81. data/lib/tasks/generate_packs.rake +144 -1
  82. data/package-lock.json +11984 -0
  83. data/react_on_rails.gemspec +1 -0
  84. metadata +55 -11
  85. data/REACT-ON-RAILS-PRO-LICENSE +0 -95
  86. data/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +0 -41
  87. data/lib/generators/react_on_rails/bin/dev +0 -30
  88. data/lib/generators/react_on_rails/bin/dev-static +0 -30
  89. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-static.tt +0 -9
  90. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +0 -5
  91. data/lib/generators/react_on_rails/templates/base/base/app/javascript/packs/registration.js.tt +0 -8
  92. /data/lib/generators/react_on_rails/templates/base/base/config/webpack/{webpackConfig.js.tt → generateWebpackConfigs.js.tt} +0 -0
  93. /data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/startup/{HelloWorldApp.jsx → HelloWorldApp.client.jsx} +0 -0
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReactOnRails
4
- VERSION = "15.0.0.rc.2"
4
+ VERSION = "16.0.1.rc.0"
5
5
  end
@@ -5,7 +5,7 @@ require_relative "version"
5
5
  module ReactOnRails
6
6
  class VersionSyntaxConverter
7
7
  def rubygem_to_npm(rubygem_version = ReactOnRails::VERSION)
8
- regex_match = rubygem_version.match(/(\d+\.\d+\.\d+)[.\-]?(.+)?/)
8
+ regex_match = rubygem_version.match(/(\d+\.\d+\.\d+)[.-]?(.+)?/)
9
9
  return "#{regex_match[1]}-#{regex_match[2]}" if regex_match[2]
10
10
 
11
11
  regex_match[1].to_s
@@ -26,3 +26,4 @@ require "react_on_rails/test_helper/ensure_assets_compiled"
26
26
  require "react_on_rails/locales/base"
27
27
  require "react_on_rails/locales/to_js"
28
28
  require "react_on_rails/locales/to_json"
29
+ require "react_on_rails/dev"
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../rakelib/task_helpers"
4
+ require_relative "../react_on_rails"
5
+ require_relative "../react_on_rails/doctor"
6
+
7
+ begin
8
+ require "rainbow"
9
+ rescue LoadError
10
+ # Fallback if Rainbow is not available
11
+ class Rainbow
12
+ def self.method_missing(_method, text)
13
+ SimpleColorWrapper.new(text)
14
+ end
15
+
16
+ def self.respond_to_missing?(_method, _include_private = false)
17
+ true
18
+ end
19
+ end
20
+
21
+ class SimpleColorWrapper
22
+ def initialize(text)
23
+ @text = text
24
+ end
25
+
26
+ def method_missing(_method, *_args)
27
+ self
28
+ end
29
+
30
+ def respond_to_missing?(_method, _include_private = false)
31
+ true
32
+ end
33
+
34
+ def to_s
35
+ @text
36
+ end
37
+ end
38
+ end
39
+
40
+ namespace :react_on_rails do
41
+ include ReactOnRails::TaskHelpers
42
+
43
+ desc "Diagnose React on Rails setup and configuration"
44
+ task :doctor do
45
+ verbose = ENV["VERBOSE"] == "true"
46
+ fix = ENV["FIX"] == "true"
47
+
48
+ doctor = ReactOnRails::Doctor.new(verbose: verbose, fix: fix)
49
+ doctor.run_diagnosis
50
+ end
51
+ end
@@ -1,11 +1,154 @@
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.
7
+
8
+ This task will:
9
+ - Clean out existing generated directories (javascript/generated and javascript/packs/generated)
10
+ - List all files being deleted for transparency
11
+ - Generate new pack files for discovered React components
12
+ - Skip generation if files are already up to date
13
+
14
+ Generated directories:
15
+ - app/javascript/packs/generated/ (client pack files)
16
+ - app/javascript/generated/ (server bundle files)
6
17
  DESC
7
18
 
8
19
  task generate_packs: :environment do
9
- ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
20
+ puts Rainbow("🚀 Starting React on Rails pack generation...").bold
21
+ puts Rainbow("📁 Auto-load bundle: #{ReactOnRails.configuration.auto_load_bundle}").cyan
22
+ puts Rainbow("📂 Components subdirectory: #{ReactOnRails.configuration.components_subdirectory}").cyan
23
+ puts ""
24
+
25
+ begin
26
+ start_time = Time.now
27
+ ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
28
+ end_time = Time.now
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
145
+ puts ""
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
10
151
  end
152
+ # rubocop:enable Metrics/AbcSize
11
153
  end
154
+ # rubocop:enable Metrics/BlockLength