@@ -40,7 +40,9 @@ def run_generators
4040        if  installation_prerequisites_met?  || options . ignore_warnings? 
4141          invoke_generators 
4242          add_bin_scripts 
43-           add_post_install_message 
43+           # Only add the post install message if not using Redux 
44+           # Redux generator handles its own messages 
45+           add_post_install_message  unless  options . redux? 
4446        else 
4547          error  =  <<~MSG . strip 
4648            🚫 React on Rails generator prerequisites not met! 
@@ -77,6 +79,14 @@ def invoke_generators
7779        else 
7880          invoke  "react_on_rails:react_no_redux" ,  [ ] ,  {  typescript : options . typescript?  } 
7981        end 
82+         setup_react_dependencies 
83+       end 
84+ 
85+       def  setup_react_dependencies 
86+         @added_dependencies_to_package_json  ||= false 
87+         @ran_direct_installs  ||= false 
88+         add_js_dependencies 
89+         install_js_dependencies  if  @added_dependencies_to_package_json  && !@ran_direct_installs 
8090      end 
8191
8292      # NOTE: other requirements for existing files such as .gitignore or application. 
@@ -410,6 +420,134 @@ def create_typescript_config
410420        puts  Rainbow ( "✅ Created tsconfig.json" ) . green 
411421      end 
412422
423+       def  add_js_dependencies 
424+         add_react_on_rails_package 
425+         add_react_dependencies 
426+         add_css_dependencies 
427+         add_dev_dependencies 
428+       end 
429+ 
430+       def  add_react_on_rails_package 
431+         major_minor_patch_only  =  /\A \d +\. \d +\. \d +\z / 
432+ 
433+         # Try to use package_json gem first, fall back to direct npm commands 
434+         react_on_rails_pkg  =  if  ReactOnRails ::VERSION . match? ( major_minor_patch_only ) 
435+                                [ "react-on-rails@#{ ReactOnRails ::VERSION }  ] 
436+                              else 
437+                                puts  "Adding the latest react-on-rails NPM module. "  \
438+                                     "Double check this is correct in package.json" 
439+                                [ "react-on-rails" ] 
440+                              end 
441+ 
442+         puts  "Installing React on Rails package..." 
443+         if  add_npm_dependencies ( react_on_rails_pkg ) 
444+           @added_dependencies_to_package_json  =  true 
445+           return 
446+         end 
447+ 
448+         puts  "Using direct npm commands as fallback" 
449+         success  =  system ( "npm" ,  "install" ,  *react_on_rails_pkg ) 
450+         @ran_direct_installs  =  true  if  success 
451+         handle_npm_failure ( "react-on-rails package" ,  react_on_rails_pkg )  unless  success 
452+       end 
453+ 
454+       def  add_react_dependencies 
455+         puts  "Installing React dependencies..." 
456+         react_deps  =  %w[ 
457+           react 
458+           react-dom 
459+           @babel/preset-react 
460+           prop-types 
461+           babel-plugin-transform-react-remove-prop-types 
462+           babel-plugin-macros 
463+         ] 
464+         if  add_npm_dependencies ( react_deps ) 
465+           @added_dependencies_to_package_json  =  true 
466+           return 
467+         end 
468+ 
469+         success  =  system ( "npm" ,  "install" ,  *react_deps ) 
470+         @ran_direct_installs  =  true  if  success 
471+         handle_npm_failure ( "React dependencies" ,  react_deps )  unless  success 
472+       end 
473+ 
474+       def  add_css_dependencies 
475+         puts  "Installing CSS handling dependencies..." 
476+         css_deps  =  %w[ 
477+           css-loader 
478+           css-minimizer-webpack-plugin 
479+           mini-css-extract-plugin 
480+           style-loader 
481+         ] 
482+         if  add_npm_dependencies ( css_deps ) 
483+           @added_dependencies_to_package_json  =  true 
484+           return 
485+         end 
486+ 
487+         success  =  system ( "npm" ,  "install" ,  *css_deps ) 
488+         @ran_direct_installs  =  true  if  success 
489+         handle_npm_failure ( "CSS dependencies" ,  css_deps )  unless  success 
490+       end 
491+ 
492+       def  add_dev_dependencies 
493+         puts  "Installing development dependencies..." 
494+         dev_deps  =  %w[ 
495+           @pmmmwh/react-refresh-webpack-plugin 
496+           react-refresh 
497+         ] 
498+         if  add_npm_dependencies ( dev_deps ,  dev : true ) 
499+           @added_dependencies_to_package_json  =  true 
500+           return 
501+         end 
502+ 
503+         success  =  system ( "npm" ,  "install" ,  "--save-dev" ,  *dev_deps ) 
504+         @ran_direct_installs  =  true  if  success 
505+         handle_npm_failure ( "development dependencies" ,  dev_deps ,  dev : true )  unless  success 
506+       end 
507+ 
508+       def  install_js_dependencies 
509+         # Detect which package manager to use 
510+         success  =  if  File . exist? ( File . join ( destination_root ,  "yarn.lock" ) ) 
511+                     system ( "yarn" ,  "install" ) 
512+                   elsif  File . exist? ( File . join ( destination_root ,  "pnpm-lock.yaml" ) ) 
513+                     system ( "pnpm" ,  "install" ) 
514+                   elsif  File . exist? ( File . join ( destination_root ,  "package-lock.json" ) )  ||
515+                         File . exist? ( File . join ( destination_root ,  "package.json" ) ) 
516+                     # Use npm for package-lock.json or as default fallback 
517+                     system ( "npm" ,  "install" ) 
518+                   else 
519+                     true  # No package manager detected, skip 
520+                   end 
521+ 
522+         unless  success 
523+           GeneratorMessages . add_warning ( <<~MSG . strip ) 
524+             ⚠️  JavaScript dependencies installation failed. 
525+ 
526+             This could be due to network issues or missing package manager. 
527+             You can install dependencies manually later by running: 
528+             • npm install (if using npm) 
529+             • yarn install (if using yarn) 
530+             • pnpm install (if using pnpm) 
531+           MSG 
532+         end 
533+ 
534+         success 
535+       end 
536+ 
537+       def  handle_npm_failure ( dependency_type ,  packages ,  dev : false ) 
538+         install_command  =  dev  ? "npm install --save-dev"  : "npm install" 
539+         GeneratorMessages . add_warning ( <<~MSG . strip ) 
540+           ⚠️  Failed to install #{ dependency_type }  
541+ 
542+           The following packages could not be installed automatically: 
543+           #{ packages . map  {  |pkg | "  • #{ pkg }   } . join ( "\n " ) }  
544+ 
545+           This could be due to network issues or missing package manager. 
546+           You can install them manually later by running: 
547+             #{ install_command } #{ packages . join ( ' ' ) }  
548+         MSG 
549+       end 
550+ 
413551      # Removed: Shakapacker auto-installation logic (now explicit dependency) 
414552
415553      # Removed: Shakapacker 8+ is now required as explicit dependency 
0 commit comments