nfx-ui 0.3.0 → 0.4.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 * PayloadMap 支持:void(无参)、单类型(单参)、元组(多参)。\n *\n * @example PayloadMap(全部无参)\n * ```ts\n * const events = defineEvents({ A: \"a\", B: \"b\" });\n * class Em extends EventEmitter<EventNamesOf<typeof events>> { constructor() { super(events); } }\n * const em = new Em(); em.on(events.A, () => {}); em.emit(events.A);\n * ```\n * @example 单参\n * ```ts\n * type Map = { FOO: string };\n * class Em extends EventEmitter<\"FOO\", Map> { ... }\n * em.on(events.FOO, (x) => console.log(x)); em.emit(events.FOO, \"hi\");\n * ```\n * @example 多参(PayloadMap[K] 为元组)\n * ```ts\n * type Map = { LOG: [string, number] };\n * em.on(events.LOG, (msg, level) => {}); em.emit(events.LOG, \"ok\", 1);\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 内部存储用回调类型。Internal storage type for listeners. */\ntype EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;\n\n/** 将 PayloadMap[K] 规范为参数元组:void→[],单类型 T→[T],已是元组则不变。Normalize payload to args tuple for emit/on. */\ntype ToArgs<P> = P extends void ? [] : P extends unknown[] ? P : [P];\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 * PayloadMap[K] 可为 void(无参)、单类型 T(单参)、或元组 [A, B, ...](多参),统一规范为参数列表。\n * PayloadMap[K] can be void (no args), single type T (one arg), or tuple [A, B, ...] (multi arg).\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> = Record<E, void>> {\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[K] 规范为 ...args(无参/单参/多参均支持)。\n * Register a listener; callback args are normalized from PayloadMap[K] (void / single / tuple).\n */\n on<K extends E>(event: K, callback: (...args: ToArgs<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: (...args: ToArgs<PayloadMap[K]>) => void): void {\n this.listeners[event].delete(callback as EventCallback);\n }\n\n /**\n * 触发事件;参数与 PayloadMap[K] 一致:void 无参,T 单参,[A,B] 多参。\n * Emit an event; args match PayloadMap[K]: void → no args, T → one arg, [A,B] → spread.\n */\n emit<K extends E>(event: K, ...args: ToArgs<PayloadMap[K]>): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"mEAmDA,SAAS,EAA+C,EAA6B,CACnF,OAAO,EAGT,SAAS,EAAqC,EAAyD,CACrG,MAAM,EAAM,CAAA,EACZ,UAAW,KAAK,EACd,EAAI,CAAA,EAAK,IAAI,IAEf,OAAO,EAUT,IAAM,EAAN,KAA8F,CAC5F,UAEA,YAAY,EAA0C,CACpD,KAAK,UAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B,EAOhF,GAAgB,EAAU,EAA0D,CAClF,KAAK,UAAU,CAAA,EAAO,IAAI,CAAA,EAO5B,IAAiB,EAAU,EAA0D,CACnF,KAAK,UAAU,CAAA,EAAO,OAAO,CAAA,EAO/B,KAAkB,KAAa,EAAmC,CAChE,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 * 不传 PayloadMap 时默认 PayloadMap = Record<E, unknown>,每个事件可无参或单参 (unknown),通用。\n * 传 PayloadMap 时可精确到:void(无参)、单类型(单参)、元组(多参)。\n *\n * @example 不传 PayloadMap(通用:无参或单参均可)\n * ```ts\n * const events = defineEvents({ A: \"a\", B: \"b\" });\n * class Em extends EventEmitter<EventNamesOf<typeof events>> { constructor() { super(events); } }\n * const em = new Em();\n * em.on(events.A, () => {}); em.emit(events.A);\n * em.on(events.B, (x) => console.log(x)); em.emit(events.B, data);\n * ```\n * @example 传 PayloadMap(严格单参/多参)\n * ```ts\n * type Map = { FOO: string; LOG: [string, number] };\n * class Em extends EventEmitter<\"FOO\"|\"LOG\", Map> { ... }\n * em.on(events.FOO, (x) => {}); em.emit(events.FOO, \"hi\");\n * em.on(events.LOG, (msg, level) => {}); em.emit(events.LOG, \"ok\", 1);\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 内部存储用回调类型。Internal storage type for listeners. */\ntype EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;\n\n/**\n * 将 PayloadMap[K] 规范为参数元组。\n * void→[];unknown(默认/未指定 payload 类型)→ [] | [unknown](无参或单参,通用);单类型 T→[T];元组→不变。\n * Normalize payload to args: void→[]; unknown (default)→optional one arg; single T→[T]; tuple→unchanged.\n */\ntype ToArgs<P> = P extends void\n ? []\n : unknown extends P\n ? [] | [P]\n : P extends unknown[]\n ? P\n : [P];\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 * PayloadMap[K] 可为 void(无参)、单类型 T(单参)、或元组 [A, B, ...](多参),统一规范为参数列表。\n * PayloadMap[K] can be void (no args), single type T (one arg), or tuple [A, B, ...] (multi arg).\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> = Record<E, unknown>> {\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[K] 规范为 ...args(无参/单参/多参均支持)。\n * Register a listener; callback args are normalized from PayloadMap[K] (void / single / tuple).\n */\n on<K extends E>(event: K, callback: (...args: ToArgs<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: (...args: ToArgs<PayloadMap[K]>) => void): void {\n this.listeners[event].delete(callback as EventCallback);\n }\n\n /**\n * 触发事件;参数与 PayloadMap[K] 一致:void 无参,T 单参,[A,B] 多参。\n * Emit an event; args match PayloadMap[K]: void → no args, T → one arg, [A,B] → spread.\n */\n emit<K extends E>(event: K, ...args: ToArgs<PayloadMap[K]>): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"mEA6DA,SAAS,EAA+C,EAA6B,CACnF,OAAO,EAGT,SAAS,EAAqC,EAAyD,CACrG,MAAM,EAAM,CAAA,EACZ,UAAW,KAAK,EACd,EAAI,CAAA,EAAK,IAAI,IAEf,OAAO,EAUT,IAAM,EAAN,KAAiG,CAC/F,UAEA,YAAY,EAA0C,CACpD,KAAK,UAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B,EAOhF,GAAgB,EAAU,EAA0D,CAClF,KAAK,UAAU,CAAA,EAAO,IAAI,CAAA,EAO5B,IAAiB,EAAU,EAA0D,CACnF,KAAK,UAAU,CAAA,EAAO,OAAO,CAAA,EAO/B,KAAkB,KAAa,EAAmC,CAChE,KAAK,UAAU,CAAA,EAAO,QAAS,GAAO,EAAG,GAAG,CAAA,CAAK"}
package/dist/events.d.ts CHANGED
@@ -35,7 +35,7 @@ export declare type EventCallback<Args extends unknown[] = unknown[]> = (...args
35
35
  *
36
36
  * @param events - 须为 defineEvents(...) 的返回值(DefinedEvents)。Must be the return value of defineEvents(...) (DefinedEvents).
37
37
  */
38
- export declare class EventEmitter<E extends string, PayloadMap extends Record<E, unknown> = Record<E, void>> {
38
+ export declare class EventEmitter<E extends string, PayloadMap extends Record<E, unknown> = Record<E, unknown>> {
39
39
  private listeners;
40
40
  constructor(events: DefinedEvents<Record<string, E>>);
41
41
  /**
@@ -58,7 +58,11 @@ export declare class EventEmitter<E extends string, PayloadMap extends Record<E,
58
58
  /** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */
59
59
  export declare type EventNamesOf<T> = T extends Defined<infer O, "events"> ? O[keyof O] : T extends Record<string, string> ? T[keyof T] : never;
60
60
 
61
- /** 将 PayloadMap[K] 规范为参数元组:void→[],单类型 T→[T],已是元组则不变。Normalize payload to args tuple for emit/on. */
62
- declare type ToArgs<P> = P extends void ? [] : P extends unknown[] ? P : [P];
61
+ /**
62
+ * PayloadMap[K] 规范为参数元组。
63
+ * void→[];unknown(默认/未指定 payload 类型)→ [] | [unknown](无参或单参,通用);单类型 T→[T];元组→不变。
64
+ * Normalize payload to args: void→[]; unknown (default)→optional one arg; single T→[T]; tuple→unchanged.
65
+ */
66
+ declare type ToArgs<P> = P extends void ? [] : unknown extends P ? [] | [P] : P extends unknown[] ? P : [P];
63
67
 
64
68
  export { }
@@ -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 * PayloadMap 支持:void(无参)、单类型(单参)、元组(多参)。\n *\n * @example PayloadMap(全部无参)\n * ```ts\n * const events = defineEvents({ A: \"a\", B: \"b\" });\n * class Em extends EventEmitter<EventNamesOf<typeof events>> { constructor() { super(events); } }\n * const em = new Em(); em.on(events.A, () => {}); em.emit(events.A);\n * ```\n * @example 单参\n * ```ts\n * type Map = { FOO: string };\n * class Em extends EventEmitter<\"FOO\", Map> { ... }\n * em.on(events.FOO, (x) => console.log(x)); em.emit(events.FOO, \"hi\");\n * ```\n * @example 多参(PayloadMap[K] 为元组)\n * ```ts\n * type Map = { LOG: [string, number] };\n * em.on(events.LOG, (msg, level) => {}); em.emit(events.LOG, \"ok\", 1);\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 内部存储用回调类型。Internal storage type for listeners. */\ntype EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;\n\n/** 将 PayloadMap[K] 规范为参数元组:void→[],单类型 T→[T],已是元组则不变。Normalize payload to args tuple for emit/on. */\ntype ToArgs<P> = P extends void ? [] : P extends unknown[] ? P : [P];\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 * PayloadMap[K] 可为 void(无参)、单类型 T(单参)、或元组 [A, B, ...](多参),统一规范为参数列表。\n * PayloadMap[K] can be void (no args), single type T (one arg), or tuple [A, B, ...] (multi arg).\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> = Record<E, void>> {\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[K] 规范为 ...args(无参/单参/多参均支持)。\n * Register a listener; callback args are normalized from PayloadMap[K] (void / single / tuple).\n */\n on<K extends E>(event: K, callback: (...args: ToArgs<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: (...args: ToArgs<PayloadMap[K]>) => void): void {\n this.listeners[event].delete(callback as EventCallback);\n }\n\n /**\n * 触发事件;参数与 PayloadMap[K] 一致:void 无参,T 单参,[A,B] 多参。\n * Emit an event; args match PayloadMap[K]: void → no args, T → one arg, [A,B] → spread.\n */\n emit<K extends E>(event: K, ...args: ToArgs<PayloadMap[K]>): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"AAmDA,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;;AAUT,IAAM,IAAN,MAA8F;AAAA,EAC5F;AAAA,EAEA,YAAY,GAA0C;AACpD,SAAK,YAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B;AAAA;EAOhF,GAAgB,GAAU,GAA0D;AAClF,SAAK,UAAU,CAAA,EAAO,IAAI,CAAA;AAAA;EAO5B,IAAiB,GAAU,GAA0D;AACnF,SAAK,UAAU,CAAA,EAAO,OAAO,CAAA;AAAA;EAO/B,KAAkB,MAAa,GAAmC;AAChE,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 * 不传 PayloadMap 时默认 PayloadMap = Record<E, unknown>,每个事件可无参或单参 (unknown),通用。\n * 传 PayloadMap 时可精确到:void(无参)、单类型(单参)、元组(多参)。\n *\n * @example 不传 PayloadMap(通用:无参或单参均可)\n * ```ts\n * const events = defineEvents({ A: \"a\", B: \"b\" });\n * class Em extends EventEmitter<EventNamesOf<typeof events>> { constructor() { super(events); } }\n * const em = new Em();\n * em.on(events.A, () => {}); em.emit(events.A);\n * em.on(events.B, (x) => console.log(x)); em.emit(events.B, data);\n * ```\n * @example 传 PayloadMap(严格单参/多参)\n * ```ts\n * type Map = { FOO: string; LOG: [string, number] };\n * class Em extends EventEmitter<\"FOO\"|\"LOG\", Map> { ... }\n * em.on(events.FOO, (x) => {}); em.emit(events.FOO, \"hi\");\n * em.on(events.LOG, (msg, level) => {}); em.emit(events.LOG, \"ok\", 1);\n * ```\n */\n\nimport type { Defined } from \"@/types\";\n\n/** 内部存储用回调类型。Internal storage type for listeners. */\ntype EventCallback<Args extends unknown[] = unknown[]> = (...args: Args) => void;\n\n/**\n * 将 PayloadMap[K] 规范为参数元组。\n * void→[];unknown(默认/未指定 payload 类型)→ [] | [unknown](无参或单参,通用);单类型 T→[T];元组→不变。\n * Normalize payload to args: void→[]; unknown (default)→optional one arg; single T→[T]; tuple→unchanged.\n */\ntype ToArgs<P> = P extends void\n ? []\n : unknown extends P\n ? [] | [P]\n : P extends unknown[]\n ? P\n : [P];\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 * PayloadMap[K] 可为 void(无参)、单类型 T(单参)、或元组 [A, B, ...](多参),统一规范为参数列表。\n * PayloadMap[K] can be void (no args), single type T (one arg), or tuple [A, B, ...] (multi arg).\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> = Record<E, unknown>> {\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[K] 规范为 ...args(无参/单参/多参均支持)。\n * Register a listener; callback args are normalized from PayloadMap[K] (void / single / tuple).\n */\n on<K extends E>(event: K, callback: (...args: ToArgs<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: (...args: ToArgs<PayloadMap[K]>) => void): void {\n this.listeners[event].delete(callback as EventCallback);\n }\n\n /**\n * 触发事件;参数与 PayloadMap[K] 一致:void 无参,T 单参,[A,B] 多参。\n * Emit an event; args match PayloadMap[K]: void → no args, T → one arg, [A,B] → spread.\n */\n emit<K extends E>(event: K, ...args: ToArgs<PayloadMap[K]>): void {\n this.listeners[event].forEach((cb) => cb(...args));\n }\n}\n\nexport { EventEmitter, defineEvents };\nexport type { EventCallback, DefinedEvents, EventNamesOf };\n"],"mappings":"AA6DA,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;;AAUT,IAAM,IAAN,MAAiG;AAAA,EAC/F;AAAA,EAEA,YAAY,GAA0C;AACpD,SAAK,YAAY,EAAmB,OAAO,OAAO,CAAA,CAA4B;AAAA;EAOhF,GAAgB,GAAU,GAA0D;AAClF,SAAK,UAAU,CAAA,EAAO,IAAI,CAAA;AAAA;EAO5B,IAAiB,GAAU,GAA0D;AACnF,SAAK,UAAU,CAAA,EAAO,OAAO,CAAA;AAAA;EAO/B,KAAkB,MAAa,GAAmC;AAChE,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.3.0",
3
+ "version": "0.4.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": {
@@ -203,4 +203,4 @@
203
203
  "typescript": "~5.9.3"
204
204
  }
205
205
  }
206
- }
206
+ }