@difizen/mana-syringe
Version:
34 lines • 1.13 kB
JavaScript
import { Syringe } from "../core";
import { transient } from "../decorator";
import { registerSideOption } from "../side-option";
export var AutoFactoryOption = Syringe.defineToken('AutoFactoryOption');
export var AutoFactoryMeta = Syringe.defineToken('AutoFactoryMeta', {
multiple: false
});
export function autoFactory() {
return function (target) {
var AutoFactoryToken = Symbol();
Reflect.defineMetadata(AutoFactoryMeta, AutoFactoryToken, target);
transient()(target);
registerSideOption({
token: AutoFactoryToken,
useFactory: function useFactory(ctx) {
return function (option) {
var child = ctx.container.createChild();
child.register({
token: AutoFactoryOption,
useValue: option
});
return child.get(target);
};
}
}, target);
};
}
export var toAutoFactory = function toAutoFactory(target) {
var factoryToken = Reflect.getOwnMetadata(AutoFactoryMeta, target);
if (!factoryToken) {
throw new Error("Cannot find factory token for ".concat(target.constructor.name));
}
return factoryToken;
};