jestjs - Eroare "SyntaxError: Cannot use import statement outside a module" atunci când se folosește node-fetch în Jest cu Typescript


Încerc să scriu un test de integrare în Typescript cu Jest care folosește node-fetch, astfel:

import fetch from 'node-fetch';

test('Hello', async () => {
    await fetch("http://www.google.com");
});

Dar primesc următoarea eroare:

    Jest encountered an unexpected token

    [...]
    
    Details:

    /home/xxx/node_modules/node-fetch/src/index.js:9
    import http from 'node:http';
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

    > 1 | import fetch from 'node-fetch';
        | ^
      2 |
      3 | test('Hello', async () => {
      4 |     await fetch("http://www.google.com");

      at Runtime.createScriptFromCode (node_modules/jest-runtime/build/index.js:1796:14)
      at Object.<anonymous> (temp.test.ts:1:1)

Am încercat câteva dintre soluțiile oferite în alte întrebări, dar nu funcționează; cred că problema mea este puțin diferită pentru că nu mă împiedică să folosesc în general sintaxa importantă de tip ES6, dar în mod specific nu funcționează pentru node-fetch. De exemplu, pot să fac import express from 'express' fără nicio dificultate.

Pentru a reproduce această eroare, am rulat:

npm init
npm install --save-dev jest typescript ts-jest @types/jest node-fetch @types/node-fetch
npx ts-jest config:init
npx jest

care generează următoarea configurație Jest:

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

Răspuns #1

Vă rugăm să folosiți v2, care rămâne compatibil cu CommonJS:

npm install node-fetch@2
const fetch = require('node-fetch');