diff --git a/packages/vite/src/node/__tests__/utils.spec.ts b/packages/vite/src/node/__tests__/utils.spec.ts index 7974ab754301da..f60ccf35443344 100644 --- a/packages/vite/src/node/__tests__/utils.spec.ts +++ b/packages/vite/src/node/__tests__/utils.spec.ts @@ -592,6 +592,26 @@ describe('processSrcSetSync', () => { ).toBe('"/base/nested/asset.png" 1x, "/base/nested/asset.png" 2x') }) + test('keep the url when a density descriptor omits its leading zero', async () => { + const devBase = '/base/' + expect( + processSrcSetSync( + './nested/asset.png .5x, ./nested/asset.png 1x', + ({ url }) => path.posix.join(devBase, url), + ), + ).toBe('/base/nested/asset.png .5x, /base/nested/asset.png 1x') + }) + + test('keep the quoted url when a density descriptor omits its leading zero', async () => { + const devBase = '/base/' + expect( + processSrcSetSync( + '"./nested/asset.png" .75x,"./nested/asset.png" 1x', + ({ url }) => `"${path.posix.join(devBase, url.slice(1, -1))}"`, + ), + ).toBe('"/base/nested/asset.png" .75x, "/base/nested/asset.png" 1x') + }) + test('should not split the comma inside base64 value', async () => { const base64 = 'data:image/avif;base64,aA+/0= 400w, data:image/avif;base64,bB+/9= 800w' diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index a501e50eda397b..b283d53b5491e3 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -814,7 +814,7 @@ function joinSrcset(ret: ImageCandidate[]) { The `descriptor` is anything after the space and before the comma. */ const imageCandidateRegex = - /(?:^|\s|(?<=,))(?[\w-]+\([^)]*\)|"[^"]*"|'[^']*'|[^,]\S*[^,])\s*(?:\s(?\w[^,]+))?(?:,|$)/g + /(?:^|\s|(?<=,))(?[\w-]+\([^)]*\)|"[^"]*"|'[^']*'|[^,]\S*[^,])\s*(?:\s(?[\w.][^,]+))?(?:,|$)/g const escapedSpaceCharacters = /(?: |\\t|\\n|\\f|\\r)+/g export function parseSrcset(string: string): ImageCandidate[] {