Skip to content

Commit 328ebff

Browse files
committed
fix(compiler-sfc): do not transform external and data urls in templates
1 parent b2332fa commit 328ebff

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

packages/compiler-sfc/src/templateCompilerModules/utils.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ export function urlToRequire(
1414
url = url.slice(secondChar === '/' ? 2 : 1)
1515
}
1616

17-
const uriParts = parseUriParts(url)
17+
if (isExternalUrl(url) || isDataUrl(url) || firstChar === '#') {
18+
return returnValue
19+
}
1820

21+
const uriParts = parseUriParts(url)
1922
if (transformAssetUrlsOption.base) {
2023
// explicit base - directly rewrite the url into absolute url
2124
// does not apply to absolute urls or urls that start with `@`
@@ -67,3 +70,13 @@ function parseUriParts(urlString: string): UrlWithStringQuery {
6770
}
6871
return returnValue
6972
}
73+
74+
const externalRE = /^(https?:)?\/\//
75+
function isExternalUrl(url: string): boolean {
76+
return externalRE.test(url)
77+
}
78+
79+
const dataUrlRE = /^\s*data:/i
80+
function isDataUrl(url: string): boolean {
81+
return dataUrlRE.test(url)
82+
}

packages/compiler-sfc/test/compileStyle.spec.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ test('preprocess less', () => {
99
'.color { color: @red; }\n' +
1010
'</style>\n',
1111
filename: 'example.vue',
12-
needMap: true
12+
sourceMap: true
1313
}).styles[0]
1414

1515
const result = compileStyle({
@@ -34,7 +34,7 @@ test('preprocess scss', () => {
3434
'.color { color: $red; }\n' +
3535
'</style>\n',
3636
filename: 'example.vue',
37-
needMap: true
37+
sourceMap: true
3838
}).styles[0]
3939
const result = compileStyle({
4040
id: 'v-scope-xxx',
@@ -59,7 +59,7 @@ test('preprocess sass', () => {
5959
' color: $red\n' +
6060
'</style>\n',
6161
filename: 'example.vue',
62-
needMap: true
62+
sourceMap: true
6363
}).styles[0]
6464
const result = compileStyle({
6565
id: 'v-scope-xxx',
@@ -84,7 +84,7 @@ test('preprocess stylus', () => {
8484
' color: red-color\n' +
8585
'</style>\n',
8686
filename: 'example.vue',
87-
needMap: true
87+
sourceMap: true
8888
}).styles[0]
8989
const result = compileStyle({
9090
id: 'v-scope-xxx',

packages/compiler-sfc/test/compileTemplate.spec.ts

+28-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ test('preprocess pug', () => {
4848
' p Cool Pug example!\n' +
4949
'</template>\n',
5050
filename: 'example.vue',
51-
needMap: true
51+
sourceMap: true
5252
}).template as SFCBlock
5353

5454
const result = compileTemplate({
@@ -103,7 +103,7 @@ test('warn missing preprocessor', () => {
103103
source: '<template lang="unknownLang">\n' + '</template>\n',
104104

105105
filename: 'example.vue',
106-
needMap: true
106+
sourceMap: true
107107
}).template as SFCBlock
108108

109109
const result = compileTemplate({
@@ -141,7 +141,6 @@ test('transform assetUrls', () => {
141141
})
142142

143143
test('transform srcset', () => {
144-
// TODO:
145144
const source = `
146145
<div>
147146
<img src="./logo.png">
@@ -227,3 +226,29 @@ test('transform assetUrls and srcset with base option', () => {
227226
'/base/logo.png 2x, /base/logo.png 3x'
228227
)
229228
})
229+
230+
test('transform with includeAbsolute', () => {
231+
const source = `
232+
<div>
233+
<img src="./logo.png">
234+
<img src="/logo.png">
235+
<img src="https://foo.com/logo.png">
236+
</div>
237+
`
238+
const result = compileTemplate({
239+
filename: 'example.vue',
240+
source,
241+
transformAssetUrls: true,
242+
transformAssetUrlsOptions: { includeAbsolute: true }
243+
})
244+
245+
expect(result.errors.length).toBe(0)
246+
247+
const vnode = mockRender(result.code, {
248+
'./logo.png': 'relative',
249+
'/logo.png': 'absolute'
250+
})
251+
expect(vnode.children[0].data.attrs.src).toBe('relative')
252+
expect(vnode.children[2].data.attrs.src).toBe('absolute')
253+
expect(vnode.children[4].data.attrs.src).toBe('https://foo.com/logo.png')
254+
})

0 commit comments

Comments
 (0)