UNPKG

fumadocs-openapi

Version:

Generate MDX docs for your OpenAPI spec

174 lines (173 loc) 6.67 kB
import { escapeString, inputToString } from '../utils/input-to-string.js'; // @ts-expect-error -- untyped import js2xml from 'xml-js/lib/js2xml'; export const defaultAdapters = { 'application/json': { encode(data) { return JSON.stringify(data.body); }, generateExample(data, ctx) { return str(data.body, 'application/json', ctx); }, }, 'application/xml': { encode(data) { return js2xml(data.body, { compact: true, spaces: 2, }); }, generateExample(data, ctx) { return str(data.body, 'application/xml', ctx); }, }, 'application/x-ndjson': { encode(data) { if (Array.isArray(data.body)) { return data.body.map((v) => JSON.stringify(v)).join('\n'); } return JSON.stringify(data.body); }, generateExample(data, ctx) { return str(data.body, 'application/x-ndjson', ctx); }, }, 'application/x-www-form-urlencoded': { encode(data) { if (typeof data.body !== 'object') throw new Error(`Input value must be object, received: ${typeof data.body}`); const params = new URLSearchParams(); for (const key in data.body) { params.set(key, String(data.body[key])); } return params; }, generateExample(data, ctx) { if (ctx.lang === 'js') { return `const body = new URLSearchParams(${JSON.stringify(data.body, null, 2)})`; } return str(data.body, 'application/x-www-form-urlencoded', ctx); }, }, 'multipart/form-data': { encode(data) { const formData = new FormData(); const body = data.body; if (typeof body !== 'object' || !body) { throw new Error(`Unsupported body type: ${typeof body}, expected: object`); } for (const key in body) { const prop = body[key]; if (prop === null || prop === undefined || Number.isNaN(prop)) continue; // Arrays (multi-value field) if (Array.isArray(prop)) { for (const item of prop) { if (item === null || item === undefined) continue; if (item instanceof File) { formData.append(key, item, item.name); } else if (item instanceof Blob) { formData.append(key, item, 'blob'); } else if (typeof item === 'object') { formData.append(key, JSON.stringify(item)); } else { formData.append(key, String(item)); } } } // Single File else if (prop instanceof File) { formData.set(key, prop, prop.name); } // Single Blob else if (prop instanceof Blob) { formData.set(key, prop, 'blob'); } // Any other object (stringify) else if (typeof prop === 'object') { formData.set(key, JSON.stringify(prop)); } // Primitive types else { formData.set(key, String(prop)); } } return formData; }, generateExample(data, ctx) { if (ctx.lang === 'python') { return `body = ${JSON.stringify(data.body, null, 2)}`; } const s = []; if (ctx.lang === 'js') { s.push(`const body = new FormData();`); for (const [key, value] of Object.entries(data.body)) { s.push(`body.set(${key}, ${JSON.stringify(inputToString(value))})`); } } if (ctx.lang === 'go') { const { addImport } = ctx; addImport('mime/multipart'); addImport('bytes'); s.push('body := new(bytes.Buffer)'); s.push('mp := multipart.NewWriter(payload)'); for (const [key, value] of Object.entries(data.body)) { if (!value) continue; const escaped = escapeString(inputToString(value, 'application/json'), '`'); s.push(`mp.WriteField("${key}", ${escaped})`); } } if (ctx.lang === 'java') { const { addImport } = ctx; addImport('java.net.http.HttpRequest.BodyPublishers'); s.push(`var body = BodyPublishers.ofByteArray(new byte[] { ... });`); } if (ctx.lang === 'csharp') { s.push(`var body = new MultipartFormDataContent();`); } if (s.length > 0) return s.join('\n'); }, }, 'application/octet-stream': { encode(data) { return data.body; }, generateExample() { // not supported return undefined; }, }, }; function str(init, mediaType, ctx) { if (ctx.lang === 'js') { if (mediaType === 'application/json') { return `const body = JSON.stringify(${JSON.stringify(init, null, 2)})`; } return `const body = ${escapeString(inputToString(init, mediaType), '`')}`; } if (ctx.lang === 'python') { if (mediaType === 'application/json') return `body = ${JSON.stringify(init, null, 2)}`; return `body = ${escapeString(inputToString(init, mediaType), '"""')}`; } if (ctx.lang === 'go') { const { addImport } = ctx; addImport('strings'); return `body := strings.NewReader(${escapeString(inputToString(init, mediaType), '`')})`; } if (ctx.lang === 'java') { const { addImport } = ctx; addImport('java.net.http.HttpRequest.BodyPublishers'); return `var body = BodyPublishers.ofString(${escapeString(inputToString(init, mediaType), '"""')});`; } if (ctx.lang === 'csharp') { const input = `\n${inputToString(init, mediaType)}\n`; return `var body = new StringContent(${escapeString(input, '"""')}, Encoding.UTF8, "${mediaType}");`; } }