nfx-ui 0.9.0 → 0.10.1

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 * 不传 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/** 回调类型:内部存储与 on/off 默认(unknown)时均用此,任意函数即可,无需 as 断言。 */\ntype EventCallback = (...args: any[]) => void;\n\n/**\n * 将 PayloadMap[K] 规范为参数元组。\n * void→[];unknown(默认)→ [] | [unknown];单类型 T→[T];元组→不变。\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 /** 注册事件监听;回调为任意函数,由 emit 时传入的参数决定实际类型。 */\n on<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].add(callback);\n }\n\n /** 移除事件监听(需与 on 时同一引用)。 */\n off<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].delete(callback);\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":"mEA4DA,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,EAIhF,GAAgB,EAAU,EAA+B,CACvD,KAAK,UAAU,CAAA,EAAO,IAAI,CAAA,EAI5B,IAAiB,EAAU,EAA+B,CACxD,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, ValueOf } from \"@/types\";\n\n/** 回调类型:内部存储与 on/off 默认(unknown)时均用此,任意函数即可,无需 as 断言。 */\ntype EventCallback = (...args: any[]) => void;\n\n/**\n * 将 PayloadMap[K] 规范为参数元组。\n * void→[];unknown(默认)→ [] | [unknown];单类型 T→[T];元组→不变。\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/**\n * 从 events 对象推导出事件名字符串联合。\n * - 使用 `[T] extends [Defined<...>]` 稳定 `infer O`,避免部分 TS 版本下 `T extends Defined<infer O>` 推断失败得到 `never`。\n * - 排除 `__defineBrand`,避免 `keyof O` 混入品牌键导致值联合含 `\"events\"` 或推断异常。\n */\ntype EventNamesOf<T> = [T] extends [Defined<infer O, \"events\">]\n ? ValueOf<{ [K in keyof O as K extends \"__defineBrand\" ? never : K]: O[K] }>\n : T extends Record<string, string>\n ? T[keyof T]\n : 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 /** 注册事件监听;回调为任意函数,由 emit 时传入的参数决定实际类型。 */\n on<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].add(callback);\n }\n\n /** 移除事件监听(需与 on 时同一引用)。 */\n off<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].delete(callback);\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":"mEAoEA,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,EAIhF,GAAgB,EAAU,EAA+B,CACvD,KAAK,UAAU,CAAA,EAAO,IAAI,CAAA,EAI5B,IAAiB,EAAU,EAA+B,CACxD,KAAK,UAAU,CAAA,EAAO,OAAO,CAAA,EAO/B,KAAkB,KAAa,EAAmC,CAChE,KAAK,UAAU,CAAA,EAAO,QAAS,GAAO,EAAG,GAAG,CAAA,CAAK"}
@@ -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 * 不传 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/** 回调类型:内部存储与 on/off 默认(unknown)时均用此,任意函数即可,无需 as 断言。 */\ntype EventCallback = (...args: any[]) => void;\n\n/**\n * 将 PayloadMap[K] 规范为参数元组。\n * void→[];unknown(默认)→ [] | [unknown];单类型 T→[T];元组→不变。\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 /** 注册事件监听;回调为任意函数,由 emit 时传入的参数决定实际类型。 */\n on<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].add(callback);\n }\n\n /** 移除事件监听(需与 on 时同一引用)。 */\n off<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].delete(callback);\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":"AA4DA,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;EAIhF,GAAgB,GAAU,GAA+B;AACvD,SAAK,UAAU,CAAA,EAAO,IAAI,CAAA;AAAA;EAI5B,IAAiB,GAAU,GAA+B;AACxD,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, ValueOf } from \"@/types\";\n\n/** 回调类型:内部存储与 on/off 默认(unknown)时均用此,任意函数即可,无需 as 断言。 */\ntype EventCallback = (...args: any[]) => void;\n\n/**\n * 将 PayloadMap[K] 规范为参数元组。\n * void→[];unknown(默认)→ [] | [unknown];单类型 T→[T];元组→不变。\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/**\n * 从 events 对象推导出事件名字符串联合。\n * - 使用 `[T] extends [Defined<...>]` 稳定 `infer O`,避免部分 TS 版本下 `T extends Defined<infer O>` 推断失败得到 `never`。\n * - 排除 `__defineBrand`,避免 `keyof O` 混入品牌键导致值联合含 `\"events\"` 或推断异常。\n */\ntype EventNamesOf<T> = [T] extends [Defined<infer O, \"events\">]\n ? ValueOf<{ [K in keyof O as K extends \"__defineBrand\" ? never : K]: O[K] }>\n : T extends Record<string, string>\n ? T[keyof T]\n : 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 /** 注册事件监听;回调为任意函数,由 emit 时传入的参数决定实际类型。 */\n on<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].add(callback);\n }\n\n /** 移除事件监听(需与 on 时同一引用)。 */\n off<K extends E>(event: K, callback: EventCallback): void {\n this.listeners[event].delete(callback);\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":"AAoEA,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;EAIhF,GAAgB,GAAU,GAA+B;AACvD,SAAK,UAAU,CAAA,EAAO,IAAI,CAAA;AAAA;EAI5B,IAAiB,GAAU,GAA+B;AACxD,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,4 +1,4 @@
1
- import { Defined } from '../../types';
1
+ import { Defined, ValueOf } from '../../types';
2
2
  /** 回调类型:内部存储与 on/off 默认(unknown)时均用此,任意函数即可,无需 as 断言。 */
3
3
  type EventCallback = (...args: any[]) => void;
4
4
  /**
@@ -8,8 +8,14 @@ type EventCallback = (...args: any[]) => void;
8
8
  type ToArgs<P> = P extends void ? [] : unknown extends P ? [] | [P] : P extends unknown[] ? P : [P];
9
9
  /** 由 defineEvents 返回的「已规范事件名对象」类型;constructor 只接受此类型。 */
10
10
  type DefinedEvents<T extends Record<string, string>> = Defined<T, "events">;
11
- /** 从 events 对象推导出事件名联合类型。Event name union from an events key-value object. */
12
- type EventNamesOf<T> = T extends Defined<infer O, "events"> ? O[keyof O] : T extends Record<string, string> ? T[keyof T] : never;
11
+ /**
12
+ * events 对象推导出事件名字符串联合。
13
+ * - 使用 `[T] extends [Defined<...>]` 稳定 `infer O`,避免部分 TS 版本下 `T extends Defined<infer O>` 推断失败得到 `never`。
14
+ * - 排除 `__defineBrand`,避免 `keyof O` 混入品牌键导致值联合含 `"events"` 或推断异常。
15
+ */
16
+ type EventNamesOf<T> = [T] extends [Defined<infer O, "events">] ? ValueOf<{
17
+ [K in keyof O as K extends "__defineBrand" ? never : K]: O[K];
18
+ }> : T extends Record<string, string> ? T[keyof T] : never;
13
19
  /**
14
20
  * 规范创建「一级 key-value」事件名对象:仅允许 key → 字符串 value,禁止嵌套(类型约束)。
15
21
  * 返回 DefinedEvents<T>,供 EventEmitter 构造使用。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nfx-ui",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "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.",