node.js - ts-jest kan inte använda top-level await även med korrekt tsconfig
Jag försöker använda ett topnivå await under testning med Jest men Jest klagar på att
error TS1378: Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', or 'nodenext', and the 'target' option is set to 'es2017' or higher.
Här är filen (src/lib/mongodb.ts) som är problematisk:
import { MongoClient } from 'mongodb';
import mongoUri from 'mongo-uri-tool';
import { getMongoURI } from './settings/settings.js';
const getConnectionOptions = () => {
const uri = getMongoURI();
return {
uri,
parsedUri: mongoUri.parseUri(uri),
};
};
const connectToMongoDB = async () => {
const connectionOptions = getConnectionOptions();
const mongodb = await MongoClient.connect(connectionOptions.uri);
return mongodb.db(connectionOptions.parsedUri.db);
};
export const MongoDB = await connectToMongoDB();
Här är testfilen (src/api/trips/trips.test.ts) som i slutändan importerar ovanstående:
import { Trips } from './index'; // <--------- this is the import which leads to importing mongodb
import generateId from '../../lib/generateId';
describe('find trip by id', () => {
test('find trip by id', async () => {
const id = generateId();
const slug = 'lol';
await Trips.insertOne({ _id: id, slug });
const trip = await Trips.findOne({ _id: id });
expect(trip._id).toStrictEqual(id);
});
});
När jag kör npx tsc rapporteras inga problem:
11:12AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing ✭ ✱ ➜ ◼
❮❮❮ npx tsc
11:12AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing ✭ ✱ ➜ ◼
Här är min tsconfig.json som har korrekt module och target:
{
"compilerOptions": {
"sourceMap": true,
"esModuleInterop": true,
"allowJs": true,
"noImplicitAny": true,
"moduleResolution": "node",
"lib": ["es2022", "DOM"],
"module": "es2022",
"target": "es2017",
"rootDir": "src",
"baseUrl": ".",
"paths": {
"*": ["node_modules/*", "src/types/*"]
},
"types": ["node", "jest"],
"typeRoots": ["node_modules/@types", "src/types"],
"outDir": "./built"
},
"include": ["./src/**/*", "jest.config.js"],
"exclude": ["node_modules", "dist"]
}
och här är min jest.config.cjs:
const { jsWithTsESM: tsjPreset } = require("ts-jest/presets");
module.exports = {
...tsjPreset,
globals: {
"ts-jest": {
tsconfig: "tsconfig.json",
}
},
testEnvironment: 'node',
moduleFileExtensions: ["ts", "js"],
testRegex: ".*.test.ts"
};
Här är min projektstruktur:
Varför är det så att Jest och ts-jest klagar på att jag inte kan använda en top-level await men tsc och min IDE (Webstorm) inte klagar alls? Hur kan jag korrekt konfigurera Jest och ts-jest för att tillåta top-level awaits med ESM för både JS- och TS-filer (jag migrerar långsamt från JS till TS)?
Observera att Jest fungerade utmärkt tills jag lade till det första testet som förlitar sig på en top-nivå await. Det verkar som att jag har Jest och ts-jest korrekt konfigurerade för att fungera med ESM och en blandning av JS- och TS-filer. Det nya problemet är att förstå top-nivå await med ts-jest.
REDIGERA: om jag lägger till @ts-ignore på den problematiska top-level await får jag ett annat liknande problem rapporterat av Jest:
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
export const MongoDB = await connectToMongoDB();
Details:
/Users/paymahn/code/tripvector/tripvector-mono/backend/src/lib/mongodb.ts:24
exports.MongoDB = await connectToMongoDB();
^^^^^
SyntaxError: await is only valid in async functions and the top level bodies of modules
Kunde detta vara ett problem beroende på vilken version av Node jag använder? Jag använder för närvarande v17:
11:53AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing ✭ ✱ ➜ ◼
❯❯❯ node --version
v17.6.0
11:53AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing ✭ ✱ ➜ ◼
❯❯❯ npm --version
7.6.0
REDIGERA: intressant, jag migrerade till mocha och att köra mocha med -n loader=ts-node/esm fungerar perfekt. Jag undrar vad som händer med jest...
