The standard way to expose node package modules is to list them in the index.ts, like so:
export * from './module1';
export * from './module2';
However, this loads the content of both modules immediately. I want to have a module that is not exported in the index.ts file, as it requires some optional dependencies to be installed.
I followed this guide: https://blog.mozilla.org/data/2021/04/07/this-week-in-glean-publishing-glean-js/
My package.json:
"exports": {
".": {
"import": "./dist/es/index.js",
"require": "./dist/cjs/index.js"
},
"./module2": {
"import": "./dist/es/module2.js",
"require": "./dist/cjs/module2.js"
}
},
"typesVersions": {
"*": {
".": [
"./dist/types/index.d.ts"
],
"./module2": [
"./dist/types/module2.d.ts"
]
}
},
// fallback for older Node versions:
"module": "dist/es/index.js",
"main": "dist/cjs/index.js",
"types": "dist/types/index.d.ts",
After I build the project (with tsc
, separately for CJS and ESM) the output dir structure looks like this:
- dist
- cjs
- index.js
- module2.js
- es
- index.js
- module2.js
- types
- index.d.ts
- module2.d.ts
However, when I publish this package and install it in the client project, module2 does not work.
import {sayHello} from 'ts-exports-test';
import {sayGoodbye} from 'ts-exports-test/module2';
console.log(sayHello());
console.log(sayGoodbye());
I run it with ts-node
and I'm getting the error:
src/index.ts:2:26 - error TS2307: Cannot find module 'ts-exports-test/module2' or its corresponding type declarations.
Note: with clients using TS 4.5 the types paths can be declared in "exports" section, making the "typesVersions" hack unnecessary. But this is for the future.
ts-exports-test/module2
import in the client resolves tomodule2.ts
file in the package main dir, not todist/types/module2.d.ts
(according to WebStorm). If you remove the source files from the output package by adding"files": ["dist"]
to package.json or if you move the source files tosrc
directory, it won't work. – Aesthetics