Установка Jest "SyntaxError: Неожиданный экспорт токена"

Я выполняю тесты в существующем проекте, который в настоящее время не имеет тестов. Мои тесты не скомпилируют node_modules/.

/Users/me/myproject/node_modules/lodash-es/lodash.js:10
export { default as add } from './add.js';
^^^^^^
SyntaxError: Unexpected token export

  at transformAndBuildScript (node_modules/jest-runtime/build/transform.js:320:12)
  at Object.<anonymous> (app/reducers/kind_reducer.js:2:43)
  at Object.<anonymous> (app/reducers/index.js:12:47)

Обходной путь, который я нашел, заключается в "whitelist" node_modules в node_modules jest config следующим образом:

"jest": {
    "transformIgnorePatterns": [
      "!node_modules/"
    ]
  }

Это кажется взломом, потому что для запуска простого теста, который импортирует node_modules/lodash-es/lodash.js требуется более 1 минуты.

Любая помощь или направление ценится, спасибо!

Ответы

Ответ 1

Мне пришлось добавить это в мой .jestconfig:

"transformIgnorePatterns": [
  "<rootDir>/node_modules/(?!lodash-es)"
]

Ответ 2

Публикация более полного ответа здесь:

Jest по умолчанию не преобразует node_modules, потому что node_modules огромен. Большинство модулей узла упакованы, чтобы выставить код ES5, потому что это можно запустить без каких-либо дальнейших преобразований (и в основном обратно совместимых).

В вашем случае lodash-es специально предоставляет модули ES, которые должны быть созданы Jest через babel.

Вы можете попытаться сузить свой белый список, чтобы Jest не пытался передавать каждый файл javascript внутри node_modules через babel.

Я думаю, что правильная конфигурация в вашем случае:

"jest": {
  "transformIgnorePatterns": [
    "/!node_modules\\/lodash-es/"
  ]
}

Ответ 3

Если ни одно из перечисленных выше решений не помогло вам, попробуйте это в своей шутке.

"moduleNameMapper": {
    "^lodash-es$": "lodash"
}

Он заменит lodash-es версией commonjs во время тестирования.