UNPKG

8.55 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21Object.defineProperty(exports, "__esModule", { value: true });
22exports.getBindingDictionary = exports.createMockRequest = exports.plan = void 0;
23var binding_count_1 = require("../bindings/binding_count");
24var ERROR_MSGS = __importStar(require("../constants/error_msgs"));
25var literal_types_1 = require("../constants/literal_types");
26var METADATA_KEY = __importStar(require("../constants/metadata_keys"));
27var exceptions_1 = require("../utils/exceptions");
28var serialization_1 = require("../utils/serialization");
29var context_1 = require("./context");
30var metadata_1 = require("./metadata");
31var plan_1 = require("./plan");
32var reflection_utils_1 = require("./reflection_utils");
33var request_1 = require("./request");
34var target_1 = require("./target");
35function getBindingDictionary(cntnr) {
36 return cntnr._bindingDictionary;
37}
38exports.getBindingDictionary = getBindingDictionary;
39function _createTarget(isMultiInject, targetType, serviceIdentifier, name, key, value) {
40 var metadataKey = isMultiInject ? METADATA_KEY.MULTI_INJECT_TAG : METADATA_KEY.INJECT_TAG;
41 var injectMetadata = new metadata_1.Metadata(metadataKey, serviceIdentifier);
42 var target = new target_1.Target(targetType, name, serviceIdentifier, injectMetadata);
43 if (key !== undefined) {
44 var tagMetadata = new metadata_1.Metadata(key, value);
45 target.metadata.push(tagMetadata);
46 }
47 return target;
48}
49function _getActiveBindings(metadataReader, avoidConstraints, context, parentRequest, target) {
50 var bindings = getBindings(context.container, target.serviceIdentifier);
51 var activeBindings = [];
52 if (bindings.length === binding_count_1.BindingCount.NoBindingsAvailable &&
53 context.container.options.autoBindInjectable &&
54 typeof target.serviceIdentifier === 'function' &&
55 metadataReader.getConstructorMetadata(target.serviceIdentifier).compilerGeneratedMetadata) {
56 context.container.bind(target.serviceIdentifier).toSelf();
57 bindings = getBindings(context.container, target.serviceIdentifier);
58 }
59 if (!avoidConstraints) {
60 activeBindings = bindings.filter(function (binding) {
61 var request = new request_1.Request(binding.serviceIdentifier, context, parentRequest, binding, target);
62 return binding.constraint(request);
63 });
64 }
65 else {
66 activeBindings = bindings;
67 }
68 _validateActiveBindingCount(target.serviceIdentifier, activeBindings, target, context.container);
69 return activeBindings;
70}
71function _validateActiveBindingCount(serviceIdentifier, bindings, target, container) {
72 switch (bindings.length) {
73 case binding_count_1.BindingCount.NoBindingsAvailable:
74 if (target.isOptional()) {
75 return bindings;
76 }
77 else {
78 var serviceIdentifierString = (0, serialization_1.getServiceIdentifierAsString)(serviceIdentifier);
79 var msg = ERROR_MSGS.NOT_REGISTERED;
80 msg += (0, serialization_1.listMetadataForTarget)(serviceIdentifierString, target);
81 msg += (0, serialization_1.listRegisteredBindingsForServiceIdentifier)(container, serviceIdentifierString, getBindings);
82 throw new Error(msg);
83 }
84 case binding_count_1.BindingCount.OnlyOneBindingAvailable:
85 return bindings;
86 case binding_count_1.BindingCount.MultipleBindingsAvailable:
87 default:
88 if (!target.isArray()) {
89 var serviceIdentifierString = (0, serialization_1.getServiceIdentifierAsString)(serviceIdentifier);
90 var msg = ERROR_MSGS.AMBIGUOUS_MATCH + " " + serviceIdentifierString;
91 msg += (0, serialization_1.listRegisteredBindingsForServiceIdentifier)(container, serviceIdentifierString, getBindings);
92 throw new Error(msg);
93 }
94 else {
95 return bindings;
96 }
97 }
98}
99function _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, parentRequest, target) {
100 var activeBindings;
101 var childRequest;
102 if (parentRequest === null) {
103 activeBindings = _getActiveBindings(metadataReader, avoidConstraints, context, null, target);
104 childRequest = new request_1.Request(serviceIdentifier, context, null, activeBindings, target);
105 var thePlan = new plan_1.Plan(context, childRequest);
106 context.addPlan(thePlan);
107 }
108 else {
109 activeBindings = _getActiveBindings(metadataReader, avoidConstraints, context, parentRequest, target);
110 childRequest = parentRequest.addChildRequest(target.serviceIdentifier, activeBindings, target);
111 }
112 activeBindings.forEach(function (binding) {
113 var subChildRequest = null;
114 if (target.isArray()) {
115 subChildRequest = childRequest.addChildRequest(binding.serviceIdentifier, binding, target);
116 }
117 else {
118 if (binding.cache) {
119 return;
120 }
121 subChildRequest = childRequest;
122 }
123 if (binding.type === literal_types_1.BindingTypeEnum.Instance && binding.implementationType !== null) {
124 var dependencies = (0, reflection_utils_1.getDependencies)(metadataReader, binding.implementationType);
125 if (!context.container.options.skipBaseClassChecks) {
126 var baseClassDependencyCount = (0, reflection_utils_1.getBaseClassDependencyCount)(metadataReader, binding.implementationType);
127 if (dependencies.length < baseClassDependencyCount) {
128 var error = ERROR_MSGS.ARGUMENTS_LENGTH_MISMATCH((0, reflection_utils_1.getFunctionName)(binding.implementationType));
129 throw new Error(error);
130 }
131 }
132 dependencies.forEach(function (dependency) {
133 _createSubRequests(metadataReader, false, dependency.serviceIdentifier, context, subChildRequest, dependency);
134 });
135 }
136 });
137}
138function getBindings(container, serviceIdentifier) {
139 var bindings = [];
140 var bindingDictionary = getBindingDictionary(container);
141 if (bindingDictionary.hasKey(serviceIdentifier)) {
142 bindings = bindingDictionary.get(serviceIdentifier);
143 }
144 else if (container.parent !== null) {
145 bindings = getBindings(container.parent, serviceIdentifier);
146 }
147 return bindings;
148}
149function plan(metadataReader, container, isMultiInject, targetType, serviceIdentifier, key, value, avoidConstraints) {
150 if (avoidConstraints === void 0) { avoidConstraints = false; }
151 var context = new context_1.Context(container);
152 var target = _createTarget(isMultiInject, targetType, serviceIdentifier, '', key, value);
153 try {
154 _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, null, target);
155 return context;
156 }
157 catch (error) {
158 if ((0, exceptions_1.isStackOverflowExeption)(error)) {
159 (0, serialization_1.circularDependencyToException)(context.plan.rootRequest);
160 }
161 throw error;
162 }
163}
164exports.plan = plan;
165function createMockRequest(container, serviceIdentifier, key, value) {
166 var target = new target_1.Target(literal_types_1.TargetTypeEnum.Variable, '', serviceIdentifier, new metadata_1.Metadata(key, value));
167 var context = new context_1.Context(container);
168 var request = new request_1.Request(serviceIdentifier, context, null, [], target);
169 return request;
170}
171exports.createMockRequest = createMockRequest;