kulshekhar / ts-jest

A Jest transformer with source map support that lets you use Jest to test projects written in TypeScript.
https://kulshekhar.github.io/ts-jest
MIT License
6.89k stars 448 forks source link

Jest encountered an unexpected token #4267

Open MaryamAdnan3 opened 4 months ago

MaryamAdnan3 commented 4 months ago

Detail:

I have updated a third party library axios version to 1.6.7 . When I ran tests I started to get the following error ` Jest encountered an unexpected token

This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.

By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

Here's what you can do:
 • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/en/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/en/configuration.html

Details:

D:\gitRepos\apimatic-js-runtime\node_modules\axios\index.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import axios from './lib/axios.js';
                                                                                         ^^^^^^

SyntaxError: Cannot use import statement outside a module

> 1 | import { AxiosHeaders, AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosResponseHeaders, RawAxiosResponseHeaders } from 'axios';
    | ^
  2 | import axios from 'axios';
  3 | import isNode from 'detect-node';
  4 | import FormData from 'form-data';

  at Runtime.createScriptFromCode (../../node_modules/jest-runtime/build/index.js:1350:14)
  at Object.<anonymous> (src/httpClient.ts:1:1)`

package.json

  "devDependencies": {
    "@babel/cli": "^7.21.5",
    "@babel/core": "^7.22.1",
    "@babel/preset-env": "^7.18.2",
    "babel-jest": "^26.6.3",
    "@size-limit/preset-small-lib": "^7.0.8",
    "@types/detect-node": "^2.0.0",
    "@types/lodash.flatmap": "^4.5.6",
    "abort-controller": "^3.0.0",
    "babel-plugin-annotate-pure-calls": "^0.4.0",
    "jest": "^26.6.3",
    "jsdom": "^19.0.0",
    "jsdom-global": "^3.0.2",
    "lerna-alias": "3.0.3-0",
    "rollup": "^2.79.0",
    "rollup-plugin-typescript2": "^0.31.0",
    "size-limit": "^7.0.8",
    "ts-jest": "^29.1.2",
    "typescript": "^4.1.2"
  }

jest.config.js `const { jest: lernaAliases } = require('lerna-alias');

module.exports = { preset: 'ts-jest', moduleNameMapper: lernaAliases(), transform: { '^.+\.tsx?$': 'ts-jest', // Add TypeScript transformation '^.+\.jsx?$': 'babel-jest', // Add Babel transformation for ES6 modules }, coverageReporters: [['lcov', { projectRoot: '../../' }]] }; `

ledenakralica commented 4 months ago

I have a similar issue. It seems to me that for some reason ts-jest instructs the typescript compiler to emit ES3/ES5 code. I cannot pinpoint where this is happening though

ahnpnl commented 1 month ago

This error indicates that Jest tried to process axios but axios is not passed (by Jest) to ts-jest to transform.

Usually, this can be solved by configuring transformIgnoredPattern option in Jest config file or moduleNameMapper to tell Jest to resolve CJS version of axios.

You can also use Jest ESM mode to process ESM axios file.

karpikpl commented 2 weeks ago

I think I'm having the same issue https://github.com/karpikpl/typescript-esm-sample I tried using transformIgnoredPattern but no luck :(

SyntaxError: Cannot use import statement outside a module

    > 1 | import { graphql } from '@octokit/graphql'

this seems to have no effect:

    "transformIgnorePatterns": [
      "node_modules/(?!(@octokit/graphql|@octokit/request))"
    ],