UNPKG

@elysiajs/swagger

Version:

Plugin for Elysia to auto-generate Swagger page

117 lines (114 loc) 4.04 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/swagger/index.ts var swagger_exports = {}; __export(swagger_exports, { SwaggerUIRender: () => SwaggerUIRender }); module.exports = __toCommonJS(swagger_exports); 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>`; }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { SwaggerUIRender });