uhyo / eslint-plugin-import-access

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

Fix another issue of imports from node_modules #7

Closed mozisan closed 1 year ago

mozisan commented 1 year ago

このプラグインには大変お世話になってます! (またuhyoさんのさまざまな記事もいつも大変楽しく読ませていただいております、ありがとうございます :raised_hands: )

問題

defaultImportabilityというオプションが追加されたのを知りすぐに飛びついてしまいました!!!! ただ、defaultImportabilitypackageにしてみたところ、package.jsonmainフィールドなどのエントリーポイントがないパッケージ(例えばtype-fest)ではエラーになってしまうことに気づきました 😞 インポートする対象がnode_modules配下かどうかの判定にあたってrequire.resolve()を使用していますが、package.jsonにエントリーポイントが指定されていないとパスの解決ができないようです。

解決策

require.resolve(importPath);

でパスの解決ができない場合、

require.resolve(`${importPath}/package.json`);

というようにパッケージ直下のpackage.jsonへのパスの解決を試みるように変更しています。 node_modules配下のパッケージであればpackage.jsonを持っているはずなので、これをもって「node_modules配下のパッケージかどうか」の判定ができると考えました。

テストについて

今回のケースについてのテストを追加する上で、「package.jsonmainフィールドなどのエントリーポイントがないパッケージ」を用意する必要があります。 type-festなどをdevDependenciesに追加することも考えましたが、type-fest側にアップデートが加わりpackage.jsonにエントリーポイントが追加されたりするとあとあと面倒に感じたので、このリポジトリ内で完結させました。 src/__tests__/fixtures/packages/missing_entrypointにテスト用のパッケージを用意し、以下のコマンドによってnode_modules配下にインストールしています。

npm i -D --install-links ./src/__tests__/fixtures/packages/missing_entrypoint

ディレクトリ構造だったり命名だったり、そもそもこのやり方自体についてなど何かよくない点ありましたら修正します!

uhyo commented 1 year ago

@mozisan 問題の報告と修正ありがとうございます 🙂 修正の方針は問題ないと思います。 ただ、まだ npm ciでエラーが発生するようです。確認いただけるとありがたいです。 :cry:

mozisan commented 1 year ago

@uhyo ありがとうございます! npm ciのエラーはnpmのバージョンに起因するようです。 .npmrcinstall-linksという記述を追加しましたが、古いnpmだとこれを認識せず、意図する挙動にならないという状況です。 さっと調べた感じだとv8系のどこかから.npmrcinstall-linksという項目を記述できるようになっているので、ひとまずCI環境では最新のv9系を使うようにnpmのバージョンを指定するように変更しました。