muddle/decorators/Inject.ts
2026-10-23 08:53:07 -04:00

35 lines
1 KiB
TypeScript

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);
};
}