Skip to content

Commit adccb23

Browse files
authored
fix: add svelte lib without components to noExternal (#166)
* chore: add test * fix: add svelte lib without components to noExternal * chore: update test * chore: add changeset * perf(dependencies): better svelte lib check
1 parent abc0233 commit adccb23

File tree

9 files changed

+65
-7
lines changed

9 files changed

+65
-7
lines changed

.changeset/modern-horses-reply.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/vite-plugin-svelte': patch
3+
---
4+
5+
Svelte libraries without any Svelte components are also added to ssr.noExternal

packages/e2e-tests/_test_dependencies/esm-only/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"module": "index.js",
77
"files": [
88
"package.json",
9-
"index.cjs"
9+
"index.js"
1010
],
1111
"exports":{
1212
".": {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { setContext } from 'svelte';
2+
3+
export function setSomeContext() {
4+
setContext('svelte-api-only', true);
5+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"version": "1.0.0",
3+
"private": true,
4+
"name": "e2e-test-dep-svelte-api-only",
5+
"main": "index.js",
6+
"module": "index.js",
7+
"files": [
8+
"package.json",
9+
"index.js"
10+
],
11+
"exports":{
12+
".": {
13+
"import": "./index.js"
14+
},
15+
"./package.json": "./package.json"
16+
},
17+
"type": "module"
18+
}

packages/e2e-tests/kit-node/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"devDependencies": {
1111
"@sveltejs/adapter-node": "^1.0.0-next.46",
1212
"@sveltejs/kit": "^1.0.0-next.165",
13+
"e2e-test-dep-svelte-api-only": "workspace:*",
1314
"svelte": "^3.42.4"
1415
},
1516
"type": "module",

packages/e2e-tests/kit-node/src/routes/index.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
import Counter from '$lib/Counter.svelte';
2323
// eslint-disable-next-line node/no-missing-import
2424
import Child from '$lib/Child.svelte';
25+
import { setSomeContext } from 'e2e-test-dep-svelte-api-only';
2526
export let load_status = 'NOT_LOADED';
2627
let mount_status = 'BEFORE_MOUNT';
2728
onMount(async () => {
2829
const isSSR = (await import('../client-only-module.js')).default;
2930
console.log(`onMount dynamic imported isSSR: ${isSSR}`);
3031
mount_status = 'AFTER_MOUNT';
3132
});
33+
setSomeContext();
3234
</script>
3335

3436
<main>

packages/vite-plugin-svelte/src/utils/dependencies.ts

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,13 @@ function getSvelteDependencies(
4040
const localRequire = createRequire(`${pkgDir}/package.json`);
4141
const resolvedDeps = deps
4242
.map((dep) => resolveDependencyData(dep, localRequire))
43-
.filter((depData) => !!depData && isSvelte(depData.pkg)) as DependencyData[];
44-
// @ts-ignore
43+
.filter(Boolean) as DependencyData[];
4544
for (const { pkg, dir } of resolvedDeps) {
46-
result.push({ name: pkg.name, pkg, dir, path });
47-
if (pkg.dependencies) {
45+
const type = getSvelteDependencyType(pkg);
46+
if (!type) continue;
47+
result.push({ name: pkg.name, type, pkg, dir, path });
48+
// continue crawling for component libraries so we can optimize them, js libraries are fine
49+
if (type === 'component-library' && pkg.dependencies) {
4850
let dependencyNames = Object.keys(pkg.dependencies);
4951
const circular = dependencyNames.filter((name) => path.includes(name));
5052
if (circular.length > 0) {
@@ -102,10 +104,24 @@ function parsePkg(dir: string, silent = false): Pkg | void {
102104
}
103105
}
104106

105-
function isSvelte(pkg: Pkg) {
107+
function getSvelteDependencyType(pkg: Pkg): SvelteDependencyType | undefined {
108+
if (isSvelteComponentLib(pkg)) {
109+
return 'component-library';
110+
} else if (isSvelteLib(pkg)) {
111+
return 'js-library';
112+
} else {
113+
return undefined;
114+
}
115+
}
116+
117+
function isSvelteComponentLib(pkg: Pkg) {
106118
return !!pkg.svelte;
107119
}
108120

121+
function isSvelteLib(pkg: Pkg) {
122+
return !!pkg.dependencies?.svelte || !!pkg.peerDependencies?.svelte;
123+
}
124+
109125
const COMMON_DEPENDENCIES_WITHOUT_SVELTE_FIELD = [
110126
'@lukeed/uuid',
111127
'@sveltejs/vite-plugin-svelte',
@@ -178,16 +194,22 @@ interface DependencyData {
178194

179195
export interface SvelteDependency {
180196
name: string;
197+
type: SvelteDependencyType;
181198
dir: string;
182199
pkg: Pkg;
183200
path: string[];
184201
}
185202

203+
// component-library => exports svelte components
204+
// js-library => only uses svelte api, no components
205+
export type SvelteDependencyType = 'component-library' | 'js-library';
206+
186207
export interface Pkg {
187208
name: string;
188209
svelte?: string;
189210
dependencies?: DependencyList;
190211
devDependencies?: DependencyList;
212+
peerDependencies?: DependencyList;
191213
[key: string]: any;
192214
}
193215

packages/vite-plugin-svelte/src/utils/options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export function buildExtraViteConfig(
199199

200200
if (configEnv.command === 'serve') {
201201
extraViteConfig.optimizeDeps = buildOptimizeDepsForSvelte(
202-
svelteDeps,
202+
svelteDeps.filter((dep) => dep.type === 'component-library'),
203203
options,
204204
config.optimizeDeps
205205
);

pnpm-lock.yaml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)