@scalar/api-client 2.39.3 → 2.40.0

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.
Files changed (338) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/components/AddressBar/AddressBarHistory.vue.d.ts.map +1 -1
  3. package/dist/components/AddressBar/AddressBarHistory.vue.js +1 -1
  4. package/dist/components/AddressBar/AddressBarHistory.vue.js.map +1 -1
  5. package/dist/components/AddressBar/AddressBarHistory.vue.script.js +2 -2
  6. package/dist/components/AddressBar/AddressBarHistory.vue.script.js.map +1 -1
  7. package/dist/hooks/useClientConfig.d.ts +12 -0
  8. package/dist/hooks/useClientConfig.d.ts.map +1 -1
  9. package/dist/hooks/useClientConfig.js +14 -1
  10. package/dist/hooks/useClientConfig.js.map +1 -1
  11. package/dist/hooks/useResponseBody.js +2 -2
  12. package/dist/hooks/useResponseBody.js.map +1 -1
  13. package/dist/libs/index.d.ts +0 -1
  14. package/dist/libs/index.d.ts.map +1 -1
  15. package/dist/libs/index.js +1 -2
  16. package/dist/libs/send-request/decode-buffer.js +2 -2
  17. package/dist/libs/send-request/decode-buffer.js.map +1 -1
  18. package/dist/style.css +222 -263
  19. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +14 -10
  20. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  21. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  22. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +57 -35
  23. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  24. package/dist/v2/blocks/operation-block/helpers/decode-buffer.js +2 -2
  25. package/dist/v2/blocks/operation-block/helpers/decode-buffer.js.map +1 -1
  26. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -5
  27. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts.map +1 -1
  28. package/dist/v2/blocks/operation-block/helpers/send-request.js +18 -33
  29. package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -1
  30. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.d.ts.map +1 -1
  31. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js +1 -1
  32. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js.map +1 -1
  33. package/dist/v2/blocks/operation-block/index.d.ts +0 -3
  34. package/dist/v2/blocks/operation-block/index.d.ts.map +1 -1
  35. package/dist/v2/blocks/operation-block/index.js +1 -4
  36. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts +1 -1
  37. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts.map +1 -1
  38. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js +1 -1
  39. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js.map +1 -1
  40. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js +3 -1
  41. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js.map +1 -1
  42. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts +4 -2
  43. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts.map +1 -1
  44. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.js +3 -2
  45. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.js.map +1 -1
  46. package/dist/v2/blocks/operation-code-sample/helpers/get-resolved-ref-deep.js +1 -1
  47. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.d.ts +1 -1
  48. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.d.ts.map +1 -1
  49. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.js.map +1 -1
  50. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.d.ts +7 -2
  51. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.d.ts.map +1 -1
  52. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.js +4 -3
  53. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.js.map +1 -1
  54. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.d.ts.map +1 -1
  55. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js +2 -3
  56. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js.map +1 -1
  57. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.d.ts +3 -1
  58. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.d.ts.map +1 -1
  59. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js +5 -8
  60. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js.map +1 -1
  61. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.d.ts +1 -1
  62. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.d.ts.map +1 -1
  63. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.js.map +1 -1
  64. package/dist/v2/blocks/operation-code-sample/index.d.ts +0 -1
  65. package/dist/v2/blocks/operation-code-sample/index.d.ts.map +1 -1
  66. package/dist/v2/blocks/operation-code-sample/index.js +2 -3
  67. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts +7 -9
  68. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
  69. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  70. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  71. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +49 -42
  72. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  73. package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
  74. package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
  75. package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -1
  76. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +2 -3
  77. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
  78. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts.map +1 -1
  79. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js.map +1 -1
  80. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +1 -0
  81. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
  82. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
  83. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
  84. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +11 -9
  85. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
  86. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +1 -1
  87. package/dist/v2/blocks/request-block/helpers/is-param-disabled.d.ts +1 -1
  88. package/dist/v2/blocks/request-block/helpers/is-param-disabled.d.ts.map +1 -1
  89. package/dist/v2/blocks/request-block/helpers/is-param-disabled.js +2 -1
  90. package/dist/v2/blocks/request-block/helpers/is-param-disabled.js.map +1 -1
  91. package/dist/v2/blocks/response-block/helpers/get-content-length.d.ts.map +1 -1
  92. package/dist/v2/blocks/response-block/helpers/get-content-length.js +2 -2
  93. package/dist/v2/blocks/response-block/helpers/get-content-length.js.map +1 -1
  94. package/dist/v2/blocks/response-block/helpers/process-response-body.js +2 -2
  95. package/dist/v2/blocks/response-block/helpers/process-response-body.js.map +1 -1
  96. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  97. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
  98. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -1
  99. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +76 -25
  100. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
  101. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts.map +1 -1
  102. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +1 -1
  103. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js.map +1 -1
  104. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js +2 -2
  105. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
  106. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +1 -1
  107. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts.map +1 -1
  108. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js.map +1 -1
  109. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +1 -1
  110. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  111. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts +1 -1
  112. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  113. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
  114. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +8 -4
  115. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
  116. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts +1 -1
  117. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts.map +1 -1
  118. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.js.map +1 -1
  119. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js.map +1 -1
  120. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts +1 -1
  121. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
  122. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
  123. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
  124. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts +1 -1
  125. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts.map +1 -1
  126. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js +1 -1
  127. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +1 -1
  128. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts.map +1 -1
  129. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +6 -2
  130. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js.map +1 -1
  131. package/dist/v2/blocks/scalar-auth-selector-block/index.d.ts +0 -3
  132. package/dist/v2/blocks/scalar-auth-selector-block/index.d.ts.map +1 -1
  133. package/dist/v2/blocks/scalar-auth-selector-block/index.js +1 -3
  134. package/dist/v2/components/code-input/CodeInput.vue.d.ts +16 -8
  135. package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
  136. package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
  137. package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -1
  138. package/dist/v2/components/code-input/CodeInput.vue.script.js +15 -10
  139. package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
  140. package/dist/v2/constants.js +1 -1
  141. package/dist/v2/features/app/App.vue.d.ts.map +1 -1
  142. package/dist/v2/features/app/App.vue.js.map +1 -1
  143. package/dist/v2/features/app/App.vue.script.js +1 -5
  144. package/dist/v2/features/app/App.vue.script.js.map +1 -1
  145. package/dist/v2/features/app/app-events.d.ts.map +1 -1
  146. package/dist/v2/features/app/app-events.js +1 -1
  147. package/dist/v2/features/app/app-events.js.map +1 -1
  148. package/dist/v2/features/app/app-state.d.ts.map +1 -1
  149. package/dist/v2/features/app/app-state.js +2 -2
  150. package/dist/v2/features/app/app-state.js.map +1 -1
  151. package/dist/v2/features/app/components/AppSidebar.vue.d.ts.map +1 -1
  152. package/dist/v2/features/app/components/AppSidebar.vue.js +1 -1
  153. package/dist/v2/features/app/components/AppSidebar.vue.js.map +1 -1
  154. package/dist/v2/features/app/components/AppSidebar.vue.script.js +1 -1
  155. package/dist/v2/features/app/components/AppSidebar.vue.script.js.map +1 -1
  156. package/dist/v2/features/app/helpers/routes.d.ts +0 -3
  157. package/dist/v2/features/app/helpers/routes.d.ts.map +1 -1
  158. package/dist/v2/features/app/helpers/routes.js +1 -1
  159. package/dist/v2/features/app/helpers/routes.js.map +1 -1
  160. package/dist/v2/features/collection/DocumentCollection.vue.d.ts.map +1 -1
  161. package/dist/v2/features/collection/DocumentCollection.vue.js.map +1 -1
  162. package/dist/v2/features/collection/DocumentCollection.vue.script.js +30 -52
  163. package/dist/v2/features/collection/DocumentCollection.vue.script.js.map +1 -1
  164. package/dist/v2/features/collection/OperationCollection.vue.script.js +0 -1
  165. package/dist/v2/features/collection/OperationCollection.vue.script.js.map +1 -1
  166. package/dist/v2/features/collection/WorkspaceCollection.vue.script.js +0 -1
  167. package/dist/v2/features/collection/WorkspaceCollection.vue.script.js.map +1 -1
  168. package/dist/v2/features/collection/components/Authentication.vue.d.ts.map +1 -1
  169. package/dist/v2/features/collection/components/Authentication.vue.js +1 -1
  170. package/dist/v2/features/collection/components/Authentication.vue.js.map +1 -1
  171. package/dist/v2/features/collection/components/Authentication.vue.script.js +6 -8
  172. package/dist/v2/features/collection/components/Authentication.vue.script.js.map +1 -1
  173. package/dist/v2/features/collection/components/Cookies.vue.script.js +0 -1
  174. package/dist/v2/features/collection/components/Cookies.vue.script.js.map +1 -1
  175. package/dist/v2/features/collection/components/Editor/Editor.vue.script.js +0 -1
  176. package/dist/v2/features/collection/components/Editor/Editor.vue.script.js.map +1 -1
  177. package/dist/v2/features/collection/components/Environment.vue.script.js +0 -1
  178. package/dist/v2/features/collection/components/Environment.vue.script.js.map +1 -1
  179. package/dist/v2/features/collection/components/Overview.vue.script.js +0 -1
  180. package/dist/v2/features/collection/components/Overview.vue.script.js.map +1 -1
  181. package/dist/v2/features/collection/components/Servers.vue.script.js +0 -1
  182. package/dist/v2/features/collection/components/Servers.vue.script.js.map +1 -1
  183. package/dist/v2/features/collection/components/Settings.vue.js.map +1 -1
  184. package/dist/v2/features/collection/components/Settings.vue.script.js +2 -3
  185. package/dist/v2/features/collection/components/Settings.vue.script.js.map +1 -1
  186. package/dist/v2/features/editor/hooks/use-three-way-merge-editor.js +1 -1
  187. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
  188. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -1
  189. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +1 -1
  190. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
  191. package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
  192. package/dist/v2/features/modal/Modal.vue.js.map +1 -1
  193. package/dist/v2/features/modal/Modal.vue.script.js +3 -4
  194. package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
  195. package/dist/v2/features/modal/helpers/map-hidden-clients-config.js +1 -1
  196. package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
  197. package/dist/v2/features/operation/Operation.vue.js.map +1 -1
  198. package/dist/v2/features/operation/Operation.vue.script.js +50 -84
  199. package/dist/v2/features/operation/Operation.vue.script.js.map +1 -1
  200. package/dist/v2/features/operation/index.d.ts +0 -4
  201. package/dist/v2/features/operation/index.d.ts.map +1 -1
  202. package/dist/v2/features/operation/index.js +1 -5
  203. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.d.ts.map +1 -1
  204. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.js.map +1 -1
  205. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.script.js +11 -1
  206. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.script.js.map +1 -1
  207. package/dist/views/Request/RequestSection/RequestTable.vue.d.ts.map +1 -1
  208. package/dist/views/Request/RequestSection/RequestTable.vue.js +1 -1
  209. package/dist/views/Request/RequestSection/RequestTable.vue.js.map +1 -1
  210. package/dist/views/Request/RequestSection/RequestTable.vue.script.js +1 -1
  211. package/dist/views/Request/RequestSection/RequestTable.vue.script.js.map +1 -1
  212. package/dist/views/Request/ResponseSection/ResponseEmpty.vue.script.js +1 -1
  213. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.d.ts.map +1 -1
  214. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.js.map +1 -1
  215. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.script.js +2 -2
  216. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.script.js.map +1 -1
  217. package/dist/views/Request/libs/oauth2.js +1 -1
  218. package/dist/views/Request/libs/oauth2.js.map +1 -1
  219. package/package.json +25 -31
  220. package/dist/libs/formatters.d.ts +0 -12
  221. package/dist/libs/formatters.d.ts.map +0 -1
  222. package/dist/libs/formatters.js +0 -36
  223. package/dist/libs/formatters.js.map +0 -1
  224. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts +0 -6
  225. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts.map +0 -1
  226. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.js +0 -58
  227. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.js.map +0 -1
  228. package/dist/v2/blocks/operation-block/helpers/build-request-body.d.ts +0 -12
  229. package/dist/v2/blocks/operation-block/helpers/build-request-body.d.ts.map +0 -1
  230. package/dist/v2/blocks/operation-block/helpers/build-request-body.js +0 -65
  231. package/dist/v2/blocks/operation-block/helpers/build-request-body.js.map +0 -1
  232. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.d.ts +0 -31
  233. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.d.ts.map +0 -1
  234. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js +0 -55
  235. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js.map +0 -1
  236. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts +0 -27
  237. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts.map +0 -1
  238. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.js +0 -159
  239. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.js.map +0 -1
  240. package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts +0 -25
  241. package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts.map +0 -1
  242. package/dist/v2/blocks/operation-block/helpers/build-request-security.js +0 -53
  243. package/dist/v2/blocks/operation-block/helpers/build-request-security.js.map +0 -1
  244. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts +0 -46
  245. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts.map +0 -1
  246. package/dist/v2/blocks/operation-block/helpers/build-request.js +0 -102
  247. package/dist/v2/blocks/operation-block/helpers/build-request.js.map +0 -1
  248. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.d.ts +0 -4
  249. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.d.ts.map +0 -1
  250. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.js +0 -41
  251. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.js.map +0 -1
  252. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.d.ts +0 -14
  253. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.d.ts.map +0 -1
  254. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.js +0 -20
  255. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.js.map +0 -1
  256. package/dist/v2/blocks/operation-block/helpers/get-delimiter.d.ts +0 -8
  257. package/dist/v2/blocks/operation-block/helpers/get-delimiter.d.ts.map +0 -1
  258. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.d.ts +0 -9
  259. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.d.ts.map +0 -1
  260. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.js +0 -17
  261. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.js.map +0 -1
  262. package/dist/v2/blocks/operation-block/helpers/get-example.d.ts +0 -10
  263. package/dist/v2/blocks/operation-block/helpers/get-example.d.ts.map +0 -1
  264. package/dist/v2/blocks/operation-block/helpers/get-example.js +0 -41
  265. package/dist/v2/blocks/operation-block/helpers/get-example.js.map +0 -1
  266. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts +0 -26
  267. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts.map +0 -1
  268. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.js +0 -32
  269. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.js.map +0 -1
  270. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.d.ts +0 -10
  271. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.d.ts.map +0 -1
  272. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.js +0 -15
  273. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.js.map +0 -1
  274. package/dist/v2/blocks/operation-block/helpers/get-server-url.d.ts +0 -3
  275. package/dist/v2/blocks/operation-block/helpers/get-server-url.d.ts.map +0 -1
  276. package/dist/v2/blocks/operation-block/helpers/get-server-url.js +0 -18
  277. package/dist/v2/blocks/operation-block/helpers/get-server-url.js.map +0 -1
  278. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.d.ts +0 -96
  279. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.d.ts.map +0 -1
  280. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.js +0 -160
  281. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.js.map +0 -1
  282. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.d.ts +0 -40
  283. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.d.ts.map +0 -1
  284. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.js +0 -437
  285. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.js.map +0 -1
  286. package/dist/v2/blocks/request-block/helpers/get-request-body-example.d.ts +0 -6
  287. package/dist/v2/blocks/request-block/helpers/get-request-body-example.d.ts.map +0 -1
  288. package/dist/v2/blocks/request-block/helpers/get-request-body-example.js +0 -25
  289. package/dist/v2/blocks/request-block/helpers/get-request-body-example.js.map +0 -1
  290. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.js +0 -141
  291. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.js.map +0 -1
  292. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.d.ts +0 -4
  293. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.d.ts.map +0 -1
  294. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.js +0 -10
  295. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.js.map +0 -1
  296. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.d.ts +0 -9
  297. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.d.ts.map +0 -1
  298. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.js +0 -27
  299. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.js.map +0 -1
  300. package/dist/v2/blocks/scalar-auth-selector-block/helpers/secret-types.d.ts +0 -25
  301. package/dist/v2/blocks/scalar-auth-selector-block/helpers/secret-types.d.ts.map +0 -1
  302. package/dist/v2/components/callout/Callout.vue.js +0 -9
  303. package/dist/v2/components/callout/Callout.vue.js.map +0 -1
  304. package/dist/v2/components/callout/Callout.vue.script.js +0 -35
  305. package/dist/v2/components/callout/Callout.vue.script.js.map +0 -1
  306. package/dist/v2/features/operation/helpers/combine-params.d.ts +0 -4
  307. package/dist/v2/features/operation/helpers/combine-params.d.ts.map +0 -1
  308. package/dist/v2/features/operation/helpers/combine-params.js +0 -20
  309. package/dist/v2/features/operation/helpers/combine-params.js.map +0 -1
  310. package/dist/v2/features/operation/helpers/get-operation-header.d.ts +0 -17
  311. package/dist/v2/features/operation/helpers/get-operation-header.d.ts.map +0 -1
  312. package/dist/v2/features/operation/helpers/get-security-requirements.d.ts +0 -12
  313. package/dist/v2/features/operation/helpers/get-security-requirements.d.ts.map +0 -1
  314. package/dist/v2/features/operation/helpers/get-security-requirements.js +0 -17
  315. package/dist/v2/features/operation/helpers/get-security-requirements.js.map +0 -1
  316. package/dist/v2/features/operation/helpers/get-selected-security.d.ts +0 -15
  317. package/dist/v2/features/operation/helpers/get-selected-security.d.ts.map +0 -1
  318. package/dist/v2/features/operation/helpers/get-selected-security.js +0 -41
  319. package/dist/v2/features/operation/helpers/get-selected-security.js.map +0 -1
  320. package/dist/v2/features/operation/helpers/get-selected-server.d.ts +0 -13
  321. package/dist/v2/features/operation/helpers/get-selected-server.d.ts.map +0 -1
  322. package/dist/v2/features/operation/helpers/get-selected-server.js +0 -21
  323. package/dist/v2/features/operation/helpers/get-selected-server.js.map +0 -1
  324. package/dist/v2/helpers/get-active-environment.d.ts +0 -5
  325. package/dist/v2/helpers/get-active-environment.d.ts.map +0 -1
  326. package/dist/v2/helpers/get-active-environment.js +0 -19
  327. package/dist/v2/helpers/get-active-environment.js.map +0 -1
  328. package/dist/v2/helpers/get-active-proxy-url.d.ts +0 -18
  329. package/dist/v2/helpers/get-active-proxy-url.d.ts.map +0 -1
  330. package/dist/v2/helpers/get-active-proxy-url.js +0 -26
  331. package/dist/v2/helpers/get-active-proxy-url.js.map +0 -1
  332. package/dist/v2/helpers/get-servers.d.ts +0 -23
  333. package/dist/v2/helpers/get-servers.d.ts.map +0 -1
  334. package/dist/v2/helpers/get-servers.js +0 -106
  335. package/dist/v2/helpers/get-servers.js.map +0 -1
  336. package/dist/v2/helpers/index.d.ts +0 -3
  337. package/dist/v2/helpers/index.d.ts.map +0 -1
  338. package/dist/v2/helpers/index.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"OAuth2.vue.script.js","names":[],"sources":["../../../../../src/views/Request/RequestSection/RequestAuth/OAuth2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, useLoadingState } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport {\n pkceOptions,\n type Collection,\n type Oauth2Flow,\n type SecuritySchemeOauth2,\n type Server,\n} from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { useToasts } from '@scalar/use-toasts'\n\nimport { DataTableRow } from '@/components/DataTable'\nimport type { EnvVariable } from '@/store/active-entities'\nimport { useWorkspace, type UpdateScheme } from '@/store/store'\nimport { authorizeOauth2 } from '@/views/Request/libs'\nimport { updateScheme as _updateScheme } from '@/views/Request/RequestSection/helpers/update-scheme'\n\nimport OAuthScopesInput from './OAuthScopesInput.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n collection,\n environment,\n envVariables,\n flow,\n persistAuth = false,\n scheme,\n server,\n workspace,\n} = defineProps<{\n collection: Collection\n environment: Environment\n envVariables: EnvVariable[]\n flow: Oauth2Flow\n persistAuth: boolean\n scheme: SecuritySchemeOauth2\n server: Server | undefined\n workspace: Workspace\n}>()\n\nconst emits = defineEmits<{\n authorized: []\n}>()\n\ndefineSlots<{\n 'oauth-actions'?: () => unknown\n}>()\n\nconst loader = useLoadingState()\nconst { toast } = useToasts()\nconst storeContext = useWorkspace()\n\n/** Update the current scheme */\nconst updateScheme: UpdateScheme = (path, value) =>\n _updateScheme(scheme.uid, path, value, storeContext, persistAuth)\n\n/** Authorize the user using specified flow */\nconst handleAuthorize = async () => {\n if (loader.isActive || !collection?.uid) {\n return\n }\n if (!server) {\n toast('No server selected', 'error')\n return\n }\n loader.start()\n\n const [error, accessToken] = await authorizeOauth2(\n flow,\n server,\n workspace?.proxyUrl,\n )\n\n await loader.clear()\n\n if (accessToken) {\n updateScheme(`flows.${flow.type}.token`, accessToken)\n emits('authorized')\n } else {\n console.error(error)\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** To make prop drilling a little easier */\nconst dataTableInputProps = {\n environment,\n envVariables,\n workspace,\n}\n</script>\n\n<template>\n <!-- Access Token Granted -->\n <template v-if=\"flow.token\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"border-r-transparent\"\n :modelValue=\"flow.token\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"(v) => updateScheme(`flows.${flow.type}.token`, v)\">\n Access Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-1 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"updateScheme(`flows.${flow.type}.token`, '')\">\n Clear\n </ScalarButton>\n <slot name=\"oauth-actions\" />\n </div>\n </DataTableRow>\n </template>\n\n <template v-else>\n <DataTableRow>\n <!-- Auth URL -->\n <RequestAuthDataTableInput\n v-if=\"'authorizationUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n containerClass=\"border-r-0\"\n :modelValue=\"flow.authorizationUrl\"\n placeholder=\"https://galaxy.scalar.com/authorize\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.authorizationUrl`, v)\n \">\n Auth URL\n </RequestAuthDataTableInput>\n\n <!-- Token URL -->\n <RequestAuthDataTableInput\n v-if=\"'tokenUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.tokenUrl\"\n placeholder=\"https://galaxy.scalar.com/token\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.tokenUrl`, v)\n \">\n Token URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <DataTableRow v-if=\"'x-scalar-redirect-uri' in flow\">\n <!-- Redirect URI -->\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-redirect-uri']\"\n placeholder=\"https://galaxy.scalar.com/callback\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-redirect-uri`, v)\n \">\n Redirect URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Username and password -->\n <template v-if=\"flow.type === 'password'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"text-c-2\"\n :modelValue=\"flow.username\"\n placeholder=\"janedoe\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.username`, v)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.password\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.password`, v)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- Client ID -->\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-client-id']\"\n placeholder=\"12345\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-client-id`, v)\n \">\n Client ID\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Client Secret (Authorization Code / Client Credentials / Password (optional)) -->\n <DataTableRow v-if=\"'clientSecret' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.clientSecret\"\n placeholder=\"XYZ123\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.clientSecret`, v)\n \">\n Client Secret\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- PKCE -->\n <DataTableRow v-if=\"'x-usePkce' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :enum=\"pkceOptions\"\n :modelValue=\"flow['x-usePkce']\"\n readOnly\n @update:modelValue=\"\n (v) =>\n updateScheme(\n `flows.${flow.type}.x-usePkce`,\n v as (typeof pkceOptions)[number],\n )\n \">\n Use PKCE\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Scopes -->\n <DataTableRow v-if=\"Object.keys(flow.scopes ?? {}).length\">\n <OAuthScopesInput\n :flow=\"flow\"\n :updateScheme=\"updateScheme\" />\n </DataTableRow>\n\n <!-- Open ID Connect -->\n <!-- <DataTableRow -->\n <!-- v-else-if=\"activeScheme?.type === 'openIdConnect'\" -->\n <!-- class=\"border-r-transparent\"> -->\n <!-- <DataTableInput -->\n <!-- v-model=\"password\" -->\n <!-- placeholder=\"Token\"> -->\n <!-- TODO -->\n <!-- </DataTableInput> -->\n <!-- <DataTableCell class=\"flex items-center\"> -->\n <!-- <ScalarButton size=\"sm\"> Authorize </ScalarButton> -->\n <!-- </DataTableCell> -->\n <!-- </DataTableRow> -->\n </template>\n <template v-if=\"!flow.token\">\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 w-full items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-0.75 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </DataTableRow>\n </template>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"OAuth2.vue.script.js","names":[],"sources":["../../../../../src/views/Request/RequestSection/RequestAuth/OAuth2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, useLoadingState } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport {\n pkceOptions,\n type Collection,\n type Oauth2Flow,\n type SecuritySchemeOauth2,\n type Server,\n} from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\n\nimport { DataTableRow } from '@/components/DataTable'\nimport {\n resolveDefaultOAuth2RedirectUri,\n useClientConfig,\n} from '@/hooks/useClientConfig'\nimport type { EnvVariable } from '@/store/active-entities'\nimport { useWorkspace, type UpdateScheme } from '@/store/store'\nimport { authorizeOauth2 } from '@/views/Request/libs'\nimport { updateScheme as _updateScheme } from '@/views/Request/RequestSection/helpers/update-scheme'\n\nimport OAuthScopesInput from './OAuthScopesInput.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n collection,\n environment,\n envVariables,\n flow,\n persistAuth = false,\n scheme,\n server,\n workspace,\n} = defineProps<{\n collection: Collection\n environment: Environment\n envVariables: EnvVariable[]\n flow: Oauth2Flow\n persistAuth: boolean\n scheme: SecuritySchemeOauth2\n server: Server | undefined\n workspace: Workspace\n}>()\n\nconst emits = defineEmits<{\n authorized: []\n}>()\n\ndefineSlots<{\n 'oauth-actions'?: () => unknown\n}>()\n\nconst loader = useLoadingState()\nconst { toast } = useToasts()\nconst storeContext = useWorkspace()\nconst config = useClientConfig()\n\n/** Update the current scheme */\nconst updateScheme: UpdateScheme = (path, value) =>\n _updateScheme(scheme.uid, path, value, storeContext, persistAuth)\n\nconst hasPrefilledRedirectUri = ref(false)\nconst defaultRedirectUri = computed<string>(() =>\n resolveDefaultOAuth2RedirectUri(config.value),\n)\n\nwatch(\n () =>\n 'x-scalar-redirect-uri' in flow ? flow['x-scalar-redirect-uri'] : undefined,\n (currentRedirectUri) => {\n if (\n !('x-scalar-redirect-uri' in flow) ||\n hasPrefilledRedirectUri.value ||\n currentRedirectUri\n ) {\n return\n }\n\n if (!defaultRedirectUri.value) {\n return\n }\n\n hasPrefilledRedirectUri.value = true\n updateScheme(\n `flows.${flow.type}.x-scalar-redirect-uri`,\n defaultRedirectUri.value,\n )\n },\n { immediate: true },\n)\n\n/** Authorize the user using specified flow */\nconst handleAuthorize = async () => {\n if (loader.isActive || !collection?.uid) {\n return\n }\n if (!server) {\n toast('No server selected', 'error')\n return\n }\n loader.start()\n\n const [error, accessToken] = await authorizeOauth2(\n flow,\n server,\n workspace?.proxyUrl,\n )\n\n await loader.clear()\n\n if (accessToken) {\n updateScheme(`flows.${flow.type}.token`, accessToken)\n emits('authorized')\n } else {\n console.error(error)\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** To make prop drilling a little easier */\nconst dataTableInputProps = {\n environment,\n envVariables,\n workspace,\n}\n</script>\n\n<template>\n <!-- Access Token Granted -->\n <template v-if=\"flow.token\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"border-r-transparent\"\n :modelValue=\"flow.token\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"(v) => updateScheme(`flows.${flow.type}.token`, v)\">\n Access Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-1 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"updateScheme(`flows.${flow.type}.token`, '')\">\n Clear\n </ScalarButton>\n <slot name=\"oauth-actions\" />\n </div>\n </DataTableRow>\n </template>\n\n <template v-else>\n <DataTableRow>\n <!-- Auth URL -->\n <RequestAuthDataTableInput\n v-if=\"'authorizationUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n containerClass=\"border-r-0\"\n :modelValue=\"flow.authorizationUrl\"\n placeholder=\"https://galaxy.scalar.com/authorize\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.authorizationUrl`, v)\n \">\n Auth URL\n </RequestAuthDataTableInput>\n\n <!-- Token URL -->\n <RequestAuthDataTableInput\n v-if=\"'tokenUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.tokenUrl\"\n placeholder=\"https://galaxy.scalar.com/token\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.tokenUrl`, v)\n \">\n Token URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <DataTableRow v-if=\"'x-scalar-redirect-uri' in flow\">\n <!-- Redirect URI -->\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-redirect-uri']\"\n placeholder=\"https://galaxy.scalar.com/callback\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-redirect-uri`, v)\n \">\n Redirect URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Username and password -->\n <template v-if=\"flow.type === 'password'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"text-c-2\"\n :modelValue=\"flow.username\"\n placeholder=\"janedoe\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.username`, v)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.password\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.password`, v)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- Client ID -->\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-client-id']\"\n placeholder=\"12345\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-client-id`, v)\n \">\n Client ID\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Client Secret (Authorization Code / Client Credentials / Password (optional)) -->\n <DataTableRow v-if=\"'clientSecret' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.clientSecret\"\n placeholder=\"XYZ123\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.clientSecret`, v)\n \">\n Client Secret\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- PKCE -->\n <DataTableRow v-if=\"'x-usePkce' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :enum=\"pkceOptions\"\n :modelValue=\"flow['x-usePkce']\"\n readOnly\n @update:modelValue=\"\n (v) =>\n updateScheme(\n `flows.${flow.type}.x-usePkce`,\n v as (typeof pkceOptions)[number],\n )\n \">\n Use PKCE\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Scopes -->\n <DataTableRow v-if=\"Object.keys(flow.scopes ?? {}).length\">\n <OAuthScopesInput\n :flow=\"flow\"\n :updateScheme=\"updateScheme\" />\n </DataTableRow>\n\n <!-- Open ID Connect -->\n <!-- <DataTableRow -->\n <!-- v-else-if=\"activeScheme?.type === 'openIdConnect'\" -->\n <!-- class=\"border-r-transparent\"> -->\n <!-- <DataTableInput -->\n <!-- v-model=\"password\" -->\n <!-- placeholder=\"Token\"> -->\n <!-- TODO -->\n <!-- </DataTableInput> -->\n <!-- <DataTableCell class=\"flex items-center\"> -->\n <!-- <ScalarButton size=\"sm\"> Authorize </ScalarButton> -->\n <!-- </DataTableCell> -->\n <!-- </DataTableRow> -->\n </template>\n <template v-if=\"!flow.token\">\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 w-full items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-0.75 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </DataTableRow>\n </template>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTable.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"names":[],"mappings":"AAsQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAQ9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAK1D,KAAK,WAAW,GAAG;IACf,KAAK,CAAC,EAAE,CAAC,uBAAuB,GAAG;QAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAAE,CAAA;IAClE,8BAA8B;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC;AAooBJ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;yBA7oBQ,OAAO;sBACV,OAAO;cACf,OAAO;gBACL,OAAO;6EA8oBtB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"RequestTable.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"names":[],"mappings":"AAsQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAQ9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAK1D,KAAK,WAAW,GAAG;IACf,KAAK,CAAC,EAAE,CAAC,uBAAuB,GAAG;QAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAAE,CAAA;IAClE,8BAA8B;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC;AAqoBJ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;yBA9oBQ,OAAO;sBACV,OAAO;cACf,OAAO;gBACL,OAAO;6EA+oBtB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import RequestTable_vue_vue_type_script_setup_true_lang_default from "./RequestTable.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Request/RequestSection/RequestTable.vue
