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`
- Dominant language
- TypeScript
- Stars
- 221
- Forks
- 61
- PR merge metrics
- No merged PRs in 30d
Description
`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
}
}
}
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.