Biome v2 の GritQL での Linter Plugins を試す

🏖️
note

Biome v2 がリリースされ、β 版の機能として Linter Plugins が追加された。

実装は GritQL によるパターンマッチングをベースに作られていて、現状 Fix はできず検出のみとなっている。

まだ β 版という前提はありつつも、 ESLint でやっているような Monorepo 内での期待しない import の検出ができれば乗り換え1ができるなと思い、以下のようなルールを試した。

or {
    `import $_ from $path`,
    `import { $_ } from $path`,
    `import * as $_ from $path`,
} where {
    $path <: `'@project/theModule'`,
    register_diagnostic(
        span = $path,
        message = "このパッケージから theModule へ依存することは出来ません。",
        severity = "error"
    )
}

これを同じく v2 で追加された Monorepo サポートと兼用しパッケージ事に設定することで、泥臭いながらも期待するものはある程度実現できる。ただ、Side Effect Import の場合にうまくいかず、以下が動作うまくしなくてハマっていた。

`import $path` where {
    $path <: `'@project/theModule'`,
    register_diagnostic(
        span = $path,
        message = "このパッケージから theModule へ依存することは出来ません。",
        severity = "error"
    )
}

$path 周りの記述の仕方をいくつか試したが、 biome search でもマッチングがうまくいかなかった。

$ npx biome search '`import $path`' 
Searched 57 files in 95ms. Found 0 matches.

一方で以下は動作するので、単純に実装が間に合っていないだけなのかもしれないが詳しくは調べていない。

`import '$_'` as $import where {
    register_diagnostic(
        span = $import,
        message = "Side Effect Import は禁止されています。",
        severity = "error"
    )
}

Refs

このスライドで Rust 系のツールも Plugin システムに対応しつつあることを知った

Footnotes

  1. https://yaakai.to/blog/2025/cline-repository-refactoring/ でこのカスタムルールが書きたくて Biome → ESLint にした

yaakai.to