1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.getMetadataStorage = exports.MetadataStorage = void 0;
|
4 | const ValidationSchemaToMetadataTransformer_1 = require("../validation-schema/ValidationSchemaToMetadataTransformer");
|
5 | const utils_1 = require("../utils");
|
6 |
|
7 |
|
8 |
|
9 | class MetadataStorage {
|
10 | constructor() {
|
11 |
|
12 |
|
13 |
|
14 | this.validationMetadatas = [];
|
15 | this.constraintMetadatas = [];
|
16 | }
|
17 | get hasValidationMetaData() {
|
18 | return !!this.validationMetadatas.length;
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 | |
24 |
|
25 |
|
26 | addValidationSchema(schema) {
|
27 | const validationMetadatas = new ValidationSchemaToMetadataTransformer_1.ValidationSchemaToMetadataTransformer().transform(schema);
|
28 | validationMetadatas.forEach(validationMetadata => this.addValidationMetadata(validationMetadata));
|
29 | }
|
30 | |
31 |
|
32 |
|
33 | addValidationMetadata(metadata) {
|
34 | this.validationMetadatas.push(metadata);
|
35 | }
|
36 | |
37 |
|
38 |
|
39 | addConstraintMetadata(metadata) {
|
40 | this.constraintMetadatas.push(metadata);
|
41 | }
|
42 | |
43 |
|
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 |
|
56 |
|
57 | getTargetValidationMetadatas(targetConstructor, targetSchema, always, strictGroups, groups) {
|
58 | const includeMetadataBecauseOfAlwaysOption = (metadata) => {
|
59 |
|
60 | if (typeof metadata.always !== 'undefined')
|
61 | return metadata.always;
|
62 |
|
63 | if (metadata.groups && metadata.groups.length)
|
64 | return false;
|
65 |
|
66 | return always;
|
67 | };
|
68 | const excludeMetadataBecauseOfStrictGroupsOption = (metadata) => {
|
69 | if (strictGroups) {
|
70 |
|
71 | if (!groups || !groups.length) {
|
72 |
|
73 | if (metadata.groups && metadata.groups.length)
|
74 | return true;
|
75 | }
|
76 | }
|
77 | return false;
|
78 | };
|
79 |
|
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 |
|
92 | const inheritedMetadatas = this.validationMetadatas.filter(metadata => {
|
93 |
|
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 |
|
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 |
|
119 |
|
120 | getTargetValidatorConstraints(target) {
|
121 | return this.constraintMetadatas.filter(metadata => metadata.target === target);
|
122 | }
|
123 | }
|
124 | exports.MetadataStorage = MetadataStorage;
|
125 |
|
126 |
|
127 |
|
128 |
|
129 | function getMetadataStorage() {
|
130 | const global = (0, utils_1.getGlobal)();
|
131 | if (!global.classValidatorMetadataStorage) {
|
132 | global.classValidatorMetadataStorage = new MetadataStorage();
|
133 | }
|
134 | return global.classValidatorMetadataStorage;
|
135 | }
|
136 | exports.getMetadataStorage = getMetadataStorage;
|
137 |
|
\ | No newline at end of file |