Open
Description
Bug Report
🔎 Search Terms
CommonJS, allowJS, ESM, CJS, file extensions
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about output "file extensions for CommonJS modules".
⏯ Playground Link
Sandbox link with relevant code (I couldn't use the playground, since this involves using an .mjs file).
💻 Code
// package.json
{
"name": "tsc-mjs-extension-bug",
"version": "0.1.0",
"type": "commonjs",
"main": "dist/javascript.mjs",
"scripts": {
"build": "tsc",
"test": "node ."
},
"dependencies": {
"typescript": "5.1.3"
}
}
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "nodenext",
"allowJs": true,
"outDir": "dist"
}
"include": ["src"]
}
// src/javascript.mjs
export const where = "javascript";
console.log(`Hello ${where}`);
// src/typescript.ts
export const where = "typescript";
console.log(`Hello ${where}`);
🙁 Actual behavior
The javascript.mjs
is transformed to CommonJS (as expected), but the file extension of the emitted file is still .mjs
.
This breaks the package, since .mjs
is supposed to be use exclusively for JavaScript using ESM and the emitted file now uses CommonJS.
🙂 Expected behavior
I would expect tsc
to transform the src/javascript.mjs
to CommonJS and either:
- emit it as
dist/javascript.cjs
or alternatively - take into account the
"type": "commonjs"
in the package.json and emit the file as.js
as it does with thesrc/typescript.ts
file.