@nest-omni/core 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -27,3 +27,4 @@ __exportStar(require("./boilerplate.polyfill"), exports);
27
27
  __exportStar(require("./middlewares"), exports);
28
28
  __exportStar(require("./validators"), exports);
29
29
  __exportStar(require("./common"), exports);
30
+ __exportStar(require("./validator-json"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-omni/core",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "description": "framework",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -32,7 +32,8 @@
32
32
  "providers",
33
33
  "setup",
34
34
  "shared",
35
- "validators"
35
+ "validators",
36
+ "validator-json"
36
37
  ],
37
38
  "peerDependencies": {
38
39
  "@dataui/crud": "^5.3.0",
@@ -80,19 +81,5 @@
80
81
  "typeorm": "^0.3.17",
81
82
  "typeorm-transactional": "~0.4.1",
82
83
  "uuid": "^9.0.1"
83
- },
84
- "exports": {
85
- ".": "./dist/index.js",
86
- "./setup": "./dist/setup/index.js",
87
- "./common": "./dist/common/index.js",
88
- "./constants": "./dist/constants/index.js",
89
- "./decorators": "./dist/decorators/index.js",
90
- "./filters": "./dist/filters/index.js",
91
- "./interfaces": "./dist/interfaces/index.js",
92
- "./interceptors": "./dist/interceptors/index.js",
93
- "./shared": "./dist/shared/index.js",
94
- "./types": "./dist/types/index.js",
95
- "./middlewares": "./dist/middlewares/index.js",
96
- "./validators": "./dist/validators/index.js"
97
84
  }
98
85
  }
