Skip to content

Commit 18afe15

Browse files
authored
fix(node-resolve): update side effects logic to be deep when glob doesn’t contain / (#1148)
* feat(node-resolve): deep side effects option * chore(node-resolve): Fixing linting errors * feat: deep side effects - prevent changes when side effects start with "./" || "/" * feat: support deep side effects by default - matching webpack implementation * chore(cleanup): pr feedback
1 parent 2115a00 commit 18afe15

File tree

12 files changed

+87
-1
lines changed

12 files changed

+87
-1
lines changed

packages/node-resolve/src/util.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,17 @@ export function getPackageInfo(options) {
144144
if (typeof packageSideEffects === 'boolean') {
145145
internalPackageInfo.hasModuleSideEffects = () => packageSideEffects;
146146
} else if (Array.isArray(packageSideEffects)) {
147-
internalPackageInfo.hasModuleSideEffects = createFilter(packageSideEffects, null, {
147+
const finalPackageSideEffects = packageSideEffects.map((sideEffect) => {
148+
/*
149+
* The array accepts simple glob patterns to the relevant files... Patterns like .css, which do not include a /, will be treated like **\/.css.
150+
* https://webpack.js.org/guides/tree-shaking/
151+
*/
152+
if (sideEffect.includes('/')) {
153+
return sideEffect;
154+
}
155+
return `**/${sideEffect}`;
156+
});
157+
internalPackageInfo.hasModuleSideEffects = createFilter(finalPackageSideEffects, null, {
148158
resolve: pkgRoot
149159
});
150160
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('deep side effect')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import './deep/side-effect.js'
2+
import './shallow-side-effect.js'
3+
4+
console.log('main')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"main": "./index.js",
3+
"sideEffects": ["./*.js"]
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('shallow side effect')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('deep side effect')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import './deep/side-effect.js'
2+
import './shallow-side-effect.js'
3+
4+
console.log('main')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"main": "./index.js",
3+
"sideEffects": ["*.js"]
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('shallow side effect')

packages/node-resolve/test/snapshots/test.js.md

+24
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,27 @@ Generated by [AVA](https://avajs.dev).
176176
Error {
177177
message: 'node-resolve: `customResolveOptions.packageIterator` is no longer an option. If you need this, please open an issue.',
178178
}
179+
180+
## respects the package.json sideEffects property for files in the root package and supports deep side effects
181+
182+
> Snapshot 1
183+
184+
`'use strict';␊
185+
186+
console.log('deep side effect');␊
187+
188+
console.log('shallow side effect');␊
189+
190+
console.log('main');␊
191+
`
192+
193+
## does not prefix the sideEffects property if the side effect contains a "/"
194+
195+
> Snapshot 1
196+
197+
`'use strict';␊
198+
199+
console.log('shallow side effect');␊
200+
201+
console.log('main');␊
202+
`
159 Bytes
Binary file not shown.

packages/node-resolve/test/test.js

+32
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,38 @@ test('respects the package.json sideEffects property for files in root package b
322322
t.snapshot(code);
323323
});
324324

325+
test('respects the package.json sideEffects property for files in the root package and supports deep side effects', async (t) => {
326+
const bundle = await rollup({
327+
input: 'deep-side-effects/index.js',
328+
onwarn: failOnWarn(t),
329+
plugins: [
330+
nodeResolve({
331+
rootDir: 'deep-side-effects'
332+
})
333+
]
334+
});
335+
const code = await getCode(bundle);
336+
t.true(code.includes('shallow side effect'));
337+
t.true(code.includes('deep side effect'));
338+
t.snapshot(code);
339+
});
340+
341+
test('does not prefix the sideEffects property if the side effect contains a "/"', async (t) => {
342+
const bundle = await rollup({
343+
input: 'deep-side-effects-with-specific-side-effects/index.js',
344+
onwarn: failOnWarn(t),
345+
plugins: [
346+
nodeResolve({
347+
rootDir: 'deep-side-effects-with-specific-side-effects'
348+
})
349+
]
350+
});
351+
const code = await getCode(bundle);
352+
t.true(code.includes('shallow side effect'));
353+
t.false(code.includes('deep side effects'));
354+
t.snapshot(code);
355+
});
356+
325357
test('ignores the package.json sideEffects property for files in root package with "ignoreSideEffectsForRoot" option', async (t) => {
326358
const bundle = await rollup({
327359
input: 'root-package-side-effect/index.js',

0 commit comments

Comments
 (0)