Skip to content

Instantly share code, notes, and snippets.

@nicolas-lizarazo
Last active January 17, 2026 23:24
Show Gist options
  • Select an option

  • Save nicolas-lizarazo/f09969d32776bda98f5829efa767f37d to your computer and use it in GitHub Desktop.

Select an option

Save nicolas-lizarazo/f09969d32776bda98f5829efa767f37d to your computer and use it in GitHub Desktop.
# Pasos para configurar Jest con TypeScript (Modo ESM - Moderno)

Pasos para configurar Jest con TypeScript (Modo ESM - Moderno)

Esta configuración está diseñada para Node.js con "type": "module", donde las importaciones de TypeScript requieren extensión .js y Jest requiere banderas ESM.

Documentación: Jest ESM Support | ts-jest ESM

1. Instalaciones de desarrollo

Instalamos las dependencias necesarias. ts-jest es el transformador que permite a Jest entender TypeScript.

npm install -D jest @types/jest ts-jest supertest @types/supertest

2. Generar archivo de configuración

Ejecuta el asistente de configuración. Nota: Responde "Yes" cuando pregunte si quieres usar TypeScript.

npx create-jest

3. Configurar jest.config.js (Crítico para ESM)

El archivo generado por defecto no funciona bien con módulos nativos ES. Reemplaza todo el contenido de jest.config.js (o .ts si elegiste esa opción) con esto.

Esta configuración hace tres cosas vitales:

  1. Activa el modo ESM de ts-jest.
  2. Trata los archivos .ts como módulos ES.
  3. Mapea las importaciones .js a archivos .ts (obligatorio en TypeScript moderno).
/** @type {import('ts-jest').JestConfigWithTsJest} */
export default {
  preset: 'ts-jest/presets/default-esm', // Usa el preset específico para ESM
  testEnvironment: 'node',
  extensionsToTreatAsEsm: ['.ts'],
  
  moduleNameMapper: {
    // Convierte imports como: import x from './algo.js' -> busca './algo.ts'
    '^(\\.{1,2}/.*)\\.js$': '$1',
  },
  
  transform: {
    // Configuración específica para pasar flags a ts-jest
    '^.+\\.tsx?$': [
      'ts-jest',
      {
        useESM: true,
      },
    ],
  },
};

4. Scripts en package.json

Jest necesita permiso para usar la API de módulos de Node. Debemos pasar la bandera --experimental-vm-modules.

"scripts": {
  "test": "NODE_OPTIONS=--experimental-vm-modules jest",
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch",
  "test:coverage": "NODE_OPTIONS=--experimental-vm-modules jest --coverage"
}

Ejecuta este comando en tu terminal para instalar la librería que "traduce" estas variables entre sistemas operativos:

npm install -D cross-env

Para evitar error al usar variable de entorno NODE_OPTIONS en windows se cambia lo anterior por este script

"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest",
    "test:watch": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --watch",
    "test:coverage": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage",

Solución de problemas comunes

Error: "SyntaxError: Cannot use import statement outside a module"

  • Causa: Jest está intentando leer el archivo como CommonJS.
  • Solución: Asegúrate de que tu package.json tenga "type": "module" y que hayas copiado el script NODE_OPTIONS correctamente.

Error en Windows con los scripts Si la terminal de Windows no reconoce NODE_OPTIONS, instala cross-env:

  1. npm i -D cross-env
  2. Modifica el script: "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
@nicolas-lizarazo
Copy link
Author

nicolas-lizarazo commented Jan 17, 2026

Actualizacion jest

npm install -g npm@11.7.0

@nicolas-lizarazo
Copy link
Author

solucionar error en ts.config

{
  "compilerOptions": {
    "rootDir": "./src",
    // ... el resto de tu config
  },
  "exclude": ["node_modules", "jest.config.ts"] 
}

@nicolas-lizarazo
Copy link
Author

En ts-config

"types": ["jest", "node"],

@nicolas-lizarazo
Copy link
Author

excluir en ts-config

  "exclude": ["node_modules", "jest.config.ts", "dist", "src/**/*.test.ts"],

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment