Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
syumai
May 21, 2026
Programming
1.1k
2
Share
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
TSKaigi 2026の発表資料です
syumai
May 21, 2026
More Decks by syumai
See All by syumai
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.5k
Oxlintのカスタムルールの現況
syumai
5
980
『[入門] Cloudflare Workers』本はなぜ誕生したのか
syumai
0
360
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
9
3.1k
知られているようで知られていない JavaScriptの仕様 4選
syumai
3
1.2k
CloudflareのSandbox SDKを試してみた
syumai
0
840
実践AIチャットボットUI実装入門
syumai
9
4.2k
ProxyによるWindow間RPC機構の構築
syumai
3
1.5k
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
2
1.2k
Other Decks in Programming
See All in Programming
dRuby over BLE
makicamel
2
300
さぁV100、メモリをお食べ・・・
nilpe
0
130
権限チェックの一貫性を型で守る TypeScript による多層防御
mnch
4
1.1k
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
160
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
240
Inside Stream API
skrb
1
620
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
430
Why Laravel apps break—Mastering the fundamentals to keep them maintainable
kentaroutakeda
1
330
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
170
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
GitHub Copilot CLIのいいところ
htkym
2
1.2k
AIエージェントの隔離技術の徹底比較
kawayu
0
460
Featured
See All Featured
New Earth Scene 8
popppiees
3
2.3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
エンジニアに許された特別な時間の終わり
watany
107
250k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
Joys of Absence: A Defence of Solitary Play
codingconduct
1
380
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
230
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
First, design no harm
axbom
PRO
2
1.2k
Building AI with AI
inesmontani
PRO
1
1k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
Transcript
Oxlintはいかにして tsgolintのlint ruleを呼び出しているのか 2026-5-22 TSKaigi 2026 @syumai
syumai X: @__syumai Website: https://syum.ai © LayerX Inc. whoami LayerX
ソフトウェアエンジニア バクラクヘルプデスク エージェントを開発中 主にTypeScriptを書いてます ECMAScript 仕様輪読会 / Asakusa.go 主催
今日話すこと © LayerX Inc. Oxlintとは tsgolintとは tsgolintのlintルールの書き方 Oxlintによるtsgolintの呼び出し方法 3
Oxlintとは © LayerX Inc. Oxcプロジェクトのlinter https://oxc.rs/ Rust製の高速なJavaScript向けTool chain Oxcはlinter, formatter,
parser, transformerなどを含む ESLint互換が特徴 設定はESLint v8の形式 (Flat configは非対応、migration toolあり) ESLintのJS pluginも動作する (v9以降のAPIをサポート) 開発元はViteを開発するVoidZero (https://voidzero.dev/) OxlintはVite+の vp check サブコマンドとして取り込まれている 4
https://oxc.rs/#feature-linter © LayerX Inc. 5
https://viteplus.dev/#feature-check © LayerX Inc. 6
Oxlintとは © LayerX Inc. Oxlint単体では、TypeScriptの型情報を使ったlintができない 構文解析のみで対応できるものはサポートしている no-explicit-any など 型情報がないと対応できないlintルールもある no-floating-promises
, no-for-in-array など 7
https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-explicit-any © LayerX Inc. 8
https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-explicit-any © LayerX Inc. 9
https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-explicit-any © LayerX Inc. 10
https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-for-in-array © LayerX Inc. 11
https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-for-in-array © LayerX Inc. 12
https://oxc.rs/docs/guide/usage/linter/rules/typescript/no-for-in-array © LayerX Inc. 13
tsgolintとは © LayerX Inc. 元は、2025年7月にtypescript-eslintのチームがリリースしたtsgoベースのLinter https://github.com/typescript-eslint/tsgolint これを、Oxcプロジェクトとしてforkし、Oxlintと連携できるようにしたもの https://github.com/oxc-project/tsgolint 実装は全部Go tsgoのinternal
packageの中身を無理矢理公開して使用 Oxlint + tsgolintはESLint + typescript-eslintより10倍程度速いらしい https://oxc.rs/blog/2025-12-08-type-aware-alpha.html#performance 14
https://speakerdeck.com/syumai/how-tsgolint-exposes-typescript-gos-private-apis (アーカイブあり) © LayerX Inc. 15
Oxlint + tsgolintの使い方 © LayerX Inc. 16
tsgolintによるlint ruleの書き方 © LayerX Inc. tsgolintが内部で利用可能な形で公開したtsgoのast / checker packageを使って解析 ast
packageで、欲しいNodeを探す checker packageで、欲しい型情報とのマッチを確認 17
no-for-in-arrayの例 https://github.com/oxc-project/tsgolint/blob/v0.23.0/internal/rules/no_for_in_array/no_for_in_array.go © LayerX Inc. 18
no-for-in-arrayの例 https://github.com/oxc-project/tsgolint/blob/v0.23.0/internal/rules/no_for_in_array/no_for_in_array.go © LayerX Inc. 19
no-for-in-arrayの例 https://github.com/oxc-project/tsgolint/blob/v0.23.0/internal/rules/no_for_in_array/no_for_in_array.go © LayerX Inc. 20
https://github.com/oxc-project/tsgolint/tree/v0.23.0/internal/rules © LayerX Inc. 21
cmd/tsgolint/main.go でルールを登録している https://github.com/oxc-project/tsgolint/blob/v0.23.0/cmd/tsgolint/main.go#L162-L172 © LayerX Inc. 22
自分でもtype-awareなruleを入れてみたい!
どうやって入れる?
仮説 © LayerX Inc. Oxlintとtsgolintは別々に配布されている tsgolint側だけforkしてruleを足したら動く のでは? → Oxlintがどのようにtsgolintのバイナリを探すか調べた 25
Oxlintによるtsgolintバイナリの探索 https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/tsgolint.rs#L45-L48 © LayerX Inc. Oxlintにそれらしいコードを発見 26
Oxlintによるtsgolintバイナリの探索 https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/tsgolint.rs#L1259-L1266 © LayerX Inc. OXLINT_TSGOLINT_PATH 環境変数か、 node_modules/.bin からパスを入手していた 27
やったこと © LayerX Inc. tsgolintをforkし、独自のルールを追加 require-error-cause を足してみた 興味があれば: https://github.com/syumai/tsgolint-custom forkしたtsgolintをビルド
OXLINT_TSGOLINT_PATH にビルドしたバイナリのパスを指定 Oxlintの設定で独自ルールを有効化、lintを実行 → 結果、何も検出されず失敗 28
なぜ失敗したのか?
補足: plugin ではないです (当時の勘違い) https://x.com/__syumai/status/2028114581714063731 © LayerX Inc. 30
Oxlint側のtsgolintルール定義 https://github.com/oxc-project/oxc/pull/19446 © LayerX Inc. prefer-read-only を見てみた 31
PRの変更ファイル一覧から、Oxlint側のtypescriptのrule定義一覧を発見 https://github.com/oxc-project/oxc/tree/56a7feb22fdfd82ea4e52a376cfcf3ca6f7388cd/crates/oxc_linter/src/rules/typescript © LayerX Inc. 32
prefer-readonly の定義の例 type-aware なルールは (tsgolint) の指定がある https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/rules/typescript/prefer_readonly.rs © LayerX Inc.
33
no-explicit-any の定義の例 type-aware でないルールは (tsgolint) の指定がない https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/rules/typescript/no_explicit_any.rs © LayerX Inc.
34
declare_oxc_lint マクロ マクロへの引数のパース時に (tsgolint) のmarkerを探して、 is_tsgolint_rule: true のルールとして登録 https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_macros/src/declare_oxc_lint.rs#L79-L97 ©
LayerX Inc. 35
実行の流れ
実行の流れ © LayerX Inc. Oxlintを実行 lintルールの実行に進む 通常のルールは、Oxlint側で実行 is_tsgolint_rule が有効なルールは、Oxlint側で実行せずフォールバック type-aware
lintingが有効な場合は、tsgolintを子プロセスとしてヘッドレスで起動 Oxlintの実行結果と、tsgolintの実行結果をまとめてfix / report 37
lintルール実行時の is_tsgolint_rule のフォールバック is_tsgolint_rule が有効なルールをskipする https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/lib.rs © LayerX Inc. 38
tsgolintのヘッドレスでの起動 tsgolintの実行パスを探して tsgolint headless を実行、stdin / stdoutを接続する © LayerX Inc.
39
Oxlint → tsgolintの通信処理 https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/tsgolint.rs © LayerX Inc. JSONでstdinに書き込む lint対象のファイルパス、使用するルールなどの情報を含んでいる 40
tsgolint → Oxlintの通信処理 https://github.com/oxc-project/oxc/blob/oxlint_v1.66.0/crates/oxc_linter/src/tsgolint.rs © LayerX Inc. lint結果のdiagnosticsをバイナリエンコードで返す Oxlint側の TsGoLintMessageStream
でパースして、Oxlint側ルールの診断結果とまとめる 41
まとめ © LayerX Inc. tsgolintは、typescript-goの内部機能を使ってtype-awareなlintルールを実装している Oxlintから実行できるtype-awareなGo製のルールを簡単に追加する方法はない Oxlintとtsgolintの両方を変更 する必要がある Oxlintはtsgolintを子プロセスとして起動し、stdin /
stdoutで通信している tsgolintへの入力はJSON、出力は独自のバイナリフォーマット 42