UNPKG

@tsclean/core

Version:

Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.

95 lines 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ApplicationContext = void 0; const errors_1 = require("../errors"); const helpers_1 = require("../helpers"); const core_1 = require("../core"); const services_1 = require("../services"); class ApplicationContext extends core_1.AbstractInstanceResolver { get instanceLinksHost() { if (!this._instanceLinksHost) { this._instanceLinksHost = new core_1.InstanceLinksHost(this.container); } return this._instanceLinksHost; } constructor(container, appOptions = {}, scope = new Array(), contextModule = null) { super(); this.container = container; this.appOptions = appOptions; this.scope = scope; this.contextModule = contextModule; this.isInitialized = false; this.logger = new services_1.Logger(ApplicationContext.name, { timestamp: true }); this.shouldFlushLogsOnOverride = false; this.moduleCompiler = new core_1.ModuleCompiler(); this.injector = new core_1.Injector(); if (this.appOptions.preview) { this.printInPreviewModeWarning(); } } selectContextModule() { const modules = this.container.getModules().values(); this.contextModule = modules.next().value; } select(moduleType) { const modulesContainer = this.container.getModules(); const contextModuleCtor = this.contextModule.metaType; const scope = this.scope.concat(contextModuleCtor); const moduleTokenFactory = this.container.getModuleTokenFactory(); const { type, dynamicMetadata } = this.moduleCompiler.extractMetadata(moduleType); const token = moduleTokenFactory.create(type, dynamicMetadata); const selectedModule = modulesContainer.get(token); if (!selectedModule) throw new errors_1.UnknownModuleException(); return new ApplicationContext(this.container, this.appOptions, scope, selectedModule); } get(typeOrToken, options = { strict: false }) { var _a; return !(options && options.strict) ? this.find(typeOrToken, options) : this.find(typeOrToken, { moduleId: (_a = this.contextModule) === null || _a === void 0 ? void 0 : _a.id, each: options.each }); } resolve(typeOrToken, contextId = (0, helpers_1.createContextId)(), options = { strict: false }) { return this.resolvePerContext(typeOrToken, this.contextModule, contextId, options); } registerRequestByContextId(request, contextId) { this.container.registerRequestProvider(request, contextId); } async init() { if (this.isInitialized) return this; this.isInitialized = true; return this; } async close() { await this.dispose(); } useLogger(logger) { services_1.Logger.overrideLogger(logger); if (this.shouldFlushLogsOnOverride) { this.flushLogs(); } } flushLogs() { services_1.Logger.flush(); } flushLogsOnOverride() { this.shouldFlushLogsOnOverride = true; } async dispose() { return Promise.resolve(); } printInPreviewModeWarning() { this.logger.warn('------------------------------------------------'); this.logger.warn('Application is running in the PREVIEW mode!'); this.logger.warn('Providers/controllers will not be instantiated.'); this.logger.warn('------------------------------------------------'); } } exports.ApplicationContext = ApplicationContext; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvYXBwbGljYXRpb24tY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBa0Q7QUFDbEQsd0NBQTRDO0FBQzVDLGtDQVFnQjtBQVNoQiwwQ0FBNkQ7QUFFN0QsTUFBYSxrQkFHWCxTQUFRLCtCQUF3QjtJQWFoQyxJQUFJLGlCQUFpQjtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksd0JBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2pFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsWUFDcUIsU0FBdUIsRUFDdkIsYUFBdUIsRUFBYyxFQUN2QyxRQUFRLElBQUksS0FBSyxFQUFhLEVBQ3ZDLGdCQUF3QixJQUFJO1FBRXBDLEtBQUssRUFBRSxDQUFBO1FBTFksY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixlQUFVLEdBQVYsVUFBVSxDQUEyQjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUF5QjtRQUN2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXJCNUIsa0JBQWEsR0FBRyxLQUFLLENBQUE7UUFFWixXQUFNLEdBQUcsSUFBSSxpQkFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRTtZQUM5RCxTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUE7UUFFTSw4QkFBeUIsR0FBRyxLQUFLLENBQUE7UUFDeEIsbUJBQWMsR0FBRyxJQUFJLHFCQUFjLEVBQUUsQ0FBQTtRQWlCcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQVEsRUFBRSxDQUFBO1FBRTlCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMs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UUFDZCxpQkFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2hCLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQTtJQUN2QyxDQUFDO0lBRVMsS0FBSyxDQUFDLE9BQU87UUFDckIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVPLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO1FBQ3BFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQTtRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO0lBQ3RFLENBQUM7Q0FDRjtBQWxJRCxnREFrSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVbmtub3duTW9kdWxlRXhjZXB0aW9uIH0gZnJvbSAnLi4vZXJyb3JzJ1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dElkIH0gZnJvbSAnLi4vaGVscGVycydcbmltcG9ydCB7XG4gIE1vZHVsZUNvbXBpbGVyLFxuICBDb250YWluZXJJb0MsXG4gIEluamVjdG9yLFxuICBJbnN0YW5jZUxpbmtzSG9zdCxcbiAgQ29udGV4dElkLFxuICBNb2R1bGUsXG4gIEFic3RyYWN0SW5zdGFuY2VSZXNvbHZlclxufSBmcm9tICcuLi9jb3JlJ1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RJbnRlcmZhY2UsXG4gIER5bmFtaWNNb2R1bGVJbnRlcmZhY2UsXG4gIEFwcGxpY2F0aW9uQ29udGV4dEludGVyZmFjZSxcbiAgVHlwZSxcbiAgQXBwbGljYXRpb25Db250ZXh0T3B0aW9uc0ludGVyZmFjZSxcbiAgR2V0T3JSZXNvbHZlT3B0aW9uc1xufSBmcm9tICcuLi9jb250cmFjdHMnXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlclNlcnZpY2UsIExvZ0xldmVsIH0gZnJvbSAnLi4vc2VydmljZXMnXG5cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkNvbnRleHQ8XG4gICAgVE9wdGlvbnMgZXh0ZW5kcyBBcHBsaWNhdGlvbkNvbnRleHRPcHRpb25zSW50ZXJmYWNlID0gQXBwbGljYXRpb25Db250ZXh0T3B0aW9uc0ludGVyZmFjZVxuICA+XG4gIGV4dGVuZHMgQWJzdHJhY3RJbnN0YW5jZVJlc29sdmVyXG4gIGltcGxlbWVudHMgQXBwbGljYXRpb25Db250ZXh0SW50ZXJmYWNlXG57XG4gIHByb3RlY3RlZCBpc0luaXRpYWxpemVkID0gZmFsc2VcbiAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihBcHBsaWNhdGlvbkNvbnRleHQubmFtZSwge1xuICAgIHRpbWVzdGFtcDogdHJ1ZVxuICB9KVxuXG4gIHByaXZhdGUgc2hvdWxkRmx1c2hMb2dzT25PdmVycmlkZSA9IGZhbHNlXG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlQ29tcGlsZXIgPSBuZXcgTW9kdWxlQ29tcGlsZXIoKVxuICBwcml2YXRlIF9pbnN0YW5jZUxpbmtzSG9zdDogSW5zdGFuY2VMaW5rc0hvc3RcblxuICBnZXQgaW5zdGFuY2VMaW5rc0hvc3QgKCkge1xuICAgIGlmICghdGhpcy5faW5zdGFuY2VMaW5rc0hvc3QpIHtcbiAgICAgIHRoaXMuX2luc3RhbmNlTGlua3NIb3N0ID0gbmV3IEluc3RhbmNlTGlua3NIb3N0KHRoaXMuY29udGFpbmVyKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2VMaW5rc0hvc3RcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29udGFpbmVyOiBDb250YWluZXJJb0MsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcE9wdGlvbnM6IFRPcHRpb25zID0ge30gYXMgVE9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY29wZSA9IG5ldyBBcnJheTxUeXBlPGFueT4+KCksXG4gICAgcHJpdmF0ZSBjb250ZXh0TW9kdWxlOiBNb2R1bGUgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKClcbiAgICB0aGlzLmluamVjdG9yID0gbmV3IEluamVjdG9yKClcblxuICAgIGlmICh0aGlzLmFwcE9wdGlvbnMucHJldmlldykge1xuICAgICAgdGhpcy5wcmludEluUHJldmlld01vZGVXYXJuaW5nKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q29udGV4dE1vZHVsZSAoKSB7XG4gICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuY29udGFpbmVyLmdldE1vZHVsZXMoKS52YWx1ZXMoKVxuICAgIHRoaXMuY29udGV4dE1vZHVsZSA9IG1vZHVsZXMubmV4dCgpLnZhbHVlXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0PFQ+IChcbiAgICBtb2R1bGVUeXBlOiBUeXBlPFQ+IHwgRHluYW1pY01vZHVsZUludGVyZmFjZVxuICApOiBBcHBsaWNhdGlvbkNvbnRleHRJbnRlcmZhY2Uge1xuICAgIGNvbnN0IG1vZHVsZXNDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5nZXRNb2R1bGVzKClcbiAgICBjb25zdCBjb250ZXh0TW9kdWxlQ3RvciA9IHRoaXMuY29udGV4dE1vZHVsZS5tZXRhVHlwZVxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5zY29wZS5jb25jYXQoY29udGV4dE1vZHVsZUN0b3IpXG5cbiAgICBjb25zdCBtb2R1bGVUb2tlbkZhY3RvcnkgPSB0aGlzLmNvbnRhaW5lci5nZXRNb2R1bGVUb2tlbkZhY3RvcnkoKVxuICAgIGNvbnN0IHsgdHlwZSwgZHluYW1pY01ldGFkYXRhIH0gPVxuICAgICAgdGhpcy5tb2R1bGVDb21waWxlci5leHRyYWN0TWV0YWRhdGEobW9kdWxlVHlwZSlcbiAgICBjb25zdCB0b2tlbiA9IG1vZHVsZVRva2VuRmFjdG9yeS5jcmVhdGUodHlwZSwgZHluYW1pY01ldGFkYXRhKVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRNb2R1bGUgPSBtb2R1bGVzQ29udGFpbmVyLmdldCh0b2tlbilcbiAgICBpZiAoIXNlbGVjdGVkTW9kdWxlKSB0aHJvdyBuZXcgVW5rbm93bk1vZHVsZUV4Y2VwdGlvbigpXG5cbiAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuY29udGFpbmVyLFxuICAgICAgdGhpcy5hcHBPcHRpb25zLFxuICAgICAgc2NvcGUsXG4gICAgICBzZWxlY3RlZE1vZHVsZVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8VCA9IGFueSwgUiA9IFQ+IChcbiAgICB0eXBlT3JUb2tlbjogVHlwZTxUPiB8IEFic3RyYWN0SW50ZXJmYWNlPFQ+IHwgc3RyaW5nIHwgc3ltYm9sLFxuICAgIG9wdGlvbnM6IEdldE9yUmVzb2x2ZU9wdGlvbnMgPSB7IHN0cmljdDogZmFsc2UgfVxuICApOiBSIHwgQXJyYXk8Uj4ge1xuICAgIHJldHVybiAhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpY3QpXG4gICAgICA/IHRoaXMuZmluZDxULCBSPih0eXBlT3JUb2tlbiwgb3B0aW9ucylcbiAgICAgIDogdGhpcy5maW5kPFQsIFI+KHR5cGVPclRva2VuLCB7XG4gICAgICAgICAgbW9kdWxlSWQ6IHRoaXMuY29udGV4dE1vZHVsZT8uaWQsXG4gICAgICAgICAgZWFjaDogb3B0aW9ucy5lYWNoXG4gICAgICAgIH0pXG4gIH1cblxuICBwdWJsaWMgcmVzb2x2ZTxUID0gYW55LCBSID0gVD4gKFxuICAgIHR5cGVPclRva2VuOiBUeXBlPFQ+IHwgQWJzdHJhY3RJbnRlcmZhY2U8VD4gfCBzdHJpbmcgfCBzeW1ib2wsXG4gICAgY29udGV4dElkID0gY3JlYXRlQ29udGV4dElkKCksXG4gICAgb3B0aW9uczogR2V0T3JSZXNvbHZlT3B0aW9ucyA9IHsgc3RyaWN0OiBmYWxzZSB9XG4gICk6IFByb21pc2U8UiB8IEFycmF5PFI+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVBlckNvbnRleHQ8VCwgUj4oXG4gICAgICB0eXBlT3JUb2tlbixcbiAgICAgIHRoaXMuY29udGV4dE1vZHVsZSxcbiAgICAgIGNvbnRleHRJZCxcbiAgICAgIG9wdGlvbnNcbiAgICApXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJSZXF1ZXN0QnlDb250ZXh0SWQ8VCA9IGFueT4gKHJlcXVlc3Q6IFQsIGNvbnRleHRJZDogQ29udGV4dElkKSB7XG4gICAgdGhpcy5jb250YWluZXIucmVnaXN0ZXJSZXF1ZXN0UHJvdmlkZXIocmVxdWVzdCwgY29udGV4dElkKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dGhpcz4ge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHJldHVybiB0aGlzXG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbG9zZSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlKClcbiAgfVxuXG4gIHB1YmxpYyB1c2VMb2dnZXIgKGxvZ2dlcjogTG9nZ2VyU2VydmljZSB8IExvZ0xldmVsW10gfCBmYWxzZSkge1xuICAgIExvZ2dlci5vdmVycmlkZUxvZ2dlcihsb2dnZXIpXG4gICAgaWYgKHRoaXMuc2hvdWxkRmx1c2hMb2dzT25PdmVycmlkZSkge1xuICAgICAgdGhpcy5mbHVzaExvZ3MoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmbHVzaExvZ3MgKCkge1xuICAgIExvZ2dlci5mbHVzaCgpXG4gIH1cblxuICBwdWJsaWMgZmx1c2hMb2dzT25PdmVycmlkZSAoKSB7XG4gICAgdGhpcy5zaG91bGRGbHVzaExvZ3NPbk92ZXJyaWRlID0gdHJ1ZVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRpc3Bvc2UgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICB9XG5cbiAgcHJpdmF0ZSBwcmludEluUHJldmlld01vZGVXYXJuaW5nICgpIHtcbiAgICB0aGlzLmxvZ2dlci53YXJuKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKVxuICAgIHRoaXMubG9nZ2VyLndhcm4oJ0FwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gdGhlIFBSRVZJRVcgbW9kZSEnKVxuICAgIHRoaXMubG9nZ2VyLndhcm4oJ1Byb3ZpZGVycy9jb250cm9sbGVycyB3aWxsIG5vdCBiZSBpbnN0YW50aWF0ZWQuJylcbiAgICB0aGlzLmxvZ2dlci53YXJuKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKVxuICB9XG59XG4iXX0=