35 lines
1 KiB
TypeScript
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);
|
|
};
|
|
}
|