swagger-route-validator
Version:
The fastest openapi validation middleware
100 lines (99 loc) • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.format = format;
const error_1 = require("./error");
const url_1 = require("url");
const formatMap = {
int8,
int16,
int32,
int64,
'double': finiteNumber,
'float': finiteNumber,
date,
'date-time': dateTime,
uuid,
uri,
ipv4,
ipv6,
email,
};
// -- Atoms
function format(cursor, value, expectation, errors) {
if (!(expectation in formatMap)) {
throw new Error(`Invalid field format value ${expectation}, pattern must be one of ${Object.keys(formatMap)}`);
}
formatMap[expectation](cursor, value, errors, expectation);
return errors;
}
// data formats
function int64(cursor, value, errors) {
// Bounds exceed MAX_SAFE_INTEGER
if (!Number.isInteger(value)) {
errors.push((0, error_1.makeError)(cursor, value, 'Value does not match int64 format'));
}
}
function finiteNumber(cursor, value, errors, format) {
if (!Number.isFinite(value)) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match ${format} format`));
}
}
function int32(cursor, value, errors) {
if (!Number.isInteger(value) || value > 0x7fffffff || value < -0x80000000) {
errors.push((0, error_1.makeError)(cursor, value, 'Value does not match int32 format'));
}
}
function int16(cursor, value, errors) {
if (!Number.isInteger(value) || value > 0x7fff || value < -0x8000) {
errors.push((0, error_1.makeError)(cursor, value, 'Value does not match int16 format'));
}
}
function int8(cursor, value, errors) {
if (!Number.isInteger(value) || value > 0x7f || value < -0x80) {
errors.push((0, error_1.makeError)(cursor, value, 'Value does not match int16 format'));
}
}
function dateTime(cursor, value, errors) {
const result = new RegExp(/^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(-)?(.[0-9:]+)?(Z)?$/).exec(value);
if (result === null) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match ISO date-time (RFC 3339 date-time) pattern ex: 1970-12-31T23:59:60Z`));
}
}
function date(cursor, value, errors) {
const result = new RegExp(/^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])$/).exec(value);
if (result === null) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match ISO date-time (RFC 3339 full-date) pattern ex: 1970-12-31`));
}
}
function uuid(cursor, value, errors) {
const result = new RegExp(/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i).exec(value);
if (result === null) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match UUID pattern`));
}
}
function uri(cursor, value, errors) {
try {
return new url_1.URL(value);
}
catch (err) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match URI pattern`));
}
}
function ipv4(cursor, value, errors) {
const result = new RegExp(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).exec(value);
if (result === null) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match IPV4 pattern`));
}
}
function ipv6(cursor, value, errors) {
const result = new RegExp(/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/).exec(value);
if (result === null) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match ipv6 pattern`));
}
}
function email(cursor, value, errors) {
const result = new RegExp(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/).exec(value);
if (result === null) {
errors.push((0, error_1.makeError)(cursor, value, `Value does not match email pattern`));
}
}