🙌

ESMに移行したライブラリのアップデートでJestが動かない

2024/08/13に公開

特定のライブラリがCommonJSからES Modulesに完全移行したのでアップデートしたところ、Jestで書かれたテストが動かなくなってしまった。

調べてみると、JestはCommonJS前提で動作するもので、テストコード/テスト対象コードをESMで書きたい場合は、ESMからCJSに動的に変換することが必要とのこと。
https://qiita.com/toydev/items/e163d35a7e8e3c11fba2

この時必要だった手順は以下。

実施した手順

  1. トランスフォーマーにbabel-jestを設定する
jest.config.json
{
  "transform": {
    "\\.[jt]sx?$": "babel-jest"
  }
}
  1. transformIgnorePatternsに対象ライブラリを設定する
    node_modulesはデフォルトでトランスパイルされない設定のため、transformIgnorePatternsを設定する。今回はflattenのアップデートだったので以下の指定をした。
jest.config.js
{
  "jest": {
    "transformIgnorePatterns": [
      "node_modules/(?!flat)/"
    ]
  }
}
  1. (next/jestを使用してる場合)設定ファイルを上書きする
    ここが一番ハマった。next/jestを使用してる場合は、通常の書き方ではtransformIgnorePatternsを設定することが出来ない。以下のような書き方にする必要がある。
jest.config.js
   const customJestConfig = {
  // Custom config
};

module.exports = async () => ({
  ...(await createJestConfig(customJestConfig)()),
  transformIgnorePatterns: ["node_modules/(?!(package))"], // next/jestの設定を上書き
});

https://zenn.dev/sjbworks/articles/452d20632ffbc1
https://stackoverflow.com/questions/71427330/nextjs-jest-transform-transformignorepatterns-not-working-with-esm-modules

Discussion