swagger2
Version:
Typescript-based tools for working with Swagger v2.0 documents
190 lines • 8.68 kB
JavaScript
"use strict";
// validate.ts
Object.defineProperty(exports, "__esModule", { value: true });
exports.response = exports.request = void 0;
function isEmpty(value) {
return value === undefined || value === '' || (value instanceof Object && Object.keys(value).length === 0);
}
function validate(value, schema) {
// if no schema, treat as an error
if (schema === undefined) {
return {
actual: value,
expected: {
schema,
},
};
}
const valid = schema.validator(value);
if (valid) {
return;
}
const error = {
actual: value,
expected: {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
schema: schema.schema,
type: schema.type,
format: schema.format,
},
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
const errorDetail = schema.validator.error;
if (errorDetail) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
error.error = errorDetail;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
if (error.expected.schema === undefined) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
delete error.expected.schema;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
if (error.expected.type === undefined) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
delete error.expected.type;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
if (error.expected.format === undefined) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
delete error.expected.format;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-argument
if (Object.keys(error.expected).length === 0) {
// nothing is expected, so set to undefined
error.expected = undefined;
}
return error;
}
// eslint-disable-next-line sonarjs/cognitive-complexity
function request(compiledPath, method,
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
query,
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
body,
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/explicit-module-boundary-types
headers,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
pathParameters) {
if (compiledPath === undefined) {
return;
}
// get operation object for path and method
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access
const operation = compiledPath.path[method.toLowerCase()];
if (operation === undefined) {
// operation not defined, return 405 (method not allowed)
return;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
const parameters = operation.resolvedParameters;
const validationErrors = [];
let bodyDefined = false;
// check all the parameters match swagger schema
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
if (parameters.length === 0) {
const error = validate(body, { validator: isEmpty });
if (error !== undefined) {
error.where = 'body';
validationErrors.push(error);
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
if (query !== undefined && Object.keys(query).length > 0) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
for (const key of Object.keys(query)) {
validationErrors.push({
where: 'query',
name: key,
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
actual: query[key],
expected: {},
});
}
}
return validationErrors;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any,unicorn/no-array-for-each
parameters.forEach((parameter) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let value;
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
switch (parameter.in) {
case 'query': {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
value = (query ?? {})[parameter.name];
break;
}
case 'path': {
if (pathParameters) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
value = pathParameters[parameter.name];
}
else {
// eslint-disable-next-line require-unicode-regexp
const actual = (compiledPath.requestPath ?? '').match(/[^/]+/g);
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions,@typescript-eslint/no-unsafe-member-access
const valueIndex = compiledPath.expected.indexOf(`{${parameter.name}}`);
value = actual ? actual[valueIndex] : undefined;
}
break;
}
case 'body': {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
value = body;
bodyDefined = true;
break;
}
case 'header': {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
value = (headers ?? {})[parameter.name];
break;
}
case 'formData': {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
value = (body ?? {})[parameter.name];
bodyDefined = true;
break;
}
default:
// do nothing
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
const error = validate(value, parameter);
if (error !== undefined) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
error.where = parameter.in;
validationErrors.push(error);
}
});
// ensure body is undefined if no body schema is defined
if (!bodyDefined && body !== undefined) {
const error = validate(body, { validator: isEmpty });
if (error !== undefined) {
error.where = 'body';
validationErrors.push(error);
}
}
return validationErrors;
}
exports.request = request;
function response(compiledPath, method, status, body) {
if (compiledPath === undefined) {
return {
actual: 'UNDEFINED_PATH',
expected: 'PATH',
};
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
const operation = compiledPath.path[method.toLowerCase()];
// check the response matches the swagger schema
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
let schema = operation.responses[status];
if (schema === undefined) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
schema = operation.responses.default;
}
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
return validate(body, schema);
}
exports.response = response;
//# sourceMappingURL=validate.js.map