@azure-utils/storybooks
Version:
Utils to upload and manage Storybooks via Azure Functions and storage.
1 lines • 5.05 kB
Source Map (JSON)
{"version":3,"file":"openapi-handler-BNcJ1aSZ.mjs","names":["request: HttpRequest","context: InvocationContext","securitySchemes: Record<string, ZodOpenApiSecuritySchemeObject>","title: string","openAPISpec: object"],"sources":["../src/handlers/openapi-handler.ts"],"sourcesContent":["import type {\n HttpRequest,\n HttpResponseInit,\n InvocationContext,\n} from \"@azure/functions\";\nimport {\n createDocument,\n type ZodOpenApiSecuritySchemeObject,\n} from \"zod-openapi\";\nimport {\n openAPIPaths,\n openAPISchemas,\n openAPISecuritySchemas,\n openAPITags,\n} from \"../utils/openapi-utils\";\nimport { CONTENT_TYPES, SUPPORTED_CONTENT_TYPES_MSG } from \"../utils/constants\";\nimport { responseError } from \"../utils/response-utils\";\nimport { getStore } from \"../utils/store\";\n\nexport async function openAPIHandler(\n request: HttpRequest,\n context: InvocationContext\n): Promise<HttpResponseInit> {\n const { authLevel, openapi, serviceName } = getStore();\n const {\n title = serviceName.toUpperCase(),\n version = process.env[\"NODE_ENV\"] || \"TEST\",\n servers,\n } = openapi || {};\n\n context.log(\"Serving OpenAPI schema...\", authLevel);\n\n try {\n const securitySchemes: Record<string, ZodOpenApiSecuritySchemeObject> = {};\n if (authLevel) {\n securitySchemes[\"functionsKey\"] = openAPISecuritySchemas.functionsKey;\n }\n\n const openAPISpec = createDocument({\n openapi: \"3.1.0\",\n info: { title, version },\n security: authLevel ? [{ functionsKey: [] }] : [],\n servers,\n tags: Object.values(openAPITags),\n paths: openAPIPaths,\n components: {\n schemas: openAPISchemas,\n securitySchemes,\n },\n });\n\n const { searchParams } = new URL(request.url);\n const isDownloadJSON = searchParams.get(\"download\") === \"json\";\n if (isDownloadJSON) {\n const headers = new Headers({\n \"Content-Disposition\": `attachment; filename=\"${title}_${version}_openapi.json\"`,\n });\n return { status: 200, jsonBody: openAPISpec, headers };\n }\n\n const accept = request.headers.get(\"accept\");\n\n if (!accept || accept.includes(CONTENT_TYPES.JSON)) {\n return { status: 200, jsonBody: openAPISpec };\n }\n\n if (accept.includes(CONTENT_TYPES.HTML)) {\n const html = generateSwaggerUI(title, openAPISpec);\n\n return {\n status: 200,\n headers: { \"Content-Type\": CONTENT_TYPES.HTML },\n body: html,\n };\n }\n\n return { status: 406, body: SUPPORTED_CONTENT_TYPES_MSG };\n } catch (error) {\n return responseError(error, context);\n }\n}\n\nfunction generateSwaggerUI(title: string, openAPISpec: object) {\n return /* html */ `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <meta name=\"description\" content=\"${title} SwaggerUI\" />\n <title>${title}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/swagger-ui-dist/swagger-ui.css\" />\n <script src=\"https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js\" crossorigin></script>\n</head>\n<body style=\"position: relative;\">\n <div id=\"swagger-ui\"></div>\n <div style=\"position: absolute; top: 0; right: 0; padding-right: 16px; display: flex; gap: 0.5rem;\">\n <form>\n <input type=\"hidden\" name=\"download\" value=\"json\" />\n <button type=\"submit\">Download</button>\n </form>\n <button type=\"button\" onClick=\"window.location.reload();\">Refresh</button>\n </div>\n <script async defer>\n window.swaggerUI = SwaggerUIBundle(${JSON.stringify({\n dom_id: \"#swagger-ui\",\n spec: openAPISpec,\n })});\n </script>\n</body>\n</html>`;\n}\n"],"mappings":";;;;;;AAmBA,eAAsB,eACpBA,SACAC,SAC2B;CAC3B,MAAM,EAAE,WAAW,SAAS,aAAa,GAAG,UAAU;CACtD,MAAM,EACJ,QAAQ,YAAY,aAAa,EACjC,UAAU,QAAQ,IAAI,eAAe,QACrC,SACD,GAAG,WAAW,CAAE;CAEjB,QAAQ,IAAI,6BAA6B,UAAU;AAEnD,KAAI;EACF,MAAMC,kBAAkE,CAAE;AAC1E,MAAI,WACF,gBAAgB,kBAAkB,uBAAuB;EAG3D,MAAM,cAAc,eAAe;GACjC,SAAS;GACT,MAAM;IAAE;IAAO;GAAS;GACxB,UAAU,YAAY,CAAC,EAAE,cAAc,CAAE,EAAE,CAAC,IAAG,CAAE;GACjD;GACA,MAAM,OAAO,OAAO,YAAY;GAChC,OAAO;GACP,YAAY;IACV,SAAS;IACT;GACD;EACF,EAAC;EAEF,MAAM,EAAE,cAAc,GAAG,IAAI,IAAI,QAAQ;EACzC,MAAM,iBAAiB,aAAa,IAAI,WAAW,KAAK;AACxD,MAAI,gBAAgB;GAClB,MAAM,UAAU,IAAI,QAAQ,EAC1B,uBAAuB,CAAC,sBAAsB,EAAE,MAAM,CAAC,EAAE,QAAQ,cAAc,CAAC,CACjF;AACD,UAAO;IAAE,QAAQ;IAAK,UAAU;IAAa;GAAS;EACvD;EAED,MAAM,SAAS,QAAQ,QAAQ,IAAI,SAAS;AAE5C,MAAI,CAAC,UAAU,OAAO,SAAS,cAAc,KAAK,CAChD,QAAO;GAAE,QAAQ;GAAK,UAAU;EAAa;AAG/C,MAAI,OAAO,SAAS,cAAc,KAAK,EAAE;GACvC,MAAM,OAAO,kBAAkB,OAAO,YAAY;AAElD,UAAO;IACL,QAAQ;IACR,SAAS,EAAE,gBAAgB,cAAc,KAAM;IAC/C,MAAM;GACP;EACF;AAED,SAAO;GAAE,QAAQ;GAAK,MAAM;EAA6B;CAC1D,SAAQ,OAAO;AACd,SAAO,cAAc,OAAO,QAAQ;CACrC;AACF;AAED,SAAS,kBAAkBC,OAAeC,aAAqB;AAC7D,QAAkB,CAAC;;;;;;sCAMiB,EAAE,MAAM;WACnC,EAAE,MAAM;;;;;;;;;;;;;;yCAcsB,EAAE,KAAK,UAAU;EAClD,QAAQ;EACR,MAAM;CACP,EAAC,CAAC;;;OAGF,CAAC;AACP"}