Files
FixIt/assets/js/core/event-bus.ts
T
Cell 6f83bc6da5 refactor: restructure TypeScript modules and search config
- Create PublicAPI class to encapsulate module initialization
- Move search config types to modules/search/types.ts
- Rename ui.ts to global.ts for clarity
- Simplify pagefind engine (remove normalizeSortOrder, toObject)
- Move pagefind config to top-level in FixItConfig
- Add TSDoc comments and @param tags
- Update PagefindConfig.sortOrder type to 'asc' | 'desc'
- Improve pagefind detection warning message
2026-06-18 16:09:16 +08:00

48 lines
1.6 KiB
TypeScript

/** Event map: every FixIt event and its payload shape. */
export interface FixItEventMap {
'fixit:switch-theme': { isDark: boolean, mode: string, isChanged: boolean }
'fixit:scroll': void
'fixit:resize': void
'fixit:decrypted': void
'fixit:partial-decrypted': { target: Element }
'fixit:re-encrypt': void
'fixit:code-tab-sync': { lang: string, source: HTMLElement }
}
/** Document event map augmented with FixIt custom events. */
export type FixItDocumentEventMap = {
[K in keyof FixItEventMap]: CustomEvent<FixItEventMap[K]>
}
type Handler<T> = T extends void
? (() => void) | ((event: CustomEvent<void>) => void)
: (event: CustomEvent<T>) => void
/** Typed event bus — wraps DOM CustomEvents with type-safe emit/on/off. */
export class TypedEventBus {
private target = document
on<K extends keyof FixItEventMap>(event: K, handler: Handler<FixItEventMap[K]>): void {
this.target.addEventListener(event as string, handler as EventListener)
}
off<K extends keyof FixItEventMap>(event: K, handler: Handler<FixItEventMap[K]>): void {
this.target.removeEventListener(event as string, handler as EventListener)
}
emit<K extends keyof FixItEventMap>(
event: K,
...args: FixItEventMap[K] extends void ? [] : [FixItEventMap[K]]
): void {
const detail = args[0]
this.target.dispatchEvent(
detail !== undefined
? new CustomEvent(event as string, { detail })
: new CustomEvent(event as string),
)
}
}
/** Shared event bus singleton for all modules and libs. */
export const eventBus = new TypedEventBus()