eventify 2.0.1 → 3.0.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/BENCHMARKS.md +196 -0
- package/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +319 -160
- package/dist/index.d.ts +117 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +624 -0
- package/dist/index.js.map +10 -0
- package/package.json +54 -64
- package/.jshintrc +0 -35
- package/.npmignore +0 -8
- package/.travis.yml +0 -9
- package/Gruntfile.js +0 -53
- package/Makefile +0 -49
- package/dist/eventify.min.js +0 -1
- package/index.js +0 -1
- package/lib/ender.js +0 -8
- package/lib/eventify.js +0 -377
- package/test/browser-dist.html +0 -22
- package/test/browser.html +0 -23
- package/test/eventify.test.js +0 -730
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/* Eventify v3 - type-safe, schema-optional */\n\nexport type EventMap = Record<string, unknown>;\n\nexport type PayloadArgs<T> = [T] extends [void]\n ? []\n : [T] extends [undefined]\n ? []\n : T extends readonly unknown[]\n ? T\n : [T];\n\nexport type PayloadValue<T> = T extends readonly unknown[] ? T : T;\n\nexport type EventName<Events extends EventMap> = Extract<keyof Events, string>;\n\nexport type EventHandler<T> = (...args: PayloadArgs<T>) => unknown;\n\nexport type AllHandler<Events extends EventMap> = (\n event: EventName<Events>,\n ...args: unknown[]\n) => unknown;\n\nexport type EventHandlerMap<Events extends EventMap> = {\n [K in keyof Events]?: EventHandler<Events[K]>;\n};\n\nexport type SchemaLike<T = unknown> =\n | { parse: (input: unknown) => T }\n | {\n safeParse: (\n input: unknown,\n ) => { success: true; data: T } | { success: false; error: unknown };\n };\n\nexport type SchemaMap = Record<string, SchemaLike>;\n\nexport type InferSchema<S> = S extends { parse: (input: unknown) => infer T }\n ? T\n : S extends {\n safeParse: (input: unknown) => { success: true; data: infer T };\n }\n ? T\n : unknown;\n\nexport type EventsFromSchemas<TSchemas> = TSchemas extends SchemaMap\n ? { [K in keyof TSchemas]: InferSchema<TSchemas[K]> }\n : EventMap;\n\nexport type ValidationMeta = { event: string };\n\nexport type SchemaValidator<TSchema extends SchemaLike = SchemaLike> = (\n schema: TSchema,\n payload: unknown,\n meta: ValidationMeta,\n) => unknown;\n\nexport type ErrorMeta<Events extends EventMap> = {\n event: EventName<Events> | string;\n args: unknown[];\n listener?: (...args: unknown[]) => unknown;\n emitter: object;\n};\n\nexport type ErrorHandler<Events extends EventMap> = (\n error: unknown,\n meta: ErrorMeta<Events>,\n) => void;\n\nexport type EventifyOptions<\n TSchemas extends SchemaMap | undefined = undefined,\n TEvents extends EventMap = EventMap,\n> = {\n schemas?: TSchemas;\n validate?: SchemaValidator;\n onError?: ErrorHandler<TEvents>;\n namespaceDelimiter?: string;\n wildcard?: string;\n};\n\nexport type IterateOptions = {\n signal?: AbortSignal;\n};\n\nexport interface EventifyEmitter<Events extends EventMap = EventMap> {\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ): void;\n dispatchEvent(event: Event): boolean;\n\n on<K extends EventName<Events>>(\n name: K,\n callback: EventHandler<Events[K]>,\n context?: unknown,\n ): this;\n on(name: \"all\", callback: AllHandler<Events>, context?: unknown): this;\n on(name: EventHandlerMap<Events>, context?: unknown): this;\n on(\n name: string,\n callback?: (...args: unknown[]) => unknown,\n context?: unknown,\n ): this;\n\n once<K extends EventName<Events>>(\n name: K,\n callback: EventHandler<Events[K]>,\n context?: unknown,\n ): this;\n once(name: \"all\", callback: AllHandler<Events>, context?: unknown): this;\n once(name: EventHandlerMap<Events>, context?: unknown): this;\n once(\n name: string,\n callback?: (...args: unknown[]) => unknown,\n context?: unknown,\n ): this;\n\n off(): this;\n off<K extends EventName<Events>>(\n name: K,\n callback?: EventHandler<Events[K]> | null,\n context?: unknown,\n ): this;\n off(name: EventHandlerMap<Events>, context?: unknown): this;\n off(\n name?: string | null,\n callback?: ((...args: unknown[]) => unknown) | null,\n context?: unknown,\n ): this;\n\n trigger<K extends EventName<Events>>(\n name: K,\n ...args: PayloadArgs<Events[K]>\n ): this;\n trigger(name: string, ...args: unknown[]): this;\n emit<K extends EventName<Events>>(\n name: K,\n ...args: PayloadArgs<Events[K]>\n ): this;\n emit(name: string, ...args: unknown[]): this;\n produce<K extends EventName<Events>>(\n name: K,\n ...args: PayloadArgs<Events[K]>\n ): this;\n produce(name: string, ...args: unknown[]): this;\n\n listenTo<OtherEvents extends EventMap, K extends EventName<OtherEvents>>(\n other: EventifyEmitter<OtherEvents>,\n name: K,\n callback: EventHandler<OtherEvents[K]>,\n ): this;\n listenTo<OtherEvents extends EventMap>(\n other: EventifyEmitter<OtherEvents>,\n name: EventHandlerMap<OtherEvents>,\n ): this;\n listenTo(\n other: EventifyEmitter<EventMap>,\n name: string,\n callback?: (...args: unknown[]) => unknown,\n ): this;\n\n listenToOnce<OtherEvents extends EventMap, K extends EventName<OtherEvents>>(\n other: EventifyEmitter<OtherEvents>,\n name: K,\n callback: EventHandler<OtherEvents[K]>,\n ): this;\n listenToOnce<OtherEvents extends EventMap>(\n other: EventifyEmitter<OtherEvents>,\n name: EventHandlerMap<OtherEvents>,\n ): this;\n listenToOnce(\n other: EventifyEmitter<EventMap>,\n name: string,\n callback?: (...args: unknown[]) => unknown,\n ): this;\n\n stopListening<OtherEvents extends EventMap>(\n other?: EventifyEmitter<OtherEvents> | null,\n name?: EventName<OtherEvents> | EventHandlerMap<OtherEvents> | null,\n callback?: ((...args: unknown[]) => unknown) | null,\n ): this;\n\n iterate<K extends EventName<Events>>(\n name: K,\n options?: IterateOptions,\n ): AsyncIterableIterator<PayloadValue<Events[K]>>;\n iterate(\n name: \"all\",\n options?: IterateOptions,\n ): AsyncIterableIterator<[EventName<Events>, ...unknown[]]>;\n iterate(\n name: string,\n options?: IterateOptions,\n ): AsyncIterableIterator<unknown>;\n}\n\nexport interface EventifyStatic<\n Events extends EventMap = EventMap,\n> extends EventifyEmitter<Events> {\n version: string;\n enable<TTarget extends object, TSchemas extends SchemaMap>(\n target: TTarget | undefined,\n options: EventifyOptions<TSchemas, EventsFromSchemas<TSchemas>> & {\n schemas: TSchemas;\n },\n ): TTarget & EventifyEmitter<EventsFromSchemas<TSchemas>>;\n enable<\n TTarget extends object,\n TEvents extends EventMap = EventMap,\n TSchemas extends SchemaMap | undefined = undefined,\n >(\n target?: TTarget,\n options?: EventifyOptions<TSchemas, TEvents>,\n ): TTarget & EventifyEmitter<TEvents>;\n create<TSchemas extends SchemaMap>(\n options: EventifyOptions<TSchemas, EventsFromSchemas<TSchemas>> & {\n schemas: TSchemas;\n },\n ): EventifyEmitter<EventsFromSchemas<TSchemas>>;\n create<\n TEvents extends EventMap = EventMap,\n TSchemas extends SchemaMap | undefined = undefined,\n >(\n options?: EventifyOptions<TSchemas, TEvents>,\n ): EventifyEmitter<TEvents>;\n mixin: EventifyStatic[\"enable\"];\n proto: EventifyEmitter<EventMap>;\n noConflict: () => EventifyStatic<Events>;\n defaultSchemaValidator: SchemaValidator;\n}\n\ntype AnyCallback = (...args: unknown[]) => unknown;\ntype AnyEmitter = EventifyEmitter<EventMap>;\n\ntype CallbackWithOriginal = AnyCallback & {\n _callback?: AnyCallback;\n};\n\ntype ListenerEntry = {\n callback: CallbackWithOriginal;\n context?: unknown;\n ctx: unknown;\n};\n\ntype SegmentPatternEntry = ListenerEntry & {\n pattern: string;\n match: \"segments\";\n segments: string[];\n trailingWildcard: boolean;\n};\n\ntype PrefixPatternEntry = ListenerEntry & {\n pattern: string;\n match: \"prefix\";\n prefix: string;\n};\n\ntype PatternEntry = SegmentPatternEntry | PrefixPatternEntry;\n\ntype EmitterState = {\n events: Map<string, ListenerEntry[]>;\n patterns: PatternEntry[];\n all: ListenerEntry[];\n listeningTo: Set<AnyEmitter>;\n target: EventTarget;\n dispatchers: Map<string, EventListener>;\n nativeListeners: Map<string, Set<EventListenerOrEventListenerObject>>;\n schemas: SchemaMap | undefined;\n validate: SchemaValidator | undefined;\n onError: ErrorHandler<EventMap>;\n namespaceDelimiter: string;\n wildcard: string;\n};\n\nconst eventSplitter = /\\s+/;\nconst eventifyArgsKey: unique symbol = Symbol(\"eventifyArgs\");\nconst eventifyListenersKey: unique symbol = Symbol(\"eventifyListeners\");\n\ntype EventifyCustomEvent = CustomEvent<unknown> & {\n [eventifyArgsKey]?: unknown[];\n [eventifyListenersKey]?: ListenerEntry[];\n};\n\nconst stateByEmitter = new WeakMap<object, EmitterState>();\n\nfunction noop(): void {}\n\nfunction reportError(\n state: EmitterState,\n error: unknown,\n meta: ErrorMeta<EventMap>,\n): void {\n try {\n state.onError?.(error, meta);\n } catch {\n // Swallow error handler failures to avoid crashes.\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n );\n}\n\nfunction safeCall(\n state: EmitterState,\n callback: CallbackWithOriginal,\n ctx: unknown,\n args: unknown[],\n meta: ErrorMeta<EventMap>,\n): void {\n try {\n const result = callback.apply(ctx, args);\n if (isPromiseLike(result)) {\n result.then(undefined, (error: unknown) =>\n reportError(state, error, meta),\n );\n }\n } catch (error) {\n reportError(state, error, meta);\n }\n}\n\nfunction getEventArgs(event: Event): unknown[] {\n const customEvent = event as EventifyCustomEvent;\n const stored = customEvent[eventifyArgsKey];\n if (stored) {\n return stored;\n }\n if (\"detail\" in customEvent) {\n const detail = (customEvent as CustomEvent<unknown>).detail;\n if (detail === undefined) {\n return [];\n }\n return Array.isArray(detail) ? detail : [detail];\n }\n return [];\n}\n\nfunction createEvent(name: string, args: unknown[]): CustomEvent<unknown> {\n const detail = args.length <= 1 ? args[0] : args;\n const event = new CustomEvent(name, { detail }) as EventifyCustomEvent;\n Object.defineProperty(event, eventifyArgsKey, {\n value: args,\n enumerable: false,\n });\n return event;\n}\n\ntype EventApiAction = \"on\" | \"once\" | \"off\" | \"trigger\";\nfunction eventsApi(\n obj: AnyEmitter,\n action: EventApiAction,\n name: unknown,\n rest: unknown[],\n): boolean {\n if (!name) {\n return true;\n }\n const target = obj as EventifyEmitter<EventMap>;\n const method = target[action] as (...args: unknown[]) => unknown;\n if (typeof name === \"object\") {\n for (const key in name as Record<string, unknown>) {\n if (Object.prototype.hasOwnProperty.call(name, key)) {\n method.call(\n target,\n key,\n (name as Record<string, unknown>)[key],\n ...rest,\n );\n }\n }\n return false;\n }\n if (typeof name === \"string\" && eventSplitter.test(name)) {\n const names = name.split(eventSplitter);\n for (const eventName of names) {\n method.call(target, eventName, ...rest);\n }\n return false;\n }\n return true;\n}\n\nexport function defaultSchemaValidator(\n schema: SchemaLike,\n payload: unknown,\n _meta: ValidationMeta,\n): unknown {\n if (schema && typeof (schema as { parse?: unknown }).parse === \"function\") {\n return (schema as { parse: (input: unknown) => unknown }).parse(payload);\n }\n if (\n schema &&\n typeof (schema as { safeParse?: unknown }).safeParse === \"function\"\n ) {\n const result = (\n schema as {\n safeParse: (input: unknown) => {\n success: boolean;\n data?: unknown;\n error?: unknown;\n };\n }\n ).safeParse(payload);\n if (result && result.success) {\n return result.data;\n }\n throw result?.error ?? new Error(\"Schema validation failed\");\n }\n throw new TypeError(\"Schema validator missing parse/safeParse\");\n}\n\nfunction getState(target: object, options?: EventifyOptions): EmitterState {\n let state = stateByEmitter.get(target);\n if (!state) {\n const created: EmitterState = {\n events: new Map(),\n patterns: [],\n all: [],\n listeningTo: new Set(),\n target: new EventTarget(),\n dispatchers: new Map(),\n nativeListeners: new Map(),\n schemas: options?.schemas,\n validate: options?.validate,\n onError: options?.onError ?? noop,\n namespaceDelimiter: options?.namespaceDelimiter ?? \"/\",\n wildcard: options?.wildcard ?? \"*\",\n };\n if (options?.schemas && !created.validate) {\n created.validate = defaultSchemaValidator;\n }\n stateByEmitter.set(target, created);\n return created;\n }\n if (options) {\n if (options.schemas) {\n state.schemas = options.schemas;\n if (!state.validate) {\n state.validate = defaultSchemaValidator;\n }\n }\n if (options.validate) {\n state.validate = options.validate;\n }\n if (options.onError) {\n state.onError = options.onError;\n }\n if (options.namespaceDelimiter) {\n state.namespaceDelimiter = options.namespaceDelimiter;\n }\n if (options.wildcard) {\n state.wildcard = options.wildcard;\n }\n }\n return state;\n}\n\nfunction getExistingState(target: object): EmitterState | undefined {\n return stateByEmitter.get(target);\n}\n\nfunction normalizeValidatedArgs(\n state: EmitterState,\n event: string,\n args: unknown[],\n): unknown[] {\n if (!state.schemas) {\n return args;\n }\n const schema = state.schemas[event];\n if (!schema) {\n return args;\n }\n const validator = state.validate ?? defaultSchemaValidator;\n if (args.length === 0) {\n validator(schema, undefined, { event });\n return [];\n }\n const payload = args.length === 1 ? args[0] : args;\n const parsed = validator(schema, payload, { event });\n if (args.length === 1) {\n return [parsed];\n }\n if (!Array.isArray(parsed)) {\n throw new TypeError(\n `Schema for event \"${event}\" must return an array/tuple for multi-arg events`,\n );\n }\n return parsed;\n}\n\nfunction splitName(name: string, delimiter: string): string[] {\n return delimiter ? name.split(delimiter) : [name];\n}\n\nfunction isPatternName(state: EmitterState, name: string): boolean {\n const wildcard = state.wildcard;\n if (!wildcard) {\n return false;\n }\n if (name.indexOf(wildcard) === -1) {\n return false;\n }\n const delimiter = state.namespaceDelimiter;\n const segments = splitName(name, delimiter);\n return segments.includes(wildcard);\n}\n\nfunction matchesPatternSegments(\n state: EmitterState,\n entry: SegmentPatternEntry,\n eventSegments: string[],\n): boolean {\n const wildcard = state.wildcard;\n const patternSegments = entry.segments;\n const patternLength = patternSegments.length;\n const eventLength = eventSegments.length;\n\n if (entry.trailingWildcard) {\n if (eventLength < patternLength) {\n return false;\n }\n } else if (eventLength !== patternLength) {\n return false;\n }\n\n const lastIndex = entry.trailingWildcard ? patternLength - 1 : patternLength;\n for (let i = 0; i < lastIndex; i += 1) {\n const segment = patternSegments[i];\n if (segment === wildcard) {\n continue;\n }\n if (segment !== eventSegments[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction addListener(\n emitter: object,\n name: string,\n callback: CallbackWithOriginal,\n context?: unknown,\n): void {\n const state = getState(emitter);\n const ctx = context ?? emitter;\n const entry: ListenerEntry = {\n callback,\n context,\n ctx,\n };\n\n if (name === \"all\") {\n state.all.push(entry);\n return;\n }\n if (isPatternName(state, name)) {\n const segments = splitName(name, state.namespaceDelimiter);\n const trailingWildcard = segments[segments.length - 1] === state.wildcard;\n const hasInternalWildcard = segments.slice(0, -1).includes(state.wildcard);\n if (trailingWildcard && !hasInternalWildcard) {\n state.patterns.push({\n ...entry,\n pattern: name,\n match: \"prefix\",\n prefix: name.slice(0, Math.max(0, name.length - state.wildcard.length)),\n });\n } else {\n state.patterns.push({\n ...entry,\n pattern: name,\n match: \"segments\",\n segments,\n trailingWildcard,\n });\n }\n return;\n }\n\n let list = state.events.get(name);\n if (!list) {\n list = [];\n state.events.set(name, list);\n }\n if (!state.dispatchers.has(name)) {\n const dispatcher: EventListener = (event) => {\n const args = getEventArgs(event);\n const snapshot =\n (event as EventifyCustomEvent)[eventifyListenersKey] ??\n state.events.get(name) ??\n [];\n for (const listenerEntry of snapshot) {\n safeCall(state, listenerEntry.callback, listenerEntry.ctx, args, {\n event: name,\n args,\n listener: listenerEntry.callback,\n emitter,\n });\n }\n };\n state.dispatchers.set(name, dispatcher);\n state.target.addEventListener(name, dispatcher);\n }\n list.push(entry);\n}\n\nfunction removeListener(\n state: EmitterState,\n name: string,\n callback?: CallbackWithOriginal | null,\n context?: unknown,\n): void {\n const matches = (entry: ListenerEntry): boolean => {\n const cb = callback as CallbackWithOriginal | null | undefined;\n const cbMatches =\n !cb || cb === entry.callback || cb === entry.callback._callback;\n const ctxMatches = !context || context === entry.context;\n return cbMatches && ctxMatches;\n };\n\n const removeFromList = (list: ListenerEntry[]): ListenerEntry[] => {\n const retained: ListenerEntry[] = [];\n for (const entry of list) {\n if (matches(entry)) {\n } else {\n retained.push(entry);\n }\n }\n return retained;\n };\n\n if (name === \"all\") {\n state.all = removeFromList(state.all);\n return;\n }\n if (isPatternName(state, name)) {\n const retained: PatternEntry[] = [];\n for (const entry of state.patterns) {\n if (entry.pattern !== name || !matches(entry)) {\n retained.push(entry);\n }\n }\n state.patterns = retained;\n return;\n }\n\n const list = state.events.get(name);\n if (!list) {\n return;\n }\n const retained = removeFromList(list);\n if (retained.length) {\n state.events.set(name, retained);\n } else {\n state.events.delete(name);\n const dispatcher = state.dispatchers.get(name);\n if (dispatcher) {\n state.target.removeEventListener(name, dispatcher);\n state.dispatchers.delete(name);\n }\n }\n}\n\nfunction iterate(\n this: AnyEmitter,\n name: \"all\",\n options?: IterateOptions,\n): AsyncIterableIterator<[EventName<EventMap>, ...unknown[]]>;\nfunction iterate(\n this: AnyEmitter,\n name: string,\n options?: IterateOptions,\n): AsyncIterableIterator<unknown>;\nfunction iterate(\n this: AnyEmitter,\n name: string,\n options?: IterateOptions,\n): AsyncIterableIterator<unknown> {\n const emitter = this as AnyEmitter;\n const queue: unknown[] = [];\n let pending: ((value: IteratorResult<unknown>) => void) | null = null;\n let done = false;\n const isAll = name === \"all\";\n\n const handler = (...args: unknown[]) => {\n if (done) {\n return;\n }\n const value = isAll ? args : args.length === 1 ? args[0] : args;\n if (pending) {\n const resolve = pending;\n pending = null;\n resolve({ value, done: false });\n return;\n }\n queue.push(value);\n };\n\n emitter.on(name, handler);\n\n const stop = () => {\n if (done) {\n return;\n }\n done = true;\n emitter.off(name, handler);\n if (pending) {\n const resolve = pending;\n pending = null;\n resolve({ value: undefined, done: true });\n }\n };\n\n if (options?.signal) {\n if (options.signal.aborted) {\n stop();\n } else {\n options.signal.addEventListener(\"abort\", stop, { once: true });\n }\n }\n\n const iterator: AsyncIterableIterator<unknown> = {\n [Symbol.asyncIterator]() {\n return iterator;\n },\n next() {\n if (queue.length) {\n const value = queue.shift() as unknown;\n return Promise.resolve({ value, done: false });\n }\n if (done) {\n return Promise.resolve({ value: undefined, done: true });\n }\n return new Promise((resolve) => {\n pending = resolve;\n });\n },\n return() {\n stop();\n return Promise.resolve({ value: undefined, done: true });\n },\n throw(error) {\n stop();\n return Promise.reject(error);\n },\n };\n\n return iterator;\n}\n\nconst proto: EventifyEmitter<EventMap> = {\n addEventListener(\n this: AnyEmitter,\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ) {\n const state = getState(this);\n state.target.addEventListener(type, listener, options);\n if (listener) {\n const listeners = state.nativeListeners.get(type) ?? new Set();\n listeners.add(listener);\n state.nativeListeners.set(type, listeners);\n }\n },\n\n removeEventListener(\n this: AnyEmitter,\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ) {\n const state = getExistingState(this);\n if (!state) {\n return;\n }\n state.target.removeEventListener(type, listener, options);\n if (listener) {\n const listeners = state.nativeListeners.get(type);\n if (listeners) {\n listeners.delete(listener);\n if (!listeners.size) {\n state.nativeListeners.delete(type);\n }\n }\n }\n },\n\n dispatchEvent(this: AnyEmitter, event: Event) {\n const state = getState(this);\n return state.target.dispatchEvent(event);\n },\n\n on(this: AnyEmitter, name: unknown, callback?: unknown, context?: unknown) {\n if (!eventsApi(this, \"on\", name, [callback, context]) || !callback) {\n return this;\n }\n addListener(\n this,\n name as string,\n callback as CallbackWithOriginal,\n context,\n );\n return this;\n },\n\n once(this: AnyEmitter, name: unknown, callback?: unknown, context?: unknown) {\n if (!eventsApi(this, \"once\", name, [callback, context]) || !callback) {\n return this;\n }\n const self = this as AnyEmitter;\n let ran = false;\n const onceListener: CallbackWithOriginal = function (\n this: unknown,\n ...args: unknown[]\n ) {\n if (ran) {\n return undefined;\n }\n ran = true;\n self.off(name as string, onceListener, context);\n return (callback as CallbackWithOriginal).apply(this, args);\n } as CallbackWithOriginal;\n onceListener._callback = callback as CallbackWithOriginal;\n return (this as AnyEmitter).on(name as string, onceListener, context);\n },\n\n off(this: AnyEmitter, name?: unknown, callback?: unknown, context?: unknown) {\n const state = getExistingState(this);\n if (!state || !eventsApi(this, \"off\", name, [callback, context])) {\n return this;\n }\n if (!name && !callback && !context) {\n for (const [eventName, dispatcher] of state.dispatchers) {\n state.target.removeEventListener(eventName, dispatcher);\n }\n state.events.clear();\n state.dispatchers.clear();\n state.patterns = [];\n state.all = [];\n return this;\n }\n\n const patternNames = new Set(state.patterns.map((entry) => entry.pattern));\n const names = name\n ? [name as string]\n : [\n ...state.events.keys(),\n ...patternNames,\n ...(state.all.length ? [\"all\"] : []),\n ];\n\n for (const eventName of names) {\n removeListener(\n state,\n eventName,\n callback as CallbackWithOriginal,\n context,\n );\n }\n return this;\n },\n\n trigger(this: AnyEmitter, name: unknown, ...args: unknown[]) {\n const state = getExistingState(this);\n if (!state) {\n return this;\n }\n if (!eventsApi(this, \"trigger\", name, args)) {\n return this;\n }\n\n const eventName = name as string;\n const validatedArgs = normalizeValidatedArgs(state, eventName, args);\n\n const eventSnapshot = state.events.get(eventName)?.slice() ?? null;\n const patternSnapshot = state.patterns.length\n ? state.patterns.slice()\n : null;\n const allSnapshot = state.all.length ? state.all.slice() : null;\n let eventSegments: string[] | null = null;\n\n const hasNativeListeners = state.nativeListeners.get(eventName)?.size;\n if (hasNativeListeners) {\n const event = createEvent(eventName, validatedArgs);\n if (eventSnapshot?.length) {\n Object.defineProperty(event, eventifyListenersKey, {\n value: eventSnapshot,\n enumerable: false,\n });\n }\n state.target.dispatchEvent(event);\n } else if (eventSnapshot?.length) {\n for (const entry of eventSnapshot) {\n safeCall(state, entry.callback, entry.ctx, validatedArgs, {\n event: eventName,\n args: validatedArgs,\n listener: entry.callback,\n emitter: this,\n });\n }\n }\n\n if (patternSnapshot) {\n for (const entry of patternSnapshot) {\n if (entry.match === \"prefix\") {\n if (!eventName.startsWith(entry.prefix)) {\n continue;\n }\n } else {\n if (!eventSegments) {\n eventSegments = splitName(eventName, state.namespaceDelimiter);\n }\n if (!matchesPatternSegments(state, entry, eventSegments)) {\n continue;\n }\n }\n safeCall(state, entry.callback, entry.ctx, validatedArgs, {\n event: eventName,\n args: validatedArgs,\n listener: entry.callback,\n emitter: this,\n });\n }\n }\n\n if (allSnapshot) {\n for (const entry of allSnapshot) {\n safeCall(\n state,\n entry.callback,\n entry.ctx,\n [eventName, ...validatedArgs],\n {\n event: eventName,\n args: validatedArgs,\n listener: entry.callback,\n emitter: this,\n },\n );\n }\n }\n\n return this;\n },\n\n emit(this: AnyEmitter, name: unknown, ...args: unknown[]) {\n return (this as AnyEmitter).trigger(name as string, ...args);\n },\n\n produce(this: AnyEmitter, name: unknown, ...args: unknown[]) {\n return (this as AnyEmitter).trigger(name as string, ...args);\n },\n\n listenTo(this: AnyEmitter, obj: unknown, name: unknown, callback?: unknown) {\n if (!obj) {\n return this;\n }\n const state = getState(this);\n state.listeningTo.add(obj as AnyEmitter);\n if (name && typeof name === \"object\") {\n callback = this;\n }\n const target = obj as AnyEmitter;\n if (name && typeof name === \"object\") {\n target.on(name as EventHandlerMap<EventMap>, this);\n } else {\n target.on(\n name as string,\n callback as CallbackWithOriginal | undefined,\n this,\n );\n }\n return this;\n },\n\n listenToOnce(\n this: AnyEmitter,\n obj: unknown,\n name: unknown,\n callback?: unknown,\n ) {\n if (!obj) {\n return this;\n }\n const state = getState(this);\n state.listeningTo.add(obj as AnyEmitter);\n if (name && typeof name === \"object\") {\n callback = this;\n }\n const target = obj as AnyEmitter;\n if (name && typeof name === \"object\") {\n target.once(name as EventHandlerMap<EventMap>, this);\n } else {\n target.once(\n name as string,\n callback as CallbackWithOriginal | undefined,\n this,\n );\n }\n return this;\n },\n\n stopListening(\n this: AnyEmitter,\n obj?: unknown,\n name?: unknown,\n callback?: unknown,\n ) {\n const state = getExistingState(this);\n if (!state) {\n return this;\n }\n const deleteListener = !name && !callback;\n if (name && typeof name === \"object\") {\n callback = this;\n }\n\n const targets: AnyEmitter[] = [];\n if (obj) {\n targets.push(obj as AnyEmitter);\n } else {\n targets.push(...state.listeningTo.values());\n }\n\n for (const target of targets) {\n if (name && typeof name === \"object\") {\n target.off(name as EventHandlerMap<EventMap>, this);\n } else {\n target.off(\n name as string | null | undefined,\n callback as CallbackWithOriginal | null | undefined,\n this,\n );\n }\n if (deleteListener) {\n state.listeningTo.delete(target);\n }\n }\n if (deleteListener && !obj) {\n state.listeningTo.clear();\n }\n return this;\n },\n\n iterate,\n};\n\nexport function createEventify<TSchemas extends SchemaMap>(\n options: EventifyOptions<TSchemas, EventsFromSchemas<TSchemas>> & {\n schemas: TSchemas;\n },\n): EventifyEmitter<EventsFromSchemas<TSchemas>>;\nexport function createEventify<\n TEvents extends EventMap = EventMap,\n TSchemas extends SchemaMap | undefined = undefined,\n>(options?: EventifyOptions<TSchemas, TEvents>): EventifyEmitter<TEvents>;\nexport function createEventify(\n options?: EventifyOptions,\n): EventifyEmitter<EventMap> {\n const emitter = Object.create(proto) as EventifyEmitter<EventMap>;\n getState(emitter, options as EventifyOptions);\n return emitter;\n}\n\nexport function enable<TTarget extends object, TSchemas extends SchemaMap>(\n target: TTarget | undefined,\n options: EventifyOptions<TSchemas, EventsFromSchemas<TSchemas>> & {\n schemas: TSchemas;\n },\n): TTarget & EventifyEmitter<EventsFromSchemas<TSchemas>>;\nexport function enable<\n TTarget extends object,\n TEvents extends EventMap = EventMap,\n TSchemas extends SchemaMap | undefined = undefined,\n>(\n target?: TTarget,\n options?: EventifyOptions<TSchemas, TEvents>,\n): TTarget & EventifyEmitter<TEvents>;\nexport function enable(\n target?: object,\n options?: EventifyOptions,\n): object & EventifyEmitter<EventMap> {\n const destination = (target ?? {}) as Record<string, unknown>;\n const protoMethods = proto as unknown as Record<string, unknown>;\n for (const method of Object.keys(proto)) {\n destination[method] = protoMethods[method];\n }\n getState(destination, options as EventifyOptions);\n return destination as unknown as object & EventifyEmitter<EventMap>;\n}\n\nconst EventifyInstance = createEventify();\n\nconst Eventify = Object.assign(EventifyInstance, {\n version: \"3.0.0\",\n enable,\n create: createEventify,\n mixin: enable,\n proto,\n noConflict: () => Eventify as EventifyStatic,\n defaultSchemaValidator,\n}) as EventifyStatic;\n\nconst createEmitter = createEventify;\nconst decorateWithEvents = enable;\nconst setDefaultSchemaValidator = defaultSchemaValidator;\n\nexport {\n Eventify,\n createEmitter,\n decorateWithEvents,\n setDefaultSchemaValidator,\n};\nexport default Eventify;\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "CC1457DA4423BE7364756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/package.json
CHANGED
|
@@ -1,80 +1,70 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eventify",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "Tiny event emitter with strict TypeScript typings and optional schema validation.",
|
|
5
5
|
"author": "Bermi Ferrer <bermi@bermilabs.com>",
|
|
6
|
-
"
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
7
8
|
"keywords": [
|
|
8
9
|
"event",
|
|
9
10
|
"eventify",
|
|
10
11
|
"events",
|
|
11
|
-
"browser",
|
|
12
|
-
"trigger",
|
|
13
12
|
"observer",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
],
|
|
21
|
-
"bugs": {
|
|
22
|
-
"url": "https://github.com/bermi/eventify/issues"
|
|
23
|
-
},
|
|
24
|
-
"licenses": [
|
|
25
|
-
{
|
|
26
|
-
"type": "MIT",
|
|
27
|
-
"url": "http://opensource.org/licenses/mit-license.php"
|
|
28
|
-
}
|
|
13
|
+
"emit",
|
|
14
|
+
"trigger",
|
|
15
|
+
"wildcard",
|
|
16
|
+
"typed",
|
|
17
|
+
"schema",
|
|
18
|
+
"backbone"
|
|
29
19
|
],
|
|
30
|
-
"repository": {
|
|
31
|
-
"type": "git",
|
|
32
|
-
"url": "git://github.com/bermi/eventify.git"
|
|
33
|
-
},
|
|
34
20
|
"engines": {
|
|
35
|
-
"node": ">=
|
|
21
|
+
"node": ">=20"
|
|
36
22
|
},
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"load-grunt-tasks": "~3.1.0",
|
|
49
|
-
"mocha": "2.0.1",
|
|
50
|
-
"mocha-spec-cov": "0.0.3"
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"browser": "./dist/index.js",
|
|
30
|
+
"bun": "./dist/index.js",
|
|
31
|
+
"node": "./dist/index.js",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
}
|
|
51
34
|
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"BENCHMARKS.md",
|
|
38
|
+
"CHANGELOG.md",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE"
|
|
41
|
+
],
|
|
52
42
|
"scripts": {
|
|
53
|
-
"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"
|
|
67
|
-
"
|
|
43
|
+
"check": "bun x tsc -p tsconfig.json --noEmit",
|
|
44
|
+
"build": "bun build src/index.ts --outdir dist --entry-naming \"[name].js\" --format esm --target=browser --sourcemap=linked",
|
|
45
|
+
"build:types": "bun x tsc -p tsconfig.types.json",
|
|
46
|
+
"build:all": "bun run build && bun run build:types",
|
|
47
|
+
"bench": "bun run build && bun run bench/bench.mjs",
|
|
48
|
+
"bench:structures": "bun run bench/structures.mjs",
|
|
49
|
+
"bench:patterns": "bun run bench/patterns.mjs",
|
|
50
|
+
"bench:node": "bun run build && node bench/bench.mjs",
|
|
51
|
+
"bench:node:structures": "node bench/structures.mjs",
|
|
52
|
+
"bench:node:patterns": "node bench/patterns.mjs",
|
|
53
|
+
"bench:browser": "bun run build && bunx playwright test -c bench/playwright.config.mjs",
|
|
54
|
+
"bench:all": "bun run bench && bun run bench:patterns && bun run bench:structures && bun run bench:node && bun run bench:node:patterns && bun run bench:node:structures && bun run bench:browser",
|
|
55
|
+
"format": "bunx prettier --write .",
|
|
56
|
+
"format:check": "bunx prettier --check .",
|
|
57
|
+
"typecheck:tests": "bun x tsc -p test/tsconfig.types.json",
|
|
58
|
+
"test": "bun test",
|
|
59
|
+
"test:browser": "bun run build && bunx playwright test",
|
|
60
|
+
"test:all": "bun test --coverage && bun run typecheck:tests && bun run build && bunx playwright test",
|
|
61
|
+
"test:watch": "bun test --watch",
|
|
62
|
+
"ci:local": "act -W .github/workflows/ci.yml --container-architecture linux/arm64 && act -W .github/workflows/browser.yml --container-architecture linux/arm64",
|
|
63
|
+
"publish": "bun run build:all && npm publish"
|
|
68
64
|
},
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
"ender": "./lib/ender.js",
|
|
76
|
-
"main": "./lib/eventify.js",
|
|
77
|
-
"directories": {
|
|
78
|
-
"lib": "./lib"
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@playwright/test": "^1.42.0",
|
|
67
|
+
"typescript": "^5.0.0",
|
|
68
|
+
"zod": "^4.3.6"
|
|
79
69
|
}
|
|
80
70
|
}
|
package/.jshintrc
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sub": true,
|
|
3
|
-
"bitwise": true,
|
|
4
|
-
"curly": true,
|
|
5
|
-
"eqeqeq": true,
|
|
6
|
-
"forin": true,
|
|
7
|
-
"immed": true,
|
|
8
|
-
"latedef": "nofunc",
|
|
9
|
-
"newcap": true,
|
|
10
|
-
"noarg": true,
|
|
11
|
-
"nonew": true,
|
|
12
|
-
"plusplus": true,
|
|
13
|
-
"regexp": true,
|
|
14
|
-
"noempty": true,
|
|
15
|
-
"undef": true,
|
|
16
|
-
"unused": true,
|
|
17
|
-
"trailing": true,
|
|
18
|
-
"eqnull": true,
|
|
19
|
-
"browser": true,
|
|
20
|
-
"node": true,
|
|
21
|
-
"indent": 2,
|
|
22
|
-
"onevar": true,
|
|
23
|
-
"white": true,
|
|
24
|
-
"strict": false,
|
|
25
|
-
"evil": true,
|
|
26
|
-
"maxlen": 80,
|
|
27
|
-
"globals": {
|
|
28
|
-
"describe": true,
|
|
29
|
-
"expect": true,
|
|
30
|
-
"it": true,
|
|
31
|
-
"before": true,
|
|
32
|
-
"ender": true,
|
|
33
|
-
"define": true
|
|
34
|
-
}
|
|
35
|
-
}
|
package/.npmignore
DELETED
package/.travis.yml
DELETED
package/Gruntfile.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
module.exports = function (grunt) {
|
|
2
|
-
|
|
3
|
-
require("load-grunt-tasks")(grunt);
|
|
4
|
-
|
|
5
|
-
// Project configuration.
|
|
6
|
-
grunt.initConfig({
|
|
7
|
-
jshint: {
|
|
8
|
-
files: ["Gruntfile.js", "lib/*.js", "test/*.js", "test/**/*.js"],
|
|
9
|
-
options: {
|
|
10
|
-
jshintrc: "./.jshintrc"
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
watch: {
|
|
14
|
-
files: ['Gruntfile.js', 'index.js', 'lib/*.js', 'test/*.js'],
|
|
15
|
-
tasks: 'lint'
|
|
16
|
-
},
|
|
17
|
-
pkg: '<json:package.json>',
|
|
18
|
-
meta: {
|
|
19
|
-
banner: "// <%= pkg.name %> - v<%= pkg.version %> " +
|
|
20
|
-
'(<%= grunt.template.today("yyyy-mm-dd") %>)' +
|
|
21
|
-
"\n// -----------------\n" +
|
|
22
|
-
"// Copyright(c) 2010-2012 Jeremy Ashkenas, DocumentCloud\n" +
|
|
23
|
-
"// Copyright(c) 2014 Bermi Ferrer <bermi@bermilabs.com>\n" +
|
|
24
|
-
"// Copyright(c) 2013 Nicolas Perriault\n" +
|
|
25
|
-
"// MIT Licensed\n"
|
|
26
|
-
},
|
|
27
|
-
concat: {
|
|
28
|
-
dist: {
|
|
29
|
-
src: ['lib/eventify.js'],
|
|
30
|
-
dest: 'dist/eventify.js'
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
uglify: {
|
|
34
|
-
dist: {
|
|
35
|
-
src: ['<banner>', 'dist/eventify.js'],
|
|
36
|
-
dest: 'dist/eventify.min.js'
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
release: {
|
|
40
|
-
options: {
|
|
41
|
-
npm: true
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
// Default task.
|
|
48
|
-
grunt.registerTask('default', 'jshint');
|
|
49
|
-
|
|
50
|
-
// Build task.
|
|
51
|
-
grunt.registerTask('build', 'jshint concat uglify'.split(' '));
|
|
52
|
-
|
|
53
|
-
};
|
package/Makefile
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
SHELL = /bin/bash
|
|
2
|
-
MAKEFLAGS += --no-print-directory --silent
|
|
3
|
-
export PATH := ./node_modules/.bin/:$(PATH)
|
|
4
|
-
|
|
5
|
-
test:
|
|
6
|
-
@NODE_ENV=test \
|
|
7
|
-
mocha \
|
|
8
|
-
--require blanket \
|
|
9
|
-
--reporter mocha-spec-cov \
|
|
10
|
-
$(TESTFLAGS)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
test-coverage-report:
|
|
14
|
-
@NODE_ENV=test \
|
|
15
|
-
mocha \
|
|
16
|
-
--require blanket \
|
|
17
|
-
--reporter html-cov > coverage.html
|
|
18
|
-
echo "Coverage report available on coverage.html"
|
|
19
|
-
|
|
20
|
-
test-watch:
|
|
21
|
-
@TESTFLAGS=--watch $(MAKE) test
|
|
22
|
-
|
|
23
|
-
test-browser:
|
|
24
|
-
open test/browser.html
|
|
25
|
-
|
|
26
|
-
dev:
|
|
27
|
-
grunt watch
|
|
28
|
-
|
|
29
|
-
dev-test:
|
|
30
|
-
make dev & \
|
|
31
|
-
make test-watch
|
|
32
|
-
|
|
33
|
-
all:
|
|
34
|
-
grunt
|
|
35
|
-
|
|
36
|
-
lint:
|
|
37
|
-
grunt jshint
|
|
38
|
-
|
|
39
|
-
build:
|
|
40
|
-
grunt build
|
|
41
|
-
|
|
42
|
-
docclean:
|
|
43
|
-
rm -f docs/*.{1,html}
|
|
44
|
-
|
|
45
|
-
dist: build
|
|
46
|
-
|
|
47
|
-
clean: docclean test-clean-instrument test-watch test
|
|
48
|
-
|
|
49
|
-
.PHONY: test build lint test-cov docclean dev dist
|
package/dist/eventify.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
!function(a,b,c){"undefined"!=typeof module?module.exports=c(a,b):"function"==typeof define&&"object"==typeof define.amd?define(c):b[a]=c(a,b)}(this.localEventifyLibraryName||"Eventify",this,function(a,b){"use strict";function c(){return{keys:Object.keys,uniqueId:function(a){k+=1;var b=k+"";return a?a+b:b},has:function(a,b){return hasOwnProperty.call(a,b)},each:function(a,b,c){var d,e,f;if(null!=a)if(i&&a.forEach===i)a.forEach(b,c);else if(a.length===+a.length){for(e=0,f=a.length;f>e;e+=1)if(b.call(c,a[e],e,a)===h)return}else for(d in a)if(this.has(a,d)&&b.call(c,a[d],d,a)===h)return},once:function(a){var b,c=!1;return function(){return c?b:(c=!0,b=a.apply(this,arguments),a=null,b)}}}}var d,e,f,g={listenTo:"on",listenToOnce:"once"},h={},i=Array.prototype.forEach,j=Array.prototype.slice,k=0,l=b.Eventify,m=c(),n=/\s+/,o=function(){return this};return o.prototype={version:"1.0.0",on:function(a,b,c){if(!f(this,"on",a,[b,c])||!b)return this;this._events=this._events||{};var d=this._events[a]||(this._events[a]=[]);return d.push({callback:b,context:c,ctx:c||this}),this},once:function(a,b,c){var d,e=this;return f(this,"once",a,[b,c])&&b?(d=m.once(function(){e.off(a,d),b.apply(this,arguments)}),d._callback=b,this.on(a,d,c)):this},off:function(a,b,c){var d,e,g,h,i,j,k,l;if(!this._events||!f(this,"off",a,[b,c]))return this;if(!a&&!b&&!c)return this._events={},this;for(h=a?[a]:m.keys(this._events),i=0,j=h.length;j>i;i+=1)if(a=h[i],g=this._events[a]){if(this._events[a]=d=[],b||c)for(k=0,l=g.length;l>k;k+=1)e=g[k],(b&&b!==e.callback&&b!==e.callback._callback||c&&c!==e.context)&&d.push(e);d.length||delete this._events[a]}return this},trigger:function(a){if(!this._events)return this;var b,c,d=j.call(arguments,1);return f(this,"trigger",a,d)?(b=this._events[a],c=this._events.all,b&&e(b,d),c&&e(c,arguments),this):this},stopListening:function(a,b,c){var d,e,f=this._listeners;if(!f)return this;d=!b&&!c,"object"==typeof b&&(c=this),f={},a&&(f[a._listenerId]=a);for(e in f)f.hasOwnProperty(e)&&(f[e].off(b,c,this),d&&delete this._listeners[e]);return this},noConflict:function(){return b.Eventify=l,this},enable:function(a){var b,c,d=["on","once","off","trigger","stopListening","listenTo","listenToOnce","bind","unbind"];for(a=a||{},b=0,c=d.length;c>b;b+=1)a[d[b]]=this[d[b]];return a}},f=function(a,b,c,d){var e,f,g,h;if(!c)return!0;if("object"==typeof c){for(e in c)c.hasOwnProperty(e)&&a[b].apply(a,[e,c[e]].concat(d));return!1}if(n.test(c)){for(h=c.split(n),f=0,g=h.length;g>f;f+=1)a[b].apply(a,[h[f]].concat(d));return!1}return!0},e=function(a,b){var c,d=0,e=a.length,f=b[0],g=b[1],h=b[2];switch(b.length){case 0:for(;e>d;)c=a[d],c.callback.call(c.ctx),d+=1;return;case 1:for(;e>d;)c=a[d],c.callback.call(c.ctx,f),d+=1;return;case 2:for(;e>d;)c=a[d],c.callback.call(c.ctx,f,g),d+=1;return;case 3:for(;e>d;)c=a[d],c.callback.call(c.ctx,f,g,h),d+=1;return;default:for(;e>d;)c=a[d],c.callback.apply(c.ctx,b),d+=1}},m.each(g,function(a,b){o.prototype[b]=function(b,c,d){var e,f=this._listeners||(this._listeners={});return b._listenerId=b._listenerId||m.uniqueId("l"),e=b._listenerId,f[e]=b,"object"==typeof c&&(d=this),b[a](c,d,this),this}}),d=new o,d.mixin=d.enable,d});
|
package/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require('./lib/eventify.js');
|