@tsed/schema
Version:
JsonSchema module for Ts.ED Framework
62 lines (61 loc) • 2.37 kB
JavaScript
import { cleanObject } from "@tsed/core";
import { registerJsonSchemaMapper } from "../../registries/JsonSchemaMapperContainer.js";
import { createRefName, getSchemaFromRef } from "../../utils/ref.js";
function buildExamples(property, examples) {
if (!examples) {
return undefined;
}
let hasKey = false;
const newExamples = Object.entries(examples).reduce((acc, [key, { value, description, ...props }]) => {
if (value[property] === undefined) {
return acc;
}
hasKey = true;
return {
...acc,
[key]: {
...props,
value: value[property],
description
}
};
}, {});
return hasKey ? newExamples : undefined;
}
function inlineReference(parameter, { jsonParameter, ...options }) {
const name = createRefName(jsonParameter.schema().itemSchema().getName(), options);
const schema = options.components?.schemas?.[name];
if (schema && !options.oldSchemas?.[name]) {
delete options.components?.schemas?.[jsonParameter.schema().itemSchema().getName()];
}
return Object.entries(schema?.properties || {}).reduce((params, [key, { description, ...prop }]) => {
const style = parameter.style || (prop.$ref && !getSchemaFromRef(prop.$ref, options)?.enum) ? "deepObject" : undefined;
params.push(cleanObject({
...parameter,
style,
explode: style === "deepObject" ? true : parameter.explode,
name: key,
required: (schema?.required || []).includes(key),
description,
schema: prop,
examples: buildExamples(key, parameter.examples)
}));
return params;
}, []);
}
export function operationInQueryMapper(parameter, { jsonSchema, ...options }) {
if (jsonSchema.$ref) {
if (!parameter.name) {
return inlineReference(parameter, options);
}
const schema = getSchemaFromRef(jsonSchema.$ref, options);
// if the reference is an enum, we don't need to set the style or explode
if (!schema?.enum) {
parameter.style = "deepObject";
parameter.explode = true;
}
}
parameter.schema = jsonSchema;
return parameter;
}
registerJsonSchemaMapper("operationInQuery", operationInQueryMapper);