963 markdown files reformatted with the repository's pinned prettier so pnpm format:check covers the folded tree like every other repo file. The formatter's embedded-language pass also normalized code fences (TS semicolons, closed HTML tags in examples, lowercased CSS hex colors, one renumbered list that skipped an index). Alphanumeric token deltas vs the fold commit were audited file-by-file; all are formatter-equivalent markup normalizations plus the four sanitized skills.
3.4 KiB
3.4 KiB
Package Validation (publint & attw)
Validate your package configuration and type declarations before publishing.
Overview
tsdown integrates with publint and Are the types wrong? (attw) to catch common packaging issues. Both are optional dependencies.
Installation
# 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
export default defineConfig({
publint: true,
});
Configuration
export default defineConfig({
publint: {
level: 'error', // 'warning' | 'error' | 'suggestion'
},
});
CLI
tsdown --publint
attw (Are the types wrong?)
Verifies TypeScript declarations are correct across different module resolution strategies (node10, node16, bundler).
Enable
export default defineConfig({
attw: true,
});
Configuration
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
tsdown --attw
CI Integration
Both tools support CI-aware options:
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 - CI-aware option details
- Package Exports - Auto-generate exports field