I have tried just about every single tutorial and approach to get Jest to recognize import statements. However, I cannot find a working solution in 2021.
Things I have tried:
- All of the advice from this stack overflow post
- Jest's documentation page on this here
- Babel's documentation page on configuring Jest here
Here is my current layout. I have tried many others as well.
Error message:
/Users/lukeanglin/Desktop/Convene/frontend/convene/node_modules/expo-secure-store/build/SecureStore.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){import { UnavailabilityError } from 'expo-modules-core';
^^^^^^
SyntaxError: Cannot use import statement outside a module
1 | import { LOGIN_URL } from '../config/globals';
2 | import { LOG } from '../config/logger-conf';
> 3 | import * as SecureStore from 'expo-secure-store';
| ^
4 | import axios from 'axios';
5 | export async function login(email, password) {
6 | // Returns true if login succeeds and false on fail (also logs error message)
^^^^^^
SyntaxError: Cannot use import statement outside a module
1 | import { LOGIN_URL } from '../config/globals';
2 | import { LOG } from '../config/logger-conf';
> 3 | import { SecureStore } from 'expo-secure-store';
| ^
babel.config.json
{
"presets": ["@babel/preset-env"]
}
package.json
// stuff here
"type": "module",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web",
"eject": "expo eject",
"lint": "eslint .",
"lint:fix": "eslint --fix",
"format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc",
"test": "jest"
},
"jest": {
"transform": {
"^.+\\.[t|j]sx?$": "babel-jest"
}
},
// stuff here
Steps to reproduce:
- Create an expo project
- Install Jest and babel, and expo-secure-store
- Attempt to import SecureStore
- Right a function doing something with the file that attempts to import SecureStore
Additionally, the entire content of the file that causes the error on the import is here:
login.js
import { LOGIN_URL } from '../config/globals';
import { LOG } from '../config/logger-conf';
import * as SecureStore from 'expo-secure-store';
import axios from 'axios';
export async function login(email, password) {
// Returns true if login succeeds and false on fail (also logs error message)
try {
const response = await axios.post(LOGIN_URL, {
username: email,
password: password
});
// Save the token
const token = response['data']['token']
await SecureStore.setItemAsync('token', token);
return true;
} catch (error) {
LOG.error(
'Error on GET request to login for authentication OR error on storing token with SecureStore: \n' +
error
);
return false;
}
}
and the test tests the function login.
Anyone with working configurations of Jest and Babel to make ES6 modules like SecureStore functional (and import statements, exports, etc.) who can help me, I will greatly appreciate you!
TLDR - How do I fix SyntaxError: Cannot use import statement outside a module using Jest?