epicweb-dev / epicweb-dev/full-stack-testing

Isolated DB throws this error `TypeError: The "eventTargets" argument must be an instance of EventEmitter or EventTarget. Received an instance of AbortSignal` with `npx vitest`

未关闭
#39 5 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
TypeScript
星标
221
派生
61
PR 合并指标
30 天内没有已合并 PR

描述

`npx vitest` throws the following error "**TypeError: The "eventTargets" argument must be an instance of EventEmitter or EventTarget. Received an instance of AbortSignal**" with Isolated DB for testing.

A little bit of google searching landed me [here](https://github.com/sindresorhus/execa/issues/1123), which is the root cause of the problem. You can check out the link for more context. Apparently, `execa` version `9` which is the current version of the package in the project relies on `setMaxListeners` export from `node:events` which throws error in` jsdom` environment because the `AbortSignal` from jsdom's `AbortController` is not node.js `EventTarget`.

I'm not exactly sure the best way to fix this problem. Of course, one option would be to downgrade `execa` to version `8` but not sure if that's a good idea based on this [comment](https://github.com/sindresorhus/execa/issues/1123#issuecomment-2153463691). However, I added this hack in the `db-setup.ts` file and it does work for me:
```ts
const kEventTarget = Symbol.for('nodejs.event_target') // https://github.com/nodejs/node/blob/68c9f554ffa2fab1ef3b6466c51491371f0dd158/lib/internal/event_target.js#L50

if (globalThis.window !== undefined) {
const JSDOMAbortController = window.AbortController
window.AbortController = class extends JSDOMAbortController {
get signal() {
const signal = super.signal
if ('constructor' in signal) {
// @ts-expect-error
signal.constructor[kEventTarget] = true //
} else {
// @ts-expect-error
signal.constructor = { [kEventTarget]: true } //https://github.com/nodejs/node/blob/68c9f554ffa2fab1ef3b6466c51491371f0dd158/lib/internal/event_target.js#L1070
}
return signal
}
}
}
```

贡献指南

这个仓库没有索引到贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。