Skip to content

Commit 368e07f

Browse files
committed
Support shakapacker
1 parent 0f2dee9 commit 368e07f

File tree

6 files changed

+74
-18
lines changed

6 files changed

+74
-18
lines changed

Diff for: CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning].
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- Support Shakapacker in the installation script. ([@skryukov])
13+
14+
### Fixed
15+
16+
- Fix installation script interactive mode. ([@skryukov])
17+
- Fix installation script dependencies installation. ([@skryukov])
18+
1019
## [0.4.0] - 2024-11-03
1120

1221
### Added

Diff for: lib/generators/turbo_mount/helpers.rb

+6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def js_destination_root
2020
def js_entrypoint
2121
if vite?
2222
js_file_path "entrypoints/application.js"
23+
elsif shakapacker?
24+
js_file_path "packs/application.js"
2325
else
2426
js_file_path "application.js"
2527
end
@@ -41,6 +43,10 @@ def vite?
4143
file?("config/vite.json") && Dir.glob(file_path("vite.config.*")).any?
4244
end
4345

46+
def shakapacker?
47+
file?("config/shakapacker.yml") || file?("config/webpacker.yml")
48+
end
49+
4450
# Interactivity Helpers
4551
def ask(*)
4652
unless options[:interactive]

Diff for: lib/generators/turbo_mount/install_generator.rb

+21-13
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ class InstallGenerator < Rails::Generators::Base
2525
enum: JSPackageManager.package_managers,
2626
desc: "The package manager you want to use to install Turbo Mount"
2727

28+
class_option :interactive, type: :boolean, default: true,
29+
desc: "Whether to prompt for optional installations"
30+
2831
class_option :verbose, type: :boolean, default: false,
2932
desc: "Run the generator in verbose mode"
3033

@@ -33,6 +36,7 @@ def install
3336

3437
package_manager.validate!
3538

39+
create_initializer
3640
if package_manager.importmap?
3741
install_importmap
3842
else
@@ -44,43 +48,47 @@ def install
4448

4549
private
4650

47-
def install_nodejs
48-
package_manager.add_dependencies("turbo-mount", FRAMEWORKS[framework][:npm_packages])
49-
51+
def create_initializer
5052
say "Creating Turbo Mount initializer"
51-
template "turbo-mount.js", js_file_path("turbo-mount.js")
53+
54+
needs_alias = shakapacker? || package_manager.importmap?
55+
initializer_path = needs_alias ? "turbo-mount-initializer.js" : "turbo-mount.js"
56+
initializer_import = needs_alias ? %(import "turbo-mount-initializer"\n) : %(import "./turbo-mount"\n)
57+
58+
template "turbo-mount.js", js_file_path(initializer_path)
5259
begin
53-
append_to_file js_entrypoint, %(import "./turbo-mount"\n)
60+
append_to_file js_entrypoint, initializer_import
5461
rescue
55-
say 'Could not find the application entrypoint, please add `import "./turbo-mount"` manually.', :yellow
62+
say "Could not find the application entrypoint, please add `#{initializer_import.strip}` manually.", :yellow
5663
end
64+
end
65+
66+
def install_nodejs
67+
package_manager.add_dependencies("turbo-mount", FRAMEWORKS[framework]["npm_packages"])
68+
5769
warn_about_vite_plugin if vite?
5870
end
5971

6072
def install_importmap
61-
say "Creating Turbo Mount initializer"
62-
template "turbo-mount.js", js_file_path("turbo-mount-initializer.js")
63-
append_to_file "app/javascript/application.js", %(import "turbo-mount-initializer"\n)
64-
6573
say "Pinning Turbo Mount to the importmap"
6674
append_to_file "config/importmap.rb", %(pin "turbo-mount", to: "turbo-mount.min.js"\n)
6775
append_to_file "config/importmap.rb", %(pin "turbo-mount/#{framework}", to: "turbo-mount/#{framework}.min.js"\n)
6876
append_to_file "config/importmap.rb", %(pin "turbo-mount-initializer"\n)
6977

