@yuu1111/knip-config
Shared Knip configuration.
Install
bun add -D @yuu1111/knip-config knipUsage
Knip loads knip.ts, so import the preset that matches the project and add the entries it cannot infer:
import { application } from "@yuu1111/knip-config/application"
export default {
...application,
entry: ["src/main.ts"]
}Presets
| Preset | includeEntryExports | Use case |
|---|---|---|
base | — | Shared defaults |
application | false | Applications whose entry points a framework resolves |
library | true | Libraries whose entry points are their public API |
base
Every preset extends base.
| Setting | Value |
|---|---|
entry | ["quality.json"] |
ignoreExportsUsedInFile | true |
treatConfigHintsAsErrors | true |
treatTagHintsAsErrors | true |
quality-check loads quality.json at run time, so the file counts as an entry point and is not reported as unused. ignoreExportsUsedInFile keeps its exports out of the report, because the public API of a consuming project is the API of quality-check and not the exports of this file. treatConfigHintsAsErrors fails the run when a configuration no longer matches the project. treatTagHintsAsErrors fails the run when a suppression tag no longer suppresses anything.
application
Sets includeEntryExports: false, because the entry points of an application are not a public contract.
library
Sets includeEntryExports: true, so an export that is no longer part of the public API is reported.
Config
A shared preset cannot see dynamic entry points, CLI binaries, or generated files, so the project adds them.
entry is replaced when the project writes its own, so list quality.json too:
export default {
...application,
entry: ["src/main.ts", "quality.json"]
}workspaces does not inherit the top-level entry in the root workspace, so move entry there:
import { application } from "@yuu1111/knip-config/application"
const { entry, ...base } = application
export default {
...base,
workspaces: {
".": { entry },
"packages/app": { entry: ["src/cli.ts"] }
}
}Knip prints a configuration hint when a repository with workspaces also writes entry at the top level, and base fails the run on a hint.
A repository that also holds another project keeps it out of the report with ignore, so its files are not read as source of the parent:
export default {
...application,
ignore: ["another-project/**"]
}