1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var TransformOperationExecutor_1 = require("../TransformOperationExecutor");
|
4 |
|
5 |
|
6 |
|
7 | var MetadataStorage = (function () {
|
8 | function MetadataStorage() {
|
9 |
|
10 |
|
11 |
|
12 | this._typeMetadatas = new Map();
|
13 | this._transformMetadatas = new Map();
|
14 | this._exposeMetadatas = new Map();
|
15 | this._excludeMetadatas = new Map();
|
16 | this._ancestorsMap = new Map();
|
17 | }
|
18 |
|
19 |
|
20 |
|
21 | MetadataStorage.prototype.addTypeMetadata = function (metadata) {
|
22 | if (!this._typeMetadatas.has(metadata.target)) {
|
23 | this._typeMetadatas.set(metadata.target, new Map());
|
24 | }
|
25 | this._typeMetadatas.get(metadata.target).set(metadata.propertyName, metadata);
|
26 | };
|
27 | MetadataStorage.prototype.addTransformMetadata = function (metadata) {
|
28 | if (!this._transformMetadatas.has(metadata.target)) {
|
29 | this._transformMetadatas.set(metadata.target, new Map());
|
30 | }
|
31 | if (!this._transformMetadatas.get(metadata.target).has(metadata.propertyName)) {
|
32 | this._transformMetadatas.get(metadata.target).set(metadata.propertyName, []);
|
33 | }
|
34 | this._transformMetadatas.get(metadata.target).get(metadata.propertyName).push(metadata);
|
35 | };
|
36 | MetadataStorage.prototype.addExposeMetadata = function (metadata) {
|
37 | if (!this._exposeMetadatas.has(metadata.target)) {
|
38 | this._exposeMetadatas.set(metadata.target, new Map());
|
39 | }
|
40 | this._exposeMetadatas.get(metadata.target).set(metadata.propertyName, metadata);
|
41 | };
|
42 | MetadataStorage.prototype.addExcludeMetadata = function (metadata) {
|
43 | if (!this._excludeMetadatas.has(metadata.target)) {
|
44 | this._excludeMetadatas.set(metadata.target, new Map());
|
45 | }
|
46 | this._excludeMetadatas.get(metadata.target).set(metadata.propertyName, metadata);
|
47 | };
|
48 |
|
49 |
|
50 |
|
51 | MetadataStorage.prototype.findTransformMetadatas = function (target, propertyName, transformationType) {
|
52 | return this.findMetadatas(this._transformMetadatas, target, propertyName)
|
53 | .filter(function (metadata) {
|
54 | if (!metadata.options)
|
55 | return true;
|
56 | if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true)
|
57 | return true;
|
58 | if (metadata.options.toClassOnly === true) {
|
59 | return transformationType === TransformOperationExecutor_1.TransformationType.CLASS_TO_CLASS || transformationType === TransformOperationExecutor_1.TransformationType.PLAIN_TO_CLASS;
|
60 | }
|
61 | if (metadata.options.toPlainOnly === true) {
|
62 | return transformationType === TransformOperationExecutor_1.TransformationType.CLASS_TO_PLAIN;
|
63 | }
|
64 | return true;
|
65 | });
|
66 | };
|
67 | MetadataStorage.prototype.findExcludeMetadata = function (target, propertyName) {
|
68 | return this.findMetadata(this._excludeMetadatas, target, propertyName);
|
69 | };
|
70 | MetadataStorage.prototype.findExposeMetadata = function (target, propertyName) {
|
71 | return this.findMetadata(this._exposeMetadatas, target, propertyName);
|
72 | };
|
73 | MetadataStorage.prototype.findExposeMetadataByCustomName = function (target, name) {
|
74 | return this.getExposedMetadatas(target).find(function (metadata) {
|
75 | return metadata.options && metadata.options.name === name;
|
76 | });
|
77 | };
|
78 | MetadataStorage.prototype.findTypeMetadata = function (target, propertyName) {
|
79 | return this.findMetadata(this._typeMetadatas, target, propertyName);
|
80 | };
|
81 | MetadataStorage.prototype.getStrategy = function (target) {
|
82 | var excludeMap = this._excludeMetadatas.get(target);
|
83 | var exclude = excludeMap && excludeMap.get(undefined);
|
84 | var exposeMap = this._exposeMetadatas.get(target);
|
85 | var expose = exposeMap && exposeMap.get(undefined);
|
86 | if ((exclude && expose) || (!exclude && !expose))
|
87 | return "none";
|
88 | return exclude ? "excludeAll" : "exposeAll";
|
89 | };
|
90 | MetadataStorage.prototype.getExposedMetadatas = function (target) {
|
91 | return this.getMetadata(this._exposeMetadatas, target);
|
92 | };
|
93 | MetadataStorage.prototype.getExcludedMetadatas = function (target) {
|
94 | return this.getMetadata(this._excludeMetadatas, target);
|
95 | };
|
96 | MetadataStorage.prototype.getExposedProperties = function (target, transformationType) {
|
97 | return this.getExposedMetadatas(target)
|
98 | .filter(function (metadata) {
|
99 | if (!metadata.options)
|
100 | return true;
|
101 | if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true)
|
102 | return true;
|
103 | if (metadata.options.toClassOnly === true) {
|
104 | return transformationType === TransformOperationExecutor_1.TransformationType.CLASS_TO_CLASS || transformationType === TransformOperationExecutor_1.TransformationType.PLAIN_TO_CLASS;
|
105 | }
|
106 | if (metadata.options.toPlainOnly === true) {
|
107 | return transformationType === TransformOperationExecutor_1.TransformationType.CLASS_TO_PLAIN;
|
108 | }
|
109 | return true;
|
110 | })
|
111 | .map(function (metadata) { return metadata.propertyName; });
|
112 | };
|
113 | MetadataStorage.prototype.getExcludedProperties = function (target, transformationType) {
|
114 | return this.getExcludedMetadatas(target)
|
115 | .filter(function (metadata) {
|
116 | if (!metadata.options)
|
117 | return true;
|
118 | if (metadata.options.toClassOnly === true && metadata.options.toPlainOnly === true)
|
119 | return true;
|
120 | if (metadata.options.toClassOnly === true) {
|
121 | return transformationType === TransformOperationExecutor_1.TransformationType.CLASS_TO_CLASS || transformationType === TransformOperationExecutor_1.TransformationType.PLAIN_TO_CLASS;
|
122 | }
|
123 | if (metadata.options.toPlainOnly === true) {
|
124 | return transformationType === TransformOperationExecutor_1.TransformationType.CLASS_TO_PLAIN;
|
125 | }
|
126 | return true;
|
127 | })
|
128 | .map(function (metadata) { return metadata.propertyName; });
|
129 | };
|
130 | MetadataStorage.prototype.clear = function () {
|
131 | this._typeMetadatas.clear();
|
132 | this._exposeMetadatas.clear();
|
133 | this._excludeMetadatas.clear();
|
134 | this._ancestorsMap.clear();
|
135 | };
|
136 |
|
137 |
|
138 |
|
139 | MetadataStorage.prototype.getMetadata = function (metadatas, target) {
|
140 | var metadataFromTargetMap = metadatas.get(target);
|
141 | var metadataFromTarget;
|
142 | if (metadataFromTargetMap) {
|
143 | metadataFromTarget = Array.from(metadataFromTargetMap.values()).filter(function (meta) { return meta.propertyName !== undefined; });
|
144 | }
|
145 | var metadataFromAncestors = [];
|
146 | for (var _i = 0, _a = this.getAncestors(target); _i < _a.length; _i++) {
|
147 | var ancestor = _a[_i];
|
148 | var ancestorMetadataMap = metadatas.get(ancestor);
|
149 | if (ancestorMetadataMap) {
|
150 | var metadataFromAncestor = Array.from(ancestorMetadataMap.values()).filter(function (meta) { return meta.propertyName !== undefined; });
|
151 | metadataFromAncestors.push.apply(metadataFromAncestors, metadataFromAncestor);
|
152 | }
|
153 | }
|
154 | return metadataFromAncestors.concat(metadataFromTarget || []);
|
155 | };
|
156 | MetadataStorage.prototype.findMetadata = function (metadatas, target, propertyName) {
|
157 | var metadataFromTargetMap = metadatas.get(target);
|
158 | if (metadataFromTargetMap) {
|
159 | var metadataFromTarget = metadataFromTargetMap.get(propertyName);
|
160 | if (metadataFromTarget) {
|
161 | return metadataFromTarget;
|
162 | }
|
163 | }
|
164 | for (var _i = 0, _a = this.getAncestors(target); _i < _a.length; _i++) {
|
165 | var ancestor = _a[_i];
|
166 | var ancestorMetadataMap = metadatas.get(ancestor);
|
167 | if (ancestorMetadataMap) {
|
168 | var ancestorResult = ancestorMetadataMap.get(propertyName);
|
169 | if (ancestorResult) {
|
170 | return ancestorResult;
|
171 | }
|
172 | }
|
173 | }
|
174 | return undefined;
|
175 | };
|
176 | MetadataStorage.prototype.findMetadatas = function (metadatas, target, propertyName) {
|
177 | var metadataFromTargetMap = metadatas.get(target);
|
178 | var metadataFromTarget;
|
179 | if (metadataFromTargetMap) {
|
180 | metadataFromTarget = metadataFromTargetMap.get(propertyName);
|
181 | }
|
182 | var metadataFromAncestorsTarget = [];
|
183 | for (var _i = 0, _a = this.getAncestors(target); _i < _a.length; _i++) {
|
184 | var ancestor = _a[_i];
|
185 | var ancestorMetadataMap = metadatas.get(ancestor);
|
186 | if (ancestorMetadataMap) {
|
187 | if (ancestorMetadataMap.has(propertyName)) {
|
188 | metadataFromAncestorsTarget.push.apply(metadataFromAncestorsTarget, ancestorMetadataMap.get(propertyName));
|
189 | }
|
190 | }
|
191 | }
|
192 | return (metadataFromAncestorsTarget).reverse().concat((metadataFromTarget || []).reverse());
|
193 | };
|
194 | MetadataStorage.prototype.getAncestors = function (target) {
|
195 | if (!target)
|
196 | return [];
|
197 | if (!this._ancestorsMap.has(target)) {
|
198 | var ancestors = [];
|
199 | for (var baseClass = Object.getPrototypeOf(target.prototype.constructor); typeof baseClass.prototype !== "undefined"; baseClass = Object.getPrototypeOf(baseClass.prototype.constructor)) {
|
200 | ancestors.push(baseClass);
|
201 | }
|
202 | this._ancestorsMap.set(target, ancestors);
|
203 | }
|
204 | return this._ancestorsMap.get(target);
|
205 | };
|
206 | return MetadataStorage;
|
207 | }());
|
208 | exports.MetadataStorage = MetadataStorage;
|
209 |
|
210 |
|