@scalar/api-client 3.19.3 → 3.20.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 (403) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/components/HttpMethod/HttpMethod.vue.d.ts +2 -2
  3. package/dist/components/SectionFilter.vue.d.ts +2 -0
  4. package/dist/components/SectionFilter.vue.d.ts.map +1 -1
  5. package/dist/components/SectionFilter.vue.js +1 -1
  6. package/dist/components/SectionFilter.vue.js.map +1 -1
  7. package/dist/components/SectionFilter.vue.script.js +11 -8
  8. package/dist/components/SectionFilter.vue.script.js.map +1 -1
  9. package/dist/components/Server/ServerVariablesSelect.vue.d.ts.map +1 -1
  10. package/dist/components/Server/ServerVariablesSelect.vue.js.map +1 -1
  11. package/dist/components/Server/ServerVariablesSelect.vue.script.js +5 -3
  12. package/dist/components/Server/ServerVariablesSelect.vue.script.js.map +1 -1
  13. package/dist/components/Server/ServerVariablesTextbox.vue.d.ts.map +1 -1
  14. package/dist/components/Server/ServerVariablesTextbox.vue.js.map +1 -1
  15. package/dist/components/Server/ServerVariablesTextbox.vue.script.js +6 -3
  16. package/dist/components/Server/ServerVariablesTextbox.vue.script.js.map +1 -1
  17. package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.d.ts.map +1 -1
  18. package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.js.map +1 -1
  19. package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.script.js +4 -2
  20. package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.script.js.map +1 -1
  21. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.d.ts.map +1 -1
  22. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.js.map +1 -1
  23. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js +3 -1
  24. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js.map +1 -1
  25. package/dist/style.css +159 -135
  26. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +2 -0
  27. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  28. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  29. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +9 -3
  30. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  31. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
  32. package/dist/v2/blocks/operation-block/components/Header.vue.js +1 -1
  33. package/dist/v2/blocks/operation-block/components/Header.vue.js.map +1 -1
  34. package/dist/v2/blocks/operation-block/components/Header.vue.script.js +10 -6
  35. package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -1
  36. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.d.ts.map +1 -1
  37. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js +1 -1
  38. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js.map +1 -1
  39. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js +4 -2
  40. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js.map +1 -1
  41. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts.map +1 -1
  42. package/dist/v2/blocks/operation-block/helpers/send-request.js +4 -3
  43. package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -1
  44. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts +2 -0
  45. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
  46. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  47. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  48. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +51 -26
  49. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  50. package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
  51. package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
  52. package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -1
  53. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +28 -8
  54. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
  55. package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.d.ts.map +1 -1
  56. package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.js.map +1 -1
  57. package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.script.js +9 -3
  58. package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.script.js.map +1 -1
  59. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.d.ts.map +1 -1
  60. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.js.map +1 -1
  61. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.script.js +6 -4
  62. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.script.js.map +1 -1
  63. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts.map +1 -1
  64. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js.map +1 -1
  65. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +3 -1
  66. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
  67. package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts.map +1 -1
  68. package/dist/v2/blocks/request-block/components/RequestParams.vue.js.map +1 -1
  69. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js +7 -5
  70. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js.map +1 -1
  71. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +2 -2
  72. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts.map +1 -1
  73. package/dist/v2/blocks/request-block/components/RequestTable.vue.js +1 -1
  74. package/dist/v2/blocks/request-block/components/RequestTable.vue.js.map +1 -1
  75. package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js +40 -7
  76. package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js.map +1 -1
  77. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts +12 -12
  78. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
  79. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
  80. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +24 -20
  81. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
  82. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.d.ts.map +1 -1
  83. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.js.map +1 -1
  84. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js +6 -4
  85. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js.map +1 -1
  86. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts.map +1 -1
  87. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +5 -4
  88. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js.map +1 -1
  89. package/dist/v2/blocks/response-block/ResponseBlock.vue.d.ts.map +1 -1
  90. package/dist/v2/blocks/response-block/ResponseBlock.vue.js +1 -1
  91. package/dist/v2/blocks/response-block/ResponseBlock.vue.js.map +1 -1
  92. package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js +34 -13
  93. package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js.map +1 -1
  94. package/dist/v2/blocks/response-block/components/Headers.vue.d.ts +3 -3
  95. package/dist/v2/blocks/response-block/components/Headers.vue.d.ts.map +1 -1
  96. package/dist/v2/blocks/response-block/components/Headers.vue.js.map +1 -1
  97. package/dist/v2/blocks/response-block/components/Headers.vue.script.js +5 -3
  98. package/dist/v2/blocks/response-block/components/Headers.vue.script.js.map +1 -1
  99. package/dist/v2/blocks/response-block/components/ResponseBody.vue.d.ts.map +1 -1
  100. package/dist/v2/blocks/response-block/components/ResponseBody.vue.js +1 -1
  101. package/dist/v2/blocks/response-block/components/ResponseBody.vue.js.map +1 -1
  102. package/dist/v2/blocks/response-block/components/ResponseBody.vue.script.js +3 -1
  103. package/dist/v2/blocks/response-block/components/ResponseBody.vue.script.js.map +1 -1
  104. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.d.ts.map +1 -1
  105. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.js.map +1 -1
  106. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js +11 -3
  107. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js.map +1 -1
  108. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.d.ts.map +1 -1
  109. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js +1 -1
  110. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js.map +1 -1
  111. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js +8 -6
  112. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js.map +1 -1
  113. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.d.ts +1 -0
  114. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.d.ts.map +1 -1
  115. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.js.map +1 -1
  116. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js +109 -56
  117. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js.map +1 -1
  118. package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.d.ts.map +1 -1
  119. package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.js.map +1 -1
  120. package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.script.js +5 -3
  121. package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.script.js.map +1 -1
  122. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.d.ts.map +1 -1
  123. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.js.map +1 -1
  124. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js +6 -3
  125. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js.map +1 -1
  126. package/dist/v2/blocks/response-block/components/ResponseCookies.vue.d.ts.map +1 -1
  127. package/dist/v2/blocks/response-block/components/ResponseCookies.vue.js.map +1 -1
  128. package/dist/v2/blocks/response-block/components/ResponseCookies.vue.script.js +7 -5
  129. package/dist/v2/blocks/response-block/components/ResponseCookies.vue.script.js.map +1 -1
  130. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.d.ts +2 -2
  131. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.d.ts.map +1 -1
  132. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js +1 -1
  133. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js.map +1 -1
  134. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js +20 -15
  135. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js.map +1 -1
  136. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.d.ts.map +1 -1
  137. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js +1 -1
  138. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js.map +1 -1
  139. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js +4 -2
  140. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js.map +1 -1
  141. package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.d.ts.map +1 -1
  142. package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.js.map +1 -1
  143. package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.script.js +11 -6
  144. package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.script.js.map +1 -1
  145. package/dist/v2/blocks/response-block/helpers/response-stream-multipart.d.ts +4 -0
  146. package/dist/v2/blocks/response-block/helpers/response-stream-multipart.d.ts.map +1 -0
  147. package/dist/v2/blocks/response-block/helpers/response-stream-multipart.js +100 -0
  148. package/dist/v2/blocks/response-block/helpers/response-stream-multipart.js.map +1 -0
  149. package/dist/v2/blocks/response-block/helpers/response-stream.d.ts +13 -0
  150. package/dist/v2/blocks/response-block/helpers/response-stream.d.ts.map +1 -0
  151. package/dist/v2/blocks/response-block/helpers/response-stream.js +97 -0
  152. package/dist/v2/blocks/response-block/helpers/response-stream.js.map +1 -0
  153. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +1 -1
  154. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  155. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
  156. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -1
  157. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +39 -27
  158. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
  159. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts +6 -6
  160. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts.map +1 -1
  161. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +1 -1
  162. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js.map +1 -1
  163. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js +7 -4
  164. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
  165. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.d.ts.map +1 -1
  166. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.js.map +1 -1
  167. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js +21 -16
  168. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js.map +1 -1
  169. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts.map +1 -1
  170. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js.map +1 -1
  171. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +7 -5
  172. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  173. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.d.ts.map +1 -1
  174. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.js.map +1 -1
  175. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js +7 -5
  176. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js.map +1 -1
  177. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  178. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
  179. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +105 -40
  180. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
  181. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts.map +1 -1
  182. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.js.map +1 -1
  183. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js +10 -8
  184. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js.map +1 -1
  185. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.d.ts.map +1 -1
  186. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.js.map +1 -1
  187. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js +14 -9
  188. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js.map +1 -1
  189. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.d.ts.map +1 -1
  190. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.js.map +1 -1
  191. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js +6 -4
  192. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js.map +1 -1
  193. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts.map +1 -1
  194. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.js.map +1 -1
  195. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js +3 -1
  196. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js.map +1 -1
  197. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
  198. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
  199. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js +40 -40
  200. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
  201. package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.d.ts +108 -7
  202. package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.d.ts.map +1 -1
  203. package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.js +12 -0
  204. package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.js.map +1 -1
  205. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts.map +1 -1
  206. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-oauth2-metadata.d.ts.map +1 -1
  207. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-oauth2-metadata.js +8 -5
  208. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-oauth2-metadata.js.map +1 -1
  209. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.d.ts +2 -0
  210. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.d.ts.map +1 -1
  211. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js +2 -0
  212. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js.map +1 -1
  213. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-allowed-oauth-url.d.ts +3 -0
  214. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-allowed-oauth-url.d.ts.map +1 -0
  215. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-allowed-oauth-url.js +8 -0
  216. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-allowed-oauth-url.js.map +1 -0
  217. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-client-authorization.d.ts +3 -0
  218. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-client-authorization.d.ts.map +1 -0
  219. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-client-authorization.js +11 -0
  220. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-client-authorization.js.map +1 -0
  221. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-device-authorization.d.ts +19 -0
  222. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-device-authorization.d.ts.map +1 -0
  223. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-device-authorization.js +117 -0
  224. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-device-authorization.js.map +1 -0
  225. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +2 -1
  226. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts.map +1 -1
  227. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +15 -11
  228. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js.map +1 -1
  229. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth2-metadata-to-flows.d.ts +1 -1
  230. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth2-metadata-to-flows.d.ts.map +1 -1
  231. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth2-metadata-to-flows.js +8 -1
  232. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth2-metadata-to-flows.js.map +1 -1
  233. package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.d.ts.map +1 -1
  234. package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js +6 -0
  235. package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js.map +1 -1
  236. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts +2 -1
  237. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts.map +1 -1
  238. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js +8 -6
  239. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js.map +1 -1
  240. package/dist/v2/components/code-input/CodeInput.vue.d.ts +4 -4
  241. package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
  242. package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
  243. package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -1
  244. package/dist/v2/components/code-input/CodeInput.vue.script.js +10 -10
  245. package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
  246. package/dist/v2/components/code-input/CodeInputLite.vue.d.ts +4 -4
  247. package/dist/v2/components/code-input/CodeInputLite.vue.d.ts.map +1 -1
  248. package/dist/v2/components/code-input/CodeInputLite.vue.js +1 -1
  249. package/dist/v2/components/code-input/CodeInputLite.vue.js.map +1 -1
  250. package/dist/v2/components/code-input/CodeInputLite.vue.script.js +8 -5
  251. package/dist/v2/components/code-input/CodeInputLite.vue.script.js.map +1 -1
  252. package/dist/v2/components/code-input/PillTooltipHost.vue.d.ts +4 -0
  253. package/dist/v2/components/code-input/PillTooltipHost.vue.d.ts.map +1 -1
  254. package/dist/v2/components/code-input/PillTooltipHost.vue.js.map +1 -1
  255. package/dist/v2/components/code-input/PillTooltipHost.vue.script.js +7 -3
  256. package/dist/v2/components/code-input/PillTooltipHost.vue.script.js.map +1 -1
  257. package/dist/v2/components/code-input/code-variable-widget.d.ts +3 -0
  258. package/dist/v2/components/code-input/code-variable-widget.d.ts.map +1 -1
  259. package/dist/v2/components/code-input/code-variable-widget.js +6 -3
  260. package/dist/v2/components/code-input/code-variable-widget.js.map +1 -1
  261. package/dist/v2/components/data-table/DataTableCheckbox.vue.d.ts +0 -1
  262. package/dist/v2/components/data-table/DataTableCheckbox.vue.d.ts.map +1 -1
  263. package/dist/v2/components/data-table/DataTableCheckbox.vue.js.map +1 -1
  264. package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js +4 -2
  265. package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js.map +1 -1
  266. package/dist/v2/components/data-table/DataTableInput.vue.d.ts.map +1 -1
  267. package/dist/v2/components/data-table/DataTableInput.vue.js +1 -1
  268. package/dist/v2/components/data-table/DataTableInput.vue.js.map +1 -1
  269. package/dist/v2/components/data-table/DataTableInput.vue.script.js +5 -3
  270. package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -1
  271. package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts.map +1 -1
  272. package/dist/v2/components/data-table/DataTableInputSelect.vue.js.map +1 -1
  273. package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js +12 -9
  274. package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js.map +1 -1
  275. package/dist/v2/components/forms/ConfirmationForm.vue.d.ts.map +1 -1
  276. package/dist/v2/components/forms/ConfirmationForm.vue.js.map +1 -1
  277. package/dist/v2/components/forms/ConfirmationForm.vue.script.js +5 -3
  278. package/dist/v2/components/forms/ConfirmationForm.vue.script.js.map +1 -1
  279. package/dist/v2/components/layout/CollapsibleSection.vue.d.ts.map +1 -1
  280. package/dist/v2/components/layout/CollapsibleSection.vue.js.map +1 -1
  281. package/dist/v2/components/layout/CollapsibleSection.vue.script.js +3 -1
  282. package/dist/v2/components/layout/CollapsibleSection.vue.script.js.map +1 -1
  283. package/dist/v2/components/modals/DeleteModal.vue.d.ts.map +1 -1
  284. package/dist/v2/components/modals/DeleteModal.vue.js.map +1 -1
  285. package/dist/v2/components/modals/DeleteModal.vue.script.js +3 -1
  286. package/dist/v2/components/modals/DeleteModal.vue.script.js.map +1 -1
  287. package/dist/v2/components/modals/ModalClientContainer.vue.d.ts.map +1 -1
  288. package/dist/v2/components/modals/ModalClientContainer.vue.js +1 -1
  289. package/dist/v2/components/modals/ModalClientContainer.vue.js.map +1 -1
  290. package/dist/v2/components/modals/ModalClientContainer.vue.script.js +5 -2
  291. package/dist/v2/components/modals/ModalClientContainer.vue.script.js.map +1 -1
  292. package/dist/v2/components/server/ServerDropdown.vue.d.ts.map +1 -1
  293. package/dist/v2/components/server/ServerDropdown.vue.js.map +1 -1
  294. package/dist/v2/components/server/ServerDropdown.vue.script.js +9 -5
  295. package/dist/v2/components/server/ServerDropdown.vue.script.js.map +1 -1
  296. package/dist/v2/components/sidebar/Sidebar.vue.d.ts.map +1 -1
  297. package/dist/v2/components/sidebar/Sidebar.vue.js.map +1 -1
  298. package/dist/v2/components/sidebar/Sidebar.vue.script.js +4 -2
  299. package/dist/v2/components/sidebar/Sidebar.vue.script.js.map +1 -1
  300. package/dist/v2/components/sidebar/SidebarMenu.vue.d.ts.map +1 -1
  301. package/dist/v2/components/sidebar/SidebarMenu.vue.js.map +1 -1
  302. package/dist/v2/components/sidebar/SidebarMenu.vue.script.js +4 -2
  303. package/dist/v2/components/sidebar/SidebarMenu.vue.script.js.map +1 -1
  304. package/dist/v2/components/sidebar/SidebarToggle.vue.d.ts.map +1 -1
  305. package/dist/v2/components/sidebar/SidebarToggle.vue.js.map +1 -1
  306. package/dist/v2/components/sidebar/SidebarToggle.vue.script.js +4 -2
  307. package/dist/v2/components/sidebar/SidebarToggle.vue.script.js.map +1 -1
  308. package/dist/v2/constants.js +1 -1
  309. package/dist/v2/features/command-palette/components/CommandActionForm.vue.d.ts.map +1 -1
  310. package/dist/v2/features/command-palette/components/CommandActionForm.vue.js.map +1 -1
  311. package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js +4 -2
  312. package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js.map +1 -1
  313. package/dist/v2/features/command-palette/components/CommandActionInput.vue.d.ts +2 -2
  314. package/dist/v2/features/environments/EnvironmentsList.vue.d.ts.map +1 -1
  315. package/dist/v2/features/environments/EnvironmentsList.vue.js.map +1 -1
  316. package/dist/v2/features/environments/EnvironmentsList.vue.script.js +4 -2
  317. package/dist/v2/features/environments/EnvironmentsList.vue.script.js.map +1 -1
  318. package/dist/v2/features/environments/components/Environment.vue.d.ts.map +1 -1
  319. package/dist/v2/features/environments/components/Environment.vue.js.map +1 -1
  320. package/dist/v2/features/environments/components/Environment.vue.script.js +12 -10
  321. package/dist/v2/features/environments/components/Environment.vue.script.js.map +1 -1
  322. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.d.ts.map +1 -1
  323. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.js.map +1 -1
  324. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js +5 -3
  325. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js.map +1 -1
  326. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.d.ts.map +1 -1
  327. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.js.map +1 -1
  328. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js +9 -6
  329. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js.map +1 -1
  330. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
  331. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -1
  332. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +6 -4
  333. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
  334. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.d.ts.map +1 -1
  335. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js +1 -1
  336. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js.map +1 -1
  337. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js +22 -10
  338. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js.map +1 -1
  339. package/dist/v2/features/localization/index.d.ts +18 -0
  340. package/dist/v2/features/localization/index.d.ts.map +1 -0
  341. package/dist/v2/features/localization/index.js +35 -0
  342. package/dist/v2/features/localization/index.js.map +1 -0
  343. package/dist/v2/features/localization/locales/ar.d.ts +385 -0
  344. package/dist/v2/features/localization/locales/ar.d.ts.map +1 -0
  345. package/dist/v2/features/localization/locales/ar.js +345 -0
  346. package/dist/v2/features/localization/locales/ar.js.map +1 -0
  347. package/dist/v2/features/localization/locales/de.d.ts +385 -0
  348. package/dist/v2/features/localization/locales/de.d.ts.map +1 -0
  349. package/dist/v2/features/localization/locales/de.js +345 -0
  350. package/dist/v2/features/localization/locales/de.js.map +1 -0
  351. package/dist/v2/features/localization/locales/es.d.ts +385 -0
  352. package/dist/v2/features/localization/locales/es.d.ts.map +1 -0
  353. package/dist/v2/features/localization/locales/es.js +345 -0
  354. package/dist/v2/features/localization/locales/es.js.map +1 -0
  355. package/dist/v2/features/localization/locales/fr.d.ts +385 -0
  356. package/dist/v2/features/localization/locales/fr.d.ts.map +1 -0
  357. package/dist/v2/features/localization/locales/fr.js +345 -0
  358. package/dist/v2/features/localization/locales/fr.js.map +1 -0
  359. package/dist/v2/features/localization/locales/pt.d.ts +385 -0
  360. package/dist/v2/features/localization/locales/pt.d.ts.map +1 -0
  361. package/dist/v2/features/localization/locales/pt.js +345 -0
  362. package/dist/v2/features/localization/locales/pt.js.map +1 -0
  363. package/dist/v2/features/localization/locales/ru.d.ts +385 -0
  364. package/dist/v2/features/localization/locales/ru.d.ts.map +1 -0
  365. package/dist/v2/features/localization/locales/ru.js +345 -0
  366. package/dist/v2/features/localization/locales/ru.js.map +1 -0
  367. package/dist/v2/features/localization/locales/zh-cn.d.ts +385 -0
  368. package/dist/v2/features/localization/locales/zh-cn.d.ts.map +1 -0
  369. package/dist/v2/features/localization/locales/zh-cn.js +345 -0
  370. package/dist/v2/features/localization/locales/zh-cn.js.map +1 -0
  371. package/dist/v2/features/localization/translations.d.ts +385 -0
  372. package/dist/v2/features/localization/translations.d.ts.map +1 -0
  373. package/dist/v2/features/localization/translations.js +345 -0
  374. package/dist/v2/features/localization/translations.js.map +1 -0
  375. package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
  376. package/dist/v2/features/modal/Modal.vue.js.map +1 -1
  377. package/dist/v2/features/modal/Modal.vue.script.js +15 -4
  378. package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
  379. package/dist/v2/features/modal/use-lazy-api-client.d.ts +11 -0
  380. package/dist/v2/features/modal/use-lazy-api-client.d.ts.map +1 -0
  381. package/dist/v2/features/modal/use-lazy-api-client.js +48 -0
  382. package/dist/v2/features/modal/use-lazy-api-client.js.map +1 -0
  383. package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
  384. package/dist/v2/features/operation/Operation.vue.js.map +1 -1
  385. package/dist/v2/features/operation/Operation.vue.script.js +22 -6
  386. package/dist/v2/features/operation/Operation.vue.script.js.map +1 -1
  387. package/dist/v2/features/search/components/DocumentSearchModal.vue.d.ts.map +1 -1
  388. package/dist/v2/features/search/components/DocumentSearchModal.vue.js +1 -1
  389. package/dist/v2/features/search/components/DocumentSearchModal.vue.js.map +1 -1
  390. package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js +12 -8
  391. package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js.map +1 -1
  392. package/dist/v2/features/search/components/SearchResult.vue.d.ts.map +1 -1
  393. package/dist/v2/features/search/components/SearchResult.vue.js.map +1 -1
  394. package/dist/v2/features/search/components/SearchResult.vue.script.js +14 -10
  395. package/dist/v2/features/search/components/SearchResult.vue.script.js.map +1 -1
  396. package/dist/v2/types/options.d.ts +1 -1
  397. package/dist/v2/types/options.d.ts.map +1 -1
  398. package/dist/v2/workspace-events.d.ts +2 -2
  399. package/dist/v2/workspace-events.d.ts.map +1 -1
  400. package/dist/v2/workspace-events.js +8 -1
  401. package/dist/v2/workspace-events.js.map +1 -1
  402. package/dist/vue-styles.css +124 -125
  403. package/package.json +22 -11
