fork of hey-api/openapi-ts because I need some additional things
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};