🦔

[next/jest] transformIgnorePatternsを設定したい

2023/07/10に公開

実行環境

"jest": "29.5.0"
"next": "13.2.4"
"turbo": "latest"

SyntaxError/unexpected token error

jest を実行して下記のようなエラーが発生したとき、その発生場所がテストコードに直接関係なく、jest で読み込む必要がないものであれば、設定ファイルにtransformIgnorePatternsを追加し、パスを正しく設定すれば解消されます。

# example:1
SyntaxError: Unexpected token 'export'

# example:2
Jest encountered an unexpected token

    Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.

    Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.

    By default "node_modules" folder is ignored by transformers.
"transformIgnorePatterns": ["/node_modules/(?!(foo|bar)/)"]

next/jestnode_modulesをトランスパイルすることができず、ESM ファイルがトランスフォームされないようにする必要があります(jest にはエクスペリメンタルモードで ESM サポートが提供されています)。

const customJestConfig = {
  // Custom config
};

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

transformIgnorePatterns について

トランスコンパイルさせたくないモジュールを定義させます。
"/node_modules/(?!(foo|bar)/)"と記載した場合、foobar以外をトランスコンパイルしないという書き方になります。
デフォルトでは node_modules を全てトランスコンパイルしないようになっていますが、npm パッケージは一部トランスパイルされていないコードが公開されており、それをトランスパイルする設定が必要になります。
ただ、トランスパイルの対象を増やせばテストの実行時間も伸びてしまうため注意が必要です。

参照

GitHubで編集を提案

Discussion