Setup JEST, Babel, GraphQL

Ilya Zykin
2 min readMay 14, 2019

--

How I setup JEST to work with Babel and GQL

First of all I have to say — I think that it’s a good practice to keep all configuration files in a folder with name config Doesn’t matter if you use Rails, Node.JS, Python or something else.

Currently configuration folder for me looks like:

config/
├── .babelrc.js
├── .eslintrc.json
├── .prettierrc
├── .styled-components-stylelintrc.js
├── .stylelint.rules.js
├── .stylelintrc.js
├── gql-transformer.js
├── jest-transformer.js
└── jest.config.js

In my case I had files like

import gql from 'graphql-tag'const userData = gql`
{
user {
fullName
photo
}
}
`
export default userData

and I wanted to have only

{
user {
fullName
photo
}
}

In my Webpack config I have the following

module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
use: babelLoader
},
{
test: /\.gql$/,
exclude: /node_modules/,
use: graphqlLoader
}
]
}

babelLoader here looks like

const babelConfig = require(`${rootPath}/config/.babelrc.js`)const babelLoader = [
{
loader: 'babel-loader',
options: babelConfig
}
]
const graphqlLoader = [
{ loader: 'graphql-tag/loader' }
]

.babelrc.js is

"use strict";module.exports = {
"presets": [
["@babel/preset-env", { modules: "commonjs" }],
"@babel/preset-react"
],
"plugins": [
"styled-components",
// to make `async/await` works
["@babel/transform-runtime", {
"regenerator": true
}]
]
}

I have done it so, because I wanted to share my .babelrc with JEST

jest.config.js

module.exports = {
verbose: true,
rootDir: "..",
// Custom transformer to use custom .babelrc.js
"transform": {
"^.+\\.js$": "<rootDir>/config/jest-transformer.js"
},
// File mocks. To run tests properly.
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|svg)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css)$": "<rootDir>/__mocks__/styleMock.js"
}
}

JEST transformer for JS files looks like config/jest-transformer.js

module.exports = require('babel-jest').createTransformer(
require('./.babelrc.js')
)

I found that in my application I can use .gql files like this

{
user {
fullName
photo
}
}

but JEST can’t import them in test.js files properly.

I had to do the following

jest.config.js

module.exports = {
verbose: true,
rootDir: "..",
"transform": {
"^.+\\.js$": "<rootDir>/config/jest-transformer.js",
"^.+\\.gql$": "<rootDir>/config/gql-transformer.js"
}

And implement config/gql-transformer.js like that

const gql = require("graphql-tag")module.exports = {
process: function(src) {
var str = JSON.stringify(gql(src))
return (
"module.exports=" + \
str + \
";module.exports.default=module.exports;"
)
}
}

Since that moment JEST tests become be able to process .gql query files.

--

--

Ilya Zykin
Ilya Zykin

Written by Ilya Zykin

IT coach. React and Rails enthusiast. Passionate programmer, caring husband and pancake baker on Sundays. School teacher of computer studies in the past.

No responses yet