diff --git a/lib/generators/htmx/install_generator.rb b/lib/generators/htmx/install_generator.rb index 3cafd74..22e48d8 100644 --- a/lib/generators/htmx/install_generator.rb +++ b/lib/generators/htmx/install_generator.rb @@ -6,12 +6,15 @@ class InstallGenerator < ::Rails::Generators::Base WEBPACKER_SETUP = "require('htmx.org')\n" SPROCKETS_SETUP = "//= require htmx\n" IMPORTMAP_SETUP = "import \"htmx.org\"\n" + BUN_SETUP = IMPORTMAP_SETUP desc 'Prep application.js to include HTMX installation for Webpacker, Sprockets or Importmap' # Setup HTMX def setup - if importmap? + if bun? + setup_bun + elsif importmap? setup_importmap elsif webpacker? setup_webpacker @@ -24,6 +27,10 @@ def setup private + def bun? + Pathname.new(destination_root).join('bun.config.js').exist? + end + def webpacker? !!defined?(Webpacker) end @@ -40,38 +47,34 @@ def manifest(javascript_dir) Pathname.new(destination_root).join(javascript_dir, 'application.js') end - def setup_importmap - run 'bin/importmap pin htmx.org' - - manifest = manifest('app/javascript') - + def add_to_manifest(manifest, text) if manifest.exist? - append_file manifest, "\n#{IMPORTMAP_SETUP}" + append_file manifest, "\n#{text}" else - create_file manifest, IMPORTMAP_SETUP + create_file manifest, text end end - def setup_sprockets - manifest = manifest('app/assets/javascripts') + def setup_bun + run "bun add htmx.org@#{Htmx::Rails::HTMX_VERSION}" - if manifest.exist? - append_file manifest, "\n#{SPROCKETS_SETUP}" - else - create_file manifest, SPROCKETS_SETUP - end + add_to_manifest(manifest('app/javascript'), BUN_SETUP) end - def setup_webpacker - run 'yarn add htmx.org' + def setup_importmap + run "bin/importmap pin htmx.org#{Htmx::Rails::HTMX_VERSION}" - manifest = manifest(webpack_source_path) + add_to_manifest(manifest('app/javascript'), IMPORTMAP_SETUP) + end - if manifest.exist? - append_file(manifest, "\n#{WEBPACKER_SETUP}") - else - create_file(manifest, WEBPACKER_SETUP) - end + def setup_sprockets + add_to_manifest(manifest('app/assets/javascripts'), SPROCKETS_SETUP) + end + + def setup_webpacker + run "yarn add htmx.org#{Htmx::Rails::HTMX_VERSION}" + + add_to_manifest(manifest(webpack_source_path), WEBPACKER_SETUP) end def webpack_source_path diff --git a/spec/generators/install_generator_spec.rb b/spec/generators/install_generator_spec.rb index 716d9d8..eaa078a 100644 --- a/spec/generators/install_generator_spec.rb +++ b/spec/generators/install_generator_spec.rb @@ -114,6 +114,36 @@ end end + context 'with bun configured' do + before do + generate_bun_config + end + + context 'when `application.js` exists' do + before do + generate_application_js('/app/javascript') + end + + it 'updates file with htmx import' do + run_generator + assert_file( + 'app/javascript/application.js', + "\n#{Htmx::Generators::InstallGenerator::IMPORTMAP_SETUP}" + ) + end + end + + context 'when `application.js` does not exists' do + it 'creates `application.js` file with htmx require' do + run_generator + assert_file( + 'app/javascript/application.js', + Htmx::Generators::InstallGenerator::IMPORTMAP_SETUP + ) + end + end + end + context 'with no asset pipeline' do before do hide_const('Webpacker') diff --git a/spec/support/files_helper.rb b/spec/support/files_helper.rb index 29c6a5f..f8256dc 100644 --- a/spec/support/files_helper.rb +++ b/spec/support/files_helper.rb @@ -7,5 +7,10 @@ def generate_application_js(location_folder) FileUtils.mkdir_p(pathname) File.write("#{pathname}/application.js", '') end + + def generate_bun_config + FileUtils.mkdir_p(destination_root) + File.write("#{destination_root}/bun.config.js", "// Some JS\n") + end end end