typescript - JEST - SyntaxError: Ovårdat token 'export' med uuid-biblioteket


Jag brukade lösa liknande fel medan jag använde Jest med endast JavaScript, men just nu kan jag inte göra det med TypeScript.

Alla mina tester fungerade bra tills jag installerade Puppeteer som kräver @types/jest-environment-puppeteer, @types/puppeteer och @types/expect-puppeteer.

Efter att ha installerat dem körs puppeteer-testerna perfekt, men andra tester började misslyckas med följande fel.

  D:\...\api\node_modules\uuid\dist\esm-browser\index.js:1    
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){export { default as v1 } from './v1.js';
                                                                                      ^^^^^^  

    SyntaxError: Unexpected token 'export'

      at Runtime.createScriptFromCode (../node_modules/jest-runtime/build/index.js:1796:14)   
      at Object.require (../node_modules/@nestjs/common/decorators/core/injectable.decorator.js:4:16)

VAD GJORDE JAG?

allowJs: true i tsconfig.json och sätt transformIgnorePatterns i jest-konfigurationerna. Så att jest kan kompilera filer från node_modules/. Efter det slutade detta fel, men testet misslyckades av en annan konstig anledning. Och värre är att testets starttid har ökat för mycket.

Så jag lämnade allowJs som i den ursprungliga inställningen och uppdaterade jest-konfigurationen från

"transform": {
   "^.+\\.(t|j)s$": "ts-jest"
}

till

"transform": {
   "^.+\\.(t)s$": "ts-jest"
}

Så för närvarande kompilerar ts-jest inte js-filer. Men jag tror att jag inte kan få babel att välja transformationen för js-filer. Det här är mina jest-konfigurationer:

{
  "moduleFileExtensions": ["js", "json", "ts"],
  "rootDir": ".",
  "testEnvironment": "node",
  "testRegex": ".e2e-spec.ts$",
  "transform": {
    "^.+\\.(t)s$": "ts-jest",
    "^.+\\.(js|jsx)$": "babel-jest"
  },
  "transformIgnorePatterns": ["<rootDir>/node_modules/.+.(js|jsx)$"]
}

Svar #1

Tack vare detta svar: https://stackoverflow.com/a/54117206/15741905

Jag började googla efter liknande lösningar och hamnade här: https://github.com/uuidjs/uuid/issues/451

Och detta löste mitt problem: https://github.com/uuidjs/uuid/issues/451#issuecomment-1112328417

// jest.config.js
{
//................
  moduleNameMapper: {
    // Force module uuid to resolve with the CJS entry point, because Jest does not support package.json.exports. See https://github.com/uuidjs/uuid/issues/451
    "uuid": require.resolve('uuid'),
  }
}

Även om jag fortfarande skulle vara glad om det finns en lösning på detta genom att använda jest-babel.

För att jag var tvungen att överföra jest-konfigurationer från package.json till en separat .js-fil.

Redigera: Enligt detta GitHub-issue har kompatibilitetsproblemet lösts med den senaste versionen av uuid-biblioteket.

Svar #2

Att helt enkelt lägga till moduleNameMapper:{"^uuid$": "uuid"} i min jest.config.js löste problemet för mig:

Transitivt beroende uuid: ^8.3.2

jest: 28.1.3

angular: 14.0.1

Relaterade artiklar