Estoy tratando de actualizar mi API para usar node-fetch 3.0.0. Parte de los cambios importantes en su documentación es que node-fetch ahora es un módulo ESM puro.
https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md
Mis pruebas unitarias han comenzado a romperse con este cambio. Estaba usando jest.requireActual("node-fetch") para el objeto de respuesta
const { Response } = jest.requireActual("node-fetch");Sin embargo, con el nuevo cambio, obtengo:
"La propiedad 'Respuesta' no existe en el tipo '{}'".
Intenté cambiar a una declaración de importación que parece corregir ese error:
import { Response } from "node-fetch"Ahora, recibo el siguiente error cuando ejecuto mis pruebas unitarias:
Test suite failed to run Jest encountered an unexpected token This usually means that you are trying to import a file which Jest cannot parse, eg it's not plain JavaScript. By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules". Here's what you can do: • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/en/ecmascript-modules for how to enable it. • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config. • If you need a custom transformation specify a "transform" option in your config. • If you simply want to mock your non-JS modules (eg binary assets) you can stub them out with the "moduleNameMapper" config option. You'll find more details and examples of these config options in the docs: https://jestjs.io/docs/en/configuration.html Details: C:\Users\{mypath}\api\node_modules\node-fetch\src\index.js:9 import http from 'http'; ^^^^^^ SyntaxError: Cannot use import statement outside a module 2 | import { AuthProvider, TokenCache } from "./tokenTypes"; 3 | import { getUserEmail, getUserId, getUserRole } from "../common/authUtil"; > 4 | import fetch from "node-fetch";El error parece estar ocurriendo dentro de node-fetch.
Intenté cambiar el script de prueba en mi paquete.json para que coincida con lo que sugiere la documentación de broma para los módulos ESM. https://jestjs.io/docs/ecmascript-modules
paquete.json
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"La documentación también sugiere cambiar la propiedad de transformación en jest.config.js para tomar un objeto vacío, pero mi objeto de transformación se parece a lo siguiente para mecanografiado y ts-jest:
jest.config.js
transform: { "^.+\\.ts?$": "ts-jest" }Si cambio esto a un objeto vacío, todas mis pruebas se rompen. No estoy muy familiarizado con CJS vs ESM, por lo que agradecería cualquier ayuda.
Fetch 3.0 está diseñado para usar esmodules en lugar de commonjs. Por lo tanto, debe asegurarse de importarlo en un módulo.
Por ejemplo: para importarlo a app.js: agregue "type":"module" en su paquete.json y luego impórtelo.
Para importarlo a otros archivos o incluso a app.js, también puede cambiar la extensión de .js a mjs que le indicará a nodejs que lo trate como un esmodule.
De lo contrario, baje la categoría de fetch para usar una versión anterior que admita commonjs como 2.something.
npm install node-fetch@2 npm install @types/node-fetch@2¡Yo tuve el mismo problema! agregando
transform: { "^.+\\.(ts|tsx)$": "ts-jest", "^.+\\.(js)$": "babel-jest", }, transformIgnorePatterns: [ ], a mi archivo jest.config.js lo resolvió. y por cierto estas son mis versiones:
"jest": "^27.3.1", "ts-jest": "^27.0.7", "node-fetch": "^3.1.0"