Roman Mahotskyi
Roman Mahotskyi

Reputation: 6625

TypeError: Jest: a transform must export something

After configuring jest, node.js and typescript the script npx jest throws the error in a console

TypeError: Jest: a transform must export something.
    at C:\projects\project-api\node_modules\@jest\transform\build\ScriptTransformer.js:386:19
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async Promise.all (index 0)
    at async ScriptTransformer.loadTransformers (C:\projects\project-api\node_modules\@jest\transform\build\ScriptTransformer.js:378:5)
    at async createScriptTransformer (C:\projects\project-api\node_modules\@jest\transform\build\ScriptTransformer.js:1105:3)
    at async C:\projects\project-api\node_modules\@jest\core\build\TestScheduler.js:283:31
    at async Promise.all (index 0)
    at async TestScheduler.scheduleTests (C:\projects\project-api\node_modules\@jest\core\build\TestScheduler.js:276:5)
    at async runJest (C:\projects\project-api\node_modules\@jest\core\build\runJest.js:387:19)
    at async _run10000 (C:\projects\project-api\node_modules\@jest\core\build\cli\index.js:408:7)

jest.config.js

export default {
  roots: [
    '<rootDir>/src'
  ],
  testMatch: [
    '**/__tests__/**/*.+(ts)',
    '**/?(*.)+(test).+(ts)'
  ],
  transform: {
    '^.+\\.(ts)$': 'ts-jest'
  }
}

Where did I fail to configure it correctly?

Upvotes: 27

Views: 27815

Answers (7)

JRichardsz
JRichardsz

Reputation: 16505

If you upgraded from jest@28 to jest@29, you should change your transformer to return an object {code:"foo"} instead direct string "foo"

jest@28

process(sourceText, sourcePath, options) {
  return `foo+bar`;
}

jest@29

process(sourceText, sourcePath, options) {
  return {code: `foo + bar`};
}

Reference: https://jestjs.io/docs/28.x/upgrading-to-jest28%23transformer

enter image description here

Upvotes: 0

Mateo Tibaquira
Mateo Tibaquira

Reputation: 2136

My fault was a custom transformer exporting a process function but not a default export, so I've got it working following jest v27 documentation about it: https://jestjs.io/docs/next/code-transformation#typescript-with-type-checking

Upvotes: 0

huntzinger92
huntzinger92

Reputation: 162

In my case, I had mismatched versions of jest (major version 26) and ts-jest (major version 27). Downgrading ts-jest to major version 26 solved my issue.

Upvotes: 6

Menelaos Kotsollaris
Menelaos Kotsollaris

Reputation: 5506

I had this error and it ended up being a miss-configuration in my jest.config (transform).

I had a property that should have been inside moduleNameMapper and not transform. Once I updated the file, jest executed correctly.

jest.config.js:

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'jsdom',
  testPathIgnorePatterns: ['/node_modules/', '/dist'],
  collectCoverage: true,
  verbose: true,
  transform: {
    '^.+\\.(js|jsx|ts|tsx)$': '<rootDir>/node_modules/babel-jest',
  },
  moduleNameMapper: {
    '\\.(css|scss|less)$': '<rootDir>/test/styleMock.js',
  },
};

where styleMock.js:

module.exports = {};

Upvotes: 6

EvgeniyRRU
EvgeniyRRU

Reputation: 531

I tried to debug Jest by Node debugger (something like node inspect test.js) , and I found the culprit. For me it was jest-svg-transformer package. Apparently, it not compatible with jest@27.

Generally this error raises if some item in transform section of jest.config.js broken.

Upvotes: 10

Rotimi
Rotimi

Reputation: 109

Running yarn add ts-jest@next solved it for me.

Upvotes: 10

koalaok
koalaok

Reputation: 5720

I had your same issue.

For me, it end up it was because I was having old version of following packages:

  • ts-loader
  • ts-jest
  • ts-node

Upvotes: 35

Related Questions