Comparing version 0.13.1 to 1.0.0
183
index.d.ts
@@ -1,3 +0,1 @@ | ||
/* eslint-disable no-redeclare */ | ||
/** | ||
@@ -8,3 +6,3 @@ Emittery accepts strings, symbols, and numbers as event names. | ||
*/ | ||
type EventName = PropertyKey; | ||
export type EventName = PropertyKey; | ||
@@ -18,3 +16,3 @@ // Helper type for turning the passed `EventData` type map into a list of string keys that don't require data alongside the event name when emitting. Uses the same trick that `Omit` does internally to filter keys by building a map of keys to keys we want to keep, and then accessing all the keys to return just the list of keys we want to keep. | ||
declare const listenerRemoved: unique symbol; | ||
type _OmnipresentEventData = {[listenerAdded]: Emittery.ListenerChangedData; [listenerRemoved]: Emittery.ListenerChangedData}; | ||
type OmnipresentEventData = {[listenerAdded]: ListenerChangedData; [listenerRemoved]: ListenerChangedData}; | ||
@@ -28,3 +26,3 @@ /** | ||
*/ | ||
type DebugLogger<EventData, Name extends keyof EventData> = (type: string, debugName: string, eventName?: Name, eventData?: EventData[Name]) => void; | ||
export type DebugLogger<EventData, Name extends keyof EventData> = (type: string, debugName: string, eventName?: Name, eventData?: EventData[Name]) => void; | ||
@@ -34,3 +32,3 @@ /** | ||
*/ | ||
interface DebugOptions<EventData> { | ||
export type DebugOptions<EventData> = { | ||
/** | ||
@@ -43,3 +41,3 @@ Define a name for the instance of Emittery to use when outputting debug data. | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -68,3 +66,3 @@ Emittery.isDebugEnabled = true; | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -89,3 +87,3 @@ const emitter1 = new Emittery({debug: {name: 'emitter1', enabled: true}}); | ||
*/ | ||
enabled?: boolean; | ||
readonly enabled?: boolean; | ||
@@ -112,5 +110,7 @@ /** | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
const myLogger = (type, debugName, eventName, eventData) => console.log(`[${type}]: ${eventName}`); | ||
const myLogger = (type, debugName, eventName, eventData) => { | ||
console.log(`[${type}]: ${eventName}`); | ||
}; | ||
@@ -133,4 +133,4 @@ const emitter = new Emittery({ | ||
*/ | ||
logger?: DebugLogger<EventData, keyof EventData>; | ||
} | ||
readonly logger?: DebugLogger<EventData, keyof EventData>; | ||
}; | ||
@@ -140,5 +140,5 @@ /** | ||
*/ | ||
interface Options<EventData> { | ||
debug?: DebugOptions<EventData>; | ||
} | ||
export type Options<EventData> = { | ||
readonly debug?: DebugOptions<EventData>; | ||
}; | ||
@@ -148,7 +148,27 @@ /** | ||
*/ | ||
interface EmitteryOncePromise<T> extends Promise<T> { | ||
export type EmitteryOncePromise<T> = { | ||
off(): void; | ||
} | ||
} & Promise<T>; | ||
/** | ||
Removes an event subscription. | ||
*/ | ||
export type UnsubscribeFunction = () => void; | ||
/** | ||
The data provided as `eventData` when listening for `Emittery.listenerAdded` or `Emittery.listenerRemoved`. | ||
*/ | ||
export type ListenerChangedData = { | ||
/** | ||
The listener that was added or removed. | ||
*/ | ||
listener: (eventData?: unknown) => (void | Promise<void>); | ||
/** | ||
The name of the event that was added or removed if `.on()` or `.off()` was used, or `undefined` if `.onAny()` or `.offAny()` was used. | ||
*/ | ||
eventName?: EventName; | ||
}; | ||
/** | ||
Emittery is a strictly typed, fully async EventEmitter implementation. Event listeners can be registered with `on` or `once`, and events can be emitted with `emit`. | ||
@@ -160,3 +180,3 @@ | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -185,6 +205,6 @@ const emitter = new Emittery< | ||
*/ | ||
declare class Emittery< | ||
EventData = Record<EventName, any>, | ||
AllEventData = EventData & _OmnipresentEventData, | ||
DatalessEvents = DatalessEventNames<EventData> | ||
export default class Emittery< | ||
EventData = Record<EventName, any>, // TODO: Use `unknown` instead of `any`. | ||
AllEventData = EventData & OmnipresentEventData, | ||
DatalessEvents = DatalessEventNames<EventData>, | ||
> { | ||
@@ -198,3 +218,3 @@ /** | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -232,3 +252,3 @@ Emittery.isDebugEnabled = true; | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -259,3 +279,3 @@ const emitter = new Emittery(); | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -282,14 +302,2 @@ const emitter = new Emittery(); | ||
/** | ||
Debugging options for the current instance. | ||
*/ | ||
debug: DebugOptions<EventData>; | ||
/** | ||
Create a new Emittery instance with the specified options. | ||
@returns An instance of Emittery that you can use to listen for and emit events. | ||
*/ | ||
constructor(options?: Options<EventData>); | ||
/** | ||
In TypeScript, it returns a decorator which mixins `Emittery` as property `emitteryPropertyName` and `methodNames`, or all `Emittery` methods if `methodNames` is not defined, into the target class. | ||
@@ -299,3 +307,3 @@ | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -313,5 +321,17 @@ @Emittery.mixin('emittery') | ||
methodNames?: readonly string[] | ||
): <T extends {new (...arguments_: any[]): any}>(klass: T) => T; // eslint-disable-line @typescript-eslint/prefer-function-type | ||
): <T extends {new (...arguments_: readonly any[]): any}>(klass: T) => T; // eslint-disable-line @typescript-eslint/prefer-function-type | ||
/** | ||
Debugging options for the current instance. | ||
*/ | ||
debug: DebugOptions<EventData>; | ||
/** | ||
Create a new Emittery instance with the specified options. | ||
@returns An instance of Emittery that you can use to listen for and emit events. | ||
*/ | ||
constructor(options?: Options<EventData>); | ||
/** | ||
Subscribe to one or more events. | ||
@@ -325,3 +345,3 @@ | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -343,5 +363,5 @@ const emitter = new Emittery(); | ||
on<Name extends keyof AllEventData>( | ||
eventName: Name | Name[], | ||
eventName: Name | readonly Name[], | ||
listener: (eventData: AllEventData[Name]) => void | Promise<void> | ||
): Emittery.UnsubscribeFn; | ||
): UnsubscribeFunction; | ||
@@ -355,3 +375,3 @@ /** | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -386,3 +406,3 @@ const emitter = new Emittery(); | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -407,3 +427,3 @@ const emitter = new Emittery(); | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -435,3 +455,3 @@ const emitter = new Emittery(); | ||
events<Name extends keyof EventData>( | ||
eventName: Name | Name[] | ||
eventName: Name | readonly Name[] | ||
): AsyncIterableIterator<EventData[Name]>; | ||
@@ -444,22 +464,23 @@ | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
const emitter = new Emittery(); | ||
const listener = data => console.log(data); | ||
(async () => { | ||
emitter.on(['🦄', '🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); | ||
await emitter.emit('🐶', 'b'); | ||
await emitter.emit('🦊', 'c'); | ||
emitter.off('🦄', listener); | ||
emitter.off(['🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); // nothing happens | ||
await emitter.emit('🐶', 'b'); // nothing happens | ||
await emitter.emit('🦊', 'c'); // nothing happens | ||
})(); | ||
const listener = data => { | ||
console.log(data); | ||
}; | ||
emitter.on(['🦄', '🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); | ||
await emitter.emit('🐶', 'b'); | ||
await emitter.emit('🦊', 'c'); | ||
emitter.off('🦄', listener); | ||
emitter.off(['🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); // nothing happens | ||
await emitter.emit('🐶', 'b'); // nothing happens | ||
await emitter.emit('🦊', 'c'); // nothing happens | ||
``` | ||
*/ | ||
off<Name extends keyof AllEventData>( | ||
eventName: Name | Name[], | ||
eventName: Name | readonly Name[], | ||
listener: (eventData: AllEventData[Name]) => void | Promise<void> | ||
@@ -476,3 +497,3 @@ ): void; | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -494,3 +515,3 @@ const emitter = new Emittery(); | ||
*/ | ||
once<Name extends keyof AllEventData>(eventName: Name | Name[]): EmitteryOncePromise<AllEventData[Name]>; | ||
once<Name extends keyof AllEventData>(eventName: Name | readonly Name[]): EmitteryOncePromise<AllEventData[Name]>; | ||
@@ -531,3 +552,3 @@ /** | ||
) => void | Promise<void> | ||
): Emittery.UnsubscribeFn; | ||
): UnsubscribeFunction; | ||
@@ -543,3 +564,3 @@ /** | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -588,3 +609,3 @@ const emitter = new Emittery(); | ||
*/ | ||
clearListeners<Name extends keyof EventData>(eventName?: Name | Name[]): void; | ||
clearListeners<Name extends keyof EventData>(eventName?: Name | readonly Name[]): void; | ||
@@ -594,3 +615,3 @@ /** | ||
*/ | ||
listenerCount<Name extends keyof EventData>(eventName?: Name | Name[]): number; | ||
listenerCount<Name extends keyof EventData>(eventName?: Name | readonly Name[]): number; | ||
@@ -602,3 +623,3 @@ /** | ||
``` | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -614,27 +635,1 @@ const object = {}; | ||
} | ||
declare namespace Emittery { | ||
/** | ||
Removes an event subscription. | ||
*/ | ||
type UnsubscribeFn = () => void; | ||
/** | ||
The data provided as `eventData` when listening for `Emittery.listenerAdded` or `Emittery.listenerRemoved`. | ||
*/ | ||
interface ListenerChangedData { | ||
/** | ||
The listener that was added or removed. | ||
*/ | ||
listener: (eventData?: unknown) => void | Promise<void>; | ||
/** | ||
The name of the event that was added or removed if `.on()` or `.off()` was used, or `undefined` if `.onAny()` or `.offAny()` was used. | ||
*/ | ||
eventName?: EventName; | ||
} | ||
type OmnipresentEventData = _OmnipresentEventData; | ||
} | ||
export = Emittery; |
44
index.js
@@ -1,5 +0,3 @@ | ||
'use strict'; | ||
import {anyMap, producersMap, eventsMap} from './maps.js'; | ||
const {anyMap, producersMap, eventsMap} = require('./maps.js'); | ||
const anyProducer = Symbol('anyProducer'); | ||
@@ -77,3 +75,3 @@ const resolvedPromise = Promise.resolve(); | ||
flush(); | ||
} | ||
}, | ||
}; | ||
@@ -113,3 +111,3 @@ | ||
done: false, | ||
value: await queue.shift() | ||
value: await queue.shift(), | ||
}; | ||
@@ -134,5 +132,5 @@ }, | ||
return arguments.length > 0 ? | ||
{done: true, value: await value} : | ||
{done: true}; | ||
return arguments.length > 0 | ||
? {done: true, value: await value} | ||
: {done: true}; | ||
}, | ||
@@ -142,3 +140,3 @@ | ||
return this; | ||
} | ||
}, | ||
}; | ||
@@ -182,3 +180,3 @@ } | ||
class Emittery { | ||
export default class Emittery { | ||
static mixin(emitteryPropertyName, methodNames) { | ||
@@ -200,3 +198,3 @@ methodNames = defaultMethodNamesOrAssert(methodNames); | ||
enumerable: false, | ||
value: new Emittery() | ||
value: new Emittery(), | ||
}); | ||
@@ -208,3 +206,3 @@ return this[emitteryPropertyName]; | ||
enumerable: false, | ||
get: getEmitteryProperty | ||
get: getEmitteryProperty, | ||
}); | ||
@@ -219,3 +217,3 @@ | ||
enumerable: false, | ||
value: emitteryMethodCaller(methodName) | ||
value: emitteryMethodCaller(methodName), | ||
}); | ||
@@ -229,7 +227,9 @@ } | ||
static get isDebugEnabled() { | ||
if (typeof process !== 'object') { | ||
// eslint-disable-next-line n/prefer-global/process | ||
if (typeof globalThis.process !== 'object') { | ||
return isGlobalDebugEnabled; | ||
} | ||
const {env} = process || {env: {}}; | ||
// eslint-disable-next-line n/prefer-global/process | ||
const {env} = globalThis.process || {env: {}}; | ||
return env.DEBUG === 'emittery' || env.DEBUG === '*' || isGlobalDebugEnabled; | ||
@@ -379,3 +379,3 @@ } | ||
} | ||
}) | ||
}), | ||
]); | ||
@@ -483,4 +483,4 @@ } | ||
if (typeof eventName === 'string') { | ||
count += anyMap.get(this).size + (getListeners(this, eventName) || new Set()).size + | ||
(getEventProducers(this, eventName) || new Set()).size + (getEventProducers(this) || new Set()).size; | ||
count += anyMap.get(this).size + (getListeners(this, eventName) || new Set()).size | ||
+ (getEventProducers(this, eventName) || new Set()).size + (getEventProducers(this) || new Set()).size; | ||
continue; | ||
@@ -521,3 +521,3 @@ } | ||
enumerable: false, | ||
value: this[methodName].bind(this) | ||
value: this[methodName].bind(this), | ||
}); | ||
@@ -534,3 +534,3 @@ } | ||
enumerable: true, | ||
configurable: false | ||
configurable: false, | ||
}); | ||
@@ -541,5 +541,3 @@ Object.defineProperty(Emittery, 'listenerRemoved', { | ||
enumerable: true, | ||
configurable: false | ||
configurable: false, | ||
}); | ||
module.exports = Emittery; |
12
maps.js
@@ -1,9 +0,3 @@ | ||
const anyMap = new WeakMap(); | ||
const eventsMap = new WeakMap(); | ||
const producersMap = new WeakMap(); | ||
module.exports = { | ||
anyMap, | ||
eventsMap, | ||
producersMap | ||
}; | ||
export const anyMap = new WeakMap(); | ||
export const eventsMap = new WeakMap(); | ||
export const producersMap = new WeakMap(); |
{ | ||
"name": "emittery", | ||
"version": "0.13.1", | ||
"version": "1.0.0", | ||
"description": "Simple and modern async event emitter", | ||
@@ -13,4 +13,7 @@ "license": "MIT", | ||
}, | ||
"type": "module", | ||
"exports": "./index.js", | ||
"types": "./index.d.ts", | ||
"engines": { | ||
"node": ">=12" | ||
"node": ">=14.16" | ||
}, | ||
@@ -53,9 +56,9 @@ "scripts": { | ||
"devDependencies": { | ||
"@types/node": "^15.6.1", | ||
"ava": "^2.4.0", | ||
"delay": "^4.3.0", | ||
"nyc": "^15.0.0", | ||
"p-event": "^4.1.0", | ||
"tsd": "^0.19.1", | ||
"xo": "^0.39.0" | ||
"@types/node": "^18.7.15", | ||
"ava": "^4.3.3", | ||
"delay": "^5.0.0", | ||
"nyc": "^15.1.0", | ||
"p-event": "^5.0.1", | ||
"tsd": "^0.23.0", | ||
"xo": "^0.52.3" | ||
}, | ||
@@ -62,0 +65,0 @@ "nyc": { |
@@ -5,3 +5,3 @@ # <img src="media/header.png" width="1000"> | ||
[![Coverage Status](https://codecov.io/gh/sindresorhus/emittery/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/emittery) | ||
<!-- [![Coverage Status](https://codecov.io/gh/sindresorhus/emittery/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/emittery) --> | ||
[![](https://badgen.net/bundlephobia/minzip/emittery)](https://bundlephobia.com/result?p=emittery) | ||
@@ -15,5 +15,5 @@ | ||
```sh | ||
npm install emittery | ||
``` | ||
$ npm install emittery | ||
``` | ||
@@ -23,3 +23,3 @@ ## Usage | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -59,3 +59,3 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -110,3 +110,3 @@ Emittery.isDebugEnabled = true; | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -136,3 +136,3 @@ Emittery.isDebugEnabled = true; | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -184,5 +184,7 @@ const emitter1 = new Emittery({debug: {name: 'emitter1', enabled: true}}); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
const myLogger = (type, debugName, eventName, eventData) => console.log(`[${type}]: ${eventName}`); | ||
const myLogger = (type, debugName, eventName, eventData) => { | ||
console.log(`[${type}]: ${eventName}`); | ||
}; | ||
@@ -214,3 +216,3 @@ const emitter = new Emittery({ | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -239,3 +241,3 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -271,19 +273,19 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
const emitter = new Emittery(); | ||
const listener = data => console.log(data); | ||
const listener = data => { | ||
console.log(data); | ||
}; | ||
(async () => { | ||
emitter.on(['🦄', '🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); | ||
await emitter.emit('🐶', 'b'); | ||
await emitter.emit('🦊', 'c'); | ||
emitter.off('🦄', listener); | ||
emitter.off(['🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); // Nothing happens | ||
await emitter.emit('🐶', 'b'); // Nothing happens | ||
await emitter.emit('🦊', 'c'); // Nothing happens | ||
})(); | ||
emitter.on(['🦄', '🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); | ||
await emitter.emit('🐶', 'b'); | ||
await emitter.emit('🦊', 'c'); | ||
emitter.off('🦄', listener); | ||
emitter.off(['🐶', '🦊'], listener); | ||
await emitter.emit('🦄', 'a'); // Nothing happens | ||
await emitter.emit('🐶', 'b'); // Nothing happens | ||
await emitter.emit('🦊', 'c'); // Nothing happens | ||
``` | ||
@@ -300,3 +302,3 @@ | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -325,3 +327,3 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -355,3 +357,3 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -375,3 +377,3 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -433,3 +435,3 @@ const emitter = new Emittery(); | ||
```js | ||
const Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -476,3 +478,3 @@ const emitter = new Emittery(); | ||
```js | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -491,3 +493,3 @@ const object = {}; | ||
```ts | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -521,3 +523,3 @@ const emitter = new Emittery< | ||
```ts | ||
import Emittery = require('emittery'); | ||
import Emittery from 'emittery'; | ||
@@ -542,3 +544,3 @@ @Emittery.mixin('emittery') | ||
To enable this feature set the DEBUG environment variable to 'emittery' or '*'. Additionally you can set the static `isDebugEnabled` variable to true on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance. | ||
To enable this feature set the DEBUG environment variable to `'emittery'` or `'*'`. Additionally you can set the static `isDebugEnabled` variable to true on the Emittery class, or `myEmitter.debug.enabled` on an instance of it for debugging a single instance. | ||
@@ -545,0 +547,0 @@ See [API](#api) for more details on how debugging works. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
1
572
Yes
46421
897