= require('@swc/core' ) const babel = require('@babel/core' ) // === Transformer: SWC → Babel の 2 段構成 === const reactCompilerTransformer = { process(src, filename) { // ① SWC: TS strip するが JSX は残す(runtime: 'preserve' ) const swcResult = swc.transformSync (src, { filename, jsc: { parser : { syntax: 'typescript' , tsx: true }, transform : { react: { runtime : 'preserve' } } }, module : { type: 'es6' } }) // ② Babel: JSX 変換 + React Compiler + CJS 化 const babelResult = babel.transformSync (swcResult.code, { filename, presets : [['next/babel' , { 'preset-react' : { runtime : 'automatic' } }]], plugins : [['babel-plugin-react-compiler' , { target : '19' }]] }) return { code: babelResult .code } } } // === Jest 設定: next/jest の transform を差し替える === const createJestConfig = nextJest({ dir: __dirname }) module.exports = async () => { const base = await createJestConfig ({})() return { ...base, transform : { ...base.transform, '^.+\\.(js|jsx|ts|tsx|mjs)$' : reactCompilerTransformer } } } こんなイメージ。実際はもっと⾊々やっていて132⾏になった。