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,