{"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"}