@cloudcome/utils-core 1.17.0 → 1.18.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.
- package/dist/emitter.cjs +17 -0
- package/dist/emitter.cjs.map +1 -1
- package/dist/emitter.d.ts +11 -1
- package/dist/emitter.mjs +17 -0
- package/dist/emitter.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/emitter.cjs
CHANGED
|
@@ -19,6 +19,23 @@ class Emitter {
|
|
|
19
19
|
this.#events.set(event, /* @__PURE__ */ new Set([listener]));
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* 注册事件监听器,仅触发一次
|
|
24
|
+
* @param event - 要监听的事件名称
|
|
25
|
+
* @param listener - 事件监听器函数
|
|
26
|
+
* @example
|
|
27
|
+
* emitter.once('click', (x, y) => {
|
|
28
|
+
* console.log(`Clicked at (${x}, ${y})`);
|
|
29
|
+
* });
|
|
30
|
+
*/
|
|
31
|
+
once(event, listener) {
|
|
32
|
+
const onceListener = (...payloads) => {
|
|
33
|
+
const result = listener(...payloads);
|
|
34
|
+
this.off(event, onceListener);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
this.on(event, onceListener);
|
|
38
|
+
}
|
|
22
39
|
/**
|
|
23
40
|
* 移除事件监听器,有三种使用方式:
|
|
24
41
|
* 1. 移除特定事件的特定监听器
|
package/dist/emitter.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.cjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap
|
|
1
|
+
{"version":3,"file":"emitter.cjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap = Record<string | symbol, unknown[]>> {\n #events: Map<keyof E, Set<AnyFunction>> = new Map();\n\n /**\n * 注册事件监听器\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n on<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n if (listeners) {\n listeners.add(listener);\n } else {\n this.#events.set(event, new Set([listener]));\n }\n }\n\n /**\n * 注册事件监听器,仅触发一次\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.once('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n once<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const onceListener = (...payloads: Parameters<EmitterListener<E, K>>) => {\n const result = listener(...payloads);\n this.off(event, onceListener);\n return result;\n };\n this.on(event, onceListener);\n }\n\n /**\n * 移除事件监听器,有三种使用方式:\n * 1. 移除特定事件的特定监听器\n * 2. 移除特定事件的所有监听器\n * 3. 移除所有事件的所有监听器\n * @param event - 要移除的事件名称(可选)\n * @param listener - 要移除的监听器函数(可选)\n * @example\n * // 移除特定事件的特定监听器\n * emitter.off('click', clickHandler);\n *\n * // 移除特定事件的所有监听器\n * emitter.off('click');\n *\n * // 移除所有事件的所有监听器\n * emitter.off();\n */\n off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>) {\n if (event && listener) {\n this.#offListener(event, listener);\n } else if (event) {\n this.#offEvent(event);\n } else {\n this.#offAll();\n }\n }\n\n #offAll() {\n this.#events.clear();\n }\n\n #offEvent<K extends keyof E>(event: K) {\n this.#events.delete(event);\n }\n\n #offListener<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * 触发指定事件,调用所有注册的监听器\n * @param event - 要触发的事件名称\n * @param payloads - 传递给监听器的参数\n * @remarks\n * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,\n * 则后续监听器将不会被执行\n * @example\n * emitter.emit('click', 10, 20);\n */\n emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>) {\n const listeners = this.#events.get(event) as Set<EmitterListener<E, K>> | undefined;\n\n if (!listeners) return;\n\n // 避免在 emit、on 的过程中改变 listeners 从而影响本次 emit\n for (const listener of [...listeners]) {\n if (listener(...payloads) === false) {\n break;\n }\n }\n }\n}\n"],"names":[],"mappings":";;AA8BO,MAAM,QAAmE;AAAA,EAC9E,8BAA8C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,GAAsB,OAAU,UAAiC;AAC/D,UAAM,YAAY,KAAK,QAAQ,IAAI,KAAK;AACxC,QAAI,WAAW;AACb,gBAAU,IAAI,QAAQ;AAAA,IAAA,OACjB;AACA,WAAA,QAAQ,IAAI,OAAO,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,IAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,KAAwB,OAAU,UAAiC;AAC3D,UAAA,eAAe,IAAI,aAAgD;AACjE,YAAA,SAAS,SAAS,GAAG,QAAQ;AAC9B,WAAA,IAAI,OAAO,YAAY;AACrB,aAAA;AAAA,IACT;AACK,SAAA,GAAG,OAAO,YAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB7B,IAAuB,OAAW,UAAkC;AAClE,QAAI,SAAS,UAAU;AAChB,WAAA,aAAa,OAAO,QAAQ;AAAA,eACxB,OAAO;AAChB,WAAK,UAAU,KAAK;AAAA,IAAA,OACf;AACL,WAAK,QAAQ;AAAA,IAAA;AAAA,EACf;AAAA,EAGF,UAAU;AACR,SAAK,QAAQ,MAAM;AAAA,EAAA;AAAA,EAGrB,UAA6B,OAAU;AAChC,SAAA,QAAQ,OAAO,KAAK;AAAA,EAAA;AAAA,EAG3B,aAAgC,OAAU,UAAiC;AACzE,UAAM,YAAY,KAAK,QAAQ,IAAI,KAAK;AAExC,QAAI,WAAW;AACb,gBAAU,OAAO,QAAQ;AAAA,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,KAAwB,UAAa,UAA6C;AAChF,UAAM,YAAY,KAAK,QAAQ,IAAI,KAAK;AAExC,QAAI,CAAC,UAAW;AAGhB,eAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AACrC,UAAI,SAAS,GAAG,QAAQ,MAAM,OAAO;AACnC;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;;"}
|
package/dist/emitter.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export type EmitterListener<E extends EmitterMap, K extends keyof E> = (...paylo
|
|
|
24
24
|
* });
|
|
25
25
|
* emitter.emit('click', 10, 20);
|
|
26
26
|
*/
|
|
27
|
-
export declare class Emitter<E extends EmitterMap
|
|
27
|
+
export declare class Emitter<E extends EmitterMap = Record<string | symbol, unknown[]>> {
|
|
28
28
|
#private;
|
|
29
29
|
/**
|
|
30
30
|
* 注册事件监听器
|
|
@@ -36,6 +36,16 @@ export declare class Emitter<E extends EmitterMap> {
|
|
|
36
36
|
* });
|
|
37
37
|
*/
|
|
38
38
|
on<K extends keyof E>(event: K, listener: EmitterListener<E, K>): void;
|
|
39
|
+
/**
|
|
40
|
+
* 注册事件监听器,仅触发一次
|
|
41
|
+
* @param event - 要监听的事件名称
|
|
42
|
+
* @param listener - 事件监听器函数
|
|
43
|
+
* @example
|
|
44
|
+
* emitter.once('click', (x, y) => {
|
|
45
|
+
* console.log(`Clicked at (${x}, ${y})`);
|
|
46
|
+
* });
|
|
47
|
+
*/
|
|
48
|
+
once<K extends keyof E>(event: K, listener: EmitterListener<E, K>): void;
|
|
39
49
|
/**
|
|
40
50
|
* 移除事件监听器,有三种使用方式:
|
|
41
51
|
* 1. 移除特定事件的特定监听器
|
package/dist/emitter.mjs
CHANGED
|
@@ -17,6 +17,23 @@ class Emitter {
|
|
|
17
17
|
this.#events.set(event, /* @__PURE__ */ new Set([listener]));
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* 注册事件监听器,仅触发一次
|
|
22
|
+
* @param event - 要监听的事件名称
|
|
23
|
+
* @param listener - 事件监听器函数
|
|
24
|
+
* @example
|
|
25
|
+
* emitter.once('click', (x, y) => {
|
|
26
|
+
* console.log(`Clicked at (${x}, ${y})`);
|
|
27
|
+
* });
|
|
28
|
+
*/
|
|
29
|
+
once(event, listener) {
|
|
30
|
+
const onceListener = (...payloads) => {
|
|
31
|
+
const result = listener(...payloads);
|
|
32
|
+
this.off(event, onceListener);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
this.on(event, onceListener);
|
|
36
|
+
}
|
|
20
37
|
/**
|
|
21
38
|
* 移除事件监听器,有三种使用方式:
|
|
22
39
|
* 1. 移除特定事件的特定监听器
|
package/dist/emitter.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.mjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap
|
|
1
|
+
{"version":3,"file":"emitter.mjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap = Record<string | symbol, unknown[]>> {\n #events: Map<keyof E, Set<AnyFunction>> = new Map();\n\n /**\n * 注册事件监听器\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n on<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n if (listeners) {\n listeners.add(listener);\n } else {\n this.#events.set(event, new Set([listener]));\n }\n }\n\n /**\n * 注册事件监听器,仅触发一次\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.once('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n once<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const onceListener = (...payloads: Parameters<EmitterListener<E, K>>) => {\n const result = listener(...payloads);\n this.off(event, onceListener);\n return result;\n };\n this.on(event, onceListener);\n }\n\n /**\n * 移除事件监听器,有三种使用方式:\n * 1. 移除特定事件的特定监听器\n * 2. 移除特定事件的所有监听器\n * 3. 移除所有事件的所有监听器\n * @param event - 要移除的事件名称(可选)\n * @param listener - 要移除的监听器函数(可选)\n * @example\n * // 移除特定事件的特定监听器\n * emitter.off('click', clickHandler);\n *\n * // 移除特定事件的所有监听器\n * emitter.off('click');\n *\n * // 移除所有事件的所有监听器\n * emitter.off();\n */\n off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>) {\n if (event && listener) {\n this.#offListener(event, listener);\n } else if (event) {\n this.#offEvent(event);\n } else {\n this.#offAll();\n }\n }\n\n #offAll() {\n this.#events.clear();\n }\n\n #offEvent<K extends keyof E>(event: K) {\n this.#events.delete(event);\n }\n\n #offListener<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * 触发指定事件,调用所有注册的监听器\n * @param event - 要触发的事件名称\n * @param payloads - 传递给监听器的参数\n * @remarks\n * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,\n * 则后续监听器将不会被执行\n * @example\n * emitter.emit('click', 10, 20);\n */\n emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>) {\n const listeners = this.#events.get(event) as Set<EmitterListener<E, K>> | undefined;\n\n if (!listeners) return;\n\n // 避免在 emit、on 的过程中改变 listeners 从而影响本次 emit\n for (const listener of [...listeners]) {\n if (listener(...payloads) === false) {\n break;\n }\n }\n }\n}\n"],"names":[],"mappings":"AA8BO,MAAM,QAAmE;AAAA,EAC9E,8BAA8C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,GAAsB,OAAU,UAAiC;AAC/D,UAAM,YAAY,KAAK,QAAQ,IAAI,KAAK;AACxC,QAAI,WAAW;AACb,gBAAU,IAAI,QAAQ;AAAA,IAAA,OACjB;AACA,WAAA,QAAQ,IAAI,OAAO,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,IAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,KAAwB,OAAU,UAAiC;AAC3D,UAAA,eAAe,IAAI,aAAgD;AACjE,YAAA,SAAS,SAAS,GAAG,QAAQ;AAC9B,WAAA,IAAI,OAAO,YAAY;AACrB,aAAA;AAAA,IACT;AACK,SAAA,GAAG,OAAO,YAAY;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB7B,IAAuB,OAAW,UAAkC;AAClE,QAAI,SAAS,UAAU;AAChB,WAAA,aAAa,OAAO,QAAQ;AAAA,eACxB,OAAO;AAChB,WAAK,UAAU,KAAK;AAAA,IAAA,OACf;AACL,WAAK,QAAQ;AAAA,IAAA;AAAA,EACf;AAAA,EAGF,UAAU;AACR,SAAK,QAAQ,MAAM;AAAA,EAAA;AAAA,EAGrB,UAA6B,OAAU;AAChC,SAAA,QAAQ,OAAO,KAAK;AAAA,EAAA;AAAA,EAG3B,aAAgC,OAAU,UAAiC;AACzE,UAAM,YAAY,KAAK,QAAQ,IAAI,KAAK;AAExC,QAAI,WAAW;AACb,gBAAU,OAAO,QAAQ;AAAA,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,KAAwB,UAAa,UAA6C;AAChF,UAAM,YAAY,KAAK,QAAQ,IAAI,KAAK;AAExC,QAAI,CAAC,UAAW;AAGhB,eAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AACrC,UAAI,SAAS,GAAG,QAAQ,MAAM,OAAO;AACnC;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;"}
|
package/dist/index.cjs
CHANGED
package/dist/index.mjs
CHANGED