@inversifyjs/core
Version:
InversifyJs core package
75 lines • 4.35 kB
JavaScript
import { updateOwnReflectMetadata } from '@inversifyjs/reflect-metadata-utils';
import { InversifyCoreError } from '../../error/models/InversifyCoreError.js';
import { InversifyCoreErrorKind } from '../../error/models/InversifyCoreErrorKind.js';
import { classMetadataReflectKey } from '../../reflectMetadata/data/classMetadataReflectKey.js';
import { updateMaybeClassMetadataConstructorArgument } from '../actions/updateMaybeClassMetadataConstructorArgument.js';
import { updateMaybeClassMetadataProperty } from '../actions/updateMaybeClassMetadataProperty.js';
import { getDefaultClassMetadata } from '../calculations/getDefaultClassMetadata.js';
import { handleInjectionError } from '../calculations/handleInjectionError.js';
export function injectBase(updateMetadata, updatePendingClassMetadataCount) {
const decorator = (target, propertyKey, parameterIndexOrDescriptor) => {
try {
if (parameterIndexOrDescriptor === undefined) {
injectProperty(updateMetadata, updatePendingClassMetadataCount)(target, propertyKey);
}
else {
if (typeof parameterIndexOrDescriptor === 'number') {
injectParameter(updateMetadata, updatePendingClassMetadataCount)(target, propertyKey, parameterIndexOrDescriptor);
}
else {
injectMethod(updateMetadata, updatePendingClassMetadataCount)(target, propertyKey, parameterIndexOrDescriptor);
}
}
}
catch (error) {
handleInjectionError(target, propertyKey, parameterIndexOrDescriptor, error);
}
};
return decorator;
}
function buildComposedUpdateMetadata(updateMetadata, updatePendingClassMetadataCount) {
return (target) => {
const updateTargetPendingClassMetadataCount = updatePendingClassMetadataCount(target);
return (metadata) => {
updateTargetPendingClassMetadataCount(metadata);
return updateMetadata(metadata);
};
};
}
function injectMethod(updateMetadata, updatePendingClassMetadataCount) {
const buildComposedUpdateMetadataFromTarget = buildComposedUpdateMetadata(updateMetadata, updatePendingClassMetadataCount);
return (target, propertyKey, descriptor) => {
if (isPropertySetter(descriptor)) {
updateOwnReflectMetadata(target.constructor, classMetadataReflectKey, getDefaultClassMetadata, updateMaybeClassMetadataProperty(buildComposedUpdateMetadataFromTarget(target), propertyKey));
}
else {
throw new InversifyCoreError(InversifyCoreErrorKind.injectionDecoratorConflict, `Found an @inject decorator in a non setter property method.
Found @inject decorator at method "${propertyKey.toString()}" at class "${target.constructor.name}"`);
}
};
}
function injectParameter(updateMetadata, updatePendingClassMetadataCount) {
const buildComposedUpdateMetadataFromTarget = buildComposedUpdateMetadata(updateMetadata, updatePendingClassMetadataCount);
return (target, propertyKey, parameterIndex) => {
if (isConstructorParameter(target, propertyKey)) {
updateOwnReflectMetadata(target, classMetadataReflectKey, getDefaultClassMetadata, updateMaybeClassMetadataConstructorArgument(buildComposedUpdateMetadataFromTarget(target), parameterIndex));
}
else {
throw new InversifyCoreError(InversifyCoreErrorKind.injectionDecoratorConflict, `Found an @inject decorator in a non constructor parameter.
Found @inject decorator at method "${propertyKey?.toString() ?? ''}" at class "${target.constructor.name}"`);
}
};
}
function injectProperty(updateMetadata, updatePendingClassMetadataCount) {
const buildComposedUpdateMetadataFromTarget = buildComposedUpdateMetadata(updateMetadata, updatePendingClassMetadataCount);
return (target, propertyKey) => {
updateOwnReflectMetadata(target.constructor, classMetadataReflectKey, getDefaultClassMetadata, updateMaybeClassMetadataProperty(buildComposedUpdateMetadataFromTarget(target), propertyKey));
};
}
function isConstructorParameter(target, propertyKey) {
return typeof target === 'function' && propertyKey === undefined;
}
function isPropertySetter(descriptor) {
return descriptor.set !== undefined;
}
//# sourceMappingURL=injectBase.js.map