@scalar/api-client 3.8.2 → 3.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/components/HttpMethod/HttpMethod.vue.d.ts.map +1 -1
  3. package/dist/components/HttpMethod/HttpMethod.vue.js +1 -1
  4. package/dist/components/HttpMethod/HttpMethod.vue.js.map +1 -1
  5. package/dist/components/HttpMethod/HttpMethod.vue.script.js +2 -1
  6. package/dist/components/HttpMethod/HttpMethod.vue.script.js.map +1 -1
  7. package/dist/components/SectionFilter.vue.js +1 -1
  8. package/dist/components/SectionFilter.vue.js.map +1 -1
  9. package/dist/components/SectionFilter.vue.script.js +1 -1
  10. package/dist/components/SectionFilter.vue.script.js.map +1 -1
  11. package/dist/components/Server/ServerVariablesSelect.vue.js.map +1 -1
  12. package/dist/components/Server/ServerVariablesSelect.vue.script.js +2 -1
  13. package/dist/components/Server/ServerVariablesSelect.vue.script.js.map +1 -1
  14. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.js.map +1 -1
  15. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js +1 -1
  16. package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js.map +1 -1
  17. package/dist/components/ViewLayout/ViewLayout.vue.js.map +1 -1
  18. package/dist/components/ViewLayout/ViewLayout.vue.script.js +1 -1
  19. package/dist/components/ViewLayout/ViewLayout.vue.script.js.map +1 -1
  20. package/dist/components/ViewLayout/ViewLayoutSection.vue.js.map +1 -1
  21. package/dist/components/ViewLayout/ViewLayoutSection.vue.script.js +1 -1
  22. package/dist/components/ViewLayout/ViewLayoutSection.vue.script.js.map +1 -1
  23. package/dist/style.css +105 -105
  24. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
  25. package/dist/v2/blocks/operation-block/components/Header.vue.js +1 -1
  26. package/dist/v2/blocks/operation-block/components/Header.vue.js.map +1 -1
  27. package/dist/v2/blocks/operation-block/components/Header.vue.script.js +6 -1
  28. package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -1
  29. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.d.ts +4 -0
  30. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.d.ts.map +1 -1
  31. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js +1 -1
  32. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js.map +1 -1
  33. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js +7 -1
  34. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js.map +1 -1
  35. package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.js.map +1 -1
  36. package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.script.js +2 -1
  37. package/dist/v2/blocks/operation-code-sample/components/ExamplePicker.vue.script.js.map +1 -1
  38. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js +1 -1
  39. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js.map +1 -1
  40. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js +5 -1
  41. package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js.map +1 -1
  42. package/dist/v2/blocks/operation-code-sample/helpers/filter-clients-by-query.js.map +1 -1
  43. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.d.ts.map +1 -1
  44. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js +171 -15
  45. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.js.map +1 -1
  46. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.d.ts.map +1 -1
  47. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js +14 -1
  48. package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.js.map +1 -1
  49. package/dist/v2/blocks/operation-code-sample/types.d.ts +1 -1
  50. package/dist/v2/blocks/operation-code-sample/types.d.ts.map +1 -1
  51. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  52. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  53. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +1 -1
  54. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  55. package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
  56. package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
  57. package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -1
  58. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +3 -1
  59. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
  60. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts.map +1 -1
  61. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js.map +1 -1
  62. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +4 -1
  63. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
  64. package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts.map +1 -1
  65. package/dist/v2/blocks/request-block/components/RequestParams.vue.js.map +1 -1
  66. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js +2 -1
  67. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js.map +1 -1
  68. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
  69. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
  70. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +3 -1
  71. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
  72. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.d.ts.map +1 -1
  73. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.js.map +1 -1
  74. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js +2 -1
  75. package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js.map +1 -1
  76. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts.map +1 -1
  77. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +74 -3
  78. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js.map +1 -1
  79. package/dist/v2/blocks/response-block/ResponseBlock.vue.js +1 -1
  80. package/dist/v2/blocks/response-block/ResponseBlock.vue.js.map +1 -1
  81. package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js +1 -1
  82. package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js.map +1 -1
  83. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.js.map +1 -1
  84. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js +1 -1
  85. package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js.map +1 -1
  86. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.d.ts.map +1 -1
  87. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js +1 -1
  88. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js.map +1 -1
  89. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js +54 -12
  90. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js.map +1 -1
  91. package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.js +1 -1
  92. package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.js.map +1 -1
  93. package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.script.js +1 -1
  94. package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.script.js.map +1 -1
  95. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.d.ts.map +1 -1
  96. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.js.map +1 -1
  97. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js +2 -1
  98. package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js.map +1 -1
  99. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.js.map +1 -1
  100. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js +1 -1
  101. package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js.map +1 -1
  102. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js +1 -1
  103. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js.map +1 -1
  104. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js +1 -1
  105. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js.map +1 -1
  106. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.d.ts.map +1 -1
  107. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js +1 -1
  108. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js.map +1 -1
  109. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js +2 -1
  110. package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js.map +1 -1
  111. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  112. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
  113. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -1
  114. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +19 -4
  115. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
  116. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +1 -1
  117. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js.map +1 -1
  118. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js +2 -1
  119. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
  120. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.js.map +1 -1
  121. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js +3 -1
  122. package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js.map +1 -1
  123. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +1 -1
  124. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts.map +1 -1
  125. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js.map +1 -1
  126. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +5 -1
  127. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  128. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.d.ts.map +1 -1
  129. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.js.map +1 -1
  130. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js +2 -1
  131. package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js.map +1 -1
  132. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  133. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
  134. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +2 -1
  135. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
  136. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts +1 -1
  137. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts.map +1 -1
  138. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.js.map +1 -1
  139. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js +1 -1
  140. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js.map +1 -1
  141. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.d.ts.map +1 -1
  142. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.js.map +1 -1
  143. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js +5 -1
  144. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js.map +1 -1
  145. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.d.ts.map +1 -1
  146. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.js.map +1 -1
  147. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js +2 -1
  148. package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js.map +1 -1
  149. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
  150. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js +1 -1
  151. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
  152. package/dist/v2/components/code-input/PillTooltipHost.vue.js.map +1 -1
  153. package/dist/v2/components/code-input/PillTooltipHost.vue.script.js +1 -1
  154. package/dist/v2/components/code-input/PillTooltipHost.vue.script.js.map +1 -1
  155. package/dist/v2/components/data-table/DataTable.vue.js.map +1 -1
  156. package/dist/v2/components/data-table/DataTable.vue.script.js +1 -1
  157. package/dist/v2/components/data-table/DataTable.vue.script.js.map +1 -1
  158. package/dist/v2/components/data-table/DataTableCell.vue.js.map +1 -1
  159. package/dist/v2/components/data-table/DataTableCell.vue.script.js +1 -1
  160. package/dist/v2/components/data-table/DataTableCell.vue.script.js.map +1 -1
  161. package/dist/v2/components/data-table/DataTableCheckbox.vue.d.ts.map +1 -1
  162. package/dist/v2/components/data-table/DataTableCheckbox.vue.js.map +1 -1
  163. package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js +2 -1
  164. package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js.map +1 -1
  165. package/dist/v2/components/data-table/DataTableHeader.vue.js.map +1 -1
  166. package/dist/v2/components/data-table/DataTableHeader.vue.script.js +1 -1
  167. package/dist/v2/components/data-table/DataTableHeader.vue.script.js.map +1 -1
  168. package/dist/v2/components/data-table/DataTableInput.vue.js +1 -1
  169. package/dist/v2/components/data-table/DataTableInput.vue.js.map +1 -1
  170. package/dist/v2/components/data-table/DataTableInput.vue.script.js +1 -1
  171. package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -1
  172. package/dist/v2/components/data-table/DataTableInputSelect.vue.js.map +1 -1
  173. package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js +4 -1
  174. package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js.map +1 -1
  175. package/dist/v2/components/forms/ConfirmationForm.vue.js.map +1 -1
  176. package/dist/v2/components/forms/ConfirmationForm.vue.script.js +1 -1
  177. package/dist/v2/components/forms/ConfirmationForm.vue.script.js.map +1 -1
  178. package/dist/v2/components/layout/CollapsibleSection.vue.js.map +1 -1
  179. package/dist/v2/components/layout/CollapsibleSection.vue.script.js +1 -1
  180. package/dist/v2/components/layout/CollapsibleSection.vue.script.js.map +1 -1
  181. package/dist/v2/components/modals/ModalClientContainer.vue.d.ts +1 -1
  182. package/dist/v2/components/modals/ModalClientContainer.vue.d.ts.map +1 -1
  183. package/dist/v2/components/modals/ModalClientContainer.vue.js +1 -1
  184. package/dist/v2/components/modals/ModalClientContainer.vue.js.map +1 -1
  185. package/dist/v2/components/modals/ModalClientContainer.vue.script.js +2 -1
  186. package/dist/v2/components/modals/ModalClientContainer.vue.script.js.map +1 -1
  187. package/dist/v2/components/server/ServerDropdown.vue.d.ts.map +1 -1
  188. package/dist/v2/components/server/ServerDropdown.vue.js.map +1 -1
  189. package/dist/v2/components/server/ServerDropdown.vue.script.js +3 -1
  190. package/dist/v2/components/server/ServerDropdown.vue.script.js.map +1 -1
  191. package/dist/v2/components/server/ServerDropdownItem.vue.d.ts.map +1 -1
  192. package/dist/v2/components/server/ServerDropdownItem.vue.js +1 -1
  193. package/dist/v2/components/server/ServerDropdownItem.vue.js.map +1 -1
  194. package/dist/v2/components/server/ServerDropdownItem.vue.script.js +2 -1
  195. package/dist/v2/components/server/ServerDropdownItem.vue.script.js.map +1 -1
  196. package/dist/v2/components/sidebar/Sidebar.vue.d.ts +1 -1
  197. package/dist/v2/components/sidebar/Sidebar.vue.d.ts.map +1 -1
  198. package/dist/v2/components/sidebar/Sidebar.vue.js.map +1 -1
  199. package/dist/v2/components/sidebar/Sidebar.vue.script.js +2 -1
  200. package/dist/v2/components/sidebar/Sidebar.vue.script.js.map +1 -1
  201. package/dist/v2/components/sidebar/SidebarMenu.vue.d.ts +1 -1
  202. package/dist/v2/components/sidebar/SidebarMenu.vue.d.ts.map +1 -1
  203. package/dist/v2/components/sidebar/SidebarMenu.vue.js.map +1 -1
  204. package/dist/v2/components/sidebar/SidebarMenu.vue.script.js +1 -1
  205. package/dist/v2/components/sidebar/SidebarMenu.vue.script.js.map +1 -1
  206. package/dist/v2/constants.js +1 -1
  207. package/dist/v2/features/command-palette/components/CommandActionForm.vue.d.ts +1 -1
  208. package/dist/v2/features/command-palette/components/CommandActionForm.vue.d.ts.map +1 -1
  209. package/dist/v2/features/command-palette/components/CommandActionForm.vue.js.map +1 -1
  210. package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js +2 -1
  211. package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js.map +1 -1
  212. package/dist/v2/features/environments/EnvironmentsList.vue.d.ts.map +1 -1
  213. package/dist/v2/features/environments/EnvironmentsList.vue.js.map +1 -1
  214. package/dist/v2/features/environments/EnvironmentsList.vue.script.js +2 -1
  215. package/dist/v2/features/environments/EnvironmentsList.vue.script.js.map +1 -1
  216. package/dist/v2/features/environments/components/Environment.vue.js.map +1 -1
  217. package/dist/v2/features/environments/components/Environment.vue.script.js +1 -1
  218. package/dist/v2/features/environments/components/Environment.vue.script.js.map +1 -1
  219. package/dist/v2/features/environments/components/EnvironmentColors.vue.js.map +1 -1
  220. package/dist/v2/features/environments/components/EnvironmentColors.vue.script.js +1 -1
  221. package/dist/v2/features/environments/components/EnvironmentColors.vue.script.js.map +1 -1
  222. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.d.ts +1 -1
  223. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.d.ts.map +1 -1
  224. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.js.map +1 -1
  225. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js +1 -1
  226. package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js.map +1 -1
  227. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.d.ts +1 -1
  228. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.d.ts.map +1 -1
  229. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.js.map +1 -1
  230. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js +2 -1
  231. package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js.map +1 -1
  232. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
  233. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -1
  234. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +2 -1
  235. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
  236. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js +1 -1
  237. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js.map +1 -1
  238. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js +1 -1
  239. package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js.map +1 -1
  240. package/dist/v2/features/modal/Modal.vue.d.ts +1 -1
  241. package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
  242. package/dist/v2/features/modal/Modal.vue.js.map +1 -1
  243. package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
  244. package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts +1 -1
  245. package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts.map +1 -1
  246. package/dist/v2/features/modal/helpers/create-api-client-modal.js +1 -1
  247. package/dist/v2/features/modal/helpers/create-api-client-modal.js.map +1 -1
  248. package/dist/v2/features/modal/modal-events.d.ts +1 -1
  249. package/dist/v2/features/modal/modal-events.d.ts.map +1 -1
  250. package/dist/v2/features/modal/modal-events.js.map +1 -1
  251. package/dist/v2/features/search/components/DocumentSearchModal.vue.d.ts +1 -1
  252. package/dist/v2/features/search/components/DocumentSearchModal.vue.d.ts.map +1 -1
  253. package/dist/v2/features/search/components/DocumentSearchModal.vue.js +1 -1
  254. package/dist/v2/features/search/components/DocumentSearchModal.vue.js.map +1 -1
  255. package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js +3 -1
  256. package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js.map +1 -1
  257. package/dist/v2/features/search/components/SearchResult.vue.js.map +1 -1
  258. package/dist/v2/features/search/components/SearchResult.vue.script.js +1 -1
  259. package/dist/v2/features/search/components/SearchResult.vue.script.js.map +1 -1
  260. package/dist/vue-styles.css +105 -105
  261. package/package.json +10 -10
