جاوااسکریپت - Jest (تایپاسکریپت): SyntaxError: توکن غیرمنتظره 'export' (lowdb)
همانطور که از عنوان مشخص است، من با jest مشکل دارم که اجازه نمیدهد از بسته lowdb در تستهایم خروجی بگیرم. به نظر میرسد که این خطا فقط برای این بسته خاص رخ میدهد -- بقیه کد من نیز از خروجیهای ES6 استفاده میکنند و فایل package.json من کلید type: module را دارد.
من چه چیزی را امتحان کردهام
- اضافه کردن نوع ماژول -- Jest: SyntaxError: توکن غیرمنتظره 'export'
- اضافه کردن
transformIgnorePatterns: ["<rootDir>/node_modules/(?!lowdb)"]-- راهاندازی Jest "SyntaxError: Unexpected token export" - یک تبدیل برای
jsاضافه کنید که ازbabel-jestاستفاده میکند -- Jest با یک توکن غیرمنتظره مواجه شد - SyntaxError: توکن غیرمنتظره 'export' - بهروزرسانی
tsconfigمن برای خروجیcommonJSماژولها - بهروزرسانی
tsconfigمن بهallowJs:trueو بهروزرسانیtransformsدر jest من برای تجزیه JS باts-jest
مطمئن نیستم کجا اشتباه میکنم و پیشاپیش عذر میخواهم اگر احمق به نظر میرسم.
این تنظیمات TS من است
{
"compilerOptions": {
"rootDir": "src",
"outDir": "dist",
"esModuleInterop": true,
"allowJs": true,
"target": "ES6",
"moduleResolution": "node",
"resolveJsonModule": true,
"module": "ES6",
"baseUrl": "src",
"declaration": true,
"allowSyntheticDefaultImports": true,
"paths": {
"@services/*": ["services/*"],
"@constants/*": ["constants/*"],
"@typeDefs/*": ["typeDefs/*"],
"@config/*": ["config/*"],
"@utils/*": ["utils/*"],
"@assets/*": ["assets/*"]
}
},
"include": ["src/**/*.ts"],
"exclude": ["rollup.config.ts", "jest.config.ts"]
}
و این فایل jest.config.ts من است:
import type { Config } from "@jest/types";
import { pathsToModuleNameMapper } from "ts-jest";
import { compilerOptions } from "./tsconfig.json";
// Sync object
const config: Config.InitialOptions = {
verbose: true,
roots: ["<rootDir>"],
preset: "ts-jest",
testEnvironment: "node",
transform: {
"^.+\\.ts$": "ts-jest",
"^.+\\.js$": "babel-jest",
},
testRegex: ["^.+\\.test\\.ts$"],
moduleDirectories: ["src", "node_modules"],
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
};
export default config;
در نهایت، من جیست را به صورت زیر فراخوانی میکنم:
"test:ts": "jest --config=jest.config.ts",
پیشاپیش از شما متشکرم.
ویرایش: برخی زمینههای اضافی
من کاملاً مطمئن هستم که این نباید روی این مشکل تأثیری بگذارد، اما فکر میکنم ارائه زمینه بیشتر میتواند مفید باشد. من jest را با دو پیکربندی مختلف اجرا میکنم -- یکی برای JS و یکی برای TS و مخزنی که به آن مربوط میشود، دارای برخی اسکریپتهای ساخت است که به صورت JS نوشته شدهاند و فقط در nodeJS اجرا خواهند شد.
پیکربندی JS به شرح زیر است (هیچ مشکلی ندارد):
// Sync object
/** @type {import('@jest/types').Config.InitialOptions} */
const config = {
verbose: true,
testEnvironment: "jest-environment-node",
transformIgnorePatterns: ["/node_modules/"],
transform: {},
testRegex: ["^.+\\.test\\.js$"],
};
export default config;
و به شکل زیر فراخوانی میشود:
"test:js": "yarn node --experimental-vm-modules $(yarn bin jest) --config=jest.config.js",
پاسخ شماره ۱
من هم با مشکل مشابهی مواجه شدم. اینجا نحوهای که با تغییر jest.config.js آن را برطرف کردم آمده است:
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
transformIgnorePatterns: ["/node_modules/(?!lowdb|steno)"],
transform: {
"^.+\\.(js)?$": require.resolve("babel-jest"),
},
};
ما میخواهیم babel-jest فایلهای js را تجزیه کند، و lowDB و یکی از وابستگیهای آن - steno.
سپس، ما باید مطمئن شویم که فایل babel.config.js شامل موارد زیر است (ما باید babel را با افزونه @babel/plugin-transform-modules-commonjs پیکربندی کنیم تا واردات/صادرات به درستی تجزیه شوند و باید از importInterop: 'node' استفاده کنیم).
module.exports = {
env: {
test: {
presets: [
[
"@babel/preset-env",
{
targets: {
node: "current",
},
modules: "commonjs",
},
],
],
plugins: [
[
"@babel/plugin-transform-modules-commonjs",
{
importInterop: "node",
},
],
],
},
},
};
اطمینان حاصل کنید که همه وابستگیهای توسعه لازم را نصب کردهاید:
npm i -D babel-jest @babel/core
npm i -D @babel/preset-env
npm i -D @babel/plugin-transform-modules-commonjs
