@scalar/api-client 2.39.4 → 2.41.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 (337) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/components/AddressBar/AddressBarHistory.vue.d.ts.map +1 -1
  3. package/dist/components/AddressBar/AddressBarHistory.vue.js +1 -1
  4. package/dist/components/AddressBar/AddressBarHistory.vue.js.map +1 -1
  5. package/dist/components/AddressBar/AddressBarHistory.vue.script.js +2 -2
  6. package/dist/components/AddressBar/AddressBarHistory.vue.script.js.map +1 -1
  7. package/dist/hooks/useClientConfig.d.ts +12 -0
  8. package/dist/hooks/useClientConfig.d.ts.map +1 -1
  9. package/dist/hooks/useClientConfig.js +14 -1
  10. package/dist/hooks/useClientConfig.js.map +1 -1
  11. package/dist/libs/index.d.ts +0 -1
  12. package/dist/libs/index.d.ts.map +1 -1
  13. package/dist/libs/index.js +1 -2
  14. package/dist/style.css +207 -248
  15. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +14 -10
  16. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  17. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  18. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +57 -35
  19. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  20. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -5
  21. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts.map +1 -1
  22. package/dist/v2/blocks/operation-block/helpers/send-request.js +18 -33
  23. package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -1
  24. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.d.ts.map +1 -1
  25. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js +1 -1
  26. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js.map +1 -1
  27. package/dist/v2/blocks/operation-block/index.d.ts +0 -3
  28. package/dist/v2/blocks/operation-block/index.d.ts.map +1 -1
  29. package/dist/v2/blocks/operation-block/index.js +1 -4
  30. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts +1 -1
  31. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts.map +1 -1
  32. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js +1 -1
  33. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js.map +1 -1
  34. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js +3 -1
  35. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js.map +1 -1
  36. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts +4 -2
  37. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts.map +1 -1
  38. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.js +3 -2
  39. package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.js.map +1 -1
  40. package/dist/v2/blocks/operation-code-sample/helpers/get-resolved-ref-deep.js +1 -1
  41. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.d.ts +1 -1
  42. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.d.ts.map +1 -1
  43. package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.js.map +1 -1
  44. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.d.ts +7 -2
  45. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.d.ts.map +1 -1
  46. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.js +4 -3
  47. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.js.map +1 -1
  48. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.d.ts.map +1 -1
  49. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js +2 -3
  50. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js.map +1 -1
  51. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.d.ts +3 -1
  52. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.d.ts.map +1 -1
  53. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js +5 -8
  54. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js.map +1 -1
  55. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.d.ts +1 -1
  56. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.d.ts.map +1 -1
  57. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.js.map +1 -1
  58. package/dist/v2/blocks/operation-code-sample/index.d.ts +0 -1
  59. package/dist/v2/blocks/operation-code-sample/index.d.ts.map +1 -1
  60. package/dist/v2/blocks/operation-code-sample/index.js +2 -3
  61. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts +7 -9
  62. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
  63. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  64. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  65. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +49 -42
  66. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  67. package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
  68. package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
  69. package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -1
  70. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +2 -3
  71. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
  72. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts.map +1 -1
  73. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js.map +1 -1
  74. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +1 -0
  75. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
  76. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
  77. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
  78. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +1 -1
  79. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
  80. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +1 -1
  81. package/dist/v2/blocks/request-block/helpers/is-param-disabled.d.ts +1 -1
  82. package/dist/v2/blocks/request-block/helpers/is-param-disabled.d.ts.map +1 -1
  83. package/dist/v2/blocks/request-block/helpers/is-param-disabled.js +2 -1
  84. package/dist/v2/blocks/request-block/helpers/is-param-disabled.js.map +1 -1
  85. package/dist/v2/blocks/response-block/helpers/get-content-length.d.ts.map +1 -1
  86. package/dist/v2/blocks/response-block/helpers/get-content-length.js +2 -2
  87. package/dist/v2/blocks/response-block/helpers/get-content-length.js.map +1 -1
  88. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  89. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
  90. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -1
  91. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +76 -25
  92. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
  93. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts.map +1 -1
  94. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +1 -1
  95. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js.map +1 -1
  96. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js +2 -2
  97. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
  98. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +1 -1
  99. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts.map +1 -1
  100. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js.map +1 -1
  101. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +1 -1
  102. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  103. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts +1 -1
  104. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  105. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
  106. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +8 -4
  107. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
  108. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts +1 -1
  109. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts.map +1 -1
  110. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.js.map +1 -1
  111. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js.map +1 -1
  112. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts +1 -1
  113. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
  114. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
  115. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
  116. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts +1 -1
  117. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts.map +1 -1
  118. package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js +1 -1
  119. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +1 -1
  120. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts.map +1 -1
  121. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +6 -2
  122. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js.map +1 -1
  123. package/dist/v2/blocks/scalar-auth-selector-block/index.d.ts +0 -3
  124. package/dist/v2/blocks/scalar-auth-selector-block/index.d.ts.map +1 -1
  125. package/dist/v2/blocks/scalar-auth-selector-block/index.js +1 -3
  126. package/dist/v2/components/code-input/CodeInput.vue.d.ts +8 -6
  127. package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
  128. package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
  129. package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -1
  130. package/dist/v2/components/code-input/CodeInput.vue.script.js +11 -9
  131. package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
  132. package/dist/v2/constants.js +1 -1
  133. package/dist/v2/features/app/App.vue.d.ts.map +1 -1
  134. package/dist/v2/features/app/App.vue.js.map +1 -1
  135. package/dist/v2/features/app/App.vue.script.js +1 -5
  136. package/dist/v2/features/app/App.vue.script.js.map +1 -1
  137. package/dist/v2/features/app/app-events.d.ts.map +1 -1
  138. package/dist/v2/features/app/app-events.js +1 -1
  139. package/dist/v2/features/app/app-events.js.map +1 -1
  140. package/dist/v2/features/app/app-state.d.ts.map +1 -1
  141. package/dist/v2/features/app/app-state.js +2 -2
  142. package/dist/v2/features/app/app-state.js.map +1 -1
  143. package/dist/v2/features/app/components/AppSidebar.vue.d.ts.map +1 -1
  144. package/dist/v2/features/app/components/AppSidebar.vue.js +1 -1
  145. package/dist/v2/features/app/components/AppSidebar.vue.js.map +1 -1
  146. package/dist/v2/features/app/components/AppSidebar.vue.script.js +1 -1
  147. package/dist/v2/features/app/components/AppSidebar.vue.script.js.map +1 -1
  148. package/dist/v2/features/app/helpers/routes.d.ts +0 -3
  149. package/dist/v2/features/app/helpers/routes.d.ts.map +1 -1
  150. package/dist/v2/features/app/helpers/routes.js +1 -1
  151. package/dist/v2/features/app/helpers/routes.js.map +1 -1
  152. package/dist/v2/features/collection/DocumentCollection.vue.d.ts.map +1 -1
  153. package/dist/v2/features/collection/DocumentCollection.vue.js.map +1 -1
  154. package/dist/v2/features/collection/DocumentCollection.vue.script.js +30 -52
  155. package/dist/v2/features/collection/DocumentCollection.vue.script.js.map +1 -1
  156. package/dist/v2/features/collection/OperationCollection.vue.script.js +0 -1
  157. package/dist/v2/features/collection/OperationCollection.vue.script.js.map +1 -1
  158. package/dist/v2/features/collection/WorkspaceCollection.vue.script.js +0 -1
  159. package/dist/v2/features/collection/WorkspaceCollection.vue.script.js.map +1 -1
  160. package/dist/v2/features/collection/components/Authentication.vue.d.ts.map +1 -1
  161. package/dist/v2/features/collection/components/Authentication.vue.js +1 -1
  162. package/dist/v2/features/collection/components/Authentication.vue.js.map +1 -1
  163. package/dist/v2/features/collection/components/Authentication.vue.script.js +6 -8
  164. package/dist/v2/features/collection/components/Authentication.vue.script.js.map +1 -1
  165. package/dist/v2/features/collection/components/Cookies.vue.script.js +0 -1
  166. package/dist/v2/features/collection/components/Cookies.vue.script.js.map +1 -1
  167. package/dist/v2/features/collection/components/Editor/Editor.vue.script.js +0 -1
  168. package/dist/v2/features/collection/components/Editor/Editor.vue.script.js.map +1 -1
  169. package/dist/v2/features/collection/components/Environment.vue.script.js +0 -1
  170. package/dist/v2/features/collection/components/Environment.vue.script.js.map +1 -1
  171. package/dist/v2/features/collection/components/Overview.vue.script.js +0 -1
  172. package/dist/v2/features/collection/components/Overview.vue.script.js.map +1 -1
  173. package/dist/v2/features/collection/components/Servers.vue.script.js +0 -1
  174. package/dist/v2/features/collection/components/Servers.vue.script.js.map +1 -1
  175. package/dist/v2/features/collection/components/Settings.vue.js.map +1 -1
  176. package/dist/v2/features/collection/components/Settings.vue.script.js +2 -3
  177. package/dist/v2/features/collection/components/Settings.vue.script.js.map +1 -1
  178. package/dist/v2/features/editor/hooks/use-three-way-merge-editor.js +1 -1
  179. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
  180. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -1
  181. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +1 -1
  182. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
  183. package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
  184. package/dist/v2/features/modal/Modal.vue.js.map +1 -1
  185. package/dist/v2/features/modal/Modal.vue.script.js +4 -9
  186. package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
  187. package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts.map +1 -1
  188. package/dist/v2/features/modal/helpers/create-api-client-modal.js +1 -17
  189. package/dist/v2/features/modal/helpers/create-api-client-modal.js.map +1 -1
  190. package/dist/v2/features/modal/helpers/map-hidden-clients-config.js +1 -1
  191. package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
  192. package/dist/v2/features/operation/Operation.vue.js.map +1 -1
  193. package/dist/v2/features/operation/Operation.vue.script.js +51 -84
  194. package/dist/v2/features/operation/Operation.vue.script.js.map +1 -1
  195. package/dist/v2/features/operation/index.d.ts +0 -4
  196. package/dist/v2/features/operation/index.d.ts.map +1 -1
  197. package/dist/v2/features/operation/index.js +1 -5
  198. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.d.ts.map +1 -1
  199. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.js.map +1 -1
  200. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.script.js +11 -1
  201. package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.script.js.map +1 -1
  202. package/dist/views/Request/RequestSection/RequestTable.vue.d.ts.map +1 -1
  203. package/dist/views/Request/RequestSection/RequestTable.vue.js +1 -1
  204. package/dist/views/Request/RequestSection/RequestTable.vue.js.map +1 -1
  205. package/dist/views/Request/RequestSection/RequestTable.vue.script.js +1 -1
  206. package/dist/views/Request/RequestSection/RequestTable.vue.script.js.map +1 -1
  207. package/dist/views/Request/ResponseSection/ResponseEmpty.vue.script.js +1 -1
  208. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.d.ts.map +1 -1
  209. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.js.map +1 -1
  210. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.script.js +2 -2
  211. package/dist/views/Request/ResponseSection/ResponseMetaInformation.vue.script.js.map +1 -1
  212. package/dist/views/Request/libs/oauth2.js +1 -1
  213. package/dist/views/Request/libs/oauth2.js.map +1 -1
  214. package/package.json +24 -30
  215. package/dist/libs/formatters.d.ts +0 -12
  216. package/dist/libs/formatters.d.ts.map +0 -1
  217. package/dist/libs/formatters.js +0 -36
  218. package/dist/libs/formatters.js.map +0 -1
  219. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts +0 -6
  220. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts.map +0 -1
  221. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.js +0 -58
  222. package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.js.map +0 -1
  223. package/dist/v2/blocks/operation-block/helpers/build-request-body.d.ts +0 -12
  224. package/dist/v2/blocks/operation-block/helpers/build-request-body.d.ts.map +0 -1
  225. package/dist/v2/blocks/operation-block/helpers/build-request-body.js +0 -65
  226. package/dist/v2/blocks/operation-block/helpers/build-request-body.js.map +0 -1
  227. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.d.ts +0 -31
  228. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.d.ts.map +0 -1
  229. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js +0 -55
  230. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js.map +0 -1
  231. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts +0 -27
  232. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts.map +0 -1
  233. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.js +0 -159
  234. package/dist/v2/blocks/operation-block/helpers/build-request-parameters.js.map +0 -1
  235. package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts +0 -25
  236. package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts.map +0 -1
  237. package/dist/v2/blocks/operation-block/helpers/build-request-security.js +0 -53
  238. package/dist/v2/blocks/operation-block/helpers/build-request-security.js.map +0 -1
  239. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts +0 -46
  240. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts.map +0 -1
  241. package/dist/v2/blocks/operation-block/helpers/build-request.js +0 -102
  242. package/dist/v2/blocks/operation-block/helpers/build-request.js.map +0 -1
  243. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.d.ts +0 -4
  244. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.d.ts.map +0 -1
  245. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.js +0 -41
  246. package/dist/v2/blocks/operation-block/helpers/de-serialize-parameter.js.map +0 -1
  247. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.d.ts +0 -14
  248. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.d.ts.map +0 -1
  249. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.js +0 -20
  250. package/dist/v2/blocks/operation-block/helpers/filter-global-cookies.js.map +0 -1
  251. package/dist/v2/blocks/operation-block/helpers/get-delimiter.d.ts +0 -8
  252. package/dist/v2/blocks/operation-block/helpers/get-delimiter.d.ts.map +0 -1
  253. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.d.ts +0 -9
  254. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.d.ts.map +0 -1
  255. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.js +0 -17
  256. package/dist/v2/blocks/operation-block/helpers/get-environment-variables.js.map +0 -1
  257. package/dist/v2/blocks/operation-block/helpers/get-example.d.ts +0 -10
  258. package/dist/v2/blocks/operation-block/helpers/get-example.d.ts.map +0 -1
  259. package/dist/v2/blocks/operation-block/helpers/get-example.js +0 -41
  260. package/dist/v2/blocks/operation-block/helpers/get-example.js.map +0 -1
  261. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts +0 -26
  262. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts.map +0 -1
  263. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.js +0 -32
  264. package/dist/v2/blocks/operation-block/helpers/get-resolved-url.js.map +0 -1
  265. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.d.ts +0 -10
  266. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.d.ts.map +0 -1
  267. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.js +0 -15
  268. package/dist/v2/blocks/operation-block/helpers/get-selected-body-content-type.js.map +0 -1
  269. package/dist/v2/blocks/operation-block/helpers/get-server-url.d.ts +0 -3
  270. package/dist/v2/blocks/operation-block/helpers/get-server-url.d.ts.map +0 -1
  271. package/dist/v2/blocks/operation-block/helpers/get-server-url.js +0 -18
  272. package/dist/v2/blocks/operation-block/helpers/get-server-url.js.map +0 -1
  273. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.d.ts +0 -96
  274. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.d.ts.map +0 -1
  275. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.js +0 -160
  276. package/dist/v2/blocks/operation-block/helpers/serialize-parameter.js.map +0 -1
  277. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.d.ts +0 -40
  278. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.d.ts.map +0 -1
  279. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.js +0 -437
  280. package/dist/v2/blocks/operation-code-sample/helpers/get-example-from-schema.js.map +0 -1
  281. package/dist/v2/blocks/request-block/helpers/get-request-body-example.d.ts +0 -6
  282. package/dist/v2/blocks/request-block/helpers/get-request-body-example.d.ts.map +0 -1
  283. package/dist/v2/blocks/request-block/helpers/get-request-body-example.js +0 -25
  284. package/dist/v2/blocks/request-block/helpers/get-request-body-example.js.map +0 -1
  285. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.js +0 -141
  286. package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.js.map +0 -1
  287. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.d.ts +0 -4
  288. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.d.ts.map +0 -1
  289. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.js +0 -10
  290. package/dist/v2/blocks/scalar-auth-selector-block/helpers/is-auth-optional.js.map +0 -1
  291. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.d.ts +0 -9
  292. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.d.ts.map +0 -1
  293. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.js +0 -27
  294. package/dist/v2/blocks/scalar-auth-selector-block/helpers/merge-security.js.map +0 -1
  295. package/dist/v2/blocks/scalar-auth-selector-block/helpers/secret-types.d.ts +0 -25
  296. package/dist/v2/blocks/scalar-auth-selector-block/helpers/secret-types.d.ts.map +0 -1
  297. package/dist/v2/components/callout/Callout.vue.js +0 -9
  298. package/dist/v2/components/callout/Callout.vue.js.map +0 -1
  299. package/dist/v2/components/callout/Callout.vue.script.js +0 -35
  300. package/dist/v2/components/callout/Callout.vue.script.js.map +0 -1
  301. package/dist/v2/features/modal/helpers/restore-workspace-state.d.ts +0 -18
  302. package/dist/v2/features/modal/helpers/restore-workspace-state.d.ts.map +0 -1
  303. package/dist/v2/features/modal/helpers/restore-workspace-state.js +0 -51
  304. package/dist/v2/features/modal/helpers/restore-workspace-state.js.map +0 -1
  305. package/dist/v2/features/operation/helpers/combine-params.d.ts +0 -4
  306. package/dist/v2/features/operation/helpers/combine-params.d.ts.map +0 -1
  307. package/dist/v2/features/operation/helpers/combine-params.js +0 -20
  308. package/dist/v2/features/operation/helpers/combine-params.js.map +0 -1
  309. package/dist/v2/features/operation/helpers/get-operation-header.d.ts +0 -17
  310. package/dist/v2/features/operation/helpers/get-operation-header.d.ts.map +0 -1
  311. package/dist/v2/features/operation/helpers/get-security-requirements.d.ts +0 -12
  312. package/dist/v2/features/operation/helpers/get-security-requirements.d.ts.map +0 -1
  313. package/dist/v2/features/operation/helpers/get-security-requirements.js +0 -17
  314. package/dist/v2/features/operation/helpers/get-security-requirements.js.map +0 -1
  315. package/dist/v2/features/operation/helpers/get-selected-security.d.ts +0 -15
  316. package/dist/v2/features/operation/helpers/get-selected-security.d.ts.map +0 -1
  317. package/dist/v2/features/operation/helpers/get-selected-security.js +0 -41
  318. package/dist/v2/features/operation/helpers/get-selected-security.js.map +0 -1
  319. package/dist/v2/features/operation/helpers/get-selected-server.d.ts +0 -13
  320. package/dist/v2/features/operation/helpers/get-selected-server.d.ts.map +0 -1
  321. package/dist/v2/features/operation/helpers/get-selected-server.js +0 -21
  322. package/dist/v2/features/operation/helpers/get-selected-server.js.map +0 -1
  323. package/dist/v2/helpers/get-active-environment.d.ts +0 -5
  324. package/dist/v2/helpers/get-active-environment.d.ts.map +0 -1
  325. package/dist/v2/helpers/get-active-environment.js +0 -19
  326. package/dist/v2/helpers/get-active-environment.js.map +0 -1
  327. package/dist/v2/helpers/get-active-proxy-url.d.ts +0 -18
  328. package/dist/v2/helpers/get-active-proxy-url.d.ts.map +0 -1
  329. package/dist/v2/helpers/get-active-proxy-url.js +0 -26
  330. package/dist/v2/helpers/get-active-proxy-url.js.map +0 -1
  331. package/dist/v2/helpers/get-servers.d.ts +0 -23
  332. package/dist/v2/helpers/get-servers.d.ts.map +0 -1
  333. package/dist/v2/helpers/get-servers.js +0 -106
  334. package/dist/v2/helpers/get-servers.js.map +0 -1
  335. package/dist/v2/helpers/index.d.ts +0 -3
  336. package/dist/v2/helpers/index.d.ts.map +0 -1
  337. package/dist/v2/helpers/index.js +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"OAuth2.vue.js","names":[],"sources":["../../../../../src/views/Request/RequestSection/RequestAuth/OAuth2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, useLoadingState } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport {\n pkceOptions,\n type Collection,\n type Oauth2Flow,\n type SecuritySchemeOauth2,\n type Server,\n} from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { useToasts } from '@scalar/use-toasts'\n\nimport { DataTableRow } from '@/components/DataTable'\nimport type { EnvVariable } from '@/store/active-entities'\nimport { useWorkspace, type UpdateScheme } from '@/store/store'\nimport { authorizeOauth2 } from '@/views/Request/libs'\nimport { updateScheme as _updateScheme } from '@/views/Request/RequestSection/helpers/update-scheme'\n\nimport OAuthScopesInput from './OAuthScopesInput.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n collection,\n environment,\n envVariables,\n flow,\n persistAuth = false,\n scheme,\n server,\n workspace,\n} = defineProps<{\n collection: Collection\n environment: Environment\n envVariables: EnvVariable[]\n flow: Oauth2Flow\n persistAuth: boolean\n scheme: SecuritySchemeOauth2\n server: Server | undefined\n workspace: Workspace\n}>()\n\nconst emits = defineEmits<{\n authorized: []\n}>()\n\ndefineSlots<{\n 'oauth-actions'?: () => unknown\n}>()\n\nconst loader = useLoadingState()\nconst { toast } = useToasts()\nconst storeContext = useWorkspace()\n\n/** Update the current scheme */\nconst updateScheme: UpdateScheme = (path, value) =>\n _updateScheme(scheme.uid, path, value, storeContext, persistAuth)\n\n/** Authorize the user using specified flow */\nconst handleAuthorize = async () => {\n if (loader.isActive || !collection?.uid) {\n return\n }\n if (!server) {\n toast('No server selected', 'error')\n return\n }\n loader.start()\n\n const [error, accessToken] = await authorizeOauth2(\n flow,\n server,\n workspace?.proxyUrl,\n )\n\n await loader.clear()\n\n if (accessToken) {\n updateScheme(`flows.${flow.type}.token`, accessToken)\n emits('authorized')\n } else {\n console.error(error)\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** To make prop drilling a little easier */\nconst dataTableInputProps = {\n environment,\n envVariables,\n workspace,\n}\n</script>\n\n<template>\n <!-- Access Token Granted -->\n <template v-if=\"flow.token\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"border-r-transparent\"\n :modelValue=\"flow.token\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"(v) => updateScheme(`flows.${flow.type}.token`, v)\">\n Access Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-1 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"updateScheme(`flows.${flow.type}.token`, '')\">\n Clear\n </ScalarButton>\n <slot name=\"oauth-actions\" />\n </div>\n </DataTableRow>\n </template>\n\n <template v-else>\n <DataTableRow>\n <!-- Auth URL -->\n <RequestAuthDataTableInput\n v-if=\"'authorizationUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n containerClass=\"border-r-0\"\n :modelValue=\"flow.authorizationUrl\"\n placeholder=\"https://galaxy.scalar.com/authorize\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.authorizationUrl`, v)\n \">\n Auth URL\n </RequestAuthDataTableInput>\n\n <!-- Token URL -->\n <RequestAuthDataTableInput\n v-if=\"'tokenUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.tokenUrl\"\n placeholder=\"https://galaxy.scalar.com/token\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.tokenUrl`, v)\n \">\n Token URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <DataTableRow v-if=\"'x-scalar-redirect-uri' in flow\">\n <!-- Redirect URI -->\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-redirect-uri']\"\n placeholder=\"https://galaxy.scalar.com/callback\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-redirect-uri`, v)\n \">\n Redirect URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Username and password -->\n <template v-if=\"flow.type === 'password'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"text-c-2\"\n :modelValue=\"flow.username\"\n placeholder=\"janedoe\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.username`, v)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.password\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.password`, v)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- Client ID -->\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-client-id']\"\n placeholder=\"12345\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-client-id`, v)\n \">\n Client ID\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Client Secret (Authorization Code / Client Credentials / Password (optional)) -->\n <DataTableRow v-if=\"'clientSecret' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.clientSecret\"\n placeholder=\"XYZ123\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.clientSecret`, v)\n \">\n Client Secret\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- PKCE -->\n <DataTableRow v-if=\"'x-usePkce' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :enum=\"pkceOptions\"\n :modelValue=\"flow['x-usePkce']\"\n readOnly\n @update:modelValue=\"\n (v) =>\n updateScheme(\n `flows.${flow.type}.x-usePkce`,\n v as (typeof pkceOptions)[number],\n )\n \">\n Use PKCE\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Scopes -->\n <DataTableRow v-if=\"Object.keys(flow.scopes ?? {}).length\">\n <OAuthScopesInput\n :flow=\"flow\"\n :updateScheme=\"updateScheme\" />\n </DataTableRow>\n\n <!-- Open ID Connect -->\n <!-- <DataTableRow -->\n <!-- v-else-if=\"activeScheme?.type === 'openIdConnect'\" -->\n <!-- class=\"border-r-transparent\"> -->\n <!-- <DataTableInput -->\n <!-- v-model=\"password\" -->\n <!-- placeholder=\"Token\"> -->\n <!-- TODO -->\n <!-- </DataTableInput> -->\n <!-- <DataTableCell class=\"flex items-center\"> -->\n <!-- <ScalarButton size=\"sm\"> Authorize </ScalarButton> -->\n <!-- </DataTableCell> -->\n <!-- </DataTableRow> -->\n </template>\n <template v-if=\"!flow.token\">\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 w-full items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-0.75 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </DataTableRow>\n </template>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"OAuth2.vue.js","names":[],"sources":["../../../../../src/views/Request/RequestSection/RequestAuth/OAuth2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, useLoadingState } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport {\n pkceOptions,\n type Collection,\n type Oauth2Flow,\n type SecuritySchemeOauth2,\n type Server,\n} from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\n\nimport { DataTableRow } from '@/components/DataTable'\nimport {\n resolveDefaultOAuth2RedirectUri,\n useClientConfig,\n} from '@/hooks/useClientConfig'\nimport type { EnvVariable } from '@/store/active-entities'\nimport { useWorkspace, type UpdateScheme } from '@/store/store'\nimport { authorizeOauth2 } from '@/views/Request/libs'\nimport { updateScheme as _updateScheme } from '@/views/Request/RequestSection/helpers/update-scheme'\n\nimport OAuthScopesInput from './OAuthScopesInput.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n collection,\n environment,\n envVariables,\n flow,\n persistAuth = false,\n scheme,\n server,\n workspace,\n} = defineProps<{\n collection: Collection\n environment: Environment\n envVariables: EnvVariable[]\n flow: Oauth2Flow\n persistAuth: boolean\n scheme: SecuritySchemeOauth2\n server: Server | undefined\n workspace: Workspace\n}>()\n\nconst emits = defineEmits<{\n authorized: []\n}>()\n\ndefineSlots<{\n 'oauth-actions'?: () => unknown\n}>()\n\nconst loader = useLoadingState()\nconst { toast } = useToasts()\nconst storeContext = useWorkspace()\nconst config = useClientConfig()\n\n/** Update the current scheme */\nconst updateScheme: UpdateScheme = (path, value) =>\n _updateScheme(scheme.uid, path, value, storeContext, persistAuth)\n\nconst hasPrefilledRedirectUri = ref(false)\nconst defaultRedirectUri = computed<string>(() =>\n resolveDefaultOAuth2RedirectUri(config.value),\n)\n\nwatch(\n () =>\n 'x-scalar-redirect-uri' in flow ? flow['x-scalar-redirect-uri'] : undefined,\n (currentRedirectUri) => {\n if (\n !('x-scalar-redirect-uri' in flow) ||\n hasPrefilledRedirectUri.value ||\n currentRedirectUri\n ) {\n return\n }\n\n if (!defaultRedirectUri.value) {\n return\n }\n\n hasPrefilledRedirectUri.value = true\n updateScheme(\n `flows.${flow.type}.x-scalar-redirect-uri`,\n defaultRedirectUri.value,\n )\n },\n { immediate: true },\n)\n\n/** Authorize the user using specified flow */\nconst handleAuthorize = async () => {\n if (loader.isActive || !collection?.uid) {\n return\n }\n if (!server) {\n toast('No server selected', 'error')\n return\n }\n loader.start()\n\n const [error, accessToken] = await authorizeOauth2(\n flow,\n server,\n workspace?.proxyUrl,\n )\n\n await loader.clear()\n\n if (accessToken) {\n updateScheme(`flows.${flow.type}.token`, accessToken)\n emits('authorized')\n } else {\n console.error(error)\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** To make prop drilling a little easier */\nconst dataTableInputProps = {\n environment,\n envVariables,\n workspace,\n}\n</script>\n\n<template>\n <!-- Access Token Granted -->\n <template v-if=\"flow.token\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"border-r-transparent\"\n :modelValue=\"flow.token\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"(v) => updateScheme(`flows.${flow.type}.token`, v)\">\n Access Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-1 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"updateScheme(`flows.${flow.type}.token`, '')\">\n Clear\n </ScalarButton>\n <slot name=\"oauth-actions\" />\n </div>\n </DataTableRow>\n </template>\n\n <template v-else>\n <DataTableRow>\n <!-- Auth URL -->\n <RequestAuthDataTableInput\n v-if=\"'authorizationUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n containerClass=\"border-r-0\"\n :modelValue=\"flow.authorizationUrl\"\n placeholder=\"https://galaxy.scalar.com/authorize\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.authorizationUrl`, v)\n \">\n Auth URL\n </RequestAuthDataTableInput>\n\n <!-- Token URL -->\n <RequestAuthDataTableInput\n v-if=\"'tokenUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.tokenUrl\"\n placeholder=\"https://galaxy.scalar.com/token\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.tokenUrl`, v)\n \">\n Token URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <DataTableRow v-if=\"'x-scalar-redirect-uri' in flow\">\n <!-- Redirect URI -->\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-redirect-uri']\"\n placeholder=\"https://galaxy.scalar.com/callback\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-redirect-uri`, v)\n \">\n Redirect URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Username and password -->\n <template v-if=\"flow.type === 'password'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"text-c-2\"\n :modelValue=\"flow.username\"\n placeholder=\"janedoe\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.username`, v)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.password\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.password`, v)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- Client ID -->\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-client-id']\"\n placeholder=\"12345\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-client-id`, v)\n \">\n Client ID\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Client Secret (Authorization Code / Client Credentials / Password (optional)) -->\n <DataTableRow v-if=\"'clientSecret' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.clientSecret\"\n placeholder=\"XYZ123\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.clientSecret`, v)\n \">\n Client Secret\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- PKCE -->\n <DataTableRow v-if=\"'x-usePkce' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :enum=\"pkceOptions\"\n :modelValue=\"flow['x-usePkce']\"\n readOnly\n @update:modelValue=\"\n (v) =>\n updateScheme(\n `flows.${flow.type}.x-usePkce`,\n v as (typeof pkceOptions)[number],\n )\n \">\n Use PKCE\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Scopes -->\n <DataTableRow v-if=\"Object.keys(flow.scopes ?? {}).length\">\n <OAuthScopesInput\n :flow=\"flow\"\n :updateScheme=\"updateScheme\" />\n </DataTableRow>\n\n <!-- Open ID Connect -->\n <!-- <DataTableRow -->\n <!-- v-else-if=\"activeScheme?.type === 'openIdConnect'\" -->\n <!-- class=\"border-r-transparent\"> -->\n <!-- <DataTableInput -->\n <!-- v-model=\"password\" -->\n <!-- placeholder=\"Token\"> -->\n <!-- TODO -->\n <!-- </DataTableInput> -->\n <!-- <DataTableCell class=\"flex items-center\"> -->\n <!-- <ScalarButton size=\"sm\"> Authorize </ScalarButton> -->\n <!-- </DataTableCell> -->\n <!-- </DataTableRow> -->\n </template>\n <template v-if=\"!flow.token\">\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 w-full items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-0.75 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </DataTableRow>\n </template>\n</template>\n"],"mappings":""}