@@ -1,32 +1,170 @@
1
1
  import { getResolvedRefDeep } from "../get-resolved-ref-deep.js";
2
- import { getExample, getExampleFromSchema } from "@scalar/workspace-store/request-example";
2
+ import { getExample, getExampleFromSchema, serializeDeepObjectStyle, serializeFormStyle, serializePipeDelimitedStyle, serializeSpaceDelimitedStyle } from "@scalar/workspace-store/request-example";
3
3
  import { getResolvedRef } from "@scalar/workspace-store/helpers/get-resolved-ref";
4
4
  import { json2xml } from "@scalar/helpers/file/json2xml";
5
5
  import { unpackProxyObject } from "@scalar/workspace-store/helpers/unpack-proxy";
6
6
  //#region src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.ts
7
7
  /**
8
- * Converts an object to an array of form parameters
9
- * @param obj - The object to convert
10
- * @returns Array of form parameters with name and value properties
8
+ * Stringify a value emitted by `serializeFormStyle` into a HAR param value.
9
+ *
10
+ * Form-style serialization only addresses one level of nesting per RFC6570;
11
+ * deeper structures (an object or array still sitting in `entry.value`) are
12
+ * spec-undefined. JSON-stringify them so authors get readable output instead
13
+ * of `String(value)` returning `"[object Object]"`. Primitives pass through
14
+ * `String()` to preserve the existing wire shape (e.g. `true` → `"true"`).
11
15
  */
