@polyv/utils 2.1.0-beta.1 → 2.3.0-beta.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.
- package/dist/cjs/event.d.ts +113 -0
- package/dist/cjs/event.js +1 -0
- package/dist/cjs/string.d.ts +6 -0
- package/dist/cjs/string.js +1 -1
- package/dist/es/event.d.ts +113 -0
- package/dist/es/event.js +1 -0
- package/dist/es/string.d.ts +6 -0
- package/dist/es/string.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本模块提供事件触发器类。
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```js
|
|
7
|
+
* import { EventEmitter } from '@polyv/utils/es/event';
|
|
8
|
+
*
|
|
9
|
+
* const emitter = new EventEmitter();
|
|
10
|
+
* const context = { name: 'my name' };
|
|
11
|
+
*
|
|
12
|
+
* function eventHandler(e) {
|
|
13
|
+
* console.log(e);
|
|
14
|
+
* console.log(this === context); // true
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // listen event
|
|
18
|
+
* emitter.on('foo', eventHandler, context);
|
|
19
|
+
*
|
|
20
|
+
* // listen once event
|
|
21
|
+
* emitter.once('foo', eventHandler, context);
|
|
22
|
+
*
|
|
23
|
+
* // fire event
|
|
24
|
+
* emitter.emit('foo', { a: 1 });
|
|
25
|
+
*
|
|
26
|
+
* // unlisten event
|
|
27
|
+
* emitter.off('foo', eventHandler);
|
|
28
|
+
*
|
|
29
|
+
* // ---------- use typescript define event parameter types ---------- //
|
|
30
|
+
* type EventParams = {
|
|
31
|
+
* foo: string;
|
|
32
|
+
* boo: number;
|
|
33
|
+
* };
|
|
34
|
+
*
|
|
35
|
+
* const emitter = new EventEmitter<EventParams>();
|
|
36
|
+
*
|
|
37
|
+
* emitter.on('foo', (e) => {}); // 'e' has inferred type 'string'
|
|
38
|
+
*
|
|
39
|
+
* emitter.emit('foo', 18); // Error: Argument of type 'number' is not assignable to parameter of type 'string'. (2345)
|
|
40
|
+
*
|
|
41
|
+
* // ---------- use typescript define event enum ---------- //
|
|
42
|
+
* enum TestEvent {
|
|
43
|
+
* Foo = 'foo',
|
|
44
|
+
* Bar = 'bar',
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* type TestEventParams = {
|
|
48
|
+
* [TestEvent.Foo]: string;
|
|
49
|
+
* [TestEvent.Bar]: number;
|
|
50
|
+
* };
|
|
51
|
+
*
|
|
52
|
+
* const emitter = new EventEmitter<TestEventParams, TestEvent>();
|
|
53
|
+
*
|
|
54
|
+
* emitter.emit(TestEvent.Foo, 'abc'); // ok
|
|
55
|
+
*
|
|
56
|
+
* emitter.emit('foo', 'abc'); // Error: Argument of type "'foo'" is not assignable to parameter of type 'TestEvent'. (2345)
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* 事件类型
|
|
61
|
+
*/
|
|
62
|
+
export declare type EventType = string | symbol;
|
|
63
|
+
/**
|
|
64
|
+
* 事件参数关系类型
|
|
65
|
+
*/
|
|
66
|
+
export declare type EventRelationsType = Record<EventType, unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* 事件回调函数类型
|
|
69
|
+
*/
|
|
70
|
+
export declare type EventHandler<Relations extends EventRelationsType, E extends EventType> = (params: Relations[E]) => unknown;
|
|
71
|
+
export declare class EventEmitter<Relations extends EventRelationsType = EventRelationsType, Events extends EventType = string> {
|
|
72
|
+
/**
|
|
73
|
+
* 事件回调存储器
|
|
74
|
+
* @ignore
|
|
75
|
+
*/
|
|
76
|
+
private __eventStore;
|
|
77
|
+
/**
|
|
78
|
+
* 添加监听事件
|
|
79
|
+
* @ignore
|
|
80
|
+
*/
|
|
81
|
+
private __addOnEvent;
|
|
82
|
+
/**
|
|
83
|
+
* 监听事件
|
|
84
|
+
* @param event 事件名
|
|
85
|
+
* @param handler 回调函数
|
|
86
|
+
* @param context this 上下文
|
|
87
|
+
*/
|
|
88
|
+
on<E extends Events>(event: E, handler: EventHandler<Relations, E>, context?: unknown): void;
|
|
89
|
+
/**
|
|
90
|
+
* 监听事件(一次性)
|
|
91
|
+
* @param event 事件名
|
|
92
|
+
* @param handler 回调函数
|
|
93
|
+
* @param context this 上下文
|
|
94
|
+
*/
|
|
95
|
+
once<E extends Events>(event: E, handler: EventHandler<Relations, E>, context?: unknown): void;
|
|
96
|
+
/**
|
|
97
|
+
* 移除事件监听
|
|
98
|
+
* @param event 事件名
|
|
99
|
+
* @param handler 回调函数
|
|
100
|
+
*/
|
|
101
|
+
off<E extends Events>(event: E, handler: unknown): void;
|
|
102
|
+
/**
|
|
103
|
+
* 触发事件
|
|
104
|
+
* @param event 事件名
|
|
105
|
+
* @param params 回调参数
|
|
106
|
+
*/
|
|
107
|
+
emit<E extends Events>(event: E, params: Relations[E]): void;
|
|
108
|
+
emit<E extends Events>(event: undefined extends Relations[E] ? E : never): void;
|
|
109
|
+
/**
|
|
110
|
+
* 销毁实例
|
|
111
|
+
*/
|
|
112
|
+
destroy(): void;
|
|
113
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.EventEmitter=void 0;var EventEmitter=function(){function t(){this.__eventStore={}}return t.prototype.__addOnEvent=function(t,e,n,o){if(e&&n){var r=this.__eventStore[e];r||(r=[]),r.push({type:t,handler:n,callbackHandler:n.bind(o)}),this.__eventStore[e]=r}},t.prototype.on=function(t,e,n){void 0===n&&(n=this),this.__addOnEvent("normal",t,e,n)},t.prototype.once=function(t,e,n){void 0===n&&(n=this),this.__addOnEvent("once",t,e,n)},t.prototype.off=function(t,e){var n=this.__eventStore[t];n&&(n=n.filter((function(t){return t.handler!==e})),this.__eventStore[t]=n)},t.prototype.emit=function(t,e){var n=this,o=this.__eventStore[t];o&&o.forEach((function(o){var r=o.type,i=o.handler,v=o.callbackHandler;"function"==typeof v&&v(e),"once"===r&&n.off(t,i)}))},t.prototype.destroy=function(){this.__eventStore={}},t}();exports.EventEmitter=EventEmitter;
|
package/dist/cjs/string.d.ts
CHANGED
|
@@ -59,6 +59,12 @@ export declare function cutStr(str: string, length: number, options?: ICutStrOpt
|
|
|
59
59
|
* @return 替换后的字符串。
|
|
60
60
|
*/
|
|
61
61
|
export declare function escapeHTML(str: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* 把指定字符串中的 HTML 实体替换成 HTML 预留字符。
|
|
64
|
+
* @param str 指定字符串。
|
|
65
|
+
* @return 替换后的字符串。
|
|
66
|
+
*/
|
|
67
|
+
export declare function unescapeHTML(str: string): string;
|
|
62
68
|
/**
|
|
63
69
|
* 移除指定字符串中的 HTML 标签。
|
|
64
70
|
* @param str 指定字符串。
|
package/dist/cjs/string.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function strLen(e,
|
|
1
|
+
"use strict";function strLen(e,n){var r,t;"number"==typeof n?n={enLen:1,nonEnLen:n}:((n=n||{}).enLen=null!==(r=n.enLen)&&void 0!==r?r:1,n.nonEnLen=null!==(t=n.nonEnLen)&&void 0!==t?t:2);for(var o=0,s=e.length-1;s>=0;s--)o+=e.charCodeAt(s)>255?n.nonEnLen||0:n.enLen||0;return o}function cutStr(e,n,r){(r=r||{}).enLen=Number(r.enLen)||1,r.nonEnLen=Number(r.nonEnLen)||2,r.ellipsis=r.ellipsis||"...";var t=strLen(e=String(e),r);if(t<=n)return e;n-=strLen(r.ellipsis,r);for(var o="",s=-1;n>0&&++s<t;)(n-=e.charCodeAt(s)>255?r.nonEnLen:r.enLen)>=0&&(o+=e.charAt(s));return o+=r.ellipsis}Object.defineProperty(exports,"__esModule",{value:!0}),exports.compareVersions=exports.uuidV4=exports.randomStr=exports.nl2br=exports.removeTags=exports.unescapeHTML=exports.escapeHTML=exports.cutStr=exports.strLen=void 0,exports.strLen=strLen,exports.cutStr=cutStr;var htmlChars=['"',"'","&","<",">"],htmlEntities=[""","'","&","<",">"],charsToEntities=Object.create(null),entitiesToChars=Object.create(null);htmlChars.forEach((function(e,n){charsToEntities[e]=htmlEntities[n],entitiesToChars[htmlEntities[n]]=e}));var reHTMLChars=new RegExp("["+htmlChars.join("")+"]","g"),reHTMLEntities=new RegExp("("+htmlEntities.join("|")+")","g");function escapeHTML(e){return null==e?e:String(e).replace(reHTMLChars,(function(e){return charsToEntities[e]}))}function unescapeHTML(e){return null==e?e:String(e).replace(reHTMLEntities,(function(e){return entitiesToChars[e]}))}function removeTags(e){return null==e?"":String(e).replace(/<.+?>/g,"")}function nl2br(e){return null==e?e:String(e).replace(/\r?\n/g,"<br />")}function randomStr(e,n){if(!(e|=0)||e<0)throw new Error('"length" must be a number greater than 0');var r="";do{r+=Math.random().toString(36).substr(2)}while(r.length<e);return r=r.substr(0,e),null!=n&&(r=n+r),r}function uuidV4(){var e=Date.now();return"undefined"!=typeof performance&&"function"==typeof performance.now&&(e+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(n){var r=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===n?r:3&r|8).toString(16)}))}function compareVersions(e,n){if(!e||!n)throw new Error("Please specify both verA and verB");for(var r=/(\.0+)+$/,t=String(e).replace(r,"").split("."),o=String(n).replace(r,"").split("."),s=Math.min(t.length,o.length),i=0;i<s;i++){var a=parseInt(t[i])-parseInt(o[i]);if(a)return a}return t.length-o.length}exports.escapeHTML=escapeHTML,exports.unescapeHTML=unescapeHTML,exports.removeTags=removeTags,exports.nl2br=nl2br,exports.randomStr=randomStr,exports.uuidV4=uuidV4,exports.compareVersions=compareVersions;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本模块提供事件触发器类。
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```js
|
|
7
|
+
* import { EventEmitter } from '@polyv/utils/es/event';
|
|
8
|
+
*
|
|
9
|
+
* const emitter = new EventEmitter();
|
|
10
|
+
* const context = { name: 'my name' };
|
|
11
|
+
*
|
|
12
|
+
* function eventHandler(e) {
|
|
13
|
+
* console.log(e);
|
|
14
|
+
* console.log(this === context); // true
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // listen event
|
|
18
|
+
* emitter.on('foo', eventHandler, context);
|
|
19
|
+
*
|
|
20
|
+
* // listen once event
|
|
21
|
+
* emitter.once('foo', eventHandler, context);
|
|
22
|
+
*
|
|
23
|
+
* // fire event
|
|
24
|
+
* emitter.emit('foo', { a: 1 });
|
|
25
|
+
*
|
|
26
|
+
* // unlisten event
|
|
27
|
+
* emitter.off('foo', eventHandler);
|
|
28
|
+
*
|
|
29
|
+
* // ---------- use typescript define event parameter types ---------- //
|
|
30
|
+
* type EventParams = {
|
|
31
|
+
* foo: string;
|
|
32
|
+
* boo: number;
|
|
33
|
+
* };
|
|
34
|
+
*
|
|
35
|
+
* const emitter = new EventEmitter<EventParams>();
|
|
36
|
+
*
|
|
37
|
+
* emitter.on('foo', (e) => {}); // 'e' has inferred type 'string'
|
|
38
|
+
*
|
|
39
|
+
* emitter.emit('foo', 18); // Error: Argument of type 'number' is not assignable to parameter of type 'string'. (2345)
|
|
40
|
+
*
|
|
41
|
+
* // ---------- use typescript define event enum ---------- //
|
|
42
|
+
* enum TestEvent {
|
|
43
|
+
* Foo = 'foo',
|
|
44
|
+
* Bar = 'bar',
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* type TestEventParams = {
|
|
48
|
+
* [TestEvent.Foo]: string;
|
|
49
|
+
* [TestEvent.Bar]: number;
|
|
50
|
+
* };
|
|
51
|
+
*
|
|
52
|
+
* const emitter = new EventEmitter<TestEventParams, TestEvent>();
|
|
53
|
+
*
|
|
54
|
+
* emitter.emit(TestEvent.Foo, 'abc'); // ok
|
|
55
|
+
*
|
|
56
|
+
* emitter.emit('foo', 'abc'); // Error: Argument of type "'foo'" is not assignable to parameter of type 'TestEvent'. (2345)
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* 事件类型
|
|
61
|
+
*/
|
|
62
|
+
export declare type EventType = string | symbol;
|
|
63
|
+
/**
|
|
64
|
+
* 事件参数关系类型
|
|
65
|
+
*/
|
|
66
|
+
export declare type EventRelationsType = Record<EventType, unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* 事件回调函数类型
|
|
69
|
+
*/
|
|
70
|
+
export declare type EventHandler<Relations extends EventRelationsType, E extends EventType> = (params: Relations[E]) => unknown;
|
|
71
|
+
export declare class EventEmitter<Relations extends EventRelationsType = EventRelationsType, Events extends EventType = string> {
|
|
72
|
+
/**
|
|
73
|
+
* 事件回调存储器
|
|
74
|
+
* @ignore
|
|
75
|
+
*/
|
|
76
|
+
private __eventStore;
|
|
77
|
+
/**
|
|
78
|
+
* 添加监听事件
|
|
79
|
+
* @ignore
|
|
80
|
+
*/
|
|
81
|
+
private __addOnEvent;
|
|
82
|
+
/**
|
|
83
|
+
* 监听事件
|
|
84
|
+
* @param event 事件名
|
|
85
|
+
* @param handler 回调函数
|
|
86
|
+
* @param context this 上下文
|
|
87
|
+
*/
|
|
88
|
+
on<E extends Events>(event: E, handler: EventHandler<Relations, E>, context?: unknown): void;
|
|
89
|
+
/**
|
|
90
|
+
* 监听事件(一次性)
|
|
91
|
+
* @param event 事件名
|
|
92
|
+
* @param handler 回调函数
|
|
93
|
+
* @param context this 上下文
|
|
94
|
+
*/
|
|
95
|
+
once<E extends Events>(event: E, handler: EventHandler<Relations, E>, context?: unknown): void;
|
|
96
|
+
/**
|
|
97
|
+
* 移除事件监听
|
|
98
|
+
* @param event 事件名
|
|
99
|
+
* @param handler 回调函数
|
|
100
|
+
*/
|
|
101
|
+
off<E extends Events>(event: E, handler: unknown): void;
|
|
102
|
+
/**
|
|
103
|
+
* 触发事件
|
|
104
|
+
* @param event 事件名
|
|
105
|
+
* @param params 回调参数
|
|
106
|
+
*/
|
|
107
|
+
emit<E extends Events>(event: E, params: Relations[E]): void;
|
|
108
|
+
emit<E extends Events>(event: undefined extends Relations[E] ? E : never): void;
|
|
109
|
+
/**
|
|
110
|
+
* 销毁实例
|
|
111
|
+
*/
|
|
112
|
+
destroy(): void;
|
|
113
|
+
}
|
package/dist/es/event.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export class EventEmitter{constructor(){this.__eventStore={}}__addOnEvent(t,e,n,o){if(!e||!n)return;let r=this.__eventStore[e];r||(r=[]),r.push({type:t,handler:n,callbackHandler:n.bind(o)}),this.__eventStore[e]=r}on(t,e,n=this){this.__addOnEvent("normal",t,e,n)}once(t,e,n=this){this.__addOnEvent("once",t,e,n)}off(t,e){let n=this.__eventStore[t];n&&(n=n.filter((t=>t.handler!==e)),this.__eventStore[t]=n)}emit(t,e){const n=this.__eventStore[t];n&&n.forEach((n=>{const{type:o,handler:r,callbackHandler:_}=n;"function"==typeof _&&_(e),"once"===o&&this.off(t,r)}))}destroy(){this.__eventStore={}}}
|
package/dist/es/string.d.ts
CHANGED
|
@@ -59,6 +59,12 @@ export declare function cutStr(str: string, length: number, options?: ICutStrOpt
|
|
|
59
59
|
* @return 替换后的字符串。
|
|
60
60
|
*/
|
|
61
61
|
export declare function escapeHTML(str: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* 把指定字符串中的 HTML 实体替换成 HTML 预留字符。
|
|
64
|
+
* @param str 指定字符串。
|
|
65
|
+
* @return 替换后的字符串。
|
|
66
|
+
*/
|
|
67
|
+
export declare function unescapeHTML(str: string): string;
|
|
62
68
|
/**
|
|
63
69
|
* 移除指定字符串中的 HTML 标签。
|
|
64
70
|
* @param str 指定字符串。
|
package/dist/es/string.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export function strLen(n,e){var r
|
|
1
|
+
export function strLen(n,e){var t,r;"number"==typeof e?e={enLen:1,nonEnLen:e}:((e=e||{}).enLen=null!==(t=e.enLen)&&void 0!==t?t:1,e.nonEnLen=null!==(r=e.nonEnLen)&&void 0!==r?r:2);let o=0;for(let t=n.length-1;t>=0;t--)o+=n.charCodeAt(t)>255?e.nonEnLen||0:e.enLen||0;return o}export function cutStr(n,e,t){(t=t||{}).enLen=Number(t.enLen)||1,t.nonEnLen=Number(t.nonEnLen)||2,t.ellipsis=t.ellipsis||"...";const r=strLen(n=String(n),t);if(r<=e)return n;e-=strLen(t.ellipsis,t);let o="",i=-1;for(;e>0&&++i<r;)(e-=n.charCodeAt(i)>255?t.nonEnLen:t.enLen)>=0&&(o+=n.charAt(i));return o+=t.ellipsis,o}const htmlChars=['"',"'","&","<",">"],htmlEntities=[""","'","&","<",">"],charsToEntities=Object.create(null),entitiesToChars=Object.create(null);htmlChars.forEach(((n,e)=>{charsToEntities[n]=htmlEntities[e],entitiesToChars[htmlEntities[e]]=n}));const reHTMLChars=new RegExp("["+htmlChars.join("")+"]","g"),reHTMLEntities=new RegExp("("+htmlEntities.join("|")+")","g");export function escapeHTML(n){return null==n?n:String(n).replace(reHTMLChars,(n=>charsToEntities[n]))}export function unescapeHTML(n){return null==n?n:String(n).replace(reHTMLEntities,(n=>entitiesToChars[n]))}export function removeTags(n){return null==n?"":String(n).replace(/<.+?>/g,"")}export function nl2br(n){return null==n?n:String(n).replace(/\r?\n/g,"<br />")}export function randomStr(n,e){if(!(n|=0)||n<0)throw new Error('"length" must be a number greater than 0');let t="";do{t+=Math.random().toString(36).substr(2)}while(t.length<n);return t=t.substr(0,n),null!=e&&(t=e+t),t}export function uuidV4(){let n=Date.now();return"undefined"!=typeof performance&&"function"==typeof performance.now&&(n+=performance.now()),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){const t=(n+16*Math.random())%16|0;return n=Math.floor(n/16),("x"===e?t:3&t|8).toString(16)}))}export function compareVersions(n,e){if(!n||!e)throw new Error("Please specify both verA and verB");const t=/(\.0+)+$/,r=String(n).replace(t,"").split("."),o=String(e).replace(t,"").split("."),i=Math.min(r.length,o.length);for(let n=0;n<i;n++){const e=parseInt(r[n])-parseInt(o[n]);if(e)return e}return r.length-o.length}
|