UNPKG

@nestjs/core

Version:

Nest - modern, fast, powerful node.js web framework (@core)

86 lines (85 loc) 3.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ModuleRef = void 0; const common_1 = require("@nestjs/common"); const invalid_class_scope_exception_1 = require("../errors/exceptions/invalid-class-scope.exception"); const unknown_element_exception_1 = require("../errors/exceptions/unknown-element.exception"); const get_class_scope_1 = require("../helpers/get-class-scope"); const injector_1 = require("./injector"); const instance_links_host_1 = require("./instance-links-host"); const instance_wrapper_1 = require("./instance-wrapper"); class ModuleRef { constructor(container) { this.container = container; this.injector = new injector_1.Injector(); } get instanceLinksHost() { if (!this._instanceLinksHost) { this._instanceLinksHost = new instance_links_host_1.InstanceLinksHost(this.container); } return this._instanceLinksHost; } introspect(token) { const { wrapperRef } = this.instanceLinksHost.get(token); let scope = common_1.Scope.DEFAULT; if (!wrapperRef.isDependencyTreeStatic()) { scope = common_1.Scope.REQUEST; } else if (wrapperRef.isTransient) { scope = common_1.Scope.TRANSIENT; } return { scope }; } registerRequestByContextId(request, contextId) { this.container.registerRequestProvider(request, contextId); } find(typeOrToken, contextModule) { const moduleId = contextModule && contextModule.id; const { wrapperRef } = this.instanceLinksHost.get(typeOrToken, moduleId); if (wrapperRef.scope === common_1.Scope.REQUEST || wrapperRef.scope === common_1.Scope.TRANSIENT) { throw new invalid_class_scope_exception_1.InvalidClassScopeException(typeOrToken); } return wrapperRef.instance; } async resolvePerContext(typeOrToken, contextModule, contextId, options) { const isStrictModeEnabled = options && options.strict; const instanceLink = isStrictModeEnabled ? this.instanceLinksHost.get(typeOrToken, contextModule.id) : this.instanceLinksHost.get(typeOrToken); const { wrapperRef, collection } = instanceLink; if (wrapperRef.isDependencyTreeStatic() && !wrapperRef.isTransient) { return this.get(typeOrToken, options); } const ctorHost = wrapperRef.instance || { constructor: typeOrToken }; const instance = await this.injector.loadPerContext(ctorHost, wrapperRef.host, collection, contextId, wrapperRef); if (!instance) { throw new unknown_element_exception_1.UnknownElementException(); } return instance; } async instantiateClass(type, moduleRef) { const wrapper = new instance_wrapper_1.InstanceWrapper({ name: type && type.name, metatype: type, isResolved: false, scope: (0, get_class_scope_1.getClassScope)(type), host: moduleRef, }); return new Promise(async (resolve, reject) => { try { const callback = async (instances) => { const properties = await this.injector.resolveProperties(wrapper, moduleRef); const instance = new type(...instances); this.injector.applyProperties(instance, properties); resolve(instance); }; await this.injector.resolveConstructorParams(wrapper, moduleRef, undefined, callback); } catch (err) { reject(err); } }); } } exports.ModuleRef = ModuleRef;