fumadocs-openapi
Version:
Generate MDX docs for your OpenAPI spec
68 lines (66 loc) • 2.15 kB
JavaScript
import { resolveMediaAdapter } from "../requests/media/resolve-adapter.js";
import "../requests/media/adapter.js";
//#region src/playground/fetcher.ts
function createBrowserFetcher(adapters, requestTimeout) {
return { async fetch(url, options) {
const headers = new Headers();
if (options.bodyMediaType && options.bodyMediaType !== "multipart/form-data") headers.append("Content-Type", options.bodyMediaType);
for (const key in options.header) {
const param = options.header[key];
headers.append(key, param.value);
}
const proxyUrl = options.proxyUrl ? new URL(options.proxyUrl, document.baseURI) : null;
if (proxyUrl) {
proxyUrl.searchParams.append("url", url);
url = proxyUrl.toString();
}
let body = void 0;
if (options.bodyMediaType && options.body) {
const adapter = resolveMediaAdapter(options.bodyMediaType, adapters);
if (!adapter) return {
status: 400,
type: "text",
data: `[Fumadocs] No adapter for ${options.bodyMediaType}, you need to specify one from 'createOpenAPI()'.`
};
body = adapter.encode(options);
}
for (const key in options.cookie) {
const segs = [`${key}=${options.cookie[key].value}`];
if (proxyUrl && proxyUrl.origin !== window.location.origin) segs.push(`domain=${proxyUrl.host}`);
segs.push("path=/", "max-age=30");
document.cookie = segs.join("; ");
}
return fetch(url, {
method: options.method,
cache: "no-cache",
headers,
body,
signal: AbortSignal.timeout(requestTimeout * 1e3)
}).then(async (res) => {
const contentType = res.headers.get("Content-Type") ?? "";
let type;
let data;
if (contentType.startsWith("application/json")) {
type = "json";
data = await res.json();
} else {
type = contentType.startsWith("text/html") ? "html" : "text";
data = await res.text();
}
return {
status: res.status,
type,
data
};
}).catch((e) => {
return {
status: 400,
type: "text",
data: `Client side error: ${e instanceof Error ? `[${e.name}] ${e.message}` : e.toString()}`
};
});
} };
}
//#endregion
export { createBrowserFetcher };
//# sourceMappingURL=fetcher.js.map