@tsed/schema
Version:
JsonSchema module for Ts.ED Framework
64 lines (63 loc) • 2.32 kB
JavaScript
import { JsonRequestBody } from "../../domain/JsonRequestBody.js";
import { JsonSchema } from "../../domain/JsonSchema.js";
import { execMapper, registerJsonSchemaMapper } from "../../registries/JsonSchemaMapperContainer.js";
function buildSchemaFromBodyParameters(parameters, options) {
let schema = new JsonSchema();
const props = {};
const refs = [];
let propsLength = 0;
const hasFile = parameters.some((param) => param.get("in") === "files");
parameters.forEach((parameter) => {
const name = parameter.getName();
[...parameter.entries()]
.filter(([key]) => !["in", "name"].includes(key))
.forEach(([key, value]) => {
if (props[key] === undefined) {
props[key] = value;
}
});
const jsonParameter = execMapper("operationInParameter", [parameter], options);
if (name) {
const propSchema = {
...(jsonParameter.schema || {
type: jsonParameter.type
})
};
if (hasFile && jsonParameter.description) {
propSchema.description = jsonParameter.description;
}
schema.addProperty(name, propSchema);
if (parameter.get("required")) {
schema.addRequired(name);
}
propsLength++;
}
else {
refs.push(jsonParameter);
}
});
if (!propsLength) {
if (refs.length === 1) {
return refs[0];
}
}
schema.type("object");
if (props.description && hasFile) {
delete props.description;
}
return {
required: false,
...props,
schema: schema.toJSON(options)
};
}
export function operationRequestBodyMapper(bodyParameters, { consumes, ...options }) {
const { schema, description, examples, in: _, ...props } = buildSchemaFromBodyParameters(bodyParameters, options);
const requestBody = new JsonRequestBody(props);
description && requestBody.description(description);
consumes.forEach((consume) => {
requestBody.addContent(consume, schema, examples);
});
return execMapper("map", [requestBody], options);
}
registerJsonSchemaMapper("operationRequestBody", operationRequestBodyMapper);