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
syumai
May 21, 2026
Programming
130
0
Share
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
TSKaigi 2026の発表資料です
syumai
May 21, 2026
More Decks by syumai
See All by syumai
『[入門] Cloudflare Workers』本はなぜ誕生したのか
syumai
0
310
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
9
3k
知られているようで知られていない JavaScriptの仕様 4選
syumai
3
1.2k
CloudflareのSandbox SDKを試してみた
syumai
0
800
実践AIチャットボットUI実装入門
syumai
9
4.1k
ProxyによるWindow間RPC機構の構築
syumai
3
1.5k
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
2
1.2k
Go製CLIツールをnpmで配布するには
syumai
3
2k
MCPで実現できる、Webサービス利用体験について
syumai
7
3k
Other Decks in Programming
See All in Programming
t *testing.T は どこからやってくるの?
otakakot
1
940
【ディップ|26年新卒研修資料】OpenAPI/Swagger REST API研修
dip_tech
PRO
0
170
いつか誰かが、と思っていた フロントエンド刷新5年間の実践知
kiichisugihara
1
280
【ディップ|26年新卒研修資料】TDD実装演習
dip_tech
PRO
0
190
書き換えて学ぶTemporal #fukts
pirosikick
2
380
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
200
[BalkanRuby 2026] Drop your app/services!
palkan
0
110
AIを導入する前にやるべきこと
negima
2
360
「なんか〇〇ライブラリで脆弱性あるみたいなんだけど。。。」から始める脆弱性対応 / First Steps in Vulnerability Response
mackey0225
2
130
要はバランスからの卒業 #yumemi_grow
kajitack
0
170
AI時代になぜ書くのか
mutsumix
0
410
UaaL×Androidアプリのメモリ計測 — Memory Profilerの先へ
rio432
0
160
Featured
See All Featured
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.7k
Chasing Engaging Ingredients in Design
codingconduct
0
190
Joys of Absence: A Defence of Solitary Play
codingconduct
1
360
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.8k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Accessibility Awareness
sabderemane
1
120
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Typedesign – Prime Four
hannesfritz
42
3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
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