diff --git a/packages/core/parcel-bundler/src/scope-hoisting/hoist.js b/packages/core/parcel-bundler/src/scope-hoisting/hoist.js index d9ebfca19cc..0a610c0d0e9 100644 --- a/packages/core/parcel-bundler/src/scope-hoisting/hoist.js +++ b/packages/core/parcel-bundler/src/scope-hoisting/hoist.js @@ -300,8 +300,9 @@ module.exports = { } if (t.isIdentifier(callee, {name: 'require'})) { + let source = args[0].value; // Ignore require calls that were ignored earlier. - if (!asset.dependencies.has(args[0].value)) { + if (!asset.dependencies.has(source)) { return; } @@ -316,9 +317,11 @@ module.exports = { p.isSequenceExpression() ); if (!parent.isProgram() || bail) { - asset.dependencies.get(args[0].value).shouldWrap = true; + asset.dependencies.get(source).shouldWrap = true; } + asset.cacheData.imports['$require$' + source] = [source, '*']; + // Generate a variable name based on the current asset id and the module name to require. // This will be replaced by the final variable name of the resolved asset in the packager. path.replaceWith( diff --git a/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/a.js b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/a.js new file mode 100644 index 00000000000..20a695d7239 --- /dev/null +++ b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/a.js @@ -0,0 +1 @@ +output = require('bar').foo(3) diff --git a/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/bar.js b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/bar.js new file mode 100644 index 00000000000..dca7bebf277 --- /dev/null +++ b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/bar.js @@ -0,0 +1,3 @@ +export default function bar() { + return 2; +} diff --git a/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/foo.js b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/foo.js new file mode 100644 index 00000000000..36b0b344468 --- /dev/null +++ b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/foo.js @@ -0,0 +1,3 @@ +export default function foo(a) { + return a * a; +} diff --git a/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/index.js b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/index.js new file mode 100644 index 00000000000..f9e940c9f6a --- /dev/null +++ b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/index.js @@ -0,0 +1,2 @@ +export foo from './foo'; +export bar from './bar'; diff --git a/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/package.json b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/package.json new file mode 100644 index 00000000000..1ea9bea7dfa --- /dev/null +++ b/packages/core/parcel-bundler/test/integration/scope-hoisting/commonjs/side-effects-false/node_modules/bar/package.json @@ -0,0 +1,4 @@ +{ + "name": "bar", + "sideEffects": false +} diff --git a/packages/core/parcel-bundler/test/scope-hoisting.js b/packages/core/parcel-bundler/test/scope-hoisting.js index 1815b333eaa..d7c6b323cfc 100644 --- a/packages/core/parcel-bundler/test/scope-hoisting.js +++ b/packages/core/parcel-bundler/test/scope-hoisting.js @@ -832,5 +832,15 @@ describe('scope hoisting', function() { let output = await run(b); assert.deepEqual(output, 3); }); + + it('should support sideEffects: false', async function() { + let b = await bundle( + __dirname + + '/integration/scope-hoisting/commonjs/side-effects-false/a.js' + ); + + let output = await run(b); + assert.deepEqual(output, 9); + }); }); });