@@ -1,10 +1,11 @@
1
+ import { resolveDefaultOAuth2RedirectUri, useClientConfig } from "../../../../hooks/useClientConfig.js";
1
2
  import { useWorkspace } from "../../../../store/store.js";
2
3
  import DataTableRow_default from "../../../../components/DataTable/DataTableRow.vue.js";
3
4
  import { authorizeOauth2 } from "../../libs/oauth2.js";
4
5
  import { updateScheme } from "../helpers/update-scheme.js";
5
6
  import OAuthScopesInput_default from "./OAuthScopesInput.vue.js";
6
7
  import RequestAuthDataTableInput_default from "./RequestAuthDataTableInput.vue.js";
7
- import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeProps, openBlock, renderSlot, unref, withCtx } from "vue";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeProps, openBlock, ref, renderSlot, unref, watch, withCtx } from "vue";
8
9
  import { ScalarButton, useLoadingState } from "@scalar/components";
9
10
  import { useToasts } from "@scalar/use-toasts";
10
11
  import { pkceOptions } from "@scalar/oas-utils/entities/spec";
@@ -32,8 +33,17 @@ var OAuth2_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
32
33
  const loader = useLoadingState();
33
34
  const { toast } = useToasts();
34
35
  const storeContext = useWorkspace();
