Skip to content

Commit bfd013b

Browse files
committed
Install component dependencies (gems, stimulus, packages, components)
1 parent 51b01ac commit bfd013b

File tree

2 files changed

+146
-10
lines changed

2 files changed

+146
-10
lines changed

lib/generators/ruby_ui/component_generator.rb

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,23 @@ def copy_js_files
3939
say "Generating Stimulus controllers"
4040

4141
js_controller_file_paths.each do |file_path|
42-
component_file_name = file_path.split("/").last
43-
copy_file file_path, Rails.root.join("app/javascript/controllers/ruby_ui", component_file_name)
42+
controller_file_name = file_path.split("/").last
43+
copy_file file_path, Rails.root.join("app/javascript/controllers/ruby_ui", controller_file_name)
4444
end
4545

4646
say "Updating Stimulus controllers manifest"
4747
run "rake stimulus:manifest:update"
4848
end
4949

50-
def copy_dependencies
51-
case component_folder_name
52-
when "masked_input"
53-
copy_masked_input_dependencies
54-
end
50+
def install_dependencies
51+
return if dependencies.blank?
52+
53+
say "Installing dependencies"
54+
55+
install_components_dependencies(dependencies["components"])
56+
install_stimulus_dependencies(dependencies["stimulus_controllers"])
57+
install_gems_dependencies(dependencies["gems"])
58+
install_js_packages(dependencies["js_packages"])
5559
end
5660

5761
private
@@ -68,10 +72,50 @@ def subcomponent_file_paths = Dir.glob(File.join(component_folder_path, "*.rb"))
6872

6973
def js_controller_file_paths = Dir.glob(File.join(component_folder_path, "*.js"))
7074

71-
def copy_masked_input_dependencies
72-
say "Generating masked input dependencies"
75+
def install_components_dependencies(components)
76+
components&.each do |component|
77+
run "bin/rails generate ruby_ui:component #{component}"
78+
end
79+
end
80+
81+
def install_stimulus_dependencies(stimulus_controllers)
82+
return if stimulus_controllers.nil?
83+
84+
stimulus_controllers.each do |controller|
85+
controller_path = File.join(self.class.source_root, controller)
86+
controller_file_name = controller.split("/").last
87+
copy_file controller_path, Rails.root.join("app/javascript/controllers/ruby_ui", controller_file_name)
88+
end
89+
90+
run "rake stimulus:manifest:update"
91+
end
92+
93+
def install_gems_dependencies(gems)
94+
gems&.each do |ruby_gem|
95+
run "bundle show #{ruby_gem} > /dev/null 2>&1 || bundle add #{ruby_gem}"
96+
end
97+
end
98+
99+
def install_js_packages(js_packages)
100+
js_packages&.each do |js_package|
101+
install_js_package(js_package)
102+
end
103+
end
104+
105+
def install_js_package(package)
106+
if File.exist?(Rails.root.join("package-lock.json"))
107+
run "npm install #{package}"
108+
elsif File.exist?(Rails.root.join("yarn.lock"))
109+
run "yarn add #{package}"
110+
else
111+
say "Could not detect the package manager, you need to install '#{package}' manually", :red
112+
end
113+
end
114+
115+
def dependencies
116+
@dependencies ||= YAML.load_file(File.join(__dir__, "dependencies.yml")).freeze
73117

74-
run "bin/rails generate ruby_ui:component Input"
118+
@dependencies[component_folder_name]
75119
end
76120
end
77121
end
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
accordion:
2+
js_packages:
3+
- "motion"
4+
5+
alert_dialog:
6+
components:
7+
- "Button"
8+
9+
calendar:
10+
js_packages:
11+
- "mustache"
12+
13+
chart:
14+
js_packages:
15+
- "chart.js"
16+
17+
checkbox:
18+
stimulus_controllers:
19+
- "form/form_field_controller.js"
20+
21+
clipboard:
22+
js_packages:
23+
- "@floating-ui/dom"
24+
25+
codeblock:
26+
components:
27+
- "Button"
28+
- "Clipboard"
29+
30+
gems:
31+
- "rouge"
32+
33+
combobox:
34+
js_packages:
35+
- "@floating-ui/dom"
36+
37+
stimulus_controllers:
38+
- "form/form_field_controller.js"
39+
40+
command:
41+
js_packages:
42+
- "fuse.js"
43+
44+
context_menu:
45+
js_packages:
46+
- "tippy.js"
47+
48+
dropdown_menu:
49+
js_packages:
50+
- "@floating-ui/dom"
51+
52+
hover_card:
53+
js_packages:
54+
- "tippy.js"
55+
56+
input:
57+
stimulus_controllers:
58+
- "form/form_field_controller.js"
59+
60+
masked_input:
61+
components:
62+
- "Input"
63+
64+
js_packages:
65+
- "maska"
66+
67+
pagination:
68+
components:
69+
- "Button"
70+
71+
popover:
72+
js_packages:
73+
- "@floating-ui/dom"
74+
75+
radio_button:
76+
stimulus_controllers:
77+
- "form/form_field_controller.js"
78+
79+
select:
80+
js_packages:
81+
- "@floating-ui/dom"
82+
83+
stimulus_controllers:
84+
- "form/form_field_controller.js"
85+
86+
textarea:
87+
stimulus_controllers:
88+
- "form/form_field_controller.js"
89+
90+
tooltip:
91+
js_packages:
92+
- "@floating-ui/dom"

0 commit comments

Comments
 (0)