diff --git a/packages/jest/README.md b/packages/jest/README.md index d848cb0b4..c4da65c7f 100644 --- a/packages/jest/README.md +++ b/packages/jest/README.md @@ -30,6 +30,7 @@ module.exports = { // configuration { + tsconfig: '/tsconfig-test.json', dynamicImport: true, react: { pragma: 'h', diff --git a/packages/jest/index.ts b/packages/jest/index.ts index 1068bb289..aaf08b5f3 100644 --- a/packages/jest/index.ts +++ b/packages/jest/index.ts @@ -1,38 +1,46 @@ import { xxh64 } from '@node-rs/xxhash' import type { Output } from '@swc/core' +import type { TransformOptions } from '@jest/transform' import { Options, transformJest } from '@swc-node/core' import { readDefaultTsConfig, tsCompilerOptionsToSwcConfig } from '@swc-node/register/read-default-tsconfig' -interface JestConfig26 { - transform: [match: string, transformerPath: string, options: Options][] +interface TransformerConfig extends Options { + tsconfig?: string } -interface JestConfig27 { - transformerConfig: Options +interface JestConfig26 extends TransformOptions { + transform: [match: string, transformerPath: string, options: TransformerConfig][] } -function getJestTransformConfig(jestConfig: JestConfig26 | JestConfig27): Options { +type JestConfig27 = TransformOptions + +function getJestTransformConfig(jestConfig: JestConfig26 | JestConfig27): TransformerConfig { if ('transformerConfig' in jestConfig) { // jest 27 - return jestConfig.transformerConfig + return (jestConfig as JestConfig27).transformerConfig } if ('transform' in jestConfig) { // jest 26 - return jestConfig.transform.find(([, transformerPath]) => transformerPath === __filename)?.[2] ?? {} + return ( + (jestConfig as JestConfig26).transform.find(([, transformerPath]) => transformerPath === __filename)?.[2] ?? {} + ) } return {} } -const defaultTsConfig = readDefaultTsConfig() - export = { process(src: string, path: string, jestConfig: JestConfig26 | JestConfig27): Output | string { if (/\.(tsx?|jsx?|mjs)$/.test(path)) { + const transformerConfig = getJestTransformConfig(jestConfig) + const tsconfig = transformerConfig.tsconfig + ? transformerConfig.tsconfig.replace('', jestConfig.config.rootDir) + : undefined + const tsConfigObject = readDefaultTsConfig(tsconfig) return transformJest(src, path, { - ...tsCompilerOptionsToSwcConfig(defaultTsConfig, path), - ...getJestTransformConfig(jestConfig), + ...tsCompilerOptionsToSwcConfig(tsConfigObject, path), + ...transformerConfig, }) } return src diff --git a/packages/jest/package.json b/packages/jest/package.json index 852e56cf2..d7b19a6ad 100644 --- a/packages/jest/package.json +++ b/packages/jest/package.json @@ -38,7 +38,8 @@ }, "devDependencies": { "@swc/core": "^1.6.6", - "@swc/types": "^0.1.9" + "@swc/types": "^0.1.9", + "@jest/transform": "^29.7.0" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6ea31199..5a189538f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -204,6 +204,9 @@ importers: specifier: '>= 5.0' version: 5.5.4 devDependencies: + '@jest/transform': + specifier: ^29.7.0 + version: 29.7.0 '@swc/core': specifier: ^1.6.6 version: 1.7.12(@swc/helpers@0.5.12)