diff --git a/.changeset/lemon-trains-hear.md b/.changeset/lemon-trains-hear.md new file mode 100644 index 00000000..f2f34dfd --- /dev/null +++ b/.changeset/lemon-trains-hear.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/vite-plugin-svelte': minor +--- + +feat(config): dynamically extract list of svelte exports from peer dependency so that new exports work automatically" diff --git a/.changeset/old-ants-remain.md b/.changeset/old-ants-remain.md new file mode 100644 index 00000000..7cba89c4 --- /dev/null +++ b/.changeset/old-ants-remain.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/vite-plugin-svelte': patch +--- + +fix(optimizeDeps): avoid to optimise server only entrypoints of svelte that are never used on the client diff --git a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts index e70b72fd..3ae3c8b2 100644 --- a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts +++ b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts @@ -300,14 +300,15 @@ describe('kit-node', () => { 'e2e-test-dep-svelte-api-only', 'svelte/animate', 'svelte/easing', + 'svelte/events', 'svelte/internal', + 'svelte/internal/client', 'svelte/motion', + 'svelte/reactivity', 'svelte/store', 'svelte/transition', 'svelte', 'svelte/internal/disclose-version', - 'svelte/internal/server', - 'svelte/server', 'svelte/legacy', 'svelte-i18n > deepmerge', 'svelte-i18n > cli-color', @@ -326,8 +327,11 @@ describe('kit-node', () => { const expectedDedupe = [ 'svelte/animate', 'svelte/easing', + 'svelte/events', 'svelte/internal', + 'svelte/internal/client', 'svelte/motion', + 'svelte/reactivity', '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 533e0fae..9e251ea8 100644 --- a/packages/vite-plugin-svelte/src/utils/constants.js +++ b/packages/vite-plugin-svelte/src/utils/constants.js @@ -1,20 +1,24 @@ +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/store', - 'svelte/transition', - 'svelte/server', - 'svelte/internal/server', - 'svelte/legacy', - '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_EXPORT_CONDITIONS = ['svelte']; diff --git a/packages/vite-plugin-svelte/src/utils/options.js b/packages/vite-plugin-svelte/src/utils/options.js index 8343b3ea..8d890af5 100644 --- a/packages/vite-plugin-svelte/src/utils/options.js +++ b/packages/vite-plugin-svelte/src/utils/options.js @@ -553,7 +553,9 @@ function buildExtraConfigForSvelte(config) { /** @type {string[]} */ const exclude = []; if (!isDepExcluded('svelte', config.optimizeDeps?.exclude ?? [])) { - const svelteImportsToInclude = SVELTE_IMPORTS; + const svelteImportsToInclude = SVELTE_IMPORTS.filter( + (si) => !(si.endsWith('/server') || si.includes('/server/')) + ); log.debug( `adding bare svelte packages to optimizeDeps.include: ${svelteImportsToInclude.join(', ')} `, undefined,