@hackbg/ubik
v4.1.0
Published
Dual publish TypeScript to CJS and ESM with CTS/MTS typedefs, source maps and declaration maps. Plus, other goodies to stop the pain.
Downloads
199
Keywords
Readme
@hackbg/ubik
Made with #%&! @ Hack.bg in response to the Node16/TS4 incompatibility event of Q2 2022, and growing since then to encompass other codemods that are guaranteed to increase your enjoyment of TypeScript, ESM, import maps, packages, namespaces, star imports, and life in general - or your money back!
“The door refused to open. It said, "Five cents, please.”
― Philip K. Dick, Ubik
Publishing a package
The first thing Ubik can do for you is publish well-formed dual CJS/ESM packages from
TypeScript sources. For this, use the ubik release
command.
npm run ubik release
Recommended package.json
:
{
"main": "index.ts",
"devDependencies": {
"typescript": "latest",
"@hackbg/ubik": "^4"
},
"scripts": {
"release": "ubik release --access public"
}
}
Recommended tsconfig.json
:
{
"exclude": [
"dist/**/*"
],
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"moduleResolution": "node10"
}
}
Recommended .gitignore
:
package.json.bak
dist/
.ubik
.ubik.cjs
.ubik.esm
*.dist.mjs
*.dist.mjs.map
*.dist.cjs
*.dist.cjs.map
*.dist.d.cts
*.dist.d.cts.map
*.dist.d.mts
*.dist.d.mts.map
The resulting package will contain the .ts
source alongside all of the following:
| |TypeScript|ES Modules |CommonJS | |-----------|----------|---------------|---------------| |Code |.ts |.dist.mjs |.dist.cjs | |Source maps| |.dist.mjs.map |.dist.cjs.map | |Typedefs | |.dist.d.mts |.dist.d.cts | |Type maps | |.dist.d.mts.map|.dist.d.cts.map|
That's 8 extra files generated for source file! But if that's what it takes...
Compiling will generate a patched package.json
, and leave the original at package.json.bak
.
Don't commit the generated package.json
and package.json.bak
, they are for releases only.
Good to know:
- If you use NPM 2FA, append
--otp 000000
to therelease
command to avoid a login loop. tsc
outputs invalid JavaScript when building ESM libraries. Read more- Node 16+ requires extensions in ESM
import
- TypeScript does something weird and hamstrung
- Then people told them and they made it worse
- Node 16+ requires extensions in ESM
Compiling a package
You can also apply the fix in place using the ubik compile
command,
then do the rest of the release in your own way:
npm run ubik compile
Other tasks
Fix star imports
When targeting ESM on Node, CommonJS imports are wrapped in an extra default
key,
of which TypeScript is unaware. Read more
Let's rewrite the imports so that both work:
npm exec ubik split-stars ./src -- protobufjs
Add missing /index.js
to directory imports.
Separate undifferentiated import
/import type
Merge packages
Also goes well with...
Ganesha, a TypeScript-enabling module loader for Node 16+. When using Ubik alongside Ganesha, TypeScript usage can become quite transparent: no build step during development + monolithic publish step to NPM 🐘