UNPKG

json-schema-to-joi

Version:

Converts JSON schema to Joi typescript code

120 lines 3.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateStringJoi = exports.resolveJoiStringSchema = exports.octetRegex = exports.dateTimeRegex = exports.timeRegex = exports.dateRegex = void 0; const types_1 = require("./types"); const generate_1 = require("./generate"); const any_1 = require("./any"); exports.dateRegex = '(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])'; exports.timeRegex = '([01][0-9]|2[0-3]):([0-5][0-9]):' + '([0-5][0-9]|60)(.[0-9]{3})?(Z|(\\+|-)([01][0-9]|2[0-3]):([0-5][0-9]))'; exports.dateTimeRegex = exports.dateRegex + 'T' + exports.timeRegex; exports.octetRegex = '(0x|0X)?[0-9a-fA-F]+'; function resolveJoiStringSchema(schema) { const joiSchema = types_1.createJoiItem('string'); let withZeroMinLength = true; switch (schema.format) { case 'date': joiSchema.regex = new RegExp('^' + exports.dateRegex + '$', 'i'); break; case 'time': joiSchema.regex = new RegExp('^' + exports.timeRegex + '$', 'i'); break; case 'date-time': joiSchema.regex = new RegExp('^' + exports.dateTimeRegex + '$', 'i'); break; case 'binary': joiSchema.regex = new RegExp('^' + exports.octetRegex + '$', 'i'); break; case 'email': joiSchema.email = true; withZeroMinLength = false; break; case 'hostname': joiSchema.hostname = true; withZeroMinLength = false; break; case 'ipv4': joiSchema.ip = 'ipv4'; withZeroMinLength = false; break; case 'ipv6': joiSchema.ip = 'ipv6'; withZeroMinLength = false; break; case 'uri': joiSchema.uri = true; withZeroMinLength = false; break; case 'byte': joiSchema.base64 = true; withZeroMinLength = false; break; case 'uuid': case 'guid': joiSchema.uuid = true; withZeroMinLength = false; break; } if (schema.pattern) { joiSchema.regex = new RegExp(schema.pattern); } if (joiSchema.regex) { const regex = joiSchema.regex; if (!regex.test('')) { withZeroMinLength = false; } } const minLength = schema.minLength; const maxLength = schema.maxLength; if (minLength !== undefined) { if (minLength === maxLength) { joiSchema.length = minLength; } else { joiSchema.min = minLength; } } if (maxLength !== undefined) { if (minLength === maxLength) { joiSchema.length = maxLength; } else { joiSchema.max = maxLength; } } if (((minLength === undefined && withZeroMinLength) || minLength === 0) && !schema.enum) { joiSchema.min = 0; joiSchema.allow = ['']; } any_1.resolveJoiAnyMeta(joiSchema, schema); return joiSchema; } exports.resolveJoiStringSchema = resolveJoiStringSchema; function generateStringJoi(schema) { const content = generate_1.openJoi([ 200, 'string()', ]); if (schema.length !== undefined) { content.push(`.length(${schema.length})`); } else { if (schema.min !== undefined) { content.push(`.min(${schema.min})`); } if (schema.max !== undefined) { content.push(`.max(${schema.max})`); } } if (schema.regex) { content.push('.regex(' + schema.regex.toString() + ')'); } if (schema.ip) { content.push(`.ip({ version: '${schema.ip}' })`); } content.push(...any_1.generateAnyJoi(schema)); return generate_1.closeJoi(content); } exports.generateStringJoi = generateStringJoi; //# sourceMappingURL=string.js.map