@launchtray/tsyringe-async
Version:
Lightweight dependency injection container for JavaScript/TypeScript, with asynchronous resolution
43 lines (42 loc) • 1.69 kB
JavaScript
import { __awaiter } from "tslib";
import { resolveParams } from "../resolve-params";
const initializersKey = Symbol("initializers");
const initializationPromiseKey = Symbol("initializationPromise");
function initializer() {
return function (target, propertyKey, descriptor) {
const originalMethod = descriptor.value;
if (target[initializersKey] == null) {
target[initializersKey] = [];
}
target[initializersKey].push(function (container, object) {
return __awaiter(this, void 0, void 0, function* () {
const args = yield resolveParams(container, target, propertyKey);
yield originalMethod.apply(object, args);
});
});
};
}
function createInitializationPromise(container, object) {
return __awaiter(this, void 0, void 0, function* () {
const initializers = object.constructor.prototype[initializersKey];
if (initializers != null) {
for (const initializer of initializers) {
yield initializer(container, object);
}
}
});
}
export function callInitializers(container, object) {
return __awaiter(this, void 0, void 0, function* () {
if (object != null &&
object.constructor != null &&
object.constructor.prototype != null &&
object.constructor.prototype[initializersKey] != null) {
if (object[initializationPromiseKey] == null) {
object[initializationPromiseKey] = createInitializationPromise(container, object);
}
yield object[initializationPromiseKey];
}
});
}
export default initializer;