# Package Validation (publint & attw) Validate your package configuration and type declarations before publishing. ## Overview tsdown integrates with [publint](https://publint.dev/) and [Are the types wrong?](https://arethetypeswrong.github.io/) (attw) to catch common packaging issues. Both are optional dependencies. ## Installation ```bash # publint only npm install -D publint # attw only npm install -D @arethetypeswrong/core # both npm install -D publint @arethetypeswrong/core ``` ## publint Checks that `package.json` fields (`exports`, `main`, `module`, `types`) match your actual output files. ### Enable ```ts export default defineConfig({ publint: true, }) ``` ### Configuration ```ts export default defineConfig({ publint: { level: 'error', // 'warning' | 'error' | 'suggestion' }, }) ``` ### CLI ```bash tsdown --publint ``` ## attw (Are the types wrong?) Verifies TypeScript declarations are correct across different module resolution strategies (`node10`, `node16`, `bundler`). ### Enable ```ts export default defineConfig({ attw: true, }) ``` ### Configuration ```ts export default defineConfig({ attw: { profile: 'node16', // 'strict' | 'node16' | 'esm-only' level: 'error', // 'warn' | 'error' ignoreRules: ['false-cjs', 'cjs-resolves-to-esm'], }, }) ``` ### Profiles | Profile | Description | |---------|-------------| | `strict` | Requires all resolutions to pass (default) | | `node16` | Ignores `node10` resolution failures | | `esm-only` | Ignores `node10` and `node16-cjs` resolution failures | ### Ignore Rules Suppress specific problem types with `ignoreRules`: | Rule | Description | |------|-------------| | `no-resolution` | Module could not be resolved | | `untyped-resolution` | Resolution succeeded but has no types | | `false-cjs` | Types indicate CJS but implementation is ESM | | `false-esm` | Types indicate ESM but implementation is CJS | | `cjs-resolves-to-esm` | CJS resolution points to an ESM module | | `fallback-condition` | A fallback/wildcard condition was used | | `cjs-only-exports-default` | CJS module only exports a default | | `named-exports` | Named exports mismatch between types and implementation | | `false-export-default` | Types declare a default export that doesn't exist | | `missing-export-equals` | Types are missing `export =` for CJS | | `unexpected-module-syntax` | File uses unexpected module syntax | | `internal-resolution-error` | Internal resolution error in type checking | ### CLI ```bash tsdown --attw ``` ## CI Integration Both tools support CI-aware options: ```ts export default defineConfig({ publint: 'ci-only', attw: { enabled: 'ci-only', profile: 'node16', level: 'error', }, }) ``` Both tools require a `package.json` in your project directory. ## Related Options - [CI Environment](advanced-ci.md) - CI-aware option details - [Package Exports](option-package-exports.md) - Auto-generate exports field