Closed mozisan closed 1 year ago
あ、いやまだ正常に検知できないケースが残っていました・・・:sob:
package.json
のexports
フィールドが定義されていて、かつpackage.json
がexports
フィールドで公開されていない場合、resolve-pkg
はそのライブラリをライブラリだと判定できないようです。
そしてそれをうまいこと解消する良さそうな方法はまだなさそうという・・・
https://github.com/sindresorhus/resolve-pkg/issues/9#issuecomment-1433250154
eslint-plugin-importを参考に見ていたところ、この内部で使われているenhanced-resolveがライブラリかどうかの判定に良さそうだったのでそちらに切り替えてみました。 業務で使っているプロジェクトもこれでFalse positiveを取り除けました!!
問題
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というライブラリがあり、まさにこれだと思ってこのライブラリを使うように変えてみました。
その他の変更点
defaultImportability=package
時のライブラリ関連のテストをsrc/__tests__/fixtures/project/src/default-export{3,4}
に書いていましたが、これらはDefault exportに対する挙動をテストしたいものではなかったので、ライブラリ関連のテストをsrc/__tests__/fixtures/project/src/library/**
以下に再配置しました。src/__tests__/fixtures/packages/*
に用意していましたが、「symlinkでインストールされるテスト用ライブラリ」も用意したかったため、以下のようなディレクトリ構造に変更しました。src/__tests__/fixtures/packages/third-party/*
.npmrc
にinstall-links=true
と記述した上で、npm i -D src/__tests__/fixtures/packages/third-party/foo
を実行するとテストで利用できるようになるsrc/__tests__/fixtures/packages/workspaces/*
package.json
にworkspaces
項目を追加し、npm i -D <package-name>
を実行するとテストで利用できるようになる(npmのworkspace機能はinstall-links=true
に影響されずにsymlinkでインストールされる)