njct
Version:
Inject a dependency
37 lines (34 loc) • 907 B
JavaScript
import isClass from 'node-is-class';
import { once } from '@zodash/once';
const dependencies = /* @__PURE__ */ new Map();
function provide(token, mock) {
dependencies.set(token, mock);
}
function provideClass(token, ctor) {
dependencies.set(token, once(() => new ctor()));
}
function clear() {
dependencies.clear();
}
function inject() {
const { 0: token, 1: factory, length } = arguments;
if (!dependencies.has(token)) {
if (typeof factory === "function") {
return factory();
}
if (isClass(token)) {
dependencies.set(token, once(() => new token()));
} else if (length === 1) {
throw new Error(`Cannot resolve ${token} dependency`);
} else if (Object(factory) !== factory) {
dependencies.set(token, () => factory);
}
}
return dependencies.get(token)?.();
}
const injector = {
provideClass,
provide,
clear
};
export { inject, injector };