# Programmatic Usage Use tsdown from JavaScript/TypeScript code. ## Overview tsdown can be imported and used programmatically in your Node.js scripts, custom build tools, or automation workflows. ## Basic Usage ### Simple Build ```ts import { build } from 'tsdown'; await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, }); ``` ### With Options ```ts import { build } from 'tsdown'; await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], outDir: 'dist', dts: true, minify: true, sourcemap: true, clean: true, }); ``` ## API Reference ### build() Main function to run a build. ```ts import { build } from 'tsdown'; await build(options); ``` **Parameters:** - `options` - Build configuration object (same as config file) **Returns:** - `Promise` - Resolves when build completes **Throws:** - Build errors if compilation fails ## Configuration Object All config file options are available: ```ts import { build, defineConfig } from 'tsdown'; const config = defineConfig({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, minify: true, sourcemap: true, external: ['react', 'react-dom'], plugins: [ /* plugins */ ], hooks: { 'build:done': async () => { console.log('Build complete!'); }, }, }); await build(config); ``` See [Config Reference](option-config-file.md) for all options. ## Common Patterns ### Custom Build Script ```ts // scripts/build.ts import { build } from 'tsdown'; async function main() { console.log('Building library...'); await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, clean: true, }); console.log('Build complete!'); } main().catch(console.error); ``` Run with: ```bash tsx scripts/build.ts ``` ### Multiple Builds ```ts import { build } from 'tsdown'; // Build main library await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], outDir: 'dist', dts: true, }); // Build CLI tool await build({ entry: ['src/cli.ts'], format: ['esm'], outDir: 'dist/bin', platform: 'node', shims: true, }); ``` ### Conditional Build ```ts import { build } from 'tsdown'; const isDev = process.env.NODE_ENV === 'development'; await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], minify: !isDev, sourcemap: isDev, clean: !isDev, }); ``` ### With Error Handling ```ts import { build } from 'tsdown'; try { await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, }); console.log('✅ Build successful'); } catch (error) { console.error('❌ Build failed:', error); process.exit(1); } ``` ### Automated Workflow ```ts import { build } from 'tsdown'; import { execSync } from 'child_process'; async function release() { // Clean console.log('Cleaning...'); execSync('rm -rf dist'); // Build console.log('Building...'); await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, minify: true, }); // Test console.log('Testing...'); execSync('npm test'); // Publish console.log('Publishing...'); execSync('npm publish'); } release().catch(console.error); ``` ### Build with Post-Processing ```ts import { build } from 'tsdown'; import { copyFileSync } from 'fs'; await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, hooks: { 'build:done': async () => { // Copy additional files copyFileSync('README.md', 'dist/README.md'); copyFileSync('LICENSE', 'dist/LICENSE'); console.log('Copied additional files'); }, }, }); ``` ## Watch Mode Unfortunately, watch mode is not directly exposed in the programmatic API. Use the CLI for watch mode: ```ts // Use CLI for watch mode import { spawn } from 'child_process'; spawn('tsdown', ['--watch'], { stdio: 'inherit', shell: true, }); ``` ## Integration Examples ### With Task Runner ```ts // gulpfile.js import { build } from 'tsdown'; import gulp from 'gulp'; gulp.task('build', async () => { await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, }); }); gulp.task('watch', () => { return gulp.watch('src/**/*.ts', gulp.series('build')); }); ``` ### With Custom CLI ```ts // scripts/cli.ts import { build } from 'tsdown'; import { Command } from 'commander'; const program = new Command(); program .command('build') .option('--prod', 'Production build') .action(async (options) => { await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], minify: options.prod, sourcemap: !options.prod, }); }); program.parse(); ``` ### With CI/CD ```ts // .github/scripts/build.ts import { build } from 'tsdown'; const isCI = process.env.CI === 'true'; await build({ entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, minify: isCI, clean: true, }); // Upload to artifact storage if (isCI) { // Upload dist/ to S3, etc. } ``` ## TypeScript Support ```ts // scripts/build.ts import { build, type UserConfig } from 'tsdown'; const config: UserConfig = { entry: ['src/index.ts'], format: ['esm', 'cjs'], dts: true, }; await build(config); ``` ## Tips 1. **Use TypeScript** for type safety 2. **Handle errors** properly 3. **Use hooks** for custom logic 4. **Log progress** for visibility 5. **Use CLI for watch** mode 6. **Exit on error** in scripts ## Troubleshooting ### Import Errors Ensure tsdown is installed: ```bash pnpm add -D tsdown ``` ### Type Errors Import types: ```ts import type { UserConfig } from 'tsdown'; ``` ### Build Fails Silently Add error handling: ```ts try { await build(config); } catch (error) { console.error(error); process.exit(1); } ``` ### Options Not Working Check spelling and types: ```ts // ✅ Correct { format: ['esm', 'cjs']; } // ❌ Wrong { formats: ['esm', 'cjs']; } ``` ## Related - [Config File](option-config-file.md) - Configuration options - [Hooks](advanced-hooks.md) - Lifecycle hooks - [CLI](reference-cli.md) - Command-line interface - [Plugins](advanced-plugins.md) - Plugin system