36
+ const config = useClientConfig();
35
37
  /** Update the current scheme */
36
38
  const updateScheme$1 = (path, value) => updateScheme(__props.scheme.uid, path, value, storeContext, __props.persistAuth);
39
+ const hasPrefilledRedirectUri = ref(false);
40
+ const defaultRedirectUri = computed(() => resolveDefaultOAuth2RedirectUri(config.value));
41
+ watch(() => "x-scalar-redirect-uri" in __props.flow ? __props.flow["x-scalar-redirect-uri"] : void 0, (currentRedirectUri) => {
42
+ if (!("x-scalar-redirect-uri" in __props.flow) || hasPrefilledRedirectUri.value || currentRedirectUri) return;
43
+ if (!defaultRedirectUri.value) return;
44
+ hasPrefilledRedirectUri.value = true;
45
+ updateScheme$1(`flows.${__props.flow.type}.x-scalar-redirect-uri`, defaultRedirectUri.value);
46
+ }, { immediate: true });
37
47
  /** Authorize the user using specified flow */
38
48
  const handleAuthorize = async () => {
39
49
  if (loader.isActive || !__props.collection?.uid) return;
@@ -1 +1 @@
1
- {"version":3,"file":"OAuth2.vue.script.js","names":[],"sources":["../../../../../src/views/Request/RequestSection/RequestAuth/OAuth2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, useLoadingState } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport {\n pkceOptions,\n type Collection,\n type Oauth2Flow,\n type SecuritySchemeOauth2,\n type Server,\n} from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { useToasts } from '@scalar/use-toasts'\n\nimport { DataTableRow } from '@/components/DataTable'\nimport type { EnvVariable } from '@/store/active-entities'\nimport { useWorkspace, type UpdateScheme } from '@/store/store'\nimport { authorizeOauth2 } from '@/views/Request/libs'\nimport { updateScheme as _updateScheme } from '@/views/Request/RequestSection/helpers/update-scheme'\n\nimport OAuthScopesInput from './OAuthScopesInput.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n collection,\n environment,\n envVariables,\n flow,\n persistAuth = false,\n scheme,\n server,\n workspace,\n} = defineProps<{\n collection: Collection\n environment: Environment\n envVariables: EnvVariable[]\n flow: Oauth2Flow\n persistAuth: boolean\n scheme: SecuritySchemeOauth2\n server: Server | undefined\n workspace: Workspace\n}>()\n\nconst emits = defineEmits<{\n authorized: []\n}>()\n\ndefineSlots<{\n 'oauth-actions'?: () => unknown\n}>()\n\nconst loader = useLoadingState()\nconst { toast } = useToasts()\nconst storeContext = useWorkspace()\n\n/** Update the current scheme */\nconst updateScheme: UpdateScheme = (path, value) =>\n _updateScheme(scheme.uid, path, value, storeContext, persistAuth)\n\n/** Authorize the user using specified flow */\nconst handleAuthorize = async () => {\n if (loader.isActive || !collection?.uid) {\n return\n }\n if (!server) {\n toast('No server selected', 'error')\n return\n }\n loader.start()\n\n const [error, accessToken] = await authorizeOauth2(\n flow,\n server,\n workspace?.proxyUrl,\n )\n\n await loader.clear()\n\n if (accessToken) {\n updateScheme(`flows.${flow.type}.token`, accessToken)\n emits('authorized')\n } else {\n console.error(error)\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** To make prop drilling a little easier */\nconst dataTableInputProps = {\n environment,\n envVariables,\n workspace,\n}\n</script>\n\n<template>\n <!-- Access Token Granted -->\n <template v-if=\"flow.token\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"border-r-transparent\"\n :modelValue=\"flow.token\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"(v) => updateScheme(`flows.${flow.type}.token`, v)\">\n Access Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-1 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"updateScheme(`flows.${flow.type}.token`, '')\">\n Clear\n </ScalarButton>\n <slot name=\"oauth-actions\" />\n </div>\n </DataTableRow>\n </template>\n\n <template v-else>\n <DataTableRow>\n <!-- Auth URL -->\n <RequestAuthDataTableInput\n v-if=\"'authorizationUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n containerClass=\"border-r-0\"\n :modelValue=\"flow.authorizationUrl\"\n placeholder=\"https://galaxy.scalar.com/authorize\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.authorizationUrl`, v)\n \">\n Auth URL\n </RequestAuthDataTableInput>\n\n <!-- Token URL -->\n <RequestAuthDataTableInput\n v-if=\"'tokenUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.tokenUrl\"\n placeholder=\"https://galaxy.scalar.com/token\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.tokenUrl`, v)\n \">\n Token URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <DataTableRow v-if=\"'x-scalar-redirect-uri' in flow\">\n <!-- Redirect URI -->\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-redirect-uri']\"\n placeholder=\"https://galaxy.scalar.com/callback\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-redirect-uri`, v)\n \">\n Redirect URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Username and password -->\n <template v-if=\"flow.type === 'password'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"text-c-2\"\n :modelValue=\"flow.username\"\n placeholder=\"janedoe\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.username`, v)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.password\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.password`, v)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- Client ID -->\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-client-id']\"\n placeholder=\"12345\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-client-id`, v)\n \">\n Client ID\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Client Secret (Authorization Code / Client Credentials / Password (optional)) -->\n <DataTableRow v-if=\"'clientSecret' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.clientSecret\"\n placeholder=\"XYZ123\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.clientSecret`, v)\n \">\n Client Secret\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- PKCE -->\n <DataTableRow v-if=\"'x-usePkce' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :enum=\"pkceOptions\"\n :modelValue=\"flow['x-usePkce']\"\n readOnly\n @update:modelValue=\"\n (v) =>\n updateScheme(\n `flows.${flow.type}.x-usePkce`,\n v as (typeof pkceOptions)[number],\n )\n \">\n Use PKCE\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Scopes -->\n <DataTableRow v-if=\"Object.keys(flow.scopes ?? {}).length\">\n <OAuthScopesInput\n :flow=\"flow\"\n :updateScheme=\"updateScheme\" />\n </DataTableRow>\n\n <!-- Open ID Connect -->\n <!-- <DataTableRow -->\n <!-- v-else-if=\"activeScheme?.type === 'openIdConnect'\" -->\n <!-- class=\"border-r-transparent\"> -->\n <!-- <DataTableInput -->\n <!-- v-model=\"password\" -->\n <!-- placeholder=\"Token\"> -->\n <!-- TODO -->\n <!-- </DataTableInput> -->\n <!-- <DataTableCell class=\"flex items-center\"> -->\n <!-- <ScalarButton size=\"sm\"> Authorize </ScalarButton> -->\n <!-- </DataTableCell> -->\n <!-- </DataTableRow> -->\n </template>\n <template v-if=\"!flow.token\">\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 w-full items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-0.75 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </DataTableRow>\n </template>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"OAuth2.vue.script.js","names":[],"sources":["../../../../../src/views/Request/RequestSection/RequestAuth/OAuth2.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, useLoadingState } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport {\n pkceOptions,\n type Collection,\n type Oauth2Flow,\n type SecuritySchemeOauth2,\n type Server,\n} from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, ref, watch } from 'vue'\n\nimport { DataTableRow } from '@/components/DataTable'\nimport {\n resolveDefaultOAuth2RedirectUri,\n useClientConfig,\n} from '@/hooks/useClientConfig'\nimport type { EnvVariable } from '@/store/active-entities'\nimport { useWorkspace, type UpdateScheme } from '@/store/store'\nimport { authorizeOauth2 } from '@/views/Request/libs'\nimport { updateScheme as _updateScheme } from '@/views/Request/RequestSection/helpers/update-scheme'\n\nimport OAuthScopesInput from './OAuthScopesInput.vue'\nimport RequestAuthDataTableInput from './RequestAuthDataTableInput.vue'\n\nconst {\n collection,\n environment,\n envVariables,\n flow,\n persistAuth = false,\n scheme,\n server,\n workspace,\n} = defineProps<{\n collection: Collection\n environment: Environment\n envVariables: EnvVariable[]\n flow: Oauth2Flow\n persistAuth: boolean\n scheme: SecuritySchemeOauth2\n server: Server | undefined\n workspace: Workspace\n}>()\n\nconst emits = defineEmits<{\n authorized: []\n}>()\n\ndefineSlots<{\n 'oauth-actions'?: () => unknown\n}>()\n\nconst loader = useLoadingState()\nconst { toast } = useToasts()\nconst storeContext = useWorkspace()\nconst config = useClientConfig()\n\n/** Update the current scheme */\nconst updateScheme: UpdateScheme = (path, value) =>\n _updateScheme(scheme.uid, path, value, storeContext, persistAuth)\n\nconst hasPrefilledRedirectUri = ref(false)\nconst defaultRedirectUri = computed<string>(() =>\n resolveDefaultOAuth2RedirectUri(config.value),\n)\n\nwatch(\n () =>\n 'x-scalar-redirect-uri' in flow ? flow['x-scalar-redirect-uri'] : undefined,\n (currentRedirectUri) => {\n if (\n !('x-scalar-redirect-uri' in flow) ||\n hasPrefilledRedirectUri.value ||\n currentRedirectUri\n ) {\n return\n }\n\n if (!defaultRedirectUri.value) {\n return\n }\n\n hasPrefilledRedirectUri.value = true\n updateScheme(\n `flows.${flow.type}.x-scalar-redirect-uri`,\n defaultRedirectUri.value,\n )\n },\n { immediate: true },\n)\n\n/** Authorize the user using specified flow */\nconst handleAuthorize = async () => {\n if (loader.isActive || !collection?.uid) {\n return\n }\n if (!server) {\n toast('No server selected', 'error')\n return\n }\n loader.start()\n\n const [error, accessToken] = await authorizeOauth2(\n flow,\n server,\n workspace?.proxyUrl,\n )\n\n await loader.clear()\n\n if (accessToken) {\n updateScheme(`flows.${flow.type}.token`, accessToken)\n emits('authorized')\n } else {\n console.error(error)\n toast(error?.message ?? 'Failed to authorize', 'error')\n }\n}\n\n/** To make prop drilling a little easier */\nconst dataTableInputProps = {\n environment,\n envVariables,\n workspace,\n}\n</script>\n\n<template>\n <!-- Access Token Granted -->\n <template v-if=\"flow.token\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"border-r-transparent\"\n :modelValue=\"flow.token\"\n placeholder=\"QUxMIFlPVVIgQkFTRSBBUkUgQkVMT05HIFRPIFVT\"\n type=\"password\"\n @update:modelValue=\"(v) => updateScheme(`flows.${flow.type}.token`, v)\">\n Access Token\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-1 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"updateScheme(`flows.${flow.type}.token`, '')\">\n Clear\n </ScalarButton>\n <slot name=\"oauth-actions\" />\n </div>\n </DataTableRow>\n </template>\n\n <template v-else>\n <DataTableRow>\n <!-- Auth URL -->\n <RequestAuthDataTableInput\n v-if=\"'authorizationUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n containerClass=\"border-r-0\"\n :modelValue=\"flow.authorizationUrl\"\n placeholder=\"https://galaxy.scalar.com/authorize\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.authorizationUrl`, v)\n \">\n Auth URL\n </RequestAuthDataTableInput>\n\n <!-- Token URL -->\n <RequestAuthDataTableInput\n v-if=\"'tokenUrl' in flow\"\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.tokenUrl\"\n placeholder=\"https://galaxy.scalar.com/token\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.tokenUrl`, v)\n \">\n Token URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <DataTableRow v-if=\"'x-scalar-redirect-uri' in flow\">\n <!-- Redirect URI -->\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-redirect-uri']\"\n placeholder=\"https://galaxy.scalar.com/callback\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-redirect-uri`, v)\n \">\n Redirect URL\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Username and password -->\n <template v-if=\"flow.type === 'password'\">\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n class=\"text-c-2\"\n :modelValue=\"flow.username\"\n placeholder=\"janedoe\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.username`, v)\n \">\n Username\n </RequestAuthDataTableInput>\n </DataTableRow>\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.password\"\n placeholder=\"********\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.password`, v)\n \">\n Password\n </RequestAuthDataTableInput>\n </DataTableRow>\n </template>\n\n <!-- Client ID -->\n <DataTableRow>\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow['x-scalar-client-id']\"\n placeholder=\"12345\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.x-scalar-client-id`, v)\n \">\n Client ID\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Client Secret (Authorization Code / Client Credentials / Password (optional)) -->\n <DataTableRow v-if=\"'clientSecret' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :modelValue=\"flow.clientSecret\"\n placeholder=\"XYZ123\"\n type=\"password\"\n @update:modelValue=\"\n (v) => updateScheme(`flows.${flow.type}.clientSecret`, v)\n \">\n Client Secret\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- PKCE -->\n <DataTableRow v-if=\"'x-usePkce' in flow\">\n <RequestAuthDataTableInput\n v-bind=\"dataTableInputProps\"\n :enum=\"pkceOptions\"\n :modelValue=\"flow['x-usePkce']\"\n readOnly\n @update:modelValue=\"\n (v) =>\n updateScheme(\n `flows.${flow.type}.x-usePkce`,\n v as (typeof pkceOptions)[number],\n )\n \">\n Use PKCE\n </RequestAuthDataTableInput>\n </DataTableRow>\n\n <!-- Scopes -->\n <DataTableRow v-if=\"Object.keys(flow.scopes ?? {}).length\">\n <OAuthScopesInput\n :flow=\"flow\"\n :updateScheme=\"updateScheme\" />\n </DataTableRow>\n\n <!-- Open ID Connect -->\n <!-- <DataTableRow -->\n <!-- v-else-if=\"activeScheme?.type === 'openIdConnect'\" -->\n <!-- class=\"border-r-transparent\"> -->\n <!-- <DataTableInput -->\n <!-- v-model=\"password\" -->\n <!-- placeholder=\"Token\"> -->\n <!-- TODO -->\n <!-- </DataTableInput> -->\n <!-- <DataTableCell class=\"flex items-center\"> -->\n <!-- <ScalarButton size=\"sm\"> Authorize </ScalarButton> -->\n <!-- </DataTableCell> -->\n <!-- </DataTableRow> -->\n </template>\n <template v-if=\"!flow.token\">\n <DataTableRow class=\"min-w-full\">\n <div class=\"flex h-8 w-full items-center justify-end border-t\">\n <ScalarButton\n class=\"mr-0.75 p-0 px-2 py-0.5\"\n :loader\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleAuthorize\">\n Authorize\n </ScalarButton>\n </div>\n </DataTableRow>\n </template>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTable.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"names":[],"mappings":"AAsQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAQ9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAK1D,KAAK,WAAW,GAAG;IACf,KAAK,CAAC,EAAE,CAAC,uBAAuB,GAAG;QAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAAE,CAAA;IAClE,8BAA8B;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC;AAooBJ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;yBA7oBQ,OAAO;sBACV,OAAO;cACf,OAAO;gBACL,OAAO;6EA8oBtB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"RequestTable.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"names":[],"mappings":"AAsQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AACrE,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAQ9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAK1D,KAAK,WAAW,GAAG;IACf,KAAK,CAAC,EAAE,CAAC,uBAAuB,GAAG;QAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC,EAAE,CAAA;IAClE,8BAA8B;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC;AAqoBJ,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;yBA9oBQ,OAAO;sBACV,OAAO;cACf,OAAO;gBACL,OAAO;6EA+oBtB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import RequestTable_vue_vue_type_script_setup_true_lang_default from "./RequestTable.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/views/Request/RequestSection/RequestTable.vue
5
- var RequestTable_default = /* @__PURE__ */ _plugin_vue_export_helper_default(RequestTable_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-04661eb4"]]);
5
+ var RequestTable_default = /* @__PURE__ */ _plugin_vue_export_helper_default(RequestTable_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9a415d6b"]]);
6
6
  //#endregion
7
7
  export { RequestTable_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTable.vue.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 centered-x centered-y absolute hidden w-[calc(100%_-_8px)] rounded p-0.5 text-center text-xs font-medium group-hover/upload:block\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"RequestTable.vue.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 md:centered-x md:centered-y static rounded p-0.5 text-center text-xs font-medium md:absolute md:w-[calc(100%_-_8px)] md:opacity-0 md:group-hover/upload:opacity-100\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":""}
@@ -232,7 +232,7 @@ var RequestTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
232
232
  class: "group/upload flex items-center justify-center whitespace-nowrap"
233
233
  }, {
234
234
  default: withCtx(() => [item.file ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("div", _hoisted_1, [createElementVNode("span", null, toDisplayString(item.file?.name), 1)]), createElementVNode("button", {
235
- class: "bg-b-2 centered-x centered-y absolute hidden w-[calc(100%_-_8px)] rounded p-0.5 text-center text-xs font-medium group-hover/upload:block",
235
+ class: "bg-b-2 md:centered-x md:centered-y static rounded p-0.5 text-center text-xs font-medium md:absolute md:w-[calc(100%_-_8px)] md:opacity-0 md:group-hover/upload:opacity-100",
236
236
  type: "button",
237
237
  onClick: ($event) => emit("removeFile", idx)
238
238
  }, " Delete ", 8, _hoisted_2)], 64)) : (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(unref(ScalarButton), {
@@ -1 +1 @@
1
- {"version":3,"file":"RequestTable.vue.script.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 centered-x centered-y absolute hidden w-[calc(100%_-_8px)] rounded p-0.5 text-center text-xs font-medium group-hover/upload:block\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RequestTable.vue.script.js","names":[],"sources":["../../../../src/views/Request/RequestSection/RequestTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarTooltip } from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { RequestExampleParameter } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { RouterLink, type RouteLocationRaw } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableCheckbox from '@/components/DataTable/DataTableCheckbox.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nimport { hasItemProperties, parameterIsInvalid } from '../libs/request'\nimport RequestTableTooltip from './RequestTableTooltip.vue'\n\nconst props = withDefaults(\n defineProps<{\n items?: (RequestExampleParameter & { route?: RouteLocationRaw })[]\n /** Hide the enabled column */\n hasCheckboxDisabled?: boolean\n showUploadButton?: boolean\n isGlobal?: boolean\n isReadOnly?: boolean\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n invalidParams?: Set<string>\n label?: string\n }>(),\n {\n hasCheckboxDisabled: false,\n showUploadButton: false,\n isGlobal: false,\n isReadOnly: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'updateRow', idx: number, field: 'key' | 'value', value: string): void\n (e: 'toggleRow', idx: number, enabled: boolean): void\n (e: 'addRow'): void\n (e: 'deleteRow', idx: number): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'uploadFile', idx: number): void\n (e: 'removeFile', idx: number): void\n}>()\n\nconst columns = ['', '', '36px']\n\nconst handleSelectVariable = (\n idx: number,\n field: 'key' | 'value',\n value: string,\n) => {\n emit('updateRow', idx, field, value)\n}\n\nconst handleFileUpload = (idx: number) => {\n emit('uploadFile', idx)\n}\n\nconst flattenValue = (item: RequestExampleParameter) => {\n return Array.isArray(item.default) && item.default.length === 1\n ? item.default[0]\n : item.default\n}\n\n// Shows delete button if the item has key or value filled\nconst showDeleteButton = (item: RequestExampleParameter) => {\n return Boolean(item.key || item.value)\n}\n</script>\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"columns\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>{{ label }} Enabled</DataTableHeader>\n <DataTableHeader>{{ label }} Key</DataTableHeader>\n <DataTableHeader>{{ label }} Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, idx) in items\"\n :id=\"item.key\"\n :key=\"idx\"\n :class=\"{\n alert: parameterIsInvalid(item).value,\n error: invalidParams && invalidParams.has(item.key),\n }\">\n <template v-if=\"isGlobal\">\n <RouterLink\n class=\"text-c-2 flex items-center justify-center border-t !border-r\"\n :to=\"item.route ?? {}\">\n <span class=\"sr-only\">Global</span>\n <ScalarTooltip\n content=\"Global cookies are shared across the whole workspace.\"\n placement=\"top\">\n <ScalarIcon\n tabindex=\"0\"\n class=\"text-c-1\"\n icon=\"Globe\"\n size=\"xs\" />\n </ScalarTooltip>\n </RouterLink>\n </template>\n <template v-else>\n <DataTableCheckbox\n class=\"!border-r\"\n :disabled=\"props.hasCheckboxDisabled\"\n :modelValue=\"item.enabled\"\n @update:modelValue=\"(v) => emit('toggleRow', idx, v)\" />\n </template>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Key`\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"item.key\"\n placeholder=\"Key\"\n :required=\"Boolean(item.required)\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'key', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'key', v)\n \" />\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n :aria-label=\"`${label} Value`\"\n :class=\"\n hasItemProperties(item)\n ? 'pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10'\n : 'group-hover:pr-6 group-has-[.cm-focused]:pr-6'\n \"\n :default=\"item.default\"\n disableCloseBrackets\n :disabled=\"props.isReadOnly\"\n disableEnter\n disableTabIndent\n lineWrapping\n :enum=\"item.enum ?? []\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :examples=\"item.examples ?? []\"\n :max=\"item.maximum\"\n :min=\"item.minimum\"\n :modelValue=\"item.value\"\n :nullable=\"Boolean(item.nullable)\"\n placeholder=\"Value\"\n :type=\"item.type\"\n :workspace=\"workspace\"\n @blur=\"emit('inputBlur')\"\n @focus=\"emit('inputFocus')\"\n @selectVariable=\"(v: string) => handleSelectVariable(idx, 'value', v)\"\n @update:modelValue=\"\n (v: string) => emit('updateRow', idx, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"showDeleteButton(item) && !item.required\"\n :class=\"{\n '-mr-0.5': hasItemProperties(item),\n }\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"emit('deleteRow', idx)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n <RequestTableTooltip\n v-if=\"hasItemProperties(item)\"\n :item=\"{ ...item, default: flattenValue(item) }\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell\n v-if=\"showUploadButton\"\n class=\"group/upload flex items-center justify-center whitespace-nowrap\">\n <template v-if=\"item.file\">\n <div\n class=\"text-c-2 filemask flex w-full max-w-[100%] items-end justify-end overflow-hidden p-1\">\n <span>{{ item.file?.name }}</span>\n </div>\n <button\n class=\"bg-b-2 md:centered-x md:centered-y static rounded p-0.5 text-center text-xs font-medium md:absolute md:w-[calc(100%_-_8px)] md:opacity-0 md:group-hover/upload:opacity-100\"\n type=\"button\"\n @click=\"emit('removeFile', idx)\">\n Delete\n </button>\n </template>\n <template v-else>\n <div class=\"p-0.5\">\n <ScalarButton\n class=\"bg-b-2 hover:bg-b-3 text-c-2 h-fit border-0 py-px shadow-none\"\n size=\"sm\"\n variant=\"outlined\"\n @click=\"handleFileUpload(idx)\">\n <span>Upload File</span>\n <ScalarIcon\n class=\"ml-1\"\n icon=\"Upload\"\n size=\"xs\"\n thickness=\"2.5\" />\n </ScalarButton>\n </div>\n </template>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n}\n.filemask {\n mask-image: linear-gradient(\n to right,\n transparent 0,\n var(--scalar-background-2) 20px\n );\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EAsBd,MAAM,OAAO;EAWb,MAAM,UAAU;GAAC;GAAI;GAAI;GAAM;EAE/B,MAAM,wBACJ,KACA,OACA,UACG;AACH,QAAK,aAAa,KAAK,OAAO,MAAK;;EAGrC,MAAM,oBAAoB,QAAgB;AACxC,QAAK,cAAc,IAAG;;EAGxB,MAAM,gBAAgB,SAAkC;AACtD,UAAO,MAAM,QAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ,WAAW,IAC1D,KAAK,QAAQ,KACb,KAAK;;EAIX,MAAM,oBAAoB,SAAkC;AAC1D,UAAO,QAAQ,KAAK,OAAO,KAAK,MAAK;;;uBAIrC,YA8IY,mBAAA;IA7IV,OAAM;IACI;;2BAKK,CAJf,YAIe,sBAAA,EAJD,OAAM,kBAAgB,EAAA;4BACoB;MAAtD,YAAsD,yBAAA,MAAA;8BAA1B,CAAA,gBAAA,gBAAR,QAAA,MAAK,GAAG,YAAQ,EAAA,CAAA,CAAA;;;MACpC,YAAkD,yBAAA,MAAA;8BAAtB,CAAA,gBAAA,gBAAR,QAAA,MAAK,GAAG,QAAI,EAAA,CAAA,CAAA;;;MAChC,YAAoD,yBAAA,MAAA;8BAAxB,CAAA,gBAAA,gBAAR,QAAA,MAAK,GAAG,UAAM,EAAA,CAAA,CAAA;;;;;0BAEpC,mBAqIe,UAAA,MAAA,WApIS,QAAA,QAAd,MAAM,QAAG;yBADnB,YAqIe,sBAAA;MAnIZ,IAAI,KAAK;MACT,KAAK;MACL,OAAK,eAAA;cAAmB,MAAA,mBAAkB,CAAC,KAAI,CAAE;cAAsB,QAAA,iBAAiB,QAAA,cAAc,IAAI,KAAK,IAAG;;;6BAmBxG;OAfK,QAAA,YAAA,WAAA,EACd,YAaa,MAAA,WAAA,EAAA;;QAZX,OAAM;QACL,IAAI,KAAK,SAAK,EAAA;;+BACoB,CAAA,OAAA,OAAA,OAAA,KAAnC,mBAAmC,QAAA,EAA7B,OAAM,WAAS,EAAC,UAAM,GAAA,GAC5B,YAQgB,MAAA,cAAA,EAAA;SAPd,SAAQ;SACR,WAAU;;gCAKI,CAJd,YAIc,MAAA,WAAA,EAAA;UAHZ,UAAS;UACT,OAAM;UACN,MAAK;UACL,MAAK;;;;;sCAKX,YAI0D,2BAAA;;QAHxD,OAAM;QACL,UAAU,MAAM;QAChB,YAAY,KAAK;QACjB,wBAAoB,MAAM,KAAI,aAAc,KAAK,EAAC;;;;;;OAEvD,YAoBgB,uBAAA,MAAA;+BADR,CAlBN,YAkBM,mBAAA;SAjBH,cAAU,GAAK,QAAA,MAAK;SACrB,sBAAA;SACC,UAAU,MAAM;SACjB,cAAA;SACA,kBAAA;SACA,cAAA;SACC,cAAc,QAAA;SACd,aAAa,QAAA;SACb,YAAY,KAAK;SAClB,aAAY;SACX,UAAU,QAAQ,KAAK,SAAQ;SAC/B,WAAW,QAAA;SACX,QAAI,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,YAAA;SACV,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,aAAA;SACX,mBAAiB,MAAc,qBAAqB,KAAG,OAAS,EAAC;SACjE,wBAAiC,MAAc,KAAI,aAAc,KAAG,OAAS,EAAC;;;;;;;;;;;;;;OAInF,YAgDgB,uBAAA,MAAA;+BADF,CA9CZ,YA8CY,mBAAA;SA7CT,cAAU,GAAK,QAAA,MAAK;SACpB,OAAK,eAAe,MAAA,kBAAiB,CAAC,KAAI,GAAA,yDAAA,gDAAA;SAK1C,SAAS,KAAK;SACf,sBAAA;SACC,UAAU,MAAM;SACjB,cAAA;SACA,kBAAA;SACA,cAAA;SACC,MAAM,KAAK,QAAI,EAAA;SACf,cAAc,QAAA;SACd,aAAa,QAAA;SACb,UAAU,KAAK,YAAQ,EAAA;SACvB,KAAK,KAAK;SACV,KAAK,KAAK;SACV,YAAY,KAAK;SACjB,UAAU,QAAQ,KAAK,SAAQ;SAChC,aAAY;SACX,MAAM,KAAK;SACX,WAAW,QAAA;SACX,QAAI,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,YAAA;SACV,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,aAAA;SACX,mBAAiB,MAAc,qBAAqB,KAAG,SAAW,EAAC;SACnE,wBAAiC,MAAc,KAAI,aAAc,KAAG,SAAW,EAAC;;SAGtE,MAAI,cAWE,CATP,iBAAiB,KAAI,IAAA,CAAM,KAAK,YAAA,WAAA,EADxC,YAUe,MAAA,aAAA,EAAA;;UARZ,OAAK,eAAA,CAAA,EAAA,WAA+B,MAAA,kBAAiB,CAAC,KAAI,EAAA,EAGrD,wHAAuH,CAAA;UAC7H,MAAK;UACL,SAAQ;UACP,UAAK,WAAE,KAAI,aAAc,IAAG;;iCACO,CAApC,YAAoC,MAAA,gBAAA,EAAA,EAAnB,OAAM,YAAU,CAAA,CAAA,CAAA;;sEAG3B,MAAA,kBAAiB,CAAC,KAAI,IAAA,WAAA,EAD9B,YAEqD,6BAAA;;UAAlD,MAAI;WAAA,GAAO;WAAI,SAAW,aAAa,KAAI;WAAA;;;;;;;;;;;;;;;;;;;;;;;OAK5C,QAAA,oBAAA,WAAA,EADR,YA+BgB,uBAAA;;QA7Bd,OAAM;;+BAYK,CAXK,KAAK,QAAA,WAAA,EAArB,mBAWW,UAAA,EAAA,KAAA,GAAA,EAAA,CAVT,mBAGM,OAHN,YAGM,CADJ,mBAAkC,QAAA,MAAA,gBAAzB,KAAK,MAAM,KAAI,EAAA,EAAA,CAAA,CAAA,EAE1B,mBAKS,UAAA;SAJP,OAAM;SACN,MAAK;SACJ,UAAK,WAAE,KAAI,cAAe,IAAG;WAAG,YAEnC,GAAA,WAAA,CAAA,EAAA,GAAA,KAAA,WAAA,EAGA,mBAaM,OAbN,YAaM,CAZJ,YAWe,MAAA,aAAA,EAAA;SAVb,OAAM;SACN,MAAK;SACL,SAAQ;SACP,UAAK,WAAE,iBAAiB,IAAG;;gCACJ,CAAA,OAAA,OAAA,OAAA,KAAxB,mBAAwB,QAAA,MAAlB,eAAW,GAAA,GACjB,YAIoB,MAAA,WAAA,EAAA;UAHlB,OAAM;UACN,MAAK;UACL,MAAK;UACL,WAAU"}
@@ -45,7 +45,7 @@ var ResponseEmpty_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
45
45
  const handleHotKey = (event) => {
46
46
  if (event?.createNew && route.name === "request") addRequest();
47
47
  };
48
- const packageVersion = "2.39.4";
48
+ const packageVersion = "2.41.0";
49
49
  onMounted(() => events.hotKeys.on(handleHotKey));
50
50
  onBeforeUnmount(() => events.hotKeys.off(handleHotKey));
51
51
  return (_ctx, _cache) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ResponseMetaInformation.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"names":[],"mappings":"AAuFA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AASvE,KAAK,WAAW,GAAG;IAAE,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAiJlD,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"ResponseMetaInformation.vue.d.ts","sourceRoot":"","sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"names":[],"mappings":"AAwFA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAQvE,KAAK,WAAW,GAAG;IAAE,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAiJlD,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ResponseMetaInformation.vue.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? prettyBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"ResponseMetaInformation.vue.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { formatBytes } from '@scalar/helpers/formatters/format-bytes'\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? formatBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":""}
@@ -3,7 +3,7 @@ import HelpfulLink_default from "../../../components/HelpfulLink.vue.js";
3
3
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeStyle, openBlock, ref, toDisplayString, unref, withCtx } from "vue";
4
4
  import { httpStatusCodes } from "@scalar/oas-utils/helpers";
5
5
  import prettyMilliseconds from "pretty-ms";
6
- import prettyBytes from "pretty-bytes";
6
+ import { formatBytes } from "@scalar/helpers/formatters/format-bytes";
7
7
  //#region src/views/Request/ResponseSection/ResponseMetaInformation.vue?vue&type=script&setup=true&lang.ts
8
8
  var _hoisted_1 = { class: "text-c-1 flex gap-1.5" };
9
9
  var _hoisted_2 = { key: 0 };
@@ -28,7 +28,7 @@ var ResponseMetaInformation_vue_vue_type_script_setup_true_lang_default = /* @__
28
28
  /** Size of the response */
29
29
  const getContentLength = (response) => {
30
30
  const contentLength = Number.parseInt(response.headers?.["Content-Length"] || response.headers?.["content-length"] || "0", 10);
31
- return contentLength ? prettyBytes(contentLength) : void 0;
31
+ return contentLength ? formatBytes(contentLength) : void 0;
32
32
  };
33
33
  /** Status text for the response */
34
34
  const statusCodeInformation = computed(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"ResponseMetaInformation.vue.script.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyBytes from 'pretty-bytes'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? prettyBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,cAAa;EAChC,MAAM,WAAW,KAAoC;EACrD,MAAM,YAAY,IAAI,EAAC;AAEvB,SAAO,cAAc,IAAI,WAAW;AAClC,OAAI,WAAW,QACb,UAAS,QAAQ,kBAAmB,UAAU,SAAS,KAAO,IAAI;QAC7D;AACL,kBAAc,SAAS,MAAK;AAC5B,aAAS,QAAQ,KAAA;AACjB,cAAU,QAAQ;;IAErB;;EAGD,MAAM,oBAAoB,aAA+B;GACvD,MAAM,gBAAgB,OAAO,SAC3B,SAAS,UAAU,qBACjB,SAAS,UAAU,qBACnB,KACF,GACF;AAEA,UAAO,gBAAgB,YAAY,cAAc,GAAG,KAAA;;;EAItD,MAAM,wBAAwB,eAA2C;GACvE,MAAM,qBAAqB,MAAM,SAAS;AAE1C,OAAI,CAAC,mBACH;AAGF,UAAO,gBAAgB,uBAAuB,KAAA;IAC/C;;uBAGC,mBAgCM,OAhCN,YAgCM,CA/BQ,SAAA,SAAY,UAAA,SAAA,WAAA,EAAxB,mBAES,QAAA,YAAA,gBADP,MAAA,mBAAkB,CAAC,UAAA,MAAS,CAAA,EAAA,EAAA,KAAA,WAAA,EAE9B,mBA2BW,UAAA,EAAA,KAAA,GAAA,EAAA;IA1BT,mBAGO,QAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAA4D,QAAA,EAAtD,OAAM,WAAS,EAAC,mCAA+B,GAAA,GAAA,gBAAO,MAC5D,gBAAG,MAAA,mBAAkB,CAAC,QAAA,SAAS,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA;IAE7B,iBAAiB,QAAA,SAAQ,IAAA,WAAA,EAArC,mBAGO,QAAA,YAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAAoC,QAAA,EAA9B,OAAM,WAAS,EAAC,WAAO,GAAA,GAAA,gBAAO,MACpC,gBAAG,iBAAiB,QAAA,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA;IAEd,sBAAA,SAAA,WAAA,EAAhB,mBAiBW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,OAAA,OAAA,OAAA,KAhBT,mBAAsC,QAAA,EAAhC,OAAM,WAAS,EAAC,aAAS,GAAA,GAEvB,sBAAA,MAAsB,OAAA,WAAA,EAD9B,YAQc,qBAAA;;KANZ,OAAM;KACL,MAAM,sBAAA,MAAsB;;4BACR,CAAA,gBAAA,gBAAlB,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;MAD5D,OAAM;MACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA;;;qCAE1D,mBAKO,QAAA,YAAA,CAAA,gBAAA,gBAJF,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;KAD5D,OAAM;KACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA"}
1
+ {"version":3,"file":"ResponseMetaInformation.vue.script.js","names":[],"sources":["../../../../src/views/Request/ResponseSection/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { formatBytes } from '@scalar/helpers/formatters/format-bytes'\nimport type { ResponseInstance } from '@scalar/oas-utils/entities/spec'\nimport { httpStatusCodes, type HttpStatusCode } from '@scalar/oas-utils/helpers'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport { useWorkspace } from '@/store'\n\nconst props = defineProps<{ response: ResponseInstance }>()\n\nconst { events } = useWorkspace()\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nevents.requestStatus.on((status) => {\n if (status === 'start') {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n } else {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n }\n})\n\n/** Size of the response */\nconst getContentLength = (response: ResponseInstance) => {\n const contentLength = Number.parseInt(\n response.headers?.['Content-Length'] ||\n response.headers?.['content-length'] ||\n '0',\n 10,\n )\n\n return contentLength ? formatBytes(contentLength) : undefined\n}\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = props.response.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAUA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,cAAa;EAChC,MAAM,WAAW,KAAoC;EACrD,MAAM,YAAY,IAAI,EAAC;AAEvB,SAAO,cAAc,IAAI,WAAW;AAClC,OAAI,WAAW,QACb,UAAS,QAAQ,kBAAmB,UAAU,SAAS,KAAO,IAAI;QAC7D;AACL,kBAAc,SAAS,MAAK;AAC5B,aAAS,QAAQ,KAAA;AACjB,cAAU,QAAQ;;IAErB;;EAGD,MAAM,oBAAoB,aAA+B;GACvD,MAAM,gBAAgB,OAAO,SAC3B,SAAS,UAAU,qBACjB,SAAS,UAAU,qBACnB,KACF,GACF;AAEA,UAAO,gBAAgB,YAAY,cAAc,GAAG,KAAA;;;EAItD,MAAM,wBAAwB,eAA2C;GACvE,MAAM,qBAAqB,MAAM,SAAS;AAE1C,OAAI,CAAC,mBACH;AAGF,UAAO,gBAAgB,uBAAuB,KAAA;IAC/C;;uBAGC,mBAgCM,OAhCN,YAgCM,CA/BQ,SAAA,SAAY,UAAA,SAAA,WAAA,EAAxB,mBAES,QAAA,YAAA,gBADP,MAAA,mBAAkB,CAAC,UAAA,MAAS,CAAA,EAAA,EAAA,KAAA,WAAA,EAE9B,mBA2BW,UAAA,EAAA,KAAA,GAAA,EAAA;IA1BT,mBAGO,QAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAA4D,QAAA,EAAtD,OAAM,WAAS,EAAC,mCAA+B,GAAA,GAAA,gBAAO,MAC5D,gBAAG,MAAA,mBAAkB,CAAC,QAAA,SAAS,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA;IAE7B,iBAAiB,QAAA,SAAQ,IAAA,WAAA,EAArC,mBAGO,QAAA,YAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAAoC,QAAA,EAA9B,OAAM,WAAS,EAAC,WAAO,GAAA,GAAA,gBAAO,MACpC,gBAAG,iBAAiB,QAAA,SAAQ,CAAA,EAAA,EAAA,CAAA,CAAA,IAAA,mBAAA,IAAA,KAAA;IAEd,sBAAA,SAAA,WAAA,EAAhB,mBAiBW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,OAAA,OAAA,OAAA,KAhBT,mBAAsC,QAAA,EAAhC,OAAM,WAAS,EAAC,aAAS,GAAA,GAEvB,sBAAA,MAAsB,OAAA,WAAA,EAD9B,YAQc,qBAAA;;KANZ,OAAM;KACL,MAAM,sBAAA,MAAsB;;4BACR,CAAA,gBAAA,gBAAlB,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;MAD5D,OAAM;MACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA;;;qCAE1D,mBAKO,QAAA,YAAA,CAAA,gBAAA,gBAJF,QAAA,SAAS,OAAM,GAAG,MAAC,gBAAG,sBAAA,MAAsB,KAAI,GAAG,KACtD,EAAA,EAAA,mBAE8D,QAAA;KAD5D,OAAM;KACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,OAAK,CAAA"}
@@ -156,7 +156,7 @@ var authorizeServers = async (flow, scopes, { code, pkce, proxyUrl } = {}, activ
156
156
  formData.set("password", flow.password);
157
157
  } else formData.set("grant_type", "client_credentials");
158
158
  if (flow["x-scalar-security-body"]) Object.entries(flow["x-scalar-security-body"]).forEach(([key, value]) => {
159
- if (value) formData.set(key, value);
159
+ if (value !== void 0 && value !== null) formData.set(key, String(value));
160
160
  });
161
161
  try {
162
162
  const headers = { "Content-Type": "application/x-www-form-urlencoded" };
@@ -1 +1 @@
1
- {"version":3,"file":"oauth2.js","names":[],"sources":["../../../../src/views/Request/libs/oauth2.ts"],"sourcesContent":["import { replaceVariables } from '@scalar/helpers/regex/replace-variables'\nimport { isRelativePath } from '@scalar/helpers/url/is-relative-path'\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { shouldUseProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { Oauth2Flow, Server } from '@scalar/oas-utils/entities/spec'\nimport { encode, fromUint8Array } from 'js-base64'\n\nimport type { ErrorResponse } from '@/libs/errors'\n\n/** Oauth2 security schemes which are not implicit */\ntype NonImplicitFlow = Exclude<Oauth2Flow, { type: 'implicit' }>\n\ntype PKCEState = {\n codeVerifier: string\n codeChallenge: string\n codeChallengeMethod: string\n}\n\n/**\n * Interpolates server URL template variables (e.g. `https://{env}.example.com`)\n * using the user-set `value` when available, falling back to the OpenAPI `default`.\n * This is needed so OAuth flows that use the server URL as a base resolve correctly\n * when the spec defines server variables.\n */\nexport const getInterpolatedServerUrl = (activeServer?: Server): string | undefined => {\n if (!activeServer?.url) return undefined\n\n const serverVariables = Object.entries(activeServer.variables ?? {}).reduce(\n (acc, [name, variable]) => {\n // User-set value takes priority over the OpenAPI default\n const value = variable.value || variable.default\n if (value) acc[name] = value\n return acc\n },\n {} as Record<string, string>,\n )\n\n return replaceVariables(activeServer.url, serverVariables)\n}\n\nconst getActiveServerBase = (activeServer?: Server) => {\n const serverUrl = getInterpolatedServerUrl(activeServer)\n\n if (!serverUrl) {\n return {}\n }\n\n if (isRelativePath(serverUrl)) {\n return typeof window === 'undefined' ? {} : { basePath: serverUrl }\n }\n\n return { baseUrl: serverUrl }\n}\n\n/**\n * Generates a random string for PKCE code verifier\n *\n * @see https://www.rfc-editor.org/rfc/rfc7636#page-8\n */\nconst generateCodeVerifier = (): string => {\n // Generate 32 random bytes\n const buffer = new Uint8Array(32)\n crypto.getRandomValues(buffer)\n\n // Base64URL encode the bytes\n return fromUint8Array(buffer, true)\n}\n\n/**\n * Creates a code challenge from the code verifier\n */\nexport const generateCodeChallenge = async (verifier: string, encoding: 'SHA-256' | 'plain'): Promise<string> => {\n if (encoding === 'plain') {\n return verifier\n }\n\n // If crypto.subtle.digest is not a function, we cannot use SHA-256\n if (typeof crypto?.subtle?.digest !== 'function') {\n console.warn('SHA-256 is only supported when using https, using a plain text code challenge instead.')\n return verifier\n }\n\n // ASCII encoding is just taking the lower 8 bits of each character\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n\n // Base64URL encode the bytes\n return fromUint8Array(new Uint8Array(digest), true)\n}\n\n/**\n * Authorize oauth2 flow\n *\n * @returns the accessToken\n */\nexport const authorizeOauth2 = async (\n flow: Oauth2Flow,\n /** We use the active server to set a base for relative redirect uris */\n activeServer: Server,\n /** If we want to use the proxy */\n proxyUrl?: string,\n): Promise<ErrorResponse<string>> => {\n try {\n if (!flow) {\n return [new Error('Flow not found'), null]\n }\n\n const scopes = flow.selectedScopes.join(' ')\n\n // Client Credentials or Password Flow\n if (flow.type === 'clientCredentials' || flow.type === 'password') {\n return authorizeServers(\n flow,\n scopes,\n {\n proxyUrl,\n },\n activeServer,\n )\n }\n\n // OAuth2 flows with a login popup\n\n // Generate a random state string with the length of 8 characters\n const state = (Math.random() + 1).toString(36).substring(2, 10)\n const authorizationUrl = makeUrlAbsolute(flow.authorizationUrl, getActiveServerBase(activeServer))\n const url = new URL(authorizationUrl)\n\n /** Special PKCE state */\n let pkce: PKCEState | null = null\n\n // Params unique to the flows\n if (flow.type === 'implicit') {\n url.searchParams.set('response_type', 'token')\n }\n\n // Authorization Code Flow\n else if (flow.type === 'authorizationCode') {\n url.searchParams.set('response_type', 'code')\n\n // PKCE\n if (flow['x-usePkce'] !== 'no') {\n const codeVerifier = generateCodeVerifier()\n const codeChallenge = await generateCodeChallenge(codeVerifier, flow['x-usePkce'])\n\n // Set state for later verification\n pkce = {\n codeVerifier,\n codeChallenge,\n codeChallengeMethod: flow['x-usePkce'] === 'SHA-256' ? 'S256' : 'plain',\n }\n\n // Set the code challenge and method on the url\n url.searchParams.set('code_challenge', codeChallenge)\n url.searchParams.set('code_challenge_method', pkce.codeChallengeMethod)\n }\n }\n\n // Handle relative redirect uris\n if (flow['x-scalar-redirect-uri'].startsWith('/')) {\n const baseUrl = getInterpolatedServerUrl(activeServer) || window.location.origin + window.location.pathname\n const redirectUri = makeUrlAbsolute(flow['x-scalar-redirect-uri'], { baseUrl: baseUrl })\n\n url.searchParams.set('redirect_uri', redirectUri)\n } else {\n url.searchParams.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n if (flow['x-scalar-security-query']) {\n Object.keys(flow['x-scalar-security-query']).forEach((key: string): void => {\n const value = flow['x-scalar-security-query']?.[key]\n if (!value) {\n return\n }\n url.searchParams.set(key, value)\n })\n }\n\n // Common to all flows\n url.searchParams.set('client_id', flow['x-scalar-client-id'])\n url.searchParams.set('state', state)\n if (scopes) {\n url.searchParams.set('scope', scopes)\n }\n\n const windowFeatures = 'left=100,top=100,width=800,height=600'\n const authWindow = window.open(url, 'openAuth2Window', windowFeatures)\n\n // Open up a window and poll until closed or we have the data we want\n if (authWindow) {\n // We need to return a promise here due to the setInterval\n return new Promise<ErrorResponse<string>>((resolve) => {\n const checkWindowClosed = setInterval(() => {\n let accessToken: string | null = null\n let code: string | null = null\n let error: string | null = null\n let errorDescription: string | null = null\n\n try {\n const urlParams = new URL(authWindow.location.href).searchParams\n const tokenName = flow['x-tokenName'] || 'access_token'\n accessToken = urlParams.get(tokenName)\n code = urlParams.get('code')\n\n error = urlParams.get('error')\n errorDescription = urlParams.get('error_description')\n\n // We may get the properties in a hash\n const hashParams = new URLSearchParams(authWindow.location.href.split('#')[1])\n accessToken ||= hashParams.get(tokenName)\n code ||= hashParams.get('code')\n error ||= hashParams.get('error')\n errorDescription ||= hashParams.get('error_description')\n } catch (_e) {\n // Ignore CORS error from popup\n }\n\n // The window has closed OR we have what we are looking for so we stop polling\n if (authWindow.closed || accessToken || code || error) {\n clearInterval(checkWindowClosed)\n authWindow.close()\n\n if (error) {\n resolve([new Error(`OAuth error: ${error}${errorDescription ? ` (${errorDescription})` : ''}`), null])\n }\n\n // Implicit Flow\n else if (accessToken) {\n // State is a hash fragment and cannot be found through search params\n const _state = authWindow.location.href.match(/state=([^&]*)/)?.[1]\n\n if (_state === state) {\n resolve([null, accessToken])\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n\n // Authorization Code Server Flow\n else if (code) {\n const _state = new URL(authWindow.location.href).searchParams.get('state')\n\n if (_state === state) {\n // biome-ignore lint/nursery/noFloatingPromises: output of authorizeServers must be returned\n authorizeServers(\n flow as NonImplicitFlow,\n scopes,\n {\n code,\n pkce,\n proxyUrl,\n },\n activeServer,\n ).then(resolve)\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n // User closed window without authorizing\n else {\n clearInterval(checkWindowClosed)\n resolve([new Error('Window was closed without granting authorization'), null])\n }\n }\n }, 200)\n })\n }\n return [new Error('Failed to open auth window'), null]\n } catch (_) {\n return [new Error('Failed to authorize oauth2 flow'), null]\n }\n}\n\n/**\n * Makes the BE authorization call to grab the token server to server\n * Used for clientCredentials and authorizationCode\n */\nexport const authorizeServers = async (\n flow: NonImplicitFlow,\n scopes: string,\n {\n code,\n pkce,\n proxyUrl,\n }: {\n code?: string\n pkce?: PKCEState | null\n proxyUrl?: string | undefined\n } = {},\n activeServer: Server | undefined,\n): Promise<ErrorResponse<string>> => {\n if (!flow) {\n return [new Error('OAuth2 flow was not defined'), null]\n }\n\n const formData = new URLSearchParams()\n formData.set('client_id', flow['x-scalar-client-id'])\n\n // Only client credentials and password flows support scopes in the token request\n if (scopes && (flow.type === 'clientCredentials' || flow.type === 'password')) {\n formData.set('scope', scopes)\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to body\n const shouldAddSecretToBody =\n flow.clientSecret && (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'body')\n\n if (shouldAddSecretToBody) {\n formData.set('client_secret', flow.clientSecret)\n }\n if ('x-scalar-redirect-uri' in flow && flow['x-scalar-redirect-uri']) {\n formData.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n // Authorization Code\n if (code) {\n formData.set('code', code)\n formData.set('grant_type', 'authorization_code')\n\n // PKCE\n if (pkce) {\n formData.set('code_verifier', pkce.codeVerifier)\n }\n }\n // Password\n else if (flow.type === 'password') {\n formData.set('grant_type', 'password')\n formData.set('username', flow.username)\n formData.set('password', flow.password)\n }\n // Client Credentials\n else {\n formData.set('grant_type', 'client_credentials')\n }\n\n // Additional request body parameters\n if (flow['x-scalar-security-body']) {\n Object.entries(flow['x-scalar-security-body']).forEach(([key, value]) => {\n if (value) {\n formData.set(key, value)\n }\n })\n }\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to header\n const shouldAddSecretToHeader =\n flow.clientSecret &&\n (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'header')\n\n // Add client id + secret to headers\n if (shouldAddSecretToHeader) {\n headers.Authorization = `Basic ${encode(`${flow['x-scalar-client-id']}:${flow.clientSecret}`)}`\n }\n\n // Check if we should use the proxy\n const tokenUrl = makeUrlAbsolute(flow.tokenUrl, getActiveServerBase(activeServer))\n const url = shouldUseProxy(proxyUrl, tokenUrl)\n ? `${proxyUrl}?${new URLSearchParams([['scalar_url', tokenUrl]]).toString()}`\n : tokenUrl\n\n // Make the call\n const resp = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n const responseData = await resp.json()\n\n // Use custom token name if specified, otherwise default to access_token\n const tokenName = flow['x-tokenName'] || 'access_token'\n const accessToken = responseData[tokenName]\n\n return [null, accessToken]\n } catch {\n return [new Error('Failed to get an access token. Please check your credentials.'), null]\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"oauth2.js","names":[],"sources":["../../../../src/views/Request/libs/oauth2.ts"],"sourcesContent":["import { replaceVariables } from '@scalar/helpers/regex/replace-variables'\nimport { isRelativePath } from '@scalar/helpers/url/is-relative-path'\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { shouldUseProxy } from '@scalar/helpers/url/redirect-to-proxy'\nimport type { Oauth2Flow, Server } from '@scalar/oas-utils/entities/spec'\nimport { encode, fromUint8Array } from 'js-base64'\n\nimport type { ErrorResponse } from '@/libs/errors'\n\n/** Oauth2 security schemes which are not implicit */\ntype NonImplicitFlow = Exclude<Oauth2Flow, { type: 'implicit' }>\n\ntype PKCEState = {\n codeVerifier: string\n codeChallenge: string\n codeChallengeMethod: string\n}\n\n/**\n * Interpolates server URL template variables (e.g. `https://{env}.example.com`)\n * using the user-set `value` when available, falling back to the OpenAPI `default`.\n * This is needed so OAuth flows that use the server URL as a base resolve correctly\n * when the spec defines server variables.\n */\nexport const getInterpolatedServerUrl = (activeServer?: Server): string | undefined => {\n if (!activeServer?.url) return undefined\n\n const serverVariables = Object.entries(activeServer.variables ?? {}).reduce(\n (acc, [name, variable]) => {\n // User-set value takes priority over the OpenAPI default\n const value = variable.value || variable.default\n if (value) acc[name] = value\n return acc\n },\n {} as Record<string, string>,\n )\n\n return replaceVariables(activeServer.url, serverVariables)\n}\n\nconst getActiveServerBase = (activeServer?: Server) => {\n const serverUrl = getInterpolatedServerUrl(activeServer)\n\n if (!serverUrl) {\n return {}\n }\n\n if (isRelativePath(serverUrl)) {\n return typeof window === 'undefined' ? {} : { basePath: serverUrl }\n }\n\n return { baseUrl: serverUrl }\n}\n\n/**\n * Generates a random string for PKCE code verifier\n *\n * @see https://www.rfc-editor.org/rfc/rfc7636#page-8\n */\nconst generateCodeVerifier = (): string => {\n // Generate 32 random bytes\n const buffer = new Uint8Array(32)\n crypto.getRandomValues(buffer)\n\n // Base64URL encode the bytes\n return fromUint8Array(buffer, true)\n}\n\n/**\n * Creates a code challenge from the code verifier\n */\nexport const generateCodeChallenge = async (verifier: string, encoding: 'SHA-256' | 'plain'): Promise<string> => {\n if (encoding === 'plain') {\n return verifier\n }\n\n // If crypto.subtle.digest is not a function, we cannot use SHA-256\n if (typeof crypto?.subtle?.digest !== 'function') {\n console.warn('SHA-256 is only supported when using https, using a plain text code challenge instead.')\n return verifier\n }\n\n // ASCII encoding is just taking the lower 8 bits of each character\n const encoder = new TextEncoder()\n const data = encoder.encode(verifier)\n const digest = await crypto.subtle.digest('SHA-256', data)\n\n // Base64URL encode the bytes\n return fromUint8Array(new Uint8Array(digest), true)\n}\n\n/**\n * Authorize oauth2 flow\n *\n * @returns the accessToken\n */\nexport const authorizeOauth2 = async (\n flow: Oauth2Flow,\n /** We use the active server to set a base for relative redirect uris */\n activeServer: Server,\n /** If we want to use the proxy */\n proxyUrl?: string,\n): Promise<ErrorResponse<string>> => {\n try {\n if (!flow) {\n return [new Error('Flow not found'), null]\n }\n\n const scopes = flow.selectedScopes.join(' ')\n\n // Client Credentials or Password Flow\n if (flow.type === 'clientCredentials' || flow.type === 'password') {\n return authorizeServers(\n flow,\n scopes,\n {\n proxyUrl,\n },\n activeServer,\n )\n }\n\n // OAuth2 flows with a login popup\n\n // Generate a random state string with the length of 8 characters\n const state = (Math.random() + 1).toString(36).substring(2, 10)\n const authorizationUrl = makeUrlAbsolute(flow.authorizationUrl, getActiveServerBase(activeServer))\n const url = new URL(authorizationUrl)\n\n /** Special PKCE state */\n let pkce: PKCEState | null = null\n\n // Params unique to the flows\n if (flow.type === 'implicit') {\n url.searchParams.set('response_type', 'token')\n }\n\n // Authorization Code Flow\n else if (flow.type === 'authorizationCode') {\n url.searchParams.set('response_type', 'code')\n\n // PKCE\n if (flow['x-usePkce'] !== 'no') {\n const codeVerifier = generateCodeVerifier()\n const codeChallenge = await generateCodeChallenge(codeVerifier, flow['x-usePkce'])\n\n // Set state for later verification\n pkce = {\n codeVerifier,\n codeChallenge,\n codeChallengeMethod: flow['x-usePkce'] === 'SHA-256' ? 'S256' : 'plain',\n }\n\n // Set the code challenge and method on the url\n url.searchParams.set('code_challenge', codeChallenge)\n url.searchParams.set('code_challenge_method', pkce.codeChallengeMethod)\n }\n }\n\n // Handle relative redirect uris\n if (flow['x-scalar-redirect-uri'].startsWith('/')) {\n const baseUrl = getInterpolatedServerUrl(activeServer) || window.location.origin + window.location.pathname\n const redirectUri = makeUrlAbsolute(flow['x-scalar-redirect-uri'], { baseUrl: baseUrl })\n\n url.searchParams.set('redirect_uri', redirectUri)\n } else {\n url.searchParams.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n if (flow['x-scalar-security-query']) {\n Object.keys(flow['x-scalar-security-query']).forEach((key: string): void => {\n const value = flow['x-scalar-security-query']?.[key]\n if (!value) {\n return\n }\n url.searchParams.set(key, value)\n })\n }\n\n // Common to all flows\n url.searchParams.set('client_id', flow['x-scalar-client-id'])\n url.searchParams.set('state', state)\n if (scopes) {\n url.searchParams.set('scope', scopes)\n }\n\n const windowFeatures = 'left=100,top=100,width=800,height=600'\n const authWindow = window.open(url, 'openAuth2Window', windowFeatures)\n\n // Open up a window and poll until closed or we have the data we want\n if (authWindow) {\n // We need to return a promise here due to the setInterval\n return new Promise<ErrorResponse<string>>((resolve) => {\n const checkWindowClosed = setInterval(() => {\n let accessToken: string | null = null\n let code: string | null = null\n let error: string | null = null\n let errorDescription: string | null = null\n\n try {\n const urlParams = new URL(authWindow.location.href).searchParams\n const tokenName = flow['x-tokenName'] || 'access_token'\n accessToken = urlParams.get(tokenName)\n code = urlParams.get('code')\n\n error = urlParams.get('error')\n errorDescription = urlParams.get('error_description')\n\n // We may get the properties in a hash\n const hashParams = new URLSearchParams(authWindow.location.href.split('#')[1])\n accessToken ||= hashParams.get(tokenName)\n code ||= hashParams.get('code')\n error ||= hashParams.get('error')\n errorDescription ||= hashParams.get('error_description')\n } catch (_e) {\n // Ignore CORS error from popup\n }\n\n // The window has closed OR we have what we are looking for so we stop polling\n if (authWindow.closed || accessToken || code || error) {\n clearInterval(checkWindowClosed)\n authWindow.close()\n\n if (error) {\n resolve([new Error(`OAuth error: ${error}${errorDescription ? ` (${errorDescription})` : ''}`), null])\n }\n\n // Implicit Flow\n else if (accessToken) {\n // State is a hash fragment and cannot be found through search params\n const _state = authWindow.location.href.match(/state=([^&]*)/)?.[1]\n\n if (_state === state) {\n resolve([null, accessToken])\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n\n // Authorization Code Server Flow\n else if (code) {\n const _state = new URL(authWindow.location.href).searchParams.get('state')\n\n if (_state === state) {\n // biome-ignore lint/nursery/noFloatingPromises: output of authorizeServers must be returned\n authorizeServers(\n flow as NonImplicitFlow,\n scopes,\n {\n code,\n pkce,\n proxyUrl,\n },\n activeServer,\n ).then(resolve)\n } else {\n resolve([new Error('State mismatch'), null])\n }\n }\n // User closed window without authorizing\n else {\n clearInterval(checkWindowClosed)\n resolve([new Error('Window was closed without granting authorization'), null])\n }\n }\n }, 200)\n })\n }\n return [new Error('Failed to open auth window'), null]\n } catch (_) {\n return [new Error('Failed to authorize oauth2 flow'), null]\n }\n}\n\n/**\n * Makes the BE authorization call to grab the token server to server\n * Used for clientCredentials and authorizationCode\n */\nexport const authorizeServers = async (\n flow: NonImplicitFlow,\n scopes: string,\n {\n code,\n pkce,\n proxyUrl,\n }: {\n code?: string\n pkce?: PKCEState | null\n proxyUrl?: string | undefined\n } = {},\n activeServer: Server | undefined,\n): Promise<ErrorResponse<string>> => {\n if (!flow) {\n return [new Error('OAuth2 flow was not defined'), null]\n }\n\n const formData = new URLSearchParams()\n formData.set('client_id', flow['x-scalar-client-id'])\n\n // Only client credentials and password flows support scopes in the token request\n if (scopes && (flow.type === 'clientCredentials' || flow.type === 'password')) {\n formData.set('scope', scopes)\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to body\n const shouldAddSecretToBody =\n flow.clientSecret && (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'body')\n\n if (shouldAddSecretToBody) {\n formData.set('client_secret', flow.clientSecret)\n }\n if ('x-scalar-redirect-uri' in flow && flow['x-scalar-redirect-uri']) {\n formData.set('redirect_uri', flow['x-scalar-redirect-uri'])\n }\n\n // Authorization Code\n if (code) {\n formData.set('code', code)\n formData.set('grant_type', 'authorization_code')\n\n // PKCE\n if (pkce) {\n formData.set('code_verifier', pkce.codeVerifier)\n }\n }\n // Password\n else if (flow.type === 'password') {\n formData.set('grant_type', 'password')\n formData.set('username', flow.username)\n formData.set('password', flow.password)\n }\n // Client Credentials\n else {\n formData.set('grant_type', 'client_credentials')\n }\n\n // Additional request body parameters\n if (flow['x-scalar-security-body']) {\n Object.entries(flow['x-scalar-security-body']).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n formData.set(key, String(value))\n }\n })\n }\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n }\n\n // Only add the secret if a credentials location is not specified (backwards compatibility) or is set to header\n const shouldAddSecretToHeader =\n flow.clientSecret &&\n (!flow['x-scalar-credentials-location'] || flow['x-scalar-credentials-location'] === 'header')\n\n // Add client id + secret to headers\n if (shouldAddSecretToHeader) {\n headers.Authorization = `Basic ${encode(`${flow['x-scalar-client-id']}:${flow.clientSecret}`)}`\n }\n\n // Check if we should use the proxy\n const tokenUrl = makeUrlAbsolute(flow.tokenUrl, getActiveServerBase(activeServer))\n const url = shouldUseProxy(proxyUrl, tokenUrl)\n ? `${proxyUrl}?${new URLSearchParams([['scalar_url', tokenUrl]]).toString()}`\n : tokenUrl\n\n // Make the call\n const resp = await fetch(url, {\n method: 'POST',\n headers,\n body: formData,\n })\n const responseData = await resp.json()\n\n // Use custom token name if specified, otherwise default to access_token\n const tokenName = flow['x-tokenName'] || 'access_token'\n const accessToken = responseData[tokenName]\n\n return [null, accessToken]\n } catch {\n return [new Error('Failed to get an access token. Please check your credentials.'), null]\n }\n}\n"],"mappings":"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"}