@@ -7,69 +7,89 @@ class ComponentGenerator < Rails::Generators::Base
77 namespace "ruby_ui:component"
88
99 source_root File . expand_path ( "../../ruby_ui" , __dir__ )
10- argument :component_name , type : :string , required : true
10+ argument :component_names , type : :array , required : true , banner : "Button Link Input"
1111 class_option :force , type : :boolean , default : false
1212 class_option :with_docs , type : :boolean , default : false
1313
14- def generate_component
15- if component_not_found?
16- say "Component not found: #{ component_name } " , :red
17- exit
14+ def generate_components
15+ validate_components!
16+
17+ component_names . each do |component_name |
18+ say "Generating #{ component_name } files..."
19+ copy_related_component_files ( component_name )
20+ copy_js_files ( component_name )
21+ install_dependencies ( component_name )
1822 end
1923
20- say "Generating #{ component_name } files..."
24+ update_stimulus_manifest
2125 end
2226
23- def copy_related_component_files
27+ private
28+
29+ def validate_components!
30+ missing = component_names . reject { |name | component_exists? ( name ) }
31+ return if missing . empty?
32+
33+ say "Component(s) not found: #{ missing . join ( ", " ) } " , :red
34+ exit
35+ end
36+
37+ def copy_related_component_files ( component_name )
2438 say "Generating components"
2539
26- components_file_paths . each do |file_path |
40+ components_file_paths ( component_name ) . each do |file_path |
2741 component_file_name = file_path . split ( "/" ) . last
28- copy_file file_path , Rails . root . join ( "app/components/ruby_ui" , component_folder_name , component_file_name ) , force : options [ "force" ]
42+ copy_file file_path , Rails . root . join ( "app/components/ruby_ui" , component_folder_name ( component_name ) , component_file_name ) , force : options [ "force" ]
2943 end
3044 end
3145
32- def copy_js_files
33- return if js_controller_file_paths . empty?
46+ def copy_js_files ( component_name )
47+ paths = js_controller_file_paths ( component_name )
48+ return if paths . empty?
3449
3550 say "Generating Stimulus controllers"
3651
37- js_controller_file_paths . each do |file_path |
52+ paths . each do |file_path |
3853 controller_file_name = file_path . split ( "/" ) . last
3954 copy_file file_path , Rails . root . join ( "app/javascript/controllers/ruby_ui" , controller_file_name ) , force : options [ "force" ]
4055 end
4156
57+ @stimulus_controllers_added = true
58+ end
59+
60+ def update_stimulus_manifest
61+ return unless @stimulus_controllers_added
62+
4263 # Importmap doesn't have controller manifest, instead it uses `eagerLoadControllersFrom("controllers", application)`
43- if ! using_importmap?
44- say "Updating Stimulus controllers manifest"
45- run "rake stimulus: manifest:update "
46- end
64+ return if using_importmap?
65+
66+ say "Updating Stimulus controllers manifest"
67+ run "rake stimulus:manifest:update"
4768 end
4869
49- def install_dependencies
50- return if dependencies . blank?
70+ def install_dependencies ( component_name )
71+ deps = dependencies ( component_name )
72+ return if deps . blank?
5173
5274 say "Installing dependencies"
5375
54- install_components_dependencies ( dependencies [ "components" ] )
55- install_gems_dependencies ( dependencies [ "gems" ] )
56- install_js_packages ( dependencies [ "js_packages" ] )
76+ install_components_dependencies ( deps [ "components" ] )
77+ install_gems_dependencies ( deps [ "gems" ] )
78+ install_js_packages ( deps [ "js_packages" ] )
5779 end
5880
59- private
60-
61- def component_not_found? = !Dir . exist? ( component_folder_path )
81+ def component_exists? ( component_name ) = Dir . exist? ( component_folder_path ( component_name ) )
6282
63- def component_folder_name = component_name . underscore
83+ def component_folder_name ( component_name ) = component_name . underscore
6484
65- def component_folder_path = File . join ( self . class . source_root , component_folder_name )
85+ def component_folder_path ( component_name ) = File . join ( self . class . source_root , component_folder_name ( component_name ) )
6686
67- def components_file_paths
68- files = Dir . glob ( File . join ( component_folder_path , "*.rb" ) )
87+ def components_file_paths ( component_name )
88+ files = Dir . glob ( File . join ( component_folder_path ( component_name ) , "*.rb" ) )
6989 options [ "with_docs" ] ? files : files . reject { |f | f . end_with? ( "_docs.rb" ) }
7090 end
7191
72- def js_controller_file_paths = Dir . glob ( File . join ( component_folder_path , "*.js" ) )
92+ def js_controller_file_paths ( component_name ) = Dir . glob ( File . join ( component_folder_path ( component_name ) , "*.js" ) )
7393
7494 def install_components_dependencies ( components )
7595 components &.each do |component |
@@ -89,10 +109,10 @@ def install_js_packages(js_packages)
89109 end
90110 end
91111
92- def dependencies
112+ def dependencies ( component_name )
93113 @dependencies ||= YAML . load_file ( File . join ( __dir__ , "dependencies.yml" ) ) . freeze
94114
95- @dependencies [ component_folder_name ]
115+ @dependencies [ component_folder_name ( component_name ) ]
96116 end
97117 end
98118 end
0 commit comments