Skip to content

Commit 7dfcb31

Browse files
authored
fix: virtual svg module (vitejs#20144)
1 parent d90796e commit 7dfcb31

File tree

7 files changed

+42
-1
lines changed

7 files changed

+42
-1
lines changed

packages/vite/src/node/server/middlewares/transform.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ export function transformMiddleware(
213213
'',
214214
)
215215
if (
216+
!url.startsWith('/@id/\0') &&
216217
deniedServingAccessForTransform(
217218
urlWithoutTrailingQuerySeparators,
218219
server,
@@ -264,7 +265,10 @@ export function transformMiddleware(
264265
const result = await transformRequest(environment, url, {
265266
html: req.headers.accept?.includes('text/html'),
266267
allowId(id) {
267-
return !deniedServingAccessForTransform(id, server, res, next)
268+
return (
269+
id.startsWith('\0') ||
270+
!deniedServingAccessForTransform(id, server, res, next)
271+
)
268272
},
269273
})
270274
if (result) {

playground/fs-serve/__tests__/fs-serve.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ describe.runIf(isServe)('main', () => {
3838
expect(await page.textContent('.named')).toBe(testJSON.msg)
3939
})
4040

41+
test('virtual svg module', async () => {
42+
expect(await page.textContent('.virtual-svg')).toMatch('<svg')
43+
})
44+
4145
test('safe fetch', async () => {
4246
expect(await page.textContent('.safe-fetch')).toMatch('KEY=safe')
4347
expect(await page.textContent('.safe-fetch-status')).toBe('200')

playground/fs-serve/root/src/index.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,17 @@ <h2>Denied</h2>
6161
<pre class="unsafe-dotEnV-casing"></pre>
6262
<pre class="unsafe-dotenv-query-dot-svg-wasm-init"></pre>
6363

64+
<d2>Virtual SVG module</d2>
65+
<pre class="virtual-svg"></pre>
66+
6467
<script type="module">
6568
import '../../entry'
6669
import json, { msg } from '../../safe.json'
6770
import './code.js'
6871

72+
// Check virtual svg module still works
73+
import fooSvg from 'virtual:foo.svg'
74+
6975
function joinUrlSegments(a, b) {
7076
if (!a || !b) {
7177
return a || b || ''
@@ -81,6 +87,7 @@ <h2>Denied</h2>
8187

8288
text('.full', JSON.stringify(json))
8389
text('.named', msg)
90+
text('.virtual-svg', fooSvg)
8491

8592
const base = typeof BASE !== 'undefined' ? BASE : ''
8693

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { Plugin } from 'vite'
2+
const svgVirtualModuleId = 'virtual:foo.svg'
3+
const resolvedSvgVirtualModuleId = '\0' + svgVirtualModuleId
4+
5+
export default function svgVirtualModulePlugin(): Plugin {
6+
return {
7+
name: 'svg-virtual-module',
8+
resolveId(id) {
9+
if (id === svgVirtualModuleId) {
10+
return resolvedSvgVirtualModuleId
11+
}
12+
},
13+
async load(id, _options) {
14+
if (id === resolvedSvgVirtualModuleId) {
15+
return `export default '<svg><rect width="100" height="100"></svg>'`
16+
}
17+
},
18+
enforce: 'pre',
19+
}
20+
}

playground/fs-serve/root/vite.config-base.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'node:path'
22
import { defineConfig } from 'vite'
3+
import svgVirtualModulePlugin from './svgVirtualModulePlugin'
34

45
const BASE = '/base/'
56

@@ -33,4 +34,5 @@ export default defineConfig({
3334
ROOT: JSON.stringify(path.dirname(__dirname).replace(/\\/g, '/')),
3435
BASE: JSON.stringify(BASE),
3536
},
37+
plugins: [svgVirtualModulePlugin()],
3638
})

playground/fs-serve/root/vite.config-deny.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'node:path'
22
import { defineConfig } from 'vite'
3+
import svgVirtualModulePlugin from './svgVirtualModulePlugin'
34

45
export default defineConfig({
56
build: {
@@ -19,4 +20,5 @@ export default defineConfig({
1920
define: {
2021
ROOT: JSON.stringify(path.dirname(__dirname).replace(/\\/g, '/')),
2122
},
23+
plugins: [svgVirtualModulePlugin()],
2224
})

playground/fs-serve/root/vite.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'node:path'
22
import { defineConfig } from 'vite'
3+
import svgVirtualModulePlugin from './svgVirtualModulePlugin'
34

45
export default defineConfig({
56
build: {
@@ -29,4 +30,5 @@ export default defineConfig({
2930
define: {
3031
ROOT: JSON.stringify(path.dirname(__dirname).replace(/\\/g, '/')),
3132
},
33+
plugins: [svgVirtualModulePlugin()],
3234
})

0 commit comments

Comments
 (0)