From cdea8a8c68bbde68a0fdebc8ef2f710a2afafb88 Mon Sep 17 00:00:00 2001 From: Maximo Mussini Date: Mon, 30 Mar 2026 13:53:09 -0300 Subject: [PATCH 1/4] fix: ensure imported CSS is resolved recursively (close #600) --- vite_ruby/lib/vite_ruby/manifest.rb | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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, From 95402e4c4a6c1c8e30c125846b4ab54f5ab4b1fa Mon Sep 17 00:00:00 2001 From: Maximo Mussini Date: Mon, 30 Mar 2026 13:56:12 -0300 Subject: [PATCH 2/4] chore: remove `packageManager` field --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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" +} From b927c789c21fbc314b58904fd3b5d43702f5ad75 Mon Sep 17 00:00:00 2001 From: Maximo Mussini Date: Mon, 30 Mar 2026 14:01:27 -0300 Subject: [PATCH 3/4] chore: update tests --- test/helper_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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: ""), From fd28a911b916323690c7e3e0030357eaaed2a929 Mon Sep 17 00:00:00 2001 From: Maximo Mussini Date: Mon, 30 Mar 2026 14:13:27 -0300 Subject: [PATCH 4/4] chore: update test manifest to cover nested CSS dependencies --- Gemfile.lock | 4 ++-- test/manifest_test.rb | 12 +++++++----- .../public/vite-production/.vite/manifest.json | 11 +++++------ 3 files changed, 14 insertions(+), 13 deletions(-) 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/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"