7078
say "Pinning framework dependencies to the importmap"
71-
package_manager.add_dependencies(FRAMEWORKS[framework][:pins])
79+
package_manager.add_dependencies(FRAMEWORKS[framework]["pins"])
7280
end
7381

7482
def warn_about_vite_plugin
75-
say "Make sure to install and add #{FRAMEWORKS[framework][:vite_plugin]} to your Vite config", :yellow
83+
say "Make sure to install and add #{FRAMEWORKS[framework]["vite_plugin"]} to your Vite config", :yellow
7684
end
7785

7886
def package_manager
7987
@package_manager ||= JSPackageManager.new(self)
8088
end
8189

8290
def extension
83-
FRAMEWORKS[framework][:extension]
91+
FRAMEWORKS[framework]["extension"]
8492
end
8593

8694
def framework

Diff for: spec/fixtures/with_shakapacker/app/javascript/packs/application.js

Whitespace-only changes.

Diff for: spec/fixtures/with_shakapacker/config/shakapacker.yml

Whitespace-only changes.

Diff for: spec/lib/generators/install/install_generator_spec.rb

+38-5
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010

1111
subject(:generator) { run_generator(args) }
1212

13-
before do
14-
prepare_destination
15-
FileUtils.cp_r(Dir["spec/fixtures/with_vite/*"], destination_root) if package_manager != :importmap
16-
FileUtils.cp_r(Dir["spec/fixtures/with_importmap/*"], destination_root) if package_manager == :importmap
17-
end
13+
before { prepare_destination }
1814

1915
context "with --package-manager=importmap" do
16+
before { FileUtils.cp_r(Dir["spec/fixtures/with_importmap/*"], destination_root) }
17+
2018
context "with --framework=svelte" do
2119
let(:framework) { :svelte }
2220

@@ -106,7 +104,37 @@
106104
end
107105
end
108106

107+
context "with shakapacker" do
108+
before { FileUtils.cp_r(Dir["spec/fixtures/with_shakapacker/*"], destination_root) }
109+
110+
let(:package_manager) { :npm }
111+
112+
context "with --framework=react" do
113+
let(:framework) { :react }
114+
115+
it "builds the correct structure" do
116+
expect { generator }.not_to raise_error
117+
118+
expect(destination_root).to(have_structure do
119+
file("app/javascript/packs/application.js") do
120+
contains('import "turbo-mount-initializer"')
121+
end
122+
file("app/javascript/turbo-mount-initializer.js") do
123+
contains('import { registerComponent } from "turbo-mount/react"')
124+
end
125+
file("package.json") do
126+
contains('"turbo-mount":')
127+
contains('"react":')
128+
contains('"react-dom":')
129+
end
130+
end)
131+
end
132+
end
133+
end
134+
109135
context "with --package-manager=npm" do
136+
before { FileUtils.cp_r(Dir["spec/fixtures/with_vite/*"], destination_root) }
137+
110138
let(:package_manager) { :npm }
111139

112140
context "with --framework=svelte" do
@@ -124,6 +152,7 @@
124152
end
125153
file("package.json") do
126154
contains('"turbo-mount":')
155+
contains('"svelte":')
127156
end
128157
end)
129158
end
@@ -144,6 +173,7 @@
144173
end
145174
file("package.json") do
146175
contains('"turbo-mount":')
176+
contains('"svelte":')
147177
end
148178
end)
149179
end
@@ -164,6 +194,8 @@
164194
end
165195
file("package.json") do
166196
contains('"turbo-mount":')
197+
contains('"react":')
198+
contains('"react-dom":')
167199
end
168200
end)
169201
end
@@ -184,6 +216,7 @@
184216
end
185217
file("package.json") do
186218
contains('"turbo-mount":')
219+
contains('"vue":')
187220
end
188221
end)
189222
end

0 commit comments

Comments
 (0)