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`

Aperta
#39 5 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
TypeScript
Stelle
221
Fork
61
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

`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
}
}
}
```

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.