Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
"homepage": "https://github.com/ElMassimo/vite_ruby"
}
4 changes: 2 additions & 2 deletions test/helper_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -109,17 +109,17 @@ def test_vite_stylesheet_tag
def test_vite_preload_tag
assert_includes vite_typescript_tag("main", host: "example.com", protocol: "https"), [
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/log.818edfb8.js" as="script" crossorigin="">),
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/vendor.0f7c0ec3.js" as="script" crossorigin="">),
%(<link rel="modulepreload" href="https://example.com/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
].join("\n")
end

def test_vite_javascript_tag
assert_similar [
%(<script src="/vite-production/assets/main.9dcad042.js" crossorigin="" type="module"></script>),
%(<link rel="modulepreload" href="/vite-production/assets/log.818edfb8.js" as="script" crossorigin="">),
%(<link rel="modulepreload" href="/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
%(<link rel="modulepreload" href="/vite-production/assets/vendor.0f7c0ec3.js" as="script" crossorigin="">),
%(<link rel="modulepreload" href="/vite-production/assets/vue.3002ada6.js" as="script" crossorigin="">),
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: ""),
Expand Down
12 changes: 7 additions & 5 deletions test/manifest_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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"),
Expand Down
11 changes: 5 additions & 6 deletions test/test_app/public/vite-production/.vite/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,6 @@
"imports": [
"_vendor.0f7c0ec3.js"
],
"css": [
"assets/vue.ec0a97cc.css"
],
"assets": [
"assets/logo.322aae0c.svg"
]
Expand All @@ -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",
Expand All @@ -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"
Expand Down
19 changes: 18 additions & 1 deletion vite_ruby/lib/vite_ruby/manifest.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading