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