question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

After upgrading to ts-jest 27: SyntaxError: Cannot use import statement outside a module

See original GitHub issue

💥 Regression Report

> test@1.0.0 test
> jest --no-cache

 FAIL  test/test.ts
  ● Test suite failed to run

    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.

    Here's what you can do:
     • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/configuration
    For information about custom transformations, see:
    https://jestjs.io/docs/code-transformation

    Details:

    /Users/doberkofler/MyDev/ljs_app/trunk/examples/frontend/jest/jest27/src/setup-jest.ts:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){import { hello } from './hello';
                                                                                      ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1479:14)
      at async TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:347:13)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        1.759 s
Ran all test suites.

Last working version

Worked up to version: 26.5.6

Stopped working in version: 27.0.0

To Reproduce

Steps to reproduce the behavior: npm test

Expected behavior

Link to repo (highly encouraged)

jest27.zip

Debug log:

ts-jest.log

envinfo

System:
    OS: macOS 11.3

Npm packages:
    jest: 27.0.1
    ts-jest: 27.0.0
    typescript: 4.2.4
    babel(optional):

Issue Analytics

  • State:closed
  • Created 2 years ago
  • Reactions:16
  • Comments:19

github_iconTop GitHub Comments

12reactions
edaqa-uncountablecommented, Aug 10, 2021

I was getting this error, but not using next/babel. I managed to get my tests to work with this config:

/** @type {import('@ts-jest/dist/types').InitialOptionsTsJest} */
module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",
  globals: {
    "ts-jest": {
      isolatedModules: true,
    },
  },
  transform: {
    "^.+\\.jsx?$": "babel-jest",
  },
  moduleNameMapper: {

  },
  moduleDirectories: ["js", ".", "node_modules"],
}
9reactions
alex-tsxcommented, Mar 20, 2022

In my case jest would stumle on .js files from one of the dependencies in node_modules with SyntaxError: Cannot use import statement outside a module.

I had to make sure, that ts-jest wouldn’t ignore (when transforming) .js files in troublesome dependency.

After reading carefully about presets, I realized, that it leaves them ‘as-is’ with preset: 'ts-jest'. I changed it to preset: 'ts-jest/presets/js-with-ts' and set "allowJs": true in tsconfig.json.

To not mess up my project’s tsconfig.json, I have a separate one for jest.

In the end, my jest.config.js looks mainly like this:

module.exports = {
	preset: 'ts-jest/presets/js-with-ts',
	testEnvironment: "node",
	globals: {
		'ts-jest': {
			tsconfig: '<rootDir>/test/tsconfig.json',
		},
	},
	transformIgnorePatterns: [
		"node_modules/(?!troublesome-dependency/.*)",
	],
}

P.S. I didn’t need a transform field, since the preset is already on it.

P.P.S. I didn’t need to introduce any babel configuration

Read more comments on GitHub >

github_iconTop Results From Across the Web

SyntaxError: Cannot use import statement outside a ... - GitHub
I suspect the issue is Jest is not configured to run Node code using "type: module" (ECMAScript Modules).
Read more >
SyntaxError: Cannot use import statement outside a module ...
This is a React, Typescript, Webpack project. I am trying to test a module. But Jest won't transform the module to plain javascript...
Read more >
Jest and ESM: Cannot use import statement outside a module
Jest and ESM: Cannot use import statement outside a module. This post describes a fix for a common issue with Jest and ESM...
Read more >
syntaxerror cannot use import statement outside a module ...
The TypeScript jest error "Cannot use import statement outside module" occurs when jest is misconfigured in a TypeScript project. To solve the error,...
Read more >
SyntaxError: Cannot use import statement outside a module
I think this is because you are using import instead of require() . This means you are using ECMAScript modules instead of CommonJS...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found