api-render-ui 1.1.2 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +10 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/api-render-ui.ts +11 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/inlined-styles.ts","../src/api-render-ui.ts"],"sourcesContent":["export * from \"./api-render-ui.js\";","// Auto-generated by inline-styles.mjs\nexport const GLOBAL_STYLES = `.codigma-apioperatorlist {\r\n align-items: flex-start;\r\n background: white;\r\n display: inline-flex;\r\n flex-direction: column;\r\n gap: 5px;\r\n justify-content: flex-start;\r\n width: 100%\r\n}\r\n.codigma-apioperator {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n gap: 10px;\r\n /* border-radius: 8px; */\r\n height: 32px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apioperator:nth-child(even) {\r\n background-color: rgb(235, 239, 244);\r\n}\r\n.codigma-apioperator:nth-child(odd) {\r\n background-color: rgb(250, 246, 246);\r\n}\r\n\r\n.codigma-apioperator:hover {\r\n cursor: pointer;\r\n background: rgb(169, 199, 239);\r\n}\r\n.codigma-apioperator:active {\r\n background: rgb(206, 216, 231);\r\n}\r\n.codigma-method {\r\n align-items: center;\r\n display: flex;\r\n gap: 5px;\r\n justify-content: center;\r\n width: 64px\r\n}\r\n.codigma-methodtype {\r\n align-items: center;\r\n display: flex;\r\n gap: 10px;\r\n justify-content: center\r\n}\r\n.codigma-get {\r\n color: var(--Labels---Vibrant---Controls-Primary-√, #404040);\r\n word-wrap: break-word\r\n}\r\n.codigma-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n word-wrap: break-word\r\n}\r\n/**********************apiunit css style*************************/\r\n.codigma-apiunit {\r\n align-items: flex-start;\r\n background: white;\r\n box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);\r\n display: inline-flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n justify-content: flex-start;\r\n width: 100%\r\n}\r\n.codigma-apiunit-apioperator {\r\n align-items: center;\r\n align-self: stretch;\r\n border-bottom: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n border-top: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n display: inline-flex;\r\n gap: 10px;\r\n height: 48px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apiunit-method {\r\n align-items: center;\r\n display: flex;\r\n gap: 5px;\r\n height: 48px;\r\n justify-content: center;\r\n width: 100px\r\n}\r\n.codigma-apiunit-methodtype {\r\n align-items: center;\r\n display: flex;\r\n gap: 10px;\r\n justify-content: center\r\n}\r\n.codigma-apiunit-post {\r\n color: var(--Labels---Vibrant---Controls-Primary-√, #404040);\r\n word-wrap: break-word\r\n}\r\n.codigma-apiunit-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n word-wrap: break-word;\r\n border-left: 0;\r\n border-right: 0;\r\n border-top: 0;\r\n border-bottom: 1px solid black;\r\n}\r\n.codigma-apiunit-send-button {\r\n align-items: center;\r\n display: flex;\r\n gap: 10px;\r\n height: 32px;\r\n justify-content: center;\r\n width: 88px\r\n}\r\n.codigma-apiunit-send {\r\n color: black;\r\n word-wrap: break-word\r\n}\r\n.codigma-apiunit-send-button:hover {\r\n cursor: pointer;\r\n}\r\n.codigma-apiunit-send-button:active {\r\n background-color: gray;\r\n}\r\n\r\n.codigma-apiunit-reqcontent {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 0;\r\n gap: 5px;\r\n justify-content: flex-start;\r\n padding-left: 5px;\r\n}\r\n.codigma-apiunit-paramters-section {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n flex: 1 1 0;\r\n justify-content: flex-start\r\n}\r\n.codigma-apiunit-parameters-cnr {\r\n align-items: center;\r\n background: white;\r\n display: flex;\r\n height: 42px;\r\n justify-content: space-between;\r\n width: 122px\r\n}\r\n.codigma-apiunit-parakeyvalues {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background: white;\r\n display: inline-flex;\r\n flex-direction: column;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n overflow: hidden;\r\n padding: 10px\r\n}\r\n.codigma-apiunit-keyvalue {\r\n align-items: center;\r\n display: inline-flex;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apiunit-valuetext {\r\n align-self: stretch;\r\n background: white;\r\n border-left: 0;\r\n border-right: 0;\r\n border-top: 0;\r\n border-bottom: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n padding: 10px;\r\n width: 161px\r\n}\r\n/* .codigma-apiunit-keyvalue {\r\n align-items: center;\r\n display: inline-flex;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n width: 211px\r\n} */\r\n.codigma-apiunit-request-body-section {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n justify-content: flex-start;\r\n padding-right: 5px\r\n}\r\n.codigma-apiunit-request-body-info {\r\n align-self: stretch;\r\n}\r\n.codigma-apiunit-parakeyvalues {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background: white;\r\n display: flex;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n outline-offset: -1px;\r\n outline: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n overflow: hidden;\r\n padding: 10px\r\n}\r\n.codigma-apiunit-reqresponse {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background: white;\r\n border-top: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n padding-left: 5px;\r\n padding-right: 5px\r\n}\r\n.codigma-apiunit-responsedesc {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n justify-content: space-between;\r\n padding-right: 32px\r\n}\r\n.codigma-apiunit-responsetitle {\r\n align-items: center;\r\n border-bottom: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n display: flex;\r\n height: 42px;\r\n justify-content: space-between;\r\n width: 122px\r\n}\r\n.codigma-apiunit-response-cnr {\r\n align-items: center;\r\n align-self: stretch;\r\n background: white;\r\n display: flex;\r\n justify-content: space-between;\r\n padding-top: 2px;\r\n width: 122px\r\n}\r\n.codigma-apiunit-responsebody {\r\n position: relative;\r\n align-self: stretch;\r\n flex: 1 1 0;\r\n min-height: 5rem;\r\n /* padding: 2px */\r\n}`;\n","import { GLOBAL_STYLES } from './inlined-styles';\r\nimport { OpenAPIV3 } from 'openapi-types';\r\n\r\ntype OpenAPIV3CustomDoc = OpenAPIV3.Document & { swagger: string; definitions: any } //Compatible with version 2.0\r\n\r\nexport class ApiRenderer {\r\n options: any;\r\n container: any;\r\n\r\n // 静态标志:记录是否已注入全局样式\r\n private static globalStyleInjected = false;\r\n\r\n constructor(options: any) {\r\n this.options = Object.assign({\r\n mountPoint: document?.body, // 默认挂载到body\r\n className: 'Apioperatorlist codigma-apioperatorlist',\r\n layerName: 'apioperatorlist'\r\n }, options);\r\n\r\n this.container = null;\r\n }\r\n\r\n render(apiSpec: OpenAPIV3CustomDoc, renderUnit: boolean = false) {\r\n\r\n const appendInlineStyle = (text: string) => {\r\n if (!ApiRenderer.globalStyleInjected) {\r\n // 动态创建 <style> 标签并插入全局样式\r\n const styleEl = document.createElement('style');\r\n styleEl.textContent = text;\r\n document.head.appendChild(styleEl);\r\n ApiRenderer.globalStyleInjected = true; // 标记已注入\r\n }\r\n };\r\n // 使用\r\n appendInlineStyle(GLOBAL_STYLES);\r\n\r\n // 存储原始元素与对应新元素的映射\r\n const elementMap = new Map();\r\n\r\n // 获取实际挂载点\r\n const mountElement = typeof this.options.mountPoint === 'string' ?\r\n document.querySelector(this.options.mountPoint) :\r\n this.options.mountPoint;\r\n\r\n if (!mountElement) {\r\n throw new Error('Invalid mount point specified');\r\n }\r\n\r\n if ((apiSpec[\"openapi\"] && apiSpec[\"openapi\"].startsWith(\"3.\"))\r\n || (apiSpec[\"swagger\"] && apiSpec[\"swagger\"].startsWith(\"2.\"))) {\r\n const countApi = countOpenAPI(apiSpec);\r\n const apiOperatorList = parseOpenAPI(apiSpec);\r\n // console.log('解析结果:', apiOperatorList);\r\n if (countApi == 1 && renderUnit) {\r\n // If the count of api <=1, create the api unit only. \r\n // 创建根容器\r\n this.container = createApiUnit(apiOperatorList[0]);\r\n } else {\r\n // 创建主容器\r\n this.container = document.createElement('div');\r\n this.container.setAttribute('data-layer', this.options.layerName);\r\n this.container.className = this.options.className;\r\n\r\n // 生成内容\r\n apiOperatorList.forEach((apiOperator: any) => {\r\n const reqOperator = document.createElement('div');\r\n reqOperator.setAttribute('data-layer', 'apioperator');\r\n reqOperator.className = 'Apioperator codigma-apioperator';\r\n\r\n // 创建method部分\r\n const methodContainer = document.createElement('div');\r\n methodContainer.setAttribute('data-layer', 'method');\r\n methodContainer.className = 'Method codigma-method';\r\n\r\n const methodType = document.createElement('div');\r\n methodType.setAttribute('data-layer', 'methodtype');\r\n methodType.className = 'Methodtype codigma-methodtype';\r\n\r\n const methodValue = document.createElement('div');\r\n methodValue.setAttribute('data-layer', apiOperator.method.toLowerCase());\r\n methodValue.className = `${apiOperator.method} codigma-${apiOperator.method.toLowerCase()}`;\r\n methodValue.textContent = apiOperator.method;\r\n\r\n methodType.appendChild(methodValue);\r\n methodContainer.appendChild(methodType);\r\n reqOperator.appendChild(methodContainer);\r\n\r\n // 创建URL部分\r\n const urlElement = document.createElement('div');\r\n urlElement.setAttribute('data-layer', 'requrl');\r\n urlElement.className = 'Requrl codigma-requrl';\r\n urlElement.textContent = apiOperator.url;\r\n reqOperator.appendChild(urlElement);\r\n\r\n this.container.appendChild(reqOperator);\r\n\r\n // 添加点击事件\r\n reqOperator.addEventListener('click', renderApiUnit(apiOperator, this.container, elementMap));\r\n });\r\n }\r\n } else {\r\n // 初始化当前API操作对象\r\n const apiOperator = {\r\n method: \"get\",\r\n url: \"/full/info\",\r\n rawApiInfo: null,\r\n requestBody: null,\r\n response: {},\r\n auths: [\r\n {\r\n type: \"No Auth\"\r\n },\r\n {\r\n type: \"Basic Auth\",\r\n parameters: [\r\n {\r\n name: \"userName\",\r\n value: \"\"\r\n },\r\n {\r\n name: \"password\",\r\n value: \"\"\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n // 创建根容器\r\n this.container = createApiUnit(apiSpec);\r\n }\r\n\r\n // 清空挂载点并插入新内容\r\n mountElement.innerHTML = '';\r\n mountElement.appendChild(this.container);\r\n\r\n\r\n }\r\n}\r\n\r\n\r\nconst auths = [\r\n {\r\n value: \"No Auth\"\r\n },\r\n {\r\n value: \"Basic Auth\",\r\n parameters: [\r\n {\r\n name: \"userName\",\r\n value: \"\"\r\n },\r\n {\r\n name: \"password\",\r\n value: \"\"\r\n }\r\n ]\r\n },\r\n {\r\n value: \"OAuth 2.0\",\r\n }\r\n]\r\n\r\nconst grantTypes = [\r\n { value: \"authorization_code\" },\r\n { value: \"Implicit\" },\r\n { value: \"Resource Owner Password Credentials\" },\r\n { value: \"client_credentials\" }\r\n]\r\n\r\nconst clientAuthenticationOpts = [\r\n { value: \"Headers\", displayName: \"Send credentials in headers\" },\r\n { value: \"Body\", displayName: \"Send credentials in body\" }\r\n]\r\n\r\n// ========== 数据定义 ==========\r\nconst consumeOpts = [\r\n { value: \"None\" },\r\n { value: \"application/json\" },\r\n { value: \"application/xml\" },\r\n { value: \"application/x-www-form-urlencoded\" },\r\n { value: \"multipart/form-data\" },\r\n { value: \"text/plain\" }\r\n];\r\n\r\n\r\nfunction renderApiUnit(apiOperator: any, containerRef: any, elementMap: any) {\r\n return function (evt: any) {\r\n const currentTarget = evt.currentTarget;\r\n // 检查是否已存在对应的新元素\r\n if (elementMap.has(currentTarget)) {\r\n const newElement = elementMap.get(currentTarget);\r\n newElement.remove(); // 移除新元素\r\n elementMap.delete(currentTarget); // 清除映射\r\n return;\r\n }\r\n\r\n // 创建根容器\r\n const apiContainer = createApiUnit(apiOperator);\r\n\r\n // 添加到文档\r\n // 插入到当前元素后面\r\n if (currentTarget.nextSibling) {\r\n containerRef.insertBefore(apiContainer, currentTarget.nextSibling);\r\n } else {\r\n containerRef.appendChild(apiContainer);\r\n }\r\n\r\n // 存储映射关系\r\n elementMap.set(currentTarget, apiContainer);\r\n }\r\n}\r\n\r\nfunction createApiUnit(apiOperator: any) {\r\n const apiContainer = document.createElement('div');\r\n apiContainer.setAttribute('data-layer', 'apiunit');\r\n apiContainer.className = 'Requnit codigma-apiunit';\r\n // 预先创建响应部分并挂载到 apiOperator,保证后面创建的 send 按钮能访问到\r\n const responseSection = createSectionResponse(apiOperator);\r\n apiOperator._responseSectionRef = responseSection;\r\n\r\n // 请求操作区\r\n const reqOperator = createReqOperator(apiOperator);\r\n apiContainer.appendChild(reqOperator);\r\n // 请求内容区\r\n const reqContent = document.createElement('div');\r\n reqContent.setAttribute('data-layer', 'reqcontent');\r\n reqContent.className = 'Reqcontent codigma-apiunit-reqcontent';\r\n // 参数部分\r\n const paramSection = createParamSection(apiOperator);\r\n // 头部部分\r\n const headerSection = createSectionHeader(apiOperator);\r\n // 授权部分\r\n const authSection = createSectionAuth(apiOperator);\r\n // 请求体部分\r\n const bodySection = createSectionRequestBody(apiOperator);\r\n\r\n reqContent.append(paramSection, headerSection, authSection, bodySection);\r\n apiContainer.appendChild(reqContent);\r\n // 响应部分(已经预创建,直接附加)\r\n apiContainer.appendChild(responseSection);\r\n return apiContainer;\r\n}\r\n\r\nfunction createReqOperator(apiOperator: any) {\r\n const reqOperator = document.createElement('div');\r\n reqOperator.setAttribute('data-layer', 'apioperator');\r\n reqOperator.className = 'Reqoperator codigma-apiunit-apioperator';\r\n // 方法类型\r\n const methodType = document.createElement('div');\r\n methodType.setAttribute('data-layer', 'method');\r\n methodType.className = 'Method codigma-apiunit-method';\r\n const methodTypeInner = document.createElement('div');\r\n methodTypeInner.setAttribute('data-layer', 'methodtype');\r\n methodTypeInner.className = 'Methodtype codigma-apiunit-methodtype';\r\n methodTypeInner.textContent = apiOperator.method.toUpperCase();\r\n methodType.appendChild(methodTypeInner);\r\n // 方法选项图标 - 使用内联SVG\r\n const methodOpt = document.createElement('div');\r\n methodOpt.setAttribute('data-svg-wrapper', '');\r\n methodOpt.setAttribute('data-layer', 'methodopt');\r\n methodOpt.className = 'Methodopt';\r\n\r\n // 创建内联SVG\r\n const svg = createSvg();\r\n methodOpt.appendChild(svg);\r\n methodType.appendChild(methodOpt);\r\n reqOperator.appendChild(methodType);\r\n // 请求URL\r\n const reqUrl = createInputElement();\r\n reqUrl.setAttribute('data-layer', 'requrl');\r\n reqUrl.className = 'Requrl codigma-apiunit-requrl';\r\n reqUrl.value = apiOperator.url; // 绑定初始值\r\n // 可选:添加输入事件监听(根据需求)\r\n reqUrl.addEventListener('input', (e: any) => {\r\n // 这里可以添加保存逻辑(如更新状态/发送请求\r\n apiOperator.url = e.target.value\r\n });\r\n reqOperator.appendChild(reqUrl);\r\n // 发送按钮\r\n const sendButton = document.createElement('div');\r\n sendButton.setAttribute('data-layer', 'send-button');\r\n sendButton.className = 'SendButton codigma-apiunit-send-button';\r\n const sendText = document.createElement('div');\r\n sendText.setAttribute('data-layer', 'Send');\r\n sendText.className = 'Send codigma-apiunit-send';\r\n sendText.textContent = 'Send';\r\n sendButton.appendChild(sendText);\r\n\r\n sendButton.addEventListener('click', (e: any) => {\r\n // 这里可以添加保存逻辑(如更新状态/发送请求\r\n // responseSectionRef 在渲染时会被挂载到 apiOperator._responseSectionRef 上\r\n const respRef = apiOperator._responseSectionRef || null;\r\n sendRequest(apiOperator, respRef);\r\n });\r\n\r\n reqOperator.appendChild(sendButton);\r\n return reqOperator;\r\n}\r\n\r\nfunction createParamSection(apiOperator: any) {\r\n const paramSection = document.createElement('div');\r\n paramSection.setAttribute('data-layer', 'paramters-section');\r\n paramSection.className = 'codigma-apiunit-paramters-section';\r\n // 参数容器头\r\n const paramCnr = document.createElement('div');\r\n paramCnr.setAttribute('data-layer', 'parameters-cnr');\r\n paramCnr.className = 'codigma-apiunit-parameters-cnr';\r\n const paramText = document.createElement('div');\r\n paramText.setAttribute('data-layer', 'parameters');\r\n paramText.className = 'codigma-apiunit-send';\r\n paramText.textContent = 'Parameters';\r\n paramCnr.appendChild(paramText);\r\n paramSection.appendChild(paramCnr);\r\n // 参数键值对\r\n const paramValues = document.createElement('div');\r\n paramValues.setAttribute('data-layer', 'paraKeyValues');\r\n paramValues.className = 'Parakeyvalues codigma-apiunit-parakeyvalues';\r\n let parameters = apiOperator.rawApiInfo.parameters || [];\r\n const parameterRows = parameters.filter((parameter: any) => isPathOrQueryParam(parameter))\r\n .map((parameter: any) => createRow(parameter));\r\n paramValues.append(...parameterRows);\r\n paramSection.append(paramCnr, paramValues);\r\n return paramSection;\r\n}\r\n\r\nfunction createSectionHeader(apiOperator: any) {\r\n const headerSection = document.createElement('div');\r\n headerSection.setAttribute('data-layer', 'headers-section');\r\n headerSection.className = 'codigma-apiunit-paramters-section';\r\n // 头部容器头\r\n const headerCnr = document.createElement('div');\r\n headerCnr.setAttribute('data-layer', 'headers-cnr');\r\n headerCnr.className = 'codigma-apiunit-parameters-cnr';\r\n const headerText = document.createElement('div');\r\n headerText.setAttribute('data-layer', 'headers');\r\n headerText.className = 'codigma-apiunit-send';\r\n headerText.textContent = 'Headers';\r\n headerCnr.appendChild(headerText);\r\n headerSection.appendChild(headerCnr);\r\n // 头部键值对\r\n const headerValues = document.createElement('div');\r\n headerValues.setAttribute('data-layer', 'paraKeyValues');\r\n headerValues.className = 'Parakeyvalues codigma-apiunit-parakeyvalues';\r\n let parameters = apiOperator.rawApiInfo.parameters || [];\r\n const headerRows = parameters.filter((parameter: any) => isHeaderParam(parameter))\r\n .map((parameter: any) => createRow(parameter));\r\n headerValues.append(...headerRows);\r\n headerSection.append(headerCnr, headerValues);\r\n return headerSection;\r\n}\r\n\r\nfunction createSectionAuth(apiOperator: any) {\r\n const authSection = document.createElement('div');\r\n authSection.setAttribute('data-layer', 'authorization-section');\r\n authSection.className = 'AuthorizationSection codigma-apiunit-paramters-section';\r\n // 授权容器头\r\n const authCnr = document.createElement('div');\r\n authCnr.setAttribute('data-layer', 'authorization-cnr');\r\n authCnr.className = 'AuthorizationCnr codigma-apiunit-parameters-cnr';\r\n const authText = document.createElement('div');\r\n authText.setAttribute('data-layer', 'authorization');\r\n authText.className = 'Authorization codigma-apiunit-send';\r\n authText.textContent = 'Authorization';\r\n authCnr.appendChild(authText);\r\n authSection.appendChild(authCnr);\r\n // 授权键值对\r\n const authValues = document.createElement('div');\r\n authValues.setAttribute('data-layer', 'paraKeyValues');\r\n authValues.className = 'Parakeyvalues codigma-apiunit-parakeyvalues';\r\n\r\n const authTypeRow = createSelectRow('Authorization Type', auths)\r\n // 添加选择事件监听\r\n authTypeRow.children[1].addEventListener('change', function (event: any) {\r\n //切换前先移除掉原来的元素\r\n authValues && Array.from(authValues.children).slice(1).forEach((el: any) => el.remove());\r\n const auth = auths[event.target.selectedIndex];\r\n if (auth.value == 'No Auth') {\r\n\r\n } else if (auth.value == 'Basic Auth') {\r\n apiOperator.auth = [\r\n {\r\n name: \"userName\",\r\n value: \"\"\r\n },\r\n {\r\n name: \"password\",\r\n value: \"\"\r\n }\r\n ]\r\n const authRows = apiOperator.auth.map((parameter: any) => createRow(parameter));\r\n authValues.append(...authRows);\r\n } else if (auth.value == 'OAuth 2.0') {\r\n apiOperator.auth = {}\r\n renderAuthForm(apiOperator, authValues, authTypeRow)\r\n }\r\n });\r\n\r\n authValues.append(authTypeRow);\r\n authSection.append(authCnr, authValues);\r\n return authSection;\r\n}\r\n\r\n// 工具函数:创建带 class 和属性的元素\r\nfunction createElement(tag: string, props: Record<string, string> = {}, classes: string[] = []): HTMLElement {\r\n const el = document.createElement(tag);\r\n Object.entries(props).forEach(([key, value]) => el.setAttribute(key, value));\r\n if (classes.length) el.classList.add(...classes);\r\n return el;\r\n}\r\n\r\n// 工具函数:创建 label + input 结构\r\nfunction createLabeledInput(apiOperator: any,\r\n labelText: string,\r\n inputId: string,\r\n inputName: string,\r\n modelKey: string,\r\n required: boolean = false\r\n): HTMLElement {\r\n const wrapper = createElement('div', {}, ['Keyvalue', 'codigma-apiunit-keyvalue']);\r\n const label = createElement('label', { for: inputId }, ['type', 'codigma-apiunit-send']);\r\n label.textContent = labelText + ':';\r\n const input = createElement('input', {\r\n type: 'text',\r\n id: inputId,\r\n name: inputName,\r\n autocomplete: 'off',\r\n ...(required ? { required: 'true' } : {})\r\n }, ['Valuetext', 'codigma-apiunit-valuetext']) as HTMLInputElement;\r\n\r\n // 双向绑定模拟:初始化值 + 监听输入\r\n input.value = apiOperator.auth[modelKey] || '';\r\n input.addEventListener('input', (e) => {\r\n apiOperator.auth[modelKey] = (e.target as HTMLInputElement).value;\r\n });\r\n\r\n wrapper.appendChild(label);\r\n wrapper.appendChild(input);\r\n return wrapper;\r\n}\r\n\r\n// 创建下拉选择框(替代 ast-select)\r\nfunction createSelect(apiOperator: any, \r\n labelText: string,\r\n selectId: string,\r\n options: { value: string; displayName?: string }[],\r\n modelKey: string,\r\n changeHandler: (value: string) => void\r\n): HTMLElement {\r\n const wrapper = createElement('div', {}, ['Keyvalue', 'codigma-apiunit-keyvalue']);\r\n const label = createElement('label', { for: selectId }, ['type', 'codigma-apiunit-send']);\r\n label.textContent = labelText + ':';\r\n\r\n const select = createElement('select', {\r\n id: selectId,\r\n name: selectId\r\n }, []) as HTMLSelectElement;\r\n\r\n options.forEach(opt => {\r\n const option = createElement('option', { value: opt.value }) as HTMLOptionElement;\r\n option.textContent = opt.displayName || opt.value;\r\n select.appendChild(option);\r\n });\r\n\r\n // 初始化选中值\r\n select.value = apiOperator.auth[modelKey] || options[0]?.value || '';\r\n // changeHandler(select.value); // 触发初始设置\r\n\r\n select.addEventListener('change', (e) => {\r\n const val = (e.target as HTMLSelectElement).value;\r\n changeHandler(val);\r\n });\r\n\r\n wrapper.appendChild(label);\r\n wrapper.appendChild(select);\r\n return wrapper;\r\n}\r\n\r\n// 重新渲染整个表单(基于当前 apiOperator.auth.grantType)\r\nfunction renderAuthForm(apiOperator: any, authValues: any, authTypeRow: any) {\r\n authValues.innerHTML = ''; // 清空\r\n\r\n authValues.append(authTypeRow);\r\n // Token\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Token', 'token', 'token', 'token', true));\r\n\r\n // Grant Type\r\n authValues.appendChild(\r\n createSelect(apiOperator,\r\n 'Grant Type',\r\n 'grantType',\r\n grantTypes,\r\n 'grantType',\r\n (value: string) => {\r\n apiOperator.auth.grantType = value;\r\n renderAuthForm(apiOperator, authValues, authTypeRow); // 重新渲染以反映条件字段\r\n }\r\n )\r\n );\r\n\r\n const gt = apiOperator.auth.grantType || 'authorization_code';\r\n\r\n // Conditional: Authorization Code or Implicit\r\n if (gt === 'authorization_code' || gt === 'Implicit') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Authorization Endpoint', 'authorizationEndpoint', 'authorizationEndpoint', 'authorizationEndpoint', true));\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Redirect URL', 'RedirectURI', 'RedirectURI', 'redirectURI', true));\r\n }\r\n\r\n // Conditional: Token Endpoint needed\r\n if (gt === 'authorization_code' || gt === 'client_credentials' || gt === 'Resource Owner Password Credentials') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Token Endpoint', 'TokenEndpoint', 'TokenEndpoint', 'tokenEndpoint', true));\r\n }\r\n\r\n // Client ID (always shown)\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Client ID', 'ClientID', 'ClientID', 'clientId', true));\r\n\r\n // Conditional: Client Secret\r\n if (gt === 'authorization_code' || gt === 'client_credentials' || gt === 'Resource Owner Password Credentials') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Client Secret', 'ClientSecret', 'ClientSecret', 'clientSecret', true));\r\n }\r\n\r\n // Conditional: Username & Password\r\n if (gt === 'Resource Owner Password Credentials') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Username', 'Username', 'Username', 'username', true));\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Password', 'Password', 'Password', 'password', true));\r\n }\r\n\r\n // Scopes (always shown)\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Scopes', 'Scopes', 'Scopes', 'scopes', true));\r\n\r\n // Client Authentication\r\n authValues.appendChild(\r\n createSelect(apiOperator,\r\n 'Client Authentication',\r\n 'clientAuthentication',\r\n clientAuthenticationOpts,\r\n 'clientAuthentication',\r\n (value: string) => {\r\n apiOperator.auth.clientAuthentication = value;\r\n // 不需要重新渲染整个表单,除非 UI 依赖此值\r\n }\r\n )\r\n );\r\n\r\n // --- 新增:Generate Token 按钮 ---\r\n const buttonWrapper = createElement('div', {}, ['parameter-item']);\r\n const generateBtn = createElement('button', {}, ['parameter-button']) as HTMLButtonElement;\r\n generateBtn.type = 'button';\r\n generateBtn.textContent = 'Generate Token';\r\n generateBtn.addEventListener('click', () => generateOAuth2Token(apiOperator)); // 绑定点击事件\r\n\r\n buttonWrapper.appendChild(generateBtn);\r\n authValues.appendChild(buttonWrapper);\r\n}\r\n\r\nfunction createSectionRequestBody(apiOperator: any) {\r\n const bodySection = document.createElement('div');\r\n bodySection.setAttribute('data-layer', 'request-body-section');\r\n bodySection.className = 'RequestBodySection codigma-apiunit-request-body-section';\r\n // 请求体容器头\r\n const bodyCnr = document.createElement('div');\r\n bodyCnr.setAttribute('data-layer', 'body-cnr');\r\n bodyCnr.className = 'BodyCnr codigma-apiunit-parameters-cnr';\r\n const bodyText = document.createElement('div');\r\n bodyText.setAttribute('data-layer', 'body');\r\n bodyText.className = 'Body codigma-apiunit-send';\r\n bodyText.textContent = 'Body';\r\n bodyCnr.appendChild(bodyText);\r\n bodySection.appendChild(bodyCnr);\r\n // 请求体内容\r\n renderConsumeSection(apiOperator, bodySection, bodyCnr);\r\n return bodySection;\r\n}\r\n\r\n\r\n\r\n\r\n// ========== 创建下拉选择框 ==========\r\nfunction createConsumeSelect(apiOperator: any, container: HTMLElement, bodyCnr: any) {\r\n const wrapper = createElement('div');\r\n const label = createElement('label');\r\n label.style.margin = '0 1rem';\r\n label.textContent = 'Content-Type';\r\n\r\n const select = createElement('select') as HTMLSelectElement;\r\n select.style.width = '18rem'; // 模拟 [width]=\"'18rem'\"\r\n\r\n consumeOpts.forEach(opt => {\r\n const option = document.createElement('option');\r\n option.value = opt.value;\r\n option.textContent = opt.value;\r\n select.appendChild(option);\r\n });\r\n\r\n // 设置当前值\r\n select.value = apiOperator.currentConsume || getCurrentConsume(apiOperator);\r\n\r\n // 监听 change\r\n select.addEventListener('change', (e) => {\r\n const newValue = (e.target as HTMLSelectElement).value;\r\n if (apiOperator.currentConsume !== newValue) {\r\n apiOperator.currentConsume = newValue;\r\n renderConsumeSection(apiOperator, container, bodyCnr); // 重新渲染整个区域\r\n }\r\n });\r\n\r\n wrapper.appendChild(label);\r\n wrapper.appendChild(select);\r\n return wrapper;\r\n}\r\n\r\n// ========== 渲染请求体到指定容器(无 ID 依赖) ==========\r\nfunction renderRequestBodyInto(apiOperator: any, targetDiv: HTMLElement) {\r\n targetDiv.innerHTML = ''; // 清空目标区域\r\n\r\n // 确保 requestBody 和 content 存在\r\n const ct = apiOperator.currentConsume || getCurrentConsume(apiOperator);\r\n // ✅ 情况 1: 使用 textarea(JSON/XML/None/text/plain)\r\n if (\r\n ct === null ||\r\n ct === 'None' ||\r\n ct === 'application/json' ||\r\n ct === 'application/xml' ||\r\n ct === 'text/plain'\r\n ) {\r\n // 决定使用哪个 key:'None' 也视为一种 content 类型(或可映射为 '',但这里直接用 'None')\r\n const mimeType = ct || 'None';\r\n\r\n // 从 content[mimeType] 读取,若无则默认空字符串\r\n let rawValue = apiOperator.requestBody.content[mimeType];\r\n if (rawValue == null) {\r\n rawValue = '';\r\n apiOperator.requestBody.content[mimeType] = rawValue; // 初始化\r\n }\r\n\r\n const textarea = createElement('textarea', {}, []) as HTMLTextAreaElement;\r\n textarea.style.width = '100%';\r\n textarea.style.height = '200px';\r\n textarea.style.fontFamily = 'monospace';\r\n textarea.style.fontSize = '14px';\r\n textarea.placeholder = `Enter ${mimeType} body...`;\r\n\r\n textarea.value = rawValue;\r\n\r\n // 监听输入 → 写回 content[mimeType]\r\n textarea.addEventListener('input', () => {\r\n apiOperator.requestBody.content[mimeType] = textarea.value;\r\n console.log(`Content updated for ${mimeType}:`, textarea.value);\r\n });\r\n\r\n targetDiv.appendChild(textarea);\r\n\r\n }\r\n // ✅ 情况 2: 表单参数\r\n else if (\r\n (ct === 'application/x-www-form-urlencoded' || ct === 'multipart/form-data') &&\r\n apiOperator.requestBody.content &&\r\n Array.isArray(apiOperator.requestBody.content[ct])\r\n ) {\r\n const params = apiOperator.requestBody.content[ct];\r\n params.forEach((param: any, index: number) => {\r\n const item = createElement('div', {}, ['Keyvalue', 'codigma-apiunit-keyvalue']);\r\n\r\n const label = createElement('label', { for: `param-${Date.now()}-${index}` }, ['petId', 'codigma-apiunit-send']);\r\n label.textContent = `${param.name}:`;\r\n\r\n const input = createElement('input', {\r\n type: param.uiType || 'text',\r\n // 使用时间戳+索引避免 id 冲突(仅用于 label for)\r\n id: `param-${Date.now()}-${index}`,\r\n name: 'name'\r\n }, ['Valuetext', 'codigma-apiunit-valuetext']) as HTMLInputElement;\r\n\r\n input.value = param.value || '';\r\n input.autocomplete = 'off';\r\n input.required = true;\r\n\r\n input.addEventListener('keydown', (e) => {\r\n setEditStatus(e, true);\r\n });\r\n\r\n input.addEventListener('input', () => {\r\n param.value = input.value;\r\n });\r\n\r\n item.appendChild(label);\r\n item.appendChild(input);\r\n targetDiv.appendChild(item);\r\n });\r\n }\r\n}\r\n\r\nfunction getCurrentConsume(apiOperator: any) {\r\n if (!apiOperator.requestBody) {\r\n apiOperator.requestBody = { content: {} };\r\n }\r\n if (!apiOperator.requestBody.content) {\r\n apiOperator.requestBody.content = {};\r\n }\r\n\r\n const keys = Object.keys(apiOperator.requestBody.content);\r\n const ct = apiOperator.currentConsume = keys.length > 0 ? keys[0] : 'None';\r\n return ct;\r\n}\r\n\r\n// ========== 模拟 setEditStatus(你原有逻辑) ==========\r\nfunction setEditStatus(event: KeyboardEvent, status: boolean) {\r\n // TODO: 根据你的业务逻辑实现\r\n console.log('setEditStatus called:', event.key, status);\r\n}\r\n\r\n// ========== 主渲染函数 ==========\r\nfunction renderConsumeSection(apiOperator: any, container: HTMLElement, bodyCnr: any) {\r\n container.innerHTML = '';\r\n\r\n container.appendChild(bodyCnr);\r\n\r\n // 创建外层包裹 div\r\n const wrapperDiv = createElement('div', {}, ['codigma-apiunit-parakeyvalues']);\r\n\r\n // 1. Content-Type 选择器\r\n const selectWrapper = createConsumeSelect(apiOperator, container, bodyCnr);\r\n wrapperDiv.appendChild(selectWrapper);\r\n\r\n // 2. 请求体区域(不再使用固定 ID)\r\n const reqBodyContainer = createElement('div', {}, ['codigma-apiunit-request-body-info']); // 无 id,避免冲突\r\n renderRequestBodyInto(apiOperator, reqBodyContainer); // 改为传入目标容器\r\n wrapperDiv.appendChild(reqBodyContainer);\r\n\r\n // 将整个包裹 div 添加到外部容器\r\n container.appendChild(wrapperDiv);\r\n}\r\n\r\n\r\nfunction createSectionResponse(apiOperator: any) {\r\n const responseSection = document.createElement('div');\r\n responseSection.setAttribute('data-layer', 'reqresponse');\r\n responseSection.className = 'Reqresponse codigma-apiunit-reqresponse';\r\n // 响应描述\r\n const responseDesc = document.createElement('div');\r\n responseDesc.setAttribute('data-layer', 'responsedesc');\r\n responseDesc.className = 'Responsedesc codigma-apiunit-responsedesc';\r\n // 响应标题\r\n const responseTitle = document.createElement('div');\r\n responseTitle.setAttribute('data-layer', 'responsetitle');\r\n responseTitle.className = 'Responsetitle codigma-apiunit-responsetitle';\r\n const responseCnr = document.createElement('div');\r\n responseCnr.setAttribute('data-layer', 'response-cnr');\r\n responseCnr.className = 'ResponseCnr codigma-apiunit-response-cnr';\r\n const responseText = document.createElement('div');\r\n responseText.setAttribute('data-layer', 'response');\r\n responseText.className = 'Response codigma-apiunit-send';\r\n responseText.textContent = 'Response';\r\n responseCnr.appendChild(responseText);\r\n responseTitle.appendChild(responseCnr);\r\n const timeStatusElement = createTimeStatusElement(apiOperator);\r\n responseDesc.append(responseTitle, timeStatusElement);\r\n // 响应体\r\n const responseBody = document.createElement('div');\r\n responseBody.setAttribute('data-layer', 'responsebody');\r\n responseBody.className = 'Responsebody codigma-apiunit-responsebody';\r\n responseSection.append(responseDesc, responseBody);\r\n return responseSection;\r\n}\r\n\r\nfunction createTimeStatusElement(apiOperator: any) {\r\n const timeStatus = document.createElement('div');\r\n timeStatus.setAttribute('data-layer', 'TimeStatus');\r\n timeStatus.className = 'TimeStatus0 codigma-apiunit-send';\r\n updateTimeStatus(timeStatus, apiOperator);\r\n return timeStatus;\r\n}\r\n\r\nfunction updateTimeStatus(timeStatus: any, apiOperator: any) {\r\n timeStatus.textContent\r\n = `Status: ${apiOperator.response.status || \"\"} ${apiOperator.response.statusText || \"\"} Time: ${apiOperator.requestDuration || \"\"}`;\r\n}\r\n\r\nfunction createRow(parameter: any) {\r\n const petIdRow = document.createElement('div');\r\n petIdRow.setAttribute('data-layer', 'keyValue');\r\n petIdRow.className = 'Keyvalue codigma-apiunit-keyvalue';\r\n const petIdLabel = document.createElement('div');\r\n petIdLabel.setAttribute('data-layer', parameter[\"name\"]);\r\n petIdLabel.className = parameter[\"name\"] + ' codigma-apiunit-send';\r\n petIdLabel.textContent = parameter[\"name\"] + ':';\r\n const petIdValue = createInputElement();\r\n petIdValue.setAttribute('data-layer', 'valueText');\r\n petIdValue.className = 'Valuetext codigma-apiunit-valuetext';\r\n petIdValue.value = parameter[\"value\"] || \"\";\r\n\r\n // 可选:添加输入事件监听(根据需求)\r\n petIdValue.addEventListener('input', (e: any) => {\r\n // 这里可以添加保存逻辑(如更新状态/发送请求\r\n parameter[\"value\"] = e.target.value\r\n });\r\n petIdRow.append(petIdLabel, petIdValue);\r\n return petIdRow;\r\n}\r\n\r\nfunction createInputElement() {\r\n const inputText = document.createElement('input');\r\n inputText.setAttribute('type', 'text');\r\n inputText.setAttribute('name', 'text-input');\r\n inputText.setAttribute('label', 'text-input');\r\n inputText.setAttribute('autocomplete', 'off');\r\n return inputText;\r\n}\r\n\r\nfunction createSelectRow(name: string, args: any) {\r\n // 创建外层容器div\r\n const container = document.createElement('div');\r\n container.setAttribute('data-layer', 'keyValue');\r\n container.className = 'Keyvalue codigma-apiunit-keyvalue';\r\n\r\n // 创建type显示div\r\n const typeLabel = document.createElement('div');\r\n typeLabel.setAttribute('data-layer', name);\r\n typeLabel.className = 'type codigma-apiunit-send';\r\n typeLabel.textContent = name + \":\";\r\n\r\n // 创建select元素\r\n const selectElement: any = document.createElement('select');\r\n selectElement.name = 'text-select';\r\n selectElement.label = 'text-select';\r\n selectElement.setAttribute('data-layer', 'valueText');\r\n\r\n // 示例选项(可根据实际需求添加\r\n args.forEach((auth: any) => {\r\n const option1 = document.createElement('option');\r\n option1.value = auth[\"value\"];\r\n option1.textContent = (auth['displayName'] != null || auth['label'] != null) ? (auth[\"displayName\"] || auth['label']): auth[\"value\"];\r\n selectElement.appendChild(option1);\r\n })\r\n\r\n // 组装DOM结构\r\n container.appendChild(typeLabel);\r\n container.appendChild(selectElement);\r\n return container;\r\n}\r\n\r\nfunction isPathOrQueryParam(param: any) {\r\n return param.in === 'path' || param.in === 'query';\r\n}\r\n\r\nfunction isHeaderParam(param: any) {\r\n return param.in === 'header';\r\n}\r\n\r\n\r\nasync function generateOAuth2Token(apiInfo: any) {\r\n // TODO 生成OAuth2.0 Token\r\n // 1. 获取访问令牌\r\n const accessToken = await getAccessToken(apiInfo);\r\n apiInfo.auth.token = accessToken\r\n}\r\n\r\n\r\n /**\r\n * 获取 OAuth 2.0 访问令牌\r\n * @returns {Promise<string>} 访问令牌\r\n */\r\nasync function getAccessToken(apiInfo: any) {\r\n const auth = apiInfo.auth;\r\n if (auth == null) {\r\n throw new Error('OAuth2.0认证信息未配置');\r\n }\r\n const CLIENT_ID = auth.clientId;\r\n const CLIENT_SECRET = auth.clientSecret;\r\n const SCOPE = auth.scopes;\r\n\r\n if (apiInfo.auth.grantType == 'client_credentials') {\r\n try {\r\n console.log('正在获取访问令牌...');\r\n\r\n // 构造请求头\r\n const headerParams: any = {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n };\r\n // 构造请求体 (使用 client_credentials 流)\r\n const bodyParams = new URLSearchParams();\r\n bodyParams.append('grant_type', 'client_credentials');\r\n if (SCOPE) {\r\n bodyParams.append('scope', SCOPE);\r\n }\r\n\r\n if (apiInfo.auth.clientAuthentication == 'Body') {\r\n bodyParams.append('client_id', CLIENT_ID);\r\n bodyParams.append('client_secret', CLIENT_SECRET);\r\n } else {\r\n // 如果是 Headers 方式,则在后续的 fetch 请求中添加 Authorization 头\r\n headerParams['Authorization'] = 'Basic ' + btoa(CLIENT_ID + ':' + CLIENT_SECRET);\r\n }\r\n\r\n const response = await fetch(auth.tokenEndpoint, {\r\n method: 'POST',\r\n headers: headerParams,\r\n body: bodyParams.toString()\r\n })\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n throw new Error(`获取令牌失败: ${response.status} ${response.statusText}. ${JSON.stringify(errorData)}`);\r\n }\r\n\r\n const tokenData = await response.json();\r\n console.log('令牌获取成功:', tokenData);\r\n return tokenData.access_token;\r\n } catch (error) {\r\n console.error('获取访问令牌时出错:', error);\r\n throw error;\r\n }\r\n } else if (apiInfo.auth.grantType == 'Resource Owner Password Credentials') {\r\n\r\n } else if (apiInfo.auth.grantType == 'authorization_code') {\r\n // ========== 配置:替换为你在本地 OAuth 服务注册的客户端信息 ==========\r\n const config = {\r\n clientId: apiInfo.auth.clientId, // 替换为你的 client_id\r\n clientSecret: apiInfo.auth.clientSecret, // 替换为你的 client_secret\r\n redirectUri: apiInfo.auth.redirectURI, // 必须与注册的 redirect_uri 一致\r\n authUrl: apiInfo.auth.authorizationEndpoint,\r\n tokenUrl: apiInfo.auth.tokenEndpoint,\r\n scope: apiInfo.auth.scopes // 可选: 'openid profile email' 如果服务支持\r\n };\r\n\r\n // 从 URL 获取参数\r\n function getUrlParams() {\r\n const params = new URLSearchParams(window.location.search);\r\n return Object.fromEntries(params.entries());\r\n }\r\n\r\n // 构建授权 URL 并跳转\r\n function redirectToAuth() {\r\n const state = Math.random().toString(36).substring(2);\r\n const nonce = Math.random().toString(36).substring(2); // OpenID Connect 推荐使用 nonce\r\n const authUrl = new URL(config.authUrl);\r\n authUrl.searchParams.append('client_id', config.clientId);\r\n authUrl.searchParams.append('redirect_uri', config.redirectUri);\r\n authUrl.searchParams.append('response_type', 'code');\r\n authUrl.searchParams.append('scope', config.scope);\r\n authUrl.searchParams.append('state', state);\r\n authUrl.searchParams.append('nonce', nonce); // 用于 ID Token 验证\r\n authUrl.searchParams.append('access_type', 'offline'); // 请求 refresh_token(如果支持)\r\n\r\n const newTab = window.open(authUrl.toString(), '_blank');\r\n }\r\n\r\n // // 使用授权码换取 Token\r\n // async function exchangeCodeForToken(code: any) {\r\n // try {\r\n // const response = await fetch(config.tokenUrl, {\r\n // method: 'POST',\r\n // headers: {\r\n // 'Content-Type': 'application/x-www-form-urlencoded',\r\n // 'Authorization': 'Basic ' + btoa(config.clientId + ':' + config.clientSecret)\r\n // },\r\n // body: new URLSearchParams({\r\n // // 'client_id': config.clientId,\r\n // // 'client_secret': config.clientSecret,\r\n // 'code': code,\r\n // 'redirect_uri': config.redirectUri,\r\n // 'grant_type': 'authorization_code'\r\n // })\r\n // });\r\n\r\n // if (!response.ok) {\r\n // const errorText = await response.text();\r\n // throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n // }\r\n\r\n // const tokenData = await response.json();\r\n // console.log('Token Response:', tokenData);\r\n\r\n // // 可选:清除 URL 参数\r\n // // history.replaceState({}, document.title, window.location.pathname);\r\n // } catch (error) {\r\n // console.error('Token Exchange Error:', error);\r\n // }\r\n // }\r\n\r\n // // 页面初始化\r\n // document.addEventListener('DOMContentLoaded', () => {\r\n // const loginBtn = document.getElementById('loginBtn');\r\n // const urlParams = getUrlParams();\r\n\r\n // if (urlParams.code) {\r\n // // 已收到授权码\r\n // loginBtn.style.display = 'none';\r\n // exchangeCodeForToken(urlParams.code);\r\n // } else {\r\n\r\n // }\r\n // });\r\n\r\n redirectToAuth();\r\n } else if (apiInfo.auth.grantType == 'Implicit') {\r\n\r\n } else {\r\n\r\n }\r\n}\r\n\r\n\r\nfunction getBodyEditorContent(apiOperator: any): string {\r\n const ct = apiOperator.currentConsume || 'None';\r\n return apiOperator.requestBody.content[ct];\r\n}\r\n\r\n\r\n\r\nlet gotResponse = false;\r\n\r\nlet ifSendingRequest = false;\r\nlet requestDuration: string = \"0\";\r\nlet responseObj: {\r\n status ?: number | string;\r\n statusText ?: string;\r\n body ?: string;//响应体统一转换成字符串\r\n} = { };\r\n// 创建一个新的 AbortController 实例 \r\nlet controller: AbortController | undefined;\r\n\r\n/**\r\n * \r\n * \r\n * \r\n * const apiOperator = {\r\n method: method.toUpperCase(),\r\n url: path,\r\n rawApiInfo: null,\r\n requestBody: null\r\n }\r\n\r\n * @param {*} apiOperator\r\n * @param {*} apiInfo \r\n */\r\nfunction sendRequest(apiOperator: any, responseSectionRef: any) {\r\n const apiInfo = apiOperator\r\n let reuqestUrl = getRequestUrl(apiInfo);\r\n\r\n //TODO 根据参数类型构造请求头和请求体,apiInfo['parameterHasFormDataVer2']表示有formData参数,暂时未区分具体的content-type,待改造\r\n let header = apiInfo['parameterHasFormDataVer2'] ? 'application/x-www-form-urlencoded' :\r\n ((apiInfo['parameterHasBody']) ? apiInfo['currentConsume'] : 'application/json');\r\n\r\n let headers: any = {\r\n 'Content-Type': header\r\n }\r\n const headerParas = getHeadersParams(apiInfo, apiInfo.rawApiInfo.parameters || []);\r\n // 合并自定义头参数\r\n Object.assign(headers, headerParas);\r\n // 构造 Basic Auth 头\r\n addAuthHeader(apiInfo, headers);\r\n\r\n let body;\r\n if (apiInfo.method.toUpperCase() == \"POST\" || apiInfo.method.toUpperCase() == \"PUT\") {\r\n if (apiInfo['currentConsume'] == 'application/json' && apiInfo.requestBody != null) {\r\n body = getBodyEditorContent(apiOperator);\r\n } else if (apiInfo['parameterHasFormDataVer2']) {\r\n body = getRequestFormData(apiInfo.rawApiInfo);\r\n } else if (apiInfo['currentConsume'] == 'application/x-www-form-urlencoded') {\r\n for (const key of apiInfo[\"requestBody\"][\"content\"][apiInfo['currentConsume']]) {\r\n if (body == null || body == '') {\r\n body = key.name + \"=\" + key.value;\r\n } else {\r\n body = body + \"&\" + key.name + \"=\" + key.value;\r\n }\r\n }\r\n } else {\r\n body = \"\";\r\n }\r\n } else {\r\n body = \"\";\r\n }\r\n\r\n ifSendingRequest = true;\r\n const startTime = Date.now(); // 记录开始时间\r\n\r\n apiOperator.controller = new AbortController();\r\n const signal = apiOperator.controller.signal;\r\n\r\n //正在发送请求时创建遮罩层\r\n const overlayLayerContainer = createRequestOverlayLayer(apiOperator, responseSectionRef);\r\n\r\n // 使用 fetch 发送请求,并传递 signal \r\n fetch(reuqestUrl, {\r\n method: apiInfo.method.toUpperCase(),\r\n headers: headers,\r\n body: body,\r\n signal: signal\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n responseObj = {\r\n status: response.status,\r\n statusText: response.statusText,\r\n body: \"\"\r\n }\r\n\r\n const endTime = Date.now(); // 即使在错误的情况下也记录结束时间 \r\n requestDuration = formatDuration(endTime - startTime);\r\n ifSendingRequest = false;\r\n throw new Error('Network response was not ok.');\r\n }\r\n const endTime = Date.now(); // 记录结束时间 \r\n requestDuration = formatDuration(endTime - startTime); // 计算耗时\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n responsebodyElement.removeChild(overlayLayerContainer);\r\n\r\n ifSendingRequest = false;\r\n responseObj = {\r\n status: response.status,\r\n statusText: response.statusText\r\n }\r\n\r\n // 在responseSectionRef元素范围内查找TimeStatus元素\r\n const timeStatusElement = responseSectionRef.querySelector('[data-layer=\"TimeStatus\"]');\r\n if (timeStatusElement) {\r\n updateTimeStatus(timeStatusElement, apiOperator);\r\n } else {\r\n console.log(\"在reqresponse范围内未找到TimeStatus元素\");\r\n }\r\n\r\n let responseClone = response.clone();\r\n return response.json() // 解析为json \r\n .catch(error => {\r\n // 如果解析 JSON 失败,则回退到文本解析\r\n return responseClone.text();\r\n });\r\n })\r\n .then(data => {\r\n gotResponse = true;\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n // 此时 data 可能是 JSON 对象,也可能是文本字符串 \r\n if (typeof data === 'object') {\r\n // 假设 data 是 JSON 对象,你可以在这里处理它 \r\n console.log('Received JSON:', data);\r\n responseObj.body = JSON.stringify(data, null, 4);\r\n } else {\r\n // 假设 data 是文本字符串,你可以在这里处理它 \r\n console.log('Received text:', data);\r\n responseObj.body = data;\r\n }\r\n responsebodyElement.textContent = responseObj.body;\r\n })\r\n .catch(error => {\r\n // 错误处理 \r\n console.error('There has been a problem with your fetch operation:', error);\r\n });\r\n}\r\n\r\nfunction createRequestOverlayLayer(apiOperator: any, responseSectionRef: any) {\r\n // 创建主容器 \r\n const container = document.createElement('div');\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: 0,\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n backgroundColor: 'rgb(255, 255, 255)',\r\n opacity: 0.8\r\n });\r\n\r\n // 创建内容容器 \r\n const contentDiv = document.createElement('div');\r\n Object.assign(contentDiv.style, {\r\n display: 'flex',\r\n gap: '5px',\r\n alignItems: 'center',\r\n });\r\n\r\n // 创建文本div \r\n const textDiv = document.createElement('div');\r\n textDiv.textContent = 'Sending request...';\r\n\r\n // 创建取消按钮 \r\n const cancelBtn = document.createElement('button');\r\n cancelBtn.className = 'request-cancel-btn';\r\n Object.assign(cancelBtn.style, {\r\n border: '0px'\r\n });\r\n cancelBtn.textContent = 'Cancel';\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n // 组装DOM结构 \r\n contentDiv.appendChild(textDiv);\r\n contentDiv.appendChild(cancelBtn);\r\n container.appendChild(contentDiv);\r\n responsebodyElement.appendChild(container);\r\n\r\n // 添加点击事件\r\n cancelBtn.addEventListener('click', (e) => {\r\n // 如果你想取消请求,调用 controller 的 abort 方法\r\n if (apiOperator.controller) {\r\n apiOperator.controller.abort();\r\n apiOperator.ifSendingRequest = false;\r\n container.style.display = 'none';\r\n responsebodyElement.removeChild(container);\r\n }\r\n });\r\n\r\n return container\r\n}\r\n\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n let totalSeconds = Math.floor(milliseconds / 1000);\r\n let seconds: any = totalSeconds % 60;\r\n let minutes: any = Math.floor(totalSeconds / 60) % 60;\r\n let hours: any = Math.floor(totalSeconds / (60 * 60));\r\n\r\n // 毫秒部分 \r\n let millisecondsPart: any = Math.floor(milliseconds % 1000);\r\n // 毫秒不足三位时前面补0 \r\n millisecondsPart = millisecondsPart.toString().padStart(3, '0');\r\n\r\n // 时分秒不足两位时前面补0 \r\n hours = hours.toString().padStart(2, '0');\r\n minutes = minutes.toString().padStart(2, '0');\r\n seconds = seconds.toString().padStart(2, '0');\r\n\r\n // 返回格式化的字符串 \r\n return `${hours}h${minutes}m${seconds}s${millisecondsPart}ms`;\r\n}\r\n\r\nfunction clickAbortRequest() {\r\n // 如果你想取消请求,调用 controller 的 abort 方法\r\n if (controller) {\r\n controller.abort();\r\n ifSendingRequest = false;\r\n }\r\n}\r\n\r\nfunction getRequestUrl(apiInfo: any) {\r\n let reuqestUrl = apiInfo.url;\r\n\r\n const requestParameters = apiInfo.rawApiInfo.parameters || [];\r\n if (requestParameters == null) {\r\n return reuqestUrl;\r\n }\r\n\r\n for (const element of requestParameters) {\r\n if (element.in == \"path\") {\r\n reuqestUrl = reuqestUrl.replace(\"{\" + element.name + \"}\", element.value);\r\n }\r\n }\r\n\r\n let queryParams = getQueryParams(apiInfo, requestParameters);\r\n reuqestUrl = queryParams.length > 0 ? (reuqestUrl + \"?\" + queryParams.join(\"&\")) : reuqestUrl;\r\n\r\n return reuqestUrl;\r\n}\r\n\r\nfunction addAuthHeader(apiInfo: any, headers: any) {\r\n const env = isBrowserEnvironment();\r\n if (apiInfo.auth.authType == \"Basic Auth\" && apiInfo.auth != null) {\r\n if (env) {\r\n const credentials = btoa(`${apiInfo.auth.username}:${apiInfo.auth.passWord}`); // btoa 是浏览器内置的 Base64 编码函数\r\n headers['Authorization'] = `Basic ${credentials}`;\r\n } else {\r\n const buffer = Buffer.from(`${apiInfo.auth.username}:${apiInfo.auth.passWord}`);\r\n const credentials = buffer.toString('base64');\r\n headers['Authorization'] = `Basic ${credentials}`;\r\n }\r\n } else if (apiInfo.auth.authType == \"OAuth 2.0\" && apiInfo.auth != null) {\r\n if (apiInfo.auth.token != null || apiInfo.auth.token != '') {\r\n headers['Authorization'] = `Bearer ${apiInfo.auth.token}`;\r\n }\r\n }\r\n}\r\n\r\nfunction getHeadersParams(apiInfo: any, requestParameters: any) {\r\n let headersParams = [];\r\n for (const element of requestParameters) {\r\n if (element.in == \"header\") {\r\n headersParams[element.name] = element.value\r\n }\r\n }\r\n\r\n if (apiInfo.customHeaderparameters) {\r\n for (let index = 0; index < apiInfo.customHeaderparameters.length; index++) {\r\n const paras = apiInfo.customHeaderparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n headersParams[paras.name] = paras.value\r\n }\r\n }\r\n }\r\n\r\n return headersParams;\r\n}\r\n\r\nfunction getQueryParams(apiInfo: any, requestParameters: any) {\r\n let queryParams = [];\r\n for (const element of requestParameters) {\r\n if (element.in == \"query\") {\r\n if (element.type == \"array\" || (element.schema != null && element.schema.type == 'array')) {\r\n if (element.value != null) {\r\n for (let index = 0; index < element.value.length; index++) {\r\n queryParams.push(element.name + \"=\" + element.value[index].value);\r\n }\r\n }\r\n } else {\r\n queryParams.push(element.name + \"=\" + element.value);\r\n }\r\n }\r\n }\r\n\r\n if (apiInfo.customQueryparameters) {\r\n for (let index = 0; index < apiInfo.customQueryparameters.length; index++) {\r\n const paras = apiInfo.customQueryparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n queryParams.push(paras.name + \"=\" + paras.value)\r\n }\r\n }\r\n }\r\n\r\n return queryParams;\r\n}\r\n\r\nfunction getRequestFormData(rawApiInfo: any) {\r\n let formData = '';\r\n const requestParameters = rawApiInfo.parameters;\r\n if (requestParameters == null) {\r\n return \"\";\r\n }\r\n\r\n let first = 0;\r\n for (const element of requestParameters) {\r\n if (element.in == \"formData\") {\r\n if (first == 0) {\r\n formData = element.name + \"=\" + element.value;\r\n } else {\r\n formData = formData + \"&\" + element.name + \"=\" + element.value;\r\n }\r\n first++;\r\n }\r\n }\r\n return formData;\r\n}\r\n\r\nfunction isBrowserEnvironment() {\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n return true; // 浏览器环境\r\n } else if (typeof process !== 'undefined' && process.versions && process.versions.node) {\r\n return false; // Node.js 环境\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n\r\nfunction createSvg() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttribute('width', '21');\r\n svg.setAttribute('height', '22');\r\n svg.setAttribute('viewBox', '0 0 21 22');\r\n svg.setAttribute('fill', 'none');\r\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n\r\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n path.setAttribute('d', 'M5.5 8.5L10.5 13.5L15.5 8.5');\r\n path.setAttribute('stroke', 'var(--Labels---Vibrant---Controls-Primary--, #404040)');\r\n path.setAttribute('stroke-width', '2');\r\n path.setAttribute('stroke-linecap', 'round');\r\n path.setAttribute('stroke-linejoin', 'round');\r\n\r\n svg.appendChild(path);\r\n return svg;\r\n}\r\n\r\nfunction parseParaModel(parameterObj: any, dataDef: any) {\r\n let bodyModel;\r\n if (parameterObj.schema['$ref']) { // 对象类型\r\n bodyModel = parseModel(parameterObj.schema['$ref'], dataDef);\r\n } else if (parameterObj.schema['type'] == 'array') { // 数组类型\r\n const itemObj = parameterObj.schema['items'];\r\n if (itemObj['$ref']) {\r\n bodyModel = parseModel(itemObj['$ref'], dataDef);\r\n } else if (itemObj['type']) {\r\n bodyModel = parseElement(itemObj);\r\n }\r\n bodyModel = [bodyModel];\r\n }\r\n return bodyModel;\r\n}\r\n\r\nfunction parseModel(modelDef: any, apiDef: any) {\r\n const model: any = {};\r\n const bodyName = modelDef.substring(modelDef.lastIndexOf('/') + 1);\r\n const def = apiDef[bodyName];\r\n const props = def['properties'];\r\n if (props) {\r\n for (const key in props) {\r\n if (Object.prototype.hasOwnProperty.call(props, key)) {\r\n const element = props[key];\r\n if (element.hasOwnProperty('items') && element['type'] == 'array') {\r\n if (element[\"items\"]['$ref']) {\r\n model[key] = [parseModel(element[\"items\"]['$ref'], apiDef)]\r\n } else if (element[\"items\"]['type']) {\r\n model[key] = [parseElement(element[\"items\"])];\r\n }\r\n } else if (element.hasOwnProperty('$ref')) {\r\n model[key] = parseModel(element['$ref'], apiDef)\r\n } else {\r\n if (element['type']) {\r\n model[key] = parseElement(element);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\nfunction parseFormDataModel(modelDef: any, apiDef: any) {\r\n const model: any = [];\r\n const bodyName = modelDef.substring(modelDef.lastIndexOf('/') + 1);\r\n const def = apiDef[bodyName];\r\n const props = def['properties'];\r\n if (props) {\r\n for (const key in props) {\r\n if (Object.prototype.hasOwnProperty.call(props, key)) {\r\n const element = props[key];\r\n let modelEle: any;\r\n if (element.hasOwnProperty('items') && element['type'] == 'array') {\r\n if (element[\"items\"]['$ref']) {\r\n modelEle = [parseModel(element[\"items\"]['$ref'], apiDef)]\r\n } else if (element[\"items\"]['type']) {\r\n modelEle = [parseElement(element[\"items\"])];\r\n }\r\n if (modelEle) {\r\n model.push({\r\n type: 'string',\r\n uiType: 'text',\r\n name: key,\r\n value: JSON.stringify(modelEle)\r\n });\r\n }\r\n } else if (element['type']) {\r\n model.push({\r\n type: element['type'],\r\n uiType: ((element['type'] == 'integer' || element['type'] == 'number') ? 'number' : 'text'),\r\n name: key,\r\n value: parseElement(element)\r\n });\r\n } else if (element['$ref']) {\r\n const bodyModel = parseModel(element['$ref'], apiDef);\r\n model.push({\r\n type: 'string',\r\n uiType: 'text',\r\n name: key,\r\n value: JSON.stringify(bodyModel)\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\nfunction parseFormDataParaModel(parameterObj: any, dataDef: any) {\r\n let bodyModel: any = [];\r\n if (parameterObj.schema['$ref']) { // 对象类型\r\n bodyModel = parseFormDataModel(parameterObj.schema['$ref'], dataDef);\r\n }\r\n return bodyModel;\r\n}\r\n\r\nfunction parseElement(element: any) {\r\n let elementValue;\r\n if (element['type'].includes('integer')) {\r\n if (element['enum']) {\r\n elementValue = element['enum'][0];\r\n } else {\r\n elementValue = 0;\r\n }\r\n } else if (element['type'].includes('boolean')) {\r\n elementValue = false;\r\n } else if (element['type'].includes('string')) {\r\n if (element['enum']) {\r\n elementValue = element['enum'][0];\r\n } else {\r\n elementValue = '';\r\n }\r\n }\r\n\r\n // 如果有default则用default的值\r\n if (element['default']) {\r\n elementValue = element['default'];\r\n }\r\n\r\n //如果有example则用example的值\r\n if (element['example']) {\r\n elementValue = element['example'];\r\n }\r\n\r\n return elementValue;\r\n}\r\n\r\nfunction parseElementType(element: any) {\r\n if (element['type'].includes('integer')) {\r\n return 'integer';\r\n } else if (element['type'].includes('boolean')) {\r\n return 'boolean';\r\n } else if (element['type'].includes('string')) {\r\n return 'string';\r\n }\r\n return 'string';\r\n}\r\n\r\n\r\nconst HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const;\r\ntype HttpMethod = typeof HTTP_METHODS[number]; // 等价于你的 HttpMethods 的值类型\r\n\r\nfunction isHttpMethod(method: string): method is HttpMethod {\r\n return (HTTP_METHODS as readonly string[]).includes(method);\r\n}\r\n\r\n// 解析OpenAPI规范并构建API操作列表\r\nfunction parseOpenAPI(openapiSpec: OpenAPIV3CustomDoc) {\r\n const apiOperatorList: any = [];\r\n\r\n const pathEntries: [string, OpenAPIV3.PathItemObject | undefined][] = [];\r\n for (const path in openapiSpec.paths) {\r\n if (Object.prototype.hasOwnProperty.call(openapiSpec.paths, path)) {\r\n pathEntries.push([path, openapiSpec.paths[path]]);\r\n }\r\n }\r\n // 遍历所有路径\r\n pathEntries.forEach(([path, pathItem]) => {\r\n const pathItemEntries: [string, OpenAPIV3.OperationObject][] = [];\r\n for (const method in pathItem) {\r\n if (Object.prototype.hasOwnProperty.call(pathItem, method)) {\r\n // 关键:将 method 断言为合法的 key\r\n if (isHttpMethod(method)) {\r\n const operation = pathItem[method as keyof typeof pathItem];\r\n if (operation != null && typeof operation === 'object' && !('$ref' in operation)) {\r\n // 此时可以安全认为是 OperationObject(因为 method key 不会对应 $ref/parameters)\r\n pathItemEntries.push([method, operation as OpenAPIV3.OperationObject]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 遍历路径下的所有方法\r\n pathItemEntries.forEach(([method, operation]) => {\r\n // 初始化当前API操作对象\r\n const apiOperator: any = {\r\n method: method.toUpperCase(),\r\n url: path,\r\n rawApiInfo: operation,\r\n requestBody: null,\r\n response: {},\r\n auth: {}\r\n };\r\n\r\n if (operation) {\r\n // requestBody\r\n // support openapi 2.0\r\n // if (operation.parameters) {\r\n // const parameter = operation.parameters.filter((val: any) => val.in == 'body');\r\n // if (parameter && parameter.length > 0) {\r\n // // let requestBody = parseParaModel(parameter[0], data['definitions']);\r\n // // apiOperator.requestBody = requestBody;\r\n // }\r\n // }\r\n\r\n // //support openapi 3.0\r\n // if (operation.requestBody) {\r\n // const requestBodyObject = operation.requestBody as OpenAPIV3.RequestBodyObject //目前只支持对象类型 TODO 引用类型待支持\r\n // const content = requestBodyObject.content;\r\n // for (const key in content) {\r\n // if (Object.prototype.hasOwnProperty.call(content, key)) {\r\n // const element: OpenAPIV3.MediaTypeObject = content[key];\r\n // if (element) {\r\n // let requestBody = parseParaModel(element, openapiSpec[\"components\"]![\"schemas\"]);\r\n // apiOperator.requestBody = requestBody;\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n\r\n if (apiOperator.rawApiInfo.parameters) {\r\n const parameterBody = apiOperator.rawApiInfo.parameters.filter((val: any) => val.in == 'body');\r\n if (parameterBody && parameterBody.length > 0) {\r\n apiOperator[\"requestBody\"] = {\r\n content: {},\r\n }\r\n apiOperator['consumes'] = apiOperator.rawApiInfo['consumes']\r\n const currentConsume = apiOperator.rawApiInfo['consumes'].length > 0 ? apiOperator.rawApiInfo['consumes'][0] : \"application/json\" //TODO 简化处理暂时取第一个\r\n apiOperator['currentConsume'] = currentConsume\r\n let requestBody: any = parseParaModel(parameterBody[0], openapiSpec['definitions']); // support openapi 2.0\r\n apiOperator[\"requestBody\"][\"content\"][currentConsume] = JSON.stringify(requestBody, null, 4);\r\n apiOperator[\"parameterHasBody\"] = true;//标记该接口有body参数,仅适用于openapi 2.0\r\n } else {\r\n for (const parameter of apiOperator.rawApiInfo.parameters) {\r\n if (parameter.in == 'query' || parameter.in == 'header' || parameter.in == 'path' || parameter.in == 'formData') {\r\n if (parameter.type == 'integer' || (parameter.schema != null && parameter.schema.type == 'integer')\r\n || parameter.type == 'number' || (parameter.schema != null && parameter.schema.type == 'number')) {\r\n parameter.uiType = 'number';\r\n }\r\n if (parameter.type == 'string' || (parameter.schema != null && parameter.schema.type == 'string')) {\r\n parameter.uiType = 'text';\r\n }\r\n if (parameter.type == 'boolean' || (parameter.schema != null && parameter.schema.type == 'boolean')) {\r\n parameter.uiType = 'text';// TODO 未来可以改成checkbox\r\n }\r\n }\r\n }\r\n const parameterFormData = apiOperator.rawApiInfo.parameters.filter((val: any) => val.in == 'formData');\r\n if (parameterFormData && parameterFormData.length > 0) {\r\n apiOperator[\"parameterHasFormDataVer2\"] = true;//标记该接口有formData参数,仅适用于openapi 2.0 body参数和formData参数互斥\r\n }\r\n // support openapi 3.0 enum parameter parsing\r\n for (const param of apiOperator.rawApiInfo.parameters) {\r\n const paramSchema = param.schema;\r\n if (paramSchema && paramSchema['$ref']) {\r\n const bodyName = paramSchema['$ref'].substring(paramSchema['$ref'].lastIndexOf('/') + 1);\r\n if (openapiSpec && openapiSpec[\"components\"] != null && openapiSpec[\"components\"][\"schemas\"]!=null) {\r\n const def = openapiSpec[\"components\"] != null ? openapiSpec[\"components\"][\"schemas\"][bodyName] : {type: ''};\r\n param.type = parseElementType(def);\r\n param.uiType = (param.type == 'integer' || param.type == 'number') ? 'number' : 'text';\r\n param.value = parseElement(def);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //support openapi 3.0\r\n if (apiOperator.rawApiInfo.requestBody) {\r\n const content = apiOperator.rawApiInfo.requestBody.content;\r\n apiOperator[\"requestBody\"] = {\r\n content: {}\r\n }\r\n\r\n for (const key in content) {\r\n if (Object.prototype.hasOwnProperty.call(content, key)) {\r\n const element = content[key];\r\n apiOperator['consumes']?.push(key);\r\n if (element) {\r\n if (element.schema == undefined) {\r\n console.log(\"pathKey is:\", path);\r\n console.log(\"key is:\", key);\r\n console.log(\"content is:\", content);\r\n console.log(\"Unsupported requestBody schema format:\", element);\r\n continue;\r\n }\r\n if (key != 'application/x-www-form-urlencoded' && key != 'multipart/form-data') {//TODO 支持更多的content-type\r\n let requestBody: any = parseParaModel(element, openapiSpec[\"components\"]![\"schemas\"]);\r\n apiOperator[\"requestBody\"][\"content\"][key] = JSON.stringify(requestBody, null, 4)\r\n } else {\r\n let requestFormDataBody: any = parseFormDataParaModel(element, openapiSpec[\"components\"]![\"schemas\"]);\r\n apiOperator[\"requestBody\"][\"content\"][key] = requestFormDataBody;\r\n }\r\n apiOperator[\"parameterHasBody\"] = true;//标记该接口有body参数,仅适用于openapi 3.0\r\n }\r\n }\r\n }\r\n if (apiOperator.consumes) {\r\n if (apiOperator.consumes.length > 0) {\r\n apiOperator['currentConsume'] = apiOperator['consumes'][0]\r\n }\r\n }\r\n }\r\n\r\n // 添加到结果列表\r\n apiOperatorList.push(apiOperator);\r\n }\r\n\r\n });\r\n });\r\n\r\n return apiOperatorList;\r\n}\r\n\r\nfunction countOpenAPI(openapiSpec: OpenAPIV3CustomDoc) {\r\n let apiCount = 0;\r\n const pathEntries: [string, OpenAPIV3.PathItemObject | undefined][] = [];\r\n for (const path in openapiSpec.paths) {\r\n if (Object.prototype.hasOwnProperty.call(openapiSpec.paths, path)) {\r\n pathEntries.push([path, openapiSpec.paths[path]]);\r\n }\r\n }\r\n\r\n // 遍历所有路径\r\n pathEntries.forEach(([path, pathItem]) => {\r\n const pathItemEntries: [string, OpenAPIV3.OperationObject][] = [];\r\n for (const method in pathItem) {\r\n if (Object.prototype.hasOwnProperty.call(pathItem, method)) {\r\n // 关键:将 method 断言为合法的 key\r\n if (isHttpMethod(method)) {\r\n const operation = pathItem[method as keyof typeof pathItem];\r\n if (operation != null && typeof operation === 'object' && !('$ref' in operation)) {\r\n // 此时可以安全认为是 OperationObject(因为 method key 不会对应 $ref/parameters)\r\n pathItemEntries.push([method, operation as OpenAPIV3.OperationObject]);\r\n }\r\n }\r\n }\r\n }\r\n // 遍历路径下的所有方法\r\n pathItemEntries.forEach(([method, operation]) => {\r\n apiCount = apiCount + 1;\r\n });\r\n });\r\n\r\n return apiCount;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCO,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["getUrlParams","redirectToAuth","endTime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/inlined-styles.ts","../src/api-render-ui.ts"],"sourcesContent":["export * from \"./api-render-ui.js\";","// Auto-generated by inline-styles.mjs\nexport const GLOBAL_STYLES = `.codigma-apioperatorlist {\r\n align-items: flex-start;\r\n background: white;\r\n display: inline-flex;\r\n flex-direction: column;\r\n gap: 5px;\r\n justify-content: flex-start;\r\n width: 100%\r\n}\r\n.codigma-apioperator {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n gap: 10px;\r\n /* border-radius: 8px; */\r\n height: 32px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apioperator:nth-child(even) {\r\n background-color: rgb(235, 239, 244);\r\n}\r\n.codigma-apioperator:nth-child(odd) {\r\n background-color: rgb(250, 246, 246);\r\n}\r\n\r\n.codigma-apioperator:hover {\r\n cursor: pointer;\r\n background: rgb(169, 199, 239);\r\n}\r\n.codigma-apioperator:active {\r\n background: rgb(206, 216, 231);\r\n}\r\n.codigma-method {\r\n align-items: center;\r\n display: flex;\r\n gap: 5px;\r\n justify-content: center;\r\n width: 64px\r\n}\r\n.codigma-methodtype {\r\n align-items: center;\r\n display: flex;\r\n gap: 10px;\r\n justify-content: center\r\n}\r\n.codigma-get {\r\n color: var(--Labels---Vibrant---Controls-Primary-√, #404040);\r\n word-wrap: break-word\r\n}\r\n.codigma-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n word-wrap: break-word\r\n}\r\n/**********************apiunit css style*************************/\r\n.codigma-apiunit {\r\n align-items: flex-start;\r\n background: white;\r\n box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);\r\n display: inline-flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n justify-content: flex-start;\r\n width: 100%\r\n}\r\n.codigma-apiunit-apioperator {\r\n align-items: center;\r\n align-self: stretch;\r\n border-bottom: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n border-top: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n display: inline-flex;\r\n gap: 10px;\r\n height: 48px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apiunit-method {\r\n align-items: center;\r\n display: flex;\r\n gap: 5px;\r\n height: 48px;\r\n justify-content: center;\r\n width: 100px\r\n}\r\n.codigma-apiunit-methodtype {\r\n align-items: center;\r\n display: flex;\r\n gap: 10px;\r\n justify-content: center\r\n}\r\n.codigma-apiunit-post {\r\n color: var(--Labels---Vibrant---Controls-Primary-√, #404040);\r\n word-wrap: break-word\r\n}\r\n.codigma-apiunit-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n word-wrap: break-word;\r\n border-left: 0;\r\n border-right: 0;\r\n border-top: 0;\r\n border-bottom: 1px solid black;\r\n}\r\n.codigma-apiunit-send-button {\r\n align-items: center;\r\n display: flex;\r\n gap: 10px;\r\n height: 32px;\r\n justify-content: center;\r\n width: 88px\r\n}\r\n.codigma-apiunit-send {\r\n color: black;\r\n word-wrap: break-word\r\n}\r\n.codigma-apiunit-send-button:hover {\r\n cursor: pointer;\r\n}\r\n.codigma-apiunit-send-button:active {\r\n background-color: gray;\r\n}\r\n\r\n.codigma-apiunit-reqcontent {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 0;\r\n gap: 5px;\r\n justify-content: flex-start;\r\n padding-left: 5px;\r\n}\r\n.codigma-apiunit-paramters-section {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n flex: 1 1 0;\r\n justify-content: flex-start\r\n}\r\n.codigma-apiunit-parameters-cnr {\r\n align-items: center;\r\n background: white;\r\n display: flex;\r\n height: 42px;\r\n justify-content: space-between;\r\n width: 122px\r\n}\r\n.codigma-apiunit-parakeyvalues {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background: white;\r\n display: inline-flex;\r\n flex-direction: column;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n overflow: hidden;\r\n padding: 10px\r\n}\r\n.codigma-apiunit-keyvalue {\r\n align-items: center;\r\n display: inline-flex;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apiunit-valuetext {\r\n align-self: stretch;\r\n background: white;\r\n border-left: 0;\r\n border-right: 0;\r\n border-top: 0;\r\n border-bottom: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n padding: 10px;\r\n width: 161px\r\n}\r\n/* .codigma-apiunit-keyvalue {\r\n align-items: center;\r\n display: inline-flex;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n width: 211px\r\n} */\r\n.codigma-apiunit-request-body-section {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n justify-content: flex-start;\r\n padding-right: 5px\r\n}\r\n.codigma-apiunit-request-body-info {\r\n align-self: stretch;\r\n}\r\n.codigma-apiunit-parakeyvalues {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background: white;\r\n display: flex;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n outline-offset: -1px;\r\n outline: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n overflow: hidden;\r\n padding: 10px\r\n}\r\n.codigma-apiunit-reqresponse {\r\n align-items: flex-start;\r\n align-self: stretch;\r\n background: white;\r\n border-top: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 0;\r\n gap: 10px;\r\n justify-content: flex-start;\r\n padding-left: 5px;\r\n padding-right: 5px\r\n}\r\n.codigma-apiunit-responsedesc {\r\n align-items: center;\r\n align-self: stretch;\r\n display: inline-flex;\r\n justify-content: space-between;\r\n padding-right: 32px\r\n}\r\n.codigma-apiunit-responsetitle {\r\n align-items: center;\r\n border-bottom: 1px var(--Labels---Vibrant---Controls-Primary-√, #404040) solid;\r\n display: flex;\r\n height: 42px;\r\n justify-content: space-between;\r\n width: 122px\r\n}\r\n.codigma-apiunit-response-cnr {\r\n align-items: center;\r\n align-self: stretch;\r\n background: white;\r\n display: flex;\r\n justify-content: space-between;\r\n padding-top: 2px;\r\n width: 122px\r\n}\r\n.codigma-apiunit-responsebody {\r\n position: relative;\r\n align-self: stretch;\r\n flex: 1 1 0;\r\n min-height: 5rem;\r\n /* padding: 2px */\r\n}`;\n","import { GLOBAL_STYLES } from './inlined-styles';\r\nimport { OpenAPIV3 } from 'openapi-types';\r\n\r\ntype OpenAPIV3CustomDoc = OpenAPIV3.Document & { swagger: string; definitions: any } //Compatible with version 2.0\r\n\r\nexport class ApiRenderer {\r\n options: any;\r\n container: any;\r\n\r\n // 静态标志:记录是否已注入全局样式\r\n private static globalStyleInjected = false;\r\n\r\n constructor(options: any) {\r\n this.options = Object.assign({\r\n mountPoint: document?.body, // 默认挂载到body\r\n className: 'Apioperatorlist codigma-apioperatorlist',\r\n layerName: 'apioperatorlist'\r\n }, options);\r\n\r\n this.container = null;\r\n }\r\n\r\n render(apiSpec: OpenAPIV3CustomDoc, currentServer?: any, serviceName?: string, renderUnit: boolean = false) {\r\n\r\n const appendInlineStyle = (text: string) => {\r\n if (!ApiRenderer.globalStyleInjected) {\r\n // 动态创建 <style> 标签并插入全局样式\r\n const styleEl = document.createElement('style');\r\n styleEl.textContent = text;\r\n document.head.appendChild(styleEl);\r\n ApiRenderer.globalStyleInjected = true; // 标记已注入\r\n }\r\n };\r\n // 使用\r\n appendInlineStyle(GLOBAL_STYLES);\r\n\r\n // 存储原始元素与对应新元素的映射\r\n const elementMap = new Map();\r\n\r\n // 获取实际挂载点\r\n const mountElement = typeof this.options.mountPoint === 'string' ?\r\n document.querySelector(this.options.mountPoint) :\r\n this.options.mountPoint;\r\n\r\n if (!mountElement) {\r\n throw new Error('Invalid mount point specified');\r\n }\r\n\r\n if ((apiSpec[\"openapi\"] && apiSpec[\"openapi\"].startsWith(\"3.\"))\r\n || (apiSpec[\"swagger\"] && apiSpec[\"swagger\"].startsWith(\"2.\"))) {\r\n const countApi = countOpenAPI(apiSpec);\r\n const apiOperatorList = parseOpenApiSpec(apiSpec, currentServer, serviceName);\r\n // console.log('解析结果:', apiOperatorList);\r\n if (countApi == 1 && renderUnit) {\r\n // If the count of api <=1, create the api unit only. \r\n // 创建根容器\r\n this.container = createApiUnit(apiOperatorList[0]);\r\n } else {\r\n // 创建主容器\r\n this.container = document.createElement('div');\r\n this.container.setAttribute('data-layer', this.options.layerName);\r\n this.container.className = this.options.className;\r\n\r\n // 生成内容\r\n apiOperatorList.forEach((apiOperator: any) => {\r\n const reqOperator = document.createElement('div');\r\n reqOperator.setAttribute('data-layer', 'apioperator');\r\n reqOperator.className = 'Apioperator codigma-apioperator';\r\n\r\n // 创建method部分\r\n const methodContainer = document.createElement('div');\r\n methodContainer.setAttribute('data-layer', 'method');\r\n methodContainer.className = 'Method codigma-method';\r\n\r\n const methodType = document.createElement('div');\r\n methodType.setAttribute('data-layer', 'methodtype');\r\n methodType.className = 'Methodtype codigma-methodtype';\r\n\r\n const methodValue = document.createElement('div');\r\n methodValue.setAttribute('data-layer', apiOperator.method.toLowerCase());\r\n methodValue.className = `${apiOperator.method} codigma-${apiOperator.method.toLowerCase()}`;\r\n methodValue.textContent = apiOperator.method;\r\n\r\n methodType.appendChild(methodValue);\r\n methodContainer.appendChild(methodType);\r\n reqOperator.appendChild(methodContainer);\r\n\r\n // 创建URL部分\r\n const urlElement = document.createElement('div');\r\n urlElement.setAttribute('data-layer', 'requrl');\r\n urlElement.className = 'Requrl codigma-requrl';\r\n urlElement.textContent = apiOperator.url;\r\n reqOperator.appendChild(urlElement);\r\n\r\n this.container.appendChild(reqOperator);\r\n\r\n // 添加点击事件\r\n reqOperator.addEventListener('click', renderApiUnit(apiOperator, this.container, elementMap));\r\n });\r\n }\r\n } else {\r\n // 初始化当前API操作对象\r\n const apiOperator = {\r\n method: \"get\",\r\n url: \"/full/info\",\r\n rawApiInfo: null,\r\n requestBody: null,\r\n response: {},\r\n auths: [\r\n {\r\n type: \"No Auth\"\r\n },\r\n {\r\n type: \"Basic Auth\",\r\n parameters: [\r\n {\r\n name: \"userName\",\r\n value: \"\"\r\n },\r\n {\r\n name: \"password\",\r\n value: \"\"\r\n }\r\n ]\r\n }\r\n ]\r\n };\r\n // 创建根容器\r\n this.container = createApiUnit(apiSpec);\r\n }\r\n\r\n // 清空挂载点并插入新内容\r\n mountElement.innerHTML = '';\r\n mountElement.appendChild(this.container);\r\n\r\n\r\n }\r\n}\r\n\r\n\r\nconst auths = [\r\n {\r\n value: \"No Auth\"\r\n },\r\n {\r\n value: \"Basic Auth\",\r\n parameters: [\r\n {\r\n name: \"userName\",\r\n value: \"\"\r\n },\r\n {\r\n name: \"password\",\r\n value: \"\"\r\n }\r\n ]\r\n },\r\n {\r\n value: \"OAuth 2.0\",\r\n }\r\n]\r\n\r\nconst grantTypes = [\r\n { value: \"authorization_code\" },\r\n { value: \"Implicit\" },\r\n { value: \"Resource Owner Password Credentials\" },\r\n { value: \"client_credentials\" }\r\n]\r\n\r\nconst clientAuthenticationOpts = [\r\n { value: \"Headers\", displayName: \"Send credentials in headers\" },\r\n { value: \"Body\", displayName: \"Send credentials in body\" }\r\n]\r\n\r\n// ========== 数据定义 ==========\r\nconst consumeOpts = [\r\n { value: \"None\" },\r\n { value: \"application/json\" },\r\n { value: \"application/xml\" },\r\n { value: \"application/x-www-form-urlencoded\" },\r\n { value: \"multipart/form-data\" },\r\n { value: \"text/plain\" }\r\n];\r\n\r\n\r\nfunction renderApiUnit(apiOperator: any, containerRef: any, elementMap: any) {\r\n return function (evt: any) {\r\n const currentTarget = evt.currentTarget;\r\n // 检查是否已存在对应的新元素\r\n if (elementMap.has(currentTarget)) {\r\n const newElement = elementMap.get(currentTarget);\r\n newElement.remove(); // 移除新元素\r\n elementMap.delete(currentTarget); // 清除映射\r\n return;\r\n }\r\n\r\n // 创建根容器\r\n const apiContainer = createApiUnit(apiOperator);\r\n\r\n // 添加到文档\r\n // 插入到当前元素后面\r\n if (currentTarget.nextSibling) {\r\n containerRef.insertBefore(apiContainer, currentTarget.nextSibling);\r\n } else {\r\n containerRef.appendChild(apiContainer);\r\n }\r\n\r\n // 存储映射关系\r\n elementMap.set(currentTarget, apiContainer);\r\n }\r\n}\r\n\r\nfunction createApiUnit(apiOperator: any) {\r\n const apiContainer = document.createElement('div');\r\n apiContainer.setAttribute('data-layer', 'apiunit');\r\n apiContainer.className = 'Requnit codigma-apiunit';\r\n // 预先创建响应部分并挂载到 apiOperator,保证后面创建的 send 按钮能访问到\r\n const responseSection = createSectionResponse(apiOperator);\r\n apiOperator._responseSectionRef = responseSection;\r\n\r\n // 请求操作区\r\n const reqOperator = createReqOperator(apiOperator);\r\n apiContainer.appendChild(reqOperator);\r\n // 请求内容区\r\n const reqContent = document.createElement('div');\r\n reqContent.setAttribute('data-layer', 'reqcontent');\r\n reqContent.className = 'Reqcontent codigma-apiunit-reqcontent';\r\n // 参数部分\r\n const paramSection = createParamSection(apiOperator);\r\n // 头部部分\r\n const headerSection = createSectionHeader(apiOperator);\r\n // 授权部分\r\n const authSection = createSectionAuth(apiOperator);\r\n // 请求体部分\r\n const bodySection = createSectionRequestBody(apiOperator);\r\n\r\n reqContent.append(paramSection, headerSection, authSection, bodySection);\r\n apiContainer.appendChild(reqContent);\r\n // 响应部分(已经预创建,直接附加)\r\n apiContainer.appendChild(responseSection);\r\n return apiContainer;\r\n}\r\n\r\nfunction createReqOperator(apiOperator: any) {\r\n const reqOperator = document.createElement('div');\r\n reqOperator.setAttribute('data-layer', 'apioperator');\r\n reqOperator.className = 'Reqoperator codigma-apiunit-apioperator';\r\n // 方法类型\r\n const methodType = document.createElement('div');\r\n methodType.setAttribute('data-layer', 'method');\r\n methodType.className = 'Method codigma-apiunit-method';\r\n const methodTypeInner = document.createElement('div');\r\n methodTypeInner.setAttribute('data-layer', 'methodtype');\r\n methodTypeInner.className = 'Methodtype codigma-apiunit-methodtype';\r\n methodTypeInner.textContent = apiOperator.method.toUpperCase();\r\n methodType.appendChild(methodTypeInner);\r\n // 方法选项图标 - 使用内联SVG\r\n const methodOpt = document.createElement('div');\r\n methodOpt.setAttribute('data-svg-wrapper', '');\r\n methodOpt.setAttribute('data-layer', 'methodopt');\r\n methodOpt.className = 'Methodopt';\r\n\r\n // 创建内联SVG\r\n const svg = createSvg();\r\n methodOpt.appendChild(svg);\r\n methodType.appendChild(methodOpt);\r\n reqOperator.appendChild(methodType);\r\n // 请求URL\r\n const reqUrl = createInputElement();\r\n reqUrl.setAttribute('data-layer', 'requrl');\r\n reqUrl.className = 'Requrl codigma-apiunit-requrl';\r\n reqUrl.value = apiOperator.url; // 绑定初始值\r\n // 可选:添加输入事件监听(根据需求)\r\n reqUrl.addEventListener('input', (e: any) => {\r\n // 这里可以添加保存逻辑(如更新状态/发送请求\r\n apiOperator.url = e.target.value\r\n });\r\n reqOperator.appendChild(reqUrl);\r\n // 发送按钮\r\n const sendButton = document.createElement('div');\r\n sendButton.setAttribute('data-layer', 'send-button');\r\n sendButton.className = 'SendButton codigma-apiunit-send-button';\r\n const sendText = document.createElement('div');\r\n sendText.setAttribute('data-layer', 'Send');\r\n sendText.className = 'Send codigma-apiunit-send';\r\n sendText.textContent = 'Send';\r\n sendButton.appendChild(sendText);\r\n\r\n sendButton.addEventListener('click', (e: any) => {\r\n // 这里可以添加保存逻辑(如更新状态/发送请求\r\n // responseSectionRef 在渲染时会被挂载到 apiOperator._responseSectionRef 上\r\n const respRef = apiOperator._responseSectionRef || null;\r\n sendRequest(apiOperator, respRef);\r\n });\r\n\r\n reqOperator.appendChild(sendButton);\r\n return reqOperator;\r\n}\r\n\r\nfunction createParamSection(apiOperator: any) {\r\n const paramSection = document.createElement('div');\r\n paramSection.setAttribute('data-layer', 'paramters-section');\r\n paramSection.className = 'codigma-apiunit-paramters-section';\r\n // 参数容器头\r\n const paramCnr = document.createElement('div');\r\n paramCnr.setAttribute('data-layer', 'parameters-cnr');\r\n paramCnr.className = 'codigma-apiunit-parameters-cnr';\r\n const paramText = document.createElement('div');\r\n paramText.setAttribute('data-layer', 'parameters');\r\n paramText.className = 'codigma-apiunit-send';\r\n paramText.textContent = 'Parameters';\r\n paramCnr.appendChild(paramText);\r\n paramSection.appendChild(paramCnr);\r\n // 参数键值对\r\n const paramValues = document.createElement('div');\r\n paramValues.setAttribute('data-layer', 'paraKeyValues');\r\n paramValues.className = 'Parakeyvalues codigma-apiunit-parakeyvalues';\r\n let parameters = apiOperator.rawApiInfo.parameters || [];\r\n const parameterRows = parameters.filter((parameter: any) => isPathOrQueryParam(parameter))\r\n .map((parameter: any) => createRow(parameter));\r\n paramValues.append(...parameterRows);\r\n paramSection.append(paramCnr, paramValues);\r\n return paramSection;\r\n}\r\n\r\nfunction createSectionHeader(apiOperator: any) {\r\n const headerSection = document.createElement('div');\r\n headerSection.setAttribute('data-layer', 'headers-section');\r\n headerSection.className = 'codigma-apiunit-paramters-section';\r\n // 头部容器头\r\n const headerCnr = document.createElement('div');\r\n headerCnr.setAttribute('data-layer', 'headers-cnr');\r\n headerCnr.className = 'codigma-apiunit-parameters-cnr';\r\n const headerText = document.createElement('div');\r\n headerText.setAttribute('data-layer', 'headers');\r\n headerText.className = 'codigma-apiunit-send';\r\n headerText.textContent = 'Headers';\r\n headerCnr.appendChild(headerText);\r\n headerSection.appendChild(headerCnr);\r\n // 头部键值对\r\n const headerValues = document.createElement('div');\r\n headerValues.setAttribute('data-layer', 'paraKeyValues');\r\n headerValues.className = 'Parakeyvalues codigma-apiunit-parakeyvalues';\r\n let parameters = apiOperator.rawApiInfo.parameters || [];\r\n const headerRows = parameters.filter((parameter: any) => isHeaderParam(parameter))\r\n .map((parameter: any) => createRow(parameter));\r\n headerValues.append(...headerRows);\r\n headerSection.append(headerCnr, headerValues);\r\n return headerSection;\r\n}\r\n\r\nfunction createSectionAuth(apiOperator: any) {\r\n const authSection = document.createElement('div');\r\n authSection.setAttribute('data-layer', 'authorization-section');\r\n authSection.className = 'AuthorizationSection codigma-apiunit-paramters-section';\r\n // 授权容器头\r\n const authCnr = document.createElement('div');\r\n authCnr.setAttribute('data-layer', 'authorization-cnr');\r\n authCnr.className = 'AuthorizationCnr codigma-apiunit-parameters-cnr';\r\n const authText = document.createElement('div');\r\n authText.setAttribute('data-layer', 'authorization');\r\n authText.className = 'Authorization codigma-apiunit-send';\r\n authText.textContent = 'Authorization';\r\n authCnr.appendChild(authText);\r\n authSection.appendChild(authCnr);\r\n // 授权键值对\r\n const authValues = document.createElement('div');\r\n authValues.setAttribute('data-layer', 'paraKeyValues');\r\n authValues.className = 'Parakeyvalues codigma-apiunit-parakeyvalues';\r\n\r\n const authTypeRow = createSelectRow('Authorization Type', auths)\r\n // 添加选择事件监听\r\n authTypeRow.children[1].addEventListener('change', function (event: any) {\r\n //切换前先移除掉原来的元素\r\n authValues && Array.from(authValues.children).slice(1).forEach((el: any) => el.remove());\r\n const auth = auths[event.target.selectedIndex];\r\n if (auth.value == 'No Auth') {\r\n\r\n } else if (auth.value == 'Basic Auth') {\r\n apiOperator.auth = [\r\n {\r\n name: \"userName\",\r\n value: \"\"\r\n },\r\n {\r\n name: \"password\",\r\n value: \"\"\r\n }\r\n ]\r\n const authRows = apiOperator.auth.map((parameter: any) => createRow(parameter));\r\n authValues.append(...authRows);\r\n } else if (auth.value == 'OAuth 2.0') {\r\n apiOperator.auth = {}\r\n renderAuthForm(apiOperator, authValues, authTypeRow)\r\n }\r\n });\r\n\r\n authValues.append(authTypeRow);\r\n authSection.append(authCnr, authValues);\r\n return authSection;\r\n}\r\n\r\n// 工具函数:创建带 class 和属性的元素\r\nfunction createElement(tag: string, props: Record<string, string> = {}, classes: string[] = []): HTMLElement {\r\n const el = document.createElement(tag);\r\n Object.entries(props).forEach(([key, value]) => el.setAttribute(key, value));\r\n if (classes.length) el.classList.add(...classes);\r\n return el;\r\n}\r\n\r\n// 工具函数:创建 label + input 结构\r\nfunction createLabeledInput(apiOperator: any,\r\n labelText: string,\r\n inputId: string,\r\n inputName: string,\r\n modelKey: string,\r\n required: boolean = false\r\n): HTMLElement {\r\n const wrapper = createElement('div', {}, ['Keyvalue', 'codigma-apiunit-keyvalue']);\r\n const label = createElement('label', { for: inputId }, ['type', 'codigma-apiunit-send']);\r\n label.textContent = labelText + ':';\r\n const input = createElement('input', {\r\n type: 'text',\r\n id: inputId,\r\n name: inputName,\r\n autocomplete: 'off',\r\n ...(required ? { required: 'true' } : {})\r\n }, ['Valuetext', 'codigma-apiunit-valuetext']) as HTMLInputElement;\r\n\r\n // 双向绑定模拟:初始化值 + 监听输入\r\n input.value = apiOperator.auth[modelKey] || '';\r\n input.addEventListener('input', (e) => {\r\n apiOperator.auth[modelKey] = (e.target as HTMLInputElement).value;\r\n });\r\n\r\n wrapper.appendChild(label);\r\n wrapper.appendChild(input);\r\n return wrapper;\r\n}\r\n\r\n// 创建下拉选择框(替代 ast-select)\r\nfunction createSelect(apiOperator: any, \r\n labelText: string,\r\n selectId: string,\r\n options: { value: string; displayName?: string }[],\r\n modelKey: string,\r\n changeHandler: (value: string) => void\r\n): HTMLElement {\r\n const wrapper = createElement('div', {}, ['Keyvalue', 'codigma-apiunit-keyvalue']);\r\n const label = createElement('label', { for: selectId }, ['type', 'codigma-apiunit-send']);\r\n label.textContent = labelText + ':';\r\n\r\n const select = createElement('select', {\r\n id: selectId,\r\n name: selectId\r\n }, []) as HTMLSelectElement;\r\n\r\n options.forEach(opt => {\r\n const option = createElement('option', { value: opt.value }) as HTMLOptionElement;\r\n option.textContent = opt.displayName || opt.value;\r\n select.appendChild(option);\r\n });\r\n\r\n // 初始化选中值\r\n select.value = apiOperator.auth[modelKey] || options[0]?.value || '';\r\n // changeHandler(select.value); // 触发初始设置\r\n\r\n select.addEventListener('change', (e) => {\r\n const val = (e.target as HTMLSelectElement).value;\r\n changeHandler(val);\r\n });\r\n\r\n wrapper.appendChild(label);\r\n wrapper.appendChild(select);\r\n return wrapper;\r\n}\r\n\r\n// 重新渲染整个表单(基于当前 apiOperator.auth.grantType)\r\nfunction renderAuthForm(apiOperator: any, authValues: any, authTypeRow: any) {\r\n authValues.innerHTML = ''; // 清空\r\n\r\n authValues.append(authTypeRow);\r\n // Token\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Token', 'token', 'token', 'token', true));\r\n\r\n // Grant Type\r\n authValues.appendChild(\r\n createSelect(apiOperator,\r\n 'Grant Type',\r\n 'grantType',\r\n grantTypes,\r\n 'grantType',\r\n (value: string) => {\r\n apiOperator.auth.grantType = value;\r\n renderAuthForm(apiOperator, authValues, authTypeRow); // 重新渲染以反映条件字段\r\n }\r\n )\r\n );\r\n\r\n const gt = apiOperator.auth.grantType || 'authorization_code';\r\n\r\n // Conditional: Authorization Code or Implicit\r\n if (gt === 'authorization_code' || gt === 'Implicit') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Authorization Endpoint', 'authorizationEndpoint', 'authorizationEndpoint', 'authorizationEndpoint', true));\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Redirect URL', 'RedirectURI', 'RedirectURI', 'redirectURI', true));\r\n }\r\n\r\n // Conditional: Token Endpoint needed\r\n if (gt === 'authorization_code' || gt === 'client_credentials' || gt === 'Resource Owner Password Credentials') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Token Endpoint', 'TokenEndpoint', 'TokenEndpoint', 'tokenEndpoint', true));\r\n }\r\n\r\n // Client ID (always shown)\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Client ID', 'ClientID', 'ClientID', 'clientId', true));\r\n\r\n // Conditional: Client Secret\r\n if (gt === 'authorization_code' || gt === 'client_credentials' || gt === 'Resource Owner Password Credentials') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Client Secret', 'ClientSecret', 'ClientSecret', 'clientSecret', true));\r\n }\r\n\r\n // Conditional: Username & Password\r\n if (gt === 'Resource Owner Password Credentials') {\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Username', 'Username', 'Username', 'username', true));\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Password', 'Password', 'Password', 'password', true));\r\n }\r\n\r\n // Scopes (always shown)\r\n authValues.appendChild(createLabeledInput(apiOperator, 'Scopes', 'Scopes', 'Scopes', 'scopes', true));\r\n\r\n // Client Authentication\r\n authValues.appendChild(\r\n createSelect(apiOperator,\r\n 'Client Authentication',\r\n 'clientAuthentication',\r\n clientAuthenticationOpts,\r\n 'clientAuthentication',\r\n (value: string) => {\r\n apiOperator.auth.clientAuthentication = value;\r\n // 不需要重新渲染整个表单,除非 UI 依赖此值\r\n }\r\n )\r\n );\r\n\r\n // --- 新增:Generate Token 按钮 ---\r\n const buttonWrapper = createElement('div', {}, ['parameter-item']);\r\n const generateBtn = createElement('button', {}, ['parameter-button']) as HTMLButtonElement;\r\n generateBtn.type = 'button';\r\n generateBtn.textContent = 'Generate Token';\r\n generateBtn.addEventListener('click', () => generateOAuth2Token(apiOperator)); // 绑定点击事件\r\n\r\n buttonWrapper.appendChild(generateBtn);\r\n authValues.appendChild(buttonWrapper);\r\n}\r\n\r\nfunction createSectionRequestBody(apiOperator: any) {\r\n const bodySection = document.createElement('div');\r\n bodySection.setAttribute('data-layer', 'request-body-section');\r\n bodySection.className = 'RequestBodySection codigma-apiunit-request-body-section';\r\n // 请求体容器头\r\n const bodyCnr = document.createElement('div');\r\n bodyCnr.setAttribute('data-layer', 'body-cnr');\r\n bodyCnr.className = 'BodyCnr codigma-apiunit-parameters-cnr';\r\n const bodyText = document.createElement('div');\r\n bodyText.setAttribute('data-layer', 'body');\r\n bodyText.className = 'Body codigma-apiunit-send';\r\n bodyText.textContent = 'Body';\r\n bodyCnr.appendChild(bodyText);\r\n bodySection.appendChild(bodyCnr);\r\n // 请求体内容\r\n renderConsumeSection(apiOperator, bodySection, bodyCnr);\r\n return bodySection;\r\n}\r\n\r\n\r\n\r\n\r\n// ========== 创建下拉选择框 ==========\r\nfunction createConsumeSelect(apiOperator: any, container: HTMLElement, bodyCnr: any) {\r\n const wrapper = createElement('div');\r\n const label = createElement('label');\r\n label.style.margin = '0 1rem';\r\n label.textContent = 'Content-Type';\r\n\r\n const select = createElement('select') as HTMLSelectElement;\r\n select.style.width = '18rem'; // 模拟 [width]=\"'18rem'\"\r\n\r\n consumeOpts.forEach(opt => {\r\n const option = document.createElement('option');\r\n option.value = opt.value;\r\n option.textContent = opt.value;\r\n select.appendChild(option);\r\n });\r\n\r\n // 设置当前值\r\n select.value = apiOperator.currentConsume || getCurrentConsume(apiOperator);\r\n\r\n // 监听 change\r\n select.addEventListener('change', (e) => {\r\n const newValue = (e.target as HTMLSelectElement).value;\r\n if (apiOperator.currentConsume !== newValue) {\r\n apiOperator.currentConsume = newValue;\r\n renderConsumeSection(apiOperator, container, bodyCnr); // 重新渲染整个区域\r\n }\r\n });\r\n\r\n wrapper.appendChild(label);\r\n wrapper.appendChild(select);\r\n return wrapper;\r\n}\r\n\r\n// ========== 渲染请求体到指定容器(无 ID 依赖) ==========\r\nfunction renderRequestBodyInto(apiOperator: any, targetDiv: HTMLElement) {\r\n targetDiv.innerHTML = ''; // 清空目标区域\r\n\r\n // 确保 requestBody 和 content 存在\r\n const ct = apiOperator.currentConsume || getCurrentConsume(apiOperator);\r\n // ✅ 情况 1: 使用 textarea(JSON/XML/None/text/plain)\r\n if (\r\n ct === null ||\r\n ct === 'None' ||\r\n ct === 'application/json' ||\r\n ct === 'application/xml' ||\r\n ct === 'text/plain'\r\n ) {\r\n // 决定使用哪个 key:'None' 也视为一种 content 类型(或可映射为 '',但这里直接用 'None')\r\n const mimeType = ct || 'None';\r\n\r\n // 从 content[mimeType] 读取,若无则默认空字符串\r\n let rawValue = apiOperator.requestBody.content[mimeType];\r\n if (rawValue == null) {\r\n rawValue = '';\r\n apiOperator.requestBody.content[mimeType] = rawValue; // 初始化\r\n }\r\n\r\n const textarea = createElement('textarea', {}, []) as HTMLTextAreaElement;\r\n textarea.style.width = '100%';\r\n textarea.style.height = '200px';\r\n textarea.style.fontFamily = 'monospace';\r\n textarea.style.fontSize = '14px';\r\n textarea.placeholder = `Enter ${mimeType} body...`;\r\n\r\n textarea.value = rawValue;\r\n\r\n // 监听输入 → 写回 content[mimeType]\r\n textarea.addEventListener('input', () => {\r\n apiOperator.requestBody.content[mimeType] = textarea.value;\r\n console.log(`Content updated for ${mimeType}:`, textarea.value);\r\n });\r\n\r\n targetDiv.appendChild(textarea);\r\n\r\n }\r\n // ✅ 情况 2: 表单参数\r\n else if (\r\n (ct === 'application/x-www-form-urlencoded' || ct === 'multipart/form-data') &&\r\n apiOperator.requestBody.content &&\r\n Array.isArray(apiOperator.requestBody.content[ct])\r\n ) {\r\n const params = apiOperator.requestBody.content[ct];\r\n params.forEach((param: any, index: number) => {\r\n const item = createElement('div', {}, ['Keyvalue', 'codigma-apiunit-keyvalue']);\r\n\r\n const label = createElement('label', { for: `param-${Date.now()}-${index}` }, ['petId', 'codigma-apiunit-send']);\r\n label.textContent = `${param.name}:`;\r\n\r\n const input = createElement('input', {\r\n type: param.uiType || 'text',\r\n // 使用时间戳+索引避免 id 冲突(仅用于 label for)\r\n id: `param-${Date.now()}-${index}`,\r\n name: 'name'\r\n }, ['Valuetext', 'codigma-apiunit-valuetext']) as HTMLInputElement;\r\n\r\n input.value = param.value || '';\r\n input.autocomplete = 'off';\r\n input.required = true;\r\n\r\n input.addEventListener('keydown', (e) => {\r\n setEditStatus(e, true);\r\n });\r\n\r\n input.addEventListener('input', () => {\r\n param.value = input.value;\r\n });\r\n\r\n item.appendChild(label);\r\n item.appendChild(input);\r\n targetDiv.appendChild(item);\r\n });\r\n }\r\n}\r\n\r\nfunction getCurrentConsume(apiOperator: any) {\r\n if (!apiOperator.requestBody) {\r\n apiOperator.requestBody = { content: {} };\r\n }\r\n if (!apiOperator.requestBody.content) {\r\n apiOperator.requestBody.content = {};\r\n }\r\n\r\n const keys = Object.keys(apiOperator.requestBody.content);\r\n const ct = apiOperator.currentConsume = keys.length > 0 ? keys[0] : 'None';\r\n return ct;\r\n}\r\n\r\n// ========== 模拟 setEditStatus(你原有逻辑) ==========\r\nfunction setEditStatus(event: KeyboardEvent, status: boolean) {\r\n // TODO: 根据你的业务逻辑实现\r\n console.log('setEditStatus called:', event.key, status);\r\n}\r\n\r\n// ========== 主渲染函数 ==========\r\nfunction renderConsumeSection(apiOperator: any, container: HTMLElement, bodyCnr: any) {\r\n container.innerHTML = '';\r\n\r\n container.appendChild(bodyCnr);\r\n\r\n // 创建外层包裹 div\r\n const wrapperDiv = createElement('div', {}, ['codigma-apiunit-parakeyvalues']);\r\n\r\n // 1. Content-Type 选择器\r\n const selectWrapper = createConsumeSelect(apiOperator, container, bodyCnr);\r\n wrapperDiv.appendChild(selectWrapper);\r\n\r\n // 2. 请求体区域(不再使用固定 ID)\r\n const reqBodyContainer = createElement('div', {}, ['codigma-apiunit-request-body-info']); // 无 id,避免冲突\r\n renderRequestBodyInto(apiOperator, reqBodyContainer); // 改为传入目标容器\r\n wrapperDiv.appendChild(reqBodyContainer);\r\n\r\n // 将整个包裹 div 添加到外部容器\r\n container.appendChild(wrapperDiv);\r\n}\r\n\r\n\r\nfunction createSectionResponse(apiOperator: any) {\r\n const responseSection = document.createElement('div');\r\n responseSection.setAttribute('data-layer', 'reqresponse');\r\n responseSection.className = 'Reqresponse codigma-apiunit-reqresponse';\r\n // 响应描述\r\n const responseDesc = document.createElement('div');\r\n responseDesc.setAttribute('data-layer', 'responsedesc');\r\n responseDesc.className = 'Responsedesc codigma-apiunit-responsedesc';\r\n // 响应标题\r\n const responseTitle = document.createElement('div');\r\n responseTitle.setAttribute('data-layer', 'responsetitle');\r\n responseTitle.className = 'Responsetitle codigma-apiunit-responsetitle';\r\n const responseCnr = document.createElement('div');\r\n responseCnr.setAttribute('data-layer', 'response-cnr');\r\n responseCnr.className = 'ResponseCnr codigma-apiunit-response-cnr';\r\n const responseText = document.createElement('div');\r\n responseText.setAttribute('data-layer', 'response');\r\n responseText.className = 'Response codigma-apiunit-send';\r\n responseText.textContent = 'Response';\r\n responseCnr.appendChild(responseText);\r\n responseTitle.appendChild(responseCnr);\r\n const timeStatusElement = createTimeStatusElement(apiOperator);\r\n responseDesc.append(responseTitle, timeStatusElement);\r\n // 响应体\r\n const responseBody = document.createElement('div');\r\n responseBody.setAttribute('data-layer', 'responsebody');\r\n responseBody.className = 'Responsebody codigma-apiunit-responsebody';\r\n responseSection.append(responseDesc, responseBody);\r\n return responseSection;\r\n}\r\n\r\nfunction createTimeStatusElement(apiOperator: any) {\r\n const timeStatus = document.createElement('div');\r\n timeStatus.setAttribute('data-layer', 'TimeStatus');\r\n timeStatus.className = 'TimeStatus0 codigma-apiunit-send';\r\n updateTimeStatus(timeStatus, apiOperator);\r\n return timeStatus;\r\n}\r\n\r\nfunction updateTimeStatus(timeStatus: any, apiOperator: any) {\r\n timeStatus.textContent\r\n = `Status: ${apiOperator.response.status || \"\"} ${apiOperator.response.statusText || \"\"} Time: ${apiOperator.requestDuration || \"\"}`;\r\n}\r\n\r\nfunction createRow(parameter: any) {\r\n const petIdRow = document.createElement('div');\r\n petIdRow.setAttribute('data-layer', 'keyValue');\r\n petIdRow.className = 'Keyvalue codigma-apiunit-keyvalue';\r\n const petIdLabel = document.createElement('div');\r\n petIdLabel.setAttribute('data-layer', parameter[\"name\"]);\r\n petIdLabel.className = parameter[\"name\"] + ' codigma-apiunit-send';\r\n petIdLabel.textContent = parameter[\"name\"] + ':';\r\n const petIdValue = createInputElement();\r\n petIdValue.setAttribute('data-layer', 'valueText');\r\n petIdValue.className = 'Valuetext codigma-apiunit-valuetext';\r\n petIdValue.value = parameter[\"value\"] || \"\";\r\n\r\n // 可选:添加输入事件监听(根据需求)\r\n petIdValue.addEventListener('input', (e: any) => {\r\n // 这里可以添加保存逻辑(如更新状态/发送请求\r\n parameter[\"value\"] = e.target.value\r\n });\r\n petIdRow.append(petIdLabel, petIdValue);\r\n return petIdRow;\r\n}\r\n\r\nfunction createInputElement() {\r\n const inputText = document.createElement('input');\r\n inputText.setAttribute('type', 'text');\r\n inputText.setAttribute('name', 'text-input');\r\n inputText.setAttribute('label', 'text-input');\r\n inputText.setAttribute('autocomplete', 'off');\r\n return inputText;\r\n}\r\n\r\nfunction createSelectRow(name: string, args: any) {\r\n // 创建外层容器div\r\n const container = document.createElement('div');\r\n container.setAttribute('data-layer', 'keyValue');\r\n container.className = 'Keyvalue codigma-apiunit-keyvalue';\r\n\r\n // 创建type显示div\r\n const typeLabel = document.createElement('div');\r\n typeLabel.setAttribute('data-layer', name);\r\n typeLabel.className = 'type codigma-apiunit-send';\r\n typeLabel.textContent = name + \":\";\r\n\r\n // 创建select元素\r\n const selectElement: any = document.createElement('select');\r\n selectElement.name = 'text-select';\r\n selectElement.label = 'text-select';\r\n selectElement.setAttribute('data-layer', 'valueText');\r\n\r\n // 示例选项(可根据实际需求添加\r\n args.forEach((auth: any) => {\r\n const option1 = document.createElement('option');\r\n option1.value = auth[\"value\"];\r\n option1.textContent = (auth['displayName'] != null || auth['label'] != null) ? (auth[\"displayName\"] || auth['label']): auth[\"value\"];\r\n selectElement.appendChild(option1);\r\n })\r\n\r\n // 组装DOM结构\r\n container.appendChild(typeLabel);\r\n container.appendChild(selectElement);\r\n return container;\r\n}\r\n\r\nfunction isPathOrQueryParam(param: any) {\r\n return param.in === 'path' || param.in === 'query';\r\n}\r\n\r\nfunction isHeaderParam(param: any) {\r\n return param.in === 'header';\r\n}\r\n\r\n\r\nasync function generateOAuth2Token(apiInfo: any) {\r\n // TODO 生成OAuth2.0 Token\r\n // 1. 获取访问令牌\r\n const accessToken = await getAccessToken(apiInfo);\r\n apiInfo.auth.token = accessToken\r\n}\r\n\r\n\r\n /**\r\n * 获取 OAuth 2.0 访问令牌\r\n * @returns {Promise<string>} 访问令牌\r\n */\r\nasync function getAccessToken(apiInfo: any) {\r\n const auth = apiInfo.auth;\r\n if (auth == null) {\r\n throw new Error('OAuth2.0认证信息未配置');\r\n }\r\n const CLIENT_ID = auth.clientId;\r\n const CLIENT_SECRET = auth.clientSecret;\r\n const SCOPE = auth.scopes;\r\n\r\n if (apiInfo.auth.grantType == 'client_credentials') {\r\n try {\r\n console.log('正在获取访问令牌...');\r\n\r\n // 构造请求头\r\n const headerParams: any = {\r\n 'Content-Type': 'application/x-www-form-urlencoded'\r\n };\r\n // 构造请求体 (使用 client_credentials 流)\r\n const bodyParams = new URLSearchParams();\r\n bodyParams.append('grant_type', 'client_credentials');\r\n if (SCOPE) {\r\n bodyParams.append('scope', SCOPE);\r\n }\r\n\r\n if (apiInfo.auth.clientAuthentication == 'Body') {\r\n bodyParams.append('client_id', CLIENT_ID);\r\n bodyParams.append('client_secret', CLIENT_SECRET);\r\n } else {\r\n // 如果是 Headers 方式,则在后续的 fetch 请求中添加 Authorization 头\r\n headerParams['Authorization'] = 'Basic ' + btoa(CLIENT_ID + ':' + CLIENT_SECRET);\r\n }\r\n\r\n const response = await fetch(auth.tokenEndpoint, {\r\n method: 'POST',\r\n headers: headerParams,\r\n body: bodyParams.toString()\r\n })\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n throw new Error(`获取令牌失败: ${response.status} ${response.statusText}. ${JSON.stringify(errorData)}`);\r\n }\r\n\r\n const tokenData = await response.json();\r\n console.log('令牌获取成功:', tokenData);\r\n return tokenData.access_token;\r\n } catch (error) {\r\n console.error('获取访问令牌时出错:', error);\r\n throw error;\r\n }\r\n } else if (apiInfo.auth.grantType == 'Resource Owner Password Credentials') {\r\n\r\n } else if (apiInfo.auth.grantType == 'authorization_code') {\r\n // ========== 配置:替换为你在本地 OAuth 服务注册的客户端信息 ==========\r\n const config = {\r\n clientId: apiInfo.auth.clientId, // 替换为你的 client_id\r\n clientSecret: apiInfo.auth.clientSecret, // 替换为你的 client_secret\r\n redirectUri: apiInfo.auth.redirectURI, // 必须与注册的 redirect_uri 一致\r\n authUrl: apiInfo.auth.authorizationEndpoint,\r\n tokenUrl: apiInfo.auth.tokenEndpoint,\r\n scope: apiInfo.auth.scopes // 可选: 'openid profile email' 如果服务支持\r\n };\r\n\r\n // 从 URL 获取参数\r\n function getUrlParams() {\r\n const params = new URLSearchParams(window.location.search);\r\n return Object.fromEntries(params.entries());\r\n }\r\n\r\n // 构建授权 URL 并跳转\r\n function redirectToAuth() {\r\n const state = Math.random().toString(36).substring(2);\r\n const nonce = Math.random().toString(36).substring(2); // OpenID Connect 推荐使用 nonce\r\n const authUrl = new URL(config.authUrl);\r\n authUrl.searchParams.append('client_id', config.clientId);\r\n authUrl.searchParams.append('redirect_uri', config.redirectUri);\r\n authUrl.searchParams.append('response_type', 'code');\r\n authUrl.searchParams.append('scope', config.scope);\r\n authUrl.searchParams.append('state', state);\r\n authUrl.searchParams.append('nonce', nonce); // 用于 ID Token 验证\r\n authUrl.searchParams.append('access_type', 'offline'); // 请求 refresh_token(如果支持)\r\n\r\n const newTab = window.open(authUrl.toString(), '_blank');\r\n }\r\n\r\n // // 使用授权码换取 Token\r\n // async function exchangeCodeForToken(code: any) {\r\n // try {\r\n // const response = await fetch(config.tokenUrl, {\r\n // method: 'POST',\r\n // headers: {\r\n // 'Content-Type': 'application/x-www-form-urlencoded',\r\n // 'Authorization': 'Basic ' + btoa(config.clientId + ':' + config.clientSecret)\r\n // },\r\n // body: new URLSearchParams({\r\n // // 'client_id': config.clientId,\r\n // // 'client_secret': config.clientSecret,\r\n // 'code': code,\r\n // 'redirect_uri': config.redirectUri,\r\n // 'grant_type': 'authorization_code'\r\n // })\r\n // });\r\n\r\n // if (!response.ok) {\r\n // const errorText = await response.text();\r\n // throw new Error(`HTTP ${response.status}: ${errorText}`);\r\n // }\r\n\r\n // const tokenData = await response.json();\r\n // console.log('Token Response:', tokenData);\r\n\r\n // // 可选:清除 URL 参数\r\n // // history.replaceState({}, document.title, window.location.pathname);\r\n // } catch (error) {\r\n // console.error('Token Exchange Error:', error);\r\n // }\r\n // }\r\n\r\n // // 页面初始化\r\n // document.addEventListener('DOMContentLoaded', () => {\r\n // const loginBtn = document.getElementById('loginBtn');\r\n // const urlParams = getUrlParams();\r\n\r\n // if (urlParams.code) {\r\n // // 已收到授权码\r\n // loginBtn.style.display = 'none';\r\n // exchangeCodeForToken(urlParams.code);\r\n // } else {\r\n\r\n // }\r\n // });\r\n\r\n redirectToAuth();\r\n } else if (apiInfo.auth.grantType == 'Implicit') {\r\n\r\n } else {\r\n\r\n }\r\n}\r\n\r\n\r\nfunction getBodyEditorContent(apiOperator: any): string {\r\n const ct = apiOperator.currentConsume || 'None';\r\n return apiOperator.requestBody.content[ct];\r\n}\r\n\r\n\r\n\r\nlet gotResponse = false;\r\n\r\nlet ifSendingRequest = false;\r\nlet requestDuration: string = \"0\";\r\nlet responseObj: {\r\n status ?: number | string;\r\n statusText ?: string;\r\n body ?: string;//响应体统一转换成字符串\r\n} = { };\r\n// 创建一个新的 AbortController 实例 \r\nlet controller: AbortController | undefined;\r\n\r\n/**\r\n * \r\n * \r\n * \r\n * const apiOperator = {\r\n method: method.toUpperCase(),\r\n url: path,\r\n rawApiInfo: null,\r\n requestBody: null\r\n }\r\n\r\n * @param {*} apiOperator\r\n * @param {*} apiInfo \r\n */\r\nfunction sendRequest(apiOperator: any, responseSectionRef: any) {\r\n const apiInfo = apiOperator\r\n let reuqestUrl = getRequestUrl(apiInfo);\r\n\r\n //TODO 根据参数类型构造请求头和请求体,apiInfo['parameterHasFormDataVer2']表示有formData参数,暂时未区分具体的content-type,待改造\r\n let header = apiInfo['parameterHasFormDataVer2'] ? 'application/x-www-form-urlencoded' :\r\n ((apiInfo['parameterHasBody']) ? apiInfo['currentConsume'] : 'application/json');\r\n\r\n let headers: any = {\r\n 'Content-Type': header\r\n }\r\n const headerParas = getHeadersParams(apiInfo, apiInfo.rawApiInfo.parameters || []);\r\n // 合并自定义头参数\r\n Object.assign(headers, headerParas);\r\n // 构造 Basic Auth 头\r\n addAuthHeader(apiInfo, headers);\r\n\r\n let body;\r\n if (apiInfo.method.toUpperCase() == \"POST\" || apiInfo.method.toUpperCase() == \"PUT\") {\r\n if (apiInfo['currentConsume'] == 'application/json' && apiInfo.requestBody != null) {\r\n body = getBodyEditorContent(apiOperator);\r\n } else if (apiInfo['parameterHasFormDataVer2']) {\r\n body = getRequestFormData(apiInfo.rawApiInfo);\r\n } else if (apiInfo['currentConsume'] == 'application/x-www-form-urlencoded') {\r\n for (const key of apiInfo[\"requestBody\"][\"content\"][apiInfo['currentConsume']]) {\r\n if (body == null || body == '') {\r\n body = key.name + \"=\" + key.value;\r\n } else {\r\n body = body + \"&\" + key.name + \"=\" + key.value;\r\n }\r\n }\r\n } else {\r\n body = \"\";\r\n }\r\n } else {\r\n body = \"\";\r\n }\r\n\r\n ifSendingRequest = true;\r\n const startTime = Date.now(); // 记录开始时间\r\n\r\n apiOperator.controller = new AbortController();\r\n const signal = apiOperator.controller.signal;\r\n\r\n //正在发送请求时创建遮罩层\r\n const overlayLayerContainer = createRequestOverlayLayer(apiOperator, responseSectionRef);\r\n\r\n // 使用 fetch 发送请求,并传递 signal \r\n fetch(reuqestUrl, {\r\n method: apiInfo.method.toUpperCase(),\r\n headers: headers,\r\n body: body,\r\n signal: signal\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n responseObj = {\r\n status: response.status,\r\n statusText: response.statusText,\r\n body: \"\"\r\n }\r\n\r\n const endTime = Date.now(); // 即使在错误的情况下也记录结束时间 \r\n requestDuration = formatDuration(endTime - startTime);\r\n ifSendingRequest = false;\r\n throw new Error('Network response was not ok.');\r\n }\r\n const endTime = Date.now(); // 记录结束时间 \r\n requestDuration = formatDuration(endTime - startTime); // 计算耗时\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n responsebodyElement.removeChild(overlayLayerContainer);\r\n\r\n ifSendingRequest = false;\r\n responseObj = {\r\n status: response.status,\r\n statusText: response.statusText\r\n }\r\n\r\n // 在responseSectionRef元素范围内查找TimeStatus元素\r\n const timeStatusElement = responseSectionRef.querySelector('[data-layer=\"TimeStatus\"]');\r\n if (timeStatusElement) {\r\n updateTimeStatus(timeStatusElement, apiOperator);\r\n } else {\r\n console.log(\"在reqresponse范围内未找到TimeStatus元素\");\r\n }\r\n\r\n let responseClone = response.clone();\r\n return response.json() // 解析为json \r\n .catch(error => {\r\n // 如果解析 JSON 失败,则回退到文本解析\r\n return responseClone.text();\r\n });\r\n })\r\n .then(data => {\r\n gotResponse = true;\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n // 此时 data 可能是 JSON 对象,也可能是文本字符串 \r\n if (typeof data === 'object') {\r\n // 假设 data 是 JSON 对象,你可以在这里处理它 \r\n console.log('Received JSON:', data);\r\n responseObj.body = JSON.stringify(data, null, 4);\r\n } else {\r\n // 假设 data 是文本字符串,你可以在这里处理它 \r\n console.log('Received text:', data);\r\n responseObj.body = data;\r\n }\r\n responsebodyElement.textContent = responseObj.body;\r\n })\r\n .catch(error => {\r\n // 错误处理 \r\n console.error('There has been a problem with your fetch operation:', error);\r\n });\r\n}\r\n\r\nfunction createRequestOverlayLayer(apiOperator: any, responseSectionRef: any) {\r\n // 创建主容器 \r\n const container = document.createElement('div');\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: 0,\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n backgroundColor: 'rgb(255, 255, 255)',\r\n opacity: 0.8\r\n });\r\n\r\n // 创建内容容器 \r\n const contentDiv = document.createElement('div');\r\n Object.assign(contentDiv.style, {\r\n display: 'flex',\r\n gap: '5px',\r\n alignItems: 'center',\r\n });\r\n\r\n // 创建文本div \r\n const textDiv = document.createElement('div');\r\n textDiv.textContent = 'Sending request...';\r\n\r\n // 创建取消按钮 \r\n const cancelBtn = document.createElement('button');\r\n cancelBtn.className = 'request-cancel-btn';\r\n Object.assign(cancelBtn.style, {\r\n border: '0px'\r\n });\r\n cancelBtn.textContent = 'Cancel';\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n // 组装DOM结构 \r\n contentDiv.appendChild(textDiv);\r\n contentDiv.appendChild(cancelBtn);\r\n container.appendChild(contentDiv);\r\n responsebodyElement.appendChild(container);\r\n\r\n // 添加点击事件\r\n cancelBtn.addEventListener('click', (e) => {\r\n // 如果你想取消请求,调用 controller 的 abort 方法\r\n if (apiOperator.controller) {\r\n apiOperator.controller.abort();\r\n apiOperator.ifSendingRequest = false;\r\n container.style.display = 'none';\r\n responsebodyElement.removeChild(container);\r\n }\r\n });\r\n\r\n return container\r\n}\r\n\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n let totalSeconds = Math.floor(milliseconds / 1000);\r\n let seconds: any = totalSeconds % 60;\r\n let minutes: any = Math.floor(totalSeconds / 60) % 60;\r\n let hours: any = Math.floor(totalSeconds / (60 * 60));\r\n\r\n // 毫秒部分 \r\n let millisecondsPart: any = Math.floor(milliseconds % 1000);\r\n // 毫秒不足三位时前面补0 \r\n millisecondsPart = millisecondsPart.toString().padStart(3, '0');\r\n\r\n // 时分秒不足两位时前面补0 \r\n hours = hours.toString().padStart(2, '0');\r\n minutes = minutes.toString().padStart(2, '0');\r\n seconds = seconds.toString().padStart(2, '0');\r\n\r\n // 返回格式化的字符串 \r\n return `${hours}h${minutes}m${seconds}s${millisecondsPart}ms`;\r\n}\r\n\r\nfunction clickAbortRequest() {\r\n // 如果你想取消请求,调用 controller 的 abort 方法\r\n if (controller) {\r\n controller.abort();\r\n ifSendingRequest = false;\r\n }\r\n}\r\n\r\nfunction getRequestUrl(apiInfo: any) {\r\n let reuqestUrl = apiInfo.url;\r\n\r\n const requestParameters = apiInfo.rawApiInfo.parameters || [];\r\n if (requestParameters == null) {\r\n return reuqestUrl;\r\n }\r\n\r\n for (const element of requestParameters) {\r\n if (element.in == \"path\") {\r\n reuqestUrl = reuqestUrl.replace(\"{\" + element.name + \"}\", element.value);\r\n }\r\n }\r\n\r\n let queryParams = getQueryParams(apiInfo, requestParameters);\r\n reuqestUrl = queryParams.length > 0 ? (reuqestUrl + \"?\" + queryParams.join(\"&\")) : reuqestUrl;\r\n\r\n return reuqestUrl;\r\n}\r\n\r\nfunction addAuthHeader(apiInfo: any, headers: any) {\r\n const env = isBrowserEnvironment();\r\n if (apiInfo.auth.authType == \"Basic Auth\" && apiInfo.auth != null) {\r\n if (env) {\r\n const credentials = btoa(`${apiInfo.auth.username}:${apiInfo.auth.passWord}`); // btoa 是浏览器内置的 Base64 编码函数\r\n headers['Authorization'] = `Basic ${credentials}`;\r\n } else {\r\n const buffer = Buffer.from(`${apiInfo.auth.username}:${apiInfo.auth.passWord}`);\r\n const credentials = buffer.toString('base64');\r\n headers['Authorization'] = `Basic ${credentials}`;\r\n }\r\n } else if (apiInfo.auth.authType == \"OAuth 2.0\" && apiInfo.auth != null) {\r\n if (apiInfo.auth.token != null || apiInfo.auth.token != '') {\r\n headers['Authorization'] = `Bearer ${apiInfo.auth.token}`;\r\n }\r\n }\r\n}\r\n\r\nfunction getHeadersParams(apiInfo: any, requestParameters: any) {\r\n let headersParams = [];\r\n for (const element of requestParameters) {\r\n if (element.in == \"header\") {\r\n headersParams[element.name] = element.value\r\n }\r\n }\r\n\r\n if (apiInfo.customHeaderparameters) {\r\n for (let index = 0; index < apiInfo.customHeaderparameters.length; index++) {\r\n const paras = apiInfo.customHeaderparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n headersParams[paras.name] = paras.value\r\n }\r\n }\r\n }\r\n\r\n return headersParams;\r\n}\r\n\r\nfunction getQueryParams(apiInfo: any, requestParameters: any) {\r\n let queryParams = [];\r\n for (const element of requestParameters) {\r\n if (element.in == \"query\") {\r\n if (element.type == \"array\" || (element.schema != null && element.schema.type == 'array')) {\r\n if (element.value != null) {\r\n for (let index = 0; index < element.value.length; index++) {\r\n queryParams.push(element.name + \"=\" + element.value[index].value);\r\n }\r\n }\r\n } else {\r\n queryParams.push(element.name + \"=\" + element.value);\r\n }\r\n }\r\n }\r\n\r\n if (apiInfo.customQueryparameters) {\r\n for (let index = 0; index < apiInfo.customQueryparameters.length; index++) {\r\n const paras = apiInfo.customQueryparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n queryParams.push(paras.name + \"=\" + paras.value)\r\n }\r\n }\r\n }\r\n\r\n return queryParams;\r\n}\r\n\r\nfunction getRequestFormData(rawApiInfo: any) {\r\n let formData = '';\r\n const requestParameters = rawApiInfo.parameters;\r\n if (requestParameters == null) {\r\n return \"\";\r\n }\r\n\r\n let first = 0;\r\n for (const element of requestParameters) {\r\n if (element.in == \"formData\") {\r\n if (first == 0) {\r\n formData = element.name + \"=\" + element.value;\r\n } else {\r\n formData = formData + \"&\" + element.name + \"=\" + element.value;\r\n }\r\n first++;\r\n }\r\n }\r\n return formData;\r\n}\r\n\r\nfunction isBrowserEnvironment() {\r\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\r\n return true; // 浏览器环境\r\n } else if (typeof process !== 'undefined' && process.versions && process.versions.node) {\r\n return false; // Node.js 环境\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n\r\nfunction createSvg() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttribute('width', '21');\r\n svg.setAttribute('height', '22');\r\n svg.setAttribute('viewBox', '0 0 21 22');\r\n svg.setAttribute('fill', 'none');\r\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n\r\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n path.setAttribute('d', 'M5.5 8.5L10.5 13.5L15.5 8.5');\r\n path.setAttribute('stroke', 'var(--Labels---Vibrant---Controls-Primary--, #404040)');\r\n path.setAttribute('stroke-width', '2');\r\n path.setAttribute('stroke-linecap', 'round');\r\n path.setAttribute('stroke-linejoin', 'round');\r\n\r\n svg.appendChild(path);\r\n return svg;\r\n}\r\n\r\nfunction parseParaModel(parameterObj: any, dataDef: any) {\r\n let bodyModel;\r\n if (parameterObj.schema['$ref']) { // 对象类型\r\n bodyModel = parseModel(parameterObj.schema['$ref'], dataDef);\r\n } else if (parameterObj.schema['type'] == 'array') { // 数组类型\r\n const itemObj = parameterObj.schema['items'];\r\n if (itemObj['$ref']) {\r\n bodyModel = parseModel(itemObj['$ref'], dataDef);\r\n } else if (itemObj['type']) {\r\n bodyModel = parseElement(itemObj);\r\n }\r\n bodyModel = [bodyModel];\r\n }\r\n return bodyModel;\r\n}\r\n\r\nfunction parseModel(modelDef: any, apiDef: any) {\r\n const model: any = {};\r\n const bodyName = modelDef.substring(modelDef.lastIndexOf('/') + 1);\r\n const def = apiDef[bodyName];\r\n const props = def['properties'];\r\n if (props) {\r\n for (const key in props) {\r\n if (Object.prototype.hasOwnProperty.call(props, key)) {\r\n const element = props[key];\r\n if (element.hasOwnProperty('items') && element['type'] == 'array') {\r\n if (element[\"items\"]['$ref']) {\r\n model[key] = [parseModel(element[\"items\"]['$ref'], apiDef)]\r\n } else if (element[\"items\"]['type']) {\r\n model[key] = [parseElement(element[\"items\"])];\r\n }\r\n } else if (element.hasOwnProperty('$ref')) {\r\n model[key] = parseModel(element['$ref'], apiDef)\r\n } else {\r\n if (element['type']) {\r\n model[key] = parseElement(element);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\nfunction parseFormDataModel(modelDef: any, apiDef: any) {\r\n const model: any = [];\r\n const bodyName = modelDef.substring(modelDef.lastIndexOf('/') + 1);\r\n const def = apiDef[bodyName];\r\n const props = def['properties'];\r\n if (props) {\r\n for (const key in props) {\r\n if (Object.prototype.hasOwnProperty.call(props, key)) {\r\n const element = props[key];\r\n let modelEle: any;\r\n if (element.hasOwnProperty('items') && element['type'] == 'array') {\r\n if (element[\"items\"]['$ref']) {\r\n modelEle = [parseModel(element[\"items\"]['$ref'], apiDef)]\r\n } else if (element[\"items\"]['type']) {\r\n modelEle = [parseElement(element[\"items\"])];\r\n }\r\n if (modelEle) {\r\n model.push({\r\n type: 'string',\r\n uiType: 'text',\r\n name: key,\r\n value: JSON.stringify(modelEle)\r\n });\r\n }\r\n } else if (element['type']) {\r\n model.push({\r\n type: element['type'],\r\n uiType: ((element['type'] == 'integer' || element['type'] == 'number') ? 'number' : 'text'),\r\n name: key,\r\n value: parseElement(element)\r\n });\r\n } else if (element['$ref']) {\r\n const bodyModel = parseModel(element['$ref'], apiDef);\r\n model.push({\r\n type: 'string',\r\n uiType: 'text',\r\n name: key,\r\n value: JSON.stringify(bodyModel)\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return model;\r\n}\r\n\r\nfunction parseFormDataParaModel(parameterObj: any, dataDef: any) {\r\n let bodyModel: any = [];\r\n if (parameterObj.schema['$ref']) { // 对象类型\r\n bodyModel = parseFormDataModel(parameterObj.schema['$ref'], dataDef);\r\n }\r\n return bodyModel;\r\n}\r\n\r\nfunction parseElement(element: any) {\r\n let elementValue;\r\n if (element['type'].includes('integer')) {\r\n if (element['enum']) {\r\n elementValue = element['enum'][0];\r\n } else {\r\n elementValue = 0;\r\n }\r\n } else if (element['type'].includes('boolean')) {\r\n elementValue = false;\r\n } else if (element['type'].includes('string')) {\r\n if (element['enum']) {\r\n elementValue = element['enum'][0];\r\n } else {\r\n elementValue = '';\r\n }\r\n }\r\n\r\n // 如果有default则用default的值\r\n if (element['default']) {\r\n elementValue = element['default'];\r\n }\r\n\r\n //如果有example则用example的值\r\n if (element['example']) {\r\n elementValue = element['example'];\r\n }\r\n\r\n return elementValue;\r\n}\r\n\r\nfunction parseElementType(element: any) {\r\n if (element['type'].includes('integer')) {\r\n return 'integer';\r\n } else if (element['type'].includes('boolean')) {\r\n return 'boolean';\r\n } else if (element['type'].includes('string')) {\r\n return 'string';\r\n }\r\n return 'string';\r\n}\r\n\r\n\r\nconst HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const;\r\ntype HttpMethod = typeof HTTP_METHODS[number]; // 等价于你的 HttpMethods 的值类型\r\n\r\nfunction isHttpMethod(method: string): method is HttpMethod {\r\n return (HTTP_METHODS as readonly string[]).includes(method);\r\n}\r\n\r\n// 解析OpenAPI规范并构建API操作列表\r\nfunction parseOpenApiSpec(openapiSpec: OpenAPIV3CustomDoc, currentServer?: any, serviceName?: string) {\r\n const apiOperatorList: any = [];\r\n\r\n const pathEntries: [string, OpenAPIV3.PathItemObject | undefined][] = [];\r\n for (const path in openapiSpec.paths) {\r\n if (Object.prototype.hasOwnProperty.call(openapiSpec.paths, path)) {\r\n pathEntries.push([path, openapiSpec.paths[path]]);\r\n }\r\n }\r\n // 遍历所有路径\r\n pathEntries.forEach(([path, pathItem]) => {\r\n const pathItemEntries: [string, OpenAPIV3.OperationObject][] = [];\r\n for (const method in pathItem) {\r\n if (Object.prototype.hasOwnProperty.call(pathItem, method)) {\r\n // 关键:将 method 断言为合法的 key\r\n if (isHttpMethod(method)) {\r\n const operation = pathItem[method as keyof typeof pathItem];\r\n if (operation != null && typeof operation === 'object' && !('$ref' in operation)) {\r\n // 此时可以安全认为是 OperationObject(因为 method key 不会对应 $ref/parameters)\r\n pathItemEntries.push([method, operation as OpenAPIV3.OperationObject]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 遍历路径下的所有方法\r\n pathItemEntries.forEach(([method, operation]) => {\r\n // 初始化当前API操作对象\r\n let url = path\r\n if (currentServer) {\r\n url = currentServer.value + \"/api/\" + serviceName + \"/v1\" + path;\r\n } else if (openapiSpec.servers && openapiSpec.servers.length > 0) {\r\n url = openapiSpec.servers[0].url + path;\r\n }\r\n\r\n const apiOperator: any = {\r\n method: method.toUpperCase(),\r\n url: url,\r\n rawApiInfo: operation,\r\n requestBody: null,\r\n response: {},\r\n auth: {}\r\n };\r\n\r\n if (operation) {\r\n // requestBody\r\n // support openapi 2.0\r\n // if (operation.parameters) {\r\n // const parameter = operation.parameters.filter((val: any) => val.in == 'body');\r\n // if (parameter && parameter.length > 0) {\r\n // // let requestBody = parseParaModel(parameter[0], data['definitions']);\r\n // // apiOperator.requestBody = requestBody;\r\n // }\r\n // }\r\n\r\n // //support openapi 3.0\r\n // if (operation.requestBody) {\r\n // const requestBodyObject = operation.requestBody as OpenAPIV3.RequestBodyObject //目前只支持对象类型 TODO 引用类型待支持\r\n // const content = requestBodyObject.content;\r\n // for (const key in content) {\r\n // if (Object.prototype.hasOwnProperty.call(content, key)) {\r\n // const element: OpenAPIV3.MediaTypeObject = content[key];\r\n // if (element) {\r\n // let requestBody = parseParaModel(element, openapiSpec[\"components\"]![\"schemas\"]);\r\n // apiOperator.requestBody = requestBody;\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n\r\n if (apiOperator.rawApiInfo.parameters) {\r\n const parameterBody = apiOperator.rawApiInfo.parameters.filter((val: any) => val.in == 'body');\r\n if (parameterBody && parameterBody.length > 0) {\r\n apiOperator[\"requestBody\"] = {\r\n content: {},\r\n }\r\n apiOperator['consumes'] = apiOperator.rawApiInfo['consumes']\r\n const currentConsume = apiOperator.rawApiInfo['consumes'].length > 0 ? apiOperator.rawApiInfo['consumes'][0] : \"application/json\" //TODO 简化处理暂时取第一个\r\n apiOperator['currentConsume'] = currentConsume\r\n let requestBody: any = parseParaModel(parameterBody[0], openapiSpec['definitions']); // support openapi 2.0\r\n apiOperator[\"requestBody\"][\"content\"][currentConsume] = JSON.stringify(requestBody, null, 4);\r\n apiOperator[\"parameterHasBody\"] = true;//标记该接口有body参数,仅适用于openapi 2.0\r\n } else {\r\n for (const parameter of apiOperator.rawApiInfo.parameters) {\r\n if (parameter.in == 'query' || parameter.in == 'header' || parameter.in == 'path' || parameter.in == 'formData') {\r\n if (parameter.type == 'integer' || (parameter.schema != null && parameter.schema.type == 'integer')\r\n || parameter.type == 'number' || (parameter.schema != null && parameter.schema.type == 'number')) {\r\n parameter.uiType = 'number';\r\n }\r\n if (parameter.type == 'string' || (parameter.schema != null && parameter.schema.type == 'string')) {\r\n parameter.uiType = 'text';\r\n }\r\n if (parameter.type == 'boolean' || (parameter.schema != null && parameter.schema.type == 'boolean')) {\r\n parameter.uiType = 'text';// TODO 未来可以改成checkbox\r\n }\r\n }\r\n }\r\n const parameterFormData = apiOperator.rawApiInfo.parameters.filter((val: any) => val.in == 'formData');\r\n if (parameterFormData && parameterFormData.length > 0) {\r\n apiOperator[\"parameterHasFormDataVer2\"] = true;//标记该接口有formData参数,仅适用于openapi 2.0 body参数和formData参数互斥\r\n }\r\n // support openapi 3.0 enum parameter parsing\r\n for (const param of apiOperator.rawApiInfo.parameters) {\r\n const paramSchema = param.schema;\r\n if (paramSchema && paramSchema['$ref']) {\r\n const bodyName = paramSchema['$ref'].substring(paramSchema['$ref'].lastIndexOf('/') + 1);\r\n if (openapiSpec && openapiSpec[\"components\"] != null && openapiSpec[\"components\"][\"schemas\"]!=null) {\r\n const def = openapiSpec[\"components\"] != null ? openapiSpec[\"components\"][\"schemas\"][bodyName] : {type: ''};\r\n param.type = parseElementType(def);\r\n param.uiType = (param.type == 'integer' || param.type == 'number') ? 'number' : 'text';\r\n param.value = parseElement(def);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n //support openapi 3.0\r\n if (apiOperator.rawApiInfo.requestBody) {\r\n const content = apiOperator.rawApiInfo.requestBody.content;\r\n apiOperator[\"requestBody\"] = {\r\n content: {}\r\n }\r\n\r\n for (const key in content) {\r\n if (Object.prototype.hasOwnProperty.call(content, key)) {\r\n const element = content[key];\r\n apiOperator['consumes']?.push(key);\r\n if (element) {\r\n if (element.schema == undefined) {\r\n console.log(\"pathKey is:\", path);\r\n console.log(\"key is:\", key);\r\n console.log(\"content is:\", content);\r\n console.log(\"Unsupported requestBody schema format:\", element);\r\n continue;\r\n }\r\n if (key != 'application/x-www-form-urlencoded' && key != 'multipart/form-data') {//TODO 支持更多的content-type\r\n let requestBody: any = parseParaModel(element, openapiSpec[\"components\"]![\"schemas\"]);\r\n apiOperator[\"requestBody\"][\"content\"][key] = JSON.stringify(requestBody, null, 4)\r\n } else {\r\n let requestFormDataBody: any = parseFormDataParaModel(element, openapiSpec[\"components\"]![\"schemas\"]);\r\n apiOperator[\"requestBody\"][\"content\"][key] = requestFormDataBody;\r\n }\r\n apiOperator[\"parameterHasBody\"] = true;//标记该接口有body参数,仅适用于openapi 3.0\r\n }\r\n }\r\n }\r\n if (apiOperator.consumes) {\r\n if (apiOperator.consumes.length > 0) {\r\n apiOperator['currentConsume'] = apiOperator['consumes'][0]\r\n }\r\n }\r\n }\r\n\r\n // 添加到结果列表\r\n apiOperatorList.push(apiOperator);\r\n }\r\n\r\n });\r\n });\r\n\r\n return apiOperatorList;\r\n}\r\n\r\nfunction countOpenAPI(openapiSpec: OpenAPIV3CustomDoc) {\r\n let apiCount = 0;\r\n const pathEntries: [string, OpenAPIV3.PathItemObject | undefined][] = [];\r\n for (const path in openapiSpec.paths) {\r\n if (Object.prototype.hasOwnProperty.call(openapiSpec.paths, path)) {\r\n pathEntries.push([path, openapiSpec.paths[path]]);\r\n }\r\n }\r\n\r\n // 遍历所有路径\r\n pathEntries.forEach(([path, pathItem]) => {\r\n const pathItemEntries: [string, OpenAPIV3.OperationObject][] = [];\r\n for (const method in pathItem) {\r\n if (Object.prototype.hasOwnProperty.call(pathItem, method)) {\r\n // 关键:将 method 断言为合法的 key\r\n if (isHttpMethod(method)) {\r\n const operation = pathItem[method as keyof typeof pathItem];\r\n if (operation != null && typeof operation === 'object' && !('$ref' in operation)) {\r\n // 此时可以安全认为是 OperationObject(因为 method key 不会对应 $ref/parameters)\r\n pathItemEntries.push([method, operation as OpenAPIV3.OperationObject]);\r\n }\r\n }\r\n }\r\n }\r\n // 遍历路径下的所有方法\r\n pathItemEntries.forEach(([method, operation]) => {\r\n apiCount = apiCount + 1;\r\n });\r\n });\r\n\r\n return apiCount;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCO,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACItB,IAAM,cAAN,MAAM,aAAY;AAAA,EACrB;AAAA,EACA;AAAA;AAAA,EAGA,OAAe,sBAAsB;AAAA,EAErC,YAAY,SAAc;AACtB,SAAK,UAAU,OAAO,OAAO;AAAA,MACzB,YAAY,UAAU;AAAA;AAAA,MACtB,WAAW;AAAA,MACX,WAAW;AAAA,IACf,GAAG,OAAO;AAEV,SAAK,YAAY;AAAA,EACrB;AAAA,EAEA,OAAO,SAA6B,eAAqB,aAAsB,aAAsB,OAAO;AAExG,UAAM,oBAAoB,CAAC,SAAiB;AACxC,UAAI,CAAC,aAAY,qBAAqB;AAElC,cAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,gBAAQ,cAAc;AACtB,iBAAS,KAAK,YAAY,OAAO;AACjC,qBAAY,sBAAsB;AAAA,MACtC;AAAA,IACJ;AAEA,sBAAkB,aAAa;AAG/B,UAAM,aAAa,oBAAI,IAAI;AAG3B,UAAM,eAAe,OAAO,KAAK,QAAQ,eAAe,WACpD,SAAS,cAAc,KAAK,QAAQ,UAAU,IAC9C,KAAK,QAAQ;AAEjB,QAAI,CAAC,cAAc;AACf,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACnD;AAEA,QAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,KACrD,QAAQ,SAAS,KAAK,QAAQ,SAAS,EAAE,WAAW,IAAI,GAAI;AAChE,YAAM,WAAW,aAAa,OAAO;AACrC,YAAM,kBAAkB,iBAAiB,SAAS,eAAe,WAAW;AAE5E,UAAI,YAAY,KAAK,YAAY;AAG7B,aAAK,YAAY,cAAc,gBAAgB,CAAC,CAAC;AAAA,MACrD,OAAO;AAEH,aAAK,YAAY,SAAS,cAAc,KAAK;AAC7C,aAAK,UAAU,aAAa,cAAc,KAAK,QAAQ,SAAS;AAChE,aAAK,UAAU,YAAY,KAAK,QAAQ;AAGxC,wBAAgB,QAAQ,CAAC,gBAAqB;AAC1C,gBAAM,cAAc,SAAS,cAAc,KAAK;AAChD,sBAAY,aAAa,cAAc,aAAa;AACpD,sBAAY,YAAY;AAGxB,gBAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,0BAAgB,aAAa,cAAc,QAAQ;AACnD,0BAAgB,YAAY;AAE5B,gBAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,qBAAW,aAAa,cAAc,YAAY;AAClD,qBAAW,YAAY;AAEvB,gBAAM,cAAc,SAAS,cAAc,KAAK;AAChD,sBAAY,aAAa,cAAc,YAAY,OAAO,YAAY,CAAC;AACvE,sBAAY,YAAY,GAAG,YAAY,MAAM,YAAY,YAAY,OAAO,YAAY,CAAC;AACzF,sBAAY,cAAc,YAAY;AAEtC,qBAAW,YAAY,WAAW;AAClC,0BAAgB,YAAY,UAAU;AACtC,sBAAY,YAAY,eAAe;AAGvC,gBAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,qBAAW,aAAa,cAAc,QAAQ;AAC9C,qBAAW,YAAY;AACvB,qBAAW,cAAc,YAAY;AACrC,sBAAY,YAAY,UAAU;AAElC,eAAK,UAAU,YAAY,WAAW;AAGtC,sBAAY,iBAAiB,SAAS,cAAc,aAAa,KAAK,WAAW,UAAU,CAAC;AAAA,QAChG,CAAC;AAAA,MACL;AAAA,IACJ,OAAO;AAEH,YAAM,cAAc;AAAA,QAChB,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,UAAU,CAAC;AAAA,QACX,OAAO;AAAA,UACH;AAAA,YACI,MAAM;AAAA,UACV;AAAA,UACA;AAAA,YACI,MAAM;AAAA,YACN,YAAY;AAAA,cACR;AAAA,gBACI,MAAM;AAAA,gBACN,OAAO;AAAA,cACX;AAAA,cACA;AAAA,gBACI,MAAM;AAAA,gBACN,OAAO;AAAA,cACX;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,WAAK,YAAY,cAAc,OAAO;AAAA,IAC1C;AAGA,iBAAa,YAAY;AACzB,iBAAa,YAAY,KAAK,SAAS;AAAA,EAG3C;AACJ;AAGA,IAAM,QAAQ;AAAA,EACV;AAAA,IACI,OAAO;AAAA,EACX;AAAA,EACA;AAAA,IACI,OAAO;AAAA,IACP,YAAY;AAAA,MACR;AAAA,QACI,MAAM;AAAA,QACN,OAAO;AAAA,MACX;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,OAAO;AAAA,MACX;AAAA,IACJ;AAAA,EACJ;AAAA,EACA;AAAA,IACI,OAAO;AAAA,EACX;AACJ;AAEA,IAAM,aAAa;AAAA,EACf,EAAE,OAAO,qBAAqB;AAAA,EAC9B,EAAE,OAAO,WAAW;AAAA,EACpB,EAAE,OAAO,sCAAsC;AAAA,EAC/C,EAAE,OAAO,qBAAqB;AAClC;AAEA,IAAM,2BAA2B;AAAA,EAC7B,EAAE,OAAO,WAAW,aAAa,8BAA8B;AAAA,EAC/D,EAAE,OAAO,QAAQ,aAAa,2BAA2B;AAC7D;AAGA,IAAM,cAAc;AAAA,EAChB,EAAE,OAAO,OAAO;AAAA,EAChB,EAAE,OAAO,mBAAmB;AAAA,EAC5B,EAAE,OAAO,kBAAkB;AAAA,EAC3B,EAAE,OAAO,oCAAoC;AAAA,EAC7C,EAAE,OAAO,sBAAsB;AAAA,EAC/B,EAAE,OAAO,aAAa;AAC1B;AAGA,SAAS,cAAc,aAAkB,cAAmB,YAAiB;AACzE,SAAO,SAAU,KAAU;AACvB,UAAM,gBAAgB,IAAI;AAE1B,QAAI,WAAW,IAAI,aAAa,GAAG;AAC/B,YAAM,aAAa,WAAW,IAAI,aAAa;AAC/C,iBAAW,OAAO;AAClB,iBAAW,OAAO,aAAa;AAC/B;AAAA,IACJ;AAGA,UAAM,eAAe,cAAc,WAAW;AAI9C,QAAI,cAAc,aAAa;AAC3B,mBAAa,aAAa,cAAc,cAAc,WAAW;AAAA,IACrE,OAAO;AACH,mBAAa,YAAY,YAAY;AAAA,IACzC;AAGA,eAAW,IAAI,eAAe,YAAY;AAAA,EAC9C;AACJ;AAEA,SAAS,cAAc,aAAkB;AACrC,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,aAAa,cAAc,SAAS;AACjD,eAAa,YAAY;AAEzB,QAAM,kBAAkB,sBAAsB,WAAW;AACzD,cAAY,sBAAsB;AAGlC,QAAM,cAAc,kBAAkB,WAAW;AACjD,eAAa,YAAY,WAAW;AAEpC,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,YAAY;AAClD,aAAW,YAAY;AAEvB,QAAM,eAAe,mBAAmB,WAAW;AAEnD,QAAM,gBAAgB,oBAAoB,WAAW;AAErD,QAAM,cAAc,kBAAkB,WAAW;AAEjD,QAAM,cAAc,yBAAyB,WAAW;AAExD,aAAW,OAAO,cAAc,eAAe,aAAa,WAAW;AACvE,eAAa,YAAY,UAAU;AAEnC,eAAa,YAAY,eAAe;AACxC,SAAO;AACX;AAEA,SAAS,kBAAkB,aAAkB;AACzC,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,aAAa,cAAc,aAAa;AACpD,cAAY,YAAY;AAExB,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,QAAQ;AAC9C,aAAW,YAAY;AACvB,QAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,kBAAgB,aAAa,cAAc,YAAY;AACvD,kBAAgB,YAAY;AAC5B,kBAAgB,cAAc,YAAY,OAAO,YAAY;AAC7D,aAAW,YAAY,eAAe;AAEtC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,aAAa,oBAAoB,EAAE;AAC7C,YAAU,aAAa,cAAc,WAAW;AAChD,YAAU,YAAY;AAGtB,QAAM,MAAM,UAAU;AACtB,YAAU,YAAY,GAAG;AACzB,aAAW,YAAY,SAAS;AAChC,cAAY,YAAY,UAAU;AAElC,QAAM,SAAS,mBAAmB;AAClC,SAAO,aAAa,cAAc,QAAQ;AAC1C,SAAO,YAAY;AACnB,SAAO,QAAQ,YAAY;AAE3B,SAAO,iBAAiB,SAAS,CAAC,MAAW;AAEzC,gBAAY,MAAM,EAAE,OAAO;AAAA,EAC/B,CAAC;AACD,cAAY,YAAY,MAAM;AAE9B,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,aAAa;AACnD,aAAW,YAAY;AACvB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,aAAa,cAAc,MAAM;AAC1C,WAAS,YAAY;AACrB,WAAS,cAAc;AACvB,aAAW,YAAY,QAAQ;AAE/B,aAAW,iBAAiB,SAAS,CAAC,MAAW;AAG7C,UAAM,UAAU,YAAY,uBAAuB;AACnD,gBAAY,aAAa,OAAO;AAAA,EACpC,CAAC;AAED,cAAY,YAAY,UAAU;AAClC,SAAO;AACX;AAEA,SAAS,mBAAmB,aAAkB;AAC1C,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,aAAa,cAAc,mBAAmB;AAC3D,eAAa,YAAY;AAEzB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,aAAa,cAAc,gBAAgB;AACpD,WAAS,YAAY;AACrB,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,aAAa,cAAc,YAAY;AACjD,YAAU,YAAY;AACtB,YAAU,cAAc;AACxB,WAAS,YAAY,SAAS;AAC9B,eAAa,YAAY,QAAQ;AAEjC,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,aAAa,cAAc,eAAe;AACtD,cAAY,YAAY;AACxB,MAAI,aAAa,YAAY,WAAW,cAAc,CAAC;AACvD,QAAM,gBAAgB,WAAW,OAAO,CAAC,cAAmB,mBAAmB,SAAS,CAAC,EACpF,IAAI,CAAC,cAAmB,UAAU,SAAS,CAAC;AACjD,cAAY,OAAO,GAAG,aAAa;AACnC,eAAa,OAAO,UAAU,WAAW;AACzC,SAAO;AACX;AAEA,SAAS,oBAAoB,aAAkB;AAC3C,QAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,gBAAc,aAAa,cAAc,iBAAiB;AAC1D,gBAAc,YAAY;AAE1B,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,aAAa,cAAc,aAAa;AAClD,YAAU,YAAY;AACtB,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,SAAS;AAC/C,aAAW,YAAY;AACvB,aAAW,cAAc;AACzB,YAAU,YAAY,UAAU;AAChC,gBAAc,YAAY,SAAS;AAEnC,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,aAAa,cAAc,eAAe;AACvD,eAAa,YAAY;AACzB,MAAI,aAAa,YAAY,WAAW,cAAc,CAAC;AACvD,QAAM,aAAa,WAAW,OAAO,CAAC,cAAmB,cAAc,SAAS,CAAC,EAC5E,IAAI,CAAC,cAAmB,UAAU,SAAS,CAAC;AACjD,eAAa,OAAO,GAAG,UAAU;AACjC,gBAAc,OAAO,WAAW,YAAY;AAC5C,SAAO;AACX;AAEA,SAAS,kBAAkB,aAAkB;AACzC,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,aAAa,cAAc,uBAAuB;AAC9D,cAAY,YAAY;AAExB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,aAAa,cAAc,mBAAmB;AACtD,UAAQ,YAAY;AACpB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,aAAa,cAAc,eAAe;AACnD,WAAS,YAAY;AACrB,WAAS,cAAc;AACvB,UAAQ,YAAY,QAAQ;AAC5B,cAAY,YAAY,OAAO;AAE/B,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,eAAe;AACrD,aAAW,YAAY;AAEvB,QAAM,cAAc,gBAAgB,sBAAsB,KAAK;AAE/D,cAAY,SAAS,CAAC,EAAE,iBAAiB,UAAU,SAAU,OAAY;AAErE,kBAAc,MAAM,KAAK,WAAW,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAY,GAAG,OAAO,CAAC;AACvF,UAAM,OAAO,MAAM,MAAM,OAAO,aAAa;AAC7C,QAAI,KAAK,SAAS,WAAW;AAAA,IAE7B,WAAW,KAAK,SAAS,cAAc;AACnC,kBAAY,OAAO;AAAA,QACf;AAAA,UACI,MAAM;AAAA,UACN,OAAO;AAAA,QACX;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,OAAO;AAAA,QACX;AAAA,MACJ;AACA,YAAM,WAAW,YAAY,KAAK,IAAI,CAAC,cAAmB,UAAU,SAAS,CAAC;AAC9E,iBAAW,OAAO,GAAG,QAAQ;AAAA,IACjC,WAAW,KAAK,SAAS,aAAa;AAClC,kBAAY,OAAO,CAAC;AACpB,qBAAe,aAAa,YAAY,WAAW;AAAA,IACvD;AAAA,EACJ,CAAC;AAED,aAAW,OAAO,WAAW;AAC7B,cAAY,OAAO,SAAS,UAAU;AACtC,SAAO;AACX;AAGA,SAAS,cAAc,KAAa,QAAgC,CAAC,GAAG,UAAoB,CAAC,GAAgB;AACzG,QAAM,KAAK,SAAS,cAAc,GAAG;AACrC,SAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,aAAa,KAAK,KAAK,CAAC;AAC3E,MAAI,QAAQ,OAAQ,IAAG,UAAU,IAAI,GAAG,OAAO;AAC/C,SAAO;AACX;AAGA,SAAS,mBAAmB,aACxB,WACA,SACA,WACA,UACA,WAAoB,OACT;AACX,QAAM,UAAU,cAAc,OAAO,CAAC,GAAG,CAAC,YAAY,0BAA0B,CAAC;AACjF,QAAM,QAAQ,cAAc,SAAS,EAAE,KAAK,QAAQ,GAAG,CAAC,QAAQ,sBAAsB,CAAC;AACvF,QAAM,cAAc,YAAY;AAChC,QAAM,QAAQ,cAAc,SAAS;AAAA,IACjC,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,GAAI,WAAW,EAAE,UAAU,OAAO,IAAI,CAAC;AAAA,EAC3C,GAAG,CAAC,aAAa,2BAA2B,CAAC;AAG7C,QAAM,QAAQ,YAAY,KAAK,QAAQ,KAAK;AAC5C,QAAM,iBAAiB,SAAS,CAAC,MAAM;AACnC,gBAAY,KAAK,QAAQ,IAAK,EAAE,OAA4B;AAAA,EAChE,CAAC;AAED,UAAQ,YAAY,KAAK;AACzB,UAAQ,YAAY,KAAK;AACzB,SAAO;AACX;AAGA,SAAS,aAAa,aAClB,WACA,UACA,SACA,UACA,eACW;AACX,QAAM,UAAU,cAAc,OAAO,CAAC,GAAG,CAAC,YAAY,0BAA0B,CAAC;AACjF,QAAM,QAAQ,cAAc,SAAS,EAAE,KAAK,SAAS,GAAG,CAAC,QAAQ,sBAAsB,CAAC;AACxF,QAAM,cAAc,YAAY;AAEhC,QAAM,SAAS,cAAc,UAAU;AAAA,IACnC,IAAI;AAAA,IACJ,MAAM;AAAA,EACV,GAAG,CAAC,CAAC;AAEL,UAAQ,QAAQ,SAAO;AACnB,UAAM,SAAS,cAAc,UAAU,EAAE,OAAO,IAAI,MAAM,CAAC;AAC3D,WAAO,cAAc,IAAI,eAAe,IAAI;AAC5C,WAAO,YAAY,MAAM;AAAA,EAC7B,CAAC;AAGD,SAAO,QAAQ,YAAY,KAAK,QAAQ,KAAK,QAAQ,CAAC,GAAG,SAAS;AAGlE,SAAO,iBAAiB,UAAU,CAAC,MAAM;AACrC,UAAM,MAAO,EAAE,OAA6B;AAC5C,kBAAc,GAAG;AAAA,EACrB,CAAC;AAED,UAAQ,YAAY,KAAK;AACzB,UAAQ,YAAY,MAAM;AAC1B,SAAO;AACX;AAGA,SAAS,eAAe,aAAkB,YAAiB,aAAkB;AACzE,aAAW,YAAY;AAEvB,aAAW,OAAO,WAAW;AAE7B,aAAW,YAAY,mBAAmB,aAAa,SAAS,SAAS,SAAS,SAAS,IAAI,CAAC;AAGhG,aAAW;AAAA,IACP;AAAA,MAAa;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,UAAkB;AACf,oBAAY,KAAK,YAAY;AAC7B,uBAAe,aAAa,YAAY,WAAW;AAAA,MACvD;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,KAAK,YAAY,KAAK,aAAa;AAGzC,MAAI,OAAO,wBAAwB,OAAO,YAAY;AAClD,eAAW,YAAY,mBAAmB,aAAa,0BAA0B,yBAAyB,yBAAyB,yBAAyB,IAAI,CAAC;AACjK,eAAW,YAAY,mBAAmB,aAAa,gBAAgB,eAAe,eAAe,eAAe,IAAI,CAAC;AAAA,EAC7H;AAGA,MAAI,OAAO,wBAAwB,OAAO,wBAAwB,OAAO,uCAAuC;AAC5G,eAAW,YAAY,mBAAmB,aAAa,kBAAkB,iBAAiB,iBAAiB,iBAAiB,IAAI,CAAC;AAAA,EACrI;AAGA,aAAW,YAAY,mBAAmB,aAAa,aAAa,YAAY,YAAY,YAAY,IAAI,CAAC;AAG7G,MAAI,OAAO,wBAAwB,OAAO,wBAAwB,OAAO,uCAAuC;AAC5G,eAAW,YAAY,mBAAmB,aAAa,iBAAiB,gBAAgB,gBAAgB,gBAAgB,IAAI,CAAC;AAAA,EACjI;AAGA,MAAI,OAAO,uCAAuC;AAC9C,eAAW,YAAY,mBAAmB,aAAa,YAAY,YAAY,YAAY,YAAY,IAAI,CAAC;AAC5G,eAAW,YAAY,mBAAmB,aAAa,YAAY,YAAY,YAAY,YAAY,IAAI,CAAC;AAAA,EAChH;AAGA,aAAW,YAAY,mBAAmB,aAAa,UAAU,UAAU,UAAU,UAAU,IAAI,CAAC;AAGpG,aAAW;AAAA,IACP;AAAA,MAAa;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,UAAkB;AACf,oBAAY,KAAK,uBAAuB;AAAA,MAE5C;AAAA,IACJ;AAAA,EACJ;AAGA,QAAM,gBAAgB,cAAc,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACjE,QAAM,cAAc,cAAc,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACpE,cAAY,OAAO;AACnB,cAAY,cAAc;AAC1B,cAAY,iBAAiB,SAAS,MAAM,oBAAoB,WAAW,CAAC;AAE5E,gBAAc,YAAY,WAAW;AACrC,aAAW,YAAY,aAAa;AACxC;AAEA,SAAS,yBAAyB,aAAkB;AAChD,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,aAAa,cAAc,sBAAsB;AAC7D,cAAY,YAAY;AAExB,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,aAAa,cAAc,UAAU;AAC7C,UAAQ,YAAY;AACpB,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,aAAa,cAAc,MAAM;AAC1C,WAAS,YAAY;AACrB,WAAS,cAAc;AACvB,UAAQ,YAAY,QAAQ;AAC5B,cAAY,YAAY,OAAO;AAE/B,uBAAqB,aAAa,aAAa,OAAO;AACtD,SAAO;AACX;AAMA,SAAS,oBAAoB,aAAkB,WAAwB,SAAc;AACjF,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,QAAQ,cAAc,OAAO;AACnC,QAAM,MAAM,SAAS;AACrB,QAAM,cAAc;AAEpB,QAAM,SAAS,cAAc,QAAQ;AACrC,SAAO,MAAM,QAAQ;AAErB,cAAY,QAAQ,SAAO;AACvB,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,IAAI;AACnB,WAAO,cAAc,IAAI;AACzB,WAAO,YAAY,MAAM;AAAA,EAC7B,CAAC;AAGD,SAAO,QAAQ,YAAY,kBAAkB,kBAAkB,WAAW;AAG1E,SAAO,iBAAiB,UAAU,CAAC,MAAM;AACrC,UAAM,WAAY,EAAE,OAA6B;AACjD,QAAI,YAAY,mBAAmB,UAAU;AACzC,kBAAY,iBAAiB;AAC7B,2BAAqB,aAAa,WAAW,OAAO;AAAA,IACxD;AAAA,EACJ,CAAC;AAED,UAAQ,YAAY,KAAK;AACzB,UAAQ,YAAY,MAAM;AAC1B,SAAO;AACX;AAGA,SAAS,sBAAsB,aAAkB,WAAwB;AACrE,YAAU,YAAY;AAGtB,QAAM,KAAK,YAAY,kBAAkB,kBAAkB,WAAW;AAEtE,MACI,OAAO,QACP,OAAO,UACP,OAAO,sBACP,OAAO,qBACP,OAAO,cACT;AAEE,UAAM,WAAW,MAAM;AAGvB,QAAI,WAAW,YAAY,YAAY,QAAQ,QAAQ;AACvD,QAAI,YAAY,MAAM;AAClB,iBAAW;AACX,kBAAY,YAAY,QAAQ,QAAQ,IAAI;AAAA,IAChD;AAEA,UAAM,WAAW,cAAc,YAAY,CAAC,GAAG,CAAC,CAAC;AACjD,aAAS,MAAM,QAAQ;AACvB,aAAS,MAAM,SAAS;AACxB,aAAS,MAAM,aAAa;AAC5B,aAAS,MAAM,WAAW;AAC1B,aAAS,cAAc,SAAS,QAAQ;AAExC,aAAS,QAAQ;AAGjB,aAAS,iBAAiB,SAAS,MAAM;AACrC,kBAAY,YAAY,QAAQ,QAAQ,IAAI,SAAS;AACrD,cAAQ,IAAI,uBAAuB,QAAQ,KAAK,SAAS,KAAK;AAAA,IAClE,CAAC;AAED,cAAU,YAAY,QAAQ;AAAA,EAElC,YAGK,OAAO,uCAAuC,OAAO,0BACtD,YAAY,YAAY,WACxB,MAAM,QAAQ,YAAY,YAAY,QAAQ,EAAE,CAAC,GACnD;AACE,UAAM,SAAS,YAAY,YAAY,QAAQ,EAAE;AACjD,WAAO,QAAQ,CAAC,OAAY,UAAkB;AAC1C,YAAM,OAAO,cAAc,OAAO,CAAC,GAAG,CAAC,YAAY,0BAA0B,CAAC;AAE9E,YAAM,QAAQ,cAAc,SAAS,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,SAAS,sBAAsB,CAAC;AAC/G,YAAM,cAAc,GAAG,MAAM,IAAI;AAEjC,YAAM,QAAQ,cAAc,SAAS;AAAA,QACjC,MAAM,MAAM,UAAU;AAAA;AAAA,QAEtB,IAAI,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,QAChC,MAAM;AAAA,MACV,GAAG,CAAC,aAAa,2BAA2B,CAAC;AAE7C,YAAM,QAAQ,MAAM,SAAS;AAC7B,YAAM,eAAe;AACrB,YAAM,WAAW;AAEjB,YAAM,iBAAiB,WAAW,CAAC,MAAM;AACrC,sBAAc,GAAG,IAAI;AAAA,MACzB,CAAC;AAED,YAAM,iBAAiB,SAAS,MAAM;AAClC,cAAM,QAAQ,MAAM;AAAA,MACxB,CAAC;AAED,WAAK,YAAY,KAAK;AACtB,WAAK,YAAY,KAAK;AACtB,gBAAU,YAAY,IAAI;AAAA,IAC9B,CAAC;AAAA,EACL;AACJ;AAEA,SAAS,kBAAkB,aAAkB;AACzC,MAAI,CAAC,YAAY,aAAa;AAC1B,gBAAY,cAAc,EAAE,SAAS,CAAC,EAAE;AAAA,EAC5C;AACA,MAAI,CAAC,YAAY,YAAY,SAAS;AAClC,gBAAY,YAAY,UAAU,CAAC;AAAA,EACvC;AAEA,QAAM,OAAO,OAAO,KAAK,YAAY,YAAY,OAAO;AACxD,QAAM,KAAK,YAAY,iBAAiB,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI;AACpE,SAAO;AACX;AAGA,SAAS,cAAc,OAAsB,QAAiB;AAE1D,UAAQ,IAAI,yBAAyB,MAAM,KAAK,MAAM;AAC1D;AAGA,SAAS,qBAAqB,aAAkB,WAAwB,SAAc;AAClF,YAAU,YAAY;AAEtB,YAAU,YAAY,OAAO;AAG7B,QAAM,aAAa,cAAc,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;AAG7E,QAAM,gBAAgB,oBAAoB,aAAa,WAAW,OAAO;AACzE,aAAW,YAAY,aAAa;AAGpC,QAAM,mBAAmB,cAAc,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;AACvF,wBAAsB,aAAa,gBAAgB;AACnD,aAAW,YAAY,gBAAgB;AAGvC,YAAU,YAAY,UAAU;AACpC;AAGA,SAAS,sBAAsB,aAAkB;AAC7C,QAAM,kBAAkB,SAAS,cAAc,KAAK;AACpD,kBAAgB,aAAa,cAAc,aAAa;AACxD,kBAAgB,YAAY;AAE5B,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,aAAa,cAAc,cAAc;AACtD,eAAa,YAAY;AAEzB,QAAM,gBAAgB,SAAS,cAAc,KAAK;AAClD,gBAAc,aAAa,cAAc,eAAe;AACxD,gBAAc,YAAY;AAC1B,QAAM,cAAc,SAAS,cAAc,KAAK;AAChD,cAAY,aAAa,cAAc,cAAc;AACrD,cAAY,YAAY;AACxB,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,aAAa,cAAc,UAAU;AAClD,eAAa,YAAY;AACzB,eAAa,cAAc;AAC3B,cAAY,YAAY,YAAY;AACpC,gBAAc,YAAY,WAAW;AACrC,QAAM,oBAAoB,wBAAwB,WAAW;AAC7D,eAAa,OAAO,eAAe,iBAAiB;AAEpD,QAAM,eAAe,SAAS,cAAc,KAAK;AACjD,eAAa,aAAa,cAAc,cAAc;AACtD,eAAa,YAAY;AACzB,kBAAgB,OAAO,cAAc,YAAY;AACjD,SAAO;AACX;AAEA,SAAS,wBAAwB,aAAkB;AAC/C,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,YAAY;AAClD,aAAW,YAAY;AACvB,mBAAiB,YAAY,WAAW;AACxC,SAAO;AACX;AAEA,SAAS,iBAAiB,YAAiB,aAAkB;AACzD,aAAW,cACL,WAAW,YAAY,SAAS,UAAU,EAAE,IAAI,YAAY,SAAS,cAAc,EAAE,WAAW,YAAY,mBAAmB,EAAE;AAC3I;AAEA,SAAS,UAAU,WAAgB;AAC/B,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,aAAa,cAAc,UAAU;AAC9C,WAAS,YAAY;AACrB,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,aAAa,cAAc,UAAU,MAAM,CAAC;AACvD,aAAW,YAAY,UAAU,MAAM,IAAI;AAC3C,aAAW,cAAc,UAAU,MAAM,IAAI;AAC7C,QAAM,aAAa,mBAAmB;AACtC,aAAW,aAAa,cAAc,WAAW;AACjD,aAAW,YAAY;AACvB,aAAW,QAAQ,UAAU,OAAO,KAAK;AAGzC,aAAW,iBAAiB,SAAS,CAAC,MAAW;AAE7C,cAAU,OAAO,IAAI,EAAE,OAAO;AAAA,EAClC,CAAC;AACD,WAAS,OAAO,YAAY,UAAU;AACtC,SAAO;AACX;AAEA,SAAS,qBAAqB;AAC1B,QAAM,YAAY,SAAS,cAAc,OAAO;AAChD,YAAU,aAAa,QAAQ,MAAM;AACrC,YAAU,aAAa,QAAQ,YAAY;AAC3C,YAAU,aAAa,SAAS,YAAY;AAC5C,YAAU,aAAa,gBAAgB,KAAK;AAC5C,SAAO;AACX;AAEA,SAAS,gBAAgB,MAAc,MAAW;AAE9C,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,aAAa,cAAc,UAAU;AAC/C,YAAU,YAAY;AAGtB,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,aAAa,cAAc,IAAI;AACzC,YAAU,YAAY;AACtB,YAAU,cAAc,OAAO;AAG/B,QAAM,gBAAqB,SAAS,cAAc,QAAQ;AAC1D,gBAAc,OAAO;AACrB,gBAAc,QAAQ;AACtB,gBAAc,aAAa,cAAc,WAAW;AAGpD,OAAK,QAAQ,CAAC,SAAc;AACxB,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,YAAQ,QAAQ,KAAK,OAAO;AAC5B,YAAQ,cAAe,KAAK,aAAa,KAAK,QAAQ,KAAK,OAAO,KAAK,OAAS,KAAK,aAAa,KAAK,KAAK,OAAO,IAAI,KAAK,OAAO;AACnI,kBAAc,YAAY,OAAO;AAAA,EACrC,CAAC;AAGD,YAAU,YAAY,SAAS;AAC/B,YAAU,YAAY,aAAa;AACnC,SAAO;AACX;AAEA,SAAS,mBAAmB,OAAY;AACpC,SAAO,MAAM,OAAO,UAAU,MAAM,OAAO;AAC/C;AAEA,SAAS,cAAc,OAAY;AAC/B,SAAO,MAAM,OAAO;AACxB;AAGA,eAAe,oBAAoB,SAAc;AAG7C,QAAM,cAAc,MAAM,eAAe,OAAO;AAChD,UAAQ,KAAK,QAAQ;AACzB;AAOA,eAAe,eAAe,SAAc;AACxC,QAAM,OAAO,QAAQ;AACrB,MAAI,QAAQ,MAAM;AACd,UAAM,IAAI,MAAM,oDAAiB;AAAA,EACrC;AACA,QAAM,YAAY,KAAK;AACvB,QAAM,gBAAgB,KAAK;AAC3B,QAAM,QAAQ,KAAK;AAEnB,MAAI,QAAQ,KAAK,aAAa,sBAAsB;AAChD,QAAI;AACA,cAAQ,IAAI,qDAAa;AAGzB,YAAM,eAAoB;AAAA,QACtB,gBAAgB;AAAA,MACpB;AAEA,YAAM,aAAa,IAAI,gBAAgB;AACvC,iBAAW,OAAO,cAAc,oBAAoB;AACpD,UAAI,OAAO;AACP,mBAAW,OAAO,SAAS,KAAK;AAAA,MACpC;AAEA,UAAI,QAAQ,KAAK,wBAAwB,QAAQ;AAC7C,mBAAW,OAAO,aAAa,SAAS;AACxC,mBAAW,OAAO,iBAAiB,aAAa;AAAA,MACpD,OAAO;AAEH,qBAAa,eAAe,IAAI,WAAW,KAAK,YAAY,MAAM,aAAa;AAAA,MACnF;AAEA,YAAM,WAAW,MAAM,MAAM,KAAK,eAAe;AAAA,QAC7C,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM,WAAW,SAAS;AAAA,MAC9B,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AACd,cAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACxD,cAAM,IAAI,MAAM,yCAAW,SAAS,MAAM,IAAI,SAAS,UAAU,KAAK,KAAK,UAAU,SAAS,CAAC,EAAE;AAAA,MACrG;AAEA,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAQ,IAAI,yCAAW,SAAS;AAChC,aAAO,UAAU;AAAA,IACrB,SAAS,OAAO;AACZ,cAAQ,MAAM,2DAAc,KAAK;AACjC,YAAM;AAAA,IACV;AAAA,EACJ,WAAW,QAAQ,KAAK,aAAa,uCAAuC;AAAA,EAE5E,WAAW,QAAQ,KAAK,aAAa,sBAAsB;AAYvD,QAASA,gBAAT,WAAwB;AACpB,YAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,aAAO,OAAO,YAAY,OAAO,QAAQ,CAAC;AAAA,IAC9C,GAGSC,kBAAT,WAA0B;AACtB,YAAM,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;AACpD,YAAM,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;AACpD,YAAM,UAAU,IAAI,IAAI,OAAO,OAAO;AACtC,cAAQ,aAAa,OAAO,aAAa,OAAO,QAAQ;AACxD,cAAQ,aAAa,OAAO,gBAAgB,OAAO,WAAW;AAC9D,cAAQ,aAAa,OAAO,iBAAiB,MAAM;AACnD,cAAQ,aAAa,OAAO,SAAS,OAAO,KAAK;AACjD,cAAQ,aAAa,OAAO,SAAS,KAAK;AAC1C,cAAQ,aAAa,OAAO,SAAS,KAAK;AAC1C,cAAQ,aAAa,OAAO,eAAe,SAAS;AAEpD,YAAM,SAAS,OAAO,KAAK,QAAQ,SAAS,GAAG,QAAQ;AAAA,IAC3D;AAnBS,uBAAAD,eAMA,iBAAAC;AAhBT,UAAM,SAAS;AAAA,MACX,UAAU,QAAQ,KAAK;AAAA;AAAA,MACvB,cAAc,QAAQ,KAAK;AAAA;AAAA,MAC3B,aAAa,QAAQ,KAAK;AAAA;AAAA,MAC1B,SAAS,QAAQ,KAAK;AAAA,MACtB,UAAU,QAAQ,KAAK;AAAA,MACvB,OAAO,QAAQ,KAAK;AAAA;AAAA,IACxB;AAuEA,IAAAA,gBAAe;AAAA,EACnB,WAAW,QAAQ,KAAK,aAAa,YAAY;AAAA,EAEjD,OAAO;AAAA,EAEP;AACJ;AAGA,SAAS,qBAAqB,aAA0B;AACpD,QAAM,KAAK,YAAY,kBAAkB;AACzC,SAAO,YAAY,YAAY,QAAQ,EAAE;AAC7C;AAIA,IAAI,cAAc;AAElB,IAAI,mBAAmB;AACvB,IAAI,kBAA0B;AAC9B,IAAI,cAIA,CAAE;AAkBN,SAAS,YAAY,aAAkB,oBAAyB;AAC5D,QAAM,UAAU;AAChB,MAAI,aAAa,cAAc,OAAO;AAGtC,MAAI,SAAS,QAAQ,0BAA0B,IAAI,sCAC7C,QAAQ,kBAAkB,IAAK,QAAQ,gBAAgB,IAAI;AAEjE,MAAI,UAAe;AAAA,IACf,gBAAgB;AAAA,EACpB;AACA,QAAM,cAAc,iBAAiB,SAAS,QAAQ,WAAW,cAAc,CAAC,CAAC;AAEjF,SAAO,OAAO,SAAS,WAAW;AAElC,gBAAc,SAAS,OAAO;AAE9B,MAAI;AACJ,MAAI,QAAQ,OAAO,YAAY,KAAK,UAAU,QAAQ,OAAO,YAAY,KAAK,OAAO;AACjF,QAAI,QAAQ,gBAAgB,KAAK,sBAAsB,QAAQ,eAAe,MAAM;AAChF,aAAO,qBAAqB,WAAW;AAAA,IAC3C,WAAW,QAAQ,0BAA0B,GAAG;AAC5C,aAAO,mBAAmB,QAAQ,UAAU;AAAA,IAChD,WAAW,QAAQ,gBAAgB,KAAK,qCAAqC;AACzE,iBAAW,OAAO,QAAQ,aAAa,EAAE,SAAS,EAAE,QAAQ,gBAAgB,CAAC,GAAG;AAC5E,YAAI,QAAQ,QAAQ,QAAQ,IAAI;AAC5B,iBAAO,IAAI,OAAO,MAAM,IAAI;AAAA,QAChC,OAAO;AACH,iBAAO,OAAO,MAAM,IAAI,OAAO,MAAM,IAAI;AAAA,QAC7C;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,aAAO;AAAA,IACX;AAAA,EACJ,OAAO;AACH,WAAO;AAAA,EACX;AAEA,qBAAmB;AACnB,QAAM,YAAY,KAAK,IAAI;AAE3B,cAAY,aAAa,IAAI,gBAAgB;AAC7C,QAAM,SAAS,YAAY,WAAW;AAGtC,QAAM,wBAAwB,0BAA0B,aAAa,kBAAkB;AAGvF,QAAM,YAAY;AAAA,IACd,QAAQ,QAAQ,OAAO,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC,EACI,KAAK,cAAY;AACd,QAAI,CAAC,SAAS,IAAI;AACd,oBAAc;AAAA,QACV,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,MAAM;AAAA,MACV;AAEA,YAAMC,WAAU,KAAK,IAAI;AACzB,wBAAkB,eAAeA,WAAU,SAAS;AACpD,yBAAmB;AACnB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAClD;AACA,UAAM,UAAU,KAAK,IAAI;AACzB,sBAAkB,eAAe,UAAU,SAAS;AAEpD,UAAM,sBAAsB,mBAAmB,cAAc,6BAA6B;AAC1F,wBAAoB,YAAY,qBAAqB;AAErD,uBAAmB;AACnB,kBAAc;AAAA,MACV,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,IACzB;AAGA,UAAM,oBAAoB,mBAAmB,cAAc,2BAA2B;AACtF,QAAI,mBAAmB;AACnB,uBAAiB,mBAAmB,WAAW;AAAA,IACnD,OAAO;AACH,cAAQ,IAAI,6EAAgC;AAAA,IAChD;AAEA,QAAI,gBAAgB,SAAS,MAAM;AACnC,WAAO,SAAS,KAAK,EAChB,MAAM,WAAS;AAEZ,aAAO,cAAc,KAAK;AAAA,IAC9B,CAAC;AAAA,EACT,CAAC,EACA,KAAK,UAAQ;AACV,kBAAc;AACd,UAAM,sBAAsB,mBAAmB,cAAc,6BAA6B;AAE1F,QAAI,OAAO,SAAS,UAAU;AAE1B,cAAQ,IAAI,kBAAkB,IAAI;AAClC,kBAAY,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IACnD,OAAO;AAEH,cAAQ,IAAI,kBAAkB,IAAI;AAClC,kBAAY,OAAO;AAAA,IACvB;AACA,wBAAoB,cAAc,YAAY;AAAA,EAClD,CAAC,EACA,MAAM,WAAS;AAEZ,YAAQ,MAAM,uDAAuD,KAAK;AAAA,EAC9E,CAAC;AACT;AAEA,SAAS,0BAA0B,aAAkB,oBAAyB;AAE1E,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,SAAO,OAAO,UAAU,OAAO;AAAA,IAC3B,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,SAAS;AAAA,EACb,CAAC;AAGD,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,SAAO,OAAO,WAAW,OAAO;AAAA,IAC5B,SAAS;AAAA,IACT,KAAK;AAAA,IACL,YAAY;AAAA,EAChB,CAAC;AAGD,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,cAAc;AAGtB,QAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,YAAU,YAAY;AACtB,SAAO,OAAO,UAAU,OAAO;AAAA,IAC3B,QAAQ;AAAA,EACZ,CAAC;AACD,YAAU,cAAc;AAExB,QAAM,sBAAsB,mBAAmB,cAAc,6BAA6B;AAE1F,aAAW,YAAY,OAAO;AAC9B,aAAW,YAAY,SAAS;AAChC,YAAU,YAAY,UAAU;AAChC,sBAAoB,YAAY,SAAS;AAGzC,YAAU,iBAAiB,SAAS,CAAC,MAAM;AAEvC,QAAI,YAAY,YAAY;AACxB,kBAAY,WAAW,MAAM;AAC7B,kBAAY,mBAAmB;AAC/B,gBAAU,MAAM,UAAU;AAC1B,0BAAoB,YAAY,SAAS;AAAA,IAC7C;AAAA,EACJ,CAAC;AAED,SAAO;AACX;AAGA,SAAS,eAAe,cAAsB;AAC1C,MAAI,eAAe,KAAK,MAAM,eAAe,GAAI;AACjD,MAAI,UAAe,eAAe;AAClC,MAAI,UAAe,KAAK,MAAM,eAAe,EAAE,IAAI;AACnD,MAAI,QAAa,KAAK,MAAM,gBAAgB,KAAK,GAAG;AAGpD,MAAI,mBAAwB,KAAK,MAAM,eAAe,GAAI;AAE1D,qBAAmB,iBAAiB,SAAS,EAAE,SAAS,GAAG,GAAG;AAG9D,UAAQ,MAAM,SAAS,EAAE,SAAS,GAAG,GAAG;AACxC,YAAU,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG;AAC5C,YAAU,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG;AAG5C,SAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,gBAAgB;AAC7D;AAUA,SAAS,cAAc,SAAc;AACjC,MAAI,aAAa,QAAQ;AAEzB,QAAM,oBAAoB,QAAQ,WAAW,cAAc,CAAC;AAC5D,MAAI,qBAAqB,MAAM;AAC3B,WAAO;AAAA,EACX;AAEA,aAAW,WAAW,mBAAmB;AACrC,QAAI,QAAQ,MAAM,QAAQ;AACtB,mBAAa,WAAW,QAAQ,MAAM,QAAQ,OAAO,KAAK,QAAQ,KAAK;AAAA,IAC3E;AAAA,EACJ;AAEA,MAAI,cAAc,eAAe,SAAS,iBAAiB;AAC3D,eAAa,YAAY,SAAS,IAAK,aAAa,MAAM,YAAY,KAAK,GAAG,IAAK;AAEnF,SAAO;AACX;AAEA,SAAS,cAAc,SAAc,SAAc;AAC/C,QAAM,MAAM,qBAAqB;AACjC,MAAI,QAAQ,KAAK,YAAY,gBAAgB,QAAQ,QAAQ,MAAM;AAC/D,QAAI,KAAK;AACL,YAAM,cAAc,KAAK,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE;AAC5E,cAAQ,eAAe,IAAI,SAAS,WAAW;AAAA,IACnD,OAAO;AACH,YAAM,SAAS,OAAO,KAAK,GAAG,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,EAAE;AAC9E,YAAM,cAAc,OAAO,SAAS,QAAQ;AAC5C,cAAQ,eAAe,IAAI,SAAS,WAAW;AAAA,IACnD;AAAA,EACJ,WAAW,QAAQ,KAAK,YAAY,eAAe,QAAQ,QAAQ,MAAM;AACrE,QAAI,QAAQ,KAAK,SAAS,QAAQ,QAAQ,KAAK,SAAS,IAAI;AACxD,cAAQ,eAAe,IAAI,UAAU,QAAQ,KAAK,KAAK;AAAA,IAC3D;AAAA,EACJ;AACJ;AAEA,SAAS,iBAAiB,SAAc,mBAAwB;AAC5D,MAAI,gBAAgB,CAAC;AACrB,aAAW,WAAW,mBAAmB;AACrC,QAAI,QAAQ,MAAM,UAAU;AACxB,oBAAc,QAAQ,IAAI,IAAI,QAAQ;AAAA,IAC1C;AAAA,EACJ;AAEA,MAAI,QAAQ,wBAAwB;AAChC,aAAS,QAAQ,GAAG,QAAQ,QAAQ,uBAAuB,QAAQ,SAAS;AACxE,YAAM,QAAQ,QAAQ,uBAAuB,KAAK;AAClD,UAAI,MAAM,QAAQ,MAAM,MAAM,SAAS,MAAM,MAAM,QAAQ,QAAQ,MAAM,SAAS,MAAM;AACpF,sBAAc,MAAM,IAAI,IAAI,MAAM;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,eAAe,SAAc,mBAAwB;AAC1D,MAAI,cAAc,CAAC;AACnB,aAAW,WAAW,mBAAmB;AACrC,QAAI,QAAQ,MAAM,SAAS;AACvB,UAAI,QAAQ,QAAQ,WAAY,QAAQ,UAAU,QAAQ,QAAQ,OAAO,QAAQ,SAAU;AACvF,YAAI,QAAQ,SAAS,MAAM;AACvB,mBAAS,QAAQ,GAAG,QAAQ,QAAQ,MAAM,QAAQ,SAAS;AACvD,wBAAY,KAAK,QAAQ,OAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,KAAK;AAAA,UACpE;AAAA,QACJ;AAAA,MACJ,OAAO;AACH,oBAAY,KAAK,QAAQ,OAAO,MAAM,QAAQ,KAAK;AAAA,MACvD;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,QAAQ,uBAAuB;AAC/B,aAAS,QAAQ,GAAG,QAAQ,QAAQ,sBAAsB,QAAQ,SAAS;AACvE,YAAM,QAAQ,QAAQ,sBAAsB,KAAK;AACjD,UAAI,MAAM,QAAQ,MAAM,MAAM,SAAS,MAAM,MAAM,QAAQ,QAAQ,MAAM,SAAS,MAAM;AACpF,oBAAY,KAAK,MAAM,OAAO,MAAM,MAAM,KAAK;AAAA,MACnD;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,mBAAmB,YAAiB;AACzC,MAAI,WAAW;AACf,QAAM,oBAAoB,WAAW;AACrC,MAAI,qBAAqB,MAAM;AAC3B,WAAO;AAAA,EACX;AAEA,MAAI,QAAQ;AACZ,aAAW,WAAW,mBAAmB;AACrC,QAAI,QAAQ,MAAM,YAAY;AAC1B,UAAI,SAAS,GAAG;AACZ,mBAAW,QAAQ,OAAO,MAAM,QAAQ;AAAA,MAC5C,OAAO;AACH,mBAAW,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ;AAAA,MAC7D;AACA;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,uBAAuB;AAC5B,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AAClE,WAAO;AAAA,EACX,WAAW,OAAO,YAAY,eAAe,QAAQ,YAAY,QAAQ,SAAS,MAAM;AACpF,WAAO;AAAA,EACX,OAAO;AACH,WAAO;AAAA,EACX;AACJ;AAGA,SAAS,YAAY;AACjB,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,SAAS,IAAI;AAC9B,MAAI,aAAa,UAAU,IAAI;AAC/B,MAAI,aAAa,WAAW,WAAW;AACvC,MAAI,aAAa,QAAQ,MAAM;AAC/B,MAAI,aAAa,SAAS,4BAA4B;AAEtD,QAAM,OAAO,SAAS,gBAAgB,8BAA8B,MAAM;AAC1E,OAAK,aAAa,KAAK,6BAA6B;AACpD,OAAK,aAAa,UAAU,uDAAuD;AACnF,OAAK,aAAa,gBAAgB,GAAG;AACrC,OAAK,aAAa,kBAAkB,OAAO;AAC3C,OAAK,aAAa,mBAAmB,OAAO;AAE5C,MAAI,YAAY,IAAI;AACpB,SAAO;AACX;AAEA,SAAS,eAAe,cAAmB,SAAc;AACrD,MAAI;AACJ,MAAI,aAAa,OAAO,MAAM,GAAG;AAC7B,gBAAY,WAAW,aAAa,OAAO,MAAM,GAAG,OAAO;AAAA,EAC/D,WAAW,aAAa,OAAO,MAAM,KAAK,SAAS;AAC/C,UAAM,UAAU,aAAa,OAAO,OAAO;AAC3C,QAAI,QAAQ,MAAM,GAAG;AACjB,kBAAY,WAAW,QAAQ,MAAM,GAAG,OAAO;AAAA,IACnD,WAAW,QAAQ,MAAM,GAAG;AACxB,kBAAY,aAAa,OAAO;AAAA,IACpC;AACA,gBAAY,CAAC,SAAS;AAAA,EAC1B;AACA,SAAO;AACX;AAEA,SAAS,WAAW,UAAe,QAAa;AAC5C,QAAM,QAAa,CAAC;AACpB,QAAM,WAAW,SAAS,UAAU,SAAS,YAAY,GAAG,IAAI,CAAC;AACjE,QAAM,MAAM,OAAO,QAAQ;AAC3B,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,OAAO;AACP,eAAW,OAAO,OAAO;AACrB,UAAI,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AAClD,cAAM,UAAU,MAAM,GAAG;AACzB,YAAI,QAAQ,eAAe,OAAO,KAAK,QAAQ,MAAM,KAAK,SAAS;AAC/D,cAAI,QAAQ,OAAO,EAAE,MAAM,GAAG;AAC1B,kBAAM,GAAG,IAAI,CAAC,WAAW,QAAQ,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;AAAA,UAC9D,WAAW,QAAQ,OAAO,EAAE,MAAM,GAAG;AACjC,kBAAM,GAAG,IAAI,CAAC,aAAa,QAAQ,OAAO,CAAC,CAAC;AAAA,UAChD;AAAA,QACJ,WAAW,QAAQ,eAAe,MAAM,GAAG;AACvC,gBAAM,GAAG,IAAI,WAAW,QAAQ,MAAM,GAAG,MAAM;AAAA,QACnD,OAAO;AACH,cAAI,QAAQ,MAAM,GAAG;AACjB,kBAAM,GAAG,IAAI,aAAa,OAAO;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,mBAAmB,UAAe,QAAa;AACpD,QAAM,QAAa,CAAC;AACpB,QAAM,WAAW,SAAS,UAAU,SAAS,YAAY,GAAG,IAAI,CAAC;AACjE,QAAM,MAAM,OAAO,QAAQ;AAC3B,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI,OAAO;AACP,eAAW,OAAO,OAAO;AACrB,UAAI,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AAClD,cAAM,UAAU,MAAM,GAAG;AACzB,YAAI;AACJ,YAAI,QAAQ,eAAe,OAAO,KAAK,QAAQ,MAAM,KAAK,SAAS;AAC/D,cAAI,QAAQ,OAAO,EAAE,MAAM,GAAG;AAC1B,uBAAW,CAAC,WAAW,QAAQ,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;AAAA,UAC5D,WAAW,QAAQ,OAAO,EAAE,MAAM,GAAG;AACjC,uBAAW,CAAC,aAAa,QAAQ,OAAO,CAAC,CAAC;AAAA,UAC9C;AACA,cAAI,UAAU;AACV,kBAAM,KAAK;AAAA,cACP,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,OAAO,KAAK,UAAU,QAAQ;AAAA,YAClC,CAAC;AAAA,UACL;AAAA,QACJ,WAAW,QAAQ,MAAM,GAAG;AACxB,gBAAM,KAAK;AAAA,YACP,MAAM,QAAQ,MAAM;AAAA,YACpB,QAAU,QAAQ,MAAM,KAAK,aAAa,QAAQ,MAAM,KAAK,WAAY,WAAW;AAAA,YACpF,MAAM;AAAA,YACN,OAAO,aAAa,OAAO;AAAA,UAC/B,CAAC;AAAA,QACL,WAAW,QAAQ,MAAM,GAAG;AACxB,gBAAM,YAAY,WAAW,QAAQ,MAAM,GAAG,MAAM;AACpD,gBAAM,KAAK;AAAA,YACP,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO,KAAK,UAAU,SAAS;AAAA,UACnC,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,uBAAuB,cAAmB,SAAc;AAC7D,MAAI,YAAiB,CAAC;AACtB,MAAI,aAAa,OAAO,MAAM,GAAG;AAC7B,gBAAY,mBAAmB,aAAa,OAAO,MAAM,GAAG,OAAO;AAAA,EACvE;AACA,SAAO;AACX;AAEA,SAAS,aAAa,SAAc;AAChC,MAAI;AACJ,MAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,GAAG;AACrC,QAAI,QAAQ,MAAM,GAAG;AACjB,qBAAe,QAAQ,MAAM,EAAE,CAAC;AAAA,IACpC,OAAO;AACH,qBAAe;AAAA,IACnB;AAAA,EACJ,WAAW,QAAQ,MAAM,EAAE,SAAS,SAAS,GAAG;AAC5C,mBAAe;AAAA,EACnB,WAAW,QAAQ,MAAM,EAAE,SAAS,QAAQ,GAAG;AAC3C,QAAI,QAAQ,MAAM,GAAG;AACjB,qBAAe,QAAQ,MAAM,EAAE,CAAC;AAAA,IACpC,OAAO;AACH,qBAAe;AAAA,IACnB;AAAA,EACJ;AAGA,MAAI,QAAQ,SAAS,GAAG;AACpB,mBAAe,QAAQ,SAAS;AAAA,EACpC;AAGA,MAAI,QAAQ,SAAS,GAAG;AACpB,mBAAe,QAAQ,SAAS;AAAA,EACpC;AAEA,SAAO;AACX;AAEA,SAAS,iBAAiB,SAAc;AACpC,MAAI,QAAQ,MAAM,EAAE,SAAS,SAAS,GAAG;AACrC,WAAO;AAAA,EACX,WAAW,QAAQ,MAAM,EAAE,SAAS,SAAS,GAAG;AAC5C,WAAO;AAAA,EACX,WAAW,QAAQ,MAAM,EAAE,SAAS,QAAQ,GAAG;AAC3C,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAGA,IAAM,eAAe,CAAC,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,SAAS,OAAO;AAGzF,SAAS,aAAa,QAAsC;AACxD,SAAQ,aAAmC,SAAS,MAAM;AAC9D;AAGA,SAAS,iBAAiB,aAAiC,eAAqB,aAAsB;AAClG,QAAM,kBAAuB,CAAC;AAE9B,QAAM,cAAgE,CAAC;AACvE,aAAW,QAAQ,YAAY,OAAO;AAClC,QAAI,OAAO,UAAU,eAAe,KAAK,YAAY,OAAO,IAAI,GAAG;AAC/D,kBAAY,KAAK,CAAC,MAAM,YAAY,MAAM,IAAI,CAAC,CAAC;AAAA,IACpD;AAAA,EACJ;AAEA,cAAY,QAAQ,CAAC,CAAC,MAAM,QAAQ,MAAM;AACtC,UAAM,kBAAyD,CAAC;AAChE,eAAW,UAAU,UAAU;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,MAAM,GAAG;AAExD,YAAI,aAAa,MAAM,GAAG;AACtB,gBAAM,YAAY,SAAS,MAA+B;AAC1D,cAAI,aAAa,QAAQ,OAAO,cAAc,YAAY,EAAE,UAAU,YAAY;AAE9E,4BAAgB,KAAK,CAAC,QAAQ,SAAsC,CAAC;AAAA,UACzE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,oBAAgB,QAAQ,CAAC,CAAC,QAAQ,SAAS,MAAM;AAE7C,UAAI,MAAM;AACV,UAAI,eAAe;AACf,cAAM,cAAc,QAAQ,UAAU,cAAc,QAAQ;AAAA,MAChE,WAAW,YAAY,WAAW,YAAY,QAAQ,SAAS,GAAG;AAC9D,cAAM,YAAY,QAAQ,CAAC,EAAE,MAAM;AAAA,MACvC;AAEA,YAAM,cAAmB;AAAA,QACrB,QAAQ,OAAO,YAAY;AAAA,QAC3B;AAAA,QACA,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,UAAU,CAAC;AAAA,QACX,MAAM,CAAC;AAAA,MACX;AAEA,UAAI,WAAW;AA2BX,YAAI,YAAY,WAAW,YAAY;AACnC,gBAAM,gBAAgB,YAAY,WAAW,WAAW,OAAO,CAAC,QAAa,IAAI,MAAM,MAAM;AAC7F,cAAI,iBAAiB,cAAc,SAAS,GAAG;AAC3C,wBAAY,aAAa,IAAI;AAAA,cACzB,SAAS,CAAC;AAAA,YACd;AACA,wBAAY,UAAU,IAAI,YAAY,WAAW,UAAU;AAC3D,kBAAM,iBAAiB,YAAY,WAAW,UAAU,EAAE,SAAS,IAAI,YAAY,WAAW,UAAU,EAAE,CAAC,IAAI;AAC/G,wBAAY,gBAAgB,IAAI;AAChC,gBAAI,cAAmB,eAAe,cAAc,CAAC,GAAG,YAAY,aAAa,CAAC;AAClF,wBAAY,aAAa,EAAE,SAAS,EAAE,cAAc,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC;AAC3F,wBAAY,kBAAkB,IAAI;AAAA,UACtC,OAAO;AACH,uBAAW,aAAa,YAAY,WAAW,YAAY;AACvD,kBAAI,UAAU,MAAM,WAAW,UAAU,MAAM,YAAY,UAAU,MAAM,UAAU,UAAU,MAAM,YAAY;AAC7G,oBAAI,UAAU,QAAQ,aAAc,UAAU,UAAU,QAAQ,UAAU,OAAO,QAAQ,aAClF,UAAU,QAAQ,YAAa,UAAU,UAAU,QAAQ,UAAU,OAAO,QAAQ,UAAW;AAClG,4BAAU,SAAS;AAAA,gBACvB;AACA,oBAAI,UAAU,QAAQ,YAAa,UAAU,UAAU,QAAQ,UAAU,OAAO,QAAQ,UAAW;AAC/F,4BAAU,SAAS;AAAA,gBACvB;AACA,oBAAI,UAAU,QAAQ,aAAc,UAAU,UAAU,QAAQ,UAAU,OAAO,QAAQ,WAAY;AACjG,4BAAU,SAAS;AAAA,gBACvB;AAAA,cACJ;AAAA,YACJ;AACA,kBAAM,oBAAoB,YAAY,WAAW,WAAW,OAAO,CAAC,QAAa,IAAI,MAAM,UAAU;AACrG,gBAAI,qBAAqB,kBAAkB,SAAS,GAAG;AACnD,0BAAY,0BAA0B,IAAI;AAAA,YAC9C;AAEA,uBAAW,SAAS,YAAY,WAAW,YAAY;AACnD,oBAAM,cAAc,MAAM;AAC1B,kBAAI,eAAe,YAAY,MAAM,GAAG;AACpC,sBAAM,WAAW,YAAY,MAAM,EAAE,UAAU,YAAY,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;AACvF,oBAAI,eAAe,YAAY,YAAY,KAAK,QAAQ,YAAY,YAAY,EAAE,SAAS,KAAG,MAAM;AAChG,wBAAM,MAAM,YAAY,YAAY,KAAK,OAAO,YAAY,YAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAC,MAAM,GAAE;AAC1G,wBAAM,OAAO,iBAAiB,GAAG;AACjC,wBAAM,SAAU,MAAM,QAAQ,aAAa,MAAM,QAAQ,WAAY,WAAW;AAChF,wBAAM,QAAQ,aAAa,GAAG;AAAA,gBAClC;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAGA,YAAI,YAAY,WAAW,aAAa;AACpC,gBAAM,UAAU,YAAY,WAAW,YAAY;AACnD,sBAAY,aAAa,IAAI;AAAA,YACzB,SAAS,CAAC;AAAA,UACd;AAEA,qBAAW,OAAO,SAAS;AACvB,gBAAI,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,GAAG;AACpD,oBAAM,UAAU,QAAQ,GAAG;AAC3B,0BAAY,UAAU,GAAG,KAAK,GAAG;AACjC,kBAAI,SAAS;AACT,oBAAI,QAAQ,UAAU,QAAW;AAC7B,0BAAQ,IAAI,eAAe,IAAI;AAC/B,0BAAQ,IAAI,WAAW,GAAG;AAC1B,0BAAQ,IAAI,eAAe,OAAO;AAClC,0BAAQ,IAAI,0CAA0C,OAAO;AAC7D;AAAA,gBACJ;AACA,oBAAI,OAAO,uCAAuC,OAAO,uBAAuB;AAC5E,sBAAI,cAAmB,eAAe,SAAS,YAAY,YAAY,EAAG,SAAS,CAAC;AACpF,8BAAY,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,gBACpF,OAAO;AACH,sBAAI,sBAA2B,uBAAuB,SAAS,YAAY,YAAY,EAAG,SAAS,CAAC;AACpG,8BAAY,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI;AAAA,gBACjD;AACA,4BAAY,kBAAkB,IAAI;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AACA,cAAI,YAAY,UAAU;AACtB,gBAAI,YAAY,SAAS,SAAS,GAAG;AACjC,0BAAY,gBAAgB,IAAI,YAAY,UAAU,EAAE,CAAC;AAAA,YAC7D;AAAA,UACJ;AAAA,QACJ;AAGA,wBAAgB,KAAK,WAAW;AAAA,MACpC;AAAA,IAEJ,CAAC;AAAA,EACL,CAAC;AAED,SAAO;AACX;AAEA,SAAS,aAAa,aAAiC;AACnD,MAAI,WAAW;AACf,QAAM,cAAgE,CAAC;AACvE,aAAW,QAAQ,YAAY,OAAO;AAClC,QAAI,OAAO,UAAU,eAAe,KAAK,YAAY,OAAO,IAAI,GAAG;AAC/D,kBAAY,KAAK,CAAC,MAAM,YAAY,MAAM,IAAI,CAAC,CAAC;AAAA,IACpD;AAAA,EACJ;AAGA,cAAY,QAAQ,CAAC,CAAC,MAAM,QAAQ,MAAM;AACtC,UAAM,kBAAyD,CAAC;AAChE,eAAW,UAAU,UAAU;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,MAAM,GAAG;AAExD,YAAI,aAAa,MAAM,GAAG;AACtB,gBAAM,YAAY,SAAS,MAA+B;AAC1D,cAAI,aAAa,QAAQ,OAAO,cAAc,YAAY,EAAE,UAAU,YAAY;AAE9E,4BAAgB,KAAK,CAAC,QAAQ,SAAsC,CAAC;AAAA,UACzE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,oBAAgB,QAAQ,CAAC,CAAC,QAAQ,SAAS,MAAM;AAC7C,iBAAW,WAAW;AAAA,IAC1B,CAAC;AAAA,EACL,CAAC;AAED,SAAO;AACX;","names":["getUrlParams","redirectToAuth","endTime"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -9,7 +9,7 @@ declare class ApiRenderer {
|
|
|
9
9
|
container: any;
|
|
10
10
|
private static globalStyleInjected;
|
|
11
11
|
constructor(options: any);
|
|
12
|
-
render(apiSpec: OpenAPIV3CustomDoc, renderUnit?: boolean): void;
|
|
12
|
+
render(apiSpec: OpenAPIV3CustomDoc, currentServer?: any, serviceName?: string, renderUnit?: boolean): void;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export { ApiRenderer };
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ declare class ApiRenderer {
|
|
|
9
9
|
container: any;
|
|
10
10
|
private static globalStyleInjected;
|
|
11
11
|
constructor(options: any);
|
|
12
|
-
render(apiSpec: OpenAPIV3CustomDoc, renderUnit?: boolean): void;
|
|
12
|
+
render(apiSpec: OpenAPIV3CustomDoc, currentServer?: any, serviceName?: string, renderUnit?: boolean): void;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export { ApiRenderer };
|