jestjs - چگونه TypeScript را با ts-jest و ts-node با rootDir پیکربندی کنیم
من این تنظیمات را دارم:
// tsconfig.json
{
"compilerOptions": {
"rootDir": "src",
...
}
...
//jest.config.ts
...
globals: {
'ts-jest': {
tsconfig: {
rootDir: '.'
}
}
}
اما وقتی Jest را اجرا میکنم، یک خطای انتشار دریافت میکنم که میگوید فایلهای TypeScript باید زیر ریشه باشند، به نظر میرسد این گزینه کامپایلر "rootDir" نادیده گرفته شده است.
من نمیخواهم /test یا تنظیماتم زیر /src باشد و نمیخواهم که به /lib کامپایل شود یا انتشار یابد.
من هم نمیتوانم آن را با استفاده از exclude کنار بگذارم، چون در این صورت انواع فایلهای .ts من که خارج از پروژه هستند نیز کنار گذاشته میشوند، و این باعث میشود استفاده از ts-node خیلی دشوار شود.
پاسخ شماره ۱
شما باید پیکربندی ts-node را در tsconfig.json مشخص کنید.
// tconfig.json
{
"compilerOptions": {
"rootDir": "src",
...
"ts-node": {
"transpileOnly": true,
"files": true,
"compilerOptions": {
"rootDir": "."
}
}
}
...
// jest.config.ts
...
globals: {
'ts-jest': {
tsconfig: {
rootDir: '.'
}
}
}
شما میتوانید یک rootDir متفاوت برای ts-node در فایل tsconfig.json مشخص کنید، که این باعث میشود ts-node با استفاده از روت متفاوتی نسبت به اجرای معمولی tsc، کامپایل شود.
خطای emit که هنگام اجرای ts-jest دریافت میکنید در واقع مربوط به ts-jest نیست، بلکه ts-node است که شکایت میکند زیرا نمیتواند فایل کانفیگ jest را قبل از اینکه حتی کامپایل شود، تجزیه کند. وقتی شما jest را با یک فایل jest.config.ts اجرا میکنید، از ts-node برای کامپایل آن فایل استفاده میکند، سپس آن را به ts-jest میدهد تا تستهای شما را کامپایل کند، و بعد آن تستهای .js را به jest میسپارد تا اجرا شوند.
این به شما اجازه میدهد تا یک rootDir متفاوت برای ts-node داشته باشید تا بتوانید فایلهای .ts را بدون نیاز به کامپایل آنها به /lib و بدون نیاز به ذخیره آنها در /src اجرا کنید.
پاسخ شماره ۲
تعریف پیکربندی ts-jest تحت jest.globals منسوخ شده است.
// jest.config.ts
...
transform: { "^.+\\.tsx?$": ["ts-jest", {"rootDir": "."}] },
...
