From 7c1bb9bfefdcffc5709ba2f3d57521270e5ef7f6 Mon Sep 17 00:00:00 2001 From: Guy Bedford Date: Fri, 7 Mar 2025 13:05:09 -0800 Subject: [PATCH] esm: module.exports on CJS modules --- lib/internal/modules/esm/translators.js | 8 ++++++-- test/fixtures/es-modules/exports-cases.js | 19 ++++++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index c300b0305318bd..0a8e4c9e5d3af5 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -188,10 +188,13 @@ function createCJSModuleWrap(url, source, isMain, format, loadCJS = loadCJSModul const { exportNames, module } = cjsPreparseModuleExports(filename, source, format); cjsCache.set(url, module); - const wrapperNames = [...exportNames, 'module.exports']; + const wrapperNames = [...exportNames]; if (!exportNames.has('default')) { ArrayPrototypePush(wrapperNames, 'default'); } + if (!exportNames.has('module.exports')) { + ArrayPrototypePush(wrapperNames, 'module.exports'); + } if (isMain) { setOwnProperty(process, 'mainModule', module); @@ -212,7 +215,8 @@ function createCJSModuleWrap(url, source, isMain, format, loadCJS = loadCJSModul ({ exports } = module); } for (const exportName of exportNames) { - if (!ObjectPrototypeHasOwnProperty(exports, exportName) || exportName === 'default') { + if (exportName === 'default' || exportName === 'module.exports' || + !ObjectPrototypeHasOwnProperty(exports, exportName)) { continue; } // We might trigger a getter -> dont fail. diff --git a/test/fixtures/es-modules/exports-cases.js b/test/fixtures/es-modules/exports-cases.js index 94bbde74d1d40e..a8146bb12392fb 100644 --- a/test/fixtures/es-modules/exports-cases.js +++ b/test/fixtures/es-modules/exports-cases.js @@ -1,9 +1,10 @@ -if (global.maybe) - module.exports = require('../is-object'); -exports['invalid identifier'] = 'yes'; -module.exports['?invalid'] = 'yes'; -module.exports['π'] = 'yes'; -exports['\u{D83C}'] = 'no'; -exports['\u{D83C}\u{DF10}'] = 'yes'; -exports.package = 10; // reserved word -Object.defineProperty(exports, 'z', { value: 'yes' }); +if (global.maybe) + module.exports = require('../is-object'); +exports['invalid identifier'] = 'yes'; +module.exports['?invalid'] = 'yes'; +module.exports['π'] = 'yes'; +exports['\u{D83C}'] = 'no'; +exports['\u{D83C}\u{DF10}'] = 'yes'; +exports.package = 10; // reserved word +Object.defineProperty(exports, 'z', { value: 'yes' }); +exports['module.exports'] = 5;