Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
Search
syumai
May 21, 2026
Programming
1.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
TSKaigi 2026の発表資料です
syumai
May 21, 2026
More Decks by syumai
See All by syumai
Workers Cache を知る
syumai
0
410
自分的「カンファレンスの楽しみ方」
syumai
0
230
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.6k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
2.2k
Oxlintのカスタムルールの現況
syumai
6
2.2k
『[入門] Cloudflare Workers』本はなぜ誕生したのか
syumai
0
670
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
9
3.4k
知られているようで知られていない JavaScriptの仕様 4選
syumai
3
1.3k
CloudflareのSandbox SDKを試してみた
syumai
0
1.2k
Other Decks in Programming
See All in Programming
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
200
ChromeでローカルLLM
ryu1013
0
190
DroidKnights 2026 Android A2UI Jetpack Compose 기반의 안전한 AI UI 렌더링 - 박제창
itsmedreamwalker
1
150
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
140
まずはコードより業務と向き合う:テーブル解体のためにPdMを呼んだ話
sakawe_ee
0
140
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
510
AI駆動開発4年目の現在地(『あなたはFDEになるべきか?』イベント資料)
kumaiu
0
130
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
350
Event is what happens
moro
2
3.4k
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
270
Seven New Principles of Software Engineering
yegor256
0
440
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
400
Designing Powerful Visuals for Engaging Learning
tmiket
1
630
WCS-LA-2024
lcolladotor
0
970
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
23k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
280
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
620
Unsuck your backbone
ammeep
672
58k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
670
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
390
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