UNPKG

class-validator-jsonschema

Version:

Convert class-validator-decorated classes into JSON schema

360 lines 24.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const cv = require("class-validator"); const _ = require("lodash"); require("reflect-metadata"); exports.defaultConverters = { [cv.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => { if (_.isFunction(meta.target)) { const type = getPropType(meta.target.prototype, meta.propertyName); return targetToSchema(type, options); } }, [cv.ValidationTypes.NESTED_VALIDATION]: (meta, options) => { if (_.isFunction(meta.target)) { const typeMeta = options.classTransformerMetadataStorage ? options.classTransformerMetadataStorage.findTypeMetadata(meta.target, meta.propertyName) : null; const childType = typeMeta ? typeMeta.typeFunction() : getPropType(meta.target.prototype, meta.propertyName); return targetToSchema(childType, options); } }, [cv.ValidationTypes.CONDITIONAL_VALIDATION]: {}, [cv.ValidationTypes.IS_DEFINED]: {}, [cv.EQUALS]: (meta) => { const schema = constraintToSchema(meta.constraints[0]); if (schema) { return Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] }); } }, [cv.NOT_EQUALS]: (meta) => { const schema = constraintToSchema(meta.constraints[0]); if (schema) { return { not: Object.assign(Object.assign({}, schema), { enum: [meta.constraints[0]] }) }; } }, [cv.IS_EMPTY]: { anyOf: [ { type: 'string', enum: [''] }, { not: { anyOf: [ { type: 'string' }, { type: 'number' }, { type: 'boolean' }, { type: 'integer' }, { type: 'array' }, { type: 'object' }, ], }, nullable: true, }, ], }, [cv.IS_NOT_EMPTY]: { minLength: 1, type: 'string', }, [cv.IS_IN]: (meta) => { const [head, ...rest] = meta.constraints[0].map(constraintToSchema); if (head && _.every(rest, { type: head.type })) { return Object.assign(Object.assign({}, head), { enum: meta.constraints[0] }); } }, [cv.IS_NOT_IN]: (meta) => { const [head, ...rest] = meta.constraints[0].map(constraintToSchema); if (head && _.every(rest, { type: head.type })) { return { not: Object.assign(Object.assign({}, head), { enum: meta.constraints[0] }) }; } }, [cv.IS_BOOLEAN]: { type: 'boolean', }, [cv.IS_DATE]: { oneOf: [ { format: 'date', type: 'string' }, { format: 'date-time', type: 'string' }, ], }, [cv.IS_NUMBER]: { type: 'number', }, [cv.IS_STRING]: { type: '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', }, [cv.IS_ARRAY]: { items: {}, type: 'array', }, [cv.IS_INT]: { type: 'integer', }, [cv.IS_ENUM]: (meta) => { return { enum: Object.values(meta.constraints[0]), type: 'string', }; }, [cv.IS_DIVISIBLE_BY]: (meta) => ({ multipleOf: meta.constraints[0], type: 'number', }), [cv.IS_POSITIVE]: { exclusiveMinimum: true, minimum: 0, type: 'number', }, [cv.IS_NEGATIVE]: { exclusiveMaximum: true, maximum: 0, type: 'number', }, [cv.MIN]: (meta) => ({ minimum: meta.constraints[0], type: 'number', }), [cv.MAX]: (meta) => ({ maximum: meta.constraints[0], type: 'number', }), [cv.MIN_DATE]: (meta) => ({ description: `After ${meta.constraints[0].toJSON()}`, oneOf: [ { format: 'date', type: 'string' }, { format: 'date-time', type: 'string' }, ], }), [cv.MAX_DATE]: (meta) => ({ description: `Before ${meta.constraints[0].toJSON()}`, oneOf: [ { format: 'date', type: 'string' }, { format: 'date-time', type: 'string' }, ], }), [cv.IS_BOOLEAN_STRING]: { enum: ['true', 'false'], type: 'string', }, [cv.IS_NUMBER_STRING]: { pattern: '^[-+]?[0-9]+$', type: 'string', }, [cv.CONTAINS]: (meta) => ({ pattern: meta.constraints[0], type: 'string', }), [cv.NOT_CONTAINS]: (meta) => ({ not: { pattern: meta.constraints[0] }, type: 'string', }), [cv.IS_ALPHA]: { pattern: '^[a-zA-Z]+$', type: 'string', }, [cv.IS_ALPHANUMERIC]: { pattern: '^[0-9a-zA-Z]+$', type: 'string', }, [cv.IS_ASCII]: { pattern: '^[\\x00-\\x7F]+$', type: 'string', }, [cv.IS_BASE64]: { format: 'base64', type: 'string', }, [cv.IS_BYTE_LENGTH]: { type: 'string', }, [cv.IS_CREDIT_CARD]: { format: 'credit-card', type: 'string', }, [cv.IS_CURRENCY]: { format: 'currency', type: 'string', }, [cv.IS_EMAIL]: { format: 'email', type: 'string', }, [cv.IS_FQDN]: { format: 'hostname', type: 'string', }, [cv.IS_FULL_WIDTH]: { pattern: '[^\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]', type: 'string', }, [cv.IS_HALF_WIDTH]: { pattern: '[\\u0020-\\u007E\\uFF61-\\uFF9F\\uFFA0-\\uFFDC\\uFFE8-\\uFFEE0-9a-zA-Z]', type: 'string', }, [cv.IS_VARIABLE_WIDTH]: { type: 'string', }, [cv.IS_HEX_COLOR]: { pattern: '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$', type: 'string', }, [cv.IS_HEXADECIMAL]: { pattern: '^[0-9a-fA-F]+$', type: 'string', }, [cv.IS_IP]: (meta) => ({ format: 'ipv' + (meta.constraints[0] === '6' ? 6 : 4), type: 'string', }), [cv.IS_ISBN]: { format: 'isbn', type: 'string', }, [cv.IS_ISIN]: { format: 'isin', type: 'string', }, [cv.IS_ISO8601]: { oneOf: [ { format: 'date', type: 'string' }, { format: 'date-time', type: 'string' }, ], }, [cv.IS_JSON]: { format: 'json', type: 'string', }, [cv.IS_LOWERCASE]: { type: 'string', }, [cv.IS_MOBILE_PHONE]: { format: 'mobile-phone', type: 'string', }, [cv.IS_MONGO_ID]: { pattern: '^[0-9a-fA-F]{24}$', type: 'string', }, [cv.IS_MULTIBYTE]: { pattern: '[^\\x00-\\x7F]', type: 'string', }, [cv.IS_SURROGATE_PAIR]: { pattern: '[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]', type: 'string', }, [cv.IS_URL]: { format: 'url', type: 'string', }, [cv.IS_UUID]: { format: 'uuid', type: 'string', }, [cv.LENGTH]: (meta) => { const [minLength, maxLength] = meta.constraints; if (maxLength || maxLength === 0) { return { minLength, maxLength, type: 'string' }; } return { minLength, type: 'string' }; }, [cv.IS_UPPERCASE]: { type: 'string', }, [cv.MIN_LENGTH]: (meta) => ({ minLength: meta.constraints[0], type: 'string', }), [cv.MAX_LENGTH]: (meta) => ({ maxLength: meta.constraints[0], type: 'string', }), [cv.MATCHES]: (meta) => ({ pattern: meta.constraints[0].source, type: 'string', }), [cv.IS_MILITARY_TIME]: { pattern: '^([01]\\d|2[0-3]):?([0-5]\\d)$', type: 'string', }, [cv.ARRAY_CONTAINS]: (meta) => { const schemas = meta.constraints[0].map(constraintToSchema); if (schemas.length > 0 && _.every(schemas, 'type')) { return { not: { anyOf: _.map(schemas, (d, i) => ({ items: { not: Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }), }, })), }, type: 'array', }; } return { items: {}, type: 'array' }; }, [cv.ARRAY_NOT_CONTAINS]: (meta) => { const schemas = meta.constraints[0].map(constraintToSchema); if (schemas.length > 0 && _.every(schemas, 'type')) { return { items: { not: { anyOf: _.map(schemas, (d, i) => (Object.assign(Object.assign({}, d), { enum: [meta.constraints[0][i]] }))), }, }, type: 'array', }; } return { items: {}, type: 'array' }; }, [cv.ARRAY_NOT_EMPTY]: { items: {}, minItems: 1, type: 'array', }, [cv.ARRAY_MIN_SIZE]: (meta) => ({ items: {}, minItems: meta.constraints[0], type: 'array', }), [cv.ARRAY_MAX_SIZE]: (meta) => ({ items: {}, maxItems: meta.constraints[0], type: 'array', }), [cv.ARRAY_UNIQUE]: { items: {}, type: 'array', uniqueItems: true, }, }; function getPropType(target, property) { return Reflect.getMetadata('design:type', target, property); } function constraintToSchema(primitive) { const primitives = ['string', 'number', 'boolean']; const type = typeof primitive; if (_.includes(primitives, type)) { return { type }; } } function targetToSchema(type, options) { if (_.isFunction(type)) { if (_.isString(type.prototype) || _.isSymbol(type.prototype)) { return { type: 'string' }; } else if (_.isNumber(type.prototype)) { return { type: 'number' }; } else if (_.isBoolean(type.prototype)) { return { type: 'boolean' }; } return { $ref: options.refPointerPrefix + type.name }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbnZlcnRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdENvbnZlcnRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxzQ0FBcUM7QUFFckMsNEJBQTJCO0FBRTNCLDRCQUF5QjtBQWFaLFFBQUEsaUJBQWlCLEdBQXNCO0lBQ2xELENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hELElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNsRSxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDckM7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDeEQsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsK0JBQStCO2dCQUN0RCxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLGdCQUFnQixDQUN0RCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxZQUFZLENBQ2xCO2dCQUNILENBQUMsQ0FBQyxJQUFJLENBQUE7WUFDUixNQUFNLFNBQVMsR0FBRyxRQUFRO2dCQUN4QixDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtnQkFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENB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