mm_tpl 2.4.3 → 2.4.5

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/hook.js CHANGED
@@ -2,30 +2,39 @@ const {
2
2
  types
3
3
  } = require("util");
4
4
 
5
+ /**
6
+ * 钩子管理类
7
+ * @class
8
+ */
5
9
  class Hook {
10
+ /**
11
+ * 创建钩子实例
12
+ */
6
13
  constructor() {
7
- this.dict_func = {};
8
- this.dict_action = {};
9
- this.dict_filter = {};
14
+ this._func = {};
15
+ this._action = {};
16
+ this._filter = {};
10
17
  }
11
18
  }
12
19
 
13
20
  /**
14
- * 排序
15
- * @param {Array} list 钩子列表
21
+ * 排序钩子列表
22
+ * @param {Array} list - 钩子列表
23
+ * @returns {Array} 排序后的列表
16
24
  */
17
- Hook.prototype.sort = function(list) {
25
+ Hook.prototype.sort = function (list) {
18
26
  return list.sort((o1, o2) => {
19
27
  return o2.sort - o1.sort
20
28
  });
21
29
  }
22
30
 
23
31
  /**
24
- * 获取别名
25
- * @param {Function} func 钩子函数
26
- * @param {String} alias 别名
32
+ * 获取函数别名
33
+ * @param {Function} func - 钩子函数
34
+ * @param {string} alias - 别名
35
+ * @returns {string} 函数别名
27
36
  */
28
- Hook.prototype.getName = function(func, alias) {
37
+ Hook.prototype._getName = function (func, alias) {
29
38
  if (!alias) {
30
39
  var str = func.toString();
31
40
  var name = str.between('function ', "(").trim();
@@ -40,70 +49,73 @@ Hook.prototype.getName = function(func, alias) {
40
49
 
41
50
  /**
42
51
  * 添加函数钩子
43
- * @param {String} name 钩子名称
44
- * @param {Function} func 钩子函数
45
- * @param {Number} sort 执行顺序
46
- * @param {String} alias 函数别名,用于删除
52
+ * @param {string} name - 钩子名称
53
+ * @param {Function} func - 钩子函数
54
+ * @param {number} sort - 执行顺序
55
+ * @param {string} alias - 函数别名
56
+ * @returns {string} 函数别名
47
57
  */
48
- Hook.prototype.addFunc = function(name, func, sort, alias) {
49
- alias = this.getName(func, alias);
58
+ Hook.prototype.addFunc = function (name, func, sort, alias) {
59
+ alias = this._getName(func, alias);
50
60
  var obj = {
51
61
  func,
52
62
  sort,
53
63
  alias
54
64
  }
55
- var arr = this.dict_func[name];
65
+ var arr = this._func[name];
56
66
  if (!arr) {
57
67
  arr = [];
58
68
  }
59
69
  arr.push(obj);
60
- this.dict_func[name] = this.sort(arr);
70
+ this._func[name] = this.sort(arr);
61
71
  return alias;
62
72
  }
63
73
 
64
74
  /**
65
75
  * 添加动作钩子
66
- * @param {String} name 钩子名称
67
- * @param {Function} func 钩子函数
68
- * @param {Number} sort 执行顺序
69
- * @param {String} alias 函数别名,用于删除
76
+ * @param {string} name - 钩子名称
77
+ * @param {Function} func - 钩子函数
78
+ * @param {number} sort - 执行顺序
79
+ * @param {string} alias - 函数别名
80
+ * @returns {string} 函数别名
70
81
  */
71
- Hook.prototype.addAction = function(name, func, sort, alias) {
72
- alias = this.getName(func, alias);
82
+ Hook.prototype.addAction = function (name, func, sort, alias) {
83
+ alias = this._getName(func, alias);
73
84
  var obj = {
74
85
  func,
75
86
  sort,
76
87
  alias
77
88
  }
78
- var arr = this.dict_action[name];
89
+ var arr = this._action[name];
79
90
  if (!arr) {
80
91
  arr = [];
81
92
  }
82
93
  arr.push(obj);
83
- this.dict_action[name] = this.sort(arr);
94
+ this._action[name] = this.sort(arr);
84
95
  return alias;
85
96
  }
86
97
 
87
98
  /**
88
99
  * 添加过滤钩子
89
- * @param {String} name 钩子名称
90
- * @param {Function} func 钩子函数
91
- * @param {Number} sort 执行顺序
92
- * @param {String} alias 函数别名,用于删除
100
+ * @param {string} name - 钩子名称
101
+ * @param {Function} func - 钩子函数
102
+ * @param {number} sort - 执行顺序
103
+ * @param {string} alias - 函数别名
104
+ * @returns {string} 函数别名
93
105
  */
94
- Hook.prototype.addFilter = function(name, func, sort, alias) {
95
- alias = this.getName(func, alias);
106
+ Hook.prototype.addFilter = function (name, func, sort, alias) {
107
+ alias = this._getName(func, alias);
96
108
  var obj = {
97
109
  func,
98
110
  sort,
99
111
  alias
100
112
  }
101
- var arr = this.dict_filter[name];
113
+ var arr = this._filter[name];
102
114
  if (!arr) {
103
115
  arr = [];
104
116
  }
105
117
  arr.push(obj);
106
- this.dict_filter[name] = this.sort(arr);
118
+ this._filter[name] = this.sort(arr);
107
119
  return alias;
108
120
  }
109
121
 
@@ -112,12 +124,17 @@ Hook.prototype.addFilter = function(name, func, sort, alias) {
112
124
  * @param {String} name 钩子名称
113
125
  * @param {String} alias 函数别名
114
126
  */
115
- Hook.prototype.delFunc = function(name, alias) {
116
- var arr = this.dict_func[name];
127
+ Hook.prototype.delFunc = function (name, alias) {
128
+ var arr = this._func[name];
117
129
  if (arr) {
118
- arr.del({
119
- alias
120
- });
130
+ var list = [];
131
+ for (var i = 0; i < arr.length; i++) {
132
+ var item = arr[i];
133
+ if (item.alias !== alias) {
134
+ list.push(item);
135
+ }
136
+ }
137
+ this._func[name] = list;
121
138
  }
122
139
  }
123
140
 
@@ -126,12 +143,17 @@ Hook.prototype.delFunc = function(name, alias) {
126
143
  * @param {String} name 钩子名称
127
144
  * @param {String} alias 函数别名
128
145
  */
129
- Hook.prototype.delAction = function(name, alias) {
130
- var arr = this.dict_action[name];
146
+ Hook.prototype.delAction = function (name, alias) {
147
+ var arr = this._action[name];
131
148
  if (arr) {
132
- arr.del({
133
- alias
134
- });
149
+ var list = [];
150
+ for (var i = 0; i < arr.length; i++) {
151
+ var item = arr[i];
152
+ if (item.alias !== alias) {
153
+ list.push(item);
154
+ }
155
+ }
156
+ this._action[name] = list;
135
157
  }
136
158
  }
137
159
 
@@ -140,32 +162,40 @@ Hook.prototype.delAction = function(name, alias) {
140
162
  * @param {String} name 钩子名称
141
163
  * @param {String} alias 函数别名
142
164
  */
143
- Hook.prototype.delFilter = function(name, alias = "") {
144
- var arr = this.dict_filter[name];
165
+ Hook.prototype.delFilter = function (name, alias = "") {
166
+ var arr = this._filter[name];
145
167
  if (arr) {
146
- arr.del({
147
- alias
148
- });
168
+ var list = [];
169
+ for (var i = 0; i < arr.length; i++) {
170
+ var item = arr[i];
171
+ if (item.alias !== alias) {
172
+ list.push(item);
173
+ }
174
+ }
175
+ this._filter[name] = list;
149
176
  }
150
177
  }
151
178
 
152
179
  /**
153
- * 运行动作钩子
154
- * @param {String} name 钩子名称
155
- * @param {Object} model 模型
156
- * @param {Object} args 附加参数
180
+ * 执行函数钩子
181
+ * @param {string} name - 钩子名称
182
+ * @param {Object} param - 参数
183
+ * @param {Function} func - 钩子函数
157
184
  */
158
- Hook.prototype.runAction = function(name, model, ...args) {
159
- var ret = "";
160
- var dict = this.dict_action;
161
- var list = dict[name];
162
- if (list) {
163
- for (var i = 0; i < list.length; i++) {
164
- var o = list[i];
185
+ Hook.prototype.runFunc = async function (name, model, req, ...args) {
186
+ var ret;
187
+ var list = this._func[name];
188
+ if (!list) {
189
+ var len = list.length;
190
+ for (var i = 0; i < len; i++) {
191
+ var item = list[i];
165
192
  try {
166
- ret += o.func(model, ...args);
193
+ ret = item.func(model, req, ...args);
194
+ if (ret) {
195
+ ret = await ret;
196
+ }
167
197
  } catch (err) {
168
- console.error(ret);
198
+ $.log.error(`[${this.constructor.name}] 执行函数钩子失败 ${item.alias}`, err);
169
199
  }
170
200
  }
171
201
  }
@@ -173,22 +203,22 @@ Hook.prototype.runAction = function(name, model, ...args) {
173
203
  }
174
204
 
175
205
  /**
176
- * 运行过滤钩子
177
- * @param {String} name 钩子名称
178
- * @param {Object} model 模型
179
- * @param {Object} ret 结果
180
- * @param {Object} args 附加参数
206
+ * 执行动作钩子
207
+ * @param {string} name - 钩子名称
208
+ * @param {Object} model - 模型对象
209
+ * @param {...any} args - 附加参数
210
+ * @returns {Object} 执行结果
181
211
  */
182
- Hook.prototype.runFilter = function(name, model, ret, ...args) {
183
- var dict = this.dict_filter;
184
- var list = dict[name];
212
+ Hook.prototype.runAction = function (name, model, ...args) {
213
+ var ret = '';
214
+ var list = this._action[name];
185
215
  if (list) {
186
216
  for (var i = 0; i < list.length; i++) {
187
217
  var o = list[i];
188
218
  try {
189
- ret = o.func(model, ret, ...args);
219
+ ret += o.func(model, ...args);
190
220
  } catch (err) {
191
- console.error(ret);
221
+ $.log.error(`[${this.constructor.name}] 执行动作钩子失败 ${o.alias}`, err);
192
222
  }
193
223
  }
194
224
  }
@@ -196,30 +226,84 @@ Hook.prototype.runFilter = function(name, model, ret, ...args) {
196
226
  }
197
227
 
198
228
  /**
199
- * 运行函数钩子
200
- * @param {String} name 钩子名称
201
- * @param {Object} model 模型
202
- * @param {Object} req 请求参数
203
- * @param {Object} args 附加参数
229
+ * 执行过滤钩子
230
+ * @param {string} name - 钩子名称
231
+ * @param {Object} model - 模型对象
232
+ * @param {Object} ret - 返回值
233
+ * @param {...any} args - 附加参数
234
+ * @returns {Object} 过滤后的参数
204
235
  */
205
- Hook.prototype.runFunc = async function(name, model, req, ...args) {
206
- var ret;
207
- var dict = this.dict_func;
208
- var list = dict[name];
209
- if (list) {
210
- for (var i = 0; i < list.length; i++) {
211
- var o = list[i];
236
+ Hook.prototype.runFilter = function (name, model, ret, ...args) {
237
+ var list = this._filter[name];
238
+ if (!list) {
239
+ var len = list.length;
240
+ for (var i = 0; i < len; i++) {
241
+ var item = list[i];
212
242
  try {
213
- ret = o.func(model, req, ...args);
214
- if (ret) {
215
- ret = await ret;
216
- }
243
+ ret = item.func(model, ret, ...args) || ret;
217
244
  } catch (err) {
218
- console.error(ret);
245
+ $.log.error(`[${this.constructor.name}] 执行过滤钩子失败 ${item.alias}`, err);
219
246
  }
220
247
  }
221
248
  }
222
249
  return ret;
223
250
  }
224
251
 
252
+ /**
253
+ * 删除钩子
254
+ * @param {string} name - 钩子名称
255
+ * @param {string} alias - 函数别名
256
+ */
257
+ Hook.prototype.del = function (name, alias) {
258
+ var arr = this._func[name];
259
+ if (arr) {
260
+ var list = [];
261
+ for (var i = 0; i < arr.length; i++) {
262
+ var item = arr[i];
263
+ if (item.alias !== alias) {
264
+ list.push(item);
265
+ }
266
+ }
267
+ this._func[name] = list;
268
+ }
269
+ arr = this._action[name];
270
+ if (arr) {
271
+ var list = [];
272
+ for (var i = 0; i < arr.length; i++) {
273
+ var item = arr[i];
274
+ if (item.alias !== alias) {
275
+ list.push(item);
276
+ }
277
+ }
278
+ this._action[name] = list;
279
+ }
280
+ arr = this._filter[name];
281
+ if (arr) {
282
+ var list = [];
283
+ for (var i = 0; i < arr.length; i++) {
284
+ var item = arr[i];
285
+ if (item.alias !== alias) {
286
+ list.push(item);
287
+ }
288
+ }
289
+ this._filter[name] = list;
290
+ }
291
+ }
292
+
293
+ /**
294
+ * 清空钩子
295
+ * @param {string} name - 钩子名称
296
+ */
297
+ Hook.prototype.clear = function (name) {
298
+ if (name) {
299
+ delete this._func[name];
300
+ delete this._action[name];
301
+ delete this._filter[name];
302
+ } else {
303
+ this._func = {};
304
+ this._action = {};
305
+ this._filter = {};
306
+ }
307
+ }
308
+
225
309
  module.exports = Hook;