Oxlint eslint-plugin rule implementation

1.1K Views

June 20, 26

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Oxlint eslint-plugin rule implementation TSKaigi 2026事後勉強会 / #tskaigi_smarthr / fujitani sora

2.

fujitani sora 2001 (25) toridori inc engineer x.com/sorafujitani github.com/sorafujitani sorafujitani.me TSKaigi2026 振り返りレポート

3.

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

4.

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 にもある。

5.

"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")

6.
[beta]
.oxlintrc.json
1

から有効化する。

{

2

"plugins": ["node"],

3

"rules": {

4

"node/prefer-global-console": ["warn", "always"]

5
6

}
}

"always"

はグローバル console 、 "never" は module 側を使う設定。

7.

PR #23610 で追加されたもの。 rule 本体、診断、検出ロジック、テストを実装する prefer_global_console.rs rule を Oxlint の実行経路に登録する rules_enum.rs / rule_runner_impls.rs .oxlintrc.json から設定できるようにする configuration_schema.json / config.generated.ts

8.
[beta]
.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": { ... }

9.

module 経由の console を見つける 変数宣言を見る const console = require("console") const console = require("node:console") import 宣言を見る import console from "node:console" import * as console from "node:console"

10.
[beta]
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

},

11.

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

12.

rule 本体を実装する 実行経路と schema も更新する test plan では rule、schema / 型定義、formatting を確認する

13.

see you later 👋