eslint-migrate-options について
eslint-migrate-optionsは、ESLintルールのオプションをBiome設定へ独自に移行するための開発スキルです。入力モデル、意味の変換、型付きディスパッチ、移行処理、フィクスチャテストを扱います。
主な機能
- 01ESLintオプションペイロードのモデル化
- 02Biomeオプションへの意味変換
- 03型付きルールディスパッチの追加
- 04重大度処理後の独自移行の接続
- 05移行フィクスチャと境界条件のテスト
活用シーン
- 01対応するESLintルールオプションの保持
- 02入れ子のルール設定の移行
- 03デフォルト値と未対応フィールドの検証
- 04独自移行の変更確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ biomejs/ biome --skill eslint-migrate-optionsインストール後、Claude Code で/eslint-migrate-optionsを入力して読み込まれたか確認します。
詳細
ESLint オプションの移行
既存の Biome ルールで意味のある ESLint オプションを保持する必要がある場合にのみ、カスタムマイグレーターを使用します。重大度のみの移行は、生成されたルールマッピングで処理します。
前提条件
編集する前に、以下を確認してください。
- Biome ルールとそのオプション型がすでに存在すること。
- ルールのメタデータで ESLint のソースルールが特定されていること。
- 生成された重大度の移行がすでに存在する、または再生成されること。
- ESLint またはプラグインの公式ドキュメントで、正確なオプションの形式とデフォルト値が確認できること。
- サポートされる Biome のセマンティクスが明確であること。ソース側の未サポートオプションも含みます。
Biome ルール自体やそのオプションをまだ実装する必要がある場合は、lint-rule-development を読み込んでください。
パイプライン
カスタム移行は、次の 4 つの部分で構成されます。
- プラグイン固有の型で ESLint のペイロードをデシリアライズします。
- 変換処理でソースのセマンティクスを Biome のオプション型にマッピングします。
- 共通の ESLint
Ruleenum で、そのルールを型付きバリアントとして認識します。 migrate_eslint_rule()で共通の重大度処理の後に、生成された Biome 設定を適用します。
主なファイル
| ファイル | 役割 |
|---|---|
eslint_eslint.rs | 共通の設定モデル、Rule、RuleConf<T>、ディスパッチ |
eslint_unicorn.rs | Unicorn のオプション型と変換処理 |
eslint_typescript.rs | TypeScript ESLint のオプション型と変換処理 |
eslint_jsxa11y.rs | JSX アクセシビリティのオプション型と変換処理 |
eslint_to_biome.rs | 主な変換処理とカスタム移行の分岐 |
eslint_any_rule_to_biome.rs | 生成された重大度マッピング |
tests/specs/migrate_eslint/ | フィクスチャー駆動の移行スナップショット |
ソースルールに対応するプラグイン固有のモジュールを使用し、同様のペイロードと Biome 設定型を扱う既存のマイグレーターを確認してください。
ソースオプションをモデル化する
Biome の変換先の形ではなく、ESLint の JSON 形式をモデル化してください。
- 変換するまでソースのネスト構造を保持します。
- ソースで省略可能なフィールドは、オプションのフィールドとして定義します。
- 近隣のオプション型における現在のデシリアライズ時の命名規則とデフォルト値の規則に合わせます。
- サポート対象の実際の設定をデシリアライズするために必要なフィールドをモデル化します。
- 未サポートのソースフィールドが有効な設定の読み込みを失敗させないことを確認します。それらを明示的なフィールドとして定義する必要があるかどうかは、現在のデシリアライザーの仕様によります。
ソースと変換先のデフォルト値が同等だと決めつけないでください。
セマンティクスを変換する
ソースオプション型の近くに変換処理を実装します。
- ESLint と Biome で用語が異なる場合は、概念を適切に対応付けます。
- 未サポートの動作は意図的に除外します。
- 空のネストされたオプションオブジェクトを出力しないようにします。
- Biome のデフォルト値を付与することで重大度のみの動作が変わる場合は、省略された状態を保持します。
- 正規化や条件付き構築に意味がある場合は、小さなヘルパーを使用します。
フィールドを単純に一対一で代入するのではなく、分岐から未サポートの動作とデフォルトの扱いが明確に分かるようにします。
型付き Rule バリアントを追加する
eslint_eslint.rs の型付きディスパッチ箇所をすべて更新します。
RuleにRuleConf<SourceOptions>を追加します。Rule::name()で正確な ESLint ルール名を返します。- フォールバックの catch-all より前に、その名前を型付きバリアントとしてデシリアライズします。
バリアントを追加した後は、enum の match 箇所を検索し、古いままのディスパッチ箇所が残っていないことを確認します。
移行を組み込む
migrate_eslint_rule() にカスタム分岐を追加し、先に migrate_eslint_any_rule() を呼び出します。共通処理では、重大度の追跡、未サポートルールの報告、重複排除を行います。
変換先ルールの実際のグループと設定型を使用します。
- 修正可能なルールには
RuleFixConfiguration::WithOptionsを使用します。 - 修正不可能なルールには
RuleConfiguration::WithOptionsを使用します。
ソーススキーマに合った RuleConf のアクセス方法を選びます。
- 重大度のみの入力をソースのデフォルト値に基づいて変換する場合は、
option_or_default()を使用します。 - オプションが指定された場合にのみオプションを適用する場合は、
RuleConf::Optionと明示的に照合します。 - 集約や正規化が必要な配列ペイロードには
into_vec()を使用します。
構造体のフィールドを記憶に頼って指定するのではなく、現在の類似する分岐をコピーしてください。
テスト
以下を対象とするフィクスチャを crates/biome_cli/tests/specs/migrate_eslint/ に追加します。
- severity のみの設定
- サポートされている各オプションモード
- それ以外は有効な入力に含まれる未サポートのフィールド
- 空のネストされたオブジェクトと一部のみ指定されたネストされたオブジェクト
- ESLint と Biome でデフォルトが異なる場合
- マージ動作が重要となる、既存の Biome 設定
対象を絞ったマイグレーションテストを実行し、隣接するスナップショットも確認します。マイグレーションの出力がルールのセマンティクスに依存する場合は、アナライザーのオプションテストも実行します。
一般的なコマンド:
cargo check -p biome_cli
cargo test -p biome_cli migrate_eslint
レビューチェックリスト
- ソースの型が公式の ESLint 設定と一致していること。
- 変換が名前を機械的に対応付けるのではなく、セマンティクスを対応付けていること。
- severity のみの場合の動作が正しいこと。
- 型付きバリアント、名前、デシリアライズ、マイグレーションがすべて揃っていること。
- カスタムオプションを設定する前に、共通の severity マイグレーションが実行されること。
- グループと修正可能性が移行先のルールと一致していること。
- フィクスチャで、省略、デフォルト、未サポートのフィールド、ネストされたオプションを網羅していること。
参考資料
- マイグレーションの実装:
crates/biome_cli/src/execute/migrate/ - ルールのオプション:
crates/biome_rule_options/src/ - 生成されるマッピング:
xtask/codegen/src/generate_migrate_eslint.rs - ESLint のドキュメント:https://eslint.org/docs/latest/use/configure/rules