import "../core/metadata.ts"; import { defineMemberMetadata, getLatestMetadata } from "../core/metadata.ts"; import type { Token } from "../core/container.ts"; import { INJECT_TOKENS_METADATA, OPTIONAL_PARAMS_METADATA, } from "../core/container.ts"; /** * `@Inject()` overrides the injection token of a constructor parameter. */ export function Inject(token: Token): ParameterDecorator { return (target, _propertyKey, index) => { const entries = (getLatestMetadata(INJECT_TOKENS_METADATA, target) as | { index: number; token: Token }[] | undefined) ?? []; entries.push({ index, token }); defineMemberMetadata(INJECT_TOKENS_METADATA, entries, target as object); }; } /** * `@Optional()` allows a dependency to be missing. */ export function Optional(): ParameterDecorator { return (target, _propertyKey, index) => { const entries = (getLatestMetadata(OPTIONAL_PARAMS_METADATA, target) as | number[] | undefined) ?? []; entries.push(index); defineMemberMetadata(OPTIONAL_PARAMS_METADATA, entries, target as object); }; }