Oxc (oxlint and oxfmt)
Learn how to use oxlint and oxfmt in your Turborepo projects.
Oxc is a collection of high-performance JavaScript and TypeScript tools written in Rust, including oxlint (a fast linter) and oxfmt (a fast formatter).
Using Oxc tools with Turborepo
Similar to Biome, oxlint and oxfmt are extraordinarily fast tools. For this reason, we recommend using Root Tasks rather than creating separate scripts in each of your packages.
Caching behavior
Using oxlint or oxfmt at the root of the project will result in cache misses for all tasks when you upgrade versions or change configuration. If you prefer the tradeoff of higher cache hit ratios in these situations over less configuration, you can still run these tools in separate scripts like the other recommendations in our guides.
Setting up oxlint
Install oxlint
First, install oxlint in your repository:
pnpm add --save-dev oxlintyarn add --dev oxlintnpm install --save-dev oxlintbun add --dev oxlintCreate scripts
Add scripts to the root package.json of your repository:
{
"scripts": {
"lint": "oxlint .",
"lint:fix": "oxlint --fix ."
}
}Create root tasks
Register the scripts to Turborepo as Root Tasks:
{
"tasks": {
"//#lint": {},
"//#lint:fix": {
"cache": false
}
}
}You can now run turbo run lint to lint your entire repository.
Type-aware linting
If you enable type-aware linting rules in oxlint, the linter needs TypeScript type information to work correctly. This means any dependencies that must be built before type-checking (such as internal packages in your monorepo) also need to be built before linting.
Run your builds before linting in CI:
turbo run build --filter=./packages/* && turbo run lintAlternatively, you can switch to per-package lint tasks with dependsOn: ["^build"] to let Turborepo handle the ordering for you.
Setting up oxfmt
oxfmt is a fast code formatter for JavaScript and TypeScript, designed to be a drop-in replacement for Prettier.
oxfmt is experimental
oxfmt is currently in alpha and may not have full feature parity with Prettier. Check the oxfmt documentation for the latest status and supported options.
Install oxfmt
Install oxfmt as a dev dependency:
pnpm add --save-dev oxfmtyarn add --dev oxfmtnpm install --save-dev oxfmtbun add --dev oxfmtCreate scripts
Add formatting scripts to the root package.json:
{
"scripts": {
"format": "oxfmt --check",
"format:fix": "oxfmt ."
}
}Create root tasks
Register the scripts to Turborepo:
{
"tasks": {
"//#format": {},
"//#format:fix": {
"cache": false
}
}
}You can now run turbo run format to check formatting and turbo run format:fix to format your code.
Using oxlint and oxfmt together
For repositories using both tools, you can orchestrate them with a unified quality task:
{
"scripts": {
"lint": "oxlint .",
"lint:fix": "oxlint --fix .",
"format": "oxfmt --check",
"format:fix": "oxfmt ."
}
}{
"tasks": {
"//#quality": {
"dependsOn": ["//#lint", "//#format"]
},
"//#quality:fix": {
"dependsOn": ["//#lint:fix", "//#format:fix"]
},
"//#lint": {},
"//#lint:fix": {
"cache": false
},
"//#format": {},
"//#format:fix": {
"dependsOn": ["//#lint:fix"],
"cache": false
}
}
}With this configuration:
- Run
turbo run qualityto check both linting and formatting in parallel (safe because neither modifies files) - Run
turbo run quality:fixto fix both linting and formatting issues, with formatting running after lint fixes to avoid file write race conditions