fumadocs-openapi
Version:
Generate MDX docs for your OpenAPI spec
133 lines (131 loc) • 4.52 kB
JavaScript
import { resolveMediaAdapter } from "./resolve-adapter.js";
import "./adapter.js";
//#region src/requests/media/encode.ts
/**
* serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.
*/
function encodeRequestData(from, adapters, parameters) {
const result = {
method: from.method,
body: from.body,
bodyMediaType: from.bodyMediaType,
cookie: {},
header: {},
path: {},
query: {}
};
for (const type of [
"cookie",
"query",
"header",
"path"
]) for (const key in from[type]) {
const value = from[type][key];
if (value == null) continue;
const field = parameters.find((p) => p.name === key && p.in === type);
if (!field) continue;
const encoder = getMediaEncoder(field, adapters);
if (encoder) {
result[type][key] = { value: encoder(value) };
continue;
}
switch (type) {
case "path":
serializePathParameter(field, value, result.path);
break;
case "query":
serializeQueryParameter(field, value, result.query);
break;
case "header":
result.header[key] = { value: serializeSimple(value, field.explode ?? false) };
break;
case "cookie":
serializeCookieParameter(field, value, result.cookie);
break;
}
}
return result;
}
function getMediaEncoder(field, adapters) {
if (!field.content) return;
for (const k in field.content) {
const adapter = resolveMediaAdapter(k, adapters);
if (adapter) return (v) => String(adapter.encode({ body: v }));
}
}
function serializeSimple(value, explode) {
if (Array.isArray(value)) return value.join(",");
if (typeof value === "object") return explode ? Object.entries(value).map(([k, v]) => `${k}=${v}`).join(",") : Object.entries(value).flat().join(",");
return String(value);
}
function serializePathParameter(field, value, output) {
const { explode = false, name } = field;
switch (field.style) {
case "label":
if (Array.isArray(value)) {
output[field.name] = { value: "." + value.join(explode ? "." : ",") };
break;
}
if (typeof value === "object") {
output[field.name] = { value: "." + (explode ? Object.entries(value).map(([k, v]) => `${k}=${v}`).join(".") : Object.entries(value).flat().join(",")) };
break;
}
output[field.name] = { value: `.${value}` };
break;
case "matrix": {
const specifier = `;${name}=`;
if (Array.isArray(value)) {
output[field.name] = { value: explode ? `${specifier}${value.join(",")}` : `${specifier}${value.join(specifier)}` };
break;
}
if (typeof value === "object") {
output[field.name] = { value: explode ? Object.entries(value).map(([k, v]) => `;${k}=${v}`).join("") : specifier + Object.entries(value).flat().join(",") };
break;
}
output[field.name] = { value: `${specifier}${value}` };
break;
}
default: output[field.name] = { value: serializeSimple(value, explode) };
}
}
function serializeQueryParameter(field, value, output) {
const { explode = true } = field;
switch (field.style) {
case "spaceDelimited": if (!explode && Array.isArray(value)) {
output[field.name] = { values: [value.join(" ")] };
break;
}
case "pipeDelimited": if (!explode && Array.isArray(value)) {
output[field.name] = { values: [value.join("|")] };
break;
}
case "deepObject": if (!Array.isArray(value) && typeof value === "object") {
for (const [k, v] of Object.entries(value)) output[`${field.name}[${k}]`] = { values: Array.isArray(v) ? v : [String(v)] };
break;
}
default:
if (Array.isArray(value)) {
output[field.name] = { values: explode ? value : [value.join(",")] };
break;
}
if (typeof value === "object" && explode) {
for (const [k, v] of Object.entries(value)) output[k] = { values: [String(v)] };
break;
}
if (typeof value === "object") {
output[field.name] = { values: [Object.entries(value).flat().join(",")] };
break;
}
output[field.name] = { values: [String(value)] };
}
}
function serializeCookieParameter(field, value, output) {
const { explode = true } = field;
if (Array.isArray(value)) output[field.name] = { value: explode ? value.map((v) => `${field.name}=${v}`).join("&") : value.join(",") };
else if (typeof value === "object" && explode) for (const [k, v] of Object.entries(value)) output[k] = { value: String(v) };
else if (typeof value === "object") output[field.name] = { value: Object.entries(value).flat().join(",") };
else output[field.name] = { value: String(value) };
}
//#endregion
export { encodeRequestData };
//# sourceMappingURL=encode.js.map