dino-core
Version:
A dependency injection framework for NodeJS applications
143 lines • 6.34 kB
JavaScript
;
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