Fix TypeScript types with Node16/NodeNext module resolution #21270
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
TypeScript with the Node16 or NodeNext setting for
"module"
in tsconfig.json will read the package exports map. This adds types entries to package.json so that it can be used in those settings. Thetypes
key is left in place so that the package types still work for users with"module": "CommonJS"
.TypeScript requires different declaration files (even though the same content works for both) so that it can distinguish between import/require. For clarity, the build script now writes to
require.d.ts
(not.d.cts
for compatibility with old TS versions) andimport.d.mjs
Test results and supporting details
Tested by adding the
build
directory as a dependency, and checking:.mts
file withNodeNext
.cjs
file withNodeNext
.ts
file withCommonJS
usingimport bcd from
transpiled intorequire
exports
, would have to rename files, anyone who runs into this should probably be using Node16/NodeNext anyways).ts
file withCommonJS
usingimport x = require("@mdn/browser-compat-data")
Related issues
Fixes #17964