events-ex 1.1.7 → 2.0.0-alpha.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.
Files changed (149) hide show
  1. package/.babelrc +9 -0
  2. package/.eslintrc.yml +30 -0
  3. package/.mocharc.yml +3 -0
  4. package/.prettierignore +4 -0
  5. package/.prettierrc +8 -0
  6. package/.versionrc +36 -0
  7. package/CHANGELOG.md +32 -0
  8. package/README.cn.md +248 -0
  9. package/README.md +72 -107
  10. package/ability.js +1 -1
  11. package/benchmark/many-on.js +20 -12
  12. package/benchmark/single-on.js +15 -9
  13. package/docs/.nojekyll +1 -0
  14. package/docs/README.md +238 -0
  15. package/docs/classes/event.Event.md +120 -0
  16. package/docs/classes/index-1.EventEmitter.md +25 -0
  17. package/docs/classes/index.EventEmitter.md +296 -0
  18. package/docs/modules/all_off.md +44 -0
  19. package/docs/modules/consts.md +27 -0
  20. package/docs/modules/default_methods.md +51 -0
  21. package/docs/modules/event.md +19 -0
  22. package/docs/modules/event_emitter.md +57 -0
  23. package/docs/modules/eventable.md +47 -0
  24. package/docs/modules/has_listeners.md +40 -0
  25. package/docs/modules/index-1.md +89 -0
  26. package/docs/modules/index.md +82 -0
  27. package/docs/modules/pipe.md +49 -0
  28. package/docs/modules/pipe_async.md +49 -0
  29. package/docs/modules/unify.md +46 -0
  30. package/docs/modules/util_array_remove.md +39 -0
  31. package/docs/modules/util_object_for_each.md +41 -0
  32. package/docs/modules/util_string_pad.md +40 -0
  33. package/docs/modules/util_to_int.md +39 -0
  34. package/docs/modules/util_valid_callable.md +39 -0
  35. package/docs/modules/util_valid_object.md +39 -0
  36. package/docs/modules.md +26 -0
  37. package/lib/all-off.d.ts +9 -0
  38. package/lib/all-off.js +24 -0
  39. package/lib/consts.d.ts +9 -0
  40. package/lib/consts.js +15 -0
  41. package/lib/default-methods.d.ts +49 -0
  42. package/lib/default-methods.js +327 -0
  43. package/lib/event-emitter.d.ts +8 -0
  44. package/lib/event-emitter.js +47 -0
  45. package/lib/event.d.ts +47 -0
  46. package/lib/event.js +56 -0
  47. package/lib/eventable.d.ts +2 -0
  48. package/lib/eventable.js +37 -0
  49. package/lib/has-listeners.d.ts +2 -0
  50. package/lib/has-listeners.js +25 -0
  51. package/lib/index.d.ts +79 -0
  52. package/lib/index.js +128 -0
  53. package/lib/pipe-async.d.ts +11 -0
  54. package/lib/pipe-async.js +62 -0
  55. package/lib/pipe.d.ts +11 -0
  56. package/lib/pipe.js +62 -0
  57. package/lib/unify.d.ts +9 -0
  58. package/lib/unify.js +72 -0
  59. package/lib/util/array-remove.d.ts +2 -0
  60. package/lib/util/array-remove.js +21 -0
  61. package/lib/util/object-for-each.d.ts +2 -0
  62. package/lib/util/object-for-each.js +25 -0
  63. package/lib/util/string-pad.d.ts +2 -0
  64. package/lib/util/string-pad.js +26 -0
  65. package/lib/util/to-int.d.ts +2 -0
  66. package/lib/util/to-int.js +20 -0
  67. package/lib/util/valid-callable.d.ts +2 -0
  68. package/lib/util/valid-callable.js +15 -0
  69. package/lib/util/valid-object.d.ts +2 -0
  70. package/lib/util/valid-object.js +16 -0
  71. package/package.json +35 -9
  72. package/src/all-off.js +16 -0
  73. package/src/consts.js +9 -0
  74. package/src/default-methods.js +296 -0
  75. package/src/event-emitter.js +42 -0
  76. package/src/event.js +49 -0
  77. package/src/eventable.js +29 -0
  78. package/src/has-listeners.js +20 -0
  79. package/src/index.d.ts +79 -0
  80. package/src/index.js +21 -0
  81. package/src/pipe-async.js +53 -0
  82. package/src/pipe.js +53 -0
  83. package/src/unify.js +58 -0
  84. package/src/util/array-remove.js +16 -0
  85. package/src/util/object-for-each.js +20 -0
  86. package/src/util/string-pad.js +19 -0
  87. package/src/util/to-int.js +9 -0
  88. package/src/util/valid-callable.js +6 -0
  89. package/src/util/valid-object.js +8 -0
  90. package/test/add-listeners-test.js +42 -0
  91. package/test/all-off-test.js +51 -0
  92. package/test/check-listener-leaks-test.js +76 -0
  93. package/test/emitter-method-names-test.js +11 -0
  94. package/test/event-emitter-async-test.js +152 -0
  95. package/test/event-emitter-test.js +145 -0
  96. package/test/{eventable.js → eventable-test.js} +12 -16
  97. package/test/events-listeners-test.js +46 -0
  98. package/test/events-remove-listeners-test.js +89 -0
  99. package/test/has-listeners-test.js +44 -0
  100. package/test/listeners-side-effects-test.js +40 -0
  101. package/test/max-listeners-test.js +33 -0
  102. package/test/modify-in-emit-test.js +121 -0
  103. package/test/no-error-provided-to-error-event-test.js +38 -0
  104. package/test/num-args-test.js +41 -0
  105. package/test/once-test.js +44 -0
  106. package/test/pipe-async-test.js +58 -0
  107. package/test/pipe-test.js +57 -0
  108. package/test/remove-all-listeners-test.js +74 -0
  109. package/test/set-max-listeners-side-effects-test.js +13 -0
  110. package/test/subclass-test.js +49 -0
  111. package/test/unify-async-test.js +122 -0
  112. package/test/unify-test.js +122 -0
  113. package/tsconfig.json +27 -0
  114. package/all-off.js +0 -9
  115. package/consts.js +0 -5
  116. package/default-methods.js +0 -318
  117. package/event-emitter.js +0 -41
  118. package/eventable.js +0 -70
  119. package/events.d.ts +0 -50
  120. package/events.js +0 -18
  121. package/has-listeners.js +0 -16
  122. package/index.d.ts +0 -3
  123. package/index.js +0 -3
  124. package/pipe.js +0 -41
  125. package/src/default-methods.coffee +0 -218
  126. package/src/event-emitter.coffee +0 -24
  127. package/src/eventable.coffee +0 -34
  128. package/src/events.coffee +0 -9
  129. package/test/all-off.js +0 -48
  130. package/test/event-emitter.js +0 -134
  131. package/test/events-listeners.js +0 -70
  132. package/test/events-remove-listeners.js +0 -110
  133. package/test/events.js +0 -22
  134. package/test/has-listeners.js +0 -42
  135. package/test/pipe.js +0 -53
  136. package/test/test-event-emitter-add-listeners.js +0 -61
  137. package/test/test-event-emitter-check-listener-leaks.js +0 -93
  138. package/test/test-event-emitter-listeners-side-effects.js +0 -59
  139. package/test/test-event-emitter-max-listeners.js +0 -49
  140. package/test/test-event-emitter-method-names.js +0 -27
  141. package/test/test-event-emitter-modify-in-emit.js +0 -76
  142. package/test/test-event-emitter-no-error-provided-to-error-event.js +0 -40
  143. package/test/test-event-emitter-num-args.js +0 -40
  144. package/test/test-event-emitter-once.js +0 -61
  145. package/test/test-event-emitter-remove-all-listeners.js +0 -93
  146. package/test/test-event-emitter-set-max-listeners-side-effects.js +0 -28
  147. package/test/test-event-emitter-subclass.js +0 -66
  148. package/test/unify.js +0 -123
  149. package/unify.js +0 -50
