1

I have searched around for this error and found numerous people reporting it, but none of the solution tried have worked for me. The project I'm working with was ejected from expo with react-native v0.63 installed, and then upgraded to react-native v0.64.3. Everything else is working fine, but the tests are failing. On running yarn test, all the unit tests throw the same error:

 src/screens/ScreenTest/ScreenTest.test.js
  ● Test suite failed to run

    SyntaxError: /node_modules/@react-native/polyfills/error-guard.js: Missing semicolon. (14:4)

      12 | let _inGuard = 0;
      13 |
    > 14 | type ErrorHandler = (error: mixed, isFatal: boolean) => void;
         |     ^
      15 | type Fn<Args, Return> = (...Args) => Return;
      16 |
      17 | /**

      at instantiate (node_modules/@babel/parser/lib/index.js:72:32)
      at constructor (node_modules/@babel/parser/lib/index.js:367:12)
      at Parser.raise (node_modules/@babel/parser/lib/index.js:3706:19)
      at Parser.semicolon (node_modules/@babel/parser/lib/index.js:4151:10)
      at Parser.parseExpressionStatement (node_modules/@babel/parser/lib/index.js:15453:10)
      at Parser.parseStatementContent (node_modules/@babel/parser/lib/index.js:14986:19)
      at Parser.parseStatement (node_modules/@babel/parser/lib/index.js:14838:17)
      at Parser.parseBlockOrModuleBlockBody (node_modules/@babel/parser/lib/index.js:15495:25)
      at Parser.parseBlockBody (node_modules/@babel/parser/lib/index.js:15486:10)
      at Parser.parseProgram (node_modules/@babel/parser/lib/index.js:14748:10)
      at Parser.parseTopLevel (node_modules/@babel/parser/lib/index.js:14735:25)
      at Parser.parse (node_modules/@babel/parser/lib/index.js:16764:10)
      at parse (node_modules/@babel/parser/lib/index.js:16816:38)
          at parser.next (<anonymous>)
          at normalizeFile.next (<anonymous>)
          at run.next (<anonymous>)
          at transform.next (<anonymous>)
      at evaluateSync (node_modules/gensync/index.js:251:28)
      at sync (node_modules/gensync/index.js:89:14)
      at ScriptTransformer.transformSource (node_modules/@jest/transform/build/ScriptTransformer.js:481:35)
      at ScriptTransformer._transformAndBuildScript (node_modules/@jest/transform/build/ScriptTransformer.js:586:40)
      at ScriptTransformer.transform (node_modules/@jest/transform/build/ScriptTransformer.js:624:25)
      at Object.<anonymous> (node_modules/react-native/jest/setup.js:300:6)

Another thing to note is that I have babel.config.js file in my project already, since a lot of answers mentioned moving from .babelrc to babel.config.js as a solution to this problem, but it didn't help. just to be sure i also tried removing the babel.config.js and adding a .babelrc but that did not work either.

I'm at my wits end here and any help is greatly appreciated!

So far I've tried:

babel.config.js:

module.exports = function (api) {
  api.cache(false)
  return {
    env: {
      production: {
        presets: ['module:metro-react-native-babel-preset'],
        plugins: [
          'module:react-native-dotenv',
          'react-native-reanimated/plugin',
          'transform-remove-console',
        ],
      },
      development: {
        presets: ['module:metro-react-native-babel-preset'],
        plugins: ['module:react-native-dotenv', 'react-native-reanimated/plugin'],
      },
    },
  }
}

package.json:

{
  "dependencies": {
    "@expo/vector-icons": "^12.0.0",
    "@gorhom/bottom-sheet": "^4.4.2",
    "@pnthach95/react-native-root-view-background": "^1.2.0",
    "@ptomasroos/react-native-multi-slider": "^2.2.2",
    "@react-native-async-storage/async-storage": "^1.13.4",
    "@react-native-community/clipboard": "^1.5.1",
    "@react-native-community/netinfo": "^8.3.0",
    "@react-native-community/push-notification-ios": "^1.8.0",
    "@react-native-firebase/analytics": "12.9.3",
    "@react-native-firebase/app": "12.9.3",
    "@react-native-firebase/auth": "^12.1.0",
    "@react-native-firebase/crashlytics": "12.9.3",
    "@react-native-firebase/dynamic-links": "10.8.1",
    "@react-native-firebase/in-app-messaging": "12.9.3",
    "@react-native-firebase/messaging": "^12.1.0",
    "@react-native-firebase/perf": "12.9.3",
    "@react-native-firebase/remote-config": "12.9.3",
    "@react-native-google-signin/google-signin": "^6.0.1",
    "@react-native-masked-view/masked-view": "^0.2.6",
    "@react-native-picker/picker": "1.9.2",
    "@react-navigation/bottom-tabs": "^6.4.0",
    "@react-navigation/core": "^5.16.1",
    "@react-navigation/native": "^6.0.13",
    "@react-navigation/native-stack": "^6.9.6",
    "@react-navigation/stack": "^6.3.1",
    "@rematch/core": "^2.0.0",
    "@rematch/loading": "^2.0.0",
    "@sentry/react-native": "^2.6.2",
    "@twotalltotems/react-native-otp-input": "^1.3.11",
    "accordion-collapse-react-native": "^0.3.2",
    "axios": "^0.20.0",
    "babel-eslint": "^10.1.0",
    "babel-plugin-inline-dotenv": "^1.6.0",
    "babel-plugin-transform-remove-console": "^6.9.4",
    "eslint-plugin-react-native": "^3.11.0",
    "eslint-plugin-unused-imports": "^1.1.1",
    "expo": "^40.0.0",
    "expo-document-picker": "~8.4.1",
    "expo-file-system": "~9.3.0",
    "expo-location": "~10.0.0",
    "expo-splash-screen": "~0.8.1",
    "expo-status-bar": "~1.0.3",
    "expo-web-browser": "~8.6.0",
    "firebase": "^8.4.3",
    "intl": "^1.2.5",
    "lodash": "^4.17.20",
    "lottie-ios": "3.4.0",
    "lottie-react-native": "^5.1.4",
    "moment": "^2.29.1",
    "moment-duration-format": "^2.3.2",
    "patch-package": "^6.4.7",
    "postinstall-postinstall": "^2.1.0",
    "prop-types": "^15.7.2",
    "radio-buttons-react-native": "^1.0.4",
    "react": "17.0.2",
    "react-calendly": "^4.0.0",
    "react-dom": "16.13.1",
    "react-intl": "^5.24.6",
    "react-native": "0.64.3",
    "react-native-appsflyer": "6.8.2",
    "react-native-background-timer": "^2.4.1",
    "react-native-bootsplash": "^3.2.2",
    "react-native-code-push": "^7.0.4",
    "react-native-confirmation-code-field": "^6.5.1",
    "react-native-date-picker": "^3.2.8",
    "react-native-device-info": "^8.0.0",
    "react-native-dotenv": "^2.5.0",
    "react-native-fast-image": "^8.5.11",
    "react-native-fbsdk-next": "^4.2.0",
    "react-native-fingerprint-scanner": "^6.0.0",
    "react-native-fs": "^2.18.0",
    "react-native-gesture-handler": "^1.10.3",
    "react-native-image-header-scroll-view": "^0.10.3",
    "react-native-image-picker": "~4.2.1",
    "react-native-in-app-review": "^4.1.1",
    "react-native-inappbrowser-reborn": "^3.5.1",
    "react-native-indicators": "^0.17.0",
    "react-native-insta-story": "^1.1.8",
    "react-native-keyboard-aware-scroll-view": "^0.9.2",
    "react-native-linear-gradient": "^2.6.2",
    "react-native-modal": "^13.0.0",
    "react-native-offline": "^6.0.0",
    "react-native-otp-autocomplete": "^1.0.7",
    "react-native-pager-view": "5.4.12",
    "react-native-paper": "^4.2.0",
    "react-native-permissions": "^3.0.0",
    "react-native-picker-select": "^8.0.0",
    "react-native-play-install-referrer": "^1.1.8",
    "react-native-popup-menu": "^0.15.11",
    "react-native-portal": "^1.3.0",
    "react-native-progress": "^4.1.2",
    "react-native-push-notification": "7.3.1",
    "react-native-quiz-maker": "^0.1.0",
    "react-native-raw-bottom-sheet": "^2.2.0",
    "react-native-razorpay": "^2.2.7",
    "react-native-reanimated": "~2.5.0",
    "react-native-responsive-fontsize": "^0.5.1",
    "react-native-restart": "^0.0.22",
    "react-native-rss-parser": "https://github.com/adityabishtedu/react-native-rss-parser/tarball/rss-patch",
    "react-native-safe-area-context": "3.4.1",
    "react-native-screens": "^3.17.0",
    "react-native-session-stats": "https://github.com/balazsherczeg/react-native-session-stats.git",
    "react-native-shadow-2": "^6.0.5",
    "react-native-share": "^7.9.0",
    "react-native-signature-canvas": "^4.3.0",
    "react-native-simple-toast": "^1.1.3",
    "react-native-skeleton-placeholder": "^5.0.0",
    "react-native-snap-carousel": "4.0.0-beta.6",
    "react-native-step-indicator": "^1.0.3",
    "react-native-steps": "^1.3.0",
    "react-native-svg": "^12.1.1",
    "react-native-tab-view": "^3.1.1",
    "react-native-tab-view-fixed": "^0.0.69",
    "react-native-thumbnail-video": "^0.1.2",
    "react-native-tracking-transparency": "^0.1.1",
    "react-native-ultimate-config": "3.4.2",
    "react-native-unimodules": "~0.12.0",
    "react-native-vector-icons": "^9.1.0",
    "react-native-video": "^5.1.1",
    "react-native-view-shot": "^3.4.0",
    "react-native-walkthrough-tooltip": "^1.1.11",
    "react-native-web": "~0.13.12",
    "react-native-webp-format": "^1.1.2",
    "react-native-webview": "^11.18.1",
    "react-native-youtube-iframe": "^2.2.2",
    "react-navigation": "^4.4.4",
    "react-number-format": "^4.4.1",
    "react-redux": "^7.2.1",
    "redux": "^4.0.5",
    "redux-axios-middleware": "^4.0.1",
    "redux-thunk": "^2.3.0",
    "rn-faded-scrollview": "^1.0.12",
    "rn-fetch-blob": "^0.12.0",
    "validate.js": "^0.13.1",
    "victory-native": "^36.6.0",
    "volkeno-react-native-quiz-multiple-choice": "^1.0.3"
  },
  "devDependencies": {
    "@babel/core": "^7.20.5",
    "@babel/runtime": "^7.20.6",
    "@babel/preset-typescript": "^7.16.5",
    "@commitlint/cli": "^17.0.3",
    "@commitlint/config-conventional": "^17.0.3",
    "babel-jest": "~26.6.3",
    "babel-loader": "^8.2.2",
    "babel-plugin-transform-flow-strip-types": "^6.22.0",
    "babel-preset-expo": "8.3.0",
    "commitizen": "^4.2.4",
    "cz-conventional-changelog": "3.3.0",
    "eslint": "^7.32.0",
    "eslint-config-airbnb": "^18.2.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-import": "^2.24.2",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-react": "^7.26.0",
    "husky": "^8.0.0",
    "jest": "~26.6.3",
    "metro-react-native-babel-preset": "^0.73.4",
    "prettier": "^2.4.1",
    "react-native-bundle-visualizer": "^2.2.1",
    "react-test-renderer": "17.0.1"
  },
  "jest": {
    "preset": "react-native"
  }
}

1 Answers1

5

Unfortunately, I've had the same issue and so I stumbled over your question. After some hours I found the problem and the solution.

In my case the issue happened when I upgraded jest from 27 to 28 (https://jestjs.io/docs/28.x/upgrading-to-jest28) because of this change:

Babel config

babel-jest now passes root: config.rootDir to Babel when resolving configuration. This improves compatibility when using projects with differing configuration, but it might mean your babel config isn't picked up in the same way anymore. You can override this option by passing options to babel-jest in your configuration.

My babel.config.js was located in my react native application root .\babel.config.js but my .\jest.config.js file defined as root (to search for the tests): rootDir: "src". With the change from 27 to 28 the babel.config.js file was not longer found because babel-jest searched in ./src/babel.config.js and thus exactly the same error occurred like you described above:

SyntaxError: /node_modules/@react-native/polyfills/error-guard.js: Missing semicolon. (14:4) because babel no longer transpiled the error-guard.js file.

As you have still jest 26 (in your package.json) your case might be different - but the problem is that your babel.config.js file is not or no longer found and thus babel-jest is no longer transpiling any file.

Not sure if this helps you - I used the following solution:

  1. Create a new file ./babel-jest.js with the content
module.exports = require("babel-jest").createTransformer({
  rootMode: "upward",
})
  1. Reference this in .\jest.config.js like:
transform: {
    "^.+\\.jsx?$": "../babel-jest.js",
},

Now, instead of babel-jest directly the new transformer from .\src\..\babe-jest.js is called including the option to search for the babel.config.js file upwards (and then finally finding it in .\babel.config.js just one level above).

This solution is also described here: Babel: root programmatic options and here https://github.com/facebook/jest/issues/8006

There are other proposals to use:

transform: {
    '^.+\\.(js|jsx|ts|tsx)$': ['babel-jest', { rootMode: 'upward' }],
  },

in https://github.com/facebook/jest/issues/8006 and even on the jest page it self https://jestjs.io/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object but unfortunately this was not working for me.

There is another option you can give a try (described also in https://github.com/facebook/jest/issues/8006).

You can create a babel.config.js file in the root for your tests and reference the original file via

module.exports = require('../babel.config.js');

Hope this helps a bit.

Twinnie
  • 131
  • 4
  • thank you so much for your response, I'll try your fixes and revert back soon! – Sahitya Sharma Jan 23 '23 at 16:28
  • I tried everything and nothing worked, this was spot on. worked like a charm. thanks! – MauroSK Feb 02 '23 at 11:28
  • so i tried this solution and this error did go away, but now i'm getting this error, `Support for the experimental syntax 'jsx' isn't currently enabled` in every test written in the project, any suggestions? – Sahitya Sharma Feb 02 '23 at 13:29
  • Sounds to me that babel is not transforming all of your files - maybe you need to extend this transform: { "^.+\\.jsx?$": "../babel-jest.js", } to "^.+\\.(js|jsx|ts|tsx)?$": "../babel-jest.js" depending how your file extensions look like – Twinnie Feb 02 '23 at 20:56
  • apologies for the delay in response, changing the transform now gives this error, `Test suite failed to run 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".` – Sahitya Sharma Feb 08 '23 at 08:15
  • well, this error message means that one of your *.js, *.jsx, *.ts or *.tsx files has content which is not just plain JavaScript. Is there no additional information which file is affected? – Twinnie Feb 11 '23 at 11:54