UNPKG

@inversifyjs/core

Version:

InversifyJs core package

75 lines 4.35 kB
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