From 14f6e30fe8a6816d0a73315bc7208a4e02514cbd Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Fri, 31 Jul 2026 19:24:39 +0900 Subject: [PATCH] test: add `renderBuiltUrl` change changes hash --- .../vite/src/node/__tests__/build.spec.ts | 66 +++++++++++++++++++ .../packages/build-project/asset.txt | 1 + 2 files changed, 67 insertions(+) create mode 100644 packages/vite/src/node/__tests__/packages/build-project/asset.txt diff --git a/packages/vite/src/node/__tests__/build.spec.ts b/packages/vite/src/node/__tests__/build.spec.ts index cc26b3a47f2347..9ac9aae76973e3 100644 --- a/packages/vite/src/node/__tests__/build.spec.ts +++ b/packages/vite/src/node/__tests__/build.spec.ts @@ -84,6 +84,34 @@ describe('build', () => { assertOutputHashContentChange(result[0], result[1]) }) + test('file hash should change when renderBuiltUrl changes', async () => { + const createRenderBuiltUrl = (base: string) => (filename: string) => + `${base}/${filename}` + const renderBuiltUrlA = createRenderBuiltUrl('/cdn-a') + const renderBuiltUrlB = createRenderBuiltUrl('/cdn-b') + + expect(renderBuiltUrlA.toString()).toBe(renderBuiltUrlB.toString()) + + const result = await Promise.all([ + buildProjectWithRenderBuiltUrl(renderBuiltUrlA), + buildProjectWithRenderBuiltUrl(renderBuiltUrlB), + ]) + + expect(getOutputHashChanges(result[0], result[1])).toMatchInlineSnapshot(` + { + "changed": [ + "index", + ], + "unchanged": [ + "_subentry", + "asset.txt", + "undefined", + ], + } + `) + assertOutputHashContentChange(result[0], result[1]) + }) + test('top-level input is used as the default build entry', async () => { const result = (await build({ root: resolve(dirname, 'packages/build-project'), @@ -1512,6 +1540,44 @@ test('copies public directory after building same environment with write false f ).resolves.toBe('') }) +async function buildProjectWithRenderBuiltUrl( + renderBuiltUrl: (filename: string) => string, +) { + return (await build({ + root: resolve(dirname, 'packages/build-project'), + logLevel: 'silent', + build: { + write: false, + assetsInlineLimit: 0, + }, + experimental: { + renderBuiltUrl, + }, + plugins: [ + { + name: 'test', + resolveId(id) { + if (id === 'entry.js' || id === 'subentry.js') { + return '\0' + id + } + }, + load(id) { + if (id === '\0entry.js') { + return ` + import assetUrl from '/asset.txt?url' + console.log(assetUrl) + window.addEventListener('click', () => { import('subentry.js') }) + ` + } + if (id === '\0subentry.js') { + return `export default 'subentry'` + } + }, + }, + ], + })) as RolldownOutput +} + /** * for each chunks in output1, if there's a chunk in output2 with the same fileName, * ensure that the chunk code is the same. if not, the chunk hash should have changed. diff --git a/packages/vite/src/node/__tests__/packages/build-project/asset.txt b/packages/vite/src/node/__tests__/packages/build-project/asset.txt new file mode 100644 index 00000000000000..2bd69c0fe88147 --- /dev/null +++ b/packages/vite/src/node/__tests__/packages/build-project/asset.txt @@ -0,0 +1 @@ +asset