hookified 1.13.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -1
- package/dist/browser/index.global.js +50 -6
- package/dist/browser/index.global.js.map +1 -1
- package/dist/browser/index.js +50 -6
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +50 -6
- package/dist/node/index.d.cts +57 -51
- package/dist/node/index.d.ts +57 -51
- package/dist/node/index.js +50 -6
- package/package.json +24 -22
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
- Enforce consistent hook naming conventions with `enforceBeforeAfter`
|
|
20
20
|
- Deprecation warnings for hooks with `deprecatedHooks`
|
|
21
21
|
- Control deprecated hook execution with `allowDeprecated`
|
|
22
|
-
- No package dependencies and only
|
|
22
|
+
- No package dependencies and only 200KB in size
|
|
23
23
|
- Fast and Efficient with [Benchmarks](#benchmarks)
|
|
24
24
|
- Maintained on a regular basis!
|
|
25
25
|
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
- [.eventNames()](#eventnames)
|
|
65
65
|
- [.listenerCount(eventName?)](#listenercounteventname)
|
|
66
66
|
- [.rawListeners(eventName?)](#rawlistenerseventname)
|
|
67
|
+
- [Logging](#logging)
|
|
67
68
|
- [Benchmarks](#benchmarks)
|
|
68
69
|
- [How to Contribute](#how-to-contribute)
|
|
69
70
|
- [License and Copyright](#license-and-copyright)
|
|
@@ -1239,6 +1240,88 @@ myClass.on('message', (message) => {
|
|
|
1239
1240
|
console.log(myClass.rawListeners('message'));
|
|
1240
1241
|
```
|
|
1241
1242
|
|
|
1243
|
+
# Logging
|
|
1244
|
+
|
|
1245
|
+
Hookified integrates logging directly into the event system. When a logger is configured, all emitted events are automatically logged to the appropriate log level based on the event name.
|
|
1246
|
+
|
|
1247
|
+
## How It Works
|
|
1248
|
+
|
|
1249
|
+
When you emit an event, Hookified automatically sends the event data to the configured logger using the appropriate log method:
|
|
1250
|
+
|
|
1251
|
+
| Event Name | Logger Method |
|
|
1252
|
+
|------------|---------------|
|
|
1253
|
+
| `error` | `logger.error()` |
|
|
1254
|
+
| `warn` | `logger.warn()` |
|
|
1255
|
+
| `debug` | `logger.debug()` |
|
|
1256
|
+
| `trace` | `logger.trace()` |
|
|
1257
|
+
| `fatal` | `logger.fatal()` |
|
|
1258
|
+
| Any other | `logger.info()` |
|
|
1259
|
+
|
|
1260
|
+
The logger receives two arguments:
|
|
1261
|
+
1. **message**: A string extracted from the event data (error messages, object messages, or JSON stringified data)
|
|
1262
|
+
2. **context**: An object containing `{ event: eventName, data: originalData }`
|
|
1263
|
+
|
|
1264
|
+
## Setting Up a Logger
|
|
1265
|
+
|
|
1266
|
+
Any logger that implements the `Logger` interface is compatible. This includes popular loggers like [Pino](https://github.com/pinojs/pino), [Winston](https://github.com/winstonjs/winston), [Bunyan](https://github.com/trentm/node-bunyan), and others.
|
|
1267
|
+
|
|
1268
|
+
```typescript
|
|
1269
|
+
type Logger = {
|
|
1270
|
+
trace: (message: string, ...args: unknown[]) => void;
|
|
1271
|
+
debug: (message: string, ...args: unknown[]) => void;
|
|
1272
|
+
info: (message: string, ...args: unknown[]) => void;
|
|
1273
|
+
warn: (message: string, ...args: unknown[]) => void;
|
|
1274
|
+
error: (message: string, ...args: unknown[]) => void;
|
|
1275
|
+
fatal: (message: string, ...args: unknown[]) => void;
|
|
1276
|
+
};
|
|
1277
|
+
```
|
|
1278
|
+
|
|
1279
|
+
## Usage Example with Pino
|
|
1280
|
+
|
|
1281
|
+
```javascript
|
|
1282
|
+
import { Hookified } from 'hookified';
|
|
1283
|
+
import pino from 'pino';
|
|
1284
|
+
|
|
1285
|
+
const logger = pino();
|
|
1286
|
+
|
|
1287
|
+
class MyService extends Hookified {
|
|
1288
|
+
constructor() {
|
|
1289
|
+
super({ logger });
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
async processData(data) {
|
|
1293
|
+
// This will log to logger.info with the data
|
|
1294
|
+
this.emit('info', { action: 'processing', data });
|
|
1295
|
+
|
|
1296
|
+
try {
|
|
1297
|
+
// ... process data
|
|
1298
|
+
this.emit('debug', { action: 'completed', result: 'success' });
|
|
1299
|
+
} catch (err) {
|
|
1300
|
+
// This will log to logger.error with the error message
|
|
1301
|
+
this.emit('error', err);
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
const service = new MyService();
|
|
1307
|
+
|
|
1308
|
+
// All events are automatically logged
|
|
1309
|
+
service.emit('info', 'Service started'); // -> logger.info()
|
|
1310
|
+
service.emit('warn', { message: 'Low memory' }); // -> logger.warn()
|
|
1311
|
+
service.emit('error', new Error('Failed')); // -> logger.error()
|
|
1312
|
+
service.emit('custom-event', { foo: 'bar' }); // -> logger.info() (default)
|
|
1313
|
+
```
|
|
1314
|
+
|
|
1315
|
+
You can also set or change the logger after instantiation:
|
|
1316
|
+
|
|
1317
|
+
```javascript
|
|
1318
|
+
const service = new MyService();
|
|
1319
|
+
service.logger = pino({ level: 'debug' });
|
|
1320
|
+
|
|
1321
|
+
// Or remove the logger
|
|
1322
|
+
service.logger = undefined;
|
|
1323
|
+
```
|
|
1324
|
+
|
|
1242
1325
|
# Benchmarks
|
|
1243
1326
|
|
|
1244
1327
|
We are doing very simple benchmarking to see how this compares to other libraries using `tinybench`. This is not a full benchmark but just a simple way to see how it performs. Our goal is to be as close or better than the other libraries including native (EventEmitter).
|
|
@@ -225,6 +225,7 @@
|
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
|
+
this.sendLog(event, arguments_);
|
|
228
229
|
return result;
|
|
229
230
|
}
|
|
230
231
|
/**
|
|
@@ -272,6 +273,54 @@
|
|
|
272
273
|
}
|
|
273
274
|
return result;
|
|
274
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Sends a log message using the configured logger based on the event name
|
|
278
|
+
* @param {string | symbol} eventName - The event name that determines the log level
|
|
279
|
+
* @param {unknown} data - The data to log
|
|
280
|
+
*/
|
|
281
|
+
sendLog(eventName, data) {
|
|
282
|
+
if (!this._logger) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
let message;
|
|
286
|
+
if (typeof data === "string") {
|
|
287
|
+
message = data;
|
|
288
|
+
} else if (Array.isArray(data) && data.length > 0 && data[0] instanceof Error) {
|
|
289
|
+
message = data[0].message;
|
|
290
|
+
} else if (data instanceof Error) {
|
|
291
|
+
message = data.message;
|
|
292
|
+
} else if (Array.isArray(data) && data.length > 0 && typeof data[0]?.message === "string") {
|
|
293
|
+
message = data[0].message;
|
|
294
|
+
} else {
|
|
295
|
+
message = JSON.stringify(data);
|
|
296
|
+
}
|
|
297
|
+
switch (eventName) {
|
|
298
|
+
case "error": {
|
|
299
|
+
this._logger.error?.(message, { event: eventName, data });
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case "warn": {
|
|
303
|
+
this._logger.warn?.(message, { event: eventName, data });
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
case "trace": {
|
|
307
|
+
this._logger.trace?.(message, { event: eventName, data });
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
case "debug": {
|
|
311
|
+
this._logger.debug?.(message, { event: eventName, data });
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
case "fatal": {
|
|
315
|
+
this._logger.fatal?.(message, { event: eventName, data });
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
default: {
|
|
319
|
+
this._logger.info?.(message, { event: eventName, data });
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
275
324
|
};
|
|
276
325
|
|
|
277
326
|
// src/index.ts
|
|
@@ -406,9 +455,6 @@
|
|
|
406
455
|
const message = this._deprecatedHooks.get(event);
|
|
407
456
|
const warningMessage = `Hook "${event}" is deprecated${message ? `: ${message}` : ""}`;
|
|
408
457
|
this.emit("warn", { hook: event, message: warningMessage });
|
|
409
|
-
if (this.logger?.warn) {
|
|
410
|
-
this.logger.warn(warningMessage);
|
|
411
|
-
}
|
|
412
458
|
return this._allowDeprecated;
|
|
413
459
|
}
|
|
414
460
|
return true;
|
|
@@ -556,9 +602,6 @@
|
|
|
556
602
|
} catch (error) {
|
|
557
603
|
const message = `${event}: ${error.message}`;
|
|
558
604
|
this.emit("error", new Error(message));
|
|
559
|
-
if (this.logger) {
|
|
560
|
-
this.logger.error(message);
|
|
561
|
-
}
|
|
562
605
|
if (this._throwOnHookError) {
|
|
563
606
|
throw new Error(message);
|
|
564
607
|
}
|
|
@@ -613,4 +656,5 @@
|
|
|
613
656
|
}
|
|
614
657
|
};
|
|
615
658
|
})();
|
|
659
|
+
/* v8 ignore next -- @preserve */
|
|
616
660
|
//# sourceMappingURL=index.global.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["// biome-ignore-all lint/suspicious/noExplicitAny: this is for event emitter compatibility\nimport type { Logger } from \"logger.js\";\n\nexport type IEventEmitter = {\n\t/**\n\t * Registers a listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.on('data', (message) => {\n\t * console.log(message);\n\t * });\n\t */\n\ton(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Alias for `on`. Registers a listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t */\n\taddListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Registers a one-time listener for the specified event. The listener is removed after it is called once.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked once when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.once('close', () => {\n\t * console.log('The connection was closed.');\n\t * });\n\t */\n\tonce(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Removes a previously registered listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to stop listening for.\n\t * @param listener - The specific callback function to remove.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.off('data', myListener);\n\t */\n\toff(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Alias for `off`. Removes a previously registered listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to stop listening for.\n\t * @param listener - The specific callback function to remove.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t */\n\tremoveListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Emits the specified event, invoking all registered listeners with the provided arguments.\n\t *\n\t * @param eventName - The name (or symbol) of the event to emit.\n\t * @param args - Arguments passed to each listener.\n\t * @returns `true` if the event had listeners, `false` otherwise.\n\t *\n\t * @example\n\t * emitter.emit('data', 'Hello World');\n\t */\n\temit(eventName: string | symbol, ...arguments_: any[]): boolean;\n\n\t/**\n\t * Returns the number of listeners registered for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event.\n\t * @returns The number of registered listeners.\n\t *\n\t * @example\n\t * const count = emitter.listenerCount('data');\n\t * console.log(count); // e.g., 2\n\t */\n\tlistenerCount(eventName: string | symbol): number;\n\n\t/**\n\t * Removes all listeners for the specified event. If no event is specified, it removes all listeners for all events.\n\t *\n\t * @param eventName - (Optional) The name (or symbol) of the event.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.removeAllListeners('data');\n\t */\n\tremoveAllListeners(eventName?: string | symbol): IEventEmitter;\n\n\t/**\n\t * Returns an array of event names for which listeners have been registered.\n\t *\n\t * @returns An array of event names (or symbols).\n\t *\n\t * @example\n\t * const events = emitter.eventNames();\n\t * console.log(events); // e.g., ['data', 'close']\n\t */\n\teventNames(): Array<string | symbol>;\n\n\t/**\n\t * Returns an array of listeners registered for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event.\n\t * @returns An array of listener functions.\n\t *\n\t * @example\n\t * const listeners = emitter.listeners('data');\n\t * console.log(listeners.length); // e.g., 2\n\t */\n\tlisteners(eventName: string | symbol): Array<(...arguments_: any[]) => void>;\n\n\t/**\n\t * Returns an array of raw listeners for the specified event. This includes listeners wrapped by internal mechanisms (e.g., once-only listeners).\n\t *\n\t * @param eventName - The name (or symbol) of the event.\n\t * @returns An array of raw listener functions.\n\t *\n\t * @example\n\t * const rawListeners = emitter.rawListeners('data');\n\t */\n\trawListeners(\n\t\teventName: string | symbol,\n\t): Array<(...arguments_: any[]) => void>;\n\n\t/**\n\t * Adds a listener to the beginning of the listeners array for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.prependListener('data', (message) => {\n\t * console.log('This will run first.');\n\t * });\n\t */\n\tprependListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Adds a one-time listener to the beginning of the listeners array for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked once when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.prependOnceListener('data', (message) => {\n\t * console.log('This will run first and only once.');\n\t * });\n\t */\n\tprependOnceListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n};\n\nexport type EventListener = (...arguments_: any[]) => void;\n\nexport type EventEmitterOptions = {\n\t/**\n\t * Logger instance for logging errors.\n\t */\n\tlogger?: Logger;\n\t/**\n\t * Whether to throw an error when emit 'error' and there are no listeners. Default is false and only emits an error event.\n\t */\n\tthrowOnEmitError?: boolean;\n\n\t/**\n\t * Whether to throw on 'error' when there are no listeners. This is the standard functionality in EventEmitter\n\t * @default false - in v2 this will be set to true by default\n\t */\n\tthrowOnEmptyListeners?: boolean;\n};\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<string | symbol, EventListener[]>;\n\tprivate _maxListeners: number;\n\tprivate _logger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = false;\n\tprivate _errorEvent = \"error\";\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<string | symbol, EventListener[]>();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\n\t\tthis._logger = options?.logger;\n\n\t\tif (options?.throwOnEmitError !== undefined) {\n\t\t\tthis._throwOnEmitError = options.throwOnEmitError;\n\t\t}\n\n\t\tif (options?.throwOnEmptyListeners !== undefined) {\n\t\t\tthis._throwOnEmptyListeners = options.throwOnEmptyListeners;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the logger\n\t * @returns {Logger}\n\t */\n\tpublic get logger(): Logger | undefined {\n\t\treturn this._logger;\n\t}\n\n\t/**\n\t * Sets the logger\n\t * @param {Logger} logger\n\t */\n\tpublic set logger(logger: Logger | undefined) {\n\t\tthis._logger = logger;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmitError(): boolean {\n\t\treturn this._throwOnEmitError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmitError(value: boolean) {\n\t\tthis._throwOnEmitError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmptyListeners(): boolean {\n\t\treturn this._throwOnEmptyListeners;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmptyListeners(value: boolean) {\n\t\tthis._throwOnEmptyListeners = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that will run only once\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic once(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.on(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the number of listeners for a specific event. If no event is provided, it returns the total number of listeners\n\t * @param {string} eventName The event name. Not required\n\t * @returns {number} The number of listeners\n\t */\n\tpublic listenerCount(eventName?: string | symbol): number {\n\t\tif (eventName === undefined) {\n\t\t\treturn this.getAllListeners().length;\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(eventName);\n\t\treturn listeners ? listeners.length : 0;\n\t}\n\n\t/**\n\t * Gets an array of event names\n\t * @returns {Array<string | symbol>} An array of event names\n\t */\n\tpublic eventNames(): Array<string | symbol> {\n\t\treturn [...this._eventListeners.keys()];\n\t}\n\n\t/**\n\t * Gets an array of listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic rawListeners(event?: string | symbol): EventListener[] {\n\t\tif (event === undefined) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Prepends a listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(eventName) ?? [];\n\t\tlisteners.unshift(listener);\n\t\tthis._eventListeners.set(eventName, listeners);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Prepends a one-time listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependOnceListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.prependListener(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the maximum number of listeners that can be added for a single event\n\t * @returns {number} The maximum number of listeners\n\t */\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event. It is an alias for the on() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic addListener(\n\t\tevent: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic on(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event. It is an alias for the off() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic off(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls all listeners for a specific event\n\t * @param {string | symbol} event\n\t * @param arguments_ The arguments to pass to the listeners\n\t * @returns {boolean} Returns true if the event had listeners, false otherwise\n\t */\n\tpublic emit(event: string | symbol, ...arguments_: any[]): boolean {\n\t\tlet result = false;\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...arguments_);\n\t\t\t\tresult = true;\n\t\t\t}\n\t\t}\n\n\t\tif (event === this._errorEvent) {\n\t\t\tconst error =\n\t\t\t\targuments_[0] instanceof Error\n\t\t\t\t\t? arguments_[0]\n\t\t\t\t\t: new Error(`${arguments_[0]}`);\n\n\t\t\tif (this._throwOnEmitError && !result) {\n\t\t\t\tthrow error;\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tthis.listeners(this._errorEvent).length === 0 &&\n\t\t\t\t\tthis._throwOnEmptyListeners === true\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets all listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic listeners(event: string | symbol): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Removes all listeners for a specific event. If no event is provided, it removes all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeAllListeners(event?: string | symbol): IEventEmitter {\n\t\tif (event !== undefined) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of listeners that can be added for a single event\n\t * @param {number} n The maximum number of listeners\n\t * @returns {void}\n\t */\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Gets all listeners\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic getAllListeners(): EventListener[] {\n\t\tlet result: EventListener[] = [];\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tresult = [...result, ...listeners];\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import { type EventEmitterOptions, Eventified } from \"./eventified.js\";\n\n// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\nexport type Hook = (...arguments_: any[]) => Promise<void> | void;\n\nexport type HookEntry = {\n\t/**\n\t * The event name for the hook\n\t */\n\tevent: string;\n\t/**\n\t * The handler function for the hook\n\t */\n\thandler: Hook;\n};\n\nexport type HookifiedOptions = {\n\t/**\n\t * Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tthrowHookErrors?: boolean;\n\t/**\n\t * Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t */\n\tthrowOnHookError?: boolean;\n\t/**\n\t * Whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenforceBeforeAfter?: boolean;\n\t/**\n\t * Map of deprecated hook names to deprecation messages. When a deprecated hook is used, a warning will be emitted.\n\t * @type {Map<string, string>}\n\t * @default new Map()\n\t */\n\tdeprecatedHooks?: Map<string, string>;\n\t/**\n\t * Whether to allow deprecated hooks to be registered and executed. Default is true.\n\t * @type {boolean}\n\t * @default true\n\t */\n\tallowDeprecated?: boolean;\n} & EventEmitterOptions;\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, Hook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\tlogger: options?.logger,\n\t\t\tthrowOnEmitError: options?.throwOnEmitError,\n\t\t\tthrowOnEmptyListeners: options?.throwOnEmptyListeners,\n\t\t});\n\t\tthis._hooks = new Map();\n\t\tthis._deprecatedHooks = options?.deprecatedHooks\n\t\t\t? new Map(options.deprecatedHooks)\n\t\t\t: new Map();\n\n\t\tif (options?.throwOnHookError !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwOnHookError;\n\t\t} else if (options?.throwHookErrors !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwHookErrors;\n\t\t}\n\n\t\tif (options?.enforceBeforeAfter !== undefined) {\n\t\t\tthis._enforceBeforeAfter = options.enforceBeforeAfter;\n\t\t}\n\n\t\tif (options?.allowDeprecated !== undefined) {\n\t\t\tthis._allowDeprecated = options.allowDeprecated;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, Hook[]>}\n\t */\n\tpublic get hooks() {\n\t\treturn this._hooks;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic get throwHookErrors() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic set throwHookErrors(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnHookError() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnHookError(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @returns {boolean}\n\t * @default false\n\t */\n\tpublic get enforceBeforeAfter() {\n\t\treturn this._enforceBeforeAfter;\n\t}\n\n\t/**\n\t * Sets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set enforceBeforeAfter(value) {\n\t\tthis._enforceBeforeAfter = value;\n\t}\n\n\t/**\n\t * Gets the map of deprecated hook names to deprecation messages.\n\t * @returns {Map<string, string>}\n\t */\n\tpublic get deprecatedHooks() {\n\t\treturn this._deprecatedHooks;\n\t}\n\n\t/**\n\t * Sets the map of deprecated hook names to deprecation messages.\n\t * @param {Map<string, string>} value\n\t */\n\tpublic set deprecatedHooks(value) {\n\t\tthis._deprecatedHooks = value;\n\t}\n\n\t/**\n\t * Gets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get allowDeprecated() {\n\t\treturn this._allowDeprecated;\n\t}\n\n\t/**\n\t * Sets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @param {boolean} value\n\t */\n\tpublic set allowDeprecated(value) {\n\t\tthis._allowDeprecated = value;\n\t}\n\n\t/**\n\t * Validates hook event name if enforceBeforeAfter is enabled\n\t * @param {string} event - The event name to validate\n\t * @throws {Error} If enforceBeforeAfter is true and event doesn't start with 'before' or 'after'\n\t */\n\tprivate validateHookName(event: string): void {\n\t\tif (this._enforceBeforeAfter) {\n\t\t\tconst eventValue = event.trim().toLocaleLowerCase();\n\t\t\tif (!eventValue.startsWith(\"before\") && !eventValue.startsWith(\"after\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hook event \"${event}\" must start with \"before\" or \"after\" when enforceBeforeAfter is enabled`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a hook is deprecated and emits a warning if it is\n\t * @param {string} event - The event name to check\n\t * @returns {boolean} - Returns true if the hook should proceed, false if it should be blocked\n\t */\n\tprivate checkDeprecatedHook(event: string): boolean {\n\t\tif (this._deprecatedHooks.has(event)) {\n\t\t\tconst message = this._deprecatedHooks.get(event);\n\t\t\tconst warningMessage = `Hook \"${event}\" is deprecated${message ? `: ${message}` : \"\"}`;\n\n\t\t\t// Emit deprecation warning event\n\t\t\tthis.emit(\"warn\", { hook: event, message: warningMessage });\n\n\t\t\t// Log to logger if available\n\t\t\tif (this.logger?.warn) {\n\t\t\t\tthis.logger.warn(warningMessage);\n\t\t\t}\n\n\t\t\t// Return false if deprecated hooks are not allowed\n\t\t\treturn this._allowDeprecated;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic onHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {HookEntry} hookEntry\n\t * @returns {void}\n\t */\n\tpublic onHookEntry(hookEntry: HookEntry) {\n\t\tthis.onHook(hookEntry.event, hookEntry.handler);\n\t}\n\n\t/**\n\t * Alias for onHook. This is provided for compatibility with other libraries that use the `addHook` method.\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: Hook) {\n\t\t// Alias for onHook\n\t\tthis.onHook(event, handler);\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic prependHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.unshift(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers\n\t * @param event\n\t * @param handler\n\t */\n\tpublic prependOnceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.prependHook(event, hook);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param event\n\t * @param handler\n\t */\n\tpublic onceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook(event, hook);\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler\n\t * @returns {void}\n\t */\n\tpublic removeHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip removal if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes all handlers for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic removeHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.removeHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async hook<T>(event: string, ...arguments_: T[]) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip execution if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = `${event}: ${(error as Error).message}`;\n\t\t\t\t\tthis.emit(\"error\", new Error(message));\n\t\t\t\t\tif (this.logger) {\n\t\t\t\t\t\tthis.logger.error(message);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._throwOnHookError) {\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Prepends the word `before` to your hook. Example is event is `test`, the before hook is `before:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async beforeHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`before:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Prepends the word `after` to your hook. Example is event is `test`, the after hook is `after:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async afterHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`after:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event. This is an alias for `hook` and is provided for\n\t * compatibility with other libraries that use the `callHook` method.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async callHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(event, ...arguments_);\n\t}\n\n\t/**\n\t * Gets all hooks for a specific event\n\t * @param {string} event\n\t * @returns {Hook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn undefined; // Return undefined if deprecated hooks are not allowed\n\t\t}\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Removes all hooks\n\t * @returns {void}\n\t */\n\tpublic clearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport { Eventified, type EventListener } from \"./eventified.js\";\nexport type { Logger } from \"./logger.js\";\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["// biome-ignore-all lint/suspicious/noExplicitAny: this is for event emitter compatibility\nimport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n\nexport type { EventEmitterOptions, EventListener, IEventEmitter };\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<string | symbol, EventListener[]>;\n\tprivate _maxListeners: number;\n\tprivate _logger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = false;\n\tprivate _errorEvent = \"error\";\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<string | symbol, EventListener[]>();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\n\t\tthis._logger = options?.logger;\n\n\t\tif (options?.throwOnEmitError !== undefined) {\n\t\t\tthis._throwOnEmitError = options.throwOnEmitError;\n\t\t}\n\n\t\tif (options?.throwOnEmptyListeners !== undefined) {\n\t\t\tthis._throwOnEmptyListeners = options.throwOnEmptyListeners;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the logger\n\t * @returns {Logger}\n\t */\n\tpublic get logger(): Logger | undefined {\n\t\treturn this._logger;\n\t}\n\n\t/**\n\t * Sets the logger\n\t * @param {Logger} logger\n\t */\n\tpublic set logger(logger: Logger | undefined) {\n\t\tthis._logger = logger;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmitError(): boolean {\n\t\treturn this._throwOnEmitError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmitError(value: boolean) {\n\t\tthis._throwOnEmitError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmptyListeners(): boolean {\n\t\treturn this._throwOnEmptyListeners;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmptyListeners(value: boolean) {\n\t\tthis._throwOnEmptyListeners = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that will run only once\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic once(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.on(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the number of listeners for a specific event. If no event is provided, it returns the total number of listeners\n\t * @param {string} eventName The event name. Not required\n\t * @returns {number} The number of listeners\n\t */\n\tpublic listenerCount(eventName?: string | symbol): number {\n\t\tif (eventName === undefined) {\n\t\t\treturn this.getAllListeners().length;\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(eventName);\n\t\treturn listeners ? listeners.length : 0;\n\t}\n\n\t/**\n\t * Gets an array of event names\n\t * @returns {Array<string | symbol>} An array of event names\n\t */\n\tpublic eventNames(): Array<string | symbol> {\n\t\treturn [...this._eventListeners.keys()];\n\t}\n\n\t/**\n\t * Gets an array of listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic rawListeners(event?: string | symbol): EventListener[] {\n\t\tif (event === undefined) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Prepends a listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(eventName) ?? [];\n\t\tlisteners.unshift(listener);\n\t\tthis._eventListeners.set(eventName, listeners);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Prepends a one-time listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependOnceListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.prependListener(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the maximum number of listeners that can be added for a single event\n\t * @returns {number} The maximum number of listeners\n\t */\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event. It is an alias for the on() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic addListener(\n\t\tevent: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic on(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event. It is an alias for the off() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic off(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls all listeners for a specific event\n\t * @param {string | symbol} event\n\t * @param arguments_ The arguments to pass to the listeners\n\t * @returns {boolean} Returns true if the event had listeners, false otherwise\n\t */\n\tpublic emit(event: string | symbol, ...arguments_: any[]): boolean {\n\t\tlet result = false;\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...arguments_);\n\t\t\t\tresult = true;\n\t\t\t}\n\t\t}\n\n\t\tif (event === this._errorEvent) {\n\t\t\tconst error =\n\t\t\t\targuments_[0] instanceof Error\n\t\t\t\t\t? arguments_[0]\n\t\t\t\t\t: new Error(`${arguments_[0]}`);\n\n\t\t\tif (this._throwOnEmitError && !result) {\n\t\t\t\tthrow error;\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tthis.listeners(this._errorEvent).length === 0 &&\n\t\t\t\t\tthis._throwOnEmptyListeners === true\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// send it to the logger\n\t\tthis.sendLog(event, arguments_);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets all listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic listeners(event: string | symbol): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Removes all listeners for a specific event. If no event is provided, it removes all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeAllListeners(event?: string | symbol): IEventEmitter {\n\t\tif (event !== undefined) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of listeners that can be added for a single event\n\t * @param {number} n The maximum number of listeners\n\t * @returns {void}\n\t */\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Gets all listeners\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic getAllListeners(): EventListener[] {\n\t\tlet result: EventListener[] = [];\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tresult = [...result, ...listeners];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Sends a log message using the configured logger based on the event name\n\t * @param {string | symbol} eventName - The event name that determines the log level\n\t * @param {unknown} data - The data to log\n\t */\n\tprivate sendLog(eventName: string | symbol, data: any): void {\n\t\tif (!this._logger) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet message: string;\n\t\t/* v8 ignore next -- @preserve */\n\t\tif (typeof data === \"string\") {\n\t\t\tmessage = data;\n\t\t} else if (\n\t\t\tArray.isArray(data) &&\n\t\t\tdata.length > 0 &&\n\t\t\tdata[0] instanceof Error\n\t\t) {\n\t\t\tmessage = data[0].message;\n\t\t\t/* v8 ignore next -- @preserve */\n\t\t} else if (data instanceof Error) {\n\t\t\tmessage = data.message;\n\t\t} else if (\n\t\t\tArray.isArray(data) &&\n\t\t\tdata.length > 0 &&\n\t\t\ttypeof data[0]?.message === \"string\"\n\t\t) {\n\t\t\tmessage = data[0].message;\n\t\t} else {\n\t\t\tmessage = JSON.stringify(data);\n\t\t}\n\n\t\tswitch (eventName) {\n\t\t\tcase \"error\": {\n\t\t\t\tthis._logger.error?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"warn\": {\n\t\t\t\tthis._logger.warn?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"trace\": {\n\t\t\t\tthis._logger.trace?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"debug\": {\n\t\t\t\tthis._logger.debug?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"fatal\": {\n\t\t\t\tthis._logger.fatal?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis._logger.info?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Eventified } from \"./eventified.js\";\nimport type { Hook, HookEntry, HookifiedOptions } from \"./types.js\";\n\nexport type { Hook, HookEntry, HookifiedOptions };\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, Hook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\tlogger: options?.logger,\n\t\t\tthrowOnEmitError: options?.throwOnEmitError,\n\t\t\tthrowOnEmptyListeners: options?.throwOnEmptyListeners,\n\t\t});\n\t\tthis._hooks = new Map();\n\t\tthis._deprecatedHooks = options?.deprecatedHooks\n\t\t\t? new Map(options.deprecatedHooks)\n\t\t\t: new Map();\n\n\t\tif (options?.throwOnHookError !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwOnHookError;\n\t\t} else if (options?.throwHookErrors !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwHookErrors;\n\t\t}\n\n\t\tif (options?.enforceBeforeAfter !== undefined) {\n\t\t\tthis._enforceBeforeAfter = options.enforceBeforeAfter;\n\t\t}\n\n\t\tif (options?.allowDeprecated !== undefined) {\n\t\t\tthis._allowDeprecated = options.allowDeprecated;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, Hook[]>}\n\t */\n\tpublic get hooks() {\n\t\treturn this._hooks;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic get throwHookErrors() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic set throwHookErrors(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnHookError() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnHookError(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @returns {boolean}\n\t * @default false\n\t */\n\tpublic get enforceBeforeAfter() {\n\t\treturn this._enforceBeforeAfter;\n\t}\n\n\t/**\n\t * Sets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set enforceBeforeAfter(value) {\n\t\tthis._enforceBeforeAfter = value;\n\t}\n\n\t/**\n\t * Gets the map of deprecated hook names to deprecation messages.\n\t * @returns {Map<string, string>}\n\t */\n\tpublic get deprecatedHooks() {\n\t\treturn this._deprecatedHooks;\n\t}\n\n\t/**\n\t * Sets the map of deprecated hook names to deprecation messages.\n\t * @param {Map<string, string>} value\n\t */\n\tpublic set deprecatedHooks(value) {\n\t\tthis._deprecatedHooks = value;\n\t}\n\n\t/**\n\t * Gets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get allowDeprecated() {\n\t\treturn this._allowDeprecated;\n\t}\n\n\t/**\n\t * Sets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @param {boolean} value\n\t */\n\tpublic set allowDeprecated(value) {\n\t\tthis._allowDeprecated = value;\n\t}\n\n\t/**\n\t * Validates hook event name if enforceBeforeAfter is enabled\n\t * @param {string} event - The event name to validate\n\t * @throws {Error} If enforceBeforeAfter is true and event doesn't start with 'before' or 'after'\n\t */\n\tprivate validateHookName(event: string): void {\n\t\tif (this._enforceBeforeAfter) {\n\t\t\tconst eventValue = event.trim().toLocaleLowerCase();\n\t\t\tif (!eventValue.startsWith(\"before\") && !eventValue.startsWith(\"after\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hook event \"${event}\" must start with \"before\" or \"after\" when enforceBeforeAfter is enabled`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a hook is deprecated and emits a warning if it is\n\t * @param {string} event - The event name to check\n\t * @returns {boolean} - Returns true if the hook should proceed, false if it should be blocked\n\t */\n\tprivate checkDeprecatedHook(event: string): boolean {\n\t\tif (this._deprecatedHooks.has(event)) {\n\t\t\tconst message = this._deprecatedHooks.get(event);\n\t\t\tconst warningMessage = `Hook \"${event}\" is deprecated${message ? `: ${message}` : \"\"}`;\n\n\t\t\t// Emit deprecation warning event\n\t\t\tthis.emit(\"warn\", { hook: event, message: warningMessage });\n\n\t\t\t// Return false if deprecated hooks are not allowed\n\t\t\treturn this._allowDeprecated;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic onHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {HookEntry} hookEntry\n\t * @returns {void}\n\t */\n\tpublic onHookEntry(hookEntry: HookEntry) {\n\t\tthis.onHook(hookEntry.event, hookEntry.handler);\n\t}\n\n\t/**\n\t * Alias for onHook. This is provided for compatibility with other libraries that use the `addHook` method.\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: Hook) {\n\t\t// Alias for onHook\n\t\tthis.onHook(event, handler);\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic prependHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.unshift(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers\n\t * @param event\n\t * @param handler\n\t */\n\tpublic prependOnceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.prependHook(event, hook);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param event\n\t * @param handler\n\t */\n\tpublic onceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook(event, hook);\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler\n\t * @returns {void}\n\t */\n\tpublic removeHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip removal if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes all handlers for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic removeHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.removeHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async hook<T>(event: string, ...arguments_: T[]) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip execution if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = `${event}: ${(error as Error).message}`;\n\t\t\t\t\tthis.emit(\"error\", new Error(message));\n\n\t\t\t\t\tif (this._throwOnHookError) {\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Prepends the word `before` to your hook. Example is event is `test`, the before hook is `before:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async beforeHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`before:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Prepends the word `after` to your hook. Example is event is `test`, the after hook is `after:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async afterHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`after:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event. This is an alias for `hook` and is provided for\n\t * compatibility with other libraries that use the `callHook` method.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async callHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(event, ...arguments_);\n\t}\n\n\t/**\n\t * Gets all hooks for a specific event\n\t * @param {string} event\n\t * @returns {Hook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn undefined; // Return undefined if deprecated hooks are not allowed\n\t\t}\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Removes all hooks\n\t * @returns {void}\n\t */\n\tpublic clearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport { Eventified } from \"./eventified.js\";\nexport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n"],"mappings":"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","names":[]}
|
package/dist/browser/index.js
CHANGED
|
@@ -223,6 +223,7 @@ var Eventified = class {
|
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
|
+
this.sendLog(event, arguments_);
|
|
226
227
|
return result;
|
|
227
228
|
}
|
|
228
229
|
/**
|
|
@@ -270,6 +271,54 @@ var Eventified = class {
|
|
|
270
271
|
}
|
|
271
272
|
return result;
|
|
272
273
|
}
|
|
274
|
+
/**
|
|
275
|
+
* Sends a log message using the configured logger based on the event name
|
|
276
|
+
* @param {string | symbol} eventName - The event name that determines the log level
|
|
277
|
+
* @param {unknown} data - The data to log
|
|
278
|
+
*/
|
|
279
|
+
sendLog(eventName, data) {
|
|
280
|
+
if (!this._logger) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
let message;
|
|
284
|
+
if (typeof data === "string") {
|
|
285
|
+
message = data;
|
|
286
|
+
} else if (Array.isArray(data) && data.length > 0 && data[0] instanceof Error) {
|
|
287
|
+
message = data[0].message;
|
|
288
|
+
} else if (data instanceof Error) {
|
|
289
|
+
message = data.message;
|
|
290
|
+
} else if (Array.isArray(data) && data.length > 0 && typeof data[0]?.message === "string") {
|
|
291
|
+
message = data[0].message;
|
|
292
|
+
} else {
|
|
293
|
+
message = JSON.stringify(data);
|
|
294
|
+
}
|
|
295
|
+
switch (eventName) {
|
|
296
|
+
case "error": {
|
|
297
|
+
this._logger.error?.(message, { event: eventName, data });
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
case "warn": {
|
|
301
|
+
this._logger.warn?.(message, { event: eventName, data });
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
case "trace": {
|
|
305
|
+
this._logger.trace?.(message, { event: eventName, data });
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
case "debug": {
|
|
309
|
+
this._logger.debug?.(message, { event: eventName, data });
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
case "fatal": {
|
|
313
|
+
this._logger.fatal?.(message, { event: eventName, data });
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
default: {
|
|
317
|
+
this._logger.info?.(message, { event: eventName, data });
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
273
322
|
};
|
|
274
323
|
|
|
275
324
|
// src/index.ts
|
|
@@ -404,9 +453,6 @@ var Hookified = class extends Eventified {
|
|
|
404
453
|
const message = this._deprecatedHooks.get(event);
|
|
405
454
|
const warningMessage = `Hook "${event}" is deprecated${message ? `: ${message}` : ""}`;
|
|
406
455
|
this.emit("warn", { hook: event, message: warningMessage });
|
|
407
|
-
if (this.logger?.warn) {
|
|
408
|
-
this.logger.warn(warningMessage);
|
|
409
|
-
}
|
|
410
456
|
return this._allowDeprecated;
|
|
411
457
|
}
|
|
412
458
|
return true;
|
|
@@ -554,9 +600,6 @@ var Hookified = class extends Eventified {
|
|
|
554
600
|
} catch (error) {
|
|
555
601
|
const message = `${event}: ${error.message}`;
|
|
556
602
|
this.emit("error", new Error(message));
|
|
557
|
-
if (this.logger) {
|
|
558
|
-
this.logger.error(message);
|
|
559
|
-
}
|
|
560
603
|
if (this._throwOnHookError) {
|
|
561
604
|
throw new Error(message);
|
|
562
605
|
}
|
|
@@ -614,4 +657,5 @@ export {
|
|
|
614
657
|
Eventified,
|
|
615
658
|
Hookified
|
|
616
659
|
};
|
|
660
|
+
/* v8 ignore next -- @preserve */
|
|
617
661
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["// biome-ignore-all lint/suspicious/noExplicitAny: this is for event emitter compatibility\nimport type { Logger } from \"logger.js\";\n\nexport type IEventEmitter = {\n\t/**\n\t * Registers a listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.on('data', (message) => {\n\t * console.log(message);\n\t * });\n\t */\n\ton(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Alias for `on`. Registers a listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t */\n\taddListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Registers a one-time listener for the specified event. The listener is removed after it is called once.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked once when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.once('close', () => {\n\t * console.log('The connection was closed.');\n\t * });\n\t */\n\tonce(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Removes a previously registered listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to stop listening for.\n\t * @param listener - The specific callback function to remove.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.off('data', myListener);\n\t */\n\toff(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Alias for `off`. Removes a previously registered listener for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to stop listening for.\n\t * @param listener - The specific callback function to remove.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t */\n\tremoveListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Emits the specified event, invoking all registered listeners with the provided arguments.\n\t *\n\t * @param eventName - The name (or symbol) of the event to emit.\n\t * @param args - Arguments passed to each listener.\n\t * @returns `true` if the event had listeners, `false` otherwise.\n\t *\n\t * @example\n\t * emitter.emit('data', 'Hello World');\n\t */\n\temit(eventName: string | symbol, ...arguments_: any[]): boolean;\n\n\t/**\n\t * Returns the number of listeners registered for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event.\n\t * @returns The number of registered listeners.\n\t *\n\t * @example\n\t * const count = emitter.listenerCount('data');\n\t * console.log(count); // e.g., 2\n\t */\n\tlistenerCount(eventName: string | symbol): number;\n\n\t/**\n\t * Removes all listeners for the specified event. If no event is specified, it removes all listeners for all events.\n\t *\n\t * @param eventName - (Optional) The name (or symbol) of the event.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.removeAllListeners('data');\n\t */\n\tremoveAllListeners(eventName?: string | symbol): IEventEmitter;\n\n\t/**\n\t * Returns an array of event names for which listeners have been registered.\n\t *\n\t * @returns An array of event names (or symbols).\n\t *\n\t * @example\n\t * const events = emitter.eventNames();\n\t * console.log(events); // e.g., ['data', 'close']\n\t */\n\teventNames(): Array<string | symbol>;\n\n\t/**\n\t * Returns an array of listeners registered for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event.\n\t * @returns An array of listener functions.\n\t *\n\t * @example\n\t * const listeners = emitter.listeners('data');\n\t * console.log(listeners.length); // e.g., 2\n\t */\n\tlisteners(eventName: string | symbol): Array<(...arguments_: any[]) => void>;\n\n\t/**\n\t * Returns an array of raw listeners for the specified event. This includes listeners wrapped by internal mechanisms (e.g., once-only listeners).\n\t *\n\t * @param eventName - The name (or symbol) of the event.\n\t * @returns An array of raw listener functions.\n\t *\n\t * @example\n\t * const rawListeners = emitter.rawListeners('data');\n\t */\n\trawListeners(\n\t\teventName: string | symbol,\n\t): Array<(...arguments_: any[]) => void>;\n\n\t/**\n\t * Adds a listener to the beginning of the listeners array for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.prependListener('data', (message) => {\n\t * console.log('This will run first.');\n\t * });\n\t */\n\tprependListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n\n\t/**\n\t * Adds a one-time listener to the beginning of the listeners array for the specified event.\n\t *\n\t * @param eventName - The name (or symbol) of the event to listen for.\n\t * @param listener - A callback function that will be invoked once when the event is emitted.\n\t * @returns The current instance of EventEmitter for method chaining.\n\t *\n\t * @example\n\t * emitter.prependOnceListener('data', (message) => {\n\t * console.log('This will run first and only once.');\n\t * });\n\t */\n\tprependOnceListener(\n\t\teventName: string | symbol,\n\t\tlistener: (...arguments_: any[]) => void,\n\t): IEventEmitter;\n};\n\nexport type EventListener = (...arguments_: any[]) => void;\n\nexport type EventEmitterOptions = {\n\t/**\n\t * Logger instance for logging errors.\n\t */\n\tlogger?: Logger;\n\t/**\n\t * Whether to throw an error when emit 'error' and there are no listeners. Default is false and only emits an error event.\n\t */\n\tthrowOnEmitError?: boolean;\n\n\t/**\n\t * Whether to throw on 'error' when there are no listeners. This is the standard functionality in EventEmitter\n\t * @default false - in v2 this will be set to true by default\n\t */\n\tthrowOnEmptyListeners?: boolean;\n};\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<string | symbol, EventListener[]>;\n\tprivate _maxListeners: number;\n\tprivate _logger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = false;\n\tprivate _errorEvent = \"error\";\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<string | symbol, EventListener[]>();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\n\t\tthis._logger = options?.logger;\n\n\t\tif (options?.throwOnEmitError !== undefined) {\n\t\t\tthis._throwOnEmitError = options.throwOnEmitError;\n\t\t}\n\n\t\tif (options?.throwOnEmptyListeners !== undefined) {\n\t\t\tthis._throwOnEmptyListeners = options.throwOnEmptyListeners;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the logger\n\t * @returns {Logger}\n\t */\n\tpublic get logger(): Logger | undefined {\n\t\treturn this._logger;\n\t}\n\n\t/**\n\t * Sets the logger\n\t * @param {Logger} logger\n\t */\n\tpublic set logger(logger: Logger | undefined) {\n\t\tthis._logger = logger;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmitError(): boolean {\n\t\treturn this._throwOnEmitError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmitError(value: boolean) {\n\t\tthis._throwOnEmitError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmptyListeners(): boolean {\n\t\treturn this._throwOnEmptyListeners;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmptyListeners(value: boolean) {\n\t\tthis._throwOnEmptyListeners = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that will run only once\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic once(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.on(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the number of listeners for a specific event. If no event is provided, it returns the total number of listeners\n\t * @param {string} eventName The event name. Not required\n\t * @returns {number} The number of listeners\n\t */\n\tpublic listenerCount(eventName?: string | symbol): number {\n\t\tif (eventName === undefined) {\n\t\t\treturn this.getAllListeners().length;\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(eventName);\n\t\treturn listeners ? listeners.length : 0;\n\t}\n\n\t/**\n\t * Gets an array of event names\n\t * @returns {Array<string | symbol>} An array of event names\n\t */\n\tpublic eventNames(): Array<string | symbol> {\n\t\treturn [...this._eventListeners.keys()];\n\t}\n\n\t/**\n\t * Gets an array of listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic rawListeners(event?: string | symbol): EventListener[] {\n\t\tif (event === undefined) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Prepends a listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(eventName) ?? [];\n\t\tlisteners.unshift(listener);\n\t\tthis._eventListeners.set(eventName, listeners);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Prepends a one-time listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependOnceListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.prependListener(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the maximum number of listeners that can be added for a single event\n\t * @returns {number} The maximum number of listeners\n\t */\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event. It is an alias for the on() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic addListener(\n\t\tevent: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic on(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event. It is an alias for the off() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic off(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls all listeners for a specific event\n\t * @param {string | symbol} event\n\t * @param arguments_ The arguments to pass to the listeners\n\t * @returns {boolean} Returns true if the event had listeners, false otherwise\n\t */\n\tpublic emit(event: string | symbol, ...arguments_: any[]): boolean {\n\t\tlet result = false;\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...arguments_);\n\t\t\t\tresult = true;\n\t\t\t}\n\t\t}\n\n\t\tif (event === this._errorEvent) {\n\t\t\tconst error =\n\t\t\t\targuments_[0] instanceof Error\n\t\t\t\t\t? arguments_[0]\n\t\t\t\t\t: new Error(`${arguments_[0]}`);\n\n\t\t\tif (this._throwOnEmitError && !result) {\n\t\t\t\tthrow error;\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tthis.listeners(this._errorEvent).length === 0 &&\n\t\t\t\t\tthis._throwOnEmptyListeners === true\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets all listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic listeners(event: string | symbol): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Removes all listeners for a specific event. If no event is provided, it removes all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeAllListeners(event?: string | symbol): IEventEmitter {\n\t\tif (event !== undefined) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of listeners that can be added for a single event\n\t * @param {number} n The maximum number of listeners\n\t * @returns {void}\n\t */\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Gets all listeners\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic getAllListeners(): EventListener[] {\n\t\tlet result: EventListener[] = [];\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tresult = [...result, ...listeners];\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","import { type EventEmitterOptions, Eventified } from \"./eventified.js\";\n\n// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\nexport type Hook = (...arguments_: any[]) => Promise<void> | void;\n\nexport type HookEntry = {\n\t/**\n\t * The event name for the hook\n\t */\n\tevent: string;\n\t/**\n\t * The handler function for the hook\n\t */\n\thandler: Hook;\n};\n\nexport type HookifiedOptions = {\n\t/**\n\t * Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tthrowHookErrors?: boolean;\n\t/**\n\t * Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t */\n\tthrowOnHookError?: boolean;\n\t/**\n\t * Whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenforceBeforeAfter?: boolean;\n\t/**\n\t * Map of deprecated hook names to deprecation messages. When a deprecated hook is used, a warning will be emitted.\n\t * @type {Map<string, string>}\n\t * @default new Map()\n\t */\n\tdeprecatedHooks?: Map<string, string>;\n\t/**\n\t * Whether to allow deprecated hooks to be registered and executed. Default is true.\n\t * @type {boolean}\n\t * @default true\n\t */\n\tallowDeprecated?: boolean;\n} & EventEmitterOptions;\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, Hook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\tlogger: options?.logger,\n\t\t\tthrowOnEmitError: options?.throwOnEmitError,\n\t\t\tthrowOnEmptyListeners: options?.throwOnEmptyListeners,\n\t\t});\n\t\tthis._hooks = new Map();\n\t\tthis._deprecatedHooks = options?.deprecatedHooks\n\t\t\t? new Map(options.deprecatedHooks)\n\t\t\t: new Map();\n\n\t\tif (options?.throwOnHookError !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwOnHookError;\n\t\t} else if (options?.throwHookErrors !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwHookErrors;\n\t\t}\n\n\t\tif (options?.enforceBeforeAfter !== undefined) {\n\t\t\tthis._enforceBeforeAfter = options.enforceBeforeAfter;\n\t\t}\n\n\t\tif (options?.allowDeprecated !== undefined) {\n\t\t\tthis._allowDeprecated = options.allowDeprecated;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, Hook[]>}\n\t */\n\tpublic get hooks() {\n\t\treturn this._hooks;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic get throwHookErrors() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic set throwHookErrors(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnHookError() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnHookError(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @returns {boolean}\n\t * @default false\n\t */\n\tpublic get enforceBeforeAfter() {\n\t\treturn this._enforceBeforeAfter;\n\t}\n\n\t/**\n\t * Sets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set enforceBeforeAfter(value) {\n\t\tthis._enforceBeforeAfter = value;\n\t}\n\n\t/**\n\t * Gets the map of deprecated hook names to deprecation messages.\n\t * @returns {Map<string, string>}\n\t */\n\tpublic get deprecatedHooks() {\n\t\treturn this._deprecatedHooks;\n\t}\n\n\t/**\n\t * Sets the map of deprecated hook names to deprecation messages.\n\t * @param {Map<string, string>} value\n\t */\n\tpublic set deprecatedHooks(value) {\n\t\tthis._deprecatedHooks = value;\n\t}\n\n\t/**\n\t * Gets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get allowDeprecated() {\n\t\treturn this._allowDeprecated;\n\t}\n\n\t/**\n\t * Sets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @param {boolean} value\n\t */\n\tpublic set allowDeprecated(value) {\n\t\tthis._allowDeprecated = value;\n\t}\n\n\t/**\n\t * Validates hook event name if enforceBeforeAfter is enabled\n\t * @param {string} event - The event name to validate\n\t * @throws {Error} If enforceBeforeAfter is true and event doesn't start with 'before' or 'after'\n\t */\n\tprivate validateHookName(event: string): void {\n\t\tif (this._enforceBeforeAfter) {\n\t\t\tconst eventValue = event.trim().toLocaleLowerCase();\n\t\t\tif (!eventValue.startsWith(\"before\") && !eventValue.startsWith(\"after\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hook event \"${event}\" must start with \"before\" or \"after\" when enforceBeforeAfter is enabled`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a hook is deprecated and emits a warning if it is\n\t * @param {string} event - The event name to check\n\t * @returns {boolean} - Returns true if the hook should proceed, false if it should be blocked\n\t */\n\tprivate checkDeprecatedHook(event: string): boolean {\n\t\tif (this._deprecatedHooks.has(event)) {\n\t\t\tconst message = this._deprecatedHooks.get(event);\n\t\t\tconst warningMessage = `Hook \"${event}\" is deprecated${message ? `: ${message}` : \"\"}`;\n\n\t\t\t// Emit deprecation warning event\n\t\t\tthis.emit(\"warn\", { hook: event, message: warningMessage });\n\n\t\t\t// Log to logger if available\n\t\t\tif (this.logger?.warn) {\n\t\t\t\tthis.logger.warn(warningMessage);\n\t\t\t}\n\n\t\t\t// Return false if deprecated hooks are not allowed\n\t\t\treturn this._allowDeprecated;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic onHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {HookEntry} hookEntry\n\t * @returns {void}\n\t */\n\tpublic onHookEntry(hookEntry: HookEntry) {\n\t\tthis.onHook(hookEntry.event, hookEntry.handler);\n\t}\n\n\t/**\n\t * Alias for onHook. This is provided for compatibility with other libraries that use the `addHook` method.\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: Hook) {\n\t\t// Alias for onHook\n\t\tthis.onHook(event, handler);\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic prependHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.unshift(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers\n\t * @param event\n\t * @param handler\n\t */\n\tpublic prependOnceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.prependHook(event, hook);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param event\n\t * @param handler\n\t */\n\tpublic onceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook(event, hook);\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler\n\t * @returns {void}\n\t */\n\tpublic removeHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip removal if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes all handlers for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic removeHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.removeHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async hook<T>(event: string, ...arguments_: T[]) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip execution if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = `${event}: ${(error as Error).message}`;\n\t\t\t\t\tthis.emit(\"error\", new Error(message));\n\t\t\t\t\tif (this.logger) {\n\t\t\t\t\t\tthis.logger.error(message);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._throwOnHookError) {\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Prepends the word `before` to your hook. Example is event is `test`, the before hook is `before:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async beforeHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`before:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Prepends the word `after` to your hook. Example is event is `test`, the after hook is `after:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async afterHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`after:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event. This is an alias for `hook` and is provided for\n\t * compatibility with other libraries that use the `callHook` method.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async callHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(event, ...arguments_);\n\t}\n\n\t/**\n\t * Gets all hooks for a specific event\n\t * @param {string} event\n\t * @returns {Hook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn undefined; // Return undefined if deprecated hooks are not allowed\n\t\t}\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Removes all hooks\n\t * @returns {void}\n\t */\n\tpublic clearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport { Eventified, type EventListener } from \"./eventified.js\";\nexport type { Logger } from \"./logger.js\";\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/eventified.ts","../../src/index.ts"],"sourcesContent":["// biome-ignore-all lint/suspicious/noExplicitAny: this is for event emitter compatibility\nimport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n\nexport type { EventEmitterOptions, EventListener, IEventEmitter };\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<string | symbol, EventListener[]>;\n\tprivate _maxListeners: number;\n\tprivate _logger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = false;\n\tprivate _errorEvent = \"error\";\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<string | symbol, EventListener[]>();\n\t\tthis._maxListeners = 100; // Default maximum number of listeners\n\n\t\tthis._logger = options?.logger;\n\n\t\tif (options?.throwOnEmitError !== undefined) {\n\t\t\tthis._throwOnEmitError = options.throwOnEmitError;\n\t\t}\n\n\t\tif (options?.throwOnEmptyListeners !== undefined) {\n\t\t\tthis._throwOnEmptyListeners = options.throwOnEmptyListeners;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the logger\n\t * @returns {Logger}\n\t */\n\tpublic get logger(): Logger | undefined {\n\t\treturn this._logger;\n\t}\n\n\t/**\n\t * Sets the logger\n\t * @param {Logger} logger\n\t */\n\tpublic set logger(logger: Logger | undefined) {\n\t\tthis._logger = logger;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmitError(): boolean {\n\t\treturn this._throwOnEmitError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when an emit throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmitError(value: boolean) {\n\t\tthis._throwOnEmitError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnEmptyListeners(): boolean {\n\t\treturn this._throwOnEmptyListeners;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when emitting 'error' event with no listeners. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnEmptyListeners(value: boolean) {\n\t\tthis._throwOnEmptyListeners = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that will run only once\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic once(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.on(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the number of listeners for a specific event. If no event is provided, it returns the total number of listeners\n\t * @param {string} eventName The event name. Not required\n\t * @returns {number} The number of listeners\n\t */\n\tpublic listenerCount(eventName?: string | symbol): number {\n\t\tif (eventName === undefined) {\n\t\t\treturn this.getAllListeners().length;\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(eventName);\n\t\treturn listeners ? listeners.length : 0;\n\t}\n\n\t/**\n\t * Gets an array of event names\n\t * @returns {Array<string | symbol>} An array of event names\n\t */\n\tpublic eventNames(): Array<string | symbol> {\n\t\treturn [...this._eventListeners.keys()];\n\t}\n\n\t/**\n\t * Gets an array of listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic rawListeners(event?: string | symbol): EventListener[] {\n\t\tif (event === undefined) {\n\t\t\treturn this.getAllListeners();\n\t\t}\n\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Prepends a listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(eventName) ?? [];\n\t\tlisteners.unshift(listener);\n\t\tthis._eventListeners.set(eventName, listeners);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Prepends a one-time listener to the beginning of the listeners array for the specified event\n\t * @param {string | symbol} eventName\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic prependOnceListener(\n\t\teventName: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tconst onceListener: EventListener = (...arguments_: any[]) => {\n\t\t\tthis.off(eventName as string, onceListener);\n\t\t\tlistener(...arguments_);\n\t\t};\n\n\t\tthis.prependListener(eventName as string, onceListener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Gets the maximum number of listeners that can be added for a single event\n\t * @returns {number} The maximum number of listeners\n\t */\n\tpublic maxListeners(): number {\n\t\treturn this._maxListeners;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event. It is an alias for the on() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic addListener(\n\t\tevent: string | symbol,\n\t\tlistener: EventListener,\n\t): IEventEmitter {\n\t\tthis.on(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic on(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tif (!this._eventListeners.has(event)) {\n\t\t\tthis._eventListeners.set(event, []);\n\t\t}\n\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners) {\n\t\t\tif (listeners.length >= this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${listeners.length + 1} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlisteners.push(listener);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event. It is an alias for the off() method\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeListener(event: string, listener: EventListener): IEventEmitter {\n\t\tthis.off(event, listener);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes a listener for a specific event\n\t * @param {string | symbol} event\n\t * @param {EventListener} listener\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic off(event: string | symbol, listener: EventListener): IEventEmitter {\n\t\tconst listeners = this._eventListeners.get(event) ?? [];\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length === 0) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Calls all listeners for a specific event\n\t * @param {string | symbol} event\n\t * @param arguments_ The arguments to pass to the listeners\n\t * @returns {boolean} Returns true if the event had listeners, false otherwise\n\t */\n\tpublic emit(event: string | symbol, ...arguments_: any[]): boolean {\n\t\tlet result = false;\n\t\tconst listeners = this._eventListeners.get(event);\n\n\t\tif (listeners && listeners.length > 0) {\n\t\t\tfor (const listener of listeners) {\n\t\t\t\tlistener(...arguments_);\n\t\t\t\tresult = true;\n\t\t\t}\n\t\t}\n\n\t\tif (event === this._errorEvent) {\n\t\t\tconst error =\n\t\t\t\targuments_[0] instanceof Error\n\t\t\t\t\t? arguments_[0]\n\t\t\t\t\t: new Error(`${arguments_[0]}`);\n\n\t\t\tif (this._throwOnEmitError && !result) {\n\t\t\t\tthrow error;\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tthis.listeners(this._errorEvent).length === 0 &&\n\t\t\t\t\tthis._throwOnEmptyListeners === true\n\t\t\t\t) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// send it to the logger\n\t\tthis.sendLog(event, arguments_);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Gets all listeners for a specific event. If no event is provided, it returns all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic listeners(event: string | symbol): EventListener[] {\n\t\treturn this._eventListeners.get(event) ?? [];\n\t}\n\n\t/**\n\t * Removes all listeners for a specific event. If no event is provided, it removes all listeners\n\t * @param {string} [event] (Optional) The event name\n\t * @returns {IEventEmitter} returns the instance of the class for chaining\n\t */\n\tpublic removeAllListeners(event?: string | symbol): IEventEmitter {\n\t\tif (event !== undefined) {\n\t\t\tthis._eventListeners.delete(event);\n\t\t} else {\n\t\t\tthis._eventListeners.clear();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum number of listeners that can be added for a single event\n\t * @param {number} n The maximum number of listeners\n\t * @returns {void}\n\t */\n\tpublic setMaxListeners(n: number): void {\n\t\tthis._maxListeners = n;\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tif (listeners.length > n) {\n\t\t\t\tlisteners.splice(n);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Gets all listeners\n\t * @returns {EventListener[]} An array of listeners\n\t */\n\tpublic getAllListeners(): EventListener[] {\n\t\tlet result: EventListener[] = [];\n\t\tfor (const listeners of this._eventListeners.values()) {\n\t\t\tresult = [...result, ...listeners];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Sends a log message using the configured logger based on the event name\n\t * @param {string | symbol} eventName - The event name that determines the log level\n\t * @param {unknown} data - The data to log\n\t */\n\tprivate sendLog(eventName: string | symbol, data: any): void {\n\t\tif (!this._logger) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet message: string;\n\t\t/* v8 ignore next -- @preserve */\n\t\tif (typeof data === \"string\") {\n\t\t\tmessage = data;\n\t\t} else if (\n\t\t\tArray.isArray(data) &&\n\t\t\tdata.length > 0 &&\n\t\t\tdata[0] instanceof Error\n\t\t) {\n\t\t\tmessage = data[0].message;\n\t\t\t/* v8 ignore next -- @preserve */\n\t\t} else if (data instanceof Error) {\n\t\t\tmessage = data.message;\n\t\t} else if (\n\t\t\tArray.isArray(data) &&\n\t\t\tdata.length > 0 &&\n\t\t\ttypeof data[0]?.message === \"string\"\n\t\t) {\n\t\t\tmessage = data[0].message;\n\t\t} else {\n\t\t\tmessage = JSON.stringify(data);\n\t\t}\n\n\t\tswitch (eventName) {\n\t\t\tcase \"error\": {\n\t\t\t\tthis._logger.error?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"warn\": {\n\t\t\t\tthis._logger.warn?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"trace\": {\n\t\t\t\tthis._logger.trace?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"debug\": {\n\t\t\t\tthis._logger.debug?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"fatal\": {\n\t\t\t\tthis._logger.fatal?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis._logger.info?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","import { Eventified } from \"./eventified.js\";\nimport type { Hook, HookEntry, HookifiedOptions } from \"./types.js\";\n\nexport type { Hook, HookEntry, HookifiedOptions };\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, Hook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\tlogger: options?.logger,\n\t\t\tthrowOnEmitError: options?.throwOnEmitError,\n\t\t\tthrowOnEmptyListeners: options?.throwOnEmptyListeners,\n\t\t});\n\t\tthis._hooks = new Map();\n\t\tthis._deprecatedHooks = options?.deprecatedHooks\n\t\t\t? new Map(options.deprecatedHooks)\n\t\t\t: new Map();\n\n\t\tif (options?.throwOnHookError !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwOnHookError;\n\t\t} else if (options?.throwHookErrors !== undefined) {\n\t\t\tthis._throwOnHookError = options.throwHookErrors;\n\t\t}\n\n\t\tif (options?.enforceBeforeAfter !== undefined) {\n\t\t\tthis._enforceBeforeAfter = options.enforceBeforeAfter;\n\t\t}\n\n\t\tif (options?.allowDeprecated !== undefined) {\n\t\t\tthis._allowDeprecated = options.allowDeprecated;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, Hook[]>}\n\t */\n\tpublic get hooks() {\n\t\treturn this._hooks;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic get throwHookErrors() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t * @deprecated - this will be deprecated in version 2. Please use throwOnHookError.\n\t */\n\tpublic set throwHookErrors(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @returns {boolean}\n\t */\n\tpublic get throwOnHookError() {\n\t\treturn this._throwOnHookError;\n\t}\n\n\t/**\n\t * Sets whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.\n\t * @param {boolean} value\n\t */\n\tpublic set throwOnHookError(value) {\n\t\tthis._throwOnHookError = value;\n\t}\n\n\t/**\n\t * Gets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @returns {boolean}\n\t * @default false\n\t */\n\tpublic get enforceBeforeAfter() {\n\t\treturn this._enforceBeforeAfter;\n\t}\n\n\t/**\n\t * Sets whether to enforce that all hook names start with 'before' or 'after'. Default is false.\n\t * @param {boolean} value\n\t */\n\tpublic set enforceBeforeAfter(value) {\n\t\tthis._enforceBeforeAfter = value;\n\t}\n\n\t/**\n\t * Gets the map of deprecated hook names to deprecation messages.\n\t * @returns {Map<string, string>}\n\t */\n\tpublic get deprecatedHooks() {\n\t\treturn this._deprecatedHooks;\n\t}\n\n\t/**\n\t * Sets the map of deprecated hook names to deprecation messages.\n\t * @param {Map<string, string>} value\n\t */\n\tpublic set deprecatedHooks(value) {\n\t\tthis._deprecatedHooks = value;\n\t}\n\n\t/**\n\t * Gets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get allowDeprecated() {\n\t\treturn this._allowDeprecated;\n\t}\n\n\t/**\n\t * Sets whether deprecated hooks are allowed to be registered and executed. Default is true.\n\t * @param {boolean} value\n\t */\n\tpublic set allowDeprecated(value) {\n\t\tthis._allowDeprecated = value;\n\t}\n\n\t/**\n\t * Validates hook event name if enforceBeforeAfter is enabled\n\t * @param {string} event - The event name to validate\n\t * @throws {Error} If enforceBeforeAfter is true and event doesn't start with 'before' or 'after'\n\t */\n\tprivate validateHookName(event: string): void {\n\t\tif (this._enforceBeforeAfter) {\n\t\t\tconst eventValue = event.trim().toLocaleLowerCase();\n\t\t\tif (!eventValue.startsWith(\"before\") && !eventValue.startsWith(\"after\")) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Hook event \"${event}\" must start with \"before\" or \"after\" when enforceBeforeAfter is enabled`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if a hook is deprecated and emits a warning if it is\n\t * @param {string} event - The event name to check\n\t * @returns {boolean} - Returns true if the hook should proceed, false if it should be blocked\n\t */\n\tprivate checkDeprecatedHook(event: string): boolean {\n\t\tif (this._deprecatedHooks.has(event)) {\n\t\t\tconst message = this._deprecatedHooks.get(event);\n\t\t\tconst warningMessage = `Hook \"${event}\" is deprecated${message ? `: ${message}` : \"\"}`;\n\n\t\t\t// Emit deprecation warning event\n\t\t\tthis.emit(\"warn\", { hook: event, message: warningMessage });\n\n\t\t\t// Return false if deprecated hooks are not allowed\n\t\t\treturn this._allowDeprecated;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic onHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.push(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {HookEntry} hookEntry\n\t * @returns {void}\n\t */\n\tpublic onHookEntry(hookEntry: HookEntry) {\n\t\tthis.onHook(hookEntry.event, hookEntry.handler);\n\t}\n\n\t/**\n\t * Alias for onHook. This is provided for compatibility with other libraries that use the `addHook` method.\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: Hook) {\n\t\t// Alias for onHook\n\t\tthis.onHook(event, handler);\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event that runs before all other handlers\n\t * @param {string} event\n\t * @param {Hook} handler - this can be async or sync\n\t * @returns {void}\n\t */\n\tpublic prependHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\teventHandlers.unshift(handler);\n\t\t} else {\n\t\t\tthis._hooks.set(event, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers\n\t * @param event\n\t * @param handler\n\t */\n\tpublic prependOnceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.prependHook(event, hook);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param event\n\t * @param handler\n\t */\n\tpublic onceHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst hook = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook(event, hook);\n\t\t\treturn handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook(event, hook);\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {string} event\n\t * @param {Hook} handler\n\t * @returns {void}\n\t */\n\tpublic removeHook(event: string, handler: Hook) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip removal if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.indexOf(handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes all handlers for a specific event\n\t * @param {Array<HookEntry>} hooks\n\t * @returns {void}\n\t */\n\tpublic removeHooks(hooks: HookEntry[]) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.removeHook(hook.event, hook.handler);\n\t\t}\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async hook<T>(event: string, ...arguments_: T[]) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn; // Skip execution if deprecated hooks are not allowed\n\t\t}\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const handler of eventHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\tawait handler(...arguments_);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = `${event}: ${(error as Error).message}`;\n\t\t\t\t\tthis.emit(\"error\", new Error(message));\n\n\t\t\t\t\tif (this._throwOnHookError) {\n\t\t\t\t\t\tthrow new Error(message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Prepends the word `before` to your hook. Example is event is `test`, the before hook is `before:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async beforeHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`before:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Prepends the word `after` to your hook. Example is event is `test`, the after hook is `after:test`.\n\t * @param {string} event - The event name\n\t * @param {T[]} arguments_ - The arguments to pass to the hook\n\t */\n\tpublic async afterHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(`after:${event}`, ...arguments_);\n\t}\n\n\t/**\n\t * Calls all handlers for a specific event. This is an alias for `hook` and is provided for\n\t * compatibility with other libraries that use the `callHook` method.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {Promise<void>}\n\t */\n\tpublic async callHook<T>(event: string, ...arguments_: T[]) {\n\t\tawait this.hook(event, ...arguments_);\n\t}\n\n\t/**\n\t * Gets all hooks for a specific event\n\t * @param {string} event\n\t * @returns {Hook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn undefined; // Return undefined if deprecated hooks are not allowed\n\t\t}\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Removes all hooks\n\t * @returns {void}\n\t */\n\tpublic clearHooks() {\n\t\tthis._hooks.clear();\n\t}\n}\n\nexport { Eventified } from \"./eventified.js\";\nexport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n"],"mappings":";;;;;AAUO,IAAM,aAAN,MAA0C;AAAA,EAQhD,YAAY,SAA+B;AAP3C,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,qBAAoB;AAC5B,wBAAQ,0BAAyB;AACjC,wBAAQ,eAAc;AAGrB,SAAK,kBAAkB,oBAAI,IAAsC;AACjE,SAAK,gBAAgB;AAErB,SAAK,UAAU,SAAS;AAExB,QAAI,SAAS,qBAAqB,QAAW;AAC5C,WAAK,oBAAoB,QAAQ;AAAA,IAClC;AAEA,QAAI,SAAS,0BAA0B,QAAW;AACjD,WAAK,yBAAyB,QAAQ;AAAA,IACvC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,SAA6B;AACvC,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,OAAO,QAA4B;AAC7C,SAAK,UAAU;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,mBAA4B;AACtC,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,iBAAiB,OAAgB;AAC3C,SAAK,oBAAoB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,wBAAiC;AAC3C,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,sBAAsB,OAAgB;AAChD,SAAK,yBAAyB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KACN,WACA,UACgB;AAChB,UAAM,eAA8B,IAAI,eAAsB;AAC7D,WAAK,IAAI,WAAqB,YAAY;AAC1C,eAAS,GAAG,UAAU;AAAA,IACvB;AAEA,SAAK,GAAG,WAAqB,YAAY;AACzC,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,cAAc,WAAqC;AACzD,QAAI,cAAc,QAAW;AAC5B,aAAO,KAAK,gBAAgB,EAAE;AAAA,IAC/B;AAEA,UAAM,YAAY,KAAK,gBAAgB,IAAI,SAAS;AACpD,WAAO,YAAY,UAAU,SAAS;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,aAAqC;AAC3C,WAAO,CAAC,GAAG,KAAK,gBAAgB,KAAK,CAAC;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,aAAa,OAA0C;AAC7D,QAAI,UAAU,QAAW;AACxB,aAAO,KAAK,gBAAgB;AAAA,IAC7B;AAEA,WAAO,KAAK,gBAAgB,IAAI,KAAK,KAAK,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,gBACN,WACA,UACgB;AAChB,UAAM,YAAY,KAAK,gBAAgB,IAAI,SAAS,KAAK,CAAC;AAC1D,cAAU,QAAQ,QAAQ;AAC1B,SAAK,gBAAgB,IAAI,WAAW,SAAS;AAC7C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,oBACN,WACA,UACgB;AAChB,UAAM,eAA8B,IAAI,eAAsB;AAC7D,WAAK,IAAI,WAAqB,YAAY;AAC1C,eAAS,GAAG,UAAU;AAAA,IACvB;AAEA,SAAK,gBAAgB,WAAqB,YAAY;AACtD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,eAAuB;AAC7B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YACN,OACA,UACgB;AAChB,SAAK,GAAG,OAAO,QAAQ;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,GAAG,OAAwB,UAAwC;AACzE,QAAI,CAAC,KAAK,gBAAgB,IAAI,KAAK,GAAG;AACrC,WAAK,gBAAgB,IAAI,OAAO,CAAC,CAAC;AAAA,IACnC;AAEA,UAAM,YAAY,KAAK,gBAAgB,IAAI,KAAK;AAEhD,QAAI,WAAW;AACd,UAAI,UAAU,UAAU,KAAK,eAAe;AAC3C,gBAAQ;AAAA,UACP,qEAAqE,UAAU,SAAS,CAAC,IAAI,KAAe;AAAA,QAC7G;AAAA,MACD;AAEA,gBAAU,KAAK,QAAQ;AAAA,IACxB;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,eAAe,OAAe,UAAwC;AAC5E,SAAK,IAAI,OAAO,QAAQ;AACxB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAI,OAAwB,UAAwC;AAC1E,UAAM,YAAY,KAAK,gBAAgB,IAAI,KAAK,KAAK,CAAC;AACtD,UAAM,QAAQ,UAAU,QAAQ,QAAQ;AACxC,QAAI,UAAU,IAAI;AACjB,gBAAU,OAAO,OAAO,CAAC;AAAA,IAC1B;AAEA,QAAI,UAAU,WAAW,GAAG;AAC3B,WAAK,gBAAgB,OAAO,KAAK;AAAA,IAClC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAK,UAA2B,YAA4B;AAClE,QAAI,SAAS;AACb,UAAM,YAAY,KAAK,gBAAgB,IAAI,KAAK;AAEhD,QAAI,aAAa,UAAU,SAAS,GAAG;AACtC,iBAAW,YAAY,WAAW;AACjC,iBAAS,GAAG,UAAU;AACtB,iBAAS;AAAA,MACV;AAAA,IACD;AAEA,QAAI,UAAU,KAAK,aAAa;AAC/B,YAAM,QACL,WAAW,CAAC,aAAa,QACtB,WAAW,CAAC,IACZ,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE;AAEhC,UAAI,KAAK,qBAAqB,CAAC,QAAQ;AACtC,cAAM;AAAA,MACP,OAAO;AACN,YACC,KAAK,UAAU,KAAK,WAAW,EAAE,WAAW,KAC5C,KAAK,2BAA2B,MAC/B;AACD,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAGA,SAAK,QAAQ,OAAO,UAAU;AAE9B,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,UAAU,OAAyC;AACzD,WAAO,KAAK,gBAAgB,IAAI,KAAK,KAAK,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,mBAAmB,OAAwC;AACjE,QAAI,UAAU,QAAW;AACxB,WAAK,gBAAgB,OAAO,KAAK;AAAA,IAClC,OAAO;AACN,WAAK,gBAAgB,MAAM;AAAA,IAC5B;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,gBAAgB,GAAiB;AACvC,SAAK,gBAAgB;AACrB,eAAW,aAAa,KAAK,gBAAgB,OAAO,GAAG;AACtD,UAAI,UAAU,SAAS,GAAG;AACzB,kBAAU,OAAO,CAAC;AAAA,MACnB;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAmC;AACzC,QAAI,SAA0B,CAAC;AAC/B,eAAW,aAAa,KAAK,gBAAgB,OAAO,GAAG;AACtD,eAAS,CAAC,GAAG,QAAQ,GAAG,SAAS;AAAA,IAClC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAQ,WAA4B,MAAiB;AAC5D,QAAI,CAAC,KAAK,SAAS;AAClB;AAAA,IACD;AAEA,QAAI;AAEJ,QAAI,OAAO,SAAS,UAAU;AAC7B,gBAAU;AAAA,IACX,WACC,MAAM,QAAQ,IAAI,KAClB,KAAK,SAAS,KACd,KAAK,CAAC,aAAa,OAClB;AACD,gBAAU,KAAK,CAAC,EAAE;AAAA,IAEnB,WAAW,gBAAgB,OAAO;AACjC,gBAAU,KAAK;AAAA,IAChB,WACC,MAAM,QAAQ,IAAI,KAClB,KAAK,SAAS,KACd,OAAO,KAAK,CAAC,GAAG,YAAY,UAC3B;AACD,gBAAU,KAAK,CAAC,EAAE;AAAA,IACnB,OAAO;AACN,gBAAU,KAAK,UAAU,IAAI;AAAA,IAC9B;AAEA,YAAQ,WAAW;AAAA,MAClB,KAAK,SAAS;AACb,aAAK,QAAQ,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AACxD;AAAA,MACD;AAAA,MAEA,KAAK,QAAQ;AACZ,aAAK,QAAQ,OAAO,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AACvD;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,aAAK,QAAQ,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AACxD;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,aAAK,QAAQ,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AACxD;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,aAAK,QAAQ,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AACxD;AAAA,MACD;AAAA,MAEA,SAAS;AACR,aAAK,QAAQ,OAAO,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AACvD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;ACjZO,IAAM,YAAN,cAAwB,WAAW;AAAA,EAOzC,YAAY,SAA4B;AACvC,UAAM;AAAA,MACL,QAAQ,SAAS;AAAA,MACjB,kBAAkB,SAAS;AAAA,MAC3B,uBAAuB,SAAS;AAAA,IACjC,CAAC;AAXF,wBAAiB;AACjB,wBAAQ,qBAAoB;AAC5B,wBAAQ,uBAAsB;AAC9B,wBAAQ;AACR,wBAAQ,oBAAmB;AAQ1B,SAAK,SAAS,oBAAI,IAAI;AACtB,SAAK,mBAAmB,SAAS,kBAC9B,IAAI,IAAI,QAAQ,eAAe,IAC/B,oBAAI,IAAI;AAEX,QAAI,SAAS,qBAAqB,QAAW;AAC5C,WAAK,oBAAoB,QAAQ;AAAA,IAClC,WAAW,SAAS,oBAAoB,QAAW;AAClD,WAAK,oBAAoB,QAAQ;AAAA,IAClC;AAEA,QAAI,SAAS,uBAAuB,QAAW;AAC9C,WAAK,sBAAsB,QAAQ;AAAA,IACpC;AAEA,QAAI,SAAS,oBAAoB,QAAW;AAC3C,WAAK,mBAAmB,QAAQ;AAAA,IACjC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,QAAQ;AAClB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,kBAAkB;AAC5B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,gBAAgB,OAAO;AACjC,SAAK,oBAAoB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,mBAAmB;AAC7B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,iBAAiB,OAAO;AAClC,SAAK,oBAAoB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,qBAAqB;AAC/B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,mBAAmB,OAAO;AACpC,SAAK,sBAAsB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,kBAAkB;AAC5B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,gBAAgB,OAAO;AACjC,SAAK,mBAAmB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,kBAAkB;AAC5B,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,gBAAgB,OAAO;AACjC,SAAK,mBAAmB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAiB,OAAqB;AAC7C,QAAI,KAAK,qBAAqB;AAC7B,YAAM,aAAa,MAAM,KAAK,EAAE,kBAAkB;AAClD,UAAI,CAAC,WAAW,WAAW,QAAQ,KAAK,CAAC,WAAW,WAAW,OAAO,GAAG;AACxE,cAAM,IAAI;AAAA,UACT,eAAe,KAAK;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,OAAwB;AACnD,QAAI,KAAK,iBAAiB,IAAI,KAAK,GAAG;AACrC,YAAM,UAAU,KAAK,iBAAiB,IAAI,KAAK;AAC/C,YAAM,iBAAiB,SAAS,KAAK,kBAAkB,UAAU,KAAK,OAAO,KAAK,EAAE;AAGpF,WAAK,KAAK,QAAQ,EAAE,MAAM,OAAO,SAAS,eAAe,CAAC;AAG1D,aAAO,KAAK;AAAA,IACb;AACA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,OAAe,SAAe;AAC3C,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AACA,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,QAAI,eAAe;AAClB,oBAAc,KAAK,OAAO;AAAA,IAC3B,OAAO;AACN,WAAK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;AAAA,IACjC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,YAAY,WAAsB;AACxC,SAAK,OAAO,UAAU,OAAO,UAAU,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAQ,OAAe,SAAe;AAE5C,SAAK,OAAO,OAAO,OAAO;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,OAAoB;AAClC,eAAW,QAAQ,OAAO;AACzB,WAAK,OAAO,KAAK,OAAO,KAAK,OAAO;AAAA,IACrC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAY,OAAe,SAAe;AAChD,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AACA,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,QAAI,eAAe;AAClB,oBAAc,QAAQ,OAAO;AAAA,IAC9B,OAAO;AACN,WAAK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;AAAA,IACjC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,gBAAgB,OAAe,SAAe;AACpD,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AAEA,UAAM,OAAO,UAAU,eAAsB;AAC5C,WAAK,WAAW,OAAO,IAAI;AAC3B,aAAO,QAAQ,GAAG,UAAU;AAAA,IAC7B;AAEA,SAAK,YAAY,OAAO,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAAS,OAAe,SAAe;AAC7C,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AAEA,UAAM,OAAO,UAAU,eAAsB;AAC5C,WAAK,WAAW,OAAO,IAAI;AAC3B,aAAO,QAAQ,GAAG,UAAU;AAAA,IAC7B;AAEA,SAAK,OAAO,OAAO,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAW,OAAe,SAAe;AAC/C,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AACA,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,QAAI,eAAe;AAClB,YAAM,QAAQ,cAAc,QAAQ,OAAO;AAC3C,UAAI,UAAU,IAAI;AACjB,sBAAc,OAAO,OAAO,CAAC;AAAA,MAC9B;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,YAAY,OAAoB;AACtC,eAAW,QAAQ,OAAO;AACzB,WAAK,WAAW,KAAK,OAAO,KAAK,OAAO;AAAA,IACzC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,KAAQ,UAAkB,YAAiB;AACvD,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AACA,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,QAAI,eAAe;AAClB,iBAAW,WAAW,eAAe;AACpC,YAAI;AACH,gBAAM,QAAQ,GAAG,UAAU;AAAA,QAC5B,SAAS,OAAO;AACf,gBAAM,UAAU,GAAG,KAAK,KAAM,MAAgB,OAAO;AACrD,eAAK,KAAK,SAAS,IAAI,MAAM,OAAO,CAAC;AAErC,cAAI,KAAK,mBAAmB;AAC3B,kBAAM,IAAI,MAAM,OAAO;AAAA,UACxB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,WAAc,UAAkB,YAAiB;AAC7D,UAAM,KAAK,KAAK,UAAU,KAAK,IAAI,GAAG,UAAU;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,UAAa,UAAkB,YAAiB;AAC5D,UAAM,KAAK,KAAK,SAAS,KAAK,IAAI,GAAG,UAAU;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,SAAY,UAAkB,YAAiB;AAC3D,UAAM,KAAK,KAAK,OAAO,GAAG,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAAS,OAAe;AAC9B,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC,aAAO;AAAA,IACR;AACA,WAAO,KAAK,OAAO,IAAI,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,aAAa;AACnB,SAAK,OAAO,MAAM;AAAA,EACnB;AACD;","names":[]}
|
package/dist/node/index.cjs
CHANGED
|
@@ -246,6 +246,7 @@ var Eventified = class {
|
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
+
this.sendLog(event, arguments_);
|
|
249
250
|
return result;
|
|
250
251
|
}
|
|
251
252
|
/**
|
|
@@ -293,6 +294,54 @@ var Eventified = class {
|
|
|
293
294
|
}
|
|
294
295
|
return result;
|
|
295
296
|
}
|
|
297
|
+
/**
|
|
298
|
+
* Sends a log message using the configured logger based on the event name
|
|
299
|
+
* @param {string | symbol} eventName - The event name that determines the log level
|
|
300
|
+
* @param {unknown} data - The data to log
|
|
301
|
+
*/
|
|
302
|
+
sendLog(eventName, data) {
|
|
303
|
+
if (!this._logger) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
let message;
|
|
307
|
+
if (typeof data === "string") {
|
|
308
|
+
message = data;
|
|
309
|
+
} else if (Array.isArray(data) && data.length > 0 && data[0] instanceof Error) {
|
|
310
|
+
message = data[0].message;
|
|
311
|
+
} else if (data instanceof Error) {
|
|
312
|
+
message = data.message;
|
|
313
|
+
} else if (Array.isArray(data) && data.length > 0 && typeof data[0]?.message === "string") {
|
|
314
|
+
message = data[0].message;
|
|
315
|
+
} else {
|
|
316
|
+
message = JSON.stringify(data);
|
|
317
|
+
}
|
|
318
|
+
switch (eventName) {
|
|
319
|
+
case "error": {
|
|
320
|
+
this._logger.error?.(message, { event: eventName, data });
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
case "warn": {
|
|
324
|
+
this._logger.warn?.(message, { event: eventName, data });
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
case "trace": {
|
|
328
|
+
this._logger.trace?.(message, { event: eventName, data });
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
case "debug": {
|
|
332
|
+
this._logger.debug?.(message, { event: eventName, data });
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
case "fatal": {
|
|
336
|
+
this._logger.fatal?.(message, { event: eventName, data });
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
default: {
|
|
340
|
+
this._logger.info?.(message, { event: eventName, data });
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
296
345
|
};
|
|
297
346
|
|
|
298
347
|
// src/index.ts
|
|
@@ -427,9 +476,6 @@ var Hookified = class extends Eventified {
|
|
|
427
476
|
const message = this._deprecatedHooks.get(event);
|
|
428
477
|
const warningMessage = `Hook "${event}" is deprecated${message ? `: ${message}` : ""}`;
|
|
429
478
|
this.emit("warn", { hook: event, message: warningMessage });
|
|
430
|
-
if (this.logger?.warn) {
|
|
431
|
-
this.logger.warn(warningMessage);
|
|
432
|
-
}
|
|
433
479
|
return this._allowDeprecated;
|
|
434
480
|
}
|
|
435
481
|
return true;
|
|
@@ -577,9 +623,6 @@ var Hookified = class extends Eventified {
|
|
|
577
623
|
} catch (error) {
|
|
578
624
|
const message = `${event}: ${error.message}`;
|
|
579
625
|
this.emit("error", new Error(message));
|
|
580
|
-
if (this.logger) {
|
|
581
|
-
this.logger.error(message);
|
|
582
|
-
}
|
|
583
626
|
if (this._throwOnHookError) {
|
|
584
627
|
throw new Error(message);
|
|
585
628
|
}
|
|
@@ -638,3 +681,4 @@ var Hookified = class extends Eventified {
|
|
|
638
681
|
Eventified,
|
|
639
682
|
Hookified
|
|
640
683
|
});
|
|
684
|
+
/* v8 ignore next -- @preserve */
|
package/dist/node/index.d.cts
CHANGED
|
@@ -6,7 +6,21 @@ type Logger = {
|
|
|
6
6
|
error: (message: string, ...arguments_: unknown[]) => void;
|
|
7
7
|
fatal: (message: string, ...arguments_: unknown[]) => void;
|
|
8
8
|
};
|
|
9
|
-
|
|
9
|
+
type EventEmitterOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* Logger instance for logging errors.
|
|
12
|
+
*/
|
|
13
|
+
logger?: Logger;
|
|
14
|
+
/**
|
|
15
|
+
* Whether to throw an error when emit 'error' and there are no listeners. Default is false and only emits an error event.
|
|
16
|
+
*/
|
|
17
|
+
throwOnEmitError?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Whether to throw on 'error' when there are no listeners. This is the standard functionality in EventEmitter
|
|
20
|
+
* @default false - in v2 this will be set to true by default
|
|
21
|
+
*/
|
|
22
|
+
throwOnEmptyListeners?: boolean;
|
|
23
|
+
};
|
|
10
24
|
type IEventEmitter = {
|
|
11
25
|
/**
|
|
12
26
|
* Registers a listener for the specified event.
|
|
@@ -152,21 +166,47 @@ type IEventEmitter = {
|
|
|
152
166
|
prependOnceListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
153
167
|
};
|
|
154
168
|
type EventListener = (...arguments_: any[]) => void;
|
|
155
|
-
type
|
|
169
|
+
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
170
|
+
type HookEntry = {
|
|
156
171
|
/**
|
|
157
|
-
*
|
|
172
|
+
* The event name for the hook
|
|
158
173
|
*/
|
|
159
|
-
|
|
174
|
+
event: string;
|
|
160
175
|
/**
|
|
161
|
-
*
|
|
176
|
+
* The handler function for the hook
|
|
162
177
|
*/
|
|
163
|
-
|
|
178
|
+
handler: Hook;
|
|
179
|
+
};
|
|
180
|
+
type HookifiedOptions = {
|
|
164
181
|
/**
|
|
165
|
-
* Whether
|
|
166
|
-
* @
|
|
182
|
+
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
183
|
+
* @deprecated - this will be deprecated in version 2. Please use throwOnHookError.
|
|
167
184
|
*/
|
|
168
|
-
|
|
169
|
-
|
|
185
|
+
throwHookErrors?: boolean;
|
|
186
|
+
/**
|
|
187
|
+
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
188
|
+
*/
|
|
189
|
+
throwOnHookError?: boolean;
|
|
190
|
+
/**
|
|
191
|
+
* Whether to enforce that all hook names start with 'before' or 'after'. Default is false.
|
|
192
|
+
* @type {boolean}
|
|
193
|
+
* @default false
|
|
194
|
+
*/
|
|
195
|
+
enforceBeforeAfter?: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Map of deprecated hook names to deprecation messages. When a deprecated hook is used, a warning will be emitted.
|
|
198
|
+
* @type {Map<string, string>}
|
|
199
|
+
* @default new Map()
|
|
200
|
+
*/
|
|
201
|
+
deprecatedHooks?: Map<string, string>;
|
|
202
|
+
/**
|
|
203
|
+
* Whether to allow deprecated hooks to be registered and executed. Default is true.
|
|
204
|
+
* @type {boolean}
|
|
205
|
+
* @default true
|
|
206
|
+
*/
|
|
207
|
+
allowDeprecated?: boolean;
|
|
208
|
+
} & EventEmitterOptions;
|
|
209
|
+
|
|
170
210
|
declare class Eventified implements IEventEmitter {
|
|
171
211
|
private readonly _eventListeners;
|
|
172
212
|
private _maxListeners;
|
|
@@ -306,48 +346,14 @@ declare class Eventified implements IEventEmitter {
|
|
|
306
346
|
* @returns {EventListener[]} An array of listeners
|
|
307
347
|
*/
|
|
308
348
|
getAllListeners(): EventListener[];
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
312
|
-
type HookEntry = {
|
|
313
349
|
/**
|
|
314
|
-
*
|
|
350
|
+
* Sends a log message using the configured logger based on the event name
|
|
351
|
+
* @param {string | symbol} eventName - The event name that determines the log level
|
|
352
|
+
* @param {unknown} data - The data to log
|
|
315
353
|
*/
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
*/
|
|
320
|
-
handler: Hook;
|
|
321
|
-
};
|
|
322
|
-
type HookifiedOptions = {
|
|
323
|
-
/**
|
|
324
|
-
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
325
|
-
* @deprecated - this will be deprecated in version 2. Please use throwOnHookError.
|
|
326
|
-
*/
|
|
327
|
-
throwHookErrors?: boolean;
|
|
328
|
-
/**
|
|
329
|
-
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
330
|
-
*/
|
|
331
|
-
throwOnHookError?: boolean;
|
|
332
|
-
/**
|
|
333
|
-
* Whether to enforce that all hook names start with 'before' or 'after'. Default is false.
|
|
334
|
-
* @type {boolean}
|
|
335
|
-
* @default false
|
|
336
|
-
*/
|
|
337
|
-
enforceBeforeAfter?: boolean;
|
|
338
|
-
/**
|
|
339
|
-
* Map of deprecated hook names to deprecation messages. When a deprecated hook is used, a warning will be emitted.
|
|
340
|
-
* @type {Map<string, string>}
|
|
341
|
-
* @default new Map()
|
|
342
|
-
*/
|
|
343
|
-
deprecatedHooks?: Map<string, string>;
|
|
344
|
-
/**
|
|
345
|
-
* Whether to allow deprecated hooks to be registered and executed. Default is true.
|
|
346
|
-
* @type {boolean}
|
|
347
|
-
* @default true
|
|
348
|
-
*/
|
|
349
|
-
allowDeprecated?: boolean;
|
|
350
|
-
} & EventEmitterOptions;
|
|
354
|
+
private sendLog;
|
|
355
|
+
}
|
|
356
|
+
|
|
351
357
|
declare class Hookified extends Eventified {
|
|
352
358
|
private readonly _hooks;
|
|
353
359
|
private _throwOnHookError;
|
|
@@ -523,4 +529,4 @@ declare class Hookified extends Eventified {
|
|
|
523
529
|
clearHooks(): void;
|
|
524
530
|
}
|
|
525
531
|
|
|
526
|
-
export { type EventListener, Eventified, type Hook, type HookEntry, Hookified, type HookifiedOptions, type Logger };
|
|
532
|
+
export { type EventEmitterOptions, type EventListener, Eventified, type Hook, type HookEntry, Hookified, type HookifiedOptions, type IEventEmitter, type Logger };
|
package/dist/node/index.d.ts
CHANGED
|
@@ -6,7 +6,21 @@ type Logger = {
|
|
|
6
6
|
error: (message: string, ...arguments_: unknown[]) => void;
|
|
7
7
|
fatal: (message: string, ...arguments_: unknown[]) => void;
|
|
8
8
|
};
|
|
9
|
-
|
|
9
|
+
type EventEmitterOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* Logger instance for logging errors.
|
|
12
|
+
*/
|
|
13
|
+
logger?: Logger;
|
|
14
|
+
/**
|
|
15
|
+
* Whether to throw an error when emit 'error' and there are no listeners. Default is false and only emits an error event.
|
|
16
|
+
*/
|
|
17
|
+
throwOnEmitError?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Whether to throw on 'error' when there are no listeners. This is the standard functionality in EventEmitter
|
|
20
|
+
* @default false - in v2 this will be set to true by default
|
|
21
|
+
*/
|
|
22
|
+
throwOnEmptyListeners?: boolean;
|
|
23
|
+
};
|
|
10
24
|
type IEventEmitter = {
|
|
11
25
|
/**
|
|
12
26
|
* Registers a listener for the specified event.
|
|
@@ -152,21 +166,47 @@ type IEventEmitter = {
|
|
|
152
166
|
prependOnceListener(eventName: string | symbol, listener: (...arguments_: any[]) => void): IEventEmitter;
|
|
153
167
|
};
|
|
154
168
|
type EventListener = (...arguments_: any[]) => void;
|
|
155
|
-
type
|
|
169
|
+
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
170
|
+
type HookEntry = {
|
|
156
171
|
/**
|
|
157
|
-
*
|
|
172
|
+
* The event name for the hook
|
|
158
173
|
*/
|
|
159
|
-
|
|
174
|
+
event: string;
|
|
160
175
|
/**
|
|
161
|
-
*
|
|
176
|
+
* The handler function for the hook
|
|
162
177
|
*/
|
|
163
|
-
|
|
178
|
+
handler: Hook;
|
|
179
|
+
};
|
|
180
|
+
type HookifiedOptions = {
|
|
164
181
|
/**
|
|
165
|
-
* Whether
|
|
166
|
-
* @
|
|
182
|
+
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
183
|
+
* @deprecated - this will be deprecated in version 2. Please use throwOnHookError.
|
|
167
184
|
*/
|
|
168
|
-
|
|
169
|
-
|
|
185
|
+
throwHookErrors?: boolean;
|
|
186
|
+
/**
|
|
187
|
+
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
188
|
+
*/
|
|
189
|
+
throwOnHookError?: boolean;
|
|
190
|
+
/**
|
|
191
|
+
* Whether to enforce that all hook names start with 'before' or 'after'. Default is false.
|
|
192
|
+
* @type {boolean}
|
|
193
|
+
* @default false
|
|
194
|
+
*/
|
|
195
|
+
enforceBeforeAfter?: boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Map of deprecated hook names to deprecation messages. When a deprecated hook is used, a warning will be emitted.
|
|
198
|
+
* @type {Map<string, string>}
|
|
199
|
+
* @default new Map()
|
|
200
|
+
*/
|
|
201
|
+
deprecatedHooks?: Map<string, string>;
|
|
202
|
+
/**
|
|
203
|
+
* Whether to allow deprecated hooks to be registered and executed. Default is true.
|
|
204
|
+
* @type {boolean}
|
|
205
|
+
* @default true
|
|
206
|
+
*/
|
|
207
|
+
allowDeprecated?: boolean;
|
|
208
|
+
} & EventEmitterOptions;
|
|
209
|
+
|
|
170
210
|
declare class Eventified implements IEventEmitter {
|
|
171
211
|
private readonly _eventListeners;
|
|
172
212
|
private _maxListeners;
|
|
@@ -306,48 +346,14 @@ declare class Eventified implements IEventEmitter {
|
|
|
306
346
|
* @returns {EventListener[]} An array of listeners
|
|
307
347
|
*/
|
|
308
348
|
getAllListeners(): EventListener[];
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
type Hook = (...arguments_: any[]) => Promise<void> | void;
|
|
312
|
-
type HookEntry = {
|
|
313
349
|
/**
|
|
314
|
-
*
|
|
350
|
+
* Sends a log message using the configured logger based on the event name
|
|
351
|
+
* @param {string | symbol} eventName - The event name that determines the log level
|
|
352
|
+
* @param {unknown} data - The data to log
|
|
315
353
|
*/
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
*/
|
|
320
|
-
handler: Hook;
|
|
321
|
-
};
|
|
322
|
-
type HookifiedOptions = {
|
|
323
|
-
/**
|
|
324
|
-
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
325
|
-
* @deprecated - this will be deprecated in version 2. Please use throwOnHookError.
|
|
326
|
-
*/
|
|
327
|
-
throwHookErrors?: boolean;
|
|
328
|
-
/**
|
|
329
|
-
* Whether an error should be thrown when a hook throws an error. Default is false and only emits an error event.
|
|
330
|
-
*/
|
|
331
|
-
throwOnHookError?: boolean;
|
|
332
|
-
/**
|
|
333
|
-
* Whether to enforce that all hook names start with 'before' or 'after'. Default is false.
|
|
334
|
-
* @type {boolean}
|
|
335
|
-
* @default false
|
|
336
|
-
*/
|
|
337
|
-
enforceBeforeAfter?: boolean;
|
|
338
|
-
/**
|
|
339
|
-
* Map of deprecated hook names to deprecation messages. When a deprecated hook is used, a warning will be emitted.
|
|
340
|
-
* @type {Map<string, string>}
|
|
341
|
-
* @default new Map()
|
|
342
|
-
*/
|
|
343
|
-
deprecatedHooks?: Map<string, string>;
|
|
344
|
-
/**
|
|
345
|
-
* Whether to allow deprecated hooks to be registered and executed. Default is true.
|
|
346
|
-
* @type {boolean}
|
|
347
|
-
* @default true
|
|
348
|
-
*/
|
|
349
|
-
allowDeprecated?: boolean;
|
|
350
|
-
} & EventEmitterOptions;
|
|
354
|
+
private sendLog;
|
|
355
|
+
}
|
|
356
|
+
|
|
351
357
|
declare class Hookified extends Eventified {
|
|
352
358
|
private readonly _hooks;
|
|
353
359
|
private _throwOnHookError;
|
|
@@ -523,4 +529,4 @@ declare class Hookified extends Eventified {
|
|
|
523
529
|
clearHooks(): void;
|
|
524
530
|
}
|
|
525
531
|
|
|
526
|
-
export { type EventListener, Eventified, type Hook, type HookEntry, Hookified, type HookifiedOptions, type Logger };
|
|
532
|
+
export { type EventEmitterOptions, type EventListener, Eventified, type Hook, type HookEntry, Hookified, type HookifiedOptions, type IEventEmitter, type Logger };
|
package/dist/node/index.js
CHANGED
|
@@ -219,6 +219,7 @@ var Eventified = class {
|
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
|
+
this.sendLog(event, arguments_);
|
|
222
223
|
return result;
|
|
223
224
|
}
|
|
224
225
|
/**
|
|
@@ -266,6 +267,54 @@ var Eventified = class {
|
|
|
266
267
|
}
|
|
267
268
|
return result;
|
|
268
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Sends a log message using the configured logger based on the event name
|
|
272
|
+
* @param {string | symbol} eventName - The event name that determines the log level
|
|
273
|
+
* @param {unknown} data - The data to log
|
|
274
|
+
*/
|
|
275
|
+
sendLog(eventName, data) {
|
|
276
|
+
if (!this._logger) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
let message;
|
|
280
|
+
if (typeof data === "string") {
|
|
281
|
+
message = data;
|
|
282
|
+
} else if (Array.isArray(data) && data.length > 0 && data[0] instanceof Error) {
|
|
283
|
+
message = data[0].message;
|
|
284
|
+
} else if (data instanceof Error) {
|
|
285
|
+
message = data.message;
|
|
286
|
+
} else if (Array.isArray(data) && data.length > 0 && typeof data[0]?.message === "string") {
|
|
287
|
+
message = data[0].message;
|
|
288
|
+
} else {
|
|
289
|
+
message = JSON.stringify(data);
|
|
290
|
+
}
|
|
291
|
+
switch (eventName) {
|
|
292
|
+
case "error": {
|
|
293
|
+
this._logger.error?.(message, { event: eventName, data });
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
case "warn": {
|
|
297
|
+
this._logger.warn?.(message, { event: eventName, data });
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
case "trace": {
|
|
301
|
+
this._logger.trace?.(message, { event: eventName, data });
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
case "debug": {
|
|
305
|
+
this._logger.debug?.(message, { event: eventName, data });
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
case "fatal": {
|
|
309
|
+
this._logger.fatal?.(message, { event: eventName, data });
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
default: {
|
|
313
|
+
this._logger.info?.(message, { event: eventName, data });
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
269
318
|
};
|
|
270
319
|
|
|
271
320
|
// src/index.ts
|
|
@@ -400,9 +449,6 @@ var Hookified = class extends Eventified {
|
|
|
400
449
|
const message = this._deprecatedHooks.get(event);
|
|
401
450
|
const warningMessage = `Hook "${event}" is deprecated${message ? `: ${message}` : ""}`;
|
|
402
451
|
this.emit("warn", { hook: event, message: warningMessage });
|
|
403
|
-
if (this.logger?.warn) {
|
|
404
|
-
this.logger.warn(warningMessage);
|
|
405
|
-
}
|
|
406
452
|
return this._allowDeprecated;
|
|
407
453
|
}
|
|
408
454
|
return true;
|
|
@@ -550,9 +596,6 @@ var Hookified = class extends Eventified {
|
|
|
550
596
|
} catch (error) {
|
|
551
597
|
const message = `${event}: ${error.message}`;
|
|
552
598
|
this.emit("error", new Error(message));
|
|
553
|
-
if (this.logger) {
|
|
554
|
-
this.logger.error(message);
|
|
555
|
-
}
|
|
556
599
|
if (this._throwOnHookError) {
|
|
557
600
|
throw new Error(message);
|
|
558
601
|
}
|
|
@@ -610,3 +653,4 @@ export {
|
|
|
610
653
|
Eventified,
|
|
611
654
|
Hookified
|
|
612
655
|
};
|
|
656
|
+
/* v8 ignore next -- @preserve */
|
package/package.json
CHANGED
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hookified",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Event Emitting and Middleware Hooks",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/node/index.
|
|
7
|
-
"module": "dist/node/index.js",
|
|
6
|
+
"main": "./dist/node/index.js",
|
|
7
|
+
"module": "./dist/node/index.js",
|
|
8
|
+
"types": "./dist/node/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
|
-
"import":
|
|
11
|
-
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/node/index.d.ts",
|
|
13
|
+
"default": "./dist/node/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/node/index.d.cts",
|
|
17
|
+
"default": "./dist/node/index.cjs"
|
|
18
|
+
},
|
|
19
|
+
"default": "./dist/node/index.js"
|
|
12
20
|
},
|
|
13
21
|
"./browser": {
|
|
14
22
|
"import": "./dist/browser/index.js",
|
|
15
23
|
"default": "./dist/browser/index.global.js"
|
|
16
24
|
}
|
|
17
25
|
},
|
|
18
|
-
"types": "dist/node/index.d.ts",
|
|
19
26
|
"scripts": {
|
|
20
27
|
"lint": "biome check --write --error-on-warnings",
|
|
21
28
|
"test": "pnpm lint && vitest run --coverage",
|
|
@@ -61,29 +68,24 @@
|
|
|
61
68
|
},
|
|
62
69
|
"homepage": "https://github.com/jaredwray/hookified#readme",
|
|
63
70
|
"devDependencies": {
|
|
64
|
-
"@biomejs/biome": "^2.3.
|
|
65
|
-
"@monstermann/tinybench-pretty-printer": "^0.
|
|
66
|
-
"@types/node": "^24.10.
|
|
67
|
-
"@vitest/coverage-v8": "^4.0.
|
|
68
|
-
"docula": "^0.31.
|
|
71
|
+
"@biomejs/biome": "^2.3.8",
|
|
72
|
+
"@monstermann/tinybench-pretty-printer": "^0.3.0",
|
|
73
|
+
"@types/node": "^24.10.1",
|
|
74
|
+
"@vitest/coverage-v8": "^4.0.15",
|
|
75
|
+
"docula": "^0.31.1",
|
|
69
76
|
"emittery": "^1.2.0",
|
|
70
77
|
"eventemitter3": "^5.0.1",
|
|
71
78
|
"hookable": "^5.5.3",
|
|
72
79
|
"pino": "^10.1.0",
|
|
73
|
-
"rimraf": "^6.1.
|
|
74
|
-
"tinybench": "^
|
|
75
|
-
"tsup": "^8.5.
|
|
76
|
-
"tsx": "^4.
|
|
80
|
+
"rimraf": "^6.1.2",
|
|
81
|
+
"tinybench": "^6.0.0",
|
|
82
|
+
"tsup": "^8.5.1",
|
|
83
|
+
"tsx": "^4.21.0",
|
|
77
84
|
"typescript": "^5.9.3",
|
|
78
|
-
"vitest": "^4.0.
|
|
85
|
+
"vitest": "^4.0.15"
|
|
79
86
|
},
|
|
80
87
|
"files": [
|
|
81
88
|
"dist",
|
|
82
89
|
"LICENSE"
|
|
83
|
-
]
|
|
84
|
-
"pnpm": {
|
|
85
|
-
"onlyBuiltDependencies": [
|
|
86
|
-
"unrs-resolver"
|
|
87
|
-
]
|
|
88
|
-
}
|
|
90
|
+
]
|
|
89
91
|
}
|