MetadataStorage.js 9.1 KB

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