Skip to content

Commit 0b6a7c5

Browse files
ihabadhamclaude
andcommitted
refactor: Extract dependency arrays as frozen constants and add module documentation
Address Justin's code review suggestions: - Extract REACT_DEPENDENCIES, CSS_DEPENDENCIES, and DEV_DEPENDENCIES as frozen module constants - Add comprehensive module documentation explaining required instance variables and methods - Update all dependency methods to use the new constants for better maintainability 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 6f745b4 commit 0b6a7c5

File tree

1 file changed

+51
-29
lines changed

1 file changed

+51
-29
lines changed

lib/generators/react_on_rails/js_dependency_manager.rb

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)