Compile JSX in @swc/jest Tests
Here's how to compile JSX in jest tests that use SWC, or Speedy Web Compiler.
Install
Wellll, this is an article about a toolchain that's getting a little long. Of course, not as bad as it could be. We have only one babel plugin here, after all.
npm install jest @swc/core @swc/jest @babel/core @babel/plugin-transform-react-jsx
So what's all this for? @swc/core
is supposed to be a faster compiler. Faster than Babel. And when you start compiling things in test files, you need to run those files through @swc/jest
. That should be a drop-in replacement. Babel is still used, however, providing the ability to transform the JSX.
Set up SWC
To control SWC, implement a .swcrc
file:
{
"$schema": "https://json.schemastore.org/swcrc",
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": true
}
}
}
Set up Babel
To control babel, implement a babel.config.js
file:
export default {
plugins: ["@babel/plugin-transform-react-jsx"],
};
Now why does one need to configure babel to transform jsx and swc to transform jsx? I'm not sure. But it doesn't seem to work with just one or the other.
Set up Jest
To control jest, implement a jest.config.js
file:
export default {
transform: {
"^.+\\.(t|j)sx?$": ["@swc/jest"],
},
};
Write some JSX Code
Want some JSX, right? Write it in stuff.js
:
import React from 'react'
function MyComponent() {
return <div>yay</div>
}
export function add(a, b) {
return a + b
}
Write a Test
And then the test in a stuff.test.js
file:
import { add } from './stuff.js'
it('adds', () => {
expect(add(1, 2)).toEqual(3)
})
Note that the test exercising the add
function, which is not JSX. But the import is for a file that contains jsx, so to eval the file, compilation is required.
The Error to Avoid
If you don't compile, you'll get a stinker error like this:
Error
FAIL src/stuff.test.js
● Test suite failed to run
x Expression expected
,-[/Users/jaketrent/dev/stuff/src/stuff.js:8:1]
5 | return yay
: ^
...
Which, of course, will let your beautiful code run through this chain of configured magic boxes, then run in your jest test environment perfectly forever (or until the next library upgrade).
No errors. Compiled JSX. Call it a day, you JavaScript fiend.