redux-providers
Version:
Minimalist dependency injection system for redux. Create providers to be injected and used in redux reducers.
59 lines • 2.81 kB
JavaScript
;
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