12
- var objectToFormParams = (obj, encoding, parentKey) => {
16
+ var stringifyEntryValue = (value) => value !== null && typeof value === "object" ? JSON.stringify(value) : String(value);
17
+ /**
18
+ * Converts a form-data body into HAR `Param[]` entries for `multipart/form-data`
19
+ * and `application/x-www-form-urlencoded` requests.
20
+ *
21
+ * Per OpenAPI 3.1.x Encoding Object, each property's serialization is governed
22
+ * by an optional Encoding entry. When `style` / `explode` / `allowReserved` is
23
+ * set, the value is serialized RFC6570-style and `contentType` is ignored.
24
+ * When only `contentType` is set, the property becomes a single part with that
25
+ * type. Otherwise spec defaults apply (object → `application/json` for multipart,
26
+ * primitives → `text/plain`).
27
+ *
28
+ * @param obj - The form-data payload, either an object keyed by property name
29
+ * or a HAR-style `{ name, value, isDisabled }[]` array.
30
+ * @param encoding - The `encoding` map from the Media Type Object, if any.
31
+ * Used only at the top level (`parentKey` undefined).
32
+ * @param parentKey - When set, we are flattening a nested object inside another
33
+ * property; encoding is ignored and keys are joined with `.` (legacy default).
34
+ * @param isMultipart - True for `multipart/form-data`. Gates the spec defaults
35
+ * for object/array properties that should become a single `application/json`
36
+ * part. Urlencoded bodies skip those branches and fall through to flattening.
37
+ */
38
+ var objectToFormParams = (obj, encoding, parentKey, isMultipart = false) => {
13
39
  const params = [];
14
40
  /** Ensure we do not include disabled items */
15
- const entries = Array.isArray(obj) ? obj.filter((item) => !item.isDisabled).map((item) => [item.name, item.value]) : Object.entries(obj);
41
+ const entries = Array.isArray(obj) ? obj.filter((item) => !item.isDisabled).map((item) => [String(item.name), item.value]) : Object.entries(obj);
16
42
  for (const [key, value] of entries) {
17
43
  if (value === void 0 || value === null) continue;
18
- const partContentType = parentKey ? void 0 : encoding?.[key]?.contentType;
19
- if (value instanceof File) {
44
+ const partEncoding = parentKey ? void 0 : encoding?.[key];
45
+ /**
46
+ * Per OpenAPI 3.1.1: when style, explode, or allowReserved is explicitly set on the
47
+ * encoding entry, contentType (implicit or explicit) is ignored and the value is
48
+ * serialized as if it were a query-style parameter.
49
+ */
50
+ const hasFormStyle = partEncoding && (partEncoding.style !== void 0 || partEncoding.explode !== void 0 || partEncoding.allowReserved !== void 0);
51
+ /**
52
+ * Per OAS 3.1.x Encoding Object: `contentType` SHALL be ignored if the request body
53
+ * media type is not a multipart. For `application/x-www-form-urlencoded` we still
54
+ * honor `style`/`explode`/`allowReserved` (handled above), but a `contentType`-only
55
+ * entry has no effect — values fall through to the dotted-key flattening default.
56
+ */
57
+ const explicitContentType = hasFormStyle || !isMultipart ? void 0 : partEncoding?.contentType;
58
+ /**
59
+ * Per OpenAPI 3.1.x Encoding Object: when style/explode/allowReserved is set on a
60
+ * `multipart/form-data` or `application/x-www-form-urlencoded` part, the value is
61
+ * serialized as if it were a query-style parameter and contentType is ignored. For
62
+ * multipart the query delimiters are stripped per §Appendix C; HAR represents both
63
+ * content types via `PostData.params`, so the same shape works for both.
64
+ *
65
+ * Primitives skip this branch and fall through to the String(value) path below since
66
+ * style is a no-op for primitives. Files skip too, as do arrays containing Files —
67
+ * RFC6570 expansion of binary data is undefined per §Appendix C, and the array branch
68
+ * below already emits one `@filename` part per File.
69
+ *
70
+ * allowReserved only affects percent-encoding, which is a no-op at the HAR layer per
71
+ * OAS 3.1.2 ("`allowReserved` has no effect" for multipart); its presence still opts
72
+ * into this branch per spec.
73
+ */
74
+ if (!parentKey && hasFormStyle && typeof value === "object" && value !== null && !(value instanceof File) && !(Array.isArray(value) && value.some((item) => item instanceof File))) {
75
+ const unpacked = unpackProxyObject(value);
76
+ /**
77
+ * OAS 3.1.x Encoding Object: encoding follows query-parameter defaults — when no
78
+ * `style` is set, the default is "form"; when no `explode` is set, the default is
79
+ * `true` for "form" and `false` for every other style.
80
+ */
81
+ const style = partEncoding?.style ?? "form";
82
+ const explode = partEncoding?.explode ?? style === "form";
83
+ if (style === "deepObject") if (Array.isArray(unpacked)) {
84
+ /**
85
+ * OAS 3.1.1 marks deepObject-on-array as n/a; fall back to the form/explode:true
86
+ * shape so the array still reaches the wire instead of being silently dropped.
87
+ */
88
+ const serialized = serializeFormStyle(unpacked, true);
89
+ if (Array.isArray(serialized)) for (const entry of serialized) params.push({
90
+ name: entry.key || key,
91
+ value: stringifyEntryValue(entry.value)
92
+ });
93
+ else params.push({
94
+ name: key,
95
+ value: String(serialized)
96
+ });
97
+ } else
98
+ /**
99
+ * explode:false with deepObject is undefined per spec; we invoke the serializer
100
+ * either way so authors get useful output instead of nothing.
101
+ */
102
+ for (const entry of serializeDeepObjectStyle(key, unpacked)) params.push({
103
+ name: entry.key,
104
+ value: String(entry.value)
105
+ });
106
+ else if (style === "spaceDelimited") params.push({
107
+ name: key,
108
+ value: String(serializeSpaceDelimitedStyle(unpacked))
109
+ });
110
+ else if (style === "pipeDelimited") params.push({
111
+ name: key,
112
+ value: String(serializePipeDelimitedStyle(unpacked))
113
+ });
114
+ else {
115
+ const serialized = serializeFormStyle(unpacked, explode);
116
+ if (Array.isArray(serialized)) for (const entry of serialized)
117
+ /**
118
+ * Arrays: entry.key === '' → fall back to the outer name.
119
+ * Objects: entry.key is the inner property name (spec strips the outer name).
120
+ *
121
+ * Nested objects/arrays inside entry.value are spec-undefined (RFC6570 form-style
122
+ * only addresses one level of nesting); JSON-stringify them instead of letting
123
+ * String() emit "[object Object]". The escape hatch for cleaner output is
124
+ * style: deepObject + explode: true.
125
+ */
126
+ params.push({
127
+ name: entry.key || key,
128
+ value: stringifyEntryValue(entry.value)
129
+ });
130
+ else params.push({
131
+ name: key,
132
+ value: String(serialized)
133
+ });
134
+ }
135
+ } else if (value instanceof File) {
136
+ /**
137
+ * File values render as `@filename` references, the conventional cURL syntax for an
138
+ * attached file. Picked up by snippet renderers downstream (e.g. `--form 'x=@file.png'`).
139
+ */
20
140
  const file = unpackProxyObject(value);
21
141
  params.push({
22
142
  name: key,
23
143
  value: `@${file.name}`,
24
- ...partContentType ? { contentType: partContentType } : {}
144
+ ...explicitContentType ? { contentType: explicitContentType } : {}
25
145
  });
26
- } else if (partContentType && typeof value === "object") params.push({
146
+ } else if (explicitContentType && typeof value === "object")
147
+ /**
148
+ * Per OAS 3.1.x Encoding Object: an explicit `encoding[key].contentType` on a
149
+ * complex value overrides the default and emits a single part containing the value
150
+ * JSON-stringified into that media type. Only reachable when style/explode/allowReserved
151
+ * are unset (otherwise contentType is ignored — see the style branch above).
152
+ */
153
+ params.push({
27
154
  name: key,
28
155
  value: JSON.stringify(unpackProxyObject(value)),
29
- contentType: partContentType
156
+ contentType: explicitContentType
157
+ });
158
+ else if (isMultipart && !parentKey && !hasFormStyle && typeof value === "object" && !Array.isArray(value))
159
+ /**
160
+ * Per OpenAPI 3.x: a top-level multipart property whose value is an object (and not a File)
161
+ * defaults to a single part encoded as application/json, rather than being flattened
162
+ * into multiple parts with dotted keys.
163
+ */
164
+ params.push({
165
+ name: key,
166
+ value: JSON.stringify(unpackProxyObject(value)),
167
+ contentType: "application/json"
30
168
  });
31
169
  else if (Array.isArray(value)) for (const item of value) if (item instanceof File) {
32
170
  const file = unpackProxyObject(item);
@@ -34,11 +172,29 @@ var objectToFormParams = (obj, encoding, parentKey) => {
34
172
  name: key,
35
173
  value: `@${file.name}`
36
174
  });
37
- } else params.push({
175
+ } else if (isMultipart && !parentKey && !hasFormStyle && typeof item === "object" && item !== null)
176
+ /**
177
+ * Per OpenAPI 3.x: a top-level multipart array of complex items defaults each part
178
+ * to application/json, instead of flattening object items into dotted keys.
179
+ */
180
+ params.push({
181
+ name: key,
182
+ value: JSON.stringify(unpackProxyObject(item)),
183
+ contentType: "application/json"
184
+ });
185
+ else params.push({
38
186
  name: key,
39
187
  value: String(item)
40
188
  });
41
189
  else if (typeof value === "object") {
190
+ /**
191
+ * Legacy fallback: flatten nested objects into dotted-key parts. Reached when the
192
+ * multipart JSON-default branches above don't apply — i.e. either inside a recursive
193
+ * call (`parentKey` set) or on `application/x-www-form-urlencoded` bodies without an
194
+ * explicit encoding entry. Strict OAS 3.1.x would use `style: form, explode: true` as
195
+ * the urlencoded default (inner keys become top-level params); we keep dotted keys for
196
+ * backwards compatibility with consumers that already parse this shape.
197
+ */
42
198
  const nestedParams = objectToFormParams(value, void 0, key);
43
199
  for (const param of nestedParams) params.push({
44
200
  name: `${key}.${param.name}`,
@@ -47,7 +203,7 @@ var objectToFormParams = (obj, encoding, parentKey) => {
47
203
  } else params.push({
48
204
  name: key,
49
205
  value: String(value),
50
- ...partContentType ? { contentType: partContentType } : {}
206
+ ...explicitContentType ? { contentType: explicitContentType } : {}
51
207
  });
52
208
  }
53
209
  return params;
@@ -71,7 +227,7 @@ var processBody = ({ requestBody, contentType, example, requestBodyCompositionSe
71
227
  const exampleValue = _example !== null && typeof _example === "object" ? unpackProxyObject(_example) : _example;
72
228
  if (isFormData && typeof exampleValue === "object" && exampleValue !== null) return {
73
229
  mimeType: harMimeType,
74
- params: objectToFormParams(exampleValue, _contentType === "multipart/form-data" ? encoding : void 0)
230
+ params: objectToFormParams(exampleValue, encoding, void 0, _contentType === "multipart/form-data")
75
231
  };
76
232
  if (isXml && typeof exampleValue === "object" && exampleValue !== null) return {
77
233
  mimeType: harMimeType,
@@ -96,7 +252,7 @@ var processBody = ({ requestBody, contentType, example, requestBodyCompositionSe
96
252
  if (extractedExample !== void 0) {
97
253
  if (isFormData && typeof extractedExample === "object" && extractedExample !== null) return {
98
254
  mimeType: harMimeType,
99
- params: objectToFormParams(extractedExample, _contentType === "multipart/form-data" ? encoding : void 0)
255
+ params: objectToFormParams(extractedExample, encoding, void 0, _contentType === "multipart/form-data")
100
256
  };
101
257
  if (isXml && typeof extractedExample === "object" && extractedExample !== null) return {
102
258
  mimeType: harMimeType,
@@ -1 +1 @@
1
- {"version":3,"file":"process-body.js","names":[],"sources":["../../../../../../src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.ts"],"sourcesContent":["import { json2xml } from '@scalar/helpers/file/json2xml'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { getExample, getExampleFromSchema } from '@scalar/workspace-store/request-example'\nimport type {\n MediaTypeObject,\n RequestBodyObject,\n SchemaObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { getResolvedRefDeep } from '@v2/blocks/operation-code-sample/helpers/get-resolved-ref-deep'\nimport type { Param, PostData } from 'har-format'\n\nimport type { OperationToHarProps } from './operation-to-har'\n\ntype ProcessBodyProps = Pick<OperationToHarProps, 'contentType' | 'example' | 'requestBodyCompositionSelection'> & {\n requestBody: RequestBodyObject\n}\n\ntype MultipartEncodingMap = MediaTypeObject['encoding']\n\n/**\n * Converts an object to an array of form parameters\n * @param obj - The object to convert\n * @returns Array of form parameters with name and value properties\n */\nconst objectToFormParams = (\n obj: object | { name: string; value: unknown; isDisabled: boolean }[],\n encoding?: MultipartEncodingMap,\n parentKey?: string,\n): Param[] => {\n const params: Param[] = []\n\n /** Ensure we do not include disabled items */\n const entries = Array.isArray(obj)\n ? obj.filter((item) => !item.isDisabled).map((item) => [item.name, item.value])\n : Object.entries(obj)\n\n for (const [key, value] of entries) {\n if (value === undefined || value === null) {\n continue\n }\n\n const partContentType = parentKey ? undefined : encoding?.[key]?.contentType\n\n // Handle File objects by converting them to 'BINARY'\n if (value instanceof File) {\n const file = unpackProxyObject(value)\n params.push({ name: key, value: `@${file.name}`, ...(partContentType ? { contentType: partContentType } : {}) })\n }\n // Multipart encodings can override the entire top-level part payload\n else if (partContentType && typeof value === 'object') {\n params.push({\n name: key,\n value: JSON.stringify(unpackProxyObject(value)),\n contentType: partContentType,\n })\n }\n // Handle arrays by adding each item with the same key\n else if (Array.isArray(value)) {\n for (const item of value) {\n // Check if array item is a File\n if (item instanceof File) {\n const file = unpackProxyObject(item)\n params.push({ name: key, value: `@${file.name}` })\n } else {\n params.push({ name: key, value: String(item) })\n }\n }\n }\n // Handle nested objects by flattening them\n else if (typeof value === 'object') {\n const nestedParams = objectToFormParams(value, undefined, key)\n\n for (const param of nestedParams) {\n params.push({ name: `${key}.${param.name}`, value: param.value })\n }\n } else {\n params.push({ name: key, value: String(value), ...(partContentType ? { contentType: partContentType } : {}) })\n }\n }\n\n return params\n}\n\n/**\n * Processes the request body and returns the processed data\n * Returns undefined if no example is found\n */\nexport const processBody = ({\n requestBody,\n contentType,\n example,\n requestBodyCompositionSelection,\n}: ProcessBodyProps): PostData | undefined => {\n const _contentType = contentType || Object.keys(requestBody.content)[0] || ''\n /** Empty when \"Other\" is selected so snippets do not inject `Content-Type: other`. */\n const harMimeType = _contentType === 'other' ? '' : _contentType\n const formatBinaryFile = (file: File) => {\n const unwrappedFile = unpackProxyObject(file)\n return `@${unwrappedFile.name || 'filename'}`\n }\n const encoding = requestBody.content[_contentType]?.encoding\n\n // Check if this is a form data content type\n const isFormData = _contentType === 'multipart/form-data' || _contentType === 'application/x-www-form-urlencoded'\n\n // Check if this is an XML content type\n const isXml = _contentType === 'application/xml'\n\n // Get the example value\n const _example = getExample(requestBody, example, contentType)?.value\n\n // Return the provided top level example\n if (typeof _example !== 'undefined') {\n const exampleValue = _example !== null && typeof _example === 'object' ? unpackProxyObject(_example) : _example\n\n if (isFormData && typeof exampleValue === 'object' && exampleValue !== null) {\n return {\n mimeType: harMimeType,\n params: objectToFormParams(exampleValue, _contentType === 'multipart/form-data' ? encoding : undefined),\n }\n }\n\n if (isXml && typeof exampleValue === 'object' && exampleValue !== null) {\n return {\n mimeType: harMimeType,\n text: json2xml(exampleValue),\n }\n }\n\n if (exampleValue instanceof File) {\n return {\n mimeType: harMimeType,\n text: formatBinaryFile(exampleValue),\n }\n }\n\n return {\n mimeType: harMimeType,\n text: typeof exampleValue === 'string' ? exampleValue : JSON.stringify(exampleValue),\n }\n }\n\n // Try to extract examples from the schema\n const contentSchema = getResolvedRef(requestBody.content[_contentType]?.schema)\n if (typeof contentSchema !== 'undefined') {\n const resolvedContentSchema = getResolvedRefDeep(contentSchema) as SchemaObject\n const extractedExample = getExampleFromSchema(\n resolvedContentSchema,\n {\n compositionSelection: requestBodyCompositionSelection,\n mode: 'write',\n xml: isXml,\n },\n {\n schemaPath: ['requestBody'],\n },\n )\n\n if (extractedExample !== undefined) {\n if (isFormData && typeof extractedExample === 'object' && extractedExample !== null) {\n return {\n mimeType: harMimeType,\n params: objectToFormParams(extractedExample, _contentType === 'multipart/form-data' ? encoding : undefined),\n }\n }\n\n if (isXml && typeof extractedExample === 'object' && extractedExample !== null) {\n return {\n mimeType: harMimeType,\n text: json2xml(extractedExample),\n }\n }\n\n return {\n mimeType: harMimeType,\n text: typeof extractedExample === 'string' ? extractedExample : JSON.stringify(extractedExample),\n }\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"process-body.js","names":[],"sources":["../../../../../../src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.ts"],"sourcesContent":["import { json2xml } from '@scalar/helpers/file/json2xml'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport {\n getExample,\n getExampleFromSchema,\n serializeDeepObjectStyle,\n serializeFormStyle,\n serializePipeDelimitedStyle,\n serializeSpaceDelimitedStyle,\n} from '@scalar/workspace-store/request-example'\nimport type {\n MediaTypeObject,\n RequestBodyObject,\n SchemaObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { getResolvedRefDeep } from '@v2/blocks/operation-code-sample/helpers/get-resolved-ref-deep'\nimport type { Param, PostData } from 'har-format'\n\nimport type { OperationToHarProps } from './operation-to-har'\n\ntype ProcessBodyProps = Pick<OperationToHarProps, 'contentType' | 'example' | 'requestBodyCompositionSelection'> & {\n requestBody: RequestBodyObject\n}\n\ntype MultipartEncodingMap = MediaTypeObject['encoding']\n\n/**\n * Stringify a value emitted by `serializeFormStyle` into a HAR param value.\n *\n * Form-style serialization only addresses one level of nesting per RFC6570;\n * deeper structures (an object or array still sitting in `entry.value`) are\n * spec-undefined. JSON-stringify them so authors get readable output instead\n * of `String(value)` returning `\"[object Object]\"`. Primitives pass through\n * `String()` to preserve the existing wire shape (e.g. `true` → `\"true\"`).\n */\nconst stringifyEntryValue = (value: unknown): string =>\n value !== null && typeof value === 'object' ? JSON.stringify(value) : String(value)\n\n/**\n * Converts a form-data body into HAR `Param[]` entries for `multipart/form-data`\n * and `application/x-www-form-urlencoded` requests.\n *\n * Per OpenAPI 3.1.x Encoding Object, each property's serialization is governed\n * by an optional Encoding entry. When `style` / `explode` / `allowReserved` is\n * set, the value is serialized RFC6570-style and `contentType` is ignored.\n * When only `contentType` is set, the property becomes a single part with that\n * type. Otherwise spec defaults apply (object → `application/json` for multipart,\n * primitives → `text/plain`).\n *\n * @param obj - The form-data payload, either an object keyed by property name\n * or a HAR-style `{ name, value, isDisabled }[]` array.\n * @param encoding - The `encoding` map from the Media Type Object, if any.\n * Used only at the top level (`parentKey` undefined).\n * @param parentKey - When set, we are flattening a nested object inside another\n * property; encoding is ignored and keys are joined with `.` (legacy default).\n * @param isMultipart - True for `multipart/form-data`. Gates the spec defaults\n * for object/array properties that should become a single `application/json`\n * part. Urlencoded bodies skip those branches and fall through to flattening.\n */\nconst objectToFormParams = (\n obj: object | { name: string; value: unknown; isDisabled: boolean }[],\n encoding?: MultipartEncodingMap,\n parentKey?: string,\n isMultipart = false,\n): Param[] => {\n const params: Param[] = []\n\n /** Ensure we do not include disabled items */\n const entries: [string, unknown][] = Array.isArray(obj)\n ? obj.filter((item) => !item.isDisabled).map((item) => [String(item.name), item.value])\n : Object.entries(obj)\n\n for (const [key, value] of entries) {\n if (value === undefined || value === null) {\n continue\n }\n\n const partEncoding = parentKey ? undefined : encoding?.[key]\n /**\n * Per OpenAPI 3.1.1: when style, explode, or allowReserved is explicitly set on the\n * encoding entry, contentType (implicit or explicit) is ignored and the value is\n * serialized as if it were a query-style parameter.\n */\n const hasFormStyle =\n partEncoding &&\n (partEncoding.style !== undefined ||\n partEncoding.explode !== undefined ||\n partEncoding.allowReserved !== undefined)\n /**\n * Per OAS 3.1.x Encoding Object: `contentType` SHALL be ignored if the request body\n * media type is not a multipart. For `application/x-www-form-urlencoded` we still\n * honor `style`/`explode`/`allowReserved` (handled above), but a `contentType`-only\n * entry has no effect — values fall through to the dotted-key flattening default.\n */\n const explicitContentType = hasFormStyle || !isMultipart ? undefined : partEncoding?.contentType\n\n /**\n * Per OpenAPI 3.1.x Encoding Object: when style/explode/allowReserved is set on a\n * `multipart/form-data` or `application/x-www-form-urlencoded` part, the value is\n * serialized as if it were a query-style parameter and contentType is ignored. For\n * multipart the query delimiters are stripped per §Appendix C; HAR represents both\n * content types via `PostData.params`, so the same shape works for both.\n *\n * Primitives skip this branch and fall through to the String(value) path below since\n * style is a no-op for primitives. Files skip too, as do arrays containing Files —\n * RFC6570 expansion of binary data is undefined per §Appendix C, and the array branch\n * below already emits one `@filename` part per File.\n *\n * allowReserved only affects percent-encoding, which is a no-op at the HAR layer per\n * OAS 3.1.2 (\"`allowReserved` has no effect\" for multipart); its presence still opts\n * into this branch per spec.\n */\n if (\n !parentKey &&\n hasFormStyle &&\n typeof value === 'object' &&\n value !== null &&\n !(value instanceof File) &&\n !(Array.isArray(value) && value.some((item) => item instanceof File))\n ) {\n const unpacked = unpackProxyObject(value)\n /**\n * OAS 3.1.x Encoding Object: encoding follows query-parameter defaults — when no\n * `style` is set, the default is \"form\"; when no `explode` is set, the default is\n * `true` for \"form\" and `false` for every other style.\n */\n const style = partEncoding?.style ?? 'form'\n const explode = partEncoding?.explode ?? style === 'form'\n\n if (style === 'deepObject') {\n if (Array.isArray(unpacked)) {\n /**\n * OAS 3.1.1 marks deepObject-on-array as n/a; fall back to the form/explode:true\n * shape so the array still reaches the wire instead of being silently dropped.\n */\n const serialized = serializeFormStyle(unpacked, true)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n params.push({ name: entry.key || key, value: stringifyEntryValue(entry.value) })\n }\n } else {\n params.push({ name: key, value: String(serialized) })\n }\n } else {\n /**\n * explode:false with deepObject is undefined per spec; we invoke the serializer\n * either way so authors get useful output instead of nothing.\n */\n for (const entry of serializeDeepObjectStyle(key, unpacked)) {\n params.push({ name: entry.key, value: String(entry.value) })\n }\n }\n } else if (style === 'spaceDelimited') {\n params.push({ name: key, value: String(serializeSpaceDelimitedStyle(unpacked)) })\n } else if (style === 'pipeDelimited') {\n params.push({ name: key, value: String(serializePipeDelimitedStyle(unpacked)) })\n } else {\n const serialized = serializeFormStyle(unpacked, explode)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n /**\n * Arrays: entry.key === '' → fall back to the outer name.\n * Objects: entry.key is the inner property name (spec strips the outer name).\n *\n * Nested objects/arrays inside entry.value are spec-undefined (RFC6570 form-style\n * only addresses one level of nesting); JSON-stringify them instead of letting\n * String() emit \"[object Object]\". The escape hatch for cleaner output is\n * style: deepObject + explode: true.\n */\n params.push({ name: entry.key || key, value: stringifyEntryValue(entry.value) })\n }\n } else {\n params.push({ name: key, value: String(serialized) })\n }\n }\n } else if (value instanceof File) {\n /**\n * File values render as `@filename` references, the conventional cURL syntax for an\n * attached file. Picked up by snippet renderers downstream (e.g. `--form 'x=@file.png'`).\n */\n const file = unpackProxyObject(value)\n params.push({\n name: key,\n value: `@${file.name}`,\n ...(explicitContentType ? { contentType: explicitContentType } : {}),\n })\n } else if (explicitContentType && typeof value === 'object') {\n /**\n * Per OAS 3.1.x Encoding Object: an explicit `encoding[key].contentType` on a\n * complex value overrides the default and emits a single part containing the value\n * JSON-stringified into that media type. Only reachable when style/explode/allowReserved\n * are unset (otherwise contentType is ignored — see the style branch above).\n */\n params.push({\n name: key,\n value: JSON.stringify(unpackProxyObject(value)),\n contentType: explicitContentType,\n })\n } else if (isMultipart && !parentKey && !hasFormStyle && typeof value === 'object' && !Array.isArray(value)) {\n /**\n * Per OpenAPI 3.x: a top-level multipart property whose value is an object (and not a File)\n * defaults to a single part encoded as application/json, rather than being flattened\n * into multiple parts with dotted keys.\n */\n params.push({\n name: key,\n value: JSON.stringify(unpackProxyObject(value)),\n contentType: 'application/json',\n })\n } else if (Array.isArray(value)) {\n for (const item of value) {\n if (item instanceof File) {\n const file = unpackProxyObject(item)\n params.push({ name: key, value: `@${file.name}` })\n } else if (isMultipart && !parentKey && !hasFormStyle && typeof item === 'object' && item !== null) {\n /**\n * Per OpenAPI 3.x: a top-level multipart array of complex items defaults each part\n * to application/json, instead of flattening object items into dotted keys.\n */\n params.push({\n name: key,\n value: JSON.stringify(unpackProxyObject(item)),\n contentType: 'application/json',\n })\n } else {\n params.push({ name: key, value: String(item) })\n }\n }\n } else if (typeof value === 'object') {\n /**\n * Legacy fallback: flatten nested objects into dotted-key parts. Reached when the\n * multipart JSON-default branches above don't apply — i.e. either inside a recursive\n * call (`parentKey` set) or on `application/x-www-form-urlencoded` bodies without an\n * explicit encoding entry. Strict OAS 3.1.x would use `style: form, explode: true` as\n * the urlencoded default (inner keys become top-level params); we keep dotted keys for\n * backwards compatibility with consumers that already parse this shape.\n */\n const nestedParams = objectToFormParams(value, undefined, key)\n\n for (const param of nestedParams) {\n params.push({ name: `${key}.${param.name}`, value: param.value })\n }\n } else {\n params.push({\n name: key,\n value: String(value),\n ...(explicitContentType ? { contentType: explicitContentType } : {}),\n })\n }\n }\n\n return params\n}\n\n/**\n * Processes the request body and returns the processed data\n * Returns undefined if no example is found\n */\nexport const processBody = ({\n requestBody,\n contentType,\n example,\n requestBodyCompositionSelection,\n}: ProcessBodyProps): PostData | undefined => {\n const _contentType = contentType || Object.keys(requestBody.content)[0] || ''\n /** Empty when \"Other\" is selected so snippets do not inject `Content-Type: other`. */\n const harMimeType = _contentType === 'other' ? '' : _contentType\n const formatBinaryFile = (file: File) => {\n const unwrappedFile = unpackProxyObject(file)\n return `@${unwrappedFile.name || 'filename'}`\n }\n const encoding = requestBody.content[_contentType]?.encoding\n\n // Check if this is a form data content type\n const isFormData = _contentType === 'multipart/form-data' || _contentType === 'application/x-www-form-urlencoded'\n\n // Check if this is an XML content type\n const isXml = _contentType === 'application/xml'\n\n // Get the example value\n const _example = getExample(requestBody, example, contentType)?.value\n\n // Return the provided top level example\n if (typeof _example !== 'undefined') {\n const exampleValue = _example !== null && typeof _example === 'object' ? unpackProxyObject(_example) : _example\n\n if (isFormData && typeof exampleValue === 'object' && exampleValue !== null) {\n return {\n mimeType: harMimeType,\n params: objectToFormParams(exampleValue, encoding, undefined, _contentType === 'multipart/form-data'),\n }\n }\n\n if (isXml && typeof exampleValue === 'object' && exampleValue !== null) {\n return {\n mimeType: harMimeType,\n text: json2xml(exampleValue),\n }\n }\n\n if (exampleValue instanceof File) {\n return {\n mimeType: harMimeType,\n text: formatBinaryFile(exampleValue),\n }\n }\n\n return {\n mimeType: harMimeType,\n text: typeof exampleValue === 'string' ? exampleValue : JSON.stringify(exampleValue),\n }\n }\n\n // Try to extract examples from the schema\n const contentSchema = getResolvedRef(requestBody.content[_contentType]?.schema)\n if (typeof contentSchema !== 'undefined') {\n const resolvedContentSchema = getResolvedRefDeep(contentSchema) as SchemaObject\n const extractedExample = getExampleFromSchema(\n resolvedContentSchema,\n {\n compositionSelection: requestBodyCompositionSelection,\n mode: 'write',\n xml: isXml,\n },\n {\n schemaPath: ['requestBody'],\n },\n )\n\n if (extractedExample !== undefined) {\n if (isFormData && typeof extractedExample === 'object' && extractedExample !== null) {\n return {\n mimeType: harMimeType,\n params: objectToFormParams(extractedExample, encoding, undefined, _contentType === 'multipart/form-data'),\n }\n }\n\n if (isXml && typeof extractedExample === 'object' && extractedExample !== null) {\n return {\n mimeType: harMimeType,\n text: json2xml(extractedExample),\n }\n }\n\n return {\n mimeType: harMimeType,\n text: typeof extractedExample === 'string' ? extractedExample : JSON.stringify(extractedExample),\n }\n }\n }\n\n return undefined\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,8DAA8D,CAAA;AACpH,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvD,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAC/B,CAAA;AA2FD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,uDAK/B;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAA;CACzB,KAAG,mBAuHH,CAAA"}
1
+ {"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,8DAA8D,CAAA;AACpH,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvD,KAAK,mBAAmB,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;CAC/B,CAAA;AA2FD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,uDAK/B;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAA;CACzB,KAAG,mBAqIH,CAAA"}
@@ -115,7 +115,20 @@ var processParameters = ({ harRequest, parameters, example, defaultDisabled }) =
115
115
  break;
116
116
  }
117
117
  case "deepObject":
118
- if (explode) {
118
+ if (Array.isArray(paramValue)) {
119
+ const serialized = serializeFormStyle(paramValue, true);
120
+ if (Array.isArray(serialized)) for (const entry of serialized) {
121
+ const key = entry.key || param.name;
122
+ newQueryString.push({
123
+ name: key,
124
+ value: encodeQueryValue(String(entry.value), param)
125
+ });
126
+ }
127
+ else newQueryString.push({
128
+ name: param.name,
129
+ value: encodeQueryValue(String(serialized), param)
130
+ });
131
+ } else {
119
132
  const entries = serializeDeepObjectStyle(param.name, paramValue);
120
133
  for (const entry of entries) newQueryString.push({
121
134
  name: entry.key,
@@ -1 +1 @@
1
- {"version":3,"file":"process-parameters.js","names":[],"sources":["../../../../../../src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.ts"],"sourcesContent":["import { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n deSerializeParameter,\n getExample,\n getExampleFromSchema,\n serializeContentValue,\n serializeDeepObjectStyle,\n serializeFormStyle,\n serializeFormStyleForCookies,\n serializePipeDelimitedStyle,\n serializeSimpleStyle,\n serializeSpaceDelimitedStyle,\n} from '@scalar/workspace-store/request-example'\nimport type { OperationObject, ParameterObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport type { Request as HarRequest } from 'har-format'\n\nimport { isParamDisabled } from '@/v2/blocks/request-block/helpers/is-param-disabled'\n\ntype ProcessedParameters = {\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/** Ensures we don't have any references in the parameters */\nconst deReferenceParams = (params: OperationObject['parameters']): ParameterObject[] =>\n (params ?? []).map((param) => getResolvedRef(param))\n\n/** Whether the parameter allows reserved characters (from param or schema). */\nconst isAllowReserved = (param: ParameterObject): boolean => {\n if ('allowReserved' in param && param.allowReserved !== undefined) {\n return param.allowReserved\n }\n if ('schema' in param && param.schema && typeof param.schema === 'object' && 'allowReserved' in param.schema) {\n return (param.schema as { allowReserved?: boolean }).allowReserved === true\n }\n return false\n}\n\n/** URL encode a value if allowReserved is not set to true. */\nconst encodeQueryValue = (value: string, param: ParameterObject): string => {\n if (isAllowReserved(param)) {\n return value\n }\n return encodeURIComponent(value)\n}\n\n/**\n * Get the style and explode values for a parameter according to OpenAPI 3.1.1 specification.\n * Handles defaults and validation for parameter location restrictions.\n */\nconst getParameterStyleAndExplode = (param: ParameterObject): { style: string; explode: boolean } => {\n // Headers only support 'simple' style\n if (param.in === 'header') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : false\n return { style: 'simple', explode }\n }\n\n // Cookies only support 'form' style\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: 'form',\n header: 'simple',\n cookie: 'form',\n }[param.in]\n\n // Use provided style or default based on location\n const style = 'style' in param && param.style ? param.style : defaultStyle\n\n // Determine explode value: use provided value or default based on style\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : style === 'form'\n\n return { style, explode }\n}\n\n/**\n * Extract the value for a parameter from example data or schema.\n * Prioritizes example data over schema examples.\n * Returns null if the parameter is disabled so we can skip it.\n */\nconst getParameterValue = (\n param: ParameterObject,\n example: string | undefined,\n contentType: string | undefined,\n defaultDisabled: boolean,\n): unknown => {\n // Try to get value from example first\n const exampleValue = getExample(param, example, contentType)\n\n // If the parameter is disabled, return undefined so we can skip it.\n if (isParamDisabled(param, exampleValue, defaultDisabled)) {\n return undefined\n }\n\n // If the example value is set, return it.\n if (exampleValue?.value !== undefined) {\n return deSerializeParameter(exampleValue.value, param)\n }\n\n // Fall back to schema example if available\n if (!('schema' in param) || !param.schema) {\n return undefined\n }\n\n const options = param.in === 'path' ? { emptyString: `{${param.name}}` } : {}\n return getExampleFromSchema(getResolvedRef(param.schema), options)\n}\n\n/**\n * Process OpenAPI parameters and return the updated properties.\n * Handles path, query, and header parameters with various styles and explode options.\n *\n * @see https://spec.openapis.org/oas/latest.html#style-values\n */\nexport const processParameters = ({\n harRequest,\n parameters,\n example,\n defaultDisabled,\n}: {\n harRequest: HarRequest\n parameters: OperationObject['parameters']\n /** The name of the example to use */\n example?: string | undefined\n /** Whether to disable parameters by default. */\n defaultDisabled: boolean\n}): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n let newUrl = harRequest.url\n\n // Filter out references\n const deReferencedParams = deReferenceParams(parameters)\n\n for (const param of deReferencedParams) {\n if (!param.in || !param.name) {\n continue\n }\n\n const paramValue = getParameterValue(param, example, undefined, defaultDisabled)\n if (paramValue === undefined) {\n continue\n }\n\n const { style, explode } = getParameterStyleAndExplode(param)\n\n switch (param.in) {\n case 'path': {\n newUrl = processPathParameters(newUrl, param, paramValue, style, explode)\n break\n }\n\n case 'query': {\n // Content type parameters should be serialized according to the parameter's own content type\n if ('content' in param && param.content) {\n // We grab the first for now but eventually we should support selecting the content type per parameter\n const paramContentType = Object.keys(param.content)[0] ?? 'application/json'\n const serializedValue = serializeContentValue(paramValue, paramContentType)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serializedValue, param) })\n break\n }\n\n // Handle query parameters\n switch (style) {\n case 'form': {\n const serialized = serializeFormStyle(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n newQueryString.push({ name: key, value: encodeQueryValue(String(entry.value), param) })\n }\n }\n // Otherwise, convert to string\n else {\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(serialized), param) })\n }\n break\n }\n case 'spaceDelimited': {\n const serialized = serializeSpaceDelimitedStyle(paramValue)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serialized, param) })\n break\n }\n case 'pipeDelimited': {\n const serialized = serializePipeDelimitedStyle(paramValue)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serialized, param) })\n break\n }\n case 'deepObject': {\n if (explode) {\n const entries = serializeDeepObjectStyle(param.name, paramValue)\n for (const entry of entries) {\n newQueryString.push({ name: entry.key, value: encodeQueryValue(entry.value, param) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(paramValue), param) })\n }\n break\n }\n\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n // For arrays, simple style always produces comma-separated values regardless of explode\n // The explode parameter only affects object serialization\n case 'header': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n newHeaders.push({ name: param.name, value: String(serialized) })\n break\n }\n\n // Cookies only support 'form' style according to OpenAPI 3.1.1\n case 'cookie': {\n const serialized = serializeFormStyleForCookies(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n const value = entry.value === null ? 'null' : String(entry.value)\n harRequest.cookies.push({ name: key, value })\n }\n }\n // Otherwise, convert to string\n else {\n const value = serialized === null ? 'null' : String(serialized)\n harRequest.cookies.push({ name: param.name, value })\n }\n break\n }\n }\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: harRequest.cookies,\n }\n}\n\n/**\n * Process path parameters according to OpenAPI specification.\n * Handles matrix, label, and simple styles with explode options.\n *\n * @param url - The URL to process\n * @param param - The parameter object\n * @param paramValue - The value of the parameter\n * @param style - The style of the parameter (matrix, label, simple)\n * @param explode - Whether to explode the parameter\n * @returns The updated URL with processed path parameters\n */\nconst processPathParameters = (\n url: string,\n param: ParameterObject,\n paramValue: unknown,\n style: string,\n explode: boolean,\n): string => {\n switch (style) {\n case 'matrix': {\n if (explode) {\n // Matrix explode array: ;color=blue;color=black;color=brown\n if (Array.isArray(paramValue)) {\n const values = (paramValue as unknown[]).map((v) => `${param.name}=${v}`).join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode object: ;R=100;G=200;B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n\n // Matrix no explode array: ;color=blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{;${param.name}}`, `;${param.name}=${(paramValue as unknown[]).join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n return url.replace(`{;${param.name}}`, `;${param.name}=${values}`)\n }\n\n // Matrix no explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n case 'label': {\n if (explode) {\n // Label explode array: .blue.black.brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n // Label no explode array: .blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label no explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n case 'simple': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n return url.replace(`{${param.name}}`, String(serialized))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"process-parameters.js","names":[],"sources":["../../../../../../src/v2/blocks/operation-code-sample/helpers/operation-to-har/process-parameters.ts"],"sourcesContent":["import { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n deSerializeParameter,\n getExample,\n getExampleFromSchema,\n serializeContentValue,\n serializeDeepObjectStyle,\n serializeFormStyle,\n serializeFormStyleForCookies,\n serializePipeDelimitedStyle,\n serializeSimpleStyle,\n serializeSpaceDelimitedStyle,\n} from '@scalar/workspace-store/request-example'\nimport type { OperationObject, ParameterObject } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport type { Request as HarRequest } from 'har-format'\n\nimport { isParamDisabled } from '@/v2/blocks/request-block/helpers/is-param-disabled'\n\ntype ProcessedParameters = {\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/** Ensures we don't have any references in the parameters */\nconst deReferenceParams = (params: OperationObject['parameters']): ParameterObject[] =>\n (params ?? []).map((param) => getResolvedRef(param))\n\n/** Whether the parameter allows reserved characters (from param or schema). */\nconst isAllowReserved = (param: ParameterObject): boolean => {\n if ('allowReserved' in param && param.allowReserved !== undefined) {\n return param.allowReserved\n }\n if ('schema' in param && param.schema && typeof param.schema === 'object' && 'allowReserved' in param.schema) {\n return (param.schema as { allowReserved?: boolean }).allowReserved === true\n }\n return false\n}\n\n/** URL encode a value if allowReserved is not set to true. */\nconst encodeQueryValue = (value: string, param: ParameterObject): string => {\n if (isAllowReserved(param)) {\n return value\n }\n return encodeURIComponent(value)\n}\n\n/**\n * Get the style and explode values for a parameter according to OpenAPI 3.1.1 specification.\n * Handles defaults and validation for parameter location restrictions.\n */\nconst getParameterStyleAndExplode = (param: ParameterObject): { style: string; explode: boolean } => {\n // Headers only support 'simple' style\n if (param.in === 'header') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : false\n return { style: 'simple', explode }\n }\n\n // Cookies only support 'form' style\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: 'form',\n header: 'simple',\n cookie: 'form',\n }[param.in]\n\n // Use provided style or default based on location\n const style = 'style' in param && param.style ? param.style : defaultStyle\n\n // Determine explode value: use provided value or default based on style\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : style === 'form'\n\n return { style, explode }\n}\n\n/**\n * Extract the value for a parameter from example data or schema.\n * Prioritizes example data over schema examples.\n * Returns null if the parameter is disabled so we can skip it.\n */\nconst getParameterValue = (\n param: ParameterObject,\n example: string | undefined,\n contentType: string | undefined,\n defaultDisabled: boolean,\n): unknown => {\n // Try to get value from example first\n const exampleValue = getExample(param, example, contentType)\n\n // If the parameter is disabled, return undefined so we can skip it.\n if (isParamDisabled(param, exampleValue, defaultDisabled)) {\n return undefined\n }\n\n // If the example value is set, return it.\n if (exampleValue?.value !== undefined) {\n return deSerializeParameter(exampleValue.value, param)\n }\n\n // Fall back to schema example if available\n if (!('schema' in param) || !param.schema) {\n return undefined\n }\n\n const options = param.in === 'path' ? { emptyString: `{${param.name}}` } : {}\n return getExampleFromSchema(getResolvedRef(param.schema), options)\n}\n\n/**\n * Process OpenAPI parameters and return the updated properties.\n * Handles path, query, and header parameters with various styles and explode options.\n *\n * @see https://spec.openapis.org/oas/latest.html#style-values\n */\nexport const processParameters = ({\n harRequest,\n parameters,\n example,\n defaultDisabled,\n}: {\n harRequest: HarRequest\n parameters: OperationObject['parameters']\n /** The name of the example to use */\n example?: string | undefined\n /** Whether to disable parameters by default. */\n defaultDisabled: boolean\n}): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n let newUrl = harRequest.url\n\n // Filter out references\n const deReferencedParams = deReferenceParams(parameters)\n\n for (const param of deReferencedParams) {\n if (!param.in || !param.name) {\n continue\n }\n\n const paramValue = getParameterValue(param, example, undefined, defaultDisabled)\n if (paramValue === undefined) {\n continue\n }\n\n const { style, explode } = getParameterStyleAndExplode(param)\n\n switch (param.in) {\n case 'path': {\n newUrl = processPathParameters(newUrl, param, paramValue, style, explode)\n break\n }\n\n case 'query': {\n // Content type parameters should be serialized according to the parameter's own content type\n if ('content' in param && param.content) {\n // We grab the first for now but eventually we should support selecting the content type per parameter\n const paramContentType = Object.keys(param.content)[0] ?? 'application/json'\n const serializedValue = serializeContentValue(paramValue, paramContentType)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serializedValue, param) })\n break\n }\n\n // Handle query parameters\n switch (style) {\n case 'form': {\n const serialized = serializeFormStyle(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n newQueryString.push({ name: key, value: encodeQueryValue(String(entry.value), param) })\n }\n }\n // Otherwise, convert to string\n else {\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(serialized), param) })\n }\n break\n }\n case 'spaceDelimited': {\n const serialized = serializeSpaceDelimitedStyle(paramValue)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serialized, param) })\n break\n }\n case 'pipeDelimited': {\n const serialized = serializePipeDelimitedStyle(paramValue)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serialized, param) })\n break\n }\n case 'deepObject': {\n // OAS marks deepObject-on-array and deepObject+explode:false as undefined.\n // Mirror process-body: fall back to form/explode:true for arrays and always\n // invoke the serializer for objects so authors get useful output instead of\n // a silently-dropped parameter.\n if (Array.isArray(paramValue)) {\n const serialized = serializeFormStyle(paramValue, true)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n newQueryString.push({ name: key, value: encodeQueryValue(String(entry.value), param) })\n }\n } else {\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(serialized), param) })\n }\n } else {\n const entries = serializeDeepObjectStyle(param.name, paramValue)\n for (const entry of entries) {\n newQueryString.push({ name: entry.key, value: encodeQueryValue(entry.value, param) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(paramValue), param) })\n }\n break\n }\n\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n // For arrays, simple style always produces comma-separated values regardless of explode\n // The explode parameter only affects object serialization\n case 'header': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n newHeaders.push({ name: param.name, value: String(serialized) })\n break\n }\n\n // Cookies only support 'form' style according to OpenAPI 3.1.1\n case 'cookie': {\n const serialized = serializeFormStyleForCookies(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n const value = entry.value === null ? 'null' : String(entry.value)\n harRequest.cookies.push({ name: key, value })\n }\n }\n // Otherwise, convert to string\n else {\n const value = serialized === null ? 'null' : String(serialized)\n harRequest.cookies.push({ name: param.name, value })\n }\n break\n }\n }\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: harRequest.cookies,\n }\n}\n\n/**\n * Process path parameters according to OpenAPI specification.\n * Handles matrix, label, and simple styles with explode options.\n *\n * @param url - The URL to process\n * @param param - The parameter object\n * @param paramValue - The value of the parameter\n * @param style - The style of the parameter (matrix, label, simple)\n * @param explode - Whether to explode the parameter\n * @returns The updated URL with processed path parameters\n */\nconst processPathParameters = (\n url: string,\n param: ParameterObject,\n paramValue: unknown,\n style: string,\n explode: boolean,\n): string => {\n switch (style) {\n case 'matrix': {\n if (explode) {\n // Matrix explode array: ;color=blue;color=black;color=brown\n if (Array.isArray(paramValue)) {\n const values = (paramValue as unknown[]).map((v) => `${param.name}=${v}`).join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode object: ;R=100;G=200;B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n\n // Matrix no explode array: ;color=blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{;${param.name}}`, `;${param.name}=${(paramValue as unknown[]).join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n return url.replace(`{;${param.name}}`, `;${param.name}=${values}`)\n }\n\n // Matrix no explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n case 'label': {\n if (explode) {\n // Label explode array: .blue.black.brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n // Label no explode array: .blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${(paramValue as unknown[]).join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label no explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n case 'simple': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n return url.replace(`{${param.name}}`, String(serialized))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ScalarComboboxOption, ScalarComboboxOptionGroup } from '@scalar/components';
1
+ import type { ScalarComboboxOption, ScalarComboboxOptionGroup } from '@scalar/components/combobox';
2
2
  import type { AvailableClients, ClientId, TargetId } from '@scalar/snippetz';
3
3
  /**
4
4
  * Represents a client option in the request example block.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/v2/blocks/operation-code-sample/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE5E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,oBAAoB,GAAG;IAChD,yBAAyB;IACzB,EAAE,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC5B,8FAA8F;IAC9F,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACrC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,SAAS,EAAE,QAAQ,CAAA;IACnB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,gCAAgC;IAChC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;CAC9B,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,YAAY,CAAC,GAAG;IACxE,uBAAuB;IACvB,GAAG,EAAE,QAAQ,CAAA;CACd,CAAA;AAED,qEAAqE;AACrE,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG;IACtD,kBAAkB;IAClB,EAAE,EAAE,UAAU,MAAM,EAAE,CAAA;IACtB,8FAA8F;IAC9F,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACrC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb,gCAAgC;IAChC,SAAS,EAAE,QAAQ,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG,kBAAkB,CAAA;AAE3E,uEAAuE;AACvE,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,2BAA2B,CAAC,GAAG;IAC7F,uBAAuB;IACvB,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAA;CACzB,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/v2/blocks/operation-code-sample/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE5E;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,oBAAoB,GAAG;IAChD,yBAAyB;IACzB,EAAE,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC5B,8FAA8F;IAC9F,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACrC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,SAAS,EAAE,QAAQ,CAAA;IACnB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,gCAAgC;IAChC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;CAC9B,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,yBAAyB,CAAC,YAAY,CAAC,GAAG;IACxE,uBAAuB;IACvB,GAAG,EAAE,QAAQ,CAAA;CACd,CAAA;AAED,qEAAqE;AACrE,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG;IACtD,kBAAkB;IAClB,EAAE,EAAE,UAAU,MAAM,EAAE,CAAA;IACtB,8FAA8F;IAC9F,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACrC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb,gCAAgC;IAChC,SAAS,EAAE,QAAQ,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG,kBAAkB,CAAA;AAE3E,uEAAuE;AACvE,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,CAAC,2BAA2B,CAAC,GAAG;IAC7F,uBAAuB;IACvB,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAA;CACzB,CAAA"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import RequestBlock_vue_vue_type_script_setup_true_lang_default from "./RequestBlock.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/v2/blocks/request-block/RequestBlock.vue
5
- var RequestBlock_default = /* @__PURE__ */ _plugin_vue_export_helper_default(RequestBlock_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-dc6f670a"]]);
5
+ var RequestBlock_default = /* @__PURE__ */ _plugin_vue_export_helper_default(RequestBlock_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9ee5445b"]]);
6
6
  //#endregion
7
7
  export { RequestBlock_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBlock.vue.js","names":[],"sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarErrorBoundary } from '@scalar/components'\nimport { canMethodHaveBody } from '@scalar/helpers/http/can-method-have-body'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { REGEX } from '@scalar/helpers/regex/regex-helpers'\nimport { replaceEnvVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n AuthMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport {\n filterGlobalCookie,\n getEnvironmentVariables,\n getResolvedUrl,\n type MergedSecuritySchemes,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n OperationObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed, ref, useId, watch } from 'vue'\n\nimport SectionFilter from '@/components/SectionFilter.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport type { ClientOptionGroup } from '@/v2/blocks/operation-code-sample'\nimport RequestBody from '@/v2/blocks/request-block/components/RequestBody.vue'\nimport RequestCodeSnippet from '@/v2/blocks/request-block/components/RequestCodeSnippet.vue'\nimport RequestParams from '@/v2/blocks/request-block/components/RequestParams.vue'\nimport type { TableRow } from '@/v2/blocks/request-block/components/RequestTableRow.vue'\nimport { createParameterHandlers } from '@/v2/blocks/request-block/helpers/create-parameter-handlers'\nimport { createParameterRows } from '@/v2/blocks/request-block/helpers/create-parameter-rows'\nimport { groupBy } from '@/v2/blocks/request-block/helpers/group-by'\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { OAuth2Options } from '@/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue'\nimport type { ClientLayout } from '@/v2/types/layout'\n\ntype Filter =\n | 'All'\n | 'Auth'\n | 'Variables'\n | 'Cookies'\n | 'Headers'\n | 'Query'\n | 'Body'\n\nexport type RequestBlockProps = {\n authMeta: AuthMeta\n clientOptions: ClientOptionGroup[]\n environment: XScalarEnvironment\n eventBus: WorkspaceEventBus\n exampleKey: string\n workspaceCookies: XScalarCookie[]\n documentCookies: XScalarCookie[]\n layout: ClientLayout\n method: HttpMethod\n operation: OperationObject\n path: string\n plugins: ClientPlugin[]\n proxyUrl: string\n securityRequirements: OpenApiDocument['security']\n securitySchemes: MergedSecuritySchemes\n requestBodyCompositionSelection?: Record<string, number>\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n selectedSecurity: SelectedSecurity\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n server: ServerObject | null\n defaultHeaders: Record<string, string>\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n}\n\nconst {\n authMeta = { type: 'document' },\n clientOptions,\n environment,\n eventBus,\n exampleKey,\n workspaceCookies,\n documentCookies,\n layout,\n method,\n operation,\n path,\n plugins,\n proxyUrl,\n requestBodyCompositionSelection,\n securityRequirements,\n securitySchemes,\n selectedClient,\n selectedSecurity,\n selectedSecuritySchemes,\n server,\n defaultHeaders: autoGeneratedHeaders,\n} = defineProps<RequestBlockProps>()\n\n/** Operation metadata used across event emissions */\nconst meta = computed(() => ({\n method,\n path,\n exampleKey,\n}))\n\nconst deletedExpandedParameterPaths = ref<Record<string, string[][]>>({})\n\nconst getExpandedParameterKey = (parameter: {\n in: string\n name: string\n}): string => `${parameter.in}:${parameter.name}`\n\nconst getHiddenValuePaths = (parameter: {\n in: string\n name: string\n}): string[][] =>\n deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\n/** Parameters grouped by type (path, query, header, cookie) */\nconst sections = computed(() =>\n groupBy(\n operation.parameters\n ?.map((param) => getResolvedRef(param))\n .flatMap((param) =>\n createParameterRows(param, exampleKey, {\n hiddenValuePaths:\n param.in === 'query' ? getHiddenValuePaths(param) : [],\n }).map((row) => ({\n ...row,\n in: param.in,\n })),\n ) ?? [],\n 'in',\n ({ in: _in, ...row }) => {\n return row as TableRow\n },\n ),\n)\n\n// Generate a reverse map for fast lookup of headers by the name\nconst headersMap = computed(() =>\n groupBy(\n sections.value.header?.map((it) => ({\n ...it,\n name: it.name.toLowerCase(),\n })) ?? [],\n 'name',\n ),\n)\n\nconst defaultHeaders = computed(() => {\n const disableParameters =\n operation['x-scalar-disable-parameters']?.['default-headers']?.[\n exampleKey\n ] ?? {}\n\n const isOverridden = (name: string) => {\n const header = headersMap.value[name.toLowerCase()]?.[0]\n\n if (!header) {\n return false\n }\n\n return !header.isDisabled\n }\n\n return Object.entries(autoGeneratedHeaders).map(([name, value]) => {\n return {\n name,\n value,\n schema: undefined,\n isOverridden: isOverridden(name),\n isReadonly: true,\n isDisabled: disableParameters[name.toLowerCase()] ?? false,\n } satisfies TableRow\n })\n})\n\nconst headers = computed(() => [\n ...defaultHeaders.value,\n ...(sections.value.header ?? []),\n])\n\nconst defaultCookies = computed(() => {\n const environmentVariables = getEnvironmentVariables(environment)\n const resolvedUrl = getResolvedUrl({\n server,\n path,\n })\n const url = replaceEnvVariables(resolvedUrl, environmentVariables)\n\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[\n exampleKey\n ] ?? {}\n\n const transform = (\n cookie: XScalarCookie,\n location: 'document' | 'workspace',\n ) => {\n return {\n name: cookie.name,\n value: cookie.value,\n globalRoute: { page: location, path: 'cookies' } as const,\n isReadonly: true,\n isDisabled: disabledGlobalCookies[cookie.name.toLowerCase()] ?? false,\n } satisfies TableRow\n }\n\n const globalCookies = [\n {\n location: 'workspace',\n cookies: workspaceCookies,\n },\n {\n location: 'document',\n cookies: documentCookies,\n },\n ] as const\n\n return globalCookies.flatMap(({ location, cookies }) => {\n return cookies\n .filter((cookie) =>\n filterGlobalCookie({\n cookie,\n url,\n disabledGlobalCookies: {},\n }),\n )\n .map((cookie) => transform(cookie, location))\n })\n})\n\nconst cookies = computed(() => [\n ...(defaultCookies.value ?? []),\n ...(sections.value.cookie ?? []),\n])\n\n/** Currently selected filter for the request sections */\nconst selectedFilter = ref<Filter>('All')\n\n/** Available operation sections */\nconst OPERATION_SECTIONS: readonly Filter[] = [\n 'Auth',\n 'Variables',\n 'Cookies',\n 'Headers',\n 'Query',\n 'Body',\n] as const\n\n/**\n * Pre-generated stable IDs for all possible filter sections.\n * These are created once at setup time to avoid regenerating IDs on re-render.\n */\nconst sectionIds: Record<Filter, string> = {\n All: useId(),\n Auth: useId(),\n Variables: useId(),\n Cookies: useId(),\n Headers: useId(),\n Query: useId(),\n Body: useId(),\n}\n\n/** Filters available based on operation state */\nconst filters = computed<Filter[]>(() => {\n const availableFilters = new Set<Filter>(['All', ...OPERATION_SECTIONS])\n\n if (!sections.value.path?.length) {\n availableFilters.delete('Variables')\n }\n if (!canMethodHaveBody(method)) {\n availableFilters.delete('Body')\n }\n if (isAuthHidden.value) {\n availableFilters.delete('Auth')\n }\n\n return [...availableFilters]\n})\n\n/**\n * Map available filters to their pre-generated stable IDs.\n * Only includes IDs for filters that are currently available.\n */\nconst filterIds = computed(\n () =>\n Object.fromEntries(\n filters.value.map((section) => [section, sectionIds[section]]),\n ) as Record<Filter, string>,\n)\n\n/**\n * Hide auth selector in readonly mode when no security schemes are defined.\n * This keeps the UI clean when there are no authentication options available.\n */\nconst isAuthHidden = computed(\n () => layout === 'modal' && !Object.keys(securitySchemes ?? {}).length,\n)\n\n/**\n * Keep auth available for unauthenticated operations, but collapse it by default\n * in readonly modal layouts unless a requirement or manual selection exists.\n */\nconst isAuthDefaultOpen = computed(\n () =>\n layout !== 'modal' ||\n Boolean(\n securityRequirements?.length || selectedSecurity.selectedSchemes.length,\n ),\n)\n\n/** Get a sensible placeholder for the request name input */\nconst requestNamePlaceholder = computed(() => {\n if (operation.summary) {\n return operation.summary\n }\n const cleanPath = path.replace(REGEX.PROTOCOL, '')\n return cleanPath || 'Request Name'\n})\n\n/** Check if the section should be shown based on the selected filter */\nconst isSectionVisible = (section: Filter): boolean => {\n return selectedFilter.value === 'All' || selectedFilter.value === section\n}\n\n/**\n * Reset filter to 'All' if Body filter is selected but method changes to one that cannot have a body.\n * This prevents showing an empty Body section when switching methods.\n */\nwatch(\n () => method,\n (newMethod) => {\n if (selectedFilter.value === 'Body' && !canMethodHaveBody(newMethod)) {\n selectedFilter.value = 'All'\n }\n },\n)\n\nwatch(\n () => [method, path, exampleKey],\n () => {\n deletedExpandedParameterPaths.value = {}\n },\n)\n\n/** Handle operation summary updates */\nconst handleSummaryUpdate = (event: Event): void => {\n const summary = (event.target as HTMLInputElement).value\n eventBus.emit('operation:update:meta', {\n meta: meta.value,\n payload: { summary: summary.trim() },\n })\n}\n\n/** Parameter handlers */\nconst parameterHandlers = computed(() => ({\n path: createParameterHandlers('path', eventBus, meta.value, {\n context: sections.value.path ?? [],\n }),\n cookie: createParameterHandlers('cookie', eventBus, meta.value, {\n context: cookies.value ?? [],\n globalParameters: defaultCookies.value.length,\n }),\n header: createParameterHandlers('header', eventBus, meta.value, {\n context: headers.value,\n defaultParameters: defaultHeaders.value.length,\n }),\n query: createParameterHandlers('query', eventBus, meta.value, {\n context: sections.value.query ?? [],\n onDeleteExpandedRow: (row) => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const key = getExpandedParameterKey(row.originalParameter)\n deletedExpandedParameterPaths.value = {\n ...deletedExpandedParameterPaths.value,\n [key]: [\n ...(deletedExpandedParameterPaths.value[key] ?? []),\n row.sourceParameterValuePath,\n ],\n }\n },\n }),\n}))\n\n/** Handle request body content type update */\nconst handleUpdateContentType = (payload: { value: string }): void =>\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType: payload.value },\n meta: meta.value,\n })\n\n/** Handle request body value update */\nconst handleUpdateBodyValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:value'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey =\n typeof payload === 'string'\n ? `update:requestBody:value-${contentType}`\n : undefined\n\n eventBus.emit(\n 'operation:update:requestBody:value',\n {\n payload,\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/** Handle request body value update */\nconst handleUpdateBodyFormValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:formValue'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey = `update:requestBody:${contentType}-form-value`\n\n eventBus.emit(\n 'operation:update:requestBody:formValue',\n {\n payload: payload.map((row) => unpackProxyObject(row, { depth: 1 })),\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\nconst labelRequestNameId = useId()\n\nconst globalCookies = computed(() => [...workspaceCookies, ...documentCookies])\n\n/** Allow updating the operation extensions for the plugins */\nconst updateOperationExtension = (\n payload: ApiReferenceEvents['operation:update:extension']['payload'],\n): void =>\n eventBus.emit('operation:update:extension', { payload, meta: meta.value })\n</script>\n<template>\n <ViewLayoutSection :aria-label=\"`Request: ${operation.summary}`\">\n <template #title>\n <div\n class=\"group pointer-events-none flex flex-1 items-center gap-1 lg:pr-24\">\n <label\n v-if=\"layout !== 'modal'\"\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"labelRequestNameId\" />\n <input\n v-if=\"layout !== 'modal'\"\n :id=\"labelRequestNameId\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative z-10 -ml-0.5 h-8 w-full rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"requestNamePlaceholder\"\n :value=\"operation.summary\"\n @blur=\"handleSummaryUpdate\" />\n <span\n v-else\n class=\"text-c-1 flex h-8 items-center\">\n {{ operation.summary }}\n </span>\n </div>\n <SectionFilter\n v-model=\"selectedFilter\"\n :filterIds=\"filterIds\"\n :filters=\"filters\" />\n </template>\n\n <div\n :id=\"filterIds.All\"\n class=\"request-section-content custom-scroll relative flex flex-1 flex-col\"\n :role=\"selectedFilter === 'All' ? 'tabpanel' : 'none'\">\n <!-- Auth Selector -->\n <AuthSelector\n v-show=\"isSectionVisible('Auth') && !isAuthHidden\"\n :id=\"filterIds.Auth\"\n :createAnySecurityScheme=\"layout !== 'modal'\"\n :defaultOpen=\"isAuthDefaultOpen\"\n :environment\n :eventBus\n :meta=\"authMeta\"\n :options\n :proxyUrl\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :selectedSecuritySchemes\n :server\n title=\"Authentication\" />\n\n <!-- Variables (Path Parameters) -->\n <RequestParams\n v-show=\"isSectionVisible('Variables') && sections.path?.length\"\n :id=\"filterIds.Variables\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.path ?? []\"\n :showAddRowPlaceholder=\"false\"\n title=\"Variables\"\n v-on=\"parameterHandlers.path\" />\n\n <!-- Cookies -->\n <RequestParams\n v-show=\"isSectionVisible('Cookies')\"\n :id=\"filterIds.Cookies\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"cookies ?? []\"\n :showAddRowPlaceholder=\"true\"\n title=\"Cookies\"\n v-on=\"parameterHandlers.cookie\" />\n\n <!-- Headers -->\n <RequestParams\n v-show=\"isSectionVisible('Headers')\"\n :id=\"filterIds.Headers\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"headers ?? []\"\n title=\"Headers\"\n v-on=\"parameterHandlers.header\" />\n\n <!-- Query Parameters -->\n <RequestParams\n v-show=\"isSectionVisible('Query')\"\n :id=\"filterIds.Query\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.query ?? []\"\n title=\"Query Parameters\"\n v-on=\"parameterHandlers.query\" />\n\n <!-- Request Body -->\n <RequestBody\n v-show=\"isSectionVisible('Body') && canMethodHaveBody(method)\"\n :id=\"filterIds.Body\"\n :environment\n :exampleKey\n :requestBody=\"getResolvedRef(operation.requestBody)\"\n :requestBodyCompositionSelection\n title=\"Request Body\"\n @update:contentType=\"handleUpdateContentType\"\n @update:formValue=\"handleUpdateBodyFormValue\"\n @update:value=\"handleUpdateBodyValue\" />\n\n <!-- Inject request section plugin components -->\n <ScalarErrorBoundary\n v-for=\"(plugin, index) in plugins\"\n :key=\"index\">\n <component\n :is=\"plugin.components.request.component\"\n v-if=\"plugin?.components?.request\"\n v-show=\"selectedFilter === 'All'\"\n :operation\n v-bind=\"plugin.components.request.additionalProps\"\n @operation:update:extension=\"updateOperationExtension\" />\n </ScalarErrorBoundary>\n\n <!-- Spacer -->\n <div class=\"flex grow\" />\n <!-- Code Snippet -->\n <RequestCodeSnippet\n v-show=\"selectedFilter === 'All'\"\n :clientOptions\n :eventBus\n :globalCookies\n integration=\"client\"\n :method\n :operation\n :path\n :securitySchemes=\"selectedSecuritySchemes\"\n :selectedClient\n :selectedContentType=\"\n getResolvedRef(operation.requestBody)?.[\n 'x-scalar-selected-content-type'\n ]?.[exampleKey]\n \"\n :selectedServer=\"server ?? undefined\" />\n </div>\n </ViewLayoutSection>\n</template>\n<style scoped>\n.request-section-content {\n --scalar-border-width: 0.5px;\n}\n.request-section-content-filter {\n box-shadow: 0 -10px 0 10px var(--scalar-background-1);\n}\n.request-item:focus-within .request-meta-buttons {\n opacity: 1;\n}\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"RequestBlock.vue.js","names":[],"sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarErrorBoundary } from '@scalar/components/error-boundary'\nimport { canMethodHaveBody } from '@scalar/helpers/http/can-method-have-body'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { REGEX } from '@scalar/helpers/regex/regex-helpers'\nimport { replaceEnvVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n AuthMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport {\n filterGlobalCookie,\n getEnvironmentVariables,\n getResolvedUrl,\n type MergedSecuritySchemes,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n OperationObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\nimport { computed, ref, useId, watch } from 'vue'\n\nimport SectionFilter from '@/components/SectionFilter.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport type { ClientOptionGroup } from '@/v2/blocks/operation-code-sample'\nimport RequestBody from '@/v2/blocks/request-block/components/RequestBody.vue'\nimport RequestCodeSnippet from '@/v2/blocks/request-block/components/RequestCodeSnippet.vue'\nimport RequestParams from '@/v2/blocks/request-block/components/RequestParams.vue'\nimport type { TableRow } from '@/v2/blocks/request-block/components/RequestTableRow.vue'\nimport { createParameterHandlers } from '@/v2/blocks/request-block/helpers/create-parameter-handlers'\nimport { createParameterRows } from '@/v2/blocks/request-block/helpers/create-parameter-rows'\nimport { groupBy } from '@/v2/blocks/request-block/helpers/group-by'\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { OAuth2Options } from '@/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue'\nimport type { ClientLayout } from '@/v2/types/layout'\n\ntype Filter =\n | 'All'\n | 'Auth'\n | 'Variables'\n | 'Cookies'\n | 'Headers'\n | 'Query'\n | 'Body'\n\nexport type RequestBlockProps = {\n authMeta: AuthMeta\n clientOptions: ClientOptionGroup[]\n environment: XScalarEnvironment\n eventBus: WorkspaceEventBus\n exampleKey: string\n workspaceCookies: XScalarCookie[]\n documentCookies: XScalarCookie[]\n layout: ClientLayout\n method: HttpMethod\n operation: OperationObject\n path: string\n plugins: ClientPlugin[]\n proxyUrl: string\n securityRequirements: OpenApiDocument['security']\n securitySchemes: MergedSecuritySchemes\n requestBodyCompositionSelection?: Record<string, number>\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n selectedSecurity: SelectedSecurity\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n server: ServerObject | null\n defaultHeaders: Record<string, string>\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n}\n\nconst {\n authMeta = { type: 'document' },\n clientOptions,\n environment,\n eventBus,\n exampleKey,\n workspaceCookies,\n documentCookies,\n layout,\n method,\n operation,\n path,\n plugins,\n proxyUrl,\n requestBodyCompositionSelection,\n securityRequirements,\n securitySchemes,\n selectedClient,\n selectedSecurity,\n selectedSecuritySchemes,\n server,\n defaultHeaders: autoGeneratedHeaders,\n} = defineProps<RequestBlockProps>()\n\n/** Operation metadata used across event emissions */\nconst meta = computed(() => ({\n method,\n path,\n exampleKey,\n}))\n\nconst deletedExpandedParameterPaths = ref<Record<string, string[][]>>({})\n\nconst getExpandedParameterKey = (parameter: {\n in: string\n name: string\n}): string => `${parameter.in}:${parameter.name}`\n\nconst getHiddenValuePaths = (parameter: {\n in: string\n name: string\n}): string[][] =>\n deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\n/** Parameters grouped by type (path, query, header, cookie) */\nconst sections = computed(() =>\n groupBy(\n operation.parameters\n ?.map((param) => getResolvedRef(param))\n .flatMap((param) =>\n createParameterRows(param, exampleKey, {\n hiddenValuePaths:\n param.in === 'query' ? getHiddenValuePaths(param) : [],\n }).map((row) => ({\n ...row,\n in: param.in,\n })),\n ) ?? [],\n 'in',\n ({ in: _in, ...row }) => {\n return row as TableRow\n },\n ),\n)\n\n// Generate a reverse map for fast lookup of headers by the name\nconst headersMap = computed(() =>\n groupBy(\n sections.value.header?.map((it) => ({\n ...it,\n name: it.name.toLowerCase(),\n })) ?? [],\n 'name',\n ),\n)\n\nconst defaultHeaders = computed(() => {\n const disableParameters =\n operation['x-scalar-disable-parameters']?.['default-headers']?.[\n exampleKey\n ] ?? {}\n\n const isOverridden = (name: string) => {\n const header = headersMap.value[name.toLowerCase()]?.[0]\n\n if (!header) {\n return false\n }\n\n return !header.isDisabled\n }\n\n return Object.entries(autoGeneratedHeaders).map(([name, value]) => {\n return {\n name,\n value,\n schema: undefined,\n isOverridden: isOverridden(name),\n isReadonly: true,\n isDisabled: disableParameters[name.toLowerCase()] ?? false,\n } satisfies TableRow\n })\n})\n\nconst headers = computed(() => [\n ...defaultHeaders.value,\n ...(sections.value.header ?? []),\n])\n\nconst defaultCookies = computed(() => {\n const environmentVariables = getEnvironmentVariables(environment)\n const resolvedUrl = getResolvedUrl({\n server,\n path,\n })\n const url = replaceEnvVariables(resolvedUrl, environmentVariables)\n\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[\n exampleKey\n ] ?? {}\n\n const transform = (\n cookie: XScalarCookie,\n location: 'document' | 'workspace',\n ) => {\n return {\n name: cookie.name,\n value: cookie.value,\n globalRoute: { page: location, path: 'cookies' } as const,\n isReadonly: true,\n isDisabled: disabledGlobalCookies[cookie.name.toLowerCase()] ?? false,\n } satisfies TableRow\n }\n\n const globalCookies = [\n {\n location: 'workspace',\n cookies: workspaceCookies,\n },\n {\n location: 'document',\n cookies: documentCookies,\n },\n ] as const\n\n return globalCookies.flatMap(({ location, cookies }) => {\n return cookies\n .filter((cookie) =>\n filterGlobalCookie({\n cookie,\n url,\n disabledGlobalCookies: {},\n }),\n )\n .map((cookie) => transform(cookie, location))\n })\n})\n\nconst cookies = computed(() => [\n ...(defaultCookies.value ?? []),\n ...(sections.value.cookie ?? []),\n])\n\n/** Currently selected filter for the request sections */\nconst selectedFilter = ref<Filter>('All')\n\n/** Available operation sections */\nconst OPERATION_SECTIONS: readonly Filter[] = [\n 'Auth',\n 'Variables',\n 'Cookies',\n 'Headers',\n 'Query',\n 'Body',\n] as const\n\n/**\n * Pre-generated stable IDs for all possible filter sections.\n * These are created once at setup time to avoid regenerating IDs on re-render.\n */\nconst sectionIds: Record<Filter, string> = {\n All: useId(),\n Auth: useId(),\n Variables: useId(),\n Cookies: useId(),\n Headers: useId(),\n Query: useId(),\n Body: useId(),\n}\n\n/** Filters available based on operation state */\nconst filters = computed<Filter[]>(() => {\n const availableFilters = new Set<Filter>(['All', ...OPERATION_SECTIONS])\n\n if (!sections.value.path?.length) {\n availableFilters.delete('Variables')\n }\n if (!canMethodHaveBody(method)) {\n availableFilters.delete('Body')\n }\n if (isAuthHidden.value) {\n availableFilters.delete('Auth')\n }\n\n return [...availableFilters]\n})\n\n/**\n * Map available filters to their pre-generated stable IDs.\n * Only includes IDs for filters that are currently available.\n */\nconst filterIds = computed(\n () =>\n Object.fromEntries(\n filters.value.map((section) => [section, sectionIds[section]]),\n ) as Record<Filter, string>,\n)\n\n/**\n * Hide auth selector in readonly mode when no security schemes are defined.\n * This keeps the UI clean when there are no authentication options available.\n */\nconst isAuthHidden = computed(\n () => layout === 'modal' && !Object.keys(securitySchemes ?? {}).length,\n)\n\n/**\n * Keep auth available for unauthenticated operations, but collapse it by default\n * in readonly modal layouts unless a requirement or manual selection exists.\n */\nconst isAuthDefaultOpen = computed(\n () =>\n layout !== 'modal' ||\n Boolean(\n securityRequirements?.length || selectedSecurity.selectedSchemes.length,\n ),\n)\n\n/** Get a sensible placeholder for the request name input */\nconst requestNamePlaceholder = computed(() => {\n if (operation.summary) {\n return operation.summary\n }\n const cleanPath = path.replace(REGEX.PROTOCOL, '')\n return cleanPath || 'Request Name'\n})\n\n/** Check if the section should be shown based on the selected filter */\nconst isSectionVisible = (section: Filter): boolean => {\n return selectedFilter.value === 'All' || selectedFilter.value === section\n}\n\n/**\n * Reset filter to 'All' if Body filter is selected but method changes to one that cannot have a body.\n * This prevents showing an empty Body section when switching methods.\n */\nwatch(\n () => method,\n (newMethod) => {\n if (selectedFilter.value === 'Body' && !canMethodHaveBody(newMethod)) {\n selectedFilter.value = 'All'\n }\n },\n)\n\nwatch(\n () => [method, path, exampleKey],\n () => {\n deletedExpandedParameterPaths.value = {}\n },\n)\n\n/** Handle operation summary updates */\nconst handleSummaryUpdate = (event: Event): void => {\n const summary = (event.target as HTMLInputElement).value\n eventBus.emit('operation:update:meta', {\n meta: meta.value,\n payload: { summary: summary.trim() },\n })\n}\n\n/** Parameter handlers */\nconst parameterHandlers = computed(() => ({\n path: createParameterHandlers('path', eventBus, meta.value, {\n context: sections.value.path ?? [],\n }),\n cookie: createParameterHandlers('cookie', eventBus, meta.value, {\n context: cookies.value ?? [],\n globalParameters: defaultCookies.value.length,\n }),\n header: createParameterHandlers('header', eventBus, meta.value, {\n context: headers.value,\n defaultParameters: defaultHeaders.value.length,\n }),\n query: createParameterHandlers('query', eventBus, meta.value, {\n context: sections.value.query ?? [],\n onDeleteExpandedRow: (row) => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const key = getExpandedParameterKey(row.originalParameter)\n deletedExpandedParameterPaths.value = {\n ...deletedExpandedParameterPaths.value,\n [key]: [\n ...(deletedExpandedParameterPaths.value[key] ?? []),\n row.sourceParameterValuePath,\n ],\n }\n },\n }),\n}))\n\n/** Handle request body content type update */\nconst handleUpdateContentType = (payload: { value: string }): void =>\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType: payload.value },\n meta: meta.value,\n })\n\n/** Handle request body value update */\nconst handleUpdateBodyValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:value'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey =\n typeof payload === 'string'\n ? `update:requestBody:value-${contentType}`\n : undefined\n\n eventBus.emit(\n 'operation:update:requestBody:value',\n {\n payload,\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/** Handle request body value update */\nconst handleUpdateBodyFormValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:formValue'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey = `update:requestBody:${contentType}-form-value`\n\n eventBus.emit(\n 'operation:update:requestBody:formValue',\n {\n payload: payload.map((row) => unpackProxyObject(row, { depth: 1 })),\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\nconst labelRequestNameId = useId()\n\nconst globalCookies = computed(() => [...workspaceCookies, ...documentCookies])\n\n/** Allow updating the operation extensions for the plugins */\nconst updateOperationExtension = (\n payload: ApiReferenceEvents['operation:update:extension']['payload'],\n): void =>\n eventBus.emit('operation:update:extension', { payload, meta: meta.value })\n</script>\n<template>\n <ViewLayoutSection :aria-label=\"`Request: ${operation.summary}`\">\n <template #title>\n <div\n class=\"group pointer-events-none flex flex-1 items-center gap-1 lg:pr-24\">\n <label\n v-if=\"layout !== 'modal'\"\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"labelRequestNameId\" />\n <input\n v-if=\"layout !== 'modal'\"\n :id=\"labelRequestNameId\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative z-10 -ml-0.5 h-8 w-full rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"requestNamePlaceholder\"\n :value=\"operation.summary\"\n @blur=\"handleSummaryUpdate\" />\n <span\n v-else\n class=\"text-c-1 flex h-8 items-center\">\n {{ operation.summary }}\n </span>\n </div>\n <SectionFilter\n v-model=\"selectedFilter\"\n :filterIds=\"filterIds\"\n :filters=\"filters\" />\n </template>\n\n <div\n :id=\"filterIds.All\"\n class=\"request-section-content custom-scroll relative flex flex-1 flex-col\"\n :role=\"selectedFilter === 'All' ? 'tabpanel' : 'none'\">\n <!-- Auth Selector -->\n <AuthSelector\n v-show=\"isSectionVisible('Auth') && !isAuthHidden\"\n :id=\"filterIds.Auth\"\n :createAnySecurityScheme=\"layout !== 'modal'\"\n :defaultOpen=\"isAuthDefaultOpen\"\n :environment\n :eventBus\n :meta=\"authMeta\"\n :options\n :proxyUrl\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :selectedSecuritySchemes\n :server\n title=\"Authentication\" />\n\n <!-- Variables (Path Parameters) -->\n <RequestParams\n v-show=\"isSectionVisible('Variables') && sections.path?.length\"\n :id=\"filterIds.Variables\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.path ?? []\"\n :showAddRowPlaceholder=\"false\"\n title=\"Variables\"\n v-on=\"parameterHandlers.path\" />\n\n <!-- Cookies -->\n <RequestParams\n v-show=\"isSectionVisible('Cookies')\"\n :id=\"filterIds.Cookies\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"cookies ?? []\"\n :showAddRowPlaceholder=\"true\"\n title=\"Cookies\"\n v-on=\"parameterHandlers.cookie\" />\n\n <!-- Headers -->\n <RequestParams\n v-show=\"isSectionVisible('Headers')\"\n :id=\"filterIds.Headers\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"headers ?? []\"\n title=\"Headers\"\n v-on=\"parameterHandlers.header\" />\n\n <!-- Query Parameters -->\n <RequestParams\n v-show=\"isSectionVisible('Query')\"\n :id=\"filterIds.Query\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.query ?? []\"\n title=\"Query Parameters\"\n v-on=\"parameterHandlers.query\" />\n\n <!-- Request Body -->\n <RequestBody\n v-show=\"isSectionVisible('Body') && canMethodHaveBody(method)\"\n :id=\"filterIds.Body\"\n :environment\n :exampleKey\n :requestBody=\"getResolvedRef(operation.requestBody)\"\n :requestBodyCompositionSelection\n title=\"Request Body\"\n @update:contentType=\"handleUpdateContentType\"\n @update:formValue=\"handleUpdateBodyFormValue\"\n @update:value=\"handleUpdateBodyValue\" />\n\n <!-- Inject request section plugin components -->\n <ScalarErrorBoundary\n v-for=\"(plugin, index) in plugins\"\n :key=\"index\">\n <component\n :is=\"plugin.components.request.component\"\n v-if=\"plugin?.components?.request\"\n v-show=\"selectedFilter === 'All'\"\n :operation\n v-bind=\"plugin.components.request.additionalProps\"\n @operation:update:extension=\"updateOperationExtension\" />\n </ScalarErrorBoundary>\n\n <!-- Spacer -->\n <div class=\"flex grow\" />\n <!-- Code Snippet -->\n <RequestCodeSnippet\n v-show=\"selectedFilter === 'All'\"\n :clientOptions\n :eventBus\n :globalCookies\n integration=\"client\"\n :method\n :operation\n :path\n :securitySchemes=\"selectedSecuritySchemes\"\n :selectedClient\n :selectedContentType=\"\n getResolvedRef(operation.requestBody)?.[\n 'x-scalar-selected-content-type'\n ]?.[exampleKey]\n \"\n :selectedServer=\"server ?? undefined\" />\n </div>\n </ViewLayoutSection>\n</template>\n<style scoped>\n.request-section-content {\n --scalar-border-width: 0.5px;\n}\n.request-section-content-filter {\n box-shadow: 0 -10px 0 10px var(--scalar-background-1);\n}\n.request-item:focus-within .request-meta-buttons {\n opacity: 1;\n}\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n"],"mappings":""}
@@ -8,13 +8,13 @@ import { createParameterRows } from "./helpers/create-parameter-rows.js";
8
8
  import { groupBy } from "./helpers/group-by.js";
9
9
  import AuthSelector_default from "../scalar-auth-selector-block/components/AuthSelector.vue.js";
10
10
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, openBlock, ref, renderList, resolveDynamicComponent, toDisplayString, toHandlers, unref, useId, vShow, watch, withCtx, withDirectives } from "vue";
11
- import { ScalarErrorBoundary } from "@scalar/components";
12
11
  import { filterGlobalCookie, getEnvironmentVariables, getResolvedUrl } from "@scalar/workspace-store/request-example";
13
12
  import { REGEX } from "@scalar/helpers/regex/regex-helpers";
14
13
  import { canMethodHaveBody } from "@scalar/helpers/http/can-method-have-body";
15
14
  import { getResolvedRef } from "@scalar/workspace-store/helpers/get-resolved-ref";
16
15
  import { unpackProxyObject } from "@scalar/workspace-store/helpers/unpack-proxy";
17
16
  import { replaceEnvVariables } from "@scalar/helpers/regex/replace-variables";
17
+ import { ScalarErrorBoundary } from "@scalar/components/error-boundary";
18
18
  //#region src/v2/blocks/request-block/RequestBlock.vue?vue&type=script&setup=true&lang.ts
19
19
  var _hoisted_1 = { class: "group pointer-events-none flex flex-1 items-center gap-1 lg:pr-24" };
20
20
  var _hoisted_2 = ["for"];