diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md
index 707bc4dce..66432e503 100644
--- a/packages/commonjs/README.md
+++ b/packages/commonjs/README.md
@@ -174,12 +174,48 @@ If you set `esmExternals` to `true`, this plugins assumes that all external depe
You can also supply an array of ids to be treated as ES modules, or a function that will be passed each external id to determine if it is an ES module.
-### `nodeDefaultImport`
+### `defaultIsModuleExports`
-Type: `boolean`
-Default: `false`
+Type: `boolean | "auto"`
+Default: `"auto"`
+
+Controls what is the default export when importing a CommonJS file from an ES module.
-When `true`, match the Node.js behavior when importing the `default` import from a CommonJS module, making it return the value of `module.exports`.
+- `true`: The value of the default export is `module.exports`. This currently matches the behavior of Node.js when importing a CommonJS file.
+ ```js
+ // mod.cjs
+ exports.default = 3;
+ ```
+ ```js
+ import foo from './mod.cjs';
+ console.log(foo); // { default: 3 }
+ ```
+- `false`: The value of the default export is `exports.default`.
+ ```js
+ // mod.cjs
+ exports.default = 3;
+ ```
+ ```js
+ import foo from './mod.cjs';
+ console.log(foo); // 3
+ ```
+- `"auto"`: The value of the default export is `exports.default` if the CommonJS file has an `exports.__esModule === true` property; otherwise it's `module.exports`. This makes it possible to import
+ the default export of ES modules compiled to CommonJS as if they were not compiled.
+ ```js
+ // mod.cjs
+ exports.default = 3;
+ ```
+ ```js
+ // mod-compiled.cjs
+ exports.__esModule = true;
+ exports.default = 3;
+ ```
+ ```js
+ import foo from './mod.cjs';
+ import bar from './mod-compiled.cjs';
+ console.log(foo); // { default: 3 }
+ console.log(bar); // 3
+ ```
### `requireReturnsDefault`
diff --git a/packages/commonjs/src/generate-exports.js b/packages/commonjs/src/generate-exports.js
index e229f937c..4a30cb5ff 100644
--- a/packages/commonjs/src/generate-exports.js
+++ b/packages/commonjs/src/generate-exports.js
@@ -21,7 +21,7 @@ export function rewriteExportsAndGetExportsBlock(
code,
uses,
HELPERS_NAME,
- nodeDefaultImport
+ defaultIsModuleExports
) {
const namedExportDeclarations = [`export { ${moduleName} as __moduleExports };`];
const moduleExportsPropertyAssignments = [];
@@ -76,20 +76,29 @@ export function rewriteExportsAndGetExportsBlock(
// Generate default export
const defaultExport = [];
- if (isRestorableCompiledEsm) {
- defaultExport.push(`export default ${deconflictedDefaultExportName || moduleName};`);
- } else if (
- (wrapped || deconflictedDefaultExportName) &&
- (defineCompiledEsmExpressions.length > 0 ||
- (!nodeDefaultImport && code.indexOf('__esModule') >= 0))
- ) {
- // eslint-disable-next-line no-param-reassign
- uses.commonjsHelpers = true;
- defaultExport.push(
- `export default /*@__PURE__*/${HELPERS_NAME}.getDefaultExportFromCjs(${moduleName});`
- );
- } else {
+ if (defaultIsModuleExports === 'auto') {
+ if (isRestorableCompiledEsm) {
+ defaultExport.push(`export default ${deconflictedDefaultExportName || moduleName};`);
+ } else if (
+ (wrapped || deconflictedDefaultExportName) &&
+ (defineCompiledEsmExpressions.length > 0 || code.includes('__esModule'))
+ ) {
+ // eslint-disable-next-line no-param-reassign
+ uses.commonjsHelpers = true;
+ defaultExport.push(
+ `export default /*@__PURE__*/${HELPERS_NAME}.getDefaultExportFromCjs(${moduleName});`
+ );
+ } else {
+ defaultExport.push(`export default ${moduleName};`);
+ }
+ } else if (defaultIsModuleExports === true) {
defaultExport.push(`export default ${moduleName};`);
+ } else if (defaultIsModuleExports === false) {
+ if (deconflictedDefaultExportName) {
+ defaultExport.push(`export default ${deconflictedDefaultExportName};`);
+ } else {
+ defaultExport.push(`export default ${moduleName}.default;`);
+ }
}
return `\n\n${defaultExport
diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js
index 79475c176..bdb92bcdc 100644
--- a/packages/commonjs/src/index.js
+++ b/packages/commonjs/src/index.js
@@ -59,6 +59,8 @@ export default function commonjs(options = {}) {
: Array.isArray(esmExternals)
? ((esmExternalIds = new Set(esmExternals)), (id) => esmExternalIds.has(id))
: () => esmExternals;
+ const defaultIsModuleExports =
+ typeof options.defaultIsModuleExports === 'boolean' ? options.defaultIsModuleExports : 'auto';
const { dynamicRequireModuleSet, dynamicRequireModuleDirPaths } = getDynamicRequirePaths(
options.dynamicRequireTargets
@@ -146,7 +148,7 @@ export default function commonjs(options = {}) {
disableWrap,
commonDir,
ast,
- options.nodeDefaultImport
+ defaultIsModuleExports
);
}
diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js
index 74b25c31a..e37271a8e 100644
--- a/packages/commonjs/src/transform-commonjs.js
+++ b/packages/commonjs/src/transform-commonjs.js
@@ -54,7 +54,7 @@ export default function transformCommonjs(
disableWrap,
commonDir,
astCache,
- nodeDefaultImport
+ defaultIsModuleExports
) {
const ast = astCache || tryParse(parse, code, id);
const magicString = new MagicString(code);
@@ -138,7 +138,7 @@ export default function transformCommonjs(
// we're dealing with `module.exports = ...` or `[module.]exports.foo = ...` –
if (programDepth > 3) {
shouldWrap = true;
- } else if (!nodeDefaultImport && exportName === KEY_COMPILED_ESM) {
+ } else if (exportName === KEY_COMPILED_ESM) {
defineCompiledEsmExpressions.push(parent);
} else if (flattened.keypath === 'module.exports') {
topLevelModuleExportsAssignments.push(node);
@@ -472,7 +472,7 @@ export default function transformCommonjs(
code,
uses,
HELPERS_NAME,
- nodeDefaultImport
+ defaultIsModuleExports
);
const importBlock = rewriteRequireExpressionsAndGetImportBlock(
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/_config.js
new file mode 100755
index 000000000..466f62535
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/_config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ options: {
+ defaultIsModuleExports: 'auto'
+ }
+};
diff --git a/packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/input.js
similarity index 100%
rename from packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/input.js
rename to packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/input.js
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/output.js
new file mode 100755
index 000000000..6759b90e5
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/output.js
@@ -0,0 +1,15 @@
+const _default = 2;
+const named = 3;
+
+const input = /*#__PURE__*/ Object.defineProperty(
+ {
+ default: _default,
+ named
+ },
+ '__esModule',
+ { value: true }
+);
+
+export default _default;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/_config.js
new file mode 100755
index 000000000..466f62535
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/_config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ options: {
+ defaultIsModuleExports: 'auto'
+ }
+};
diff --git a/packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/input.js
similarity index 100%
rename from packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/input.js
rename to packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/input.js
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js
new file mode 100755
index 000000000..ea0abef42
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js
@@ -0,0 +1,11 @@
+const _default = 2;
+const named = 3;
+
+const input = {
+ default: _default,
+ named
+};
+
+export default input;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/_config.js
new file mode 100755
index 000000000..d4402a7ee
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/_config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ options: {
+ defaultIsModuleExports: false
+ }
+};
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/input.js
new file mode 100755
index 000000000..d4efb165b
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/input.js
@@ -0,0 +1,3 @@
+exports.__esModule = true;
+exports.default = 2;
+exports.named = 3;
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/output.js
new file mode 100755
index 000000000..6759b90e5
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/output.js
@@ -0,0 +1,15 @@
+const _default = 2;
+const named = 3;
+
+const input = /*#__PURE__*/ Object.defineProperty(
+ {
+ default: _default,
+ named
+ },
+ '__esModule',
+ { value: true }
+);
+
+export default _default;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/_config.js
new file mode 100755
index 000000000..d4402a7ee
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/_config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ options: {
+ defaultIsModuleExports: false
+ }
+};
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/input.js
new file mode 100755
index 000000000..562cc1abe
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/input.js
@@ -0,0 +1,2 @@
+exports.default = 2;
+exports.named = 3;
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js
new file mode 100755
index 000000000..2ba10c747
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js
@@ -0,0 +1,11 @@
+const _default = 2;
+const named = 3;
+
+const input = {
+ default: _default,
+ named
+};
+
+export default _default;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/_config.js
new file mode 100755
index 000000000..d4402a7ee
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/_config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ options: {
+ defaultIsModuleExports: false
+ }
+};
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/input.js
new file mode 100755
index 000000000..fd2304246
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/input.js
@@ -0,0 +1 @@
+exports.named = 3;
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js
new file mode 100755
index 000000000..73b282aa3
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js
@@ -0,0 +1,9 @@
+const named = 3;
+
+const input = {
+ named
+};
+
+export default input.default;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/_config.js
similarity index 54%
rename from packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/_config.js
rename to packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/_config.js
index de2668c29..a57f02831 100755
--- a/packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/_config.js
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/_config.js
@@ -1,5 +1,5 @@
module.exports = {
options: {
- nodeDefaultImport: true
+ defaultIsModuleExports: true
}
};
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/input.js
new file mode 100755
index 000000000..d4efb165b
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/input.js
@@ -0,0 +1,3 @@
+exports.__esModule = true;
+exports.default = 2;
+exports.named = 3;
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js
new file mode 100755
index 000000000..42ae3e169
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js
@@ -0,0 +1,15 @@
+const _default = 2;
+const named = 3;
+
+const input = /*#__PURE__*/ Object.defineProperty(
+ {
+ default: _default,
+ named
+ },
+ '__esModule',
+ { value: true }
+);
+
+export default input;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/_config.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/_config.js
similarity index 54%
rename from packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/_config.js
rename to packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/_config.js
index de2668c29..a57f02831 100755
--- a/packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/_config.js
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/_config.js
@@ -1,5 +1,5 @@
module.exports = {
options: {
- nodeDefaultImport: true
+ defaultIsModuleExports: true
}
};
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/input.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/input.js
new file mode 100755
index 000000000..562cc1abe
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/input.js
@@ -0,0 +1,2 @@
+exports.default = 2;
+exports.named = 3;
diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js
new file mode 100755
index 000000000..ea0abef42
--- /dev/null
+++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js
@@ -0,0 +1,11 @@
+const _default = 2;
+const named = 3;
+
+const input = {
+ default: _default,
+ named
+};
+
+export default input;
+export { input as __moduleExports };
+export { named };
diff --git a/packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/output.js b/packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/output.js
deleted file mode 100755
index 54f3861fc..000000000
--- a/packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/output.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var __esModule = true;
-var _default = 2;
-var named = 3;
-
-var input = {
- __esModule: __esModule,
- default: _default,
- named: named
-};
-
-export default input;
-export { input as __moduleExports };
-export { __esModule };
-export { named };
\ No newline at end of file
diff --git a/packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/output.js
deleted file mode 100755
index 9e4a115e8..000000000
--- a/packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/output.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var _default = 2;
-var named = 3;
-
-var input = {
- default: _default,
- named: named
-};
-
-export default input;
-export { input as __moduleExports };
-export { named };
\ No newline at end of file