##// END OF EJS Templates
tests moved under src/ folder...
cin -
r50:7a4fac383b10 di-typescript
parent child
Show More
1 NO CONTENT: new file 100644
@@ -0,0 +1,11
1 {
2 "extends": "../tsconfig.json",
3 "compilerOptions": {
4 "types": [
5 "@types/node"
6 ]
7 },
8 "include": [
9 "ts/**/*.ts"
10 ]
11 } No newline at end of file
@@ -1,456 +1,456
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.12",
9 9 "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz",
10 10 "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==",
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.32",
21 21 "resolved": "http://registry.npmjs.org/@types/tape/-/tape-4.2.32.tgz",
22 22 "integrity": "sha512-xil0KO5wkPoixdBWGIGolPv9dekf6dVkjjJLAFYchfKcd4DICou67rgGCIO7wAh3i5Ff/6j9IDgZz+GU9cMaqQ==",
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.12.0",
99 99 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
100 100 "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
101 101 "dev": true,
102 102 "requires": {
103 103 "es-to-primitive": "^1.1.1",
104 104 "function-bind": "^1.1.1",
105 105 "has": "^1.0.1",
106 106 "is-callable": "^1.1.3",
107 107 "is-regex": "^1.0.4"
108 108 }
109 109 },
110 110 "es-to-primitive": {
111 111 "version": "1.2.0",
112 112 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
113 113 "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
114 114 "dev": true,
115 115 "requires": {
116 116 "is-callable": "^1.1.4",
117 117 "is-date-object": "^1.0.1",
118 118 "is-symbol": "^1.0.2"
119 119 }
120 120 },
121 121 "faucet": {
122 122 "version": "0.0.1",
123 123 "resolved": "https://registry.npmjs.org/faucet/-/faucet-0.0.1.tgz",
124 124 "integrity": "sha1-WX3PHSGJosBiMhtZHo8VHtIDnZw=",
125 125 "dev": true,
126 126 "requires": {
127 127 "defined": "0.0.0",
128 128 "duplexer": "~0.1.1",
129 129 "minimist": "0.0.5",
130 130 "sprintf": "~0.1.3",
131 131 "tap-parser": "~0.4.0",
132 132 "tape": "~2.3.2",
133 133 "through2": "~0.2.3"
134 134 },
135 135 "dependencies": {
136 136 "tape": {
137 137 "version": "2.3.3",
138 "resolved": "http://registry.npmjs.org/tape/-/tape-2.3.3.tgz",
138 "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz",
139 139 "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=",
140 140 "dev": true,
141 141 "requires": {
142 142 "deep-equal": "~0.1.0",
143 143 "defined": "~0.0.0",
144 144 "inherits": "~2.0.1",
145 145 "jsonify": "~0.0.0",
146 146 "resumer": "~0.0.0",
147 147 "through": "~2.3.4"
148 148 }
149 149 }
150 150 }
151 151 },
152 152 "for-each": {
153 153 "version": "0.3.3",
154 154 "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
155 155 "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
156 156 "dev": true,
157 157 "requires": {
158 158 "is-callable": "^1.1.3"
159 159 }
160 160 },
161 161 "fs.realpath": {
162 162 "version": "1.0.0",
163 163 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
164 164 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
165 165 "dev": true
166 166 },
167 167 "function-bind": {
168 168 "version": "1.1.1",
169 169 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
170 170 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
171 171 "dev": true
172 172 },
173 173 "glob": {
174 174 "version": "7.1.3",
175 175 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
176 176 "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
177 177 "dev": true,
178 178 "requires": {
179 179 "fs.realpath": "^1.0.0",
180 180 "inflight": "^1.0.4",
181 181 "inherits": "2",
182 182 "minimatch": "^3.0.4",
183 183 "once": "^1.3.0",
184 184 "path-is-absolute": "^1.0.0"
185 185 }
186 186 },
187 187 "has": {
188 188 "version": "1.0.3",
189 189 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
190 190 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
191 191 "dev": true,
192 192 "requires": {
193 193 "function-bind": "^1.1.1"
194 194 }
195 195 },
196 196 "has-symbols": {
197 197 "version": "1.0.0",
198 198 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
199 199 "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
200 200 "dev": true
201 201 },
202 202 "inflight": {
203 203 "version": "1.0.6",
204 204 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
205 205 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
206 206 "dev": true,
207 207 "requires": {
208 208 "once": "^1.3.0",
209 209 "wrappy": "1"
210 210 }
211 211 },
212 212 "inherits": {
213 213 "version": "2.0.3",
214 214 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
215 215 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
216 216 "dev": true
217 217 },
218 218 "is-callable": {
219 219 "version": "1.1.4",
220 220 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
221 221 "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
222 222 "dev": true
223 223 },
224 224 "is-date-object": {
225 225 "version": "1.0.1",
226 226 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
227 227 "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
228 228 "dev": true
229 229 },
230 230 "is-regex": {
231 231 "version": "1.0.4",
232 232 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
233 233 "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
234 234 "dev": true,
235 235 "requires": {
236 236 "has": "^1.0.1"
237 237 }
238 238 },
239 239 "is-symbol": {
240 240 "version": "1.0.2",
241 241 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
242 242 "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
243 243 "dev": true,
244 244 "requires": {
245 245 "has-symbols": "^1.0.0"
246 246 }
247 247 },
248 248 "isarray": {
249 249 "version": "0.0.1",
250 250 "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
251 251 "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
252 252 "dev": true
253 253 },
254 254 "jsonify": {
255 255 "version": "0.0.0",
256 256 "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
257 257 "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
258 258 "dev": true
259 259 },
260 260 "minimatch": {
261 261 "version": "3.0.4",
262 262 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
263 263 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
264 264 "dev": true,
265 265 "requires": {
266 266 "brace-expansion": "^1.1.7"
267 267 }
268 268 },
269 269 "minimist": {
270 270 "version": "0.0.5",
271 271 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz",
272 272 "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=",
273 273 "dev": true
274 274 },
275 275 "object-inspect": {
276 276 "version": "1.6.0",
277 277 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
278 278 "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
279 279 "dev": true
280 280 },
281 281 "object-keys": {
282 282 "version": "0.4.0",
283 283 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
284 284 "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
285 285 "dev": true
286 286 },
287 287 "once": {
288 288 "version": "1.4.0",
289 289 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
290 290 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
291 291 "dev": true,
292 292 "requires": {
293 293 "wrappy": "1"
294 294 }
295 295 },
296 296 "path-is-absolute": {
297 297 "version": "1.0.1",
298 "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
298 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
299 299 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
300 300 "dev": true
301 301 },
302 302 "path-parse": {
303 303 "version": "1.0.6",
304 304 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
305 305 "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
306 306 "dev": true
307 307 },
308 308 "readable-stream": {
309 309 "version": "1.1.14",
310 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
310 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
311 311 "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
312 312 "dev": true,
313 313 "requires": {
314 314 "core-util-is": "~1.0.0",
315 315 "inherits": "~2.0.1",
316 316 "isarray": "0.0.1",
317 317 "string_decoder": "~0.10.x"
318 318 }
319 319 },
320 320 "requirejs": {
321 321 "version": "2.3.6",
322 322 "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz",
323 323 "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==",
324 324 "dev": true
325 325 },
326 326 "resolve": {
327 327 "version": "1.7.1",
328 328 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
329 329 "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
330 330 "dev": true,
331 331 "requires": {
332 332 "path-parse": "^1.0.5"
333 333 }
334 334 },
335 335 "resumer": {
336 336 "version": "0.0.0",
337 337 "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
338 338 "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
339 339 "dev": true,
340 340 "requires": {
341 341 "through": "~2.3.4"
342 342 }
343 343 },
344 344 "sprintf": {
345 345 "version": "0.1.5",
346 346 "resolved": "https://registry.npmjs.org/sprintf/-/sprintf-0.1.5.tgz",
347 347 "integrity": "sha1-j4PjmpMXwaUCy324BQ5Rxnn27c8=",
348 348 "dev": true
349 349 },
350 350 "string.prototype.trim": {
351 351 "version": "1.1.2",
352 352 "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
353 353 "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
354 354 "dev": true,
355 355 "requires": {
356 356 "define-properties": "^1.1.2",
357 357 "es-abstract": "^1.5.0",
358 358 "function-bind": "^1.0.2"
359 359 }
360 360 },
361 361 "string_decoder": {
362 362 "version": "0.10.31",
363 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
363 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
364 364 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
365 365 "dev": true
366 366 },
367 367 "tap-parser": {
368 368 "version": "0.4.3",
369 369 "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-0.4.3.tgz",
370 370 "integrity": "sha1-pOrhkMENdsehEZIf84u+TVjwnuo=",
371 371 "dev": true,
372 372 "requires": {
373 373 "inherits": "~2.0.1",
374 374 "readable-stream": "~1.1.11"
375 375 }
376 376 },
377 377 "tape": {
378 378 "version": "4.9.1",
379 379 "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz",
380 380 "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==",
381 381 "dev": true,
382 382 "requires": {
383 383 "deep-equal": "~1.0.1",
384 384 "defined": "~1.0.0",
385 385 "for-each": "~0.3.3",
386 386 "function-bind": "~1.1.1",
387 387 "glob": "~7.1.2",
388 388 "has": "~1.0.3",
389 389 "inherits": "~2.0.3",
390 390 "minimist": "~1.2.0",
391 391 "object-inspect": "~1.6.0",
392 392 "resolve": "~1.7.1",
393 393 "resumer": "~0.0.0",
394 394 "string.prototype.trim": "~1.1.2",
395 395 "through": "~2.3.8"
396 396 },
397 397 "dependencies": {
398 398 "deep-equal": {
399 399 "version": "1.0.1",
400 400 "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
401 401 "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
402 402 "dev": true
403 403 },
404 404 "defined": {
405 405 "version": "1.0.0",
406 406 "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
407 407 "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
408 408 "dev": true
409 409 },
410 410 "minimist": {
411 411 "version": "1.2.0",
412 412 "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
413 413 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
414 414 "dev": true
415 415 }
416 416 }
417 417 },
418 418 "through": {
419 419 "version": "2.3.8",
420 "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
420 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
421 421 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
422 422 "dev": true
423 423 },
424 424 "through2": {
425 425 "version": "0.2.3",
426 "resolved": "http://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
426 "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz",
427 427 "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=",
428 428 "dev": true,
429 429 "requires": {
430 430 "readable-stream": "~1.1.9",
431 431 "xtend": "~2.1.1"
432 432 }
433 433 },
434 434 "typescript": {
435 435 "version": "3.2.1",
436 436 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.1.tgz",
437 437 "integrity": "sha512-jw7P2z/h6aPT4AENXDGjcfHTu5CSqzsbZc6YlUIebTyBAq8XaKp78x7VcSh30xwSCcsu5irZkYZUSFP1MrAMbg==",
438 438 "dev": true
439 439 },
440 440 "wrappy": {
441 441 "version": "1.0.2",
442 442 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
443 443 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
444 444 "dev": true
445 445 },
446 446 "xtend": {
447 447 "version": "2.1.2",
448 448 "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
449 449 "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
450 450 "dev": true,
451 451 "requires": {
452 452 "object-keys": "~0.4.0"
453 453 }
454 454 }
455 455 }
456 456 }
@@ -1,35 +1,40
1 1 import { Uuid } from "../Uuid";
2 import { argumentNotEmptyString } from "../safe";
2 import { argumentNotEmptyString, argumentNotNull } from "../safe";
3 3 import { TraceSource } from "../log/TraceSource";
4 4
5 export const rjs = require;
6
7 declare function define(name: string, modules: string[], cb?: (...args: any[]) => any, eb?: (e) => any): void;
8 declare function define(modules: string[], cb?: (...args: any[]) => any, eb?: (e) => any): void;
9
10 5 const trace = TraceSource.get("@implab/core/di/RequireJsHelper");
11 6
12 7 export async function createContextRequire(moduleName: string): Promise<Require> {
13 8 argumentNotEmptyString(moduleName, "moduleName");
14 9
15 10 const parts = moduleName.split("/");
16 11 if (parts[0] === ".")
17 12 throw new Error("An absolute module path is required");
18 13
19 14 if (parts.length > 1)
20 15 parts.splice(-1, 1, Uuid());
21 16 else
22 17 parts.push(Uuid());
23 18
24 19 const shim = parts.join("/");
25 20
26 21 trace.debug(`define shim ${shim}`);
27 22
28 return new Promise<Require>(fulfill => {
23 return new Promise<Require>(cb => {
29 24 define(shim, ["require"], r => {
30 25 trace.debug("shim resolved");
31 26 return r;
32 27 });
33 require([shim], fulfill);
28 require([shim], cb);
34 29 });
35 30 }
31
32 export function makeResolver(req: Require) {
33 argumentNotNull(req, "req");
34
35 return (name: string) => {
36 return new Promise<any>((cb, eb) => {
37 req([name], cb, eb);
38 });
39 };
40 }
@@ -1,353 +1,322
1 1 import {
2 2 ServiceRegistration,
3 3 TypeRegistration,
4 4 FactoryRegistration,
5 5 ServiceMap,
6 6 isDescriptor,
7 7 isDependencyRegistration,
8 8 DependencyRegistration,
9 9 ValueRegistration,
10 10 ActivationType,
11 11 isValueRegistration,
12 12 isTypeRegistration,
13 13 isFactoryRegistration
14 14 } from "./interfaces";
15 15
16 16 import { argumentNotEmptyString, isPrimitive, isPromise, delegate, argumentOfType, argumentNotNull, get } from "../safe";
17 17 import { AggregateDescriptor } from "./AggregateDescriptor";
18 18 import { ValueDescriptor } from "./ValueDescriptor";
19 19 import { Container } from "./Container";
20 20 import { ReferenceDescriptor } from "./ReferenceDescriptor";
21 21 import { TypeServiceDescriptor } from "./TypeServiceDescriptor";
22 22 import { FactoryServiceDescriptor } from "./FactoryServiceDescriptor";
23 import { rjs, createContextRequire } from "./RequireJsHelper";
24 23 import { TraceSource } from "../log/TraceSource";
25 24 import { ConfigError } from "./ConfigError";
26 25 import { Cancellation } from "../Cancellation";
27 26
28 27 const trace = TraceSource.get("@implab/core/di/Configuration");
29 28
30 29 async function mapAll(data: object | any[], map?: (v, k) => any): Promise<any> {
31 30 if (data instanceof Array) {
32 31 return Promise.all(map ? data.map(map) : data);
33 32 } else {
34 33 const keys = Object.keys(data);
35 34
36 35 const o: any = {};
37 36
38 37 await Promise.all(keys.map(async k => {
39 38 const v = map ? map(data[k], k) : data[k];
40 39 o[k] = isPromise(v) ? await v : v;
41 40 }));
42 41
43 42 return o;
44 43 }
45 44 }
46 45
47 interface MapOf<T> {
48 [key: string]: T;
49 }
46 type Resolver = (qname: string) => any;
50 47
51 48 type _key = string | number;
52 49
53 50 export class Configuration {
54 51
55 52 _hasInnerDescriptors = false;
56 53
57 54 _container: Container;
58 55
59 56 _path: Array<_key>;
60 57
61 58 _configName: string;
62 59
63 _require = rjs;
60 _require: Resolver;
64 61
65 62 constructor(container: Container) {
66 63 argumentNotNull(container, container);
67 64 this._container = container;
68 65 this._path = [];
69 66 }
70 67
71 async loadConfiguration(moduleName: string, ct = Cancellation.none) {
72 argumentNotEmptyString(moduleName, "moduleName");
73
74 trace.log("loadConfiguration {0}", moduleName);
75
76 this._configName = moduleName;
77
78 const config = await this._loadModule(moduleName);
79
80 this._require = await this._createContextRequire(moduleName);
81
82 let services: ServiceMap;
83
84 try {
85 services = await this._visitRegistrations(config, moduleName);
86 } catch (e) {
87 throw this._makeError(e);
88 }
89
90 this._container.register(services);
91 }
92
93 async applyConfiguration(data: object, contextRequire?: Require, ct = Cancellation.none) {
68 async applyConfiguration(data: object, resolver?: Resolver, ct = Cancellation.none) {
94 69 argumentNotNull(data, "data");
95 70
96 71 trace.log("applyConfiguration");
97 72
98 73 this._configName = "$";
99 74
100 if (contextRequire)
101 this._require = contextRequire;
75 if (resolver)
76 this._require = resolver;
102 77
103 78 let services: ServiceMap;
104 79
105 80 try {
106 81 services = await this._visitRegistrations(data, "$");
107 82 } catch (e) {
108 83 throw this._makeError(e);
109 84 }
110 85
111 86 this._container.register(services);
112 87 }
113 88
114 89 _makeError(inner) {
115 90 const e = new ConfigError("Failed to load configuration", inner);
116 91 e.configName = this._configName;
117 92 e.path = this._makePath();
118 93 return e;
119 94 }
120 95
121 96 _makePath() {
122 97 return this._path
123 98 .reduce(
124 99 (prev, cur) => typeof cur === "number" ?
125 100 `${prev}[${cur}]` :
126 101 `${prev}.${cur}`
127 102 )
128 103 .toString();
129 104 }
130 105
131 106 async _resolveType(moduleName: string, localName: string) {
132 107 trace.log("resolveType moduleName={0}, localName={1}", moduleName, localName);
133 108 try {
134 109 const m = await this._loadModule(moduleName);
135 110 return localName ? get(localName, m) : m;
136 111 } catch (e) {
137 112 trace.error("Failed to resolve type moduleName={0}, localName={1}", moduleName, localName);
138 113 throw e;
139 114 }
140 115 }
141 116
142 117 async _loadModule(moduleName: string) {
143 118 trace.debug("loadModule {0}", moduleName);
144 119
145 const m = await new Promise(fulfill => {
146 this._require([moduleName], fulfill);
147 });
120 const m = await this._require(moduleName);
148 121
149 122 return m;
150 123 }
151 124
152 _createContextRequire(moduleName: string) {
153 return createContextRequire(moduleName);
154 }
155
156 125 async _visitRegistrations(data, name: _key) {
157 126 this._enter(name);
158 127
159 128 if (data.constructor &&
160 129 data.constructor.prototype !== Object.prototype)
161 130 throw new Error("Configuration must be a simple object");
162 131
163 132 const o: ServiceMap = {};
164 133 const keys = Object.keys(data);
165 134
166 135 const services = await mapAll(data, async (v, k) => {
167 136 const d = await this._visit(v, k);
168 137 return isDescriptor(d) ? d : new AggregateDescriptor(d);
169 138 }) as ServiceMap;
170 139
171 140 this._leave();
172 141
173 142 return services;
174 143 }
175 144
176 145 _enter(name: _key) {
177 146 this._path.push(name);
178 147 trace.debug(">{0}", name);
179 148 }
180 149
181 150 _leave() {
182 151 const name = this._path.pop();
183 152 trace.debug("<{0}", name);
184 153 }
185 154
186 155 async _visit(data, name: string): Promise<any> {
187 156 if (isPrimitive(data) || isDescriptor(data))
188 157 return data;
189 158
190 159 if (isDependencyRegistration(data)) {
191 160 return this._visitDependencyRegistration(data, name);
192 161 } else if (isValueRegistration(data)) {
193 162 return this._visitValueRegistration(data, name);
194 163 } else if (isTypeRegistration(data)) {
195 164 return this._visitTypeRegistration(data, name);
196 165 } else if (isFactoryRegistration(data)) {
197 166 return this._visitFactoryRegistration(data, name);
198 167 } else if (data instanceof Array) {
199 168 return this._visitArray(data, name);
200 169 }
201 170
202 171 return this._visitObject(data, name);
203 172 }
204 173
205 174 async _visitObject(data: object, name: _key) {
206 175 if (data.constructor &&
207 176 data.constructor.prototype !== Object.prototype)
208 177 return new ValueDescriptor(data);
209 178
210 179 this._enter(name);
211 180
212 181 const v = await mapAll(data, delegate(this, "_visit"));
213 182
214 183 // TODO: handle inline descriptors properly
215 184 // const ex = {
216 185 // activate(ctx) {
217 186 // const value = ctx.activate(this.prop, "prop");
218 187 // // some code
219 188 // },
220 189 // // will be turned to ReferenceDescriptor
221 190 // prop: { $dependency: "depName" }
222 191 // };
223 192
224 193 this._leave();
225 194 return v;
226 195 }
227 196
228 197 async _visitArray(data: any[], name: _key) {
229 198 if (data.constructor &&
230 199 data.constructor.prototype !== Array.prototype)
231 200 return new ValueDescriptor(data);
232 201
233 202 this._enter(name);
234 203
235 204 const v = await mapAll(data, delegate(this, "_visit"));
236 205 this._leave();
237 206
238 207 return v;
239 208 }
240 209
241 210 _makeServiceParams(data: ServiceRegistration) {
242 211 const opts: any = {
243 212 owner: this._container
244 213 };
245 214 if (data.services)
246 215 opts.services = this._visitRegistrations(data.services, "services");
247 216
248 217 if (data.inject) {
249 218 this._path.push("inject");
250 219 opts.inject = mapAll(
251 220 data.inject instanceof Array ?
252 221 data.inject :
253 222 [data.inject],
254 223 delegate(this, "_visitObject")
255 224 );
256 225 this._leave();
257 226 }
258 227
259 228 if ("params" in data)
260 229 opts.params = data.params instanceof Array ?
261 230 this._visitArray(data.params, "params") :
262 231 this._visit(data.params, "params");
263 232
264 233 if (data.activation) {
265 234 if (typeof (data.activation) === "string") {
266 235 switch (data.activation.toLowerCase()) {
267 236 case "singleton":
268 237 opts.activation = ActivationType.Singleton;
269 238 break;
270 239 case "container":
271 240 opts.activation = ActivationType.Container;
272 241 break;
273 242 case "hierarchy":
274 243 opts.activation = ActivationType.Hierarchy;
275 244 break;
276 245 case "context":
277 246 opts.activation = ActivationType.Context;
278 247 break;
279 248 case "call":
280 249 opts.activation = ActivationType.Call;
281 250 break;
282 251 default:
283 252 throw new Error("Unknown activation type: " +
284 253 data.activation);
285 254 }
286 255 } else {
287 256 opts.activation = Number(data.activation);
288 257 }
289 258 }
290 259
291 260 if (data.cleanup)
292 261 opts.cleanup = data.cleanup;
293 262
294 263 return opts;
295 264 }
296 265
297 266 async _visitValueRegistration(data: ValueRegistration, name: _key) {
298 267 this._enter(name);
299 268 const d = data.parse ? new AggregateDescriptor(data.$value) : new ValueDescriptor(data.$value);
300 269 this._leave();
301 270 return d;
302 271 }
303 272
304 273 async _visitDependencyRegistration(data: DependencyRegistration, name: _key) {
305 274 argumentNotEmptyString(data && data.$dependency, "data.$dependency");
306 275 this._enter(name);
307 276 const d = new ReferenceDescriptor({
308 277 name: data.$dependency,
309 278 lazy: data.lazy,
310 279 optional: data.optional,
311 280 default: data.default,
312 281 services: data.services && await this._visitRegistrations(data.services, "services")
313 282 });
314 283 this._leave();
315 284 return d;
316 285 }
317 286
318 287 async _visitTypeRegistration(data: TypeRegistration, name: _key) {
319 288 argumentNotNull(data.$type, "data.$type");
320 289 this._enter(name);
321 290
322 291 const opts = this._makeServiceParams(data);
323 292 if (data.$type instanceof Function) {
324 293 opts.type = data.$type;
325 294 } else {
326 295 const [moduleName, typeName] = data.$type.split(":", 2);
327 296 opts.type = this._resolveType(moduleName, typeName);
328 297 }
329 298
330 299 const d = new TypeServiceDescriptor(
331 300 await mapAll(opts)
332 301 );
333 302
334 303 this._leave();
335 304
336 305 return d;
337 306 }
338 307
339 308 async _visitFactoryRegistration(data: FactoryRegistration, name: _key) {
340 309 argumentOfType(data.$factory, Function, "data.$type");
341 310 this._enter(name);
342 311
343 312 const opts = this._makeServiceParams(data);
344 313 opts.factory = opts.$factory;
345 314
346 315 const d = new FactoryServiceDescriptor(
347 316 await mapAll(opts)
348 317 );
349 318
350 319 this._leave();
351 320 return d;
352 321 }
353 322 }
@@ -1,128 +1,128
1 1 import { ActivationContext } from "./ActivationContext";
2 2 import { ValueDescriptor } from "./ValueDescriptor";
3 3 import { ActivationError } from "./ActivationError";
4 4 import { isDescriptor, ServiceMap } from "./interfaces";
5 5 import { TraceSource } from "../log/TraceSource";
6 6 import { Configuration } from "./Configuration";
7 7 import { Cancellation } from "../Cancellation";
8 8
9 9 const trace = TraceSource.get("@implab/core/di/ActivationContext");
10 10
11 11 export class Container {
12 12 _services: ServiceMap;
13 13
14 14 _cache: object;
15 15
16 16 _cleanup: (() => void)[];
17 17
18 18 _root: Container;
19 19
20 20 _parent: Container;
21 21
22 22 constructor(parent?: Container) {
23 23 this._parent = parent;
24 24 this._services = parent ? Object.create(parent._services) : {};
25 25 this._cache = {};
26 26 this._cleanup = [];
27 27 this._root = parent ? parent.getRootContainer() : this;
28 28 this._services.container = new ValueDescriptor(this);
29 29 }
30 30
31 31 getRootContainer() {
32 32 return this._root;
33 33 }
34 34
35 35 getParent() {
36 36 return this._parent;
37 37 }
38 38
39 39 resolve(name: string, def?) {
40 40 trace.debug("resolve {0}", name);
41 41 const d = this._services[name];
42 42 if (d === undefined) {
43 43 if (arguments.length > 1)
44 44 return def;
45 45 else
46 46 throw new Error("Service '" + name + "' isn't found");
47 47 }
48 48
49 49 const context = new ActivationContext(this, this._services);
50 50 try {
51 51 return context.activate(d, name);
52 52 } catch (error) {
53 53 throw new ActivationError(name, context.getStack(), error);
54 54 }
55 55 }
56 56
57 57 /**
58 58 * @deprecated use resolve() method
59 59 */
60 60 getService() {
61 61 return this.resolve.apply(this, arguments);
62 62 }
63 63
64 64 register(nameOrCollection, service?) {
65 65 if (arguments.length === 1) {
66 66 const data = nameOrCollection;
67 67 for (const name in data)
68 68 this.register(name, data[name]);
69 69 } else {
70 70 if (!isDescriptor(service))
71 71 throw new Error("The service parameter must be a descriptor");
72 72
73 73 this._services[nameOrCollection] = service;
74 74 }
75 75 return this;
76 76 }
77 77
78 78 onDispose(callback) {
79 79 if (!(callback instanceof Function))
80 80 throw new Error("The callback must be a function");
81 81 this._cleanup.push(callback);
82 82 }
83 83
84 84 dispose() {
85 85 if (this._cleanup) {
86 86 for (const f of this._cleanup)
87 87 f();
88 88 this._cleanup = null;
89 89 }
90 90 }
91 91
92 92 /**
93 93 * @param{String|Object} config
94 94 * The configuration of the contaier. Can be either a string or an object,
95 95 * if the configuration is an object it's treated as a collection of
96 96 * services which will be registed in the contaier.
97 97 *
98 98 * @param{Function} opts.contextRequire
99 99 * The function which will be used to load a configuration or types for services.
100 100 *
101 101 */
102 async configure(config: string | object, opts?: any, ct = Cancellation.none) {
102 async configure(config: string | object, opts?, ct = Cancellation.none) {
103 103 const c = new Configuration(this);
104 104
105 105 if (typeof (config) === "string") {
106 106 return c.loadConfiguration(config, ct);
107 107 } else {
108 108 return c.applyConfiguration(config, opts && opts.contextRequire, ct);
109 109 }
110 110 }
111 111
112 112 createChildContainer() {
113 113 return new Container(this);
114 114 }
115 115
116 116 has(id) {
117 117 return id in this._cache;
118 118 }
119 119
120 120 get(id) {
121 121 return this._cache[id];
122 122 }
123 123
124 124 store(id, value) {
125 125 return (this._cache[id] = value);
126 126 }
127 127
128 128 }
1 NO CONTENT: file renamed from test/js/example.js to src/test/js/example.js
1 NO CONTENT: file renamed from test/js/mock/config1.js to src/test/js/mock/config1.js
1 NO CONTENT: file renamed from test/js/plan.js to src/test/js/plan.js
1 NO CONTENT: file renamed from test/js/trace-test.js to src/test/js/trace-test.js
1 NO CONTENT: file renamed from test/ts/ActivatableTests.ts to src/test/ts/ActivatableTests.ts
1 NO CONTENT: file renamed from test/ts/CancellationTests.ts to src/test/ts/CancellationTests.ts
1 NO CONTENT: file renamed from test/ts/ContainerTests.ts to src/test/ts/ContainerTests.ts
1 NO CONTENT: file renamed from test/ts/ObservableTests.ts to src/test/ts/ObservableTests.ts
1 NO CONTENT: file renamed from test/ts/TestTraits.ts to src/test/ts/TestTraits.ts
1 NO CONTENT: file renamed from test/ts/TraceSourceTests.ts to src/test/ts/TraceSourceTests.ts
1 NO CONTENT: file renamed from test/ts/dummy.ts to src/test/ts/dummy.ts
1 NO CONTENT: file renamed from test/ts/mock/Bar.ts to src/test/ts/mock/Bar.ts
1 NO CONTENT: file renamed from test/ts/mock/Foo.ts to src/test/ts/mock/Foo.ts
1 NO CONTENT: file renamed from test/ts/mock/MockActivationController.ts to src/test/ts/mock/MockActivationController.ts
1 NO CONTENT: file renamed from test/ts/mock/SimpleActivatable.ts to src/test/ts/mock/SimpleActivatable.ts
1 NO CONTENT: file renamed from test/tsconfig.json to src/test/tsconfig.json
@@ -1,21 +1,22
1 1 {
2 2 "compilerOptions": {
3 3 "target": "es3",
4 4 "module": "amd",
5 5 "sourceMap": true,
6 6 "declaration": true,
7 7 "moduleResolution": "node",
8 8 "listFiles": true,
9 9 "lib": [
10 10 "es5",
11 11 "es2015.promise",
12 12 "es2015.symbol",
13 13 "dom"
14 14 ],
15 15 "rootDirs": [
16 16 "main/ts",
17 "amd/ts"
17 "amd/ts",
18 "cjs/ts"
18 19 ],
19 20 "types": []
20 21 }
21 22 } No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now