From 3fd8675e943e76103b46b386acc5862477205561 Mon Sep 17 00:00:00 2001 From: dominikg Date: Fri, 29 Mar 2024 22:22:47 +0100 Subject: [PATCH 1/2] fix: generate list of svelte exports to optimize and dedupe so it works for svelte4 and 5 --- .changeset/sweet-pianos-sit.md | 5 +++ .../e2e-tests/kit-node/__tests__/kit.spec.ts | 1 - .../vite-plugin-svelte/src/utils/constants.js | 41 +++++++++---------- .../vite-plugin-svelte/src/utils/options.js | 7 ++-- 4 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 .changeset/sweet-pianos-sit.md diff --git a/.changeset/sweet-pianos-sit.md b/.changeset/sweet-pianos-sit.md new file mode 100644 index 000000000..e491cfcd7 --- /dev/null +++ b/.changeset/sweet-pianos-sit.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/vite-plugin-svelte': patch +--- + +fix: dynamically generate list of svelte exports to optimize and dedupe diff --git a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts index 50638250a..6d4b3aac0 100644 --- a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts +++ b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts @@ -328,7 +328,6 @@ describe('kit-node', () => { 'svelte/easing', 'svelte/internal', 'svelte/motion', - 'svelte/ssr', 'svelte/store', 'svelte/transition', 'svelte', diff --git a/packages/vite-plugin-svelte/src/utils/constants.js b/packages/vite-plugin-svelte/src/utils/constants.js index 902dabef7..6b7768141 100644 --- a/packages/vite-plugin-svelte/src/utils/constants.js +++ b/packages/vite-plugin-svelte/src/utils/constants.js @@ -1,31 +1,30 @@ import { isSvelte5 } from './svelte-version.js'; +import { createRequire } from 'node:module'; export const VITE_RESOLVE_MAIN_FIELDS = ['browser', 'module', 'jsnext:main', 'jsnext']; export const SVELTE_RESOLVE_MAIN_FIELDS = ['svelte']; -export const SVELTE_IMPORTS = [ - 'svelte/animate', - 'svelte/easing', - 'svelte/internal', - 'svelte/internal/disclose-version', - 'svelte/motion', - 'svelte/ssr', - 'svelte/store', - 'svelte/transition', - 'svelte' -]; +export const SVELTE_IMPORTS = Object.entries( + createRequire(import.meta.url)('svelte/package.json').exports +) + .map(([name, config]) => { + // ignore type only + if (typeof config === 'object' && Object.keys(config).length === 1 && config.types) { + return ''; + } + // ignore names + if (name === './package.json' || name === './compiler') { + return ''; + } + return name.replace(/^\./, 'svelte'); + }) + .filter((s) => s.length > 0); -export const SVELTE_HMR_IMPORTS = [ - 'svelte-hmr/runtime/hot-api-esm.js', - 'svelte-hmr/runtime/proxy-adapter-dom.js', - 'svelte-hmr' -]; - -if (isSvelte5) { - SVELTE_IMPORTS.push('svelte/server', 'svelte/internal/server', 'svelte/legacy'); - SVELTE_HMR_IMPORTS.length = 0; // truncate, svelte-hmr isn't used with svelte5 -} +// svelte-hmr isn't used with svelte5 +export const SVELTE_HMR_IMPORTS = isSvelte5 + ? [] + : ['svelte-hmr/runtime/hot-api-esm.js', 'svelte-hmr/runtime/proxy-adapter-dom.js', 'svelte-hmr']; export const SVELTE_EXPORT_CONDITIONS = ['svelte']; diff --git a/packages/vite-plugin-svelte/src/utils/options.js b/packages/vite-plugin-svelte/src/utils/options.js index 139b00ab7..86cd98c2d 100644 --- a/packages/vite-plugin-svelte/src/utils/options.js +++ b/packages/vite-plugin-svelte/src/utils/options.js @@ -26,7 +26,7 @@ import { import { isCommonDepWithoutSvelteField } from './dependencies.js'; import { VitePluginSvelteStats } from './vite-plugin-svelte-stats.js'; import { VitePluginSvelteCache } from './vite-plugin-svelte-cache.js'; -import { isSvelte5 } from './svelte-version.js'; +import { isSvelte4, isSvelte5 } from './svelte-version.js'; const allowedPluginOptions = new Set([ 'include', @@ -581,7 +581,9 @@ function buildExtraConfigForSvelte(config) { const include = []; const exclude = ['svelte-hmr']; if (!isDepExcluded('svelte', config.optimizeDeps?.exclude ?? [])) { - const svelteImportsToInclude = SVELTE_IMPORTS.filter((x) => x !== 'svelte/ssr'); // not used on clientside + const svelteImportsToInclude = SVELTE_IMPORTS.filter( + (x) => isSvelte4 || !x.endsWith('/server') + ); // not used on clientside log.debug( `adding bare svelte packages to optimizeDeps.include: ${svelteImportsToInclude.join(', ')} `, undefined, @@ -600,7 +602,6 @@ function buildExtraConfigForSvelte(config) { /** @type {string[]} */ const external = []; // add svelte to ssr.noExternal unless it is present in ssr.external - // so we can resolve it with svelte/ssr if (!isDepExternaled('svelte', config.ssr?.external ?? [])) { noExternal.push('svelte', /^svelte\//); } From 50e33c35955ad4d0e4accb1deb5329e05815950d Mon Sep 17 00:00:00 2001 From: dominikg Date: Fri, 29 Mar 2024 22:30:22 +0100 Subject: [PATCH 2/2] fix: use svelte-hmr values only in svelte4 --- packages/vite-plugin-svelte/src/utils/constants.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/vite-plugin-svelte/src/utils/constants.js b/packages/vite-plugin-svelte/src/utils/constants.js index 6b7768141..8768c45d0 100644 --- a/packages/vite-plugin-svelte/src/utils/constants.js +++ b/packages/vite-plugin-svelte/src/utils/constants.js @@ -1,4 +1,4 @@ -import { isSvelte5 } from './svelte-version.js'; +import { isSvelte4 } from './svelte-version.js'; import { createRequire } from 'node:module'; export const VITE_RESOLVE_MAIN_FIELDS = ['browser', 'module', 'jsnext:main', 'jsnext']; @@ -22,9 +22,9 @@ export const SVELTE_IMPORTS = Object.entries( .filter((s) => s.length > 0); // svelte-hmr isn't used with svelte5 -export const SVELTE_HMR_IMPORTS = isSvelte5 - ? [] - : ['svelte-hmr/runtime/hot-api-esm.js', 'svelte-hmr/runtime/proxy-adapter-dom.js', 'svelte-hmr']; +export const SVELTE_HMR_IMPORTS = isSvelte4 + ? ['svelte-hmr/runtime/hot-api-esm.js', 'svelte-hmr/runtime/proxy-adapter-dom.js', 'svelte-hmr'] + : []; export const SVELTE_EXPORT_CONDITIONS = ['svelte'];