Bundle your TypeScript library with no config, powered by esbuild.
Anything that's supported by Node.js natively, namely .js
, .json
, .mjs
. And TypeScript .ts
, .tsx
.
This project is designed for bundling Node.js libraries.
Install it locally in your project folder:
npm i tsup -D
# Or Yarn
yarn add tsup --dev
You can also install it globally but it's not recommended.
tsup [...files]
Files are written into ./dist
.
You can bundle multiple files in one go:
tsup src/index.ts src/cli.ts
This will output dist/index.js
and dist/cli.js
.
Code splitting is enabled by default and supported in cjs
and esm
format.
By default tsup bundles all import
-ed modules but dependencies
in your packages.json
are always excluded, you can also use --external <module>
flag to mark other packages as external.
tsup index.ts --dts
This will emit ./dist/index.js
and ./dist/index.d.ts
.
If you set multiple entry files, each entry will get a corresponding .d.ts
file.
Supported format: esm
, cjs
, (default) and iife
.
You can bundle in multiple formats in one go:
tsup src/index.ts --format esm,cjs,iife
That will output files in following folder structure:
dist
├── index.mjs # esm
├── index.global.js # iife
└── index.js # cjs
If the type
field in your package.json
is set to module
, the filenames will be slightly different:
dist
├── index.js # esm
├── index.global.js # iife
└── index.cjs # cjs
Read more about esm
support in Node.js.
If you don't want extensions like .mjs
or .cjs
, e.g. you want your library to be used in a bundler (or environment) that doesn't support those, you can enable --legacy-output
flag:
tsup src/index.ts --format esm,cjs,iife --legacy-output
..which outputs to:
dist
├── esm
│ └── index.js
├── iife
│ └── index.js
└── index.js
You can use --target es5
or "target": "es5"
in tsconfig.json
to compile the code down to es5, it's processed by buble. Some features are NOT supported by this target, namely: for .. of
.
You can use --env
flag to define compile-time environment variables:
tsup src/index.ts --env.NODE_ENV production
When an entry file like src/cli.ts
contains hashbang like #!/bin/env node
tsup will automatically make the outout file executable, so you don't have to run chmod +x dist/cli.js
.
tsup src/index.ts --watch
esbuild is fast because it doesn't perform any type checking, you already get type checking from your IDE like VS Code or WebStorm.
Additionally, if you want type checking at build time, you can enable --dts
, which will run a real TypeScript compiler to generate declaration file so you get type checking as well.
For more details:
tsup --help
MIT © EGOIST (Kevin Titor)