UNPKG

tinyloc

Version:

A simple service locator container based on Proxy

76 lines 2.5 kB
"use strict"; 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