GovTechSG / sgds-govtech-react

React components for SGDS
https://react.designsystem.tech.gov.sg/
MIT License
15 stars 6 forks source link

Failing jest unit test due to import statement in sgds node module #202

Closed suenalaba closed 11 months ago

suenalaba commented 1 year ago

Prerequisites

Describe the issue

Issue: When running jest unit tests:the following error occurs: Cannot use import statement outside a module

Screenshot 2023-11-07 at 12 11 21 PM

How to reproduce? Using import statement like this in my component: import { Card } from '@govtechsg/sgds-react/Card';

However, if we import the Card Component for example like this: import { Card } from '@govtechsg/sgds-react'; The error goes away.

Both imports should be expected to work but it is not behaving as expected. The reason for wanting the import path as: import { Card } from '@govtechsg/sgds-react/Card'; is to reduce the bundle size.

Dependencies:

Screenshot 2023-11-17 at 1 50 32 PM

What operating system(s) are you seeing the problem on?

macOS

What browser(s) are you seeing the problem on?

Chrome

Describe your frontend stack. What version of React and @govtechsg/sgds-react are you using? CSR or SSR?

"react": "^18", "@govtechsg/sgds-react": "^2.2.2"

clukhei commented 1 year ago

Hello @suenalaba , thanks for raising this.

Jest support for esm is still experimental. Thus, there needs to be some configuration on your end in the jest.config.js file.

In your jest.config.js file, in transformIgnorePatterns field ,change/node_modules/ to this

transformIgnorePatterns: [
    "/node_modules/(?!(@govtechsg/sgds-react)/)",
  ]

It means don't transform all of node_modules packages except @govtechsg/sgds-react. Let me know if this works for you :)

If you try out Jest experimental mode and it works , do share it here !

suenalaba commented 1 year ago

We tried this method, however it doesn't work as well. The only way we made it work is by importing import { Card } from '@govtechsg/sgds-react'; instead of import { Card } from '@govtechsg/sgds-react/Card';

clukhei commented 1 year ago

@suenalaba I have replicated the issue here and fixed it with same jest config and using import { Card } from '@govtechsg/sgds-react/Card'.

EDIT: codesandbox link for easier viewing You can pull down this repo run test to try and see what's the difference to debug. Im using NEXT + JEST + babel https://github.com/clukhei/stackblitz-next-jest

if you still cannot make it work, do provide me with a minimal reproducible repository.

suenalaba commented 11 months ago

We use next/jest to inject our next.config.js and .env into our test environment. However this causes the transform patterns to be overwritten, instead of extending it. Which causes the above method not to work. We got it to work with nextJestConfig.transformIgnorePatterns[0] = '/node_modules/(?!(@govtechsg/sgds-react)/)'; instead.