nx: `nx test` (jest) cannot resolve tsconfig paths after migration to nx 14.x
Current Behavior
After migrating to nx 14, all my tests that import modules from aliased paths (from my libs) fail. The app builds fine and VSCode shows no issues with the module resolution, but when running tests, jest is no longer able to resolve my path aliases:
Expected Behavior
The tests should pass.
Steps to Reproduce
nx migrate latest on my main branch here:
https://github.com/hevans90/idleverse
Then nx test to run my default project’s testing suite with the failing tests.
OR, check out this branch and nx test:
https://github.com/hevans90/idleverse/tree/build/nx-14
This issue may not be prioritized if details are not provided to help us reproduce the issue.
Failure Logs
Environment
Node : 16.13.2 OS : darwin x64 yarn : 1.22.18
nx : 14.2.2 @nrwl/angular : Not Found @nrwl/cypress : 14.2.2 @nrwl/detox : Not Found @nrwl/devkit : 14.2.2 @nrwl/eslint-plugin-nx : 14.2.2 @nrwl/express : Not Found @nrwl/jest : 14.2.2 @nrwl/js : 14.2.2 @nrwl/linter : 14.2.2 @nrwl/nest : Not Found @nrwl/next : Not Found @nrwl/node : 14.2.2 @nrwl/nx-cloud : 14.0.8 @nrwl/nx-plugin : Not Found @nrwl/react : 14.2.2 @nrwl/react-native : Not Found @nrwl/schematics : Not Found @nrwl/storybook : 14.2.2 @nrwl/web : 14.2.2 @nrwl/workspace : 14.2.2 typescript : 4.7.3
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 17 (4 by maintainers)
@jonwalstedt thanks for the diff, it looks like it was when I changed the nxPreset. Looking at your root jest.preset.js it doesn’t have the updated version @hevans90
You’ll want to add
.defaultto the nxPreset import.This should have been fixed in v14.1.5 migration for you. You can try rerunning that migration to see if it’s added as you’re preset is the default so there isn’t a reason it shouldn’t work. Or just manually make that change. This was causing the @nrwl/jest/plugins/resolver to not resolve the module names.
Hello @barbados-clemens , I work with @christophechevalier . I didn’t succeed to make a Stackblitz project reproducing the error, so I created a small project on github, available at this address. If you have any questions or problems do not hesitate to contact us.
That did the trick, thanks @barbados-clemens
Guys I managed to write an isolated test and I think I found some interesting things…
deptest-imports.ts
deptest-interface.ts
deptest.spec.ts
So far, executing that test with jest 28 + ts-node fails reliably with same error:
ReferenceError: deptest_interface_1 is not definedEDIT: Created a new repo for reproduction. Issue only happens when jest-preset-angular is used for transformations. Repo here: https://github.com/jbjhjm/jest28-bug
It contains the same test suite 4 times:
I’m concluding following circumstances lead to the error:
Interestingly, only the last static function declaration errors, all of those before are fine. So this means it will only happen if a module exports only types. As soon as something else is exported and the module actually “exists”, the error is gone. You’ll see the test contains an unused “DUMMY” import. As soon as this is being used anywhere, the ReferenceError will disappear because the imported module is not type-only anymore.
Edit:
Summing up, this is not a nx issue. It seems that some implementation within jest-preset-angular causes this.
See https://github.com/thymikee/jest-preset-angular/issues/1810 https://github.com/thymikee/jest-preset-angular/issues/1199
Thanks for your PR @barbados-clemens , this solves the problem 😃
thanks for the reproduce-able @jcabannes and @christophechevalier
I was able to get the tests passing by setting
emitDecoratorMetadata": falsein the project leveltsconfig.spec.jsonwhere the error is happening.Assuming you don’t need reflection at test time this should be find to do. If you do need reflection at test time, then this could be an issue with angular devkit as noted in this issue from ngxs
Here is a PR against your reproduce-able showing it working. https://github.com/jcabannes/nx-angular-ngxs-jest/pull/1
Jest 28 yes.
I tried to upgrade the version of Jest to use 29.0.3 but I have compatibility issues with
ts-jestwhich does not accept a version greater than or equal to 29.0.0. So I kept my current versions.Stay tuned please, we might ask you again to review the code that reproduces our issue on Stackblitz soon.
is this with jest 28 @christophechevalier? this looks an error @FrozenPandaz ran into, which is basically ts-jest/jest-preset-angular was returning “different” transpiled code causing a null ref error since an import wasn’t being included. I think we are still trying to debug this ourselves, but doesn’t look to be directly an nx issue but maybe a transformer/downstream dep.
but any reproduceable would be helpful. we haven’t had much luck trying to track it down exactly where it’s happening.