diff --git a/lib/importmap/map.rb b/lib/importmap/map.rb index 43f0421..6bfa2b1 100644 --- a/lib/importmap/map.rb +++ b/lib/importmap/map.rb @@ -30,9 +30,9 @@ def pin(name, to: nil, preload: true) @packages[name] = MappedFile.new(name: name, path: to || "#{name}.js", preload: preload) end - def pin_all_from(dir, under: nil, to: nil, preload: true) + def pin_all_from(dir, under: nil, to: nil, preserve_extname: false, preload: true) clear_cache - @directories[dir] = MappedDir.new(dir: dir, under: under, path: to, preload: preload) + @directories[dir] = MappedDir.new(dir: dir, under: under, path: to, preserve_extname: preserve_extname, preload: preload) end # Returns an array of all the resolved module paths of the pinned packages. The `resolver` must respond to @@ -84,7 +84,7 @@ def cache_sweeper(watches: nil) end private - MappedDir = Struct.new(:dir, :path, :under, :preload, keyword_init: true) + MappedDir = Struct.new(:dir, :path, :under, :preserve_extname, :preload, keyword_init: true) MappedFile = Struct.new(:name, :path, :preload, keyword_init: true) def cache_as(name) @@ -151,7 +151,9 @@ def module_name_from(filename, mapping) # folder/index index_regex = /(?:\/|^)index$/ - [ mapping.under, filename.to_s.remove(filename.extname).remove(index_regex).presence ].compact.join("/") + [ mapping.under, filename.to_s.remove(filename.extname).remove(index_regex).presence ].compact.join("/").tap do |module_name| + module_name << filename.extname if mapping.preserve_extname + end end def module_path_from(filename, mapping) diff --git a/test/dummy/vendor/javascript/shoelace/chunks/chunk.2L6GHXIJ.js b/test/dummy/vendor/javascript/shoelace/chunks/chunk.2L6GHXIJ.js new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/vendor/javascript/shoelace/components/alert/alert.component.js b/test/dummy/vendor/javascript/shoelace/components/alert/alert.component.js new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/vendor/javascript/shoelace/components/alert/alert.js b/test/dummy/vendor/javascript/shoelace/components/alert/alert.js new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/vendor/javascript/shoelace/shoelace-autoloader.js b/test/dummy/vendor/javascript/shoelace/shoelace-autoloader.js new file mode 100644 index 0000000..e69de29 diff --git a/test/importmap_test.rb b/test/importmap_test.rb index 15c2290..e17aeed 100644 --- a/test/importmap_test.rb +++ b/test/importmap_test.rb @@ -15,6 +15,7 @@ def setup pin_all_from "app/javascript/helpers", under: "helpers", preload: true pin_all_from "lib/assets/javascripts", preload: true pin_all_from "app/components", under: "controllers", to: "", preload: true + pin_all_from "vendor/javascript/shoelace", under: "shoelace", preserve_extname: true, preload: true end end end @@ -70,6 +71,14 @@ def setup assert_match %r|assets/my_lib-.*\.js|, generate_importmap_json["imports"]["my_lib"] end + test "directory pin respects preserve_extname option" do + assert_nil generate_importmap_json["imports"]["shoelace/shoelace-autoloader"] + assert_match %r|shoelace/shoelace-autoloader-.*\.js|, generate_importmap_json["imports"]["shoelace/shoelace-autoloader.js"] + assert_match %r|shoelace/chunks/chunk.2L6GHXIJ-.*\.js|, generate_importmap_json["imports"]["shoelace/chunks/chunk.2L6GHXIJ.js"] + assert_match %r|shoelace/components/alert/alert-.*\.js|, generate_importmap_json["imports"]["shoelace/components/alert/alert.js"] + assert_match %r|shoelace/components/alert/alert.component-.*\.js|, generate_importmap_json["imports"]["shoelace/components/alert/alert.component.js"] + end + test 'invalid importmap file results in error' do file = file_fixture('invalid_import_map.rb') importmap = Importmap::Map.new