hookified 2.0.1 → 2.1.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 CHANGED
@@ -732,9 +732,14 @@ myClass.onHook({ event: 'before:myMethod', handler: async (data) => {
732
732
  this.hookSync('before:myMethod', data); // Only sync handler runs
733
733
  ```
734
734
 
735
- ## .onHook(hook, options?)
735
+ ## .onHook(hook, options?) / .onHook(event, handler)
736
736
 
737
- Subscribe to a hook event. Takes an `IHook` object and an optional `OnHookOptions` object. Returns the stored `IHook` (with `id` assigned), or `undefined` if the hook was blocked by deprecation. The returned reference is the exact object stored internally, which is useful for later removal with `.removeHook()` or `.removeHookById()`. To register multiple hooks at once, use `.onHooks()`.
737
+ Subscribe to a hook event. Supports two calling styles:
738
+
739
+ - **Object form**: `onHook(hook, options?)` — takes an `IHook` object and an optional `OnHookOptions` object.
740
+ - **Shorthand form**: `onHook(event, handler)` — takes an event name string and a handler function (v1-compatible).
741
+
742
+ Returns the stored `IHook` (with `id` assigned), or `undefined` if the hook was blocked by deprecation. The returned reference is the exact object stored internally, which is useful for later removal with `.removeHook()` or `.removeHookById()`. To register multiple hooks at once, use `.onHooks()`.
738
743
 
739
744
  If the hook has an `id`, it will be used as-is. If not, a UUID is auto-generated via `crypto.randomUUID()`. If a hook with the same `id` already exists on the same event, it will be **replaced in-place** (preserving its position in the array).
740
745
 
@@ -783,6 +788,11 @@ myClass.onHook({ event: 'before:save', handler: async (data) => {} }, { position
783
788
 
784
789
  // Insert at a specific index
785
790
  myClass.onHook({ event: 'before:save', handler: async (data) => {} }, { position: 1 });
791
+
792
+ // Shorthand form — pass event name and handler directly (v1-compatible)
793
+ myClass.onHook('before:save', async (data) => {
794
+ data.validated = true;
795
+ });
786
796
  ```
787
797
 
788
798
  ## .onHooks(Array, options?)
@@ -1247,15 +1257,17 @@ _Note: the `EventEmitter` version is Nodejs versioning._
1247
1257
 
1248
1258
  ## Quick Guide
1249
1259
 
1250
- v2 overhauls hook storage to use `IHook` objects instead of raw functions. This enables hook IDs, ordering via position, cloning control, and new hook types like `WaterfallHook`. The main change most users will notice is that `onHook` now takes an `IHook` object instead of positional arguments:
1260
+ v2 overhauls hook storage to use `IHook` objects instead of raw functions. This enables hook IDs, ordering via position, cloning control, and new hook types like `WaterfallHook`. `onHook` now supports both the v1 positional `(event, handler)` form and the new `IHook` object form, so this is **not a breaking change**:
1251
1261
 
1252
1262
  ```typescript
1253
- // v1 — positional arguments
1263
+ // v1 style still works
1254
1264
  hookified.onHook('before:save', async (data) => {});
1255
1265
 
1256
- // v2 — IHook object (or use addHook for positional args)
1266
+ // v2 style — IHook object with options support
1257
1267
  hookified.onHook({ event: 'before:save', handler: async (data) => {} });
1258
- hookified.addHook('before:save', async (data) => {}); // still works
1268
+
1269
+ // addHook also works as an alias for the positional form
1270
+ hookified.addHook('before:save', async (data) => {});
1259
1271
  ```
1260
1272
 
1261
1273
  **Other common changes:**
@@ -1278,7 +1290,7 @@ See below for full details on each change.
1278
1290
  - [`logger` renamed to `eventLogger`](#logger-renamed-to-eventlogger)
1279
1291
  - [`maxListeners` default changed from `100` to `0` (unlimited) and no longer truncates](#maxlisteners-default-changed-from-100-to-0-unlimited-and-no-longer-truncates)
1280
1292
  - [`onHookEntry` removed — use `onHook` instead](#onhookentry-removed--use-onhook-instead)
1281
- - [`onHook` signature changed](#onhook-signature-changed)
1293
+ - [`onHook` signature updated (not breaking)](#onhook-signature-updated)
1282
1294
  - [`HookEntry` type and `Hook` type removed](#hookentry-type-and-hook-type-removed)
1283
1295
  - [`removeHook` and `removeHooks` now return removed hooks](#removehook-and-removehooks-now-return-removed-hooks)
1284
1296
  - [`removeHook`, `removeHooks`, and `getHooks` no longer check for deprecated hooks](#removehook-removehooks-and-gethooks-no-longer-check-for-deprecated-hooks)
@@ -1303,7 +1315,7 @@ See below for full details on each change.
1303
1315
  | `logger` | Renamed to `eventLogger` |
1304
1316
  | `maxListeners` | Default changed from `100` to `0` (unlimited), no longer truncates |
1305
1317
  | `onHookEntry` | Removed — use `onHook` instead |
1306
- | `onHook` signature | Now takes `IHook` object instead of `(event, handler)` |
1318
+ | `onHook` signature | Now takes `IHook` object **or** `(event, handler)` — both supported (not breaking) |
1307
1319
  | `HookEntry` / `Hook` types | Replaced with `IHook` / `HookFn` |
1308
1320
  | `removeHook` / `removeHooks` | Now return removed hooks; no longer check deprecated status |
1309
1321
  | Internal hook storage | Uses `IHook` objects instead of raw functions |
@@ -1406,20 +1418,15 @@ hookified.onHookEntry({ event: 'before:save', handler: async (data) => {} });
1406
1418
  hookified.onHook({ event: 'before:save', handler: async (data) => {} });
1407
1419
  ```
1408
1420
 
1409
- ### `onHook` signature changed
1421
+ ### `onHook` signature updated
1410
1422
 
1411
- `onHook` no longer accepts positional `(event, handler)` arguments. It now takes a single `IHook` object or `Hook` class instance. Use `addHook(event, handler)` if you prefer positional arguments. Use `onHooks()` for bulk registration.
1412
-
1413
- **Before (v1):**
1423
+ `onHook` now supports both the v1 positional `(event, handler)` form and the new `IHook` object form. **This is not a breaking change** — existing v1 code continues to work. The `IHook` object form is recommended for new code as it supports hook IDs, positioning, and cloning options. You can also use `addHook(event, handler)` as an alias or `onHooks()` for bulk registration.
1414
1424
 
1415
1425
  ```typescript
1426
+ // v1 style — still works
1416
1427
  hookified.onHook('before:save', async (data) => {});
1417
- ```
1418
1428
 
1419
- **After (v2):**
1420
-
1421
- ```typescript
1422
- // Using IHook object
1429
+ // v2 style — IHook object with full options support
1423
1430
  hookified.onHook({ event: 'before:save', handler: async (data) => {} });
1424
1431
 
1425
1432
  // For multiple hooks, use onHooks
@@ -1428,7 +1435,7 @@ hookified.onHooks([
1428
1435
  { event: 'after:save', handler: async (data) => {} },
1429
1436
  ]);
1430
1437
 
1431
- // Or use addHook for positional args
1438
+ // addHook also works as an alias for positional args
1432
1439
  hookified.addHook('before:save', async (data) => {});
1433
1440
  ```
1434
1441
 
@@ -557,15 +557,21 @@
557
557
  set useHookClone(value) {
558
558
  this._useHookClone = value;
559
559
  }
560
- /**
561
- * Adds a handler function for a specific event.
562
- * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.
563
- * To register multiple hooks at once, use {@link onHooks}.
564
- * @param {IHook} hook - the hook containing event name and handler
565
- * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)
566
- * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation
567
- */
568
- onHook(hook, options) {
560
+ onHook(hookOrEvent, optionsOrHandler) {
561
+ let hook;
562
+ let options;
563
+ if (typeof hookOrEvent === "string") {
564
+ if (typeof optionsOrHandler !== "function") {
565
+ throw new TypeError(
566
+ "When calling onHook(event, handler), the second argument must be a function"
567
+ );
568
+ }
569
+ hook = { event: hookOrEvent, handler: optionsOrHandler };
570
+ options = void 0;
571
+ } else {
572
+ hook = hookOrEvent;
573
+ options = optionsOrHandler;
574
+ }
569
575
  this.validateHookName(hook.event);
570
576
  if (!this.checkDeprecatedHook(hook.event)) {
571
577
  return void 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/eventified.ts","../../src/hooks/hook.ts","../../src/hooks/waterfall-hook.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\nconst ERROR_EVENT = \"error\";\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<\n\t\tstring | symbol,\n\t\tEventListener | EventListener[]\n\t>;\n\tprivate _maxListeners: number;\n\tprivate _eventLogger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = true;\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<\n\t\t\tstring | symbol,\n\t\t\tEventListener | EventListener[]\n\t\t>();\n\t\tthis._maxListeners = 0; // Default is 0 (unlimited)\n\n\t\tthis._eventLogger = options?.eventLogger;\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 event logger\n\t * @returns {Logger}\n\t */\n\tpublic get eventLogger(): Logger | undefined {\n\t\treturn this._eventLogger;\n\t}\n\n\t/**\n\t * Sets the event logger\n\t * @param {Logger} eventLogger\n\t */\n\tpublic set eventLogger(eventLogger: Logger | undefined) {\n\t\tthis._eventLogger = eventLogger;\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\tlet count = 0;\n\t\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\t\tcount += typeof entry === \"function\" ? 1 : entry.length;\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\tconst entry = this._eventListeners.get(eventName);\n\t\tif (entry === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? 1 : entry.length;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 existing = this._eventListeners.get(eventName);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(eventName, listener);\n\t\t} else if (typeof existing === \"function\") {\n\t\t\tthis._eventListeners.set(eventName, [listener, existing]);\n\t\t} else {\n\t\t\texisting.unshift(listener);\n\t\t}\n\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\tconst existing = this._eventListeners.get(event);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(event, listener);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof existing === \"function\") {\n\t\t\tconst arr = [existing, listener];\n\t\t\tthis._eventListeners.set(event, arr);\n\t\t\tif (this._maxListeners > 0 && arr.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${arr.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\texisting.push(listener);\n\t\t\tif (this._maxListeners > 0 && existing.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${existing.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof entry === \"function\") {\n\t\t\tif (entry === listener) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tconst index = entry.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tif (entry.length === 2) {\n\t\t\t\tthis._eventListeners.set(event, entry[1 - index]);\n\t\t\t\t/* v8 ignore start -- @preserve: single-element arrays are stored as functions */\n\t\t\t} else if (entry.length === 1) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t\t/* v8 ignore stop */\n\t\t\t} else {\n\t\t\t\tentry.splice(index, 1);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tconst argumentLength = arguments_.length;\n\n\t\tif (entry !== undefined) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\tentry(arguments_[0]);\n\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\tentry(arguments_[0], arguments_[1]);\n\t\t\t\t} else {\n\t\t\t\t\tentry(...arguments_);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst snapshot = [...entry];\n\t\t\t\tfor (let i = 0; i < snapshot.length; i++) {\n\t\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0]);\n\t\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0], arguments_[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsnapshot[i](...arguments_);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult = true;\n\t\t}\n\n\t\t// send it to the logger\n\t\tif (this._eventLogger) {\n\t\t\tthis.sendToEventLogger(event, arguments_);\n\t\t}\n\n\t\tif (event === ERROR_EVENT && !result) {\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 || this._throwOnEmptyListeners) {\n\t\t\t\tthrow error;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 < 0 ? 0 : n;\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\tconst result: EventListener[] = [];\n\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tresult.push(entry);\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < entry.length; i++) {\n\t\t\t\t\tresult.push(entry[i]);\n\t\t\t\t}\n\t\t\t}\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 sendToEventLogger(eventName: string | symbol, data: any): void {\n\t\t/* v8 ignore next 3 -- @preserve: guarded by caller */\n\t\tif (!this._eventLogger) {\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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.fatal?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis._eventLogger.info?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { HookFn, IHook } from \"../types.js\";\n\n/**\n * Concrete implementation of the IHook interface.\n * Provides a convenient class-based way to create hook entries.\n */\nexport class Hook implements IHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\n\t/**\n\t * Creates a new Hook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {HookFn} handler - The handler function for the hook\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, handler: HookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.handler = handler;\n\t}\n}\n","import type {\n\tHookFn,\n\tIWaterfallHook,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"../types.js\";\n\n/**\n * A WaterfallHook chains multiple hook functions sequentially,\n * where each hook receives a context with the previous result,\n * initial arguments, and accumulated results. After all hooks\n * have executed, the final handler receives the transformed result.\n * Implements IHook for compatibility with Hookified.onHook().\n */\nexport class WaterfallHook implements IWaterfallHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\tpublic hooks: WaterfallHookFn[];\n\n\tprivate readonly _finalHandler: WaterfallHookFn;\n\n\t/**\n\t * Creates a new WaterfallHook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {WaterfallHookFn} finalHandler - The final handler function that receives the transformed result\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, finalHandler: WaterfallHookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.hooks = [];\n\t\tthis._finalHandler = finalHandler;\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tthis.handler = async (...arguments_: any[]) => {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: waterfall result type varies through the chain\n\t\t\tconst initialArgs: any =\n\t\t\t\targuments_.length === 1 ? arguments_[0] : arguments_;\n\t\t\tconst results: WaterfallHookResult[] = [];\n\n\t\t\tfor (const hook of this.hooks) {\n\t\t\t\tconst result = await hook({ initialArgs, results: [...results] });\n\t\t\t\tresults.push({ hook, result });\n\t\t\t}\n\n\t\t\tawait this._finalHandler({ initialArgs, results: [...results] });\n\t\t};\n\t}\n\n\t/**\n\t * Adds a hook function to the end of the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to add\n\t */\n\tpublic addHook(hook: WaterfallHookFn): void {\n\t\tthis.hooks.push(hook);\n\t}\n\n\t/**\n\t * Removes a specific hook function from the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to remove\n\t * @returns {boolean} true if the hook was found and removed\n\t */\n\tpublic removeHook(hook: WaterfallHookFn): boolean {\n\t\tconst index = this.hooks.indexOf(hook);\n\t\tif (index !== -1) {\n\t\t\tthis.hooks.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n","import { Eventified } from \"./eventified.js\";\nimport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"./types.js\";\n\nexport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n};\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, IHook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\tprivate _useHookClone = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\teventLogger: options?.eventLogger,\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}\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\n\t\tif (options?.useHookClone !== undefined) {\n\t\t\tthis._useHookClone = options.useHookClone;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, IHook[]>}\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 */\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 * Gets whether hook objects are cloned before storing. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get useHookClone() {\n\t\treturn this._useHookClone;\n\t}\n\n\t/**\n\t * Sets whether hook objects are cloned before storing. Default is true.\n\t * When false, the original IHook reference is stored directly.\n\t * @param {boolean} value\n\t */\n\tpublic set useHookClone(value) {\n\t\tthis._useHookClone = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event.\n\t * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.\n\t * To register multiple hooks at once, use {@link onHooks}.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic onHook(hook: IHook, options?: OnHookOptions): IHook | undefined {\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.event)) {\n\t\t\treturn undefined; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\n\t\tconst shouldClone = options?.useHookClone ?? this._useHookClone;\n\t\tconst entry: IHook = shouldClone\n\t\t\t? { id: hook.id, event: hook.event, handler: hook.handler }\n\t\t\t: hook;\n\n\t\tentry.id = entry.id ?? crypto.randomUUID();\n\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\t// Check for duplicate id — replace in-place if found\n\t\t\tconst existingIndex = eventHandlers.findIndex((h) => h.id === entry.id);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\teventHandlers[existingIndex] = entry;\n\t\t\t} else {\n\t\t\t\tconst position = options?.position ?? \"Bottom\";\n\t\t\t\tif (position === \"Top\") {\n\t\t\t\t\teventHandlers.unshift(entry);\n\t\t\t\t} else if (position === \"Bottom\") {\n\t\t\t\t\teventHandlers.push(entry);\n\t\t\t\t} else {\n\t\t\t\t\tconst index = Math.max(0, Math.min(position, eventHandlers.length));\n\t\t\t\t\teventHandlers.splice(index, 0, entry);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis._hooks.set(hook.event, [entry]);\n\t\t}\n\n\t\treturn entry;\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 - the event name\n\t * @param {HookFn} handler - the handler function\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: HookFn) {\n\t\tthis.onHook({ event, handler });\n\t}\n\n\t/**\n\t * Adds handler functions for specific events\n\t * @param {Array<IHook>} hooks\n\t * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: IHook[], options?: OnHookOptions) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook, options);\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 * Equivalent to calling `onHook(hook, { position: \"Top\" })`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\treturn this.onHook(hook, { ...options, position: \"Top\" });\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers.\n\t * Equivalent to calling `onHook` with a self-removing wrapper and `{ position: \"Top\" }`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependOnceHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\treturn this.onHook(\n\t\t\t{ id: hook.id, event: hook.event, handler: wrappedHandler },\n\t\t\t{ ...options, position: \"Top\" },\n\t\t);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler\n\t */\n\tpublic onceHook(hook: IHook) {\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.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 wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook({ id: hook.id, event: hook.event, handler: wrappedHandler });\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler to remove\n\t * @returns {IHook | undefined} the removed hook, or undefined if not found\n\t */\n\tpublic removeHook(hook: IHook): IHook | undefined {\n\t\tthis.validateHookName(hook.event);\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.handler === hook.handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(hook.event);\n\t\t\t\t}\n\n\t\t\t\treturn { event: hook.event, handler: hook.handler };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes multiple hook handlers\n\t * @param {Array<IHook>} hooks\n\t * @returns {IHook[]} the hooks that were successfully removed\n\t */\n\tpublic removeHooks(hooks: IHook[]): IHook[] {\n\t\tconst removed: IHook[] = [];\n\t\tfor (const hook of hooks) {\n\t\t\tconst result = this.removeHook(hook);\n\t\t\tif (result) {\n\t\t\t\tremoved.push(result);\n\t\t\t}\n\t\t}\n\n\t\treturn removed;\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 hook of [...eventHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\tawait hook.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 * Calls all synchronous handlers for a specific event.\n\t * Async handlers (declared with `async` keyword) are silently skipped.\n\t *\n\t * Note: The `hook` method is preferred as it executes both sync and async functions.\n\t * Use `hookSync` only when you specifically need synchronous execution.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {void}\n\t */\n\tpublic hookSync<T>(event: string, ...arguments_: T[]): void {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const hook of [...eventHandlers]) {\n\t\t\t\t// Skip async functions silently\n\t\t\t\tif (hook.handler.constructor.name === \"AsyncFunction\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\thook.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 {IHook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Gets a specific hook by id, searching across all events\n\t * @param {string} id - the hook id\n\t * @returns {IHook | undefined} the hook if found, or undefined\n\t */\n\tpublic getHook(id: string): IHook | undefined {\n\t\tfor (const eventHandlers of this._hooks.values()) {\n\t\t\tconst found = eventHandlers.find((h) => h.id === id);\n\t\t\tif (found) {\n\t\t\t\treturn found;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes one or more hooks by id, searching across all events\n\t * @param {string | string[]} id - the hook id or array of hook ids to remove\n\t * @returns {IHook | IHook[] | undefined} the removed hook(s), or undefined/empty array if not found\n\t */\n\tpublic removeHookById(id: string | string[]): IHook | IHook[] | undefined {\n\t\tif (Array.isArray(id)) {\n\t\t\tconst removed: IHook[] = [];\n\t\t\tfor (const singleId of id) {\n\t\t\t\tconst result = this.removeHookById(singleId);\n\t\t\t\tif (result && !Array.isArray(result)) {\n\t\t\t\t\tremoved.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\tfor (const [event, eventHandlers] of this._hooks.entries()) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.id === id);\n\t\t\tif (index !== -1) {\n\t\t\t\tconst [removed] = eventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(event);\n\t\t\t\t}\n\n\t\t\t\treturn removed;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\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\t/**\n\t * Removes all hooks for a specific event and returns the removed hooks.\n\t * @param {string} event - The event name to remove hooks for.\n\t * @returns {IHook[]} the hooks that were removed\n\t */\n\tpublic removeEventHooks(event: string): IHook[] {\n\t\tthis.validateHookName(event);\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst removed = [...eventHandlers];\n\t\t\tthis._hooks.delete(event);\n\t\t\treturn removed;\n\t\t}\n\n\t\treturn [];\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\nexport { Eventified } from \"./eventified.js\";\nexport { Hook } from \"./hooks/hook.js\";\nexport { WaterfallHook } from \"./hooks/waterfall-hook.js\";\nexport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n"],"mappings":"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","names":["entry"]}
1
+ {"version":3,"sources":["../../src/eventified.ts","../../src/hooks/hook.ts","../../src/hooks/waterfall-hook.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\nconst ERROR_EVENT = \"error\";\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<\n\t\tstring | symbol,\n\t\tEventListener | EventListener[]\n\t>;\n\tprivate _maxListeners: number;\n\tprivate _eventLogger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = true;\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<\n\t\t\tstring | symbol,\n\t\t\tEventListener | EventListener[]\n\t\t>();\n\t\tthis._maxListeners = 0; // Default is 0 (unlimited)\n\n\t\tthis._eventLogger = options?.eventLogger;\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 event logger\n\t * @returns {Logger}\n\t */\n\tpublic get eventLogger(): Logger | undefined {\n\t\treturn this._eventLogger;\n\t}\n\n\t/**\n\t * Sets the event logger\n\t * @param {Logger} eventLogger\n\t */\n\tpublic set eventLogger(eventLogger: Logger | undefined) {\n\t\tthis._eventLogger = eventLogger;\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\tlet count = 0;\n\t\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\t\tcount += typeof entry === \"function\" ? 1 : entry.length;\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\tconst entry = this._eventListeners.get(eventName);\n\t\tif (entry === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? 1 : entry.length;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 existing = this._eventListeners.get(eventName);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(eventName, listener);\n\t\t} else if (typeof existing === \"function\") {\n\t\t\tthis._eventListeners.set(eventName, [listener, existing]);\n\t\t} else {\n\t\t\texisting.unshift(listener);\n\t\t}\n\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\tconst existing = this._eventListeners.get(event);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(event, listener);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof existing === \"function\") {\n\t\t\tconst arr = [existing, listener];\n\t\t\tthis._eventListeners.set(event, arr);\n\t\t\tif (this._maxListeners > 0 && arr.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${arr.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\texisting.push(listener);\n\t\t\tif (this._maxListeners > 0 && existing.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${existing.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof entry === \"function\") {\n\t\t\tif (entry === listener) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tconst index = entry.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tif (entry.length === 2) {\n\t\t\t\tthis._eventListeners.set(event, entry[1 - index]);\n\t\t\t\t/* v8 ignore start -- @preserve: single-element arrays are stored as functions */\n\t\t\t} else if (entry.length === 1) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t\t/* v8 ignore stop */\n\t\t\t} else {\n\t\t\t\tentry.splice(index, 1);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tconst argumentLength = arguments_.length;\n\n\t\tif (entry !== undefined) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\tentry(arguments_[0]);\n\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\tentry(arguments_[0], arguments_[1]);\n\t\t\t\t} else {\n\t\t\t\t\tentry(...arguments_);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst snapshot = [...entry];\n\t\t\t\tfor (let i = 0; i < snapshot.length; i++) {\n\t\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0]);\n\t\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0], arguments_[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsnapshot[i](...arguments_);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult = true;\n\t\t}\n\n\t\t// send it to the logger\n\t\tif (this._eventLogger) {\n\t\t\tthis.sendToEventLogger(event, arguments_);\n\t\t}\n\n\t\tif (event === ERROR_EVENT && !result) {\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 || this._throwOnEmptyListeners) {\n\t\t\t\tthrow error;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 < 0 ? 0 : n;\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\tconst result: EventListener[] = [];\n\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tresult.push(entry);\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < entry.length; i++) {\n\t\t\t\t\tresult.push(entry[i]);\n\t\t\t\t}\n\t\t\t}\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 sendToEventLogger(eventName: string | symbol, data: any): void {\n\t\t/* v8 ignore next 3 -- @preserve: guarded by caller */\n\t\tif (!this._eventLogger) {\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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.fatal?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis._eventLogger.info?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { HookFn, IHook } from \"../types.js\";\n\n/**\n * Concrete implementation of the IHook interface.\n * Provides a convenient class-based way to create hook entries.\n */\nexport class Hook implements IHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\n\t/**\n\t * Creates a new Hook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {HookFn} handler - The handler function for the hook\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, handler: HookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.handler = handler;\n\t}\n}\n","import type {\n\tHookFn,\n\tIWaterfallHook,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"../types.js\";\n\n/**\n * A WaterfallHook chains multiple hook functions sequentially,\n * where each hook receives a context with the previous result,\n * initial arguments, and accumulated results. After all hooks\n * have executed, the final handler receives the transformed result.\n * Implements IHook for compatibility with Hookified.onHook().\n */\nexport class WaterfallHook implements IWaterfallHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\tpublic hooks: WaterfallHookFn[];\n\n\tprivate readonly _finalHandler: WaterfallHookFn;\n\n\t/**\n\t * Creates a new WaterfallHook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {WaterfallHookFn} finalHandler - The final handler function that receives the transformed result\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, finalHandler: WaterfallHookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.hooks = [];\n\t\tthis._finalHandler = finalHandler;\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tthis.handler = async (...arguments_: any[]) => {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: waterfall result type varies through the chain\n\t\t\tconst initialArgs: any =\n\t\t\t\targuments_.length === 1 ? arguments_[0] : arguments_;\n\t\t\tconst results: WaterfallHookResult[] = [];\n\n\t\t\tfor (const hook of this.hooks) {\n\t\t\t\tconst result = await hook({ initialArgs, results: [...results] });\n\t\t\t\tresults.push({ hook, result });\n\t\t\t}\n\n\t\t\tawait this._finalHandler({ initialArgs, results: [...results] });\n\t\t};\n\t}\n\n\t/**\n\t * Adds a hook function to the end of the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to add\n\t */\n\tpublic addHook(hook: WaterfallHookFn): void {\n\t\tthis.hooks.push(hook);\n\t}\n\n\t/**\n\t * Removes a specific hook function from the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to remove\n\t * @returns {boolean} true if the hook was found and removed\n\t */\n\tpublic removeHook(hook: WaterfallHookFn): boolean {\n\t\tconst index = this.hooks.indexOf(hook);\n\t\tif (index !== -1) {\n\t\t\tthis.hooks.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n","import { Eventified } from \"./eventified.js\";\nimport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"./types.js\";\n\nexport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n};\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, IHook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\tprivate _useHookClone = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\teventLogger: options?.eventLogger,\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}\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\n\t\tif (options?.useHookClone !== undefined) {\n\t\t\tthis._useHookClone = options.useHookClone;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, IHook[]>}\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 */\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 * Gets whether hook objects are cloned before storing. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get useHookClone() {\n\t\treturn this._useHookClone;\n\t}\n\n\t/**\n\t * Sets whether hook objects are cloned before storing. Default is true.\n\t * When false, the original IHook reference is stored directly.\n\t * @param {boolean} value\n\t */\n\tpublic set useHookClone(value) {\n\t\tthis._useHookClone = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event.\n\t * Supports both object and legacy signatures:\n\t * onHook({ event, handler }, options?)\n\t * onHook(event, handler)\n\t * To register multiple hooks at once, use {@link onHooks}.\n\t * @param {IHook | string} hookOrEvent - the hook object or event name\n\t * @param {OnHookOptions | HookFn} [optionsOrHandler] - options (when using object form) or handler function (when using string form)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic onHook(hook: IHook, options?: OnHookOptions): IHook | undefined;\n\tpublic onHook(event: string, handler: HookFn): IHook | undefined;\n\tpublic onHook(\n\t\thookOrEvent: IHook | string,\n\t\toptionsOrHandler?: OnHookOptions | HookFn,\n\t): IHook | undefined {\n\t\tlet hook: IHook;\n\t\tlet options: OnHookOptions | undefined;\n\n\t\tif (typeof hookOrEvent === \"string\") {\n\t\t\tif (typeof optionsOrHandler !== \"function\") {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\"When calling onHook(event, handler), the second argument must be a function\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\thook = { event: hookOrEvent, handler: optionsOrHandler };\n\t\t\toptions = undefined;\n\t\t} else {\n\t\t\thook = hookOrEvent;\n\t\t\toptions = optionsOrHandler as OnHookOptions | undefined;\n\t\t}\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.event)) {\n\t\t\treturn undefined; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\n\t\tconst shouldClone = options?.useHookClone ?? this._useHookClone;\n\t\tconst entry: IHook = shouldClone\n\t\t\t? { id: hook.id, event: hook.event, handler: hook.handler }\n\t\t\t: hook;\n\n\t\tentry.id = entry.id ?? crypto.randomUUID();\n\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\t// Check for duplicate id — replace in-place if found\n\t\t\tconst existingIndex = eventHandlers.findIndex((h) => h.id === entry.id);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\teventHandlers[existingIndex] = entry;\n\t\t\t} else {\n\t\t\t\tconst position = options?.position ?? \"Bottom\";\n\t\t\t\tif (position === \"Top\") {\n\t\t\t\t\teventHandlers.unshift(entry);\n\t\t\t\t} else if (position === \"Bottom\") {\n\t\t\t\t\teventHandlers.push(entry);\n\t\t\t\t} else {\n\t\t\t\t\tconst index = Math.max(0, Math.min(position, eventHandlers.length));\n\t\t\t\t\teventHandlers.splice(index, 0, entry);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis._hooks.set(hook.event, [entry]);\n\t\t}\n\n\t\treturn entry;\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 - the event name\n\t * @param {HookFn} handler - the handler function\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: HookFn) {\n\t\tthis.onHook({ event, handler });\n\t}\n\n\t/**\n\t * Adds handler functions for specific events\n\t * @param {Array<IHook>} hooks\n\t * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: IHook[], options?: OnHookOptions) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook, options);\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 * Equivalent to calling `onHook(hook, { position: \"Top\" })`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\treturn this.onHook(hook, { ...options, position: \"Top\" });\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers.\n\t * Equivalent to calling `onHook` with a self-removing wrapper and `{ position: \"Top\" }`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependOnceHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\treturn this.onHook(\n\t\t\t{ id: hook.id, event: hook.event, handler: wrappedHandler },\n\t\t\t{ ...options, position: \"Top\" },\n\t\t);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler\n\t */\n\tpublic onceHook(hook: IHook) {\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.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 wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook({ id: hook.id, event: hook.event, handler: wrappedHandler });\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler to remove\n\t * @returns {IHook | undefined} the removed hook, or undefined if not found\n\t */\n\tpublic removeHook(hook: IHook): IHook | undefined {\n\t\tthis.validateHookName(hook.event);\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.handler === hook.handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(hook.event);\n\t\t\t\t}\n\n\t\t\t\treturn { event: hook.event, handler: hook.handler };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes multiple hook handlers\n\t * @param {Array<IHook>} hooks\n\t * @returns {IHook[]} the hooks that were successfully removed\n\t */\n\tpublic removeHooks(hooks: IHook[]): IHook[] {\n\t\tconst removed: IHook[] = [];\n\t\tfor (const hook of hooks) {\n\t\t\tconst result = this.removeHook(hook);\n\t\t\tif (result) {\n\t\t\t\tremoved.push(result);\n\t\t\t}\n\t\t}\n\n\t\treturn removed;\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 hook of [...eventHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\tawait hook.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 * Calls all synchronous handlers for a specific event.\n\t * Async handlers (declared with `async` keyword) are silently skipped.\n\t *\n\t * Note: The `hook` method is preferred as it executes both sync and async functions.\n\t * Use `hookSync` only when you specifically need synchronous execution.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {void}\n\t */\n\tpublic hookSync<T>(event: string, ...arguments_: T[]): void {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const hook of [...eventHandlers]) {\n\t\t\t\t// Skip async functions silently\n\t\t\t\tif (hook.handler.constructor.name === \"AsyncFunction\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\thook.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 {IHook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Gets a specific hook by id, searching across all events\n\t * @param {string} id - the hook id\n\t * @returns {IHook | undefined} the hook if found, or undefined\n\t */\n\tpublic getHook(id: string): IHook | undefined {\n\t\tfor (const eventHandlers of this._hooks.values()) {\n\t\t\tconst found = eventHandlers.find((h) => h.id === id);\n\t\t\tif (found) {\n\t\t\t\treturn found;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes one or more hooks by id, searching across all events\n\t * @param {string | string[]} id - the hook id or array of hook ids to remove\n\t * @returns {IHook | IHook[] | undefined} the removed hook(s), or undefined/empty array if not found\n\t */\n\tpublic removeHookById(id: string | string[]): IHook | IHook[] | undefined {\n\t\tif (Array.isArray(id)) {\n\t\t\tconst removed: IHook[] = [];\n\t\t\tfor (const singleId of id) {\n\t\t\t\tconst result = this.removeHookById(singleId);\n\t\t\t\tif (result && !Array.isArray(result)) {\n\t\t\t\t\tremoved.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\tfor (const [event, eventHandlers] of this._hooks.entries()) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.id === id);\n\t\t\tif (index !== -1) {\n\t\t\t\tconst [removed] = eventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(event);\n\t\t\t\t}\n\n\t\t\t\treturn removed;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\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\t/**\n\t * Removes all hooks for a specific event and returns the removed hooks.\n\t * @param {string} event - The event name to remove hooks for.\n\t * @returns {IHook[]} the hooks that were removed\n\t */\n\tpublic removeEventHooks(event: string): IHook[] {\n\t\tthis.validateHookName(event);\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst removed = [...eventHandlers];\n\t\t\tthis._hooks.delete(event);\n\t\t\treturn removed;\n\t\t}\n\n\t\treturn [];\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\nexport { Eventified } from \"./eventified.js\";\nexport { Hook } from \"./hooks/hook.js\";\nexport { WaterfallHook } from \"./hooks/waterfall-hook.js\";\nexport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n"],"mappings":";;;;;;;AAUA,MAAM,cAAc;AAEb,MAAM,aAAN,MAA0C;AAAA,IAUhD,YAAY,SAA+B;AAT3C,0BAAiB;AAIjB,0BAAQ;AACR,0BAAQ;AACR,0BAAQ,qBAAoB;AAC5B,0BAAQ,0BAAyB;AAGhC,WAAK,kBAAkB,oBAAI,IAGzB;AACF,WAAK,gBAAgB;AAErB,WAAK,eAAe,SAAS;AAE7B,UAAI,SAAS,qBAAqB,QAAW;AAC5C,aAAK,oBAAoB,QAAQ;AAAA,MAClC;AAEA,UAAI,SAAS,0BAA0B,QAAW;AACjD,aAAK,yBAAyB,QAAQ;AAAA,MACvC;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,cAAkC;AAC5C,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,YAAY,aAAiC;AACvD,WAAK,eAAe;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,mBAA4B;AACtC,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,iBAAiB,OAAgB;AAC3C,WAAK,oBAAoB;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,wBAAiC;AAC3C,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,sBAAsB,OAAgB;AAChD,WAAK,yBAAyB;AAAA,IAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,KACN,WACA,UACgB;AAChB,YAAM,eAA8B,IAAI,eAAsB;AAC7D,aAAK,IAAI,WAAqB,YAAY;AAC1C,iBAAS,GAAG,UAAU;AAAA,MACvB;AAEA,WAAK,GAAG,WAAqB,YAAY;AACzC,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,cAAc,WAAqC;AACzD,UAAI,cAAc,QAAW;AAC5B,YAAI,QAAQ;AACZ,mBAAWA,UAAS,KAAK,gBAAgB,OAAO,GAAG;AAClD,mBAAS,OAAOA,WAAU,aAAa,IAAIA,OAAM;AAAA,QAClD;AAEA,eAAO;AAAA,MACR;AAEA,YAAM,QAAQ,KAAK,gBAAgB,IAAI,SAAS;AAChD,UAAI,UAAU,QAAW;AACxB,eAAO;AAAA,MACR;AAEA,aAAO,OAAO,UAAU,aAAa,IAAI,MAAM;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMO,aAAqC;AAC3C,aAAO,CAAC,GAAG,KAAK,gBAAgB,KAAK,CAAC;AAAA,IACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,aAAa,OAA0C;AAC7D,UAAI,UAAU,QAAW;AACxB,eAAO,KAAK,gBAAgB;AAAA,MAC7B;AAEA,YAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,UAAI,UAAU,QAAW;AACxB,eAAO,CAAC;AAAA,MACT;AAEA,aAAO,OAAO,UAAU,aAAa,CAAC,KAAK,IAAI;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,gBACN,WACA,UACgB;AAChB,YAAM,WAAW,KAAK,gBAAgB,IAAI,SAAS;AAEnD,UAAI,aAAa,QAAW;AAC3B,aAAK,gBAAgB,IAAI,WAAW,QAAQ;AAAA,MAC7C,WAAW,OAAO,aAAa,YAAY;AAC1C,aAAK,gBAAgB,IAAI,WAAW,CAAC,UAAU,QAAQ,CAAC;AAAA,MACzD,OAAO;AACN,iBAAS,QAAQ,QAAQ;AAAA,MAC1B;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,oBACN,WACA,UACgB;AAChB,YAAM,eAA8B,IAAI,eAAsB;AAC7D,aAAK,IAAI,WAAqB,YAAY;AAC1C,iBAAS,GAAG,UAAU;AAAA,MACvB;AAEA,WAAK,gBAAgB,WAAqB,YAAY;AACtD,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA,IAMO,eAAuB;AAC7B,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,YACN,OACA,UACgB;AAChB,WAAK,GAAG,OAAO,QAAQ;AACvB,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,GAAG,OAAwB,UAAwC;AACzE,YAAM,WAAW,KAAK,gBAAgB,IAAI,KAAK;AAE/C,UAAI,aAAa,QAAW;AAC3B,aAAK,gBAAgB,IAAI,OAAO,QAAQ;AACxC,eAAO;AAAA,MACR;AAEA,UAAI,OAAO,aAAa,YAAY;AACnC,cAAM,MAAM,CAAC,UAAU,QAAQ;AAC/B,aAAK,gBAAgB,IAAI,OAAO,GAAG;AACnC,YAAI,KAAK,gBAAgB,KAAK,IAAI,SAAS,KAAK,eAAe;AAC9D,kBAAQ;AAAA,YACP,qEAAqE,IAAI,MAAM,IAAI,KAAe;AAAA,UACnG;AAAA,QACD;AAAA,MACD,OAAO;AACN,iBAAS,KAAK,QAAQ;AACtB,YAAI,KAAK,gBAAgB,KAAK,SAAS,SAAS,KAAK,eAAe;AACnE,kBAAQ;AAAA,YACP,qEAAqE,SAAS,MAAM,IAAI,KAAe;AAAA,UACxG;AAAA,QACD;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,eAAe,OAAe,UAAwC;AAC5E,WAAK,IAAI,OAAO,QAAQ;AACxB,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,IAAI,OAAwB,UAAwC;AAC1E,YAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,UAAI,UAAU,QAAW;AACxB,eAAO;AAAA,MACR;AAEA,UAAI,OAAO,UAAU,YAAY;AAChC,YAAI,UAAU,UAAU;AACvB,eAAK,gBAAgB,OAAO,KAAK;AAAA,QAClC;AAEA,eAAO;AAAA,MACR;AAEA,YAAM,QAAQ,MAAM,QAAQ,QAAQ;AACpC,UAAI,UAAU,IAAI;AACjB,YAAI,MAAM,WAAW,GAAG;AACvB,eAAK,gBAAgB,IAAI,OAAO,MAAM,IAAI,KAAK,CAAC;AAAA,QAEjD,WAAW,MAAM,WAAW,GAAG;AAC9B,eAAK,gBAAgB,OAAO,KAAK;AAAA,QAElC,OAAO;AACN,gBAAM,OAAO,OAAO,CAAC;AAAA,QACtB;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,KAAK,UAA2B,YAA4B;AAClE,UAAI,SAAS;AACb,YAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,YAAM,iBAAiB,WAAW;AAElC,UAAI,UAAU,QAAW;AACxB,YAAI,OAAO,UAAU,YAAY;AAChC,cAAI,mBAAmB,GAAG;AACzB,kBAAM,WAAW,CAAC,CAAC;AAAA,UACpB,WAAW,mBAAmB,GAAG;AAChC,kBAAM,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,UACnC,OAAO;AACN,kBAAM,GAAG,UAAU;AAAA,UACpB;AAAA,QACD,OAAO;AACN,gBAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,mBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACzC,gBAAI,mBAAmB,GAAG;AACzB,uBAAS,CAAC,EAAE,WAAW,CAAC,CAAC;AAAA,YAC1B,WAAW,mBAAmB,GAAG;AAChC,uBAAS,CAAC,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,YACzC,OAAO;AACN,uBAAS,CAAC,EAAE,GAAG,UAAU;AAAA,YAC1B;AAAA,UACD;AAAA,QACD;AAEA,iBAAS;AAAA,MACV;AAGA,UAAI,KAAK,cAAc;AACtB,aAAK,kBAAkB,OAAO,UAAU;AAAA,MACzC;AAEA,UAAI,UAAU,eAAe,CAAC,QAAQ;AACrC,cAAM,QACL,WAAW,CAAC,aAAa,QACtB,WAAW,CAAC,IACZ,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE;AAEhC,YAAI,KAAK,qBAAqB,KAAK,wBAAwB;AAC1D,gBAAM;AAAA,QACP;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,UAAU,OAAyC;AACzD,YAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,UAAI,UAAU,QAAW;AACxB,eAAO,CAAC;AAAA,MACT;AAEA,aAAO,OAAO,UAAU,aAAa,CAAC,KAAK,IAAI;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,mBAAmB,OAAwC;AACjE,UAAI,UAAU,QAAW;AACxB,aAAK,gBAAgB,OAAO,KAAK;AAAA,MAClC,OAAO;AACN,aAAK,gBAAgB,MAAM;AAAA,MAC5B;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,gBAAgB,GAAiB;AACvC,WAAK,gBAAgB,IAAI,IAAI,IAAI;AAAA,IAClC;AAAA;AAAA;AAAA;AAAA;AAAA,IAMO,kBAAmC;AACzC,YAAM,SAA0B,CAAC;AACjC,iBAAW,SAAS,KAAK,gBAAgB,OAAO,GAAG;AAClD,YAAI,OAAO,UAAU,YAAY;AAChC,iBAAO,KAAK,KAAK;AAAA,QAClB,OAAO;AACN,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,mBAAO,KAAK,MAAM,CAAC,CAAC;AAAA,UACrB;AAAA,QACD;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,kBAAkB,WAA4B,MAAiB;AAEtE,UAAI,CAAC,KAAK,cAAc;AACvB;AAAA,MACD;AAEA,UAAI;AAEJ,UAAI,OAAO,SAAS,UAAU;AAC7B,kBAAU;AAAA,MACX,WACC,MAAM,QAAQ,IAAI,KAClB,KAAK,SAAS,KACd,KAAK,CAAC,aAAa,OAClB;AACD,kBAAU,KAAK,CAAC,EAAE;AAAA,MAEnB,WAAW,gBAAgB,OAAO;AACjC,kBAAU,KAAK;AAAA,MAChB,WACC,MAAM,QAAQ,IAAI,KAClB,KAAK,SAAS,KACd,OAAO,KAAK,CAAC,GAAG,YAAY,UAC3B;AACD,kBAAU,KAAK,CAAC,EAAE;AAAA,MACnB,OAAO;AACN,kBAAU,KAAK,UAAU,IAAI;AAAA,MAC9B;AAEA,cAAQ,WAAW;AAAA,QAClB,KAAK,SAAS;AACb,eAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,QACD;AAAA,QAEA,KAAK,QAAQ;AACZ,eAAK,aAAa,OAAO,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC5D;AAAA,QACD;AAAA,QAEA,KAAK,SAAS;AACb,eAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,QACD;AAAA,QAEA,KAAK,SAAS;AACb,eAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,QACD;AAAA,QAEA,KAAK,SAAS;AACb,eAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,QACD;AAAA,QAEA,SAAS;AACR,eAAK,aAAa,OAAO,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC5D;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;;;ACzdO,MAAM,OAAN,MAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWlC,YAAY,OAAe,SAAiB,IAAa;AAVzD,0BAAO;AACP,0BAAO;AACP,0BAAO;AASN,WAAK,KAAK;AACV,WAAK,QAAQ;AACb,WAAK,UAAU;AAAA,IAChB;AAAA,EACD;;;ACRO,MAAM,gBAAN,MAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcpD,YAAY,OAAe,cAA+B,IAAa;AAbvE,0BAAO;AACP,0BAAO;AACP,0BAAO;AACP,0BAAO;AAEP,0BAAiB;AAShB,WAAK,KAAK;AACV,WAAK,QAAQ;AACb,WAAK,QAAQ,CAAC;AACd,WAAK,gBAAgB;AAGrB,WAAK,UAAU,UAAU,eAAsB;AAE9C,cAAM,cACL,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI;AAC3C,cAAM,UAAiC,CAAC;AAExC,mBAAW,QAAQ,KAAK,OAAO;AAC9B,gBAAM,SAAS,MAAM,KAAK,EAAE,aAAa,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAChE,kBAAQ,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,QAC9B;AAEA,cAAM,KAAK,cAAc,EAAE,aAAa,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,MAChE;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMO,QAAQ,MAA6B;AAC3C,WAAK,MAAM,KAAK,IAAI;AAAA,IACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,WAAW,MAAgC;AACjD,YAAM,QAAQ,KAAK,MAAM,QAAQ,IAAI;AACrC,UAAI,UAAU,IAAI;AACjB,aAAK,MAAM,OAAO,OAAO,CAAC;AAC1B,eAAO;AAAA,MACR;AAEA,aAAO;AAAA,IACR;AAAA,EACD;;;AC/CO,MAAM,YAAN,cAAwB,WAAW;AAAA,IAQzC,YAAY,SAA4B;AACvC,YAAM;AAAA,QACL,aAAa,SAAS;AAAA,QACtB,kBAAkB,SAAS;AAAA,QAC3B,uBAAuB,SAAS;AAAA,MACjC,CAAC;AAZF,0BAAiB;AACjB,0BAAQ,qBAAoB;AAC5B,0BAAQ,uBAAsB;AAC9B,0BAAQ;AACR,0BAAQ,oBAAmB;AAC3B,0BAAQ,iBAAgB;AAQvB,WAAK,SAAS,oBAAI,IAAI;AACtB,WAAK,mBAAmB,SAAS,kBAC9B,IAAI,IAAI,QAAQ,eAAe,IAC/B,oBAAI,IAAI;AAEX,UAAI,SAAS,qBAAqB,QAAW;AAC5C,aAAK,oBAAoB,QAAQ;AAAA,MAClC;AAEA,UAAI,SAAS,uBAAuB,QAAW;AAC9C,aAAK,sBAAsB,QAAQ;AAAA,MACpC;AAEA,UAAI,SAAS,oBAAoB,QAAW;AAC3C,aAAK,mBAAmB,QAAQ;AAAA,MACjC;AAEA,UAAI,SAAS,iBAAiB,QAAW;AACxC,aAAK,gBAAgB,QAAQ;AAAA,MAC9B;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,QAAQ;AAClB,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,mBAAmB;AAC7B,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,iBAAiB,OAAO;AAClC,WAAK,oBAAoB;AAAA,IAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,IAAW,qBAAqB;AAC/B,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,mBAAmB,OAAO;AACpC,WAAK,sBAAsB;AAAA,IAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,kBAAkB;AAC5B,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,gBAAgB,OAAO;AACjC,WAAK,mBAAmB;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,kBAAkB;AAC5B,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,gBAAgB,OAAO;AACjC,WAAK,mBAAmB;AAAA,IACzB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,IAAW,eAAe;AACzB,aAAO,KAAK;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,IAAW,aAAa,OAAO;AAC9B,WAAK,gBAAgB;AAAA,IACtB;AAAA,IAcO,OACN,aACA,kBACoB;AACpB,UAAI;AACJ,UAAI;AAEJ,UAAI,OAAO,gBAAgB,UAAU;AACpC,YAAI,OAAO,qBAAqB,YAAY;AAC3C,gBAAM,IAAI;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAEA,eAAO,EAAE,OAAO,aAAa,SAAS,iBAAiB;AACvD,kBAAU;AAAA,MACX,OAAO;AACN,eAAO;AACP,kBAAU;AAAA,MACX;AACA,WAAK,iBAAiB,KAAK,KAAK;AAChC,UAAI,CAAC,KAAK,oBAAoB,KAAK,KAAK,GAAG;AAC1C,eAAO;AAAA,MACR;AAEA,YAAM,cAAc,SAAS,gBAAgB,KAAK;AAClD,YAAM,QAAe,cAClB,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,IACxD;AAEH,YAAM,KAAK,MAAM,MAAM,OAAO,WAAW;AAEzC,YAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK,KAAK;AAChD,UAAI,eAAe;AAElB,cAAM,gBAAgB,cAAc,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE;AACtE,YAAI,kBAAkB,IAAI;AACzB,wBAAc,aAAa,IAAI;AAAA,QAChC,OAAO;AACN,gBAAM,WAAW,SAAS,YAAY;AACtC,cAAI,aAAa,OAAO;AACvB,0BAAc,QAAQ,KAAK;AAAA,UAC5B,WAAW,aAAa,UAAU;AACjC,0BAAc,KAAK,KAAK;AAAA,UACzB,OAAO;AACN,kBAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,cAAc,MAAM,CAAC;AAClE,0BAAc,OAAO,OAAO,GAAG,KAAK;AAAA,UACrC;AAAA,QACD;AAAA,MACD,OAAO;AACN,aAAK,OAAO,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC;AAAA,MACpC;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,QAAQ,OAAe,SAAiB;AAC9C,WAAK,OAAO,EAAE,OAAO,QAAQ,CAAC;AAAA,IAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQO,QAAQ,OAAgB,SAAyB;AACvD,iBAAW,QAAQ,OAAO;AACzB,aAAK,OAAO,MAAM,OAAO;AAAA,MAC1B;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,YACN,MACA,SACoB;AACpB,aAAO,KAAK,OAAO,MAAM,EAAE,GAAG,SAAS,UAAU,MAAM,CAAC;AAAA,IACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASO,gBACN,MACA,SACoB;AAEpB,YAAM,iBAAiB,UAAU,eAAsB;AACtD,aAAK,WAAW,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,CAAC;AAC9D,eAAO,KAAK,QAAQ,GAAG,UAAU;AAAA,MAClC;AAEA,aAAO,KAAK;AAAA,QACX,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,eAAe;AAAA,QAC1D,EAAE,GAAG,SAAS,UAAU,MAAM;AAAA,MAC/B;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA,IAMO,SAAS,MAAa;AAC5B,WAAK,iBAAiB,KAAK,KAAK;AAChC,UAAI,CAAC,KAAK,oBAAoB,KAAK,KAAK,GAAG;AAC1C;AAAA,MACD;AAEA,YAAM,iBAAiB,UAAU,eAAsB;AACtD,aAAK,WAAW,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,CAAC;AAC9D,eAAO,KAAK,QAAQ,GAAG,UAAU;AAAA,MAClC;AAEA,WAAK,OAAO,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,eAAe,CAAC;AAAA,IACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,WAAW,MAAgC;AACjD,WAAK,iBAAiB,KAAK,KAAK;AAChC,YAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK,KAAK;AAChD,UAAI,eAAe;AAClB,cAAM,QAAQ,cAAc,UAAU,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO;AACvE,YAAI,UAAU,IAAI;AACjB,wBAAc,OAAO,OAAO,CAAC;AAC7B,cAAI,cAAc,WAAW,GAAG;AAC/B,iBAAK,OAAO,OAAO,KAAK,KAAK;AAAA,UAC9B;AAEA,iBAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,QACnD;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,YAAY,OAAyB;AAC3C,YAAM,UAAmB,CAAC;AAC1B,iBAAW,QAAQ,OAAO;AACzB,cAAM,SAAS,KAAK,WAAW,IAAI;AACnC,YAAI,QAAQ;AACX,kBAAQ,KAAK,MAAM;AAAA,QACpB;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAa,KAAQ,UAAkB,YAAiB;AACvD,WAAK,iBAAiB,KAAK;AAC3B,UAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,MACD;AACA,YAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,UAAI,eAAe;AAClB,mBAAW,QAAQ,CAAC,GAAG,aAAa,GAAG;AACtC,cAAI;AACH,kBAAM,KAAK,QAAQ,GAAG,UAAU;AAAA,UACjC,SAAS,OAAO;AACf,kBAAM,UAAU,GAAG,KAAK,KAAM,MAAgB,OAAO;AACrD,iBAAK,KAAK,SAAS,IAAI,MAAM,OAAO,CAAC;AAErC,gBAAI,KAAK,mBAAmB;AAC3B,oBAAM,IAAI,MAAM,OAAO;AAAA,YACxB;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYO,SAAY,UAAkB,YAAuB;AAC3D,WAAK,iBAAiB,KAAK;AAC3B,UAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,MACD;AAEA,YAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,UAAI,eAAe;AAClB,mBAAW,QAAQ,CAAC,GAAG,aAAa,GAAG;AAEtC,cAAI,KAAK,QAAQ,YAAY,SAAS,iBAAiB;AACtD;AAAA,UACD;AAEA,cAAI;AACH,iBAAK,QAAQ,GAAG,UAAU;AAAA,UAC3B,SAAS,OAAO;AACf,kBAAM,UAAU,GAAG,KAAK,KAAM,MAAgB,OAAO;AACrD,iBAAK,KAAK,SAAS,IAAI,MAAM,OAAO,CAAC;AAErC,gBAAI,KAAK,mBAAmB;AAC3B,oBAAM,IAAI,MAAM,OAAO;AAAA,YACxB;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAa,WAAc,UAAkB,YAAiB;AAC7D,YAAM,KAAK,KAAK,UAAU,KAAK,IAAI,GAAG,UAAU;AAAA,IACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAa,UAAa,UAAkB,YAAiB;AAC5D,YAAM,KAAK,KAAK,SAAS,KAAK,IAAI,GAAG,UAAU;AAAA,IAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAa,SAAY,UAAkB,YAAiB;AAC3D,YAAM,KAAK,KAAK,OAAO,GAAG,UAAU;AAAA,IACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,SAAS,OAAe;AAC9B,WAAK,iBAAiB,KAAK;AAC3B,aAAO,KAAK,OAAO,IAAI,KAAK;AAAA,IAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,QAAQ,IAA+B;AAC7C,iBAAW,iBAAiB,KAAK,OAAO,OAAO,GAAG;AACjD,cAAM,QAAQ,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,YAAI,OAAO;AACV,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,eAAe,IAAoD;AACzE,UAAI,MAAM,QAAQ,EAAE,GAAG;AACtB,cAAM,UAAmB,CAAC;AAC1B,mBAAW,YAAY,IAAI;AAC1B,gBAAM,SAAS,KAAK,eAAe,QAAQ;AAC3C,cAAI,UAAU,CAAC,MAAM,QAAQ,MAAM,GAAG;AACrC,oBAAQ,KAAK,MAAM;AAAA,UACpB;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AAEA,iBAAW,CAAC,OAAO,aAAa,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3D,cAAM,QAAQ,cAAc,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACxD,YAAI,UAAU,IAAI;AACjB,gBAAM,CAAC,OAAO,IAAI,cAAc,OAAO,OAAO,CAAC;AAC/C,cAAI,cAAc,WAAW,GAAG;AAC/B,iBAAK,OAAO,OAAO,KAAK;AAAA,UACzB;AAEA,iBAAO;AAAA,QACR;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;AAAA;AAAA;AAAA,IAMO,aAAa;AACnB,WAAK,OAAO,MAAM;AAAA,IACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOO,iBAAiB,OAAwB;AAC/C,WAAK,iBAAiB,KAAK;AAC3B,YAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,UAAI,eAAe;AAClB,cAAM,UAAU,CAAC,GAAG,aAAa;AACjC,aAAK,OAAO,OAAO,KAAK;AACxB,eAAO;AAAA,MACR;AAEA,aAAO,CAAC;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,iBAAiB,OAAqB;AAC7C,UAAI,KAAK,qBAAqB;AAC7B,cAAM,aAAa,MAAM,KAAK,EAAE,kBAAkB;AAClD,YAAI,CAAC,WAAW,WAAW,QAAQ,KAAK,CAAC,WAAW,WAAW,OAAO,GAAG;AACxE,gBAAM,IAAI;AAAA,YACT,eAAe,KAAK;AAAA,UACrB;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOQ,oBAAoB,OAAwB;AACnD,UAAI,KAAK,iBAAiB,IAAI,KAAK,GAAG;AACrC,cAAM,UAAU,KAAK,iBAAiB,IAAI,KAAK;AAC/C,cAAM,iBAAiB,SAAS,KAAK,kBAAkB,UAAU,KAAK,OAAO,KAAK,EAAE;AAGpF,aAAK,KAAK,QAAQ,EAAE,MAAM,OAAO,SAAS,eAAe,CAAC;AAG1D,eAAO,KAAK;AAAA,MACb;AACA,aAAO;AAAA,IACR;AAAA,EACD;","names":["entry"]}
@@ -555,15 +555,21 @@ var Hookified = class extends Eventified {
555
555
  set useHookClone(value) {
556
556
  this._useHookClone = value;
557
557
  }
558
- /**
559
- * Adds a handler function for a specific event.
560
- * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.
561
- * To register multiple hooks at once, use {@link onHooks}.
562
- * @param {IHook} hook - the hook containing event name and handler
563
- * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)
564
- * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation
565
- */
566
- onHook(hook, options) {
558
+ onHook(hookOrEvent, optionsOrHandler) {
559
+ let hook;
560
+ let options;
561
+ if (typeof hookOrEvent === "string") {
562
+ if (typeof optionsOrHandler !== "function") {
563
+ throw new TypeError(
564
+ "When calling onHook(event, handler), the second argument must be a function"
565
+ );
566
+ }
567
+ hook = { event: hookOrEvent, handler: optionsOrHandler };
568
+ options = void 0;
569
+ } else {
570
+ hook = hookOrEvent;
571
+ options = optionsOrHandler;
572
+ }
567
573
  this.validateHookName(hook.event);
568
574
  if (!this.checkDeprecatedHook(hook.event)) {
569
575
  return void 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/eventified.ts","../../src/hooks/hook.ts","../../src/hooks/waterfall-hook.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\nconst ERROR_EVENT = \"error\";\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<\n\t\tstring | symbol,\n\t\tEventListener | EventListener[]\n\t>;\n\tprivate _maxListeners: number;\n\tprivate _eventLogger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = true;\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<\n\t\t\tstring | symbol,\n\t\t\tEventListener | EventListener[]\n\t\t>();\n\t\tthis._maxListeners = 0; // Default is 0 (unlimited)\n\n\t\tthis._eventLogger = options?.eventLogger;\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 event logger\n\t * @returns {Logger}\n\t */\n\tpublic get eventLogger(): Logger | undefined {\n\t\treturn this._eventLogger;\n\t}\n\n\t/**\n\t * Sets the event logger\n\t * @param {Logger} eventLogger\n\t */\n\tpublic set eventLogger(eventLogger: Logger | undefined) {\n\t\tthis._eventLogger = eventLogger;\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\tlet count = 0;\n\t\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\t\tcount += typeof entry === \"function\" ? 1 : entry.length;\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\tconst entry = this._eventListeners.get(eventName);\n\t\tif (entry === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? 1 : entry.length;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 existing = this._eventListeners.get(eventName);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(eventName, listener);\n\t\t} else if (typeof existing === \"function\") {\n\t\t\tthis._eventListeners.set(eventName, [listener, existing]);\n\t\t} else {\n\t\t\texisting.unshift(listener);\n\t\t}\n\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\tconst existing = this._eventListeners.get(event);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(event, listener);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof existing === \"function\") {\n\t\t\tconst arr = [existing, listener];\n\t\t\tthis._eventListeners.set(event, arr);\n\t\t\tif (this._maxListeners > 0 && arr.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${arr.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\texisting.push(listener);\n\t\t\tif (this._maxListeners > 0 && existing.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${existing.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof entry === \"function\") {\n\t\t\tif (entry === listener) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tconst index = entry.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tif (entry.length === 2) {\n\t\t\t\tthis._eventListeners.set(event, entry[1 - index]);\n\t\t\t\t/* v8 ignore start -- @preserve: single-element arrays are stored as functions */\n\t\t\t} else if (entry.length === 1) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t\t/* v8 ignore stop */\n\t\t\t} else {\n\t\t\t\tentry.splice(index, 1);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tconst argumentLength = arguments_.length;\n\n\t\tif (entry !== undefined) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\tentry(arguments_[0]);\n\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\tentry(arguments_[0], arguments_[1]);\n\t\t\t\t} else {\n\t\t\t\t\tentry(...arguments_);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst snapshot = [...entry];\n\t\t\t\tfor (let i = 0; i < snapshot.length; i++) {\n\t\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0]);\n\t\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0], arguments_[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsnapshot[i](...arguments_);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult = true;\n\t\t}\n\n\t\t// send it to the logger\n\t\tif (this._eventLogger) {\n\t\t\tthis.sendToEventLogger(event, arguments_);\n\t\t}\n\n\t\tif (event === ERROR_EVENT && !result) {\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 || this._throwOnEmptyListeners) {\n\t\t\t\tthrow error;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 < 0 ? 0 : n;\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\tconst result: EventListener[] = [];\n\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tresult.push(entry);\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < entry.length; i++) {\n\t\t\t\t\tresult.push(entry[i]);\n\t\t\t\t}\n\t\t\t}\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 sendToEventLogger(eventName: string | symbol, data: any): void {\n\t\t/* v8 ignore next 3 -- @preserve: guarded by caller */\n\t\tif (!this._eventLogger) {\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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.fatal?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis._eventLogger.info?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { HookFn, IHook } from \"../types.js\";\n\n/**\n * Concrete implementation of the IHook interface.\n * Provides a convenient class-based way to create hook entries.\n */\nexport class Hook implements IHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\n\t/**\n\t * Creates a new Hook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {HookFn} handler - The handler function for the hook\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, handler: HookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.handler = handler;\n\t}\n}\n","import type {\n\tHookFn,\n\tIWaterfallHook,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"../types.js\";\n\n/**\n * A WaterfallHook chains multiple hook functions sequentially,\n * where each hook receives a context with the previous result,\n * initial arguments, and accumulated results. After all hooks\n * have executed, the final handler receives the transformed result.\n * Implements IHook for compatibility with Hookified.onHook().\n */\nexport class WaterfallHook implements IWaterfallHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\tpublic hooks: WaterfallHookFn[];\n\n\tprivate readonly _finalHandler: WaterfallHookFn;\n\n\t/**\n\t * Creates a new WaterfallHook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {WaterfallHookFn} finalHandler - The final handler function that receives the transformed result\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, finalHandler: WaterfallHookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.hooks = [];\n\t\tthis._finalHandler = finalHandler;\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tthis.handler = async (...arguments_: any[]) => {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: waterfall result type varies through the chain\n\t\t\tconst initialArgs: any =\n\t\t\t\targuments_.length === 1 ? arguments_[0] : arguments_;\n\t\t\tconst results: WaterfallHookResult[] = [];\n\n\t\t\tfor (const hook of this.hooks) {\n\t\t\t\tconst result = await hook({ initialArgs, results: [...results] });\n\t\t\t\tresults.push({ hook, result });\n\t\t\t}\n\n\t\t\tawait this._finalHandler({ initialArgs, results: [...results] });\n\t\t};\n\t}\n\n\t/**\n\t * Adds a hook function to the end of the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to add\n\t */\n\tpublic addHook(hook: WaterfallHookFn): void {\n\t\tthis.hooks.push(hook);\n\t}\n\n\t/**\n\t * Removes a specific hook function from the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to remove\n\t * @returns {boolean} true if the hook was found and removed\n\t */\n\tpublic removeHook(hook: WaterfallHookFn): boolean {\n\t\tconst index = this.hooks.indexOf(hook);\n\t\tif (index !== -1) {\n\t\t\tthis.hooks.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n","import { Eventified } from \"./eventified.js\";\nimport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"./types.js\";\n\nexport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n};\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, IHook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\tprivate _useHookClone = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\teventLogger: options?.eventLogger,\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}\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\n\t\tif (options?.useHookClone !== undefined) {\n\t\t\tthis._useHookClone = options.useHookClone;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, IHook[]>}\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 */\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 * Gets whether hook objects are cloned before storing. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get useHookClone() {\n\t\treturn this._useHookClone;\n\t}\n\n\t/**\n\t * Sets whether hook objects are cloned before storing. Default is true.\n\t * When false, the original IHook reference is stored directly.\n\t * @param {boolean} value\n\t */\n\tpublic set useHookClone(value) {\n\t\tthis._useHookClone = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event.\n\t * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.\n\t * To register multiple hooks at once, use {@link onHooks}.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic onHook(hook: IHook, options?: OnHookOptions): IHook | undefined {\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.event)) {\n\t\t\treturn undefined; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\n\t\tconst shouldClone = options?.useHookClone ?? this._useHookClone;\n\t\tconst entry: IHook = shouldClone\n\t\t\t? { id: hook.id, event: hook.event, handler: hook.handler }\n\t\t\t: hook;\n\n\t\tentry.id = entry.id ?? crypto.randomUUID();\n\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\t// Check for duplicate id — replace in-place if found\n\t\t\tconst existingIndex = eventHandlers.findIndex((h) => h.id === entry.id);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\teventHandlers[existingIndex] = entry;\n\t\t\t} else {\n\t\t\t\tconst position = options?.position ?? \"Bottom\";\n\t\t\t\tif (position === \"Top\") {\n\t\t\t\t\teventHandlers.unshift(entry);\n\t\t\t\t} else if (position === \"Bottom\") {\n\t\t\t\t\teventHandlers.push(entry);\n\t\t\t\t} else {\n\t\t\t\t\tconst index = Math.max(0, Math.min(position, eventHandlers.length));\n\t\t\t\t\teventHandlers.splice(index, 0, entry);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis._hooks.set(hook.event, [entry]);\n\t\t}\n\n\t\treturn entry;\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 - the event name\n\t * @param {HookFn} handler - the handler function\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: HookFn) {\n\t\tthis.onHook({ event, handler });\n\t}\n\n\t/**\n\t * Adds handler functions for specific events\n\t * @param {Array<IHook>} hooks\n\t * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: IHook[], options?: OnHookOptions) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook, options);\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 * Equivalent to calling `onHook(hook, { position: \"Top\" })`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\treturn this.onHook(hook, { ...options, position: \"Top\" });\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers.\n\t * Equivalent to calling `onHook` with a self-removing wrapper and `{ position: \"Top\" }`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependOnceHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\treturn this.onHook(\n\t\t\t{ id: hook.id, event: hook.event, handler: wrappedHandler },\n\t\t\t{ ...options, position: \"Top\" },\n\t\t);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler\n\t */\n\tpublic onceHook(hook: IHook) {\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.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 wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook({ id: hook.id, event: hook.event, handler: wrappedHandler });\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler to remove\n\t * @returns {IHook | undefined} the removed hook, or undefined if not found\n\t */\n\tpublic removeHook(hook: IHook): IHook | undefined {\n\t\tthis.validateHookName(hook.event);\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.handler === hook.handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(hook.event);\n\t\t\t\t}\n\n\t\t\t\treturn { event: hook.event, handler: hook.handler };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes multiple hook handlers\n\t * @param {Array<IHook>} hooks\n\t * @returns {IHook[]} the hooks that were successfully removed\n\t */\n\tpublic removeHooks(hooks: IHook[]): IHook[] {\n\t\tconst removed: IHook[] = [];\n\t\tfor (const hook of hooks) {\n\t\t\tconst result = this.removeHook(hook);\n\t\t\tif (result) {\n\t\t\t\tremoved.push(result);\n\t\t\t}\n\t\t}\n\n\t\treturn removed;\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 hook of [...eventHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\tawait hook.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 * Calls all synchronous handlers for a specific event.\n\t * Async handlers (declared with `async` keyword) are silently skipped.\n\t *\n\t * Note: The `hook` method is preferred as it executes both sync and async functions.\n\t * Use `hookSync` only when you specifically need synchronous execution.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {void}\n\t */\n\tpublic hookSync<T>(event: string, ...arguments_: T[]): void {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const hook of [...eventHandlers]) {\n\t\t\t\t// Skip async functions silently\n\t\t\t\tif (hook.handler.constructor.name === \"AsyncFunction\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\thook.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 {IHook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Gets a specific hook by id, searching across all events\n\t * @param {string} id - the hook id\n\t * @returns {IHook | undefined} the hook if found, or undefined\n\t */\n\tpublic getHook(id: string): IHook | undefined {\n\t\tfor (const eventHandlers of this._hooks.values()) {\n\t\t\tconst found = eventHandlers.find((h) => h.id === id);\n\t\t\tif (found) {\n\t\t\t\treturn found;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes one or more hooks by id, searching across all events\n\t * @param {string | string[]} id - the hook id or array of hook ids to remove\n\t * @returns {IHook | IHook[] | undefined} the removed hook(s), or undefined/empty array if not found\n\t */\n\tpublic removeHookById(id: string | string[]): IHook | IHook[] | undefined {\n\t\tif (Array.isArray(id)) {\n\t\t\tconst removed: IHook[] = [];\n\t\t\tfor (const singleId of id) {\n\t\t\t\tconst result = this.removeHookById(singleId);\n\t\t\t\tif (result && !Array.isArray(result)) {\n\t\t\t\t\tremoved.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\tfor (const [event, eventHandlers] of this._hooks.entries()) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.id === id);\n\t\t\tif (index !== -1) {\n\t\t\t\tconst [removed] = eventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(event);\n\t\t\t\t}\n\n\t\t\t\treturn removed;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\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\t/**\n\t * Removes all hooks for a specific event and returns the removed hooks.\n\t * @param {string} event - The event name to remove hooks for.\n\t * @returns {IHook[]} the hooks that were removed\n\t */\n\tpublic removeEventHooks(event: string): IHook[] {\n\t\tthis.validateHookName(event);\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst removed = [...eventHandlers];\n\t\t\tthis._hooks.delete(event);\n\t\t\treturn removed;\n\t\t}\n\n\t\treturn [];\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\nexport { Eventified } from \"./eventified.js\";\nexport { Hook } from \"./hooks/hook.js\";\nexport { WaterfallHook } from \"./hooks/waterfall-hook.js\";\nexport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n"],"mappings":";;;;;AAUA,IAAM,cAAc;AAEb,IAAM,aAAN,MAA0C;AAAA,EAUhD,YAAY,SAA+B;AAT3C,wBAAiB;AAIjB,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,qBAAoB;AAC5B,wBAAQ,0BAAyB;AAGhC,SAAK,kBAAkB,oBAAI,IAGzB;AACF,SAAK,gBAAgB;AAErB,SAAK,eAAe,SAAS;AAE7B,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,cAAkC;AAC5C,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,YAAY,aAAiC;AACvD,SAAK,eAAe;AAAA,EACrB;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,UAAI,QAAQ;AACZ,iBAAWA,UAAS,KAAK,gBAAgB,OAAO,GAAG;AAClD,iBAAS,OAAOA,WAAU,aAAa,IAAIA,OAAM;AAAA,MAClD;AAEA,aAAO;AAAA,IACR;AAEA,UAAM,QAAQ,KAAK,gBAAgB,IAAI,SAAS;AAChD,QAAI,UAAU,QAAW;AACxB,aAAO;AAAA,IACR;AAEA,WAAO,OAAO,UAAU,aAAa,IAAI,MAAM;AAAA,EAChD;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,UAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,QAAI,UAAU,QAAW;AACxB,aAAO,CAAC;AAAA,IACT;AAEA,WAAO,OAAO,UAAU,aAAa,CAAC,KAAK,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,gBACN,WACA,UACgB;AAChB,UAAM,WAAW,KAAK,gBAAgB,IAAI,SAAS;AAEnD,QAAI,aAAa,QAAW;AAC3B,WAAK,gBAAgB,IAAI,WAAW,QAAQ;AAAA,IAC7C,WAAW,OAAO,aAAa,YAAY;AAC1C,WAAK,gBAAgB,IAAI,WAAW,CAAC,UAAU,QAAQ,CAAC;AAAA,IACzD,OAAO;AACN,eAAS,QAAQ,QAAQ;AAAA,IAC1B;AAEA,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,UAAM,WAAW,KAAK,gBAAgB,IAAI,KAAK;AAE/C,QAAI,aAAa,QAAW;AAC3B,WAAK,gBAAgB,IAAI,OAAO,QAAQ;AACxC,aAAO;AAAA,IACR;AAEA,QAAI,OAAO,aAAa,YAAY;AACnC,YAAM,MAAM,CAAC,UAAU,QAAQ;AAC/B,WAAK,gBAAgB,IAAI,OAAO,GAAG;AACnC,UAAI,KAAK,gBAAgB,KAAK,IAAI,SAAS,KAAK,eAAe;AAC9D,gBAAQ;AAAA,UACP,qEAAqE,IAAI,MAAM,IAAI,KAAe;AAAA,QACnG;AAAA,MACD;AAAA,IACD,OAAO;AACN,eAAS,KAAK,QAAQ;AACtB,UAAI,KAAK,gBAAgB,KAAK,SAAS,SAAS,KAAK,eAAe;AACnE,gBAAQ;AAAA,UACP,qEAAqE,SAAS,MAAM,IAAI,KAAe;AAAA,QACxG;AAAA,MACD;AAAA,IACD;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,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,QAAI,UAAU,QAAW;AACxB,aAAO;AAAA,IACR;AAEA,QAAI,OAAO,UAAU,YAAY;AAChC,UAAI,UAAU,UAAU;AACvB,aAAK,gBAAgB,OAAO,KAAK;AAAA,MAClC;AAEA,aAAO;AAAA,IACR;AAEA,UAAM,QAAQ,MAAM,QAAQ,QAAQ;AACpC,QAAI,UAAU,IAAI;AACjB,UAAI,MAAM,WAAW,GAAG;AACvB,aAAK,gBAAgB,IAAI,OAAO,MAAM,IAAI,KAAK,CAAC;AAAA,MAEjD,WAAW,MAAM,WAAW,GAAG;AAC9B,aAAK,gBAAgB,OAAO,KAAK;AAAA,MAElC,OAAO;AACN,cAAM,OAAO,OAAO,CAAC;AAAA,MACtB;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAK,UAA2B,YAA4B;AAClE,QAAI,SAAS;AACb,UAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,UAAM,iBAAiB,WAAW;AAElC,QAAI,UAAU,QAAW;AACxB,UAAI,OAAO,UAAU,YAAY;AAChC,YAAI,mBAAmB,GAAG;AACzB,gBAAM,WAAW,CAAC,CAAC;AAAA,QACpB,WAAW,mBAAmB,GAAG;AAChC,gBAAM,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,QACnC,OAAO;AACN,gBAAM,GAAG,UAAU;AAAA,QACpB;AAAA,MACD,OAAO;AACN,cAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,iBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACzC,cAAI,mBAAmB,GAAG;AACzB,qBAAS,CAAC,EAAE,WAAW,CAAC,CAAC;AAAA,UAC1B,WAAW,mBAAmB,GAAG;AAChC,qBAAS,CAAC,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAAA,UACzC,OAAO;AACN,qBAAS,CAAC,EAAE,GAAG,UAAU;AAAA,UAC1B;AAAA,QACD;AAAA,MACD;AAEA,eAAS;AAAA,IACV;AAGA,QAAI,KAAK,cAAc;AACtB,WAAK,kBAAkB,OAAO,UAAU;AAAA,IACzC;AAEA,QAAI,UAAU,eAAe,CAAC,QAAQ;AACrC,YAAM,QACL,WAAW,CAAC,aAAa,QACtB,WAAW,CAAC,IACZ,IAAI,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE;AAEhC,UAAI,KAAK,qBAAqB,KAAK,wBAAwB;AAC1D,cAAM;AAAA,MACP;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,UAAU,OAAyC;AACzD,UAAM,QAAQ,KAAK,gBAAgB,IAAI,KAAK;AAC5C,QAAI,UAAU,QAAW;AACxB,aAAO,CAAC;AAAA,IACT;AAEA,WAAO,OAAO,UAAU,aAAa,CAAC,KAAK,IAAI;AAAA,EAChD;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,IAAI,IAAI,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAmC;AACzC,UAAM,SAA0B,CAAC;AACjC,eAAW,SAAS,KAAK,gBAAgB,OAAO,GAAG;AAClD,UAAI,OAAO,UAAU,YAAY;AAChC,eAAO,KAAK,KAAK;AAAA,MAClB,OAAO;AACN,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,iBAAO,KAAK,MAAM,CAAC,CAAC;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAkB,WAA4B,MAAiB;AAEtE,QAAI,CAAC,KAAK,cAAc;AACvB;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,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,MACD;AAAA,MAEA,KAAK,QAAQ;AACZ,aAAK,aAAa,OAAO,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC5D;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,aAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,aAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,MACD;AAAA,MAEA,KAAK,SAAS;AACb,aAAK,aAAa,QAAQ,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC7D;AAAA,MACD;AAAA,MAEA,SAAS;AACR,aAAK,aAAa,OAAO,SAAS,EAAE,OAAO,WAAW,KAAK,CAAC;AAC5D;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;ACzdO,IAAM,OAAN,MAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlC,YAAY,OAAe,SAAiB,IAAa;AAVzD,wBAAO;AACP,wBAAO;AACP,wBAAO;AASN,SAAK,KAAK;AACV,SAAK,QAAQ;AACb,SAAK,UAAU;AAAA,EAChB;AACD;;;ACRO,IAAM,gBAAN,MAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcpD,YAAY,OAAe,cAA+B,IAAa;AAbvE,wBAAO;AACP,wBAAO;AACP,wBAAO;AACP,wBAAO;AAEP,wBAAiB;AAShB,SAAK,KAAK;AACV,SAAK,QAAQ;AACb,SAAK,QAAQ,CAAC;AACd,SAAK,gBAAgB;AAGrB,SAAK,UAAU,UAAU,eAAsB;AAE9C,YAAM,cACL,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI;AAC3C,YAAM,UAAiC,CAAC;AAExC,iBAAW,QAAQ,KAAK,OAAO;AAC9B,cAAM,SAAS,MAAM,KAAK,EAAE,aAAa,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAChE,gBAAQ,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,MAC9B;AAEA,YAAM,KAAK,cAAc,EAAE,aAAa,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,IAChE;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,MAA6B;AAC3C,SAAK,MAAM,KAAK,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAW,MAAgC;AACjD,UAAM,QAAQ,KAAK,MAAM,QAAQ,IAAI;AACrC,QAAI,UAAU,IAAI;AACjB,WAAK,MAAM,OAAO,OAAO,CAAC;AAC1B,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AACD;;;AC/CO,IAAM,YAAN,cAAwB,WAAW;AAAA,EAQzC,YAAY,SAA4B;AACvC,UAAM;AAAA,MACL,aAAa,SAAS;AAAA,MACtB,kBAAkB,SAAS;AAAA,MAC3B,uBAAuB,SAAS;AAAA,IACjC,CAAC;AAZF,wBAAiB;AACjB,wBAAQ,qBAAoB;AAC5B,wBAAQ,uBAAsB;AAC9B,wBAAQ;AACR,wBAAQ,oBAAmB;AAC3B,wBAAQ,iBAAgB;AAQvB,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;AAEA,QAAI,SAAS,uBAAuB,QAAW;AAC9C,WAAK,sBAAsB,QAAQ;AAAA,IACpC;AAEA,QAAI,SAAS,oBAAoB,QAAW;AAC3C,WAAK,mBAAmB,QAAQ;AAAA,IACjC;AAEA,QAAI,SAAS,iBAAiB,QAAW;AACxC,WAAK,gBAAgB,QAAQ;AAAA,IAC9B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,QAAQ;AAClB,WAAO,KAAK;AAAA,EACb;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,EAMA,IAAW,eAAe;AACzB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAW,aAAa,OAAO;AAC9B,SAAK,gBAAgB;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,OAAO,MAAa,SAA4C;AACtE,SAAK,iBAAiB,KAAK,KAAK;AAChC,QAAI,CAAC,KAAK,oBAAoB,KAAK,KAAK,GAAG;AAC1C,aAAO;AAAA,IACR;AAEA,UAAM,cAAc,SAAS,gBAAgB,KAAK;AAClD,UAAM,QAAe,cAClB,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ,IACxD;AAEH,UAAM,KAAK,MAAM,MAAM,OAAO,WAAW;AAEzC,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK,KAAK;AAChD,QAAI,eAAe;AAElB,YAAM,gBAAgB,cAAc,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE;AACtE,UAAI,kBAAkB,IAAI;AACzB,sBAAc,aAAa,IAAI;AAAA,MAChC,OAAO;AACN,cAAM,WAAW,SAAS,YAAY;AACtC,YAAI,aAAa,OAAO;AACvB,wBAAc,QAAQ,KAAK;AAAA,QAC5B,WAAW,aAAa,UAAU;AACjC,wBAAc,KAAK,KAAK;AAAA,QACzB,OAAO;AACN,gBAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,cAAc,MAAM,CAAC;AAClE,wBAAc,OAAO,OAAO,GAAG,KAAK;AAAA,QACrC;AAAA,MACD;AAAA,IACD,OAAO;AACN,WAAK,OAAO,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC;AAAA,IACpC;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAQ,OAAe,SAAiB;AAC9C,SAAK,OAAO,EAAE,OAAO,QAAQ,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,QAAQ,OAAgB,SAAyB;AACvD,eAAW,QAAQ,OAAO;AACzB,WAAK,OAAO,MAAM,OAAO;AAAA,IAC1B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,YACN,MACA,SACoB;AACpB,WAAO,KAAK,OAAO,MAAM,EAAE,GAAG,SAAS,UAAU,MAAM,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,gBACN,MACA,SACoB;AAEpB,UAAM,iBAAiB,UAAU,eAAsB;AACtD,WAAK,WAAW,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,CAAC;AAC9D,aAAO,KAAK,QAAQ,GAAG,UAAU;AAAA,IAClC;AAEA,WAAO,KAAK;AAAA,MACX,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,eAAe;AAAA,MAC1D,EAAE,GAAG,SAAS,UAAU,MAAM;AAAA,IAC/B;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,SAAS,MAAa;AAC5B,SAAK,iBAAiB,KAAK,KAAK;AAChC,QAAI,CAAC,KAAK,oBAAoB,KAAK,KAAK,GAAG;AAC1C;AAAA,IACD;AAEA,UAAM,iBAAiB,UAAU,eAAsB;AACtD,WAAK,WAAW,EAAE,OAAO,KAAK,OAAO,SAAS,eAAe,CAAC;AAC9D,aAAO,KAAK,QAAQ,GAAG,UAAU;AAAA,IAClC;AAEA,SAAK,OAAO,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,SAAS,eAAe,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,WAAW,MAAgC;AACjD,SAAK,iBAAiB,KAAK,KAAK;AAChC,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK,KAAK;AAChD,QAAI,eAAe;AAClB,YAAM,QAAQ,cAAc,UAAU,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO;AACvE,UAAI,UAAU,IAAI;AACjB,sBAAc,OAAO,OAAO,CAAC;AAC7B,YAAI,cAAc,WAAW,GAAG;AAC/B,eAAK,OAAO,OAAO,KAAK,KAAK;AAAA,QAC9B;AAEA,eAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,MACnD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,YAAY,OAAyB;AAC3C,UAAM,UAAmB,CAAC;AAC1B,eAAW,QAAQ,OAAO;AACzB,YAAM,SAAS,KAAK,WAAW,IAAI;AACnC,UAAI,QAAQ;AACX,gBAAQ,KAAK,MAAM;AAAA,MACpB;AAAA,IACD;AAEA,WAAO;AAAA,EACR;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,QAAQ,CAAC,GAAG,aAAa,GAAG;AACtC,YAAI;AACH,gBAAM,KAAK,QAAQ,GAAG,UAAU;AAAA,QACjC,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;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,SAAY,UAAkB,YAAuB;AAC3D,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,KAAK,oBAAoB,KAAK,GAAG;AACrC;AAAA,IACD;AAEA,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,QAAI,eAAe;AAClB,iBAAW,QAAQ,CAAC,GAAG,aAAa,GAAG;AAEtC,YAAI,KAAK,QAAQ,YAAY,SAAS,iBAAiB;AACtD;AAAA,QACD;AAEA,YAAI;AACH,eAAK,QAAQ,GAAG,UAAU;AAAA,QAC3B,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,WAAO,KAAK,OAAO,IAAI,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAQ,IAA+B;AAC7C,eAAW,iBAAiB,KAAK,OAAO,OAAO,GAAG;AACjD,YAAM,QAAQ,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD,UAAI,OAAO;AACV,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,eAAe,IAAoD;AACzE,QAAI,MAAM,QAAQ,EAAE,GAAG;AACtB,YAAM,UAAmB,CAAC;AAC1B,iBAAW,YAAY,IAAI;AAC1B,cAAM,SAAS,KAAK,eAAe,QAAQ;AAC3C,YAAI,UAAU,CAAC,MAAM,QAAQ,MAAM,GAAG;AACrC,kBAAQ,KAAK,MAAM;AAAA,QACpB;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAEA,eAAW,CAAC,OAAO,aAAa,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3D,YAAM,QAAQ,cAAc,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AACxD,UAAI,UAAU,IAAI;AACjB,cAAM,CAAC,OAAO,IAAI,cAAc,OAAO,OAAO,CAAC;AAC/C,YAAI,cAAc,WAAW,GAAG;AAC/B,eAAK,OAAO,OAAO,KAAK;AAAA,QACzB;AAEA,eAAO;AAAA,MACR;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,aAAa;AACnB,SAAK,OAAO,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,iBAAiB,OAAwB;AAC/C,SAAK,iBAAiB,KAAK;AAC3B,UAAM,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAC3C,QAAI,eAAe;AAClB,YAAM,UAAU,CAAC,GAAG,aAAa;AACjC,WAAK,OAAO,OAAO,KAAK;AACxB,aAAO;AAAA,IACR;AAEA,WAAO,CAAC;AAAA,EACT;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;AACD;","names":["entry"]}
1
+ {"version":3,"sources":["../../src/eventified.ts","../../src/hooks/hook.ts","../../src/hooks/waterfall-hook.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\nconst ERROR_EVENT = \"error\";\n\nexport class Eventified implements IEventEmitter {\n\tprivate readonly _eventListeners: Map<\n\t\tstring | symbol,\n\t\tEventListener | EventListener[]\n\t>;\n\tprivate _maxListeners: number;\n\tprivate _eventLogger?: Logger;\n\tprivate _throwOnEmitError = false;\n\tprivate _throwOnEmptyListeners = true;\n\n\tconstructor(options?: EventEmitterOptions) {\n\t\tthis._eventListeners = new Map<\n\t\t\tstring | symbol,\n\t\t\tEventListener | EventListener[]\n\t\t>();\n\t\tthis._maxListeners = 0; // Default is 0 (unlimited)\n\n\t\tthis._eventLogger = options?.eventLogger;\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 event logger\n\t * @returns {Logger}\n\t */\n\tpublic get eventLogger(): Logger | undefined {\n\t\treturn this._eventLogger;\n\t}\n\n\t/**\n\t * Sets the event logger\n\t * @param {Logger} eventLogger\n\t */\n\tpublic set eventLogger(eventLogger: Logger | undefined) {\n\t\tthis._eventLogger = eventLogger;\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\tlet count = 0;\n\t\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\t\tcount += typeof entry === \"function\" ? 1 : entry.length;\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\tconst entry = this._eventListeners.get(eventName);\n\t\tif (entry === undefined) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? 1 : entry.length;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 existing = this._eventListeners.get(eventName);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(eventName, listener);\n\t\t} else if (typeof existing === \"function\") {\n\t\t\tthis._eventListeners.set(eventName, [listener, existing]);\n\t\t} else {\n\t\t\texisting.unshift(listener);\n\t\t}\n\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\tconst existing = this._eventListeners.get(event);\n\n\t\tif (existing === undefined) {\n\t\t\tthis._eventListeners.set(event, listener);\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof existing === \"function\") {\n\t\t\tconst arr = [existing, listener];\n\t\t\tthis._eventListeners.set(event, arr);\n\t\t\tif (this._maxListeners > 0 && arr.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${arr.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\texisting.push(listener);\n\t\t\tif (this._maxListeners > 0 && existing.length > this._maxListeners) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`MaxListenersExceededWarning: Possible event memory leak detected. ${existing.length} ${event as string} listeners added. Use setMaxListeners() to increase limit.`,\n\t\t\t\t);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof entry === \"function\") {\n\t\t\tif (entry === listener) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tconst index = entry.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tif (entry.length === 2) {\n\t\t\t\tthis._eventListeners.set(event, entry[1 - index]);\n\t\t\t\t/* v8 ignore start -- @preserve: single-element arrays are stored as functions */\n\t\t\t} else if (entry.length === 1) {\n\t\t\t\tthis._eventListeners.delete(event);\n\t\t\t\t/* v8 ignore stop */\n\t\t\t} else {\n\t\t\t\tentry.splice(index, 1);\n\t\t\t}\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 entry = this._eventListeners.get(event);\n\t\tconst argumentLength = arguments_.length;\n\n\t\tif (entry !== undefined) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\tentry(arguments_[0]);\n\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\tentry(arguments_[0], arguments_[1]);\n\t\t\t\t} else {\n\t\t\t\t\tentry(...arguments_);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst snapshot = [...entry];\n\t\t\t\tfor (let i = 0; i < snapshot.length; i++) {\n\t\t\t\t\tif (argumentLength === 1) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0]);\n\t\t\t\t\t} else if (argumentLength === 2) {\n\t\t\t\t\t\tsnapshot[i](arguments_[0], arguments_[1]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsnapshot[i](...arguments_);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult = true;\n\t\t}\n\n\t\t// send it to the logger\n\t\tif (this._eventLogger) {\n\t\t\tthis.sendToEventLogger(event, arguments_);\n\t\t}\n\n\t\tif (event === ERROR_EVENT && !result) {\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 || this._throwOnEmptyListeners) {\n\t\t\t\tthrow error;\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\tconst entry = this._eventListeners.get(event);\n\t\tif (entry === undefined) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn typeof entry === \"function\" ? [entry] : entry;\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 < 0 ? 0 : n;\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\tconst result: EventListener[] = [];\n\t\tfor (const entry of this._eventListeners.values()) {\n\t\t\tif (typeof entry === \"function\") {\n\t\t\t\tresult.push(entry);\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < entry.length; i++) {\n\t\t\t\t\tresult.push(entry[i]);\n\t\t\t\t}\n\t\t\t}\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 sendToEventLogger(eventName: string | symbol, data: any): void {\n\t\t/* v8 ignore next 3 -- @preserve: guarded by caller */\n\t\tif (!this._eventLogger) {\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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.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._eventLogger.fatal?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis._eventLogger.info?.(message, { event: eventName, data });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { HookFn, IHook } from \"../types.js\";\n\n/**\n * Concrete implementation of the IHook interface.\n * Provides a convenient class-based way to create hook entries.\n */\nexport class Hook implements IHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\n\t/**\n\t * Creates a new Hook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {HookFn} handler - The handler function for the hook\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, handler: HookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.handler = handler;\n\t}\n}\n","import type {\n\tHookFn,\n\tIWaterfallHook,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"../types.js\";\n\n/**\n * A WaterfallHook chains multiple hook functions sequentially,\n * where each hook receives a context with the previous result,\n * initial arguments, and accumulated results. After all hooks\n * have executed, the final handler receives the transformed result.\n * Implements IHook for compatibility with Hookified.onHook().\n */\nexport class WaterfallHook implements IWaterfallHook {\n\tpublic id?: string;\n\tpublic event: string;\n\tpublic handler: HookFn;\n\tpublic hooks: WaterfallHookFn[];\n\n\tprivate readonly _finalHandler: WaterfallHookFn;\n\n\t/**\n\t * Creates a new WaterfallHook instance\n\t * @param {string} event - The event name for the hook\n\t * @param {WaterfallHookFn} finalHandler - The final handler function that receives the transformed result\n\t * @param {string} [id] - Optional unique identifier for the hook\n\t */\n\tconstructor(event: string, finalHandler: WaterfallHookFn, id?: string) {\n\t\tthis.id = id;\n\t\tthis.event = event;\n\t\tthis.hooks = [];\n\t\tthis._finalHandler = finalHandler;\n\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tthis.handler = async (...arguments_: any[]) => {\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: waterfall result type varies through the chain\n\t\t\tconst initialArgs: any =\n\t\t\t\targuments_.length === 1 ? arguments_[0] : arguments_;\n\t\t\tconst results: WaterfallHookResult[] = [];\n\n\t\t\tfor (const hook of this.hooks) {\n\t\t\t\tconst result = await hook({ initialArgs, results: [...results] });\n\t\t\t\tresults.push({ hook, result });\n\t\t\t}\n\n\t\t\tawait this._finalHandler({ initialArgs, results: [...results] });\n\t\t};\n\t}\n\n\t/**\n\t * Adds a hook function to the end of the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to add\n\t */\n\tpublic addHook(hook: WaterfallHookFn): void {\n\t\tthis.hooks.push(hook);\n\t}\n\n\t/**\n\t * Removes a specific hook function from the waterfall chain\n\t * @param {WaterfallHookFn} hook - The hook function to remove\n\t * @returns {boolean} true if the hook was found and removed\n\t */\n\tpublic removeHook(hook: WaterfallHookFn): boolean {\n\t\tconst index = this.hooks.indexOf(hook);\n\t\tif (index !== -1) {\n\t\t\tthis.hooks.splice(index, 1);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n","import { Eventified } from \"./eventified.js\";\nimport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n} from \"./types.js\";\n\nexport type {\n\tHookFn,\n\tHookifiedOptions,\n\tIHook,\n\tIWaterfallHook,\n\tOnHookOptions,\n\tPrependHookOptions,\n\tWaterfallHookContext,\n\tWaterfallHookFn,\n\tWaterfallHookResult,\n};\n\nexport class Hookified extends Eventified {\n\tprivate readonly _hooks: Map<string, IHook[]>;\n\tprivate _throwOnHookError = false;\n\tprivate _enforceBeforeAfter = false;\n\tprivate _deprecatedHooks: Map<string, string>;\n\tprivate _allowDeprecated = true;\n\tprivate _useHookClone = true;\n\n\tconstructor(options?: HookifiedOptions) {\n\t\tsuper({\n\t\t\teventLogger: options?.eventLogger,\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}\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\n\t\tif (options?.useHookClone !== undefined) {\n\t\t\tthis._useHookClone = options.useHookClone;\n\t\t}\n\t}\n\n\t/**\n\t * Gets all hooks\n\t * @returns {Map<string, IHook[]>}\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 */\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 * Gets whether hook objects are cloned before storing. Default is true.\n\t * @returns {boolean}\n\t */\n\tpublic get useHookClone() {\n\t\treturn this._useHookClone;\n\t}\n\n\t/**\n\t * Sets whether hook objects are cloned before storing. Default is true.\n\t * When false, the original IHook reference is stored directly.\n\t * @param {boolean} value\n\t */\n\tpublic set useHookClone(value) {\n\t\tthis._useHookClone = value;\n\t}\n\n\t/**\n\t * Adds a handler function for a specific event.\n\t * Supports both object and legacy signatures:\n\t * onHook({ event, handler }, options?)\n\t * onHook(event, handler)\n\t * To register multiple hooks at once, use {@link onHooks}.\n\t * @param {IHook | string} hookOrEvent - the hook object or event name\n\t * @param {OnHookOptions | HookFn} [optionsOrHandler] - options (when using object form) or handler function (when using string form)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic onHook(hook: IHook, options?: OnHookOptions): IHook | undefined;\n\tpublic onHook(event: string, handler: HookFn): IHook | undefined;\n\tpublic onHook(\n\t\thookOrEvent: IHook | string,\n\t\toptionsOrHandler?: OnHookOptions | HookFn,\n\t): IHook | undefined {\n\t\tlet hook: IHook;\n\t\tlet options: OnHookOptions | undefined;\n\n\t\tif (typeof hookOrEvent === \"string\") {\n\t\t\tif (typeof optionsOrHandler !== \"function\") {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\"When calling onHook(event, handler), the second argument must be a function\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\thook = { event: hookOrEvent, handler: optionsOrHandler };\n\t\t\toptions = undefined;\n\t\t} else {\n\t\t\thook = hookOrEvent;\n\t\t\toptions = optionsOrHandler as OnHookOptions | undefined;\n\t\t}\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.event)) {\n\t\t\treturn undefined; // Skip registration if deprecated hooks are not allowed\n\t\t}\n\n\t\tconst shouldClone = options?.useHookClone ?? this._useHookClone;\n\t\tconst entry: IHook = shouldClone\n\t\t\t? { id: hook.id, event: hook.event, handler: hook.handler }\n\t\t\t: hook;\n\n\t\tentry.id = entry.id ?? crypto.randomUUID();\n\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\t// Check for duplicate id — replace in-place if found\n\t\t\tconst existingIndex = eventHandlers.findIndex((h) => h.id === entry.id);\n\t\t\tif (existingIndex !== -1) {\n\t\t\t\teventHandlers[existingIndex] = entry;\n\t\t\t} else {\n\t\t\t\tconst position = options?.position ?? \"Bottom\";\n\t\t\t\tif (position === \"Top\") {\n\t\t\t\t\teventHandlers.unshift(entry);\n\t\t\t\t} else if (position === \"Bottom\") {\n\t\t\t\t\teventHandlers.push(entry);\n\t\t\t\t} else {\n\t\t\t\t\tconst index = Math.max(0, Math.min(position, eventHandlers.length));\n\t\t\t\t\teventHandlers.splice(index, 0, entry);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis._hooks.set(hook.event, [entry]);\n\t\t}\n\n\t\treturn entry;\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 - the event name\n\t * @param {HookFn} handler - the handler function\n\t * @returns {void}\n\t */\n\tpublic addHook(event: string, handler: HookFn) {\n\t\tthis.onHook({ event, handler });\n\t}\n\n\t/**\n\t * Adds handler functions for specific events\n\t * @param {Array<IHook>} hooks\n\t * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)\n\t * @returns {void}\n\t */\n\tpublic onHooks(hooks: IHook[], options?: OnHookOptions) {\n\t\tfor (const hook of hooks) {\n\t\t\tthis.onHook(hook, options);\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 * Equivalent to calling `onHook(hook, { position: \"Top\" })`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\treturn this.onHook(hook, { ...options, position: \"Top\" });\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event before all other handlers.\n\t * Equivalent to calling `onHook` with a self-removing wrapper and `{ position: \"Top\" }`.\n\t * @param {IHook} hook - the hook containing event name and handler\n\t * @param {PrependHookOptions} [options] - optional per-call options (e.g., useHookClone override)\n\t * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation\n\t */\n\tpublic prependOnceHook(\n\t\thook: IHook,\n\t\toptions?: PrependHookOptions,\n\t): IHook | undefined {\n\t\t// biome-ignore lint/suspicious/noExplicitAny: this is for any parameter compatibility\n\t\tconst wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\treturn this.onHook(\n\t\t\t{ id: hook.id, event: hook.event, handler: wrappedHandler },\n\t\t\t{ ...options, position: \"Top\" },\n\t\t);\n\t}\n\n\t/**\n\t * Adds a handler that only executes once for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler\n\t */\n\tpublic onceHook(hook: IHook) {\n\t\tthis.validateHookName(hook.event);\n\t\tif (!this.checkDeprecatedHook(hook.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 wrappedHandler = async (...arguments_: any[]) => {\n\t\t\tthis.removeHook({ event: hook.event, handler: wrappedHandler });\n\t\t\treturn hook.handler(...arguments_);\n\t\t};\n\n\t\tthis.onHook({ id: hook.id, event: hook.event, handler: wrappedHandler });\n\t}\n\n\t/**\n\t * Removes a handler function for a specific event\n\t * @param {IHook} hook - the hook containing event name and handler to remove\n\t * @returns {IHook | undefined} the removed hook, or undefined if not found\n\t */\n\tpublic removeHook(hook: IHook): IHook | undefined {\n\t\tthis.validateHookName(hook.event);\n\t\tconst eventHandlers = this._hooks.get(hook.event);\n\t\tif (eventHandlers) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.handler === hook.handler);\n\t\t\tif (index !== -1) {\n\t\t\t\teventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(hook.event);\n\t\t\t\t}\n\n\t\t\t\treturn { event: hook.event, handler: hook.handler };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes multiple hook handlers\n\t * @param {Array<IHook>} hooks\n\t * @returns {IHook[]} the hooks that were successfully removed\n\t */\n\tpublic removeHooks(hooks: IHook[]): IHook[] {\n\t\tconst removed: IHook[] = [];\n\t\tfor (const hook of hooks) {\n\t\t\tconst result = this.removeHook(hook);\n\t\t\tif (result) {\n\t\t\t\tremoved.push(result);\n\t\t\t}\n\t\t}\n\n\t\treturn removed;\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 hook of [...eventHandlers]) {\n\t\t\t\ttry {\n\t\t\t\t\tawait hook.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 * Calls all synchronous handlers for a specific event.\n\t * Async handlers (declared with `async` keyword) are silently skipped.\n\t *\n\t * Note: The `hook` method is preferred as it executes both sync and async functions.\n\t * Use `hookSync` only when you specifically need synchronous execution.\n\t * @param {string} event\n\t * @param {T[]} arguments_\n\t * @returns {void}\n\t */\n\tpublic hookSync<T>(event: string, ...arguments_: T[]): void {\n\t\tthis.validateHookName(event);\n\t\tif (!this.checkDeprecatedHook(event)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tfor (const hook of [...eventHandlers]) {\n\t\t\t\t// Skip async functions silently\n\t\t\t\tif (hook.handler.constructor.name === \"AsyncFunction\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\thook.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 {IHook[]}\n\t */\n\tpublic getHooks(event: string) {\n\t\tthis.validateHookName(event);\n\t\treturn this._hooks.get(event);\n\t}\n\n\t/**\n\t * Gets a specific hook by id, searching across all events\n\t * @param {string} id - the hook id\n\t * @returns {IHook | undefined} the hook if found, or undefined\n\t */\n\tpublic getHook(id: string): IHook | undefined {\n\t\tfor (const eventHandlers of this._hooks.values()) {\n\t\t\tconst found = eventHandlers.find((h) => h.id === id);\n\t\t\tif (found) {\n\t\t\t\treturn found;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Removes one or more hooks by id, searching across all events\n\t * @param {string | string[]} id - the hook id or array of hook ids to remove\n\t * @returns {IHook | IHook[] | undefined} the removed hook(s), or undefined/empty array if not found\n\t */\n\tpublic removeHookById(id: string | string[]): IHook | IHook[] | undefined {\n\t\tif (Array.isArray(id)) {\n\t\t\tconst removed: IHook[] = [];\n\t\t\tfor (const singleId of id) {\n\t\t\t\tconst result = this.removeHookById(singleId);\n\t\t\t\tif (result && !Array.isArray(result)) {\n\t\t\t\t\tremoved.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn removed;\n\t\t}\n\n\t\tfor (const [event, eventHandlers] of this._hooks.entries()) {\n\t\t\tconst index = eventHandlers.findIndex((h) => h.id === id);\n\t\t\tif (index !== -1) {\n\t\t\t\tconst [removed] = eventHandlers.splice(index, 1);\n\t\t\t\tif (eventHandlers.length === 0) {\n\t\t\t\t\tthis._hooks.delete(event);\n\t\t\t\t}\n\n\t\t\t\treturn removed;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\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\t/**\n\t * Removes all hooks for a specific event and returns the removed hooks.\n\t * @param {string} event - The event name to remove hooks for.\n\t * @returns {IHook[]} the hooks that were removed\n\t */\n\tpublic removeEventHooks(event: string): IHook[] {\n\t\tthis.validateHookName(event);\n\t\tconst eventHandlers = this._hooks.get(event);\n\t\tif (eventHandlers) {\n\t\t\tconst removed = [...eventHandlers];\n\t\t\tthis._hooks.delete(event);\n\t\t\treturn removed;\n\t\t}\n\n\t\treturn [];\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\nexport { Eventified } from \"./eventified.js\";\nexport { Hook } from \"./hooks/hook.js\";\nexport { WaterfallHook } from \"./hooks/waterfall-hook.js\";\nexport type {\n\tEventEmitterOptions,\n\tEventListener,\n\tIEventEmitter,\n\tLogger,\n} from \"./types.js\";\n"],"mappings":"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","names":["entry"]}
@@ -580,15 +580,21 @@ var Hookified = class extends Eventified {
580
580
  set useHookClone(value) {
581
581
  this._useHookClone = value;
582
582
  }
583
- /**
584
- * Adds a handler function for a specific event.
585
- * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.
586
- * To register multiple hooks at once, use {@link onHooks}.
587
- * @param {IHook} hook - the hook containing event name and handler
588
- * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)
589
- * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation
590
- */
591
- onHook(hook, options) {
583
+ onHook(hookOrEvent, optionsOrHandler) {
584
+ let hook;
585
+ let options;
586
+ if (typeof hookOrEvent === "string") {
587
+ if (typeof optionsOrHandler !== "function") {
588
+ throw new TypeError(
589
+ "When calling onHook(event, handler), the second argument must be a function"
590
+ );
591
+ }
592
+ hook = { event: hookOrEvent, handler: optionsOrHandler };
593
+ options = void 0;
594
+ } else {
595
+ hook = hookOrEvent;
596
+ options = optionsOrHandler;
597
+ }
592
598
  this.validateHookName(hook.event);
593
599
  if (!this.checkDeprecatedHook(hook.event)) {
594
600
  return void 0;
@@ -531,13 +531,16 @@ declare class Hookified extends Eventified {
531
531
  set useHookClone(value: boolean);
532
532
  /**
533
533
  * Adds a handler function for a specific event.
534
- * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.
534
+ * Supports both object and legacy signatures:
535
+ * onHook({ event, handler }, options?)
536
+ * onHook(event, handler)
535
537
  * To register multiple hooks at once, use {@link onHooks}.
536
- * @param {IHook} hook - the hook containing event name and handler
537
- * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)
538
+ * @param {IHook | string} hookOrEvent - the hook object or event name
539
+ * @param {OnHookOptions | HookFn} [optionsOrHandler] - options (when using object form) or handler function (when using string form)
538
540
  * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation
539
541
  */
540
542
  onHook(hook: IHook, options?: OnHookOptions): IHook | undefined;
543
+ onHook(event: string, handler: HookFn): IHook | undefined;
541
544
  /**
542
545
  * Alias for onHook. This is provided for compatibility with other libraries that use the `addHook` method.
543
546
  * @param {string} event - the event name
@@ -531,13 +531,16 @@ declare class Hookified extends Eventified {
531
531
  set useHookClone(value: boolean);
532
532
  /**
533
533
  * Adds a handler function for a specific event.
534
- * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.
534
+ * Supports both object and legacy signatures:
535
+ * onHook({ event, handler }, options?)
536
+ * onHook(event, handler)
535
537
  * To register multiple hooks at once, use {@link onHooks}.
536
- * @param {IHook} hook - the hook containing event name and handler
537
- * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)
538
+ * @param {IHook | string} hookOrEvent - the hook object or event name
539
+ * @param {OnHookOptions | HookFn} [optionsOrHandler] - options (when using object form) or handler function (when using string form)
538
540
  * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation
539
541
  */
540
542
  onHook(hook: IHook, options?: OnHookOptions): IHook | undefined;
543
+ onHook(event: string, handler: HookFn): IHook | undefined;
541
544
  /**
542
545
  * Alias for onHook. This is provided for compatibility with other libraries that use the `addHook` method.
543
546
  * @param {string} event - the event name
@@ -551,15 +551,21 @@ var Hookified = class extends Eventified {
551
551
  set useHookClone(value) {
552
552
  this._useHookClone = value;
553
553
  }
554
- /**
555
- * Adds a handler function for a specific event.
556
- * If you prefer the legacy `(event, handler)` signature, use {@link addHook} instead.
557
- * To register multiple hooks at once, use {@link onHooks}.
558
- * @param {IHook} hook - the hook containing event name and handler
559
- * @param {OnHookOptions} [options] - optional per-call options (e.g., useHookClone override, position)
560
- * @returns {IHook | undefined} the stored hook, or undefined if blocked by deprecation
561
- */
562
- onHook(hook, options) {
554
+ onHook(hookOrEvent, optionsOrHandler) {
555
+ let hook;
556
+ let options;
557
+ if (typeof hookOrEvent === "string") {
558
+ if (typeof optionsOrHandler !== "function") {
559
+ throw new TypeError(
560
+ "When calling onHook(event, handler), the second argument must be a function"
561
+ );
562
+ }
563
+ hook = { event: hookOrEvent, handler: optionsOrHandler };
564
+ options = void 0;
565
+ } else {
566
+ hook = hookOrEvent;
567
+ options = optionsOrHandler;
568
+ }
563
569
  this.validateHookName(hook.event);
564
570
  if (!this.checkDeprecatedHook(hook.event)) {
565
571
  return void 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hookified",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Event Emitting and Middleware Hooks",
5
5
  "type": "module",
6
6
  "main": "./dist/node/index.js",