diff --git a/packages/core/integration-tests/test/library-bundler.js b/packages/core/integration-tests/test/library-bundler.js index d939dec0daa..61cf8941199 100644 --- a/packages/core/integration-tests/test/library-bundler.js +++ b/packages/core/integration-tests/test/library-bundler.js @@ -578,4 +578,51 @@ describe('library bundler', function () { assert(!contents.includes('../')); } }); + + it('should support export default in CJS', async () => { + await fsFixture(overlayFS, dir)` + yarn.lock: + + .parcelrc: + { + "extends": "@parcel/config-default", + "bundler": "@parcel/bundler-library" + } + + package.json: + { + "module": "dist/module.js", + "main": "dist/main.js", + "engines": { "node": "*" } + } + + index.js: + import foo from './foo'; + export function test() { + return 'test:' + foo(); + } + + foo.js: + export default function foo() { + return 'foo'; + } + `; + + let b = await bundle(dir + '/index.js', { + inputFS: overlayFS, + mode: 'production', + }); + + let esm: any = await runBundle( + b, + nullthrows(b.getBundles().find(b => b.name === 'module.js')), + ); + assert.equal(esm.test(), 'test:foo'); + + let cjs: any = await runBundle( + b, + nullthrows(b.getBundles().find(b => b.name === 'main.js')), + ); + assert.equal(cjs.test(), 'test:foo'); + }); }); diff --git a/packages/packagers/js/src/ScopeHoistingPackager.js b/packages/packagers/js/src/ScopeHoistingPackager.js index ed58dcb7f91..e80c85a625b 100644 --- a/packages/packagers/js/src/ScopeHoistingPackager.js +++ b/packages/packagers/js/src/ScopeHoistingPackager.js @@ -828,8 +828,17 @@ ${code} if (imported === '*') { replacement = renamed; } else if (imported === 'default') { - replacement = `($parcel$interopDefault(${renamed}))`; - this.usedHelpers.add('$parcel$interopDefault'); + let needsDefaultInterop = true; + if (referencedBundle) { + let entry = nullthrows(referencedBundle.getMainEntry()); + needsDefaultInterop = this.needsDefaultInterop(entry); + } + if (needsDefaultInterop) { + replacement = `($parcel$interopDefault(${renamed}))`; + this.usedHelpers.add('$parcel$interopDefault'); + } else { + replacement = `${renamed}.default`; + } } else { replacement = this.getPropertyAccess(renamed, imported); }