網站搜尋

typescript - 在 monorepo 中配置 ts-jest 與套件依賴的問題


我在配置 ts-jest 至一個相互依賴套件的 monorepo 時遇到了問題。使用 esbuild 和 tsc 一切運作良好,但在 jest 和 ts-jest 上卻不行。

我能夠使用 moduleNameMapper 等設置讓所有基礎功能正常運作。每個套件都有自己的測試以及套件的 package.json 中的 jest 配置。僅導入自己套件文件的測試運作良好。有跨套件依賴的測試才會出現問題。

具體來說,我遇到的問題是如果兩個不同的套件有相同的頂層目錄,例如:

+ packages
  + packageA
    + utils/foo.ts
    + someCode.ts
    + tsconfig.json
  + packageB
    + utils/bar.ts
    + tsconfig.json
    + packageB.test.ts

當 packageA 中的程式碼 import 'utils/foo.ts',而 packageB 中的程式碼 import 'utils/bar.ts' 時,使用 esbuild 和 tsc,一切運作都很順利。

問題出在 ts-jest。如果 packageB.test.ts 導入 packageA/someCode.ts,而該文件導入 'utils/foo',無論我怎麼嘗試,它總是試圖解析為 packageB/utils/foo,但該文件並不存在。

tsc 和 esbuild 的情況相同,工作正常。如果 packageB 中的代碼導入 packageA 中的代碼,該代碼有一個 import 'utils/foo',它會正確地找到該文件。

需要說明的是,那些具有跨套件依賴但沒有相似頂層目錄名稱的測試(即文件未使用像 utils 這樣的共用目錄名稱)運行得非常好。

我寫了一個自定義的 jest 解析器,並在控制台記錄了所有路徑和 filterPaths,從我所看到的情況來看,jest 自定義解析器從未被要求解析 utils/foo。它被要求解析 packageA/someCode.ts(這部分它做得很好),但從未有請求解析 utils/foo。

ts-jest 是否嘗試在 jest 的解析器系統之外進行自己的模組解析?據我所知,ts-jest 似乎也只查看 packageB.test.ts 的 tsconfig.json。我原本預期在嘗試轉譯 utils/foo.ts 時,它會查看 packageA/tsconfig.json,但我可以在 packageA/tsconfig.json 中放置語法錯誤,而 ts-jest 似乎從未嘗試解析它。

對於如何在一個 monorepo 中為跨套件依賴運行 jest 測試,有什麼想法嗎?