@@ -7,7 +7,47 @@ module Generators
77 # Shared module for managing JavaScript dependencies across generators
88 # This module provides common functionality for adding and installing
99 # JS dependencies to avoid code duplication between generators.
10+ #
11+ # == Required Instance Variables
12+ # Including classes must support these instance variables:
13+ # - @added_dependencies_to_package_json: Boolean tracking if package_json gem was used
14+ # - @ran_direct_installs: Boolean tracking if direct npm/yarn commands were run
15+ #
16+ # == Required Methods
17+ # Including classes must include GeneratorHelper module which provides:
18+ # - add_npm_dependencies(packages, dev: false): Add packages via package_json gem
19+ # - package_json: Access to PackageJson instance
20+ # - destination_root: Generator destination directory
21+ # - system(*args): Execute system commands
22+ #
23+ # == Usage
24+ # Include this module in generator classes and call setup_js_dependencies
25+ # to handle all JS dependency installation with automatic fallbacks.
1026 module JsDependencyManager
27+ # Core React dependencies required for React on Rails
28+ REACT_DEPENDENCIES = %w[
29+ react
30+ react-dom
31+ @babel/preset-react
32+ prop-types
33+ babel-plugin-transform-react-remove-prop-types
34+ babel-plugin-macros
35+ ] . freeze
36+
37+ # CSS processing dependencies for webpack
38+ CSS_DEPENDENCIES = %w[
39+ css-loader
40+ css-minimizer-webpack-plugin
41+ mini-css-extract-plugin
42+ style-loader
43+ ] . freeze
44+
45+ # Development-only dependencies for hot reloading
46+ DEV_DEPENDENCIES = %w[
47+ @pmmmwh/react-refresh-webpack-plugin
48+ react-refresh
49+ ] . freeze
50+
1151 private
1252
1353 def setup_js_dependencies
@@ -50,58 +90,40 @@ def add_react_on_rails_package
5090
5191 def add_react_dependencies
5292 puts "Installing React dependencies..."
53- react_deps = %w[
54- react
55- react-dom
56- @babel/preset-react
57- prop-types
58- babel-plugin-transform-react-remove-prop-types
59- babel-plugin-macros
60- ]
61-
62- if add_js_dependencies_batch ( react_deps )
93+
94+ if add_js_dependencies_batch ( REACT_DEPENDENCIES )
6395 @added_dependencies_to_package_json = true
6496 else
6597 # Fallback to direct npm install
66- success = system ( "npm" , "install" , *react_deps )
98+ success = system ( "npm" , "install" , *REACT_DEPENDENCIES )
6799 @ran_direct_installs = true if success
68- handle_npm_failure ( "React dependencies" , react_deps ) unless success
100+ handle_npm_failure ( "React dependencies" , REACT_DEPENDENCIES ) unless success
69101 end
70102 end
71103
72104 def add_css_dependencies
73105 puts "Installing CSS handling dependencies..."
74- css_deps = %w[
75- css-loader
76- css-minimizer-webpack-plugin
77- mini-css-extract-plugin
78- style-loader
79- ]
80-
81- if add_js_dependencies_batch ( css_deps )
106+
107+ if add_js_dependencies_batch ( CSS_DEPENDENCIES )
82108 @added_dependencies_to_package_json = true
83109 else
84110 # Fallback to direct npm install
85- success = system ( "npm" , "install" , *css_deps )
111+ success = system ( "npm" , "install" , *CSS_DEPENDENCIES )
86112 @ran_direct_installs = true if success
87- handle_npm_failure ( "CSS dependencies" , css_deps ) unless success
113+ handle_npm_failure ( "CSS dependencies" , CSS_DEPENDENCIES ) unless success
88114 end
89115 end
90116
91117 def add_dev_dependencies
92118 puts "Installing development dependencies..."
93- dev_deps = %w[
94- @pmmmwh/react-refresh-webpack-plugin
95- react-refresh
96- ]
97119
98- if add_js_dependencies_batch ( dev_deps , dev : true )
120+ if add_js_dependencies_batch ( DEV_DEPENDENCIES , dev : true )
99121 @added_dependencies_to_package_json = true
100122 else
101123 # Fallback to direct npm install
102- success = system ( "npm" , "install" , "--save-dev" , *dev_deps )
124+ success = system ( "npm" , "install" , "--save-dev" , *DEV_DEPENDENCIES )
103125 @ran_direct_installs = true if success
104- handle_npm_failure ( "development dependencies" , dev_deps , dev : true ) unless success
126+ handle_npm_failure ( "development dependencies" , DEV_DEPENDENCIES , dev : true ) unless success
105127 end
106128 end
107129
0 commit comments