You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					146 lines
				
				7.8 KiB
			
		
		
			
		
	
	
					146 lines
				
				7.8 KiB
			| 
								 
											11 months ago
										 
									 | 
							
								define(["require", "exports", "../bindings/binding_count", "../constants/error_msgs", "../constants/literal_types", "../constants/metadata_keys", "../utils/exceptions", "../utils/serialization", "./context", "./metadata", "./plan", "./reflection_utils", "./request", "./target"], function (require, exports, binding_count_1, ERROR_MSGS, literal_types_1, METADATA_KEY, exceptions_1, serialization_1, context_1, metadata_1, plan_1, reflection_utils_1, request_1, target_1) {
							 | 
						||
| 
								 | 
							
								    "use strict";
							 | 
						||
| 
								 | 
							
								    Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								    function getBindingDictionary(cntnr) {
							 | 
						||
| 
								 | 
							
								        return cntnr._bindingDictionary;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    exports.getBindingDictionary = getBindingDictionary;
							 | 
						||
| 
								 | 
							
								    function _createTarget(isMultiInject, targetType, serviceIdentifier, name, key, value) {
							 | 
						||
| 
								 | 
							
								        var metadataKey = isMultiInject ? METADATA_KEY.MULTI_INJECT_TAG : METADATA_KEY.INJECT_TAG;
							 | 
						||
| 
								 | 
							
								        var injectMetadata = new metadata_1.Metadata(metadataKey, serviceIdentifier);
							 | 
						||
| 
								 | 
							
								        var target = new target_1.Target(targetType, name, serviceIdentifier, injectMetadata);
							 | 
						||
| 
								 | 
							
								        if (key !== undefined) {
							 | 
						||
| 
								 | 
							
								            var tagMetadata = new metadata_1.Metadata(key, value);
							 | 
						||
| 
								 | 
							
								            target.metadata.push(tagMetadata);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return target;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    function _getActiveBindings(metadataReader, avoidConstraints, context, parentRequest, target) {
							 | 
						||
| 
								 | 
							
								        var bindings = getBindings(context.container, target.serviceIdentifier);
							 | 
						||
| 
								 | 
							
								        var activeBindings = [];
							 | 
						||
| 
								 | 
							
								        if (bindings.length === binding_count_1.BindingCount.NoBindingsAvailable &&
							 | 
						||
| 
								 | 
							
								            context.container.options.autoBindInjectable &&
							 | 
						||
| 
								 | 
							
								            typeof target.serviceIdentifier === "function" &&
							 | 
						||
| 
								 | 
							
								            metadataReader.getConstructorMetadata(target.serviceIdentifier).compilerGeneratedMetadata) {
							 | 
						||
| 
								 | 
							
								            context.container.bind(target.serviceIdentifier).toSelf();
							 | 
						||
| 
								 | 
							
								            bindings = getBindings(context.container, target.serviceIdentifier);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (!avoidConstraints) {
							 | 
						||
| 
								 | 
							
								            activeBindings = bindings.filter(function (binding) {
							 | 
						||
| 
								 | 
							
								                var request = new request_1.Request(binding.serviceIdentifier, context, parentRequest, binding, target);
							 | 
						||
| 
								 | 
							
								                return binding.constraint(request);
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            activeBindings = bindings;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        _validateActiveBindingCount(target.serviceIdentifier, activeBindings, target, context.container);
							 | 
						||
| 
								 | 
							
								        return activeBindings;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    function _validateActiveBindingCount(serviceIdentifier, bindings, target, container) {
							 | 
						||
| 
								 | 
							
								        switch (bindings.length) {
							 | 
						||
| 
								 | 
							
								            case binding_count_1.BindingCount.NoBindingsAvailable:
							 | 
						||
| 
								 | 
							
								                if (target.isOptional()) {
							 | 
						||
| 
								 | 
							
								                    return bindings;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    var serviceIdentifierString = serialization_1.getServiceIdentifierAsString(serviceIdentifier);
							 | 
						||
| 
								 | 
							
								                    var msg = ERROR_MSGS.NOT_REGISTERED;
							 | 
						||
| 
								 | 
							
								                    msg += serialization_1.listMetadataForTarget(serviceIdentifierString, target);
							 | 
						||
| 
								 | 
							
								                    msg += serialization_1.listRegisteredBindingsForServiceIdentifier(container, serviceIdentifierString, getBindings);
							 | 
						||
| 
								 | 
							
								                    throw new Error(msg);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            case binding_count_1.BindingCount.OnlyOneBindingAvailable:
							 | 
						||
| 
								 | 
							
								                if (!target.isArray()) {
							 | 
						||
| 
								 | 
							
								                    return bindings;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            case binding_count_1.BindingCount.MultipleBindingsAvailable:
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								                if (!target.isArray()) {
							 | 
						||
| 
								 | 
							
								                    var serviceIdentifierString = serialization_1.getServiceIdentifierAsString(serviceIdentifier);
							 | 
						||
| 
								 | 
							
								                    var msg = ERROR_MSGS.AMBIGUOUS_MATCH + " " + serviceIdentifierString;
							 | 
						||
| 
								 | 
							
								                    msg += serialization_1.listRegisteredBindingsForServiceIdentifier(container, serviceIdentifierString, getBindings);
							 | 
						||
| 
								 | 
							
								                    throw new Error(msg);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    return bindings;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    function _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, parentRequest, target) {
							 | 
						||
| 
								 | 
							
								        var activeBindings;
							 | 
						||
| 
								 | 
							
								        var childRequest;
							 | 
						||
| 
								 | 
							
								        if (parentRequest === null) {
							 | 
						||
| 
								 | 
							
								            activeBindings = _getActiveBindings(metadataReader, avoidConstraints, context, null, target);
							 | 
						||
| 
								 | 
							
								            childRequest = new request_1.Request(serviceIdentifier, context, null, activeBindings, target);
							 | 
						||
| 
								 | 
							
								            var thePlan = new plan_1.Plan(context, childRequest);
							 | 
						||
| 
								 | 
							
								            context.addPlan(thePlan);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else {
							 | 
						||
| 
								 | 
							
								            activeBindings = _getActiveBindings(metadataReader, avoidConstraints, context, parentRequest, target);
							 | 
						||
| 
								 | 
							
								            childRequest = parentRequest.addChildRequest(target.serviceIdentifier, activeBindings, target);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        activeBindings.forEach(function (binding) {
							 | 
						||
| 
								 | 
							
								            var subChildRequest = null;
							 | 
						||
| 
								 | 
							
								            if (target.isArray()) {
							 | 
						||
| 
								 | 
							
								                subChildRequest = childRequest.addChildRequest(binding.serviceIdentifier, binding, target);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            else {
							 | 
						||
| 
								 | 
							
								                if (binding.cache) {
							 | 
						||
| 
								 | 
							
								                    return;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                subChildRequest = childRequest;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (binding.type === literal_types_1.BindingTypeEnum.Instance && binding.implementationType !== null) {
							 | 
						||
| 
								 | 
							
								                var dependencies = reflection_utils_1.getDependencies(metadataReader, binding.implementationType);
							 | 
						||
| 
								 | 
							
								                if (!context.container.options.skipBaseClassChecks) {
							 | 
						||
| 
								 | 
							
								                    var baseClassDependencyCount = reflection_utils_1.getBaseClassDependencyCount(metadataReader, binding.implementationType);
							 | 
						||
| 
								 | 
							
								                    if (dependencies.length < baseClassDependencyCount) {
							 | 
						||
| 
								 | 
							
								                        var error = ERROR_MSGS.ARGUMENTS_LENGTH_MISMATCH(reflection_utils_1.getFunctionName(binding.implementationType));
							 | 
						||
| 
								 | 
							
								                        throw new Error(error);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                dependencies.forEach(function (dependency) {
							 | 
						||
| 
								 | 
							
								                    _createSubRequests(metadataReader, false, dependency.serviceIdentifier, context, subChildRequest, dependency);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    function getBindings(container, serviceIdentifier) {
							 | 
						||
| 
								 | 
							
								        var bindings = [];
							 | 
						||
| 
								 | 
							
								        var bindingDictionary = getBindingDictionary(container);
							 | 
						||
| 
								 | 
							
								        if (bindingDictionary.hasKey(serviceIdentifier)) {
							 | 
						||
| 
								 | 
							
								            bindings = bindingDictionary.get(serviceIdentifier);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if (container.parent !== null) {
							 | 
						||
| 
								 | 
							
								            bindings = getBindings(container.parent, serviceIdentifier);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return bindings;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    function plan(metadataReader, container, isMultiInject, targetType, serviceIdentifier, key, value, avoidConstraints) {
							 | 
						||
| 
								 | 
							
								        if (avoidConstraints === void 0) { avoidConstraints = false; }
							 | 
						||
| 
								 | 
							
								        var context = new context_1.Context(container);
							 | 
						||
| 
								 | 
							
								        var target = _createTarget(isMultiInject, targetType, serviceIdentifier, "", key, value);
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, null, target);
							 | 
						||
| 
								 | 
							
								            return context;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        catch (error) {
							 | 
						||
| 
								 | 
							
								            if (exceptions_1.isStackOverflowExeption(error)) {
							 | 
						||
| 
								 | 
							
								                if (context.plan) {
							 | 
						||
| 
								 | 
							
								                    serialization_1.circularDependencyToException(context.plan.rootRequest);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            throw error;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    exports.plan = plan;
							 | 
						||
| 
								 | 
							
								    function createMockRequest(container, serviceIdentifier, key, value) {
							 | 
						||
| 
								 | 
							
								        var target = new target_1.Target(literal_types_1.TargetTypeEnum.Variable, "", serviceIdentifier, new metadata_1.Metadata(key, value));
							 | 
						||
| 
								 | 
							
								        var context = new context_1.Context(container);
							 | 
						||
| 
								 | 
							
								        var request = new request_1.Request(serviceIdentifier, context, null, [], target);
							 | 
						||
| 
								 | 
							
								        return request;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    exports.createMockRequest = createMockRequest;
							 | 
						||
| 
								 | 
							
								});
							 |