Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support moduleMainPaths #491

Merged
merged 8 commits into from
May 8, 2024
Merged

Support moduleMainPaths #491

merged 8 commits into from
May 8, 2024

Conversation

ShinobuTakahashi
Copy link
Contributor

このpull requestが解決する内容

[email protected] に追従し、 moduleMainPaths をサポートします。

破壊的な変更を含んでいるか?

  • なし

@ShinobuTakahashi ShinobuTakahashi changed the title Support modulemainpaths Support moduleMainPaths Mar 13, 2024
// moduleMainScripts は将来的に非推奨となるため、moduleMainPaths を優先する
if (Object.keys(moduleMainPaths).length > 0) {
const regexp = new RegExp(`\/${path}\/`);
const targetPath = Object.values(moduleMainPaths).find(v => regexp.test(v));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ多分「 moduleMainScripts と同じところで処理して〜」と私が口走った気がしており申し訳ないんですが、
よく見ると直観に反する不要な処理になっているような気がしています。

  • moduleMainPaths の使い道が Object.keys().lengthObject.values() しかない
    • key 側の値が全く見られていません
    • もしこれが妥当なら、最初から moduleMainPaths は (values() の結果の) 配列であるべきに思えます
  • 正規表現による判定が失敗する場合がある
    • "foo" に対して /\/foo\// が生成されますが、 node_modules/foo/〜 にも node_modules/bar/foo/〜` にもヒットするのでは
  • _resolvePath() のここで考慮したのに、これを呼び出す _require() でもう一度同じチェックが入っている

moduleMainPaths は「package.json のパスから index.js のパスへのテーブル」であることを考えると、ここでは処理できず、 むしろ _resolveAbsolutePathAsDirectory() の中で /package.json をつけた後の処理になるのではないでしょうか?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。_resolveAbsolutePathAsDirectory() の中で moduleMainPaths を参照するよう修正しました。

Copy link
Member

@xnv xnv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moduleMainScripts の参照が moduleMainPaths よりも早いので、前者は「後者がない時にだけ参照する」形でないと、元の不具合を再現したままになりませんか?

@ShinobuTakahashi
Copy link
Contributor Author

すいません、根本的な原因を失念していました。元の不具合を再現したコンテンツで動作確認取りました。

@@ -95,7 +96,8 @@ export class ModuleManager {
}

// akashic-engine独自仕様: 対象の `path` が `moduleMainScripts` に指定されていたらそちらを参照する
if (moduleMainScripts[path]) {
// moduleMainScripts は将来的に非推奨となるため、moduleMainPaths が存在しない場合だけ参照する
if (Object.keys(moduleMainPaths).length === 0 && moduleMainScripts[path]) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

存在チェックのため Object.keys で判定しています。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_moduleMainPaths: ModuleMainPathsMap | null にすればなくせませんか? 頻発する処理でもないですが、処理としてですし記述もコンパクトになりそうです。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

型に null を追加し修正しました。

@xnv
Copy link
Member

xnv commented Apr 26, 2024

うーん、まだ考慮漏れがあることに気がつきました。「 moduleMainScripts (以下 mMS) がある既存のコンテンツで、新たにライブラリを akashic install した」ケースでは、 modueMainPaths (同 mMP) が「一部しかない」状況があり得ました。つまり mMP があるからといって mMS は無視できるとは限らないですね。

とはいえ、これは akashic-engine 側の問題というよりは akashic install や scan の側でメンテすべきものだろうという点、akashic install 側がまだ --experimental つきオプションで実害がない点から、この PR は approve します。

@ShinobuTakahashi ShinobuTakahashi merged commit dafc3e6 into main May 8, 2024
12 checks passed
@ShinobuTakahashi ShinobuTakahashi deleted the support-modulemainpaths branch May 8, 2024 01:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants