Skip to content

Commit 7359d1f

Browse files
authored
feat(node-resolve): add ignoreSideEffectsForRoot option (#694)
* add test for root package side effect import with package sideEffect option * ignore package `sideEffects` property for root package * remove package name * add `ignoreSideEffectsForRoot` option * make test fixture a bit more accurate
1 parent f29cee8 commit 7359d1f

File tree

10 files changed

+96
-16
lines changed

10 files changed

+96
-16
lines changed

packages/node-resolve/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,10 @@ Specifies the root directory from which to resolve modules. Typically used when
157157
rootDir: path.join(process.cwd(), '..')
158158
```
159159

160+
## `ignoreSideEffectsForRoot`
161+
162+
If you use the `sideEffects` property in the package.json, by default this is respected for files in the root package. Set to `true` to ignore the `sideEffects` configuration for the root package.
163+
160164
## Preserving symlinks
161165

162166
This plugin honours the rollup [`preserveSymlinks`](https://rollupjs.org/guide/en/#preservesymlinks) option.

packages/node-resolve/src/index.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,16 @@ const defaults = {
3434
// which deploy both ESM .mjs and CommonJS .js files as ESM.
3535
extensions: ['.mjs', '.js', '.json', '.node'],
3636
resolveOnly: [],
37-
moduleDirectories: ['node_modules']
37+
moduleDirectories: ['node_modules'],
38+
ignoreSideEffectsForRoot: false
3839
};
3940
export const DEFAULTS = deepFreeze(deepMerge({}, defaults));
4041

4142
export function nodeResolve(opts = {}) {
4243
const { warnings } = handleDeprecatedOptions(opts);
4344

4445
const options = { ...defaults, ...opts };
45-
const { extensions, jail, moduleDirectories } = options;
46+
const { extensions, jail, moduleDirectories, ignoreSideEffectsForRoot } = options;
4647
const conditionsEsm = [...baseConditionsEsm, ...(options.exportConditions || [])];
4748
const conditionsCjs = [...baseConditionsCjs, ...(options.exportConditions || [])];
4849
const packageInfoCache = new Map();
@@ -51,7 +52,7 @@ export function nodeResolve(opts = {}) {
5152
const useBrowserOverrides = mainFields.indexOf('browser') !== -1;
5253
const isPreferBuiltinsSet = options.preferBuiltins === true || options.preferBuiltins === false;
5354
const preferBuiltins = isPreferBuiltinsSet ? options.preferBuiltins : true;
54-
const rootDir = options.rootDir || process.cwd();
55+
const rootDir = resolve(options.rootDir || process.cwd());
5556
let { dedupe } = options;
5657
let rollupOptions;
5758

@@ -200,7 +201,9 @@ export function nodeResolve(opts = {}) {
200201
preserveSymlinks,
201202
useBrowserOverrides,
202203
baseDir,
203-
moduleDirectories
204+
moduleDirectories,
205+
rootDir,
206+
ignoreSideEffectsForRoot
204207
});
205208

206209
const resolved =

packages/node-resolve/src/resolveImportSpecifiers.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ async function resolveId({
4343
preserveSymlinks,
4444
useBrowserOverrides,
4545
baseDir,
46-
moduleDirectories
46+
moduleDirectories,
47+
rootDir,
48+
ignoreSideEffectsForRoot
4749
}) {
4850
let hasModuleSideEffects = () => null;
4951
let hasPackageEntry = true;
@@ -58,7 +60,9 @@ async function resolveId({
5860
pkgPath,
5961
mainFields,
6062
preserveSymlinks,
61-
useBrowserOverrides
63+
useBrowserOverrides,
64+
rootDir,
65+
ignoreSideEffectsForRoot
6266
});
6367

6468
({ packageInfo, hasModuleSideEffects, hasPackageEntry, packageBrowserField } = info);
@@ -180,7 +184,9 @@ export default async function resolveImportSpecifiers({
180184
preserveSymlinks,
181185
useBrowserOverrides,
182186
baseDir,
183-
moduleDirectories
187+
moduleDirectories,
188+
rootDir,
189+
ignoreSideEffectsForRoot
184190
}) {
185191
let lastResolveError;
186192

@@ -197,7 +203,9 @@ export default async function resolveImportSpecifiers({
197203
preserveSymlinks,
198204
useBrowserOverrides,
199205
baseDir,
200-
moduleDirectories
206+
moduleDirectories,
207+
rootDir,
208+
ignoreSideEffectsForRoot
201209
});
202210

203211
if (result instanceof ResolveError) {

packages/node-resolve/src/util.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,16 @@ export function getMainFields(options) {
4040
}
4141

4242
export function getPackageInfo(options) {
43-
const { cache, extensions, pkg, mainFields, preserveSymlinks, useBrowserOverrides } = options;
43+
const {
44+
cache,
45+
extensions,
46+
pkg,
47+
mainFields,
48+
preserveSymlinks,
49+
useBrowserOverrides,
50+
rootDir,
51+
ignoreSideEffectsForRoot
52+
} = options;
4453
let { pkgPath } = options;
4554

4655
if (cache.has(pkgPath)) {
@@ -130,13 +139,15 @@ export function getPackageInfo(options) {
130139
packageInfo.browserMappedMain = false;
131140
}
132141

133-
const packageSideEffects = pkg.sideEffects;
134-
if (typeof packageSideEffects === 'boolean') {
135-
internalPackageInfo.hasModuleSideEffects = () => packageSideEffects;
136-
} else if (Array.isArray(packageSideEffects)) {
137-
internalPackageInfo.hasModuleSideEffects = createFilter(packageSideEffects, null, {
138-
resolve: pkgRoot
139-
});
142+
if (!ignoreSideEffectsForRoot || rootDir !== pkgRoot) {
143+
const packageSideEffects = pkg.sideEffects;
144+
if (typeof packageSideEffects === 'boolean') {
145+
internalPackageInfo.hasModuleSideEffects = () => packageSideEffects;
146+
} else if (Array.isArray(packageSideEffects)) {
147+
internalPackageInfo.hasModuleSideEffects = createFilter(packageSideEffects, null, {
148+
resolve: pkgRoot
149+
});
150+
}
140151
}
141152

142153
cache.set(pkgPath, internalPackageInfo);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import './side-effect.js';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"main": "./index.js",
3+
"sideEffects": false
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('side effect');

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,23 @@ Generated by [AVA](https://avajs.dev).
4747
},
4848
]
4949

50+
## ignores the package.json sideEffects property for files in root package with "ignoreSideEffectsForRoot" option
51+
52+
> Snapshot 1
53+
54+
`'use strict';␊
55+
56+
console.log('side effect');␊
57+
`
58+
59+
## respects the package.json sideEffects property for files in root package by default
60+
61+
> Snapshot 1
62+
63+
`'use strict';␊
64+
65+
`
66+
5067
## throws error for removed customResolveOptions.basedir option
5168

5269
> Snapshot 1
89 Bytes
Binary file not shown.

packages/node-resolve/test/test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,37 @@ test('resolves dynamic imports', async (t) => {
246246
t.is(result.default, 42);
247247
});
248248

249+
test('respects the package.json sideEffects property for files in root package by default', async (t) => {
250+
const bundle = await rollup({
251+
input: 'root-package-side-effect/index.js',
252+
plugins: [
253+
nodeResolve({
254+
rootDir: 'root-package-side-effect'
255+
})
256+
]
257+
});
258+
259+
const code = await getCode(bundle);
260+
t.false(code.includes('side effect'));
261+
t.snapshot(code);
262+
});
263+
264+
test('ignores the package.json sideEffects property for files in root package with "ignoreSideEffectsForRoot" option', async (t) => {
265+
const bundle = await rollup({
266+
input: 'root-package-side-effect/index.js',
267+
plugins: [
268+
nodeResolve({
269+
rootDir: 'root-package-side-effect',
270+
ignoreSideEffectsForRoot: true
271+
})
272+
]
273+
});
274+
275+
const code = await getCode(bundle);
276+
t.true(code.includes('side effect'));
277+
t.snapshot(code);
278+
});
279+
249280
test('handles package side-effects', async (t) => {
250281
const bundle = await rollup({
251282
input: 'side-effects.js',

0 commit comments

Comments
 (0)