Fix other false-positives with node_modules #10
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
問題
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でインストールされる)