1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const unknown_element_exception_1 = require("../errors/exceptions/unknown-element.exception");
|
4 | const container_scanner_1 = require("./container-scanner");
|
5 | const injector_1 = require("./injector");
|
6 | const instance_wrapper_1 = require("./instance-wrapper");
|
7 | class ModuleRef {
|
8 | constructor(container) {
|
9 | this.container = container;
|
10 | this.injector = new injector_1.Injector();
|
11 | this.containerScanner = new container_scanner_1.ContainerScanner(container);
|
12 | }
|
13 | find(typeOrToken) {
|
14 | return this.containerScanner.find(typeOrToken);
|
15 | }
|
16 | async instantiateClass(type, moduleRef) {
|
17 | const wrapper = new instance_wrapper_1.InstanceWrapper({
|
18 | name: type && type.name,
|
19 | metatype: type,
|
20 | instance: undefined,
|
21 | isResolved: false,
|
22 | host: moduleRef,
|
23 | });
|
24 | return new Promise(async (resolve, reject) => {
|
25 | try {
|
26 | const callback = async (instances) => {
|
27 | const properties = await this.injector.resolveProperties(wrapper, moduleRef);
|
28 | const instance = new type(...instances);
|
29 | this.injector.applyProperties(instance, properties);
|
30 | resolve(instance);
|
31 | };
|
32 | await this.injector.resolveConstructorParams(wrapper, moduleRef, undefined, callback);
|
33 | }
|
34 | catch (err) {
|
35 | reject(err);
|
36 | }
|
37 | });
|
38 | }
|
39 | findInstanceByToken(metatypeOrToken, contextModule) {
|
40 | return this.containerScanner.findInstanceByToken(metatypeOrToken, contextModule);
|
41 | }
|
42 | async resolvePerContext(typeOrToken, contextModule, contextId, options) {
|
43 | let wrapper, collection;
|
44 | if (!(options && options.strict)) {
|
45 | [wrapper, collection] = this.containerScanner.getWrapperCollectionPair(typeOrToken);
|
46 | }
|
47 | else {
|
48 | [
|
49 | wrapper,
|
50 | collection,
|
51 | ] = this.containerScanner.getWrapperCollectionPairByHost(typeOrToken, contextModule);
|
52 | }
|
53 | const instance = await this.injector.loadPerContext(wrapper.instance, wrapper.host, collection, contextId, wrapper);
|
54 | if (!instance) {
|
55 | throw new unknown_element_exception_1.UnknownElementException();
|
56 | }
|
57 | return instance;
|
58 | }
|
59 | }
|
60 | exports.ModuleRef = ModuleRef;
|