diff --git a/lib/internal/modules/cjs/loader.js b/lib/internal/modules/cjs/loader.js index a320736d1b6fd7..82ebb19b10422f 100644 --- a/lib/internal/modules/cjs/loader.js +++ b/lib/internal/modules/cjs/loader.js @@ -1932,12 +1932,12 @@ Module._extensions['.js'] = function(module, filename) { format = 'typescript'; } } else if (path.extname(filename) === '') { - // Extensionless files skip the .js suffix check above. When type is explicit, - // follow it so ESM syntax surfaces as SyntaxError for commonjs instead of - // silently delegating to ESM. + // Extensionless files skip the .js suffix check above. When type is commonjs, follow it so ESM + // syntax surfaces as SyntaxError. For type: module, leave format undefined so our syntax + // detection handles it (allowing CJS extensionless files in ESM packages). pkg = packageJsonReader.getNearestParentPackageJSON(filename); const typeFromPjson = pkg?.data?.type; - if (typeFromPjson === 'commonjs' || typeFromPjson === 'module') { + if (typeFromPjson === 'commonjs') { format = typeFromPjson; } } diff --git a/test/es-module/test-extensionless-esm-type-commonjs.js b/test/es-module/test-extensionless-esm-type-commonjs.js index cdfdf9361393e9..13349ed1c156af 100644 --- a/test/es-module/test-extensionless-esm-type-commonjs.js +++ b/test/es-module/test-extensionless-esm-type-commonjs.js @@ -17,3 +17,13 @@ spawnSyncAndAssert(process.execPath, [ stdout: /script STARTED[\s\S]*v\d+\./, trim: true, }); + +// CJS extensionless file inside a type: "module" package should work +// when require()'d. Regression test for https://github.com/nodejs/node/issues/61971 +spawnSyncAndAssert(process.execPath, [ + '-e', `const m = require(${JSON.stringify( + fixtures.path('es-modules', 'extensionless-cjs-module', 'index') + )}); if (m.hello !== 'world') throw new Error('expected CJS exports, got: ' + JSON.stringify(m))`, +], { + status: 0, +}); diff --git a/test/fixtures/es-modules/extensionless-cjs-module/index b/test/fixtures/es-modules/extensionless-cjs-module/index new file mode 100644 index 00000000000000..6c45e12abc39f5 --- /dev/null +++ b/test/fixtures/es-modules/extensionless-cjs-module/index @@ -0,0 +1 @@ +module.exports = { hello: 'world' }; diff --git a/test/fixtures/es-modules/extensionless-cjs-module/package.json b/test/fixtures/es-modules/extensionless-cjs-module/package.json new file mode 100644 index 00000000000000..3dbc1ca591c055 --- /dev/null +++ b/test/fixtures/es-modules/extensionless-cjs-module/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +}