UNPKG

8.4 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;
23const binding_count_1 = require("../bindings/binding_count");
24const ERROR_MSGS = __importStar(require("../constants/error_msgs"));
25const literal_types_1 = require("../constants/literal_types");
26const METADATA_KEY = __importStar(require("../constants/metadata_keys"));
27const exceptions_1 = require("../utils/exceptions");
28const serialization_1 = require("../utils/serialization");
29const context_1 = require("./context");
30const metadata_1 = require("./metadata");
31const plan_1 = require("./plan");
32const reflection_utils_1 = require("./reflection_utils");
33const request_1 = require("./request");
34const target_1 = require("./target");
35function getBindingDictionary(cntnr) {
36 return cntnr._bindingDictionary;
37}
38exports.getBindingDictionary = getBindingDictionary;
39function _createTarget(isMultiInject, targetType, serviceIdentifier, name, key, value) {
40 const metadataKey = isMultiInject ? METADATA_KEY.MULTI_INJECT_TAG : METADATA_KEY.INJECT_TAG;
41 const injectMetadata = new metadata_1.Metadata(metadataKey, serviceIdentifier);
42 const target = new target_1.Target(targetType, name, serviceIdentifier, injectMetadata);
43 if (key !== undefined) {
44 const 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 let bindings = getBindings(context.container, target.serviceIdentifier);
51 let 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((binding) => {
61 const 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 const serviceIdentifierString = (0, serialization_1.getServiceIdentifierAsString)(serviceIdentifier);
79 let 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 const serviceIdentifierString = (0, serialization_1.getServiceIdentifierAsString)(serviceIdentifier);
90 let 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 let activeBindings;
101 let 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 const 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((binding) => {
113 let 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 const dependencies = (0, reflection_utils_1.getDependencies)(metadataReader, binding.implementationType);
125 if (!context.container.options.skipBaseClassChecks) {
126 const baseClassDependencyCount = (0, reflection_utils_1.getBaseClassDependencyCount)(metadataReader, binding.implementationType);
127 if (dependencies.length < baseClassDependencyCount) {
128 const error = ERROR_MSGS.ARGUMENTS_LENGTH_MISMATCH((0, reflection_utils_1.getFunctionName)(binding.implementationType));
129 throw new Error(error);
130 }
131 }
132 dependencies.forEach((dependency) => {
133 _createSubRequests(metadataReader, false, dependency.serviceIdentifier, context, subChildRequest, dependency);
134 });
135 }
136 });
137}
138function getBindings(container, serviceIdentifier) {
139 let bindings = [];
140 const 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 = false) {
150 const context = new context_1.Context(container);
151 const target = _createTarget(isMultiInject, targetType, serviceIdentifier, "", key, value);
152 try {
153 _createSubRequests(metadataReader, avoidConstraints, serviceIdentifier, context, null, target);
154 return context;
155 }
156 catch (error) {
157 if ((0, exceptions_1.isStackOverflowExeption)(error)) {
158 (0, serialization_1.circularDependencyToException)(context.plan.rootRequest);
159 }
160 throw error;
161 }
162}
163exports.plan = plan;
164function createMockRequest(container, serviceIdentifier, key, value) {
165 const target = new target_1.Target(literal_types_1.TargetTypeEnum.Variable, "", serviceIdentifier, new metadata_1.Metadata(key, value));
166 const context = new context_1.Context(container);
167 const request = new request_1.Request(serviceIdentifier, context, null, [], target);
168 return request;
169}
170exports.createMockRequest = createMockRequest;
171//# sourceMappingURL=planner.js.map
\No newline at end of file