'Node v13 / Jest / ES6 — native support for modules without babel or esm

Is it possible to test ES6 Modules with Jest without esm or babel? Since node v13 supports es6 natively have tried:

//package.json
{
  …
  "type": "module"
  …
}



//__tests__/a.js
import Foo from '../src/Foo.js';


$ npx jest

Jest encountered an unexpected token
…
Details:

/home/node/xxx/__tests__/a.js:1
import Foo from '../src/Foo.js';
^^^^^^

SyntaxError: Cannot use import statement outside a module

When babel is added a transpiler, it works, but can es6 modules be used natively as well?



Solution 1:[1]

Yes, it is possible from [email protected]. From this version, there is a native support of esm, so you will not have to transpile your code with babel anymore.

It is not documented yet, but according to this issue you have to do 3 easy steps to achieve that (At the time of writing this answer):

  • Make sure you don't transform away import statements by setting transform: {} in your jest config file
  • Run node@^12.16.0 || >=13.2.0 with --experimental-vm-modules flag
  • Run your test with jest-environment-node or jest-environment-jsdom-sixteen.

So your jest config file should contain at least this:

export default {
    testEnvironment: 'jest-environment-node',
    transform: {}
    ...
};

And to set --experimental-vm-modules flag, you will have to run Jest from package.json as follows (I hope this will change in the future):

"scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
}

I hope, this answer was helpful to you.

Solution 2:[2]

I followed the tips provided in the accepted answer, but I added the property "type": "module" in my package.json in order to jest works properly. This is what I done:

In package.json:

"devDependencies": {
    "jest": "^26.1.0",
    "jest-environment-jsdom-sixteen": "^1.0.3",
    "jest-environment-node": "^26.1.0"
  },
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
  },
  "type": "module",
  "jest": {
    "transform": {},
    "testEnvironment": "jest-environment-jsdom-sixteen"
  }

Solution 3:[3]

Note that this is is still experimental, but we have documented how to test this, so there's hopefully less confusion.

https://jestjs.io/docs/en/ecmascript-modules

The steps in https://stackoverflow.com/a/61653104/1850276 are correct

Solution 4:[4]

In addition to @Radovan Kuka's answer, here's how to run Jest with ES modules, using npx:

"test:monitoring": "npx --node-arg=--experimental-vm-modules jest -f monitoring.test.js --detectOpenHandles",

The benefit is that one doesn't need to provide the absolute node_modules path.

Solution 5:[5]

To run jest from "jest" extension in VSCode with "--experimental-vm-modules" flags, put this config in your global or workspaces settings.json:

"jest.nodeEnv": {

    "NODE_OPTIONS": "--experimental-vm-modules"
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 doppelgreener
Solution 2
Solution 3 SimenB
Solution 4 akauppi
Solution 5 Gonzalo