api-render-ui 1.0.5 → 1.0.6

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/Readme.md CHANGED
@@ -15,7 +15,12 @@ api-render-ui is a UI library that pursues simple and efficient data rendering f
15
15
  [![NPM Downloads][npm-downloads-image]][npm-downloads-url]
16
16
  [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer]
17
17
 
18
-
18
+ ### Usage in typescript project
19
+ - Please install first
20
+ ```
21
+ npm install api-render-ui
22
+ ```
23
+ - Your typescript code
19
24
  ```typescript
20
25
  import { ApiRenderer } from "api-render-ui"
21
26
 
@@ -25,6 +30,8 @@ api-render-ui is a UI library that pursues simple and efficient data rendering f
25
30
  // 执行渲染
26
31
  apiRenderer.render(openapiSpec);
27
32
  ```
33
+ ### Usage in single html
34
+ Please refer to [example](example/animal.html)
28
35
 
29
36
  ## Installation
30
37
 
@@ -1,3 +1,29 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ ApiRenderer: () => ApiRenderer
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+
1
27
  // src/inlined-styles.ts
2
28
  var GLOBAL_STYLES = `.codigma-apioperatorlist {
3
29
  align-items: flex-start;
@@ -1018,7 +1044,8 @@ function countOpenAPI(openapiSpec) {
1018
1044
  });
1019
1045
  return apiCount;
1020
1046
  }
1021
- export {
1047
+ // Annotate the CommonJS export names for ESM import in node:
1048
+ 0 && (module.exports = {
1022
1049
  ApiRenderer
1023
- };
1024
- //# sourceMappingURL=index.mjs.map
1050
+ });
1051
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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 height: 100%;\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 background: #F0F1F4;\r\n display: inline-flex;\r\n gap: 10px;\r\n height: 48px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apioperator:hover {\r\n cursor: pointer;\r\n}\r\n.codigma-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: 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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\r\n word-wrap: break-word\r\n}\r\n.codigma-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 100%;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 114px;\r\n justify-content: flex-start;\r\n padding-right: 5px\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 }\r\n\r\nexport class ApiRenderer {\r\n options: any;\r\n container: any;\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 // 动态创建 <style> 标签并插入全局样式\r\n const styleEl = document.createElement('style');\r\n styleEl.textContent = text;\r\n document.head.appendChild(styleEl);\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\nfunction renderApiUnit(apiOperator: any, containerRef: any, elementMap: any) {\r\n return function (evt: any) {\r\n console.log('点击的API操作:');\r\n console.log('方法:', apiOperator.method);\r\n console.log('URL:', apiOperator.url);\r\n console.log('------------------------');\r\n\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.requestBody);\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 console.log('当前值:', e.target.value);\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 console.log('当前值:', e.target.value);\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 let auths = apiOperator.auths || []\r\n const authTypeRow = createSelectRow(auths, authValues)\r\n if (auths.length > 0) {\r\n let parameters = apiOperator.auths[0].parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(authTypeRow, ...authRows);\r\n }\r\n\r\n authSection.append(authCnr, authValues);\r\n return authSection;\r\n}\r\n\r\nfunction createSectionRequestBody(requestBody: 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 const bodyValue = document.createElement('textarea');\r\n bodyValue.setAttribute('data-layer', 'bodyTextValue');\r\n bodyValue.className = 'Id0CategoryId0NameNamePhotourlsTagsId0NameStatusAvailable codigma-apiunit-parakeyvalues';\r\n bodyValue.value = JSON.stringify(requestBody);\r\n bodySection.appendChild(bodyValue);\r\n return bodySection;\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 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 console.log('当前值:', e.target.value);\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(auths: any, authValues: 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', \"type\");\r\n typeLabel.className = 'type codigma-apiunit-send';\r\n typeLabel.textContent = 'Type:';\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 auths.forEach((auth: any) => {\r\n const option1 = document.createElement('option');\r\n option1.value = auth[\"type\"];\r\n option1.textContent = auth[\"type\"];\r\n selectElement.appendChild(option1);\r\n })\r\n\r\n // 添加选择事件监听\r\n selectElement.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 let parameters = auth.parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(...authRows);\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\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\n\r\nfunction sendRequest(apiOperator: any, responseSectionRef: any) {\r\n // 防御性检查:确保传入了 responseSectionRef,避免后续调用 querySelector 时抛出错误\r\n if (!responseSectionRef) {\r\n console.error('sendRequest: missing responseSectionRef. Aborting request to avoid runtime errors.');\r\n return;\r\n }\r\n let reuqestUrl = getRequestUrl(apiOperator);\r\n const result = checkIfParameter(apiOperator);\r\n\r\n let header = result.hasRequestBody ? 'application/json' :\r\n (result.hasRequestFormData ? 'application/x-www-form-urlencoded' : 'application/json');\r\n let headers: any = {\r\n 'Content-Type': header\r\n }\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customHeaderparameters.length; index++) {\r\n const paras = apiOperator.customHeaderparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n headers[paras.name] = paras.value\r\n }\r\n }\r\n }\r\n\r\n let body = result.hasRequestBody ? apiOperator.requestBody :\r\n (result.hasRequestFormData ? getRequestFormData(apiOperator.rawApiInfo) : null);\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n if (apiOperator.method.toUpperCase() == \"POST\" || apiOperator.method.toUpperCase() == \"PUT\") {\r\n body = apiOperator.requestBody;\r\n }\r\n }\r\n\r\n apiOperator.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: apiOperator.method.toUpperCase(),\r\n headers: headers,\r\n body: body != null ? JSON.stringify(body) : null,\r\n signal: signal\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n apiOperator.response = {\r\n status: response.status,\r\n statusText: response.statusText\r\n }\r\n\r\n const endTime = Date.now(); // 即使在错误的情况下也记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime);\r\n apiOperator.ifSendingRequest = false;\r\n // apiOperator.responseJsoneditor.value = \"\";\r\n throw new Error('Network response was not ok.');\r\n }\r\n const endTime = Date.now(); // 记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime); // 计算耗时\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n responsebodyElement.removeChild(overlayLayerContainer);\r\n\r\n apiOperator.ifSendingRequest = false;\r\n apiOperator.response = {\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 apiOperator.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 responsebodyElement.textContent = JSON.stringify(data, null, 4)\r\n } else {\r\n // 假设 data 是文本字符串,你可以在这里处理它 \r\n console.log('Received text:', data);\r\n responsebodyElement.textContent = data;\r\n }\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 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 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\nfunction checkIfParameter(apiOperator: any) {\r\n let hasRequestBody = false;\r\n let hasRequestFormData = false;\r\n const parameters = apiOperator.rawApiInfo.parameters;\r\n if (parameters) {\r\n for (let index = 0; index < parameters.length; index++) {\r\n const parameter = parameters[index];\r\n if (parameter.in == \"query\" || parameter.in == \"path\") {\r\n } else if (parameter.in == \"body\") {\r\n hasRequestBody = true;\r\n parameter.name = parameter.name.charAt(0).toUpperCase() + parameter.name.slice(1);\r\n } else if (parameter.in == \"formData\") {\r\n hasRequestFormData = true;\r\n }\r\n }\r\n }\r\n\r\n //support openapi 3.0\r\n const requestBody = apiOperator.rawApiInfo.requestBody;\r\n if (requestBody) {\r\n hasRequestBody = true;\r\n }\r\n // 返回包含两个状态的对象\r\n return { hasRequestBody, hasRequestFormData };\r\n}\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n let totalSeconds: string | number = Math.floor(milliseconds / 1000);\r\n let seconds: string | number = totalSeconds % 60;\r\n let minutes: string | number = Math.floor(totalSeconds / 60) % 60;\r\n let hours: string | number = Math.floor(totalSeconds / (60 * 60));\r\n\r\n // 毫秒部分 \r\n let millisecondsPart: string | number = 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 getRequestUrl(apiOperator: any) {\r\n let reuqestUrl = apiOperator.url;\r\n\r\n const requestParameters = apiOperator.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(apiOperator, requestParameters);\r\n reuqestUrl = queryParams.length > 0 ? (reuqestUrl + \"?\" + queryParams.join(\"&\")) : reuqestUrl;\r\n\r\n return reuqestUrl;\r\n}\r\n\r\nfunction getQueryParams(apiOperator: 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 (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customQueryparameters.length; index++) {\r\n const paras = apiOperator.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\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 && parameterObj.schema) {\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 }\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 parseElement(element: any) {\r\n let elementValue;\r\n if (element['type'].includes('integer')) {\r\n elementValue = 0;\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 if (element['example']) {\r\n elementValue = element['example'];\r\n }\r\n\r\n return elementValue;\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: 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 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 apiOperator.rawApiInfo = operation;\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":["endTime"]}
package/dist/index.js CHANGED
@@ -1,29 +1,3 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- ApiRenderer: () => ApiRenderer
24
- });
25
- module.exports = __toCommonJS(index_exports);
26
-
27
1
  // src/inlined-styles.ts
28
2
  var GLOBAL_STYLES = `.codigma-apioperatorlist {
29
3
  align-items: flex-start;
@@ -1044,8 +1018,7 @@ function countOpenAPI(openapiSpec) {
1044
1018
  });
