Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

class-validator-jsonschema

Package Overview
Dependencies
Maintainers
1
Versions
25
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

class-validator-jsonschema - npm Package Compare versions

Comparing version 1.3.1 to 2.0.0-rc1

4

__tests__/classTransformer.test.ts

@@ -41,3 +41,3 @@ // tslint:disable:no-submodule-imports

const metadata = getFromContainer(MetadataStorage).validationMetadatas
const schemas = validationMetadatasToSchemas(metadata, {})
const schemas = validationMetadatasToSchemas()

@@ -71,3 +71,3 @@ expect(schemas.ValidationErrorModel).toEqual({

const metadata = getFromContainer(MetadataStorage).validationMetadatas
const schemas = validationMetadatasToSchemas(metadata, {
const schemas = validationMetadatasToSchemas({
classTransformerMetadataStorage: defaultMetadataStorage

@@ -74,0 +74,0 @@ })

import {
getFromContainer,
MetadataStorage,
getMetadataStorage,
Validate,

@@ -36,7 +35,7 @@ ValidationArguments,

const metadata = _.get(getFromContainer(MetadataStorage), 'validationMetadatas')
describe('custom validation classes', () => {
it('uses property type if no additional converter is supplied', () => {
const schemas = validationMetadatasToSchemas(metadata)
const schemas = validationMetadatasToSchemas({
classValidatorMetadataStorage: getMetadataStorage()
})
expect(schemas.Post).toEqual({

@@ -61,14 +60,9 @@ properties: {

it('uses additionalConverter to generate schema when supplied', () => {
const schemas = validationMetadatasToSchemas(metadata, {
const schemas = validationMetadatasToSchemas({
additionalConverters: {
customValidation: meta => {
if (meta.constraintCls === CustomTextLength) {
return {
maxLength: meta.constraints[1] - 1,
minLength: meta.constraints[0] + 1,
type: 'string'
}
}
return {}
}
CustomTextLength: meta => ({
maxLength: meta.constraints[1] - 1,
minLength: meta.constraints[0] + 1,
type: 'string'
})
}

@@ -75,0 +69,0 @@ })

@@ -104,3 +104,3 @@ // tslint:disable:object-literal-sort-keys

@validator.IsLowercase() isLowerCase: string
@validator.IsMobilePhone('en') isMobilePhone: string
@validator.IsMobilePhone('en-GB') isMobilePhone: string
@validator.IsMongoId() isMongoId: string

@@ -107,0 +107,0 @@ @validator.IsMultibyte() isMultibyte: string

@@ -5,3 +5,2 @@ // tslint:disable:no-submodule-imports

ArrayNotContains,
getFromContainer,
IsBoolean,

@@ -13,7 +12,6 @@ IsEmpty,

MaxLength,
MetadataStorage,
MinLength,
ValidateNested
} from 'class-validator'
import { ValidationMetadata } from 'class-validator/metadata/ValidationMetadata'
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata'
import * as _ from 'lodash'

@@ -55,6 +53,15 @@

it('handles empty metadata', () => {
expect(validationMetadatasToSchemas([])).toEqual({})
const emptyStorage: any = {
constraintMetadatas: [],
validationMetadatas: []
}
expect(
validationMetadatasToSchemas({
classValidatorMetadataStorage: emptyStorage
})
).toEqual({})
})
it('returns empty schema object when no converter found', () => {
it('derives schema from property type when no converter is found', () => {
const customMetadata: ValidationMetadata = {

@@ -72,13 +79,15 @@ always: false,

}
const storage: any = {
constraintMetadatas: [],
validationMetadatas: [customMetadata]
}
const schemas = validationMetadatasToSchemas([customMetadata])
expect(schemas.User.properties!.id).toEqual({})
const schemas = validationMetadatasToSchemas({
classValidatorMetadataStorage: storage
})
expect(schemas.User.properties!.id).toEqual({ type: 'string' })
})
it('combines converted class-validator metadata into JSON Schemas', () => {
const metadata = _.get(
getFromContainer(MetadataStorage),
'validationMetadatas'
)
const schemas = validationMetadatasToSchemas(metadata)
const schemas = validationMetadatasToSchemas()

@@ -85,0 +94,0 @@ expect(schemas).toEqual({

@@ -39,3 +39,3 @@ // tslint:disable:no-submodule-imports

@IsDefined()
@IsMobilePhone('fi')
@IsMobilePhone('fi-FI')
phone: string

@@ -135,3 +135,3 @@ }

it('handles inherited IsDefined decorators when skipMissingProperties is enabled', () => {
const schemas = validationMetadatasToSchemas(metadatas, {
const schemas = validationMetadatasToSchemas({
skipMissingProperties: true

@@ -138,0 +138,0 @@ })

import {
getFromContainer,
IS_STRING,
IsDefined,

@@ -7,6 +8,6 @@ IsEmail,

IsString,
MAX_LENGTH,
MaxLength,
MetadataStorage,
ValidateNested,
ValidationTypes
ValidateNested
} from 'class-validator'

@@ -47,3 +48,3 @@ import * as _ from 'lodash'

it('handles refPointerPrefix option', () => {
const schemas = validationMetadatasToSchemas(metadata, {
const schemas = validationMetadatasToSchemas({
refPointerPrefix: '#/components/schema/'

@@ -67,9 +68,9 @@ })

const schemas = validationMetadatasToSchemas(metadata, {
const schemas = validationMetadatasToSchemas({
additionalConverters: {
[ValidationTypes.IS_STRING]: {
[IS_STRING]: {
description: 'A string value',
type: 'string'
},
[ValidationTypes.MAX_LENGTH]: meta => ({
[MAX_LENGTH]: meta => ({
exclusiveMaximum: true,

@@ -96,3 +97,3 @@ maxLength: meta.constraints[0] + 1,

const schemas = validationMetadatasToSchemas(metadata, {
const schemas = validationMetadatasToSchemas({
skipMissingProperties: true

@@ -99,0 +100,0 @@ })

@@ -1,2 +0,2 @@

import { ValidationMetadata } from 'class-validator/metadata/ValidationMetadata';
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata';
import { SchemaObject } from 'openapi3-ts';

@@ -3,0 +3,0 @@ import 'reflect-metadata';

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const class_validator_1 = require("class-validator");
const cv = require("class-validator");
const _ = require("lodash");
require("reflect-metadata");
exports.defaultConverters = {
[class_validator_1.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
[cv.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
if (_.isFunction(meta.target)) {

@@ -13,3 +13,3 @@ const type = getPropType(meta.target.prototype, meta.propertyName);

},
[class_validator_1.ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
[cv.ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
if (_.isFunction(meta.target)) {

@@ -25,17 +25,17 @@ const typeMeta = options.classTransformerMetadataStorage

},
[class_validator_1.ValidationTypes.CONDITIONAL_VALIDATION]: {},
[class_validator_1.ValidationTypes.IS_DEFINED]: {},
[class_validator_1.ValidationTypes.EQUALS]: meta => {
[cv.ValidationTypes.CONDITIONAL_VALIDATION]: {},
[cv.ValidationTypes.IS_DEFINED]: {},
[cv.EQUALS]: (meta) => {
const schema = constraintToSchema(meta.constraints[0]);
if (schema) {
return Object.assign({}, schema, { enum: [meta.constraints[0]] });
return Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] });
}
},
[class_validator_1.ValidationTypes.NOT_EQUALS]: meta => {
[cv.NOT_EQUALS]: (meta) => {
const schema = constraintToSchema(meta.constraints[0]);
if (schema) {
return { not: Object.assign({}, schema, { enum: [meta.constraints[0]] }) };
return { not: Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] }) };
}
},
[class_validator_1.ValidationTypes.IS_EMPTY]: {
[cv.IS_EMPTY]: {
anyOf: [

@@ -51,213 +51,213 @@ { type: 'string', enum: [''] },

{ type: 'array' },
{ type: 'object' }
]
{ type: 'object' },
],
},
nullable: true
}
]
nullable: true,
},
],
},
[class_validator_1.ValidationTypes.IS_NOT_EMPTY]: {
[cv.IS_NOT_EMPTY]: {
minLength: 1,
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_IN]: meta => {
[cv.IS_IN]: (meta) => {
const [head, ...rest] = meta.constraints[0].map(constraintToSchema);
if (head && _.every(rest, { type: head.type })) {
return Object.assign({}, head, { enum: meta.constraints[0] });
return Object.assign(Object.assign({}, head), { enum: meta.constraints[0] });
}
},
[class_validator_1.ValidationTypes.IS_NOT_IN]: meta => {
[cv.IS_NOT_IN]: (meta) => {
const [head, ...rest] = meta.constraints[0].map(constraintToSchema);
if (head && _.every(rest, { type: head.type })) {
return { not: Object.assign({}, head, { enum: meta.constraints[0] }) };
return { not: Object.assign(Object.assign({}, head), { enum: meta.constraints[0] }) };
}
},
[class_validator_1.ValidationTypes.IS_BOOLEAN]: {
type: 'boolean'
[cv.IS_BOOLEAN]: {
type: 'boolean',
},
[class_validator_1.ValidationTypes.IS_DATE]: {
[cv.IS_DATE]: {
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
},
[class_validator_1.ValidationTypes.IS_NUMBER]: {
type: 'number'
[cv.IS_NUMBER]: {
type: 'number',
},
[class_validator_1.ValidationTypes.IS_STRING]: {
type: 'string'
[cv.IS_STRING]: {
type: 'string',
},
[class_validator_1.ValidationTypes.IS_DATE_STRING]: {
[cv.IS_DATE_STRING]: {
pattern: 'd{4}-[01]d-[0-3]dT[0-2]d:[0-5]d:[0-5]d.d+Z?',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_ARRAY]: {
[cv.IS_ARRAY]: {
items: {},
type: 'array'
type: 'array',
},
[class_validator_1.ValidationTypes.IS_INT]: {
type: 'integer'
[cv.IS_INT]: {
type: 'integer',
},
[class_validator_1.ValidationTypes.IS_ENUM]: meta => {
[cv.IS_ENUM]: (meta) => {
return {
enum: Object.values(meta.constraints[0]),
type: 'string'
type: 'string',
};
},
[class_validator_1.ValidationTypes.IS_DIVISIBLE_BY]: meta => ({
[cv.IS_DIVISIBLE_BY]: (meta) => ({
multipleOf: meta.constraints[0],
type: 'number'
type: 'number',
}),
[class_validator_1.ValidationTypes.IS_POSITIVE]: {
[cv.IS_POSITIVE]: {
exclusiveMinimum: true,
minimum: 0,
type: 'number'
type: 'number',
},
[class_validator_1.ValidationTypes.IS_NEGATIVE]: {
[cv.IS_NEGATIVE]: {
exclusiveMaximum: true,
maximum: 0,
type: 'number'
type: 'number',
},
[class_validator_1.ValidationTypes.MIN]: meta => ({
[cv.MIN]: (meta) => ({
minimum: meta.constraints[0],
type: 'number'
type: 'number',
}),
[class_validator_1.ValidationTypes.MAX]: meta => ({
[cv.MAX]: (meta) => ({
maximum: meta.constraints[0],
type: 'number'
type: 'number',
}),
[class_validator_1.ValidationTypes.MIN_DATE]: meta => ({
[cv.MIN_DATE]: (meta) => ({
description: `After ${meta.constraints[0].toJSON()}`,
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
}),
[class_validator_1.ValidationTypes.MAX_DATE]: meta => ({
[cv.MAX_DATE]: (meta) => ({
description: `Before ${meta.constraints[0].toJSON()}`,
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
}),
[class_validator_1.ValidationTypes.IS_BOOLEAN_STRING]: {
[cv.IS_BOOLEAN_STRING]: {
enum: ['true', 'false'],
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_NUMBER_STRING]: {
[cv.IS_NUMBER_STRING]: {
pattern: '^[-+]?[0-9]+$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.CONTAINS]: meta => ({
[cv.CONTAINS]: (meta) => ({
pattern: meta.constraints[0],
type: 'string'
type: 'string',
}),
[class_validator_1.ValidationTypes.NOT_CONTAINS]: meta => ({
[cv.NOT_CONTAINS]: (meta) => ({
not: { pattern: meta.constraints[0] },
type: 'string'
type: 'string',
}),
[class_validator_1.ValidationTypes.IS_ALPHA]: {
[cv.IS_ALPHA]: {
pattern: '^[a-zA-Z]+$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_ALPHANUMERIC]: {
[cv.IS_ALPHANUMERIC]: {
pattern: '^[0-9a-zA-Z]+$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_ASCII]: {
[cv.IS_ASCII]: {
pattern: '^[\\x00-\\x7F]+$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_BASE64]: {
[cv.IS_BASE64]: {
format: 'base64',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_BYTE_LENGTH]: {
type: 'string'
[cv.IS_BYTE_LENGTH]: {
type: 'string',
},
[class_validator_1.ValidationTypes.IS_CREDIT_CARD]: {
[cv.IS_CREDIT_CARD]: {
format: 'credit-card',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_CURRENCY]: {
[cv.IS_CURRENCY]: {
format: 'currency',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_EMAIL]: {
[cv.IS_EMAIL]: {
format: 'email',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_FQDN]: {
[cv.IS_FQDN]: {
format: 'hostname',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_FULL_WIDTH]: {
[cv.IS_FULL_WIDTH]: {
pattern: '[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_HALF_WIDTH]: {
[cv.IS_HALF_WIDTH]: {
pattern: '[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_VARIABLE_WIDTH]: {
type: 'string'
[cv.IS_VARIABLE_WIDTH]: {
type: 'string',
},
[class_validator_1.ValidationTypes.IS_HEX_COLOR]: {
[cv.IS_HEX_COLOR]: {
pattern: '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_HEXADECIMAL]: {
[cv.IS_HEXADECIMAL]: {
pattern: '^[0-9a-fA-F]+$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_IP]: meta => ({
[cv.IS_IP]: (meta) => ({
format: 'ipv' + (meta.constraints[0] === '6' ? 6 : 4),
type: 'string'
type: 'string',
}),
[class_validator_1.ValidationTypes.IS_ISBN]: {
[cv.IS_ISBN]: {
format: 'isbn',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_ISIN]: {
[cv.IS_ISIN]: {
format: 'isin',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_ISO8601]: {
[cv.IS_ISO8601]: {
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
},
[class_validator_1.ValidationTypes.IS_JSON]: {
[cv.IS_JSON]: {
format: 'json',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_LOWERCASE]: {
type: 'string'
[cv.IS_LOWERCASE]: {
type: 'string',
},
[class_validator_1.ValidationTypes.IS_MOBILE_PHONE]: {
[cv.IS_MOBILE_PHONE]: {
format: 'mobile-phone',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_MONGO_ID]: {
[cv.IS_MONGO_ID]: {
pattern: '^[0-9a-fA-F]{24}$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_MULTIBYTE]: {
[cv.IS_MULTIBYTE]: {
pattern: '[^\\x00-\\x7F]',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_SURROGATE_PAIR]: {
[cv.IS_SURROGATE_PAIR]: {
pattern: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_URL]: {
[cv.IS_URL]: {
format: 'url',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.IS_UUID]: {
[cv.IS_UUID]: {
format: 'uuid',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.LENGTH]: meta => {
[cv.LENGTH]: (meta) => {
const [minLength, maxLength] = meta.constraints;

@@ -269,22 +269,22 @@ if (maxLength || maxLength === 0) {

},
[class_validator_1.ValidationTypes.IS_UPPERCASE]: {
type: 'string'
[cv.IS_UPPERCASE]: {
type: 'string',
},
[class_validator_1.ValidationTypes.MIN_LENGTH]: meta => ({
[cv.MIN_LENGTH]: (meta) => ({
minLength: meta.constraints[0],
type: 'string'
type: 'string',
}),
[class_validator_1.ValidationTypes.MAX_LENGTH]: meta => ({
[cv.MAX_LENGTH]: (meta) => ({
maxLength: meta.constraints[0],
type: 'string'
type: 'string',
}),
[class_validator_1.ValidationTypes.MATCHES]: meta => ({
[cv.MATCHES]: (meta) => ({
pattern: meta.constraints[0].source,
type: 'string'
type: 'string',
}),
[class_validator_1.ValidationTypes.IS_MILITARY_TIME]: {
[cv.IS_MILITARY_TIME]: {
pattern: '^([01]\\d|2[0-3]):?([0-5]\\d)$',
type: 'string'
type: 'string',
},
[class_validator_1.ValidationTypes.ARRAY_CONTAINS]: meta => {
[cv.ARRAY_CONTAINS]: (meta) => {
const schemas = meta.constraints[0].map(constraintToSchema);

@@ -296,7 +296,7 @@ if (schemas.length > 0 && _.every(schemas, 'type')) {

items: {
not: Object.assign({}, d, { enum: [meta.constraints[0][i]] })
}
}))
not: Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }),
},
})),
},
type: 'array'
type: 'array',
};

@@ -306,3 +306,3 @@ }

},
[class_validator_1.ValidationTypes.ARRAY_NOT_CONTAINS]: meta => {
[cv.ARRAY_NOT_CONTAINS]: (meta) => {
const schemas = meta.constraints[0].map(constraintToSchema);

@@ -313,6 +313,6 @@ if (schemas.length > 0 && _.every(schemas, 'type')) {

not: {
anyOf: _.map(schemas, (d, i) => (Object.assign({}, d, { enum: [meta.constraints[0][i]] })))
}
anyOf: _.map(schemas, (d, i) => (Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }))),
},
},
type: 'array'
type: 'array',
};

@@ -322,22 +322,22 @@ }

},
[class_validator_1.ValidationTypes.ARRAY_NOT_EMPTY]: {
[cv.ARRAY_NOT_EMPTY]: {
items: {},
minItems: 1,
type: 'array'
type: 'array',
},
[class_validator_1.ValidationTypes.ARRAY_MIN_SIZE]: meta => ({
[cv.ARRAY_MIN_SIZE]: (meta) => ({
items: {},
minItems: meta.constraints[0],
type: 'array'
type: 'array',
}),
[class_validator_1.ValidationTypes.ARRAY_MAX_SIZE]: meta => ({
[cv.ARRAY_MAX_SIZE]: (meta) => ({
items: {},
maxItems: meta.constraints[0],
type: 'array'
type: 'array',
}),
[class_validator_1.ValidationTypes.ARRAY_UNIQUE]: {
[cv.ARRAY_UNIQUE]: {
items: {},
type: 'array',
uniqueItems: true
}
uniqueItems: true,
},
};

@@ -368,2 +368,2 @@ function getPropType(target, property) {

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbnZlcnRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdENvbnZlcnRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxxREFBaUQ7QUFFakQsNEJBQTJCO0FBRTNCLDRCQUF5QjtBQWFaLFFBQUEsaUJBQWlCLEdBQXNCO0lBQ2xELENBQUMsaUNBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3JELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNsRSxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDckM7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxpQ0FBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckQsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsK0JBQStCO2dCQUN0RCxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUN0RCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxZQUFZLENBQ2xCO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDUixNQUFNLFNBQVMsR0FBRyxRQUFRO2dCQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtnQkFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDekQsT0FBTyxjQUFj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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbnZlcnRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdENvbnZlcnRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxzQ0FBcUM7QUFFckMsNEJBQTJCO0FBRTNCLDRCQUF5QjtBQWFaLFFBQUEsaUJBQWlCLEdBQXNCO0lBQ2xELENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNsRSxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDckM7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDeEQsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsK0JBQStCO2dCQUN0RCxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUN0RCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxZQUFZLENBQ2xCO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDUixNQUFNLFNBQVMsR0FBRyxRQUFRO2dCQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtnQkFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENB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

@@ -1,7 +0,6 @@

import { ValidationMetadata } from 'class-validator/metadata/ValidationMetadata';
import { SchemaObject } from 'openapi3-ts';
import { IOptions } from './options';
export { JSONSchema } from './decorators';
export declare function validationMetadatasToSchemas(metadatas: ValidationMetadata[], userOptions?: Partial<IOptions>): {
export declare function validationMetadatasToSchemas(userOptions?: Partial<IOptions>): {
[key: string]: SchemaObject;
};
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const class_validator_1 = require("class-validator");
const cv = require("class-validator");
const _ = require("lodash");
const debug = require('debug')('routing-controllers-openapi');
const decorators_1 = require("./decorators");

@@ -11,7 +10,8 @@ const defaultConverters_1 = require("./defaultConverters");

exports.JSONSchema = decorators_2.JSONSchema;
function validationMetadatasToSchemas(metadatas, userOptions) {
const options = Object.assign({}, options_1.defaultOptions, userOptions);
function validationMetadatasToSchemas(userOptions) {
const options = Object.assign(Object.assign({}, options_1.defaultOptions), userOptions);
const metadatas = getMetadatasFromStorage(options.classValidatorMetadataStorage);
const schemas = _(metadatas)
.groupBy('target.name')
.mapValues(ownMetas => {
.mapValues((ownMetas) => {
const target = ownMetas[0].target;

@@ -28,3 +28,3 @@ const metas = ownMetas.concat(getInheritedMetadatas(target, metadatas));

properties,
type: 'object'
type: 'object',
};

@@ -41,4 +41,17 @@ const required = getRequiredPropNames(target, metas, options);

exports.validationMetadatasToSchemas = validationMetadatasToSchemas;
function getMetadatasFromStorage(storage) {
const metadatas = _.get(storage, 'validationMetadatas');
const constraints = _.get(storage, 'constraintMetadatas');
for (const meta of metadatas) {
if (meta.constraintCls) {
const constraint = constraints.find((c) => c.target === meta.constraintCls);
if (constraint) {
meta.type = constraint.name;
}
}
}
return metadatas;
}
function getInheritedMetadatas(target, metadatas) {
return metadatas.filter(d => d.target instanceof Function &&
return metadatas.filter((d) => d.target instanceof Function &&
target.prototype instanceof d.target &&

@@ -48,13 +61,9 @@ !_.find(metadatas, {

target,
type: d.type
type: d.type,
}));
}
function applyConverters(propertyMetadatas, options) {
const converters = Object.assign({}, defaultConverters_1.defaultConverters, options.additionalConverters);
const converters = Object.assign(Object.assign({}, defaultConverters_1.defaultConverters), options.additionalConverters);
const convert = (meta) => {
const converter = converters[meta.type];
if (!converter) {
debug('No schema converter found for validation metadata', meta);
return {};
}
const converter = converters[meta.type] || converters[cv.ValidationTypes.CUSTOM_VALIDATION];
const items = _.isFunction(converter) ? converter(meta, options) : converter;

@@ -73,11 +82,11 @@ return meta.each ? { items, type: 'array' } : items;

function isDefined(metas) {
return _.some(metas, { type: class_validator_1.ValidationTypes.IS_DEFINED });
return _.some(metas, { type: cv.ValidationTypes.IS_DEFINED });
}
function isOptional(metas) {
return _.some(metas, ({ type }) => _.includes([class_validator_1.ValidationTypes.CONDITIONAL_VALIDATION, class_validator_1.ValidationTypes.IS_EMPTY], type));
return _.some(metas, ({ type }) => _.includes([cv.ValidationTypes.CONDITIONAL_VALIDATION, cv.IS_EMPTY], type));
}
return _(metadatas)
.groupBy('propertyName')
.pickBy(metas => {
const [own, inherited] = _.partition(metas, d => d.target === target);
.pickBy((metas) => {
const [own, inherited] = _.partition(metas, (d) => d.target === target);
return options.skipMissingProperties

@@ -90,2 +99,2 @@ ? isDefined(own) || (!isOptional(own) && isDefined(inherited))

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxxREFBaUQ7QUFFakQsNEJBQTJCO0FBRTNCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0FBRTdELDZDQUFnRDtBQUNoRCwyREFBdUQ7QUFDdkQsdUNBQW9EO0FBRXBELDJDQUF5QztBQUFoQyxrQ0FBQSxVQUFVLENBQUE7QUFNbkIsU0FBZ0IsNEJBQTRCLENBQzFDLFNBQStCLEVBQy9CLFdBQStCO0lBRS9CLE1BQU0sT0FBTyxxQkFDUix3QkFBYyxFQUNkLFdBQVcsQ0FDZixDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQW9DLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDMUQsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDcEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQWtCLENBQUE7UUFDN0MsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUV2RSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ3hCLE9BQU8sQ0FBQyxjQUFjLENBQUM7YUFDdkIsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDbEQsT0FBTyxlQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDMUQsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxFQUFFLENBQUE7UUFFVixNQUFNLGdCQUFnQixHQUFpQjtZQUNyQyxVQUFVO1lB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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxzQ0FBcUM7QUFHckMsNEJBQTJCO0FBRzNCLDZDQUFnRDtBQUNoRCwyREFBdUQ7QUFDdkQsdUNBQW9EO0FBRXBELDJDQUF5QztBQUFoQyxrQ0FBQSxVQUFVLENBQUE7QUFLbkIsU0FBZ0IsNEJBQTRCLENBQUMsV0FBK0I7SUFDMUUsTUFBTSxPQUFPLG1DQUNSLHdCQUFjLEdBQ2QsV0FBVyxDQUNmLENBQUE7SUFFRCxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FDdkMsT0FBTyxDQUFDLDZCQUE2QixDQUN0QyxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQW9DLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDMUQsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUN0QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBa0IsQ0FBQTtRQUM3QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBRXZFLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDeEIsT0FBTyxDQUFDLGNBQWMsQ0FBQzthQUN2QixTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNsRCxPQUFPLGVBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxRCxDQUFDLENBQUM7YUFDRCxLQUFLLEVBQUUsQ0FBQTtRQUVWLE1BQU0sZ0JBQWdCLEdBQWlCO1lBQ3JDLFVBQVU7WUFDVixJQUFJLEVB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

@@ -1,9 +0,10 @@

import { MetadataStorage } from 'class-transformer/metadata/MetadataStorage';
import { ValidatorOptions } from 'class-validator';
import { MetadataStorage as ClassTransformerMetadataStorage } from 'class-transformer/metadata/MetadataStorage';
import { MetadataStorage, ValidatorOptions } from 'class-validator';
import { ISchemaConverters } from './defaultConverters';
export interface IOptions extends ValidatorOptions {
additionalConverters: ISchemaConverters;
classTransformerMetadataStorage?: MetadataStorage;
classTransformerMetadataStorage?: ClassTransformerMetadataStorage;
classValidatorMetadataStorage: MetadataStorage;
refPointerPrefix: string;
}
export declare const defaultOptions: IOptions;
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const class_validator_1 = require("class-validator");
exports.defaultOptions = {
additionalConverters: {},
refPointerPrefix: '#/definitions/'
classValidatorMetadataStorage: class_validator_1.getMetadataStorage(),
refPointerPrefix: '#/definitions/',
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJhLFFBQUEsY0FBYyxHQUFhO0lBQ3RDLG9CQUFvQixFQUFFLEVBQUU7SUFDeEIsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUEifQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EscURBSXdCO0FBaUNYLFFBQUEsY0FBYyxHQUFhO0lBQ3RDLG9CQUFvQixFQUFFLEVBQUU7SUFDeEIsNkJBQTZCLEVBQUUsb0NBQWtCLEVBQUU7SUFDbkQsZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ25DLENBQUEifQ==

@@ -9,2 +9,28 @@ # Changelog

## [2.0.0-rc1] - 2020-05-01
### Changed
- Bump `class-validator` peer dependency to `^0.12.0` - meaning we're no longer compatible with pre-0.12 versions of `class-validator`!
- `validationMetadatasToSchemas` no longer takes a `validationMetadatas` object as first argument. Instead the library now automatically grabs `validationMetadatas` from `getMetadataStorage()` under the hood.
This simplifies library usage from
```typescript
const metadatas = (getFromContainer(MetadataStorage) as any).validationMetadatas
const schemas = validationMetadatasToSchemas(metadatas)
```
into plain
```typescript
const schemas = validationMetadatasToSchemas()
```
You can still choose to override the default metadata storage using the optional options argument:
```typescript
const schemas = validationMetadatasToSchemas({
classValidatorMetadataStorage: myCustomMetadataStorage
})
```
## [1.3.1] - 2019-12-05

@@ -11,0 +37,0 @@ ### Fixed

{
"name": "class-validator-jsonschema",
"version": "1.3.1",
"version": "2.0.0-rc1",
"description": "Convert class-validator-decorated classes into JSON schema",

@@ -20,4 +20,5 @@ "keywords": [

"format": "prettier --write {src,test}/**/*.ts",
"test:format": "prettier --check {src,test}/**/*.ts",
"lint": "tslint --project . src/**/*.ts",
"prepare": "install-self-peers -- --ignore-scripts && yarn build",
"prepare": "install-self-peers -- --frozen-lockfile --ignore-scripts && yarn build",
"send-coverage": "codecov -f coverage/*.json",

@@ -32,31 +33,30 @@ "test": "jest --coverage",

"dependencies": {
"debug": "^4.1.1",
"lodash": "^4.17.11",
"lodash": "^4.17.15",
"openapi3-ts": "^1.3.0",
"reflect-metadata": "^0.1.13",
"tslib": "^1.10.0"
"tslib": "^1.11.1"
},
"devDependencies": {
"@team-griffin/install-self-peers": "^1.1.1",
"@types/debug": "^4.1.4",
"@types/jest": "^24.0.15",
"@types/lodash": "^4.14.134",
"@types/prettier": "^1.16.4",
"@types/jest": "^25.2.1",
"@types/lodash": "^4.14.150",
"@types/node": "^13.13.4",
"@types/prettier": "^2.0.0",
"@types/reflect-metadata": "^0.1.0",
"@types/rimraf": "^2.0.2",
"@types/rimraf": "^3.0.0",
"codecov": "^3.5.0",
"jest": "^24.8.0",
"prettier": "^1.18.2",
"rimraf": "^2.6.3",
"ts-jest": "^24.0.2",
"tslint": "^5.18.0",
"jest": "^25.5.3",
"prettier": "^2.0.5",
"rimraf": "^3.0.2",
"ts-jest": "^25.4.0",
"tslint": "^6.1.2",
"tslint-config-prettier": "^1.18.0",
"tslint-config-standard": "^8.0.1",
"tsutils": "^3.14.0",
"typescript": "^3.5.2"
"tslint-config-standard": "^9.0.0",
"tsutils": "^3.17.1",
"typescript": "^3.8.3"
},
"peerDependencies": {
"class-transformer": "^0.2.3",
"class-validator": "^0.9.1"
"class-validator": "^0.12.0"
}
}
# class-validator-jsonschema
[![Build Status](https://travis-ci.org/epiphone/class-validator-jsonschema.svg?branch=master)](https://travis-ci.org/epiphone/class-validator-jsonschema) [![codecov](https://codecov.io/gh/epiphone/class-validator-jsonschema/branch/master/graph/badge.svg)](https://codecov.io/gh/epiphone/class-validator-jsonschema) [![npm version](https://badge.fury.io/js/class-validator-jsonschema.svg)](https://badge.fury.io/js/class-validator-jsonschema)

@@ -10,6 +11,10 @@

Note that the library is **only compatible with `class-validator` versions 0.12 or higher**!
Try installing `class-validator-jsonschema@1.3.1` in case you're stuck with an older `class-validator` version.
## Usage
```typescript
import { getFromContainer, IsOptional, IsString, MaxLength, MetadataStorage } from 'class-validator'
import { IsOptional, IsString, MaxLength } from 'class-validator'
import { validationMetadatasToSchemas } from 'class-validator-jsonschema'

@@ -25,4 +30,3 @@

const metadatas = (getFromContainer(MetadataStorage) as any).validationMetadatas
const schemas = validationMetadatasToSchemas(metadatas)
const schemas = validationMetadatasToSchemas()
console.log(schemas)

@@ -48,5 +52,3 @@ ```

},
"required": [
"id"
],
"required": ["id"],
"type": "object"

@@ -57,3 +59,3 @@ }

`validationMetadatasToSchemas` takes an `options` object as an optional second parameter. Check available configuration objects and defaults at [`options.ts`](src/options.ts).
`validationMetadatasToSchemas` takes an `options` object as an optional parameter. Check available configuration objects and defaults at [`options.ts`](src/options.ts).

@@ -69,3 +71,3 @@ ### Adding and overriding default converters

const schemas = validationMetadatasToSchemas(metadatas, {
const schemas = validationMetadatasToSchemas({
additionalConverters: {

@@ -89,3 +91,3 @@ [ValidationTypes.IS_STRING]: {

"type": "string"
},
}
// ...

@@ -100,3 +102,6 @@ }

```typescript
type SchemaConverter = (meta: ValidationMetadata, options: IOptions) => SchemaObject | void
type SchemaConverter = (
meta: ValidationMetadata,
options: IOptions
) => SchemaObject | void
```

@@ -109,3 +114,8 @@

```typescript
import { Validate, ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator'
import {
Validate,
ValidationArguments,
ValidatorConstraint,
ValidatorConstraintInterface
} from 'class-validator'

@@ -130,21 +140,14 @@ // Implementing the validator:

Now to handle your custom validator's JSON Schema conversion include a `customValidation` converter in `options.additionalConverters`:
Now to handle your custom validator's JSON Schema conversion include a `CustomTextLength` converter in `options.additionalConverters`:
```typescript
const schemas = validationMetadatasToSchemas(
validationMetadatas,
{
additionalConverters: {
[ValidationTypes.CUSTOM_VALIDATION]: meta => {
if (meta.constraintCls === CustomTextLength) {
return {
maxLength: meta.constraints[1],
minLength: meta.constraints[0],
type: 'string'
}
}
}
}
const schemas = validationMetadatasToSchemas({
additionalConverters: {
CustomTextLength: meta => ({
maxLength: meta.constraints[1],
minLength: meta.constraints[0],
type: 'string'
})
}
)
})
```

@@ -227,7 +230,7 @@

@ValidateNested({ each: true })
@Type(() => BlogPost) // 1) Explicitly define the nested property type
@Type(() => BlogPost) // 1) Explicitly define the nested property type
blogPosts: BlogPost[]
}
const schemas = validationMetadatasToSchemas(metadatas, {
const schemas = validationMetadatasToSchemas({
classTransformerMetadataStorage: defaultMetadataStorage // 2) Define class-transformer metadata in options

@@ -239,3 +242,12 @@ })

### Using a custom validation metadataStorage
Under the hood we grab validation metadata from the default storage returned by `class-validator`'s `getMetadataStorage()`. In case of a version clash or something you might want to manually pass in the storage:
```typescript
const schemas = validationMetadatasToSchemas({
classValidatorMetadataStorage: myCustomMetadataStorage
})
```
## Limitations

@@ -242,0 +254,0 @@

// tslint:disable:no-submodule-imports
import { ValidationTypes } from 'class-validator'
import { ValidationMetadata } from 'class-validator/metadata/ValidationMetadata'
import * as cv from 'class-validator'
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata'
import * as _ from 'lodash'

@@ -20,3 +20,3 @@ import { SchemaObject } from 'openapi3-ts'

export const defaultConverters: ISchemaConverters = {
[ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
[cv.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
if (_.isFunction(meta.target)) {

@@ -27,3 +27,3 @@ const type = getPropType(meta.target.prototype, meta.propertyName)

},
[ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
[cv.ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
if (_.isFunction(meta.target)) {

@@ -42,5 +42,5 @@ const typeMeta = options.classTransformerMetadataStorage

},
[ValidationTypes.CONDITIONAL_VALIDATION]: {},
[ValidationTypes.IS_DEFINED]: {},
[ValidationTypes.EQUALS]: meta => {
[cv.ValidationTypes.CONDITIONAL_VALIDATION]: {},
[cv.ValidationTypes.IS_DEFINED]: {},
[cv.EQUALS]: (meta) => {
const schema = constraintToSchema(meta.constraints[0])

@@ -51,3 +51,3 @@ if (schema) {

},
[ValidationTypes.NOT_EQUALS]: meta => {
[cv.NOT_EQUALS]: (meta) => {
const schema = constraintToSchema(meta.constraints[0])

@@ -58,3 +58,3 @@ if (schema) {

},
[ValidationTypes.IS_EMPTY]: {
[cv.IS_EMPTY]: {
anyOf: [

@@ -70,14 +70,14 @@ { type: 'string', enum: [''] },

{ type: 'array' },
{ type: 'object' }
]
{ type: 'object' },
],
},
nullable: true
}
]
nullable: true,
},
],
},
[ValidationTypes.IS_NOT_EMPTY]: {
[cv.IS_NOT_EMPTY]: {
minLength: 1,
type: 'string'
type: 'string',
},
[ValidationTypes.IS_IN]: meta => {
[cv.IS_IN]: (meta) => {
const [head, ...rest] = meta.constraints[0].map(constraintToSchema)

@@ -88,3 +88,3 @@ if (head && _.every(rest, { type: head.type })) {

},
[ValidationTypes.IS_NOT_IN]: meta => {
[cv.IS_NOT_IN]: (meta) => {
const [head, ...rest] = meta.constraints[0].map(constraintToSchema)

@@ -95,192 +95,192 @@ if (head && _.every(rest, { type: head.type })) {

},
[ValidationTypes.IS_BOOLEAN]: {
type: 'boolean'
[cv.IS_BOOLEAN]: {
type: 'boolean',
},
[ValidationTypes.IS_DATE]: {
[cv.IS_DATE]: {
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
},
[ValidationTypes.IS_NUMBER]: {
type: 'number'
[cv.IS_NUMBER]: {
type: 'number',
},
[ValidationTypes.IS_STRING]: {
type: 'string'
[cv.IS_STRING]: {
type: 'string',
},
[ValidationTypes.IS_DATE_STRING]: {
[cv.IS_DATE_STRING]: {
pattern: 'd{4}-[01]d-[0-3]dT[0-2]d:[0-5]d:[0-5]d.d+Z?',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_ARRAY]: {
[cv.IS_ARRAY]: {
items: {},
type: 'array'
type: 'array',
},
[ValidationTypes.IS_INT]: {
type: 'integer'
[cv.IS_INT]: {
type: 'integer',
},
[ValidationTypes.IS_ENUM]: meta => {
[cv.IS_ENUM]: (meta) => {
return {
enum: Object.values(meta.constraints[0]),
type: 'string'
type: 'string',
}
},
[ValidationTypes.IS_DIVISIBLE_BY]: meta => ({
[cv.IS_DIVISIBLE_BY]: (meta) => ({
multipleOf: meta.constraints[0],
type: 'number'
type: 'number',
}),
[ValidationTypes.IS_POSITIVE]: {
[cv.IS_POSITIVE]: {
exclusiveMinimum: true,
minimum: 0,
type: 'number'
type: 'number',
},
[ValidationTypes.IS_NEGATIVE]: {
[cv.IS_NEGATIVE]: {
exclusiveMaximum: true,
maximum: 0,
type: 'number'
type: 'number',
},
[ValidationTypes.MIN]: meta => ({
[cv.MIN]: (meta) => ({
minimum: meta.constraints[0],
type: 'number'
type: 'number',
}),
[ValidationTypes.MAX]: meta => ({
[cv.MAX]: (meta) => ({
maximum: meta.constraints[0],
type: 'number'
type: 'number',
}),
[ValidationTypes.MIN_DATE]: meta => ({
[cv.MIN_DATE]: (meta) => ({
description: `After ${meta.constraints[0].toJSON()}`,
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
}),
[ValidationTypes.MAX_DATE]: meta => ({
[cv.MAX_DATE]: (meta) => ({
description: `Before ${meta.constraints[0].toJSON()}`,
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
}),
[ValidationTypes.IS_BOOLEAN_STRING]: {
[cv.IS_BOOLEAN_STRING]: {
enum: ['true', 'false'],
type: 'string'
type: 'string',
},
[ValidationTypes.IS_NUMBER_STRING]: {
[cv.IS_NUMBER_STRING]: {
pattern: '^[-+]?[0-9]+$',
type: 'string'
type: 'string',
},
[ValidationTypes.CONTAINS]: meta => ({
[cv.CONTAINS]: (meta) => ({
pattern: meta.constraints[0],
type: 'string'
type: 'string',
}),
[ValidationTypes.NOT_CONTAINS]: meta => ({
[cv.NOT_CONTAINS]: (meta) => ({
not: { pattern: meta.constraints[0] },
type: 'string'
type: 'string',
}),
[ValidationTypes.IS_ALPHA]: {
[cv.IS_ALPHA]: {
pattern: '^[a-zA-Z]+$',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_ALPHANUMERIC]: {
[cv.IS_ALPHANUMERIC]: {
pattern: '^[0-9a-zA-Z]+$',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_ASCII]: {
[cv.IS_ASCII]: {
pattern: '^[\\x00-\\x7F]+$',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_BASE64]: {
[cv.IS_BASE64]: {
format: 'base64',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_BYTE_LENGTH]: {
type: 'string'
[cv.IS_BYTE_LENGTH]: {
type: 'string',
},
[ValidationTypes.IS_CREDIT_CARD]: {
[cv.IS_CREDIT_CARD]: {
format: 'credit-card',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_CURRENCY]: {
[cv.IS_CURRENCY]: {
format: 'currency',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_EMAIL]: {
[cv.IS_EMAIL]: {
format: 'email',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_FQDN]: {
[cv.IS_FQDN]: {
format: 'hostname',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_FULL_WIDTH]: {
[cv.IS_FULL_WIDTH]: {
pattern:
'[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_HALF_WIDTH]: {
[cv.IS_HALF_WIDTH]: {
pattern:
'[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_VARIABLE_WIDTH]: {
type: 'string'
[cv.IS_VARIABLE_WIDTH]: {
type: 'string',
},
[ValidationTypes.IS_HEX_COLOR]: {
[cv.IS_HEX_COLOR]: {
pattern: '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_HEXADECIMAL]: {
[cv.IS_HEXADECIMAL]: {
pattern: '^[0-9a-fA-F]+$',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_IP]: meta => ({
[cv.IS_IP]: (meta) => ({
format: 'ipv' + (meta.constraints[0] === '6' ? 6 : 4),
type: 'string'
type: 'string',
}),
[ValidationTypes.IS_ISBN]: {
[cv.IS_ISBN]: {
format: 'isbn',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_ISIN]: {
[cv.IS_ISIN]: {
format: 'isin',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_ISO8601]: {
[cv.IS_ISO8601]: {
oneOf: [
{ format: 'date', type: 'string' },
{ format: 'date-time', type: 'string' }
]
{ format: 'date-time', type: 'string' },
],
},
[ValidationTypes.IS_JSON]: {
[cv.IS_JSON]: {
format: 'json',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_LOWERCASE]: {
type: 'string'
[cv.IS_LOWERCASE]: {
type: 'string',
},
[ValidationTypes.IS_MOBILE_PHONE]: {
[cv.IS_MOBILE_PHONE]: {
format: 'mobile-phone',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_MONGO_ID]: {
[cv.IS_MONGO_ID]: {
pattern: '^[0-9a-fA-F]{24}$',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_MULTIBYTE]: {
[cv.IS_MULTIBYTE]: {
pattern: '[^\\x00-\\x7F]',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_SURROGATE_PAIR]: {
[cv.IS_SURROGATE_PAIR]: {
pattern: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_URL]: {
[cv.IS_URL]: {
format: 'url',
type: 'string'
type: 'string',
},
[ValidationTypes.IS_UUID]: {
[cv.IS_UUID]: {
format: 'uuid',
type: 'string'
type: 'string',
},
[ValidationTypes.LENGTH]: meta => {
[cv.LENGTH]: (meta) => {
const [minLength, maxLength] = meta.constraints

@@ -292,22 +292,22 @@ if (maxLength || maxLength === 0) {

},
[ValidationTypes.IS_UPPERCASE]: {
type: 'string'
[cv.IS_UPPERCASE]: {
type: 'string',
},
[ValidationTypes.MIN_LENGTH]: meta => ({
[cv.MIN_LENGTH]: (meta) => ({
minLength: meta.constraints[0],
type: 'string'
type: 'string',
}),
[ValidationTypes.MAX_LENGTH]: meta => ({
[cv.MAX_LENGTH]: (meta) => ({
maxLength: meta.constraints[0],
type: 'string'
type: 'string',
}),
[ValidationTypes.MATCHES]: meta => ({
[cv.MATCHES]: (meta) => ({
pattern: meta.constraints[0].source,
type: 'string'
type: 'string',
}),
[ValidationTypes.IS_MILITARY_TIME]: {
[cv.IS_MILITARY_TIME]: {
pattern: '^([01]\\d|2[0-3]):?([0-5]\\d)$',
type: 'string'
type: 'string',
},
[ValidationTypes.ARRAY_CONTAINS]: meta => {
[cv.ARRAY_CONTAINS]: (meta) => {
const schemas = meta.constraints[0].map(constraintToSchema)

@@ -321,8 +321,8 @@ if (schemas.length > 0 && _.every(schemas, 'type')) {

...d,
enum: [meta.constraints[0][i]]
}
}
}))
enum: [meta.constraints[0][i]],
},
},
})),
},
type: 'array'
type: 'array',
}

@@ -332,3 +332,3 @@ }

},
[ValidationTypes.ARRAY_NOT_CONTAINS]: meta => {
[cv.ARRAY_NOT_CONTAINS]: (meta) => {
const schemas = meta.constraints[0].map(constraintToSchema)

@@ -341,7 +341,7 @@ if (schemas.length > 0 && _.every(schemas, 'type')) {

...d,
enum: [meta.constraints[0][i]]
}))
}
enum: [meta.constraints[0][i]],
})),
},
},
type: 'array'
type: 'array',
}

@@ -351,22 +351,22 @@ }

},
[ValidationTypes.ARRAY_NOT_EMPTY]: {
[cv.ARRAY_NOT_EMPTY]: {
items: {},
minItems: 1,
type: 'array'
type: 'array',
},
[ValidationTypes.ARRAY_MIN_SIZE]: meta => ({
[cv.ARRAY_MIN_SIZE]: (meta) => ({
items: {},
minItems: meta.constraints[0],
type: 'array'
type: 'array',
}),
[ValidationTypes.ARRAY_MAX_SIZE]: meta => ({
[cv.ARRAY_MAX_SIZE]: (meta) => ({
items: {},
maxItems: meta.constraints[0],
type: 'array'
type: 'array',
}),
[ValidationTypes.ARRAY_UNIQUE]: {
[cv.ARRAY_UNIQUE]: {
items: {},
type: 'array',
uniqueItems: true
}
uniqueItems: true,
},
}

@@ -373,0 +373,0 @@

// tslint:disable:no-submodule-imports ban-types
import { ValidationTypes } from 'class-validator'
import { ValidationMetadata } from 'class-validator/metadata/ValidationMetadata'
import * as cv from 'class-validator'
import { ConstraintMetadata } from 'class-validator/types/metadata/ConstraintMetadata'
import { ValidationMetadata } from 'class-validator/types/metadata/ValidationMetadata'
import * as _ from 'lodash'
import { SchemaObject } from 'openapi3-ts'
const debug = require('debug')('routing-controllers-openapi')

@@ -15,17 +15,17 @@ import { getMetadataSchema } from './decorators'

/**
* Convert class-validator metadata objects into JSON Schema definitions.
* @param metadatas All class-validator metadata objects.
* Convert class-validator metadata into JSON Schema definitions.
*/
export function validationMetadatasToSchemas(
metadatas: ValidationMetadata[],
userOptions?: Partial<IOptions>
) {
export function validationMetadatasToSchemas(userOptions?: Partial<IOptions>) {
const options: IOptions = {
...defaultOptions,
...userOptions
...userOptions,
}
const metadatas = getMetadatasFromStorage(
options.classValidatorMetadataStorage
)
const schemas: { [key: string]: SchemaObject } = _(metadatas)
.groupBy('target.name')
.mapValues(ownMetas => {
.mapValues((ownMetas) => {
const target = ownMetas[0].target as Function

@@ -44,3 +44,3 @@ const metas = ownMetas.concat(getInheritedMetadatas(target, metadatas))

properties,
type: 'object'
type: 'object',
}

@@ -61,2 +61,28 @@

/**
* Return `storage.validationMetadatas` populated with `constraintMetadatas`.
*/
function getMetadatasFromStorage(
storage: cv.MetadataStorage
): ValidationMetadata[] {
const metadatas: ValidationMetadata[] = _.get(storage, 'validationMetadatas')
const constraints: ConstraintMetadata[] = _.get(
storage,
'constraintMetadatas'
)
for (const meta of metadatas) {
if (meta.constraintCls) {
const constraint = constraints.find(
(c) => c.target === meta.constraintCls
)
if (constraint) {
meta.type = constraint.name
}
}
}
return metadatas
}
/**
* Return target class' inherited validation metadatas, with original metadatas

@@ -75,3 +101,3 @@ * given precedence over inherited ones in case of duplicates.

return metadatas.filter(
d =>
(d) =>
d.target instanceof Function &&

@@ -82,3 +108,3 @@ target.prototype instanceof d.target &&

target,
type: d.type
type: d.type,
})

@@ -97,7 +123,4 @@ )

const convert = (meta: ValidationMetadata) => {
const converter = converters[meta.type]
if (!converter) {
debug('No schema converter found for validation metadata', meta)
return {}
}
const converter =
converters[meta.type] || converters[cv.ValidationTypes.CUSTOM_VALIDATION]

@@ -140,10 +163,7 @@ const items = _.isFunction(converter) ? converter(meta, options) : converter

function isDefined(metas: ValidationMetadata[]) {
return _.some(metas, { type: ValidationTypes.IS_DEFINED })
return _.some(metas, { type: cv.ValidationTypes.IS_DEFINED })
}
function isOptional(metas: ValidationMetadata[]) {
return _.some(metas, ({ type }) =>
_.includes(
[ValidationTypes.CONDITIONAL_VALIDATION, ValidationTypes.IS_EMPTY],
type
)
_.includes([cv.ValidationTypes.CONDITIONAL_VALIDATION, cv.IS_EMPTY], type)
)

@@ -154,4 +174,4 @@ }

.groupBy('propertyName')
.pickBy(metas => {
const [own, inherited] = _.partition(metas, d => d.target === target)
.pickBy((metas) => {
const [own, inherited] = _.partition(metas, (d) => d.target === target)
return options.skipMissingProperties

@@ -158,0 +178,0 @@ ? isDefined(own) || (!isOptional(own) && isDefined(inherited))

@@ -1,3 +0,7 @@

import { MetadataStorage } from 'class-transformer/metadata/MetadataStorage' // tslint:disable-line:no-submodule-imports
import { ValidatorOptions } from 'class-validator'
import { MetadataStorage as ClassTransformerMetadataStorage } from 'class-transformer/metadata/MetadataStorage' // tslint:disable-line:no-submodule-imports
import {
getMetadataStorage,
MetadataStorage,
ValidatorOptions,
} from 'class-validator'

@@ -19,5 +23,12 @@ import { ISchemaConverters } from './defaultConverters'

*/
classTransformerMetadataStorage?: MetadataStorage
classTransformerMetadataStorage?: ClassTransformerMetadataStorage
/**
* Metadata storage instance of class-validator. This value can be
* optionally defined in order to override the default storage used
* to parse decorator metadata.
*/
classValidatorMetadataStorage: MetadataStorage
/**
* A prefix added to all `$ref` JSON pointers referencing other schemas.

@@ -31,3 +42,4 @@ * Defaults to '#/definitions/'.

additionalConverters: {},
refPointerPrefix: '#/definitions/'
classValidatorMetadataStorage: getMetadataStorage(),
refPointerPrefix: '#/definitions/',
}

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc