Skip to content

Commit de4f4a0

Browse files
authored
fix: ensure imported CSS is resolved recursively (close #600) (#601)
1 parent e61af05 commit de4f4a0

6 files changed

Lines changed: 36 additions & 19 deletions

File tree

Gemfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ GEM
101101
ast (2.4.2)
102102
base64 (0.3.0)
103103
benchmark-ips (2.14.0)
104-
bigdecimal (4.0.1)
104+
bigdecimal (4.1.0)
105105
builder (3.3.0)
106106
byebug (11.1.3)
107107
coderay (1.1.3)
@@ -161,7 +161,7 @@ GEM
161161
net-smtp (0.4.0)
162162
net-protocol
163163
nio4r (2.5.9)
164-
nokogiri (1.19.1)
164+
nokogiri (1.19.2)
165165
mini_portile2 (~> 2.8.2)
166166
racc (~> 1.4)
167167
parallel (1.26.3)

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,5 @@
3838
"type": "git",
3939
"url": "https://github.com/ElMassimo/vite_ruby"
4040
},
41-
"homepage": "https://github.com/ElMassimo/vite_ruby",
42-
"packageManager": "pnpm@10.32.1"
43-
}
41+
"homepage": "https://github.com/ElMassimo/vite_ruby"
42+
}

test/helper_test.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,17 @@ def test_vite_stylesheet_tag
109109
def test_vite_preload_tag
110110
assert_includes vite_typescript_tag("main", host: "example.com", protocol: "https"), [
111111
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/log.818edfb8.js" as="script" crossorigin="">),
112-
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
113112
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/vendor.0f7c0ec3.js" as="script" crossorigin="">),
113+
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
114114
].join("\n")
115115
end
116116

117117
def test_vite_javascript_tag
118118
assert_similar [
119119
%(<script src="/vite-production/assets/main.9dcad042.js" crossorigin="" type="module"></script>),
120120
%(<link rel="modulepreload" href="/vite-production/assets/log.818edfb8.js" as="script" crossorigin="">),
121-
%(<link rel="modulepreload" href="/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
122121
%(<link rel="modulepreload" href="/vite-production/assets/vendor.0f7c0ec3.js" as="script" crossorigin="">),
122+
%(<link rel="modulepreload" href="/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
123123
link(href: "/vite-production/assets/app.517bf154.css", crossorigin: ""),
124124
link(href: "/vite-production/assets/theme.e6d9734b.css", crossorigin: ""),
125125
link(href: "/vite-production/assets/vue.ec0a97cc.css", crossorigin: ""),

test/manifest_test.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ def test_lookup_with_type_exception!
118118
end
119119

120120
def test_lookup_success!
121+
vendor_chunk = {
122+
"file" => prefixed("vendor.0f7c0ec3.js"),
123+
"css" => [
124+
prefixed("vue.ec0a97cc.css"),
125+
],
126+
}
121127
entry = {
122128
"file" => prefixed("main.9dcad042.js"),
123129
"src" => "entrypoints/main.ts",
@@ -129,16 +135,12 @@ def test_lookup_success!
129135
"src" => "entrypoints/frameworks/vue.js",
130136
"isEntry" => true,
131137
"imports" => [
132-
{"file" => prefixed("vendor.0f7c0ec3.js")},
133-
],
134-
"css" => [
135-
prefixed("vue.ec0a97cc.css"),
138+
vendor_chunk,
136139
],
137140
"assets" => [
138141
prefixed("logo.322aae0c.svg"),
139142
],
140143
},
141-
{"file" => prefixed("vendor.0f7c0ec3.js")},
142144
],
143145
"css" => [
144146
prefixed("app.517bf154.css"),

test/test_app/public/vite-production/.vite/manifest.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,6 @@
6868
"imports": [
6969
"_vendor.0f7c0ec3.js"
7070
],
71-
"css": [
72-
"assets/vue.ec0a97cc.css"
73-
],
7471
"assets": [
7572
"assets/logo.322aae0c.svg"
7673
]
@@ -81,8 +78,7 @@
8178
"isEntry": true,
8279
"imports": [
8380
"_log.818edfb8.js",
84-
"entrypoints/frameworks/vue.js",
85-
"_vendor.0f7c0ec3.js"
81+
"entrypoints/frameworks/vue.js"
8682
],
8783
"css": [
8884
"assets/app.517bf154.css",
@@ -95,7 +91,10 @@
9591
"isEntry": true
9692
},
9793
"_vendor.0f7c0ec3.js": {
98-
"file": "assets/vendor.0f7c0ec3.js"
94+
"file": "assets/vendor.0f7c0ec3.js",
95+
"css": [
96+
"assets/vue.ec0a97cc.css"
97+
]
9998
},
10099
"_log.818edfb8.js": {
101100
"file": "assets/log.818edfb8.js"

vite_ruby/lib/vite_ruby/manifest.rb

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,30 @@ def path_for(name, **options)
2222
lookup!(name, **options).fetch("file")
2323
end
2424

25+
# Internal: Recursively collects all imported chunks for a given entry.
26+
# Returns chunks in dependency-first order (deepest imports first), deduped.
27+
def import_chunks_for(entry, seen_filenames: Set.new)
28+
chunks = []
29+
30+
entry["imports"]&.each do |chunk|
31+
filename = chunk["file"]
32+
next if seen_filenames.include?(filename)
33+
seen_filenames.add(filename)
34+
35+
chunks.concat(import_chunks_for(chunk, seen_filenames: seen_filenames))
36+
chunks << chunk
37+
end
38+
39+
chunks
40+
end
41+
2542
# Public: Returns scripts, imported modules, and stylesheets for the specified
2643
# entrypoint files.
2744
def resolve_entries(*names, **options)
2845
entries = names.map { |name| lookup!(name, **options) }
2946
script_paths = entries.map { |entry| entry.fetch("file") }
3047

31-
imports = dev_server_running? ? [] : entries.flat_map { |entry| entry["imports"] }.compact
48+
imports = dev_server_running? ? [] : entries.flat_map { |entry| import_chunks_for(entry) }
3249
{
3350
scripts: script_paths,
3451
imports: imports.filter_map { |entry| entry.fetch("file") }.uniq,

0 commit comments

Comments
 (0)