nfx-ui 0.1.5 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"events.cjs","names":[],"sources":["../src/events/EventEmitter.ts"],"sourcesContent":["/**\n * 通用事件发射器(按事件名注册/注销/触发)\n * Generic event emitter: subscribe, unsubscribe, and emit by event name.\n *\n * @example\n * ```ts\n * import { EventEmitter, defineEvents, type EventNamesOf } from \"@/events\";\n * const events = defineEvents({ FOO: \"MY:FOO\", BAR: \"MY:BAR\" });\n * type MyEvent = EventNamesOf<typeof events>;\n * class MyEmitter extends EventEmitter<MyEvent> { constructor() { super(events); } }\n * const em = new MyEmitter();\n * em.on(events.FOO, (x) => console.log(x));\n * em.emit(events.FOO, \"hello\");\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 事件回调类型:用于 on / off。Callback for on / off. */\ntype EventCallback = (...args: unknown[]) => void;\n\n/** 由 defineEvents 返回的「已规范事件名对象」类型;constructor 只接受此类型。 */\ntype DefinedEvents<T extends Record<string, string>> = Defined<T, \"events\">;\n\n/** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */\ntype EventNamesOf<T> = T extends Defined<infer O, \"events\"> ? O[keyof O] : T extends Record<string, string> ? T[keyof T] : never;\n\n/**\n * 规范创建「一级 key-value」事件名对象:仅允许 key → 字符串 value,禁止嵌套(类型约束)。\n * 返回 DefinedEvents<T>,供 EventEmitter 构造使用。\n * Define events object: one-level key-value (string values), no nested objects (type-only). Returns DefinedEvents<T> for EventEmitter.\n *\n * @param events - 事件名 key-value 对象。Event name key-value object (e.g. { FOO: \"DOMAIN:FOO\" }).\n * @returns DefinedEvents<E>,仅此类型可传入 EventEmitter 构造。DefinedEvents<E>; only this type is accepted by EventEmitter constructor.\n * @example\n * ```ts\n * const routerEvents = defineEvents({ NAVIGATE: \"ROUTER:NAVIGATE\", NAVIGATE_BACK: \"ROUTER:NAVIGATE_BACK\" });\n * class RouterEmitter extends EventEmitter<EventNamesOf<typeof routerEvents>> { constructor() { super(routerEvents); } }\n * ```\n */\nfunction defineEvents<E extends Record<string, string>>(events: E): DefinedEvents<E> {\n return events as DefinedEvents<E>;\n}\n\nfunction createListenersMap<E extends string>(eventNames: readonly E[]): Record<E, Set<EventCallback>> {\n const map = {} as Record<E, Set<EventCallback>>;\n for (const e of eventNames) {\n map[e] = new Set();\n }\n return map;\n}\n\n/**\n * 泛型 EventEmitter:构造函数仅接受 defineEvents 返回的 DefinedEvents 类型,提供 on / off / emit。\n * Generic EventEmitter: constructor accepts only DefinedEvents (returned by defineEvents), provides on / off / emit.\n *\n * @param events - 须为 defineEvents(...) 的返回值(DefinedEvents)。Must be the return value of defineEvents(...) (DefinedEvents).\n */\nclass EventEmitter<E extends string> {\n private listeners: Record<E, Set<EventCallback>>;\n\n constructor(events: DefinedEvents<Record<string, E>>) {\n this.listeners = createListenersMap(Object.values(events as Record<string, E>));\n }\n\n /**\n * 注册事件监听。Register a listener for an event.\n *\n * @param event - 事件名。Event name.\n * @param callback - 回调。Callback (...args) => void.\n */\n on(event: E, callback: EventCallback): void {\n this.listeners[event].add(callback);\n }\n\n /**\n * 移除事件监听。Remove a listener for an event.\n *\n * @param event - 事件名。Event name.\n * @param callback - 要移除的回调(需与 on 时同一引用)。Callback to remove (same reference as passed to on).\n */\n off(event: E, callback: EventCallback): void {\n this.listeners[event].delete(callback);\n }\n\n /**\n * 触发事件,同步调用该事件所有监听器。Emit an event; synchronously invoke all listeners.\n *\n * @param event - 事件名。Event name.\n * @param args - 传给监听器的参数。Arguments passed to listeners.\n */\n emit(event: E, ...args: unknown[]): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"mEAwCA,SAAS,EAA+C,EAA6B,CACnF,OAAO,EAGT,SAAS,EAAqC,EAAyD,CACrG,MAAM,EAAM,CAAA,EACZ,UAAW,KAAK,EACd,EAAI,CAAA,EAAK,IAAI,IAEf,OAAO,EAST,IAAM,EAAN,KAAqC,CACnC,UAEA,YAAY,EAA0C,CACpD,KAAK,UAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B,EAShF,GAAG,EAAU,EAA+B,CAC1C,KAAK,UAAU,CAAA,EAAO,IAAI,CAAA,EAS5B,IAAI,EAAU,EAA+B,CAC3C,KAAK,UAAU,CAAA,EAAO,OAAO,CAAA,EAS/B,KAAK,KAAa,EAAuB,CACvC,KAAK,UAAU,CAAA,EAAO,QAAS,GAAO,EAAG,GAAG,CAAA,CAAK"}
1
+ {"version":3,"file":"events.cjs","names":[],"sources":["../src/events/EventEmitter.ts"],"sourcesContent":["/**\n * 通用事件发射器(按事件名注册/注销/触发)\n * Generic event emitter: subscribe, unsubscribe, and emit by event name.\n *\n * @example\n * ```ts\n * import { EventEmitter, defineEvents, type EventNamesOf } from \"@/events\";\n * const events = defineEvents({ FOO: \"MY:FOO\", BAR: \"MY:BAR\" });\n * type MyEvent = EventNamesOf<typeof events>;\n * class MyEmitter extends EventEmitter<MyEvent> { constructor() { super(events); } }\n * const em = new MyEmitter();\n * em.on(events.FOO, (x) => console.log(x));\n * em.emit(events.FOO, \"hello\");\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 内部存储用回调类型(on/off 对外暴露泛型回调)。Internal storage type for listeners. */\ntype EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;\n\n/** 由 defineEvents 返回的「已规范事件名对象」类型;constructor 只接受此类型。 */\ntype DefinedEvents<T extends Record<string, string>> = Defined<T, \"events\">;\n\n/** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */\ntype EventNamesOf<T> = T extends Defined<infer O, \"events\"> ? O[keyof O] : T extends Record<string, string> ? T[keyof T] : never;\n\n/**\n * 事件名到 payload 类型的映射;未指定时默认为 unknown,on/off 回调参数为 unknown。\n * Map event name to payload type; default unknown so callback is (payload: unknown) => void.\n */\ntype DefaultPayloadMap<E extends string> = Record<E, unknown>;\n\n/**\n * 规范创建「一级 key-value」事件名对象:仅允许 key → 字符串 value,禁止嵌套(类型约束)。\n * 返回 DefinedEvents<T>,供 EventEmitter 构造使用。\n * Define events object: one-level key-value (string values), no nested objects (type-only). Returns DefinedEvents<T> for EventEmitter.\n *\n * @param events - 事件名 key-value 对象。Event name key-value object (e.g. { FOO: \"DOMAIN:FOO\" }).\n * @returns DefinedEvents<E>,仅此类型可传入 EventEmitter 构造。DefinedEvents<E>; only this type is accepted by EventEmitter constructor.\n * @example\n * ```ts\n * const routerEvents = defineEvents({ NAVIGATE: \"ROUTER:NAVIGATE\", NAVIGATE_BACK: \"ROUTER:NAVIGATE_BACK\" });\n * class RouterEmitter extends EventEmitter<EventNamesOf<typeof routerEvents>> { constructor() { super(routerEvents); } }\n * ```\n */\nfunction defineEvents<E extends Record<string, string>>(events: E): DefinedEvents<E> {\n return events as DefinedEvents<E>;\n}\n\nfunction createListenersMap<E extends string>(eventNames: readonly E[]): Record<E, Set<EventCallback>> {\n const map = {} as Record<E, Set<EventCallback>>;\n for (const e of eventNames) {\n map[e] = new Set();\n }\n return map;\n}\n\n/**\n * 泛型 EventEmitter:构造函数仅接受 defineEvents 返回的 DefinedEvents 类型,提供 on / off / emit。\n * 第二泛型 PayloadMap 为「事件名 → payload 类型」映射,未传则全部为 unknown。\n * Generic EventEmitter: constructor accepts only DefinedEvents (returned by defineEvents), provides on / off / emit.\n * Second generic PayloadMap maps event name to payload type; omitted then all payloads are unknown.\n *\n * @param events - 须为 defineEvents(...) 的返回值(DefinedEvents)。Must be the return value of defineEvents(...) (DefinedEvents).\n */\nclass EventEmitter<E extends string, PayloadMap extends Record<E, unknown> = DefaultPayloadMap<E>> {\n private listeners: Record<E, Set<EventCallback>>;\n\n constructor(events: DefinedEvents<Record<string, E>>) {\n this.listeners = createListenersMap(Object.values(events as Record<string, E>));\n }\n\n /**\n * 注册事件监听;回调参数类型由 PayloadMap[event] 推断。\n * Register a listener; callback argument type is inferred from PayloadMap[event].\n */\n on<K extends E>(event: K, callback: (payload: PayloadMap[K]) => void): void {\n this.listeners[event].add(callback as EventCallback);\n }\n\n /**\n * 移除事件监听(需与 on 时同一引用)。\n * Remove a listener (same reference as passed to on).\n */\n off<K extends E>(event: K, callback: (payload: PayloadMap[K]) => void): void {\n this.listeners[event].delete(callback as EventCallback);\n }\n\n /**\n * 触发事件;无 payload PayloadMap[K] void 则只传 event。\n * Emit an event; when PayloadMap[K] is void, only event is passed.\n */\n emit<K extends E>(event: K, ...args: PayloadMap[K] extends void ? [] : [PayloadMap[K]]): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"mEA8CA,SAAS,EAA+C,EAA6B,CACnF,OAAO,EAGT,SAAS,EAAqC,EAAyD,CACrG,MAAM,EAAM,CAAA,EACZ,UAAW,KAAK,EACd,EAAI,CAAA,EAAK,IAAI,IAEf,OAAO,EAWT,IAAM,EAAN,KAAmG,CACjG,UAEA,YAAY,EAA0C,CACpD,KAAK,UAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B,EAOhF,GAAgB,EAAU,EAAkD,CAC1E,KAAK,UAAU,CAAA,EAAO,IAAI,CAAA,EAO5B,IAAiB,EAAU,EAAkD,CAC3E,KAAK,UAAU,CAAA,EAAO,OAAO,CAAA,EAO/B,KAAkB,KAAa,EAA+D,CAC5F,KAAK,UAAU,CAAA,EAAO,QAAS,GAAO,EAAG,GAAG,CAAA,CAAK"}
package/dist/events.d.ts CHANGED
@@ -1,3 +1,9 @@
1
+ /**
2
+ * 事件名到 payload 类型的映射;未指定时默认为 unknown,on/off 回调参数为 unknown。
3
+ * Map event name to payload type; default unknown so callback is (payload: unknown) => void.
4
+ */
5
+ declare type DefaultPayloadMap<E extends string> = Record<E, unknown>;
6
+
1
7
  /**
2
8
  * 定义品牌类型:用于 defineXxx 返回值,仅对应 createXxx/constructor 可接受;Tag 区分不同 define(如 "events" | "router")。
3
9
  * Define brand type: for defineXxx return value, only the matching createXxx accepts; Tag discriminates (e.g. "events" | "router").
@@ -25,39 +31,35 @@ export declare type DefinedEvents<T extends Record<string, string>> = Defined<T,
25
31
  */
26
32
  export declare function defineEvents<E extends Record<string, string>>(events: E): DefinedEvents<E>;
27
33
 
28
- /** 事件回调类型:用于 on / off。Callback for on / off. */
29
- export declare type EventCallback = (...args: unknown[]) => void;
34
+ /** 内部存储用回调类型(on/off 对外暴露泛型回调)。Internal storage type for listeners. */
35
+ export declare type EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;
30
36
 
31
37
  /**
32
38
  * 泛型 EventEmitter:构造函数仅接受 defineEvents 返回的 DefinedEvents 类型,提供 on / off / emit。
39
+ * 第二泛型 PayloadMap 为「事件名 → payload 类型」映射,未传则全部为 unknown。
33
40
  * Generic EventEmitter: constructor accepts only DefinedEvents (returned by defineEvents), provides on / off / emit.
41
+ * Second generic PayloadMap maps event name to payload type; omitted then all payloads are unknown.
34
42
  *
35
43
  * @param events - 须为 defineEvents(...) 的返回值(DefinedEvents)。Must be the return value of defineEvents(...) (DefinedEvents).
36
44
  */
37
- export declare class EventEmitter<E extends string> {
45
+ export declare class EventEmitter<E extends string, PayloadMap extends Record<E, unknown> = DefaultPayloadMap<E>> {
38
46
  private listeners;
39
47
  constructor(events: DefinedEvents<Record<string, E>>);
40
48
  /**
41
- * 注册事件监听。Register a listener for an event.
42
- *
43
- * @param event - 事件名。Event name.
44
- * @param callback - 回调。Callback (...args) => void.
49
+ * 注册事件监听;回调参数类型由 PayloadMap[event] 推断。
50
+ * Register a listener; callback argument type is inferred from PayloadMap[event].
45
51
  */
46
- on(event: E, callback: EventCallback): void;
52
+ on<K extends E>(event: K, callback: (payload: PayloadMap[K]) => void): void;
47
53
  /**
48
- * 移除事件监听。Remove a listener for an event.
49
- *
50
- * @param event - 事件名。Event name.
51
- * @param callback - 要移除的回调(需与 on 时同一引用)。Callback to remove (same reference as passed to on).
54
+ * 移除事件监听(需与 on 时同一引用)。
55
+ * Remove a listener (same reference as passed to on).
52
56
  */
53
- off(event: E, callback: EventCallback): void;
57
+ off<K extends E>(event: K, callback: (payload: PayloadMap[K]) => void): void;
54
58
  /**
55
- * 触发事件,同步调用该事件所有监听器。Emit an event; synchronously invoke all listeners.
56
- *
57
- * @param event - 事件名。Event name.
58
- * @param args - 传给监听器的参数。Arguments passed to listeners.
59
+ * 触发事件;无 payload PayloadMap[K] void 则只传 event。
60
+ * Emit an event; when PayloadMap[K] is void, only event is passed.
59
61
  */
60
- emit(event: E, ...args: unknown[]): void;
62
+ emit<K extends E>(event: K, ...args: PayloadMap[K] extends void ? [] : [PayloadMap[K]]): void;
61
63
  }
62
64
 
63
65
  /** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */
@@ -1 +1 @@
1
- {"version":3,"file":"events.mjs","names":[],"sources":["../src/events/EventEmitter.ts"],"sourcesContent":["/**\n * 通用事件发射器(按事件名注册/注销/触发)\n * Generic event emitter: subscribe, unsubscribe, and emit by event name.\n *\n * @example\n * ```ts\n * import { EventEmitter, defineEvents, type EventNamesOf } from \"@/events\";\n * const events = defineEvents({ FOO: \"MY:FOO\", BAR: \"MY:BAR\" });\n * type MyEvent = EventNamesOf<typeof events>;\n * class MyEmitter extends EventEmitter<MyEvent> { constructor() { super(events); } }\n * const em = new MyEmitter();\n * em.on(events.FOO, (x) => console.log(x));\n * em.emit(events.FOO, \"hello\");\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 事件回调类型:用于 on / off。Callback for on / off. */\ntype EventCallback = (...args: unknown[]) => void;\n\n/** 由 defineEvents 返回的「已规范事件名对象」类型;constructor 只接受此类型。 */\ntype DefinedEvents<T extends Record<string, string>> = Defined<T, \"events\">;\n\n/** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */\ntype EventNamesOf<T> = T extends Defined<infer O, \"events\"> ? O[keyof O] : T extends Record<string, string> ? T[keyof T] : never;\n\n/**\n * 规范创建「一级 key-value」事件名对象:仅允许 key → 字符串 value,禁止嵌套(类型约束)。\n * 返回 DefinedEvents<T>,供 EventEmitter 构造使用。\n * Define events object: one-level key-value (string values), no nested objects (type-only). Returns DefinedEvents<T> for EventEmitter.\n *\n * @param events - 事件名 key-value 对象。Event name key-value object (e.g. { FOO: \"DOMAIN:FOO\" }).\n * @returns DefinedEvents<E>,仅此类型可传入 EventEmitter 构造。DefinedEvents<E>; only this type is accepted by EventEmitter constructor.\n * @example\n * ```ts\n * const routerEvents = defineEvents({ NAVIGATE: \"ROUTER:NAVIGATE\", NAVIGATE_BACK: \"ROUTER:NAVIGATE_BACK\" });\n * class RouterEmitter extends EventEmitter<EventNamesOf<typeof routerEvents>> { constructor() { super(routerEvents); } }\n * ```\n */\nfunction defineEvents<E extends Record<string, string>>(events: E): DefinedEvents<E> {\n return events as DefinedEvents<E>;\n}\n\nfunction createListenersMap<E extends string>(eventNames: readonly E[]): Record<E, Set<EventCallback>> {\n const map = {} as Record<E, Set<EventCallback>>;\n for (const e of eventNames) {\n map[e] = new Set();\n }\n return map;\n}\n\n/**\n * 泛型 EventEmitter:构造函数仅接受 defineEvents 返回的 DefinedEvents 类型,提供 on / off / emit。\n * Generic EventEmitter: constructor accepts only DefinedEvents (returned by defineEvents), provides on / off / emit.\n *\n * @param events - 须为 defineEvents(...) 的返回值(DefinedEvents)。Must be the return value of defineEvents(...) (DefinedEvents).\n */\nclass EventEmitter<E extends string> {\n private listeners: Record<E, Set<EventCallback>>;\n\n constructor(events: DefinedEvents<Record<string, E>>) {\n this.listeners = createListenersMap(Object.values(events as Record<string, E>));\n }\n\n /**\n * 注册事件监听。Register a listener for an event.\n *\n * @param event - 事件名。Event name.\n * @param callback - 回调。Callback (...args) => void.\n */\n on(event: E, callback: EventCallback): void {\n this.listeners[event].add(callback);\n }\n\n /**\n * 移除事件监听。Remove a listener for an event.\n *\n * @param event - 事件名。Event name.\n * @param callback - 要移除的回调(需与 on 时同一引用)。Callback to remove (same reference as passed to on).\n */\n off(event: E, callback: EventCallback): void {\n this.listeners[event].delete(callback);\n }\n\n /**\n * 触发事件,同步调用该事件所有监听器。Emit an event; synchronously invoke all listeners.\n *\n * @param event - 事件名。Event name.\n * @param args - 传给监听器的参数。Arguments passed to listeners.\n */\n emit(event: E, ...args: unknown[]): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"AAwCA,SAAS,EAA+C,GAA6B;AACnF,SAAO;;AAGT,SAAS,EAAqC,GAAyD;AACrG,QAAM,IAAM,CAAA;AACZ,aAAW,KAAK,EACd,CAAA,EAAI,CAAA,IAAK,oBAAI,IAAA;AAEf,SAAO;;AAST,IAAM,IAAN,MAAqC;AAAA,EACnC;AAAA,EAEA,YAAY,GAA0C;AACpD,SAAK,YAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B;AAAA;EAShF,GAAG,GAAU,GAA+B;AAC1C,SAAK,UAAU,CAAA,EAAO,IAAI,CAAA;AAAA;EAS5B,IAAI,GAAU,GAA+B;AAC3C,SAAK,UAAU,CAAA,EAAO,OAAO,CAAA;AAAA;EAS/B,KAAK,MAAa,GAAuB;AACvC,SAAK,UAAU,CAAA,EAAO,QAAA,CAAS,MAAO,EAAG,GAAG,CAAA,CAAK;AAAA"}
1
+ {"version":3,"file":"events.mjs","names":[],"sources":["../src/events/EventEmitter.ts"],"sourcesContent":["/**\n * 通用事件发射器(按事件名注册/注销/触发)\n * Generic event emitter: subscribe, unsubscribe, and emit by event name.\n *\n * @example\n * ```ts\n * import { EventEmitter, defineEvents, type EventNamesOf } from \"@/events\";\n * const events = defineEvents({ FOO: \"MY:FOO\", BAR: \"MY:BAR\" });\n * type MyEvent = EventNamesOf<typeof events>;\n * class MyEmitter extends EventEmitter<MyEvent> { constructor() { super(events); } }\n * const em = new MyEmitter();\n * em.on(events.FOO, (x) => console.log(x));\n * em.emit(events.FOO, \"hello\");\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 内部存储用回调类型(on/off 对外暴露泛型回调)。Internal storage type for listeners. */\ntype EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;\n\n/** 由 defineEvents 返回的「已规范事件名对象」类型;constructor 只接受此类型。 */\ntype DefinedEvents<T extends Record<string, string>> = Defined<T, \"events\">;\n\n/** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */\ntype EventNamesOf<T> = T extends Defined<infer O, \"events\"> ? O[keyof O] : T extends Record<string, string> ? T[keyof T] : never;\n\n/**\n * 事件名到 payload 类型的映射;未指定时默认为 unknown,on/off 回调参数为 unknown。\n * Map event name to payload type; default unknown so callback is (payload: unknown) => void.\n */\ntype DefaultPayloadMap<E extends string> = Record<E, unknown>;\n\n/**\n * 规范创建「一级 key-value」事件名对象:仅允许 key → 字符串 value,禁止嵌套(类型约束)。\n * 返回 DefinedEvents<T>,供 EventEmitter 构造使用。\n * Define events object: one-level key-value (string values), no nested objects (type-only). Returns DefinedEvents<T> for EventEmitter.\n *\n * @param events - 事件名 key-value 对象。Event name key-value object (e.g. { FOO: \"DOMAIN:FOO\" }).\n * @returns DefinedEvents<E>,仅此类型可传入 EventEmitter 构造。DefinedEvents<E>; only this type is accepted by EventEmitter constructor.\n * @example\n * ```ts\n * const routerEvents = defineEvents({ NAVIGATE: \"ROUTER:NAVIGATE\", NAVIGATE_BACK: \"ROUTER:NAVIGATE_BACK\" });\n * class RouterEmitter extends EventEmitter<EventNamesOf<typeof routerEvents>> { constructor() { super(routerEvents); } }\n * ```\n */\nfunction defineEvents<E extends Record<string, string>>(events: E): DefinedEvents<E> {\n return events as DefinedEvents<E>;\n}\n\nfunction createListenersMap<E extends string>(eventNames: readonly E[]): Record<E, Set<EventCallback>> {\n const map = {} as Record<E, Set<EventCallback>>;\n for (const e of eventNames) {\n map[e] = new Set();\n }\n return map;\n}\n\n/**\n * 泛型 EventEmitter:构造函数仅接受 defineEvents 返回的 DefinedEvents 类型,提供 on / off / emit。\n * 第二泛型 PayloadMap 为「事件名 → payload 类型」映射,未传则全部为 unknown。\n * Generic EventEmitter: constructor accepts only DefinedEvents (returned by defineEvents), provides on / off / emit.\n * Second generic PayloadMap maps event name to payload type; omitted then all payloads are unknown.\n *\n * @param events - 须为 defineEvents(...) 的返回值(DefinedEvents)。Must be the return value of defineEvents(...) (DefinedEvents).\n */\nclass EventEmitter<E extends string, PayloadMap extends Record<E, unknown> = DefaultPayloadMap<E>> {\n private listeners: Record<E, Set<EventCallback>>;\n\n constructor(events: DefinedEvents<Record<string, E>>) {\n this.listeners = createListenersMap(Object.values(events as Record<string, E>));\n }\n\n /**\n * 注册事件监听;回调参数类型由 PayloadMap[event] 推断。\n * Register a listener; callback argument type is inferred from PayloadMap[event].\n */\n on<K extends E>(event: K, callback: (payload: PayloadMap[K]) => void): void {\n this.listeners[event].add(callback as EventCallback);\n }\n\n /**\n * 移除事件监听(需与 on 时同一引用)。\n * Remove a listener (same reference as passed to on).\n */\n off<K extends E>(event: K, callback: (payload: PayloadMap[K]) => void): void {\n this.listeners[event].delete(callback as EventCallback);\n }\n\n /**\n * 触发事件;无 payload PayloadMap[K] void 则只传 event。\n * Emit an event; when PayloadMap[K] is void, only event is passed.\n */\n emit<K extends E>(event: K, ...args: PayloadMap[K] extends void ? [] : [PayloadMap[K]]): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"AA8CA,SAAS,EAA+C,GAA6B;AACnF,SAAO;;AAGT,SAAS,EAAqC,GAAyD;AACrG,QAAM,IAAM,CAAA;AACZ,aAAW,KAAK,EACd,CAAA,EAAI,CAAA,IAAK,oBAAI,IAAA;AAEf,SAAO;;AAWT,IAAM,IAAN,MAAmG;AAAA,EACjG;AAAA,EAEA,YAAY,GAA0C;AACpD,SAAK,YAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B;AAAA;EAOhF,GAAgB,GAAU,GAAkD;AAC1E,SAAK,UAAU,CAAA,EAAO,IAAI,CAAA;AAAA;EAO5B,IAAiB,GAAU,GAAkD;AAC3E,SAAK,UAAU,CAAA,EAAO,OAAO,CAAA;AAAA;EAO/B,KAAkB,MAAa,GAA+D;AAC5F,SAAK,UAAU,CAAA,EAAO,QAAA,CAAS,MAAO,EAAG,GAAG,CAAA,CAAK;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nfx-ui",
3
- "version": "0.1.5",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "Unified frontend UI library for the NFX product family: shared React components, design tokens, theme variables, and layout primitives for a consistent look and behavior across NFX console and other apps.",
6
6
  "repository": {