Files
elysia-swagger/dist/swagger/index.mjs
2025-05-05 19:20:31 +02:00

92 lines
2.9 KiB
JavaScript

// src/swagger/index.ts
function isSchemaObject(schema) {
return "type" in schema || "properties" in schema || "items" in schema;
}
function isDateTimeProperty(key, schema) {
return (key === "createdAt" || key === "updatedAt") && "anyOf" in schema && Array.isArray(schema.anyOf);
}
function transformDateProperties(schema) {
if (!isSchemaObject(schema) || typeof schema !== "object" || schema === null) {
return schema;
}
const newSchema = { ...schema };
Object.entries(newSchema).forEach(([key, value]) => {
if (isSchemaObject(value)) {
if (isDateTimeProperty(key, value)) {
const dateTimeFormat = value.anyOf?.find(
(item) => isSchemaObject(item) && item.format === "date-time"
);
if (dateTimeFormat) {
const dateTimeSchema = {
type: "string",
format: "date-time",
default: dateTimeFormat.default
};
newSchema[key] = dateTimeSchema;
}
} else {
newSchema[key] = transformDateProperties(value);
}
}
});
return newSchema;
}
var SwaggerUIRender = (info, version, theme, stringifiedSwaggerOptions, autoDarkMode) => {
const swaggerOptions = JSON.parse(stringifiedSwaggerOptions);
if (swaggerOptions.components && swaggerOptions.components.schemas) {
swaggerOptions.components.schemas = Object.fromEntries(
Object.entries(swaggerOptions.components.schemas).map(([key, schema]) => [
key,
transformDateProperties(schema)
])
);
}
const transformedStringifiedSwaggerOptions = JSON.stringify(swaggerOptions);
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>${info.title}</title>
<meta
name="description"
content="${info.description}"
/>
<meta
name="og:description"
content="${info.description}"
/>
${autoDarkMode && typeof theme === "string" ? `
<style>
@media (prefers-color-scheme: dark) {
body {
background-color: #222;
color: #faf9a;
}
.swagger-ui {
filter: invert(92%) hue-rotate(180deg);
}
.swagger-ui .microlight {
filter: invert(100%) hue-rotate(180deg);
}
}
</style>` : ""}
${typeof theme === "string" ? `<link rel="stylesheet" href="${theme}" />` : `<link rel="stylesheet" media="(prefers-color-scheme: light)" href="${theme.light}" />
<link rel="stylesheet" media="(prefers-color-scheme: dark)" href="${theme.dark}" />`}
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@${version}/swagger-ui-bundle.js" crossorigin></script>
<script>
window.onload = () => {
window.ui = SwaggerUIBundle(${transformedStringifiedSwaggerOptions});
};
</script>
</body>
</html>`;
};
export {
SwaggerUIRender
};