From 6429ba5843b661ed65a50d1b19a9d0af2f5f207a Mon Sep 17 00:00:00 2001 From: Stanislav Lashmanov Date: Thu, 5 Jun 2025 11:56:51 +0400 Subject: [PATCH] feat: support advanced entrypoints 1. Entrypoints with custom names that don't match the file name 2. CSS-only entrypoints --- test/manifest_test.rb | 20 +++++++++++++++++++ .../vite-production/.vite/manifest.json | 14 +++++++++++++ vite_ruby/lib/vite_ruby/manifest.rb | 12 ++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/test/manifest_test.rb b/test/manifest_test.rb index b777c750..682dd1ff 100644 --- a/test/manifest_test.rb +++ b/test/manifest_test.rb @@ -152,6 +152,26 @@ 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 = { + "isEntry" => true, + "file" => prefixed("application-ru2hYTUX.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..f0336658 100644 --- a/vite_ruby/lib/vite_ruby/manifest.rb +++ b/vite_ruby/lib/vite_ruby/manifest.rb @@ -152,13 +152,23 @@ 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"]) + file = 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) } + asset_entries[entry["name"] + ".js"] = entry if entry["name"] && entry["isEntry"] + # handle scss/css entrypoints + entry["names"]&.each do |name| + asset_entries[name] = { + "isEntry" => true, + "file" => file, + } + end end + manifest.merge!(asset_entries) end # Internal: Resolves the manifest entry name for the specified resource.