diff --git a/packages/vite/src/node/__tests__/utils.spec.ts b/packages/vite/src/node/__tests__/utils.spec.ts index 7974ab754301da..5d39ccbb75ee00 100644 --- a/packages/vite/src/node/__tests__/utils.spec.ts +++ b/packages/vite/src/node/__tests__/utils.spec.ts @@ -26,6 +26,7 @@ import { numberToPos, posToNumber, processSrcSetSync, + removeTimestampQuery, resolveHostname, resolveServerUrls, } from '../utils' @@ -195,6 +196,33 @@ describe('injectQuery', () => { }) }) +describe('removeTimestampQuery', () => { + test('removes timestamp query parameter', () => { + expect(removeTimestampQuery('/foo.js?t=1712345678901')).toBe('/foo.js') + expect(removeTimestampQuery('/foo.js?t=1712345678901&bar=1')).toBe( + '/foo.js?bar=1', + ) + expect(removeTimestampQuery('/foo.js?bar=1&t=1712345678901')).toBe( + '/foo.js?bar=1', + ) + expect(removeTimestampQuery('/foo.js?bar=1&t=1712345678901&baz=2')).toBe( + '/foo.js?bar=1&baz=2', + ) + }) + + test('does not strip params with names ending in hyphen-t', () => { + expect(removeTimestampQuery('/foo.js?current-t=1712345678901')).toBe( + '/foo.js?current-t=1712345678901', + ) + expect(removeTimestampQuery('/foo.js?my-t=1712345678901&other=1')).toBe( + '/foo.js?my-t=1712345678901&other=1', + ) + expect(removeTimestampQuery('/foo.js#t=1712345678901')).toBe( + '/foo.js#t=1712345678901', + ) + }) +}) + describe('resolveHostname', () => { test('defaults to localhost', async () => { const resolved = await getLocalhostAddressIfDiffersFromDNS() diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index a501e50eda397b..b872ea8d26c41c 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -338,9 +338,9 @@ export function injectQuery(url: string, queryToInject: string): string { return `${normalizedFile}?${queryToInject}${postfix[0] === '?' ? `&${postfix.slice(1)}` : /* hash only */ postfix}` } -const timestampRE = /\bt=\d{13}&?\b/ +const timestampRE = /(\?|&)t=\d{13}(?:&|$)/ export function removeTimestampQuery(url: string): string { - return url.replace(timestampRE, '').replace(trailingSeparatorRE, '') + return url.replace(timestampRE, '$1').replace(trailingSeparatorRE, '') } export async function asyncReplace(