@@ -0,0 +1,6 @@
1
+ import { ReferenceObject, SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';
2
+ import 'reflect-metadata';
3
+ import { IOptions } from './options';
4
+ export type DecoratorSchema = ReferenceObject | SchemaObject | ((source: SchemaObject, options: IOptions) => ReferenceObject | SchemaObject);
5
+ export declare function JSONSchema(schema: DecoratorSchema): (target: object | Function, key?: string) => void;
6
+ export declare function getMetadataSchema(target: object | Function, key: string): DecoratorSchema;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getMetadataSchema = exports.JSONSchema = void 0;
4
+ require("reflect-metadata");
5
+ const SCHEMA_KEY = Symbol('class-validator-jsonschema:JSONSchema');
6
+ function JSONSchema(schema) {
7
+ return (target, key) => {
8
+ if (key) {
9
+ setMetadataSchema(schema, target.constructor, key);
10
+ }
11
+ else {
12
+ setMetadataSchema(schema, target, target.name);
13
+ }
14
+ };
15
+ }
16
+ exports.JSONSchema = JSONSchema;
17
+ function getMetadataSchema(target, key) {
18
+ return Reflect.getMetadata(SCHEMA_KEY, target.constructor, key) || {};
19
+ }
20
+ exports.getMetadataSchema = getMetadataSchema;
21
+ function setMetadataSchema(value, target, key) {
22
+ return Reflect.defineMetadata(SCHEMA_KEY, value, target, key);
23
+ }
@@ -0,0 +1,6 @@
1
+ import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
2
+ import { IOptions } from './options';
3
+ import { I18nService } from 'nestjs-i18n';
4
+ export { JSONSchema } from './decorators';
5
+ export declare function validationMetadataArrayToSchemas(metadatas: ValidationMetadata[], i18n: any, userOptions?: Partial<IOptions>): any;
6
+ export declare function targetConstructorToSchema(targetConstructor: Function, i18n: I18nService, userOptions?: Partial<IOptions>): any;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.targetConstructorToSchema = exports.validationMetadataArrayToSchemas = exports.JSONSchema = void 0;
4
+ const cv = require("class-validator");
5
+ const lodash_1 = require("lodash");
6
+ const defaultConverters_1 = require("./defaultConverters");
7
+ const options_1 = require("./options");
8
+ var decorators_1 = require("./decorators");
9
+ Object.defineProperty(exports, "JSONSchema", { enumerable: true, get: function () { return decorators_1.JSONSchema; } });
10
+ function validationMetadataArrayToSchemas(metadatas, i18n, userOptions) {
11
+ const options = Object.assign(Object.assign({}, options_1.defaultOptions), userOptions);
12
+ const rules = [];
13
+ Object.entries((0, lodash_1.groupBy)(metadatas, ({ target }) => {
14
+ var _a;
15
+ return (_a = target[options.schemaNameField]) !== null && _a !== void 0 ? _a : target.name;
16
+ })).forEach(([key, ownMetas]) => {
17
+ const target = ownMetas[0].target;
18
+ const metas = ownMetas
19
+ .concat(getInheritedMetadatas(target, metadatas))
20
+ .filter((propMeta) => !(isExcluded(propMeta, options) ||
21
+ isExcluded(Object.assign(Object.assign({}, propMeta), { target }), options)));
22
+ const required = getRequiredPropNames(target, metas, options);
23
+ Object.entries((0, lodash_1.groupBy)(metas, 'propertyName')).forEach(([propName, propMetas]) => {
24
+ const schema = applyConverters(propMetas, options, i18n);
25
+ const filterSchema = schema.filter((item) => !['conditionalValidation', 'notEquals'].includes(item.type));
26
+ const fieldType = getFirstNonNullDataType(filterSchema);
27
+ rules.push({
28
+ field: propName,
29
+ fieldType,
30
+ required: required.includes(propName),
31
+ constraints: filterSchema,
32
+ });
33
+ });
34
+ });
35
+ return rules;
36
+ }
37
+ exports.validationMetadataArrayToSchemas = validationMetadataArrayToSchemas;
38
+ function getFirstNonNullDataType(data) {
39
+ for (const item of data) {
40
+ const dataType = item.dataType;
41
+ delete item.dataType;
42
+ if (dataType) {
43
+ return dataType;
44
+ }
45
+ }
46
+ return undefined;
47
+ }
48
+ function targetConstructorToSchema(targetConstructor, i18n, userOptions) {
49
+ const options = Object.assign(Object.assign({}, options_1.defaultOptions), userOptions);
50
+ const storage = options.classValidatorMetadataStorage;
51
+ let metadatas = storage.getTargetValidationMetadatas(targetConstructor, '', true, false);
52
+ metadatas = populateMetadatasWithConstraints(storage, metadatas);
53
+ return validationMetadataArrayToSchemas(metadatas, i18n, userOptions);
54
+ }
55
+ exports.targetConstructorToSchema = targetConstructorToSchema;
56
+ function populateMetadatasWithConstraints(storage, metadatas) {
57
+ return metadatas.map((meta) => {
58
+ if (meta.constraintCls) {
59
+ const constraint = storage.getTargetValidatorConstraints(meta.constraintCls);
60
+ if (constraint.length > 0) {
61
+ return Object.assign(Object.assign({}, meta), { type: constraint[0].name });
62
+ }
63
+ }
64
+ return Object.assign({}, meta);
65
+ });
66
+ }
67
+ function getInheritedMetadatas(target, metadatas) {
68
+ return metadatas.filter((d) => d.target instanceof Function &&
69
+ target.prototype instanceof d.target &&
70
+ !metadatas.find((m) => m.propertyName === d.propertyName &&
71
+ m.target === target &&
72
+ m.type === d.type));
73
+ }
74
+ function applyConverters(propertyMetadatas, options, i18n) {
75
+ const converters = Object.assign(Object.assign({}, defaultConverters_1.defaultConverters), options.additionalConverters);
76
+ const convert = (meta) => {
77
+ var _a;
78
+ const typeMeta = (_a = options.classTransformerMetadataStorage) === null || _a === void 0 ? void 0 : _a.findTypeMetadata(meta.target, meta.propertyName);
79
+ const isMap = typeMeta &&
80
+ typeMeta.reflectedType &&
81
+ new typeMeta.reflectedType() instanceof Map;
82
+ const converter = converters[meta.type] || converters[cv.ValidationTypes.CUSTOM_VALIDATION];
83
+ const converterResult = typeof converter === 'function' ? converter(meta, options) : converter;
84
+ const items = {};
85
+ let message = '';
86
+ const originMessage = typeof meta.message === 'function' ? meta.message(meta) : meta.message;
87
+ if ((0, lodash_1.isString)(originMessage)) {
88
+ const [translationKey, argsString] = originMessage.split('|');
89
+ const args = !!argsString ? JSON.parse(argsString) : {};
90
+ message = i18n.translate(translationKey, Object.assign(Object.assign({}, options), { args: Object.assign({ constraints: meta.constraints }, args) }));
91
+ }
92
+ items['type'] = meta.type;
93
+ items['dataType'] = (converterResult === null || converterResult === void 0 ? void 0 : converterResult.type) || undefined;
94
+ items['attrs'] = meta.constraints || [];
95
+ items['message'] = message;
96
+ if (meta.each && isMap) {
97
+ return {
98
+ additionalProperties: Object.assign({}, items),
99
+ type: 'object',
100
+ };
101
+ }
102
+ return meta.each ? { items, type: 'array' } : items;
103
+ };
104
+ const constraints = propertyMetadatas.map((meta) => {
105
+ return convert(meta);
106
+ });
107
+ return (0, lodash_1.reject)(constraints, (item) => (0, lodash_1.isEmpty)(item));
108
+ }
109
+ function isExcluded(propertyMetadata, options) {
110
+ var _a;
111
+ return !!((_a = options.classTransformerMetadataStorage) === null || _a === void 0 ? void 0 : _a.findExcludeMetadata(propertyMetadata.target, propertyMetadata.propertyName));
112
+ }
113
+ function getRequiredPropNames(target, metadatas, options) {
114
+ function isDefined(metas) {
115
+ return (metas && metas.some(({ type }) => type === cv.ValidationTypes.IS_DEFINED));
116
+ }
117
+ function isOptional(metas) {
118
+ return (metas &&
119
+ metas.some(({ type }) => [cv.ValidationTypes.CONDITIONAL_VALIDATION, cv.IS_EMPTY].includes(type)));
120
+ }
121
+ return (Object.entries((0, lodash_1.groupBy)(metadatas, (m) => m.propertyName))
122
+ .filter(([_, metas]) => {
123
+ const own = metas.filter((m) => m.target === target);
124
+ const inherited = metas.filter((m) => m.target !== target);
125
+ return options.skipMissingProperties
126
+ ? isDefined(own) || (!isOptional(own) && isDefined(inherited))
127
+ : !(isOptional(own) || isOptional(inherited));
128
+ })
129
+ .map(([name]) => name));
130
+ }
@@ -0,0 +1,8 @@
1
+ import type { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
2
+ import 'reflect-metadata';
3
+ import { IOptions } from './options';
4
+ export interface ISchemaConverters {
5
+ [validatorType: string]: any;
6
+ }
7
+ export type SchemaConverter = (meta: ValidationMetadata, options: IOptions) => any;
8
+ export declare const defaultConverters: ISchemaConverters;
@@ -0,0 +1,376 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultConverters = void 0;
4
+ const cv = require("class-validator");
5
+ require("reflect-metadata");
6
+ exports.defaultConverters = {
7
+ [cv.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
8
+ if (typeof meta.target === 'function') {
9
+ const type = getPropType(meta.target.prototype, meta.propertyName);
10
+ return targetToSchema(type, options);
11
+ }
12
+ },
13
+ [cv.ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
14
+ if (typeof meta.target === 'function') {
15
+ const typeMeta = options.classTransformerMetadataStorage
16
+ ? options.classTransformerMetadataStorage.findTypeMetadata(meta.target, meta.propertyName)
17
+ : null;
18
+ const childType = typeMeta
19
+ ? typeMeta.typeFunction()
20
+ : getPropType(meta.target.prototype, meta.propertyName);
21
+ return targetToSchema(childType, options);
22
+ }
23
+ },
24
+ [cv.ValidationTypes.WHITELIST]: {},
25
+ [cv.ValidationTypes.CONDITIONAL_VALIDATION]: {},
26
+ [cv.ValidationTypes.IS_DEFINED]: {
27
+ not: { type: 'null' },
28
+ },
29
+ [cv.EQUALS]: (meta) => {
30
+ const schema = constraintToSchema(meta.constraints[0]);
31
+ if (schema) {
32
+ return Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] });
33
+ }
34
+ },
35
+ [cv.NOT_EQUALS]: (meta) => {
36
+ const schema = constraintToSchema(meta.constraints[0]);
37
+ if (schema) {
38
+ return { not: Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] }) };
39
+ }
40
+ },
41
+ [cv.IS_EMPTY]: {
42
+ type: 'string',
43
+ anyOf: [
44
+ { type: 'string', enum: [''] },
45
+ {
46
+ not: {
47
+ anyOf: [
48
+ { type: 'string' },
49
+ { type: 'number' },
50
+ { type: 'boolean' },
51
+ { type: 'integer' },
52
+ { type: 'array' },
53
+ { type: 'object' },
54
+ ],
55
+ },
56
+ nullable: true,
57
+ },
58
+ ],
59
+ },
60
+ [cv.IS_NOT_EMPTY]: {
61
+ minLength: 1,
62
+ type: 'string',
63
+ },
64
+ [cv.IS_IN]: (meta) => {
65
+ const [head, ...rest] = meta.constraints[0].map(constraintToSchema);
66
+ if (head && rest.every((item) => item.type === head.type)) {
67
+ return Object.assign(Object.assign({}, head), { enum: meta.constraints[0] });
68
+ }
69
+ return {
70
+ type: 'string',
71
+ };
72
+ },
73
+ [cv.IS_NOT_IN]: (meta) => {
74
+ const [head, ...rest] = meta.constraints[0].map(constraintToSchema);
75
+ if (head && rest.every((item) => item.type === head.type)) {
76
+ return { not: Object.assign(Object.assign({}, head), { enum: meta.constraints[0] }) };
77
+ }
78
+ return {
79
+ type: 'string',
80
+ };
81
+ },
82
+ [cv.IS_BOOLEAN]: {
83
+ type: 'boolean',
84
+ },
85
+ [cv.IS_DATE]: {
86
+ type: 'string',
87
+ oneOf: [
88
+ { format: 'date', type: 'string' },
89
+ { format: 'date-time', type: 'string' },
90
+ ],
91
+ },
92
+ [cv.IS_NUMBER]: {
93
+ type: 'number',
94
+ },
95
+ [cv.IS_STRING]: {
96
+ type: 'string',
97
+ },
98
+ [cv.IS_DATE_STRING]: {
99
+ pattern: '\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d.\\d+Z?',
100
+ type: 'string',
101
+ },
102
+ [cv.IS_ARRAY]: {
103
+ items: {},
104
+ type: 'array',
105
+ },
106
+ [cv.IS_INT]: {
107
+ type: 'integer',
108
+ },
109
+ [cv.IS_ENUM]: (meta) => {
110
+ return {
111
+ enum: Object.values(meta.constraints[0]),
112
+ type: 'string',
113
+ };
114
+ },
115
+ [cv.IS_DIVISIBLE_BY]: (meta) => ({
116
+ multipleOf: meta.constraints[0],
117
+ type: 'number',
118
+ }),
119
+ [cv.IS_POSITIVE]: {
120
+ exclusiveMinimum: 0,
121
+ type: 'number',
122
+ },
123
+ [cv.IS_NEGATIVE]: {
124
+ exclusiveMaximum: 0,
125
+ type: 'number',
126
+ },
127
+ [cv.MIN]: (meta) => ({
128
+ minimum: meta.constraints[0],
129
+ type: 'number',
130
+ }),
131
+ [cv.MAX]: (meta) => ({
132
+ maximum: meta.constraints[0],
133
+ type: 'number',
134
+ }),
135
+ [cv.MIN_DATE]: (meta) => ({
136
+ description: `After ${meta.constraints[0].toJSON()}`,
137
+ oneOf: [
138
+ { format: 'date', type: 'string' },
139
+ { format: 'date-time', type: 'string' },
140
+ ],
141
+ }),
142
+ [cv.MAX_DATE]: (meta) => ({
143
+ description: `Before ${meta.constraints[0].toJSON()}`,
144
+ oneOf: [
145
+ { format: 'date', type: 'string' },
146
+ { format: 'date-time', type: 'string' },
147
+ ],
148
+ }),
149
+ [cv.IS_BOOLEAN_STRING]: {
150
+ enum: ['true', 'false'],
151
+ type: 'string',
152
+ },
153
+ [cv.IS_NUMBER_STRING]: {
154
+ pattern: '^[-+]?[0-9]+$',
155
+ type: 'string',
156
+ },
157
+ [cv.CONTAINS]: (meta) => ({
158
+ pattern: meta.constraints[0],
159
+ type: 'string',
160
+ }),
161
+ [cv.NOT_CONTAINS]: (meta) => ({
162
+ not: { pattern: meta.constraints[0] },
163
+ type: 'string',
164
+ }),
165
+ [cv.IS_ALPHA]: {
166
+ pattern: '^[a-zA-Z]+$',
167
+ type: 'string',
168
+ },
169
+ [cv.IS_ALPHANUMERIC]: {
170
+ pattern: '^[0-9a-zA-Z]+$',
171
+ type: 'string',
172
+ },
173
+ [cv.IS_ASCII]: {
174
+ pattern: '^[\\x00-\\x7F]+$',
175
+ type: 'string',
176
+ },
177
+ [cv.IS_BASE64]: {
178
+ format: 'base64',
179
+ type: 'string',
180
+ },
181
+ [cv.IS_BYTE_LENGTH]: {
182
+ type: 'string',
183
+ },
184
+ [cv.IS_CREDIT_CARD]: {
185
+ format: 'credit-card',
186
+ type: 'string',
187
+ },
188
+ [cv.IS_CURRENCY]: {
189
+ format: 'currency',
190
+ type: 'string',
191
+ },
192
+ [cv.IS_EMAIL]: {
193
+ format: 'email',
194
+ type: 'string',
195
+ },
196
+ [cv.IS_FQDN]: {
197
+ format: 'hostname',
198
+ type: 'string',
199
+ },
200
+ [cv.IS_FULL_WIDTH]: {
201
+ pattern: '[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
202
+ type: 'string',
203
+ },
204
+ [cv.IS_HALF_WIDTH]: {
205
+ pattern: '[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
206
+ type: 'string',
207
+ },
208
+ [cv.IS_VARIABLE_WIDTH]: {
209
+ type: 'string',
210
+ },
211
+ [cv.IS_HEX_COLOR]: {
212
+ pattern: '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$',
213
+ type: 'string',
214
+ },
215
+ [cv.IS_HEXADECIMAL]: {
216
+ pattern: '^[0-9a-fA-F]+$',
217
+ type: 'string',
218
+ },
219
+ [cv.IS_IP]: (meta) => ({
220
+ format: 'ipv' + (meta.constraints[0] === '6' ? 6 : 4),
221
+ type: 'string',
222
+ }),
223
+ [cv.IS_ISBN]: {
224
+ format: 'isbn',
225
+ type: 'string',
226
+ },
227
+ [cv.IS_ISIN]: {
228
+ format: 'isin',
229
+ type: 'string',
230
+ },
231
+ [cv.IS_ISO8601]: {
232
+ oneOf: [
233
+ { format: 'date', type: 'string' },
234
+ { format: 'date-time', type: 'string' },
235
+ ],
236
+ },
237
+ [cv.IS_JSON]: {
238
+ format: 'json',
239
+ type: 'string',
240
+ },
241
+ [cv.IS_LOWERCASE]: {
242
+ type: 'string',
243
+ },
244
+ [cv.IS_MOBILE_PHONE]: {
245
+ format: 'mobile-phone',
246
+ type: 'string',
247
+ },
248
+ [cv.IS_MONGO_ID]: {
249
+ pattern: '^[0-9a-fA-F]{24}$',
250
+ type: 'string',
251
+ },
252
+ [cv.IS_MULTIBYTE]: {
253
+ pattern: '[^\\x00-\\x7F]',
254
+ type: 'string',
255
+ },
256
+ [cv.IS_SURROGATE_PAIR]: {
257
+ pattern: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]',
258
+ type: 'string',
259
+ },
260
+ [cv.IS_URL]: {
261
+ format: 'url',
262
+ type: 'string',
263
+ },
264
+ [cv.IS_UUID]: {
265
+ format: 'uuid',
266
+ type: 'string',
267
+ },
268
+ [cv.IS_LENGTH]: (meta) => {
269
+ const [minLength, maxLength] = meta.constraints;
270
+ if (maxLength || maxLength === 0) {
271
+ return { min: minLength, max: maxLength, type: 'Range' };
272
+ }
273
+ return { min: minLength, type: 'Range' };
274
+ },
275
+ [cv.IS_UPPERCASE]: {
276
+ type: 'string',
277
+ },
278
+ [cv.IS_OBJECT]: {
279
+ type: 'object',
280
+ },
281
+ [cv.IS_NOT_EMPTY_OBJECT]: {
282
+ type: 'object',
283
+ minProperties: 1,
284
+ },
285
+ [cv.MIN_LENGTH]: (meta) => ({
286
+ minLength: meta.constraints[0],
287
+ type: 'string',
288
+ }),
289
+ [cv.MAX_LENGTH]: (meta) => ({
290
+ maxLength: meta.constraints[0],
291
+ type: 'string',
292
+ }),
293
+ [cv.MATCHES]: (meta) => ({
294
+ pattern: meta.constraints[0].source,
295
+ type: 'string',
296
+ }),
297
+ [cv.IS_MILITARY_TIME]: {
298
+ pattern: '^([01]\\d|2[0-3]):?([0-5]\\d)$',
299
+ type: 'string',
300
+ },
301
+ [cv.ARRAY_CONTAINS]: (meta) => {
302
+ const schemas = meta.constraints[0].map(constraintToSchema);
303
+ if (schemas.length > 0 && schemas.every((s) => s && s.type)) {
304
+ return {
305
+ not: {
306
+ anyOf: schemas.map((d, i) => ({
307
+ items: {
308
+ not: Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }),
309
+ },
310
+ })),
311
+ },
312
+ type: 'array',
313
+ };
314
+ }
315
+ return { items: {}, type: 'array' };
316
+ },
317
+ [cv.ARRAY_NOT_CONTAINS]: (meta) => {
318
+ const schemas = meta.constraints[0].map(constraintToSchema);
319
+ if (schemas.length > 0 && schemas.every((s) => s && s.type)) {
320
+ return {
321
+ items: {
322
+ not: {
323
+ anyOf: schemas.map((d, i) => (Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }))),
324
+ },
325
+ },
326
+ type: 'array',
327
+ };
328
+ }
329
+ return { items: {}, type: 'array' };
330
+ },
331
+ [cv.ARRAY_NOT_EMPTY]: {
332
+ items: {},
333
+ minItems: 1,
334
+ type: 'array',
335
+ },
336
+ [cv.ARRAY_MIN_SIZE]: (meta) => ({
337
+ items: {},
338
+ minItems: meta.constraints[0],
339
+ type: 'array',
340
+ }),
341
+ [cv.ARRAY_MAX_SIZE]: (meta) => ({
342
+ items: {},
343
+ maxItems: meta.constraints[0],
344
+ type: 'array',
345
+ }),
346
+ [cv.ARRAY_UNIQUE]: {
347
+ items: {},
348
+ type: 'array',
349
+ uniqueItems: true,
350
+ },
351
+ };
352
+ function getPropType(target, property) {
353
+ return Reflect.getMetadata('design:type', target, property);
354
+ }
355
+ function constraintToSchema(primitive) {
356
+ const primitives = ['string', 'number', 'boolean'];
357
+ const type = typeof primitive;
358
+ if (primitives.includes(type)) {
359
+ return { type: type };
360
+ }
361
+ }
362
+ function targetToSchema(type, options) {
363
+ if (typeof type === 'function') {
364
+ if (type.prototype === String.prototype ||
365
+ type.prototype === Symbol.prototype) {
366
+ return { type: 'string' };
367
+ }
368
+ else if (type.prototype === Number.prototype) {
369
+ return { type: 'number' };
370
+ }
371
+ else if (type.prototype === Boolean.prototype) {
372
+ return { type: 'boolean' };
373
+ }
374
+ return { $ref: options.refPointerPrefix + type.name };
375
+ }
376
+ }
@@ -0,0 +1,4 @@
1
+ export * from './default';
2
+ export * from './decorators';
3
+ export * from './defaultConverters';
4
+ export * from './options';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./default"), exports);
18
+ __exportStar(require("./decorators"), exports);
19
+ __exportStar(require("./defaultConverters"), exports);
20
+ __exportStar(require("./options"), exports);
@@ -0,0 +1,11 @@
1
+ import type { MetadataStorage as ClassTransformerMetadataStorage } from 'class-transformer/types/MetadataStorage';
2
+ import { MetadataStorage, ValidatorOptions } from 'class-validator';
3
+ import { ISchemaConverters } from './defaultConverters';
4
+ export interface IOptions extends ValidatorOptions {
5
+ additionalConverters: ISchemaConverters;
6
+ classTransformerMetadataStorage?: ClassTransformerMetadataStorage;
7
+ classValidatorMetadataStorage: MetadataStorage;
8
+ refPointerPrefix: string;
9
+ schemaNameField: string;
10
+ }
11
+ export declare const defaultOptions: IOptions;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultOptions = void 0;
4
+ const class_validator_1 = require("class-validator");
5
+ exports.defaultOptions = {
6
+ additionalConverters: {},
7
+ classValidatorMetadataStorage: (0, class_validator_1.getMetadataStorage)(),
8
+ refPointerPrefix: '#/definitions/',
9
+ schemaNameField: 'name',
10
+ };