UNPKG

5.85 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.getMetadataStorage = exports.MetadataStorage = void 0;
4const ValidationSchemaToMetadataTransformer_1 = require("../validation-schema/ValidationSchemaToMetadataTransformer");
5const utils_1 = require("../utils");
6/**
7 * Storage all metadatas.
8 */
9class MetadataStorage {
10 constructor() {
11 // -------------------------------------------------------------------------
12 // Private properties
13 // -------------------------------------------------------------------------
14 this.validationMetadatas = [];
15 this.constraintMetadatas = [];
16 }
17 get hasValidationMetaData() {
18 return !!this.validationMetadatas.length;
19 }
20 // -------------------------------------------------------------------------
21 // Public Methods
22 // -------------------------------------------------------------------------
23 /**
24 * Adds a new validation metadata.
25 */
26 addValidationSchema(schema) {
27 const validationMetadatas = new ValidationSchemaToMetadataTransformer_1.ValidationSchemaToMetadataTransformer().transform(schema);
28 validationMetadatas.forEach(validationMetadata => this.addValidationMetadata(validationMetadata));
29 }
30 /**
31 * Adds a new validation metadata.
32 */
33 addValidationMetadata(metadata) {
34 this.validationMetadatas.push(metadata);
35 }
36 /**
37 * Adds a new constraint metadata.
38 */
39 addConstraintMetadata(metadata) {
40 this.constraintMetadatas.push(metadata);
41 }
42 /**
43 * Groups metadata by their property names.
44 */
45 groupByPropertyName(metadata) {
46 const grouped = {};
47 metadata.forEach(metadata => {
48 if (!grouped[metadata.propertyName])
49 grouped[metadata.propertyName] = [];
50 grouped[metadata.propertyName].push(metadata);
51 });
52 return grouped;
53 }
54 /**
55 * Gets all validation metadatas for the given object with the given groups.
56 */
57 getTargetValidationMetadatas(targetConstructor, targetSchema, always, strictGroups, groups) {
58 const includeMetadataBecauseOfAlwaysOption = (metadata) => {
59 // `metadata.always` overrides global default.
60 if (typeof metadata.always !== 'undefined')
61 return metadata.always;
62 // `metadata.groups` overrides global default.
63 if (metadata.groups && metadata.groups.length)
64 return false;
65 // Use global default.
66 return always;
67 };
68 const excludeMetadataBecauseOfStrictGroupsOption = (metadata) => {
69 if (strictGroups) {
70 // Validation is not using groups.
71 if (!groups || !groups.length) {
72 // `metadata.groups` has at least one group.
73 if (metadata.groups && metadata.groups.length)
74 return true;
75 }
76 }
77 return false;
78 };
79 // get directly related to a target metadatas
80 const originalMetadatas = this.validationMetadatas.filter(metadata => {
81 if (metadata.target !== targetConstructor && metadata.target !== targetSchema)
82 return false;
83 if (includeMetadataBecauseOfAlwaysOption(metadata))
84 return true;
85 if (excludeMetadataBecauseOfStrictGroupsOption(metadata))
86 return false;
87 if (groups && groups.length > 0)
88 return metadata.groups && !!metadata.groups.find(group => groups.indexOf(group) !== -1);
89 return true;
90 });
91 // get metadatas for inherited classes
92 const inheritedMetadatas = this.validationMetadatas.filter(metadata => {
93 // if target is a string it's means we validate against a schema, and there is no inheritance support for schemas
94 if (typeof metadata.target === 'string')
95 return false;
96 if (metadata.target === targetConstructor)
97 return false;
98 if (metadata.target instanceof Function && !(targetConstructor.prototype instanceof metadata.target))
99 return false;
100 if (includeMetadataBecauseOfAlwaysOption(metadata))
101 return true;
102 if (excludeMetadataBecauseOfStrictGroupsOption(metadata))
103 return false;
104 if (groups && groups.length > 0)
105 return metadata.groups && !!metadata.groups.find(group => groups.indexOf(group) !== -1);
106 return true;
107 });
108 // filter out duplicate metadatas, prefer original metadatas instead of inherited metadatas
109 const uniqueInheritedMetadatas = inheritedMetadatas.filter(inheritedMetadata => {
110 return !originalMetadatas.find(originalMetadata => {
111 return (originalMetadata.propertyName === inheritedMetadata.propertyName &&
112 originalMetadata.type === inheritedMetadata.type);
113 });
114 });
115 return originalMetadatas.concat(uniqueInheritedMetadatas);
116 }
117 /**
118 * Gets all validator constraints for the given object.
119 */
120 getTargetValidatorConstraints(target) {
121 return this.constraintMetadatas.filter(metadata => metadata.target === target);
122 }
123}
124exports.MetadataStorage = MetadataStorage;
125/**
126 * Gets metadata storage.
127 * Metadata storage follows the best practices and stores metadata in a global variable.
128 */
129function getMetadataStorage() {
130 const global = (0, utils_1.getGlobal)();
131 if (!global.classValidatorMetadataStorage) {
132 global.classValidatorMetadataStorage = new MetadataStorage();
133 }
134 return global.classValidatorMetadataStorage;
135}
136exports.getMetadataStorage = getMetadataStorage;
137//# sourceMappingURL=MetadataStorage.js.map
\No newline at end of file