From 236ddf3471a7851ff6541f5709e9cbb6105b58f7 Mon Sep 17 00:00:00 2001 From: xachary <179740385@qq.com> Date: 星期日, 11 二月 2024 14:30:44 +0800 Subject: [PATCH] fix: repair login about redirect query (#3592) --- src/utils/mitt.ts | 179 ++++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 114 insertions(+), 65 deletions(-) diff --git a/src/utils/mitt.ts b/src/utils/mitt.ts index bcc3b65..cf09fd8 100644 --- a/src/utils/mitt.ts +++ b/src/utils/mitt.ts @@ -1,73 +1,122 @@ /** - * Mitt: Tiny functional event emitter / pubsub - * - * @name mitt - * @param {Array} [all] Optional array of event names to registered handler functions - * @returns {Function} The function's instance + * copy to https://github.com/developit/mitt + * Expand clear method */ -export default class Mitt { - private cache: Map<string, Array<(data: any) => void>>; - constructor(all = []) { - // A Map of event names to registered handler functions. - this.cache = new Map(all); - } +export type EventType = string | symbol; - once(type: string, handler: Fn) { - const decor = (...args: any[]) => { - handler && handler.apply(this, args); - this.off(type, decor); - }; - this.on(type, decor); - return this; - } +// An event handler can take an optional event argument +// and should not return a value +export type Handler<T = unknown> = (event: T) => void; +export type WildcardHandler<T = Record<string, unknown>> = ( + type: keyof T, + event: T[keyof T], +) => void; - /** - * Register an event handler for the given type. - * - * @param {string|symbol} type Type of event to listen for, or `"*"` for all events - * @param {Function} handler Function to call in response to given event - */ - on(type: string, handler: Fn) { - const handlers = this.cache.get(type); - const added = handlers && handlers.push(handler); - if (!added) { - this.cache.set(type, [handler]); - } - } +// An array of all currently registered event handlers for a type +export type EventHandlerList<T = unknown> = Array<Handler<T>>; +export type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>; - /** - * Remove an event handler for the given type. - * - * @param {string|symbol} type Type of event to unregister `handler` from, or `"*"` - * @param {Function} handler Handler function to remove - */ - off(type: string, handler: Fn) { - const handlers = this.cache.get(type); - if (handlers) { - handlers.splice(handlers.indexOf(handler) >>> 0, 1); - } - } +// A map of event types and their corresponding event handlers. +export type EventHandlerMap<Events extends Record<EventType, unknown>> = Map< + keyof Events | '*', + EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events> +>; - /** - * Invoke all handlers for the given type. - * If present, `"*"` handlers are invoked after type-matched handlers. - * - * Note: Manually firing "*" handlers is not supported. - * - * @param {string|symbol} type The event type to invoke - * @param {*} [evt] Any value (object is recommended and powerful), passed to each handler - */ - emit(type: string, evt: any) { - for (const handler of (this.cache.get(type) || []).slice()) handler(evt); - for (const handler of (this.cache.get('*') || []).slice()) handler(type, evt); - } +export interface Emitter<Events extends Record<EventType, unknown>> { + all: EventHandlerMap<Events>; - /** - * Remove all event handlers. - * - * Note: This will also remove event handlers passed via `mitt(all: EventHandlerMap)`. - */ - clear() { - this.cache.clear(); - } + on<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void; + on(type: '*', handler: WildcardHandler<Events>): void; + + off<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void; + off(type: '*', handler: WildcardHandler<Events>): void; + + emit<Key extends keyof Events>(type: Key, event: Events[Key]): void; + emit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void; + clear(): void; +} + +/** + * Mitt: Tiny (~200b) functional event emitter / pubsub. + * @name mitt + * @returns {Mitt} + */ +export function mitt<Events extends Record<EventType, unknown>>( + all?: EventHandlerMap<Events>, +): Emitter<Events> { + type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>; + all = all || new Map(); + + return { + /** + * A Map of event names to registered handler functions. + */ + all, + + /** + * Register an event handler for the given type. + * @param {string|symbol} type Type of event to listen for, or `'*'` for all events + * @param {Function} handler Function to call in response to given event + * @memberOf mitt + */ + on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) { + const handlers: Array<GenericEventHandler> | undefined = all!.get(type); + if (handlers) { + handlers.push(handler); + } else { + all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>); + } + }, + + /** + * Remove an event handler for the given type. + * If `handler` is omitted, all handlers of the given type are removed. + * @param {string|symbol} type Type of event to unregister `handler` from (`'*'` to remove a wildcard handler) + * @param {Function} [handler] Handler function to remove + * @memberOf mitt + */ + off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) { + const handlers: Array<GenericEventHandler> | undefined = all!.get(type); + if (handlers) { + if (handler) { + handlers.splice(handlers.indexOf(handler) >>> 0, 1); + } else { + all!.set(type, []); + } + } + }, + + /** + * Invoke all handlers for the given type. + * If present, `'*'` handlers are invoked after type-matched handlers. + * + * Note: Manually firing '*' handlers is not supported. + * + * @param {string|symbol} type The event type to invoke + * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler + * @memberOf mitt + */ + emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) { + let handlers = all!.get(type); + if (handlers) { + (handlers as EventHandlerList<Events[keyof Events]>).slice().forEach((handler) => { + handler(evt as Events[Key]); + }); + } + + handlers = all!.get('*'); + if (handlers) { + (handlers as WildCardEventHandlerList<Events>).slice().forEach((handler) => { + handler(type, evt as Events[Key]); + }); + } + }, + + /** + * Clear all + */ + clear() { + this.all.clear(); + }, + }; } -- Gitblit v1.8.0