@scalar/api-client 3.14.0 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/assets/computer.ascii.virtual.js.map +1 -1
- package/dist/components/HelpfulLink.vue.script.js +1 -1
- package/dist/components/HelpfulLink.vue.script.js.map +1 -1
- package/dist/components/HttpMethod/HttpMethod.vue.js +1 -1
- package/dist/components/HttpMethod/HttpMethod.vue.script.js +1 -1
- package/dist/components/HttpMethod/HttpMethod.vue.script.js.map +1 -1
- package/dist/components/ScalarAsciiArt/ScalarAsciiArt.vue.js +1 -1
- package/dist/components/ScalarAsciiArt/ScalarAsciiArt.vue.script.js +1 -1
- package/dist/components/ScalarAsciiArt/ScalarAsciiArt.vue.script.js.map +1 -1
- package/dist/components/SectionFilter.vue.d.ts +1 -1
- package/dist/components/SectionFilter.vue.d.ts.map +1 -1
- package/dist/components/SectionFilter.vue.js +1 -1
- package/dist/components/SectionFilter.vue.script.js +2 -2
- package/dist/components/SectionFilter.vue.script.js.map +1 -1
- package/dist/components/SectionFilterButton.vue.script.js +1 -1
- package/dist/components/SectionFilterButton.vue.script.js.map +1 -1
- package/dist/components/Server/ServerVariablesForm.vue.d.ts.map +1 -1
- package/dist/components/Server/ServerVariablesForm.vue.script.js +1 -1
- package/dist/components/Server/ServerVariablesForm.vue.script.js.map +1 -1
- package/dist/components/Server/ServerVariablesSelect.vue.script.js +1 -1
- package/dist/components/Server/ServerVariablesSelect.vue.script.js.map +1 -1
- package/dist/components/Server/ServerVariablesTextbox.vue.script.js +1 -1
- package/dist/components/Server/ServerVariablesTextbox.vue.script.js.map +1 -1
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.d.ts.map +1 -1
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.script.js +1 -1
- package/dist/components/Sidebar/Actions/DeleteSidebarListElement.vue.script.js.map +1 -1
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.d.ts.map +1 -1
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js +1 -1
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.script.js.map +1 -1
- package/dist/components/ViewLayout/ViewLayout.vue.script.js +1 -1
- package/dist/components/ViewLayout/ViewLayout.vue.script.js.map +1 -1
- package/dist/components/ViewLayout/ViewLayoutContent.vue.js +1 -1
- package/dist/components/ViewLayout/ViewLayoutContent.vue.js.map +1 -1
- package/dist/components/ViewLayout/ViewLayoutSection.vue.script.js +1 -1
- package/dist/components/ViewLayout/ViewLayoutSection.vue.script.js.map +1 -1
- package/dist/hooks/use-file-dialog.js +2 -1
- package/dist/hooks/use-file-dialog.js.map +1 -1
- package/dist/plugins/posthog/index.js.map +1 -1
- package/dist/plugins/posthog/sanitize-event-payload.js +1 -1
- package/dist/plugins/posthog/sanitize-event-payload.js.map +1 -1
- package/dist/style.css +298 -275
- package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +38 -6
- package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
- package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/components/Header.vue.js +1 -1
- package/dist/v2/blocks/operation-block/components/Header.vue.script.js +1 -1
- package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -1
- package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js +1 -1
- package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js +1 -1
- package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/decode-buffer.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/get-cookie-header-keys.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-request.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/persist-response-cookies.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/persist-script-environment.d.ts +53 -0
- package/dist/v2/blocks/operation-block/helpers/persist-script-environment.d.ts.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/persist-script-environment.js +91 -0
- package/dist/v2/blocks/operation-block/helpers/persist-script-environment.js.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/response-cache.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js.map +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +58 -29
- package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.script.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.script.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyStructured.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.script.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts +2 -0
- package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestParams.vue.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js +5 -3
- package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +2 -0
- package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTable.vue.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestTable.vue.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js +6 -3
- package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts +8 -0
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +29 -16
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableTooltip.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/create-parameter-rows.js +1 -1
- package/dist/v2/blocks/request-block/helpers/create-parameter-rows.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/files.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/fold-structured-body-rows.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +10 -5
- package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/get-parameter-content.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/get-parameter-schema.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/get-structured-body-rows.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/group-by.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/group-global-cookies.d.ts +54 -0
- package/dist/v2/blocks/request-block/helpers/group-global-cookies.d.ts.map +1 -0
- package/dist/v2/blocks/request-block/helpers/group-global-cookies.js +56 -0
- package/dist/v2/blocks/request-block/helpers/group-global-cookies.js.map +1 -0
- package/dist/v2/blocks/request-block/helpers/structured-body-codec.js +1 -1
- package/dist/v2/blocks/request-block/helpers/structured-body-codec.js.map +1 -1
- package/dist/v2/blocks/request-block/helpers/validate-parameter.js.map +1 -1
- package/dist/v2/blocks/response-block/ResponseBlock.vue.d.ts.map +1 -1
- package/dist/v2/blocks/response-block/ResponseBlock.vue.js +1 -1
- package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/Headers.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/Headers.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBody.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyDownload.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyInfo.vue.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyInfo.vue.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.d.ts.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js +10 -3
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyRaw.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.d.ts.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyStreaming.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyToggle.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyVirtual.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseCookies.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseCookies.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.d.ts.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseLoadingOverlay.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.script.js +1 -1
- package/dist/v2/blocks/response-block/components/ResponseMetaInformation.vue.script.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/extract-filename.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/get-content-length.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/media-types.d.ts +1 -1
- package/dist/v2/blocks/response-block/helpers/media-types.d.ts.map +1 -1
- package/dist/v2/blocks/response-block/helpers/media-types.js +12 -0
- package/dist/v2/blocks/response-block/helpers/media-types.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/parse-set-cookie.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/prettify-jsonc-string.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/prettify-ndjson.d.ts +12 -0
- package/dist/v2/blocks/response-block/helpers/prettify-ndjson.d.ts.map +1 -0
- package/dist/v2/blocks/response-block/helpers/prettify-ndjson.js +19 -0
- package/dist/v2/blocks/response-block/helpers/prettify-ndjson.js.map +1 -0
- package/dist/v2/blocks/response-block/helpers/process-response-body.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/resolve-response-body-handler.js.map +1 -1
- package/dist/v2/blocks/response-block/helpers/resolve-response-content-type.js +7 -1
- package/dist/v2/blocks/response-block/helpers/resolve-response-content-type.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/httpStatusCodeColors.js +3 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/httpStatusCodeColors.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/helpers/is-placeholder-path.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/helpers/refocus-blur-target.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/hooks/use-loading-animation.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/hooks/use-path-masking.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/DeleteRequestAuthModal.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OpenIDConnect.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js +3 -3
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js +24 -17
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/auth-options.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js +5 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-callback.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-callback.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.d.ts +20 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.d.ts.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.js +27 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.js.map +1 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +2 -2
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/resolve-default-oauth2-redirect-url.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/run-oauth2-authorize.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js +15 -6
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.script.js +6 -1
- package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.d.ts.map +1 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.js +1 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.script.js +5 -1
- package/dist/v2/components/code-input/CodeInputLite.vue.script.js.map +1 -1
- package/dist/v2/components/code-input/PillTooltipHost.vue.script.js +1 -1
- package/dist/v2/components/code-input/PillTooltipHost.vue.script.js.map +1 -1
- package/dist/v2/components/code-input/code-variable-widget.js +1 -0
- package/dist/v2/components/code-input/code-variable-widget.js.map +1 -1
- package/dist/v2/components/code-input/helpers/build-pill-context.js.map +1 -1
- package/dist/v2/components/code-input/helpers/lookup-variable-value.js.map +1 -1
- package/dist/v2/components/code-input/helpers/pill-signature.js.map +1 -1
- package/dist/v2/components/code-input/helpers/serialize-value.js.map +1 -1
- package/dist/v2/components/context-menu/ContextMenu.vue.script.js +1 -1
- package/dist/v2/components/context-menu/ContextMenu.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTable.vue.script.js +1 -1
- package/dist/v2/components/data-table/DataTable.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableCell.vue.script.js +1 -1
- package/dist/v2/components/data-table/DataTableCell.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js +1 -1
- package/dist/v2/components/data-table/DataTableCheckbox.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableHeader.vue.script.js +1 -1
- package/dist/v2/components/data-table/DataTableHeader.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.d.ts.map +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.js +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.script.js +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts.map +1 -1
- package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js +3 -2
- package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableRow.vue.js +1 -1
- package/dist/v2/components/data-table/DataTableRow.vue.js.map +1 -1
- package/dist/v2/components/data-table/DataTableText.vue.script.js +1 -1
- package/dist/v2/components/data-table/DataTableText.vue.script.js.map +1 -1
- package/dist/v2/components/forms/ConfirmationForm.vue.d.ts.map +1 -1
- package/dist/v2/components/forms/ConfirmationForm.vue.script.js +1 -1
- package/dist/v2/components/forms/ConfirmationForm.vue.script.js.map +1 -1
- package/dist/v2/components/layout/CollapsibleSection.vue.d.ts.map +1 -1
- package/dist/v2/components/layout/CollapsibleSection.vue.script.js +1 -1
- package/dist/v2/components/layout/CollapsibleSection.vue.script.js.map +1 -1
- package/dist/v2/components/layout/ValueEmitter.vue.d.ts +1 -1
- package/dist/v2/components/layout/ValueEmitter.vue.d.ts.map +1 -1
- package/dist/v2/components/layout/ValueEmitter.vue.script.js +1 -1
- package/dist/v2/components/layout/ValueEmitter.vue.script.js.map +1 -1
- package/dist/v2/components/modals/DeleteModal.vue.d.ts.map +1 -1
- package/dist/v2/components/modals/DeleteModal.vue.script.js +1 -1
- package/dist/v2/components/modals/DeleteModal.vue.script.js.map +1 -1
- package/dist/v2/components/modals/ModalClientContainer.vue.js +1 -1
- package/dist/v2/components/modals/ModalClientContainer.vue.script.js +1 -1
- package/dist/v2/components/modals/ModalClientContainer.vue.script.js.map +1 -1
- package/dist/v2/components/resize/Resize.vue.js +1 -1
- package/dist/v2/components/resize/Resize.vue.script.js +1 -1
- package/dist/v2/components/resize/Resize.vue.script.js.map +1 -1
- package/dist/v2/components/resize/use-split-resize.js +4 -2
- package/dist/v2/components/resize/use-split-resize.js.map +1 -1
- package/dist/v2/components/server/ServerDropdown.vue.d.ts.map +1 -1
- package/dist/v2/components/server/ServerDropdown.vue.script.js +1 -1
- package/dist/v2/components/server/ServerDropdown.vue.script.js.map +1 -1
- package/dist/v2/components/server/ServerDropdownItem.vue.d.ts.map +1 -1
- package/dist/v2/components/server/ServerDropdownItem.vue.js +1 -1
- package/dist/v2/components/server/ServerDropdownItem.vue.script.js +1 -1
- package/dist/v2/components/server/ServerDropdownItem.vue.script.js.map +1 -1
- package/dist/v2/components/sidebar/Sidebar.vue.d.ts.map +1 -1
- package/dist/v2/components/sidebar/Sidebar.vue.script.js +3 -3
- package/dist/v2/components/sidebar/Sidebar.vue.script.js.map +1 -1
- package/dist/v2/components/sidebar/SidebarMenu.vue.d.ts.map +1 -1
- package/dist/v2/components/sidebar/SidebarMenu.vue.script.js +1 -1
- package/dist/v2/components/sidebar/SidebarMenu.vue.script.js.map +1 -1
- package/dist/v2/components/sidebar/SidebarToggle.vue.script.js +1 -1
- package/dist/v2/components/sidebar/SidebarToggle.vue.script.js.map +1 -1
- package/dist/v2/constants.js +1 -1
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js +1 -1
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.script.js.map +1 -1
- package/dist/v2/features/command-palette/components/CommandActionInput.vue.script.js +1 -1
- package/dist/v2/features/command-palette/components/CommandActionInput.vue.script.js.map +1 -1
- package/dist/v2/features/environments/EnvironmentsList.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/EnvironmentsList.vue.script.js +1 -1
- package/dist/v2/features/environments/EnvironmentsList.vue.script.js.map +1 -1
- package/dist/v2/features/environments/components/Environment.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/components/Environment.vue.script.js +1 -1
- package/dist/v2/features/environments/components/Environment.vue.script.js.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentColors.vue.script.js +3 -2
- package/dist/v2/features/environments/components/EnvironmentColors.vue.script.js.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js +1 -1
- package/dist/v2/features/environments/components/EnvironmentCreateModal.vue.script.js.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js +1 -1
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.script.js.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.js +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesTable.vue.script.js.map +1 -1
- package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
- package/dist/v2/features/modal/Modal.vue.script.js +1 -1
- package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
- package/dist/v2/features/modal/helpers/create-api-client-modal.js +11 -0
- package/dist/v2/features/modal/helpers/create-api-client-modal.js.map +1 -1
- package/dist/v2/features/modal/helpers/map-hidden-clients-config.js.map +1 -1
- package/dist/v2/features/modal/helpers/resolve-route-parameters.js +1 -1
- package/dist/v2/features/modal/helpers/resolve-route-parameters.js.map +1 -1
- package/dist/v2/features/modal/hooks/use-modal-sidebar.js.map +1 -1
- package/dist/v2/features/modal/modal-events.js.map +1 -1
- package/dist/v2/features/operation/Operation.vue.script.js +1 -1
- package/dist/v2/features/operation/Operation.vue.script.js.map +1 -1
- package/dist/v2/features/search/components/DocumentSearchModal.vue.d.ts.map +1 -1
- package/dist/v2/features/search/components/DocumentSearchModal.vue.js +1 -1
- package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js +1 -1
- package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js.map +1 -1
- package/dist/v2/features/search/components/SearchResult.vue.d.ts.map +1 -1
- package/dist/v2/features/search/components/SearchResult.vue.script.js +1 -1
- package/dist/v2/features/search/components/SearchResult.vue.script.js.map +1 -1
- package/dist/v2/features/search/helpers/create-fuse-instance.js.map +1 -1
- package/dist/v2/features/search/helpers/create-search-index.js.map +1 -1
- package/dist/v2/features/search/hooks/use-document-search.js.map +1 -1
- package/dist/v2/features/search/hooks/use-search-index.js.map +1 -1
- package/dist/v2/helpers/generate-location-id.js.map +1 -1
- package/dist/v2/helpers/handle-hotkeys.js +1 -1
- package/dist/v2/helpers/handle-hotkeys.js.map +1 -1
- package/dist/v2/helpers/test-utils.js.map +1 -1
- package/dist/v2/hooks/use-global-hot-keys.js.map +1 -1
- package/dist/v2/hooks/use-scroll-lock.js.map +1 -1
- package/dist/v2/workspace-events.js.map +1 -1
- package/dist/vue-styles.css +229 -236
- package/package.json +20 -20
|
@@ -15,7 +15,7 @@ var _hoisted_1 = {
|
|
|
15
15
|
};
|
|
16
16
|
var _hoisted_2 = { class: "box-content flex min-h-8 items-center justify-between border-y px-3" };
|
|
17
17
|
var _hoisted_3 = { class: "text-xxs font-code leading-5" };
|
|
18
|
-
var ResponseBody_vue_vue_type_script_setup_true_lang_default =
|
|
18
|
+
var ResponseBody_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
19
19
|
__name: "ResponseBody",
|
|
20
20
|
props: {
|
|
21
21
|
title: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBody.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBody.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { CodeMirrorLanguage } from '@scalar/use-codemirror'\nimport { computed, ref } from 'vue'\n\nimport { getMediaTypeConfig } from '@/v2/blocks/response-block/helpers/media-types'\nimport { processResponseBody } from '@/v2/blocks/response-block/helpers/process-response-body'\nimport { resolveResponseBodyHandler } from '@/v2/blocks/response-block/helpers/resolve-response-body-handler'\nimport { CollapsibleSection } from '@/v2/components/layout'\n\nimport ResponseBodyDownload from './ResponseBodyDownload.vue'\nimport ResponseBodyInfo from './ResponseBodyInfo.vue'\nimport ResponseBodyPreview from './ResponseBodyPreview.vue'\nimport ResponseBodyRaw from './ResponseBodyRaw.vue'\nimport ResponseBodyToggle from './ResponseBodyToggle.vue'\n\nconst {\n data,\n headers,\n plugins = [],\n} = defineProps<{\n title: string\n layout: 'client' | 'reference'\n data: unknown\n headers: { name: string; value: string }[]\n plugins?: ClientPlugin[]\n}>()\n\n/** Preview / Raw toggle */\nconst toggle = ref(true)\n\nconst responseBody = computed(() =>\n processResponseBody({\n data,\n headers,\n }),\n)\n\nconst mimeEssence = computed(() => responseBody.value.mimeType.essence)\n\nconst mediaConfig = computed(() => getMediaTypeConfig(mimeEssence.value))\n\nconst pluginHandler = computed(() =>\n resolveResponseBodyHandler(mimeEssence.value, plugins),\n)\n\nconst hasRaw = computed(\n () =>\n !!pluginHandler.value?.rawComponent ||\n !!pluginHandler.value?.decode ||\n !!mediaConfig.value?.raw,\n)\n\nconst hasPreview = computed(\n () => !!pluginHandler.value?.previewComponent || !!mediaConfig.value?.preview,\n)\n\nconst showToggle = computed(() => hasRaw.value && hasPreview.value)\n\nconst showPreview = computed(() => toggle.value || !showToggle.value)\nconst showRaw = computed(() => !toggle.value || !showToggle.value)\n\nconst rawLanguage = computed(\n () => pluginHandler.value?.language ?? mediaConfig.value?.language,\n)\n</script>\n<template>\n <CollapsibleSection\n class=\"max-h-content overflow-y-hidden\"\n :isStatic=\"layout === 'reference'\">\n <template #title>{{ title }}</template>\n <template\n v-if=\"data && responseBody.dataUrl\"\n #actions>\n <ResponseBodyDownload\n :filename=\"responseBody.attachmentFilename\"\n :href=\"responseBody.dataUrl\"\n :type=\"responseBody.mimeType?.essence\" />\n </template>\n <div\n v-if=\"data\"\n class=\"bg-b-1 flex max-h-[calc(100%-32px)] flex-col overflow-hidden\">\n <div\n class=\"box-content flex min-h-8 items-center justify-between border-y px-3\">\n <span class=\"text-xxs font-code leading-5\">\n {{ mimeEssence }}\n </span>\n <ResponseBodyToggle\n v-if=\"showToggle\"\n v-model=\"toggle\" />\n </div>\n\n <!-- Plugin custom preview component -->\n <component\n :is=\"pluginHandler.previewComponent\"\n v-if=\"pluginHandler?.previewComponent && hasPreview && showPreview\"\n :key=\"`plugin-preview-${responseBody.dataUrl}`\"\n :content=\"data\"\n :contentType=\"mimeEssence\"\n :dataUrl=\"responseBody.dataUrl\" />\n <!-- Default preview renderer (JSON, image, video, HTML object, …) -->\n <ResponseBodyPreview\n v-else-if=\"mediaConfig?.preview && showPreview\"\n :key=\"`preview-${responseBody.dataUrl}`\"\n :alpha=\"mediaConfig.alpha\"\n :content=\"data\"\n :mode=\"mediaConfig.preview\"\n :src=\"responseBody.dataUrl\"\n :type=\"mimeEssence\" />\n\n <!-- Plugin custom raw component -->\n <component\n :is=\"pluginHandler.rawComponent\"\n v-if=\"pluginHandler?.rawComponent && hasRaw && showRaw\"\n :key=\"`plugin-raw-${responseBody.dataUrl}`\"\n :content=\"data\"\n :contentType=\"mimeEssence\" />\n <!-- Default raw: exact decoded body (no JSON pretty-print) -->\n <ResponseBodyRaw\n v-else-if=\"hasRaw && showRaw && !pluginHandler?.rawComponent\"\n :key=\"`raw-${responseBody.dataUrl}`\"\n :content=\"data\"\n :language=\"rawLanguage as CodeMirrorLanguage\" />\n\n <ResponseBodyInfo v-if=\"!hasRaw && !hasPreview\">\n Binary file\n </ResponseBodyInfo>\n </div>\n </CollapsibleSection>\n</template>\n<style scoped>\n.scalar-code-block :deep(.hljs *) {\n font-size: var(--scalar-small);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BA,MAAM,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"ResponseBody.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBody.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { CodeMirrorLanguage } from '@scalar/use-codemirror'\nimport { computed, ref } from 'vue'\n\nimport { getMediaTypeConfig } from '@/v2/blocks/response-block/helpers/media-types'\nimport { processResponseBody } from '@/v2/blocks/response-block/helpers/process-response-body'\nimport { resolveResponseBodyHandler } from '@/v2/blocks/response-block/helpers/resolve-response-body-handler'\nimport { CollapsibleSection } from '@/v2/components/layout'\n\nimport ResponseBodyDownload from './ResponseBodyDownload.vue'\nimport ResponseBodyInfo from './ResponseBodyInfo.vue'\nimport ResponseBodyPreview from './ResponseBodyPreview.vue'\nimport ResponseBodyRaw from './ResponseBodyRaw.vue'\nimport ResponseBodyToggle from './ResponseBodyToggle.vue'\n\nconst {\n data,\n headers,\n plugins = [],\n} = defineProps<{\n title: string\n layout: 'client' | 'reference'\n data: unknown\n headers: { name: string; value: string }[]\n plugins?: ClientPlugin[]\n}>()\n\n/** Preview / Raw toggle */\nconst toggle = ref(true)\n\nconst responseBody = computed(() =>\n processResponseBody({\n data,\n headers,\n }),\n)\n\nconst mimeEssence = computed(() => responseBody.value.mimeType.essence)\n\nconst mediaConfig = computed(() => getMediaTypeConfig(mimeEssence.value))\n\nconst pluginHandler = computed(() =>\n resolveResponseBodyHandler(mimeEssence.value, plugins),\n)\n\nconst hasRaw = computed(\n () =>\n !!pluginHandler.value?.rawComponent ||\n !!pluginHandler.value?.decode ||\n !!mediaConfig.value?.raw,\n)\n\nconst hasPreview = computed(\n () => !!pluginHandler.value?.previewComponent || !!mediaConfig.value?.preview,\n)\n\nconst showToggle = computed(() => hasRaw.value && hasPreview.value)\n\nconst showPreview = computed(() => toggle.value || !showToggle.value)\nconst showRaw = computed(() => !toggle.value || !showToggle.value)\n\nconst rawLanguage = computed(\n () => pluginHandler.value?.language ?? mediaConfig.value?.language,\n)\n</script>\n<template>\n <CollapsibleSection\n class=\"max-h-content overflow-y-hidden\"\n :isStatic=\"layout === 'reference'\">\n <template #title>{{ title }}</template>\n <template\n v-if=\"data && responseBody.dataUrl\"\n #actions>\n <ResponseBodyDownload\n :filename=\"responseBody.attachmentFilename\"\n :href=\"responseBody.dataUrl\"\n :type=\"responseBody.mimeType?.essence\" />\n </template>\n <div\n v-if=\"data\"\n class=\"bg-b-1 flex max-h-[calc(100%-32px)] flex-col overflow-hidden\">\n <div\n class=\"box-content flex min-h-8 items-center justify-between border-y px-3\">\n <span class=\"text-xxs font-code leading-5\">\n {{ mimeEssence }}\n </span>\n <ResponseBodyToggle\n v-if=\"showToggle\"\n v-model=\"toggle\" />\n </div>\n\n <!-- Plugin custom preview component -->\n <component\n :is=\"pluginHandler.previewComponent\"\n v-if=\"pluginHandler?.previewComponent && hasPreview && showPreview\"\n :key=\"`plugin-preview-${responseBody.dataUrl}`\"\n :content=\"data\"\n :contentType=\"mimeEssence\"\n :dataUrl=\"responseBody.dataUrl\" />\n <!-- Default preview renderer (JSON, image, video, HTML object, …) -->\n <ResponseBodyPreview\n v-else-if=\"mediaConfig?.preview && showPreview\"\n :key=\"`preview-${responseBody.dataUrl}`\"\n :alpha=\"mediaConfig.alpha\"\n :content=\"data\"\n :mode=\"mediaConfig.preview\"\n :src=\"responseBody.dataUrl\"\n :type=\"mimeEssence\" />\n\n <!-- Plugin custom raw component -->\n <component\n :is=\"pluginHandler.rawComponent\"\n v-if=\"pluginHandler?.rawComponent && hasRaw && showRaw\"\n :key=\"`plugin-raw-${responseBody.dataUrl}`\"\n :content=\"data\"\n :contentType=\"mimeEssence\" />\n <!-- Default raw: exact decoded body (no JSON pretty-print) -->\n <ResponseBodyRaw\n v-else-if=\"hasRaw && showRaw && !pluginHandler?.rawComponent\"\n :key=\"`raw-${responseBody.dataUrl}`\"\n :content=\"data\"\n :language=\"rawLanguage as CodeMirrorLanguage\" />\n\n <ResponseBodyInfo v-if=\"!hasRaw && !hasPreview\">\n Binary file\n </ResponseBodyInfo>\n </div>\n </CollapsibleSection>\n</template>\n<style scoped>\n.scalar-code-block :deep(.hljs *) {\n font-size: var(--scalar-small);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BA,MAAM,SAAS,IAAI,IAAI;EAEvB,MAAM,eAAe,eACnB,oBAAoB;GAClB,MAAG,QAAA;GACH,SAAM,QAAA;EACR,CAAC,CACH;EAEA,MAAM,cAAc,eAAe,aAAa,MAAM,SAAS,OAAO;EAEtE,MAAM,cAAc,eAAe,mBAAmB,YAAY,KAAK,CAAC;EAExE,MAAM,gBAAgB,eACpB,2BAA2B,YAAY,OAAO,QAAA,OAAO,CACvD;EAEA,MAAM,SAAS,eAEX,CAAC,CAAC,cAAc,OAAO,gBACvB,CAAC,CAAC,cAAc,OAAO,UACvB,CAAC,CAAC,YAAY,OAAO,GACzB;EAEA,MAAM,aAAa,eACX,CAAC,CAAC,cAAc,OAAO,oBAAoB,CAAC,CAAC,YAAY,OAAO,OACxE;EAEA,MAAM,aAAa,eAAe,OAAO,SAAS,WAAW,KAAK;EAElE,MAAM,cAAc,eAAe,OAAO,SAAS,CAAC,WAAW,KAAK;EACpE,MAAM,UAAU,eAAe,CAAC,OAAO,SAAS,CAAC,WAAW,KAAK;EAEjE,MAAM,cAAc,eACZ,cAAc,OAAO,YAAY,YAAY,OAAO,QAC5D;;uBAGE,YA6DqB,MAAA,0BAAA,GAAA;IA5DnB,OAAM;IACL,UAAU,QAAA,WAAM;;IACN,OAAK,cAAY,CAAA,gBAAA,gBAAR,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA;2BAyDnB,CA/CE,QAAA,QAAA,UAAA,GADR,mBAgDM,OAhDN,YAgDM;KA7CJ,mBAQM,OARN,YAQM,CANJ,mBAEO,QAFP,YAEO,gBADF,YAAA,KAAW,GAAA,CAAA,GAGR,WAAA,SAAA,UAAA,GADR,YAEqB,4BAAA;;kBAAV,OAAA;0EAAM,QAAA;;KAMX,cAAA,OAAe,oBAAoB,WAAA,SAAc,YAAA,SAAA,UAAA,GAFzD,YAMoC,wBAL7B,cAAA,MAAc,gBAAgB,GAAA;MAElC,KAAG,kBAAoB,aAAA,MAAa;MACpC,SAAS,QAAA;MACT,aAAa,YAAA;MACb,SAAS,aAAA,MAAa;;;;;WAGZ,YAAA,OAAa,WAAW,YAAA,SAAA,UAAA,GADrC,YAOwB,6BAAA;MALrB,KAAG,WAAa,aAAA,MAAa;MAC7B,OAAO,YAAA,MAAY;MACnB,SAAS,QAAA;MACT,MAAM,YAAA,MAAY;MAClB,KAAK,aAAA,MAAa;MAClB,MAAM,YAAA;;;;;;;;KAKD,cAAA,OAAe,gBAAgB,OAAA,SAAU,QAAA,SAAA,UAAA,GAFjD,YAK+B,wBAJxB,cAAA,MAAc,YAAY,GAAA;MAE9B,KAAG,cAAgB,aAAA,MAAa;MAChC,SAAS,QAAA;MACT,aAAa,YAAA;gDAGH,OAAA,SAAU,QAAA,SAAO,CAAK,cAAA,OAAe,gBAAA,UAAA,GADlD,YAIkD,yBAAA;MAF/C,KAAG,OAAS,aAAA,MAAa;MACzB,SAAS,QAAA;MACT,UAAU,YAAA;;MAEY,OAAA,SAAM,CAAK,WAAA,SAAA,UAAA,GAApC,YAEmB,0BAAA,EAAA,KAAA,EAAA,GAAA;6BAAnB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFgD,iBAEhD,EAAA,CAAA,EAAA,CAAA;;;;;OAtDM,QAAA,QAAQ,aAAA,MAAa,UAAA;UAC1B;sBAI0C,CAH3C,YAG2C,8BAAA;KAFxC,UAAU,aAAA,MAAa;KACvB,MAAM,aAAA,MAAa;KACnB,MAAM,aAAA,MAAa,UAAU"}
|
|
@@ -3,7 +3,7 @@ import { computed, createElementBlock, createElementVNode, createVNode, defineCo
|
|
|
3
3
|
import { ScalarIcon } from "@scalar/components/icon";
|
|
4
4
|
//#region src/v2/blocks/response-block/components/ResponseBodyDownload.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var _hoisted_1 = ["download", "href"];
|
|
6
|
-
var ResponseBodyDownload_vue_vue_type_script_setup_true_lang_default =
|
|
6
|
+
var ResponseBodyDownload_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
7
7
|
__name: "ResponseBodyDownload",
|
|
8
8
|
props: {
|
|
9
9
|
href: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyDownload.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyDownload.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { computed } from 'vue'\n\nimport { getMediaTypeConfig } from '@/v2/blocks/response-block/helpers/media-types'\n\nconst props = defineProps<{\n href: string\n type?: string\n filename?: string\n}>()\n\nconst filenameExtension = computed(() => {\n const extension =\n getMediaTypeConfig(props.type ?? '')?.extension ?? '.unknown'\n return props.filename ? props.filename : `response${extension}`\n})\n</script>\n<template>\n <a\n class=\"text-c-3 text-xxs hover:bg-b-3 flex items-center gap-1 rounded px-1.5 py-0.5 no-underline\"\n :download=\"`${filenameExtension}`\"\n :href=\"href\"\n @click.stop>\n <ScalarIcon\n icon=\"Download\"\n size=\"xs\" />\n <span>\n <span>Download</span>\n <span class=\"sr-only\">Response Body</span>\n </span>\n </a>\n</template>\n"],"mappings":";;;;;;;;;;;;;EAMA,MAAM,QAAQ;EAMd,MAAM,oBAAoB,eAAe;GACvC,MAAM,YACJ,mBAAmB,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"ResponseBodyDownload.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyDownload.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { computed } from 'vue'\n\nimport { getMediaTypeConfig } from '@/v2/blocks/response-block/helpers/media-types'\n\nconst props = defineProps<{\n href: string\n type?: string\n filename?: string\n}>()\n\nconst filenameExtension = computed(() => {\n const extension =\n getMediaTypeConfig(props.type ?? '')?.extension ?? '.unknown'\n return props.filename ? props.filename : `response${extension}`\n})\n</script>\n<template>\n <a\n class=\"text-c-3 text-xxs hover:bg-b-3 flex items-center gap-1 rounded px-1.5 py-0.5 no-underline\"\n :download=\"`${filenameExtension}`\"\n :href=\"href\"\n @click.stop>\n <ScalarIcon\n icon=\"Download\"\n size=\"xs\" />\n <span>\n <span>Download</span>\n <span class=\"sr-only\">Response Body</span>\n </span>\n </a>\n</template>\n"],"mappings":";;;;;;;;;;;;;EAMA,MAAM,QAAQ;EAMd,MAAM,oBAAoB,eAAe;GACvC,MAAM,YACJ,mBAAmB,MAAM,QAAQ,EAAE,CAAC,EAAE,aAAa;GACrD,OAAO,MAAM,WAAW,MAAM,WAAW,WAAW;EACtD,CAAC;;uBAGC,mBAYI,KAAA;IAXF,OAAM;IACL,UAAQ,GAAK,kBAAA;IACb,MAAM,QAAA;IACN,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;OACX,YAEc,MAAA,UAAA,GAAA;IADZ,MAAK;IACL,MAAK;iCACP,mBAGO,QAAA,MAAA,CAFL,mBAAqB,QAAA,MAAf,UAAQ,GACd,mBAA0C,QAAA,EAApC,OAAM,UAAS,GAAC,eAAa,CAAA,GAAA,EAAA,EAAA,GAAA,GAAA,UAAA"}
|
|
@@ -7,7 +7,7 @@ var _hoisted_2 = { class: "text-c-3 p-2 text-sm" };
|
|
|
7
7
|
function _sfc_render(_ctx, _cache) {
|
|
8
8
|
return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [renderSlot(_ctx.$slots, "default")])]);
|
|
9
9
|
}
|
|
10
|
-
var ResponseBodyInfo_default =
|
|
10
|
+
var ResponseBodyInfo_default = /*#__PURE__*/ _plugin_vue_export_helper_default(_sfc_main, [["render", _sfc_render]]);
|
|
11
11
|
//#endregion
|
|
12
12
|
export { ResponseBodyInfo_default as default };
|
|
13
13
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyInfo.vue.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyInfo.vue"],"sourcesContent":["<template>\n <div class=\"flex justify-center px-2 py-3\">\n <div class=\"text-c-3 p-2 text-sm\"><slot /></div>\n </div>\n</template>\n"],"mappings":";;;;mBACO,OAAM,
|
|
1
|
+
{"version":3,"file":"ResponseBodyInfo.vue.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyInfo.vue"],"sourcesContent":["<template>\n <div class=\"flex justify-center px-2 py-3\">\n <div class=\"text-c-3 p-2 text-sm\"><slot /></div>\n </div>\n</template>\n"],"mappings":";;;;mBACO,OAAM,gCAA+B;mBACnC,OAAM,uBAAsB;;qBADnC,mBAEM,OAFN,YAEM,CADJ,mBAAgD,OAAhD,YAAgD,CAAd,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyPreview.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyPreview.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ResponseBodyPreview.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyPreview.vue"],"names":[],"mappings":"AAgMA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,gDAAgD,CAAA;AAMlF,KAAK,WAAW,GAAG;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,YAAY,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC3B,sGAAsG;IACtG,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;AAuQF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../../_virtual/_plugin-vue_
|
|
|
2
2
|
import ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default from "./ResponseBodyPreview.vue.script.js";
|
|
3
3
|
/* empty css */
|
|
4
4
|
//#region src/v2/blocks/response-block/components/ResponseBodyPreview.vue
|
|
5
|
-
var ResponseBodyPreview_default =
|
|
5
|
+
var ResponseBodyPreview_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a10b4008"]]);
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ResponseBodyPreview_default as default };
|
|
8
8
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyPreview.vue.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyPreview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\n\nimport { type MediaPreview } from '@/v2/blocks/response-block/helpers/media-types'\n\nimport ResponseBodyInfo from './ResponseBodyInfo.vue'\nimport ResponseBodyRaw from './ResponseBodyRaw.vue'\n\nconst {\n src,\n type,\n mode,\n alpha = false,\n content,\n} = defineProps<{\n src: string\n type: string\n mode: MediaPreview\n alpha?: boolean | undefined\n /** Decoded body; used when `mode` is `json` for pretty-printed preview (no JSON.parse round-trip). */\n content?: unknown\n}>()\n\nconst jsonPreviewContent = computed((): string => {\n const value = content\n if (typeof value === 'string') {\n return value\n }\n if (value == null) {\n return ''\n }\n return String(value)\n})\n\n/**\n * Validates the `src` against an allow-list of safe protocols before it is\n * passed to a rendering element. This blocks XSS vectors such as\n * `javascript:` and `vbscript:` URIs and also prevents accidentally embedding\n * a `data:text/html` payload that could execute script in the app origin.\n *\n * Allowed:\n * - `blob:` (the standard case — generated client-side by `URL.createObjectURL`)\n * - `http:` / `https:`\n * - `data:` URIs whose MIME type is a known safe media kind\n * (`image/*`, `video/*`, `audio/*`, `application/pdf`, `application/octet-stream`)\n *\n * Anything else (including malformed or relative URLs) collapses to an empty\n * string so the template falls back to the \"Preview unavailable\" message.\n */\nconst safeSrc = computed((): string => {\n if (!src) {\n return ''\n }\n\n if (/^data:/i.test(src)) {\n // The MIME type must be one of the known safe kinds AND be terminated by\n // `;` (parameters / `;base64`) or `,` (start of the payload). Anchoring\n // at the terminator prevents prefix-matching tricks like\n // `data:image/png-but-actually-html,…`.\n return /^data:(?:(?:image|video|audio)\\/[a-z0-9.+-]+|application\\/pdf|application\\/octet-stream)[;,]/i.test(\n src,\n )\n ? src\n : ''\n }\n\n try {\n const parsed = new URL(src)\n if (\n parsed.protocol === 'blob:' ||\n parsed.protocol === 'http:' ||\n parsed.protocol === 'https:'\n ) {\n return src\n }\n } catch {\n // Malformed or relative URL — refuse to render.\n }\n\n return ''\n})\n\nconst error = ref(false)\n\n/**\n * Whether the embedded document is a PDF.\n *\n * PDFs are rendered by the browser's own PDF engine (e.g. PDFium), which runs\n * in an isolated context that cannot reach this app's origin — its DOM,\n * cookies or storage. A PDF's embedded JavaScript therefore cannot be used to\n * attack us, and a strict `sandbox=\"\"` does not confine that engine; it only\n * prevents Chromium from loading the PDF viewer at all (it boots as a scripted\n * extension page), leaving the user with a blank frame. So PDFs are rendered\n * without the `sandbox` attribute, matching the original `<object>` behaviour.\n *\n * Everything else that reaches the iframe (notably `text/html`, the genuine\n * XSS vector) keeps the strict empty sandbox.\n */\nconst isPdf = computed(\n (): boolean => type.trim().toLowerCase() === 'application/pdf',\n)\n\nwatch(\n () => src,\n () => (error.value = false),\n)\n</script>\n<template>\n <ResponseBodyRaw\n v-if=\"mode === 'json'\"\n :content=\"jsonPreviewContent\"\n language=\"json\"\n prettyPrintJson />\n <div\n v-else-if=\"!error && safeSrc\"\n class=\"flex justify-center overflow-auto rounded-b\"\n :class=\"{ 'bg-preview p-2': alpha }\">\n <img\n v-if=\"mode === 'image'\"\n class=\"h-full max-w-full\"\n :class=\"{ rounded: alpha }\"\n :src=\"safeSrc\"\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\" />\n <video\n v-else-if=\"mode === 'video'\"\n autoplay\n controls\n referrerpolicy=\"no-referrer\"\n width=\"100%\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </video>\n <audio\n v-else-if=\"mode === 'audio'\"\n class=\"my-12\"\n controls\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </audio>\n <!--\n `<object>` would execute scripts inside the embedded document in the\n app's origin, so we render arbitrary previews inside an `<iframe>`\n instead. Non-PDF documents (notably `text/html`) get an empty `sandbox`\n attribute, which disables scripts, forms, popups and same-origin access.\n PDFs are exempted (see `isPdf` above): the empty sandbox does not confine\n the browser's PDF engine, it only stops the viewer from loading at all.\n\n Note: an `error` event on `<iframe>` is not reliably fired for failed\n navigations — browsers usually fire `load` even when the response is\n blank or an error page, and a cross-origin sandboxed frame cannot be\n introspected from JavaScript. There is therefore no useful runtime\n fallback for an unreachable URL; the URL allow-list above is what\n keeps unsafe content out in the first place.\n -->\n <iframe\n v-else\n class=\"aspect-[4/3] w-full border-0\"\n :src=\"safeSrc\"\n :sandbox=\"isPdf ? undefined : ''\"\n referrerpolicy=\"no-referrer\" />\n </div>\n <ResponseBodyInfo v-else>Preview unavailable</ResponseBodyInfo>\n</template>\n<style scoped>\n.light-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n.dark-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n</style>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"ResponseBodyPreview.vue.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyPreview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\n\nimport { type MediaPreview } from '@/v2/blocks/response-block/helpers/media-types'\nimport { prettifyNdjson } from '@/v2/blocks/response-block/helpers/prettify-ndjson'\n\nimport ResponseBodyInfo from './ResponseBodyInfo.vue'\nimport ResponseBodyRaw from './ResponseBodyRaw.vue'\n\nconst {\n src,\n type,\n mode,\n alpha = false,\n content,\n} = defineProps<{\n src: string\n type: string\n mode: MediaPreview\n alpha?: boolean | undefined\n /** Decoded body; used when `mode` is `json` for pretty-printed preview (no JSON.parse round-trip). */\n content?: unknown\n}>()\n\nconst jsonPreviewContent = computed((): string => {\n const value = content\n if (typeof value === 'string') {\n return value\n }\n if (value == null) {\n return ''\n }\n return String(value)\n})\n\n/** NDJSON pretty-printed one record per block for the `ndjson` preview. */\nconst ndjsonPreviewContent = computed((): string =>\n prettifyNdjson(jsonPreviewContent.value),\n)\n\n/**\n * Validates the `src` against an allow-list of safe protocols before it is\n * passed to a rendering element. This blocks XSS vectors such as\n * `javascript:` and `vbscript:` URIs and also prevents accidentally embedding\n * a `data:text/html` payload that could execute script in the app origin.\n *\n * Allowed:\n * - `blob:` (the standard case — generated client-side by `URL.createObjectURL`)\n * - `http:` / `https:`\n * - `data:` URIs whose MIME type is a known safe media kind\n * (`image/*`, `video/*`, `audio/*`, `application/pdf`, `application/octet-stream`)\n *\n * Anything else (including malformed or relative URLs) collapses to an empty\n * string so the template falls back to the \"Preview unavailable\" message.\n */\nconst safeSrc = computed((): string => {\n if (!src) {\n return ''\n }\n\n if (/^data:/i.test(src)) {\n // The MIME type must be one of the known safe kinds AND be terminated by\n // `;` (parameters / `;base64`) or `,` (start of the payload). Anchoring\n // at the terminator prevents prefix-matching tricks like\n // `data:image/png-but-actually-html,…`.\n return /^data:(?:(?:image|video|audio)\\/[a-z0-9.+-]+|application\\/pdf|application\\/octet-stream)[;,]/i.test(\n src,\n )\n ? src\n : ''\n }\n\n try {\n const parsed = new URL(src)\n if (\n parsed.protocol === 'blob:' ||\n parsed.protocol === 'http:' ||\n parsed.protocol === 'https:'\n ) {\n return src\n }\n } catch {\n // Malformed or relative URL — refuse to render.\n }\n\n return ''\n})\n\nconst error = ref(false)\n\n/**\n * Whether the embedded document is a PDF.\n *\n * PDFs are rendered by the browser's own PDF engine (e.g. PDFium), which runs\n * in an isolated context that cannot reach this app's origin — its DOM,\n * cookies or storage. A PDF's embedded JavaScript therefore cannot be used to\n * attack us, and a strict `sandbox=\"\"` does not confine that engine; it only\n * prevents Chromium from loading the PDF viewer at all (it boots as a scripted\n * extension page), leaving the user with a blank frame. So PDFs are rendered\n * without the `sandbox` attribute, matching the original `<object>` behaviour.\n *\n * Everything else that reaches the iframe (notably `text/html`, the genuine\n * XSS vector) keeps the strict empty sandbox.\n */\nconst isPdf = computed(\n (): boolean => type.trim().toLowerCase() === 'application/pdf',\n)\n\nwatch(\n () => src,\n () => (error.value = false),\n)\n</script>\n<template>\n <ResponseBodyRaw\n v-if=\"mode === 'json'\"\n :content=\"jsonPreviewContent\"\n language=\"json\"\n prettyPrintJson />\n <ResponseBodyRaw\n v-else-if=\"mode === 'ndjson'\"\n :content=\"ndjsonPreviewContent\"\n language=\"json\" />\n <div\n v-else-if=\"!error && safeSrc\"\n class=\"flex justify-center overflow-auto rounded-b\"\n :class=\"{ 'bg-preview p-2': alpha }\">\n <img\n v-if=\"mode === 'image'\"\n class=\"h-full max-w-full\"\n :class=\"{ rounded: alpha }\"\n :src=\"safeSrc\"\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\" />\n <video\n v-else-if=\"mode === 'video'\"\n autoplay\n controls\n referrerpolicy=\"no-referrer\"\n width=\"100%\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </video>\n <audio\n v-else-if=\"mode === 'audio'\"\n class=\"my-12\"\n controls\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </audio>\n <!--\n `<object>` would execute scripts inside the embedded document in the\n app's origin, so we render arbitrary previews inside an `<iframe>`\n instead. Non-PDF documents (notably `text/html`) get an empty `sandbox`\n attribute, which disables scripts, forms, popups and same-origin access.\n PDFs are exempted (see `isPdf` above): the empty sandbox does not confine\n the browser's PDF engine, it only stops the viewer from loading at all.\n\n Note: an `error` event on `<iframe>` is not reliably fired for failed\n navigations — browsers usually fire `load` even when the response is\n blank or an error page, and a cross-origin sandboxed frame cannot be\n introspected from JavaScript. There is therefore no useful runtime\n fallback for an unreachable URL; the URL allow-list above is what\n keeps unsafe content out in the first place.\n -->\n <iframe\n v-else\n class=\"aspect-[4/3] w-full border-0\"\n :src=\"safeSrc\"\n :sandbox=\"isPdf ? undefined : ''\"\n referrerpolicy=\"no-referrer\" />\n </div>\n <ResponseBodyInfo v-else>Preview unavailable</ResponseBodyInfo>\n</template>\n<style scoped>\n.light-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n.dark-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n</style>\n"],"mappings":""}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import ResponseBodyInfo_default from "./ResponseBodyInfo.vue.js";
|
|
2
|
+
import { prettifyNdjson } from "../helpers/prettify-ndjson.js";
|
|
2
3
|
import ResponseBodyRaw_default from "./ResponseBodyRaw.vue.js";
|
|
3
4
|
import { computed, createBlock, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, openBlock, ref, watch, withCtx } from "vue";
|
|
4
5
|
//#region src/v2/blocks/response-block/components/ResponseBodyPreview.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -6,7 +7,7 @@ var _hoisted_1 = ["src"];
|
|
|
6
7
|
var _hoisted_2 = ["src", "type"];
|
|
7
8
|
var _hoisted_3 = ["src", "type"];
|
|
8
9
|
var _hoisted_4 = ["src", "sandbox"];
|
|
9
|
-
var ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default =
|
|
10
|
+
var ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
10
11
|
__name: "ResponseBodyPreview",
|
|
11
12
|
props: {
|
|
12
13
|
src: {},
|
|
@@ -25,6 +26,8 @@ var ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default = /* @__PURE
|
|
|
25
26
|
if (value == null) return "";
|
|
26
27
|
return String(value);
|
|
27
28
|
});
|
|
29
|
+
/** NDJSON pretty-printed one record per block for the `ndjson` preview. */
|
|
30
|
+
const ndjsonPreviewContent = computed(() => prettifyNdjson(jsonPreviewContent.value));
|
|
28
31
|
/**
|
|
29
32
|
* Validates the `src` against an allow-list of safe protocols before it is
|
|
30
33
|
* passed to a rendering element. This blocks XSS vectors such as
|
|
@@ -72,8 +75,12 @@ var ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default = /* @__PURE
|
|
|
72
75
|
content: jsonPreviewContent.value,
|
|
73
76
|
language: "json",
|
|
74
77
|
prettyPrintJson: ""
|
|
75
|
-
}, null, 8, ["content"])) :
|
|
78
|
+
}, null, 8, ["content"])) : __props.mode === "ndjson" ? (openBlock(), createBlock(ResponseBodyRaw_default, {
|
|
76
79
|
key: 1,
|
|
80
|
+
content: ndjsonPreviewContent.value,
|
|
81
|
+
language: "json"
|
|
82
|
+
}, null, 8, ["content"])) : !error.value && safeSrc.value ? (openBlock(), createElementBlock("div", {
|
|
83
|
+
key: 2,
|
|
77
84
|
class: normalizeClass(["flex justify-center overflow-auto rounded-b", { "bg-preview p-2": __props.alpha }])
|
|
78
85
|
}, [__props.mode === "image" ? (openBlock(), createElementBlock("img", {
|
|
79
86
|
key: 0,
|
|
@@ -106,7 +113,7 @@ var ResponseBodyPreview_vue_vue_type_script_setup_true_lang_default = /* @__PURE
|
|
|
106
113
|
src: safeSrc.value,
|
|
107
114
|
sandbox: isPdf.value ? void 0 : "",
|
|
108
115
|
referrerpolicy: "no-referrer"
|
|
109
|
-
}, null, 8, _hoisted_4))], 2)) : (openBlock(), createBlock(ResponseBodyInfo_default, { key:
|
|
116
|
+
}, null, 8, _hoisted_4))], 2)) : (openBlock(), createBlock(ResponseBodyInfo_default, { key: 3 }, {
|
|
110
117
|
default: withCtx(() => [..._cache[3] || (_cache[3] = [createTextVNode("Preview unavailable", -1)])]),
|
|
111
118
|
_: 1
|
|
112
119
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyPreview.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyPreview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\n\nimport { type MediaPreview } from '@/v2/blocks/response-block/helpers/media-types'\n\nimport ResponseBodyInfo from './ResponseBodyInfo.vue'\nimport ResponseBodyRaw from './ResponseBodyRaw.vue'\n\nconst {\n src,\n type,\n mode,\n alpha = false,\n content,\n} = defineProps<{\n src: string\n type: string\n mode: MediaPreview\n alpha?: boolean | undefined\n /** Decoded body; used when `mode` is `json` for pretty-printed preview (no JSON.parse round-trip). */\n content?: unknown\n}>()\n\nconst jsonPreviewContent = computed((): string => {\n const value = content\n if (typeof value === 'string') {\n return value\n }\n if (value == null) {\n return ''\n }\n return String(value)\n})\n\n/**\n * Validates the `src` against an allow-list of safe protocols before it is\n * passed to a rendering element. This blocks XSS vectors such as\n * `javascript:` and `vbscript:` URIs and also prevents accidentally embedding\n * a `data:text/html` payload that could execute script in the app origin.\n *\n * Allowed:\n * - `blob:` (the standard case — generated client-side by `URL.createObjectURL`)\n * - `http:` / `https:`\n * - `data:` URIs whose MIME type is a known safe media kind\n * (`image/*`, `video/*`, `audio/*`, `application/pdf`, `application/octet-stream`)\n *\n * Anything else (including malformed or relative URLs) collapses to an empty\n * string so the template falls back to the \"Preview unavailable\" message.\n */\nconst safeSrc = computed((): string => {\n if (!src) {\n return ''\n }\n\n if (/^data:/i.test(src)) {\n // The MIME type must be one of the known safe kinds AND be terminated by\n // `;` (parameters / `;base64`) or `,` (start of the payload). Anchoring\n // at the terminator prevents prefix-matching tricks like\n // `data:image/png-but-actually-html,…`.\n return /^data:(?:(?:image|video|audio)\\/[a-z0-9.+-]+|application\\/pdf|application\\/octet-stream)[;,]/i.test(\n src,\n )\n ? src\n : ''\n }\n\n try {\n const parsed = new URL(src)\n if (\n parsed.protocol === 'blob:' ||\n parsed.protocol === 'http:' ||\n parsed.protocol === 'https:'\n ) {\n return src\n }\n } catch {\n // Malformed or relative URL — refuse to render.\n }\n\n return ''\n})\n\nconst error = ref(false)\n\n/**\n * Whether the embedded document is a PDF.\n *\n * PDFs are rendered by the browser's own PDF engine (e.g. PDFium), which runs\n * in an isolated context that cannot reach this app's origin — its DOM,\n * cookies or storage. A PDF's embedded JavaScript therefore cannot be used to\n * attack us, and a strict `sandbox=\"\"` does not confine that engine; it only\n * prevents Chromium from loading the PDF viewer at all (it boots as a scripted\n * extension page), leaving the user with a blank frame. So PDFs are rendered\n * without the `sandbox` attribute, matching the original `<object>` behaviour.\n *\n * Everything else that reaches the iframe (notably `text/html`, the genuine\n * XSS vector) keeps the strict empty sandbox.\n */\nconst isPdf = computed(\n (): boolean => type.trim().toLowerCase() === 'application/pdf',\n)\n\nwatch(\n () => src,\n () => (error.value = false),\n)\n</script>\n<template>\n <ResponseBodyRaw\n v-if=\"mode === 'json'\"\n :content=\"jsonPreviewContent\"\n language=\"json\"\n prettyPrintJson />\n <div\n v-else-if=\"!error && safeSrc\"\n class=\"flex justify-center overflow-auto rounded-b\"\n :class=\"{ 'bg-preview p-2': alpha }\">\n <img\n v-if=\"mode === 'image'\"\n class=\"h-full max-w-full\"\n :class=\"{ rounded: alpha }\"\n :src=\"safeSrc\"\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\" />\n <video\n v-else-if=\"mode === 'video'\"\n autoplay\n controls\n referrerpolicy=\"no-referrer\"\n width=\"100%\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </video>\n <audio\n v-else-if=\"mode === 'audio'\"\n class=\"my-12\"\n controls\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </audio>\n <!--\n `<object>` would execute scripts inside the embedded document in the\n app's origin, so we render arbitrary previews inside an `<iframe>`\n instead. Non-PDF documents (notably `text/html`) get an empty `sandbox`\n attribute, which disables scripts, forms, popups and same-origin access.\n PDFs are exempted (see `isPdf` above): the empty sandbox does not confine\n the browser's PDF engine, it only stops the viewer from loading at all.\n\n Note: an `error` event on `<iframe>` is not reliably fired for failed\n navigations — browsers usually fire `load` even when the response is\n blank or an error page, and a cross-origin sandboxed frame cannot be\n introspected from JavaScript. There is therefore no useful runtime\n fallback for an unreachable URL; the URL allow-list above is what\n keeps unsafe content out in the first place.\n -->\n <iframe\n v-else\n class=\"aspect-[4/3] w-full border-0\"\n :src=\"safeSrc\"\n :sandbox=\"isPdf ? undefined : ''\"\n referrerpolicy=\"no-referrer\" />\n </div>\n <ResponseBodyInfo v-else>Preview unavailable</ResponseBodyInfo>\n</template>\n<style scoped>\n.light-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n.dark-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n</style>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ResponseBodyPreview.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyPreview.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue'\n\nimport { type MediaPreview } from '@/v2/blocks/response-block/helpers/media-types'\nimport { prettifyNdjson } from '@/v2/blocks/response-block/helpers/prettify-ndjson'\n\nimport ResponseBodyInfo from './ResponseBodyInfo.vue'\nimport ResponseBodyRaw from './ResponseBodyRaw.vue'\n\nconst {\n src,\n type,\n mode,\n alpha = false,\n content,\n} = defineProps<{\n src: string\n type: string\n mode: MediaPreview\n alpha?: boolean | undefined\n /** Decoded body; used when `mode` is `json` for pretty-printed preview (no JSON.parse round-trip). */\n content?: unknown\n}>()\n\nconst jsonPreviewContent = computed((): string => {\n const value = content\n if (typeof value === 'string') {\n return value\n }\n if (value == null) {\n return ''\n }\n return String(value)\n})\n\n/** NDJSON pretty-printed one record per block for the `ndjson` preview. */\nconst ndjsonPreviewContent = computed((): string =>\n prettifyNdjson(jsonPreviewContent.value),\n)\n\n/**\n * Validates the `src` against an allow-list of safe protocols before it is\n * passed to a rendering element. This blocks XSS vectors such as\n * `javascript:` and `vbscript:` URIs and also prevents accidentally embedding\n * a `data:text/html` payload that could execute script in the app origin.\n *\n * Allowed:\n * - `blob:` (the standard case — generated client-side by `URL.createObjectURL`)\n * - `http:` / `https:`\n * - `data:` URIs whose MIME type is a known safe media kind\n * (`image/*`, `video/*`, `audio/*`, `application/pdf`, `application/octet-stream`)\n *\n * Anything else (including malformed or relative URLs) collapses to an empty\n * string so the template falls back to the \"Preview unavailable\" message.\n */\nconst safeSrc = computed((): string => {\n if (!src) {\n return ''\n }\n\n if (/^data:/i.test(src)) {\n // The MIME type must be one of the known safe kinds AND be terminated by\n // `;` (parameters / `;base64`) or `,` (start of the payload). Anchoring\n // at the terminator prevents prefix-matching tricks like\n // `data:image/png-but-actually-html,…`.\n return /^data:(?:(?:image|video|audio)\\/[a-z0-9.+-]+|application\\/pdf|application\\/octet-stream)[;,]/i.test(\n src,\n )\n ? src\n : ''\n }\n\n try {\n const parsed = new URL(src)\n if (\n parsed.protocol === 'blob:' ||\n parsed.protocol === 'http:' ||\n parsed.protocol === 'https:'\n ) {\n return src\n }\n } catch {\n // Malformed or relative URL — refuse to render.\n }\n\n return ''\n})\n\nconst error = ref(false)\n\n/**\n * Whether the embedded document is a PDF.\n *\n * PDFs are rendered by the browser's own PDF engine (e.g. PDFium), which runs\n * in an isolated context that cannot reach this app's origin — its DOM,\n * cookies or storage. A PDF's embedded JavaScript therefore cannot be used to\n * attack us, and a strict `sandbox=\"\"` does not confine that engine; it only\n * prevents Chromium from loading the PDF viewer at all (it boots as a scripted\n * extension page), leaving the user with a blank frame. So PDFs are rendered\n * without the `sandbox` attribute, matching the original `<object>` behaviour.\n *\n * Everything else that reaches the iframe (notably `text/html`, the genuine\n * XSS vector) keeps the strict empty sandbox.\n */\nconst isPdf = computed(\n (): boolean => type.trim().toLowerCase() === 'application/pdf',\n)\n\nwatch(\n () => src,\n () => (error.value = false),\n)\n</script>\n<template>\n <ResponseBodyRaw\n v-if=\"mode === 'json'\"\n :content=\"jsonPreviewContent\"\n language=\"json\"\n prettyPrintJson />\n <ResponseBodyRaw\n v-else-if=\"mode === 'ndjson'\"\n :content=\"ndjsonPreviewContent\"\n language=\"json\" />\n <div\n v-else-if=\"!error && safeSrc\"\n class=\"flex justify-center overflow-auto rounded-b\"\n :class=\"{ 'bg-preview p-2': alpha }\">\n <img\n v-if=\"mode === 'image'\"\n class=\"h-full max-w-full\"\n :class=\"{ rounded: alpha }\"\n :src=\"safeSrc\"\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\" />\n <video\n v-else-if=\"mode === 'video'\"\n autoplay\n controls\n referrerpolicy=\"no-referrer\"\n width=\"100%\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </video>\n <audio\n v-else-if=\"mode === 'audio'\"\n class=\"my-12\"\n controls\n referrerpolicy=\"no-referrer\"\n @error=\"error = true\">\n <source\n :src=\"safeSrc\"\n :type=\"type\" />\n </audio>\n <!--\n `<object>` would execute scripts inside the embedded document in the\n app's origin, so we render arbitrary previews inside an `<iframe>`\n instead. Non-PDF documents (notably `text/html`) get an empty `sandbox`\n attribute, which disables scripts, forms, popups and same-origin access.\n PDFs are exempted (see `isPdf` above): the empty sandbox does not confine\n the browser's PDF engine, it only stops the viewer from loading at all.\n\n Note: an `error` event on `<iframe>` is not reliably fired for failed\n navigations — browsers usually fire `load` even when the response is\n blank or an error page, and a cross-origin sandboxed frame cannot be\n introspected from JavaScript. There is therefore no useful runtime\n fallback for an unreachable URL; the URL allow-list above is what\n keeps unsafe content out in the first place.\n -->\n <iframe\n v-else\n class=\"aspect-[4/3] w-full border-0\"\n :src=\"safeSrc\"\n :sandbox=\"isPdf ? undefined : ''\"\n referrerpolicy=\"no-referrer\" />\n </div>\n <ResponseBodyInfo v-else>Preview unavailable</ResponseBodyInfo>\n</template>\n<style scoped>\n.light-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n.dark-mode .bg-preview {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E\");\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAwBA,MAAM,qBAAqB,eAAuB;GAChD,MAAM,QAAQ,QAAA;GACd,IAAI,OAAO,UAAU,UACnB,OAAO;GAET,IAAI,SAAS,MACX,OAAO;GAET,OAAO,OAAO,KAAK;EACrB,CAAC;;EAGD,MAAM,uBAAuB,eAC3B,eAAe,mBAAmB,KAAK,CACzC;;;;;;;;;;;;;;;;EAiBA,MAAM,UAAU,eAAuB;GACrC,IAAI,CAAC,QAAA,KACH,OAAO;GAGT,IAAI,UAAU,KAAK,QAAA,GAAG,GAKpB,OAAO,gGAAgG,KACrG,QAAA,GACF,IACI,QAAA,MACA;GAGN,IAAI;IACF,MAAM,SAAS,IAAI,IAAI,QAAA,GAAG;IAC1B,IACE,OAAO,aAAa,WACpB,OAAO,aAAa,WACpB,OAAO,aAAa,UAEpB,OAAO,QAAA;GAEX,QAAQ,CAER;GAEA,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,IAAI,KAAK;;;;;;;;;;;;;;;EAgBvB,MAAM,QAAQ,eACG,QAAA,KAAK,KAAK,CAAC,CAAC,YAAY,MAAM,iBAC/C;EAEA,YACQ,QAAA,WACC,MAAM,QAAQ,KACvB;;UAIU,QAAA,SAAI,UAAA,UAAA,GADZ,YAIoB,yBAAA;;IAFjB,SAAS,mBAAA;IACV,UAAS;IACT,iBAAA;+BAEW,QAAA,SAAI,YAAA,UAAA,GADjB,YAGoB,yBAAA;;IADjB,SAAS,qBAAA;IACV,UAAS;gCAEG,MAAA,SAAS,QAAA,SAAA,UAAA,GADvB,mBAqDM,OAAA;;IAnDJ,OAAK,eAAA,CAAC,+CAA6C,EAAA,kBACvB,QAAA,MAAK,CAAA,CAAA;OAEzB,QAAA,SAAI,WAAA,UAAA,GADZ,mBAM0B,OAAA;;IAJxB,OAAK,eAAA,CAAC,qBAAmB,EAAA,SACN,QAAA,MAAK,CAAA,CAAA;IACvB,KAAK,QAAA;IACN,gBAAe;IACd,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,QAAK;+BAEF,QAAA,SAAI,WAAA,UAAA,GADjB,mBAUQ,SAAA;;IARN,UAAA;IACA,UAAA;IACA,gBAAe;IACf,OAAM;IACL,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,QAAK;OACb,mBAEiB,UAAA;IADd,KAAK,QAAA;IACL,MAAM,QAAA;oCAGE,QAAA,SAAI,WAAA,UAAA,GADjB,mBASQ,SAAA;;IAPN,OAAM;IACN,UAAA;IACA,gBAAe;IACd,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,QAAK;OACb,mBAEiB,UAAA;IADd,KAAK,QAAA;IACL,MAAM,QAAA;kDAiBX,mBAKiC,UAAA;;IAH/B,OAAM;IACL,KAAK,QAAA;IACL,SAAS,MAAA,QAAQ,KAAA,IAAS;IAC3B,gBAAe;kDAEnB,YAA+D,0BAAA,EAAA,KAAA,EAAA,GAAA;2BAAnB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAnB,uBAAmB,EAAA,CAAA,EAAA,CAAA"}
|
|
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../../_virtual/_plugin-vue_
|
|
|
2
2
|
import ResponseBodyRaw_vue_vue_type_script_setup_true_lang_default from "./ResponseBodyRaw.vue.script.js";
|
|
3
3
|
/* empty css */
|
|
4
4
|
//#region src/v2/blocks/response-block/components/ResponseBodyRaw.vue
|
|
5
|
-
var ResponseBodyRaw_default =
|
|
5
|
+
var ResponseBodyRaw_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ResponseBodyRaw_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-8c1df828"]]);
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ResponseBodyRaw_default as default };
|
|
8
8
|
|
|
@@ -11,7 +11,7 @@ var _hoisted_2 = {
|
|
|
11
11
|
class: "custom-scroll relative pr-1",
|
|
12
12
|
tabindex: "0"
|
|
13
13
|
};
|
|
14
|
-
var ResponseBodyRaw_vue_vue_type_script_setup_true_lang_default =
|
|
14
|
+
var ResponseBodyRaw_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
15
15
|
__name: "ResponseBodyRaw",
|
|
16
16
|
props: {
|
|
17
17
|
content: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyRaw.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyRaw.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ScalarCodeBlockCopy } from '@scalar/components/code-block'\nimport { useCodeMirror, type CodeMirrorLanguage } from '@scalar/use-codemirror'\nimport { computed, ref, toRef, useId } from 'vue'\n\nimport { prettifyJsoncString } from '@/v2/blocks/response-block/helpers/prettify-jsonc-string'\n\nconst props = defineProps<{\n content: unknown\n language: CodeMirrorLanguage | undefined\n /** When true, JSON/JSONC strings are pretty-printed for the Preview tab (wire bytes stay unchanged in Raw). */\n prettyPrintJson?: boolean\n}>()\n\nconst codeMirrorRef = ref<HTMLDivElement | null>(null)\n/** Base id for the code block */\nconst id = useId()\n\nconst displayContent = computed((): string => {\n const { content, language, prettyPrintJson = false } = props\n if (typeof content !== 'string') {\n if (content == null) {\n return ''\n }\n return String(content)\n }\n if (prettyPrintJson && language === 'json') {\n return prettifyJsoncString(content)\n }\n return content\n})\n\nconst { codeMirror } = useCodeMirror({\n codeMirrorRef,\n readOnly: true,\n lineNumbers: true,\n content: toRef(displayContent),\n language: toRef(() => props.language),\n forceFoldGutter: true,\n})\n\n// Function to get current content\nconst getCurrentContent = () => {\n return codeMirror.value?.state.doc.toString() || ''\n}\n</script>\n<template>\n <div\n class=\"scalar-code-block group/code-block relative grid min-h-0 overflow-hidden p-px outline-none has-focus-visible:outline\"\n data-testid=\"response-body-raw\">\n <div\n class=\"custom-scroll relative pr-1\"\n tabindex=\"0\">\n <!-- CodeMirror container -->\n <div ref=\"codeMirrorRef\" />\n </div>\n <!-- Copy button -->\n <ScalarCodeBlockCopy\n v-if=\"getCurrentContent()\"\n :aria-controls=\"id\"\n class=\"absolute top-2 right-2\"\n :content=\"getCurrentContent()\" />\n </div>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n background-color: transparent;\n font-size: var(--scalar-small);\n outline: none;\n}\n\n:deep(.cm-gutters) {\n background-color: var(--scalar-background-1);\n border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);\n}\n\n:deep(.cm-scroller) {\n overflow: auto;\n min-width: 100%;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAOA,MAAM,QAAQ;EAOd,MAAM,gBAAgB,IAA2B,
|
|
1
|
+
{"version":3,"file":"ResponseBodyRaw.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyRaw.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ScalarCodeBlockCopy } from '@scalar/components/code-block'\nimport { useCodeMirror, type CodeMirrorLanguage } from '@scalar/use-codemirror'\nimport { computed, ref, toRef, useId } from 'vue'\n\nimport { prettifyJsoncString } from '@/v2/blocks/response-block/helpers/prettify-jsonc-string'\n\nconst props = defineProps<{\n content: unknown\n language: CodeMirrorLanguage | undefined\n /** When true, JSON/JSONC strings are pretty-printed for the Preview tab (wire bytes stay unchanged in Raw). */\n prettyPrintJson?: boolean\n}>()\n\nconst codeMirrorRef = ref<HTMLDivElement | null>(null)\n/** Base id for the code block */\nconst id = useId()\n\nconst displayContent = computed((): string => {\n const { content, language, prettyPrintJson = false } = props\n if (typeof content !== 'string') {\n if (content == null) {\n return ''\n }\n return String(content)\n }\n if (prettyPrintJson && language === 'json') {\n return prettifyJsoncString(content)\n }\n return content\n})\n\nconst { codeMirror } = useCodeMirror({\n codeMirrorRef,\n readOnly: true,\n lineNumbers: true,\n content: toRef(displayContent),\n language: toRef(() => props.language),\n forceFoldGutter: true,\n})\n\n// Function to get current content\nconst getCurrentContent = () => {\n return codeMirror.value?.state.doc.toString() || ''\n}\n</script>\n<template>\n <div\n class=\"scalar-code-block group/code-block relative grid min-h-0 overflow-hidden p-px outline-none has-focus-visible:outline\"\n data-testid=\"response-body-raw\">\n <div\n class=\"custom-scroll relative pr-1\"\n tabindex=\"0\">\n <!-- CodeMirror container -->\n <div ref=\"codeMirrorRef\" />\n </div>\n <!-- Copy button -->\n <ScalarCodeBlockCopy\n v-if=\"getCurrentContent()\"\n :aria-controls=\"id\"\n class=\"absolute top-2 right-2\"\n :content=\"getCurrentContent()\" />\n </div>\n</template>\n<style scoped>\n:deep(.cm-editor) {\n background-color: transparent;\n font-size: var(--scalar-small);\n outline: none;\n}\n\n:deep(.cm-gutters) {\n background-color: var(--scalar-background-1);\n border-radius: var(--scalar-radius) 0 0 var(--scalar-radius);\n}\n\n:deep(.cm-scroller) {\n overflow: auto;\n min-width: 100%;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAOA,MAAM,QAAQ;EAOd,MAAM,gBAAgB,IAA2B,IAAI;;EAErD,MAAM,KAAK,MAAM;EAgBjB,MAAM,EAAE,eAAe,cAAc;GACnC;GACA,UAAU;GACV,aAAa;GACb,SAAS,MAlBY,eAAuB;IAC5C,MAAM,EAAE,SAAS,UAAU,kBAAkB,UAAU;IACvD,IAAI,OAAO,YAAY,UAAU;KAC/B,IAAI,WAAW,MACb,OAAO;KAET,OAAO,OAAO,OAAO;IACvB;IACA,IAAI,mBAAmB,aAAa,QAClC,OAAO,oBAAoB,OAAO;IAEpC,OAAO;GACT,CAMiB,CAAc;GAC7B,UAAU,YAAY,MAAM,QAAQ;GACpC,iBAAiB;EACnB,CAAC;EAGD,MAAM,0BAA0B;GAC9B,OAAO,WAAW,OAAO,MAAM,IAAI,SAAS,KAAK;EACnD;;uBAGE,mBAeM,OAfN,YAeM,CAZJ,mBAKM,OALN,YAKM,CADJ,mBAA2B,OAAA;aAAlB;IAAJ,KAAI;oBAIH,kBAAiB,KAAA,UAAA,GADzB,YAImC,MAAA,mBAAA,GAAA;;IAFhC,iBAAe,MAAA,EAAA;IAChB,OAAM;IACL,SAAS,kBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyStreaming.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyStreaming.vue"],"names":[],"mappings":"AAkKA,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAA;CAChD,CAAC;
|
|
1
|
+
{"version":3,"file":"ResponseBodyStreaming.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyStreaming.vue"],"names":[],"mappings":"AAkKA,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAA;CAChD,CAAC;AAwPF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -16,7 +16,7 @@ var _hoisted_4 = {
|
|
|
16
16
|
key: 1,
|
|
17
17
|
class: "p-2"
|
|
18
18
|
};
|
|
19
|
-
var ResponseBodyStreaming_vue_vue_type_script_setup_true_lang_default =
|
|
19
|
+
var ResponseBodyStreaming_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
20
20
|
__name: "ResponseBodyStreaming",
|
|
21
21
|
props: { reader: {} },
|
|
22
22
|
setup(__props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyStreaming.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyStreaming.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarLoading, useLoadingState } from '@scalar/components/loading'\nimport { nextTick, onBeforeUnmount, ref, watch } from 'vue'\n\nimport { CollapsibleSection } from '@/v2/components/layout'\n\nconst { reader } = defineProps<{\n reader: ReadableStreamDefaultReader<Uint8Array>\n}>()\n\nconst loader = useLoadingState()\n\nconst textContent = ref('')\nconst errorRef = ref<Error | null>(null)\nconst contentContainer = ref<HTMLElement | null>(null)\n\n/** Track the current reader to prevent race conditions when reader changes */\nconst currentReader = ref<ReadableStreamDefaultReader<Uint8Array> | null>(null)\n\n/** Current decoder instance - reset for each new stream to prevent buffer corruption */\nconst decoder = ref<TextDecoder | null>(null)\n\n/**\n * Scrolls the content container to the bottom\n */\nconst scrollToBottom = () => {\n if (contentContainer.value) {\n contentContainer.value.scrollTop = contentContainer.value.scrollHeight\n }\n}\n\n// Watch for changes in textContent and scroll to bottom\nwatch(textContent, async () => {\n // Use nextTick to ensure the DOM has updated\n await nextTick(scrollToBottom)\n})\n\n/**\n * Reads the stream and appends the content\n */\nasync function readStream(\n streamReader: ReadableStreamDefaultReader<Uint8Array>,\n) {\n try {\n while (loader.isLoading && currentReader.value === streamReader) {\n const { done, value } = await streamReader.read()\n\n // Stop if this reader is no longer the current one\n if (currentReader.value !== streamReader) {\n break\n }\n\n if (done) {\n void loader.clear()\n break\n }\n\n // Decode the Uint8Array to string and append to content\n if (value && decoder.value) {\n textContent.value += decoder.value.decode(value, { stream: true })\n }\n }\n } catch (error) {\n // Only handle the error if this is still the current reader\n if (currentReader.value === streamReader) {\n console.error('Error reading stream:', error)\n void loader.clear()\n errorRef.value = error as Error\n }\n } finally {\n // Only finalize decoding if this is still the current reader\n if (currentReader.value === streamReader && decoder.value) {\n // Make sure to decode any remaining bytes\n textContent.value += decoder.value.decode()\n }\n }\n}\n\nconst startStreaming = () => {\n // Cancel the old reader if it exists\n if (currentReader.value) {\n currentReader.value.cancel()\n }\n\n // Set the new reader as current\n currentReader.value = reader\n\n // Reset state and start new stream\n // Create a new decoder instance to prevent buffer corruption from previous streams\n decoder.value = new TextDecoder()\n loader.start()\n textContent.value = ''\n errorRef.value = null\n void readStream(reader)\n}\n\nconst stopStreaming = () => {\n if (currentReader.value) {\n currentReader.value.cancel()\n currentReader.value = null\n }\n void loader.clear()\n}\n\n// Start streaming when the reader changes\nwatch(() => reader, startStreaming, { immediate: true })\n\nonBeforeUnmount(stopStreaming)\n</script>\n\n<template>\n <CollapsibleSection class=\"max-h-content overflow-y-hidden\">\n <template #title>\n <div class=\"flex w-full items-center justify-between\">\n <div>Body</div>\n <div\n v-if=\"loader.isLoading\"\n class=\"mr-2 flex items-center gap-2\">\n <ScalarLoading\n :loadingState=\"loader\"\n size=\"xs\" />\n <span class=\"text-c-2\"> Listening… </span>\n </div>\n </div>\n </template>\n <template\n v-if=\"loader.isLoading\"\n #actions>\n <ScalarButton\n size=\"sm\"\n variant=\"ghost\"\n @click=\"stopStreaming\">\n Cancel\n </ScalarButton>\n </template>\n\n <div\n ref=\"contentContainer\"\n class=\"text-xxs font-code h-full overflow-auto leading-6 whitespace-pre-wrap\">\n <template v-if=\"errorRef\">\n <div class=\"text-red bg-b-danger sticky top-0 border-b p-2\">\n {{ errorRef.message }}\n </div>\n </template>\n <template v-if=\"textContent\">\n <div class=\"p-2\">\n {{ textContent }}\n </div>\n </template>\n </div>\n </CollapsibleSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAWA,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"ResponseBodyStreaming.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyStreaming.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarLoading, useLoadingState } from '@scalar/components/loading'\nimport { nextTick, onBeforeUnmount, ref, watch } from 'vue'\n\nimport { CollapsibleSection } from '@/v2/components/layout'\n\nconst { reader } = defineProps<{\n reader: ReadableStreamDefaultReader<Uint8Array>\n}>()\n\nconst loader = useLoadingState()\n\nconst textContent = ref('')\nconst errorRef = ref<Error | null>(null)\nconst contentContainer = ref<HTMLElement | null>(null)\n\n/** Track the current reader to prevent race conditions when reader changes */\nconst currentReader = ref<ReadableStreamDefaultReader<Uint8Array> | null>(null)\n\n/** Current decoder instance - reset for each new stream to prevent buffer corruption */\nconst decoder = ref<TextDecoder | null>(null)\n\n/**\n * Scrolls the content container to the bottom\n */\nconst scrollToBottom = () => {\n if (contentContainer.value) {\n contentContainer.value.scrollTop = contentContainer.value.scrollHeight\n }\n}\n\n// Watch for changes in textContent and scroll to bottom\nwatch(textContent, async () => {\n // Use nextTick to ensure the DOM has updated\n await nextTick(scrollToBottom)\n})\n\n/**\n * Reads the stream and appends the content\n */\nasync function readStream(\n streamReader: ReadableStreamDefaultReader<Uint8Array>,\n) {\n try {\n while (loader.isLoading && currentReader.value === streamReader) {\n const { done, value } = await streamReader.read()\n\n // Stop if this reader is no longer the current one\n if (currentReader.value !== streamReader) {\n break\n }\n\n if (done) {\n void loader.clear()\n break\n }\n\n // Decode the Uint8Array to string and append to content\n if (value && decoder.value) {\n textContent.value += decoder.value.decode(value, { stream: true })\n }\n }\n } catch (error) {\n // Only handle the error if this is still the current reader\n if (currentReader.value === streamReader) {\n console.error('Error reading stream:', error)\n void loader.clear()\n errorRef.value = error as Error\n }\n } finally {\n // Only finalize decoding if this is still the current reader\n if (currentReader.value === streamReader && decoder.value) {\n // Make sure to decode any remaining bytes\n textContent.value += decoder.value.decode()\n }\n }\n}\n\nconst startStreaming = () => {\n // Cancel the old reader if it exists\n if (currentReader.value) {\n currentReader.value.cancel()\n }\n\n // Set the new reader as current\n currentReader.value = reader\n\n // Reset state and start new stream\n // Create a new decoder instance to prevent buffer corruption from previous streams\n decoder.value = new TextDecoder()\n loader.start()\n textContent.value = ''\n errorRef.value = null\n void readStream(reader)\n}\n\nconst stopStreaming = () => {\n if (currentReader.value) {\n currentReader.value.cancel()\n currentReader.value = null\n }\n void loader.clear()\n}\n\n// Start streaming when the reader changes\nwatch(() => reader, startStreaming, { immediate: true })\n\nonBeforeUnmount(stopStreaming)\n</script>\n\n<template>\n <CollapsibleSection class=\"max-h-content overflow-y-hidden\">\n <template #title>\n <div class=\"flex w-full items-center justify-between\">\n <div>Body</div>\n <div\n v-if=\"loader.isLoading\"\n class=\"mr-2 flex items-center gap-2\">\n <ScalarLoading\n :loadingState=\"loader\"\n size=\"xs\" />\n <span class=\"text-c-2\"> Listening… </span>\n </div>\n </div>\n </template>\n <template\n v-if=\"loader.isLoading\"\n #actions>\n <ScalarButton\n size=\"sm\"\n variant=\"ghost\"\n @click=\"stopStreaming\">\n Cancel\n </ScalarButton>\n </template>\n\n <div\n ref=\"contentContainer\"\n class=\"text-xxs font-code h-full overflow-auto leading-6 whitespace-pre-wrap\">\n <template v-if=\"errorRef\">\n <div class=\"text-red bg-b-danger sticky top-0 border-b p-2\">\n {{ errorRef.message }}\n </div>\n </template>\n <template v-if=\"textContent\">\n <div class=\"p-2\">\n {{ textContent }}\n </div>\n </template>\n </div>\n </CollapsibleSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAWA,MAAM,SAAS,gBAAgB;EAE/B,MAAM,cAAc,IAAI,EAAE;EAC1B,MAAM,WAAW,IAAkB,IAAI;EACvC,MAAM,mBAAmB,IAAwB,IAAI;;EAGrD,MAAM,gBAAgB,IAAoD,IAAI;;EAG9E,MAAM,UAAU,IAAwB,IAAI;;;;EAK5C,MAAM,uBAAuB;GAC3B,IAAI,iBAAiB,OACnB,iBAAiB,MAAM,YAAY,iBAAiB,MAAM;EAE9D;EAGA,MAAM,aAAa,YAAY;GAE7B,MAAM,SAAS,cAAc;EAC/B,CAAC;;;;EAKD,eAAe,WACb,cACA;GACA,IAAI;IACF,OAAO,OAAO,aAAa,cAAc,UAAU,cAAc;KAC/D,MAAM,EAAE,MAAM,UAAU,MAAM,aAAa,KAAK;KAGhD,IAAI,cAAc,UAAU,cAC1B;KAGF,IAAI,MAAM;MACR,OAAY,MAAM;MAClB;KACF;KAGA,IAAI,SAAS,QAAQ,OACnB,YAAY,SAAS,QAAQ,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;IAErE;GACF,SAAS,OAAO;IAEd,IAAI,cAAc,UAAU,cAAc;KACxC,QAAQ,MAAM,yBAAyB,KAAK;KAC5C,OAAY,MAAM;KAClB,SAAS,QAAQ;IACnB;GACF,UAAU;IAER,IAAI,cAAc,UAAU,gBAAgB,QAAQ,OAElD,YAAY,SAAS,QAAQ,MAAM,OAAO;GAE9C;EACF;EAEA,MAAM,uBAAuB;GAE3B,IAAI,cAAc,OAChB,cAAc,MAAM,OAAO;GAI7B,cAAc,QAAQ,QAAA;GAItB,QAAQ,QAAQ,IAAI,YAAY;GAChC,OAAO,MAAM;GACb,YAAY,QAAQ;GACpB,SAAS,QAAQ;GACjB,WAAgB,QAAA,MAAM;EACxB;EAEA,MAAM,sBAAsB;GAC1B,IAAI,cAAc,OAAO;IACvB,cAAc,MAAM,OAAO;IAC3B,cAAc,QAAQ;GACxB;GACA,OAAY,MAAM;EACpB;EAGA,YAAY,QAAA,QAAQ,gBAAgB,EAAE,WAAW,KAAK,CAAC;EAEvD,gBAAgB,aAAa;;uBAI3B,YAuCqB,MAAA,0BAAA,GAAA,EAvCD,OAAM,kCAAiC,GAAA,YAAA;IAC9C,OAAK,cAWR,CAVN,mBAUM,OAVN,YAUM,CAAA,OAAA,OAAA,OAAA,KATJ,mBAAe,OAAA,MAAV,QAAI,EAAA,IAED,MAAA,MAAA,CAAM,CAAC,aAAA,UAAA,GADf,mBAOM,OAPN,YAOM,CAJJ,YAEc,MAAA,aAAA,GAAA;KADX,cAAc,MAAA,MAAA;KACf,MAAK;6DACP,mBAA0C,QAAA,EAApC,OAAM,WAAU,GAAC,gBAAY,EAAA,EAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,CAAA,CAAA;2BA4BnC,CAbN,mBAaM,OAAA;cAZA;KAAJ,KAAI;KACJ,OAAM;QACU,SAAA,SAAA,UAAA,GACd,mBAEM,OAFN,YAEM,gBADD,SAAA,MAAS,OAAO,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAGP,YAAA,SAAA,UAAA,GACd,mBAEM,OAFN,YAEM,gBADD,YAAA,KAAW,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,GAAA,CAAA,CAAA;;OApBZ,MAAA,MAAA,CAAM,CAAC,YAAA;UACZ;sBAMc,CALf,YAKe,MAAA,YAAA,GAAA;KAJb,MAAK;KACL,SAAQ;KACP,SAAO;;4BAEV,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFyB,YAEzB,EAAA,CAAA,EAAA,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, withModifiers } from "vue";
|
|
2
2
|
//#region src/v2/blocks/response-block/components/ResponseBodyToggle.vue?vue&type=script&setup=true&lang.ts
|
|
3
3
|
var _hoisted_1 = { class: "text-c-3 text-xxs -my-1 flex justify-center gap-0.5 rounded p-0.5" };
|
|
4
|
-
var ResponseBodyToggle_vue_vue_type_script_setup_true_lang_default =
|
|
4
|
+
var ResponseBodyToggle_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
5
5
|
__name: "ResponseBodyToggle",
|
|
6
6
|
props: { modelValue: { type: Boolean } },
|
|
7
7
|
emits: ["update:modelValue"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyToggle.vue.script.js","names":["$emit"],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyToggle.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n modelValue: boolean\n}>()\ndefineEmits<{\n (e: 'update:modelValue', v: boolean): void\n}>()\n</script>\n<template>\n <div\n class=\"text-c-3 text-xxs -my-1 flex justify-center gap-0.5 rounded p-0.5\">\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': modelValue }\"\n type=\"button\"\n @click.stop=\"$emit('update:modelValue', true)\">\n Preview\n </button>\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': !modelValue }\"\n type=\"button\"\n @click.stop=\"$emit('update:modelValue', false)\">\n Raw\n </button>\n </div>\n</template>\n"],"mappings":";;;;;;;;;uBASE,mBAgBM,OAhBN,YAgBM,CAdJ,mBAMS,UAAA;IALP,OAAK,eAAA,CAAC,6BAA2B,EAAA,kCACW,QAAA,
|
|
1
|
+
{"version":3,"file":"ResponseBodyToggle.vue.script.js","names":["$emit"],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyToggle.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n modelValue: boolean\n}>()\ndefineEmits<{\n (e: 'update:modelValue', v: boolean): void\n}>()\n</script>\n<template>\n <div\n class=\"text-c-3 text-xxs -my-1 flex justify-center gap-0.5 rounded p-0.5\">\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': modelValue }\"\n type=\"button\"\n @click.stop=\"$emit('update:modelValue', true)\">\n Preview\n </button>\n <button\n class=\"hover:bg-b-3 rounded px-1\"\n :class=\"{ 'bg-b-3 text-c-1 cursor-default': !modelValue }\"\n type=\"button\"\n @click.stop=\"$emit('update:modelValue', false)\">\n Raw\n </button>\n </div>\n</template>\n"],"mappings":";;;;;;;;;uBASE,mBAgBM,OAhBN,YAgBM,CAdJ,mBAMS,UAAA;IALP,OAAK,eAAA,CAAC,6BAA2B,EAAA,kCACW,QAAA,WAAU,CAAA,CAAA;IACtD,MAAK;IACJ,SAAK,OAAA,OAAA,OAAA,KAAA,eAAA,WAAOA,KAAAA,MAAK,qBAAA,IAAA,GAAA,CAAA,MAAA,CAAA;MAA6B,aAEjD,CAAA,GACA,mBAMS,UAAA;IALP,OAAK,eAAA,CAAC,6BAA2B,EAAA,kCAAA,CACY,QAAA,WAAU,CAAA,CAAA;IACvD,MAAK;IACJ,SAAK,OAAA,OAAA,OAAA,KAAA,eAAA,WAAOA,KAAAA,MAAK,qBAAA,KAAA,GAAA,CAAA,MAAA,CAAA;MAA8B,SAElD,CAAA,CAAA,CAAA"}
|
|
@@ -5,7 +5,7 @@ import { computed, createBlock, createElementVNode, createSlots, createTextVNode
|
|
|
5
5
|
import { formatJsonOrYamlString } from "@scalar/oas-utils/helpers";
|
|
6
6
|
import { ScalarVirtualText } from "@scalar/components/virtual-text";
|
|
7
7
|
//#region src/v2/blocks/response-block/components/ResponseBodyVirtual.vue?vue&type=script&setup=true&lang.ts
|
|
8
|
-
var ResponseBodyVirtual_vue_vue_type_script_setup_true_lang_default =
|
|
8
|
+
var ResponseBodyVirtual_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
9
9
|
__name: "ResponseBodyVirtual",
|
|
10
10
|
props: {
|
|
11
11
|
content: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseBodyVirtual.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyVirtual.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarVirtualText } from '@scalar/components/virtual-text'\nimport { formatJsonOrYamlString } from '@scalar/oas-utils/helpers'\nimport { computed } from 'vue'\n\nimport { processResponseBody } from '@/v2/blocks/response-block/helpers/process-response-body'\nimport { CollapsibleSection } from '@/v2/components/layout'\n\nimport ResponseBodyDownload from './ResponseBodyDownload.vue'\n\nconst { content, data, headers } = defineProps<{\n content: string\n data: unknown\n headers: { name: string; value: string }[]\n}>()\n\nconst textContent = computed(() => formatJsonOrYamlString(content))\n\nconst responseBody = computed(() =>\n processResponseBody({\n data,\n headers,\n }),\n)\n</script>\n\n<template>\n <CollapsibleSection class=\"!max-h-100% response-body-virtual overflow-x-auto\">\n <template #title>Body</template>\n <template\n v-if=\"responseBody.dataUrl\"\n #actions>\n <ResponseBodyDownload\n :filename=\"responseBody.attachmentFilename\"\n :href=\"responseBody.dataUrl\"\n :type=\"responseBody.mimeType?.essence\" />\n </template>\n <div class=\"font-code text-xxs rounded-t border-x border-t px-2.5 py-1.5\">\n This response body is massive! Syntax highlighting won't work here.\n </div>\n <ScalarVirtualText\n containerClass=\"custom-scroll scalar-code-block border rounded-b flex flex-1 max-h-screen\"\n contentClass=\"language-plaintext whitespace-pre font-code text-base\"\n :lineHeight=\"20\"\n searchable\n :text=\"textContent\" />\n </CollapsibleSection>\n</template>\n\n<style>\n.response-body-virtual[data-headlessui-state='open'],\n.response-body-virtual[data-headlessui-state='open'] .diclosure-panel {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;EAgBA,MAAM,cAAc,eAAe,uBAAuB,QAAA,
|
|
1
|
+
{"version":3,"file":"ResponseBodyVirtual.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseBodyVirtual.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarVirtualText } from '@scalar/components/virtual-text'\nimport { formatJsonOrYamlString } from '@scalar/oas-utils/helpers'\nimport { computed } from 'vue'\n\nimport { processResponseBody } from '@/v2/blocks/response-block/helpers/process-response-body'\nimport { CollapsibleSection } from '@/v2/components/layout'\n\nimport ResponseBodyDownload from './ResponseBodyDownload.vue'\n\nconst { content, data, headers } = defineProps<{\n content: string\n data: unknown\n headers: { name: string; value: string }[]\n}>()\n\nconst textContent = computed(() => formatJsonOrYamlString(content))\n\nconst responseBody = computed(() =>\n processResponseBody({\n data,\n headers,\n }),\n)\n</script>\n\n<template>\n <CollapsibleSection class=\"!max-h-100% response-body-virtual overflow-x-auto\">\n <template #title>Body</template>\n <template\n v-if=\"responseBody.dataUrl\"\n #actions>\n <ResponseBodyDownload\n :filename=\"responseBody.attachmentFilename\"\n :href=\"responseBody.dataUrl\"\n :type=\"responseBody.mimeType?.essence\" />\n </template>\n <div class=\"font-code text-xxs rounded-t border-x border-t px-2.5 py-1.5\">\n This response body is massive! Syntax highlighting won't work here.\n </div>\n <ScalarVirtualText\n containerClass=\"custom-scroll scalar-code-block border rounded-b flex flex-1 max-h-screen\"\n contentClass=\"language-plaintext whitespace-pre font-code text-base\"\n :lineHeight=\"20\"\n searchable\n :text=\"textContent\" />\n </CollapsibleSection>\n</template>\n\n<style>\n.response-body-virtual[data-headlessui-state='open'],\n.response-body-virtual[data-headlessui-state='open'] .diclosure-panel {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;EAgBA,MAAM,cAAc,eAAe,uBAAuB,QAAA,OAAO,CAAC;EAElE,MAAM,eAAe,eACnB,oBAAoB;GAClB,MAAG,QAAA;GACH,SAAM,QAAA;EACR,CAAC,CACH;;uBAIE,YAmBqB,MAAA,0BAAA,GAAA,EAnBD,OAAM,oDAAmD,GAAA,YAAA;IAChE,OAAK,cAAK,CAAA,OAAA,OAAA,OAAA,KAAA,gBAAJ,QAAI,EAAA,EAAA,CAAA;2BAWf,CAAA,OAAA,OAAA,OAAA,KAFN,mBAEM,OAAA,EAFD,OAAM,+DAA8D,GAAC,yEAE1E,EAAA,IACA,YAKwB,MAAA,iBAAA,GAAA;KAJtB,gBAAe;KACf,cAAa;KACZ,YAAY;KACb,YAAA;KACC,MAAM,YAAA;;;OAfD,aAAA,MAAa,UAAA;UAClB;sBAI0C,CAH3C,YAG2C,8BAAA;KAFxC,UAAU,aAAA,MAAa;KACvB,MAAM,aAAA,MAAa;KACnB,MAAM,aAAA,MAAa,UAAU"}
|
|
@@ -13,7 +13,7 @@ var _hoisted_2 = {
|
|
|
13
13
|
key: 1,
|
|
14
14
|
class: "text-c-3 bg-b-1 flex min-h-[64px] items-center justify-center border-t px-4 text-sm"
|
|
15
15
|
};
|
|
16
|
-
var ResponseCookies_vue_vue_type_script_setup_true_lang_default =
|
|
16
|
+
var ResponseCookies_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
17
17
|
__name: "ResponseCookies",
|
|
18
18
|
props: { cookies: {} },
|
|
19
19
|
setup(__props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseCookies.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseCookies.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n DataTable,\n DataTableHeader,\n DataTableRow,\n DataTableText,\n} from '@/v2/components/data-table'\nimport { CollapsibleSection } from '@/v2/components/layout'\n\ndefineProps<{\n cookies: { name: string; value: string }[]\n}>()\n</script>\n<template>\n <CollapsibleSection\n class=\"overflow-auto\"\n :defaultOpen=\"false\"\n :itemCount=\"cookies.length\">\n <template #title>Cookies</template>\n <div\n v-if=\"cookies.length\"\n class=\"max-h-[calc(100%-32px)] overflow-y-auto\">\n <DataTable\n :columns=\"['minmax(auto, min-content)', 'minmax(50%, 1fr)']\"\n scroll>\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>Cookie Name</DataTableHeader>\n <DataTableHeader>Cookie Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, index) in cookies\"\n :key=\"item.name\"\n class=\"group/row text-c-1\">\n <DataTableText\n class=\"bg-b-1 sticky left-0 z-1 max-w-full\"\n :class=\"{ 'border-t-0': index === 0 }\"\n :text=\"item.name\" />\n <DataTableText\n class=\"z-0\"\n :class=\"{ 'border-t-0': index === 0 }\"\n :text=\"item.value\" />\n </DataTableRow>\n </DataTable>\n </div>\n <!-- Empty state -->\n <div\n v-else\n class=\"text-c-3 bg-b-1 flex min-h-[64px] items-center justify-center border-t px-4 text-sm\">\n No cookies\n </div>\n </CollapsibleSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;uBAcE,YAoCqB,MAAA,
|
|
1
|
+
{"version":3,"file":"ResponseCookies.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseCookies.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n DataTable,\n DataTableHeader,\n DataTableRow,\n DataTableText,\n} from '@/v2/components/data-table'\nimport { CollapsibleSection } from '@/v2/components/layout'\n\ndefineProps<{\n cookies: { name: string; value: string }[]\n}>()\n</script>\n<template>\n <CollapsibleSection\n class=\"overflow-auto\"\n :defaultOpen=\"false\"\n :itemCount=\"cookies.length\">\n <template #title>Cookies</template>\n <div\n v-if=\"cookies.length\"\n class=\"max-h-[calc(100%-32px)] overflow-y-auto\">\n <DataTable\n :columns=\"['minmax(auto, min-content)', 'minmax(50%, 1fr)']\"\n scroll>\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>Cookie Name</DataTableHeader>\n <DataTableHeader>Cookie Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(item, index) in cookies\"\n :key=\"item.name\"\n class=\"group/row text-c-1\">\n <DataTableText\n class=\"bg-b-1 sticky left-0 z-1 max-w-full\"\n :class=\"{ 'border-t-0': index === 0 }\"\n :text=\"item.name\" />\n <DataTableText\n class=\"z-0\"\n :class=\"{ 'border-t-0': index === 0 }\"\n :text=\"item.value\" />\n </DataTableRow>\n </DataTable>\n </div>\n <!-- Empty state -->\n <div\n v-else\n class=\"text-c-3 bg-b-1 flex min-h-[64px] items-center justify-center border-t px-4 text-sm\">\n No cookies\n </div>\n </CollapsibleSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;uBAcE,YAoCqB,MAAA,0BAAA,GAAA;IAnCnB,OAAM;IACL,aAAa;IACb,WAAW,QAAA,QAAQ;;IACT,OAAK,cAAQ,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAP,WAAO,EAAA,CAAA,EAAA,CAAA;2BAyBlB,CAvBE,QAAA,QAAQ,UAAA,UAAA,GADhB,mBAwBM,OAxBN,YAwBM,CArBJ,YAoBY,MAAA,iBAAA,GAAA;KAnBT,SAAS,CAAA,6BAAA,kBAAA;KACV,QAAA;;4BAIe,CAHf,YAGe,MAAA,oBAAA,GAAA,EAHD,OAAM,iBAAgB,GAAA;6BACY,CAA9C,YAA8C,MAAA,uBAAA,GAAA,MAAA;8BAAlB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAX,eAAW,EAAA,CAAA,EAAA,CAAA;;UAC5B,YAA+C,MAAA,uBAAA,GAAA,MAAA;8BAAlB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAZ,gBAAY,EAAA,CAAA,EAAA,CAAA;;;;2BAE/B,mBAYe,UAAA,MAAA,WAXW,QAAA,UAAhB,MAAM,UAAK;0BADrB,YAYe,MAAA,oBAAA,GAAA;OAVZ,KAAK,KAAK;OACX,OAAM;;8BAIgB,CAHtB,YAGsB,MAAA,qBAAA,GAAA;QAFpB,OAAK,eAAA,CAAC,uCAAqC,EAAA,cACnB,UAAK,EAAA,CAAA,CAAA;QAC5B,MAAM,KAAK;uCACd,YAGuB,MAAA,qBAAA,GAAA;QAFrB,OAAK,eAAA,CAAC,OAAK,EAAA,cACa,UAAK,EAAA,CAAA,CAAA;QAC5B,MAAM,KAAK;;;;;;0BAKpB,mBAIM,OAJN,YAE8F,cAE9F,EAAA,CAAA"}
|
|
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../../_virtual/_plugin-vue_
|
|
|
2
2
|
import ResponseEmpty_vue_vue_type_script_setup_true_lang_default from "./ResponseEmpty.vue.script.js";
|
|
3
3
|
/* empty css */
|
|
4
4
|
//#region src/v2/blocks/response-block/components/ResponseEmpty.vue
|
|
5
|
-
var ResponseEmpty_default =
|
|
5
|
+
var ResponseEmpty_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ResponseEmpty_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0895623d"]]);
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ResponseEmpty_default as default };
|
|
8
8
|
|
|
@@ -9,7 +9,7 @@ var _hoisted_2 = {
|
|
|
9
9
|
class: "scalar-version-number"
|
|
10
10
|
};
|
|
11
11
|
var _hoisted_3 = { class: "text-c-3 right-4 mt-auto flex w-full flex-col items-end gap-2 text-sm" };
|
|
12
|
-
var ResponseEmpty_vue_vue_type_script_setup_true_lang_default =
|
|
12
|
+
var ResponseEmpty_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
13
13
|
__name: "ResponseEmpty",
|
|
14
14
|
props: {
|
|
15
15
|
layout: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseEmpty.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseEmpty.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarHotkey } from '@scalar/components/hotkey'\n\nimport Computer from '@/assets/computer.ascii?raw'\nimport { ScalarAsciiArt } from '@/components/ScalarAsciiArt'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nconst { totalPerformedRequests, layout, appVersion } = defineProps<{\n /** Client layout */\n layout: ClientLayout\n /** Total number of performed requests */\n totalPerformedRequests: number\n /** Application version */\n appVersion: string\n}>()\n\nconst emits = defineEmits<{\n (e: 'addRequest'): void\n (e: 'sendRequest'): void\n (e: 'openCommandPalette'): void\n}>()\n</script>\n<template>\n <div class=\"flex-center relative flex flex-1 flex-col gap-6 p-2 capitalize\">\n <div\n class=\"flex h-[calc(100%_-_50px)] flex-col items-center justify-center\"\n :class=\"{\n 'hidden opacity-0': totalPerformedRequests > 0 && layout !== 'modal',\n }\">\n <div\n v-if=\"layout !== 'modal'\"\n class=\"scalar-version-number\">\n Scalar App V{{ appVersion }} Beta\n <div class=\"mt-2\">\n <a\n href=\"https://github.com/scalar/scalar/issues/2669\"\n target=\"_blank\">\n Roadmap\n </a>\n </div>\n </div>\n <a\n class=\"gitbook-show scalar-version-number\"\n href=\"https://www.scalar.com\"\n target=\"_blank\">\n Powered By Scalar.com\n </a>\n <ScalarAsciiArt\n :art=\"Computer\"\n class=\"text-c-3\" />\n </div>\n\n <div\n class=\"text-c-3 right-4 mt-auto flex w-full flex-col items-end gap-2 text-sm\">\n <button\n v-if=\"layout !== 'modal'\"\n class=\"flex items-center gap-1.5\"\n type=\"button\"\n @click=\"emits('openCommandPalette')\">\n Get Started\n <ScalarHotkey\n hotkey=\"k\"\n :modifier=\"['default']\" />\n </button>\n <button\n v-if=\"layout === 'desktop'\"\n class=\"flex items-center gap-1.5\"\n type=\"button\"\n @click=\"emits('addRequest')\">\n New Request\n <ScalarHotkey hotkey=\"N\" />\n </button>\n <button\n class=\"flex items-center gap-1.5\"\n type=\"button\"\n @click=\"emits('sendRequest')\">\n Send Request\n <ScalarHotkey hotkey=\"↵\" />\n </button>\n </div>\n </div>\n</template>\n<style scoped>\n.scalar-version-number {\n transform: skew(0deg, 13deg);\n width: 76px;\n height: 76px;\n position: absolute;\n margin-left: -36px;\n font-size: 8px;\n font-family: var(--scalar-font-code);\n line-height: 11px;\n margin-top: -113px;\n border-radius: 9px 9px 16px 12px;\n box-shadow: inset 2px 0px 0 2px var(--scalar-background-2);\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-transform: initial;\n text-decoration-color: var(--scalar-color-3);\n}\n.scalar-version-number a {\n font-weight: bold;\n font-weight: bold;\n background: var(--scalar-background-2);\n padding: 2px 4px;\n border-radius: 3px;\n text-decoration: none;\n border: 0.5px solid var(--scalar-border-color);\n}\n\n.gitbook-show {\n display: none;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAgBA,MAAM,QAAQ;;uBAOZ,mBAyDM,OAzDN,YAyDM,CAxDJ,mBA0BM,OAAA,EAzBJ,OAAK,eAAA,CAAC,mEAAiE,EAAA,oBACjC,QAAA,yBAAsB,KAAQ,QAAA,WAAM,
|
|
1
|
+
{"version":3,"file":"ResponseEmpty.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseEmpty.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarHotkey } from '@scalar/components/hotkey'\n\nimport Computer from '@/assets/computer.ascii?raw'\nimport { ScalarAsciiArt } from '@/components/ScalarAsciiArt'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nconst { totalPerformedRequests, layout, appVersion } = defineProps<{\n /** Client layout */\n layout: ClientLayout\n /** Total number of performed requests */\n totalPerformedRequests: number\n /** Application version */\n appVersion: string\n}>()\n\nconst emits = defineEmits<{\n (e: 'addRequest'): void\n (e: 'sendRequest'): void\n (e: 'openCommandPalette'): void\n}>()\n</script>\n<template>\n <div class=\"flex-center relative flex flex-1 flex-col gap-6 p-2 capitalize\">\n <div\n class=\"flex h-[calc(100%_-_50px)] flex-col items-center justify-center\"\n :class=\"{\n 'hidden opacity-0': totalPerformedRequests > 0 && layout !== 'modal',\n }\">\n <div\n v-if=\"layout !== 'modal'\"\n class=\"scalar-version-number\">\n Scalar App V{{ appVersion }} Beta\n <div class=\"mt-2\">\n <a\n href=\"https://github.com/scalar/scalar/issues/2669\"\n target=\"_blank\">\n Roadmap\n </a>\n </div>\n </div>\n <a\n class=\"gitbook-show scalar-version-number\"\n href=\"https://www.scalar.com\"\n target=\"_blank\">\n Powered By Scalar.com\n </a>\n <ScalarAsciiArt\n :art=\"Computer\"\n class=\"text-c-3\" />\n </div>\n\n <div\n class=\"text-c-3 right-4 mt-auto flex w-full flex-col items-end gap-2 text-sm\">\n <button\n v-if=\"layout !== 'modal'\"\n class=\"flex items-center gap-1.5\"\n type=\"button\"\n @click=\"emits('openCommandPalette')\">\n Get Started\n <ScalarHotkey\n hotkey=\"k\"\n :modifier=\"['default']\" />\n </button>\n <button\n v-if=\"layout === 'desktop'\"\n class=\"flex items-center gap-1.5\"\n type=\"button\"\n @click=\"emits('addRequest')\">\n New Request\n <ScalarHotkey hotkey=\"N\" />\n </button>\n <button\n class=\"flex items-center gap-1.5\"\n type=\"button\"\n @click=\"emits('sendRequest')\">\n Send Request\n <ScalarHotkey hotkey=\"↵\" />\n </button>\n </div>\n </div>\n</template>\n<style scoped>\n.scalar-version-number {\n transform: skew(0deg, 13deg);\n width: 76px;\n height: 76px;\n position: absolute;\n margin-left: -36px;\n font-size: 8px;\n font-family: var(--scalar-font-code);\n line-height: 11px;\n margin-top: -113px;\n border-radius: 9px 9px 16px 12px;\n box-shadow: inset 2px 0px 0 2px var(--scalar-background-2);\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-transform: initial;\n text-decoration-color: var(--scalar-color-3);\n}\n.scalar-version-number a {\n font-weight: bold;\n font-weight: bold;\n background: var(--scalar-background-2);\n padding: 2px 4px;\n border-radius: 3px;\n text-decoration: none;\n border: 0.5px solid var(--scalar-border-color);\n}\n\n.gitbook-show {\n display: none;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EAgBA,MAAM,QAAQ;;uBAOZ,mBAyDM,OAzDN,YAyDM,CAxDJ,mBA0BM,OAAA,EAzBJ,OAAK,eAAA,CAAC,mEAAiE,EAAA,oBACjC,QAAA,yBAAsB,KAAQ,QAAA,WAAM,QAAA,CAAA,CAAA,EAAA,GAAA;IAIlE,QAAA,WAAM,WAAA,UAAA,GADd,mBAWM,OAXN,YAWM,CAAA,gBAT0B,kBAClB,gBAAG,QAAA,UAAU,IAAG,UAC5B,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,mBAMM,OAAA,EAND,OAAM,OAAM,GAAA,CACf,mBAII,KAAA;KAHF,MAAK;KACL,QAAO;OAAS,WAElB,CAAA,GAAA,EAAA,EAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;8BAGJ,mBAKI,KAAA;KAJF,OAAM;KACN,MAAK;KACL,QAAO;OAAS,2BAElB,EAAA;IACA,YAEqB,MAAA,sBAAA,GAAA;KADlB,KAAK,MAAA,gBAAA;KACN,OAAM;;UAGV,mBA2BM,OA3BN,YA2BM;IAxBI,QAAA,WAAM,WAAA,UAAA,GADd,mBASS,UAAA;;KAPP,OAAM;KACN,MAAK;KACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAK,oBAAA;kDAAwB,iBAErC,EAAA,IAAA,YAE4B,MAAA,YAAA,GAAA;KAD1B,QAAO;KACN,UAAU,CAAA,SAAA;;IAGP,QAAA,WAAM,aAAA,UAAA,GADd,mBAOS,UAAA;;KALP,OAAM;KACN,MAAK;KACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAK,YAAA;kDAAgB,iBAE7B,EAAA,IAAA,YAA2B,MAAA,YAAA,GAAA,EAAb,QAAO,IAAG,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAE1B,mBAMS,UAAA;KALP,OAAM;KACN,MAAK;KACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAK,aAAA;kDAAiB,kBAE9B,EAAA,IAAA,YAA2B,MAAA,YAAA,GAAA,EAAb,QAAO,IAAG,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseLoadingOverlay.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/response-block/components/ResponseLoadingOverlay.vue"],"names":[],"mappings":"AAsEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAGvE,KAAK,WAAW,GAAG;IACjB,0BAA0B;IAC1B,QAAQ,EAAE,iBAAiB,CAAA;CAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"ResponseLoadingOverlay.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/response-block/components/ResponseLoadingOverlay.vue"],"names":[],"mappings":"AAsEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAGvE,KAAK,WAAW,GAAG;IACjB,0BAA0B;IAC1B,QAAQ,EAAE,iBAAiB,CAAA;CAC5B,CAAC;AA8HF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../../_virtual/_plugin-vue_
|
|
|
2
2
|
import ResponseLoadingOverlay_vue_vue_type_script_setup_true_lang_default from "./ResponseLoadingOverlay.vue.script.js";
|
|
3
3
|
/* empty css */
|
|
4
4
|
//#region src/v2/blocks/response-block/components/ResponseLoadingOverlay.vue
|
|
5
|
-
var ResponseLoadingOverlay_default =
|
|
5
|
+
var ResponseLoadingOverlay_default = /*#__PURE__*/ _plugin_vue_export_helper_default(ResponseLoadingOverlay_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b80db6e2"]]);
|
|
6
6
|
//#endregion
|
|
7
7
|
export { ResponseLoadingOverlay_default as default };
|
|
8
8
|
|
|
@@ -6,7 +6,7 @@ var _hoisted_1 = {
|
|
|
6
6
|
key: 0,
|
|
7
7
|
class: "bg-b-1 z-overlay absolute inset-0 flex flex-col items-center justify-center gap-6"
|
|
8
8
|
};
|
|
9
|
-
var ResponseLoadingOverlay_vue_vue_type_script_setup_true_lang_default =
|
|
9
|
+
var ResponseLoadingOverlay_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
10
10
|
__name: "ResponseLoadingOverlay",
|
|
11
11
|
props: { eventBus: {} },
|
|
12
12
|
setup(__props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseLoadingOverlay.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseLoadingOverlay.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarLoading, useLoadingState } from '@scalar/components/loading'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { onBeforeUnmount, onMounted, ref } from 'vue'\n\nconst { eventBus } = defineProps<{\n /** Workspace event bus */\n eventBus: WorkspaceEventBus\n}>()\n\nconst loader = useLoadingState()\nconst timeout = ref<ReturnType<typeof setTimeout>>()\n\nconst startLoading = () => {\n // Replace any pending delayed start so overlapping `hooks:on:request:sent` events\n // (rapid send, navigation, double submit) cannot leave an orphaned timer that\n // calls `loader.start()` after the matching request already completed.\n clearTimeout(timeout.value)\n timeout.value = setTimeout(() => loader.start(), 1000)\n}\n\nconst stopLoading = () => {\n clearTimeout(timeout.value)\n timeout.value = undefined\n void loader.clear()\n}\n\nonMounted(() => {\n eventBus.on('hooks:on:request:sent', startLoading)\n eventBus.on('hooks:on:request:complete', stopLoading)\n})\n\nonBeforeUnmount(() => {\n eventBus.off('hooks:on:request:sent', startLoading)\n eventBus.off('hooks:on:request:complete', stopLoading)\n stopLoading()\n})\n</script>\n<template>\n <Transition>\n <div\n v-if=\"loader.isActive\"\n class=\"bg-b-1 z-overlay absolute inset-0 flex flex-col items-center justify-center gap-6\">\n <ScalarLoading\n class=\"text-c-3\"\n :loader\n size=\"3xl\" />\n <ScalarButton\n variant=\"ghost\"\n @click=\"eventBus.emit('operation:cancel:request')\">\n Cancel\n </ScalarButton>\n </div>\n </Transition>\n</template>\n<style scoped>\n.v-enter-active {\n transition: opacity 0.5s ease;\n}\n\n.v-enter-from {\n opacity: 0;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;EAWA,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"ResponseLoadingOverlay.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseLoadingOverlay.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components/button'\nimport { ScalarLoading, useLoadingState } from '@scalar/components/loading'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { onBeforeUnmount, onMounted, ref } from 'vue'\n\nconst { eventBus } = defineProps<{\n /** Workspace event bus */\n eventBus: WorkspaceEventBus\n}>()\n\nconst loader = useLoadingState()\nconst timeout = ref<ReturnType<typeof setTimeout>>()\n\nconst startLoading = () => {\n // Replace any pending delayed start so overlapping `hooks:on:request:sent` events\n // (rapid send, navigation, double submit) cannot leave an orphaned timer that\n // calls `loader.start()` after the matching request already completed.\n clearTimeout(timeout.value)\n timeout.value = setTimeout(() => loader.start(), 1000)\n}\n\nconst stopLoading = () => {\n clearTimeout(timeout.value)\n timeout.value = undefined\n void loader.clear()\n}\n\nonMounted(() => {\n eventBus.on('hooks:on:request:sent', startLoading)\n eventBus.on('hooks:on:request:complete', stopLoading)\n})\n\nonBeforeUnmount(() => {\n eventBus.off('hooks:on:request:sent', startLoading)\n eventBus.off('hooks:on:request:complete', stopLoading)\n stopLoading()\n})\n</script>\n<template>\n <Transition>\n <div\n v-if=\"loader.isActive\"\n class=\"bg-b-1 z-overlay absolute inset-0 flex flex-col items-center justify-center gap-6\">\n <ScalarLoading\n class=\"text-c-3\"\n :loader\n size=\"3xl\" />\n <ScalarButton\n variant=\"ghost\"\n @click=\"eventBus.emit('operation:cancel:request')\">\n Cancel\n </ScalarButton>\n </div>\n </Transition>\n</template>\n<style scoped>\n.v-enter-active {\n transition: opacity 0.5s ease;\n}\n\n.v-enter-from {\n opacity: 0;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;EAWA,MAAM,SAAS,gBAAgB;EAC/B,MAAM,UAAU,IAAmC;EAEnD,MAAM,qBAAqB;GAIzB,aAAa,QAAQ,KAAK;GAC1B,QAAQ,QAAQ,iBAAiB,OAAO,MAAM,GAAG,GAAI;EACvD;EAEA,MAAM,oBAAoB;GACxB,aAAa,QAAQ,KAAK;GAC1B,QAAQ,QAAQ,KAAA;GAChB,OAAY,MAAM;EACpB;EAEA,gBAAgB;GACd,QAAA,SAAS,GAAG,yBAAyB,YAAY;GACjD,QAAA,SAAS,GAAG,6BAA6B,WAAW;EACtD,CAAC;EAED,sBAAsB;GACpB,QAAA,SAAS,IAAI,yBAAyB,YAAY;GAClD,QAAA,SAAS,IAAI,6BAA6B,WAAW;GACrD,YAAY;EACd,CAAC;;uBAGC,YAca,YAAA,MAAA;2BADL,CAXE,MAAA,MAAA,CAAM,CAAC,YAAA,UAAA,GADf,mBAYM,OAZN,YAYM,CATJ,YAGe,MAAA,aAAA,GAAA;KAFb,OAAM;KACL,QAAA,MAAA,MAAA;KACD,MAAK;6BACP,YAIe,MAAA,YAAA,GAAA;KAHb,SAAQ;KACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,SAAS,KAAI,0BAAA;;4BAEvB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAFqD,YAErD,EAAA,CAAA,EAAA,CAAA"}
|
|
@@ -8,7 +8,7 @@ var _hoisted_1 = { class: "text-c-1 flex gap-1.5" };
|
|
|
8
8
|
var _hoisted_2 = { key: 0 };
|
|
9
9
|
var _hoisted_3 = { key: 0 };
|
|
10
10
|
var _hoisted_4 = { key: 1 };
|
|
11
|
-
var ResponseMetaInformation_vue_vue_type_script_setup_true_lang_default =
|
|
11
|
+
var ResponseMetaInformation_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
12
12
|
__name: "ResponseMetaInformation",
|
|
13
13
|
props: {
|
|
14
14
|
response: {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResponseMetaInformation.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport {\n httpStatusCodes,\n type HttpStatusCode,\n} from '@scalar/helpers/http/http-status-codes'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport type { ResponseInstance } from '@/v2/blocks/operation-block/helpers/send-request'\nimport { getContentLength } from '@/v2/blocks/response-block/helpers/get-content-length'\n\nconst { response, eventBus } = defineProps<{\n /** Response */\n response: ResponseInstance\n /** Workspace event bus */\n eventBus: WorkspaceEventBus\n}>()\n\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nconst stopStopwatch = () => {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n}\n\nconst startStopwatch = () => {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n}\n\nonMounted(() => {\n eventBus.on('hooks:on:request:sent', startStopwatch)\n eventBus.on('hooks:on:request:complete', stopStopwatch)\n})\n\nonBeforeUnmount(() => {\n eventBus.off('hooks:on:request:sent', startStopwatch)\n eventBus.off('hooks:on:request:complete', stopStopwatch)\n stopStopwatch()\n})\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = response?.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;EAoBA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"ResponseMetaInformation.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/components/ResponseMetaInformation.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport {\n httpStatusCodes,\n type HttpStatusCode,\n} from '@scalar/helpers/http/http-status-codes'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport prettyMilliseconds from 'pretty-ms'\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\n\nimport HelpfulLink from '@/components/HelpfulLink.vue'\nimport type { ResponseInstance } from '@/v2/blocks/operation-block/helpers/send-request'\nimport { getContentLength } from '@/v2/blocks/response-block/helpers/get-content-length'\n\nconst { response, eventBus } = defineProps<{\n /** Response */\n response: ResponseInstance\n /** Workspace event bus */\n eventBus: WorkspaceEventBus\n}>()\n\nconst interval = ref<ReturnType<typeof setInterval>>()\nconst stopwatch = ref(0)\n\nconst stopStopwatch = () => {\n clearInterval(interval.value)\n interval.value = undefined\n stopwatch.value = 0\n}\n\nconst startStopwatch = () => {\n interval.value = setInterval(() => (stopwatch.value += 1000), 1000)\n}\n\nonMounted(() => {\n eventBus.on('hooks:on:request:sent', startStopwatch)\n eventBus.on('hooks:on:request:complete', stopStopwatch)\n})\n\nonBeforeUnmount(() => {\n eventBus.off('hooks:on:request:sent', startStopwatch)\n eventBus.off('hooks:on:request:complete', stopStopwatch)\n stopStopwatch()\n})\n\n/** Status text for the response */\nconst statusCodeInformation = computed((): HttpStatusCode | undefined => {\n const responseStatusCode = response?.status\n\n if (!responseStatusCode) {\n return undefined\n }\n\n return httpStatusCodes[responseStatusCode] ?? undefined\n})\n</script>\n<template>\n <div class=\"text-c-1 flex gap-1.5\">\n <span v-if=\"interval && stopwatch\">{{\n prettyMilliseconds(stopwatch)\n }}</span>\n <template v-else>\n <span>\n <span class=\"sr-only\">Response Information, Duration:</span>\n {{ prettyMilliseconds(response.duration) }}\n </span>\n <span v-if=\"getContentLength(response)\">\n <span class=\"sr-only\">, Size:</span>\n {{ getContentLength(response) }}\n </span>\n <template v-if=\"statusCodeInformation\">\n <span class=\"sr-only\">, Status:</span>\n <HelpfulLink\n v-if=\"statusCodeInformation.url\"\n class=\"flex items-center gap-1.5\"\n :href=\"statusCodeInformation.url\">\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </HelpfulLink>\n <span v-else>\n {{ response.status }} {{ statusCodeInformation.name }}\n <span\n class=\"block h-1.5 w-1.5 rounded-full\"\n :style=\"{ backgroundColor: statusCodeInformation.color }\" />\n </span>\n </template>\n </template>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;EAoBA,MAAM,WAAW,IAAoC;EACrD,MAAM,YAAY,IAAI,CAAC;EAEvB,MAAM,sBAAsB;GAC1B,cAAc,SAAS,KAAK;GAC5B,SAAS,QAAQ,KAAA;GACjB,UAAU,QAAQ;EACpB;EAEA,MAAM,uBAAuB;GAC3B,SAAS,QAAQ,kBAAmB,UAAU,SAAS,KAAO,GAAI;EACpE;EAEA,gBAAgB;GACd,QAAA,SAAS,GAAG,yBAAyB,cAAc;GACnD,QAAA,SAAS,GAAG,6BAA6B,aAAa;EACxD,CAAC;EAED,sBAAsB;GACpB,QAAA,SAAS,IAAI,yBAAyB,cAAc;GACpD,QAAA,SAAS,IAAI,6BAA6B,aAAa;GACvD,cAAc;EAChB,CAAC;;EAGD,MAAM,wBAAwB,eAA2C;GACvE,MAAM,qBAAqB,QAAA,UAAU;GAErC,IAAI,CAAC,oBACH;GAGF,OAAO,gBAAgB,uBAAuB,KAAA;EAChD,CAAC;;uBAGC,mBAgCM,OAhCN,YAgCM,CA/BQ,SAAA,SAAY,UAAA,SAAA,UAAA,GAAxB,mBAES,QAAA,YAAA,gBADP,MAAA,kBAAA,CAAkB,CAAC,UAAA,KAAS,CAAA,GAAA,CAAA,MAAA,UAAA,GAE9B,mBA2BW,UAAA,EAAA,KAAA,EAAA,GAAA;IA1BT,mBAGO,QAAA,MAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAA4D,QAAA,EAAtD,OAAM,UAAS,GAAC,mCAA+B,EAAA,IAAA,gBAAO,MAC5D,gBAAG,MAAA,kBAAA,CAAkB,CAAC,QAAA,SAAS,QAAQ,CAAA,GAAA,CAAA,CAAA,CAAA;IAE7B,MAAA,gBAAA,CAAgB,CAAC,QAAA,QAAQ,KAAA,UAAA,GAArC,mBAGO,QAAA,YAAA,CAAA,OAAA,OAAA,OAAA,KAFL,mBAAoC,QAAA,EAA9B,OAAM,UAAS,GAAC,WAAO,EAAA,IAAA,gBAAO,MACpC,gBAAG,MAAA,gBAAA,CAAgB,CAAC,QAAA,QAAQ,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAEd,sBAAA,SAAA,UAAA,GAAhB,mBAiBW,UAAA,EAAA,KAAA,EAAA,GAAA,CAAA,OAAA,OAAA,OAAA,KAhBT,mBAAsC,QAAA,EAAhC,OAAM,UAAS,GAAC,aAAS,EAAA,IAEvB,sBAAA,MAAsB,OAAA,UAAA,GAD9B,YAQc,qBAAA;;KANZ,OAAM;KACL,MAAM,sBAAA,MAAsB;;4BACR,CAAA,gBAAA,gBAAlB,QAAA,SAAS,MAAM,IAAG,MAAC,gBAAG,sBAAA,MAAsB,IAAI,IAAG,KACtD,CAAA,GAAA,mBAE8D,QAAA;MAD5D,OAAM;MACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,MAAK,CAAA;;;qCAE1D,mBAKO,QAAA,YAAA,CAAA,gBAAA,gBAJF,QAAA,SAAS,MAAM,IAAG,MAAC,gBAAG,sBAAA,MAAsB,IAAI,IAAG,KACtD,CAAA,GAAA,mBAE8D,QAAA;KAD5D,OAAM;KACL,OAAK,eAAA,EAAA,iBAAqB,sBAAA,MAAsB,MAAK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-filename.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/helpers/extract-filename.ts"],"sourcesContent":["/**\n * Safely decode a URI component, returning the original string if decoding fails\n */\nconst decodeURIComponentSafe = (str: string) => {\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\n/**\n * Extract the filename from a content disposition header\n */\nexport function extractFilename(contentDisposition: string) {\n let filename = ''\n\n if (contentDisposition) {\n const fileNameMatch =\n contentDisposition.match(/filename\\*=UTF-8''([^;]+)/)?.[1] ??\n contentDisposition.match(/filename\\s*=\\s*\"?([^\";]+)\"?/)?.[1]\n\n if (fileNameMatch) {\n // Decode filename\n filename = decodeURIComponentSafe(fileNameMatch.trim())\n }\n }\n\n return filename\n}\n"],"mappings":";;;;AAGA,IAAM,0BAA0B,QAAgB;
|
|
1
|
+
{"version":3,"file":"extract-filename.js","names":[],"sources":["../../../../../src/v2/blocks/response-block/helpers/extract-filename.ts"],"sourcesContent":["/**\n * Safely decode a URI component, returning the original string if decoding fails\n */\nconst decodeURIComponentSafe = (str: string) => {\n try {\n return decodeURIComponent(str)\n } catch {\n return str\n }\n}\n\n/**\n * Extract the filename from a content disposition header\n */\nexport function extractFilename(contentDisposition: string) {\n let filename = ''\n\n if (contentDisposition) {\n const fileNameMatch =\n contentDisposition.match(/filename\\*=UTF-8''([^;]+)/)?.[1] ??\n contentDisposition.match(/filename\\s*=\\s*\"?([^\";]+)\"?/)?.[1]\n\n if (fileNameMatch) {\n // Decode filename\n filename = decodeURIComponentSafe(fileNameMatch.trim())\n }\n }\n\n return filename\n}\n"],"mappings":";;;;AAGA,IAAM,0BAA0B,QAAgB;CAC9C,IAAI;EACF,OAAO,mBAAmB,GAAG;CAC/B,QAAQ;EACN,OAAO;CACT;AACF;;;;AAKA,SAAgB,gBAAgB,oBAA4B;CAC1D,IAAI,WAAW;CAEf,IAAI,oBAAoB;EACtB,MAAM,gBACJ,mBAAmB,MAAM,2BAA2B,CAAC,GAAG,MACxD,mBAAmB,MAAM,6BAA6B,CAAC,GAAG;EAE5D,IAAI,eAEF,WAAW,uBAAuB,cAAc,KAAK,CAAC;CAE1D;CAEA,OAAO;AACT"}
|