1 | "use strict";
|
2 | var __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 | }));
|
9 | var __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 | });
|
14 | var __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 | };
|
21 | Object.defineProperty(exports, "__esModule", { value: true });
|
22 | exports.getBindingDictionary = exports.createMockRequest = exports.plan = void 0;
|
23 | var binding_count_1 = require("../bindings/binding_count");
|
24 | var ERROR_MSGS = __importStar(require("../constants/error_msgs"));
|
25 | var literal_types_1 = require("../constants/literal_types");
|
26 | var METADATA_KEY = __importStar(require("../constants/metadata_keys"));
|
27 | var exceptions_1 = require("../utils/exceptions");
|
28 | var serialization_1 = require("../utils/serialization");
|
29 | var context_1 = require("./context");
|
30 | var metadata_1 = require("./metadata");
|
31 | var plan_1 = require("./plan");
|
32 | var reflection_utils_1 = require("./reflection_utils");
|
33 | var request_1 = require("./request");
|
34 | var target_1 = require("./target");
|
35 | function getBindingDictionary(cntnr) {
|
36 | return cntnr._bindingDictionary;
|
37 | }
|
38 | exports.getBindingDictionary = getBindingDictionary;
|
39 | function _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 | }
|
49 | function _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 | }
|
71 | function _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 | }
|
99 | function _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 | }
|
138 | function 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 | }
|
149 | function 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 | }
|
164 | exports.plan = plan;
|
165 | function 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 | }
|
171 | exports.createMockRequest = createMockRequest;
|