From 4fd2e8fbda3574686ec7c03bbfc00e3d6d93de53 Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 25 Aug 2025 10:02:51 +0800 Subject: [PATCH 1/4] fix: allow preprocess plugin to run twice --- .changeset/eight-donkeys-count.md | 5 +++++ packages/vite-plugin-svelte/src/plugins/preprocess.js | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changeset/eight-donkeys-count.md 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/vite-plugin-svelte/src/plugins/preprocess.js b/packages/vite-plugin-svelte/src/plugins/preprocess.js index f6ba8ee39..540555904 100644 --- a/packages/vite-plugin-svelte/src/plugins/preprocess.js +++ b/packages/vite-plugin-svelte/src/plugins/preprocess.js @@ -22,7 +22,7 @@ export function preprocess(api) { let dependenciesCache; /** - * @type {import("../types/compile.d.ts").PreprocessSvelte} + * @type {import("../types/compile.d.ts").PreprocessSvelte | undefined} */ let preprocessSvelte; @@ -42,7 +42,7 @@ export function preprocess(api) { undefined, 'preprocess' ); - delete plugin.transform; + preprocessSvelte = undefined; } }, configureServer(server) { @@ -53,6 +53,9 @@ export function preprocess(api) { }, transform: { async handler(code, id) { + if (!preprocessSvelte) { + return; + } const ssr = this.environment.config.consumer === 'server'; const svelteRequest = api.idParser(id, ssr); if (!svelteRequest) { From 33b8a6c18d0594ff0e9921b1d00a0145e7831bb2 Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 25 Aug 2025 15:31:26 +0800 Subject: [PATCH 2/4] fix: set filter --- .../vite-plugin-svelte/src/plugins/preprocess.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/vite-plugin-svelte/src/plugins/preprocess.js b/packages/vite-plugin-svelte/src/plugins/preprocess.js index 540555904..1dfc3409a 100644 --- a/packages/vite-plugin-svelte/src/plugins/preprocess.js +++ b/packages/vite-plugin-svelte/src/plugins/preprocess.js @@ -22,7 +22,7 @@ export function preprocess(api) { let dependenciesCache; /** - * @type {import("../types/compile.d.ts").PreprocessSvelte | undefined} + * @type {import("../types/compile.d.ts").PreprocessSvelte} */ let preprocessSvelte; @@ -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' ); + // @ts-expect-error force set undefined to clear memory preprocessSvelte = undefined; + // @ts-expect-error defined below but filter not in type + plugin.transform.filter = /$./; // never match } }, configureServer(server) { @@ -53,9 +56,6 @@ export function preprocess(api) { }, transform: { async handler(code, id) { - if (!preprocessSvelte) { - return; - } const ssr = this.environment.config.consumer === 'server'; const svelteRequest = api.idParser(id, ssr); if (!svelteRequest) { From 9fee379c95b396114fcf76d4f31a8e56f3bf535c Mon Sep 17 00:00:00 2001 From: bluwy Date: Mon, 25 Aug 2025 15:47:17 +0800 Subject: [PATCH 3/4] chore: fix filter --- packages/vite-plugin-svelte/src/plugins/preprocess.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite-plugin-svelte/src/plugins/preprocess.js b/packages/vite-plugin-svelte/src/plugins/preprocess.js index 1dfc3409a..827885ea6 100644 --- a/packages/vite-plugin-svelte/src/plugins/preprocess.js +++ b/packages/vite-plugin-svelte/src/plugins/preprocess.js @@ -45,7 +45,7 @@ export function preprocess(api) { // @ts-expect-error force set undefined to clear memory preprocessSvelte = undefined; // @ts-expect-error defined below but filter not in type - plugin.transform.filter = /$./; // never match + plugin.transform.filter = { id: /$./ }; // never match } }, configureServer(server) { From 2b42f9b95d408188b435f99e66cd780146ac5d0b Mon Sep 17 00:00:00 2001 From: bluwy Date: Tue, 26 Aug 2025 13:52:00 +0800 Subject: [PATCH 4/4] chore: add test --- .../__tests__/build-multiple.spec.ts | 34 ++++++++++++++++++ packages/e2e-tests/build-multiple/index.html | 12 +++++++ .../e2e-tests/build-multiple/package.json | 16 +++++++++ .../build-multiple/public/favicon.png | Bin 0 -> 3127 bytes .../e2e-tests/build-multiple/src/App.svelte | 1 + .../e2e-tests/build-multiple/src/index.js | 3 ++ .../e2e-tests/build-multiple/vite.config.js | 6 ++++ pnpm-lock.yaml | 34 +++++++++--------- 8 files changed, 90 insertions(+), 16 deletions(-) create mode 100644 packages/e2e-tests/build-multiple/__tests__/build-multiple.spec.ts create mode 100644 packages/e2e-tests/build-multiple/index.html create mode 100644 packages/e2e-tests/build-multiple/package.json create mode 100644 packages/e2e-tests/build-multiple/public/favicon.png create mode 100644 packages/e2e-tests/build-multiple/src/App.svelte create mode 100644 packages/e2e-tests/build-multiple/src/index.js create mode 100644 packages/e2e-tests/build-multiple/vite.config.js 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 @@ + + + + + + + Svelte App + + + + + diff --git a/packages/e2e-tests/build-multiple/package.json b/packages/e2e-tests/build-multiple/package.json new file mode 100644 index 000000000..0aec74d4c --- /dev/null +++ b/packages/e2e-tests/build-multiple/package.json @@ -0,0 +1,16 @@ +{ + "name": "e2e-tests-build-multiple", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "workspace:^", + "svelte": "^5.38.2", + "vite": "^7.1.2" + } +} diff --git a/packages/e2e-tests/build-multiple/public/favicon.png b/packages/e2e-tests/build-multiple/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e6f5eb5a2f1f1c882d265cf479de25caa925645 GIT binary patch literal 3127 zcmV-749N3|P)i z7)}s4L53SJCkR}iVi00SFk;`MXX*#X*kkwKs@nFGS}c;=?XFjU|G$3t^5sjIVS2G+ zw)WGF83CpoGXhLGW(1gW%uV|X7>1P6VhCX=Ux)Lb!*DZ%@I3!{Gsf7d?gtIQ%nQiK z3%(LUSkBji;C5Rfgd6$VsF@H`Pk@xtY6t<>FNR-pD}=C~$?)9pdm3XZ36N5PNWYjb z$xd$yNQR9N!dfj-Vd@BwQo^FIIWPPmT&sZyQ$v81(sCBV=PGy{0wltEjB%~h157*t zvbe_!{=I_783x!0t1-r#-d{Y?ae$Q4N_Nd^Ui^@y(%)Gjou6y<3^XJdu{rmUf-Me?)zZ>9OR&6U5H*cK; z$gUlB{g0O4gN0sLSO|Of?hU(l?;h(jA3uH!Z{EBKuV23ouU@^Y6#%v+QG;>e*E}%?wlu-NT4DG zs)z)7WbLr)vGAu(ohrKc^em@OpO&f~6_>E61n_e0_V3@{U3^O;j{`^mNCJUj_>;7v zsMs6Hu3g7+@v+lSo;=yTYFqq}jZmQ-BK8K{C4kqi_i*jBaQE(Au0607V-zKeT;EPg zX(`vrn=L+e74+-Tqeok@_`tDa$G9I|$nTU5H*2V8@y()n*zqM?J1G!-1aX;CfDC9B zTnJ#j_%*n8Qb1)re*Bno7g0RG{Eb;IK14irJYJp$5Z6ac9~b_P?+5t~95~SRG$g?1 znFJ7p$xV&GZ18m~79TGRdfsc-BcX$9yXTR*n)mPD@1~O(_?cT$ZvFPucRmGlq&se0 zKrcUf^k}4hM*biEJOWKzz!qQe;CB_ZtSOO9Owg#lZAc=s65^rb{fZe(TYu_rk!wKkEf}RIt=#Om( zR8mN`DM<^xj~59euMMspBolVN zAPTr8sSDI104orIAdmL$uOXn*6hga1G+0WD0E?UtabxC#VC~vf3|10|phW;yQ3CY8 z2CM=)ErF;xq-YJ5G|um}>*1#E+O_Mu|Nr#qQ&G1P-NMq@f?@*XUcSbV?tX=)ilM-Q zBZP|!Bpv0V;#ojKcpc7$=eqO;#Uy~#?^kNI{vSZfLx&DEt~LTmaKWXcx=joubklI<*Aw z>LtMaQ7DR<1I2LkWvwyu#Rwn~;ezT}_g(@5l3h?W%-a86Y-t#O1PubP+z<%?V5D(U zy57A6{h+{?kOZp7&WKZR+=sznMJ}+Dnpo=C_0%R_x_t~J5T?E_{+))l5v1%52>)d-`iiZyx|5!%M2Fb2dU zW3~MwwpEH9Rhue+k$UIOoo($Ds!NbOyMR36fRHu;*15(YcA7siIZk#%JWz>P!qX1?IUojG&nKR>^gArBt2 zit(ETyZ=@V&7mv_Fi4bABcnwP+jzQuHcfU&BrAV91u-rFvEi7y-KnWsvHH=d2 zgAk(GKm_S8RcTJ>2N3~&Hbwp{Z3NF_Xeh}g4Eke)V&dY{W(3&b1j9t4yK_aYJisZZ{1rcU5- z;eD>K;ndPq&B-8yA_S0F!4ThA&{1{x)H<#?k9a#6Pc6L?V^s0``ynL&D;p(!Nmx`Y zFkHex{4p!Ggm^@DlehW}iHHVi}~u=$&N? z(NEBLQ#UxxAkdW>X9LnqUr#t4Lu0=9L8&o>JsqTtT5|%gb3QA~hr0pED71+iFFr)dZ=Q=E6ng{NE{Z~0)C?deO#?Aj zSDQ$z#TeC2T^|=}6GBo-&$;E{HL3!q3Z-szuf)O=G#zDjin4SSP%o%6+2IT#sLjQa ziyxFFz~LMjWY+_a5H!U6%a<=b7QVP^ z*90a62;bVq{?@)P6^DWd^Yilq4|YTV2Nw!Yu;a1lPI-sxR)rf@Fe5DhDP7FH zZZ%4S*1C30P;|O+jB!1;m|rXT90Sm5*RBbQN`PKu+hDD*S^yE(CdtSfg=z>u$cIj> zmode: {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/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