@@ -1 +1 @@
1
- {"version":3,"file":"RequestAuthTab.vue.js","names":[],"sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { useLoadingState } from '@scalar/components/loading'\nimport { ScalarMarkdownSummary } from '@scalar/components/markdown'\nimport { ScalarModal, useModal } from '@scalar/components/modal'\nimport { ScalarIconGear } from '@scalar/icons'\nimport { useToasts } from '@scalar/use-toasts'\nimport type {\n SecretsApiKey,\n SecretsHttp,\n} from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n getEnvironmentVariables,\n type MergedSecuritySchemes,\n type OAuthFlowsObjectSecret,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { getDocumentTypeLabel } from '@scalar/workspace-store/schemas/type-guards'\nimport type {\n ApiKeyObject,\n SecurityRequirementObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { capitalize, computed, ref } from 'vue'\n\nimport { refreshOauth2Token } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth'\nimport { getVisibleOrderedFlowKeys } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows'\nimport {\n runOAuth2Authorize,\n storeOAuth2Tokens,\n} from '@/v2/blocks/scalar-auth-selector-block/helpers/run-oauth2-authorize'\nimport { getOauth2AcquisitionTarget } from '@/v2/blocks/scalar-auth-selector-block/helpers/security-scheme'\nimport {\n DataTable,\n DataTableCell,\n DataTableRow,\n} from '@/v2/components/data-table'\n\nimport OAuth2, { type OAuth2Options } from './OAuth2.vue'\nimport OAuth2Metadata from './OAuth2Metadata.vue'\nimport OpenIDConnect from './OpenIDConnect.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\ntype SecurityItem = {\n scheme: SecuritySchemeObjectSecret | undefined\n name: string\n scopes: string[]\n /** Ordered, non-hidden oauth2/openIdConnect flow keys for this scheme (empty for other types). */\n visibleFlowKeys: (keyof OAuthFlowsObjectSecret)[]\n}\n\nconst {\n environment,\n isStatic,\n proxyUrl,\n selectedSecuritySchemas,\n securitySchemes,\n server,\n eventBus,\n options,\n documentType = 'openapi',\n} = defineProps<{\n /** Current environment configuration */\n environment: XScalarEnvironment\n /** Controls the display of certain borders which are used when we are non-collapsible */\n isStatic: boolean\n /** Proxy URL */\n proxyUrl: string\n /** Selected security schemes*/\n selectedSecuritySchemas: SecurityRequirementObject\n /** Merged security schemes from the document and the config together with the auth store secrets */\n securitySchemes: MergedSecuritySchemes\n /** Current server configuration */\n server: ServerObject | null\n /** Event bus for authentication updates */\n eventBus: WorkspaceEventBus\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n /** Type of the document the schemes belong to, used to label the missing-type warning */\n documentType?: 'openapi' | 'asyncapi'\n}>()\n\n/**\n * Human-readable name of the document type.\n * Used in the missing-type warning so it points at the correct document\n * (e.g. \"AsyncAPI\") instead of always naming OpenAPI.\n */\nconst documentTypeLabel = computed<string>(() =>\n getDocumentTypeLabel(documentType),\n)\n\nconst emits = defineEmits<{\n (\n e: 'update:selectedScopes',\n payload: Omit<ApiReferenceEvents['auth:update:selected-scopes'], 'meta'>,\n ): void\n (e: 'upsert:scope', payload: ApiReferenceEvents['auth:upsert:scopes']): void\n (e: 'delete:scope', payload: ApiReferenceEvents['auth:delete:scopes']): void\n}>()\n\n/**\n * Resolves security schemes from the OpenAPI document and combines them with their selected scopes.\n * Each item includes the scheme definition, name, and associated scopes.\n */\nconst security = computed<SecurityItem[]>(() =>\n Object.entries(selectedSecuritySchemas).map(([name, scopes = []]) => {\n const scheme = getResolvedRef(securitySchemes[name])\n return {\n scheme,\n name,\n scopes,\n // Compute the visible, ordered flow keys once per scheme so the tabs, the label, and the\n // active-flow tracking all agree on the same set (and we do not filter + sort on every access).\n visibleFlowKeys:\n scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\n ? getVisibleOrderedFlowKeys(scheme.flows)\n : [],\n }\n }),\n)\n\n/** Tracks which OAuth2 flow is currently active when multiple flows are available. */\nconst activeFlow = ref<string>('')\n\n/**\n * Keeps the selected flow in sync with the currently visible flow keys. Validating against the\n * visible set (not every declared flow) means a selection that becomes hidden — e.g. the document\n * is updated to mark the active flow with `x-scalar-ignore` — resets, so the default (first visible)\n * flow activates instead of leaving no tab selected.\n */\nconst selectedFlow = computed<string>(() => {\n const visibleFlowKeys = security.value.flatMap((item) => item.visibleFlowKeys)\n\n return visibleFlowKeys.some((key) => key === activeFlow.value)\n ? activeFlow.value\n : ''\n})\n\nconst setActiveFlow = (flow: string): void => {\n activeFlow.value = flow\n}\n\n/** Determines if multiple auth schemes are configured, which affects the UI layout. */\nconst hasMultipleSchemes = computed<boolean>(() => security.value.length > 1)\n\n/**\n * Generates a human-readable label for the security scheme.\n * Intentionally omits the description here — it is rendered separately as\n * rich text via ScalarMarkdownSummary so markdown formatting is preserved.\n */\nconst generateLabel = (\n name: string,\n scheme: SecuritySchemeObjectSecret,\n): string => {\n const capitalizedName = capitalize(name)\n\n switch (scheme.type) {\n case 'apiKey':\n return `${capitalizedName}: ${scheme.in}`\n\n case 'openIdConnect':\n case 'oauth2': {\n const firstFlow = getVisibleOrderedFlowKeys(scheme.flows)[0]\n const currentFlow = selectedFlow.value || firstFlow\n if (!currentFlow) {\n return capitalizedName\n }\n return `${capitalizedName}: ${currentFlow}`\n }\n\n case 'http':\n return `${capitalizedName}: ${scheme.scheme}`\n\n default:\n return capitalizedName\n }\n}\n\n/**\n * Whether an API key scheme exposes an editable parameter name.\n *\n * OpenAPI `apiKey` and AsyncAPI `httpApiKey` (normalized to `apiKey`) name a query/header/cookie\n * parameter, so the Name input is shown. AsyncAPI `apiKey` places the key in the broker `user` or\n * `password` slot and has no parameter name, so the Name input is hidden and only the value is asked for.\n */\nconst apiKeyHasName = (scheme: { in?: string }): boolean =>\n scheme.in !== 'user' && scheme.in !== 'password'\n\n/**\n * The scheme's type when it is one we do not render inputs for (a type outside both the OpenAPI\n * and AsyncAPI security scheme unions). Read through a helper so the fallback template branch,\n * where the scheme type is narrowed to `never` after the supported cases, can still surface the type.\n */\nconst getUnsupportedSchemeType = (\n scheme: SecurityItem['scheme'],\n): string | undefined => scheme?.type\n\n/**\n * Determines if an OAuth2 flow tab should be active.\n * The first flow is active by default if no flow is explicitly selected.\n */\nconst isFlowActive = (flowKey: string, index: number): boolean =>\n selectedFlow.value === flowKey || (index === 0 && !selectedFlow.value)\n\n/** Computes the container class for static display mode. */\nconst getStaticBorderClass = (): string | false => isStatic && 'border-t'\n\nconst handleHttpSecretsUpdate = (\n payload: Omit<Partial<SecretsHttp>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'http', ...payload },\n name,\n })\n\nconst handleApiKeySecretsUpdate = (\n payload: Omit<Partial<SecretsApiKey>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\nconst handleApiKeySecuritySchemeUpdate = (\n payload: Omit<Partial<ApiKeyObject>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\n/** Handles scope selection updates for OAuth2 */\nconst handleScopesUpdate = (\n name: string,\n event: { scopes?: string[]; scope?: string; selected?: boolean },\n): void => {\n emits('update:selectedScopes', {\n id: Object.keys(selectedSecuritySchemas),\n name,\n ...event,\n })\n}\n\n/** Handles scope-definition upserts (add / rename / description change) */\nconst handleScopeUpsert = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:upsert:scopes'], 'name'>,\n): void => {\n emits('upsert:scope', { ...event, name })\n}\n\n/** Handles scope-definition deletes */\nconst handleScopeDelete = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:delete:scopes'], 'name'>,\n): void => {\n emits('delete:scope', { ...event, name })\n}\n\n/**\n * Computes dynamic classes for OAuth2 flow tabs based on active state.\n */\nconst getFlowTabClasses = (flowKey: string, index: number): string => {\n const baseClasses =\n 'floating-bg text-c-3 relative cursor-pointer border-b border-transparent py-1 text-base font-medium'\n const activeClasses = '!text-c-1 !rounded-none border-b !border-current'\n\n return isFlowActive(flowKey, index)\n ? `${baseClasses} ${activeClasses} ${isStatic ? 'opacity-100' : ''}`\n : baseClasses\n}\n\n/**\n * OAuth2 token-acquisition target (an oauth2 scheme with an interactive grant) sourced from\n * the merged schemes. When the active scheme is HTTP bearer, this powers the inline\n * \"Authorize via OAuth2\" shortcut: the flow's bearer token is written onto the bearer scheme,\n * so the panel never switches to oauth2.\n *\n * The shortcut is purely a convenience, so it is offered for any interactive oauth2 scheme —\n * including one that is also independently selectable in the dropdown (e.g. Scalar Galaxy's\n * `oAuth2`). Whether that oauth2 scheme is *hidden* from the dropdown is a separate decision made\n * in the selector; here we only surface the shortcut.\n */\nconst oauth2Target = computed(() => getOauth2AcquisitionTarget(securitySchemes))\n\n/** Resolved oauth2 scheme object, for embedding its config form behind the gear. */\nconst oauth2Scheme = computed(() =>\n oauth2Target.value\n ? getResolvedRef(securitySchemes[oauth2Target.value.name])\n : undefined,\n)\n\nconst acquisitionLoader = useLoadingState()\nconst { toast } = useToasts()\nconst configModal = useModal()\n/** Bearer scheme that opened the config modal, so its Authorize callback targets it. */\nconst configBearerName = ref<string | undefined>()\n\n/** Runs the OAuth2 flow and writes the resulting bearer token onto the bearer scheme. */\nconst handleAcquisitionAuthorize = async (\n bearerName: string,\n): Promise<void> => {\n const target = oauth2Target.value\n if (!target || acquisitionLoader.isLoading) {\n return\n }\n acquisitionLoader.start()\n const [error] = await runOAuth2Authorize({\n eventBus,\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flows: target.flows,\n flowType: target.flowType,\n scopes: target.scopes,\n server,\n proxyUrl,\n environment,\n options,\n })\n await acquisitionLoader.clear()\n if (error) {\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** Refreshes the OAuth2 token and rewrites it onto the bearer scheme. */\nconst handleAcquisitionRefresh = async (bearerName: string): Promise<void> => {\n const target = oauth2Target.value\n // Only the authorization-code flow carries a refresh token; implicit can't be refreshed.\n if (\n !target ||\n target.flowType !== 'authorizationCode' ||\n acquisitionLoader.isLoading\n ) {\n return\n }\n acquisitionLoader.start()\n const [error, tokens] = await refreshOauth2Token(\n target.flows,\n target.flowType,\n proxyUrl,\n server,\n getEnvironmentVariables(environment),\n options?.customFetch,\n )\n await acquisitionLoader.clear()\n if (tokens?.accessToken) {\n storeOAuth2Tokens(eventBus, {\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flowType: target.flowType,\n tokens,\n })\n } else if (error) {\n toast(error?.message ?? 'Failed to refresh', 'error')\n }\n}\n\nconst openAcquisitionConfig = (bearerName: string): void => {\n configBearerName.value = bearerName\n configModal.show()\n}\n\n/** Closes the config modal and runs Authorize against the bearer scheme that opened it. */\nconst handleConfigAuthorize = (): void => {\n const bearerName = configBearerName.value\n configModal.hide()\n if (bearerName) {\n void handleAcquisitionAuthorize(bearerName)\n }\n}\n</script>\n<template>\n <template\n v-for=\"{ scheme, name, scopes, visibleFlowKeys } in security\"\n :key=\"name\">\n <!--\n Header row for AND'ed schemes: label (bold) and description (rich text) are\n combined.\n -->\n <DataTableRow v-if=\"hasMultipleSchemes && scheme\">\n <DataTableCell\n :aria-label=\"generateLabel(name, scheme)\"\n class=\"max-h-[auto]\">\n <div class=\"bg-b-1 min-w-0 flex-1 px-3 py-1.25\">\n <p class=\"text-c-1 leading-5.5 font-medium\">\n {{ generateLabel(name, scheme) }}\n </p>\n <ScalarMarkdownSummary\n v-if=\"scheme.description\"\n class=\"auth-description text-c-2 w-full\"\n :value=\"scheme.description\" />\n </div>\n </DataTableCell>\n </DataTableRow>\n\n <!-- Description: shown for single auth schemes with descriptions -->\n <DataTableRow v-if=\"scheme?.description && !hasMultipleSchemes\">\n <DataTableCell\n :aria-label=\"scheme.description\"\n class=\"max-h-[auto]\">\n <ScalarMarkdownSummary\n class=\"auth-description bg-b-1 text-c-2 min-w-0 flex-1 px-3 py-1.25\"\n :value=\"scheme.description\" />\n </DataTableCell>\n </DataTableRow>\n\n <!-- HTTP Authentication -->\n <template v-if=\"scheme?.type === 'http'\">\n <!-- Bearer Token -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer'\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n placeholder=\"Token\"\n type=\"password\"\n @update:modelValue=\"\n (v) => handleHttpSecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n Bearer Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- OAuth2 token-acquisition shortcut (shown when an interactive oauth2 flow exists) -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer' && oauth2Target\">\n <div class=\"flex h-8 items-center gap-2 border-t px-3\">\n <span class=\"text-c-3 mr-auto text-xs\">Get a token</span>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionAuthorize(name)\">\n Authorize via {{ oauth2Target.name }}\n </ScalarButton>\n <ScalarButton\n v-if=\"\n scheme['x-scalar-secret-token'] &&\n oauth2Target.flowType === 'authorizationCode'\n \"\n class=\"p-0 px-2 py-0.5\"\n :disabled=\"acquisitionLoader.isLoading\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionRefresh(name)\">\n Refresh\n </ScalarButton>\n <ScalarIconButton\n :icon=\"ScalarIconGear\"\n :label=\"`Configure ${oauth2Target.name}`\"\n size=\"xs\"\n @click=\"openAcquisitionConfig(name)\" />\n </div>\n </DataTableRow>\n\n <!-- HTTP Basic Authentication -->\n <template v-else-if=\"scheme?.scheme === 'basic'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n class=\"text-c-2\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-username']\"\n placeholder=\"janedoe\"\n required\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-username': v }, name)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :environment\n :modelValue=\"scheme['x-scalar-secret-password']\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-password': v }, name)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n </template>\n\n <!-- API Key Authentication -->\n <template v-else-if=\"scheme?.type === 'apiKey'\">\n <DataTableRow v-if=\"apiKeyHasName(scheme)\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme.name ?? ''\"\n placeholder=\"api-key\"\n @update:modelValue=\"\n (v) => handleApiKeySecuritySchemeUpdate({ name: v }, name)\n \">\n Name\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :containerClass=\"\n apiKeyHasName(scheme) ? undefined : getStaticBorderClass()\n \"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleApiKeySecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n Value\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- OAuth 2.0 / OpenID Connect Authentication -->\n <template\n v-else-if=\"scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\">\n <OAuth2Metadata\n v-if=\"\n scheme.type === 'oauth2' && (!isStatic || scheme.oauth2MetadataUrl)\n \"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :name\n :proxyUrl\n :scheme />\n\n <!-- OpenID Connect -->\n <OpenIDConnect\n v-if=\"scheme?.type === 'openIdConnect' && !visibleFlowKeys.length\"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :getStaticBorderClass\n :name\n :proxyUrl\n :scheme />\n\n <!-- Flow selector tabs: shown when multiple visible flows are available -->\n <DataTableRow v-if=\"visibleFlowKeys.length > 1\">\n <div class=\"flex min-h-8 border-t text-base\">\n <div class=\"flex h-8 max-w-full gap-2.5 overflow-x-auto px-3\">\n <button\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\"\n :class=\"getFlowTabClasses(key, ind)\"\n type=\"button\"\n @click=\"setActiveFlow(key)\">\n <span class=\"relative z-10\">{{ key }}</span>\n </button>\n </div>\n </div>\n </DataTableRow>\n\n <!-- OAuth2 flow configuration -->\n <template\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\">\n <OAuth2\n v-if=\"scheme.flows && isFlowActive(key, ind)\"\n :environment\n :eventBus\n :flows=\"scheme.flows\"\n :name\n :options\n :proxyUrl\n :scheme\n :selectedScopes=\"scopes\"\n :server\n :type=\"key\"\n @delete:scope=\"(event) => handleScopeDelete(name, event)\"\n @update:selectedScopes=\"(event) => handleScopesUpdate(name, event)\"\n @upsert:scope=\"(event) => handleScopeUpsert(name, event)\" />\n </template>\n </template>\n\n <!-- Browser WebSocket connections cannot apply these broker credentials. -->\n <div\n v-else-if=\"\n scheme?.type === 'userPassword' ||\n scheme?.type === 'plain' ||\n scheme?.type === 'scramSha256' ||\n scheme?.type === 'scramSha512' ||\n scheme?.type === 'X509' ||\n scheme?.type === 'symmetricEncryption' ||\n scheme?.type === 'asymmetricEncryption' ||\n scheme?.type === 'gssapi'\n \"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n Credentials for this AsyncAPI security scheme are not sent by the browser\n client.\n </div>\n\n <!-- Mutual TLS credentials are chosen during the browser-managed TLS handshake. -->\n <div\n v-else-if=\"scheme?.type === 'mutualTLS'\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n Mutual TLS authenticates with a client certificate presented during the\n TLS handshake, so there is nothing to enter here.\n </div>\n\n <!-- Scheme has a type we do not render inputs for -->\n <div\n v-else-if=\"getUnsupportedSchemeType(scheme)\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n The <code>{{ getUnsupportedSchemeType(scheme) }}</code> security scheme\n type is not supported yet.\n </div>\n\n <!-- Scheme is missing type -->\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n The security scheme is missing a type, please double check your\n {{ documentTypeLabel }} document or Authentication Configuration\n </div>\n </template>\n\n <!-- OAuth2 configuration modal (opened from the bearer scheme's gear) -->\n <ScalarModal\n v-if=\"oauth2Target && oauth2Scheme\"\n :state=\"configModal\"\n size=\"sm\"\n :title=\"`Configure ${oauth2Target.name}`\">\n <DataTable\n :columns=\"['']\"\n presentational>\n <OAuth2\n hideActions\n :environment\n :eventBus\n :flows=\"oauth2Target.flows\"\n :name=\"oauth2Target.name\"\n :options\n :proxyUrl\n :scheme=\"oauth2Scheme\"\n :selectedScopes=\"oauth2Target.scopes\"\n :server\n :type=\"oauth2Target.flowType\"\n @delete:scope=\"(event) => handleScopeDelete(oauth2Target!.name, event)\"\n @update:selectedScopes=\"\n (event) => handleScopesUpdate(oauth2Target!.name, event)\n \"\n @upsert:scope=\"\n (event) => handleScopeUpsert(oauth2Target!.name, event)\n \" />\n </DataTable>\n <div class=\"flex h-8 items-center justify-end gap-2 border-t\">\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"configModal.hide()\">\n Cancel\n </ScalarButton>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n @click=\"handleConfigAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </ScalarModal>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RequestAuthTab.vue.js","names":[],"sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { useLoadingState } from '@scalar/components/loading'\nimport { ScalarMarkdownSummary } from '@scalar/components/markdown'\nimport { ScalarModal, useModal } from '@scalar/components/modal'\nimport { ScalarIconGear } from '@scalar/icons'\nimport { useToasts } from '@scalar/use-toasts'\nimport type {\n SecretsApiKey,\n SecretsHttp,\n} from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n getEnvironmentVariables,\n type MergedSecuritySchemes,\n type OAuthFlowsObjectSecret,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { getDocumentTypeLabel } from '@scalar/workspace-store/schemas/type-guards'\nimport type {\n ApiKeyObject,\n SecurityRequirementObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { capitalize, computed, ref } from 'vue'\n\nimport { refreshOauth2Token } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth'\nimport { getVisibleOrderedFlowKeys } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows'\nimport {\n runOAuth2Authorize,\n storeOAuth2Tokens,\n} from '@/v2/blocks/scalar-auth-selector-block/helpers/run-oauth2-authorize'\nimport { getOauth2AcquisitionTarget } from '@/v2/blocks/scalar-auth-selector-block/helpers/security-scheme'\nimport {\n DataTable,\n DataTableCell,\n DataTableRow,\n} from '@/v2/components/data-table'\nimport { useLocalization } from '@/v2/features/localization'\n\nimport OAuth2, { type OAuth2Options } from './OAuth2.vue'\nimport OAuth2Metadata from './OAuth2Metadata.vue'\nimport OpenIDConnect from './OpenIDConnect.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n environment,\n isStatic,\n proxyUrl,\n selectedSecuritySchemas,\n securitySchemes,\n server,\n eventBus,\n options,\n documentType = 'openapi',\n} = defineProps<{\n /** Current environment configuration */\n environment: XScalarEnvironment\n /** Controls the display of certain borders which are used when we are non-collapsible */\n isStatic: boolean\n /** Proxy URL */\n proxyUrl: string\n /** Selected security schemes*/\n selectedSecuritySchemas: SecurityRequirementObject\n /** Merged security schemes from the document and the config together with the auth store secrets */\n securitySchemes: MergedSecuritySchemes\n /** Current server configuration */\n server: ServerObject | null\n /** Event bus for authentication updates */\n eventBus: WorkspaceEventBus\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n /** Type of the document the schemes belong to, used to label the missing-type warning */\n documentType?: 'openapi' | 'asyncapi'\n}>()\n\nconst emits = defineEmits<{\n (\n e: 'update:selectedScopes',\n payload: Omit<ApiReferenceEvents['auth:update:selected-scopes'], 'meta'>,\n ): void\n (e: 'upsert:scope', payload: ApiReferenceEvents['auth:upsert:scopes']): void\n (e: 'delete:scope', payload: ApiReferenceEvents['auth:delete:scopes']): void\n}>()\n\nconst { translate } = useLocalization()\n\ntype SecurityItem = {\n scheme: SecuritySchemeObjectSecret | undefined\n name: string\n scopes: string[]\n /** Ordered, non-hidden oauth2/openIdConnect flow keys for this scheme (empty for other types). */\n visibleFlowKeys: (keyof OAuthFlowsObjectSecret)[]\n}\n\n/**\n * Human-readable name of the document type.\n * Used in the missing-type warning so it points at the correct document\n * (e.g. \"AsyncAPI\") instead of always naming OpenAPI.\n */\nconst documentTypeLabel = computed<string>(() =>\n getDocumentTypeLabel(documentType),\n)\n\n/**\n * Resolves security schemes from the OpenAPI document and combines them with their selected scopes.\n * Each item includes the scheme definition, name, and associated scopes.\n */\nconst security = computed<SecurityItem[]>(() =>\n Object.entries(selectedSecuritySchemas).map(([name, scopes = []]) => {\n const scheme = getResolvedRef(securitySchemes[name])\n return {\n scheme,\n name,\n scopes,\n // Compute the visible, ordered flow keys once per scheme so the tabs, the label, and the\n // active-flow tracking all agree on the same set (and we do not filter + sort on every access).\n visibleFlowKeys:\n scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\n ? getVisibleOrderedFlowKeys(scheme.flows)\n : [],\n }\n }),\n)\n\n/** Tracks which OAuth2 flow is currently active when multiple flows are available. */\nconst activeFlow = ref<string>('')\n\n/**\n * Keeps the selected flow in sync with the currently visible flow keys. Validating against the\n * visible set (not every declared flow) means a selection that becomes hidden — e.g. the document\n * is updated to mark the active flow with `x-scalar-ignore` — resets, so the default (first visible)\n * flow activates instead of leaving no tab selected.\n */\nconst selectedFlow = computed<string>(() => {\n const visibleFlowKeys = security.value.flatMap((item) => item.visibleFlowKeys)\n\n return visibleFlowKeys.some((key) => key === activeFlow.value)\n ? activeFlow.value\n : ''\n})\n\nconst setActiveFlow = (flow: string): void => {\n activeFlow.value = flow\n}\n\n/** Determines if multiple auth schemes are configured, which affects the UI layout. */\nconst hasMultipleSchemes = computed<boolean>(() => security.value.length > 1)\n\n/**\n * Generates a human-readable label for the security scheme.\n * Intentionally omits the description here — it is rendered separately as\n * rich text via ScalarMarkdownSummary so markdown formatting is preserved.\n */\nconst generateLabel = (\n name: string,\n scheme: SecuritySchemeObjectSecret,\n): string => {\n const capitalizedName = capitalize(name)\n\n switch (scheme.type) {\n case 'apiKey':\n return `${capitalizedName}: ${scheme.in}`\n\n case 'openIdConnect':\n case 'oauth2': {\n const firstFlow = getVisibleOrderedFlowKeys(scheme.flows)[0]\n const currentFlow = selectedFlow.value || firstFlow\n if (!currentFlow) {\n return capitalizedName\n }\n return `${capitalizedName}: ${currentFlow}`\n }\n\n case 'http':\n return `${capitalizedName}: ${scheme.scheme}`\n\n default:\n return capitalizedName\n }\n}\n\n/**\n * Whether an API key scheme exposes an editable parameter name.\n *\n * OpenAPI `apiKey` and AsyncAPI `httpApiKey` (normalized to `apiKey`) name a query/header/cookie\n * parameter, so the Name input is shown. AsyncAPI `apiKey` places the key in the broker `user` or\n * `password` slot and has no parameter name, so the Name input is hidden and only the value is asked for.\n */\nconst apiKeyHasName = (scheme: { in?: string }): boolean =>\n scheme.in !== 'user' && scheme.in !== 'password'\n\n/**\n * The scheme's type when it is one we do not render inputs for (a type outside both the OpenAPI\n * and AsyncAPI security scheme unions). Read through a helper so the fallback template branch,\n * where the scheme type is narrowed to `never` after the supported cases, can still surface the type.\n */\nconst getUnsupportedSchemeType = (\n scheme: SecurityItem['scheme'],\n): string | undefined => scheme?.type\n\n/**\n * Determines if an OAuth2 flow tab should be active.\n * The first flow is active by default if no flow is explicitly selected.\n */\nconst isFlowActive = (flowKey: string, index: number): boolean =>\n selectedFlow.value === flowKey || (index === 0 && !selectedFlow.value)\n\n/** Computes the container class for static display mode. */\nconst getStaticBorderClass = (): string | false => isStatic && 'border-t'\n\nconst handleHttpSecretsUpdate = (\n payload: Omit<Partial<SecretsHttp>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'http', ...payload },\n name,\n })\n\nconst handleApiKeySecretsUpdate = (\n payload: Omit<Partial<SecretsApiKey>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\nconst handleApiKeySecuritySchemeUpdate = (\n payload: Omit<Partial<ApiKeyObject>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\n/** Handles scope selection updates for OAuth2 */\nconst handleScopesUpdate = (\n name: string,\n event: { scopes?: string[]; scope?: string; selected?: boolean },\n): void => {\n emits('update:selectedScopes', {\n id: Object.keys(selectedSecuritySchemas),\n name,\n ...event,\n })\n}\n\n/** Handles scope-definition upserts (add / rename / description change) */\nconst handleScopeUpsert = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:upsert:scopes'], 'name'>,\n): void => {\n emits('upsert:scope', { ...event, name })\n}\n\n/** Handles scope-definition deletes */\nconst handleScopeDelete = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:delete:scopes'], 'name'>,\n): void => {\n emits('delete:scope', { ...event, name })\n}\n\n/**\n * Computes dynamic classes for OAuth2 flow tabs based on active state.\n */\nconst getFlowTabClasses = (flowKey: string, index: number): string => {\n const baseClasses =\n 'floating-bg text-c-3 relative cursor-pointer border-b border-transparent py-1 text-base font-medium'\n const activeClasses = '!text-c-1 !rounded-none border-b !border-current'\n\n return isFlowActive(flowKey, index)\n ? `${baseClasses} ${activeClasses} ${isStatic ? 'opacity-100' : ''}`\n : baseClasses\n}\n\n/**\n * OAuth2 token-acquisition target (an oauth2 scheme with an interactive grant) sourced from\n * the merged schemes. When the active scheme is HTTP bearer, this powers the inline\n * \"Authorize via OAuth2\" shortcut: the flow's bearer token is written onto the bearer scheme,\n * so the panel never switches to oauth2.\n *\n * The shortcut is purely a convenience, so it is offered for any interactive oauth2 scheme —\n * including one that is also independently selectable in the dropdown (e.g. Scalar Galaxy's\n * `oAuth2`). Whether that oauth2 scheme is *hidden* from the dropdown is a separate decision made\n * in the selector; here we only surface the shortcut.\n */\nconst oauth2Target = computed(() => getOauth2AcquisitionTarget(securitySchemes))\n\n/** Resolved oauth2 scheme object, for embedding its config form behind the gear. */\nconst oauth2Scheme = computed(() =>\n oauth2Target.value\n ? getResolvedRef(securitySchemes[oauth2Target.value.name])\n : undefined,\n)\n\nconst acquisitionLoader = useLoadingState()\nconst { toast } = useToasts()\nconst configModal = useModal()\n/** Bearer scheme that opened the config modal, so its Authorize callback targets it. */\nconst configBearerName = ref<string | undefined>()\n\n/** Runs the OAuth2 flow and writes the resulting bearer token onto the bearer scheme. */\nconst handleAcquisitionAuthorize = async (\n bearerName: string,\n): Promise<void> => {\n const target = oauth2Target.value\n if (!target || acquisitionLoader.isLoading) {\n return\n }\n acquisitionLoader.start()\n const [error] = await runOAuth2Authorize({\n eventBus,\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flows: target.flows,\n flowType: target.flowType,\n scopes: target.scopes,\n server,\n proxyUrl,\n environment,\n options,\n })\n await acquisitionLoader.clear()\n if (error) {\n toast(\n error?.message ?? translate('apiClient.requestAuthTab.failedToauthorize'),\n 'error',\n )\n }\n}\n\n/** Refreshes the OAuth2 token and rewrites it onto the bearer scheme. */\nconst handleAcquisitionRefresh = async (bearerName: string): Promise<void> => {\n const target = oauth2Target.value\n // Only the authorization-code flow carries a refresh token; implicit can't be refreshed.\n if (\n !target ||\n target.flowType !== 'authorizationCode' ||\n acquisitionLoader.isLoading\n ) {\n return\n }\n acquisitionLoader.start()\n const [error, tokens] = await refreshOauth2Token(\n target.flows,\n target.flowType,\n proxyUrl,\n server,\n getEnvironmentVariables(environment),\n options?.customFetch,\n )\n await acquisitionLoader.clear()\n if (tokens?.accessToken) {\n storeOAuth2Tokens(eventBus, {\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flowType: target.flowType,\n tokens,\n })\n } else if (error) {\n toast(\n error?.message ?? translate('apiClient.requestAuthTab.failedToRefresh'),\n 'error',\n )\n }\n}\n\nconst openAcquisitionConfig = (bearerName: string): void => {\n configBearerName.value = bearerName\n configModal.show()\n}\n\n/** Closes the config modal and runs Authorize against the bearer scheme that opened it. */\nconst handleConfigAuthorize = (): void => {\n const bearerName = configBearerName.value\n configModal.hide()\n if (bearerName) {\n void handleAcquisitionAuthorize(bearerName)\n }\n}\n</script>\n<template>\n <template\n v-for=\"{ scheme, name, scopes, visibleFlowKeys } in security\"\n :key=\"name\">\n <!--\n Header row for AND'ed schemes: label (bold) and description (rich text) are\n combined.\n -->\n <DataTableRow v-if=\"hasMultipleSchemes && scheme\">\n <DataTableCell\n :aria-label=\"generateLabel(name, scheme)\"\n class=\"max-h-[auto]\">\n <div class=\"bg-b-1 min-w-0 flex-1 px-3 py-1.25\">\n <p class=\"text-c-1 leading-5.5 font-medium\">\n {{ generateLabel(name, scheme) }}\n </p>\n <ScalarMarkdownSummary\n v-if=\"scheme.description\"\n class=\"auth-description text-c-2 w-full\"\n :value=\"scheme.description\" />\n </div>\n </DataTableCell>\n </DataTableRow>\n\n <!-- Description: shown for single auth schemes with descriptions -->\n <DataTableRow v-if=\"scheme?.description && !hasMultipleSchemes\">\n <DataTableCell\n :aria-label=\"scheme.description\"\n class=\"max-h-[auto]\">\n <ScalarMarkdownSummary\n class=\"auth-description bg-b-1 text-c-2 min-w-0 flex-1 px-3 py-1.25\"\n :value=\"scheme.description\" />\n </DataTableCell>\n </DataTableRow>\n\n <!-- HTTP Authentication -->\n <template v-if=\"scheme?.type === 'http'\">\n <!-- Bearer Token -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer'\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n :placeholder=\"translate('apiClient.requestAuthTab.token')\"\n type=\"password\"\n @update:modelValue=\"\n (v) => handleHttpSecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.bearerToken') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- OAuth2 token-acquisition shortcut (shown when an interactive oauth2 flow exists) -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer' && oauth2Target\">\n <div class=\"flex h-8 items-center gap-2 border-t px-3\">\n <span class=\"text-c-3 mr-auto text-xs\">{{\n translate('apiClient.requestAuthTab.getAToken')\n }}</span>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionAuthorize(name)\">\n {{\n translate('apiClient.requestAuthTab.authorizeVia', {\n name: oauth2Target.name,\n })\n }}\n </ScalarButton>\n <ScalarButton\n v-if=\"\n scheme['x-scalar-secret-token'] &&\n oauth2Target.flowType === 'authorizationCode'\n \"\n class=\"p-0 px-2 py-0.5\"\n :disabled=\"acquisitionLoader.isLoading\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionRefresh(name)\">\n {{ translate('apiClient.requestAuthTab.refresh') }}\n </ScalarButton>\n <ScalarIconButton\n :icon=\"ScalarIconGear\"\n :label=\"\n translate('apiClient.requestAuthTab.configure', {\n name: oauth2Target.name,\n })\n \"\n size=\"xs\"\n @click=\"openAcquisitionConfig(name)\" />\n </div>\n </DataTableRow>\n\n <!-- HTTP Basic Authentication -->\n <template v-else-if=\"scheme?.scheme === 'basic'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n class=\"text-c-2\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-username']\"\n placeholder=\"janedoe\"\n required\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-username': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.username') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :environment\n :modelValue=\"scheme['x-scalar-secret-password']\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-password': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.password') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n </template>\n\n <!-- API Key Authentication -->\n <template v-else-if=\"scheme?.type === 'apiKey'\">\n <DataTableRow v-if=\"apiKeyHasName(scheme)\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme.name ?? ''\"\n placeholder=\"api-key\"\n @update:modelValue=\"\n (v) => handleApiKeySecuritySchemeUpdate({ name: v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.name') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :containerClass=\"\n apiKeyHasName(scheme) ? undefined : getStaticBorderClass()\n \"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleApiKeySecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.value') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- OAuth 2.0 / OpenID Connect Authentication -->\n <template\n v-else-if=\"scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\">\n <OAuth2Metadata\n v-if=\"\n scheme.type === 'oauth2' && (!isStatic || scheme.oauth2MetadataUrl)\n \"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :name\n :proxyUrl\n :scheme />\n\n <!-- OpenID Connect -->\n <OpenIDConnect\n v-if=\"scheme?.type === 'openIdConnect' && !visibleFlowKeys.length\"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :getStaticBorderClass\n :name\n :proxyUrl\n :scheme />\n\n <!-- Flow selector tabs: shown when multiple visible flows are available -->\n <DataTableRow v-if=\"visibleFlowKeys.length > 1\">\n <div class=\"flex min-h-8 border-t text-base\">\n <div class=\"flex h-8 max-w-full gap-2.5 overflow-x-auto px-3\">\n <button\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\"\n :class=\"getFlowTabClasses(key, ind)\"\n type=\"button\"\n @click=\"setActiveFlow(key)\">\n <span class=\"relative z-10\">{{ key }}</span>\n </button>\n </div>\n </div>\n </DataTableRow>\n\n <!-- OAuth2 flow configuration -->\n <template\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\">\n <OAuth2\n v-if=\"scheme.flows && isFlowActive(key, ind)\"\n :environment\n :eventBus\n :flows=\"scheme.flows\"\n :name\n :options\n :proxyUrl\n :scheme\n :selectedScopes=\"scopes\"\n :server\n :type=\"key\"\n @delete:scope=\"(event) => handleScopeDelete(name, event)\"\n @update:selectedScopes=\"(event) => handleScopesUpdate(name, event)\"\n @upsert:scope=\"(event) => handleScopeUpsert(name, event)\" />\n </template>\n </template>\n\n <!-- Browser WebSocket connections cannot apply these broker credentials. -->\n <div\n v-else-if=\"\n scheme?.type === 'userPassword' ||\n scheme?.type === 'plain' ||\n scheme?.type === 'scramSha256' ||\n scheme?.type === 'scramSha512' ||\n scheme?.type === 'X509' ||\n scheme?.type === 'symmetricEncryption' ||\n scheme?.type === 'asymmetricEncryption' ||\n scheme?.type === 'gssapi'\n \"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{ translate('apiClient.requestAuthTab.unsupportedCredentials') }}\n </div>\n\n <!-- Mutual TLS credentials are chosen during the browser-managed TLS handshake. -->\n <div\n v-else-if=\"scheme?.type === 'mutualTLS'\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{ translate('apiClient.requestAuthTab.mutualTlsHint') }}\n </div>\n\n <!-- Scheme has a type we do not render inputs for -->\n <div\n v-else-if=\"getUnsupportedSchemeType(scheme)\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{\n translate('apiClient.requestAuthTab.unsupportedType', {\n type: getUnsupportedSchemeType(scheme) ?? '',\n })\n }}\n </div>\n\n <!-- Scheme is missing type -->\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{\n translate('apiClient.requestAuthTab.missingType', {\n type: documentTypeLabel,\n })\n }}\n </div>\n </template>\n\n <!-- OAuth2 configuration modal (opened from the bearer scheme's gear) -->\n <ScalarModal\n v-if=\"oauth2Target && oauth2Scheme\"\n size=\"sm\"\n :state=\"configModal\"\n :title=\"\n translate('apiClient.requestAuthTab.configure', {\n name: oauth2Target.name,\n })\n \">\n <DataTable\n :columns=\"['']\"\n presentational>\n <OAuth2\n :environment\n :eventBus\n :flows=\"oauth2Target.flows\"\n hideActions\n :name=\"oauth2Target.name\"\n :options\n :proxyUrl\n :scheme=\"oauth2Scheme\"\n :selectedScopes=\"oauth2Target.scopes\"\n :server\n :type=\"oauth2Target.flowType\"\n @delete:scope=\"(event) => handleScopeDelete(oauth2Target!.name, event)\"\n @update:selectedScopes=\"\n (event) => handleScopesUpdate(oauth2Target!.name, event)\n \"\n @upsert:scope=\"\n (event) => handleScopeUpsert(oauth2Target!.name, event)\n \" />\n </DataTable>\n <div class=\"flex h-8 items-center justify-end gap-2 border-t\">\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"configModal.hide()\">\n {{ translate('apiClient.requestAuthTab.cancel') }}\n </ScalarButton>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n @click=\"handleConfigAuthorize\">\n {{ translate('apiClient.requestAuthTab.authorize') }}\n </ScalarButton>\n </div>\n </ScalarModal>\n</template>\n"],"mappings":""}
@@ -1,3 +1,4 @@
1
+ import { useLocalization } from "../../../features/localization/index.js";
1
2
  import DataTable_default from "../../../components/data-table/DataTable.vue.js";
