A lightweight, type-safe, fully-featured Event Bus library for modern JavaScript and TypeScript projects.
- ✅ Type-safe event definitions
- 🔁
on/once/off/emitAPI - 🧼 Clear & remove listeners easily
- 🧰 Utility methods:
has,listenerCount,eventNames,listeners - 🛡️ Global error handling with
onError - 🧠 Debug mode for development
- ⚡ Zero dependencies & lightweight
npm install evenex
# or
yarn add evenex
# or
pnpm add eveneximport evenex from 'evenex'
// Listen to an event
evenex.on('hello', (name: string) => {
console.log(`Hello, ${name}!`)
})
// Emit event
evenex.emit('hello', 'World')
// -> Hello, World!You can define your own event map interface for better type inference:
import { createEvenex } from 'evenex'
interface MyEvents {
'user:login': [userId: string]
'user:logout': []
}
const bus = createEvenex<MyEvents>()
bus.on('user:login', (userId) => {
console.log('User logged in:', userId)
})
bus.emit('user:login', '12345') // ✅ OK
bus.emit('user:login') // ❌ Type errorconst handler = () => console.log('event')
bus.on('foo', handler)
bus.off('foo', handler) // remove specific
bus.off('foo') // remove all listeners of foo
bus.clear() // remove all listeners of all events| Method | Description |
|---|---|
on(event, handler) |
Subscribe to an event |
once(event, handler) |
Subscribe once only |
off(event, handler?) |
Unsubscribe handler or all handlers of the event |
emit(event, ...args) |
Trigger event |
has(event) |
Check if event has listeners |
listenerCount(event) |
Get number of listeners |
eventNames() |
Get all event names |
listeners(event) |
Get all listener functions |
clear(event?) |
Clear specific or all events |
removeAllListeners() |
Alias for clear() |
import { createEvenex } from 'evenex'
const bus = createEvenex({
onError(error, event, handler) {
console.error(`Error in ${String(event)}:`, error)
}
})
bus.on('boom', () => {
throw new Error('💥')
})
bus.emit('boom') // error is caught by onErrorMIT License © 2025-PRESENT king3
Contributions, issues and feature requests are welcome!
Feel free to check the issues page.