diff --git a/src/decorators/Register.ts b/src/decorators/Register.ts index fa65076..5852081 100644 --- a/src/decorators/Register.ts +++ b/src/decorators/Register.ts @@ -1,14 +1,14 @@ +import { IdentifierRequiredError } from 'src/interfaces/Exceptions'; import { TSinjex } from '../classes/TSinjex'; import { Identifier } from '../types/Identifier'; /** * A decorator to register a class in the **TSinjex** DI (Dependency Injection) container. * @template TargetType The type of the class to be registered. - * @param identifier The identifier used to register the class in the DI container. - * @see {@link Identifier} for more information on identifiers. - * @param deprecated If true, the dependency is deprecated and a warning - * is logged only once upon the first resolution of the dependency. + * @param identifier The {@link Identifier|identifier} used to register the class in the DI container or the class name if not provided. + * @param deprecated If true, the dependency is deprecated and a warning is logged only once upon the first resolution of the dependency. * @returns The decorator function to be applied on the class. + * @throws An {@link IdentifierRequiredError} if the identifier is not provided and the class name is not available. * @example * ```ts * \@Register('MyClassIdentifier') @@ -19,12 +19,16 @@ import { Identifier } from '../types/Identifier'; */ export function Register< TargetType extends new (...args: unknown[]) => InstanceType, ->(identifier: Identifier, deprecated?: boolean) { - return function (constructor: TargetType, ...args: unknown[]): void { - // Get the instance of the DI container - const diContainer = TSinjex.getInstance(); +>(identifier?: Identifier, deprecated?: boolean) { + return function ( + constructor: TargetType, + context: ClassDecoratorContext, + ) { + const _identifier = identifier ?? context.name; - // Register the class in the DI container - diContainer.register(identifier, constructor, deprecated); + if (_identifier == null) throw new IdentifierRequiredError(); + + const diContainer = TSinjex.getInstance(); + diContainer.register(_identifier, constructor, deprecated); }; }