UNPKG

@tsed/schema

Version:
62 lines (61 loc) 2.37 kB
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);