diff --git a/.changeset/old-peaches-refuse.md b/.changeset/old-peaches-refuse.md new file mode 100644 index 000000000..471bc56d9 --- /dev/null +++ b/.changeset/old-peaches-refuse.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/vite-plugin-svelte': patch +--- + +fix: crawl local workspace private packages devDependencies for generating vite config ssr.noExternal diff --git a/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/package.json b/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/package.json new file mode 100644 index 000000000..252ddd145 --- /dev/null +++ b/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/package.json @@ -0,0 +1,24 @@ +{ + "version": "1.0.0", + "private": true, + "name": "e2e-test-dep-svelte-nested-workspace-devdep", + "svelte": "src/index.js", + "main": "src/index.js", + "type": "module", + "files": [ + "src" + ], + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "svelte": "./src/index.js" + } + } + }, + "devDependencies": { + "e2e-test-dep-svelte-simple": "file:../svelte-simple", + "e2e-test-dep-cjs-and-esm": "file:../cjs-and-esm", + "e2e-test-dep-scss-only": "file:../scss-only" + } +} diff --git a/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/src/components/Message.svelte b/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/src/components/Message.svelte new file mode 100644 index 000000000..7b874298e --- /dev/null +++ b/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/src/components/Message.svelte @@ -0,0 +1,9 @@ + + +
{message}
+
{cjs_and_esm()}
diff --git a/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/src/index.js b/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/src/index.js new file mode 100644 index 000000000..15a396fe5 --- /dev/null +++ b/packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep/src/index.js @@ -0,0 +1,2 @@ +import Message from './components/Message.svelte'; +export { Message }; diff --git a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts index 7e57ad2de..46a99f043 100644 --- a/packages/e2e-tests/kit-node/__tests__/kit.spec.ts +++ b/packages/e2e-tests/kit-node/__tests__/kit.spec.ts @@ -292,7 +292,10 @@ describe('kit-node', () => { 'cli-color', 'tiny-glob', 'cookie', - 'set-cookie-parser' + 'set-cookie-parser', + 'e2e-test-dep-cjs-and-esm', + 'e2e-test-dep-cjs-only', + 'e2e-test-dep-scss-only' ] : [], `ssr.external in ${filename}` @@ -307,13 +310,22 @@ describe('kit-node', () => { 'esm-env', // first added by svelte-kit 'esm-env', // second added by vite-plugin-svelte '@sveltejs/kit', - '@sveltejs/adapter-node' + '@sveltejs/adapter-node', + 'e2e-test-dep-svelte-nested-workspace-devdep', + 'e2e-test-dep-svelte-simple' ], `ssr.noExternal in ${filename}` ); + const expectedExcludes = ['@sveltejs/kit', '$app', '$env']; + if (!isServe) { + expectedExcludes.push( + 'e2e-test-dep-svelte-nested-workspace-devdep', + 'e2e-test-dep-svelte-simple' + ); + } expectArrayEqual( config.optimizeDeps.exclude, - ['@sveltejs/kit', '$app', '$env'], + expectedExcludes, `optimizeDeps.exclude in ${filename}` ); let expectedIncludes = [ @@ -345,6 +357,12 @@ describe('kit-node', () => { (item) => !(isServe && item.startsWith('svelte-i18n >')) ); + if (!isServe) { + expectedIncludes.push( + 'e2e-test-dep-svelte-nested-workspace-devdep > e2e-test-dep-svelte-simple > e2e-test-dep-cjs-only' + ); + } + expectArrayEqual( config.optimizeDeps.include, expectedIncludes, diff --git a/packages/e2e-tests/kit-node/package.json b/packages/e2e-tests/kit-node/package.json index a9cfcb7bf..d57833f1f 100644 --- a/packages/e2e-tests/kit-node/package.json +++ b/packages/e2e-tests/kit-node/package.json @@ -17,6 +17,7 @@ "@sveltejs/vite-plugin-svelte": "workspace:^", "e2e-test-dep-svelte-api-only": "file:../_test_dependencies/svelte-api-only", "e2e-test-dep-vite-plugins": "file:../_test_dependencies/vite-plugins", + "e2e-test-dep-svelte-nested-workspace-devdep": "../_test_dependencies/svelte-nested-workspace-devdep", "svelte": "^5.34.9", "svelte-check": "^4.2.2", "svelte-i18n": "^4.0.1", diff --git a/packages/vite-plugin-svelte/package.json b/packages/vite-plugin-svelte/package.json index 1a4a8c8fa..2a3cfdf55 100644 --- a/packages/vite-plugin-svelte/package.json +++ b/packages/vite-plugin-svelte/package.json @@ -44,7 +44,7 @@ "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", - "vitefu": "^1.0.7" + "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", diff --git a/packages/vite-plugin-svelte/src/utils/options.js b/packages/vite-plugin-svelte/src/utils/options.js index 39a4a6bc0..a0ad82c84 100644 --- a/packages/vite-plugin-svelte/src/utils/options.js +++ b/packages/vite-plugin-svelte/src/utils/options.js @@ -5,7 +5,8 @@ const { defaultServerMainFields, defaultClientConditions, defaultServerConditions, - normalizePath + normalizePath, + searchForWorkspaceRoot } = vite; import { log } from './log.js'; import { loadSvelteConfig } from './load-svelte-config.js'; @@ -429,6 +430,7 @@ async function buildExtraConfigForDependencies(options, config) { const packagesWithoutSvelteExportsCondition = new Set(); const depsConfig = await crawlFrameworkPkgs({ root: options.root, + workspaceRoot: searchForWorkspaceRoot(options.root), isBuild: options.isBuild, viteUserConfig: config, isFrameworkPkgByJson(pkgJson) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de7182ad6..4d880a50b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -179,6 +179,18 @@ importers: specifier: file:../svelte-simple version: file:packages/e2e-tests/_test_dependencies/svelte-simple + packages/e2e-tests/_test_dependencies/svelte-nested-workspace-devdep: + devDependencies: + e2e-test-dep-cjs-and-esm: + specifier: file:../cjs-and-esm + version: file:packages/e2e-tests/_test_dependencies/cjs-and-esm + e2e-test-dep-scss-only: + specifier: file:../scss-only + version: file:packages/e2e-tests/_test_dependencies/scss-only + e2e-test-dep-svelte-simple: + specifier: file:../svelte-simple + version: file:packages/e2e-tests/_test_dependencies/svelte-simple + packages/e2e-tests/_test_dependencies/svelte-simple: dependencies: e2e-test-dep-cjs-only: @@ -417,6 +429,9 @@ importers: e2e-test-dep-svelte-api-only: specifier: file:../_test_dependencies/svelte-api-only version: file:packages/e2e-tests/_test_dependencies/svelte-api-only + e2e-test-dep-svelte-nested-workspace-devdep: + specifier: ../_test_dependencies/svelte-nested-workspace-devdep + version: link:../_test_dependencies/svelte-nested-workspace-devdep e2e-test-dep-vite-plugins: specifier: file:../_test_dependencies/vite-plugins version: file:packages/e2e-tests/_test_dependencies/vite-plugins @@ -643,8 +658,8 @@ importers: specifier: ^0.30.17 version: 0.30.17 vitefu: - specifier: ^1.0.7 - version: 1.0.7(vite@7.0.0(@types/node@22.15.34)(sass@1.89.2)(stylus@0.64.0)(yaml@2.8.0)) + specifier: ^1.1.1 + version: 1.1.1(vite@7.0.0(@types/node@22.15.34)(sass@1.89.2)(stylus@0.64.0)(yaml@2.8.0)) devDependencies: '@types/debug': specifier: ^4.1.12 @@ -3402,6 +3417,14 @@ packages: vite: optional: true + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^7.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -6255,6 +6278,10 @@ snapshots: optionalDependencies: vite: 7.0.0(@types/node@22.15.34)(sass@1.89.2)(stylus@0.64.0)(yaml@2.8.0) + vitefu@1.1.1(vite@7.0.0(@types/node@22.15.34)(sass@1.89.2)(stylus@0.64.0)(yaml@2.8.0)): + optionalDependencies: + vite: 7.0.0(@types/node@22.15.34)(sass@1.89.2)(stylus@0.64.0)(yaml@2.8.0) + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.2)(jsdom@26.1.0)(sass@1.89.2)(stylus@0.64.0)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2