class-validator-jsonschema
Version:
Convert class-validator-decorated classes into JSON schema
83 lines (75 loc) • 1.96 kB
text/typescript
// tslint:disable:no-submodule-imports
import {
ArrayMaxSize,
ArrayNotContains,
getFromContainer,
IsEmpty,
IsMongoId,
MaxLength,
MetadataStorage,
} from 'class-validator'
import _get from 'lodash.get'
import { JSONSchema, validationMetadatasToSchemas } from '../src'
@JSONSchema({
deprecated: true,
description: 'A User object',
example: { id: '123' },
})
// @ts-ignore: not referenced
class User {
@JSONSchema({
default: '1',
description: 'User ID',
pattern: '.*',
})
@IsMongoId()
id: string
@MaxLength(20, { each: true })
@ArrayMaxSize(5)
@JSONSchema({
items: { description: 'Tag string' },
})
@ArrayNotContains(['admin'])
tags?: string[]
@JSONSchema(() => ({
anyOf: [{ type: 'null' }, { type: 'string', const: '' }],
}))
@IsEmpty()
empty?: string
}
const metadata = _get(getFromContainer(MetadataStorage), 'validationMetadatas')
const schemas = validationMetadatasToSchemas(metadata)
describe('decorators', () => {
it('merges class-level schema keywords from decorator value', () => {
expect(schemas.User.deprecated).toBe(true)
expect(schemas.User.description).toEqual('A User object')
expect(schemas.User.example).toEqual({ id: '123' })
expect(schemas.User.required).toEqual(['id', 'tags'])
expect(schemas.User.type).toEqual('object')
})
it('merges property-level schema keywords from decorator value', () => {
expect(schemas.User.properties).toEqual({
empty: {
anyOf: [{ type: 'null' }, { type: 'string', const: '' }],
},
id: {
default: '1',
description: 'User ID',
pattern: '.*',
type: 'string',
},
tags: {
items: {
description: 'Tag string',
maxLength: 20,
not: {
anyOf: [{ enum: ['admin'], type: 'string' }],
},
type: 'string',
},
maxItems: 5,
type: 'array',
},
})
})
})