UNPKG

redux-providers

Version:

Minimalist dependency injection system for redux. Create providers to be injected and used in redux reducers.

59 lines 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); require("reflect-metadata"); const metadata_keys_1 = require("../constants/metadata.keys"); const action_1 = require("../decorators/action/action"); const provider_1 = require("../decorators/provider/provider"); var Resolver; (function (Resolver) { function resolve(target, container, parentModuleName) { const isProvider = Reflect.hasOwnMetadata(metadata_keys_1.METADATA_KEY.PROVIDER_PARAM_TYPES, target); if (isProvider) { return resolveProvider(target, container, parentModuleName); } const isReduxAction = Reflect.hasOwnMetadata(metadata_keys_1.METADATA_KEY.ACTION_HANDLER_PARAM_TYPES, target); if (isReduxAction) { return resolveAction(target, container, parentModuleName); } const allowedDecorators = [provider_1.Provider.name, action_1.ActionHandler.name]; throw new Error("Target must be one of " + allowedDecorators + "!"); } Resolver.resolve = resolve; function resolveProvider(target, container, parentModuleName) { if (!Reflect.hasOwnMetadata(metadata_keys_1.METADATA_KEY.PROVIDER_PARAM_TYPES, target)) { throw new Error("Attempting to resolve target with name: " + target.name + ". " + target.name + " is not a provider in module: " + parentModuleName + "!"); } if (containerHasElement(container, target.name)) { return container.get(target.name); } let designParamTypes = Reflect.getMetadata(metadata_keys_1.METADATA_KEY.PROVIDER_PARAM_TYPES, target) || []; let injections = designParamTypes.map((token) => { return resolveProvider(token, container, parentModuleName); }); let newInstance = new target(...injections); container.add(target.name, newInstance); return newInstance; } function resolveAction(target, container, parentModuleName) { if (containerHasElement(container, target.name)) { return container.get(target.name); } let reducActionDesignParamTypes = Reflect.getMetadata(metadata_keys_1.METADATA_KEY.ACTION_HANDLER_PARAM_TYPES, target) || []; let injections = reducActionDesignParamTypes.map((token) => { return resolve(token, container, parentModuleName); }); let newInstance = new target(...injections); container.add(target.name, newInstance); return newInstance; } function containerHasElement(container, instanceIdentifier) { try { container.get(instanceIdentifier); return true; } catch (e) { return false; } } })(Resolver = exports.Resolver || (exports.Resolver = {})); //# sourceMappingURL=resolver.js.map