##// END OF EJS Templates
core/safe ported to typescript
cin -
r16:638c2fe34531 propose cancellat...
parent child
Show More
@@ -0,0 +1,231
1 export function argumentNotNull(arg, name) {
2 if (arg === null || arg === undefined)
3 throw new Error("The argument " + name + " can't be null or undefined");
4 }
5
6 export function argumentNotEmptyString(arg, name) {
7 if (typeof (arg) !== "string" || !arg.length)
8 throw new Error("The argument '" + name + "' must be a not empty string");
9 }
10
11 export function argumentNotEmptyArray(arg, name) {
12 if (!(arg instanceof Array) || !arg.length)
13 throw new Error("The argument '" + name + "' must be a not empty array");
14 }
15
16 export function argumentOfType(arg, type, name) {
17 if (!(arg instanceof type))
18 throw new Error("The argument '" + name + "' type doesn't match");
19 }
20
21 export function isNull(arg) {
22 return (arg === null || arg === undefined);
23 }
24
25 export function isPrimitive(arg) {
26 return (arg === null || arg === undefined || typeof (arg) === "string" ||
27 typeof (arg) === "number" || typeof (arg) === "boolean");
28 }
29
30 export function isInteger(arg) {
31 return parseInt(arg) == arg;
32 }
33
34 export function isNumber(arg) {
35 return parseFloat(arg) == arg;
36 }
37
38 export function isString(val) {
39 return typeof (val) == "string" || val instanceof String;
40 }
41
42 export function isNullOrEmptyString(str) {
43 if (str === null || str === undefined ||
44 ((typeof (str) == "string" || str instanceof String) && str.length === 0))
45 return true;
46 }
47
48 export function isNotEmptyArray(arg) {
49 return (arg instanceof Array && arg.length > 0);
50 }
51
52 /**
53 * Выполняет метод для каждого элемента массива, останавливается, когда
54 * либо достигнут конец массива, либо функция <c>cb</c> вернула
55 * значение.
56 *
57 * @param {Array | Object} obj массив элементов для просмотра
58 * @param {Function} cb функция, вызываемая для каждого элемента
59 * @param {Object} thisArg значение, которое будет передано в качестве
60 * <c>this</c> в <c>cb</c>.
61 * @returns Результат вызова функции <c>cb</c>, либо <c>undefined</c>
62 * если достигнут конец массива.
63 */
64 export function each(obj, cb, thisArg) {
65 argumentNotNull(cb, "cb");
66 var i, x;
67 if (obj instanceof Array) {
68 for (i = 0; i < obj.length; i++) {
69 x = cb.call(thisArg, obj[i], i);
70 if (x !== undefined)
71 return x;
72 }
73 } else {
74 var keys = Object.keys(obj);
75 for (i = 0; i < keys.length; i++) {
76 var k = keys[i];
77 x = cb.call(thisArg, obj[k], k);
78 if (x !== undefined)
79 return x;
80 }
81 }
82 }
83
84 /** Wraps the specified function to emulate an asynchronous execution.
85 * @param{Object} thisArg [Optional] Object which will be passed as 'this' to the function.
86 * @param{Function|String} fn [Required] Function wich will be wrapped.
87 */
88 export function async(_fn: (...args: any[]) => any, thisArg) : (...args: any[]) => PromiseLike<any> {
89 let fn = _fn;
90
91 if (arguments.length == 2 && !(fn instanceof Function))
92 fn = thisArg[fn];
93
94 if (fn == null)
95 throw new Error("The function must be specified");
96
97 function wrapresult(x, e?) : PromiseLike<any> {
98 if (e) {
99 return {
100 then: function (cb, eb) {
101 try {
102 return eb ? wrapresult(eb(e)) : this;
103 } catch (e2) {
104 return wrapresult(null, e2);
105 }
106 }
107 };
108 } else {
109 if (x && x.then)
110 return x;
111 return {
112 then: function (cb) {
113 try {
114 return cb ? wrapresult(cb(x)) : this;
115 } catch (e2) {
116 return wrapresult(e2);
117 }
118 }
119 };
120 }
121 }
122
123 return function () {
124 try {
125 return wrapresult(fn.apply(thisArg, arguments));
126 } catch (e) {
127 return wrapresult(null, e);
128 }
129 };
130 }
131
132 export function delegate(target, _method: (string | Function)) {
133 let method : Function;
134
135 if (!(_method instanceof Function)) {
136 argumentNotNull(target, "target");
137 method = target[_method];
138 } else {
139 method = _method;
140 }
141
142 if (!(method instanceof Function))
143 throw new Error("'method' argument must be a Function or a method name");
144
145 return function () {
146 return method.apply(target, arguments);
147 };
148 }
149
150 /**
151 * Для каждого элемента массива вызывает указанную функцию и сохраняет
152 * возвращенное значение в массиве результатов.
153 *
154 * @remarks cb может выполняться асинхронно, при этом одновременно будет
155 * только одна операция.
156 *
157 * @async
158 */
159 export function pmap(items, cb) {
160 argumentNotNull(cb, "cb");
161
162 if (items && items.then instanceof Function)
163 return items.then(function (data) {
164 return pmap(data, cb);
165 });
166
167 if (isNull(items) || !items.length)
168 return items;
169
170 var i = 0,
171 result = [];
172
173 function next() {
174 var r, ri;
175
176 function chain(x) {
177 result[ri] = x;
178 return next();
179 }
180
181 while (i < items.length) {
182 r = cb(items[i], i);
183 ri = i;
184 i++;
185 if (r && r.then) {
186 return r.then(chain);
187 } else {
188 result[ri] = r;
189 }
190 }
191 return result;
192 }
193
194 return next();
195 }
196
197 /**
198 * Выбирает первый элемент из последовательности, или обещания, если в
199 * качестве параметра используется обещание, оно должно вернуть массив.
200 *
201 * @param {Function} cb обработчик результата, ему будет передан первый
202 * элемент последовательности в случае успеха
203 * @param {Function} err обработчик исключения, если массив пустой, либо
204 * не массив
205 *
206 * @remarks Если не указаны ни cb ни err, тогда функция вернет либо
207 * обещание, либо первый элемент.
208 * @async
209 */
210 export function first(sequence: any, cb: Function, err: Function) {
211 if (sequence) {
212 if (sequence.then instanceof Function) {
213 return sequence.then(function (res) {
214 return first(res, cb, err);
215 }, err);
216 } else if (sequence && "length" in sequence) {
217 if (sequence.length === 0) {
218 if (err)
219 return err(new Error("The sequence is empty"));
220 else
221 throw new Error("The sequence is empty");
222 }
223 return cb ? cb(sequence[0]) : sequence[0];
224 }
225 }
226
227 if (err)
228 return err(new Error("The sequence is required"));
229 else
230 throw new Error("The sequence is required");
231 } No newline at end of file
@@ -1,445 +1,445
1 1 {
2 2 "name": "@implab/core",
3 3 "version": "0.0.1-dev",
4 4 "lockfileVersion": 1,
5 5 "requires": true,
6 6 "dependencies": {
7 7 "@types/node": {
8 8 "version": "10.5.1",
9 9 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.1.tgz",
10 10 "integrity": "sha512-AFLl1IALIuyt6oK4AYZsgWVJ/5rnyzQWud7IebaZWWV3YmgtPZkQmYio9R5Ze/2pdd7XfqF5bP+hWS11mAKoOQ==",
11 11 "dev": true
12 12 },
13 13 "@types/tape": {
14 14 "version": "4.2.32",
15 15 "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.2.32.tgz",
16 16 "integrity": "sha512-xil0KO5wkPoixdBWGIGolPv9dekf6dVkjjJLAFYchfKcd4DICou67rgGCIO7wAh3i5Ff/6j9IDgZz+GU9cMaqQ==",
17 17 "dev": true,
18 18 "requires": {
19 19 "@types/node": "10.5.1"
20 20 }
21 21 },
22 22 "balanced-match": {
23 23 "version": "1.0.0",
24 24 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
25 25 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
26 26 "dev": true
27 27 },
28 28 "brace-expansion": {
29 29 "version": "1.1.11",
30 30 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
31 31 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
32 32 "dev": true,
33 33 "requires": {
34 34 "balanced-match": "1.0.0",
35 35 "concat-map": "0.0.1"
36 36 }
37 37 },
38 38 "concat-map": {
39 39 "version": "0.0.1",
40 40 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
41 41 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
42 42 "dev": true
43 43 },
44 44 "core-util-is": {
45 45 "version": "1.0.2",
46 46 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
47 47 "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
48 48 "dev": true
49 49 },
50 50 "deep-equal": {
51 51 "version": "1.0.1",
52 52 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
53 53 "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
54 54 "dev": true
55 55 },
56 56 "define-properties": {
57 57 "version": "1.1.2",
58 58 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
59 59 "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
60 60 "dev": true,
61 61 "requires": {
62 62 "foreach": "2.0.5",
63 63 "object-keys": "1.0.12"
64 64 }
65 65 },
66 66 "defined": {
67 67 "version": "1.0.0",
68 68 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
69 69 "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
70 70 "dev": true
71 71 },
72 72 "dojo": {
73 73 "version": "1.13.0",
74 74 "resolved": "https://registry.npmjs.org/dojo/-/dojo-1.13.0.tgz",
75 75 "integrity": "sha512-mGoGvsXAbPkUrBnxCoO7m6CFH8jvWq7rAL7fP7jrhJEOyswA/bZwWdXwEH0ovs68t8S0+xOpV/3V7addYbaiAA=="
76 76 },
77 77 "duplexer": {
78 78 "version": "0.1.1",
79 79 "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
80 80 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
81 81 "dev": true
82 82 },
83 83 "es-abstract": {
84 84 "version": "1.12.0",
85 85 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
86 86 "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
87 87 "dev": true,
88 88 "requires": {
89 89 "es-to-primitive": "1.1.1",
90 90 "function-bind": "1.1.1",
91 91 "has": "1.0.3",
92 92 "is-callable": "1.1.3",
93 93 "is-regex": "1.0.4"
94 94 }
95 95 },
96 96 "es-to-primitive": {
97 97 "version": "1.1.1",
98 98 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
99 99 "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
100 100 "dev": true,
101 101 "requires": {
102 102 "is-callable": "1.1.3",
103 103 "is-date-object": "1.0.1",
104 104 "is-symbol": "1.0.1"
105 105 }
106 106 },
107 107 "faucet": {
108 108 "version": "0.0.1",
109 109 "resolved": "https://registry.npmjs.org/faucet/-/faucet-0.0.1.tgz",
110 110 "integrity": "sha1-WX3PHSGJosBiMhtZHo8VHtIDnZw=",
111 111 "dev": true,
112 112 "requires": {
113 113 "defined": "0.0.0",
114 114 "duplexer": "0.1.1",
115 115 "minimist": "0.0.5",
116 116 "sprintf": "0.1.5",
117 117 "tap-parser": "0.4.3",
118 118 "tape": "2.3.3",
119 119 "through2": "0.2.3"
120 120 },
121 121 "dependencies": {
122 122 "deep-equal": {
123 123 "version": "0.1.2",
124 124 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz",
125 125 "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=",
126 126 "dev": true
127 127 },
128 128 "defined": {
129 129 "version": "0.0.0",
130 130 "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz",
131 131 "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=",
132 132 "dev": true
133 133 },
134 134 "minimist": {
135 135 "version": "0.0.5",
136 "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz",
136 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz",
137 137 "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=",
138 138 "dev": true
139 139 },
140 140 "tape": {
141 141 "version": "2.3.3",
142 142 "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz",
143 143 "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=",
144 144 "dev": true,
145 145 "requires": {
146 146 "deep-equal": "0.1.2",
147 147 "defined": "0.0.0",
148 148 "inherits": "2.0.3",
149 149 "jsonify": "0.0.0",
150 150 "resumer": "0.0.0",
151 151 "through": "2.3.8"
152 152 }
153 153 }
154 154 }
155 155 },
156 156 "for-each": {
157 157 "version": "0.3.3",
158 158 "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
159 159 "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
160 160 "dev": true,
161 161 "requires": {
162 162 "is-callable": "1.1.3"
163 163 }
164 164 },
165 165 "foreach": {
166 166 "version": "2.0.5",
167 167 "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
168 168 "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
169 169 "dev": true
170 170 },
171 171 "fs.realpath": {
172 172 "version": "1.0.0",
173 173 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
174 174 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
175 175 "dev": true
176 176 },
177 177 "function-bind": {
178 178 "version": "1.1.1",
179 179 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
180 180 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
181 181 "dev": true
182 182 },
183 183 "glob": {
184 184 "version": "7.1.2",
185 185 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
186 186 "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
187 187 "dev": true,
188 188 "requires": {
189 189 "fs.realpath": "1.0.0",
190 190 "inflight": "1.0.6",
191 191 "inherits": "2.0.3",
192 192 "minimatch": "3.0.4",
193 193 "once": "1.4.0",
194 194 "path-is-absolute": "1.0.1"
195 195 }
196 196 },
197 197 "has": {
198 198 "version": "1.0.3",
199 199 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
200 200 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
201 201 "dev": true,
202 202 "requires": {
203 203 "function-bind": "1.1.1"
204 204 }
205 205 },
206 206 "inflight": {
207 207 "version": "1.0.6",
208 208 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
209 209 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
210 210 "dev": true,
211 211 "requires": {
212 212 "once": "1.4.0",
213 213 "wrappy": "1.0.2"
214 214 }
215 215 },
216 216 "inherits": {
217 217 "version": "2.0.3",
218 218 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
219 219 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
220 220 "dev": true
221 221 },
222 222 "is-callable": {
223 223 "version": "1.1.3",
224 224 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
225 225 "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
226 226 "dev": true
227 227 },
228 228 "is-date-object": {
229 229 "version": "1.0.1",
230 230 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
231 231 "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
232 232 "dev": true
233 233 },
234 234 "is-regex": {
235 235 "version": "1.0.4",
236 236 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
237 237 "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
238 238 "dev": true,
239 239 "requires": {
240 240 "has": "1.0.3"
241 241 }
242 242 },
243 243 "is-symbol": {
244 244 "version": "1.0.1",
245 245 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
246 246 "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
247 247 "dev": true
248 248 },
249 249 "isarray": {
250 250 "version": "0.0.1",
251 251 "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
252 252 "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
253 253 "dev": true
254 254 },
255 255 "jsonify": {
256 256 "version": "0.0.0",
257 257 "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
258 258 "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
259 259 "dev": true
260 260 },
261 261 "minimatch": {
262 262 "version": "3.0.4",
263 263 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
264 264 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
265 265 "dev": true,
266 266 "requires": {
267 267 "brace-expansion": "1.1.11"
268 268 }
269 269 },
270 270 "minimist": {
271 271 "version": "1.2.0",
272 272 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
273 273 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
274 274 "dev": true
275 275 },
276 276 "object-inspect": {
277 277 "version": "1.6.0",
278 278 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
279 279 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
280 280 "dev": true
281 281 },
282 282 "object-keys": {
283 283 "version": "1.0.12",
284 284 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
285 285 "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
286 286 "dev": true
287 287 },
288 288 "once": {
289 289 "version": "1.4.0",
290 290 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
291 291 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
292 292 "dev": true,
293 293 "requires": {
294 294 "wrappy": "1.0.2"
295 295 }
296 296 },
297 297 "path-is-absolute": {
298 298 "version": "1.0.1",
299 299 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
300 300 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
301 301 "dev": true
302 302 },
303 303 "path-parse": {
304 304 "version": "1.0.5",
305 305 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
306 306 "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
307 307 "dev": true
308 308 },
309 309 "readable-stream": {
310 310 "version": "1.1.14",
311 311 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
312 312 "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
313 313 "dev": true,
314 314 "requires": {
315 315 "core-util-is": "1.0.2",
316 316 "inherits": "2.0.3",
317 317 "isarray": "0.0.1",
318 318 "string_decoder": "0.10.31"
319 319 }
320 320 },
321 321 "requirejs": {
322 "version": "2.3.5",
323 "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.5.tgz",
324 "integrity": "sha512-svnO+aNcR/an9Dpi44C7KSAy5fFGLtmPbaaCeQaklUz8BQhS64tWWIIlvEA5jrWICzlO/X9KSzSeXFnZdBu8nw==",
322 "version": "2.3.6",
323 "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz",
324 "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==",
325 325 "dev": true
326 326 },
327 327 "resolve": {
328 328 "version": "1.7.1",
329 329 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
330 330 "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
331 331 "dev": true,
332 332 "requires": {
333 333 "path-parse": "1.0.5"
334 334 }
335 335 },
336 336 "resumer": {
337 337 "version": "0.0.0",
338 338 "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
339 339 "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
340 340 "dev": true,
341 341 "requires": {
342 342 "through": "2.3.8"
343 343 }
344 344 },
345 345 "sprintf": {
346 346 "version": "0.1.5",
347 347 "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz",
348 348 "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=",
349 349 "dev": true
350 350 },
351 351 "string.prototype.trim": {
352 352 "version": "1.1.2",
353 353 "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
354 354 "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
355 355 "dev": true,
356 356 "requires": {
357 357 "define-properties": "1.1.2",
358 358 "es-abstract": "1.12.0",
359 359 "function-bind": "1.1.1"
360 360 }
361 361 },
362 362 "string_decoder": {
363 363 "version": "0.10.31",
364 364 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
365 365 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
366 366 "dev": true
367 367 },
368 368 "tap-parser": {
369 369 "version": "0.4.3",
370 370 "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.4.3.tgz",
371 371 "integrity": "sha1-pOrhkMENdsehEZIf84u+TVjwnuo=",
372 372 "dev": true,
373 373 "requires": {
374 374 "inherits": "2.0.3",
375 375 "readable-stream": "1.1.14"
376 376 }
377 377 },
378 378 "tape": {
379 379 "version": "4.9.1",
380 380 "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz",
381 381 "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==",
382 382 "dev": true,
383 383 "requires": {
384 384 "deep-equal": "1.0.1",
385 385 "defined": "1.0.0",
386 386 "for-each": "0.3.3",
387 387 "function-bind": "1.1.1",
388 388 "glob": "7.1.2",
389 389 "has": "1.0.3",
390 390 "inherits": "2.0.3",
391 391 "minimist": "1.2.0",
392 392 "object-inspect": "1.6.0",
393 393 "resolve": "1.7.1",
394 394 "resumer": "0.0.0",
395 395 "string.prototype.trim": "1.1.2",
396 396 "through": "2.3.8"
397 397 }
398 398 },
399 399 "through": {
400 400 "version": "2.3.8",
401 401 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
402 402 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
403 403 "dev": true
404 404 },
405 405 "through2": {
406 406 "version": "0.2.3",
407 407 "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
408 408 "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
409 409 "dev": true,
410 410 "requires": {
411 411 "readable-stream": "1.1.14",
412 412 "xtend": "2.1.2"
413 413 }
414 414 },
415 415 "typescript": {
416 "version": "2.9.2",
417 "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
418 "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
416 "version": "3.0.3",
417 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz",
418 "integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==",
419 419 "dev": true
420 420 },
421 421 "wrappy": {
422 422 "version": "1.0.2",
423 423 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
424 424 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
425 425 "dev": true
426 426 },
427 427 "xtend": {
428 428 "version": "2.1.2",
429 429 "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
430 430 "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
431 431 "dev": true,
432 432 "requires": {
433 433 "object-keys": "0.4.0"
434 434 },
435 435 "dependencies": {
436 436 "object-keys": {
437 437 "version": "0.4.0",
438 438 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
439 439 "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
440 440 "dev": true
441 441 }
442 442 }
443 443 }
444 444 }
445 445 }
@@ -1,39 +1,39
1 import { IObservable, ICancellation, IDestroyable } from "@implab/core/interfaces";
2 import * as TraceEvent from '@implab/core/log/TraceEvent';
3 import { Cancellation } from "@implab/core/Cancellation";
4 import * as TraceSource from "@implab/core/log/TraceSource";
1 import { IObservable, ICancellation, IDestroyable } from "../../build/dist/interfaces";
2 import * as TraceEvent from '../../build/dist/log/TraceEvent';
3 import { Cancellation } from "../../build/dist/Cancellation";
4 import * as TraceSource from "../../build/dist/log/TraceSource";
5 5 import * as tape from 'tape';
6 import { argumentNotNull } from "@implab/core/safe";
6 import { argumentNotNull } from "../../build/dist/safe";
7 7
8 8 export class TapeWriter implements IDestroyable {
9 9 readonly _tape: tape.Test
10 10
11 11 _subscriptions = new Array<IDestroyable>();
12 12
13 13 constructor(tape: tape.Test) {
14 14 argumentNotNull(tape, "tape");
15 15 this._tape = tape;
16 16 }
17 17
18 18 writeEvents(source: IObservable<TraceEvent>, ct: ICancellation = Cancellation.none) {
19 19 let subscription = source.on(this.writeEvent.bind(this));
20 20 if (ct.isSupported()) {
21 21 ct.register(subscription.destroy.bind(subscription));
22 22 }
23 23 this._subscriptions.push(subscription);
24 24 }
25 25
26 26 writeEvent(next: TraceEvent) {
27 27 if (next.level >= TraceSource.LogLevel) {
28 28 this._tape.comment("LOG " + next.arg);
29 29 } else if(next.level >= TraceSource.WarnLevel) {
30 30 this._tape.comment("WARN " + next.arg);
31 31 } else {
32 32 this._tape.comment("ERROR " + next.arg);
33 33 }
34 34 }
35 35
36 36 destroy() {
37 37 this._subscriptions.forEach(x => x.destroy());
38 38 }
39 39 } No newline at end of file
@@ -1,70 +1,70
1 import * as TraceSource from '@implab/core/log/TraceSource'
1 import * as TraceSource from '../../build/dist/log/TraceSource'
2 2 import * as tape from 'tape';
3 import * as ConsoleWriter from '@implab/core/log/writers/ConsoleWriter';
3 import * as ConsoleWriter from '../../build/dist/log/writers/ConsoleWriter';
4 4 import { TapeWriter } from './TestTraits';
5 5
6 6 const sourceId = 'test/TraceSourceTests';
7 7
8 8 tape('trace message', t => {
9 9 let trace = TraceSource.get(sourceId);
10 10
11 11 trace.level = TraceSource.DebugLevel;
12 12
13 13 let h = trace.on((ev) => {
14 14 t.equal(ev.source, trace, "sender should be the current trace source");
15 15 t.equal(ev.level, TraceSource.DebugLevel, "level should be debug level");
16 16 t.equal(ev.arg, "Hello, World!", "The message should be a formatted message");
17 17
18 18 t.end();
19 19 });
20 20
21 21 trace.debug("Hello, {0}!", "World");
22 22
23 23 h.destroy();
24 24 });
25 25
26 26 tape('trace event', t => {
27 27 let trace = TraceSource.get(sourceId);
28 28
29 29 trace.level = TraceSource.DebugLevel;
30 30
31 31 let event = {
32 32 name: "custom event"
33 33 };
34 34
35 35 let h = trace.on((ev) => {
36 36 t.equal(ev.source, trace, "sender should be the current trace source");
37 37 t.equal(ev.level, TraceSource.DebugLevel, "level should be debug level");
38 38 t.equal(ev.arg, event, "The message should be the specified object");
39 39
40 40 t.end();
41 41 });
42 42
43 43 trace.traceEvent(TraceSource.DebugLevel, event);
44 44
45 45 h.destroy();
46 46 });
47 47
48 48 tape('tape comment writer', async t => {
49 49 let writer = new TapeWriter(t);
50 50
51 51 TraceSource.on(ts => {
52 52 writer.writeEvents(ts);
53 53 });
54 54
55 55 let trace = TraceSource.get(sourceId);
56 56 trace.level = TraceSource.DebugLevel;
57 57
58 58 trace.log("Hello, {0}!", 'World');
59 59 trace.log("Multi\n line");
60 60 trace.warn("Look at me!");
61 61 trace.error("DIE!");
62 62
63 63 writer.destroy();
64 64
65 65 trace.log("You shouldn't see it!");
66 66
67 67 t.comment("DONE");
68 68
69 69 t.end();
70 70 }); No newline at end of file
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now