eslint から oxlint に乗り換えようとして、疑問に思ったことをまとめておく。どれもドキュメントを読んでもよく分からなかった。oxlint のソースコードを読んだり、挙動を観察する必要がありそう。あとで調べる。
- デフォルトでは JavaScript ファイルはどの ECMA Script バージョンのファイルとしてパースされる? ESLint では
languageOptions.ecmaVersionで指定できて、そのデフォルト値は"latest"だが、oxlint ではどうか?- A. おそらく 最新の ECMA Script バージョンとしてパースされる。
- 少なくとも js-plugin に渡す
Context#languageOptions.ecmaVersionは"2026"に固定されている。
globals['es-latest']的なものはある?- A.
globals.builtin
- A.
- デフォルトでは JavaScript ファイルはどのモードでパースされる? ESLint では
languageOptions.sourceTypeでモードを指定できて、そのデフォルト値は"module"だが、oxlint ではどうか?- A. ファイルの拡張子からモードが判別できればそのモードでパースし、無ければパースしてみてソーステキストの内容を元に最終的なモードを判定する。
- https://github.com/oxc-project/oxc/blob/e51857f0030df88b105f3b4636c7ff2a67b1142c/crates/oxc_linter/src/service/runtime.rs#L317
- https://github.com/oxc-project/oxc/blob/e51857f0030df88b105f3b4636c7ff2a67b1142c/crates/oxc_linter/src/service/runtime.rs#L1018
- https://github.com/oxc-project/oxc/blob/e51857f0030df88b105f3b4636c7ff2a67b1142c/crates/oxc_parser/src/lib.rs#L487-L496
- 厳密には拡張子から判定不能なファイルについては
package.jsonのtypefield を考慮してモードを判定すべきな気がするが、oxlint はそうなってない模様。oxlint のバグとして報告すべき?
- A. ファイルの拡張子からモードが判別できればそのモードでパースし、無ければパースしてみてソーステキストの内容を元に最終的なモードを判定する。
- デフォルトではどの拡張子のファイルが lint 対象になる?
- A. js, mjs, cjs, jsx, ts, mts, cts, tsx, vue, astro, svelte が lint 対象になる。
typescriptplugin の rule を有効にする時、filesで.tsのみに適用範囲を絞るべき? 絞らなかった場合どうなる?- A. わからない...
"files": ["*.ts"]にすると、その rule は.vueの中にある TypeScript コードに適用されなくなってしまう。.vueにも適用したいなら、"files": ["*.ts", "*.vue"]にするか、"overrides"を使わずに rule を有効にするべき
typescriptplugin の rule は"overrides"を使わずに有効にするか、"files": ["*.ts", "*.mts", "*.cts", "*.tsx", "*.vue", "*.astro", "*.svelte"]を使って有効化するのが良いのでは- 前者のほうがシンプルだが、後者のほうが rule が適用されるファイルが減る分、lint 実行時間が減ると思う。
- まあ削減される時間大したことないと思うから、前者で良いのでは。
- ところで前者を採用すると
.ts向けの rule を.jsでも有効にすることになる typescriptplugin の rule はfilesで絞らずに有効化する、で良いのでは。
- 以下のような config がある時、
arrow-body-styleは.vueファイル中の JavaScript コードに対して有効になる?-
{ "$schema": "./node_modules/oxlint/configuration_schema.json", "overrides": [ { "files": ["*.js"], "rules": { "arrow-body-style": "error" } } ] } - A. いいえ。
.jsに対してのみ、arrow-body-styleが有効になる模様。
-
- デフォルトで有効化される rule があるらしいが、その severity は何になる?
- A. warning になる。
- ちなみにデフォルトで有効化される rule の定義は「デフォルトで有効化される plugin のうち、correctness category の rule 全て」
- さらに踏み込むと、追加で読み込まれた plugin の correctness category の rule もデフォルトで有効化される
--disable-unicorn-pluginを渡すと、no-new-array(unicorn plugin のデフォルト有効の rule) は無効化される?- A. 無効化されない。
- 多分 oxlint のバグ?
- 以下のような config がある時、
*.jsに対してno-new-array(unicorn plugin のデフォルト有効の rule) は有効になる?-
{ "$schema": "./node_modules/oxlint/configuration_schema.json", "plugins": [], "overrides": [ { "files": ["*.cjs"], "plugins": ["unicorn"] } ] } - A. いいえ。
- ちなみに
*.cjsに対しても有効にならない。多分 oxlint のバグ?
-
- oxfmt と競合する組み込みの rule は存在するか? 存在する場合、どのような rule がそれに該当するのか?
- A. わからない...
- 実際に oxfmt 使って確認してみる。
