@baizey/dependency-injection
Version:
A simple typescript dependency injection
96 lines (95 loc) • 3.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.services = exports.ServiceCollection = void 0;
var utils_1 = require("../utils");
var mockUtils_1 = require("./mockUtils");
var ServiceProvider_1 = require("../ServiceProvider");
var ServiceCollection = /** @class */ (function () {
function ServiceCollection(dependencies) {
Object.defineProperty(this, "lifetimes", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.lifetimes = Object.entries(dependencies).map(function (_a) {
var name = _a[0], data = _a[1];
var factory = 'factory' in data
? data.factory
// @ts-ignore the factory can be either p => new or (p, props) => new, but ts don't know this
: function (p, props) { return new data.constructor(p, props); };
var Lifetime = data.lifetime;
return new Lifetime(name, factory);
}).reduce(function (a, b) {
a[b.name] = b;
return a;
}, {});
}
Object.defineProperty(ServiceCollection.prototype, "get", {
enumerable: false,
configurable: true,
writable: true,
value: function (selector) {
return this.lifetimes[(0, utils_1.extractSelector)(selector)];
}
});
Object.defineProperty(ServiceCollection.prototype, "replace", {
enumerable: false,
configurable: true,
writable: true,
value: function (dependencies) {
var _this = this;
Object.entries(dependencies).forEach(function (_a) {
var name = _a[0], data = _a[1];
var factory = 'factory' in data
? data.factory
// @ts-ignore the factory can be either p => new or (p, props) => new, but ts don't know this
: function (p, props) { return new data.constructor(p, props); };
var Lifetime = data.lifetime;
_this.lifetimes[name] = new Lifetime(name, factory);
});
return this;
}
});
Object.defineProperty(ServiceCollection.prototype, "build", {
enumerable: false,
configurable: true,
writable: true,
value: function () {
var lifetimes = Object.values(this.lifetimes)
.map(function (e) { return e.clone(); })
.reduce(function (a, b) {
a[b.name] = b;
return a;
}, {});
return new ServiceProvider_1.ServiceProvider(lifetimes);
}
});
Object.defineProperty(ServiceCollection.prototype, "buildDebug", {
enumerable: false,
configurable: true,
writable: true,
value: function () {
var lifetimes = Object.values(this.lifetimes)
.map(function (e) { return e.clone(); })
.reduce(function (a, b) {
a[b.name] = b;
return a;
}, {});
return new ServiceProvider_1.DebugServiceProvider(lifetimes);
}
});
Object.defineProperty(ServiceCollection.prototype, "buildMock", {
enumerable: false,
configurable: true,
writable: true,
value: function (mock) {
if (mock === void 0) { mock = {}; }
return (0, mockUtils_1.proxyLifetimes)(this, mock);
}
});
return ServiceCollection;
}());
exports.ServiceCollection = ServiceCollection;
var services = function (dependencies) { return new ServiceCollection(dependencies); };
exports.services = services;