diff --git a/test/manifest_test.rb b/test/manifest_test.rb index b777c750..f7376ca7 100644 --- a/test/manifest_test.rb +++ b/test/manifest_test.rb @@ -152,6 +152,28 @@ def test_lookup_success! assert_equal lookup!("entrypoints/main", type: :typescript), lookup!("main.ts") end + def test_custom_name_lookup_success! + entry = { + "file" => prefixed("main.CkQYLEXT.js"), + "name" => "entrypoints/custom-name", + "src" => "entrypoints/main.js", + "isEntry" => true, + } + + assert_equal entry, lookup!("custom-name", type: :javascript) + end + + def test_css_lookup_success! + entry = { + "file" => prefixed("application-ru2hYTUX.css"), + "src" => "stylesheets/application.scss", + "isEntry" => true, + "names" => ["stylesheets/application.css"], + } + + assert_equal entry, lookup!("stylesheets/application.css", type: :stylesheet) + end + def test_lookup_success_with_dev_server_running! refresh_config(mode: "development") with_dev_server_running { diff --git a/test/test_app/public/vite-production/.vite/manifest.json b/test/test_app/public/vite-production/.vite/manifest.json index 82abc111..fa4960a7 100644 --- a/test/test_app/public/vite-production/.vite/manifest.json +++ b/test/test_app/public/vite-production/.vite/manifest.json @@ -89,6 +89,20 @@ "assets/theme.e6d9734b.css" ] }, + "entrypoints/main.js": { + "file": "assets/main.CkQYLEXT.js", + "name": "entrypoints/custom-name", + "src": "entrypoints/main.js", + "isEntry": true + }, + "stylesheets/application.scss": { + "file": "assets/application-ru2hYTUX.css", + "src": "stylesheets/application.scss", + "isEntry": true, + "names": [ + "stylesheets/application.css" + ] + }, "../assets/external.js": { "file": "assets/external.d1ae13f1.js", "src": "../assets/external.js", diff --git a/vite_ruby/lib/vite_ruby/manifest.rb b/vite_ruby/lib/vite_ruby/manifest.rb index 388f7731..ceecf156 100644 --- a/vite_ruby/lib/vite_ruby/manifest.rb +++ b/vite_ruby/lib/vite_ruby/manifest.rb @@ -152,13 +152,19 @@ def vite_asset_origin # Internal: Resolves the paths that reference a manifest entry. def resolve_references(manifest) + asset_entries = {} manifest.each_value do |entry| entry["file"] = prefix_vite_asset(entry["file"]) %w[css assets].each do |key| entry[key] = entry[key].map { |path| prefix_vite_asset(path) } if entry[key] end entry["imports"]&.map! { |name| manifest.fetch(name) } + if entry["name"] && entry["isEntry"] + asset_entries[entry["name"] + File.extname(entry["file"])] = entry + end + entry["names"]&.each { |name| asset_entries[name] = entry } end + manifest.merge!(asset_entries) end # Internal: Resolves the manifest entry name for the specified resource.