tinyloc
Version:
A simple service locator container based on Proxy
76 lines • 2.5 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
function single(provider) {
var resolved = false;
var value;
return function (proxy) {
if (!resolved) {
value = provider(proxy);
resolved = true;
}
return value;
};
}
function getProvider(store, key) {
if (store.__defined.includes(key)) {
return store[key];
}
throw new Error("Undefined service '" + key + "'");
}
function setProvider(store, key, spec) {
if ('set' === key || 'share' === key || 'get' === key) {
throw new Error("Cannot override function " + key);
}
if (store.__defined.includes(key)) {
throw new Error("Redefinition of service " + key + " prevented");
}
store[key] = validateFun(spec);
store.__defined.push(key);
}
function setSharedProvider(container, key, spec) {
return setProvider(container, key, single(validateFun(spec)));
}
function validateFun(provider) {
if (typeof provider !== 'function') {
throw new Error('Container.set() and .share() 2nd arg must be a function');
}
return provider;
}
function di() {
var store = { __defined: [] };
var proxy = new Proxy(store, {
defineProperty: function () {
throw new Error('Defining a property on the container is forbidden');
},
// We disallow direct set
set: function () {
throw new Error('Direct property set is forbidden, please use .set() or .share()');
},
get: function (c, prop) {
switch (prop) {
case 'get':
return function (key) {
var provider = getProvider(c, key);
return provider(proxy);
};
case 'set':
return function (key, provider) {
setProvider(c, key, provider);
return proxy;
};
case 'share':
return function (key, provider) {
setSharedProvider(c, key, provider);
return proxy;
};
default:
// eslint-disable-next-line no-case-declarations
var provider = getProvider(c, prop);
return provider(proxy);
}
},
});
return proxy;
}
exports.default = di;
//# sourceMappingURL=main.js.map
;