json-schema-to-joi
Version:
Converts JSON schema to Joi typescript code
120 lines • 3.93 kB
JavaScript
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
;