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>
310 lines
5.6 KiB
Markdown
310 lines
5.6 KiB
Markdown
# Dependencies
|
|
|
|
Control how dependencies are bundled or externalized.
|
|
|
|
## Overview
|
|
|
|
tsdown intelligently handles dependencies to keep your library lightweight while ensuring all necessary code is included.
|
|
|
|
## Default Behavior
|
|
|
|
### Auto-Externalized
|
|
|
|
These are **NOT bundled** by default:
|
|
|
|
- **`dependencies`** - Installed automatically with your package
|
|
- **`peerDependencies`** - User must install manually
|
|
|
|
### Conditionally Bundled
|
|
|
|
These are **bundled ONLY if imported**:
|
|
|
|
- **`devDependencies`** - Only if actually used in source code
|
|
- **Phantom dependencies** - In node_modules but not in package.json
|
|
|
|
## Configuration Options
|
|
|
|
### `external`
|
|
|
|
Mark dependencies as external (not bundled):
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
external: [
|
|
'react', // Single package
|
|
'react-dom',
|
|
/^@myorg\//, // Regex pattern (all @myorg/* packages)
|
|
/^lodash/, // All lodash packages
|
|
],
|
|
})
|
|
```
|
|
|
|
### `noExternal`
|
|
|
|
Force dependencies to be bundled:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
noExternal: [
|
|
'some-package', // Bundle this even if in dependencies
|
|
'vendor-lib',
|
|
],
|
|
})
|
|
```
|
|
|
|
### `skipNodeModulesBundle`
|
|
|
|
Skip resolving and bundling ALL node_modules:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
skipNodeModulesBundle: true,
|
|
})
|
|
```
|
|
|
|
**Result:** No dependencies from node_modules are parsed or bundled.
|
|
|
|
## Common Patterns
|
|
|
|
### React Component Library
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.tsx'],
|
|
format: ['esm', 'cjs'],
|
|
external: [
|
|
'react',
|
|
'react-dom',
|
|
/^react\//, // react/jsx-runtime, etc.
|
|
],
|
|
dts: true,
|
|
})
|
|
```
|
|
|
|
### Utility Library with Shared Deps
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
format: ['esm', 'cjs'],
|
|
// Bundle lodash utilities
|
|
noExternal: ['lodash-es'],
|
|
dts: true,
|
|
})
|
|
```
|
|
|
|
### Monorepo Package
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
format: ['esm', 'cjs'],
|
|
external: [
|
|
/^@mycompany\//, // Don't bundle other workspace packages
|
|
],
|
|
dts: true,
|
|
})
|
|
```
|
|
|
|
### CLI Tool (Bundle Everything)
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/cli.ts'],
|
|
format: ['esm'],
|
|
platform: 'node',
|
|
// Bundle all dependencies for standalone CLI
|
|
noExternal: [/.*/],
|
|
shims: true,
|
|
})
|
|
```
|
|
|
|
### Library with Specific Externals
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
format: ['esm', 'cjs'],
|
|
external: [
|
|
'vue',
|
|
'@vue/runtime-core',
|
|
'@vue/reactivity',
|
|
],
|
|
dts: true,
|
|
})
|
|
```
|
|
|
|
## Declaration Files
|
|
|
|
Dependency handling for `.d.ts` files follows the same rules as JavaScript.
|
|
|
|
### Complex Type Resolution
|
|
|
|
Use TypeScript resolver for complex third-party types:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
entry: ['src/index.ts'],
|
|
dts: {
|
|
resolver: 'tsc', // Use TypeScript resolver instead of Oxc
|
|
},
|
|
})
|
|
```
|
|
|
|
**When to use `tsc` resolver:**
|
|
- Types in `@types/*` packages with non-standard naming (e.g., `@types/babel__generator`)
|
|
- Complex type dependencies
|
|
- Issues with default Oxc resolver
|
|
|
|
**Trade-off:** `tsc` is slower but more compatible.
|
|
|
|
## CLI Usage
|
|
|
|
### External
|
|
|
|
```bash
|
|
tsdown --external react --external react-dom
|
|
tsdown --external '/^@myorg\/.*/'
|
|
```
|
|
|
|
### No External
|
|
|
|
```bash
|
|
tsdown --no-external some-package
|
|
```
|
|
|
|
## Examples by Use Case
|
|
|
|
### Framework Component
|
|
|
|
```ts
|
|
// Don't bundle framework
|
|
export default defineConfig({
|
|
external: ['vue', 'react', 'solid-js', 'svelte'],
|
|
})
|
|
```
|
|
|
|
### Standalone App
|
|
|
|
```ts
|
|
// Bundle everything
|
|
export default defineConfig({
|
|
noExternal: [/.*/],
|
|
skipNodeModulesBundle: false,
|
|
})
|
|
```
|
|
|
|
### Shared Library
|
|
|
|
```ts
|
|
// Bundle only specific utils
|
|
export default defineConfig({
|
|
external: [/.*/], // External by default
|
|
noExternal: ['tiny-utils'], // Except this one
|
|
})
|
|
```
|
|
|
|
### Monorepo Package
|
|
|
|
```ts
|
|
// External workspace packages, bundle utilities
|
|
export default defineConfig({
|
|
external: [
|
|
/^@workspace\//, // Other workspace packages
|
|
'react',
|
|
'react-dom',
|
|
],
|
|
noExternal: [
|
|
'lodash-es', // Bundle utility libraries
|
|
],
|
|
})
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Dependency Bundled Unexpectedly
|
|
|
|
Check if it's in `devDependencies` and imported. Move to `dependencies`:
|
|
|
|
```json
|
|
{
|
|
"dependencies": {
|
|
"should-be-external": "^1.0.0"
|
|
}
|
|
}
|
|
```
|
|
|
|
Or explicitly externalize:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
external: ['should-be-external'],
|
|
})
|
|
```
|
|
|
|
### Missing Dependency at Runtime
|
|
|
|
Ensure it's in `dependencies` or `peerDependencies`:
|
|
|
|
```json
|
|
{
|
|
"dependencies": {
|
|
"needed-package": "^1.0.0"
|
|
}
|
|
}
|
|
```
|
|
|
|
Or bundle it:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
noExternal: ['needed-package'],
|
|
})
|
|
```
|
|
|
|
### Type Resolution Errors
|
|
|
|
Use TypeScript resolver for complex types:
|
|
|
|
```ts
|
|
export default defineConfig({
|
|
dts: {
|
|
resolver: 'tsc',
|
|
},
|
|
})
|
|
```
|
|
|
|
## Summary
|
|
|
|
**Default behavior:**
|
|
- `dependencies` & `peerDependencies` → External
|
|
- `devDependencies` & phantom deps → Bundled if imported
|
|
|
|
**Override:**
|
|
- `external` → Force external
|
|
- `noExternal` → Force bundled
|
|
- `skipNodeModulesBundle` → Skip all node_modules
|
|
|
|
**Declaration files:**
|
|
- Same bundling logic as JavaScript
|
|
- Use `resolver: 'tsc'` for complex types
|
|
|
|
## Tips
|
|
|
|
1. **Keep dependencies external** for libraries
|
|
2. **Bundle everything** for standalone CLIs
|
|
3. **Use regex patterns** for namespaced packages
|
|
4. **Check bundle size** to verify external/bundled split
|
|
5. **Test with fresh install** to catch missing dependencies
|
|
6. **Use tsc resolver** only when needed (slower)
|
|
|
|
## Related Options
|
|
|
|
- [External](option-dependencies.md) - This page
|
|
- [Platform](option-platform.md) - Runtime environment
|
|
- [Output Format](option-output-format.md) - Module formats
|
|
- [DTS](option-dts.md) - Type declarations
|