class-validator-jsonschema
Version:
Convert class-validator-decorated classes into JSON schema
370 lines • 25.5 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultConverters = void 0;
const tslib_1 = require("tslib");
const cv = tslib_1.__importStar(require("class-validator"));
require("reflect-metadata");
exports.defaultConverters = {
[cv.ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
if (typeof meta.target === 'function') {
const type = getPropType(meta.target.prototype, meta.propertyName);
return targetToSchema(type, options);
}
},
[cv.ValidationTypes.NESTED_VALIDATION]: (meta, options) => {
if (typeof meta.target === 'function') {
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.WHITELIST]: {},
[cv.ValidationTypes.CONDITIONAL_VALIDATION]: {},
[cv.ValidationTypes.IS_DEFINED]: {
not: { type: 'null' },
},
[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 && rest.every((item) => item.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 && rest.every((item) => item.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: 0,
type: 'number',
},
[cv.IS_NEGATIVE]: {
exclusiveMaximum: 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.IS_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.IS_OBJECT]: {
type: 'object',
},
[cv.IS_NOT_EMPTY_OBJECT]: {
type: 'object',
minProperties: 1,
},
[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 && schemas.every((s) => s && s.type)) {
return {
not: {
anyOf: schemas.map((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 && schemas.every((s) => s && s.type)) {
return {
items: {
not: {
anyOf: schemas.map((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 (primitives.includes(type)) {
return { type: type };
}
}
function targetToSchema(type, options) {
if (typeof type === 'function') {
if (type.prototype === String.prototype ||
type.prototype === Symbol.prototype) {
return { type: 'string' };
}
else if (type.prototype === Number.prototype) {
return { type: 'number' };
}
else if (type.prototype === Boolean.prototype) {
return { type: 'boolean' };
}
return { $ref: options.refPointerPrefix + type.name };
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdENvbnZlcnRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdENvbnZlcnRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLDREQUFxQztBQUdyQyw0QkFBeUI7QUFhWixRQUFBLGlCQUFpQixHQUFzQjtJQUNsRCxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4RCxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7WUFDckMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUNsRSxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDckM7SUFDSCxDQUFDO0lBQ0QsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDeEQsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQ3JDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQywrQkFBK0I7Z0JBQ3RELENBQUMsQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsZ0JBQWdCLENBQ3RELElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFlBQVksQ0FDbEI7Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUNSLE1BQU0sU0FBUyxHQUFHLFFBQVE7Z0JBQ3hCLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO2dCQUN6QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUN6RCxPQUFPLGNBQWMsQ0FBQyxTQUFTLEVB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
;