From 69f02fc813d684b90ff5261f648f960a1d5ab5ab Mon Sep 17 00:00:00 2001 From: Chaejun Lee Date: Sun, 24 Dec 2023 16:39:10 -0800 Subject: [PATCH 1/7] fix: add `data:...` to RE --- packages/vite/src/node/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index ff23df8a6d3e30..352e86c53d9251 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -787,7 +787,7 @@ export function processSrcSetSync( } const cleanSrcSetRE = - /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'/g + /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'|data:[/;,\w]+/g function splitSrcSet(srcs: string) { const parts: string[] = [] // There could be a ',' inside of url(data:...), linear-gradient(...) or "data:..." From 030bb1291059dcd7caf40d6069e7b7bcbec7d591 Mon Sep 17 00:00:00 2001 From: Chaejun Lee Date: Sun, 24 Dec 2023 16:41:14 -0800 Subject: [PATCH 2/7] test: add unit test to `processSrcSetSync` --- packages/vite/src/node/__tests__/utils.spec.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/vite/src/node/__tests__/utils.spec.ts b/packages/vite/src/node/__tests__/utils.spec.ts index 5b3794a6f9cee4..432217db65a42c 100644 --- a/packages/vite/src/node/__tests__/utils.spec.ts +++ b/packages/vite/src/node/__tests__/utils.spec.ts @@ -332,6 +332,14 @@ describe('processSrcSetSync', () => { ), ).toBe('/base/nested/asset.png 1x, /base/nested/asset.png 2x') }) + + test('should not split the comma inside base64 value', async () => { + const base64 = + 'data:image/avif;base64,AAAA 400w, data:image/avif;base64,BBBB 800w' + expect(processSrcSetSync(base64, ({ url }) => url)).toBe(base64) + }) + + test('should not split ') }) describe('flattenId', () => { From 29f3bbdbf8d41199364babf7cc723412b5a828fc Mon Sep 17 00:00:00 2001 From: Chaejun Lee Date: Sun, 24 Dec 2023 17:09:46 -0800 Subject: [PATCH 3/7] chore: add `data:...` case to the comment --- packages/vite/src/node/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 352e86c53d9251..0496a97eb7fac0 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -790,7 +790,7 @@ const cleanSrcSetRE = /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'|data:[/;,\w]+/g function splitSrcSet(srcs: string) { const parts: string[] = [] - // There could be a ',' inside of url(data:...), linear-gradient(...) or "data:..." + // There could be a ',' inside of url(data:...), linear-gradient(...), "data:..." or data:... const cleanedSrcs = srcs.replace(cleanSrcSetRE, blankReplacer) let startIndex = 0 let splitIndex: number From a82a59fdf09d55202c1684cf5d0128883bf9e601 Mon Sep 17 00:00:00 2001 From: Chaejun Lee Date: Mon, 25 Dec 2023 22:08:52 -0800 Subject: [PATCH 4/7] fix: remove empty test --- packages/vite/src/node/__tests__/utils.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/vite/src/node/__tests__/utils.spec.ts b/packages/vite/src/node/__tests__/utils.spec.ts index 432217db65a42c..d76175c95c74a8 100644 --- a/packages/vite/src/node/__tests__/utils.spec.ts +++ b/packages/vite/src/node/__tests__/utils.spec.ts @@ -338,8 +338,6 @@ describe('processSrcSetSync', () => { 'data:image/avif;base64,AAAA 400w, data:image/avif;base64,BBBB 800w' expect(processSrcSetSync(base64, ({ url }) => url)).toBe(base64) }) - - test('should not split ') }) describe('flattenId', () => { From 2d253dac210221b78729f6fe9d344fcfb73c494b Mon Sep 17 00:00:00 2001 From: Chaejun Lee Date: Mon, 25 Dec 2023 22:10:22 -0800 Subject: [PATCH 5/7] test: improve image base64 string --- packages/vite/src/node/__tests__/utils.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/__tests__/utils.spec.ts b/packages/vite/src/node/__tests__/utils.spec.ts index d76175c95c74a8..3efdbdd77c2409 100644 --- a/packages/vite/src/node/__tests__/utils.spec.ts +++ b/packages/vite/src/node/__tests__/utils.spec.ts @@ -335,7 +335,7 @@ describe('processSrcSetSync', () => { test('should not split the comma inside base64 value', async () => { const base64 = - 'data:image/avif;base64,AAAA 400w, data:image/avif;base64,BBBB 800w' + 'data:image/avif;base64,aA+/0= 400w, data:image/avif;base64,bB+/9= 800w' expect(processSrcSetSync(base64, ({ url }) => url)).toBe(base64) }) }) From 2722e7f1cb3d3ebc5739f2a2df5d2b271abd0bb1 Mon Sep 17 00:00:00 2001 From: Chaejun Lee Date: Mon, 25 Dec 2023 22:11:21 -0800 Subject: [PATCH 6/7] fix: improve `cleanSrcSetRE` to catch base64 values properly --- packages/vite/src/node/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 0496a97eb7fac0..a42e75299e52c2 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -787,7 +787,7 @@ export function processSrcSetSync( } const cleanSrcSetRE = - /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'|data:[/;,\w]+/g + /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'|data:image\/[\w.+\-]+;base64,[\w+/=]+/g function splitSrcSet(srcs: string) { const parts: string[] = [] // There could be a ',' inside of url(data:...), linear-gradient(...), "data:..." or data:... From 553f325ac0367f0fa82fa2ed2db7bbe30f0bbf45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=B1=84=EC=A4=80=20-=20CJ=20Lee?= Date: Mon, 25 Dec 2023 23:22:33 -0800 Subject: [PATCH 7/7] fix: loosen regex --- packages/vite/src/node/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index a42e75299e52c2..01eb7165c9f5b0 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -787,7 +787,7 @@ export function processSrcSetSync( } const cleanSrcSetRE = - /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'|data:image\/[\w.+\-]+;base64,[\w+/=]+/g + /(?:url|image|gradient|cross-fade)\([^)]*\)|"([^"]|(?<=\\)")*"|'([^']|(?<=\\)')*'|data:\w+\/[\w.+\-]+;base64,[\w+/=]+/g function splitSrcSet(srcs: string) { const parts: string[] = [] // There could be a ',' inside of url(data:...), linear-gradient(...), "data:..." or data:...