mm_tpl 2.4.4 → 2.4.6
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/README.md +148 -46
- package/cache/test.cache.html +19 -21
- package/hook.js +170 -85
- package/index.js +149 -136
- package/package.json +2 -2
- package/template/diy/ad.html +3 -38
- package/template/game/bar.html +5 -1
- package/template/game/test.html +1 -1
- package/test.js +20 -9
- package/tpl_rule.js +37 -7
- package/template/defualt/test.html +0 -36
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.
|
|
8
|
-
this.
|
|
9
|
-
this.
|
|
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 {
|
|
32
|
+
* 获取函数别名
|
|
33
|
+
* @param {Function} func - 钩子函数
|
|
34
|
+
* @param {string} alias - 别名
|
|
35
|
+
* @returns {string} 函数别名
|
|
27
36
|
*/
|
|
28
|
-
Hook.prototype.
|
|
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 {
|
|
44
|
-
* @param {Function} func 钩子函数
|
|
45
|
-
* @param {
|
|
46
|
-
* @param {
|
|
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.
|
|
58
|
+
Hook.prototype.addFunc = function (name, func, sort = 100, 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.
|
|
65
|
+
var arr = this._func[name];
|
|
56
66
|
if (!arr) {
|
|
57
67
|
arr = [];
|
|
58
68
|
}
|
|
59
69
|
arr.push(obj);
|
|
60
|
-
this.
|
|
70
|
+
this._func[name] = this.sort(arr);
|
|
61
71
|
return alias;
|
|
62
72
|
}
|
|
63
73
|
|
|
64
74
|
/**
|
|
65
75
|
* 添加动作钩子
|
|
66
|
-
* @param {
|
|
67
|
-
* @param {Function} func 钩子函数
|
|
68
|
-
* @param {
|
|
69
|
-
* @param {
|
|
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.
|
|
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.
|
|
89
|
+
var arr = this._action[name];
|
|
79
90
|
if (!arr) {
|
|
80
91
|
arr = [];
|
|
81
92
|
}
|
|
82
93
|
arr.push(obj);
|
|
83
|
-
this.
|
|
94
|
+
this._action[name] = this.sort(arr);
|
|
84
95
|
return alias;
|
|
85
96
|
}
|
|
86
97
|
|
|
87
98
|
/**
|
|
88
99
|
* 添加过滤钩子
|
|
89
|
-
* @param {
|
|
90
|
-
* @param {Function} func 钩子函数
|
|
91
|
-
* @param {
|
|
92
|
-
* @param {
|
|
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.
|
|
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.
|
|
113
|
+
var arr = this._filter[name];
|
|
102
114
|
if (!arr) {
|
|
103
115
|
arr = [];
|
|
104
116
|
}
|
|
105
117
|
arr.push(obj);
|
|
106
|
-
this.
|
|
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.
|
|
127
|
+
Hook.prototype.delFunc = function (name, alias) {
|
|
128
|
+
var arr = this._func[name];
|
|
117
129
|
if (arr) {
|
|
118
|
-
|
|
119
|
-
|
|
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.
|
|
146
|
+
Hook.prototype.delAction = function (name, alias) {
|
|
147
|
+
var arr = this._action[name];
|
|
131
148
|
if (arr) {
|
|
132
|
-
|
|
133
|
-
|
|
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,42 @@ 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.
|
|
165
|
+
Hook.prototype.delFilter = function (name, alias = "") {
|
|
166
|
+
var arr = this._filter[name];
|
|
145
167
|
if (arr) {
|
|
146
|
-
|
|
147
|
-
|
|
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 {
|
|
155
|
-
* @param {Object}
|
|
156
|
-
* @param {
|
|
180
|
+
* 执行函数钩子
|
|
181
|
+
* @param {string} name - 钩子名称
|
|
182
|
+
* @param {Object} param - 参数
|
|
183
|
+
* @param {Function} func - 钩子函数
|
|
157
184
|
*/
|
|
158
|
-
Hook.prototype.
|
|
159
|
-
var ret
|
|
160
|
-
var
|
|
161
|
-
var list = dict[name];
|
|
185
|
+
Hook.prototype.runFunc = async function (name, model, req, ...args) {
|
|
186
|
+
var ret;
|
|
187
|
+
var list = this._func[name];
|
|
162
188
|
if (list) {
|
|
163
189
|
for (var i = 0; i < list.length; i++) {
|
|
164
|
-
var
|
|
190
|
+
var item = list[i];
|
|
165
191
|
try {
|
|
166
|
-
|
|
192
|
+
var ret_new = item.func(model, req, ...args);
|
|
193
|
+
if (types.isPromise(ret_new)) {
|
|
194
|
+
ret_new = await ret_new;
|
|
195
|
+
if (ret_new) {
|
|
196
|
+
ret = ret_new;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
167
199
|
} catch (err) {
|
|
168
|
-
$.log.error(
|
|
200
|
+
$.log.error(`[${this.constructor.name}] 执行函数钩子失败 ${item.alias}`, err);
|
|
169
201
|
}
|
|
170
202
|
}
|
|
171
203
|
}
|
|
@@ -173,22 +205,22 @@ Hook.prototype.runAction = function(name, model, ...args) {
|
|
|
173
205
|
}
|
|
174
206
|
|
|
175
207
|
/**
|
|
176
|
-
*
|
|
177
|
-
* @param {
|
|
178
|
-
* @param {Object} model
|
|
179
|
-
* @param {
|
|
180
|
-
* @
|
|
208
|
+
* 执行动作钩子
|
|
209
|
+
* @param {string} name - 钩子名称
|
|
210
|
+
* @param {Object} model - 模型对象
|
|
211
|
+
* @param {...any} args - 附加参数
|
|
212
|
+
* @returns {Object} 执行结果
|
|
181
213
|
*/
|
|
182
|
-
Hook.prototype.
|
|
183
|
-
var
|
|
184
|
-
var list =
|
|
214
|
+
Hook.prototype.runAction = function (name, model, ...args) {
|
|
215
|
+
var ret = '';
|
|
216
|
+
var list = this._action[name];
|
|
185
217
|
if (list) {
|
|
186
218
|
for (var i = 0; i < list.length; i++) {
|
|
187
219
|
var o = list[i];
|
|
188
220
|
try {
|
|
189
|
-
ret
|
|
221
|
+
ret += o.func(model, ...args);
|
|
190
222
|
} catch (err) {
|
|
191
|
-
$.log.error(
|
|
223
|
+
$.log.error(`[${this.constructor.name}] 执行动作钩子失败 ${o.alias}`, err);
|
|
192
224
|
}
|
|
193
225
|
}
|
|
194
226
|
}
|
|
@@ -196,30 +228,83 @@ Hook.prototype.runFilter = function(name, model, ret, ...args) {
|
|
|
196
228
|
}
|
|
197
229
|
|
|
198
230
|
/**
|
|
199
|
-
*
|
|
200
|
-
* @param {
|
|
201
|
-
* @param {Object} model
|
|
202
|
-
* @param {Object}
|
|
203
|
-
* @param {
|
|
231
|
+
* 执行过滤钩子
|
|
232
|
+
* @param {string} name - 钩子名称
|
|
233
|
+
* @param {Object} model - 模型对象
|
|
234
|
+
* @param {Object} ret - 返回值
|
|
235
|
+
* @param {...any} args - 附加参数
|
|
236
|
+
* @returns {Object} 过滤后的参数
|
|
204
237
|
*/
|
|
205
|
-
Hook.prototype.
|
|
206
|
-
var
|
|
207
|
-
var dict = this.dict_func;
|
|
208
|
-
var list = dict[name];
|
|
238
|
+
Hook.prototype.runFilter = function (name, model, ret, ...args) {
|
|
239
|
+
var list = this._filter[name];
|
|
209
240
|
if (list) {
|
|
210
241
|
for (var i = 0; i < list.length; i++) {
|
|
211
|
-
var
|
|
242
|
+
var item = list[i];
|
|
212
243
|
try {
|
|
213
|
-
ret =
|
|
214
|
-
if (ret) {
|
|
215
|
-
ret = await ret;
|
|
216
|
-
}
|
|
244
|
+
ret = item.func(model, ret, ...args) || ret;
|
|
217
245
|
} catch (err) {
|
|
218
|
-
$.log.error(
|
|
246
|
+
$.log.error(`[${this.constructor.name}] 执行过滤钩子失败 ${item.alias}`, err);
|
|
219
247
|
}
|
|
220
248
|
}
|
|
221
249
|
}
|
|
222
250
|
return ret;
|
|
223
251
|
}
|
|
224
252
|
|
|
253
|
+
/**
|
|
254
|
+
* 删除钩子
|
|
255
|
+
* @param {string} name - 钩子名称
|
|
256
|
+
* @param {string} alias - 函数别名
|
|
257
|
+
*/
|
|
258
|
+
Hook.prototype.del = function (name, alias) {
|
|
259
|
+
var arr = this._func[name];
|
|
260
|
+
if (arr) {
|
|
261
|
+
var list = [];
|
|
262
|
+
for (var i = 0; i < arr.length; i++) {
|
|
263
|
+
var item = arr[i];
|
|
264
|
+
if (item.alias !== alias) {
|
|
265
|
+
list.push(item);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
this._func[name] = list;
|
|
269
|
+
}
|
|
270
|
+
arr = this._action[name];
|
|
271
|
+
if (arr) {
|
|
272
|
+
var list = [];
|
|
273
|
+
for (var i = 0; i < arr.length; i++) {
|
|
274
|
+
var item = arr[i];
|
|
275
|
+
if (item.alias !== alias) {
|
|
276
|
+
list.push(item);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
this._action[name] = list;
|
|
280
|
+
}
|
|
281
|
+
arr = this._filter[name];
|
|
282
|
+
if (arr) {
|
|
283
|
+
var list = [];
|
|
284
|
+
for (var i = 0; i < arr.length; i++) {
|
|
285
|
+
var item = arr[i];
|
|
286
|
+
if (item.alias !== alias) {
|
|
287
|
+
list.push(item);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
this._filter[name] = list;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* 清空钩子
|
|
296
|
+
* @param {string} name - 钩子名称
|
|
297
|
+
*/
|
|
298
|
+
Hook.prototype.clear = function (name) {
|
|
299
|
+
if (name) {
|
|
300
|
+
delete this._func[name];
|
|
301
|
+
delete this._action[name];
|
|
302
|
+
delete this._filter[name];
|
|
303
|
+
} else {
|
|
304
|
+
this._func = {};
|
|
305
|
+
this._action = {};
|
|
306
|
+
this._filter = {};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
225
310
|
module.exports = Hook;
|