I use Jest with Typescript. I want to create a monorepo. My folders structure is:
fe
|-app1
|--.jest.config.ts
|--tsconfig.json
|-shared
|--dummyData.ts
I want a unit test from app1
to access some data from shared
folder.
fe/app1/demo.spec.ts
:
import { someData } from '@shared/dummyData' //<--HERE: the alias is works, but jest can not understand "export" keyword
descrube('demo' () => {
it('demo test', () => {
expect(someData).toBe('DUMMY'));
})
})
fe/shared/dummyData.ts
:
export const someData = 'DUMMY';
The problem is that jest throws an error:
Jest encountered an unexpected token
{"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){export const someData = 'DUMMY';
^^^^^^
As I understand it cannot parse typescript or es6 modules that were produced by ts and babel.
The thing that it works fine while shared
folder is inside app1
, but once it's outside (and outside the root folder, i.g '<rootDir>/../shared/$1'
) it start throwing that error.
Here is my configs:
I described alias in fe/app1/tsconfig.json
:
{
...
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"paths": {
"@/*": ["app/src/*"],
"@shared/*": ["shared/*"]
}
}
}
And in fe/app1/.jest.config.ts
:
module.exports = {
...
transform: {
'^.+\\.js$': '<rootDir>/node_modules/babel-jest',
'^.+\\.(jsx?|tsx?)$': 'ts-jest'
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@shared/(.*)$': '<rootDir>/../shared/$1',
}
}
Some thoughts:
tsconfig
in the root folder(fe
), but I want to launch unit tests from fe/app1
folder...projects
, roots
and etc, but I'm out of luck so far.Okay, I found the solution:
For monorepo it is important to have babel config as a JS file
So, simply rename .babelrc
to babel.config.js
(in the folder you called jest from, in my case it is fe/app1
)
For more info you could check this comment (and maybe this thread)