@joist/di
Version:
Dependency Injection for Vanilla JS classes
40 lines (29 loc) • 801 B
text/typescript
import type { Injector } from "./injector.js";
export type ProviderFactory<T> = (injector: Injector) => T;
export class StaticToken<T> {
#name: string;
#factory?: ProviderFactory<T>;
[Symbol.metadata] = null;
get name(): string {
return this.#name;
}
get factory(): ProviderFactory<T> | undefined {
return this.#factory;
}
constructor(name: string, factory?: ProviderFactory<T>) {
this.#name = name;
this.#factory = factory;
}
}
export interface ConstructableToken<T> {
new (...args: any[]): T;
}
export type InjectionToken<T> = ConstructableToken<T> | StaticToken<T>;
export type ProviderDef<T> =
| {
use: ConstructableToken<T>;
}
| {
factory: ProviderFactory<T>;
};
export type Provider<T> = [InjectionToken<T>, ProviderDef<T>];