package/.babelrc ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "plugins": [
3
+ ["@babel/plugin-proposal-dynamic-import"],
4
+ ["@babel/plugin-transform-modules-commonjs", {
5
+ "allowTopLevelThis": true,
6
+ // "importInterop": "node",
7
+ }]
8
+ ]
9
+ }
package/.eslintrc.yml ADDED
@@ -0,0 +1,30 @@
1
+ extends:
2
+ - '@antfu'
3
+ - prettier
4
+ plugins:
5
+ - eslint-plugin-tsdoc
6
+ ignorePatterns:
7
+ - web/**
8
+ - docs/**
9
+ rules:
10
+ tsdoc/syntax: off
11
+ no-cond-assign: off
12
+ max-statements-per-line:
13
+ - error
14
+ - max: 3
15
+ prefer-rest-params: off
16
+ no-prototype-builtins: off
17
+ prefer-spread: off
18
+ prefer-arrow-callback: off
19
+ n/prefer-global/buffer: off
20
+ unicorn/prefer-includes: off
21
+ prefer-template: off
22
+ "@typescript-eslint/no-this-alias": off
23
+ "@typescript-eslint/no-invalid-this": off
24
+ "prefer-exponentiation-operator": off
25
+ # curly: [error, multi, consistent]
26
+ # curly: [error, multi-line]
27
+ # max-statements-per-line: off
28
+ # brace-style: [error, 1tbs, {allowSingleLine: true}]
29
+ # '@typescript-eslint/brace-style': off
30
+ # '@typescript-eslint/comma-dangle': off
package/.mocharc.yml ADDED
@@ -0,0 +1,3 @@
1
+ require: '@babel/register'
2
+ spec:
3
+ - 'test/**/*-test.js' # the positional arguments!
@@ -0,0 +1,4 @@
1
+ node_modules
2
+ dist
3
+ web
4
+ docs
package/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "singleQuote": true,
3
+ "arrowParens": "always",
4
+ "semi": false,
5
+ "bracketSpacing": true,
6
+ "trailingComma": "es5",
7
+ "printWidth": 80
8
+ }
package/.versionrc ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "types": [
3
+ {
4
+ "type": "feat",
5
+ "section": "Features"
6
+ },
7
+ {
8
+ "type": "fix",
9
+ "section": "Bug Fixes"
10
+ },
11
+ {
12
+ "type": "chore",
13
+ "hidden": true
14
+ },
15
+ {
16
+ "type": "docs",
17
+ "hidden": true
18
+ },
19
+ {
20
+ "type": "style",
21
+ "hidden": true
22
+ },
23
+ {
24
+ "type": "refactor",
25
+ "section": "Refactor"
26
+ },
27
+ {
28
+ "type": "perf",
29
+ "section": "Performance"
30
+ },
31
+ {
32
+ "type": "test",
33
+ "hidden": true
34
+ }
35
+ ]
36
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
+
5
+ ## [2.0.0-alpha.1](https://github.com/snowyu/events-ex.js/compare/v2.0.0-alpha.0...v2.0.0-alpha.1) (2023-06-13)
6
+
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * remove deprecated files
11
+
12
+ ### Refactor
13
+
14
+ * remove deprecated files ([d733a5c](https://github.com/snowyu/events-ex.js/commit/d733a5c6a6c554739ecbcb653996f1e546579fa4))
15
+
16
+ ## [2.0.0-alpha.0](https://github.com/snowyu/events-ex.js/compare/v1.1.7...v2.0.0-alpha.0) (2023-05-25)
17
+
18
+
19
+ ### Features
20
+
21
+ * Add emitAsync supports ([c5a52e9](https://github.com/snowyu/events-ex.js/commit/c5a52e93e707b3f9f62b2d39eeb1e4870c0af185))
22
+ * Add emitAsync supports ([97d44df](https://github.com/snowyu/events-ex.js/commit/97d44dfb5b2d5cda34848aaff4ea94c5af67b8f6))
23
+ * **util:** extract util functions to here ([5bedb98](https://github.com/snowyu/events-ex.js/commit/5bedb98486dfa50c09f51d0fc669beb43b39c3b6))
24
+
25
+
26
+ ### Refactor
27
+
28
+ * **benchmark:** use esm instead of commonjs ([366039e](https://github.com/snowyu/events-ex.js/commit/366039e9ddb8723db8d8a8257436f34af0a8ece8))
29
+ * change exported name to wrapEventEmitter ([b0be8e7](https://github.com/snowyu/events-ex.js/commit/b0be8e72826fa189d03831c747367cfd8b8a6f78))
30
+ * **consts:** change export name to states ([bf5c926](https://github.com/snowyu/events-ex.js/commit/bf5c9268ae29956d7281b4a1fc101952ef81896a))
31
+ * **test:** use mocha instead of tad ([74261eb](https://github.com/snowyu/events-ex.js/commit/74261ebf632274eed90796d84c8f2df3352e62fb))
32
+ * use esm instead of commonjs ([b1f55dc](https://github.com/snowyu/events-ex.js/commit/b1f55dcd15d6e91ec639baa022de68ae874bf109))
package/README.cn.md ADDED
@@ -0,0 +1,248 @@
1
+ ### events-ex [![Build Status](https://img.shields.io/travis/snowyu/events-ex.js/master.png)](http://travis-ci.org/snowyu/events-ex.js) [![npm](https://img.shields.io/npm/v/events-ex.svg)](https://npmjs.org/package/events-ex) [![downloads](https://img.shields.io/npm/dm/events-ex.svg)](https://npmjs.org/package/events-ex) [![license](https://img.shields.io/npm/l/events-ex.svg)](https://npmjs.org/package/events-ex)
2
+
3
+
4
+ 浏览器友好的增强的**事件**[能力][Ability]和类。 它主要是从 [event-emitter][event-emitter] 修改而来的。 本库可以为你的任何类添加(注入)**事件**[能力][Ability]。
5
+
6
+
7
+ TODO: 异步事件,添加`emitAsync`方法. 没这么简单,因为要支持bubbling,所以必须顺序执行事件.
8
+ 将`bubbling`作为功能选项.如果没有启用,就可以乱发了.
9
+
10
+ 当关闭`bubbling`的时候,那么是否还需要用`event`对象传递.
11
+
12
+ 首先完成异步支持.已经完成.`emitAsync`方法已经加上.
13
+
14
+ ### Features
15
+
16
+ * 重写核心架构
17
+ * 尽最大可能性与[node events][Node Events] and [event-emitter][event-emitter]保持兼容
18
+ * 更强大的 event-able [能力][Ability]
19
+ * 可挂载的事件系统, 用于更好地控制事件处理
20
+ * 支持异步事件通过 `emitAsync` 方法.
21
+
22
+ ### 区别
23
+
24
+ * 与 [Node 事件模块](https://nodejs.org/api/events.html) 的区别
25
+ * **`改变`**: 事件支持冒泡机制与中断
26
+ * 事件对象(`Event Object`)作为监听器的 "this" 对象。
27
+ * `result` 属性: 可选, 如果设置,则将该结果返回到事件发射器(`Event Emitter`)。
28
+ * `stopped` 属性: 可选, 如果设置为 `true`,则会阻止剩余的监听器被执行。
29
+ * `target`属性: 事件发射器对象,原本的`this`
30
+ * **`改变`**: `emit` 方法返回监听器回调函数的结果而不是成功状态。
31
+ * **`改变`**: 监听器回调函数的 `this` 对象是 `Event Object` 事件对象而不是事件发射器对象。
32
+ * 事件发射器对象被放入 `Event` 对象的 `target` 属性中。
33
+ * 添加了`emitAsync`方法,支持异步事件
34
+ * 与 [event-emitter](https://github.com/medikoo/event-emitter) 的区别
35
+ * **`改变`**: 事件支持冒泡机制(如上所述)
36
+ * 添加了默认最大监听器数量的类属性,以保持与 Node 事件模块的兼容性。
37
+ * 添加了 `setMaxListeners` 方法,以保持与 Node 事件模块的兼容性。
38
+ * 添加了 `error`、`newListener` 和 `removeListener` 事件,以保持与 Node 事件模块的兼容性。
39
+ * 添加了 `listeners()` 方法,以保持与 Node 事件模块的兼容性。
40
+ * 添加了 `listenerCount()` 类方法,以保持与 Node 事件模块的兼容性。
41
+ * 添加了`emitAsync`方法,支持异步事件
42
+
43
+
44
+ ### 安装
45
+
46
+ ```
47
+ npm install events-ex@alpha
48
+ ```
49
+
50
+
51
+ ### 用法
52
+
53
+ 直接继承使用 `EventEmitter` 类
54
+
55
+ ```js
56
+ import {EventEmitter} from 'events-ex';
57
+
58
+ class MyClass extends EventEmitter {}
59
+ ```
60
+
61
+ 直接添加/注入事件(event-able)[能力][Ability] 到你的类:
62
+
63
+ ```js
64
+ import {eventable} from 'events-ex';
65
+
66
+ class MyClass extends MyRoot {}
67
+
68
+ // inject the eventable ability to MyClass
69
+ eventable(MyClass);
70
+ ```
71
+
72
+ 现在,可以在你的类中使用事件了:
73
+
74
+ ```js
75
+ const my = new MyClass;
76
+
77
+ my.on('event', function() {
78
+ console.log('event occur');
79
+ });
80
+
81
+ my.emit('event');
82
+ ```
83
+
84
+ 事件冒泡机制的使用:
85
+
86
+ ```js
87
+ import {EventEmitter, states} from 'events-ex';
88
+ import {isObject} from 'util-ex';
89
+
90
+ class MyDb extends EventEmitter {
91
+ get(key) {
92
+ // Demo the event object bubbling usage:
93
+ let result = this.emit('getting', key)
94
+ if(isObject(result)) {
95
+ if (result.state === states.ABORT) return
96
+ if (result.state === states.DONE) return result.result
97
+ }
98
+ return _get(key)
99
+ }
100
+ }
101
+
102
+ let db = new MyDb
103
+ db.on('getting', function(key){
104
+ result = myGet(key);
105
+ if (result != null) {
106
+ // get the key succ
107
+ this.result = {
108
+ state: states.DONE,
109
+ result: result,
110
+ }
111
+ } else if (result === null) {
112
+ // abort default get key.
113
+ this.result = {state: states.ABORT};
114
+ // this.stopped = true // it will skip other listeners if true
115
+ }
116
+ })
117
+ ```
118
+
119
+ event-emitter usage:
120
+
121
+ ```javascript
122
+
123
+ import {wrapEventEmitter as ee} from 'events-ex';
124
+
125
+ class MyClass { /* .. */ };
126
+ ee(MyClass.prototype); // All instances of MyClass will expose event-emitter interface
127
+
128
+ const emitter = new MyClass();
129
+ let listener;
130
+
131
+ emitter.on('test', listener = function (args) {
132
+ // … react to 'test' event
133
+ });
134
+
135
+ emitter.once('test', function (args) {
136
+ // … react to first 'test' event (invoked only once!)
137
+ });
138
+
139
+ emitter.emit('test', arg1, arg2/*…args*/); // Two above listeners invoked
140
+ emitter.emit('test', arg1, arg2/*…args*/); // Only first listener invoked
141
+
142
+ emitter.off('test', listener); // Removed first listener
143
+ emitter.emit('test', arg1, arg2/*…args*/); // No listeners invoked
144
+ ```
145
+
146
+ ### API
147
+
148
+ #### eventable(class[, options]) _(events-ex/eventable)_
149
+
150
+ Add the event-able ability to the class directly.
151
+
152
+ * `class`: the class to be injected the ability.
153
+ * `options` _(object)_: optional options
154
+ * `include` _(string[]|string)_: only these emitter methods will be added to the class
155
+ * **NOTE:** static method should use the prefix '@' with name.
156
+ * `exclude` _(string[]|string)_: theses emitter methods would not be added to the class
157
+ * **NOTE:** static method should use the prefix '@' with name.
158
+ * `methods` _(object)_: hooked methods to the class
159
+ * key: the method name to hook.
160
+ * value: the new method function
161
+ * use `this.super()` to call the original method.
162
+ * `this.self` is the original `this` object.
163
+ * `classMethods` _(object)_: hooked class methods to the class
164
+
165
+ ```coffee
166
+ eventable = require('events-ex/eventable')
167
+ #OtherClass = require('OtherClass')
168
+ class OtherClass
169
+ exec: -> console.log "my original exec"
170
+
171
+ class MyClass
172
+ # only 'on', 'off', 'emit' and static methods 'listenerCount' added to the class
173
+ eventable MyClass, include: ['on', 'off', 'emit', '@listenerCount']
174
+
175
+ # add the eventable ability to OtherClass and inject the exec method of OtherClass.
176
+ eventable OtherClass, methods:
177
+ exec: ->
178
+ console.log "new exec"
179
+ @super() # call the original method
180
+ ```
181
+
182
+ #### allOff(obj) _(events-ex/all-off)_
183
+
184
+ **keep compatible only**: the `removeAllListeners` has already been buildin.
185
+
186
+ Removes all listeners from given event emitter object
187
+
188
+ #### hasListeners(obj[, name]) _(events-ex/has-listeners)_
189
+
190
+ Whether object has some listeners attached to the object.
191
+ When `name` is provided, it checks listeners for specific event name
192
+
193
+ ```javascript
194
+ var emitter = ee();
195
+ var hasListeners = require('events-ex/has-listeners');
196
+ var listener = function () {};
197
+
198
+ hasListeners(emitter); // false
199
+
200
+ emitter.on('foo', listener);
201
+ hasListeners(emitter); // true
202
+ hasListeners(emitter, 'foo'); // true
203
+ hasListeners(emitter, 'bar'); // false
204
+
205
+ emitter.off('foo', listener);
206
+ hasListeners(emitter, 'foo'); // false
207
+ ```
208
+
209
+ #### pipe(source, target[, emitMethodName]) _(events-ex/pipe)_
210
+
211
+ Pipes all events from _source_ emitter onto _target_ emitter (all events from _source_ emitter will be emitted also on _target_ emitter, but not other way).
212
+ Returns _pipe_ object which exposes `pipe.close` function. Invoke it to close configured _pipe_.
213
+ It works internally by redefinition of `emit` method, if in your interface this method is referenced differently, provide its name (or symbol) with third argument.
214
+
215
+ #### unify(emitter1, emitter2) _(events-ex/unify)_
216
+
217
+ Unifies event handling for two objects. Events emitted on _emitter1_ would be also emitter on _emitter2_, and other way back.
218
+ Non reversible.
219
+
220
+ ```javascript
221
+ var eeUnify = require('events-ex/unify');
222
+
223
+ var emitter1 = ee(), listener1, listener3;
224
+ var emitter2 = ee(), listener2, listener4;
225
+
226
+ emitter1.on('test', listener1 = function () { });
227
+ emitter2.on('test', listener2 = function () { });
228
+
229
+ emitter1.emit('test'); // Invoked listener1
230
+ emitter2.emit('test'); // Invoked listener2
231
+
232
+ var unify = eeUnify(emitter1, emitter2);
233
+
234
+ emitter1.emit('test'); // Invoked listener1 and listener2
235
+ emitter2.emit('test'); // Invoked listener1 and listener2
236
+
237
+ emitter1.on('test', listener3 = function () { });
238
+ emitter2.on('test', listener4 = function () { });
239
+
240
+ emitter1.emit('test'); // Invoked listener1, listener2, listener3 and listener4
241
+ emitter2.emit('test'); // Invoked listener1, listener2, listener3 and listener4
242
+ ```
243
+
244
+
245
+ [event-emitter]: https://github.com/medikoo/event-emitter
246
+ [Node Events]: https://nodejs.org/api/events.html
247
+ [Ability]: https://github.com/snowyu/custom-ability.js
248
+
package/README.md CHANGED
@@ -1,76 +1,68 @@
1
1
  ### events-ex [![Build Status](https://img.shields.io/travis/snowyu/events-ex.js/master.png)](http://travis-ci.org/snowyu/events-ex.js) [![npm](https://img.shields.io/npm/v/events-ex.svg)](https://npmjs.org/package/events-ex) [![downloads](https://img.shields.io/npm/dm/events-ex.svg)](https://npmjs.org/package/events-ex) [![license](https://img.shields.io/npm/l/events-ex.svg)](https://npmjs.org/package/events-ex)
2
2
 
3
3
 
4
- Browser-friendly enhanced events most compatible with standard node.js and coffee-script. It's modified from [event-emitter](https://github.com/medikoo/event-emitter) mainly. It can add event-able to your class directly.
5
-
4
+ Browser-friendly enhanced event emitter [ability][Ability] and class. It's modified from [event-emitter][event-emitter] mainly. It can add/inject the event-able [ability][Ability] to your any class.
6
5
 
7
6
  ### Features
8
7
 
9
- * rewrite the core architecture
10
- * keep most compatible with [node events](nodejs.org/api/events.html) and [event-emitter](https://github.com/medikoo/event-emitter)
11
- + more powerful event-able ability
12
- * hookable event system
8
+ * Rewrite of the core architecture for improved performance and more powerful event-able ability
9
+ * keep most compatible with [node events](nodejs.org/api/events.html) and [event-emitter][event-emitter]
10
+ * Hookable event system for more control over event handling
11
+ * Supports async event emitting via `emitAsync` method.
13
12
 
14
13
  ### Differences
15
14
 
16
- * Difference with [node events](nodejs.org/api/events.html)
17
- - domain is not supported yet(TODO)
18
- + **`broken change`**: The event object bubbling Supports
19
- + the event object as listener's "this" object.
20
- + return the result property of event object to emitter.
21
- + prevent the rest of listener from be excuted if set the stopped property of event object to true
22
- * **`broken change`**: the `emit` return the result of listeners's callback function instead of the successful state.
23
- * **`broken change`**: the `this` object of listeners' callback function is the `Event` Object instead of the emitter object.
24
- * the emitter object is put into the `target` property of the `Event` Object.
15
+ * Difference with [node events](https://nodejs.org/api/events.html)
16
+ + **`broken change`**: The event supports bubbling and interruption
17
+ + the `event object` as listener's "this" object:
18
+ * `result`: If set, the result is returned to the `Event Emitter`.
19
+ * `stopped`: If set to `true`, it prevents the remaining listeners from being executed.
20
+ * `target`: The `Event Emitter` object, which was originally the `this` object.
21
+ * **`broken change`**: The `emit` return the result of listeners's callback function instead of the successful state.
22
+ * **`broken change`**: The `this` object of listeners' callback function is the `Event` Object instead of the emitter object.
23
+ * The emitter object is put into the `target` property of the `Event` Object.
24
+ * Adds async event emitting via `emitAsync` method.
25
25
  * Difference with [event-emitter](https://github.com/medikoo/event-emitter)
26
- + **`broken change`**: The event object bubbling Supports(see above)
27
- + add the defaultMaxListeners class property to keep compatible with node events.
28
- + add the setMaxListeners method to keep compatible with node events.
29
- + add `error`, `newListener` and `removeListener` events to keep compatible with node events.
30
- + add listeners() method to keep compatible with node events.
31
- + add listenerCount() class method to keep compatible with node events.
26
+ + **`broken change`**: The event supports bubbling and interruption(see above)
27
+ + Adds the defaultMaxListeners class property to keep compatibility with node events.
28
+ + Adds the setMaxListeners method to keep compatible with node events.
29
+ + Adds `error`, `newListener` and `removeListener` events to keep compatibility with node events.
30
+ + Adds listeners() method to keep compatibility with node events.
31
+ + Adds listenerCount() class method to keep compatibility with node events.
32
+ * Adds async event emitting via `emitAsync` method.
32
33
 
33
34
 
34
35
  ### Installation
35
36
 
36
- $ npm install events-ex
37
-
38
- To port it to Browser or any other (non CJS) environment, use your favorite CJS bundler. No favorite yet? Try: [Browserify](http://browserify.org/), [Webmake](https://github.com/medikoo/modules-webmake) or [Webpack](http://webpack.github.io/)
37
+ ```bash
38
+ npm install events-ex
39
+ ```
39
40
 
40
41
  ### Usage
41
42
 
43
+ Extends from `EventEmitter` class:
42
44
 
43
- Add the event-able feature to your class directly:
44
-
45
- ```coffee
46
-
47
- eventable = require('events-ex/eventable')
48
-
49
- class MyClass
50
- # advanced usage see API topic.
51
- eventable MyClass
52
-
53
- my = new MyClass
54
-
55
- my.on 'event', ->
56
- console.log 'event occur'
57
- # be care: @(this) is the event object. not the `my` instance.
58
- # the my instance is @target.
59
-
60
- my.emit 'event'
45
+ ```js
46
+ import {EventEmitter} from 'events-ex';
61
47
 
48
+ class MyClass extends EventEmitter {}
62
49
  ```
63
50
 
64
- the following is javascript:
51
+ Add/Inject the event-able [ability][Ability] to your class directly:
65
52
 
66
53
  ```js
67
- var eventable = require('events-ex/eventable');
54
+ import {eventable} from 'events-ex';
68
55
 
69
- function MyClass() {}
56
+ class MyClass extends MyRoot {}
70
57
 
58
+ // inject the eventable ability to MyClass
71
59
  eventable(MyClass);
60
+ ```
61
+
62
+ Now, you can use events in your class:
72
63
 
73
- var my = new MyClass;
64
+ ```js
65
+ const my = new MyClass;
74
66
 
75
67
  my.on('event', function() {
76
68
  console.log('event occur');
@@ -79,53 +71,19 @@ my.on('event', function() {
79
71
  my.emit('event');
80
72
  ```
81
73
 
82
- Node JS events Usage:
83
-
84
- ```coffee
85
- ## Coffee-script demo bubbling usage:
86
- EventEmitter = require('events-ex')
87
- inherits = require('inherits-ex')
88
- ABORT = -1
89
- DONE = 0
90
-
91
- class MyDb
92
- inherits MyDb, EventEmitter
93
- get: (key)->
94
- # Demo the event object bubbling usage:
95
- result = @emit 'getting', key
96
- if isObject result
97
- return if result.state is ABORT
98
- return result.result if result.state is DONE
99
- _get(key)
100
-
101
- db = new MyDb
102
- db.on 'getting', (key)->
103
- result = myGet(key);
104
- if result?
105
- # get the key succ
106
- this.result =
107
- state: DONE
108
- result: result
109
- else if result is null
110
- # abort default get key.
111
- this.result = state: ABORT;
112
- # this.stopped = true # it will skip other listeners if true
113
- ```
74
+ Bubbling event usage:
114
75
 
115
76
  ```js
116
- // js demo bubbling usage:
117
- let EventEmitter = require('events-ex')
118
- let isObject = require('util-ex/lib/is/type/object')
119
- const ABORT = -1
120
- const DONE = 0
77
+ import {EventEmitter, states} from 'events-ex';
78
+ import {isObject} from 'util-ex';
121
79
 
122
80
  class MyDb extends EventEmitter {
123
81
  get(key) {
124
82
  // Demo the event object bubbling usage:
125
83
  let result = this.emit('getting', key)
126
84
  if(isObject(result)) {
127
- if (result.state === ABORT) return
128
- if (result.state === DONE) return result.result
85
+ if (result.state === states.ABORT) return
86
+ if (result.state === states.DONE) return result.result
129
87
  }
130
88
  return _get(key)
131
89
  }
@@ -137,12 +95,12 @@ db.on('getting', function(key){
137
95
  if (result != null) {
138
96
  // get the key succ
139
97
  this.result = {
140
- state: DONE,
98
+ state: states.DONE,
141
99
  result: result,
142
100
  }
143
101
  } else if (result === null) {
144
102
  // abort default get key.
145
- this.result = {state: ABORT};
103
+ this.result = {state: states.ABORT};
146
104
  // this.stopped = true // it will skip other listeners if true
147
105
  }
148
106
  })
@@ -152,12 +110,13 @@ event-emitter usage:
152
110
 
153
111
  ```javascript
154
112
 
155
- var ee = require('event-ex/event-emitter');
113
+ import {wrapEventEmitter as ee} from 'events-ex';
156
114
 
157
- var MyClass = function () { /* .. */ };
115
+ class MyClass { /* .. */ };
158
116
  ee(MyClass.prototype); // All instances of MyClass will expose event-emitter interface
159
117
 
160
- var emitter = new MyClass(), listener;
118
+ const emitter = new MyClass();
119
+ let listener;
161
120
 
162
121
  emitter.on('test', listener = function (args) {
163
122
  // … react to 'test' event
@@ -193,22 +152,26 @@ Add the event-able ability to the class directly.
193
152
  * `this.self` is the original `this` object.
194
153
  * `classMethods` *(object)*: hooked class methods to the class
195
154
 
196
- ```coffee
197
- eventable = require('events-ex/eventable')
198
- #OtherClass = require('OtherClass')
199
- class OtherClass
200
- exec: -> console.log "my original exec"
201
-
202
- class MyClass
203
- # only 'on', 'off', 'emit' and static methods 'listenerCount' added to the class
204
- eventable MyClass, include: ['on', 'off', 'emit', '@listenerCount']
205
-
206
- # add the eventable ability to OtherClass and inject the exec method of OtherClass.
207
- eventable OtherClass, methods:
208
- exec: ->
209
- console.log "new exec"
210
- @super() # call the original method
155
+ ```js
156
+ import {eventable} from 'events-ex'
157
+
158
+ class OtherClass {
159
+ exec() {console.log "my original exec"}
160
+ }
161
+
162
+ class MyClass {}
163
+ // only 'on', 'off', 'emit', 'emitAsync' and static methods 'listenerCount' added to the class
164
+ eventable(MyClass, include: ['on', 'off', 'emit', 'emitAsync', '@listenerCount'])
165
+
166
+ // add the eventable ability to OtherClass and inject the exec method of OtherClass.
167
+ eventable(OtherClass, {methods: {
168
+ exec() {
169
+ console.log("new exec")
170
+ this.super() //call the original method
171
+ }}
172
+ })
211
173
  ```
174
+
212
175
  #### allOff(obj) _(events-ex/all-off)_
213
176
 
214
177
  **keep compatible only**: the `removeAllListeners` has already been buildin.
@@ -221,8 +184,8 @@ Whether object has some listeners attached to the object.
221
184
  When `name` is provided, it checks listeners for specific event name
222
185
 
223
186
  ```javascript
187
+ import {hasListeners, wrapEventEmitter as ee} from 'events-ex/has-listeners';
224
188
  var emitter = ee();
225
- var hasListeners = require('events-ex/has-listeners');
226
189
  var listener = function () {};
227
190
 
228
191
  hasListeners(emitter); // false
@@ -248,7 +211,7 @@ Unifies event handling for two objects. Events emitted on _emitter1_ would be al
248
211
  Non reversible.
249
212
 
250
213
  ```javascript
251
- var eeUnify = require('events-ex/unify');
214
+ import {unify as eeUnify, wrapEventEmitter as ee} from 'events-ex';
252
215
 
253
216
  var emitter1 = ee(), listener1, listener3;
254
217
  var emitter2 = ee(), listener2, listener4;
@@ -272,3 +235,5 @@ emitter2.emit('test'); // Invoked listener1, listener2, listener3 and listener4
272
235
  ```
273
236
 
274
237
 
238
+ [event-emitter]: https://github.com/medikoo/event-emitter
239
+ [Ability]: https://github.com/snowyu/custom-ability.js
package/ability.js CHANGED
@@ -1 +1 @@
1
- module.exports = require('./eventable')
1
+ module.exports = require('./lib/eventable')