##// END OF EJS Templates
Fixed substitution spec handling in log/ConsoleWriter
cin -
r85:ad9a66d0ebe4 v1.3.1 default
parent child
Show More
@@ -1,471 +1,471
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.12.18",
9 9 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz",
10 10 "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==",
11 11 "dev": true
12 12 },
13 13 "@types/requirejs": {
14 14 "version": "2.1.31",
15 15 "resolved": "https://registry.npmjs.org/@types/requirejs/-/requirejs-2.1.31.tgz",
16 16 "integrity": "sha512-b2soeyuU76rMbcRJ4e0hEl0tbMhFwZeTC0VZnfuWlfGlk6BwWNsev6kFu/twKABPX29wkX84wU2o+cEJoXsiTw==",
17 17 "dev": true
18 18 },
19 19 "@types/tape": {
20 20 "version": "4.2.33",
21 21 "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.2.33.tgz",
22 22 "integrity": "sha512-ltfyuY5BIkYlGuQfwqzTDT8f0q8Z5DGppvUnWGs39oqDmMd6/UWhNpX3ZMh/VYvfxs3rFGHMrLC/eGRdLiDGuw==",
23 23 "dev": true,
24 24 "requires": {
25 25 "@types/node": "*"
26 26 }
27 27 },
28 28 "balanced-match": {
29 29 "version": "1.0.0",
30 30 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
31 31 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
32 32 "dev": true
33 33 },
34 34 "brace-expansion": {
35 35 "version": "1.1.11",
36 36 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
37 37 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
38 38 "dev": true,
39 39 "requires": {
40 40 "balanced-match": "^1.0.0",
41 41 "concat-map": "0.0.1"
42 42 }
43 43 },
44 44 "concat-map": {
45 45 "version": "0.0.1",
46 46 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
47 47 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
48 48 "dev": true
49 49 },
50 50 "core-util-is": {
51 51 "version": "1.0.2",
52 52 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
53 53 "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
54 54 "dev": true
55 55 },
56 56 "deep-equal": {
57 57 "version": "0.1.2",
58 58 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz",
59 59 "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=",
60 60 "dev": true
61 61 },
62 62 "define-properties": {
63 63 "version": "1.1.3",
64 64 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
65 65 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
66 66 "dev": true,
67 67 "requires": {
68 68 "object-keys": "^1.0.12"
69 69 },
70 70 "dependencies": {
71 71 "object-keys": {
72 72 "version": "1.0.12",
73 73 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
74 74 "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
75 75 "dev": true
76 76 }
77 77 }
78 78 },
79 79 "defined": {
80 80 "version": "0.0.0",
81 81 "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz",
82 82 "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=",
83 83 "dev": true
84 84 },
85 85 "dojo": {
86 86 "version": "1.14.2",
87 87 "resolved": "https://registry.npmjs.org/dojo/-/dojo-1.14.2.tgz",
88 88 "integrity": "sha512-TI+Ytgfh/VfmHWERp45Jte6NFMdoJTPsvUP/uzJUvAXET8FP2h442LePWWJ/q/xZ4V0V8OtdJhx8It/GB+Zbxg==",
89 89 "dev": true
90 90 },
91 91 "duplexer": {
92 92 "version": "0.1.1",
93 "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
93 "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
94 94 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
95 95 "dev": true
96 96 },
97 97 "es-abstract": {
98 98 "version": "1.13.0",
99 99 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
100 100 "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
101 101 "dev": true,
102 102 "requires": {
103 103 "es-to-primitive": "^1.2.0",
104 104 "function-bind": "^1.1.1",
105 105 "has": "^1.0.3",
106 106 "is-callable": "^1.1.4",
107 107 "is-regex": "^1.0.4",
108 108 "object-keys": "^1.0.12"
109 109 },
110 110 "dependencies": {
111 111 "object-keys": {
112 112 "version": "1.0.12",
113 113 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
114 114 "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
115 115 "dev": true
116 116 }
117 117 }
118 118 },
119 119 "es-to-primitive": {
120 120 "version": "1.2.0",
121 121 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
122 122 "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
123 123 "dev": true,
124 124 "requires": {
125 125 "is-callable": "^1.1.4",
126 126 "is-date-object": "^1.0.1",
127 127 "is-symbol": "^1.0.2"
128 128 }
129 129 },
130 130 "faucet": {
131 131 "version": "0.0.1",
132 132 "resolved": "https://registry.npmjs.org/faucet/-/faucet-0.0.1.tgz",
133 133 "integrity": "sha1-WX3PHSGJosBiMhtZHo8VHtIDnZw=",
134 134 "dev": true,
135 135 "requires": {
136 136 "defined": "0.0.0",
137 137 "duplexer": "~0.1.1",
138 138 "minimist": "0.0.5",
139 139 "sprintf": "~0.1.3",
140 140 "tap-parser": "~0.4.0",
141 141 "tape": "~2.3.2",
142 142 "through2": "~0.2.3"
143 143 },
144 144 "dependencies": {
145 145 "tape": {
146 146 "version": "2.3.3",
147 "resolved": "http://registry.npmjs.org/tape/-/tape-2.3.3.tgz",
147 "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz",
148 148 "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=",
149 149 "dev": true,
150 150 "requires": {
151 151 "deep-equal": "~0.1.0",
152 152 "defined": "~0.0.0",
153 153 "inherits": "~2.0.1",
154 154 "jsonify": "~0.0.0",
155 155 "resumer": "~0.0.0",
156 156 "through": "~2.3.4"
157 157 }
158 158 }
159 159 }
160 160 },
161 161 "for-each": {
162 162 "version": "0.3.3",
163 163 "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
164 164 "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
165 165 "dev": true,
166 166 "requires": {
167 167 "is-callable": "^1.1.3"
168 168 }
169 169 },
170 170 "fs.realpath": {
171 171 "version": "1.0.0",
172 172 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
173 173 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
174 174 "dev": true
175 175 },
176 176 "function-bind": {
177 177 "version": "1.1.1",
178 178 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
179 179 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
180 180 "dev": true
181 181 },
182 182 "glob": {
183 183 "version": "7.1.3",
184 184 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
185 185 "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
186 186 "dev": true,
187 187 "requires": {
188 188 "fs.realpath": "^1.0.0",
189 189 "inflight": "^1.0.4",
190 190 "inherits": "2",
191 191 "minimatch": "^3.0.4",
192 192 "once": "^1.3.0",
193 193 "path-is-absolute": "^1.0.0"
194 194 }
195 195 },
196 196 "has": {
197 197 "version": "1.0.3",
198 198 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
199 199 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
200 200 "dev": true,
201 201 "requires": {
202 202 "function-bind": "^1.1.1"
203 203 }
204 204 },
205 205 "has-symbols": {
206 206 "version": "1.0.0",
207 207 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
208 208 "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
209 209 "dev": true
210 210 },
211 211 "inflight": {
212 212 "version": "1.0.6",
213 213 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
214 214 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
215 215 "dev": true,
216 216 "requires": {
217 217 "once": "^1.3.0",
218 218 "wrappy": "1"
219 219 }
220 220 },
221 221 "inherits": {
222 222 "version": "2.0.3",
223 223 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
224 224 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
225 225 "dev": true
226 226 },
227 227 "is-callable": {
228 228 "version": "1.1.4",
229 229 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
230 230 "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
231 231 "dev": true
232 232 },
233 233 "is-date-object": {
234 234 "version": "1.0.1",
235 235 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
236 236 "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
237 237 "dev": true
238 238 },
239 239 "is-regex": {
240 240 "version": "1.0.4",
241 241 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
242 242 "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
243 243 "dev": true,
244 244 "requires": {
245 245 "has": "^1.0.1"
246 246 }
247 247 },
248 248 "is-symbol": {
249 249 "version": "1.0.2",
250 250 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
251 251 "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
252 252 "dev": true,
253 253 "requires": {
254 254 "has-symbols": "^1.0.0"
255 255 }
256 256 },
257 257 "isarray": {
258 258 "version": "0.0.1",
259 259 "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
260 260 "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
261 261 "dev": true
262 262 },
263 263 "jsonify": {
264 264 "version": "0.0.0",
265 265 "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
266 266 "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
267 267 "dev": true
268 268 },
269 269 "minimatch": {
270 270 "version": "3.0.4",
271 271 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
272 272 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
273 273 "dev": true,
274 274 "requires": {
275 275 "brace-expansion": "^1.1.7"
276 276 }
277 277 },
278 278 "minimist": {
279 279 "version": "0.0.5",
280 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz",
280 "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz",
281 281 "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=",
282 282 "dev": true
283 283 },
284 284 "object-inspect": {
285 285 "version": "1.6.0",
286 286 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
287 287 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
288 288 "dev": true
289 289 },
290 290 "object-keys": {
291 291 "version": "0.4.0",
292 292 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
293 293 "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
294 294 "dev": true
295 295 },
296 296 "once": {
297 297 "version": "1.4.0",
298 298 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
299 299 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
300 300 "dev": true,
301 301 "requires": {
302 302 "wrappy": "1"
303 303 }
304 304 },
305 305 "path-is-absolute": {
306 306 "version": "1.0.1",
307 307 "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
308 308 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
309 309 "dev": true
310 310 },
311 311 "path-parse": {
312 312 "version": "1.0.6",
313 313 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
314 314 "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
315 315 "dev": true
316 316 },
317 317 "readable-stream": {
318 318 "version": "1.1.14",
319 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
319 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
320 320 "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
321 321 "dev": true,
322 322 "requires": {
323 323 "core-util-is": "~1.0.0",
324 324 "inherits": "~2.0.1",
325 325 "isarray": "0.0.1",
326 326 "string_decoder": "~0.10.x"
327 327 }
328 328 },
329 329 "requirejs": {
330 330 "version": "2.3.6",
331 331 "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz",
332 332 "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==",
333 333 "dev": true
334 334 },
335 335 "resolve": {
336 336 "version": "1.7.1",
337 337 "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
338 338 "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
339 339 "dev": true,
340 340 "requires": {
341 341 "path-parse": "^1.0.5"
342 342 }
343 343 },
344 344 "resumer": {
345 345 "version": "0.0.0",
346 346 "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
347 347 "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
348 348 "dev": true,
349 349 "requires": {
350 350 "through": "~2.3.4"
351 351 }
352 352 },
353 353 "sprintf": {
354 354 "version": "0.1.5",
355 355 "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz",
356 356 "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=",
357 357 "dev": true
358 358 },
359 359 "string.prototype.trim": {
360 360 "version": "1.1.2",
361 361 "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
362 362 "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
363 363 "dev": true,
364 364 "requires": {
365 365 "define-properties": "^1.1.2",
366 366 "es-abstract": "^1.5.0",
367 367 "function-bind": "^1.0.2"
368 368 }
369 369 },
370 370 "string_decoder": {
371 371 "version": "0.10.31",
372 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
372 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
373 373 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
374 374 "dev": true
375 375 },
376 376 "tap-parser": {
377 377 "version": "0.4.3",
378 378 "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.4.3.tgz",
379 379 "integrity": "sha1-pOrhkMENdsehEZIf84u+TVjwnuo=",
380 380 "dev": true,
381 381 "requires": {
382 382 "inherits": "~2.0.1",
383 383 "readable-stream": "~1.1.11"
384 384 }
385 385 },
386 386 "tape": {
387 387 "version": "4.9.2",
388 388 "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.2.tgz",
389 389 "integrity": "sha512-lPXKRKILZ1kZaUy5ynWKs8ATGSUO7HAFHCFnBam6FaGSqPdOwMWbxXHq4EXFLE8WRTleo/YOMXkaUTRmTB1Fiw==",
390 390 "dev": true,
391 391 "requires": {
392 392 "deep-equal": "~1.0.1",
393 393 "defined": "~1.0.0",
394 394 "for-each": "~0.3.3",
395 395 "function-bind": "~1.1.1",
396 396 "glob": "~7.1.2",
397 397 "has": "~1.0.3",
398 398 "inherits": "~2.0.3",
399 399 "minimist": "~1.2.0",
400 400 "object-inspect": "~1.6.0",
401 401 "resolve": "~1.7.1",
402 402 "resumer": "~0.0.0",
403 403 "string.prototype.trim": "~1.1.2",
404 404 "through": "~2.3.8"
405 405 },
406 406 "dependencies": {
407 407 "deep-equal": {
408 408 "version": "1.0.1",
409 409 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
410 410 "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
411 411 "dev": true
412 412 },
413 413 "defined": {
414 414 "version": "1.0.0",
415 415 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
416 416 "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
417 417 "dev": true
418 418 },
419 419 "minimist": {
420 420 "version": "1.2.0",
421 421 "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
422 422 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
423 423 "dev": true
424 424 }
425 425 }
426 426 },
427 427 "through": {
428 428 "version": "2.3.8",
429 429 "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
430 430 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
431 431 "dev": true
432 432 },
433 433 "through2": {
434 434 "version": "0.2.3",
435 "resolved": "http://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
435 "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
436 436 "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
437 437 "dev": true,
438 438 "requires": {
439 439 "readable-stream": "~1.1.9",
440 440 "xtend": "~2.1.1"
441 441 }
442 442 },
443 443 "tslib": {
444 444 "version": "1.9.3",
445 445 "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
446 446 "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
447 447 "dev": true
448 448 },
449 449 "typescript": {
450 450 "version": "3.2.2",
451 451 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
452 452 "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==",
453 453 "dev": true
454 454 },
455 455 "wrappy": {
456 456 "version": "1.0.2",
457 457 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
458 458 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
459 459 "dev": true
460 460 },
461 461 "xtend": {
462 462 "version": "2.1.2",
463 463 "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
464 464 "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
465 465 "dev": true,
466 466 "requires": {
467 467 "object-keys": "~0.4.0"
468 468 }
469 469 }
470 470 }
471 471 }
@@ -1,100 +1,100
1 1 import { TextWriterBase } from "../text/TextWriterBase";
2 2 import { isNull, isNullOrEmptyString, isPrimitive } from "../safe";
3 3 import { NullConsole } from "./NullConsole";
4 4
5 5 interface LogConsole {
6 6 debug(...args: any[]): void;
7 7 log(...args: any[]): void;
8 8 warn(...args: any[]): void;
9 9 error(...args: any[]): void;
10 10 }
11 11
12 12 function hasConsole() {
13 13 try {
14 14 // tslint:disable-next-line:no-console
15 15 return (typeof console !== "undefined" && typeof console.log === "function");
16 16 } catch {
17 17 return false;
18 18 }
19 19 }
20 20
21 21 function getConsole() {
22 22 return hasConsole() ? console : NullConsole.instance;
23 23 }
24 24
25 25 export class ConsoleWriter extends TextWriterBase {
26 26 static readonly default = new ConsoleWriter(getConsole());
27 27
28 28 private _buffer: any[];
29 29
30 30 private _out: LogConsole;
31 31 private _level: keyof LogConsole;
32 32
33 33 constructor(out?: LogConsole) {
34 34 super();
35 35 this._out = out || NullConsole.instance;
36 36 this._buffer = [];
37 37 this._level = "log";
38 38 }
39 39
40 40 getLogLevel() {
41 41 return this._level;
42 42 }
43 43
44 44 setLogLevel(level: keyof LogConsole) {
45 45 this._level = level;
46 46 }
47 47
48 48 /** Flushes the buffer to the console
49 49 */
50 50 writeNewLine() {
51 51 // group text chunks together, and let objects as is
52 52 // ['a', 'b', {foo: 'bar'}, 'c', 'd'] -> ['ab', {foo: 'bar'}, 'cd']
53 53 // this will prevent from additional spaces to occur in the console
54 54 // ['a', 'b'] will be printed as 'a b' rather then 'ab'.
55 55
56 56 // console.log("writeLine", this._buffer);
57 57
58 58 let offset = 0;
59 59 const args = [];
60 60 this._buffer.forEach((v, i) => {
61 61 if (!isPrimitive(v)) {
62 62 if (offset < i)
63 63 args.push(i - offset > 1 ? this._buffer.slice(offset, i).join("") : this._buffer[offset]);
64 64 args.push(v);
65 65 offset = i + 1;
66 66 }
67 67 });
68 68 if (offset < this._buffer.length)
69 69 args.push(this._buffer.slice(offset).join(""));
70 70
71 71 // console.log("WriteLine", args);
72 72
73 73 this._out[this._level].apply(this._out, args);
74 74
75 75 this._buffer = [];
76 76 }
77 77
78 78 /** Adds a text chunk to the buffer. Buffer contents will be flushed when
79 79 * the end of line will be printed.
80 80 *
81 81 * @param text The text to be added to the buffer.
82 82 */
83 83 writeText(text: string) {
84 84 this._buffer.push(text);
85 85 }
86 86
87 87 /** Wrotes the specified value to the buffer.
88 88 *
89 89 * @param value The value to be added to the buffer
90 90 * @param spec The instructions how to format the value, is this parameter
91 91 * is ommited the raw value will be added to the buffer and
92 92 * passed directly to the console out.
93 93 */
94 94 writeValue(value: any, spec?: string) {
95 95 if (isNullOrEmptyString(spec))
96 96 this._buffer.push(value);
97 97 else
98 super.writeValue(value);
98 super.writeValue(value, spec);
99 99 }
100 100 }
@@ -1,86 +1,89
1 1 import { TraceSource, DebugLevel } from "@implab/core/log/TraceSource";
2 2 import * as tape from "tape";
3 3 import { TapeWriter, test } from "./TestTraits";
4 4 import { MockConsole } from "./mock/MockConsole";
5 5 import { ConsoleLogger } from "@implab/core/log/writers/ConsoleLogger";
6 6 import { ConsoleWriter } from "@implab/core/log/ConsoleWriter";
7 7
8 8 const sourceId = "test/TraceSourceTests";
9 9
10 10 tape("trace message", t => {
11 11 const trace = TraceSource.get(sourceId);
12 12
13 13 trace.level = DebugLevel;
14 14
15 15 const h = trace.events.on(ev => {
16 16 t.equal(ev.source, trace, "sender should be the current trace source");
17 17 t.equal(ev.level, DebugLevel, "level should be debug level");
18 18 t.equal(ev.toString(), "Hello, World!", "The message should be a formatted message");
19 19
20 20 t.end();
21 21 });
22 22
23 23 trace.debug("Hello, {0}!", "World");
24 24
25 25 h.destroy();
26 26 });
27 27
28 28 tape("trace event", t => {
29 29 const trace = TraceSource.get(sourceId);
30 30
31 31 trace.level = DebugLevel;
32 32
33 33 const event = {
34 34 name: "custom event"
35 35 };
36 36
37 37 const h = trace.events.on(ev => {
38 38 t.equal(ev.source, trace, "sender should be the current trace source");
39 39 t.equal(ev.level, DebugLevel, "level should be debug level");
40 40 t.equal(ev.message, event, "The message should be the specified object");
41 41
42 42 t.end();
43 43 });
44 44
45 45 trace.traceEvent(DebugLevel, event);
46 46
47 47 h.destroy();
48 48 });
49 49
50 50 tape("tape comment writer", async t => {
51 51 const writer = new TapeWriter(t);
52 52
53 53 TraceSource.on(ts => {
54 54 writer.writeEvents(ts.events);
55 55 });
56 56
57 57 const trace = TraceSource.get(sourceId);
58 58 trace.level = DebugLevel;
59 59
60 60 trace.log("Hello, {0}!", "World");
61 61 trace.log("Multi\n line");
62 62 trace.warn("Look at me!");
63 63 trace.error("DIE!");
64 64
65 65 writer.destroy();
66 66
67 67 trace.log("You shouldn't see it!");
68 68
69 69 t.comment("DONE");
70 70
71 71 t.end();
72 72 });
73 73
74 74 test("console writer", (t, trace) => {
75 75
76 76 const mockConsole = new MockConsole();
77 77 const writer = new ConsoleWriter(mockConsole);
78 78 const consoleLog = new ConsoleLogger(writer);
79 79 consoleLog.writeEvents(trace.events);
80 80
81 81 trace.log("Hello, world!");
82 82 t.deepEqual(mockConsole.getLine(0), ["console writer: Hello, world!"], "Log one string");
83 83
84 84 trace.log({ foo: "bar" });
85 85 t.deepEqual(mockConsole.getLine(1), ["console writer: ", { foo: "bar" }], "Log an object");
86
87 trace.log("json: {0:json}", { foo: "bar" });
88 t.deepEqual(mockConsole.getLine(2), ['console writer: json: {\n "foo": "bar"\n}'], "should convert to string substitutions with spec");
86 89 });
General Comments 0
You need to be logged in to leave comments. Login now