From 49a2153255d874cf0875643ab0c494a04e6036ee Mon Sep 17 00:00:00 2001 From: Svyatoslav Kryukov Date: Tue, 26 Nov 2024 12:15:53 +0300 Subject: [PATCH] Support shakapacker --- CHANGELOG.md | 9 ++++ lib/generators/turbo_mount/helpers.rb | 6 +++ .../turbo_mount/install_generator.rb | 34 +++++++++------ .../app/javascript/packs/application.js | 0 .../with_shakapacker/config/shakapacker.yml | 0 .../install/install_generator_spec.rb | 43 ++++++++++++++++--- 6 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 spec/fixtures/with_shakapacker/app/javascript/packs/application.js create mode 100644 spec/fixtures/with_shakapacker/config/shakapacker.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 4539baf..9cb79b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning]. ## [Unreleased] +### Added + +- Support Shakapacker in the installation script. ([@skryukov]) + +### Fixed + +- Fix installation script interactive mode. ([@skryukov]) +- Fix installation script dependencies installation. ([@skryukov]) + ## [0.4.0] - 2024-11-03 ### Added diff --git a/lib/generators/turbo_mount/helpers.rb b/lib/generators/turbo_mount/helpers.rb index 5e0b6fd..b0279a4 100644 --- a/lib/generators/turbo_mount/helpers.rb +++ b/lib/generators/turbo_mount/helpers.rb @@ -20,6 +20,8 @@ def js_destination_root def js_entrypoint if vite? js_file_path "entrypoints/application.js" + elsif shakapacker? + js_file_path "packs/application.js" else js_file_path "application.js" end @@ -41,6 +43,10 @@ def vite? file?("config/vite.json") && Dir.glob(file_path("vite.config.*")).any? end + def shakapacker? + file?("config/shakapacker.yml") || file?("config/webpacker.yml") + end + # Interactivity Helpers def ask(*) unless options[:interactive] diff --git a/lib/generators/turbo_mount/install_generator.rb b/lib/generators/turbo_mount/install_generator.rb index 520639e..1b295b4 100644 --- a/lib/generators/turbo_mount/install_generator.rb +++ b/lib/generators/turbo_mount/install_generator.rb @@ -25,6 +25,9 @@ class InstallGenerator < Rails::Generators::Base enum: JSPackageManager.package_managers, desc: "The package manager you want to use to install Turbo Mount" + class_option :interactive, type: :boolean, default: true, + desc: "Whether to prompt for optional installations" + class_option :verbose, type: :boolean, default: false, desc: "Run the generator in verbose mode" @@ -33,6 +36,7 @@ def install package_manager.validate! + create_initializer if package_manager.importmap? install_importmap else @@ -44,35 +48,39 @@ def install private - def install_nodejs - package_manager.add_dependencies("turbo-mount", FRAMEWORKS[framework][:npm_packages]) - + def create_initializer say "Creating Turbo Mount initializer" - template "turbo-mount.js", js_file_path("turbo-mount.js") + + needs_alias = shakapacker? || package_manager.importmap? + initializer_path = needs_alias ? "turbo-mount-initializer.js" : "turbo-mount.js" + initializer_import = needs_alias ? %(import "turbo-mount-initializer"\n) : %(import "./turbo-mount"\n) + + template "turbo-mount.js", js_file_path(initializer_path) begin - append_to_file js_entrypoint, %(import "./turbo-mount"\n) + append_to_file js_entrypoint, initializer_import rescue - say 'Could not find the application entrypoint, please add `import "./turbo-mount"` manually.', :yellow + say "Could not find the application entrypoint, please add `#{initializer_import.strip}` manually.", :yellow end + end + + def install_nodejs + package_manager.add_dependencies("turbo-mount", FRAMEWORKS[framework]["npm_packages"]) + warn_about_vite_plugin if vite? end def install_importmap - say "Creating Turbo Mount initializer" - template "turbo-mount.js", js_file_path("turbo-mount-initializer.js") - append_to_file "app/javascript/application.js", %(import "turbo-mount-initializer"\n) - say "Pinning Turbo Mount to the importmap" append_to_file "config/importmap.rb", %(pin "turbo-mount", to: "turbo-mount.min.js"\n) append_to_file "config/importmap.rb", %(pin "turbo-mount/#{framework}", to: "turbo-mount/#{framework}.min.js"\n) append_to_file "config/importmap.rb", %(pin "turbo-mount-initializer"\n) say "Pinning framework dependencies to the importmap" - package_manager.add_dependencies(FRAMEWORKS[framework][:pins]) + package_manager.add_dependencies(FRAMEWORKS[framework]["pins"]) end def warn_about_vite_plugin - say "Make sure to install and add #{FRAMEWORKS[framework][:vite_plugin]} to your Vite config", :yellow + say "Make sure to install and add #{FRAMEWORKS[framework]["vite_plugin"]} to your Vite config", :yellow end def package_manager @@ -80,7 +88,7 @@ def package_manager end def extension - FRAMEWORKS[framework][:extension] + FRAMEWORKS[framework]["extension"] end def framework diff --git a/spec/fixtures/with_shakapacker/app/javascript/packs/application.js b/spec/fixtures/with_shakapacker/app/javascript/packs/application.js new file mode 100644 index 0000000..e69de29 diff --git a/spec/fixtures/with_shakapacker/config/shakapacker.yml b/spec/fixtures/with_shakapacker/config/shakapacker.yml new file mode 100644 index 0000000..e69de29 diff --git a/spec/lib/generators/install/install_generator_spec.rb b/spec/lib/generators/install/install_generator_spec.rb index 96dc4cc..045b518 100644 --- a/spec/lib/generators/install/install_generator_spec.rb +++ b/spec/lib/generators/install/install_generator_spec.rb @@ -10,13 +10,11 @@ subject(:generator) { run_generator(args) } - before do - prepare_destination - FileUtils.cp_r(Dir["spec/fixtures/with_vite/*"], destination_root) if package_manager != :importmap - FileUtils.cp_r(Dir["spec/fixtures/with_importmap/*"], destination_root) if package_manager == :importmap - end + before { prepare_destination } context "with --package-manager=importmap" do + before { FileUtils.cp_r(Dir["spec/fixtures/with_importmap/*"], destination_root) } + context "with --framework=svelte" do let(:framework) { :svelte } @@ -106,7 +104,37 @@ end end + context "with shakapacker" do + before { FileUtils.cp_r(Dir["spec/fixtures/with_shakapacker/*"], destination_root) } + + let(:package_manager) { :npm } + + context "with --framework=react" do + let(:framework) { :react } + + it "builds the correct structure" do + expect { generator }.not_to raise_error + + expect(destination_root).to(have_structure do + file("app/javascript/packs/application.js") do + contains('import "turbo-mount-initializer"') + end + file("app/javascript/turbo-mount-initializer.js") do + contains('import { registerComponent } from "turbo-mount/react"') + end + file("package.json") do + contains('"turbo-mount":') + contains('"react":') + contains('"react-dom":') + end + end) + end + end + end + context "with --package-manager=npm" do + before { FileUtils.cp_r(Dir["spec/fixtures/with_vite/*"], destination_root) } + let(:package_manager) { :npm } context "with --framework=svelte" do @@ -124,6 +152,7 @@ end file("package.json") do contains('"turbo-mount":') + contains('"svelte":') end end) end @@ -144,6 +173,7 @@ end file("package.json") do contains('"turbo-mount":') + contains('"svelte":') end end) end @@ -164,6 +194,8 @@ end file("package.json") do contains('"turbo-mount":') + contains('"react":') + contains('"react-dom":') end end) end @@ -184,6 +216,7 @@ end file("package.json") do contains('"turbo-mount":') + contains('"vue":') end end) end