uhyo / eslint-plugin-import-access

https://www.npmjs.com/package/eslint-plugin-import-access
MIT License
355 stars 9 forks source link

Fix other false-positives with node_modules #10

Closed mozisan closed 1 year ago

mozisan commented 1 year ago

問題

defaultImportability=packageの際、ライブラリに対するインポートをLintの対象外にするような差分を入れていましたが、Monorepo構成などでsymlinkを使ってインストールされるライブラリは「node_modules配下」という判定にならず、再びエラーが出てしまいました 😢

対応方針

現状では以下の箇所のコードで、require.resolve("foo")あるいはrequire.resolve("foo/package.json")を試し、ここで得られたパスが/node_modules/という文字列を含むかどうかという判定を行なっています。 https://github.com/uhyo/eslint-plugin-import-access/blob/master/src/rules/jsdoc.ts#L190-L205 ここでsymlinkが使われるとパスが/node_modules/を含まないという結果になり、結果としてLintの対象になってしまいました。

そこで、require.resolve("foo/package.json")へのパス解決が成功するかどうかを優先的に扱うことを考えたのですが、その場合に今度はimport sub from "foo/sub";のようなサブモジュールへのインポートに対する制御が面倒になってしまいます。

ちょっと色々やろうとは思ったのですが、すでにこういった判定処理が実装されたライブラリがないか探してみたところ、~resolve-pkg~enhanced-resolveというライブラリがあり、まさにこれだと思ってこのライブラリを使うように変えてみました。

その他の変更点

mozisan commented 1 year ago

あ、いやまだ正常に検知できないケースが残っていました・・・:sob: package.jsonexportsフィールドが定義されていて、かつpackage.jsonexportsフィールドで公開されていない場合、resolve-pkgはそのライブラリをライブラリだと判定できないようです。 そしてそれをうまいこと解消する良さそうな方法はまだなさそうという・・・ https://github.com/sindresorhus/resolve-pkg/issues/9#issuecomment-1433250154

mozisan commented 1 year ago

eslint-plugin-importを参考に見ていたところ、この内部で使われているenhanced-resolveがライブラリかどうかの判定に良さそうだったのでそちらに切り替えてみました。 業務で使っているプロジェクトもこれでFalse positiveを取り除けました!!