fork of hey-api/openapi-ts because I need some additional things
at feat/skip-token 72 lines 1.8 kB view raw
1import type { Context } from '../../../ir/context'; 2import type { IR } from '../../../ir/types'; 3import { refToName } from '../../../utils/ref'; 4import type { RequestBodyObject, SchemaObject } from '../types/spec'; 5import { mediaTypeObjects } from './mediaType'; 6import { schemaToIrSchema } from './schema'; 7 8const requestBodyToIrRequestBody = ({ 9 $ref, 10 context, 11 requestBody, 12}: { 13 $ref: string; 14 context: Context; 15 requestBody: RequestBodyObject; 16}): IR.RequestBodyObject => { 17 // TODO: parser - fix 18 const contents = mediaTypeObjects({ content: requestBody.content }); 19 // TODO: add support for multiple content types, for now prefer JSON 20 const content = contents.find((content) => content.type === 'json') || contents[0]; 21 const schema = content ? content.schema : undefined; 22 23 const finalSchema: SchemaObject = { 24 description: requestBody.description, 25 ...schema, 26 }; 27 28 const irRequestBody: IR.RequestBodyObject = { 29 schema: schemaToIrSchema({ 30 context, 31 schema: finalSchema, 32 state: { 33 $ref, 34 circularReferenceTracker: new Set(), 35 }, 36 }), 37 }; 38 39 if (requestBody.description) { 40 irRequestBody.description = requestBody.description; 41 } 42 43 if (requestBody.required) { 44 irRequestBody.required = requestBody.required; 45 } 46 47 return irRequestBody; 48}; 49 50export const parseRequestBody = ({ 51 $ref, 52 context, 53 requestBody, 54}: { 55 $ref: string; 56 context: Context; 57 requestBody: RequestBodyObject; 58}) => { 59 if (!context.ir.components) { 60 context.ir.components = {}; 61 } 62 63 if (!context.ir.components.requestBodies) { 64 context.ir.components.requestBodies = {}; 65 } 66 67 context.ir.components.requestBodies[refToName($ref)] = requestBodyToIrRequestBody({ 68 $ref, 69 context, 70 requestBody, 71 }); 72};