Styled-components/macro doesn't work with Jest
Asked Answered
S

1

11

I'm trying to integrate Jest, (ts-jest) into my typescript project which uses styled-components/macros. But for some reason, Jest is complaining with the following error:

ts-jest[versions] (WARN) Version 4.0.2 of typescript installed has not been tested with ts-jest. If you're experiencing issues, consider using a supported version (>=4.3.0 <5.0.0-0). Please do not report issues in ts-jest if you are using unsupported versions.
 FAIL  packages/xx/src/components/button.test.tsx
  ● Test suite failed to run

    TypeError: macro_1.default.button is not a function

      2 |
      3 | export const Context = {
    > 4 |   Root: styled.button``,
        |                      ^
      5 | }
      6 |

      at Object.<anonymous> (packages/xx/src/components/button.mock.tsx:4:22)
      at Object.<anonymous> (packages/xx/src/components/button.test.tsx:5:1)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        7.073 s
Ran all test suites.
error Command failed with exit code 1.

TsConfig

const path = require("path");
const { lstatSync, readdirSync } = require("fs");

// get listing of packages in mono repo
const basePath = path.resolve(__dirname, "packages");
const packages = readdirSync(basePath).filter((name) =>
  lstatSync(path.join(basePath, name)).isDirectory()
);

/** @type {import('ts-jest').InitialOptionsTsJest} */
module.exports = {
  preset: "ts-jest",
  testEnvironment: "node",

  rootDir: ".",
  setupFiles: [],
  moduleDirectories: [
    'node_modules',
    '<rootDir>'
  ],
  transformIgnorePatterns: ['<rootDir>/node_modules/'],
  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
  setupFilesAfterEnv: [
    '<rootDir>/setupTests.ts', 
    '<rootDir>/shimTests.ts',
    '@testing-library/jest-dom/extend-expect'
  ],
  testMatch: ['**/*.test.(ts|tsx|js)'],


  moduleNameMapper: {
    "^.+\\.(css|less|scss)$": "babel-jest",
    // automatically generated list of our packages from packages directory.
    // will tell jest where to find source code for @ahoopen/ packages, it points to the src instead of dist.
    ...packages.reduce(
      (acc, name) => ({
        ...acc,
        [`@ahoopen/${name}(.*)$`]: `<rootDir>/packages/./${name}/src/$1`,
      }),
      {}
    ),
  },
  modulePathIgnorePatterns: [
    ...packages.reduce(
      (acc, name) => [...acc, `<rootDir>/packages/${name}/dist`],
      []
    ),
  ],

  globals: {
    'ts-jest': {
      // ts-jest configuration goes here and your IDE will suggest which configs when typing
      babelConfig: {
        "presets": [
          [
            "@babel/preset-env",
            {
              "targets": {
                "node": "10"
              }
            }
          ]
        ],
        // presets: ['@babel/preset-env', '@babel/preset-typescript', '@babel/preset-react'],
        plugins: ['macros'],
      }
    },
  },
};


Dev Dependencies

"devDependencies": {
    "@babel/cli": "^7.17.10",
    "@babel/core": "^7.18.0",
    "@babel/plugin-transform-runtime": "^7.18.0",
    "@babel/preset-env": "^7.18.0",
    "@babel/preset-react": "^7.17.12",
    "@babel/preset-typescript": "^7.17.12",
    "@testing-library/jest-dom": "5.16.4",
    "@testing-library/react": "13.2.0",
    "@types/jest": "27.5.1",
    "@types/node": "17.0.35",
    "babel-plugin-macros": "^3.1.0",
    "babel-plugin-styled-components": "^2.0.7",
    "enzyme": "3.11.0",
    "enzyme-adapter-react-16": "1.15.6",
    "eslint": "7.7.0",
    "is-ci": "2.0.0",
    "jest": "28.1.0",
    "jest-image-snapshot": "4.5.1",
    "jest-styled-components": "7.0.8",
    "jsdom-screenshot": "4.0.0",
    "lerna": "3.22.1",
    "react-dom": "18.1.0",
    "rimraf": "3.0.2",
    "styled-components": "5.3.5",
    "ts-jest": "28.0.2",
    "typescript": "4.0.2"
  }
``
Stroke answered 20/5, 2022 at 10:54 Comment(1)
did you find any solution since ?Centipoise
R
1

Remapping the styled-components/macro import to simply styled-components worked for me. Example package.json config:

"jest": {
    "moduleNameMapper": {
        "styled-components/macro": "styled-components"
    }
}
Rhodie answered 27/10, 2023 at 14:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.