5
- var RequestTable_default = /* @__PURE__ */ _plugin_vue_export_helper_default(RequestTable_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-04661eb4"]]);
5
+ var RequestTable_default = /* @__PURE__ */ _plugin_vue_export_helper_default(RequestTable_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9a415d6b"]]);
6
6
  //#endregion
7
7
  export { RequestTable_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTable.vue.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 centered-x centered-y absolute hidden w-[calc(100%_-_8px)] rounded p-0.5 text-center text-xs font-medium group-hover/upload:block\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"RequestTable.vue.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 md:centered-x md:centered-y static rounded p-0.5 text-center text-xs font-medium md:absolute md:w-[calc(100%_-_8px)] md:opacity-0 md:group-hover/upload:opacity-100\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":""}
@@ -232,7 +232,7 @@ var RequestTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
232
232
  class: "group/upload flex items-center justify-center whitespace-nowrap"
233
233
  }, {
234
234
  default: withCtx(() => [item.file ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("div", _hoisted_1, [createElementVNode("span", null, toDisplayString(item.file?.name), 1)]), createElementVNode("button", {
235
- class: "bg-b-2 centered-x centered-y absolute hidden w-[calc(100%_-_8px)] rounded p-0.5 text-center text-xs font-medium group-hover/upload:block",
235
+ class: "bg-b-2 md:centered-x md:centered-y static rounded p-0.5 text-center text-xs font-medium md:absolute md:w-[calc(100%_-_8px)] md:opacity-0 md:group-hover/upload:opacity-100",
236
236
  type: "button",
237
237
  onClick: ($event) => emit("removeFile", idx)
238
238
  }, " Delete ", 8, _hoisted_2)], 64)) : (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(unref(ScalarButton), {
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTable.vue.script.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 centered-x centered-y absolute hidden w-[calc(100%_-_8px)] rounded p-0.5 text-center text-xs font-medium group-hover/upload:block\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RequestTable.vue.script.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 md:centered-x md:centered-y static rounded p-0.5 text-center text-xs font-medium md:absolute md:w-[calc(100%_-_8px)] md:opacity-0 md:group-hover/upload:opacity-100\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":"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"}
@@ -45,7 +45,7 @@ var ResponseEmpty_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
45
45
  const handleHotKey = (event) => {
46
46
  if (event?.createNew && route.name === "request") addRequest();
47
47
  };
48
- const packageVersion = "2.39.3";
48
+ const packageVersion = "2.40.0";
49
49
  onMounted(() => events.hotKeys.on(handleHotKey));
50
50
  onBeforeUnmount(() => events.hotKeys.off(handleHotKey));
51
51
  return (_ctx, _cache) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ResponseMetaInformation.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"names":[],"mappings":"AAuFA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AASvE,KAAK,WAAW,GAAG;IAAE,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAiJlD,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"ResponseMetaInformation.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"names":[],"mappings":"AAwFA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAQvE,KAAK,WAAW,GAAG;IAAE,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAiJlD,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ResponseMetaInformation.vue.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? prettyBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ResponseMetaInformation.vue.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { formatBytes } from '@scalar/helpers/formatters/format-bytes'\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? formatBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":""}
@@ -3,7 +3,7 @@ import HelpfulLink_default from "../../../components/HelpfulLink.vue.js";
3
3
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeStyle, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
4
4
  import { httpStatusCodes } from "@scalar/oas-utils/helpers";
5
5
  import prettyMilliseconds from "pretty-ms";
6
- import prettyBytes from "pretty-bytes";
6
+ import { formatBytes } from "@scalar/helpers/formatters/format-bytes";
7
7
  //#region src/views/Request/ResponseSection/ResponseMetaInformation.vue?vue&type=script&setup=true&lang.ts
8
8
  var _hoisted_1 = { class: "text-c-1 flex gap-1.5" };
9
9
  var _hoisted_2 = { key: 0 };
@@ -28,7 +28,7 @@ var ResponseMetaInformation_vue_vue_type_script_setup_true_lang_default = /* @__
28
28
  /** Size of the response */
29
29
  const getContentLength = (response) => {
30
30
  const contentLength = Number.parseInt(response.headers?.["Content-Length"] || response.headers?.["content-length"] || "0", 10);
31
- return contentLength ? prettyBytes(contentLength) : void 0;
31
+ return contentLength ? formatBytes(contentLength) : void 0;
32
32
  };
33
33
  /** Status text for the response */
34
34
  const statusCodeInformation = computed(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"ResponseMetaInformation.vue.script.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? prettyBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,cAAa;EAChC,MAAM,WAAW,KAAoC;EACrD,MAAM,YAAY,IAAI,EAAC;AAEvB,SAAO,cAAc,IAAI,WAAW;AAClC,OAAI,WAAW,QACb,UAAS,QAAQ,kBAAmB,UAAU,SAAS,KAAO,IAAI;QAC7D;AACL,kBAAc,SAAS,MAAK;AAC5B,aAAS,QAAQ,KAAA;AACjB,cAAU,QAAQ;;IAErB;;EAGD,MAAM,oBAAoB,aAA+B;GACvD,MAAM,gBAAgB,OAAO,SAC3B,SAAS,UAAU,qBACjB,SAAS,UAAU,qBACnB,KACF,GACF;AAEA,UAAO,gBAAgB,YAAY,cAAc,GAAG,KAAA;;;EAItD,MAAM,wBAAwB,eAA2C;GACvE,MAAM,qBAAqB,MAAM,SAAS;AAE1C,OAAI,CAAC,mBACH;AAGF,UAAO,gBAAgB,uBAAuB,KAAA;IAC/C;;uBAGC,mBAgCM,OAhCN,YAgCM,CA/BQ,SAAA,SAAY,UAAA,SAAA,WAAA,EAAxB,mBAES,QAAA,YAAA,gBADP,MAAA,mBAAkB,CAAC,UAAA,MAAS,CAAA,EAAA,EAAA,KAAA,WAAA,EAE9B,mBA2BW,UAAA,EAAA,KAAA,GAAA,EAAA;IA1BT,mBAGO,QAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAA4D,QAAA,EAAtD,OAAM,WAAS,EAAC,mCAA+B,GAAA,GAAA,gBAAO,MAC5D,gBAAG,MAAA,mBAAkB,CAAC,QAAA,SAAS,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA;IAE7B,iBAAiB,QAAA,SAAQ,IAAA,WAAA,EAArC,mBAGO,QAAA,YAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAAoC,QAAA,EAA9B,OAAM,WAAS,EAAC,WAAO,GAAA,GAAA,gBAAO,MACpC,gBAAG,iBAAiB,QAAA,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA;IAEd,sBAAA,SAAA,WAAA,EAAhB,mBAiBW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,OAAA,OAAA,OAAA,KAhBT,mBAAsC,QAAA,EAAhC,OAAM,WAAS,EAAC,aAAS,GAAA,GAEvB,sBAAA,MAAsB,OAAA,WAAA,EAD9B,YAQc,qBAAA;;KANZ,OAAM;KACL,MAAM,sBAAA,MAAsB;;4BACR,CAAA,gBAAA,gBAAlB,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;MAD5D,OAAM;MACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA;;;qCAE1D,mBAKO,QAAA,YAAA,CAAA,gBAAA,gBAJF,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;KAD5D,OAAM;KACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA"}
1
+ {"version":3,"file":"ResponseMetaInformation.vue.script.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { formatBytes } from '@scalar/helpers/formatters/format-bytes'\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? formatBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,cAAa;EAChC,MAAM,WAAW,KAAoC;EACrD,MAAM,YAAY,IAAI,EAAC;AAEvB,SAAO,cAAc,IAAI,WAAW;AAClC,OAAI,WAAW,QACb,UAAS,QAAQ,kBAAmB,UAAU,SAAS,KAAO,IAAI;QAC7D;AACL,kBAAc,SAAS,MAAK;AAC5B,aAAS,QAAQ,KAAA;AACjB,cAAU,QAAQ;;IAErB;;EAGD,MAAM,oBAAoB,aAA+B;GACvD,MAAM,gBAAgB,OAAO,SAC3B,SAAS,UAAU,qBACjB,SAAS,UAAU,qBACnB,KACF,GACF;AAEA,UAAO,gBAAgB,YAAY,cAAc,GAAG,KAAA;;;EAItD,MAAM,wBAAwB,eAA2C;GACvE,MAAM,qBAAqB,MAAM,SAAS;AAE1C,OAAI,CAAC,mBACH;AAGF,UAAO,gBAAgB,uBAAuB,KAAA;IAC/C;;uBAGC,mBAgCM,OAhCN,YAgCM,CA/BQ,SAAA,SAAY,UAAA,SAAA,WAAA,EAAxB,mBAES,QAAA,YAAA,gBADP,MAAA,mBAAkB,CAAC,UAAA,MAAS,CAAA,EAAA,EAAA,KAAA,WAAA,EAE9B,mBA2BW,UAAA,EAAA,KAAA,GAAA,EAAA;IA1BT,mBAGO,QAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAA4D,QAAA,EAAtD,OAAM,WAAS,EAAC,mCAA+B,GAAA,GAAA,gBAAO,MAC5D,gBAAG,MAAA,mBAAkB,CAAC,QAAA,SAAS,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA;IAE7B,iBAAiB,QAAA,SAAQ,IAAA,WAAA,EAArC,mBAGO,QAAA,YAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAAoC,QAAA,EAA9B,OAAM,WAAS,EAAC,WAAO,GAAA,GAAA,gBAAO,MACpC,gBAAG,iBAAiB,QAAA,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA;IAEd,sBAAA,SAAA,WAAA,EAAhB,mBAiBW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,OAAA,OAAA,OAAA,KAhBT,mBAAsC,QAAA,EAAhC,OAAM,WAAS,EAAC,aAAS,GAAA,GAEvB,sBAAA,MAAsB,OAAA,WAAA,EAD9B,YAQc,qBAAA;;KANZ,OAAM;KACL,MAAM,sBAAA,MAAsB;;4BACR,CAAA,gBAAA,gBAAlB,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;MAD5D,OAAM;MACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA;;;qCAE1D,mBAKO,QAAA,YAAA,CAAA,gBAAA,gBAJF,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;KAD5D,OAAM;KACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA"}
@@ -156,7 +156,7 @@ var authorizeServers = async (flow, scopes, { code, pkce, proxyUrl } = {}, activ
156
156
  formData.set("password", flow.password);
157
157
  } else formData.set("grant_type", "client_credentials");
158
158
  if (flow["x-scalar-security-body"]) Object.entries(flow["x-scalar-security-body"]).forEach(([key, value]) => {
159
- if (value) formData.set(key, value);
159
+ if (value !== void 0 && value !== null) formData.set(key, String(value));
160
160
  });
161
161
  try {
162
162
  const headers = { "Content-Type": "application/x-www-form-urlencoded" };
@@ -1 +1 @@
1
- {"version":3,"file":"oauth2.js","names":[],"sources":["../../../../src/views/Request/libs/oauth2.ts"],"sourcesContent":["import { replaceVariables } from '@scalar/helpers/regex/replace-variables'\nimport { isRelativePath } from '@scalar/helpers/url/is-relative-path'\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { shouldUseProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { Oauth2Flow, Server } from '@scalar/oas-utils/entities/spec'\nimport { encode, fromUint8Array } from 'js-base64'\n\nimport type { ErrorResponse } from '@/libs/errors'\n\n/** Oauth2 security schemes which are not implicit */\ntype NonImplicitFlow = Exclude<Oauth2Flow, { type: 'implicit' }>\n\ntype PKCEState = {\n codeVerifier: string\n codeChallenge: string\n codeChallengeMethod: string\n}\n\n/**\n * Interpolates server URL template variables (e.g. `https://{env}.example.com`)\n * using the user-set `value` when available, falling back to the OpenAPI `default`.\n * This is needed so OAuth flows that use the server URL as a base resolve correctly\n * when the spec defines server variables.\n */\nexport const getInterpolatedServerUrl = (activeServer?: Server): string | undefined => {\n if (!activeServer?.url) return undefined\n\n const serverVariables = Object.entries(activeServer.variables ?? {}).reduce(\n (acc, [name, variable]) => {\n // User-set value takes priority over the OpenAPI default\n const value = variable.value || variable.default\n if (value) acc[name] = value\n return acc\n },\n {} as Record<string, string>,\n )\n\n return replaceVariables(activeServer.url, serverVariables)\n}\n\nconst getActiveServerBase = (activeServer?: Server) => {\n const serverUrl = getInterpolatedServerUrl(activeServer)\n\n if (!serverUrl) {\n return {}\n }\n\n if (isRelativePath(serverUrl)) {\n return typeof window === 'undefined' ? {} : { basePath: serverUrl }\n }\n\n return { baseUrl: serverUrl }\n}\n\n/**\n * Generates a random string for PKCE code verifier\n *\n * @see https://www.rfc-editor.org/rfc/rfc7636#page-8\n */\nconst generateCodeVerifier = (): string => {\n // Generate 32 random bytes\n const buffer = new Uint8Array(32)\n crypto.getRandomValues(buffer)\n\n // Base64URL encode the bytes\n return fromUint8Array(buffer, true)\n}\n\n/**\n * Creates a code challenge from the code verifier\n */\nexport const generateCodeChallenge = async (verifier: string, encoding: 'SHA-256' | 'plain'): Promise<string> => {\n if (encoding === 'plain') {\n return verifier\n }\n\n // If crypto.subtle.digest is not a function, we cannot use SHA-256\n if (typeof crypto?.subtle?.digest !== 'function') {\n console.warn('SHA-256 is only supported when using https, using a plain text code challenge instead.')\n return verifier\n }\n\n // ASCII encoding is just taking the lower 8 bits of each character\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n\n // Base64URL encode the bytes\n return fromUint8Array(new Uint8Array(digest), true)\n}\n\n/**\n * Authorize oauth2 flow\n *\n * @returns the accessToken\n */\nexport const authorizeOauth2 = async (\n flow: Oauth2Flow,\n /** We use the active server to set a base for relative redirect uris */\n activeServer: Server,\n /** If we want to use the proxy */\n proxyUrl?: string,\n): Promise<ErrorResponse<string>> => {\n try {\n if (!flow) {\n return [new Error('Flow not found'), null]\n }\n\n const scopes = flow.selectedScopes.join(' ')\n\n // Client Credentials or Password Flow\n if (flow.type === 'clientCredentials' || flow.type === 'password') {\n return authorizeServers(\n flow,\n scopes,\n {\n proxyUrl,\n },\n activeServer,\n )\n }\n\n // OAuth2 flows with a login popup\n\n // Generate a random state string with the length of 8 characters\n const state = (Math.random() + 1).toString(36).substring(2, 10)\n const authorizationUrl = makeUrlAbsolute(flow.authorizationUrl, getActiveServerBase(activeServer))\n const url = new URL(authorizationUrl)\n\n /** Special PKCE state */\n let pkce: PKCEState | null = null\n\n // Params unique to the flows\n if (flow.type === 'implicit') {\n url.searchParams.set('response_type', 'token')\n }\n\n // Authorization Code Flow\n else if (flow.type === 'authorizationCode') {\n url.searchParams.set('response_type', 'code')\n\n // PKCE\n if (flow['x-usePkce'] !== 'no') {\n const codeVerifier = generateCodeVerifier()\n const codeChallenge = await generateCodeChallenge(codeVerifier, flow['x-usePkce'])\n\n // Set state for later verification\n pkce = {\n codeVerifier,\n codeChallenge,\n codeChallengeMethod: flow['x-usePkce'] === 'SHA-256' ? 'S256' : 'plain',\n }\n\n // Set the code challenge and method on the url\n url.searchParams.set('code_challenge', codeChallenge)\n url.searchParams.set('code_challenge_method', pkce.codeChallengeMethod)\n }\n }\n\n // Handle relative redirect uris\n if (flow['x-scalar-redirect-uri'].startsWith('/')) {\n const baseUrl = getInterpolatedServerUrl(activeServer) || window.location.origin + window.location.pathname\n const redirectUri = makeUrlAbsolute(flow['x-scalar-redirect-uri'], { baseUrl: baseUrl })\n\n url.searchParams.set('redirect_uri', redirectUri)\n } else {\n url.searchParams.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n if (flow['x-scalar-security-query']) {\n Object.keys(flow['x-scalar-security-query']).forEach((key: string): void => {\n const value = flow['x-scalar-security-query']?.[key]\n if (!value) {\n return\n }\n url.searchParams.set(key, value)\n })\n }\n\n // Common to all flows\n url.searchParams.set('client_id', flow['x-scalar-client-id'])\n url.searchParams.set('state', state)\n if (scopes) {\n url.searchParams.set('scope', scopes)\n }\n\n const windowFeatures = 'left=100,top=100,width=800,height=600'\n const authWindow = window.open(url, 'openAuth2Window', windowFeatures)\n\n // Open up a window and poll until closed or we have the data we want\n if (authWindow) {\n // We need to return a promise here due to the setInterval\n return new Promise<ErrorResponse<string>>((resolve) => {\n const checkWindowClosed = setInterval(() => {\n let accessToken: string | null = null\n let code: string | null = null\n let error: string | null = null\n let errorDescription: string | null = null\n\n try {\n const urlParams = new URL(authWindow.location.href).searchParams\n const tokenName = flow['x-tokenName'] || 'access_token'\n accessToken = urlParams.get(tokenName)\n code = urlParams.get('code')\n\n error = urlParams.get('error')\n errorDescription = urlParams.get('error_description')\n\n // We may get the properties in a hash\n const hashParams = new URLSearchParams(authWindow.location.href.split('#')[1])\n accessToken ||= hashParams.get(tokenName)\n code ||= hashParams.get('code')\n error ||= hashParams.get('error')\n errorDescription ||= hashParams.get('error_description')\n } catch (_e) {\n // Ignore CORS error from popup\n }\n\n // The window has closed OR we have what we are looking for so we stop polling\n if (authWindow.closed || accessToken || code || error) {\n clearInterval(checkWindowClosed)\n authWindow.close()\n\n if (error) {\n resolve([new Error(`OAuth error: ${error}${errorDescription ? ` (${errorDescription})` : ''}`), null])\n }\n\n // Implicit Flow\n else if (accessToken) {\n // State is a hash fragment and cannot be found through search params\n const _state = authWindow.location.href.match(/state=([^&]*)/)?.[1]\n\n if (_state === state) {\n resolve([null, accessToken])\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n\n // Authorization Code Server Flow\n else if (code) {\n const _state = new URL(authWindow.location.href).searchParams.get('state')\n\n if (_state === state) {\n // biome-ignore lint/nursery/noFloatingPromises: output of authorizeServers must be returned\n authorizeServers(\n flow as NonImplicitFlow,\n scopes,\n {\n code,\n pkce,\n proxyUrl,\n },\n activeServer,\n ).then(resolve)\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n // User closed window without authorizing\n else {\n clearInterval(checkWindowClosed)\n resolve([new Error('Window was closed without granting authorization'), null])\n }\n }\n }, 200)\n })\n }\n return [new Error('Failed to open auth window'), null]\n } catch (_) {\n return [new Error('Failed to authorize oauth2 flow'), null]\n }\n}\n\n/**\n * Makes the BE authorization call to grab the token server to server\n * Used for clientCredentials and authorizationCode\n */\nexport const authorizeServers = async (\n flow: NonImplicitFlow,\n scopes: string,\n {\n code,\n pkce,\n proxyUrl,\n }: {\n code?: string\n pkce?: PKCEState | null\n proxyUrl?: string | undefined\n } = {},\n activeServer: Server | undefined,\n): Promise<ErrorResponse<string>> => {\n if (!flow) {\n return [new Error('OAuth2 flow was not defined'), null]\n }\n\n const formData = new URLSearchParams()\n formData.set('client_id', flow['x-scalar-client-id'])\n\n // Only client credentials and password flows support scopes in the token request\n if (scopes && (flow.type === 'clientCredentials' || flow.type === 'password')) {\n formData.set('scope', scopes)\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to body\n const shouldAddSecretToBody =\n flow.clientSecret && (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'body')\n\n if (shouldAddSecretToBody) {\n formData.set('client_secret', flow.clientSecret)\n }\n if ('x-scalar-redirect-uri' in flow && flow['x-scalar-redirect-uri']) {\n formData.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n // Authorization Code\n if (code) {\n formData.set('code', code)\n formData.set('grant_type', 'authorization_code')\n\n // PKCE\n if (pkce) {\n formData.set('code_verifier', pkce.codeVerifier)\n }\n }\n // Password\n else if (flow.type === 'password') {\n formData.set('grant_type', 'password')\n formData.set('username', flow.username)\n formData.set('password', flow.password)\n }\n // Client Credentials\n else {\n formData.set('grant_type', 'client_credentials')\n }\n\n // Additional request body parameters\n if (flow['x-scalar-security-body']) {\n Object.entries(flow['x-scalar-security-body']).forEach(([key, value]) => {\n if (value) {\n formData.set(key, value)\n }\n })\n }\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to header\n const shouldAddSecretToHeader =\n flow.clientSecret &&\n (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'header')\n\n // Add client id + secret to headers\n if (shouldAddSecretToHeader) {\n headers.Authorization = `Basic ${encode(`${flow['x-scalar-client-id']}:${flow.clientSecret}`)}`\n }\n\n // Check if we should use the proxy\n const tokenUrl = makeUrlAbsolute(flow.tokenUrl, getActiveServerBase(activeServer))\n const url = shouldUseProxy(proxyUrl, tokenUrl)\n ? `${proxyUrl}?${new URLSearchParams([['scalar_url', tokenUrl]]).toString()}`\n : tokenUrl\n\n // Make the call\n const resp = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n const responseData = await resp.json()\n\n // Use custom token name if specified, otherwise default to access_token\n const tokenName = flow['x-tokenName'] || 'access_token'\n const accessToken = responseData[tokenName]\n\n return [null, accessToken]\n } catch {\n return [new Error('Failed to get an access token. Please check your credentials.'), null]\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oauth2.js","names":[],"sources":["../../../../src/views/Request/libs/oauth2.ts"],"sourcesContent":["import { replaceVariables } from '@scalar/helpers/regex/replace-variables'\nimport { isRelativePath } from '@scalar/helpers/url/is-relative-path'\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { shouldUseProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { Oauth2Flow, Server } from '@scalar/oas-utils/entities/spec'\nimport { encode, fromUint8Array } from 'js-base64'\n\nimport type { ErrorResponse } from '@/libs/errors'\n\n/** Oauth2 security schemes which are not implicit */\ntype NonImplicitFlow = Exclude<Oauth2Flow, { type: 'implicit' }>\n\ntype PKCEState = {\n codeVerifier: string\n codeChallenge: string\n codeChallengeMethod: string\n}\n\n/**\n * Interpolates server URL template variables (e.g. `https://{env}.example.com`)\n * using the user-set `value` when available, falling back to the OpenAPI `default`.\n * This is needed so OAuth flows that use the server URL as a base resolve correctly\n * when the spec defines server variables.\n */\nexport const getInterpolatedServerUrl = (activeServer?: Server): string | undefined => {\n if (!activeServer?.url) return undefined\n\n const serverVariables = Object.entries(activeServer.variables ?? {}).reduce(\n (acc, [name, variable]) => {\n // User-set value takes priority over the OpenAPI default\n const value = variable.value || variable.default\n if (value) acc[name] = value\n return acc\n },\n {} as Record<string, string>,\n )\n\n return replaceVariables(activeServer.url, serverVariables)\n}\n\nconst getActiveServerBase = (activeServer?: Server) => {\n const serverUrl = getInterpolatedServerUrl(activeServer)\n\n if (!serverUrl) {\n return {}\n }\n\n if (isRelativePath(serverUrl)) {\n return typeof window === 'undefined' ? {} : { basePath: serverUrl }\n }\n\n return { baseUrl: serverUrl }\n}\n\n/**\n * Generates a random string for PKCE code verifier\n *\n * @see https://www.rfc-editor.org/rfc/rfc7636#page-8\n */\nconst generateCodeVerifier = (): string => {\n // Generate 32 random bytes\n const buffer = new Uint8Array(32)\n crypto.getRandomValues(buffer)\n\n // Base64URL encode the bytes\n return fromUint8Array(buffer, true)\n}\n\n/**\n * Creates a code challenge from the code verifier\n */\nexport const generateCodeChallenge = async (verifier: string, encoding: 'SHA-256' | 'plain'): Promise<string> => {\n if (encoding === 'plain') {\n return verifier\n }\n\n // If crypto.subtle.digest is not a function, we cannot use SHA-256\n if (typeof crypto?.subtle?.digest !== 'function') {\n console.warn('SHA-256 is only supported when using https, using a plain text code challenge instead.')\n return verifier\n }\n\n // ASCII encoding is just taking the lower 8 bits of each character\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n\n // Base64URL encode the bytes\n return fromUint8Array(new Uint8Array(digest), true)\n}\n\n/**\n * Authorize oauth2 flow\n *\n * @returns the accessToken\n */\nexport const authorizeOauth2 = async (\n flow: Oauth2Flow,\n /** We use the active server to set a base for relative redirect uris */\n activeServer: Server,\n /** If we want to use the proxy */\n proxyUrl?: string,\n): Promise<ErrorResponse<string>> => {\n try {\n if (!flow) {\n return [new Error('Flow not found'), null]\n }\n\n const scopes = flow.selectedScopes.join(' ')\n\n // Client Credentials or Password Flow\n if (flow.type === 'clientCredentials' || flow.type === 'password') {\n return authorizeServers(\n flow,\n scopes,\n {\n proxyUrl,\n },\n activeServer,\n )\n }\n\n // OAuth2 flows with a login popup\n\n // Generate a random state string with the length of 8 characters\n const state = (Math.random() + 1).toString(36).substring(2, 10)\n const authorizationUrl = makeUrlAbsolute(flow.authorizationUrl, getActiveServerBase(activeServer))\n const url = new URL(authorizationUrl)\n\n /** Special PKCE state */\n let pkce: PKCEState | null = null\n\n // Params unique to the flows\n if (flow.type === 'implicit') {\n url.searchParams.set('response_type', 'token')\n }\n\n // Authorization Code Flow\n else if (flow.type === 'authorizationCode') {\n url.searchParams.set('response_type', 'code')\n\n // PKCE\n if (flow['x-usePkce'] !== 'no') {\n const codeVerifier = generateCodeVerifier()\n const codeChallenge = await generateCodeChallenge(codeVerifier, flow['x-usePkce'])\n\n // Set state for later verification\n pkce = {\n codeVerifier,\n codeChallenge,\n codeChallengeMethod: flow['x-usePkce'] === 'SHA-256' ? 'S256' : 'plain',\n }\n\n // Set the code challenge and method on the url\n url.searchParams.set('code_challenge', codeChallenge)\n url.searchParams.set('code_challenge_method', pkce.codeChallengeMethod)\n }\n }\n\n // Handle relative redirect uris\n if (flow['x-scalar-redirect-uri'].startsWith('/')) {\n const baseUrl = getInterpolatedServerUrl(activeServer) || window.location.origin + window.location.pathname\n const redirectUri = makeUrlAbsolute(flow['x-scalar-redirect-uri'], { baseUrl: baseUrl })\n\n url.searchParams.set('redirect_uri', redirectUri)\n } else {\n url.searchParams.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n if (flow['x-scalar-security-query']) {\n Object.keys(flow['x-scalar-security-query']).forEach((key: string): void => {\n const value = flow['x-scalar-security-query']?.[key]\n if (!value) {\n return\n }\n url.searchParams.set(key, value)\n })\n }\n\n // Common to all flows\n url.searchParams.set('client_id', flow['x-scalar-client-id'])\n url.searchParams.set('state', state)\n if (scopes) {\n url.searchParams.set('scope', scopes)\n }\n\n const windowFeatures = 'left=100,top=100,width=800,height=600'\n const authWindow = window.open(url, 'openAuth2Window', windowFeatures)\n\n // Open up a window and poll until closed or we have the data we want\n if (authWindow) {\n // We need to return a promise here due to the setInterval\n return new Promise<ErrorResponse<string>>((resolve) => {\n const checkWindowClosed = setInterval(() => {\n let accessToken: string | null = null\n let code: string | null = null\n let error: string | null = null\n let errorDescription: string | null = null\n\n try {\n const urlParams = new URL(authWindow.location.href).searchParams\n const tokenName = flow['x-tokenName'] || 'access_token'\n accessToken = urlParams.get(tokenName)\n code = urlParams.get('code')\n\n error = urlParams.get('error')\n errorDescription = urlParams.get('error_description')\n\n // We may get the properties in a hash\n const hashParams = new URLSearchParams(authWindow.location.href.split('#')[1])\n accessToken ||= hashParams.get(tokenName)\n code ||= hashParams.get('code')\n error ||= hashParams.get('error')\n errorDescription ||= hashParams.get('error_description')\n } catch (_e) {\n // Ignore CORS error from popup\n }\n\n // The window has closed OR we have what we are looking for so we stop polling\n if (authWindow.closed || accessToken || code || error) {\n clearInterval(checkWindowClosed)\n authWindow.close()\n\n if (error) {\n resolve([new Error(`OAuth error: ${error}${errorDescription ? ` (${errorDescription})` : ''}`), null])\n }\n\n // Implicit Flow\n else if (accessToken) {\n // State is a hash fragment and cannot be found through search params\n const _state = authWindow.location.href.match(/state=([^&]*)/)?.[1]\n\n if (_state === state) {\n resolve([null, accessToken])\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n\n // Authorization Code Server Flow\n else if (code) {\n const _state = new URL(authWindow.location.href).searchParams.get('state')\n\n if (_state === state) {\n // biome-ignore lint/nursery/noFloatingPromises: output of authorizeServers must be returned\n authorizeServers(\n flow as NonImplicitFlow,\n scopes,\n {\n code,\n pkce,\n proxyUrl,\n },\n activeServer,\n ).then(resolve)\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n // User closed window without authorizing\n else {\n clearInterval(checkWindowClosed)\n resolve([new Error('Window was closed without granting authorization'), null])\n }\n }\n }, 200)\n })\n }\n return [new Error('Failed to open auth window'), null]\n } catch (_) {\n return [new Error('Failed to authorize oauth2 flow'), null]\n }\n}\n\n/**\n * Makes the BE authorization call to grab the token server to server\n * Used for clientCredentials and authorizationCode\n */\nexport const authorizeServers = async (\n flow: NonImplicitFlow,\n scopes: string,\n {\n code,\n pkce,\n proxyUrl,\n }: {\n code?: string\n pkce?: PKCEState | null\n proxyUrl?: string | undefined\n } = {},\n activeServer: Server | undefined,\n): Promise<ErrorResponse<string>> => {\n if (!flow) {\n return [new Error('OAuth2 flow was not defined'), null]\n }\n\n const formData = new URLSearchParams()\n formData.set('client_id', flow['x-scalar-client-id'])\n\n // Only client credentials and password flows support scopes in the token request\n if (scopes && (flow.type === 'clientCredentials' || flow.type === 'password')) {\n formData.set('scope', scopes)\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to body\n const shouldAddSecretToBody =\n flow.clientSecret && (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'body')\n\n if (shouldAddSecretToBody) {\n formData.set('client_secret', flow.clientSecret)\n }\n if ('x-scalar-redirect-uri' in flow && flow['x-scalar-redirect-uri']) {\n formData.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n // Authorization Code\n if (code) {\n formData.set('code', code)\n formData.set('grant_type', 'authorization_code')\n\n // PKCE\n if (pkce) {\n formData.set('code_verifier', pkce.codeVerifier)\n }\n }\n // Password\n else if (flow.type === 'password') {\n formData.set('grant_type', 'password')\n formData.set('username', flow.username)\n formData.set('password', flow.password)\n }\n // Client Credentials\n else {\n formData.set('grant_type', 'client_credentials')\n }\n\n // Additional request body parameters\n if (flow['x-scalar-security-body']) {\n Object.entries(flow['x-scalar-security-body']).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n formData.set(key, String(value))\n }\n })\n }\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to header\n const shouldAddSecretToHeader =\n flow.clientSecret &&\n (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'header')\n\n // Add client id + secret to headers\n if (shouldAddSecretToHeader) {\n headers.Authorization = `Basic ${encode(`${flow['x-scalar-client-id']}:${flow.clientSecret}`)}`\n }\n\n // Check if we should use the proxy\n const tokenUrl = makeUrlAbsolute(flow.tokenUrl, getActiveServerBase(activeServer))\n const url = shouldUseProxy(proxyUrl, tokenUrl)\n ? `${proxyUrl}?${new URLSearchParams([['scalar_url', tokenUrl]]).toString()}`\n : tokenUrl\n\n // Make the call\n const resp = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n const responseData = await resp.json()\n\n // Use custom token name if specified, otherwise default to access_token\n const tokenName = flow['x-tokenName'] || 'access_token'\n const accessToken = responseData[tokenName]\n\n return [null, accessToken]\n } catch {\n return [new Error('Failed to get an access token. Please check your credentials.'), null]\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "rest",
19
19
  "testing"
20
20
  ],
21
- "version": "2.39.3",
21
+ "version": "2.40.0",
22
22
  "engines": {
23
23
  "node": ">=22"
24
24
  },
@@ -271,11 +271,6 @@
271
271
  "types": "./dist/v2/features/settings/index.d.ts",
272
272
  "default": "./dist/v2/features/settings/index.js"
273
273
  },
274
- "./v2/helpers": {
275
- "import": "./dist/v2/helpers/index.js",
276
- "types": "./dist/v2/helpers/index.d.ts",
277
- "default": "./dist/v2/helpers/index.js"
278
- },
279
274
  "./views/Components/CodeSnippet": {
280
275
  "import": "./dist/views/Components/CodeSnippet/index.js",
281
276
  "types": "./dist/views/Components/CodeSnippet/index.d.ts",
@@ -325,10 +320,10 @@
325
320
  "@headlessui/tailwindcss": "^0.2.2",
326
321
  "@headlessui/vue": "1.7.23",
327
322
  "@scalar/typebox": "^0.1.3",
328
- "@types/har-format": "^1.2.15",
323
+ "@types/har-format": "^1.2.16",
329
324
  "@vueuse/core": "13.9.0",
330
325
  "@vueuse/integrations": "13.9.0",
331
- "focus-trap": "^7",
326
+ "focus-trap": "^7.8.0",
332
327
  "fuse.js": "^7.1.0",
333
328
  "js-base64": "^3.7.8",
334
329
  "microdiff": "^1.5.0",
@@ -336,35 +331,34 @@
336
331
  "monaco-yaml": "5.2.3",
337
332
  "nanoid": "^5.1.6",
338
333
  "posthog-js": "1.363.2",
339
- "pretty-bytes": "^7.1.0",
340
334
  "pretty-ms": "^9.3.0",
341
335
  "radix-vue": "^1.9.17",
342
- "shell-quote": "^1.8.1",
336
+ "shell-quote": "^1.8.3",
343
337
  "type-fest": "^5.3.1",
344
338
  "vite-plugin-monaco-editor": "^1.1.0",
345
- "vue": "^3.5.26",
339
+ "vue": "^3.5.30",
346
340
  "vue-router": "4.6.2",
347
341
  "whatwg-mimetype": "4.0.0",
348
342
  "yaml": "^2.8.0",
349
343
  "zod": "^4.3.5",
350
- "@scalar/components": "0.21.1",
344
+ "@scalar/components": "0.21.3",
351
345
  "@scalar/draggable": "0.4.1",
352
- "@scalar/import": "0.5.3",
353
- "@scalar/helpers": "0.4.2",
354
- "@scalar/json-magic": "0.12.4",
355
- "@scalar/icons": "0.7.0",
356
- "@scalar/oas-utils": "0.10.13",
357
- "@scalar/openapi-types": "0.6.1",
358
- "@scalar/object-utils": "1.3.3",
359
- "@scalar/postman-to-openapi": "0.6.0",
360
- "@scalar/sidebar": "0.8.15",
361
- "@scalar/snippetz": "0.7.7",
362
- "@scalar/themes": "0.15.1",
363
- "@scalar/types": "0.7.5",
364
- "@scalar/use-codemirror": "0.14.10",
365
- "@scalar/use-hooks": "0.4.1",
366
- "@scalar/workspace-store": "0.41.2",
367
- "@scalar/use-toasts": "0.10.1"
346
+ "@scalar/helpers": "0.4.3",
347
+ "@scalar/icons": "0.7.2",
348
+ "@scalar/import": "0.5.4",
349
+ "@scalar/json-magic": "0.12.5",
350
+ "@scalar/oas-utils": "0.10.15",
351
+ "@scalar/object-utils": "1.3.4",
352
+ "@scalar/openapi-types": "0.7.0",
353
+ "@scalar/sidebar": "0.8.17",
354
+ "@scalar/postman-to-openapi": "0.6.1",
355
+ "@scalar/themes": "0.15.2",
356
+ "@scalar/types": "0.7.6",
357
+ "@scalar/snippetz": "0.7.8",
358
+ "@scalar/use-codemirror": "0.14.11",
359
+ "@scalar/use-hooks": "0.4.2",
360
+ "@scalar/use-toasts": "0.10.1",
361
+ "@scalar/workspace-store": "0.43.0"
368
362
  },
369
363
  "devDependencies": {
370
364
  "@tailwindcss/vite": "^4.2.0",
@@ -373,14 +367,14 @@
373
367
  "@vitejs/plugin-vue": "^6.0.3",
374
368
  "@vue/test-utils": "2.4.6",
375
369
  "fake-indexeddb": "6.2.3",
376
- "fastify": "^5.3.3",
370
+ "fastify": "^5.8.1",
377
371
  "jsdom": "27.4.0",
378
372
  "tailwindcss": "^4.1.18",
379
373
  "vite": "8.0.0",
380
374
  "vite-svg-loader": "5.1.1",
381
375
  "vitest": "4.1.0",
382
- "@scalar/galaxy": "0.6.1",
383
- "@scalar/pre-post-request-scripts": "0.3.15"
376
+ "@scalar/galaxy": "0.6.2",
377
+ "@scalar/pre-post-request-scripts": "0.3.17"
384
378
  },
385
379
  "scripts": {
386
380
  "build": "vite build && vue-tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
@@ -1,12 +0,0 @@
1
- /**
2
- * Formats bytes to a more readable format
3
- *
4
- * @see https://stackoverflow.com/a/18650828/1624255
5
- */
6
- export declare const formatBytes: (bytes: number, decimals?: number) => string;
7
- /**
8
- * Formats milliseconds to seconds and appends an "s" if more than one second
9
- * else returns ms appended to the number
10
- */
11
- export declare const formatMs: (ms: number, decimals?: number) => string;
12
- //# sourceMappingURL=formatters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/libs/formatters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,iBAAY,WAWtD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,IAAI,MAAM,EAAE,iBAAY,KAAG,MAKnD,CAAA"}
@@ -1,36 +0,0 @@
1
- //#region src/libs/formatters.ts
2
- /**
3
- * Formats bytes to a more readable format
4
- *
5
- * @see https://stackoverflow.com/a/18650828/1624255
6
- */
7
- var formatBytes = (bytes, decimals = 2) => {
8
- if (!+bytes) return "0 Bytes";
9
- const k = 1024;
10
- const dm = decimals < 0 ? 0 : decimals;
11
- const sizes = [
12
- "B",
13
- "KiB",
14
- "MiB",
15
- "GiB",
16
- "TiB",
17
- "PiB",
18
- "EiB",
19
- "ZiB",
20
- "YiB"
21
- ];
22
- const i = Math.floor(Math.log(bytes) / Math.log(k));
23
- return `${Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm))}${sizes[i]}`;
24
- };
25
- /**
26
- * Formats milliseconds to seconds and appends an "s" if more than one second
27
- * else returns ms appended to the number
28
- */
29
- var formatMs = (ms, decimals = 2) => {
30
- if (ms > 1e3) return (ms / 1e3).toFixed(decimals) + "s";
31
- return ms + "ms";
32
- };
33
- //#endregion
34
- export { formatBytes, formatMs };
35
-
36
- //# sourceMappingURL=formatters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.js","names":[],"sources":["../../src/libs/formatters.ts"],"sourcesContent":["/**\n * Formats bytes to a more readable format\n *\n * @see https://stackoverflow.com/a/18650828/1624255\n */\nexport const formatBytes = (bytes: number, decimals = 2) => {\n if (!+bytes) {\n return '0 Bytes'\n }\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return `${Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm))}${sizes[i]}`\n}\n\n/**\n * Formats milliseconds to seconds and appends an \"s\" if more than one second\n * else returns ms appended to the number\n */\nexport const formatMs = (ms: number, decimals = 2): string => {\n if (ms > 1000) {\n return (ms / 1000).toFixed(decimals) + 's'\n }\n return ms + 'ms'\n}\n"],"mappings":";;;;;;AAKA,IAAa,eAAe,OAAe,WAAW,MAAM;AAC1D,KAAI,CAAC,CAAC,MACJ,QAAO;CAGT,MAAM,IAAI;CACV,MAAM,KAAK,WAAW,IAAI,IAAI;CAC9B,MAAM,QAAQ;EAAC;EAAK;EAAO;EAAO;EAAO;EAAO;EAAO;EAAO;EAAO;EAAM;CAC3E,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AAEnD,QAAO,GAAG,OAAO,YAAY,QAAQ,KAAK,IAAI,GAAG,EAAE,EAAE,QAAQ,GAAG,CAAC,GAAG,MAAM;;;;;;AAO5E,IAAa,YAAY,IAAY,WAAW,MAAc;AAC5D,KAAI,KAAK,IACP,SAAQ,KAAK,KAAM,QAAQ,SAAS,GAAG;AAEzC,QAAO,KAAK"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Decodes reserved character percent-encodings only for query keys marked with
3
- * OpenAPI's `allowReserved: true`.
4
- */
5
- export declare const applyAllowReservedToUrl: (url: string, allowReservedQueryParameters: Set<string>) => string;
6
- //# sourceMappingURL=apply-allow-reserved-to-url.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apply-allow-reserved-to-url.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.ts"],"names":[],"mappings":"AAsCA;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,KAAK,MAAM,EAAE,8BAA8B,GAAG,CAAC,MAAM,CAAC,KAAG,MAwChG,CAAA"}