@nivinjoseph/n-ject
Version:
IOC container
28 lines (20 loc) • 919 B
text/typescript
import { given } from "@nivinjoseph/n-defensive";
import { ClassDefinition } from "@nivinjoseph/n-util";
//@ts-expect-error polyfill to use metadata object
Symbol.metadata ??= Symbol("Symbol.metadata");
export const injectionsKey = Symbol.for("@nivinjoseph/n-ject/inject");
export function inject<This extends ClassDefinition<any>>(...dependencies: [string, ...Array<string>]): InjectClassDecorator<This>
{
const decorator: InjectClassDecorator<This> = (_, context) =>
{
given(context, "context")
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
.ensure(t => t.kind === "class", "inject should only be used on classes");
context.metadata[injectionsKey] = dependencies;
};
return decorator;
}
export type InjectClassDecorator<This extends ClassDefinition<any>> = (
value: This,
context: ClassDecoratorContext<This>
) => void;