2
3
  import DataTableCell_default from "../../../components/data-table/DataTableCell.vue.js";
3
4
  import DataTableRow_default from "../../../components/data-table/DataTableRow.vue.js";
@@ -24,27 +25,33 @@ import { getDocumentTypeLabel } from "@scalar/workspace-store/schemas/type-guard
24
25
  var _hoisted_1 = { class: "bg-b-1 min-w-0 flex-1 px-3 py-1.25" };
25
26
  var _hoisted_2 = { class: "text-c-1 leading-5.5 font-medium" };
26
27
  var _hoisted_3 = { class: "flex h-8 items-center gap-2 border-t px-3" };
27
- var _hoisted_4 = { class: "flex min-h-8 border-t text-base" };
28
- var _hoisted_5 = { class: "flex h-8 max-w-full gap-2.5 overflow-x-auto px-3" };
29
- var _hoisted_6 = ["onClick"];
30
- var _hoisted_7 = { class: "relative z-10" };
31
- var _hoisted_8 = {
28
+ var _hoisted_4 = { class: "text-c-3 mr-auto text-xs" };
29
+ var _hoisted_5 = { class: "flex min-h-8 border-t text-base" };
30
+ var _hoisted_6 = { class: "flex h-8 max-w-full gap-2.5 overflow-x-auto px-3" };
31
+ var _hoisted_7 = ["onClick"];
32
+ var _hoisted_8 = { class: "relative z-10" };
33
+ var _hoisted_9 = {
32
34
  key: 5,
33
35
  class: "text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance"
34
36
  };
35
- var _hoisted_9 = {
37
+ var _hoisted_10 = {
36
38
  key: 6,
37
39
  class: "text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance"
38
40
  };
39
- var _hoisted_10 = {
41
+ var _hoisted_11 = {
40
42
  key: 7,
41
43
  class: "text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance"
42
44
  };
43
- var _hoisted_11 = {
45
+ var _hoisted_12 = {
44
46
  key: 8,
45
47
  class: "text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance"
46
48
  };
47
- var _hoisted_12 = { class: "flex h-8 items-center justify-end gap-2 border-t" };
49
+ var _hoisted_13 = { class: "flex h-8 items-center justify-end gap-2 border-t" };
50
+ /**
51
+ * Human-readable name of the document type.
52
+ * Used in the missing-type warning so it points at the correct document
53
+ * (e.g. "AsyncAPI") instead of always naming OpenAPI.
54
+ */
48
55
  var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
49
56
  __name: "RequestAuthTab",
50
57
  props: {
@@ -64,13 +71,9 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
64
71
  "delete:scope"
65
72
  ],
66
73
  setup(__props, { emit: __emit }) {
67
- /**
68
- * Human-readable name of the document type.
69
- * Used in the missing-type warning so it points at the correct document
70
- * (e.g. "AsyncAPI") instead of always naming OpenAPI.
71
- */
72
- const documentTypeLabel = computed(() => getDocumentTypeLabel(__props.documentType));
73
74
  const emits = __emit;
75
+ const { translate } = useLocalization();
76
+ const documentTypeLabel = computed(() => getDocumentTypeLabel(__props.documentType));
74
77
  /**
75
78
  * Resolves security schemes from the OpenAPI document and combines them with their selected scopes.
76
79
  * Each item includes the scheme definition, name, and associated scopes.
@@ -228,7 +231,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
228
231
  options: __props.options
229
232
  });
230
233
  await acquisitionLoader.clear();
231
- if (error) toast(error?.message ?? "Failed to authorize", "error");
234
+ if (error) toast(error?.message ?? translate("apiClient.requestAuthTab.failedToauthorize"), "error");
232
235
  };
233
236
  /** Refreshes the OAuth2 token and rewrites it onto the bearer scheme. */
234
237
  const handleAcquisitionRefresh = async (bearerName) => {
@@ -243,7 +246,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
243
246
  flowType: target.flowType,
244
247
  tokens
245
248
  });
246
- else if (error) toast(error?.message ?? "Failed to refresh", "error");
249
+ else if (error) toast(error?.message ?? translate("apiClient.requestAuthTab.failedToRefresh"), "error");
247
250
  };
248
251
  const openAcquisitionConfig = (bearerName) => {
249
252
  configBearerName.value = bearerName;
@@ -290,22 +293,23 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
290
293
  containerClass: getStaticBorderClass(),
291
294
  environment: __props.environment,
292
295
  modelValue: scheme["x-scalar-secret-token"],
293
- placeholder: "Token",
296
+ placeholder: unref(translate)("apiClient.requestAuthTab.token"),
294
297
  type: "password",
295
298
  "onUpdate:modelValue": (v) => handleHttpSecretsUpdate({ "x-scalar-secret-token": v }, name)
296
299
  }, {
297
- default: withCtx(() => [..._cache[4] || (_cache[4] = [createTextVNode(" Bearer Token ", -1)])]),
300
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.bearerToken")), 1)]),
298
301
  _: 1
299
302
  }, 8, [
300
303
  "containerClass",
301
304
  "environment",
302
305
  "modelValue",
306
+ "placeholder",
303
307
  "onUpdate:modelValue"
304
308
  ])]),
