Oxlint eslint-plugin rule implementation TSKaigi 2026事後勉強会 / #tskaigi_smarthr / fujitani sora
fujitani sora 2001 (25) toridori inc engineer x.com/sorafujitani github.com/sorafujitani sorafujitani.me TSKaigi2026 振り返りレポート
Oxlint は TypeScript / JavaScript の lint を高速に実行するツール。 既存の ESLint plugin の rule と同じ名前・同じ挙動に寄せて実装される rule群 とその 移行計画がある Linter Product Plan and Progress node/prefer-global-console も、eslint-plugin-n の n/prefer-global/console 相当の rule Issue: https://github.com/oxc-project/oxc/issues/493 PR: https://github.com/oxc-project/oxc/pull/23610
node/prefer-global-console は console の使い方を揃える rule。 グローバル console 1 // 2 console.log("hello") 3 から import 4 // console module 5 import console from "node:console" 6 console.log("hello") Node.js では console はグローバルにも module にもある。
"always" では、console module からの import / require を避ける。 1 // NG 2 import console from "node:console" 3 console.log("hello") 4 5 // OK 6 console.log("hello") CommonJS でも同じ。 1 // NG 2 const console = require("console")
.oxlintrc.json
1
から有効化する。
{
2
"plugins": ["node"],
3
"rules": {
4
"node/prefer-global-console": ["warn", "always"]
5
6
}
}
"always"
はグローバル console 、 "never" は module 側を使う設定。
PR #23610 で追加されたもの。 rule 本体、診断、検出ロジック、テストを実装する prefer_global_console.rs rule を Oxlint の実行経路に登録する rules_enum.rs / rule_runner_impls.rs .oxlintrc.json から設定できるようにする configuration_schema.json / config.generated.ts
.oxlintrc.json
生成コマンド
から読める schema と型定義。
cargo lintgen && just linter-schema-json && just linter-config-ts
生成されるもの
: TS 側の rule 名と option 型
configuration_schema.json : JSON schema 側の rule 名と option 型
config.generated.ts
1
// apps/oxlint/src-js/package/config.generated.ts:1227
2
"node/prefer-global-console"?: RuleNoConfig | [
3
AllowWarnDeny,
4
PreferGlobalConsoleMode,
5
];
6
7
// npm/oxlint/configuration_schema.json:5758
8
"node/prefer-global-console": { ... }
module 経由の console を見つける 変数宣言を見る const console = require("console") const console = require("node:console") import 宣言を見る import console from "node:console" import * as console from "node:console"
crates/oxc_linter/src/rules/node/prefer_global_console.rs:90-102
のときだけ module 経由の console を検出
前のページの「変数宣言」と「import 宣言」を分岐して見る
Always
1
PreferGlobalConsoleMode::Always => match node.kind() {
2
AstKind::VariableDeclarator(var_decl) => {
3
if let Some(span) = module_console_binding_span(var_decl) {
4
ctx.diagnostic(prefer_global_diagnostic(span));
5
}
6
}
7
AstKind::ImportDeclaration(import_decl) => {
8
if let Some(span) = imported_console_span(import_decl) {
9
ctx.diagnostic(prefer_global_diagnostic(span));
10
}
11
}
12
_ => {}
13
},
PR本文の test plan。 rule の pass / fail case を確認する cargo test -p oxc_linter --lib prefer_global_console schema と型定義の更新漏れを確認する cargo lintgen && just linter-schema-json && just linter-config-ts && git diff --exit-code formatting を確認する just fmt
rule 本体を実装する 実行経路と schema も更新する test plan では rule、schema / 型定義、formatting を確認する
see you later 👋