Subchapter 8.23
references/option-package-exports.mdMarkdown5 KBView on GitHub
Automatically generate package.json exports from build output.
tsdown can automatically infer and generate the exports field in your package.json based on your build outputs.
Top-level main, module, and types fields are not generated by default. Enable exports.legacy if you need those fields for older tools.
Review the generated exports before publishing, or enable publint for validation.
tsdown --exportsexport default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true,
})Config:
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true,
})Generated in package.json:
{
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}Config:
export default defineConfig({
entry: {
index: 'src/index.ts',
utils: 'src/utils.ts',
},
format: ['esm', 'cjs'],
dts: true,
exports: true,
})Generated in package.json:
{
"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"
}
}
}Include all output files, not just entry points:
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.
Generate top-level main, module, and types fields for older tools:
export default defineConfig({
exports: {
legacy: true,
},
})These fields are not generated by default.
Link to source files during development:
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
exports: {
devExports: true,
},
})Generated:
{
"exports": {
".": "./src/index.ts" // Points to source
},
"publishConfig": {
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}
}Note: Supported by pnpm/yarn, not npm.
Use specific condition for dev exports:
export default defineConfig({
exports: {
devExports: '@my-org/source',
},
})Generated:
{
"exports": {
".": {
"@my-org/source": "./src/index.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
}
}
}Use with TypeScript customConditions:
// tsconfig.json
{
"compilerOptions": {
"customConditions": ["@my-org/source"]
}
}Add custom export mappings:
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
},
},
})export default defineConfig({
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true,
clean: true,
})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: '@my-org/source',
},
})export default defineConfig({
workspace: 'packages/*',
entry: ['src/index.ts'],
format: ['esm', 'cjs'],
dts: true,
exports: true, // Generate for each package
})Validate generated exports:
tsdown --exports --publintOr in config:
export default defineConfig({
exports: true,
publint: true, // Validate exports
})exports: true is setoutDir configurationformat settingspublishConfig for publishingdts: true.d.ts files are generated# Generate exports
tsdown --exports
# With publint validation
tsdown --exports --publint
# Export all files
tsdown --exports
# With dev exports
tsdown --exports