Description
Search Terms
exports
- TypeScript 4.7
- packages
- ES Module
Problem
Today, if you use exports
with TS 4.7 to create a public API that is different from the layout you author in, TypeDoc preserves the authoring API rather than the consuming API.
Consider a structure like this:
my-project/
src/
public/
index.ts
other-module.ts
-private/
internal-only.ts
The tsconfig.json
specifies an outDir
of dist
, resulting in this output:
my-project/
dist/
public/
index.js
index.d.ts
other-module.js
other-module.d.ts
-private/
internal-only.js
internal-only.d.ts
Finally, package.json
has this:
{
"exports": {
".": "./dist/public/index.js",
"./package.json": "./package.json",
"./*": "./dist/public/*.js"
},
}
This means that Node consumers (and any tools following its resolution algorithm) can now import not only from the index.js
but from other-module
as well:
import { something } from 'my-project';
import { somethingElse } from 'my-project/other-module';
The docs generated by TypeDoc, however, render the modules without reference to the exports
map in package.json
, so you end up with a list of modules like this:
public
public/other-module
For a real-world example of this, see True Myth and its docs.
Suggested Solution
The resolved module map should follow the resolution algorithm from exports
in package.json
the way TS itself does, so that the resolved module name is based on the mapping defined there.
Note: I know 4.7 came out literally this week, and that this is likely non-trivial! Just figured I'd write it up to get it here so if folks search they will see that it's open.