@furystack/inject
Version:
Core FuryStack package
43 lines • 1.68 kB
JavaScript
import { hasInjectableOptions } from './injectable.js';
import { getInjectorReference } from './with-injector-reference.js';
export const InjectableDependencyList = Symbol('InjectableDependencyList');
export const getDependencyList = (ctor) => {
const existing = ctor[InjectableDependencyList];
if (existing && existing instanceof Set) {
return existing;
}
const newSet = new Set();
Object.assign(ctor, { [InjectableDependencyList]: newSet });
return newSet;
};
const addDependency = (ctor, dependency) => {
const list = getDependencyList(ctor);
list.add(dependency);
};
export const Injected = (injectable) => (target, propertyKey) => {
const hasMeta = hasInjectableOptions(injectable);
// The provided injectable is a constructor
if (hasMeta) {
addDependency(target.constructor, injectable);
Object.defineProperty(target.constructor.prototype, propertyKey, {
set() {
throw new Error(`Injected property '${target.constructor.name}.${propertyKey.toString()}' is read-only`);
},
get() {
return getInjectorReference(this).getInstance(injectable);
},
});
}
else {
// The provided injectable is a getter function
Object.defineProperty(target.constructor.prototype, propertyKey, {
set() {
throw new Error(`Injected property '${target.constructor.name}.${propertyKey.toString()}' is read-only`);
},
get() {
return injectable.call(this, getInjectorReference(this));
},
});
}
};
//# sourceMappingURL=injected.js.map