{"version":3,"file":"index.cjs","names":[],"sources":["../../../../@mongez/events/src/EventsListeners.ts","../../../../@mongez/events/src/events.ts","../../../../@mongez/events/src/index.ts"],"sourcesContent":["import { EventListeners, EventListenersList, EventSubscription } from \"./types\";\r\n\r\nexport default class EventsListeners {\r\n  protected listeners: EventListeners = {};\r\n\r\n  /**\r\n   * Add event subscriptions\r\n   */\r\n  public set(event: string, subscriptions: EventSubscription[]) {\r\n    this.listeners[event] = subscriptions;\r\n  }\r\n\r\n  /**\r\n   * Get all subscriptions for the given event\r\n   */\r\n  public get(event: string) {\r\n    const subscriptions: EventSubscription[] = this.listeners[event] || [];\r\n\r\n    return subscriptions;\r\n  }\r\n\r\n  /**\r\n   * Clear all events\r\n   */\r\n  public clear() {\r\n    this.listeners = {};\r\n  }\r\n\r\n  /**\r\n   * Check if the given event has subscriptions\r\n   */\r\n  public has(event: string) {\r\n    return typeof this.listeners[event] !== \"undefined\";\r\n  }\r\n\r\n  /**\r\n   * Delete the given event\r\n   */\r\n  public delete(event: string) {\r\n    delete this.listeners[event];\r\n  }\r\n\r\n  /**\r\n   * Match an event name against a namespace by segment boundary, not by raw\r\n   * prefix. Without this, `\"users.created\"` matches the namespace `\"user\"`\r\n   * (false positive) and destroying namespace `\"atoms.foo.clone.1\"` would\r\n   * also wipe `\"atoms.foo.clone.10\"`, `\"atoms.foo.clone.100\"`, etc.\r\n   */\r\n  protected matchesNamespace(event: string, namespace: string): boolean {\r\n    return event === namespace || event.startsWith(namespace + \".\");\r\n  }\r\n\r\n  /**\r\n   * List all events by namespace\r\n   */\r\n  public getByNamespace(namespace: string) {\r\n    let events: EventListeners = {};\r\n    for (const event in this.listeners) {\r\n      if (this.matchesNamespace(event, namespace)) {\r\n        events[event] = this.listeners[event];\r\n      }\r\n    }\r\n\r\n    return events;\r\n  }\r\n\r\n  /**\r\n   * Get all events listeners by namespace as an array\r\n   */\r\n  public getByNamespaceArray(namespace: string) {\r\n    let eventSubscriptions: EventListenersList = [];\r\n    for (const event in this.listeners) {\r\n      if (this.matchesNamespace(event, namespace)) {\r\n        eventSubscriptions.push({\r\n          event: event,\r\n          subscriptions: this.listeners[event],\r\n        });\r\n      }\r\n    }\r\n\r\n    return eventSubscriptions;\r\n  }\r\n\r\n  /**\r\n   * Delete all events that belongs to the given namespace\r\n   * i.e \"users\" namespace will affect on: users.created, users.updated, users.deleted will be deleted\r\n   */\r\n  public deleteByNamespace(namespace: string): void {\r\n    for (const event in this.listeners) {\r\n      if (this.matchesNamespace(event, namespace)) {\r\n        delete this.listeners[event];\r\n      }\r\n    }\r\n  }\r\n}\r\n","import EventsListeners from \"./EventsListeners\";\r\nimport { EventSubscription, EventTriggerResponse } from \"./types\";\r\n\r\nclass Events {\r\n  /**\r\n   * Events listeners\r\n   */\r\n  private events = new EventsListeners();\r\n\r\n  /**\r\n   * Add new callback to the given event\r\n   *\r\n   * @alias subscribe\r\n   */\r\n  public on(event: string, callback: Function) {\r\n    return this.addEventListener(event, callback);\r\n  }\r\n\r\n  /**\r\n   * @alias subscribe\r\n   */\r\n  public addEventListener(event: string, callback: Function) {\r\n    return this.subscribe(event, callback);\r\n  }\r\n\r\n  /**\r\n   * Subscribe to the given event\r\n   */\r\n  public subscribe(event: string, callback: Function) {\r\n    const eventHandler = this.events.get(event) || [];\r\n    let subscription: EventSubscription = {\r\n      callback,\r\n      event,\r\n      dispatch(...args) {\r\n        return callback(...args);\r\n      },\r\n      unsubscribe: () => {\r\n        let index = eventHandler.indexOf(subscription);\r\n        if (index !== -1) {\r\n          eventHandler.splice(index, 1);\r\n        }\r\n      },\r\n    };\r\n\r\n    eventHandler.push(subscription);\r\n\r\n    this.events.set(event, eventHandler);\r\n\r\n    return subscription;\r\n  }\r\n\r\n  /**\r\n   * Trigger the given event\r\n   */\r\n  public trigger(event: string, ...args: any[]) {\r\n    const callbacks = this.events.get(event);\r\n\r\n    if (callbacks.length === 0) return;\r\n\r\n    let returnValue;\r\n\r\n    for (let callback of callbacks) {\r\n      let callbackReturn = callback.dispatch(...args);\r\n\r\n      if (callbackReturn === false) {\r\n        return false;\r\n      } else if (callbackReturn !== undefined) {\r\n        returnValue = callbackReturn;\r\n      }\r\n    }\r\n\r\n    return returnValue;\r\n  }\r\n\r\n  /**\r\n   * @alias trigger\r\n   */\r\n  public emit(event: string, ...args: any[]) {\r\n    return this.trigger(event, ...args);\r\n  }\r\n\r\n  /**\r\n   * Trigger the event and do not stop on event callback returning false\r\n   */\r\n  public triggerAll(event: string, ...args: any[]) {\r\n    const callbacks = this.events.get(event);\r\n\r\n    let returnedOutput: EventTriggerResponse = {\r\n      event,\r\n      length: 0,\r\n      results: [],\r\n    };\r\n\r\n    if (callbacks.length === 0) {\r\n      return returnedOutput;\r\n    }\r\n\r\n    for (let callback of callbacks) {\r\n      let callbackReturn = callback.dispatch(...args);\r\n\r\n      returnedOutput.length++;\r\n\r\n      if (callbackReturn !== undefined) {\r\n        returnedOutput.results.push(callbackReturn);\r\n      }\r\n    }\r\n\r\n    return returnedOutput;\r\n  }\r\n\r\n  /**\r\n   * Trigger all callbacks asynchronously\r\n   */\r\n  public async triggerAsync(event: string, ...args: any[]) {\r\n    const callbacks = this.events.get(event);\r\n\r\n    if (callbacks.length === 0) return;\r\n\r\n    let returnValue;\r\n\r\n    for (let callback of callbacks) {\r\n      let callbackReturn = await callback.dispatch(...args);\r\n\r\n      if (callbackReturn === false) {\r\n        return false;\r\n      } else if (callbackReturn !== undefined) {\r\n        returnValue = callbackReturn;\r\n      }\r\n    }\r\n\r\n    return returnValue;\r\n  }\r\n\r\n  /**\r\n   * Trigger all callbacks asynchronously and do not stop on event callback returning false\r\n   */\r\n  public async triggerAllAsync(event: string, ...args: any[]) {\r\n    const callbacks = this.events.get(event);\r\n\r\n    let returnedOutput: EventTriggerResponse = {\r\n      event,\r\n      length: 0,\r\n      results: [],\r\n    };\r\n\r\n    if (callbacks.length === 0) {\r\n      return returnedOutput;\r\n    }\r\n\r\n    for (let callback of callbacks) {\r\n      let callbackReturn = await callback.dispatch(...args);\r\n\r\n      returnedOutput.length++;\r\n\r\n      if (callbackReturn !== undefined) {\r\n        returnedOutput.results.push(callbackReturn);\r\n      }\r\n    }\r\n\r\n    return returnedOutput;\r\n  }\r\n\r\n  /**\r\n   * Remove all events subscriptions\r\n   */\r\n  public unsubscribe(event?: string) {\r\n    if (!event) {\r\n      this.events.clear();\r\n      return this;\r\n    }\r\n\r\n    this.events.delete(event);\r\n\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * @alias unsubscribe\r\n   */\r\n  public off(events?: string) {\r\n    return this.unsubscribe(events);\r\n  }\r\n\r\n  /**\r\n   * Remove all events that belongs to the given namespace\r\n   */\r\n  public unsubscribeNamespace(namespace: string) {\r\n    this.events.deleteByNamespace(namespace);\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * List all events by namespace\r\n   */\r\n  public getByNamespace(namespace: string) {\r\n    return this.events.getByNamespace(namespace);\r\n  }\r\n\r\n  /**\r\n   * Get all events listeners by namespace\r\n   */\r\n  public getByNamespaceArray(namespace: string) {\r\n    return this.events.getByNamespaceArray(namespace);\r\n  }\r\n\r\n  /**\r\n   * Get all event subscriptions for the given event\r\n   */\r\n  public subscriptions(event: string) {\r\n    return this.events.get(event);\r\n  }\r\n}\r\n\r\nconst events = new Events();\r\n\r\nexport default events;\r\n","import events from \"./events\";\r\nexport type { EventSubscription, EventTriggerResponse } from \"./types\";\r\n\r\nexport default events;\r\n"],"mappings":"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"}