UNPKG

dino-core

Version:

A dependency injection framework for NodeJS applications

143 lines 6.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AsConfiguration = exports.AsRepository = exports.AsService = exports.AsComponent = exports.AsInjectable = exports.As = exports.getInjectableDependencies = exports.InjectFromParameter = exports.InjectFromConstructor = void 0; require("reflect-metadata"); const DependencyExtractor_1 = require("../../DependencyExtractor"); const MissingDependencyException_1 = require("../../exceptions/MissingDependencyException"); const Logger_1 = require("../../Logger"); const cache_context_1 = require("../cache/cache.context"); const stereotype_proxy_handler_factory_1 = require("../stereotype.proxy.handler.factory"); const dependencyMap = new Map(); const dependencyExtractor = new DependencyExtractor_1.DependencyExtractor(); const stereotypeProxyHandlerFactory = stereotype_proxy_handler_factory_1.StereotypeProxyHandlerFactory.getInstance(); const getName = (target) => { return target.name ?? target.constructor?.name; }; const InjectFromConstructor = (dependencies) => { return function (target) { const className = getName(target); if (className !== undefined) { dependencyMap.set(className, dependencies); } }; }; exports.InjectFromConstructor = InjectFromConstructor; const InjectFromParameter = function () { return function (target, propertyName) { const className = getName(target); if (className !== undefined) { let dependencies = dependencyMap.get(className); if (dependencies === undefined) { dependencies = []; dependencyMap.set(className, dependencies); } dependencies.push(propertyName); } }; }; exports.InjectFromParameter = InjectFromParameter; const getInjectableDependencies = function (target) { const dependencies = dependencyExtractor.extractDependenciesFor(target); const className = getName(target); if (className !== undefined) { dependencies.push(...(dependencyMap.get(className) ?? [])); } Logger_1.Logger.debug(`Found ${dependencies.join(', ')} injectable dependencies for ${className}`); return Array.from(new Set(dependencies).values()); }; exports.getInjectableDependencies = getInjectableDependencies; const As = function (typeName = 'Injectable', lazy = false, dependencies = [], profile, cacheConfig) { return function (target) { const Injectable = class extends target { constructor(...args) { // eslint-disable-next-line @typescript-eslint/no-unsafe-argument super(...args); const injectableDependencies = [].concat(...dependencies).concat(...(0, exports.getInjectableDependencies)(this)); for (let index = 0; index < injectableDependencies.length; index++) { const dependency = dependencies[index]; if (dependency === undefined) { return; } const resolvedDependency = arguments[0] !== undefined ? arguments[0][dependency] : undefined; if (resolvedDependency !== undefined) { Object.defineProperty(this, dependency, { value: resolvedDependency, writable: false, enumerable: true, configurable: true }); } else { throw MissingDependencyException_1.MissingDependencyException.create(dependency, this.constructor.name); } } return new Proxy(this, stereotypeProxyHandlerFactory.getProxyFor(typeName)); } getTypeName() { return typeName; } lazy() { return lazy; } profile() { return profile; } // dependsOn(): string[] { // return dependencies // } cacheable() { if (cacheConfig !== undefined) { return cache_context_1.CacheContext.create(cacheConfig.key, cacheConfig.excludedMethods, cacheConfig.opts); } return null; } }; Object.defineProperty(Injectable, 'name', { value: target.name, writable: false }); if (dependencies.length > 0) { (0, exports.InjectFromConstructor)(dependencies)(Injectable); } return Injectable; }; }; exports.As = As; const AsInjectable = function (config) { return function (target) { const lazy = config?.lazy ?? false; const dependencies = config?.dependencies ?? []; return (0, exports.As)('Injectable', lazy, dependencies, config?.profile, config?.cacheConfig)(target); }; }; exports.AsInjectable = AsInjectable; const AsComponent = function (config) { return function (target) { const lazy = config?.lazy ?? false; const dependencies = config?.dependencies ?? []; return (0, exports.As)('Component', lazy, dependencies, config?.profile, config?.cacheConfig)(target); }; }; exports.AsComponent = AsComponent; const AsService = function (config) { return function (target) { const lazy = config?.lazy ?? false; const dependencies = config?.dependencies ?? []; return (0, exports.As)('Service', lazy, dependencies, config?.profile, config?.cacheConfig)(target); }; }; exports.AsService = AsService; const AsRepository = function (config) { return function (target) { const lazy = config?.lazy ?? false; const dependencies = config?.dependencies ?? []; return (0, exports.As)('Repository', lazy, dependencies, config?.profile, config?.cacheConfig)(target); }; }; exports.AsRepository = AsRepository; const AsConfiguration = function (config) { return function (target) { const lazy = config?.lazy ?? false; const dependencies = config?.dependencies ?? []; return (0, exports.As)('Configuration', lazy, dependencies, config?.profile, config?.cacheConfig)(target); }; }; exports.AsConfiguration = AsConfiguration; //# sourceMappingURL=Inject.js.map