diff --git a/.changeset/eight-donkeys-count.md b/.changeset/eight-donkeys-count.md new file mode 100644 index 000000000..6de834b04 --- /dev/null +++ b/.changeset/eight-donkeys-count.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/vite-plugin-svelte': patch +--- + +fix: allow preprocess plugin to run twice diff --git a/packages/e2e-tests/build-multiple/__tests__/build-multiple.spec.ts b/packages/e2e-tests/build-multiple/__tests__/build-multiple.spec.ts new file mode 100644 index 000000000..f931dbdfe --- /dev/null +++ b/packages/e2e-tests/build-multiple/__tests__/build-multiple.spec.ts @@ -0,0 +1,34 @@ +import { fileURLToPath } from 'node:url'; +import { build, type Rollup, type InlineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; +import { isBuild } from '~utils'; + +test.runIf(isBuild)('build-multiple', async () => { + const sharedConfig: InlineConfig = { + configFile: false, + root: fileURLToPath(new URL('../', import.meta.url)), + build: { + write: false + }, + logLevel: 'silent', + plugins: [svelte()] + }; + + // Ensure two builds work as expected and have no build errors + + const output1 = await build({ ...sharedConfig, mode: 'production' }); + expect(output1).toHaveProperty('output'); + expect( + (output1 as Rollup.RollupOutput).output.find( + (c) => c.type === 'chunk' && c.code.includes('mode: production') + ) + ).toBeDefined(); + + const output2 = await build({ ...sharedConfig, mode: 'staging' }); + expect(output2).toHaveProperty('output'); + expect( + (output2 as Rollup.RollupOutput).output.find( + (c) => c.type === 'chunk' && c.code.includes('mode: staging') + ) + ).toBeDefined(); +}); diff --git a/packages/e2e-tests/build-multiple/index.html b/packages/e2e-tests/build-multiple/index.html new file mode 100644 index 000000000..5203079ba --- /dev/null +++ b/packages/e2e-tests/build-multiple/index.html @@ -0,0 +1,12 @@ + + +
+ + + +mode: {import.meta.env.MODE}
diff --git a/packages/e2e-tests/build-multiple/src/index.js b/packages/e2e-tests/build-multiple/src/index.js new file mode 100644 index 000000000..071c75dc7 --- /dev/null +++ b/packages/e2e-tests/build-multiple/src/index.js @@ -0,0 +1,3 @@ +import App from './App.svelte'; +import { mount } from 'svelte'; +mount(App, { target: document.body }); diff --git a/packages/e2e-tests/build-multiple/vite.config.js b/packages/e2e-tests/build-multiple/vite.config.js new file mode 100644 index 000000000..1823770c4 --- /dev/null +++ b/packages/e2e-tests/build-multiple/vite.config.js @@ -0,0 +1,6 @@ +import { svelte } from '@sveltejs/vite-plugin-svelte'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [svelte()] +}); diff --git a/packages/vite-plugin-svelte/src/plugins/preprocess.js b/packages/vite-plugin-svelte/src/plugins/preprocess.js index f6ba8ee39..827885ea6 100644 --- a/packages/vite-plugin-svelte/src/plugins/preprocess.js +++ b/packages/vite-plugin-svelte/src/plugins/preprocess.js @@ -31,18 +31,21 @@ export function preprocess(api) { name: 'vite-plugin-svelte:preprocess', enforce: 'pre', configResolved(c) { - //@ts-expect-error defined below but filter not in type - plugin.transform.filter = api.filter; options = api.options; if (arraify(options.preprocess).length > 0) { preprocessSvelte = createPreprocessSvelte(options, c); + // @ts-expect-error defined below but filter not in type + plugin.transform.filter = api.filter; } else { log.debug( `disabling ${plugin.name} because no preprocessor is configured`, undefined, 'preprocess' ); - delete plugin.transform; + // @ts-expect-error force set undefined to clear memory + preprocessSvelte = undefined; + // @ts-expect-error defined below but filter not in type + plugin.transform.filter = { id: /$./ }; // never match } }, configureServer(server) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b0af5313..fbae112df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -234,6 +234,18 @@ importers: specifier: ^7.1.2 version: 7.1.2(@types/node@22.17.2)(sass@1.90.0)(stylus@0.64.0)(yaml@2.8.1) + packages/e2e-tests/build-multiple: + devDependencies: + '@sveltejs/vite-plugin-svelte': + specifier: workspace:^ + version: link:../../vite-plugin-svelte + svelte: + specifier: ^5.38.2 + version: 5.38.2 + vite: + specifier: ^7.1.2 + version: 7.1.2(@types/node@22.17.2)(sass@1.90.0)(stylus@0.64.0)(yaml@2.8.1) + packages/e2e-tests/build-watch: dependencies: e2e-test-dep-svelte-simple: @@ -257,7 +269,7 @@ importers: version: 7.1.2(@types/node@22.17.2)(sass@1.90.0)(stylus@0.64.0)(yaml@2.8.1) vite-plugin-inspect: specifier: /home/dominikg/develop/vite-plugin-inspect - version: link:../../../../../../../../../home/dominikg/develop/vite-plugin-inspect + version: link:../../../../../../../../home/dominikg/develop/vite-plugin-inspect packages/e2e-tests/configfile-custom: dependencies: @@ -2836,10 +2848,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -5062,10 +5070,6 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.6(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -5545,7 +5549,7 @@ snapshots: ansi-styles: 6.2.1 cross-spawn: 7.0.6 memorystream: 0.3.1 - picomatch: 4.0.2 + picomatch: 4.0.3 pidtree: 0.6.0 read-package-json-fast: 4.0.0 shell-quote: 1.8.2 @@ -5657,8 +5661,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -6026,8 +6028,8 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.1.1: {} @@ -6216,7 +6218,7 @@ snapshots: expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 @@ -6259,7 +6261,7 @@ snapshots: expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2