241 lines
8.4 KiB
JavaScript
241 lines
8.4 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getParameterValidators = getParameterValidators;
|
|
exports.getPropertyValidators = getPropertyValidators;
|
|
exports.shouldIncludeValidatorInSchema = shouldIncludeValidatorInSchema;
|
|
const validator_1 = __importDefault(require("validator"));
|
|
const exceptions_1 = require("./../metadataGeneration/exceptions");
|
|
const jsDocUtils_1 = require("./jsDocUtils");
|
|
function getParameterValidators(parameter, parameterName) {
|
|
if (!parameter.parent) {
|
|
return {};
|
|
}
|
|
const getCommentValue = (comment) => comment && comment.split(' ')[0];
|
|
const tags = (0, jsDocUtils_1.getJSDocTags)(parameter.parent, tag => {
|
|
const { comment } = tag;
|
|
return getParameterTagSupport().some(value => !!(0, jsDocUtils_1.commentToString)(comment) && value === tag.tagName.text && getCommentValue((0, jsDocUtils_1.commentToString)(comment)) === parameterName);
|
|
});
|
|
function getErrorMsg(comment, isValue = true) {
|
|
if (!comment) {
|
|
return;
|
|
}
|
|
if (isValue) {
|
|
const indexOf = comment.indexOf(' ');
|
|
if (indexOf > 0) {
|
|
return comment.substr(indexOf + 1);
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
else {
|
|
return comment;
|
|
}
|
|
}
|
|
return tags.reduce((validateObj, tag) => {
|
|
if (!tag.comment) {
|
|
return validateObj;
|
|
}
|
|
const name = tag.tagName.text;
|
|
const comment = (0, jsDocUtils_1.commentToString)(tag.comment)
|
|
?.substring(((0, jsDocUtils_1.commentToString)(tag.comment)?.indexOf(' ') || -1) + 1)
|
|
.trim();
|
|
const value = getCommentValue(comment);
|
|
switch (name) {
|
|
case 'uniqueItems':
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg(comment, false),
|
|
value: undefined,
|
|
};
|
|
break;
|
|
case 'minimum':
|
|
case 'maximum':
|
|
case 'minItems':
|
|
case 'maxItems':
|
|
case 'minLength':
|
|
case 'maxLength':
|
|
if (isNaN(value)) {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use number.`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg(comment),
|
|
value: Number(value),
|
|
};
|
|
break;
|
|
case 'minDate':
|
|
case 'maxDate':
|
|
if (!validator_1.default.isISO8601(String(value), { strict: true })) {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use date format ISO 8601 ex. 2017-05-14, 2017-05-14T05:18Z`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg(comment),
|
|
value,
|
|
};
|
|
break;
|
|
case 'pattern':
|
|
if (typeof value !== 'string') {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use string.`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg(comment),
|
|
value: removeSurroundingQuotes(value),
|
|
};
|
|
break;
|
|
default:
|
|
if (name.startsWith('is')) {
|
|
const errorMsg = getErrorMsg(comment, false);
|
|
if (errorMsg) {
|
|
validateObj[name] = {
|
|
errorMsg,
|
|
value: undefined,
|
|
};
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return validateObj;
|
|
}, {});
|
|
}
|
|
function getPropertyValidators(property) {
|
|
const tags = (0, jsDocUtils_1.getJSDocTags)(property, tag => {
|
|
return getParameterTagSupport().some(value => value === tag.tagName.text);
|
|
});
|
|
function getValue(comment) {
|
|
if (!comment) {
|
|
return;
|
|
}
|
|
return comment.split(' ')[0];
|
|
}
|
|
function getFullValue(comment) {
|
|
if (!comment) {
|
|
return;
|
|
}
|
|
if (comment.includes('\n')) {
|
|
return comment.split('\n')[0];
|
|
}
|
|
return comment;
|
|
}
|
|
function getErrorMsg(comment, isValue = true) {
|
|
if (!comment) {
|
|
return;
|
|
}
|
|
if (isValue) {
|
|
const indexOf = comment.indexOf(' ');
|
|
if (indexOf > 0) {
|
|
return comment.substr(indexOf + 1);
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
else {
|
|
return comment;
|
|
}
|
|
}
|
|
return tags.reduce((validateObj, tag) => {
|
|
const name = tag.tagName.text;
|
|
const comment = tag.comment;
|
|
const value = getValue((0, jsDocUtils_1.commentToString)(comment));
|
|
switch (name) {
|
|
case 'uniqueItems':
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg((0, jsDocUtils_1.commentToString)(comment), false),
|
|
value: undefined,
|
|
};
|
|
break;
|
|
case 'minimum':
|
|
case 'maximum':
|
|
case 'minItems':
|
|
case 'maxItems':
|
|
case 'minLength':
|
|
case 'maxLength':
|
|
if (isNaN(value)) {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use number.`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg((0, jsDocUtils_1.commentToString)(comment)),
|
|
value: Number(value),
|
|
};
|
|
break;
|
|
case 'minDate':
|
|
case 'maxDate':
|
|
if (!validator_1.default.isISO8601(String(value), { strict: true })) {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use date format ISO 8601 ex. 2017-05-14, 2017-05-14T05:18Z`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg((0, jsDocUtils_1.commentToString)(comment)),
|
|
value,
|
|
};
|
|
break;
|
|
case 'pattern':
|
|
if (typeof value !== 'string') {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use string.`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg((0, jsDocUtils_1.commentToString)(comment)),
|
|
value: removeSurroundingQuotes(value),
|
|
};
|
|
break;
|
|
case 'title':
|
|
if (typeof value !== 'string') {
|
|
throw new exceptions_1.GenerateMetadataError(`${name} parameter use string.`);
|
|
}
|
|
validateObj[name] = {
|
|
errorMsg: getErrorMsg((0, jsDocUtils_1.commentToString)(comment)),
|
|
value: getFullValue((0, jsDocUtils_1.commentToString)(comment)),
|
|
};
|
|
break;
|
|
default:
|
|
if (name.startsWith('is')) {
|
|
const errorMsg = getErrorMsg((0, jsDocUtils_1.commentToString)(comment), false);
|
|
if (errorMsg) {
|
|
validateObj[name] = {
|
|
errorMsg,
|
|
value: undefined,
|
|
};
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return validateObj;
|
|
}, {});
|
|
}
|
|
function getParameterTagSupport() {
|
|
return [
|
|
'isString',
|
|
'isBoolean',
|
|
'isInt',
|
|
'isLong',
|
|
'isFloat',
|
|
'isDouble',
|
|
'isDate',
|
|
'isDateTime',
|
|
'minItems',
|
|
'maxItems',
|
|
'uniqueItems',
|
|
'minLength',
|
|
'maxLength',
|
|
'pattern',
|
|
'minimum',
|
|
'maximum',
|
|
'minDate',
|
|
'maxDate',
|
|
'title',
|
|
];
|
|
}
|
|
function removeSurroundingQuotes(str) {
|
|
if (str.startsWith('`') && str.endsWith('`')) {
|
|
return str.substring(1, str.length - 1);
|
|
}
|
|
if (str.startsWith('```') && str.endsWith('```')) {
|
|
return str.substring(3, str.length - 3);
|
|
}
|
|
return str;
|
|
}
|
|
function shouldIncludeValidatorInSchema(key) {
|
|
return !key.startsWith('is') && key !== 'minDate' && key !== 'maxDate';
|
|
}
|
|
//# sourceMappingURL=validatorUtils.js.map
|