Monorepos & Workspaces
Workspaces are handled out-of-the-box by Knip.
Workspaces are sometimes also referred to as package-based monorepos, or as
packages in a monorepo. Knip uses the term workspace exclusively to indicate a
directory that has a package.json
.
Configuration
Here’s example configuration with custom entry
and project
patterns:
Each workspace has the same default configuration.
The root workspace is named "."
under workspaces
(like in the example
above).
Workspaces
Knip reads workspaces from four possible locations:
- The
workspaces
array inpackage.json
(npm, Bun, Yarn, Lerna) - The
packages
array inpnpm-workspace.yaml
(pnpm) - The
workspaces.packages
array inpackage.json
(legacy) - The
workspaces
object in Knip configuration
The workspaces
in Knip configuration (4) not already defined in the root
package.json
or pnpm-workspace.yaml
(1, 2, 3) are added to the analysis.
For projects with only a root package.json
, please see integrated
monorepos.
Additional workspaces
If a workspaces is not configured as such in package.json#workspaces
(or
pnpm-workspace.yaml
) it can be added to the Knip configuration manually. Add
their path to the workspaces
configuration object the same way as
"packages/cli": {}
in the example above.
Source mapping
Let’s say we have this module in a monorepo that imports helper
from another
workspace in the same monorepo:
The target workspace @org/shared
has this package.json
:
The module resolver will resolve @org/shared
to dist/index.js
. That file is
usually compiled and git-ignored, while Knip wants the source file instead. If
the target workspace has a tsconfig.json
file with an outDir
option, Knip
will try to map the “dist” file to the “src” file:
If src/index.ts
exists, Knip will use that file instead of dist/index.js
.
Currently this only works based on tsconfig.json
, in the future more source
mappings may be added.
Additional options
The following options are available inside workspace configurations:
Plugins can be configured separately per workspace.
Use --debug
for verbose output and see the workspaces Knip includes, their
configurations, enabled plugins, glob options and resolved files.
Lint a single workspace
Use the --workspace
(or -W
) argument to focus on a single workspace (and let
Knip run faster). Example:
This will include the target workspace, but also ancestor and dependent workspaces. For two reasons:
- Ancestor workspaces may list dependencies in
package.json
the linted workspace uses. - Dependent workspaces may reference exports from the linted workspace.
To lint the workspace in isolation, there are two options:
- Combine the
workspace
argument with strict production mode. - Run Knip from inside the workspace directory.
ISC License © 2024 Lars Kappert