305
309
  _: 2
306
310
  }, 1024)) : createCommentVNode("", true), scheme.scheme === "bearer" && oauth2Target.value ? (openBlock(), createBlock(unref(DataTableRow_default), { key: 1 }, {
307
311
  default: withCtx(() => [createElementVNode("div", _hoisted_3, [
308
- _cache[6] || (_cache[6] = createElementVNode("span", { class: "text-c-3 mr-auto text-xs" }, "Get a token", -1)),
312
+ createElementVNode("span", _hoisted_4, toDisplayString(unref(translate)("apiClient.requestAuthTab.getAToken")), 1),
309
313
  createVNode(unref(ScalarButton), {
310
314
  class: "p-0 px-2 py-0.5",
311
315
  loader: unref(acquisitionLoader),
@@ -314,7 +318,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
314
318
  variant: "outlined",
315
319
  onClick: ($event) => handleAcquisitionAuthorize(name)
316
320
  }, {
317
- default: withCtx(() => [createTextVNode(" Authorize via " + toDisplayString(oauth2Target.value.name), 1)]),
321
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.authorizeVia", { name: oauth2Target.value.name })), 1)]),
318
322
  _: 2
319
323
  }, 1032, ["loader", "onClick"]),
320
324
  scheme["x-scalar-secret-token"] && oauth2Target.value.flowType === "authorizationCode" ? (openBlock(), createBlock(unref(ScalarButton), {
@@ -326,12 +330,12 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
326
330
  variant: "outlined",
327
331
  onClick: ($event) => handleAcquisitionRefresh(name)
328
332
  }, {
329
- default: withCtx(() => [..._cache[5] || (_cache[5] = [createTextVNode(" Refresh ", -1)])]),
333
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.refresh")), 1)]),
330
334
  _: 1
331
335
  }, 8, ["disabled", "onClick"])) : createCommentVNode("", true),
332
336
  createVNode(unref(ScalarIconButton), {
333
337
  icon: unref(ScalarIconGear),
334
- label: `Configure ${oauth2Target.value.name}`,
338
+ label: unref(translate)("apiClient.requestAuthTab.configure", { name: oauth2Target.value.name }),
335
339
  size: "xs",
336
340
  onClick: ($event) => openAcquisitionConfig(name)
337
341
  }, null, 8, [
@@ -350,7 +354,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
350
354
  required: "",
351
355
  "onUpdate:modelValue": (v) => handleHttpSecretsUpdate({ "x-scalar-secret-username": v }, name)
352
356
  }, {
353
- default: withCtx(() => [..._cache[7] || (_cache[7] = [createTextVNode(" Username ", -1)])]),
357
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.username")), 1)]),
354
358
  _: 1
355
359
  }, 8, [
356
360
  "environment",
@@ -366,7 +370,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
366
370
  type: "password",
367
371
  "onUpdate:modelValue": (v) => handleHttpSecretsUpdate({ "x-scalar-secret-password": v }, name)
368
372
  }, {
369
- default: withCtx(() => [..._cache[8] || (_cache[8] = [createTextVNode(" Password ", -1)])]),
373
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.password")), 1)]),
370
374
  _: 1
371
375
  }, 8, [
372
376
  "environment",
@@ -382,7 +386,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
382
386
  placeholder: "api-key",
383
387
  "onUpdate:modelValue": (v) => handleApiKeySecuritySchemeUpdate({ name: v }, name)
384
388
  }, {
385
- default: withCtx(() => [..._cache[9] || (_cache[9] = [createTextVNode(" Name ", -1)])]),
389
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.name")), 1)]),
386
390
  _: 1
387
391
  }, 8, [
388
392
  "containerClass",
@@ -400,7 +404,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
400
404
  type: "password",
401
405
  "onUpdate:modelValue": (v) => handleApiKeySecretsUpdate({ "x-scalar-secret-token": v }, name)
402
406
  }, {
403
- default: withCtx(() => [..._cache[10] || (_cache[10] = [createTextVNode(" Value ", -1)])]),
407
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.value")), 1)]),
404
408
  _: 1
405
409
  }, 8, [
406
410
  "containerClass",
@@ -444,13 +448,13 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
444
448
  "scheme"
445
449
  ])) : createCommentVNode("", true),
446
450
  visibleFlowKeys.length > 1 ? (openBlock(), createBlock(unref(DataTableRow_default), { key: 2 }, {
447
- default: withCtx(() => [createElementVNode("div", _hoisted_4, [createElementVNode("div", _hoisted_5, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleFlowKeys, (key, ind) => {
451
+ default: withCtx(() => [createElementVNode("div", _hoisted_5, [createElementVNode("div", _hoisted_6, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleFlowKeys, (key, ind) => {
448
452
  return openBlock(), createElementBlock("button", {
449
453
  key,
450
454
  class: normalizeClass(getFlowTabClasses(key, ind)),
451
455
  type: "button",
452
456
  onClick: ($event) => setActiveFlow(key)
453
- }, [createElementVNode("span", _hoisted_7, toDisplayString(key), 1)], 10, _hoisted_6);
457
+ }, [createElementVNode("span", _hoisted_8, toDisplayString(key), 1)], 10, _hoisted_7);
454
458
  }), 128))])])]),
455
459
  _: 2
456
460
  }, 1024)) : createCommentVNode("", true),
@@ -486,27 +490,23 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
486
490
  "onUpsert:scope"
487
491
  ])) : createCommentVNode("", true)], 64);
488
492
  }), 128))
