Skip to content

Commit eeb0617

Browse files
authored
fix: call tryFsResolve for relative new URL(foo, import.meta.url) (#13142)
1 parent a8c7eb2 commit eeb0617

File tree

9 files changed

+76
-1
lines changed

9 files changed

+76
-1
lines changed

packages/vite/src/node/plugins/assetImportMetaUrl.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import {
1414
import { CLIENT_ENTRY } from '../constants'
1515
import { fileToUrl } from './asset'
1616
import { preloadHelperId } from './importAnalysisBuild'
17+
import type { InternalResolveOptions } from './resolve'
18+
import { tryFsResolve } from './resolve'
1719

1820
/**
1921
* Convert `new URL('./foo.png', import.meta.url)` to its resolved built URL
@@ -29,6 +31,16 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
2931
const normalizedPublicDir = normalizePath(config.publicDir)
3032
let assetResolver: ResolveFn
3133

34+
const fsResolveOptions: InternalResolveOptions = {
35+
...config.resolve,
36+
root: config.root,
37+
isProduction: config.isProduction,
38+
isBuild: config.command === 'build',
39+
packageCache: config.packageCache,
40+
ssrConfig: config.ssr,
41+
asSrc: true,
42+
}
43+
3244
return {
3345
name: 'vite:asset-import-meta-url',
3446
async transform(code, id, options) {
@@ -98,6 +110,7 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
98110
let file: string | undefined
99111
if (url[0] === '.') {
100112
file = slash(path.resolve(path.dirname(id), url))
113+
file = tryFsResolve(file, fsResolveOptions) ?? file
101114
} else {
102115
assetResolver ??= config.createResolver({
103116
extensions: [],

packages/vite/src/node/plugins/resolve.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ function splitFileAndPostfix(path: string) {
498498
return { file, postfix: path.slice(file.length) }
499499
}
500500

501-
function tryFsResolve(
501+
export function tryFsResolve(
502502
fsPath: string,
503503
options: InternalResolveOptions,
504504
tryIndex = true,

packages/vite/src/node/plugins/workerImportMetaUrl.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import type { ResolveFn } from '..'
1717
import type { WorkerType } from './worker'
1818
import { WORKER_FILE_ID, workerFileToUrl } from './worker'
1919
import { fileToUrl } from './asset'
20+
import type { InternalResolveOptions } from './resolve'
21+
import { tryFsResolve } from './resolve'
2022

2123
const ignoreFlagRE = /\/\*\s*@vite-ignore\s*\*\//
2224

@@ -99,6 +101,16 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
99101
const isBuild = config.command === 'build'
100102
let workerResolver: ResolveFn
101103

104+
const fsResolveOptions: InternalResolveOptions = {
105+
...config.resolve,
106+
root: config.root,
107+
isProduction: config.isProduction,
108+
isBuild: config.command === 'build',
109+
packageCache: config.packageCache,
110+
ssrConfig: config.ssr,
111+
asSrc: true,
112+
}
113+
102114
return {
103115
name: 'vite:worker-import-meta-url',
104116

@@ -143,6 +155,7 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
143155
let file: string | undefined
144156
if (url[0] === '.') {
145157
file = path.resolve(path.dirname(id), url)
158+
file = tryFsResolve(file, fsResolveOptions) ?? file
146159
} else {
147160
workerResolver ??= config.createResolver({
148161
extensions: [],

playground/assets/__tests__/assets.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,15 @@ test('new URL("/...", import.meta.url)', async () => {
312312
)
313313
})
314314

315+
test('new URL(..., import.meta.url) without extension', async () => {
316+
expect(await page.textContent('.import-meta-url-without-extension')).toMatch(
317+
isBuild ? 'data:application/javascript' : 'nested/test.js',
318+
)
319+
expect(
320+
await page.textContent('.import-meta-url-content-without-extension'),
321+
).toContain('export default class')
322+
})
323+
315324
test('new URL(`${dynamic}`, import.meta.url)', async () => {
316325
expect(await page.textContent('.dynamic-import-meta-url-1')).toMatch(
317326
isBuild ? 'data:image/png;base64' : '/foo/nested/icon.png',

playground/assets/index.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,14 @@ <h2>new URL('/...', import.meta.url)</h2>
190190
<img class="import-meta-url-base-path-img" />
191191
<code class="import-meta-url-base-path"></code>
192192

193+
<h2>new URL('...', import.meta.url (without extension))</h2>
194+
<p>
195+
<code class="import-meta-url-content-without-extension"></code>
196+
</p>
197+
<p>
198+
<code class="import-meta-url-without-extension"></code>
199+
</p>
200+
193201
<h2>new URL('...', import.meta.url,) (with comma)</h2>
194202
<img class="import-meta-url-img-comma" />
195203
<code class="import-meta-url-comma"></code>
@@ -393,6 +401,13 @@ <h3>assets in noscript</h3>
393401
text('.import-meta-url-base-path', metaUrlBasePath)
394402
document.querySelector('.import-meta-url-base-path-img').src = metaUrlBasePath
395403

404+
const metaUrlWithoutExtension = new URL('./nested/test', import.meta.url)
405+
text('.import-meta-url-without-extension', metaUrlWithoutExtension)
406+
;(async () => {
407+
const res = await fetch(metaUrlWithoutExtension)
408+
text('.import-meta-url-content-without-extension', await res.text())
409+
})()
410+
396411
// prettier-ignore
397412
const metaUrlWithComma = new URL('./nested/asset.png', import.meta.url,)
398413
text('.import-meta-url-comma', metaUrlWithComma)

playground/worker/__tests__/es/es-worker.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ test('module worker', async () => {
113113
'A string',
114114
true,
115115
)
116+
await untilUpdated(
117+
() => page.textContent('.worker-import-meta-url-without-extension'),
118+
'A string',
119+
true,
120+
)
116121
await untilUpdated(
117122
() => page.textContent('.shared-worker-import-meta-url'),
118123
'A string',

playground/worker/__tests__/iife/iife-worker.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ test('module worker', async () => {
9898
/A\sstring.*\/iife\/.+url-worker\.js/,
9999
true,
100100
)
101+
await untilUpdated(
102+
() => page.textContent('.worker-import-meta-url-without-extension'),
103+
'A string',
104+
true,
105+
)
101106
await untilUpdated(
102107
() => page.textContent('.shared-worker-import-meta-url'),
103108
'A string',

playground/worker/index.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ <h2 class="format-iife">format iife:</h2>
5656
</p>
5757
<code class="worker-import-meta-url-resolve"></code>
5858

59+
<p>
60+
new Worker(new URL('./url-worker', import.meta.url), { type: 'module' })
61+
<span class="classname">.worker-import-meta-url-without-extension</span>
62+
</p>
63+
<code class="worker-import-meta-url-without-extension"></code>
64+
5965
<p>
6066
new SharedWorker(new URL('./url-shared-worker.js', import.meta.url), { type:
6167
'module' })

playground/worker/worker/main-module.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ wResolve.addEventListener('message', (ev) =>
9090
text('.worker-import-meta-url-resolve', JSON.stringify(ev.data)),
9191
)
9292

93+
// url import worker without extension
94+
const wWithoutExt = new Worker(
95+
new URL('../url-worker', import.meta.url),
96+
/* @vite-ignore */ workerOptions,
97+
)
98+
wWithoutExt.addEventListener('message', (ev) =>
99+
text('.worker-import-meta-url-without-extension', JSON.stringify(ev.data)),
100+
)
101+
93102
const genWorkerName = () => 'module'
94103
const w2 = new SharedWorker(
95104
new URL('../url-shared-worker.js', import.meta.url),

0 commit comments

Comments
 (0)