es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Importar un módulo ESM puro en un proyecto de TS provoca que el test de Jest falle con un error de importación.

Intentando utilizar el módulo “file-type” que es completamente ESM en un proyecto de TS, pero mi jest falla. He configurado las opciones de ESM como se indica aquí pero aún recibo un error de “SyntaxError: Cannot use import statement outside a module”.

He creado un sandbox aquí.

Resumen de mi código:

import { fileTypeFromBuffer } from "file-type";

Configuración de Jest:

export default {
  testEnvironment: "jest-environment-node",
  globals: {
    extensionsToTreatAsEsm: [".ts"],
    "ts-jest": {
      useESM: true,
    },
  },
  transform: {
    "^.+\\.(ts|tsx|js|jsx)?$": "ts-jest",
  },
  moduleNameMapper: {
    "^(\\.{1,2}/.*)\\.js$": "$1",
  },
  preset: "ts-jest",
};

TSConfig:

{
  "extends": "@tsconfig/node14/tsconfig.json",
  "compilerOptions": {
    "target": "ES2018",
    "module": "commonjs",
    "lib": ["es2018"],
    "declaration": true,
    "strict": true,
    "strictNullChecks": true,
    "alwaysStrict": true,
    "noImplicitReturns": false,
    "noImplicitThis": false,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "noEmit": true,
    "noFallthroughCasesInSwitch": false,
    "inlineSourceMap": true,
    "inlineSources": true,
    "experimentalDecorators": true,
    "strictPropertyInitialization": false,
    "resolveJsonModule": true,
    "outDir": "dist",
    "baseUrl": ".",
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}

¿Algún idea?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con intentar importar un módulo puro de ESM (file-type) en un módulo de CommonJS. Por defecto, Jest se ejecuta en un entorno de CommonJS, por lo que debes configurarlo para admitir módulos ESM.

    Has seguido las instrucciones en la página de documentación de ts-jest para el soporte de ESM, pero parece que la configuración aún no funciona. Un posible problema es que estás utilizando el entorno de prueba jest-environment-node, que no admite ESM de forma predeterminada.

    Puedes intentar cambiar el entorno de prueba a node con la opción --experimental-vm-modules para habilitar el soporte de ESM, así:

    {
      "testEnvironment": "node",
      "transform": {
        "^.+\\.(ts)$": "ts-jest"
      },
      "globals": {
        "ts-jest": {
          "useESM": true
        }
      },
      "runner": "jest-runner"
    }
    

    Además, asegúrate de eliminar las entidades " de tu objeto de configuración de Jest, ya que no es una sintaxis JSON válida.

    Si esto aún no funciona, puedes intentar utilizar un entorno de prueba personalizado compatible con ESM, como jest-environment-jsdom-sixteen.

    {
      "testEnvironment": "jest-environment-jsdom-sixteen",
      "transform": {
        "^.+\\.(ts)$": "ts-jest"
      },
      "moduleNameMapper": {
        "@/(.*)": "<rootdir>/src/$1"
      },
      "globals": {
        "ts-jest": {
          "useESM": true
        }
      },
      "runner": "jest-runner"
    }
    

    Asegúrate de instalar el entorno y sus dependencias mediante npm o yarn:

    npm install jest-environment-jsdom-sixteen
    

    O alternativamente,

    yarn add jest-environment-jsdom-sixteen
    

    ¡Espero que esto ayude! Avísame si necesitas algo más.

Comments are closed.