fumadocs-openapi
Version:
Generate MDX docs for your OpenAPI spec
125 lines (123 loc) • 4.67 kB
JavaScript
import { escapeString, inputToString } from "../string-utils.js";
import { isMediaTypeSupported, resolveMediaAdapter } from "./resolve-adapter.js";
import js2xml from "xml-js/lib/js2xml";
//#region src/requests/media/adapter.ts
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 === void 0 || Number.isNaN(prop)) continue;
if (Array.isArray(prop)) for (const item of prop) {
if (item === null || item === void 0) 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));
}
else if (prop instanceof File) formData.set(key, prop, prop.name);
else if (prop instanceof Blob) formData.set(key, prop, "blob");
else if (typeof prop === "object") formData.set(key, JSON.stringify(prop));
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() {}
}
};
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") 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") return `var body = new StringContent(${escapeString(`\n${inputToString(init, mediaType)}\n`, "\"\"\"")}, Encoding.UTF8, "${mediaType}");`;
}
//#endregion
export { defaultAdapters };
//# sourceMappingURL=adapter.js.map