UNPKG

52.7 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const reflect_1 = require("@azera/reflect");
4const util_1 = require("@azera/util");
5const assert_1 = require("assert");
6const glob = require("glob");
7const decorators_1 = require("./decorators");
8const errors_1 = require("./errors");
9exports.FACTORY_REGEX = /.*Factory$/;
10exports.SERVICE_REGEX = /.*Service$/;
11/**
12 * Dependency Injection Container
13 * @author Masoud Zohrabi <mdzzohrabi@gmail.com>
14 */
15class Container {
16 constructor(services, parameters, autoTags) {
17 /**
18 * Invoked services in-memory cache
19 */
20 this.instances = {};
21 /**
22 * Container parameters collection
23 */
24 this.params = {};
25 /**
26 * Declared service definitions
27 */
28 this.services = {};
29 /**
30 * Tag extractor functions
31 */
32 this.autoTags = [];
33 /**
34 * Type factories
35 */
36 this.factories = new WeakMap();
37 /**
38 * Container-specified class definitions
39 */
40 this.types = new WeakMap();
41 /**
42 * Imported things
43 */
44 this.imported = [];
45 /** Exception on async dependencies when invoke called synchrounosly */
46 this.strictAsync = true;
47 if (autoTags)
48 this.autoTags = autoTags;
49 if (services)
50 this.set(services);
51 if (parameters)
52 this.params = parameters;
53 this.setFactory('serviceContainer', function containerFactory() {
54 return this;
55 });
56 // Get container
57 this.setFactory(Container, () => this);
58 }
59 /**
60 * Check if decorated class was inherited from another decorated class
61 * @param target Class
62 */
63 static isInheritedServiceDecorator(target) {
64 return target[decorators_1.META_INJECT] && !target.hasOwnProperty(decorators_1.META_INJECT);
65 }
66 /**
67 * Prepare class if inherited from service decorated class
68 * @param target Class
69 */
70 static checkInheritance(target) {
71 if (Container.isInheritedServiceDecorator(target)) {
72 let def = decorators_1.getDefinition(target);
73 def.$target = target;
74 def.inherited = false;
75 def.name = target.name;
76 def.service = target;
77 def.parameters = getDependencies(target).deps;
78 decorators_1.setDefinition(target, def);
79 }
80 }
81 /**
82 * Get container parameters
83 */
84 getParameters() {
85 return this.params;
86 }
87 /**
88 * Build service from factory
89 * @param factory Factory
90 * @param _stack Stack
91 * @internal
92 */
93 buildFromFactory(factory, _stack = [], options) {
94 let result, override = { isFactory: false, invoke: true };
95 let { async = false } = options || {};
96 if (util_1.is.Class(factory)) {
97 let context = this._invoke(factory, _stack, { override: { isFactory: false } });
98 result = this._invoke(Method(context, 'create'), _stack, { context, override, async });
99 }
100 else if (util_1.is.Function(factory)) {
101 result = this._invoke(factory, _stack, { context: this, override, async });
102 }
103 else if (util_1.is.Object(factory) && 'create' in factory) {
104 result = this._invoke(Method(factory, 'create'), _stack, { context: this, override, async });
105 }
106 else {
107 throw Error(`Factory must be Function or instanceOf IFactory`);
108 }
109 return result;
110 }
111 /**
112 * Resolve import
113 * @param item Path or Function to import
114 * @internal
115 */
116 resolveImport(item) {
117 if (this.imported.includes(item))
118 return;
119 this.imported.push(item);
120 if (util_1.is.Function(item))
121 this.add(item);
122 else if (util_1.is.String(item)) {
123 item = item + '!(*.d.ts).@(ts|js)'; // Ignore
124 let files = glob.sync(item) || [];
125 files.forEach(file => {
126 let module = require(file);
127 util_1.forEach(module, moduleClass => {
128 if (util_1.is.Function(moduleClass)) {
129 this.add(moduleClass);
130 }
131 });
132 });
133 }
134 }
135 /**
136 * Resolve definition imports
137 * @param service Service definition
138 * @internal
139 */
140 resolveImports(service) {
141 if (!service.imports)
142 return;
143 service.imports.forEach(this.resolveImport.bind(this));
144 }
145 resolveDefinition(definition, _stack, options) {
146 let { context, override, async } = options || {};
147 let service = override ? Object.assign({}, definition, override) : definition;
148 let name = service.name;
149 let result;
150 if (!service.invoke && (name == undefined || util_1.is.Empty(name)))
151 throw Error(`Service has no name`);
152 if (!this.definitions[service.name]) {
153 // Auto-tagger defined in service
154 if (util_1.is.Array(service.autoTags)) {
155 service.autoTags.forEach(item => {
156 if (util_1.is.Function(item))
157 this.autoTag(item);
158 else
159 this.autoTag(item.class, item.tags);
160 });
161 }
162 // Imports
163 this.resolveImports(service);
164 }
165 // Factory
166 if (service.isFactory || service.factory || this.factories.has(service.service)) {
167 let factory = service.factory ? service.factory : service.isFactory ? service.service : this.factories.get(service.service);
168 result = this.buildFromFactory(factory, _stack, options);
169 }
170 else {
171 assert_1.ok(util_1.is.Array(service.parameters || []), `Service ${service.name} parameters must be array, ${service.parameters} given`);
172 assert_1.ok(service.service || service.factory, `No service defined for ${service.name}`);
173 let resolvedParameters = (service.parameters || []).map(dep => this._invoke(dep, _stack, options));
174 let target = service.service;
175 if (this.strictAsync && !async && resolvedParameters.find(d => d instanceof Promise) !== undefined) {
176 throw Error(`Async dependencies are not allowed in synchronous invoke`);
177 }
178 let createService = (parameters) => {
179 // Function service (Factory)
180 if (service.invoke || !util_1.is.Newable(target)) {
181 return { result: target.apply(context || target, parameters), return: true };
182 }
183 let object = new target(...parameters);
184 // Properties
185 if (service.properties) {
186 util_1.forEach(service.properties, (dep, key) => {
187 let prop;
188 if (util_1.is.String(dep) || util_1.is.Function(dep)) {
189 prop = { name: dep };
190 }
191 else {
192 prop = dep;
193 }
194 if (prop.lateBinding) {
195 let resolved;
196 Object.defineProperty(object, key, {
197 get: () => resolved || (resolved = this._invoke(prop.name, _stack, options))
198 });
199 }
200 else {
201 object[key] = this._invoke(prop.name, _stack, options);
202 }
203 });
204 }
205 // Methods
206 if (service.calls) {
207 util_1.forEach(service.calls, (args, method) => {
208 object[method].apply(object, args.map(arg => this._invoke(arg, _stack, options)));
209 });
210 }
211 return { result: object, return: false };
212 };
213 if (async && resolvedParameters.filter(param => param instanceof Promise).length > 0) {
214 let resolver = new Promise(async (resolve, reject) => {
215 resolvedParameters = await Promise.all(resolvedParameters);
216 let { result: object } = createService(resolvedParameters);
217 resolve(object);
218 });
219 if (!service.private)
220 this.instances[name] = resolver;
221 return resolver;
222 }
223 let { result: object, return: doReturn } = createService(resolvedParameters);
224 if (doReturn)
225 return object;
226 result = object;
227 }
228 // Shared services
229 if (!service.private) {
230 this.instances[name] = result;
231 }
232 return result;
233 }
234 _throwError(err, stack = []) {
235 if (err instanceof Error) {
236 if (!(err instanceof errors_1.ServiceNotFoundError))
237 err.message += ', Stack: ' + stack.join(' -> ') + '.';
238 throw err;
239 }
240 }
241 /**
242 * Build service by name
243 * @param name Service name
244 * @param stack Injection stack ( for debugging )
245 * @throws ServiceNotFoundError
246 * @internal
247 */
248 getService(name, stack = [], options) {
249 let service;
250 if (service = this.services[name]) {
251 try {
252 return this.resolveDefinition(service, stack, options);
253 }
254 catch (err) {
255 this._throwError(err, stack);
256 return undefined;
257 }
258 }
259 throw new errors_1.ServiceNotFoundError(name, stack);
260 }
261 _get(name, stack = [], options) {
262 if (name == undefined)
263 return undefined;
264 stack = [].concat(stack || []);
265 stack.push(name);
266 // Function
267 if (typeof name == 'function')
268 return this._invoke(name, stack, options);
269 // Cached
270 if (this.instances[name])
271 return this.instances[name];
272 // Tags
273 if (name.substr(0, 2) == '$$')
274 return this.findByTag(name.substr(2)).map(service => this._get(service.name, stack, options));
275 // Parameter
276 else if (name.substr(0, 1) == '$')
277 return this.getParameter(name.substr(1));
278 // Parameter
279 else if (this.params[name])
280 return this.params[name];
281 return this.getService(name, stack, options);
282 }
283 get(value) {
284 return this._get(value);
285 }
286 /**
287 * Build tagged services
288 * @param tag Tag
289 */
290 getByTag(tag) {
291 return this.findByTag(tag).map(definition => this._get(definition.name)).filter((service) => service != undefined);
292 }
293 getByTagAsync(tag) {
294 return Promise.all(this.findByTag(tag).map(definition => this._get(definition.name, [], { async: true })).filter((service) => service != undefined));
295 }
296 /**
297 * Get tagged services definitions
298 * @param tag Tag
299 */
300 findByTag(tag) {
301 let services = [];
302 util_1.forEach(this.services, service => {
303 if (util_1.is.Array(service.tags) && service.tags.includes(tag))
304 services.push(service);
305 });
306 return services;
307 }
308 invokeLater(context, method) {
309 let container = this;
310 let _context;
311 let _cached;
312 let _deps;
313 if (!method) {
314 let _def = this.getDefinition(context);
315 _deps = _def.parameters;
316 context = { callable: _def.service };
317 method = 'callable';
318 }
319 else {
320 _deps = this.getDefinition(decorators_1.getTarget(context)).methods[method];
321 }
322 let contextName = context && context.name || undefined;
323 let fnName = (contextName ? contextName + '.' : '') + method + 'InvokeLater';
324 return {
325 // Later invokable function
326 [fnName](...params) {
327 // Class as context
328 _context = _context || (typeof context == 'function' ? container._invoke(context) : context);
329 // Execute
330 return _context[method].apply(
331 // This
332 _context,
333 // Parameters
334 (_cached ? _cached : _cached = (_deps || []).map(dep => container._invoke(dep))).concat(params));
335 }
336 }[fnName];
337 }
338 invokeLaterAsync(context, method) {
339 let container = this;
340 let _context;
341 let _cached;
342 let _deps;
343 if (!method) {
344 let _def = this.getDefinition(context);
345 _deps = _def.parameters;
346 context = { callable: _def.service };
347 method = 'callable';
348 }
349 else {
350 _deps = this.getDefinition(decorators_1.getTarget(context)).methods[method];
351 }
352 let contextName = context && context.name || undefined;
353 let fnName = (contextName ? contextName + '.' : '') + method + 'InvokeLaterAsync';
354 return {
355 // Later invokable function
356 async [fnName](...params) {
357 // Class as context
358 _context = _context || (typeof context == 'function' ? await container._invoke(context, [], { async: true }) : context);
359 // Execute
360 return _context[method].apply(
361 // This
362 _context,
363 // Parameters
364 (_cached ? _cached : _cached = await Promise.all((_deps || []).map(dep => container._invoke(dep, [], { async: true })))).concat(params));
365 }
366 }[fnName];
367 }
368 /**
369 * Invoke a function and resolve its dependencies
370 * @param value Invokable value
371 */
372 invoke(value) {
373 return this._invoke(value);
374 }
375 invokeAsync(value) {
376 return this._invoke(value, [], {
377 async: true
378 });
379 }
380 _invoke(value, stack, options) {
381 options = Object.assign({ async: false }, options);
382 stack = stack || [];
383 // String (named service)
384 if (util_1.is.String(value))
385 return this._get(value, stack, options);
386 let _isFunction = false, _isMethod = false, _isClass = false;
387 // Function or Class
388 if ((_isClass = util_1.is.Class(value)) || (_isFunction = util_1.is.Function(value)) || (_isMethod = isMethod(value)) || util_1.is.Array(value)) {
389 let def = this.getDefinition(value);
390 stack.push(`${def.name} (${_isClass ? 'Class' : _isFunction ? 'Function' : _isMethod ? 'Method' : 'Array'})`);
391 if (!_isMethod && !util_1.is.Empty(def.name) && this.instances[def.name])
392 return this.instances[def.name];
393 return this.resolveDefinition(def, stack, options);
394 }
395 // Any other things
396 return options.async ? Promise.resolve(value) : value;
397 }
398 /**
399 * Set parameter value
400 * @param name Parameter name
401 * @param value Value
402 */
403 setParameter(name, value) {
404 this.params[name] = value;
405 return this;
406 }
407 /**
408 * Set parameters value
409 * @param params Parameters
410 */
411 setParameters(params) {
412 this.params = Object.assign(Object.assign({}, this.params), { params });
413 return this;
414 }
415 /**
416 * Set factory for a function
417 * @param type Type
418 * @param factory Factory
419 */
420 setFactory(type, factory) {
421 if (util_1.is.String(type)) {
422 this.set(type, {
423 factory
424 });
425 return this;
426 }
427 this.factories.set(type, factory);
428 delete this.instances[decorators_1.getDefinition(type).name];
429 return this;
430 }
431 /**
432 * Set alias for a type
433 * @param type Type
434 * @param alias Alias value
435 */
436 setAlias(type, alias) {
437 this.setFactory(type, function typeAlias() {
438 return alias;
439 });
440 return this;
441 }
442 /**
443 * Get overrided service definition
444 * @param type Type
445 */
446 getType(type) {
447 return this.types.get(type);
448 }
449 set(...params) {
450 if (util_1.is.Function(params[0])) {
451 this.types.set(params[0], params[1]);
452 return this;
453 }
454 // Collection of values
455 if (util_1.is.HashMap(params[0])) {
456 util_1.forEach(params[0], (value, name) => this.set(name, value));
457 return this;
458 }
459 let [name, value] = params;
460 if (isDefinition(value)) {
461 this.addDefinition(Object.assign({ private: false, tags: [] }, value, { name }));
462 }
463 else if (util_1.is.Function(value) || util_1.is.Array(value)) {
464 let def = Object.assign({}, this.getDefinition(value));
465 def.name = name;
466 this.addDefinition(def);
467 }
468 else
469 this.setParameter(name, value);
470 return this;
471 }
472 /**
473 * Get service built-in definition
474 * @param target Class/Function
475 */
476 getDefinition(target) {
477 let customDeps, def;
478 if (util_1.is.Array(target)) {
479 let { deps, func } = getDependencies(target);
480 target = func;
481 customDeps = deps;
482 }
483 if (util_1.is.Function(target)) {
484 def = decorators_1.getDefinition(target);
485 if (this.types.has(target)) {
486 def = Object.assign({}, def, this.types.get(target));
487 }
488 Container.checkInheritance(target);
489 }
490 else if (isMethod(target)) {
491 let method = target.context[target.method];
492 def = decorators_1.getDefinition(method, target.context);
493 def.service && Container.checkInheritance(def.service);
494 }
495 else if (util_1.is.String(target)) {
496 if (!this.services[target]) {
497 throw new errors_1.ServiceNotFoundError(target);
498 }
499 def = this.services[target];
500 }
501 else {
502 throw TypeError(`getDefinition only accepts function or string.`);
503 }
504 if (customDeps) {
505 def = Object.assign({}, def);
506 def.parameters = customDeps;
507 }
508 return def;
509 }
510 /**
511 * Add definition to container
512 * @param definition Definition
513 */
514 addDefinition(definition) {
515 // Defaults
516 definition = Definition(definition);
517 // Service decorated definition
518 if (definition.service && decorators_1.hasDefinition(definition.service)) {
519 definition = Object.assign(decorators_1.getDefinition(definition.service), definition);
520 }
521 // Auto-tagger defined in service
522 if (util_1.is.Array(definition.autoTags)) {
523 definition.autoTags.forEach(item => {
524 if (util_1.is.Function(item))
525 this.autoTag(item);
526 else
527 this.autoTag(item.class, item.tags);
528 });
529 }
530 // Auto tagging
531 if ((definition.tags || []).length == 0)
532 this.autoTags.forEach(tagger => {
533 definition.tags = [].concat(definition.tags || [], tagger(definition) || []);
534 });
535 delete this.instances[definition.name];
536 this.services[definition.name] = definition;
537 this.resolveImports(definition);
538 return this;
539 }
540 /**
541 * Get parameter value
542 * @param name Parameter name
543 */
544 getParameter(name) {
545 if (this.hasParameter(name))
546 return this.params[name];
547 throw Error(`Parameter ${name} not found`);
548 }
549 /**
550 * Check parameter exists
551 * @param name Parameter name
552 */
553 hasParameter(name) {
554 return Object.keys(this.params).includes(name);
555 }
556 /**
557 * Check for service definition exist
558 * @param name Service name
559 */
560 has(name) {
561 return !!this.services[name];
562 }
563 autoTag(...params) {
564 if (params[1]) {
565 this.autoTags.push(def => def.service && def.service.prototype instanceof params[0] ? params[1] : []);
566 }
567 else {
568 this.autoTags.push(params[0]);
569 }
570 return this;
571 }
572 /**
573 * Declare class or function to container
574 */
575 add(...services) {
576 services.forEach(service => {
577 let definition = this.getDefinition(service);
578 this.set(definition.name, definition);
579 });
580 return this;
581 }
582 /**
583 * Get declared definitions
584 */
585 get definitions() {
586 return this.services;
587 }
588 /**
589 * Return declared service names
590 */
591 get names() {
592 return Object.keys(this.services);
593 }
594 /**
595 * Get services count
596 */
597 get size() {
598 return Object.keys(this.services).length;
599 }
600 [Symbol.iterator]() {
601 let keys = Object.keys(this.services);
602 return {
603 next() {
604 return {
605 done: keys.length > 0,
606 value: keys.pop()
607 };
608 }
609 };
610 }
611}
612exports.Container = Container;
613/**
614 * Get injectable dependencies
615 * @param value Injectable
616 */
617function getDependencies(value) {
618 let deps = [];
619 let func;
620 if (isMethod(value)) {
621 func = value.context[value.method];
622 deps = reflect_1.getParameters(func);
623 if (Reflect.hasMetadata("design:paramtypes", value.context, value.method)) {
624 let types = Reflect.getMetadata("design:paramtypes", value.context, value.method);
625 deps = types.map(type => {
626 });
627 }
628 }
629 else if (util_1.is.Function(value)) {
630 func = value;
631 deps = value['$inject'] || (decorators_1.hasDefinition(value) && decorators_1.getDefinition(value).parameters) || (reflect_1.getParameters(value, false).filter(p => !p.hasDefault && p.name.length > 0).map(p => p.name));
632 }
633 else if (util_1.is.Array(value)) {
634 func = value[value.length - 1];
635 deps = value.slice(0, value.length - 1);
636 assert_1.ok(util_1.is.Function(func), `Last element of array must be function`);
637 }
638 else {
639 throw TypeError(`value of type ${typeof value} is not injectable`);
640 }
641 return { deps, func };
642}
643exports.getDependencies = getDependencies;
644/**
645 * Create new container definition
646 * @returns {IDefinition}
647 */
648function Definition(definition) {
649 assert_1.ok(util_1.is.String(definition.name), `Service name must be string`);
650 return definition;
651}
652exports.Definition = Definition;
653function isFactory(value) { return value instanceof Function && exports.FACTORY_REGEX.test(value.name); }
654exports.isFactory = isFactory;
655function isService(value) { return value instanceof Function && !exports.FACTORY_REGEX.test(value.name); }
656exports.isService = isService;
657function isDefinition(value) {
658 return util_1.is.HashMap(value) && ('service' in value || 'factory' in value);
659}
660exports.isDefinition = isDefinition;
661function Method(context, method) {
662 return { context, method };
663}
664exports.Method = Method;
665function isMethod(value) {
666 return typeof value == 'object' && 'context' in value && 'method' in value;
667}
668exports.isMethod = isMethod;
669const internalClasses = [Object, Function, Number, String, undefined];
670function isInternalClass(value) {
671 return internalClasses.includes(value);
672}
673exports.isInternalClass = isInternalClass;
674//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDRDQUErQztBQUMvQyxzQ0FBMEM7QUFFMUMsbUNBQTRCO0FBQzVCLDZCQUE2QjtBQUM3Qiw2Q0FBbUc7QUFDbkcscUNBQWdEO0FBR25DLFFBQUEsYUFBYSxHQUFHLFlBQVksQ0FBQztBQUM3QixRQUFBLGFBQWEsR0FBRyxZQUFZLENBQUM7QUFRMUM7OztHQUdHO0FBQ0gsTUFBYSxTQUFTO0lBZ0VsQixZQUFZLFFBQTJCLEVBQUcsVUFBeUIsRUFBRyxRQUF3QjtRQXRDOUY7O1dBRUc7UUFDSyxjQUFTLEdBQWlCLEVBQUUsQ0FBQztRQUVyQzs7V0FFRztRQUNLLFdBQU0sR0FBaUIsRUFBRSxDQUFDO1FBRWxDOztXQUVHO1FBQ0ssYUFBUSxHQUF5QixFQUFFLENBQUM7UUFFNUM7O1dBRUc7UUFDSyxhQUFRLEdBQWtCLEVBQUUsQ0FBQztRQUVyQzs7V0FFRztRQUNLLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBaUIsQ0FBQztRQUVqRDs7V0FFRztRQUNLLFVBQUssR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztRQUVyRDs7V0FFRztRQUNLLGFBQVEsR0FBVSxFQUFFLENBQUM7UUFFN0IsdUVBQXVFO1FBQ2hFLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBR3RCLElBQUssUUFBUTtZQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLElBQUssUUFBUTtZQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsSUFBSyxVQUFVO1lBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFFM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLGdCQUFnQjtZQUN6RCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUVILGdC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
\No newline at end of file