1045
1019
  return apiCount;
1046
1020
  }
1047
- // Annotate the CommonJS export names for ESM import in node:
1048
- 0 && (module.exports = {
1021
+ export {
1049
1022
  ApiRenderer
1050
- });
1023
+ };
1051
1024
  //# sourceMappingURL=index.js.map
package/dist/index.js.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 height: 100%;\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 background: #F0F1F4;\r\n display: inline-flex;\r\n gap: 10px;\r\n height: 48px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apioperator:hover {\r\n cursor: pointer;\r\n}\r\n.codigma-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: 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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\r\n word-wrap: break-word\r\n}\r\n.codigma-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 100%;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 114px;\r\n justify-content: flex-start;\r\n padding-right: 5px\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 }\r\n\r\nexport class ApiRenderer {\r\n options: any;\r\n container: any;\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 // 动态创建 <style> 标签并插入全局样式\r\n const styleEl = document.createElement('style');\r\n styleEl.textContent = text;\r\n document.head.appendChild(styleEl);\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\nfunction renderApiUnit(apiOperator: any, containerRef: any, elementMap: any) {\r\n return function (evt: any) {\r\n console.log('点击的API操作:');\r\n console.log('方法:', apiOperator.method);\r\n console.log('URL:', apiOperator.url);\r\n console.log('------------------------');\r\n\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.requestBody);\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 console.log('当前值:', e.target.value);\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 console.log('当前值:', e.target.value);\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 let auths = apiOperator.auths || []\r\n const authTypeRow = createSelectRow(auths, authValues)\r\n if (auths.length > 0) {\r\n let parameters = apiOperator.auths[0].parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(authTypeRow, ...authRows);\r\n }\r\n\r\n authSection.append(authCnr, authValues);\r\n return authSection;\r\n}\r\n\r\nfunction createSectionRequestBody(requestBody: 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 const bodyValue = document.createElement('textarea');\r\n bodyValue.setAttribute('data-layer', 'bodyTextValue');\r\n bodyValue.className = 'Id0CategoryId0NameNamePhotourlsTagsId0NameStatusAvailable codigma-apiunit-parakeyvalues';\r\n bodyValue.value = JSON.stringify(requestBody);\r\n bodySection.appendChild(bodyValue);\r\n return bodySection;\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 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 console.log('当前值:', e.target.value);\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(auths: any, authValues: 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', \"type\");\r\n typeLabel.className = 'type codigma-apiunit-send';\r\n typeLabel.textContent = 'Type:';\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 auths.forEach((auth: any) => {\r\n const option1 = document.createElement('option');\r\n option1.value = auth[\"type\"];\r\n option1.textContent = auth[\"type\"];\r\n selectElement.appendChild(option1);\r\n })\r\n\r\n // 添加选择事件监听\r\n selectElement.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 let parameters = auth.parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(...authRows);\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\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\n\r\nfunction sendRequest(apiOperator: any, responseSectionRef: any) {\r\n // 防御性检查:确保传入了 responseSectionRef,避免后续调用 querySelector 时抛出错误\r\n if (!responseSectionRef) {\r\n console.error('sendRequest: missing responseSectionRef. Aborting request to avoid runtime errors.');\r\n return;\r\n }\r\n let reuqestUrl = getRequestUrl(apiOperator);\r\n const result = checkIfParameter(apiOperator);\r\n\r\n let header = result.hasRequestBody ? 'application/json' :\r\n (result.hasRequestFormData ? 'application/x-www-form-urlencoded' : 'application/json');\r\n let headers: any = {\r\n 'Content-Type': header\r\n }\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customHeaderparameters.length; index++) {\r\n const paras = apiOperator.customHeaderparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n headers[paras.name] = paras.value\r\n }\r\n }\r\n }\r\n\r\n let body = result.hasRequestBody ? apiOperator.requestBody :\r\n (result.hasRequestFormData ? getRequestFormData(apiOperator.rawApiInfo) : null);\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n if (apiOperator.method.toUpperCase() == \"POST\" || apiOperator.method.toUpperCase() == \"PUT\") {\r\n body = apiOperator.requestBody;\r\n }\r\n }\r\n\r\n apiOperator.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: apiOperator.method.toUpperCase(),\r\n headers: headers,\r\n body: body != null ? JSON.stringify(body) : null,\r\n signal: signal\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n apiOperator.response = {\r\n status: response.status,\r\n statusText: response.statusText\r\n }\r\n\r\n const endTime = Date.now(); // 即使在错误的情况下也记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime);\r\n apiOperator.ifSendingRequest = false;\r\n // apiOperator.responseJsoneditor.value = \"\";\r\n throw new Error('Network response was not ok.');\r\n }\r\n const endTime = Date.now(); // 记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime); // 计算耗时\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n responsebodyElement.removeChild(overlayLayerContainer);\r\n\r\n apiOperator.ifSendingRequest = false;\r\n apiOperator.response = {\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 apiOperator.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 responsebodyElement.textContent = JSON.stringify(data, null, 4)\r\n } else {\r\n // 假设 data 是文本字符串,你可以在这里处理它 \r\n console.log('Received text:', data);\r\n responsebodyElement.textContent = data;\r\n }\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 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 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\nfunction checkIfParameter(apiOperator: any) {\r\n let hasRequestBody = false;\r\n let hasRequestFormData = false;\r\n const parameters = apiOperator.rawApiInfo.parameters;\r\n if (parameters) {\r\n for (let index = 0; index < parameters.length; index++) {\r\n const parameter = parameters[index];\r\n if (parameter.in == \"query\" || parameter.in == \"path\") {\r\n } else if (parameter.in == \"body\") {\r\n hasRequestBody = true;\r\n parameter.name = parameter.name.charAt(0).toUpperCase() + parameter.name.slice(1);\r\n } else if (parameter.in == \"formData\") {\r\n hasRequestFormData = true;\r\n }\r\n }\r\n }\r\n\r\n //support openapi 3.0\r\n const requestBody = apiOperator.rawApiInfo.requestBody;\r\n if (requestBody) {\r\n hasRequestBody = true;\r\n }\r\n // 返回包含两个状态的对象\r\n return { hasRequestBody, hasRequestFormData };\r\n}\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n let totalSeconds: string | number = Math.floor(milliseconds / 1000);\r\n let seconds: string | number = totalSeconds % 60;\r\n let minutes: string | number = Math.floor(totalSeconds / 60) % 60;\r\n let hours: string | number = Math.floor(totalSeconds / (60 * 60));\r\n\r\n // 毫秒部分 \r\n let millisecondsPart: string | number = 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 getRequestUrl(apiOperator: any) {\r\n let reuqestUrl = apiOperator.url;\r\n\r\n const requestParameters = apiOperator.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(apiOperator, requestParameters);\r\n reuqestUrl = queryParams.length > 0 ? (reuqestUrl + \"?\" + queryParams.join(\"&\")) : reuqestUrl;\r\n\r\n return reuqestUrl;\r\n}\r\n\r\nfunction getQueryParams(apiOperator: 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 (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customQueryparameters.length; index++) {\r\n const paras = apiOperator.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\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 && parameterObj.schema) {\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 }\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 parseElement(element: any) {\r\n let elementValue;\r\n if (element['type'].includes('integer')) {\r\n elementValue = 0;\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 if (element['example']) {\r\n elementValue = element['example'];\r\n }\r\n\r\n return elementValue;\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: 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 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 apiOperator.rawApiInfo = operation;\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":["endTime"]}
1
+ {"version":3,"sources":["../src/inlined-styles.ts","../src/api-render-ui.ts"],"sourcesContent":["// 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 height: 100%;\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 background: #F0F1F4;\r\n display: inline-flex;\r\n gap: 10px;\r\n height: 48px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apioperator:hover {\r\n cursor: pointer;\r\n}\r\n.codigma-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: 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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\r\n word-wrap: break-word\r\n}\r\n.codigma-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 100%;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 114px;\r\n justify-content: flex-start;\r\n padding-right: 5px\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 }\r\n\r\nexport class ApiRenderer {\r\n options: any;\r\n container: any;\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 // 动态创建 <style> 标签并插入全局样式\r\n const styleEl = document.createElement('style');\r\n styleEl.textContent = text;\r\n document.head.appendChild(styleEl);\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\nfunction renderApiUnit(apiOperator: any, containerRef: any, elementMap: any) {\r\n return function (evt: any) {\r\n console.log('点击的API操作:');\r\n console.log('方法:', apiOperator.method);\r\n console.log('URL:', apiOperator.url);\r\n console.log('------------------------');\r\n\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.requestBody);\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 console.log('当前值:', e.target.value);\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 console.log('当前值:', e.target.value);\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 let auths = apiOperator.auths || []\r\n const authTypeRow = createSelectRow(auths, authValues)\r\n if (auths.length > 0) {\r\n let parameters = apiOperator.auths[0].parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(authTypeRow, ...authRows);\r\n }\r\n\r\n authSection.append(authCnr, authValues);\r\n return authSection;\r\n}\r\n\r\nfunction createSectionRequestBody(requestBody: 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 const bodyValue = document.createElement('textarea');\r\n bodyValue.setAttribute('data-layer', 'bodyTextValue');\r\n bodyValue.className = 'Id0CategoryId0NameNamePhotourlsTagsId0NameStatusAvailable codigma-apiunit-parakeyvalues';\r\n bodyValue.value = JSON.stringify(requestBody);\r\n bodySection.appendChild(bodyValue);\r\n return bodySection;\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 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 console.log('当前值:', e.target.value);\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(auths: any, authValues: 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', \"type\");\r\n typeLabel.className = 'type codigma-apiunit-send';\r\n typeLabel.textContent = 'Type:';\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 auths.forEach((auth: any) => {\r\n const option1 = document.createElement('option');\r\n option1.value = auth[\"type\"];\r\n option1.textContent = auth[\"type\"];\r\n selectElement.appendChild(option1);\r\n })\r\n\r\n // 添加选择事件监听\r\n selectElement.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 let parameters = auth.parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(...authRows);\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\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\n\r\nfunction sendRequest(apiOperator: any, responseSectionRef: any) {\r\n // 防御性检查:确保传入了 responseSectionRef,避免后续调用 querySelector 时抛出错误\r\n if (!responseSectionRef) {\r\n console.error('sendRequest: missing responseSectionRef. Aborting request to avoid runtime errors.');\r\n return;\r\n }\r\n let reuqestUrl = getRequestUrl(apiOperator);\r\n const result = checkIfParameter(apiOperator);\r\n\r\n let header = result.hasRequestBody ? 'application/json' :\r\n (result.hasRequestFormData ? 'application/x-www-form-urlencoded' : 'application/json');\r\n let headers: any = {\r\n 'Content-Type': header\r\n }\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customHeaderparameters.length; index++) {\r\n const paras = apiOperator.customHeaderparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n headers[paras.name] = paras.value\r\n }\r\n }\r\n }\r\n\r\n let body = result.hasRequestBody ? apiOperator.requestBody :\r\n (result.hasRequestFormData ? getRequestFormData(apiOperator.rawApiInfo) : null);\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n if (apiOperator.method.toUpperCase() == \"POST\" || apiOperator.method.toUpperCase() == \"PUT\") {\r\n body = apiOperator.requestBody;\r\n }\r\n }\r\n\r\n apiOperator.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: apiOperator.method.toUpperCase(),\r\n headers: headers,\r\n body: body != null ? JSON.stringify(body) : null,\r\n signal: signal\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n apiOperator.response = {\r\n status: response.status,\r\n statusText: response.statusText\r\n }\r\n\r\n const endTime = Date.now(); // 即使在错误的情况下也记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime);\r\n apiOperator.ifSendingRequest = false;\r\n // apiOperator.responseJsoneditor.value = \"\";\r\n throw new Error('Network response was not ok.');\r\n }\r\n const endTime = Date.now(); // 记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime); // 计算耗时\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n responsebodyElement.removeChild(overlayLayerContainer);\r\n\r\n apiOperator.ifSendingRequest = false;\r\n apiOperator.response = {\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 apiOperator.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 responsebodyElement.textContent = JSON.stringify(data, null, 4)\r\n } else {\r\n // 假设 data 是文本字符串,你可以在这里处理它 \r\n console.log('Received text:', data);\r\n responsebodyElement.textContent = data;\r\n }\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 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 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\nfunction checkIfParameter(apiOperator: any) {\r\n let hasRequestBody = false;\r\n let hasRequestFormData = false;\r\n const parameters = apiOperator.rawApiInfo.parameters;\r\n if (parameters) {\r\n for (let index = 0; index < parameters.length; index++) {\r\n const parameter = parameters[index];\r\n if (parameter.in == \"query\" || parameter.in == \"path\") {\r\n } else if (parameter.in == \"body\") {\r\n hasRequestBody = true;\r\n parameter.name = parameter.name.charAt(0).toUpperCase() + parameter.name.slice(1);\r\n } else if (parameter.in == \"formData\") {\r\n hasRequestFormData = true;\r\n }\r\n }\r\n }\r\n\r\n //support openapi 3.0\r\n const requestBody = apiOperator.rawApiInfo.requestBody;\r\n if (requestBody) {\r\n hasRequestBody = true;\r\n }\r\n // 返回包含两个状态的对象\r\n return { hasRequestBody, hasRequestFormData };\r\n}\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n let totalSeconds: string | number = Math.floor(milliseconds / 1000);\r\n let seconds: string | number = totalSeconds % 60;\r\n let minutes: string | number = Math.floor(totalSeconds / 60) % 60;\r\n let hours: string | number = Math.floor(totalSeconds / (60 * 60));\r\n\r\n // 毫秒部分 \r\n let millisecondsPart: string | number = 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 getRequestUrl(apiOperator: any) {\r\n let reuqestUrl = apiOperator.url;\r\n\r\n const requestParameters = apiOperator.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(apiOperator, requestParameters);\r\n reuqestUrl = queryParams.length > 0 ? (reuqestUrl + \"?\" + queryParams.join(\"&\")) : reuqestUrl;\r\n\r\n return reuqestUrl;\r\n}\r\n\r\nfunction getQueryParams(apiOperator: 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 (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customQueryparameters.length; index++) {\r\n const paras = apiOperator.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\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 && parameterObj.schema) {\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 }\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 parseElement(element: any) {\r\n let elementValue;\r\n if (element['type'].includes('integer')) {\r\n elementValue = 0;\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 if (element['example']) {\r\n elementValue = element['example'];\r\n }\r\n\r\n return elementValue;\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: 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 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 apiOperator.rawApiInfo = operation;\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":";AACO,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;AA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","names":["endTime"]}
@@ -0,0 +1,370 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Document</title>
8
+ </head>
9
+
10
+ <body>
11
+ <div id="notebook" style="overflow-y: auto;align-self: stretch;align-items: center;flex: 1 1 0;"></div>
12
+ <script type="module">
13
+ import { ApiRenderer } from "../dist/index.js"
14
+ const openapiSpec = {
15
+ "openapi": "3.1.0",
16
+ "info": {
17
+ "title": "ChimichangApp",
18
+ "summary": "Deadpool's favorite app. Nuff said.",
19
+ "description": "\nChimichangApp API helps you do awesome stuff. 🚀\n\n## Items\n\nYou can **read items**.\n\n## Users\n\nYou will be able to:\n\n* **Create users** (_not implemented_).\n* **Read users** (_not implemented_).\n",
20
+ "termsOfService": "http://example.com/terms/",
21
+ "contact": {
22
+ "name": "Deadpoolio the Amazing",
23
+ "url": "http://x-force.example.com/contact/",
24
+ "email": "dp@x-force.example.com"
25
+ },
26
+ "license": {
27
+ "name": "Apache 2.0",
28
+ "url": "https://www.apache.org/licenses/LICENSE-2.0.html"
29
+ },
30
+ "version": "0.0.1"
31
+ },
32
+ "paths": {
33
+ "/items/": {
34
+ "get": {
35
+ "summary": "Read Items",
36
+ "operationId": "read_items_items__get",
37
+ "responses": {
38
+ "200": {
39
+ "description": "Successful Response",
40
+ "content": {
41
+ "application/json": {
42
+ "schema": {}
43
+ }
44
+ }
45
+ }
46
+ }
47
+ },
48
+ "post": {
49
+ "summary": "Create Item",
50
+ "operationId": "create_item_items__post",
51
+ "requestBody": {
52
+ "content": {
53
+ "application/json": {
54
+ "schema": {
55
+ "$ref": "#/components/schemas/Item"
56
+ }
57
+ }
58
+ },
59
+ "required": true
60
+ },
61
+ "responses": {
62
+ "200": {
63
+ "description": "Successful Response",
64
+ "content": {
65
+ "application/json": {
66
+ "schema": {}
67
+ }
68
+ }
69
+ },
70
+ "422": {
71
+ "description": "Validation Error",
72
+ "content": {
73
+ "application/json": {
74
+ "schema": {
75
+ "$ref": "#/components/schemas/HTTPValidationError"
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ },
83
+ "/items/{item_id}": {
84
+ "get": {
85
+ "summary": "Read Root",
86
+ "operationId": "read_root_items__item_id__get",
87
+ "parameters": [
88
+ {
89
+ "name": "item_id",
90
+ "in": "path",
91
+ "required": true,
92
+ "schema": {
93
+ "type": "string",
94
+ "title": "Item Id"
95
+ }
96
+ }
97
+ ],
98
+ "responses": {
99
+ "200": {
100
+ "description": "Successful Response",
101
+ "content": {
102
+ "application/json": {
103
+ "schema": {}
104
+ }
105
+ }
106
+ },
107
+ "422": {
108
+ "description": "Validation Error",
109
+ "content": {
110
+ "application/json": {
111
+ "schema": {
112
+ "$ref": "#/components/schemas/HTTPValidationError"
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ },
120
+ "/": {
121
+ "get": {
122
+ "summary": "Root",
123
+ "operationId": "root__get",
124
+ "responses": {
125
+ "200": {
126
+ "description": "Successful Response",
127
+ "content": {
128
+ "application/json": {
129
+ "schema": {}
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ },
136
+ "/legacy/": {
137
+ "get": {
138
+ "summary": "Get Legacy Data",
139
+ "operationId": "get_legacy_data_legacy__get",
140
+ "responses": {
141
+ "200": {
142
+ "description": "Successful Response",
143
+ "content": {
144
+ "application/json": {
145
+ "schema": {}
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ },
152
+ "/login/": {
153
+ "post": {
154
+ "summary": "Login",
155
+ "description": "处理 application/x-www-form-urlencoded 的 POST 请求",
156
+ "operationId": "login_login__post",
157
+ "requestBody": {
158
+ "content": {
159
+ "application/x-www-form-urlencoded": {
160
+ "schema": {
161
+ "$ref": "#/components/schemas/Body_login_login__post"
162
+ }
163
+ }
164
+ },
165
+ "required": true
166
+ },
167
+ "responses": {
168
+ "200": {
169
+ "description": "Successful Response",
170
+ "content": {
171
+ "application/json": {
172
+ "schema": {}
173
+ }
174
+ }
175
+ },
176
+ "422": {
177
+ "description": "Validation Error",
178
+ "content": {
179
+ "application/json": {
180
+ "schema": {
181
+ "$ref": "#/components/schemas/HTTPValidationError"
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "/submit/": {
190
+ "post": {
191
+ "summary": "Submit Form",
192
+ "operationId": "submit_form_submit__post",
193
+ "requestBody": {
194
+ "content": {
195
+ "application/x-www-form-urlencoded": {
196
+ "schema": {
197
+ "$ref": "#/components/schemas/Body_submit_form_submit__post"
198
+ }
199
+ }
200
+ },
201
+ "required": true
202
+ },
203
+ "responses": {
204
+ "200": {
205
+ "description": "Successful Response",
206
+ "content": {
207
+ "application/json": {
208
+ "schema": {}
209
+ }
210
+ }
211
+ },
212
+ "422": {
213
+ "description": "Validation Error",
214
+ "content": {
215
+ "application/json": {
216
+ "schema": {
217
+ "$ref": "#/components/schemas/HTTPValidationError"
218
+ }
219
+ }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
225
+ },
226
+ "components": {
227
+ "schemas": {
228
+ "Body_login_login__post": {
229
+ "properties": {
230
+ "username": {
231
+ "type": "string",
232
+ "title": "Username"
233
+ },
234
+ "password": {
235
+ "type": "string",
236
+ "title": "Password"
237
+ }
238
+ },
239
+ "type": "object",
240
+ "required": [
241
+ "username",
242
+ "password"
243
+ ],
244
+ "title": "Body_login_login__post"
245
+ },
246
+ "Body_submit_form_submit__post": {
247
+ "properties": {
248
+ "name": {
249
+ "type": "string",
250
+ "title": "Name"
251
+ },
252
+ "email": {
253
+ "type": "string",
254
+ "title": "Email"
255
+ },
256
+ "age": {
257
+ "type": "integer",
258
+ "title": "Age"
259
+ },
260
+ "is_active": {
261
+ "type": "boolean",
262
+ "title": "Is Active",
263
+ "default": true
264
+ }
265
+ },
266
+ "type": "object",
267
+ "required": [
268
+ "name",
269
+ "email"
270
+ ],
271
+ "title": "Body_submit_form_submit__post"
272
+ },
273
+ "HTTPValidationError": {
274
+ "properties": {
275
+ "detail": {
276
+ "items": {
277
+ "$ref": "#/components/schemas/ValidationError"
278
+ },
279
+ "type": "array",
280
+ "title": "Detail"
281
+ }
282
+ },
283
+ "type": "object",
284
+ "title": "HTTPValidationError"
285
+ },
286
+ "Item": {
287
+ "properties": {
288
+ "name": {
289
+ "type": "string",
290
+ "title": "Name"
291
+ },
292
+ "price": {
293
+ "type": "number",
294
+ "title": "Price"
295
+ },
296
+ "description": {
297
+ "anyOf": [
298
+ {
299
+ "type": "string"
300
+ },
301
+ {
302
+ "type": "null"
303
+ }
304
+ ],
305
+ "title": "Description"
306
+ },
307
+ "tax": {
308
+ "anyOf": [
309
+ {
310
+ "type": "number"
311
+ },
312
+ {
313
+ "type": "null"
314
+ }
315
+ ],
316
+ "title": "Tax"
317
+ }
318
+ },
319
+ "type": "object",
320
+ "required": [
321
+ "name",
322
+ "price"
323
+ ],
324
+ "title": "Item"
325
+ },
326
+ "ValidationError": {
327
+ "properties": {
328
+ "loc": {
329
+ "items": {
330
+ "anyOf": [
331
+ {
332
+ "type": "string"
333
+ },
334
+ {
335
+ "type": "integer"
336
+ }
337
+ ]
338
+ },
339
+ "type": "array",
340
+ "title": "Location"
341
+ },
342
+ "msg": {
343
+ "type": "string",
344
+ "title": "Message"
345
+ },
346
+ "type": {
347
+ "type": "string",
348
+ "title": "Error Type"
349
+ }
350
+ },
351
+ "type": "object",
352
+ "required": [
353
+ "loc",
354
+ "msg",
355
+ "type"
356
+ ],
357
+ "title": "ValidationError"
358
+ }
359
+ }
360
+ }
361
+ }
362
+ const apiRenderer = new ApiRenderer({
363
+ mountPoint: '#notebook', // 可以是选择器字符串
364
+ });
365
+ // 执行渲染
366
+ apiRenderer.render(openapiSpec);
367
+ </script>
368
+ </body>
369
+
370
+ </html>
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "api-render-ui",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "api-render-ui is a UI library that pursues simple and efficient data rendering for openapi.",
5
+ "type": "module",
5
6
  "main": "./dist/index.js",
6
7
  "module": "./dist/index.mjs",
7
8
  "types": "./dist/index.d.ts",
package/src/main.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { ApiRenderer } from 'api-render-ui';
2
+
3
+ const openapiSpec = {
4
+ // 你的 OpenAPI 文档
5
+ };
6
+
7
+ const renderer = new ApiRenderer({
8
+ mountPoint: '#notebook'
9
+ });
10
+ renderer.render(openapiSpec);
package/tsconfig.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "ES2022",
4
- "module": "commonjs",
4
+ "module": "ESNext",
5
5
  "lib": ["ES2022", "DOM", "DOM.Iterable"],
6
6
  "declaration": true,
7
7
  "declarationMap": true,
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/inlined-styles.ts","../src/api-render-ui.ts"],"sourcesContent":["// 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 height: 100%;\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 background: #F0F1F4;\r\n display: inline-flex;\r\n gap: 10px;\r\n height: 48px;\r\n justify-content: flex-start\r\n}\r\n.codigma-apioperator:hover {\r\n cursor: pointer;\r\n}\r\n.codigma-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: 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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\r\n word-wrap: break-word\r\n}\r\n.codigma-requrl {\r\n color: black;\r\n flex: 1 1 0;\r\n font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 100%;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 font-family: Inter;\r\n font-size: 16px;\r\n font-weight: 400;\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 height: 114px;\r\n justify-content: flex-start;\r\n padding-right: 5px\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 }\r\n\r\nexport class ApiRenderer {\r\n options: any;\r\n container: any;\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 // 动态创建 <style> 标签并插入全局样式\r\n const styleEl = document.createElement('style');\r\n styleEl.textContent = text;\r\n document.head.appendChild(styleEl);\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\nfunction renderApiUnit(apiOperator: any, containerRef: any, elementMap: any) {\r\n return function (evt: any) {\r\n console.log('点击的API操作:');\r\n console.log('方法:', apiOperator.method);\r\n console.log('URL:', apiOperator.url);\r\n console.log('------------------------');\r\n\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.requestBody);\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 console.log('当前值:', e.target.value);\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 console.log('当前值:', e.target.value);\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 let auths = apiOperator.auths || []\r\n const authTypeRow = createSelectRow(auths, authValues)\r\n if (auths.length > 0) {\r\n let parameters = apiOperator.auths[0].parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(authTypeRow, ...authRows);\r\n }\r\n\r\n authSection.append(authCnr, authValues);\r\n return authSection;\r\n}\r\n\r\nfunction createSectionRequestBody(requestBody: 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 const bodyValue = document.createElement('textarea');\r\n bodyValue.setAttribute('data-layer', 'bodyTextValue');\r\n bodyValue.className = 'Id0CategoryId0NameNamePhotourlsTagsId0NameStatusAvailable codigma-apiunit-parakeyvalues';\r\n bodyValue.value = JSON.stringify(requestBody);\r\n bodySection.appendChild(bodyValue);\r\n return bodySection;\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 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 console.log('当前值:', e.target.value);\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(auths: any, authValues: 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', \"type\");\r\n typeLabel.className = 'type codigma-apiunit-send';\r\n typeLabel.textContent = 'Type:';\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 auths.forEach((auth: any) => {\r\n const option1 = document.createElement('option');\r\n option1.value = auth[\"type\"];\r\n option1.textContent = auth[\"type\"];\r\n selectElement.appendChild(option1);\r\n })\r\n\r\n // 添加选择事件监听\r\n selectElement.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 let parameters = auth.parameters || [];\r\n const authRows = parameters.map((parameter: any) => createRow(parameter));\r\n authValues.append(...authRows);\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\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\n\r\nfunction sendRequest(apiOperator: any, responseSectionRef: any) {\r\n // 防御性检查:确保传入了 responseSectionRef,避免后续调用 querySelector 时抛出错误\r\n if (!responseSectionRef) {\r\n console.error('sendRequest: missing responseSectionRef. Aborting request to avoid runtime errors.');\r\n return;\r\n }\r\n let reuqestUrl = getRequestUrl(apiOperator);\r\n const result = checkIfParameter(apiOperator);\r\n\r\n let header = result.hasRequestBody ? 'application/json' :\r\n (result.hasRequestFormData ? 'application/x-www-form-urlencoded' : 'application/json');\r\n let headers: any = {\r\n 'Content-Type': header\r\n }\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customHeaderparameters.length; index++) {\r\n const paras = apiOperator.customHeaderparameters[index];\r\n if (paras.name != '' && paras.value != '' && paras.name != null && paras.value != null) {\r\n headers[paras.name] = paras.value\r\n }\r\n }\r\n }\r\n\r\n let body = result.hasRequestBody ? apiOperator.requestBody :\r\n (result.hasRequestFormData ? getRequestFormData(apiOperator.rawApiInfo) : null);\r\n\r\n //TODO\r\n if (apiOperator.custom) {\r\n if (apiOperator.method.toUpperCase() == \"POST\" || apiOperator.method.toUpperCase() == \"PUT\") {\r\n body = apiOperator.requestBody;\r\n }\r\n }\r\n\r\n apiOperator.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: apiOperator.method.toUpperCase(),\r\n headers: headers,\r\n body: body != null ? JSON.stringify(body) : null,\r\n signal: signal\r\n })\r\n .then(response => {\r\n if (!response.ok) {\r\n apiOperator.response = {\r\n status: response.status,\r\n statusText: response.statusText\r\n }\r\n\r\n const endTime = Date.now(); // 即使在错误的情况下也记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime);\r\n apiOperator.ifSendingRequest = false;\r\n // apiOperator.responseJsoneditor.value = \"\";\r\n throw new Error('Network response was not ok.');\r\n }\r\n const endTime = Date.now(); // 记录结束时间 \r\n apiOperator.requestDuration = formatDuration(endTime - startTime); // 计算耗时\r\n\r\n const responsebodyElement = responseSectionRef.querySelector('[data-layer=\"responsebody\"]');\r\n responsebodyElement.removeChild(overlayLayerContainer);\r\n\r\n apiOperator.ifSendingRequest = false;\r\n apiOperator.response = {\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 apiOperator.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 responsebodyElement.textContent = JSON.stringify(data, null, 4)\r\n } else {\r\n // 假设 data 是文本字符串,你可以在这里处理它 \r\n console.log('Received text:', data);\r\n responsebodyElement.textContent = data;\r\n }\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 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 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\nfunction checkIfParameter(apiOperator: any) {\r\n let hasRequestBody = false;\r\n let hasRequestFormData = false;\r\n const parameters = apiOperator.rawApiInfo.parameters;\r\n if (parameters) {\r\n for (let index = 0; index < parameters.length; index++) {\r\n const parameter = parameters[index];\r\n if (parameter.in == \"query\" || parameter.in == \"path\") {\r\n } else if (parameter.in == \"body\") {\r\n hasRequestBody = true;\r\n parameter.name = parameter.name.charAt(0).toUpperCase() + parameter.name.slice(1);\r\n } else if (parameter.in == \"formData\") {\r\n hasRequestFormData = true;\r\n }\r\n }\r\n }\r\n\r\n //support openapi 3.0\r\n const requestBody = apiOperator.rawApiInfo.requestBody;\r\n if (requestBody) {\r\n hasRequestBody = true;\r\n }\r\n // 返回包含两个状态的对象\r\n return { hasRequestBody, hasRequestFormData };\r\n}\r\n\r\nfunction formatDuration(milliseconds: number) {\r\n let totalSeconds: string | number = Math.floor(milliseconds / 1000);\r\n let seconds: string | number = totalSeconds % 60;\r\n let minutes: string | number = Math.floor(totalSeconds / 60) % 60;\r\n let hours: string | number = Math.floor(totalSeconds / (60 * 60));\r\n\r\n // 毫秒部分 \r\n let millisecondsPart: string | number = 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 getRequestUrl(apiOperator: any) {\r\n let reuqestUrl = apiOperator.url;\r\n\r\n const requestParameters = apiOperator.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(apiOperator, requestParameters);\r\n reuqestUrl = queryParams.length > 0 ? (reuqestUrl + \"?\" + queryParams.join(\"&\")) : reuqestUrl;\r\n\r\n return reuqestUrl;\r\n}\r\n\r\nfunction getQueryParams(apiOperator: 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 (apiOperator.custom) {\r\n for (let index = 0; index < apiOperator.customQueryparameters.length; index++) {\r\n const paras = apiOperator.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\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 && parameterObj.schema) {\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 }\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 parseElement(element: any) {\r\n let elementValue;\r\n if (element['type'].includes('integer')) {\r\n elementValue = 0;\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 if (element['example']) {\r\n elementValue = element['example'];\r\n }\r\n\r\n return elementValue;\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: 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 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 apiOperator.rawApiInfo = operation;\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":";AACO,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;AA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","names":["endTime"]}
File without changes