{"version":3,"file":"Evented.mjs","sourceRoot":"","sources":["../../src/Evented.ts"],"names":[],"mappings":"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","sourcesContent":["import Map from '@dojo/shim/Map';\nimport { Handle, EventType, EventObject } from './interfaces';\nimport { Destroyable } from './Destroyable';\n\n/**\n * Map of computed regular expressions, keyed by string\n */\nconst regexMap = new Map<string, RegExp>();\n\n/**\n * Determines is the event type glob has been matched\n *\n * @returns boolean that indicates if the glob is matched\n */\nexport function isGlobMatch(globString: string | symbol, targetString: string | symbol): boolean {\n\tif (typeof targetString === 'string' && typeof globString === 'string' && globString.indexOf('*') !== -1) {\n\t\tlet regex: RegExp;\n\t\tif (regexMap.has(globString)) {\n\t\t\tregex = regexMap.get(globString)!;\n\t\t} else {\n\t\t\tregex = new RegExp(`^${globString.replace(/\\*/g, '.*')}$`);\n\t\t\tregexMap.set(globString, regex);\n\t\t}\n\t\treturn regex.test(targetString);\n\t} else {\n\t\treturn globString === targetString;\n\t}\n}\n\nexport type EventedCallback<T = EventType, E extends EventObject<T> = EventObject<T>> = {\n\t/**\n\t * A callback that takes an `event` argument\n\t *\n\t * @param event The event object\n\t */\n\n\t(event: E): boolean | void;\n};\n\nexport interface CustomEventTypes<T extends EventObject<any> = EventObject<any>> {\n\t[index: string]: T;\n}\n\n/**\n * A type which is either a targeted event listener or an array of listeners\n * @template T The type of target for the events\n * @template E The event type for the events\n */\nexport type EventedCallbackOrArray<T = EventType, E extends EventObject<T> = EventObject<T>> =\n\t| EventedCallback<T, E>\n\t| EventedCallback<T, E>[];\n\n/**\n * Event Class\n */\nexport class Evented<\n\tM extends CustomEventTypes = {},\n\tT = EventType,\n\tO extends EventObject<T> = EventObject<T>\n> extends Destroyable {\n\t// The following member is purely so TypeScript remembers the type of `M` when extending so\n\t// that the utilities in `on.ts` will work https://github.com/Microsoft/TypeScript/issues/20348\n\t// tslint:disable-next-line\n\tprotected __typeMap__?: M;\n\t/**\n\t * map of listeners keyed by event type\n\t */\n\tprotected listenersMap: Map<T | keyof M, EventedCallback<T, O>[]> = new Map();\n\n\t/**\n\t * Emits the event object for the specified type\n\t *\n\t * @param event the event to emit\n\t */\n\temit<K extends keyof M>(event: M[K]): void;\n\temit(event: O): void;\n\temit(event: any): void {\n\t\tthis.listenersMap.forEach((methods, type) => {\n\t\t\tif (isGlobMatch(type as any, event.type)) {\n\t\t\t\tmethods.forEach((method) => {\n\t\t\t\t\tmethod.call(this, event);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Catch all handler for various call signatures. The signatures are defined in\n\t * `BaseEventedEvents`.  You can add your own event type -> handler types by extending\n\t * `BaseEventedEvents`.  See example for details.\n\t *\n\t * @param args\n\t *\n\t * @example\n\t *\n\t * interface WidgetBaseEvents extends BaseEventedEvents {\n\t *     (type: 'properties:changed', handler: PropertiesChangedHandler): Handle;\n\t * }\n\t * class WidgetBase extends Evented {\n\t *    on: WidgetBaseEvents;\n\t * }\n\t *\n\t * @return {any}\n\t */\n\ton<K extends keyof M>(type: K, listener: EventedCallbackOrArray<K, M[K]>): Handle;\n\ton(type: T, listener: EventedCallbackOrArray<T, O>): Handle;\n\ton(type: any, listener: EventedCallbackOrArray<any, any>): Handle {\n\t\tif (Array.isArray(listener)) {\n\t\t\tconst handles = listener.map((listener) => this._addListener(type, listener));\n\t\t\treturn {\n\t\t\t\tdestroy() {\n\t\t\t\t\thandles.forEach((handle) => handle.destroy());\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\treturn this._addListener(type, listener);\n\t}\n\n\tprivate _addListener(type: T | keyof M, listener: EventedCallback<T, O>) {\n\t\tconst listeners = this.listenersMap.get(type) || [];\n\t\tlisteners.push(listener);\n\t\tthis.listenersMap.set(type, listeners);\n\t\treturn {\n\t\t\tdestroy: () => {\n\t\t\t\tconst listeners = this.listenersMap.get(type) || [];\n\t\t\t\tlisteners.splice(listeners.indexOf(listener), 1);\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default Evented;\n"]}