489
- ], 64)) : scheme?.type === "userPassword" || scheme?.type === "plain" || scheme?.type === "scramSha256" || scheme?.type === "scramSha512" || scheme?.type === "X509" || scheme?.type === "symmetricEncryption" || scheme?.type === "asymmetricEncryption" || scheme?.type === "gssapi" ? (openBlock(), createElementBlock("div", _hoisted_8, " Credentials for this AsyncAPI security scheme are not sent by the browser client. ")) : scheme?.type === "mutualTLS" ? (openBlock(), createElementBlock("div", _hoisted_9, " Mutual TLS authenticates with a client certificate presented during the TLS handshake, so there is nothing to enter here. ")) : getUnsupportedSchemeType(scheme) ? (openBlock(), createElementBlock("div", _hoisted_10, [
490
- _cache[11] || (_cache[11] = createTextVNode(" The ", -1)),
491
- createElementVNode("code", null, toDisplayString(getUnsupportedSchemeType(scheme)), 1),
492
- _cache[12] || (_cache[12] = createTextVNode(" security scheme type is not supported yet. ", -1))
493
- ])) : (openBlock(), createElementBlock("div", _hoisted_11, " The security scheme is missing a type, please double check your " + toDisplayString(documentTypeLabel.value) + " document or Authentication Configuration ", 1))
493
+ ], 64)) : scheme?.type === "userPassword" || scheme?.type === "plain" || scheme?.type === "scramSha256" || scheme?.type === "scramSha512" || scheme?.type === "X509" || scheme?.type === "symmetricEncryption" || scheme?.type === "asymmetricEncryption" || scheme?.type === "gssapi" ? (openBlock(), createElementBlock("div", _hoisted_9, toDisplayString(unref(translate)("apiClient.requestAuthTab.unsupportedCredentials")), 1)) : scheme?.type === "mutualTLS" ? (openBlock(), createElementBlock("div", _hoisted_10, toDisplayString(unref(translate)("apiClient.requestAuthTab.mutualTlsHint")), 1)) : getUnsupportedSchemeType(scheme) ? (openBlock(), createElementBlock("div", _hoisted_11, toDisplayString(unref(translate)("apiClient.requestAuthTab.unsupportedType", { type: getUnsupportedSchemeType(scheme) ?? "" })), 1)) : (openBlock(), createElementBlock("div", _hoisted_12, toDisplayString(unref(translate)("apiClient.requestAuthTab.missingType", { type: documentTypeLabel.value })), 1))
494
494
  ], 64);
