From b514add510ad853ddd3787a8c99563af572cab9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 19 Mar 2021 12:33:08 +0100 Subject: [PATCH] Change option --- packages/commonjs/README.md | 68 ++++++++++++++----- packages/commonjs/src/generate-exports.js | 37 ++++++---- packages/commonjs/src/index.js | 4 +- packages/commonjs/src/transform-commonjs.js | 6 +- .../_config.js | 5 ++ .../input.js | 0 .../output.js | 15 ++++ .../_config.js | 5 ++ .../input.js | 0 .../output.js | 11 +++ .../_config.js | 5 ++ .../input.js | 3 + .../output.js | 15 ++++ .../_config.js | 5 ++ .../input.js | 2 + .../output.js | 11 +++ .../_config.js | 5 ++ .../input.js | 1 + .../output.js | 9 +++ .../_config.js | 2 +- .../input.js | 3 + .../output.js | 15 ++++ .../_config.js | 2 +- .../input.js | 2 + .../output.js | 11 +++ .../nodeDefaultImport-__esModule/output.js | 14 ---- .../nodeDefaultImport-no-__esModule/output.js | 11 --- 27 files changed, 206 insertions(+), 61 deletions(-) create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/_config.js rename packages/commonjs/test/fixtures/form/{nodeDefaultImport-__esModule => defaultIsModuleExports-auto-__esModule}/input.js (100%) create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-__esModule/output.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/_config.js rename packages/commonjs/test/fixtures/form/{nodeDefaultImport-no-__esModule => defaultIsModuleExports-auto-no-__esModule}/input.js (100%) create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/_config.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/input.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-__esModule/output.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/_config.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/input.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/_config.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/input.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js rename packages/commonjs/test/fixtures/form/{nodeDefaultImport-__esModule => defaultIsModuleExports-true-__esModule}/_config.js (54%) create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/input.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js rename packages/commonjs/test/fixtures/form/{nodeDefaultImport-no-__esModule => defaultIsModuleExports-true-no-__esModule}/_config.js (54%) create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/input.js create mode 100755 packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js delete mode 100755 packages/commonjs/test/fixtures/form/nodeDefaultImport-__esModule/output.js delete mode 100755 packages/commonjs/test/fixtures/form/nodeDefaultImport-no-__esModule/output.js diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 707bc4dce..881a0171d 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -34,9 +34,9 @@ export default { input: 'src/index.js', output: { dir: 'output', - format: 'cjs' + format: 'cjs', }, - plugins: [commonjs()] + plugins: [commonjs()], }; ``` @@ -66,8 +66,8 @@ commonjs({ '!node_modules/logform/index.js', '!node_modules/logform/format.js', '!node_modules/logform/levels.js', - '!node_modules/logform/browser.js' - ] + '!node_modules/logform/browser.js', + ], }); ``` @@ -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` @@ -214,7 +250,7 @@ This is in line with how other bundlers handle this situation and is also the mo var dep$1 = /*#__PURE__*/ Object.freeze({ __proto__: null, - default: dep + default: dep, }); console.log(dep$1.default); @@ -245,7 +281,7 @@ For these situations, you can change Rollup's behaviour either globally or per m enumerable: true, get: function () { return n[k]; - } + }, } ); }); @@ -321,9 +357,9 @@ export default { output: { file: 'bundle.js', format: 'iife', - name: 'MyModule' + name: 'MyModule', }, - plugins: [resolve(), commonjs()] + plugins: [resolve(), commonjs()], }; ``` @@ -333,7 +369,7 @@ Symlinks are common in monorepos and are also created by the `npm link` command. ```js commonjs({ - include: /node_modules/ + include: /node_modules/, }); ``` @@ -356,11 +392,11 @@ function cjsDetectionPlugin() { moduleParsed({ id, meta: { - commonjs: { isCommonJS } - } + commonjs: { isCommonJS }, + }, }) { console.log(`File ${id} is CommonJS: ${isCommonJS}`); - } + }, }; } ``` 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