Files
agent-skills/skills/tsdown/references/option-package-exports.md
Jason Woltje f5792c40be feat: Complete fleet — 94 skills across 10+ domains
Pulled ALL skills from 15 source repositories:
- anthropics/skills: 16 (docs, design, MCP, testing)
- obra/superpowers: 14 (TDD, debugging, agents, planning)
- coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth)
- better-auth/skills: 5 (auth patterns)
- vercel-labs/agent-skills: 5 (React, design, Vercel)
- antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo)
- Plus 13 individual skills from various repos

Mosaic Stack is not limited to coding — the Orchestrator and
subagents serve coding, business, design, marketing, writing,
logistics, analysis, and more.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:27:42 -06:00

321 lines
5.2 KiB
Markdown

# Auto-Generate Package Exports
Automatically generate package.json exports field from build output.
## Overview
tsdown can automatically infer and generate the `exports`, `main`, `module`, and `types` fields in your `package.json` based on your build outputs.
**Status:** Experimental - review before publishing.
## Basic Usage
### CLI
```bash
tsdown --exports
```
### Config File
```ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true,
})
```
## What Gets Generated
### Single Entry
**Config:**
```ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true,
})
```
**Generated in package.json:**
```json
{
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}
```
### Multiple Entries
**Config:**
```ts
export default defineConfig({
entry: {
index: 'src/index.ts',
utils: 'src/utils.ts',
},
format: ['esm', 'cjs'],
dts: true,
exports: true,
})
```
**Generated in package.json:**
```json
{
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./utils": {
"types": "./dist/utils.d.ts",
"import": "./dist/utils.mjs",
"require": "./dist/utils.cjs"
}
}
}
```
## Export All Files
Include all output files, not just entry points:
```ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
exports: {
all: true,
},
})
```
**Result:** All `.mjs`, `.cjs`, and `.d.ts` files will be added to exports.
## Dev-Time Source Linking
### Dev Exports
Link to source files during development:
```ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
exports: {
devExports: true,
},
})
```
**Generated:**
```json
{
"exports": {
".": "./src/index.ts" // Points to source
},
"publishConfig": {
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}
}
```
**Note:** Supported by pnpm/yarn, not npm.
### Conditional Dev Exports
Use specific condition for dev exports:
```ts
export default defineConfig({
exports: {
devExports: 'development',
},
})
```
**Generated:**
```json
{
"exports": {
".": {
"development": "./src/index.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}
```
**Use with TypeScript customConditions:**
```json
// tsconfig.json
{
"compilerOptions": {
"customConditions": ["development"]
}
}
```
## Custom Exports
Add custom export mappings:
```ts
export default defineConfig({
entry: ['src/index.ts'],
exports: {
customExports(pkg, context) {
// Add custom export
pkg['./foo'] = './dist/foo.js'
// Add package.json export
pkg['./package.json'] = './package.json'
return pkg
},
},
})
```
## Common Patterns
### Complete Library Setup
```ts
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true,
clean: true,
})
```
### Multiple Exports with Dev Mode
```ts
export default defineConfig({
entry: {
index: 'src/index.ts',
client: 'src/client.ts',
server: 'src/server.ts',
},
format: ['esm', 'cjs'],
dts: true,
exports: {
all: false, // Only entries
devExports: 'development',
},
})
```
### Monorepo Package
```ts
export default defineConfig({
workspace: 'packages/*',
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true, // Generate for each package
})
```
## Validation
### Enable Publint
Validate generated exports:
```bash
tsdown --exports --publint
```
Or in config:
```ts
export default defineConfig({
exports: true,
publint: true, // Validate exports
})
```
## Tips
1. **Review before publishing** - Check generated fields
2. **Use with publint** - Validate exports field
3. **Enable for libraries** - Especially with multiple exports
4. **Use devExports** - Better DX during development
5. **Test exports** - Verify imports work correctly
## Troubleshooting
### Exports Not Generated
- Ensure `exports: true` is set
- Check build completed successfully
- Verify output files exist
### Wrong Export Paths
- Check `outDir` configuration
- Verify entry names match expectations
- Review `format` settings
### Dev Exports Not Working
- Only supported by pnpm/yarn
- Check package manager
- Use `publishConfig` for publishing
### Types Not Exported
- Enable `dts: true`
- Ensure TypeScript is installed
- Check `.d.ts` files are generated
## CLI Examples
```bash
# Generate exports
tsdown --exports
# With publint validation
tsdown --exports --publint
# Export all files
tsdown --exports
# With dev exports
tsdown --exports
```
## Related Options
- [Entry](option-entry.md) - Configure entry points
- [Output Format](option-output-format.md) - Module formats
- [DTS](option-dts.md) - Type declarations