495
495
  }), 128)), oauth2Target.value && oauth2Scheme.value ? (openBlock(), createBlock(unref(ScalarModal), {
496
496
  key: 0,
497
- state: unref(configModal),
498
497
  size: "sm",
499
- title: `Configure ${oauth2Target.value.name}`
498
+ state: unref(configModal),
499
+ title: unref(translate)("apiClient.requestAuthTab.configure", { name: oauth2Target.value.name })
500
500
  }, {
501
501
  default: withCtx(() => [createVNode(unref(DataTable_default), {
502
502
  columns: [""],
503
503
  presentational: ""
504
504
  }, {
505
505
  default: withCtx(() => [createVNode(OAuth2_default, {
506
- hideActions: "",
507
506
  environment: __props.environment,
508
507
  eventBus: __props.eventBus,
509
508
  flows: oauth2Target.value.flows,
509
+ hideActions: "",
510
510
  name: oauth2Target.value.name,
511
511
  options: __props.options,
512
512
  proxyUrl: __props.proxyUrl,
@@ -530,13 +530,13 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
530
530
  "type"
531
531
  ])]),
532
532
  _: 1
533
- }), createElementVNode("div", _hoisted_12, [createVNode(unref(ScalarButton), {
533
+ }), createElementVNode("div", _hoisted_13, [createVNode(unref(ScalarButton), {
534
534
  class: "p-0 px-2 py-0.5",
535
535
  size: "sm",
536
536
  variant: "outlined",
537
537
  onClick: _cache[3] || (_cache[3] = ($event) => unref(configModal).hide())
538
538
  }, {
539
- default: withCtx(() => [..._cache[13] || (_cache[13] = [createTextVNode(" Cancel ", -1)])]),
539
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.cancel")), 1)]),
540
540
  _: 1
541
541
  }), createVNode(unref(ScalarButton), {
542
542
  class: "p-0 px-2 py-0.5",
@@ -544,7 +544,7 @@ var RequestAuthTab_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ d
544
544
  size: "sm",
545
545
  onClick: handleConfigAuthorize
546
546
  }, {
547
- default: withCtx(() => [..._cache[14] || (_cache[14] = [createTextVNode(" Authorize ", -1)])]),
547
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(translate)("apiClient.requestAuthTab.authorize")), 1)]),
548
548
  _: 1
549
549
  }, 8, ["loader"])])]),
550
550
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"RequestAuthTab.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { useLoadingState } from '@scalar/components/loading'\nimport { ScalarMarkdownSummary } from '@scalar/components/markdown'\nimport { ScalarModal, useModal } from '@scalar/components/modal'\nimport { ScalarIconGear } from '@scalar/icons'\nimport { useToasts } from '@scalar/use-toasts'\nimport type {\n SecretsApiKey,\n SecretsHttp,\n} from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n getEnvironmentVariables,\n type MergedSecuritySchemes,\n type OAuthFlowsObjectSecret,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { getDocumentTypeLabel } from '@scalar/workspace-store/schemas/type-guards'\nimport type {\n ApiKeyObject,\n SecurityRequirementObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { capitalize, computed, ref } from 'vue'\n\nimport { refreshOauth2Token } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth'\nimport { getVisibleOrderedFlowKeys } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows'\nimport {\n runOAuth2Authorize,\n storeOAuth2Tokens,\n} from '@/v2/blocks/scalar-auth-selector-block/helpers/run-oauth2-authorize'\nimport { getOauth2AcquisitionTarget } from '@/v2/blocks/scalar-auth-selector-block/helpers/security-scheme'\nimport {\n DataTable,\n DataTableCell,\n DataTableRow,\n} from '@/v2/components/data-table'\n\nimport OAuth2, { type OAuth2Options } from './OAuth2.vue'\nimport OAuth2Metadata from './OAuth2Metadata.vue'\nimport OpenIDConnect from './OpenIDConnect.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\ntype SecurityItem = {\n scheme: SecuritySchemeObjectSecret | undefined\n name: string\n scopes: string[]\n /** Ordered, non-hidden oauth2/openIdConnect flow keys for this scheme (empty for other types). */\n visibleFlowKeys: (keyof OAuthFlowsObjectSecret)[]\n}\n\nconst {\n environment,\n isStatic,\n proxyUrl,\n selectedSecuritySchemas,\n securitySchemes,\n server,\n eventBus,\n options,\n documentType = 'openapi',\n} = defineProps<{\n /** Current environment configuration */\n environment: XScalarEnvironment\n /** Controls the display of certain borders which are used when we are non-collapsible */\n isStatic: boolean\n /** Proxy URL */\n proxyUrl: string\n /** Selected security schemes*/\n selectedSecuritySchemas: SecurityRequirementObject\n /** Merged security schemes from the document and the config together with the auth store secrets */\n securitySchemes: MergedSecuritySchemes\n /** Current server configuration */\n server: ServerObject | null\n /** Event bus for authentication updates */\n eventBus: WorkspaceEventBus\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n /** Type of the document the schemes belong to, used to label the missing-type warning */\n documentType?: 'openapi' | 'asyncapi'\n}>()\n\n/**\n * Human-readable name of the document type.\n * Used in the missing-type warning so it points at the correct document\n * (e.g. \"AsyncAPI\") instead of always naming OpenAPI.\n */\nconst documentTypeLabel = computed<string>(() =>\n getDocumentTypeLabel(documentType),\n)\n\nconst emits = defineEmits<{\n (\n e: 'update:selectedScopes',\n payload: Omit<ApiReferenceEvents['auth:update:selected-scopes'], 'meta'>,\n ): void\n (e: 'upsert:scope', payload: ApiReferenceEvents['auth:upsert:scopes']): void\n (e: 'delete:scope', payload: ApiReferenceEvents['auth:delete:scopes']): void\n}>()\n\n/**\n * Resolves security schemes from the OpenAPI document and combines them with their selected scopes.\n * Each item includes the scheme definition, name, and associated scopes.\n */\nconst security = computed<SecurityItem[]>(() =>\n Object.entries(selectedSecuritySchemas).map(([name, scopes = []]) => {\n const scheme = getResolvedRef(securitySchemes[name])\n return {\n scheme,\n name,\n scopes,\n // Compute the visible, ordered flow keys once per scheme so the tabs, the label, and the\n // active-flow tracking all agree on the same set (and we do not filter + sort on every access).\n visibleFlowKeys:\n scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\n ? getVisibleOrderedFlowKeys(scheme.flows)\n : [],\n }\n }),\n)\n\n/** Tracks which OAuth2 flow is currently active when multiple flows are available. */\nconst activeFlow = ref<string>('')\n\n/**\n * Keeps the selected flow in sync with the currently visible flow keys. Validating against the\n * visible set (not every declared flow) means a selection that becomes hidden — e.g. the document\n * is updated to mark the active flow with `x-scalar-ignore` — resets, so the default (first visible)\n * flow activates instead of leaving no tab selected.\n */\nconst selectedFlow = computed<string>(() => {\n const visibleFlowKeys = security.value.flatMap((item) => item.visibleFlowKeys)\n\n return visibleFlowKeys.some((key) => key === activeFlow.value)\n ? activeFlow.value\n : ''\n})\n\nconst setActiveFlow = (flow: string): void => {\n activeFlow.value = flow\n}\n\n/** Determines if multiple auth schemes are configured, which affects the UI layout. */\nconst hasMultipleSchemes = computed<boolean>(() => security.value.length > 1)\n\n/**\n * Generates a human-readable label for the security scheme.\n * Intentionally omits the description here — it is rendered separately as\n * rich text via ScalarMarkdownSummary so markdown formatting is preserved.\n */\nconst generateLabel = (\n name: string,\n scheme: SecuritySchemeObjectSecret,\n): string => {\n const capitalizedName = capitalize(name)\n\n switch (scheme.type) {\n case 'apiKey':\n return `${capitalizedName}: ${scheme.in}`\n\n case 'openIdConnect':\n case 'oauth2': {\n const firstFlow = getVisibleOrderedFlowKeys(scheme.flows)[0]\n const currentFlow = selectedFlow.value || firstFlow\n if (!currentFlow) {\n return capitalizedName\n }\n return `${capitalizedName}: ${currentFlow}`\n }\n\n case 'http':\n return `${capitalizedName}: ${scheme.scheme}`\n\n default:\n return capitalizedName\n }\n}\n\n/**\n * Whether an API key scheme exposes an editable parameter name.\n *\n * OpenAPI `apiKey` and AsyncAPI `httpApiKey` (normalized to `apiKey`) name a query/header/cookie\n * parameter, so the Name input is shown. AsyncAPI `apiKey` places the key in the broker `user` or\n * `password` slot and has no parameter name, so the Name input is hidden and only the value is asked for.\n */\nconst apiKeyHasName = (scheme: { in?: string }): boolean =>\n scheme.in !== 'user' && scheme.in !== 'password'\n\n/**\n * The scheme's type when it is one we do not render inputs for (a type outside both the OpenAPI\n * and AsyncAPI security scheme unions). Read through a helper so the fallback template branch,\n * where the scheme type is narrowed to `never` after the supported cases, can still surface the type.\n */\nconst getUnsupportedSchemeType = (\n scheme: SecurityItem['scheme'],\n): string | undefined => scheme?.type\n\n/**\n * Determines if an OAuth2 flow tab should be active.\n * The first flow is active by default if no flow is explicitly selected.\n */\nconst isFlowActive = (flowKey: string, index: number): boolean =>\n selectedFlow.value === flowKey || (index === 0 && !selectedFlow.value)\n\n/** Computes the container class for static display mode. */\nconst getStaticBorderClass = (): string | false => isStatic && 'border-t'\n\nconst handleHttpSecretsUpdate = (\n payload: Omit<Partial<SecretsHttp>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'http', ...payload },\n name,\n })\n\nconst handleApiKeySecretsUpdate = (\n payload: Omit<Partial<SecretsApiKey>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\nconst handleApiKeySecuritySchemeUpdate = (\n payload: Omit<Partial<ApiKeyObject>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\n/** Handles scope selection updates for OAuth2 */\nconst handleScopesUpdate = (\n name: string,\n event: { scopes?: string[]; scope?: string; selected?: boolean },\n): void => {\n emits('update:selectedScopes', {\n id: Object.keys(selectedSecuritySchemas),\n name,\n ...event,\n })\n}\n\n/** Handles scope-definition upserts (add / rename / description change) */\nconst handleScopeUpsert = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:upsert:scopes'], 'name'>,\n): void => {\n emits('upsert:scope', { ...event, name })\n}\n\n/** Handles scope-definition deletes */\nconst handleScopeDelete = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:delete:scopes'], 'name'>,\n): void => {\n emits('delete:scope', { ...event, name })\n}\n\n/**\n * Computes dynamic classes for OAuth2 flow tabs based on active state.\n */\nconst getFlowTabClasses = (flowKey: string, index: number): string => {\n const baseClasses =\n 'floating-bg text-c-3 relative cursor-pointer border-b border-transparent py-1 text-base font-medium'\n const activeClasses = '!text-c-1 !rounded-none border-b !border-current'\n\n return isFlowActive(flowKey, index)\n ? `${baseClasses} ${activeClasses} ${isStatic ? 'opacity-100' : ''}`\n : baseClasses\n}\n\n/**\n * OAuth2 token-acquisition target (an oauth2 scheme with an interactive grant) sourced from\n * the merged schemes. When the active scheme is HTTP bearer, this powers the inline\n * \"Authorize via OAuth2\" shortcut: the flow's bearer token is written onto the bearer scheme,\n * so the panel never switches to oauth2.\n *\n * The shortcut is purely a convenience, so it is offered for any interactive oauth2 scheme —\n * including one that is also independently selectable in the dropdown (e.g. Scalar Galaxy's\n * `oAuth2`). Whether that oauth2 scheme is *hidden* from the dropdown is a separate decision made\n * in the selector; here we only surface the shortcut.\n */\nconst oauth2Target = computed(() => getOauth2AcquisitionTarget(securitySchemes))\n\n/** Resolved oauth2 scheme object, for embedding its config form behind the gear. */\nconst oauth2Scheme = computed(() =>\n oauth2Target.value\n ? getResolvedRef(securitySchemes[oauth2Target.value.name])\n : undefined,\n)\n\nconst acquisitionLoader = useLoadingState()\nconst { toast } = useToasts()\nconst configModal = useModal()\n/** Bearer scheme that opened the config modal, so its Authorize callback targets it. */\nconst configBearerName = ref<string | undefined>()\n\n/** Runs the OAuth2 flow and writes the resulting bearer token onto the bearer scheme. */\nconst handleAcquisitionAuthorize = async (\n bearerName: string,\n): Promise<void> => {\n const target = oauth2Target.value\n if (!target || acquisitionLoader.isLoading) {\n return\n }\n acquisitionLoader.start()\n const [error] = await runOAuth2Authorize({\n eventBus,\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flows: target.flows,\n flowType: target.flowType,\n scopes: target.scopes,\n server,\n proxyUrl,\n environment,\n options,\n })\n await acquisitionLoader.clear()\n if (error) {\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** Refreshes the OAuth2 token and rewrites it onto the bearer scheme. */\nconst handleAcquisitionRefresh = async (bearerName: string): Promise<void> => {\n const target = oauth2Target.value\n // Only the authorization-code flow carries a refresh token; implicit can't be refreshed.\n if (\n !target ||\n target.flowType !== 'authorizationCode' ||\n acquisitionLoader.isLoading\n ) {\n return\n }\n acquisitionLoader.start()\n const [error, tokens] = await refreshOauth2Token(\n target.flows,\n target.flowType,\n proxyUrl,\n server,\n getEnvironmentVariables(environment),\n options?.customFetch,\n )\n await acquisitionLoader.clear()\n if (tokens?.accessToken) {\n storeOAuth2Tokens(eventBus, {\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flowType: target.flowType,\n tokens,\n })\n } else if (error) {\n toast(error?.message ?? 'Failed to refresh', 'error')\n }\n}\n\nconst openAcquisitionConfig = (bearerName: string): void => {\n configBearerName.value = bearerName\n configModal.show()\n}\n\n/** Closes the config modal and runs Authorize against the bearer scheme that opened it. */\nconst handleConfigAuthorize = (): void => {\n const bearerName = configBearerName.value\n configModal.hide()\n if (bearerName) {\n void handleAcquisitionAuthorize(bearerName)\n }\n}\n</script>\n<template>\n <template\n v-for=\"{ scheme, name, scopes, visibleFlowKeys } in security\"\n :key=\"name\">\n <!--\n Header row for AND'ed schemes: label (bold) and description (rich text) are\n combined.\n -->\n <DataTableRow v-if=\"hasMultipleSchemes && scheme\">\n <DataTableCell\n :aria-label=\"generateLabel(name, scheme)\"\n class=\"max-h-[auto]\">\n <div class=\"bg-b-1 min-w-0 flex-1 px-3 py-1.25\">\n <p class=\"text-c-1 leading-5.5 font-medium\">\n {{ generateLabel(name, scheme) }}\n </p>\n <ScalarMarkdownSummary\n v-if=\"scheme.description\"\n class=\"auth-description text-c-2 w-full\"\n :value=\"scheme.description\" />\n </div>\n </DataTableCell>\n </DataTableRow>\n\n <!-- Description: shown for single auth schemes with descriptions -->\n <DataTableRow v-if=\"scheme?.description && !hasMultipleSchemes\">\n <DataTableCell\n :aria-label=\"scheme.description\"\n class=\"max-h-[auto]\">\n <ScalarMarkdownSummary\n class=\"auth-description bg-b-1 text-c-2 min-w-0 flex-1 px-3 py-1.25\"\n :value=\"scheme.description\" />\n </DataTableCell>\n </DataTableRow>\n\n <!-- HTTP Authentication -->\n <template v-if=\"scheme?.type === 'http'\">\n <!-- Bearer Token -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer'\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n placeholder=\"Token\"\n type=\"password\"\n @update:modelValue=\"\n (v) => handleHttpSecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n Bearer Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- OAuth2 token-acquisition shortcut (shown when an interactive oauth2 flow exists) -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer' && oauth2Target\">\n <div class=\"flex h-8 items-center gap-2 border-t px-3\">\n <span class=\"text-c-3 mr-auto text-xs\">Get a token</span>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionAuthorize(name)\">\n Authorize via {{ oauth2Target.name }}\n </ScalarButton>\n <ScalarButton\n v-if=\"\n scheme['x-scalar-secret-token'] &&\n oauth2Target.flowType === 'authorizationCode'\n \"\n class=\"p-0 px-2 py-0.5\"\n :disabled=\"acquisitionLoader.isLoading\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionRefresh(name)\">\n Refresh\n </ScalarButton>\n <ScalarIconButton\n :icon=\"ScalarIconGear\"\n :label=\"`Configure ${oauth2Target.name}`\"\n size=\"xs\"\n @click=\"openAcquisitionConfig(name)\" />\n </div>\n </DataTableRow>\n\n <!-- HTTP Basic Authentication -->\n <template v-else-if=\"scheme?.scheme === 'basic'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n class=\"text-c-2\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-username']\"\n placeholder=\"janedoe\"\n required\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-username': v }, name)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :environment\n :modelValue=\"scheme['x-scalar-secret-password']\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-password': v }, name)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n </template>\n\n <!-- API Key Authentication -->\n <template v-else-if=\"scheme?.type === 'apiKey'\">\n <DataTableRow v-if=\"apiKeyHasName(scheme)\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme.name ?? ''\"\n placeholder=\"api-key\"\n @update:modelValue=\"\n (v) => handleApiKeySecuritySchemeUpdate({ name: v }, name)\n \">\n Name\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :containerClass=\"\n apiKeyHasName(scheme) ? undefined : getStaticBorderClass()\n \"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleApiKeySecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n Value\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- OAuth 2.0 / OpenID Connect Authentication -->\n <template\n v-else-if=\"scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\">\n <OAuth2Metadata\n v-if=\"\n scheme.type === 'oauth2' && (!isStatic || scheme.oauth2MetadataUrl)\n \"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :name\n :proxyUrl\n :scheme />\n\n <!-- OpenID Connect -->\n <OpenIDConnect\n v-if=\"scheme?.type === 'openIdConnect' && !visibleFlowKeys.length\"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :getStaticBorderClass\n :name\n :proxyUrl\n :scheme />\n\n <!-- Flow selector tabs: shown when multiple visible flows are available -->\n <DataTableRow v-if=\"visibleFlowKeys.length > 1\">\n <div class=\"flex min-h-8 border-t text-base\">\n <div class=\"flex h-8 max-w-full gap-2.5 overflow-x-auto px-3\">\n <button\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\"\n :class=\"getFlowTabClasses(key, ind)\"\n type=\"button\"\n @click=\"setActiveFlow(key)\">\n <span class=\"relative z-10\">{{ key }}</span>\n </button>\n </div>\n </div>\n </DataTableRow>\n\n <!-- OAuth2 flow configuration -->\n <template\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\">\n <OAuth2\n v-if=\"scheme.flows && isFlowActive(key, ind)\"\n :environment\n :eventBus\n :flows=\"scheme.flows\"\n :name\n :options\n :proxyUrl\n :scheme\n :selectedScopes=\"scopes\"\n :server\n :type=\"key\"\n @delete:scope=\"(event) => handleScopeDelete(name, event)\"\n @update:selectedScopes=\"(event) => handleScopesUpdate(name, event)\"\n @upsert:scope=\"(event) => handleScopeUpsert(name, event)\" />\n </template>\n </template>\n\n <!-- Browser WebSocket connections cannot apply these broker credentials. -->\n <div\n v-else-if=\"\n scheme?.type === 'userPassword' ||\n scheme?.type === 'plain' ||\n scheme?.type === 'scramSha256' ||\n scheme?.type === 'scramSha512' ||\n scheme?.type === 'X509' ||\n scheme?.type === 'symmetricEncryption' ||\n scheme?.type === 'asymmetricEncryption' ||\n scheme?.type === 'gssapi'\n \"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n Credentials for this AsyncAPI security scheme are not sent by the browser\n client.\n </div>\n\n <!-- Mutual TLS credentials are chosen during the browser-managed TLS handshake. -->\n <div\n v-else-if=\"scheme?.type === 'mutualTLS'\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n Mutual TLS authenticates with a client certificate presented during the\n TLS handshake, so there is nothing to enter here.\n </div>\n\n <!-- Scheme has a type we do not render inputs for -->\n <div\n v-else-if=\"getUnsupportedSchemeType(scheme)\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n The <code>{{ getUnsupportedSchemeType(scheme) }}</code> security scheme\n type is not supported yet.\n </div>\n\n <!-- Scheme is missing type -->\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n The security scheme is missing a type, please double check your\n {{ documentTypeLabel }} document or Authentication Configuration\n </div>\n </template>\n\n <!-- OAuth2 configuration modal (opened from the bearer scheme's gear) -->\n <ScalarModal\n v-if=\"oauth2Target && oauth2Scheme\"\n :state=\"configModal\"\n size=\"sm\"\n :title=\"`Configure ${oauth2Target.name}`\">\n <DataTable\n :columns=\"['']\"\n presentational>\n <OAuth2\n hideActions\n :environment\n :eventBus\n :flows=\"oauth2Target.flows\"\n :name=\"oauth2Target.name\"\n :options\n :proxyUrl\n :scheme=\"oauth2Scheme\"\n :selectedScopes=\"oauth2Target.scopes\"\n :server\n :type=\"oauth2Target.flowType\"\n @delete:scope=\"(event) => handleScopeDelete(oauth2Target!.name, event)\"\n @update:selectedScopes=\"\n (event) => handleScopesUpdate(oauth2Target!.name, event)\n \"\n @upsert:scope=\"\n (event) => handleScopeUpsert(oauth2Target!.name, event)\n \" />\n </DataTable>\n <div class=\"flex h-8 items-center justify-end gap-2 border-t\">\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"configModal.hide()\">\n Cancel\n </ScalarButton>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n @click=\"handleConfigAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </ScalarModal>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RequestAuthTab.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { useLoadingState } from '@scalar/components/loading'\nimport { ScalarMarkdownSummary } from '@scalar/components/markdown'\nimport { ScalarModal, useModal } from '@scalar/components/modal'\nimport { ScalarIconGear } from '@scalar/icons'\nimport { useToasts } from '@scalar/use-toasts'\nimport type {\n SecretsApiKey,\n SecretsHttp,\n} from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n getEnvironmentVariables,\n type MergedSecuritySchemes,\n type OAuthFlowsObjectSecret,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { getDocumentTypeLabel } from '@scalar/workspace-store/schemas/type-guards'\nimport type {\n ApiKeyObject,\n SecurityRequirementObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { capitalize, computed, ref } from 'vue'\n\nimport { refreshOauth2Token } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth'\nimport { getVisibleOrderedFlowKeys } from '@/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows'\nimport {\n runOAuth2Authorize,\n storeOAuth2Tokens,\n} from '@/v2/blocks/scalar-auth-selector-block/helpers/run-oauth2-authorize'\nimport { getOauth2AcquisitionTarget } from '@/v2/blocks/scalar-auth-selector-block/helpers/security-scheme'\nimport {\n DataTable,\n DataTableCell,\n DataTableRow,\n} from '@/v2/components/data-table'\nimport { useLocalization } from '@/v2/features/localization'\n\nimport OAuth2, { type OAuth2Options } from './OAuth2.vue'\nimport OAuth2Metadata from './OAuth2Metadata.vue'\nimport OpenIDConnect from './OpenIDConnect.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n environment,\n isStatic,\n proxyUrl,\n selectedSecuritySchemas,\n securitySchemes,\n server,\n eventBus,\n options,\n documentType = 'openapi',\n} = defineProps<{\n /** Current environment configuration */\n environment: XScalarEnvironment\n /** Controls the display of certain borders which are used when we are non-collapsible */\n isStatic: boolean\n /** Proxy URL */\n proxyUrl: string\n /** Selected security schemes*/\n selectedSecuritySchemas: SecurityRequirementObject\n /** Merged security schemes from the document and the config together with the auth store secrets */\n securitySchemes: MergedSecuritySchemes\n /** Current server configuration */\n server: ServerObject | null\n /** Event bus for authentication updates */\n eventBus: WorkspaceEventBus\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n /** Type of the document the schemes belong to, used to label the missing-type warning */\n documentType?: 'openapi' | 'asyncapi'\n}>()\n\nconst emits = defineEmits<{\n (\n e: 'update:selectedScopes',\n payload: Omit<ApiReferenceEvents['auth:update:selected-scopes'], 'meta'>,\n ): void\n (e: 'upsert:scope', payload: ApiReferenceEvents['auth:upsert:scopes']): void\n (e: 'delete:scope', payload: ApiReferenceEvents['auth:delete:scopes']): void\n}>()\n\nconst { translate } = useLocalization()\n\ntype SecurityItem = {\n scheme: SecuritySchemeObjectSecret | undefined\n name: string\n scopes: string[]\n /** Ordered, non-hidden oauth2/openIdConnect flow keys for this scheme (empty for other types). */\n visibleFlowKeys: (keyof OAuthFlowsObjectSecret)[]\n}\n\n/**\n * Human-readable name of the document type.\n * Used in the missing-type warning so it points at the correct document\n * (e.g. \"AsyncAPI\") instead of always naming OpenAPI.\n */\nconst documentTypeLabel = computed<string>(() =>\n getDocumentTypeLabel(documentType),\n)\n\n/**\n * Resolves security schemes from the OpenAPI document and combines them with their selected scopes.\n * Each item includes the scheme definition, name, and associated scopes.\n */\nconst security = computed<SecurityItem[]>(() =>\n Object.entries(selectedSecuritySchemas).map(([name, scopes = []]) => {\n const scheme = getResolvedRef(securitySchemes[name])\n return {\n scheme,\n name,\n scopes,\n // Compute the visible, ordered flow keys once per scheme so the tabs, the label, and the\n // active-flow tracking all agree on the same set (and we do not filter + sort on every access).\n visibleFlowKeys:\n scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\n ? getVisibleOrderedFlowKeys(scheme.flows)\n : [],\n }\n }),\n)\n\n/** Tracks which OAuth2 flow is currently active when multiple flows are available. */\nconst activeFlow = ref<string>('')\n\n/**\n * Keeps the selected flow in sync with the currently visible flow keys. Validating against the\n * visible set (not every declared flow) means a selection that becomes hidden — e.g. the document\n * is updated to mark the active flow with `x-scalar-ignore` — resets, so the default (first visible)\n * flow activates instead of leaving no tab selected.\n */\nconst selectedFlow = computed<string>(() => {\n const visibleFlowKeys = security.value.flatMap((item) => item.visibleFlowKeys)\n\n return visibleFlowKeys.some((key) => key === activeFlow.value)\n ? activeFlow.value\n : ''\n})\n\nconst setActiveFlow = (flow: string): void => {\n activeFlow.value = flow\n}\n\n/** Determines if multiple auth schemes are configured, which affects the UI layout. */\nconst hasMultipleSchemes = computed<boolean>(() => security.value.length > 1)\n\n/**\n * Generates a human-readable label for the security scheme.\n * Intentionally omits the description here — it is rendered separately as\n * rich text via ScalarMarkdownSummary so markdown formatting is preserved.\n */\nconst generateLabel = (\n name: string,\n scheme: SecuritySchemeObjectSecret,\n): string => {\n const capitalizedName = capitalize(name)\n\n switch (scheme.type) {\n case 'apiKey':\n return `${capitalizedName}: ${scheme.in}`\n\n case 'openIdConnect':\n case 'oauth2': {\n const firstFlow = getVisibleOrderedFlowKeys(scheme.flows)[0]\n const currentFlow = selectedFlow.value || firstFlow\n if (!currentFlow) {\n return capitalizedName\n }\n return `${capitalizedName}: ${currentFlow}`\n }\n\n case 'http':\n return `${capitalizedName}: ${scheme.scheme}`\n\n default:\n return capitalizedName\n }\n}\n\n/**\n * Whether an API key scheme exposes an editable parameter name.\n *\n * OpenAPI `apiKey` and AsyncAPI `httpApiKey` (normalized to `apiKey`) name a query/header/cookie\n * parameter, so the Name input is shown. AsyncAPI `apiKey` places the key in the broker `user` or\n * `password` slot and has no parameter name, so the Name input is hidden and only the value is asked for.\n */\nconst apiKeyHasName = (scheme: { in?: string }): boolean =>\n scheme.in !== 'user' && scheme.in !== 'password'\n\n/**\n * The scheme's type when it is one we do not render inputs for (a type outside both the OpenAPI\n * and AsyncAPI security scheme unions). Read through a helper so the fallback template branch,\n * where the scheme type is narrowed to `never` after the supported cases, can still surface the type.\n */\nconst getUnsupportedSchemeType = (\n scheme: SecurityItem['scheme'],\n): string | undefined => scheme?.type\n\n/**\n * Determines if an OAuth2 flow tab should be active.\n * The first flow is active by default if no flow is explicitly selected.\n */\nconst isFlowActive = (flowKey: string, index: number): boolean =>\n selectedFlow.value === flowKey || (index === 0 && !selectedFlow.value)\n\n/** Computes the container class for static display mode. */\nconst getStaticBorderClass = (): string | false => isStatic && 'border-t'\n\nconst handleHttpSecretsUpdate = (\n payload: Omit<Partial<SecretsHttp>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'http', ...payload },\n name,\n })\n\nconst handleApiKeySecretsUpdate = (\n payload: Omit<Partial<SecretsApiKey>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme-secrets', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\nconst handleApiKeySecuritySchemeUpdate = (\n payload: Omit<Partial<ApiKeyObject>, 'type'>,\n name: string,\n): void =>\n eventBus.emit('auth:update:security-scheme', {\n payload: { type: 'apiKey', ...payload },\n name,\n })\n\n/** Handles scope selection updates for OAuth2 */\nconst handleScopesUpdate = (\n name: string,\n event: { scopes?: string[]; scope?: string; selected?: boolean },\n): void => {\n emits('update:selectedScopes', {\n id: Object.keys(selectedSecuritySchemas),\n name,\n ...event,\n })\n}\n\n/** Handles scope-definition upserts (add / rename / description change) */\nconst handleScopeUpsert = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:upsert:scopes'], 'name'>,\n): void => {\n emits('upsert:scope', { ...event, name })\n}\n\n/** Handles scope-definition deletes */\nconst handleScopeDelete = (\n name: string,\n event: Omit<ApiReferenceEvents['auth:delete:scopes'], 'name'>,\n): void => {\n emits('delete:scope', { ...event, name })\n}\n\n/**\n * Computes dynamic classes for OAuth2 flow tabs based on active state.\n */\nconst getFlowTabClasses = (flowKey: string, index: number): string => {\n const baseClasses =\n 'floating-bg text-c-3 relative cursor-pointer border-b border-transparent py-1 text-base font-medium'\n const activeClasses = '!text-c-1 !rounded-none border-b !border-current'\n\n return isFlowActive(flowKey, index)\n ? `${baseClasses} ${activeClasses} ${isStatic ? 'opacity-100' : ''}`\n : baseClasses\n}\n\n/**\n * OAuth2 token-acquisition target (an oauth2 scheme with an interactive grant) sourced from\n * the merged schemes. When the active scheme is HTTP bearer, this powers the inline\n * \"Authorize via OAuth2\" shortcut: the flow's bearer token is written onto the bearer scheme,\n * so the panel never switches to oauth2.\n *\n * The shortcut is purely a convenience, so it is offered for any interactive oauth2 scheme —\n * including one that is also independently selectable in the dropdown (e.g. Scalar Galaxy's\n * `oAuth2`). Whether that oauth2 scheme is *hidden* from the dropdown is a separate decision made\n * in the selector; here we only surface the shortcut.\n */\nconst oauth2Target = computed(() => getOauth2AcquisitionTarget(securitySchemes))\n\n/** Resolved oauth2 scheme object, for embedding its config form behind the gear. */\nconst oauth2Scheme = computed(() =>\n oauth2Target.value\n ? getResolvedRef(securitySchemes[oauth2Target.value.name])\n : undefined,\n)\n\nconst acquisitionLoader = useLoadingState()\nconst { toast } = useToasts()\nconst configModal = useModal()\n/** Bearer scheme that opened the config modal, so its Authorize callback targets it. */\nconst configBearerName = ref<string | undefined>()\n\n/** Runs the OAuth2 flow and writes the resulting bearer token onto the bearer scheme. */\nconst handleAcquisitionAuthorize = async (\n bearerName: string,\n): Promise<void> => {\n const target = oauth2Target.value\n if (!target || acquisitionLoader.isLoading) {\n return\n }\n acquisitionLoader.start()\n const [error] = await runOAuth2Authorize({\n eventBus,\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flows: target.flows,\n flowType: target.flowType,\n scopes: target.scopes,\n server,\n proxyUrl,\n environment,\n options,\n })\n await acquisitionLoader.clear()\n if (error) {\n toast(\n error?.message ?? translate('apiClient.requestAuthTab.failedToauthorize'),\n 'error',\n )\n }\n}\n\n/** Refreshes the OAuth2 token and rewrites it onto the bearer scheme. */\nconst handleAcquisitionRefresh = async (bearerName: string): Promise<void> => {\n const target = oauth2Target.value\n // Only the authorization-code flow carries a refresh token; implicit can't be refreshed.\n if (\n !target ||\n target.flowType !== 'authorizationCode' ||\n acquisitionLoader.isLoading\n ) {\n return\n }\n acquisitionLoader.start()\n const [error, tokens] = await refreshOauth2Token(\n target.flows,\n target.flowType,\n proxyUrl,\n server,\n getEnvironmentVariables(environment),\n options?.customFetch,\n )\n await acquisitionLoader.clear()\n if (tokens?.accessToken) {\n storeOAuth2Tokens(eventBus, {\n bearerSchemeName: bearerName,\n oauth2Name: target.name,\n flowType: target.flowType,\n tokens,\n })\n } else if (error) {\n toast(\n error?.message ?? translate('apiClient.requestAuthTab.failedToRefresh'),\n 'error',\n )\n }\n}\n\nconst openAcquisitionConfig = (bearerName: string): void => {\n configBearerName.value = bearerName\n configModal.show()\n}\n\n/** Closes the config modal and runs Authorize against the bearer scheme that opened it. */\nconst handleConfigAuthorize = (): void => {\n const bearerName = configBearerName.value\n configModal.hide()\n if (bearerName) {\n void handleAcquisitionAuthorize(bearerName)\n }\n}\n</script>\n<template>\n <template\n v-for=\"{ scheme, name, scopes, visibleFlowKeys } in security\"\n :key=\"name\">\n <!--\n Header row for AND'ed schemes: label (bold) and description (rich text) are\n combined.\n -->\n <DataTableRow v-if=\"hasMultipleSchemes && scheme\">\n <DataTableCell\n :aria-label=\"generateLabel(name, scheme)\"\n class=\"max-h-[auto]\">\n <div class=\"bg-b-1 min-w-0 flex-1 px-3 py-1.25\">\n <p class=\"text-c-1 leading-5.5 font-medium\">\n {{ generateLabel(name, scheme) }}\n </p>\n <ScalarMarkdownSummary\n v-if=\"scheme.description\"\n class=\"auth-description text-c-2 w-full\"\n :value=\"scheme.description\" />\n </div>\n </DataTableCell>\n </DataTableRow>\n\n <!-- Description: shown for single auth schemes with descriptions -->\n <DataTableRow v-if=\"scheme?.description && !hasMultipleSchemes\">\n <DataTableCell\n :aria-label=\"scheme.description\"\n class=\"max-h-[auto]\">\n <ScalarMarkdownSummary\n class=\"auth-description bg-b-1 text-c-2 min-w-0 flex-1 px-3 py-1.25\"\n :value=\"scheme.description\" />\n </DataTableCell>\n </DataTableRow>\n\n <!-- HTTP Authentication -->\n <template v-if=\"scheme?.type === 'http'\">\n <!-- Bearer Token -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer'\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n :placeholder=\"translate('apiClient.requestAuthTab.token')\"\n type=\"password\"\n @update:modelValue=\"\n (v) => handleHttpSecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.bearerToken') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- OAuth2 token-acquisition shortcut (shown when an interactive oauth2 flow exists) -->\n <DataTableRow v-if=\"scheme.scheme === 'bearer' && oauth2Target\">\n <div class=\"flex h-8 items-center gap-2 border-t px-3\">\n <span class=\"text-c-3 mr-auto text-xs\">{{\n translate('apiClient.requestAuthTab.getAToken')\n }}</span>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionAuthorize(name)\">\n {{\n translate('apiClient.requestAuthTab.authorizeVia', {\n name: oauth2Target.name,\n })\n }}\n </ScalarButton>\n <ScalarButton\n v-if=\"\n scheme['x-scalar-secret-token'] &&\n oauth2Target.flowType === 'authorizationCode'\n \"\n class=\"p-0 px-2 py-0.5\"\n :disabled=\"acquisitionLoader.isLoading\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"handleAcquisitionRefresh(name)\">\n {{ translate('apiClient.requestAuthTab.refresh') }}\n </ScalarButton>\n <ScalarIconButton\n :icon=\"ScalarIconGear\"\n :label=\"\n translate('apiClient.requestAuthTab.configure', {\n name: oauth2Target.name,\n })\n \"\n size=\"xs\"\n @click=\"openAcquisitionConfig(name)\" />\n </div>\n </DataTableRow>\n\n <!-- HTTP Basic Authentication -->\n <template v-else-if=\"scheme?.scheme === 'basic'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n class=\"text-c-2\"\n :environment\n :modelValue=\"scheme['x-scalar-secret-username']\"\n placeholder=\"janedoe\"\n required\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-username': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.username') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :environment\n :modelValue=\"scheme['x-scalar-secret-password']\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleHttpSecretsUpdate({ 'x-scalar-secret-password': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.password') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n </template>\n\n <!-- API Key Authentication -->\n <template v-else-if=\"scheme?.type === 'apiKey'\">\n <DataTableRow v-if=\"apiKeyHasName(scheme)\">\n <RequestAuthDataTableInput\n :containerClass=\"getStaticBorderClass()\"\n :environment\n :modelValue=\"scheme.name ?? ''\"\n placeholder=\"api-key\"\n @update:modelValue=\"\n (v) => handleApiKeySecuritySchemeUpdate({ name: v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.name') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n :containerClass=\"\n apiKeyHasName(scheme) ? undefined : getStaticBorderClass()\n \"\n :environment\n :modelValue=\"scheme['x-scalar-secret-token']\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"\n (v) =>\n handleApiKeySecretsUpdate({ 'x-scalar-secret-token': v }, name)\n \">\n {{ translate('apiClient.requestAuthTab.value') }}\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- OAuth 2.0 / OpenID Connect Authentication -->\n <template\n v-else-if=\"scheme?.type === 'oauth2' || scheme?.type === 'openIdConnect'\">\n <OAuth2Metadata\n v-if=\"\n scheme.type === 'oauth2' && (!isStatic || scheme.oauth2MetadataUrl)\n \"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :name\n :proxyUrl\n :scheme />\n\n <!-- OpenID Connect -->\n <OpenIDConnect\n v-if=\"scheme?.type === 'openIdConnect' && !visibleFlowKeys.length\"\n :customFetch=\"options?.customFetch\"\n :environment\n :eventBus\n :getStaticBorderClass\n :name\n :proxyUrl\n :scheme />\n\n <!-- Flow selector tabs: shown when multiple visible flows are available -->\n <DataTableRow v-if=\"visibleFlowKeys.length > 1\">\n <div class=\"flex min-h-8 border-t text-base\">\n <div class=\"flex h-8 max-w-full gap-2.5 overflow-x-auto px-3\">\n <button\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\"\n :class=\"getFlowTabClasses(key, ind)\"\n type=\"button\"\n @click=\"setActiveFlow(key)\">\n <span class=\"relative z-10\">{{ key }}</span>\n </button>\n </div>\n </div>\n </DataTableRow>\n\n <!-- OAuth2 flow configuration -->\n <template\n v-for=\"(key, ind) in visibleFlowKeys\"\n :key=\"key\">\n <OAuth2\n v-if=\"scheme.flows && isFlowActive(key, ind)\"\n :environment\n :eventBus\n :flows=\"scheme.flows\"\n :name\n :options\n :proxyUrl\n :scheme\n :selectedScopes=\"scopes\"\n :server\n :type=\"key\"\n @delete:scope=\"(event) => handleScopeDelete(name, event)\"\n @update:selectedScopes=\"(event) => handleScopesUpdate(name, event)\"\n @upsert:scope=\"(event) => handleScopeUpsert(name, event)\" />\n </template>\n </template>\n\n <!-- Browser WebSocket connections cannot apply these broker credentials. -->\n <div\n v-else-if=\"\n scheme?.type === 'userPassword' ||\n scheme?.type === 'plain' ||\n scheme?.type === 'scramSha256' ||\n scheme?.type === 'scramSha512' ||\n scheme?.type === 'X509' ||\n scheme?.type === 'symmetricEncryption' ||\n scheme?.type === 'asymmetricEncryption' ||\n scheme?.type === 'gssapi'\n \"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{ translate('apiClient.requestAuthTab.unsupportedCredentials') }}\n </div>\n\n <!-- Mutual TLS credentials are chosen during the browser-managed TLS handshake. -->\n <div\n v-else-if=\"scheme?.type === 'mutualTLS'\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{ translate('apiClient.requestAuthTab.mutualTlsHint') }}\n </div>\n\n <!-- Scheme has a type we do not render inputs for -->\n <div\n v-else-if=\"getUnsupportedSchemeType(scheme)\"\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{\n translate('apiClient.requestAuthTab.unsupportedType', {\n type: getUnsupportedSchemeType(scheme) ?? '',\n })\n }}\n </div>\n\n <!-- Scheme is missing type -->\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center border-t p-4 px-4 text-center text-xs text-balance\">\n {{\n translate('apiClient.requestAuthTab.missingType', {\n type: documentTypeLabel,\n })\n }}\n </div>\n </template>\n\n <!-- OAuth2 configuration modal (opened from the bearer scheme's gear) -->\n <ScalarModal\n v-if=\"oauth2Target && oauth2Scheme\"\n size=\"sm\"\n :state=\"configModal\"\n :title=\"\n translate('apiClient.requestAuthTab.configure', {\n name: oauth2Target.name,\n })\n \">\n <DataTable\n :columns=\"['']\"\n presentational>\n <OAuth2\n :environment\n :eventBus\n :flows=\"oauth2Target.flows\"\n hideActions\n :name=\"oauth2Target.name\"\n :options\n :proxyUrl\n :scheme=\"oauth2Scheme\"\n :selectedScopes=\"oauth2Target.scopes\"\n :server\n :type=\"oauth2Target.flowType\"\n @delete:scope=\"(event) => handleScopeDelete(oauth2Target!.name, event)\"\n @update:selectedScopes=\"\n (event) => handleScopesUpdate(oauth2Target!.name, event)\n \"\n @upsert:scope=\"\n (event) => handleScopeUpsert(oauth2Target!.name, event)\n \" />\n </DataTable>\n <div class=\"flex h-8 items-center justify-end gap-2 border-t\">\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"configModal.hide()\">\n {{ translate('apiClient.requestAuthTab.cancel') }}\n </ScalarButton>\n <ScalarButton\n class=\"p-0 px-2 py-0.5\"\n :loader=\"acquisitionLoader\"\n size=\"sm\"\n @click=\"handleConfigAuthorize\">\n {{ translate('apiClient.requestAuthTab.authorize') }}\n </ScalarButton>\n </div>\n </ScalarModal>\n</template>\n"],"mappings":"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"}