Skip to content

modules

Files under @repobuddy/typescript/tsconfig/modules/ match the Modules category of the TSConfig reference. Extend one module file per config.

File module moduleResolution Other options
modules/buddy Node16 derived: node16 resolveJsonModule
modules/buddy-commonjs CommonJS not set esModuleInterop, resolveJsonModule, verbatimModuleSyntax: false
modules/node16 Node16 derived: node16 none
modules/nodenext NodeNext derived: nodenext none
modules/commonjs CommonJS not set none
modules/commonjs-legacy CommonJS Node16 none
modules/es2020 ES2020 Bundler none
modules/es2020-legacy ES2020 Node none
modules/es2022 ES2022 Bundler none
modules/ui-assets not set not set allowArbitraryExtensions, resolveJsonModule

“Derived” values come from tsc --showConfig (TypeScript 7.0.2). The file does not set them.

The recommended module settings for a Node.js package. Used by tsconfig/monorepo.

{
"compilerOptions": {
"module": "Node16",
"resolveJsonModule": true
// disabled due to `ts-jest` issue.
// "verbatimModuleSyntax": true
}
}

Resolved options (tsc --showConfig, TypeScript 7.0.2):

{
"compilerOptions": {
"module": "node16",
"resolveJsonModule": true,
"moduleResolution": "node16",
"moduleDetection": "force"
}
}

verbatimModuleSyntax stays off. With it on, ts-jest reports TS1286: ESM syntax is not allowed in a CommonJS module for ESM projects.

The CommonJS counterpart of modules/buddy. Put it after your base config in an extends array to build a CommonJS copy of an ESM package.

{
"compilerOptions": {
"esModuleInterop": true,
"module": "CommonJS",
"resolveJsonModule": true,
"verbatimModuleSyntax": false // reset to false for config composition
}
}

verbatimModuleSyntax: false overrides a true value from a config earlier in the extends array.

This repository builds packages/jest and packages/buddy CommonJS output with it. See Build CommonJS and ESM from one package.

{
"compilerOptions": {
"module": "Node16"
// This is inferred for `module: Node16`
// "moduleResolution": "Node16"
}
}

TypeScript derives moduleResolution: node16 and moduleDetection: force. Unlike modules/buddy, this file does not turn on resolveJsonModule.

{
"compilerOptions": {
"module": "NodeNext"
// This is inferred for `module: NodeNext`
// "moduleResolution": "NodeNext"
}
}

TypeScript derives moduleResolution: nodenext and moduleDetection: force.

{
"compilerOptions": {
"module": "CommonJS"
// this is no longer possible starting from TypeScript 5.2
// "moduleResolution": "Node16"
}
}

moduleResolution is left to TypeScript’s default for CommonJS.

{
"compilerOptions": {
"module": "CommonJS",
"moduleResolution": "Node16"
}
}

For TypeScript older than 5.2. TypeScript 6.0.3 and 7.0.2 reject it with TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'. On those versions, use modules/commonjs.

For code that a bundler consumes.

{
"compilerOptions": {
"module": "ES2020",
"moduleResolution": "Bundler"
}
}

moduleResolution: Bundler needs TypeScript 5.0 or later.

{
"compilerOptions": {
"module": "ES2020",
"moduleResolution": "Node"
}
}

For TypeScript older than 5.0, which has no Bundler resolution. TypeScript 6.0.3 reports TS5107 (moduleResolution=node10 is deprecated) and TypeScript 7.0.2 reports TS5108 (moduleResolution=node10 has been removed). On those versions, use modules/es2020.

For code that a bundler consumes, with ES2022 module features such as top-level await.

{
"compilerOptions": {
"module": "ES2022",
"moduleResolution": "Bundler"
}
}

Lets code import JSON files and files with non-TypeScript extensions, such as .css, when a matching declaration file exists (for example styles.d.css.ts for styles.css).

{
"compilerOptions": {
// https://www.typescriptlang.org/tsconfig#allowArbitraryExtensions
"allowArbitraryExtensions": true,
"resolveJsonModule": true
}
}

It sets no module. Combine it with one of the module files above. allowArbitraryExtensions needs TypeScript 5.0 or later.