diff --git a/Gemfile.lock b/Gemfile.lock
index 0aa2a4f7..417815cc 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -101,7 +101,7 @@ GEM
ast (2.4.2)
base64 (0.3.0)
benchmark-ips (2.14.0)
- bigdecimal (4.0.1)
+ bigdecimal (4.1.0)
builder (3.3.0)
byebug (11.1.3)
coderay (1.1.3)
@@ -161,7 +161,7 @@ GEM
net-smtp (0.4.0)
net-protocol
nio4r (2.5.9)
- nokogiri (1.19.1)
+ nokogiri (1.19.2)
mini_portile2 (~> 2.8.2)
racc (~> 1.4)
parallel (1.26.3)
diff --git a/package.json b/package.json
index 3d86088f..5032d52f 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,5 @@
"type": "git",
"url": "https://github.com/ElMassimo/vite_ruby"
},
- "homepage": "https://github.com/ElMassimo/vite_ruby",
- "packageManager": "pnpm@10.32.1"
-}
\ No newline at end of file
+ "homepage": "https://github.com/ElMassimo/vite_ruby"
+}
diff --git a/test/helper_test.rb b/test/helper_test.rb
index 27686bc8..81ae21a2 100644
--- a/test/helper_test.rb
+++ b/test/helper_test.rb
@@ -109,8 +109,8 @@ def test_vite_stylesheet_tag
def test_vite_preload_tag
assert_includes vite_typescript_tag("main", host: "example.com", protocol: "https"), [
%(),
- %(),
%(),
+ %(),
].join("\n")
end
@@ -118,8 +118,8 @@ def test_vite_javascript_tag
assert_similar [
%(),
%(),
- %(),
%(),
+ %(),
link(href: "/vite-production/assets/app.517bf154.css", crossorigin: ""),
link(href: "/vite-production/assets/theme.e6d9734b.css", crossorigin: ""),
link(href: "/vite-production/assets/vue.ec0a97cc.css", crossorigin: ""),
diff --git a/test/manifest_test.rb b/test/manifest_test.rb
index b777c750..ddda3af5 100644
--- a/test/manifest_test.rb
+++ b/test/manifest_test.rb
@@ -118,6 +118,12 @@ def test_lookup_with_type_exception!
end
def test_lookup_success!
+ vendor_chunk = {
+ "file" => prefixed("vendor.0f7c0ec3.js"),
+ "css" => [
+ prefixed("vue.ec0a97cc.css"),
+ ],
+ }
entry = {
"file" => prefixed("main.9dcad042.js"),
"src" => "entrypoints/main.ts",
@@ -129,16 +135,12 @@ def test_lookup_success!
"src" => "entrypoints/frameworks/vue.js",
"isEntry" => true,
"imports" => [
- {"file" => prefixed("vendor.0f7c0ec3.js")},
- ],
- "css" => [
- prefixed("vue.ec0a97cc.css"),
+ vendor_chunk,
],
"assets" => [
prefixed("logo.322aae0c.svg"),
],
},
- {"file" => prefixed("vendor.0f7c0ec3.js")},
],
"css" => [
prefixed("app.517bf154.css"),
diff --git a/test/test_app/public/vite-production/.vite/manifest.json b/test/test_app/public/vite-production/.vite/manifest.json
index 82abc111..6811f323 100644
--- a/test/test_app/public/vite-production/.vite/manifest.json
+++ b/test/test_app/public/vite-production/.vite/manifest.json
@@ -68,9 +68,6 @@
"imports": [
"_vendor.0f7c0ec3.js"
],
- "css": [
- "assets/vue.ec0a97cc.css"
- ],
"assets": [
"assets/logo.322aae0c.svg"
]
@@ -81,8 +78,7 @@
"isEntry": true,
"imports": [
"_log.818edfb8.js",
- "entrypoints/frameworks/vue.js",
- "_vendor.0f7c0ec3.js"
+ "entrypoints/frameworks/vue.js"
],
"css": [
"assets/app.517bf154.css",
@@ -95,7 +91,10 @@
"isEntry": true
},
"_vendor.0f7c0ec3.js": {
- "file": "assets/vendor.0f7c0ec3.js"
+ "file": "assets/vendor.0f7c0ec3.js",
+ "css": [
+ "assets/vue.ec0a97cc.css"
+ ]
},
"_log.818edfb8.js": {
"file": "assets/log.818edfb8.js"
diff --git a/vite_ruby/lib/vite_ruby/manifest.rb b/vite_ruby/lib/vite_ruby/manifest.rb
index 388f7731..1a151323 100644
--- a/vite_ruby/lib/vite_ruby/manifest.rb
+++ b/vite_ruby/lib/vite_ruby/manifest.rb
@@ -22,13 +22,30 @@ def path_for(name, **options)
lookup!(name, **options).fetch("file")
end
+ # Internal: Recursively collects all imported chunks for a given entry.
+ # Returns chunks in dependency-first order (deepest imports first), deduped.
+ def import_chunks_for(entry, seen_filenames: Set.new)
+ chunks = []
+
+ entry["imports"]&.each do |chunk|
+ filename = chunk["file"]
+ next if seen_filenames.include?(filename)
+ seen_filenames.add(filename)
+
+ chunks.concat(import_chunks_for(chunk, seen_filenames: seen_filenames))
+ chunks << chunk
+ end
+
+ chunks
+ end
+
# Public: Returns scripts, imported modules, and stylesheets for the specified
# entrypoint files.
def resolve_entries(*names, **options)
entries = names.map { |name| lookup!(name, **options) }
script_paths = entries.map { |entry| entry.fetch("file") }
- imports = dev_server_running? ? [] : entries.flat_map { |entry| entry["imports"] }.compact
+ imports = dev_server_running? ? [] : entries.flat_map { |entry| import_chunks_for(entry) }
{
scripts: script_paths,
imports: imports.filter_map { |entry| entry.fetch("file") }.uniq,