Skip to content

Commit d2a0343

Browse files
authored
fix: optimize nested index-only deps (#282)
1 parent 25de38c commit d2a0343

File tree

9 files changed

+88
-26
lines changed

9 files changed

+88
-26
lines changed

.changeset/gold-drinks-peel.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+
Optimize nested index-only dependencies
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = 'foo';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"version": "1.0.0",
3+
"private": true,
4+
"name": "e2e-test-dep-index-only",
5+
"files": [
6+
"index.js"
7+
]
8+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export function foo(): string;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"version": "1.0.0",
3+
"private": true,
4+
"name": "e2e-test-dep-types-only",
5+
"types": "./index.d.ts",
6+
"files": [
7+
"index.d.ts"
8+
]
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "e2e-tests-dependencies",
3+
"description": "Used by dependencies.spec.ts",
4+
"private": true,
5+
"version": "0.0.0",
6+
"dependencies": {
7+
"e2e-test-dep-cjs-and-esm": "workspace:*",
8+
"e2e-test-dep-cjs-only": "workspace:*",
9+
"e2e-test-dep-esm-only": "workspace:*",
10+
"e2e-test-dep-index-only": "workspace:*",
11+
"e2e-test-dep-scss-only": "workspace:*"
12+
}
13+
}

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
import { findRootSvelteDependencies } from '../dependencies';
1+
import { findRootSvelteDependencies, needsOptimization } from '../dependencies';
22
import * as path from 'path';
3+
import { createRequire } from 'module';
34

45
describe('dependencies', () => {
56
describe('findRootSvelteDependencies', () => {
6-
it('should find svelte dependencies in packages/e2e-test/hmr', async () => {
7+
it('should find svelte dependencies in packages/e2e-test/hmr', () => {
78
const deps = findRootSvelteDependencies(path.resolve('packages/e2e-tests/hmr'));
89
expect(deps).toHaveLength(1);
910
expect(deps[0].name).toBe('e2e-test-dep-svelte-simple');
1011
expect(deps[0].path).toEqual([]);
1112
});
12-
it('should find nested svelte dependencies in packages/e2e-test/package-json-svelte-field', async () => {
13+
it('should find nested svelte dependencies in packages/e2e-test/package-json-svelte-field', () => {
1314
const deps = findRootSvelteDependencies(
1415
path.resolve('packages/e2e-tests/package-json-svelte-field')
1516
);
@@ -26,4 +27,14 @@ describe('dependencies', () => {
2627
expect(simple.path[0]).toBe('e2e-test-dep-svelte-nested');
2728
});
2829
});
30+
describe('needsOptimization', () => {
31+
it('should optimize cjs deps only', () => {
32+
const localRequire = createRequire(path.resolve('packages/e2e-tests/dependencies'));
33+
expect(needsOptimization('e2e-test-dep-cjs-and-esm', localRequire)).toBe(false);
34+
expect(needsOptimization('e2e-test-dep-cjs-only', localRequire)).toBe(true);
35+
expect(needsOptimization('e2e-test-dep-esm-only', localRequire)).toBe(false);
36+
expect(needsOptimization('e2e-test-dep-index-only', localRequire)).toBe(true);
37+
expect(needsOptimization('e2e-test-dep-types-only', localRequire)).toBe(false);
38+
});
39+
});
2940
});

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,12 +187,23 @@ export function needsOptimization(dep: string, localRequire: NodeRequire): boole
187187
const pkg = depData.pkg;
188188
// only optimize if is cjs, using the below as heuristic
189189
// see https://github.com/sveltejs/vite-plugin-svelte/issues/162
190-
const isCjs = pkg.main && !pkg.module && !pkg.exports;
191-
if (!isCjs) return false;
192-
// ensure entry is js so vite can prebundle it
193-
// see https://github.com/sveltejs/vite-plugin-svelte/issues/233
194-
const entryExt = path.extname(pkg.main);
195-
return !entryExt || entryExt === '.js' || entryExt === '.cjs';
190+
const hasEsmFields = pkg.module || pkg.exports;
191+
if (hasEsmFields) return false;
192+
if (pkg.main) {
193+
// ensure entry is js so vite can prebundle it
194+
// see https://github.com/sveltejs/vite-plugin-svelte/issues/233
195+
const entryExt = path.extname(pkg.main);
196+
return !entryExt || entryExt === '.js' || entryExt === '.cjs';
197+
} else {
198+
// check if has implicit index.js entrypoint
199+
// https://github.com/sveltejs/vite-plugin-svelte/issues/281
200+
try {
201+
localRequire.resolve(`${dep}/index.js`);
202+
return true;
203+
} catch {
204+
return false;
205+
}
206+
}
196207
}
197208

198209
interface DependencyData {

pnpm-lock.yaml

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

0 commit comments

Comments
 (0)