Jest fails with "Unexpected token *" on import statement
Some react-native
libraries ship uncompiled ES6 code.
ES6 code needs to be compiled before it can be run by Jest
.
The Jest
doc about Testing React Native Apps includes a section about compiling dependencies that don't ship pre-compiled code.
You will need to tell Jest
to compile react-navigation-tabs
by whitelisting it in the transformIgnorePatterns
option in your Jest
config.
Example:
Changing the jest.config.js
file into something like below, fixed the issue mentioned in OP.
But the "react-native-reanimated
" module (which requires native integration, as described in another post) needs further work, and we should Mock
modules with such native requirements...
module.exports = { preset: 'react-native', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], transformIgnorePatterns: [ "node_modules/(?!(react-native" + "|react-navigation-tabs" + "|react-native-splash-screen" + "|react-native-screens" + "|react-native-reanimated" + ")/)", ],}
Note: the transformIgnorePatterns
option (which is an array of Regular-Expressions) is originally meant to exclude files from being compiled, but using (?!(some-dir-name|another-name))
pattern (the (?!...)
, negative look-ahead), we do tell Jest
to exclude anything in node_modules
directory, except the names that we did specify.
As it has been said, some modules needs to be transpiled, & some don't.Here is a regex I use that work in a lot of projects
"jest": { "preset": "react-native", "transformIgnorePatterns": [ "node_modules/(?!(jest-)?react-native|react-(native|universal|navigation)-(.*)|@react-native-community/(.*)|@react-navigation/(.*)|bs-platform|(@[a-zA-Z]+/)?(bs|reason|rescript)-(.*)+)" ] }
It's working for most common react native thing, & include also a specific package (here bs-platform
) as an example, when isn't captured by previous patterns.
I had a similar issue on a React + Typescript app.
The first mistake I made was to define the jest.config.js
as jest.config.ts
Running on Node v12.latest
Then the configuration that worked for me were the following:
// jest.config.jsmodule.exports = { preset: "ts-jest", testEnvironment: "node", roots: ["./src"], transform: { "\\.ts$": ["ts-jest"] }, testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], globals: { "ts-jest": { tsConfig: { // allow js in typescript allowJs: true, }, }, },};
// tsconfig.json{ "compilerOptions": { "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, "forceConsistentCasingInFileNames": true, "module": "esnext", "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, "jsx": "react", "baseUrl": "." }, "include": ["src"], "exclude": ["node_modules", "**/*.spec.ts"]}
// package.json"devDependencies": { "@types/jest": "^26.0.5", "jest": "^26.1.0", "ts-jest": "^26.1.3"}