@scalar/api-client 3.20.0 → 3.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/components/HttpMethod/HttpMethod.vue.d.ts +2 -2
  3. package/dist/components/HttpMethod/HttpMethod.vue.d.ts.map +1 -1
  4. package/dist/components/HttpMethod/HttpMethod.vue.js +1 -1
  5. package/dist/components/HttpMethod/HttpMethod.vue.js.map +1 -1
  6. package/dist/components/HttpMethod/HttpMethod.vue.script.js +15 -7
  7. package/dist/components/HttpMethod/HttpMethod.vue.script.js.map +1 -1
  8. package/dist/style.css +31 -32
  9. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +1 -2
  10. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  11. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  12. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +7 -0
  13. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  14. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts +1 -2
  15. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
  16. package/dist/v2/blocks/operation-block/components/Header.vue.js +1 -1
  17. package/dist/v2/blocks/operation-block/components/Header.vue.js.map +1 -1
  18. package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -1
  19. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.d.ts.map +1 -1
  20. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js +1 -1
  21. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.js.map +1 -1
  22. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js +2 -1
  23. package/dist/v2/blocks/operation-block/components/OpenApiClientButton.vue.script.js.map +1 -1
  24. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts +1 -2
  25. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts.map +1 -1
  26. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.js.map +1 -1
  27. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -2
  28. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts.map +1 -1
  29. package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -1
  30. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts +1 -2
  31. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
  32. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  33. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  34. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +10 -2
  35. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  36. package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
  37. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts.map +1 -1
  38. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.js.map +1 -1
  39. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +10 -3
  40. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
  41. package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts +2 -0
  42. package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts.map +1 -1
  43. package/dist/v2/blocks/request-block/components/RequestParams.vue.js.map +1 -1
  44. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js +7 -2
  45. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js.map +1 -1
  46. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +4 -4
  47. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts +4 -4
  48. package/dist/v2/blocks/request-block/helpers/create-parameter-rows.d.ts.map +1 -1
  49. package/dist/v2/blocks/request-block/helpers/create-parameter-rows.js +14 -6
  50. package/dist/v2/blocks/request-block/helpers/create-parameter-rows.js.map +1 -1
  51. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +2 -3
  52. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  53. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
  54. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -1
  55. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +2 -2
  56. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
  57. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts +1 -2
  58. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts.map +1 -1
  59. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +1 -1
  60. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js.map +1 -1
  61. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
  62. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  63. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.d.ts.map +1 -1
  64. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.js.map +1 -1
  65. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js +7 -6
  66. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesInput.vue.script.js.map +1 -1
  67. package/dist/v2/components/data-table/DataTable.vue.d.ts.map +1 -1
  68. package/dist/v2/components/data-table/DataTable.vue.js.map +1 -1
  69. package/dist/v2/components/data-table/DataTable.vue.script.js +2 -1
  70. package/dist/v2/components/data-table/DataTable.vue.script.js.map +1 -1
  71. package/dist/v2/constants.js +1 -1
  72. package/dist/v2/features/localization/locales/ar.d.ts +4 -0
  73. package/dist/v2/features/localization/locales/ar.d.ts.map +1 -1
  74. package/dist/v2/features/localization/locales/ar.js +8 -2
  75. package/dist/v2/features/localization/locales/ar.js.map +1 -1
  76. package/dist/v2/features/localization/locales/de.d.ts +4 -0
  77. package/dist/v2/features/localization/locales/de.d.ts.map +1 -1
  78. package/dist/v2/features/localization/locales/de.js +8 -2
  79. package/dist/v2/features/localization/locales/de.js.map +1 -1
  80. package/dist/v2/features/localization/locales/es.d.ts +4 -0
  81. package/dist/v2/features/localization/locales/es.d.ts.map +1 -1
  82. package/dist/v2/features/localization/locales/es.js +8 -2
  83. package/dist/v2/features/localization/locales/es.js.map +1 -1
  84. package/dist/v2/features/localization/locales/fr.d.ts +4 -0
  85. package/dist/v2/features/localization/locales/fr.d.ts.map +1 -1
  86. package/dist/v2/features/localization/locales/fr.js +8 -2
  87. package/dist/v2/features/localization/locales/fr.js.map +1 -1
  88. package/dist/v2/features/localization/locales/pt.d.ts +4 -0
  89. package/dist/v2/features/localization/locales/pt.d.ts.map +1 -1
  90. package/dist/v2/features/localization/locales/pt.js +8 -2
  91. package/dist/v2/features/localization/locales/pt.js.map +1 -1
  92. package/dist/v2/features/localization/locales/ru.d.ts +4 -0
  93. package/dist/v2/features/localization/locales/ru.d.ts.map +1 -1
  94. package/dist/v2/features/localization/locales/ru.js +8 -2
  95. package/dist/v2/features/localization/locales/ru.js.map +1 -1
  96. package/dist/v2/features/localization/locales/zh-cn.d.ts +4 -0
  97. package/dist/v2/features/localization/locales/zh-cn.d.ts.map +1 -1
  98. package/dist/v2/features/localization/locales/zh-cn.js +8 -2
  99. package/dist/v2/features/localization/locales/zh-cn.js.map +1 -1
  100. package/dist/v2/features/localization/translations.d.ts +4 -0
  101. package/dist/v2/features/localization/translations.d.ts.map +1 -1
  102. package/dist/v2/features/localization/translations.js +8 -2
  103. package/dist/v2/features/localization/translations.js.map +1 -1
  104. package/dist/v2/features/modal/Modal.vue.d.ts +1 -2
  105. package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
  106. package/dist/v2/features/modal/Modal.vue.js.map +1 -1
  107. package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
  108. package/dist/v2/features/modal/helpers/resolve-route-parameters.d.ts +2 -3
  109. package/dist/v2/features/modal/helpers/resolve-route-parameters.d.ts.map +1 -1
  110. package/dist/v2/features/modal/helpers/resolve-route-parameters.js +8 -7
  111. package/dist/v2/features/modal/helpers/resolve-route-parameters.js.map +1 -1
  112. package/dist/v2/features/modal/hooks/use-modal-sidebar.d.ts +2 -3
  113. package/dist/v2/features/modal/hooks/use-modal-sidebar.d.ts.map +1 -1
  114. package/dist/v2/features/modal/hooks/use-modal-sidebar.js.map +1 -1
  115. package/dist/v2/features/operation/Operation.vue.d.ts +1 -2
  116. package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
  117. package/dist/v2/features/operation/Operation.vue.js.map +1 -1
  118. package/dist/v2/features/operation/Operation.vue.script.js.map +1 -1
  119. package/dist/v2/helpers/generate-location-id.d.ts +1 -2
  120. package/dist/v2/helpers/generate-location-id.d.ts.map +1 -1
  121. package/dist/v2/helpers/generate-location-id.js.map +1 -1
  122. package/dist/vue-styles.css +30 -30
  123. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"OperationBlock.vue.script.js","names":["$emit"],"sources":["../../../../src/v2/blocks/operation-block/OperationBlock.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * OperationBlock\n *\n * Orchestrates the operation view by wiring together the Header, OperationBlock,\n * and ResponseBlock. Forwards user interactions to the workspace event bus and\n * passes through configuration such as auth, servers, plugins, and environment.\n * This component keeps the Operation page lean by centralizing event emission\n * and prop wiring between the blocks.\n *\n * Notable behavior:\n * - Uses operation['x-scalar-method'] and operation['x-scalar-path'] to provide\n * draft overrides for the UI when present.\n */\nexport default {\n name: 'OperationBlock',\n}\n\nexport type OperationBlockProps = {\n /** Keep execution and editing unavailable until the selected payload is ready. */\n externalExamplesPending?: boolean\n externalExamplesFailed?: boolean\n /** Event bus */\n eventBus: WorkspaceEventBus\n /** Application version */\n appVersion: string\n /** Openapi document */\n document: OpenApiDocument\n /** Openapi document slug */\n documentSlug: string\n /** Workspace cookies */\n workspaceCookies: XScalarCookie[]\n /** Document cookies */\n documentCookies: XScalarCookie[]\n /** Current request path */\n path: string\n /** Current request method */\n method: HttpMethodType\n /** Whether `path` identifies an OpenAPI webhook. */\n isWebhook?: boolean\n /** HTTP clients */\n httpClients: AvailableClients\n /** The history for the operation */\n history?: HistoryEntry[]\n /** Client layout */\n layout: ClientLayout\n /** Currently selected server */\n server: ServerObject | null\n /** Currently selected client */\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n /** Server list available for operation/document */\n servers: ServerObject[]\n /** Meta information for the server */\n serverMeta: ServerMeta\n /** Hides the client button on the header */\n hideClientButton?: boolean\n /** Client integration */\n integration?: string | null\n /** Openapi document url for `modal` mode to open the client app */\n documentUrl?: string\n /** Client source */\n source?: 'gitbook' | 'api-reference'\n /** Operation object */\n operation: OperationObject\n /** Operation before downloaded examples are overlaid, for parameter edit targets. */\n sourceOperation?: OperationObject\n /** Currently selected example key for the current operation */\n exampleKey: string\n /** Meta information for the auth update */\n authMeta: AuthMeta\n /** Document defined security schemes */\n securitySchemes: MergedSecuritySchemes\n /** Client plugins */\n plugins: ClientPlugin[]\n /** Environment list */\n environments?: string[]\n /** Currently selected environment */\n activeEnvironment?: string\n /** For environment variables in the inputs */\n environment: XScalarEnvironment\n /** The proxy URL for sending requests */\n proxyUrl: string\n /** Currently selected security */\n selectedSecurity: SelectedSecurity\n /** Currently selected security schemes */\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n /** Security requirements */\n securityRequirements: OpenApiDocument['security']\n /** Default headers */\n defaultHeaders: Record<string, string>\n /** Selected anyOf/oneOf request-body variants keyed by schema path */\n requestBodyCompositionSelection?: Record<string, number>\n /** Subset of config options for the modal */\n options?: ModalProps['options']\n}\n</script>\n<script setup lang=\"ts\">\nimport { generateClientOptions } from '@scalar/blocks/code-example'\nimport { ScalarButton } from '@scalar/components/button'\nimport { ERRORS } from '@scalar/helpers/errors/normalize-error'\nimport { isElectron } from '@scalar/helpers/general/is-electron'\nimport { buildSafeBodyRequest } from '@scalar/helpers/http/can-method-have-body'\nimport type { HttpMethod as HttpMethodType } from '@scalar/helpers/http/http-methods'\nimport {\n executeHook,\n executeResponseHook,\n type ClientPlugin,\n} from '@scalar/oas-utils/helpers'\nimport {\n AVAILABLE_CLIENTS,\n type AvailableClients,\n} from '@scalar/types/snippetz'\nimport { useClipboard } from '@scalar/use-hooks/useClipboard'\nimport { useToasts } from '@scalar/use-toasts'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type { HistoryEntry } from '@scalar/workspace-store/entities/history/schema'\nimport type {\n AuthMeta,\n ServerMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport {\n buildRequest,\n createVariablesStoreForRequest,\n getEnvironmentVariables,\n requestFactory,\n resolveExecutableRequestUrl,\n type MergedSecuritySchemes,\n type RequestPayload,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.2/strict/operation'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n toValue,\n watch,\n} from 'vue'\n\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { harToFetchRequest } from '@/v2/blocks/operation-block/helpers/har-to-fetch-request'\nimport { harToFetchResponse } from '@/v2/blocks/operation-block/helpers/har-to-fetch-response'\nimport {\n getCookieRequestUrl,\n getResponseCookieActions,\n} from '@/v2/blocks/operation-block/helpers/persist-response-cookies'\nimport { getEnvironmentPersistenceActions } from '@/v2/blocks/operation-block/helpers/persist-script-environment'\nimport {\n getOperationExampleKey,\n isStreamingResponse,\n responseCache,\n} from '@/v2/blocks/operation-block/helpers/response-cache'\nimport {\n sendRequest,\n type ResponseInstance,\n} from '@/v2/blocks/operation-block/helpers/send-request'\nimport { validatePathParameters } from '@/v2/blocks/operation-block/helpers/validate-path-parameters'\nimport { RequestBlock } from '@/v2/blocks/request-block'\nimport { ResponseBlock } from '@/v2/blocks/response-block'\nimport { type History } from '@/v2/blocks/scalar-address-bar-block'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ModalProps } from '@/v2/features/modal/Modal.vue'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport Header from './components/Header.vue'\n\nconst {\n externalExamplesPending = false,\n externalExamplesFailed = false,\n authMeta,\n environment,\n eventBus,\n exampleKey,\n document,\n documentSlug,\n workspaceCookies = [],\n documentCookies = [],\n hideClientButton,\n httpClients = AVAILABLE_CLIENTS,\n history = [],\n layout,\n method,\n isWebhook = false,\n operation,\n sourceOperation,\n path,\n plugins = [],\n proxyUrl,\n requestBodyCompositionSelection,\n securitySchemes,\n selectedClient,\n server,\n servers,\n environments,\n options,\n activeEnvironment,\n serverMeta,\n selectedSecurity,\n selectedSecuritySchemes,\n securityRequirements,\n defaultHeaders,\n} = defineProps<OperationBlockProps>()\n\ndefineEmits<{ (e: 'retry:externalExamples'): void }>()\n\nconst { translate } = useLocalization()\n\n/** Hoist up client generation so it doesn't get re-generated on every operation */\nconst clientOptions = computed(() => generateClientOptions(httpClients))\n\nconst { toast } = useToasts()\nconst { copyToClipboard } = useClipboard()\n\n// Refs\nconst abortController = ref<AbortController | null>(null)\nconst response = ref<ResponseInstance | null>(null)\nconst requestPayload = ref<RequestPayload | null>(null)\n\n/**\n * A webhook has no OpenAPI server, so its destination is the full URL the user\n * enters at runtime. The field holds that whole URL (not a server-relative path),\n * and the request is sent to it directly with no separate server base.\n */\nconst webhookUrl = ref('')\n\nwatch(\n [() => path, () => method, () => isWebhook],\n () => {\n webhookUrl.value = ''\n },\n { immediate: true },\n)\n\nconst requestPath = computed(() => (isWebhook ? webhookUrl.value : path))\nconst requestServer = computed<ServerObject | null>(() =>\n isWebhook ? null : server,\n)\n\n/** Cancel the request */\nconst cancelRequest = () => abortController.value?.abort(ERRORS.REQUEST_ABORTED)\n\n/**\n * Persist server-set cookies from a response into the document cookie jar.\n *\n * Scalar keeps its own cookie jar because browsers hide `Set-Cookie` from `fetch`.\n * Mirroring browser behavior, cookies are stored scoped to the request host and\n * path and removed when the server expires them, so a value like a Django CSRF\n * token stays available for later PUT/PATCH requests after a page reload.\n */\nconst persistResponseCookies = (sendResult: {\n response: ResponseInstance\n requestPayload: RequestPayload\n}) => {\n const actions = getResponseCookieActions({\n cookieHeaderKeys: sendResult.response.cookieHeaderKeys ?? [],\n documentCookies,\n requestUrl: getCookieRequestUrl(String(sendResult.requestPayload[0])),\n })\n\n for (const action of actions) {\n if (action.type === 'delete') {\n eventBus.emit('cookie:delete:cookie', {\n collectionType: 'document',\n cookieName: action.cookieName,\n index: action.index,\n })\n continue\n }\n\n eventBus.emit('cookie:upsert:cookie', {\n collectionType: 'document',\n payload: action.cookie,\n ...(action.index === undefined ? {} : { index: action.index }),\n })\n }\n}\n\n/**\n * Copy the executable URL — same pipeline as Send (`requestFactory` +\n * `resolveExecutableRequestUrl`), including security query params.\n */\nconst copyAddressBarUrl = async (): Promise<void> => {\n const { request } = requestFactory({\n defaultHeaders,\n environment,\n exampleName: exampleKey,\n globalCookies: [...workspaceCookies, ...documentCookies],\n method,\n operation,\n path: requestPath.value,\n proxyUrl,\n server: requestServer.value,\n selectedSecuritySchemes,\n isElectron: isElectron(),\n requestBodyCompositionSelection,\n })\n\n await copyToClipboard(\n resolveExecutableRequestUrl(request, getEnvironmentVariables(environment)),\n )\n}\n\n/** Execute the current operation example */\nconst handleExecute = async () => {\n if (externalExamplesPending) return\n eventBus.flushDebouncedEmits?.()\n // Source edits must reach the overlaid operation prop before building the request.\n await nextTick()\n\n if (isWebhook && !requestPath.value.trim()) {\n toast(translate('apiClient.operationBlock.webhookUrlRequired'), 'error')\n return\n }\n\n const pathValidation = validatePathParameters(\n operation.parameters ?? [],\n exampleKey,\n )\n if (pathValidation.ok === false) {\n toast(translate('apiClient.operationBlock.pathParametersRequired'), 'error')\n return\n }\n\n const globalCookies = [...workspaceCookies, ...documentCookies]\n\n const { request: requestBuilder } = requestFactory({\n defaultHeaders,\n environment,\n exampleName: exampleKey,\n globalCookies,\n method,\n operation,\n path: requestPath.value,\n proxyUrl,\n server: requestServer.value,\n selectedSecuritySchemes,\n isElectron: isElectron(),\n requestBodyCompositionSelection,\n })\n\n // Stop any previous streaming response\n if (response.value && 'reader' in response.value) {\n response.value.reader.cancel()\n }\n\n const variablesStore = createVariablesStoreForRequest()\n\n // Seed the script variable store with the active environment so pm.environment.get()\n // and pm.variables.get() resolve to the same values as {{…}} placeholders. Without\n // seeding, the store starts empty and every scripted read returns undefined.\n const seededEnvironment = getEnvironmentVariables(environment)\n variablesStore.setEnvironment?.(\n Object.entries(seededEnvironment).map(([key, value]) => ({ key, value })),\n )\n\n // Snapshot the persistence target at request start, alongside the seed. Persistence runs after\n // the request completes (awaits below), and the environment props are reactive — if the active\n // environment is switched mid-flight, or a concurrent request splices these arrays, reading\n // them at persist time would apply the script's writes to the wrong environment or resolve\n // workspace/document indexes against a shifted list. Copy the arrays (not just the reference)\n // so the seeded values and these targets stay fixed to the same point in time.\n const persistenceTarget = activeEnvironment\n ? {\n environmentName: activeEnvironment,\n mergedVariables: [...environment.variables],\n documentVariables: [\n ...(document['x-scalar-environments']?.[activeEnvironment]\n ?.variables ?? []),\n ],\n environmentExistsOnDocument: Boolean(\n document['x-scalar-environments']?.[activeEnvironment],\n ),\n }\n : null\n\n // Execute the beforeRequest hook (plugins receive RequestFactory, not fetch Request)\n await executeHook(\n {\n requestBuilder,\n document,\n operation,\n variablesStore,\n server: requestServer.value,\n customFetch: toValue(options)?.customFetch,\n },\n 'beforeRequest',\n plugins,\n )\n\n // Persist environment variables set by scripts (pm.environment.set / unset) back to the active\n // environment so they survive to the next request, mirroring the Environment tab. Scope and\n // index are resolved from the seed-time environment so updates mutate in place. Defined here so\n // it can run on every exit path after the pre-request scripts — including a build failure or a\n // failed send — so a pre-request set, like a token stored before a flaky call, is not lost.\n const persistScriptEnvironment = () => {\n if (!persistenceTarget) {\n return\n }\n\n const environmentActions = getEnvironmentPersistenceActions({\n ...persistenceTarget,\n seededVariables: seededEnvironment,\n scriptVariables: variablesStore.getEnvironment(),\n })\n\n for (const action of environmentActions) {\n if (action.type === 'delete') {\n eventBus.emit('environment:delete:environment-variable', {\n environmentName: action.environmentName,\n index: action.index,\n collectionType: action.collectionType,\n })\n } else {\n eventBus.emit('environment:upsert:environment-variable', {\n environmentName: action.environmentName,\n variable: action.variable,\n index: action.index,\n collectionType: action.collectionType,\n })\n }\n }\n }\n\n // Resolve {{…}} placeholders from the script store so pre-request pm.environment.set() and\n // unset() take effect on this request. The store was seeded from the active environment, so\n // it already holds every value spreading seededEnvironment would add — minus the keys a script\n // unset, which must stay dropped (an object spread cannot remove them again).\n const envVariables = variablesStore.getVariables()\n\n // Build the fetch Request after hooks may have mutated the factory\n const built = buildRequest(requestBuilder, {\n envVariables,\n allowMissingRequestServerBase: layout === 'modal',\n })\n if (!built.ok) {\n // Save any pre-request script writes before bailing out on a build failure.\n persistScriptEnvironment()\n toast(built.message ?? built.error, 'error')\n return\n }\n\n // Store the abort controller for cancellation\n abortController.value = built.data.controller\n\n // Build the fetch Request once so the requestBuilt hook observes the exact bytes that are\n // sent. Rebuilding it later would generate a different multipart boundary, which breaks\n // plugins that hash the body (for example, request signing).\n const request = buildSafeBodyRequest(...built.data.requestPayload)\n\n // Execute the requestBuilt hook (plugins receive the exact fetch Request that will be sent)\n await executeHook(\n {\n request,\n requestBuilder,\n document,\n operation,\n variablesStore,\n },\n 'requestBuilt',\n plugins,\n )\n\n // Execute the hooks\n eventBus.emit('hooks:on:request:sent', {\n meta: {\n method,\n path,\n exampleKey,\n },\n })\n\n /** Execute the request */\n const [sendError, sendResult] = await sendRequest({\n isUsingProxy: built.data.isUsingProxy,\n requestPayload: built.data.requestPayload,\n request,\n plugins,\n customFetch: toValue(options)?.customFetch,\n onResponseReceived: async (response, responseDuration) => {\n const result = await executeResponseHook(\n {\n response,\n responseDuration,\n requestBuilder,\n request: buildSafeBodyRequest(...built.data.requestPayload),\n document,\n operation,\n variablesStore,\n },\n plugins,\n )\n return result.response\n },\n })\n\n // Save script environment writes (pre-request and, on success, post-response) back to the\n // active environment. Runs even when the send fails so a pre-request set is not lost.\n persistScriptEnvironment()\n\n // Execute the hooks\n eventBus.emit('hooks:on:request:complete', {\n payload: sendResult\n ? {\n response: sendResult.originalResponse.clone(),\n requestPayload: sendResult.requestPayload,\n duration: sendResult.response.duration,\n timestamp: sendResult.timestamp,\n }\n : undefined,\n meta: {\n method,\n path,\n exampleKey,\n },\n })\n\n if (sendError) {\n // clean up the response and request\n response.value = null\n requestPayload.value = null\n abortController.value = null\n\n toast(sendError.message, 'error')\n return\n }\n\n // Store the response\n response.value = sendResult.response\n requestPayload.value = sendResult.requestPayload\n\n // Persist server-set cookies into the document jar so values like a CSRF token\n // survive a page reload and get replayed on the next request, like a browser would.\n persistResponseCookies(sendResult)\n\n // Cache non-streaming responses so they can be restored when navigating back\n if (!isStreamingResponse(sendResult.response)) {\n responseCache.set(getOperationExampleKey(method, path, exampleKey), {\n response: sendResult.response,\n requestPayload: sendResult.requestPayload,\n })\n }\n}\n\nonMounted(() => {\n eventBus.on('operation:send:request:hotkey', handleExecute)\n eventBus.on('operation:cancel:request', cancelRequest)\n eventBus.on('copy-url:address-bar', copyAddressBarUrl)\n\n // Let plugins warm up per-operation resources (e.g. the scripts sandbox) so the first request\n // does not pay their cold-start cost.\n void executeHook({ document, operation }, 'onRequestMount', plugins)\n})\nonBeforeUnmount(() => {\n eventBus.off('operation:send:request:hotkey', handleExecute)\n eventBus.off('operation:cancel:request', cancelRequest)\n eventBus.off('copy-url:address-bar', copyAddressBarUrl)\n})\n\nconst operationHistory = computed<History[]>(() =>\n history\n .map((entry) => ({\n method: entry.request.method as HttpMethodType,\n path: entry.request.url,\n duration: entry.time,\n status: entry.response.status,\n }))\n .reverse(),\n)\n\nconst handleSelectHistoryItem = ({ index }: { index: number }) => {\n const transformedIndex = (history.length ?? 0) - index - 1\n const historyItem = history[transformedIndex]\n if (!historyItem) {\n return\n }\n\n const navigate = () =>\n eventBus.emit('ui:navigate', {\n page: 'example',\n method,\n path,\n exampleName: 'draft',\n callback: (status) => {\n // Do not replace the response if the navigation was not successful\n if (status !== 'success') {\n return\n }\n // Reconstruct the response\n const fetchResponse = harToFetchResponse({\n harResponse: historyItem.response,\n url: historyItem.request.url,\n method,\n path,\n duration: historyItem.time,\n })\n\n // Reconstruct the request\n const fetchRequest = harToFetchRequest({\n harRequest: historyItem.request,\n })\n\n // Update the response and request\n response.value = fetchResponse\n requestPayload.value = fetchRequest\n },\n })\n\n eventBus.emit('operation:reload:history', {\n meta: {\n path,\n method,\n },\n index: transformedIndex,\n callback: navigate,\n })\n}\n\nconst handleNavigateSettings = () => {\n eventBus.emit('ui:navigate', {\n page: 'operation',\n path: 'overview',\n operationPath: path,\n method,\n })\n}\n\n/**\n * When the path, method, or example key changes, restore the response panel\n * for the new operation from the best available source:\n *\n * 1. `responseCache` — in-memory, populated on every successful send.\n * Has the live response object (including streams) so it wins.\n * 2. `history` — persisted in the workspace store. Used as a fallback when\n * the in-memory cache is empty (page reload, fresh app session, etc.)\n * so navigating to an operation that has been called before shows the\n * last response instead of an empty panel.\n * 3. Otherwise clear.\n *\n * Only the response is restored from history — the user's request inputs are\n * left alone, so we never silently overwrite an in-progress draft.\n */\nwatch(\n [() => path, () => method, () => exampleKey],\n ([newPath, newMethod, newExampleKey]) => {\n const cached = responseCache.get(\n getOperationExampleKey(newMethod, newPath, newExampleKey),\n )\n\n if (cached) {\n response.value = cached.response\n requestPayload.value = cached.requestPayload\n } else {\n // History is keyed only by document/path/method but each entry carries\n // the example it came from, so we walk from the end and pick the most\n // recent entry that matches the active example. Otherwise a cache miss\n // on example B would restore example A's response. Only runs on a\n // cache miss — the common case (in-session navigation) skips it.\n const latest = (() => {\n for (let i = history.length - 1; i >= 0; i--) {\n const entry = history[i]\n if (entry?.meta.example === newExampleKey) {\n return entry\n }\n }\n return undefined\n })()\n\n if (latest) {\n response.value = harToFetchResponse({\n harResponse: latest.response,\n url: latest.request.url,\n method: newMethod,\n path: newPath,\n duration: latest.time,\n })\n requestPayload.value = null\n } else {\n response.value = null\n requestPayload.value = null\n }\n }\n\n // Cancel any in-flight request\n cancelRequest()\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n // We cancel the request if the component is unmounted\n cancelRequest()\n})\n</script>\n<template>\n <div class=\"bg-b-1 flex h-full flex-col\">\n <div\n class=\"lg:min-h-header flex w-full flex-wrap items-center justify-center p-2 lg:p-0\">\n <!-- Address Bar -->\n <Header\n :activeEnvironment\n :documentSlug\n :documentUrl\n :environment\n :environments\n :eventBus\n :exampleKey\n :executionDisabled=\"externalExamplesPending\"\n :hideClientButton\n :history=\"operationHistory\"\n :integration\n :isWebhook\n :layout\n :method\n :path=\"requestPath\"\n :server=\"requestServer\"\n :serverMeta\n :servers\n :source\n @execute=\"handleExecute\"\n @navigate:settings=\"handleNavigateSettings\"\n @select:history:item=\"handleSelectHistoryItem\"\n @update:webhook-url=\"(value) => (webhookUrl = value)\" />\n </div>\n\n <ViewLayout class=\"border-t\">\n <ViewLayoutContent class=\"flex-1\">\n <!-- Request Section -->\n <ViewLayoutSection\n v-if=\"externalExamplesPending\"\n aria-label=\"Request\">\n <template #title>Request</template>\n <div\n class=\"text-c-2 p-4\"\n role=\"status\">\n <template v-if=\"externalExamplesFailed\">\n Could not load this example.\n <ScalarButton\n size=\"sm\"\n variant=\"ghost\"\n @click=\"$emit('retry:externalExamples')\">\n Retry\n </ScalarButton>\n </template>\n <template v-else>Loading example…</template>\n </div>\n </ViewLayoutSection>\n <RequestBlock\n v-else\n :authMeta\n :clientOptions\n :defaultHeaders\n :defaultRequestBodyView=\"\n document['x-scalar-default-request-body-view']\n \"\n :documentCookies\n :documentSlug\n :environment\n :eventBus\n :exampleKey\n :layout\n :method\n :operation\n :options=\"toValue(options)\"\n :path=\"requestPath\"\n :plugins\n :proxyUrl\n :requestBodyCompositionSelection\n :securityRequirements\n :securitySchemes\n :selectedClient\n :selectedSecurity\n :selectedSecuritySchemes\n :server=\"requestServer\"\n :sourceOperation\n :workspaceCookies />\n\n <!-- Response Section -->\n <ResponseBlock\n :appVersion\n :eventBus\n :executionDisabled=\"externalExamplesPending\"\n :layout\n :plugins\n :requestPayload\n :response\n :totalPerformedRequests=\"operationHistory.length\" />\n </ViewLayoutContent>\n </ViewLayout>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"OperationBlock.vue.script.js","names":["$emit"],"sources":["../../../../src/v2/blocks/operation-block/OperationBlock.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * OperationBlock\n *\n * Orchestrates the operation view by wiring together the Header, OperationBlock,\n * and ResponseBlock. Forwards user interactions to the workspace event bus and\n * passes through configuration such as auth, servers, plugins, and environment.\n * This component keeps the Operation page lean by centralizing event emission\n * and prop wiring between the blocks.\n *\n * Notable behavior:\n * - Uses operation['x-scalar-method'] and operation['x-scalar-path'] to provide\n * draft overrides for the UI when present.\n */\nexport default {\n name: 'OperationBlock',\n}\n\nexport type OperationBlockProps = {\n /** Keep execution and editing unavailable until the selected payload is ready. */\n externalExamplesPending?: boolean\n externalExamplesFailed?: boolean\n /** Event bus */\n eventBus: WorkspaceEventBus\n /** Application version */\n appVersion: string\n /** Openapi document */\n document: OpenApiDocument\n /** Openapi document slug */\n documentSlug: string\n /** Workspace cookies */\n workspaceCookies: XScalarCookie[]\n /** Document cookies */\n documentCookies: XScalarCookie[]\n /** Current request path */\n path: string\n /** Current request method */\n method: string\n /** Whether `path` identifies an OpenAPI webhook. */\n isWebhook?: boolean\n /** HTTP clients */\n httpClients: AvailableClients\n /** The history for the operation */\n history?: HistoryEntry[]\n /** Client layout */\n layout: ClientLayout\n /** Currently selected server */\n server: ServerObject | null\n /** Currently selected client */\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n /** Server list available for operation/document */\n servers: ServerObject[]\n /** Meta information for the server */\n serverMeta: ServerMeta\n /** Hides the client button on the header */\n hideClientButton?: boolean\n /** Client integration */\n integration?: string | null\n /** Openapi document url for `modal` mode to open the client app */\n documentUrl?: string\n /** Client source */\n source?: 'gitbook' | 'api-reference'\n /** Operation object */\n operation: OperationObject\n /** Operation before downloaded examples are overlaid, for parameter edit targets. */\n sourceOperation?: OperationObject\n /** Currently selected example key for the current operation */\n exampleKey: string\n /** Meta information for the auth update */\n authMeta: AuthMeta\n /** Document defined security schemes */\n securitySchemes: MergedSecuritySchemes\n /** Client plugins */\n plugins: ClientPlugin[]\n /** Environment list */\n environments?: string[]\n /** Currently selected environment */\n activeEnvironment?: string\n /** For environment variables in the inputs */\n environment: XScalarEnvironment\n /** The proxy URL for sending requests */\n proxyUrl: string\n /** Currently selected security */\n selectedSecurity: SelectedSecurity\n /** Currently selected security schemes */\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n /** Security requirements */\n securityRequirements: OpenApiDocument['security']\n /** Default headers */\n defaultHeaders: Record<string, string>\n /** Selected anyOf/oneOf request-body variants keyed by schema path */\n requestBodyCompositionSelection?: Record<string, number>\n /** Subset of config options for the modal */\n options?: ModalProps['options']\n}\n</script>\n<script setup lang=\"ts\">\nimport { generateClientOptions } from '@scalar/blocks/code-example'\nimport { ScalarButton } from '@scalar/components/button'\nimport { ERRORS } from '@scalar/helpers/errors/normalize-error'\nimport { isElectron } from '@scalar/helpers/general/is-electron'\nimport { buildSafeBodyRequest } from '@scalar/helpers/http/can-method-have-body'\nimport { isForbiddenHttpMethod } from '@scalar/helpers/http/is-forbidden-http-method'\nimport {\n executeHook,\n executeResponseHook,\n type ClientPlugin,\n} from '@scalar/oas-utils/helpers'\nimport {\n AVAILABLE_CLIENTS,\n type AvailableClients,\n} from '@scalar/types/snippetz'\nimport { useClipboard } from '@scalar/use-hooks/useClipboard'\nimport { useToasts } from '@scalar/use-toasts'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type { HistoryEntry } from '@scalar/workspace-store/entities/history/schema'\nimport type {\n AuthMeta,\n ServerMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport {\n buildRequest,\n createVariablesStoreForRequest,\n getEnvironmentVariables,\n requestFactory,\n resolveExecutableRequestUrl,\n type MergedSecuritySchemes,\n type RequestPayload,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.2/strict/operation'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n toValue,\n watch,\n} from 'vue'\n\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { harToFetchRequest } from '@/v2/blocks/operation-block/helpers/har-to-fetch-request'\nimport { harToFetchResponse } from '@/v2/blocks/operation-block/helpers/har-to-fetch-response'\nimport {\n getCookieRequestUrl,\n getResponseCookieActions,\n} from '@/v2/blocks/operation-block/helpers/persist-response-cookies'\nimport { getEnvironmentPersistenceActions } from '@/v2/blocks/operation-block/helpers/persist-script-environment'\nimport {\n getOperationExampleKey,\n isStreamingResponse,\n responseCache,\n} from '@/v2/blocks/operation-block/helpers/response-cache'\nimport {\n sendRequest,\n type ResponseInstance,\n} from '@/v2/blocks/operation-block/helpers/send-request'\nimport { validatePathParameters } from '@/v2/blocks/operation-block/helpers/validate-path-parameters'\nimport { RequestBlock } from '@/v2/blocks/request-block'\nimport { ResponseBlock } from '@/v2/blocks/response-block'\nimport { type History } from '@/v2/blocks/scalar-address-bar-block'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ModalProps } from '@/v2/features/modal/Modal.vue'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport Header from './components/Header.vue'\n\nconst {\n externalExamplesPending = false,\n externalExamplesFailed = false,\n authMeta,\n environment,\n eventBus,\n exampleKey,\n document,\n documentSlug,\n workspaceCookies = [],\n documentCookies = [],\n hideClientButton,\n httpClients = AVAILABLE_CLIENTS,\n history = [],\n layout,\n method,\n isWebhook = false,\n operation,\n sourceOperation,\n path,\n plugins = [],\n proxyUrl,\n requestBodyCompositionSelection,\n securitySchemes,\n selectedClient,\n server,\n servers,\n environments,\n options,\n activeEnvironment,\n serverMeta,\n selectedSecurity,\n selectedSecuritySchemes,\n securityRequirements,\n defaultHeaders,\n} = defineProps<OperationBlockProps>()\n\ndefineEmits<{ (e: 'retry:externalExamples'): void }>()\n\nconst { translate } = useLocalization()\n\n/** Hoist up client generation so it doesn't get re-generated on every operation */\nconst clientOptions = computed(() => generateClientOptions(httpClients))\n\nconst { toast } = useToasts()\nconst { copyToClipboard } = useClipboard()\n\n// Refs\nconst abortController = ref<AbortController | null>(null)\nconst response = ref<ResponseInstance | null>(null)\nconst requestPayload = ref<RequestPayload | null>(null)\n\n/**\n * A webhook has no OpenAPI server, so its destination is the full URL the user\n * enters at runtime. The field holds that whole URL (not a server-relative path),\n * and the request is sent to it directly with no separate server base.\n */\nconst webhookUrl = ref('')\n\nwatch(\n [() => path, () => method, () => isWebhook],\n () => {\n webhookUrl.value = ''\n },\n { immediate: true },\n)\n\nconst requestPath = computed(() => (isWebhook ? webhookUrl.value : path))\nconst requestServer = computed<ServerObject | null>(() =>\n isWebhook ? null : server,\n)\n\n/** Cancel the request */\nconst cancelRequest = () => abortController.value?.abort(ERRORS.REQUEST_ABORTED)\n\n/**\n * Persist server-set cookies from a response into the document cookie jar.\n *\n * Scalar keeps its own cookie jar because browsers hide `Set-Cookie` from `fetch`.\n * Mirroring browser behavior, cookies are stored scoped to the request host and\n * path and removed when the server expires them, so a value like a Django CSRF\n * token stays available for later PUT/PATCH requests after a page reload.\n */\nconst persistResponseCookies = (sendResult: {\n response: ResponseInstance\n requestPayload: RequestPayload\n}) => {\n const actions = getResponseCookieActions({\n cookieHeaderKeys: sendResult.response.cookieHeaderKeys ?? [],\n documentCookies,\n requestUrl: getCookieRequestUrl(String(sendResult.requestPayload[0])),\n })\n\n for (const action of actions) {\n if (action.type === 'delete') {\n eventBus.emit('cookie:delete:cookie', {\n collectionType: 'document',\n cookieName: action.cookieName,\n index: action.index,\n })\n continue\n }\n\n eventBus.emit('cookie:upsert:cookie', {\n collectionType: 'document',\n payload: action.cookie,\n ...(action.index === undefined ? {} : { index: action.index }),\n })\n }\n}\n\n/**\n * Copy the executable URL — same pipeline as Send (`requestFactory` +\n * `resolveExecutableRequestUrl`), including security query params.\n */\nconst copyAddressBarUrl = async (): Promise<void> => {\n const { request } = requestFactory({\n defaultHeaders,\n environment,\n exampleName: exampleKey,\n globalCookies: [...workspaceCookies, ...documentCookies],\n method,\n operation,\n path: requestPath.value,\n proxyUrl,\n server: requestServer.value,\n selectedSecuritySchemes,\n isElectron: isElectron(),\n requestBodyCompositionSelection,\n })\n\n await copyToClipboard(\n resolveExecutableRequestUrl(request, getEnvironmentVariables(environment)),\n )\n}\n\n/** Execute the current operation example */\nconst handleExecute = async () => {\n if (externalExamplesPending) return\n eventBus.flushDebouncedEmits?.()\n // Source edits must reach the overlaid operation prop before building the request.\n await nextTick()\n\n if (isWebhook && !requestPath.value.trim()) {\n toast(translate('apiClient.operationBlock.webhookUrlRequired'), 'error')\n return\n }\n\n const pathValidation = validatePathParameters(\n operation.parameters ?? [],\n exampleKey,\n )\n if (pathValidation.ok === false) {\n toast(translate('apiClient.operationBlock.pathParametersRequired'), 'error')\n return\n }\n\n const globalCookies = [...workspaceCookies, ...documentCookies]\n\n const { request: requestBuilder } = requestFactory({\n defaultHeaders,\n environment,\n exampleName: exampleKey,\n globalCookies,\n method,\n operation,\n path: requestPath.value,\n proxyUrl,\n server: requestServer.value,\n selectedSecuritySchemes,\n isElectron: isElectron(),\n requestBodyCompositionSelection,\n })\n\n // Stop any previous streaming response\n if (response.value && 'reader' in response.value) {\n response.value.reader.cancel()\n }\n\n const variablesStore = createVariablesStoreForRequest()\n\n // Seed the script variable store with the active environment so pm.environment.get()\n // and pm.variables.get() resolve to the same values as {{…}} placeholders. Without\n // seeding, the store starts empty and every scripted read returns undefined.\n const seededEnvironment = getEnvironmentVariables(environment)\n variablesStore.setEnvironment?.(\n Object.entries(seededEnvironment).map(([key, value]) => ({ key, value })),\n )\n\n // Snapshot the persistence target at request start, alongside the seed. Persistence runs after\n // the request completes (awaits below), and the environment props are reactive — if the active\n // environment is switched mid-flight, or a concurrent request splices these arrays, reading\n // them at persist time would apply the script's writes to the wrong environment or resolve\n // workspace/document indexes against a shifted list. Copy the arrays (not just the reference)\n // so the seeded values and these targets stay fixed to the same point in time.\n const persistenceTarget = activeEnvironment\n ? {\n environmentName: activeEnvironment,\n mergedVariables: [...environment.variables],\n documentVariables: [\n ...(document['x-scalar-environments']?.[activeEnvironment]\n ?.variables ?? []),\n ],\n environmentExistsOnDocument: Boolean(\n document['x-scalar-environments']?.[activeEnvironment],\n ),\n }\n : null\n\n // Execute the beforeRequest hook (plugins receive RequestFactory, not fetch Request)\n await executeHook(\n {\n requestBuilder,\n document,\n operation,\n variablesStore,\n server: requestServer.value,\n customFetch: toValue(options)?.customFetch,\n },\n 'beforeRequest',\n plugins,\n )\n\n // Persist environment variables set by scripts (pm.environment.set / unset) back to the active\n // environment so they survive to the next request, mirroring the Environment tab. Scope and\n // index are resolved from the seed-time environment so updates mutate in place. Defined here so\n // it can run on every exit path after the pre-request scripts — including a build failure or a\n // failed send — so a pre-request set, like a token stored before a flaky call, is not lost.\n const persistScriptEnvironment = () => {\n if (!persistenceTarget) {\n return\n }\n\n const environmentActions = getEnvironmentPersistenceActions({\n ...persistenceTarget,\n seededVariables: seededEnvironment,\n scriptVariables: variablesStore.getEnvironment(),\n })\n\n for (const action of environmentActions) {\n if (action.type === 'delete') {\n eventBus.emit('environment:delete:environment-variable', {\n environmentName: action.environmentName,\n index: action.index,\n collectionType: action.collectionType,\n })\n } else {\n eventBus.emit('environment:upsert:environment-variable', {\n environmentName: action.environmentName,\n variable: action.variable,\n index: action.index,\n collectionType: action.collectionType,\n })\n }\n }\n }\n\n // Resolve {{…}} placeholders from the script store so pre-request pm.environment.set() and\n // unset() take effect on this request. The store was seeded from the active environment, so\n // it already holds every value spreading seededEnvironment would add — minus the keys a script\n // unset, which must stay dropped (an object spread cannot remove them again).\n const envVariables = variablesStore.getVariables()\n\n // Build the fetch Request after hooks may have mutated the factory\n const built = buildRequest(requestBuilder, {\n envVariables,\n allowMissingRequestServerBase: layout === 'modal',\n })\n if (!built.ok) {\n // Save any pre-request script writes before bailing out on a build failure.\n persistScriptEnvironment()\n toast(built.message ?? built.error, 'error')\n return\n }\n\n // Check the final method because pre-request scripts can change it.\n const requestMethod = built.data.requestPayload[1].method ?? 'GET'\n if (isForbiddenHttpMethod(requestMethod)) {\n persistScriptEnvironment()\n toast(\n translate('apiClient.operationBlock.forbiddenMethod', {\n method: requestMethod.toUpperCase(),\n }),\n 'error',\n )\n return\n }\n\n // Store the abort controller for cancellation\n abortController.value = built.data.controller\n\n // Build the fetch Request once so the requestBuilt hook observes the exact bytes that are\n // sent. Rebuilding it later would generate a different multipart boundary, which breaks\n // plugins that hash the body (for example, request signing).\n const request = buildSafeBodyRequest(...built.data.requestPayload)\n\n // Execute the requestBuilt hook (plugins receive the exact fetch Request that will be sent)\n await executeHook(\n {\n request,\n requestBuilder,\n document,\n operation,\n variablesStore,\n },\n 'requestBuilt',\n plugins,\n )\n\n // Execute the hooks\n eventBus.emit('hooks:on:request:sent', {\n meta: {\n method,\n path,\n exampleKey,\n },\n })\n\n /** Execute the request */\n const [sendError, sendResult] = await sendRequest({\n isUsingProxy: built.data.isUsingProxy,\n requestPayload: built.data.requestPayload,\n request,\n plugins,\n customFetch: toValue(options)?.customFetch,\n onResponseReceived: async (response, responseDuration) => {\n const result = await executeResponseHook(\n {\n response,\n responseDuration,\n requestBuilder,\n request: buildSafeBodyRequest(...built.data.requestPayload),\n document,\n operation,\n variablesStore,\n },\n plugins,\n )\n return result.response\n },\n })\n\n // Save script environment writes (pre-request and, on success, post-response) back to the\n // active environment. Runs even when the send fails so a pre-request set is not lost.\n persistScriptEnvironment()\n\n // Execute the hooks\n eventBus.emit('hooks:on:request:complete', {\n payload: sendResult\n ? {\n response: sendResult.originalResponse.clone(),\n requestPayload: sendResult.requestPayload,\n duration: sendResult.response.duration,\n timestamp: sendResult.timestamp,\n }\n : undefined,\n meta: {\n method,\n path,\n exampleKey,\n },\n })\n\n if (sendError) {\n // clean up the response and request\n response.value = null\n requestPayload.value = null\n abortController.value = null\n\n toast(sendError.message, 'error')\n return\n }\n\n // Store the response\n response.value = sendResult.response\n requestPayload.value = sendResult.requestPayload\n\n // Persist server-set cookies into the document jar so values like a CSRF token\n // survive a page reload and get replayed on the next request, like a browser would.\n persistResponseCookies(sendResult)\n\n // Cache non-streaming responses so they can be restored when navigating back\n if (!isStreamingResponse(sendResult.response)) {\n responseCache.set(getOperationExampleKey(method, path, exampleKey), {\n response: sendResult.response,\n requestPayload: sendResult.requestPayload,\n })\n }\n}\n\nonMounted(() => {\n eventBus.on('operation:send:request:hotkey', handleExecute)\n eventBus.on('operation:cancel:request', cancelRequest)\n eventBus.on('copy-url:address-bar', copyAddressBarUrl)\n\n // Let plugins warm up per-operation resources (e.g. the scripts sandbox) so the first request\n // does not pay their cold-start cost.\n void executeHook({ document, operation }, 'onRequestMount', plugins)\n})\nonBeforeUnmount(() => {\n eventBus.off('operation:send:request:hotkey', handleExecute)\n eventBus.off('operation:cancel:request', cancelRequest)\n eventBus.off('copy-url:address-bar', copyAddressBarUrl)\n})\n\nconst operationHistory = computed<History[]>(() =>\n history\n .map((entry) => ({\n method: entry.request.method as string,\n path: entry.request.url,\n duration: entry.time,\n status: entry.response.status,\n }))\n .reverse(),\n)\n\nconst handleSelectHistoryItem = ({ index }: { index: number }) => {\n const transformedIndex = (history.length ?? 0) - index - 1\n const historyItem = history[transformedIndex]\n if (!historyItem) {\n return\n }\n\n const navigate = () =>\n eventBus.emit('ui:navigate', {\n page: 'example',\n method,\n path,\n exampleName: 'draft',\n callback: (status) => {\n // Do not replace the response if the navigation was not successful\n if (status !== 'success') {\n return\n }\n // Reconstruct the response\n const fetchResponse = harToFetchResponse({\n harResponse: historyItem.response,\n url: historyItem.request.url,\n method,\n path,\n duration: historyItem.time,\n })\n\n // Reconstruct the request\n const fetchRequest = harToFetchRequest({\n harRequest: historyItem.request,\n })\n\n // Update the response and request\n response.value = fetchResponse\n requestPayload.value = fetchRequest\n },\n })\n\n eventBus.emit('operation:reload:history', {\n meta: {\n path,\n method,\n },\n index: transformedIndex,\n callback: navigate,\n })\n}\n\nconst handleNavigateSettings = () => {\n eventBus.emit('ui:navigate', {\n page: 'operation',\n path: 'overview',\n operationPath: path,\n method,\n })\n}\n\n/**\n * When the path, method, or example key changes, restore the response panel\n * for the new operation from the best available source:\n *\n * 1. `responseCache` — in-memory, populated on every successful send.\n * Has the live response object (including streams) so it wins.\n * 2. `history` — persisted in the workspace store. Used as a fallback when\n * the in-memory cache is empty (page reload, fresh app session, etc.)\n * so navigating to an operation that has been called before shows the\n * last response instead of an empty panel.\n * 3. Otherwise clear.\n *\n * Only the response is restored from history — the user's request inputs are\n * left alone, so we never silently overwrite an in-progress draft.\n */\nwatch(\n [() => path, () => method, () => exampleKey],\n ([newPath, newMethod, newExampleKey]) => {\n const cached = responseCache.get(\n getOperationExampleKey(newMethod, newPath, newExampleKey),\n )\n\n if (cached) {\n response.value = cached.response\n requestPayload.value = cached.requestPayload\n } else {\n // History is keyed only by document/path/method but each entry carries\n // the example it came from, so we walk from the end and pick the most\n // recent entry that matches the active example. Otherwise a cache miss\n // on example B would restore example A's response. Only runs on a\n // cache miss — the common case (in-session navigation) skips it.\n const latest = (() => {\n for (let i = history.length - 1; i >= 0; i--) {\n const entry = history[i]\n if (entry?.meta.example === newExampleKey) {\n return entry\n }\n }\n return undefined\n })()\n\n if (latest) {\n response.value = harToFetchResponse({\n harResponse: latest.response,\n url: latest.request.url,\n method: newMethod,\n path: newPath,\n duration: latest.time,\n })\n requestPayload.value = null\n } else {\n response.value = null\n requestPayload.value = null\n }\n }\n\n // Cancel any in-flight request\n cancelRequest()\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n // We cancel the request if the component is unmounted\n cancelRequest()\n})\n</script>\n<template>\n <div class=\"bg-b-1 flex h-full flex-col\">\n <div\n class=\"lg:min-h-header flex w-full flex-wrap items-center justify-center p-2 lg:p-0\">\n <!-- Address Bar -->\n <Header\n :activeEnvironment\n :documentSlug\n :documentUrl\n :environment\n :environments\n :eventBus\n :exampleKey\n :executionDisabled=\"externalExamplesPending\"\n :hideClientButton\n :history=\"operationHistory\"\n :integration\n :isWebhook\n :layout\n :method\n :path=\"requestPath\"\n :server=\"requestServer\"\n :serverMeta\n :servers\n :source\n @execute=\"handleExecute\"\n @navigate:settings=\"handleNavigateSettings\"\n @select:history:item=\"handleSelectHistoryItem\"\n @update:webhook-url=\"(value) => (webhookUrl = value)\" />\n </div>\n\n <ViewLayout class=\"border-t\">\n <ViewLayoutContent class=\"flex-1\">\n <!-- Request Section -->\n <ViewLayoutSection\n v-if=\"externalExamplesPending\"\n aria-label=\"Request\">\n <template #title>Request</template>\n <div\n class=\"text-c-2 p-4\"\n role=\"status\">\n <template v-if=\"externalExamplesFailed\">\n Could not load this example.\n <ScalarButton\n size=\"sm\"\n variant=\"ghost\"\n @click=\"$emit('retry:externalExamples')\">\n Retry\n </ScalarButton>\n </template>\n <template v-else>Loading example…</template>\n </div>\n </ViewLayoutSection>\n <RequestBlock\n v-else\n :authMeta\n :clientOptions\n :defaultHeaders\n :defaultRequestBodyView=\"\n document['x-scalar-default-request-body-view']\n \"\n :documentCookies\n :documentSlug\n :environment\n :eventBus\n :exampleKey\n :layout\n :method\n :operation\n :options=\"toValue(options)\"\n :path=\"requestPath\"\n :plugins\n :proxyUrl\n :requestBodyCompositionSelection\n :securityRequirements\n :securitySchemes\n :selectedClient\n :selectedSecurity\n :selectedSecuritySchemes\n :server=\"requestServer\"\n :sourceOperation\n :workspaceCookies />\n\n <!-- Response Section -->\n <ResponseBlock\n :appVersion\n :eventBus\n :executionDisabled=\"externalExamplesPending\"\n :layout\n :plugins\n :requestPayload\n :response\n :totalPerformedRequests=\"operationHistory.length\" />\n </ViewLayoutContent>\n </ViewLayout>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import type { HttpMethod } from '@scalar/helpers/http/http-methods';
2
1
  import type { ServerMeta, WorkspaceEventBus } from '@scalar/workspace-store/events';
3
2
  import type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments';
4
3
  import type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
@@ -17,7 +16,7 @@ export type HeaderProps = {
17
16
  /** Current request path */
18
17
  path: string;
19
18
  /** Current request method */
20
- method: HttpMethod;
19
+ method: string;
21
20
  /** Whether this request comes from an OpenAPI webhook. */
22
21
  isWebhook?: boolean;
23
22
  /** Client layout */
@@ -1 +1 @@
1
- {"version":3,"file":"Header.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/components/Header.vue"],"names":[],"mappings":"AA6NA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AAEhG,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,sCAAsC,CAAA;AAG/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,MAAM,EAAE,UAAU,CAAA;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oBAAoB;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oBAAoB;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,eAAe,CAAA;IACpC,gCAAgC;IAChC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,mDAAmD;IACnD,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,8BAA8B;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,gBAAgB;IAChB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,uBAAuB;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4BAA4B;IAC5B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,sCAAsC;IACtC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;;eAc6B,MAAM;;;;;;;;eAAN,MAAM;;;;;;kFAgUjD,CAAC"}
1
+ {"version":3,"file":"Header.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/components/Header.vue"],"names":[],"mappings":"AA6NA,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AACvC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AAEhG,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,sCAAsC,CAAA;AAG/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAKrD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oBAAoB;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oBAAoB;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,eAAe,CAAA;IACpC,gCAAgC;IAChC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,mDAAmD;IACnD,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,8BAA8B;IAC9B,OAAO,EAAE,OAAO,EAAE,CAAA;IAClB,gBAAgB;IAChB,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,uBAAuB;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,4BAA4B;IAC5B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,sCAAsC;IACtC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;wBACoB,OAAO,YAAY;AAAxC,wBAAyC;AACzC,QAAA,MAAM,YAAY;;eAc6B,MAAM;;;;;;;;eAAN,MAAM;;;;;;kFAgUjD,CAAC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../../_virtual/_plugin-vue_
2
2
  import Header_vue_vue_type_script_setup_true_lang_default from "./Header.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/v2/blocks/operation-block/components/Header.vue
5
- var Header_default = /*#__PURE__*/ _plugin_vue_export_helper_default(Header_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-70c49191"]]);
5
+ var Header_default = /*#__PURE__*/ _plugin_vue_export_helper_default(Header_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cf0538d1"]]);
6
6
  //#endregion
7
7
  export { Header_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"Header.vue.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/Header.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n Operation block header: address bar, environment selector, and modal controls.\n\n Renders the top bar for the API client operation view: URL/method (AddressBar),\n optional environment selector, optional \"Open API Client\" button in modal layout,\n and close button for modal. Layout and visibility depend on `layout` and `source` props.\n */\nexport type HeaderProps = {\n /** An external example must finish loading before sending. */\n executionDisabled?: boolean\n /** Current request path */\n path: string\n /** Current request method */\n method: HttpMethod\n /** Whether this request comes from an OpenAPI webhook. */\n isWebhook?: boolean\n /** Client layout */\n layout: ClientLayout\n /** Hides the client button on the header */\n hideClientButton?: boolean\n /** Client integration */\n integration?: string | null\n /** Openapi document slug */\n documentSlug: string\n /** Currently selected example key for the current operation */\n exampleKey: string\n /** Openapi document url for `modal` mode to open the client app */\n documentUrl?: string\n /** Client source */\n source?: 'gitbook' | 'api-reference'\n /** Currently selected server */\n server: ServerObject | null\n /** Server list available for operation/document */\n servers: ServerObject[]\n /** List of request history */\n history: History[]\n /** Event bus */\n eventBus: WorkspaceEventBus\n /** Environment list */\n environments?: string[]\n /** Currently selected environment */\n activeEnvironment?: string\n /** Environment variables */\n environment: XScalarEnvironment\n /** Meta information for the server */\n serverMeta: ServerMeta\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { ScalarIconGearSix } from '@scalar/icons'\nimport type {\n ServerMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nimport { AddressBar, type History } from '@/v2/blocks/scalar-address-bar-block'\nimport EnvironmentSelector from '@/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport OpenApiClientButton from './OpenApiClientButton.vue'\n\nconst {\n hideClientButton = false,\n eventBus,\n exampleKey,\n documentSlug,\n} = defineProps<HeaderProps>()\n\nconst emit = defineEmits<{\n /** Execute the current operation example */\n (e: 'execute'): void\n /** Select a request history item by index */\n (e: 'select:history:item', payload: { index: number }): void\n /** Add a new environment */\n (e: 'add:environment'): void\n /** Navigate to the settings page for the current entity */\n (e: 'navigate:settings'): void\n /** Update the full destination URL used to deliver a webhook. */\n (e: 'update:webhook-url', url: string): void\n}>()\n\nconst { translate } = useLocalization()\n\nconst handleSelectEnvironment = (environmentName: string) => {\n eventBus.emit('workspace:update:active-environment', environmentName)\n}\n\nconst handleAddEnvironment = () => {\n eventBus.emit('ui:navigate', { page: 'document', path: 'environment' })\n}\n</script>\n\n<template>\n <!--\n `@container` declares an unnamed container so the AddressBar can\n adapt to the right column's actual width (which shrinks when the\n sidebar opens) instead of the viewport. The query is declared here\n on the parent rather than on the AddressBar itself so the bar's\n `w-full` mobile state cannot feed back into its own breakpoint.\n -->\n <div\n class=\"lg:min-h-header t-app__top-container @container flex w-full flex-wrap items-center justify-center p-2\">\n <!-- Left spacer to center bar -->\n <div class=\"flex flex-1\"></div>\n <AddressBar\n :activeEnvironment\n :documentSlug\n :environment\n :environments\n :eventBus\n :exampleKey\n :executionDisabled\n :history\n :isWebhook\n :layout\n :method\n :path\n :server\n :serverMeta\n :servers\n @add:environment=\"emit('add:environment')\"\n @execute=\"emit('execute')\"\n @select:history:item=\"(payload) => emit('select:history:item', payload)\"\n @update:webhook-url=\"(value) => emit('update:webhook-url', value)\" />\n\n <div class=\"mb-2 flex flex-1 items-center justify-end gap-2 @3xl:mb-0\">\n <!--\n Environment Selector\n Hidden for `modal` layout\n -->\n <EnvironmentSelector\n v-if=\"layout !== 'modal'\"\n :activeEnvironment=\"activeEnvironment\"\n :environments=\"environments\"\n @add:environment=\"handleAddEnvironment\"\n @select:environment=\"handleSelectEnvironment\" />\n <!-- Operation settings -->\n <ScalarIconButton\n v-if=\"layout !== 'modal' && !isWebhook\"\n :icon=\"ScalarIconGearSix\"\n :label=\"translate('apiClient.header.operationSettings')\"\n size=\"sm\"\n weight=\"bold\"\n @click=\"emit('navigate:settings')\" />\n <!--\n Open API Client Button\n\n Only shown in `modal` layout\n -->\n <OpenApiClientButton\n v-if=\"layout === 'modal' && documentUrl && !hideClientButton\"\n buttonSource=\"modal\"\n class=\"!w-fit lg:-mr-1\"\n :integration=\"integration ?? null\"\n :operationMethod=\"method\"\n :operationPath=\"path\"\n :source=\"source ?? 'api-reference'\"\n :url=\"documentUrl\" />\n\n <!--\n Close Button\n\n Only shown in `modal` layout and hidden for GitBook Integration\n -->\n <button\n v-if=\"layout === 'modal' && source !== 'gitbook'\"\n class=\"app-exit-button zoomed:static zoomed:p-1 fixed top-2 right-2 rounded-full p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"lg\"\n thickness=\"2\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n\n <!--\n Close Button for GitBook Integration\n\n Hidden by default and visible for GitBook Integration in `modal` layout\n -->\n <button\n v-if=\"layout === 'modal' && source === 'gitbook'\"\n class=\"text-c-1 hover:bg-b-2 active:text-c-1 -mr-1.5 rounded p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"md\"\n thickness=\"1.75\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n </div>\n </div>\n</template>\n<style scoped>\n.app-exit-button {\n color: white;\n background: rgba(0, 0, 0, 0.1);\n}\n.app-exit-button:hover {\n background: rgba(255, 255, 255, 0.1);\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"Header.vue.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/Header.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n Operation block header: address bar, environment selector, and modal controls.\n\n Renders the top bar for the API client operation view: URL/method (AddressBar),\n optional environment selector, optional \"Open API Client\" button in modal layout,\n and close button for modal. Layout and visibility depend on `layout` and `source` props.\n */\nexport type HeaderProps = {\n /** An external example must finish loading before sending. */\n executionDisabled?: boolean\n /** Current request path */\n path: string\n /** Current request method */\n method: string\n /** Whether this request comes from an OpenAPI webhook. */\n isWebhook?: boolean\n /** Client layout */\n layout: ClientLayout\n /** Hides the client button on the header */\n hideClientButton?: boolean\n /** Client integration */\n integration?: string | null\n /** Openapi document slug */\n documentSlug: string\n /** Currently selected example key for the current operation */\n exampleKey: string\n /** Openapi document url for `modal` mode to open the client app */\n documentUrl?: string\n /** Client source */\n source?: 'gitbook' | 'api-reference'\n /** Currently selected server */\n server: ServerObject | null\n /** Server list available for operation/document */\n servers: ServerObject[]\n /** List of request history */\n history: History[]\n /** Event bus */\n eventBus: WorkspaceEventBus\n /** Environment list */\n environments?: string[]\n /** Currently selected environment */\n activeEnvironment?: string\n /** Environment variables */\n environment: XScalarEnvironment\n /** Meta information for the server */\n serverMeta: ServerMeta\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { ScalarIconGearSix } from '@scalar/icons'\nimport type {\n ServerMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nimport { AddressBar, type History } from '@/v2/blocks/scalar-address-bar-block'\nimport EnvironmentSelector from '@/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport OpenApiClientButton from './OpenApiClientButton.vue'\n\nconst {\n hideClientButton = false,\n eventBus,\n exampleKey,\n documentSlug,\n} = defineProps<HeaderProps>()\n\nconst emit = defineEmits<{\n /** Execute the current operation example */\n (e: 'execute'): void\n /** Select a request history item by index */\n (e: 'select:history:item', payload: { index: number }): void\n /** Add a new environment */\n (e: 'add:environment'): void\n /** Navigate to the settings page for the current entity */\n (e: 'navigate:settings'): void\n /** Update the full destination URL used to deliver a webhook. */\n (e: 'update:webhook-url', url: string): void\n}>()\n\nconst { translate } = useLocalization()\n\nconst handleSelectEnvironment = (environmentName: string) => {\n eventBus.emit('workspace:update:active-environment', environmentName)\n}\n\nconst handleAddEnvironment = () => {\n eventBus.emit('ui:navigate', { page: 'document', path: 'environment' })\n}\n</script>\n\n<template>\n <!--\n `@container` declares an unnamed container so the AddressBar can\n adapt to the right column's actual width (which shrinks when the\n sidebar opens) instead of the viewport. The query is declared here\n on the parent rather than on the AddressBar itself so the bar's\n `w-full` mobile state cannot feed back into its own breakpoint.\n -->\n <div\n class=\"lg:min-h-header t-app__top-container @container flex w-full flex-wrap items-center justify-center p-2\">\n <!-- Left spacer to center bar -->\n <div class=\"flex flex-1\"></div>\n <AddressBar\n :activeEnvironment\n :documentSlug\n :environment\n :environments\n :eventBus\n :exampleKey\n :executionDisabled\n :history\n :isWebhook\n :layout\n :method\n :path\n :server\n :serverMeta\n :servers\n @add:environment=\"emit('add:environment')\"\n @execute=\"emit('execute')\"\n @select:history:item=\"(payload) => emit('select:history:item', payload)\"\n @update:webhook-url=\"(value) => emit('update:webhook-url', value)\" />\n\n <div class=\"mb-2 flex flex-1 items-center justify-end gap-2 @3xl:mb-0\">\n <!--\n Environment Selector\n Hidden for `modal` layout\n -->\n <EnvironmentSelector\n v-if=\"layout !== 'modal'\"\n :activeEnvironment=\"activeEnvironment\"\n :environments=\"environments\"\n @add:environment=\"handleAddEnvironment\"\n @select:environment=\"handleSelectEnvironment\" />\n <!-- Operation settings -->\n <ScalarIconButton\n v-if=\"layout !== 'modal' && !isWebhook\"\n :icon=\"ScalarIconGearSix\"\n :label=\"translate('apiClient.header.operationSettings')\"\n size=\"sm\"\n weight=\"bold\"\n @click=\"emit('navigate:settings')\" />\n <!--\n Open API Client Button\n\n Only shown in `modal` layout\n -->\n <OpenApiClientButton\n v-if=\"layout === 'modal' && documentUrl && !hideClientButton\"\n buttonSource=\"modal\"\n class=\"!w-fit lg:-mr-1\"\n :integration=\"integration ?? null\"\n :operationMethod=\"method\"\n :operationPath=\"path\"\n :source=\"source ?? 'api-reference'\"\n :url=\"documentUrl\" />\n\n <!--\n Close Button\n\n Only shown in `modal` layout and hidden for GitBook Integration\n -->\n <button\n v-if=\"layout === 'modal' && source !== 'gitbook'\"\n class=\"app-exit-button zoomed:static zoomed:p-1 fixed top-2 right-2 rounded-full p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"lg\"\n thickness=\"2\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n\n <!--\n Close Button for GitBook Integration\n\n Hidden by default and visible for GitBook Integration in `modal` layout\n -->\n <button\n v-if=\"layout === 'modal' && source === 'gitbook'\"\n class=\"text-c-1 hover:bg-b-2 active:text-c-1 -mr-1.5 rounded p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"md\"\n thickness=\"1.75\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n </div>\n </div>\n</template>\n<style scoped>\n.app-exit-button {\n color: white;\n background: rgba(0, 0, 0, 0.1);\n}\n.app-exit-button:hover {\n background: rgba(255, 255, 255, 0.1);\n}\n</style>\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"Header.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/Header.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n Operation block header: address bar, environment selector, and modal controls.\n\n Renders the top bar for the API client operation view: URL/method (AddressBar),\n optional environment selector, optional \"Open API Client\" button in modal layout,\n and close button for modal. Layout and visibility depend on `layout` and `source` props.\n */\nexport type HeaderProps = {\n /** An external example must finish loading before sending. */\n executionDisabled?: boolean\n /** Current request path */\n path: string\n /** Current request method */\n method: HttpMethod\n /** Whether this request comes from an OpenAPI webhook. */\n isWebhook?: boolean\n /** Client layout */\n layout: ClientLayout\n /** Hides the client button on the header */\n hideClientButton?: boolean\n /** Client integration */\n integration?: string | null\n /** Openapi document slug */\n documentSlug: string\n /** Currently selected example key for the current operation */\n exampleKey: string\n /** Openapi document url for `modal` mode to open the client app */\n documentUrl?: string\n /** Client source */\n source?: 'gitbook' | 'api-reference'\n /** Currently selected server */\n server: ServerObject | null\n /** Server list available for operation/document */\n servers: ServerObject[]\n /** List of request history */\n history: History[]\n /** Event bus */\n eventBus: WorkspaceEventBus\n /** Environment list */\n environments?: string[]\n /** Currently selected environment */\n activeEnvironment?: string\n /** Environment variables */\n environment: XScalarEnvironment\n /** Meta information for the server */\n serverMeta: ServerMeta\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { ScalarIconGearSix } from '@scalar/icons'\nimport type {\n ServerMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nimport { AddressBar, type History } from '@/v2/blocks/scalar-address-bar-block'\nimport EnvironmentSelector from '@/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport OpenApiClientButton from './OpenApiClientButton.vue'\n\nconst {\n hideClientButton = false,\n eventBus,\n exampleKey,\n documentSlug,\n} = defineProps<HeaderProps>()\n\nconst emit = defineEmits<{\n /** Execute the current operation example */\n (e: 'execute'): void\n /** Select a request history item by index */\n (e: 'select:history:item', payload: { index: number }): void\n /** Add a new environment */\n (e: 'add:environment'): void\n /** Navigate to the settings page for the current entity */\n (e: 'navigate:settings'): void\n /** Update the full destination URL used to deliver a webhook. */\n (e: 'update:webhook-url', url: string): void\n}>()\n\nconst { translate } = useLocalization()\n\nconst handleSelectEnvironment = (environmentName: string) => {\n eventBus.emit('workspace:update:active-environment', environmentName)\n}\n\nconst handleAddEnvironment = () => {\n eventBus.emit('ui:navigate', { page: 'document', path: 'environment' })\n}\n</script>\n\n<template>\n <!--\n `@container` declares an unnamed container so the AddressBar can\n adapt to the right column's actual width (which shrinks when the\n sidebar opens) instead of the viewport. The query is declared here\n on the parent rather than on the AddressBar itself so the bar's\n `w-full` mobile state cannot feed back into its own breakpoint.\n -->\n <div\n class=\"lg:min-h-header t-app__top-container @container flex w-full flex-wrap items-center justify-center p-2\">\n <!-- Left spacer to center bar -->\n <div class=\"flex flex-1\"></div>\n <AddressBar\n :activeEnvironment\n :documentSlug\n :environment\n :environments\n :eventBus\n :exampleKey\n :executionDisabled\n :history\n :isWebhook\n :layout\n :method\n :path\n :server\n :serverMeta\n :servers\n @add:environment=\"emit('add:environment')\"\n @execute=\"emit('execute')\"\n @select:history:item=\"(payload) => emit('select:history:item', payload)\"\n @update:webhook-url=\"(value) => emit('update:webhook-url', value)\" />\n\n <div class=\"mb-2 flex flex-1 items-center justify-end gap-2 @3xl:mb-0\">\n <!--\n Environment Selector\n Hidden for `modal` layout\n -->\n <EnvironmentSelector\n v-if=\"layout !== 'modal'\"\n :activeEnvironment=\"activeEnvironment\"\n :environments=\"environments\"\n @add:environment=\"handleAddEnvironment\"\n @select:environment=\"handleSelectEnvironment\" />\n <!-- Operation settings -->\n <ScalarIconButton\n v-if=\"layout !== 'modal' && !isWebhook\"\n :icon=\"ScalarIconGearSix\"\n :label=\"translate('apiClient.header.operationSettings')\"\n size=\"sm\"\n weight=\"bold\"\n @click=\"emit('navigate:settings')\" />\n <!--\n Open API Client Button\n\n Only shown in `modal` layout\n -->\n <OpenApiClientButton\n v-if=\"layout === 'modal' && documentUrl && !hideClientButton\"\n buttonSource=\"modal\"\n class=\"!w-fit lg:-mr-1\"\n :integration=\"integration ?? null\"\n :operationMethod=\"method\"\n :operationPath=\"path\"\n :source=\"source ?? 'api-reference'\"\n :url=\"documentUrl\" />\n\n <!--\n Close Button\n\n Only shown in `modal` layout and hidden for GitBook Integration\n -->\n <button\n v-if=\"layout === 'modal' && source !== 'gitbook'\"\n class=\"app-exit-button zoomed:static zoomed:p-1 fixed top-2 right-2 rounded-full p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"lg\"\n thickness=\"2\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n\n <!--\n Close Button for GitBook Integration\n\n Hidden by default and visible for GitBook Integration in `modal` layout\n -->\n <button\n v-if=\"layout === 'modal' && source === 'gitbook'\"\n class=\"text-c-1 hover:bg-b-2 active:text-c-1 -mr-1.5 rounded p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"md\"\n thickness=\"1.75\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n </div>\n </div>\n</template>\n<style scoped>\n.app-exit-button {\n color: white;\n background: rgba(0, 0, 0, 0.1);\n}\n.app-exit-button:hover {\n background: rgba(255, 255, 255, 0.1);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4EA,MAAM,OAAO;EAab,MAAM,EAAE,cAAc,gBAAgB;EAEtC,MAAM,2BAA2B,oBAA4B;GAC3D,QAAA,SAAS,KAAK,uCAAuC,eAAe;EACtE;EAEA,MAAM,6BAA6B;GACjC,QAAA,SAAS,KAAK,eAAe;IAAE,MAAM;IAAY,MAAM;GAAc,CAAC;EACxE;;uBAWE,mBAiGM,OAjGN,YAiGM;8BA9FJ,mBAA+B,OAAA,EAA1B,OAAM,cAAa,GAAA,MAAA,EAAA;IACxB,YAmBuE,MAAA,kBAAA,GAAA;KAlBpE,mBAAA,QAAA;KACA,cAAA,QAAA;KACA,aAAA,QAAA;KACA,cAAA,QAAA;KACA,UAAA,QAAA;KACA,YAAA,QAAA;KACA,mBAAA,QAAA;KACA,SAAA,QAAA;KACA,WAAA,QAAA;KACA,QAAA,QAAA;KACA,QAAA,QAAA;KACA,MAAA,QAAA;KACA,QAAA,QAAA;KACA,YAAA,QAAA;KACA,SAAA,QAAA;KACA,qBAAe,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,iBAAA;KACrB,WAAO,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;KACb,yBAAmB,OAAA,OAAA,OAAA,MAAG,YAAY,KAAI,uBAAwB,OAAO;KACrE,uBAAkB,OAAA,OAAA,OAAA,MAAG,UAAU,KAAI,sBAAuB,KAAK;;;;;;;;;;;;;;;;;;IAElE,mBAuEM,OAvEN,YAuEM;KAjEI,QAAA,WAAM,WAAA,UAAA,GADd,YAKkD,6BAAA;;MAH/C,mBAAmB,QAAA;MACnB,cAAc,QAAA;MACd,qBAAiB;MACjB,wBAAoB;;KAGf,QAAA,WAAM,WAAA,CAAiB,QAAA,aAAA,UAAA,GAD/B,YAMuC,MAAA,gBAAA,GAAA;;MAJpC,MAAM,MAAA,iBAAA;MACN,OAAO,MAAA,SAAA,CAAS,CAAA,oCAAA;MACjB,MAAK;MACL,QAAO;MACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,mBAAA;;KAON,QAAA,WAAM,WAAgB,QAAA,eAAW,CAAK,QAAA,oBAAA,UAAA,GAD9C,YAQuB,6BAAA;;MANrB,cAAa;MACb,OAAM;MACL,aAAa,QAAA,eAAW;MACxB,iBAAiB,QAAA;MACjB,eAAe,QAAA;MACf,QAAQ,QAAA,UAAM;MACd,KAAK,QAAA;;;;;;;;KAQA,QAAA,WAAM,WAAgB,QAAA,WAAM,aAAA,UAAA,GADpC,mBAYS,UAAA;;MAVP,OAAM;MACN,MAAK;MACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,SAAS,KAAI,uBAAA;SACrB,YAGkB,MAAA,UAAA,GAAA;MAFhB,MAAK;MACL,MAAK;MACL,WAAU;SACZ,mBAES,QAFT,YAES,gBADP,MAAA,SAAA,CAAS,CAAA,8BAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAUL,QAAA,WAAM,WAAgB,QAAA,WAAM,aAAA,UAAA,GADpC,mBAYS,UAAA;;MAVP,OAAM;MACN,MAAK;MACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,SAAS,KAAI,uBAAA;SACrB,YAGqB,MAAA,UAAA,GAAA;MAFnB,MAAK;MACL,MAAK;MACL,WAAU;SACZ,mBAES,QAFT,YAES,gBADP,MAAA,SAAA,CAAS,CAAA,8BAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA"}
1
+ {"version":3,"file":"Header.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/Header.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n Operation block header: address bar, environment selector, and modal controls.\n\n Renders the top bar for the API client operation view: URL/method (AddressBar),\n optional environment selector, optional \"Open API Client\" button in modal layout,\n and close button for modal. Layout and visibility depend on `layout` and `source` props.\n */\nexport type HeaderProps = {\n /** An external example must finish loading before sending. */\n executionDisabled?: boolean\n /** Current request path */\n path: string\n /** Current request method */\n method: string\n /** Whether this request comes from an OpenAPI webhook. */\n isWebhook?: boolean\n /** Client layout */\n layout: ClientLayout\n /** Hides the client button on the header */\n hideClientButton?: boolean\n /** Client integration */\n integration?: string | null\n /** Openapi document slug */\n documentSlug: string\n /** Currently selected example key for the current operation */\n exampleKey: string\n /** Openapi document url for `modal` mode to open the client app */\n documentUrl?: string\n /** Client source */\n source?: 'gitbook' | 'api-reference'\n /** Currently selected server */\n server: ServerObject | null\n /** Server list available for operation/document */\n servers: ServerObject[]\n /** List of request history */\n history: History[]\n /** Event bus */\n eventBus: WorkspaceEventBus\n /** Environment list */\n environments?: string[]\n /** Currently selected environment */\n activeEnvironment?: string\n /** Environment variables */\n environment: XScalarEnvironment\n /** Meta information for the server */\n serverMeta: ServerMeta\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarIconButton } from '@scalar/components/icon-button'\nimport { ScalarIconGearSix } from '@scalar/icons'\nimport type {\n ServerMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nimport { AddressBar, type History } from '@/v2/blocks/scalar-address-bar-block'\nimport EnvironmentSelector from '@/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\nimport OpenApiClientButton from './OpenApiClientButton.vue'\n\nconst {\n hideClientButton = false,\n eventBus,\n exampleKey,\n documentSlug,\n} = defineProps<HeaderProps>()\n\nconst emit = defineEmits<{\n /** Execute the current operation example */\n (e: 'execute'): void\n /** Select a request history item by index */\n (e: 'select:history:item', payload: { index: number }): void\n /** Add a new environment */\n (e: 'add:environment'): void\n /** Navigate to the settings page for the current entity */\n (e: 'navigate:settings'): void\n /** Update the full destination URL used to deliver a webhook. */\n (e: 'update:webhook-url', url: string): void\n}>()\n\nconst { translate } = useLocalization()\n\nconst handleSelectEnvironment = (environmentName: string) => {\n eventBus.emit('workspace:update:active-environment', environmentName)\n}\n\nconst handleAddEnvironment = () => {\n eventBus.emit('ui:navigate', { page: 'document', path: 'environment' })\n}\n</script>\n\n<template>\n <!--\n `@container` declares an unnamed container so the AddressBar can\n adapt to the right column's actual width (which shrinks when the\n sidebar opens) instead of the viewport. The query is declared here\n on the parent rather than on the AddressBar itself so the bar's\n `w-full` mobile state cannot feed back into its own breakpoint.\n -->\n <div\n class=\"lg:min-h-header t-app__top-container @container flex w-full flex-wrap items-center justify-center p-2\">\n <!-- Left spacer to center bar -->\n <div class=\"flex flex-1\"></div>\n <AddressBar\n :activeEnvironment\n :documentSlug\n :environment\n :environments\n :eventBus\n :exampleKey\n :executionDisabled\n :history\n :isWebhook\n :layout\n :method\n :path\n :server\n :serverMeta\n :servers\n @add:environment=\"emit('add:environment')\"\n @execute=\"emit('execute')\"\n @select:history:item=\"(payload) => emit('select:history:item', payload)\"\n @update:webhook-url=\"(value) => emit('update:webhook-url', value)\" />\n\n <div class=\"mb-2 flex flex-1 items-center justify-end gap-2 @3xl:mb-0\">\n <!--\n Environment Selector\n Hidden for `modal` layout\n -->\n <EnvironmentSelector\n v-if=\"layout !== 'modal'\"\n :activeEnvironment=\"activeEnvironment\"\n :environments=\"environments\"\n @add:environment=\"handleAddEnvironment\"\n @select:environment=\"handleSelectEnvironment\" />\n <!-- Operation settings -->\n <ScalarIconButton\n v-if=\"layout !== 'modal' && !isWebhook\"\n :icon=\"ScalarIconGearSix\"\n :label=\"translate('apiClient.header.operationSettings')\"\n size=\"sm\"\n weight=\"bold\"\n @click=\"emit('navigate:settings')\" />\n <!--\n Open API Client Button\n\n Only shown in `modal` layout\n -->\n <OpenApiClientButton\n v-if=\"layout === 'modal' && documentUrl && !hideClientButton\"\n buttonSource=\"modal\"\n class=\"!w-fit lg:-mr-1\"\n :integration=\"integration ?? null\"\n :operationMethod=\"method\"\n :operationPath=\"path\"\n :source=\"source ?? 'api-reference'\"\n :url=\"documentUrl\" />\n\n <!--\n Close Button\n\n Only shown in `modal` layout and hidden for GitBook Integration\n -->\n <button\n v-if=\"layout === 'modal' && source !== 'gitbook'\"\n class=\"app-exit-button zoomed:static zoomed:p-1 fixed top-2 right-2 rounded-full p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"lg\"\n thickness=\"2\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n\n <!--\n Close Button for GitBook Integration\n\n Hidden by default and visible for GitBook Integration in `modal` layout\n -->\n <button\n v-if=\"layout === 'modal' && source === 'gitbook'\"\n class=\"text-c-1 hover:bg-b-2 active:text-c-1 -mr-1.5 rounded p-2\"\n type=\"button\"\n @click=\"eventBus.emit('ui:close:client-modal')\">\n <ScalarIcon\n icon=\"Close\"\n size=\"md\"\n thickness=\"1.75\" />\n <span class=\"sr-only\">{{\n translate('apiClient.header.closeClient')\n }}</span>\n </button>\n </div>\n </div>\n</template>\n<style scoped>\n.app-exit-button {\n color: white;\n background: rgba(0, 0, 0, 0.1);\n}\n.app-exit-button:hover {\n background: rgba(255, 255, 255, 0.1);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2EA,MAAM,OAAO;EAab,MAAM,EAAE,cAAc,gBAAgB;EAEtC,MAAM,2BAA2B,oBAA4B;GAC3D,QAAA,SAAS,KAAK,uCAAuC,eAAe;EACtE;EAEA,MAAM,6BAA6B;GACjC,QAAA,SAAS,KAAK,eAAe;IAAE,MAAM;IAAY,MAAM;GAAc,CAAC;EACxE;;uBAWE,mBAiGM,OAjGN,YAiGM;8BA9FJ,mBAA+B,OAAA,EAA1B,OAAM,cAAa,GAAA,MAAA,EAAA;IACxB,YAmBuE,MAAA,kBAAA,GAAA;KAlBpE,mBAAA,QAAA;KACA,cAAA,QAAA;KACA,aAAA,QAAA;KACA,cAAA,QAAA;KACA,UAAA,QAAA;KACA,YAAA,QAAA;KACA,mBAAA,QAAA;KACA,SAAA,QAAA;KACA,WAAA,QAAA;KACA,QAAA,QAAA;KACA,QAAA,QAAA;KACA,MAAA,QAAA;KACA,QAAA,QAAA;KACA,YAAA,QAAA;KACA,SAAA,QAAA;KACA,qBAAe,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,iBAAA;KACrB,WAAO,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA;KACb,yBAAmB,OAAA,OAAA,OAAA,MAAG,YAAY,KAAI,uBAAwB,OAAO;KACrE,uBAAkB,OAAA,OAAA,OAAA,MAAG,UAAU,KAAI,sBAAuB,KAAK;;;;;;;;;;;;;;;;;;IAElE,mBAuEM,OAvEN,YAuEM;KAjEI,QAAA,WAAM,WAAA,UAAA,GADd,YAKkD,6BAAA;;MAH/C,mBAAmB,QAAA;MACnB,cAAc,QAAA;MACd,qBAAiB;MACjB,wBAAoB;;KAGf,QAAA,WAAM,WAAA,CAAiB,QAAA,aAAA,UAAA,GAD/B,YAMuC,MAAA,gBAAA,GAAA;;MAJpC,MAAM,MAAA,iBAAA;MACN,OAAO,MAAA,SAAA,CAAS,CAAA,oCAAA;MACjB,MAAK;MACL,QAAO;MACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,mBAAA;;KAON,QAAA,WAAM,WAAgB,QAAA,eAAW,CAAK,QAAA,oBAAA,UAAA,GAD9C,YAQuB,6BAAA;;MANrB,cAAa;MACb,OAAM;MACL,aAAa,QAAA,eAAW;MACxB,iBAAiB,QAAA;MACjB,eAAe,QAAA;MACf,QAAQ,QAAA,UAAM;MACd,KAAK,QAAA;;;;;;;;KAQA,QAAA,WAAM,WAAgB,QAAA,WAAM,aAAA,UAAA,GADpC,mBAYS,UAAA;;MAVP,OAAM;MACN,MAAK;MACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,SAAS,KAAI,uBAAA;SACrB,YAGkB,MAAA,UAAA,GAAA;MAFhB,MAAK;MACL,MAAK;MACL,WAAU;SACZ,mBAES,QAFT,YAES,gBADP,MAAA,SAAA,CAAS,CAAA,8BAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAUL,QAAA,WAAM,WAAgB,QAAA,WAAM,aAAA,UAAA,GADpC,mBAYS,UAAA;;MAVP,OAAM;MACN,MAAK;MACJ,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,SAAS,KAAI,uBAAA;SACrB,YAGqB,MAAA,UAAA,GAAA;MAFnB,MAAK;MACL,MAAK;MACL,WAAU;SACZ,mBAES,QAFT,YAES,gBADP,MAAA,SAAA,CAAS,CAAA,8BAAA,CAAA,GAAA,CAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"OpenApiClientButton.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/components/OpenApiClientButton.vue"],"names":[],"mappings":"AA6IA,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,SAAS,GAAG,OAAO,CAAA;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAA;IACpC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAC;AA4HF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"OpenApiClientButton.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/components/OpenApiClientButton.vue"],"names":[],"mappings":"AAqJA,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,SAAS,GAAG,OAAO,CAAA;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,SAAS,CAAA;IACpC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAC;AAkIF,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 OpenApiClientButton_vue_vue_type_script_setup_true_lang_default from "./OpenApiClientButton.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/v2/blocks/operation-block/components/OpenApiClientButton.vue
5
- var OpenApiClientButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(OpenApiClientButton_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-8cc9a5bf"]]);
5
+ var OpenApiClientButton_default = /*#__PURE__*/ _plugin_vue_export_helper_default(OpenApiClientButton_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-746e7aef"]]);
6
6
  //#endregion
7
7
  export { OpenApiClientButton_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"OpenApiClientButton.vue.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/OpenApiClientButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { ScalarIconArrowUpRight } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { useLocalization } from '@/v2/features/localization'\n\nconst {\n integration,\n isDevelopment,\n url,\n operationPath,\n operationMethod,\n buttonSource,\n source = 'api-reference',\n} = defineProps<{\n buttonSource: 'sidebar' | 'modal'\n source?: 'api-reference' | 'gitbook'\n isDevelopment?: boolean\n integration?: string | null\n url?: string\n /** Operation path to open in the client after import */\n operationPath?: string\n /** HTTP method for the operation to open in the client after import */\n operationMethod?: string\n}>()\n\nconst { translate } = useLocalization()\n\n/** Link to import an OpenAPI document */\nconst href = computed((): string | undefined => {\n /**\n * The URL we want to pass to client.scalar.com for the import.\n * Might be an OpenAPI document URL, but could also just be the URL of the API reference.\n */\n const urlToImportFrom =\n url ?? (typeof window !== 'undefined' ? window.location.href : undefined)\n\n if (!urlToImportFrom) {\n return undefined\n }\n\n const absoluteUrl = makeUrlAbsolute(urlToImportFrom)\n\n if (!absoluteUrl?.length) {\n return undefined\n }\n\n // Base URL\n const link = new URL(\n isDevelopment ? 'http://localhost:5065' : 'https://client.scalar.com',\n )\n\n // URL that we'd like to import\n link.searchParams.set('url', absoluteUrl)\n\n if (operationPath?.length && operationMethod?.length) {\n link.searchParams.set('operation_path', operationPath)\n link.searchParams.set('operation_method', operationMethod.toLowerCase())\n }\n\n // Integration identifier\n if (integration !== null) {\n link.searchParams.set('integration', integration ?? 'vue')\n }\n\n // UTM Source\n link.searchParams.set('utm_source', 'api-reference')\n link.searchParams.set('utm_medium', 'button')\n link.searchParams.set('utm_campaign', buttonSource)\n\n // Special for gitbook, set the source and grab the logos (hacky)\n if (source === 'gitbook') {\n link.searchParams.set('utm_source', 'gitbook')\n\n const darkLogo = document.querySelector(\"img.dark\\\\:block[alt='Logo']\")\n const lightLogo = document.querySelector(\"img.dark\\\\:hidden[alt='Logo']\")\n\n if (darkLogo && darkLogo instanceof HTMLImageElement) {\n link.searchParams.set('dark_logo', encodeURIComponent(darkLogo.src))\n }\n if (lightLogo && lightLogo instanceof HTMLImageElement) {\n link.searchParams.set('light_logo', encodeURIComponent(lightLogo.src))\n }\n }\n\n return link.toString()\n})\n</script>\n\n<template>\n <a\n v-if=\"href\"\n class=\"open-api-client-button\"\n :href=\"href\"\n target=\"_blank\">\n <ScalarIconArrowUpRight\n class=\"size-3\"\n weight=\"regular\" />{{\n translate('apiClient.openApiClientButton.openAPIClient')\n }}</a\n >\n</template>\n\n<style scoped>\n.open-api-client-button {\n cursor: pointer;\n width: 100%;\n padding: 9px 12px;\n height: 31px;\n display: block;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n font-size: var(--scalar-small);\n line-height: 1.385;\n text-decoration: none;\n border-radius: var(--scalar-radius);\n box-shadow: 0 0 0 0.5px var(--scalar-border-color);\n gap: 6px;\n color: var(--scalar-sidebar-color-1);\n}\n\n.open-api-client-button:hover {\n background: var(\n --scalar-sidebar-item-hover-background,\n var(--scalar-background-2)\n );\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"OpenApiClientButton.vue.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/OpenApiClientButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { ScalarIconArrowUpRight } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { useLocalization } from '@/v2/features/localization'\n\nconst {\n integration,\n isDevelopment,\n url,\n operationPath,\n operationMethod,\n buttonSource,\n source = 'api-reference',\n} = defineProps<{\n buttonSource: 'sidebar' | 'modal'\n source?: 'api-reference' | 'gitbook'\n isDevelopment?: boolean\n integration?: string | null\n url?: string\n /** Operation path to open in the client after import */\n operationPath?: string\n /** HTTP method for the operation to open in the client after import */\n operationMethod?: string\n}>()\n\nconst { translate } = useLocalization()\n\n/** Link to import an OpenAPI document */\nconst href = computed((): string | undefined => {\n /**\n * The URL we want to pass to client.scalar.com for the import.\n * Might be an OpenAPI document URL, but could also just be the URL of the API reference.\n */\n const urlToImportFrom =\n url ?? (typeof window !== 'undefined' ? window.location.href : undefined)\n\n if (!urlToImportFrom) {\n return undefined\n }\n\n const absoluteUrl = makeUrlAbsolute(urlToImportFrom)\n\n if (!absoluteUrl?.length) {\n return undefined\n }\n\n // Base URL\n const link = new URL(\n isDevelopment ? 'http://localhost:5065' : 'https://client.scalar.com',\n )\n\n // URL that we'd like to import\n link.searchParams.set('url', absoluteUrl)\n\n if (operationPath?.length && operationMethod?.length) {\n link.searchParams.set('operation_path', operationPath)\n link.searchParams.set(\n 'operation_method',\n operationMethod === operationMethod.toUpperCase() &&\n isHttpMethod(operationMethod)\n ? operationMethod.toLowerCase()\n : operationMethod,\n )\n }\n\n // Integration identifier\n if (integration !== null) {\n link.searchParams.set('integration', integration ?? 'vue')\n }\n\n // UTM Source\n link.searchParams.set('utm_source', 'api-reference')\n link.searchParams.set('utm_medium', 'button')\n link.searchParams.set('utm_campaign', buttonSource)\n\n // Special for gitbook, set the source and grab the logos (hacky)\n if (source === 'gitbook') {\n link.searchParams.set('utm_source', 'gitbook')\n\n const darkLogo = document.querySelector(\"img.dark\\\\:block[alt='Logo']\")\n const lightLogo = document.querySelector(\"img.dark\\\\:hidden[alt='Logo']\")\n\n if (darkLogo && darkLogo instanceof HTMLImageElement) {\n link.searchParams.set('dark_logo', encodeURIComponent(darkLogo.src))\n }\n if (lightLogo && lightLogo instanceof HTMLImageElement) {\n link.searchParams.set('light_logo', encodeURIComponent(lightLogo.src))\n }\n }\n\n return link.toString()\n})\n</script>\n\n<template>\n <a\n v-if=\"href\"\n class=\"open-api-client-button\"\n :href=\"href\"\n target=\"_blank\">\n <ScalarIconArrowUpRight\n class=\"size-3\"\n weight=\"regular\" />{{\n translate('apiClient.openApiClientButton.openAPIClient')\n }}</a\n >\n</template>\n\n<style scoped>\n.open-api-client-button {\n cursor: pointer;\n width: 100%;\n padding: 9px 12px;\n height: 31px;\n display: block;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n font-size: var(--scalar-small);\n line-height: 1.385;\n text-decoration: none;\n border-radius: var(--scalar-radius);\n box-shadow: 0 0 0 0.5px var(--scalar-border-color);\n gap: 6px;\n color: var(--scalar-sidebar-color-1);\n}\n\n.open-api-client-button:hover {\n background: var(\n --scalar-sidebar-item-hover-background,\n var(--scalar-background-2)\n );\n}\n</style>\n"],"mappings":""}
@@ -1,6 +1,7 @@
1
1
  import { useLocalization } from "../../../features/localization/index.js";
2
2
  import { computed, createCommentVNode, createElementBlock, createTextVNode, createVNode, defineComponent, openBlock, toDisplayString, unref } from "vue";
3
3
  import { ScalarIconArrowUpRight } from "@scalar/icons";
4
+ import { isHttpMethod } from "@scalar/helpers/http/is-http-method";
4
5
  import { makeUrlAbsolute } from "@scalar/helpers/url/make-url-absolute";
5
6
  //#region src/v2/blocks/operation-block/components/OpenApiClientButton.vue?vue&type=script&setup=true&lang.ts
6
7
  var _hoisted_1 = ["href"];
@@ -31,7 +32,7 @@ var OpenApiClientButton_vue_vue_type_script_setup_true_lang_default = /*@__PURE_
31
32
  link.searchParams.set("url", absoluteUrl);
32
33
  if (__props.operationPath?.length && __props.operationMethod?.length) {
33
34
  link.searchParams.set("operation_path", __props.operationPath);
34
- link.searchParams.set("operation_method", __props.operationMethod.toLowerCase());
35
+ link.searchParams.set("operation_method", __props.operationMethod === __props.operationMethod.toUpperCase() && isHttpMethod(__props.operationMethod) ? __props.operationMethod.toLowerCase() : __props.operationMethod);
35
36
  }
36
37
  if (__props.integration !== null) link.searchParams.set("integration", __props.integration ?? "vue");
37
38
  link.searchParams.set("utm_source", "api-reference");
@@ -1 +1 @@
1
- {"version":3,"file":"OpenApiClientButton.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/OpenApiClientButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { ScalarIconArrowUpRight } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { useLocalization } from '@/v2/features/localization'\n\nconst {\n integration,\n isDevelopment,\n url,\n operationPath,\n operationMethod,\n buttonSource,\n source = 'api-reference',\n} = defineProps<{\n buttonSource: 'sidebar' | 'modal'\n source?: 'api-reference' | 'gitbook'\n isDevelopment?: boolean\n integration?: string | null\n url?: string\n /** Operation path to open in the client after import */\n operationPath?: string\n /** HTTP method for the operation to open in the client after import */\n operationMethod?: string\n}>()\n\nconst { translate } = useLocalization()\n\n/** Link to import an OpenAPI document */\nconst href = computed((): string | undefined => {\n /**\n * The URL we want to pass to client.scalar.com for the import.\n * Might be an OpenAPI document URL, but could also just be the URL of the API reference.\n */\n const urlToImportFrom =\n url ?? (typeof window !== 'undefined' ? window.location.href : undefined)\n\n if (!urlToImportFrom) {\n return undefined\n }\n\n const absoluteUrl = makeUrlAbsolute(urlToImportFrom)\n\n if (!absoluteUrl?.length) {\n return undefined\n }\n\n // Base URL\n const link = new URL(\n isDevelopment ? 'http://localhost:5065' : 'https://client.scalar.com',\n )\n\n // URL that we'd like to import\n link.searchParams.set('url', absoluteUrl)\n\n if (operationPath?.length && operationMethod?.length) {\n link.searchParams.set('operation_path', operationPath)\n link.searchParams.set('operation_method', operationMethod.toLowerCase())\n }\n\n // Integration identifier\n if (integration !== null) {\n link.searchParams.set('integration', integration ?? 'vue')\n }\n\n // UTM Source\n link.searchParams.set('utm_source', 'api-reference')\n link.searchParams.set('utm_medium', 'button')\n link.searchParams.set('utm_campaign', buttonSource)\n\n // Special for gitbook, set the source and grab the logos (hacky)\n if (source === 'gitbook') {\n link.searchParams.set('utm_source', 'gitbook')\n\n const darkLogo = document.querySelector(\"img.dark\\\\:block[alt='Logo']\")\n const lightLogo = document.querySelector(\"img.dark\\\\:hidden[alt='Logo']\")\n\n if (darkLogo && darkLogo instanceof HTMLImageElement) {\n link.searchParams.set('dark_logo', encodeURIComponent(darkLogo.src))\n }\n if (lightLogo && lightLogo instanceof HTMLImageElement) {\n link.searchParams.set('light_logo', encodeURIComponent(lightLogo.src))\n }\n }\n\n return link.toString()\n})\n</script>\n\n<template>\n <a\n v-if=\"href\"\n class=\"open-api-client-button\"\n :href=\"href\"\n target=\"_blank\">\n <ScalarIconArrowUpRight\n class=\"size-3\"\n weight=\"regular\" />{{\n translate('apiClient.openApiClientButton.openAPIClient')\n }}</a\n >\n</template>\n\n<style scoped>\n.open-api-client-button {\n cursor: pointer;\n width: 100%;\n padding: 9px 12px;\n height: 31px;\n display: block;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n font-size: var(--scalar-small);\n line-height: 1.385;\n text-decoration: none;\n border-radius: var(--scalar-radius);\n box-shadow: 0 0 0 0.5px var(--scalar-border-color);\n gap: 6px;\n color: var(--scalar-sidebar-color-1);\n}\n\n.open-api-client-button:hover {\n background: var(\n --scalar-sidebar-item-hover-background,\n var(--scalar-background-2)\n );\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;EA2BA,MAAM,EAAE,cAAc,gBAAgB;;EAGtC,MAAM,OAAO,eAAmC;;;;;GAK9C,MAAM,kBACJ,QAAA,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO,KAAA;GAEjE,IAAI,CAAC,iBACH;GAGF,MAAM,cAAc,gBAAgB,eAAe;GAEnD,IAAI,CAAC,aAAa,QAChB;GAIF,MAAM,OAAO,IAAI,IACf,QAAA,gBAAgB,0BAA0B,2BAC5C;GAGA,KAAK,aAAa,IAAI,OAAO,WAAW;GAExC,IAAI,QAAA,eAAe,UAAU,QAAA,iBAAiB,QAAQ;IACpD,KAAK,aAAa,IAAI,kBAAkB,QAAA,aAAa;IACrD,KAAK,aAAa,IAAI,oBAAoB,QAAA,gBAAgB,YAAY,CAAC;GACzE;GAGA,IAAI,QAAA,gBAAgB,MAClB,KAAK,aAAa,IAAI,eAAe,QAAA,eAAe,KAAK;GAI3D,KAAK,aAAa,IAAI,cAAc,eAAe;GACnD,KAAK,aAAa,IAAI,cAAc,QAAQ;GAC5C,KAAK,aAAa,IAAI,gBAAgB,QAAA,YAAY;GAGlD,IAAI,QAAA,WAAW,WAAW;IACxB,KAAK,aAAa,IAAI,cAAc,SAAS;IAE7C,MAAM,WAAW,SAAS,cAAc,8BAA8B;IACtE,MAAM,YAAY,SAAS,cAAc,+BAA+B;IAExE,IAAI,YAAY,oBAAoB,kBAClC,KAAK,aAAa,IAAI,aAAa,mBAAmB,SAAS,GAAG,CAAC;IAErE,IAAI,aAAa,qBAAqB,kBACpC,KAAK,aAAa,IAAI,cAAc,mBAAmB,UAAU,GAAG,CAAC;GAEzE;GAEA,OAAO,KAAK,SAAS;EACvB,CAAC;;UAKS,KAAA,SAAA,UAAA,GADR,mBAUC,KAAA;;IARC,OAAM;IACL,MAAM,KAAA;IACP,QAAO;OACP,YAEqB,MAAA,sBAAA,GAAA;IADnB,OAAM;IACN,QAAO;uCACP,MAAA,SAAA,CAAS,CAAA,6CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAA,UAAA,KAAA,mBAAA,IAAA,IAAA"}
1
+ {"version":3,"file":"OpenApiClientButton.vue.script.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/components/OpenApiClientButton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { makeUrlAbsolute } from '@scalar/helpers/url/make-url-absolute'\nimport { ScalarIconArrowUpRight } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport { useLocalization } from '@/v2/features/localization'\n\nconst {\n integration,\n isDevelopment,\n url,\n operationPath,\n operationMethod,\n buttonSource,\n source = 'api-reference',\n} = defineProps<{\n buttonSource: 'sidebar' | 'modal'\n source?: 'api-reference' | 'gitbook'\n isDevelopment?: boolean\n integration?: string | null\n url?: string\n /** Operation path to open in the client after import */\n operationPath?: string\n /** HTTP method for the operation to open in the client after import */\n operationMethod?: string\n}>()\n\nconst { translate } = useLocalization()\n\n/** Link to import an OpenAPI document */\nconst href = computed((): string | undefined => {\n /**\n * The URL we want to pass to client.scalar.com for the import.\n * Might be an OpenAPI document URL, but could also just be the URL of the API reference.\n */\n const urlToImportFrom =\n url ?? (typeof window !== 'undefined' ? window.location.href : undefined)\n\n if (!urlToImportFrom) {\n return undefined\n }\n\n const absoluteUrl = makeUrlAbsolute(urlToImportFrom)\n\n if (!absoluteUrl?.length) {\n return undefined\n }\n\n // Base URL\n const link = new URL(\n isDevelopment ? 'http://localhost:5065' : 'https://client.scalar.com',\n )\n\n // URL that we'd like to import\n link.searchParams.set('url', absoluteUrl)\n\n if (operationPath?.length && operationMethod?.length) {\n link.searchParams.set('operation_path', operationPath)\n link.searchParams.set(\n 'operation_method',\n operationMethod === operationMethod.toUpperCase() &&\n isHttpMethod(operationMethod)\n ? operationMethod.toLowerCase()\n : operationMethod,\n )\n }\n\n // Integration identifier\n if (integration !== null) {\n link.searchParams.set('integration', integration ?? 'vue')\n }\n\n // UTM Source\n link.searchParams.set('utm_source', 'api-reference')\n link.searchParams.set('utm_medium', 'button')\n link.searchParams.set('utm_campaign', buttonSource)\n\n // Special for gitbook, set the source and grab the logos (hacky)\n if (source === 'gitbook') {\n link.searchParams.set('utm_source', 'gitbook')\n\n const darkLogo = document.querySelector(\"img.dark\\\\:block[alt='Logo']\")\n const lightLogo = document.querySelector(\"img.dark\\\\:hidden[alt='Logo']\")\n\n if (darkLogo && darkLogo instanceof HTMLImageElement) {\n link.searchParams.set('dark_logo', encodeURIComponent(darkLogo.src))\n }\n if (lightLogo && lightLogo instanceof HTMLImageElement) {\n link.searchParams.set('light_logo', encodeURIComponent(lightLogo.src))\n }\n }\n\n return link.toString()\n})\n</script>\n\n<template>\n <a\n v-if=\"href\"\n class=\"open-api-client-button\"\n :href=\"href\"\n target=\"_blank\">\n <ScalarIconArrowUpRight\n class=\"size-3\"\n weight=\"regular\" />{{\n translate('apiClient.openApiClientButton.openAPIClient')\n }}</a\n >\n</template>\n\n<style scoped>\n.open-api-client-button {\n cursor: pointer;\n width: 100%;\n padding: 9px 12px;\n height: 31px;\n display: block;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n font-size: var(--scalar-small);\n line-height: 1.385;\n text-decoration: none;\n border-radius: var(--scalar-radius);\n box-shadow: 0 0 0 0.5px var(--scalar-border-color);\n gap: 6px;\n color: var(--scalar-sidebar-color-1);\n}\n\n.open-api-client-button:hover {\n background: var(\n --scalar-sidebar-item-hover-background,\n var(--scalar-background-2)\n );\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA4BA,MAAM,EAAE,cAAc,gBAAgB;;EAGtC,MAAM,OAAO,eAAmC;;;;;GAK9C,MAAM,kBACJ,QAAA,QAAQ,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO,KAAA;GAEjE,IAAI,CAAC,iBACH;GAGF,MAAM,cAAc,gBAAgB,eAAe;GAEnD,IAAI,CAAC,aAAa,QAChB;GAIF,MAAM,OAAO,IAAI,IACf,QAAA,gBAAgB,0BAA0B,2BAC5C;GAGA,KAAK,aAAa,IAAI,OAAO,WAAW;GAExC,IAAI,QAAA,eAAe,UAAU,QAAA,iBAAiB,QAAQ;IACpD,KAAK,aAAa,IAAI,kBAAkB,QAAA,aAAa;IACrD,KAAK,aAAa,IAChB,oBACA,QAAA,oBAAoB,QAAA,gBAAgB,YAAY,KAC9C,aAAa,QAAA,eAAe,IAC1B,QAAA,gBAAgB,YAAY,IAC5B,QAAA,eACN;GACF;GAGA,IAAI,QAAA,gBAAgB,MAClB,KAAK,aAAa,IAAI,eAAe,QAAA,eAAe,KAAK;GAI3D,KAAK,aAAa,IAAI,cAAc,eAAe;GACnD,KAAK,aAAa,IAAI,cAAc,QAAQ;GAC5C,KAAK,aAAa,IAAI,gBAAgB,QAAA,YAAY;GAGlD,IAAI,QAAA,WAAW,WAAW;IACxB,KAAK,aAAa,IAAI,cAAc,SAAS;IAE7C,MAAM,WAAW,SAAS,cAAc,8BAA8B;IACtE,MAAM,YAAY,SAAS,cAAc,+BAA+B;IAExE,IAAI,YAAY,oBAAoB,kBAClC,KAAK,aAAa,IAAI,aAAa,mBAAmB,SAAS,GAAG,CAAC;IAErE,IAAI,aAAa,qBAAqB,kBACpC,KAAK,aAAa,IAAI,cAAc,mBAAmB,UAAU,GAAG,CAAC;GAEzE;GAEA,OAAO,KAAK,SAAS;EACvB,CAAC;;UAKS,KAAA,SAAA,UAAA,GADR,mBAUC,KAAA;;IARC,OAAM;IACL,MAAM,KAAA;IACP,QAAO;OACP,YAEqB,MAAA,sBAAA,GAAA;IADnB,OAAM;IACN,QAAO;uCACP,MAAA,SAAA,CAAS,CAAA,6CAAA,CAAA,GAAA,CAAA,CAAA,GAAA,GAAA,UAAA,KAAA,mBAAA,IAAA,IAAA"}
@@ -1,4 +1,3 @@
1
- import type { HttpMethod } from '@scalar/helpers/http/http-methods';
2
1
  import type { HarResponse } from '@scalar/snippetz';
3
2
  import type { ResponseInstance } from '../../../../v2/blocks/operation-block/helpers/send-request.js';
4
3
  type HarToFetchResponseProps = {
@@ -7,7 +6,7 @@ type HarToFetchResponseProps = {
7
6
  /** Optional URL to set on the Response object */
8
7
  url?: string;
9
8
  /** The HTTP method used for the request */
10
- method: HttpMethod;
9
+ method: string;
11
10
  /** The request path */
12
11
  path: string;
13
12
  /** Time in ms the request took */
@@ -1 +1 @@
1
- {"version":3,"file":"har-to-fetch-response.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/har-to-fetch-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAA;AAExF,KAAK,uBAAuB,GAAG;IAC7B,yCAAyC;IACzC,WAAW,EAAE,WAAW,CAAA;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,MAAM,EAAE,UAAU,CAAA;IAClB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,kBAAkB,GAAI,+CAMhC,uBAAuB,KAAG,gBAwB5B,CAAA"}
1
+ {"version":3,"file":"har-to-fetch-response.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/har-to-fetch-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAA;AAExF,KAAK,uBAAuB,GAAG;IAC7B,yCAAyC;IACzC,WAAW,EAAE,WAAW,CAAA;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,eAAO,MAAM,kBAAkB,GAAI,+CAMhC,uBAAuB,KAAG,gBAwB5B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"har-to-fetch-response.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/har-to-fetch-response.ts"],"sourcesContent":["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport type { HarResponse } from '@scalar/snippetz'\n\nimport { getCookieHeaderKeys } from '@/v2/blocks/operation-block/helpers/get-cookie-header-keys'\nimport type { ResponseInstance } from '@/v2/blocks/operation-block/helpers/send-request'\n\ntype HarToFetchResponseProps = {\n /** The HAR Response object to convert */\n harResponse: HarResponse\n /** Optional URL to set on the Response object */\n url?: string\n /** The HTTP method used for the request */\n method: HttpMethod\n /** The request path */\n path: string\n /** Time in ms the request took */\n duration?: number\n}\n\ntype ProcessedBody = {\n /** ArrayBuffer for Response body */\n body: ArrayBuffer | null\n /** Data for ResponseInstance (string or Blob) */\n data: string | Blob\n /** Size in bytes */\n size: number\n}\n\n/**\n * Converts a HAR (HTTP Archive) Response back to a ResponseInstance object.\n *\n * This function is the reverse of fetchResponseToHar - it takes a HAR response\n * and converts it back into a ResponseInstance object that includes both the\n * standard Fetch API Response properties and additional metadata.\n *\n * The conversion handles:\n * - Status code and status text restoration\n * - Headers reconstruction from HAR headers array\n * - Body decoding\n * - Content-Type and other header restoration\n * - URL property setting (if provided)\n * - Cookie header detection\n * - Duration tracking\n * - Response size calculation in bytes\n *\n * Body Handling:\n * - Plain text (no encoding): Text-based responses under 1MB from fetchResponseToHar\n * - Base64 encoded: Binary or legacy data (note: new HAR files won't contain binary data)\n * - Empty: Streaming responses, large responses (>1MB), or responses without bodies\n *\n * Use cases:\n * - Replaying recorded HTTP responses\n * - Creating mock responses from HAR files\n * - Testing with fixtures\n * - Response caching and restoration\n *\n * Note: The Fetch API Response object does not support setting the HTTP version,\n * so that information from the HAR is not preserved in the returned Response.\n * The URL property is set using Object.defineProperty since it is read-only\n * in the standard Response constructor.\n *\n * @see https://w3c.github.io/web-performance/specs/HAR/Overview.html\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Response\n *\n * @example\n * const harResponse = { status: 200, statusText: 'OK', ... }\n * const response = harToFetchResponse({\n * harResponse,\n * url: 'https://api.example.com',\n * method: 'GET',\n * path: '/users',\n * duration: 250\n * })\n * console.log(response.url) // 'https://api.example.com'\n * console.log(response.duration) // 250\n */\nexport const harToFetchResponse = ({\n harResponse,\n url = '',\n method,\n path,\n duration = 0,\n}: HarToFetchResponseProps): ResponseInstance => {\n const headers = buildHeaders(harResponse)\n const { body, data, size } = processBody(harResponse)\n const cookieHeaderKeys = getCookieHeaderKeys(headers)\n\n const response = new Response(body, {\n status: harResponse.status,\n statusText: harResponse.statusText,\n headers,\n })\n\n return {\n ...response,\n headers: Object.fromEntries(headers.entries()),\n cookieHeaderKeys,\n duration,\n status: harResponse.status,\n statusText: harResponse.statusText,\n method,\n path,\n data,\n size,\n url,\n }\n}\n\n/**\n * Builds Headers object and record from HAR response headers.\n */\nconst buildHeaders = (harResponse: HarResponse) => {\n const headers = new Headers()\n\n harResponse.headers.forEach(({ name, value }) => {\n headers.append(name, value)\n })\n\n return headers\n}\n\n/**\n * Processes HAR response body content.\n * Returns body, data and size for ResponseInstance.\n */\nconst processBody = (harResponse: HarResponse): ProcessedBody => {\n if (!harResponse.content.text) {\n return { body: null, data: '', size: 0 }\n }\n\n const { text, encoding } = harResponse.content\n\n if (encoding) {\n return { body: null, data: text, size: text.length }\n }\n\n const body = new TextEncoder().encode(text).buffer\n\n return { body, data: text, size: body.byteLength }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4EA,IAAa,sBAAsB,EACjC,aACA,MAAM,IACN,QACA,MACA,WAAW,QACoC;CAC/C,MAAM,UAAU,aAAa,WAAW;CACxC,MAAM,EAAE,MAAM,MAAM,SAAS,YAAY,WAAW;CACpD,MAAM,mBAAmB,oBAAoB,OAAO;CAQpD,OAAO;EACL,GAAG,IAPgB,SAAS,MAAM;GAClC,QAAQ,YAAY;GACpB,YAAY,YAAY;GACxB;EACF,CAGK;EACH,SAAS,OAAO,YAAY,QAAQ,QAAQ,CAAC;EAC7C;EACA;EACA,QAAQ,YAAY;EACpB,YAAY,YAAY;EACxB;EACA;EACA;EACA;EACA;CACF;AACF;;;;AAKA,IAAM,gBAAgB,gBAA6B;CACjD,MAAM,UAAU,IAAI,QAAQ;CAE5B,YAAY,QAAQ,SAAS,EAAE,MAAM,YAAY;EAC/C,QAAQ,OAAO,MAAM,KAAK;CAC5B,CAAC;CAED,OAAO;AACT;;;;;AAMA,IAAM,eAAe,gBAA4C;CAC/D,IAAI,CAAC,YAAY,QAAQ,MACvB,OAAO;EAAE,MAAM;EAAM,MAAM;EAAI,MAAM;CAAE;CAGzC,MAAM,EAAE,MAAM,aAAa,YAAY;CAEvC,IAAI,UACF,OAAO;EAAE,MAAM;EAAM,MAAM;EAAM,MAAM,KAAK;CAAO;CAGrD,MAAM,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;CAE5C,OAAO;EAAE;EAAM,MAAM;EAAM,MAAM,KAAK;CAAW;AACnD"}
1
+ {"version":3,"file":"har-to-fetch-response.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/har-to-fetch-response.ts"],"sourcesContent":["import type { HarResponse } from '@scalar/snippetz'\n\nimport { getCookieHeaderKeys } from '@/v2/blocks/operation-block/helpers/get-cookie-header-keys'\nimport type { ResponseInstance } from '@/v2/blocks/operation-block/helpers/send-request'\n\ntype HarToFetchResponseProps = {\n /** The HAR Response object to convert */\n harResponse: HarResponse\n /** Optional URL to set on the Response object */\n url?: string\n /** The HTTP method used for the request */\n method: string\n /** The request path */\n path: string\n /** Time in ms the request took */\n duration?: number\n}\n\ntype ProcessedBody = {\n /** ArrayBuffer for Response body */\n body: ArrayBuffer | null\n /** Data for ResponseInstance (string or Blob) */\n data: string | Blob\n /** Size in bytes */\n size: number\n}\n\n/**\n * Converts a HAR (HTTP Archive) Response back to a ResponseInstance object.\n *\n * This function is the reverse of fetchResponseToHar - it takes a HAR response\n * and converts it back into a ResponseInstance object that includes both the\n * standard Fetch API Response properties and additional metadata.\n *\n * The conversion handles:\n * - Status code and status text restoration\n * - Headers reconstruction from HAR headers array\n * - Body decoding\n * - Content-Type and other header restoration\n * - URL property setting (if provided)\n * - Cookie header detection\n * - Duration tracking\n * - Response size calculation in bytes\n *\n * Body Handling:\n * - Plain text (no encoding): Text-based responses under 1MB from fetchResponseToHar\n * - Base64 encoded: Binary or legacy data (note: new HAR files won't contain binary data)\n * - Empty: Streaming responses, large responses (>1MB), or responses without bodies\n *\n * Use cases:\n * - Replaying recorded HTTP responses\n * - Creating mock responses from HAR files\n * - Testing with fixtures\n * - Response caching and restoration\n *\n * Note: The Fetch API Response object does not support setting the HTTP version,\n * so that information from the HAR is not preserved in the returned Response.\n * The URL property is set using Object.defineProperty since it is read-only\n * in the standard Response constructor.\n *\n * @see https://w3c.github.io/web-performance/specs/HAR/Overview.html\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Response\n *\n * @example\n * const harResponse = { status: 200, statusText: 'OK', ... }\n * const response = harToFetchResponse({\n * harResponse,\n * url: 'https://api.example.com',\n * method: 'GET',\n * path: '/users',\n * duration: 250\n * })\n * console.log(response.url) // 'https://api.example.com'\n * console.log(response.duration) // 250\n */\nexport const harToFetchResponse = ({\n harResponse,\n url = '',\n method,\n path,\n duration = 0,\n}: HarToFetchResponseProps): ResponseInstance => {\n const headers = buildHeaders(harResponse)\n const { body, data, size } = processBody(harResponse)\n const cookieHeaderKeys = getCookieHeaderKeys(headers)\n\n const response = new Response(body, {\n status: harResponse.status,\n statusText: harResponse.statusText,\n headers,\n })\n\n return {\n ...response,\n headers: Object.fromEntries(headers.entries()),\n cookieHeaderKeys,\n duration,\n status: harResponse.status,\n statusText: harResponse.statusText,\n method,\n path,\n data,\n size,\n url,\n }\n}\n\n/**\n * Builds Headers object and record from HAR response headers.\n */\nconst buildHeaders = (harResponse: HarResponse) => {\n const headers = new Headers()\n\n harResponse.headers.forEach(({ name, value }) => {\n headers.append(name, value)\n })\n\n return headers\n}\n\n/**\n * Processes HAR response body content.\n * Returns body, data and size for ResponseInstance.\n */\nconst processBody = (harResponse: HarResponse): ProcessedBody => {\n if (!harResponse.content.text) {\n return { body: null, data: '', size: 0 }\n }\n\n const { text, encoding } = harResponse.content\n\n if (encoding) {\n return { body: null, data: text, size: text.length }\n }\n\n const body = new TextEncoder().encode(text).buffer\n\n return { body, data: text, size: body.byteLength }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,IAAa,sBAAsB,EACjC,aACA,MAAM,IACN,QACA,MACA,WAAW,QACoC;CAC/C,MAAM,UAAU,aAAa,WAAW;CACxC,MAAM,EAAE,MAAM,MAAM,SAAS,YAAY,WAAW;CACpD,MAAM,mBAAmB,oBAAoB,OAAO;CAQpD,OAAO;EACL,GAAG,IAPgB,SAAS,MAAM;GAClC,QAAQ,YAAY;GACpB,YAAY,YAAY;GACxB;EACF,CAGK;EACH,SAAS,OAAO,YAAY,QAAQ,QAAQ,CAAC;EAC7C;EACA;EACA,QAAQ,YAAY;EACpB,YAAY,YAAY;EACxB;EACA;EACA;EACA;EACA;CACF;AACF;;;;AAKA,IAAM,gBAAgB,gBAA6B;CACjD,MAAM,UAAU,IAAI,QAAQ;CAE5B,YAAY,QAAQ,SAAS,EAAE,MAAM,YAAY;EAC/C,QAAQ,OAAO,MAAM,KAAK;CAC5B,CAAC;CAED,OAAO;AACT;;;;;AAMA,IAAM,eAAe,gBAA4C;CAC/D,IAAI,CAAC,YAAY,QAAQ,MACvB,OAAO;EAAE,MAAM;EAAM,MAAM;EAAI,MAAM;CAAE;CAGzC,MAAM,EAAE,MAAM,aAAa,YAAY;CAEvC,IAAI,UACF,OAAO;EAAE,MAAM;EAAM,MAAM;EAAM,MAAM,KAAK;CAAO;CAGrD,MAAM,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;CAE5C,OAAO;EAAE;EAAM,MAAM;EAAM,MAAM,KAAK;CAAW;AACnD"}
@@ -1,5 +1,4 @@
1
1
  import { type ErrorResponse } from '@scalar/helpers/errors/normalize-error';
2
- import type { HttpMethod } from '@scalar/helpers/http/http-methods';
3
2
  import type { ClientPlugin } from '@scalar/oas-utils/helpers';
4
3
  import type { RequestPayload } from '@scalar/workspace-store/request-example';
5
4
  /** A single set of populated values for a sent request */
@@ -15,7 +14,7 @@ export type ResponseInstance = Omit<Response, 'headers'> & {
15
14
  /** The response status text */
16
15
  statusText: string;
17
16
  /** The response method */
18
- method: HttpMethod;
17
+ method: string;
19
18
  /** The request path */
20
19
  path: string;
21
20
  } & ({
@@ -1 +1 @@
1
- {"version":3,"file":"send-request.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/send-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,aAAa,EAAkB,MAAM,wCAAwC,CAAA;AAGnG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAA;AAa7E,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG;IACzD,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,CACE;IACE,wBAAwB;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,qDAAqD;IACrD,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAA;CAChD,CACJ,CAAA;AAKH,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,OAAO,KAAK,CAAA;AAEtC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GAAU,sFAO/B;IACD,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,uEAAuE;IACvE,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;CACzF,KAAG,OAAO,CACT,aAAa,CAAC;IACZ,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,QAAQ,CAAA;CAC3B,CAAC,CA8DH,CAAA"}
1
+ {"version":3,"file":"send-request.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/send-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,aAAa,EAAkB,MAAM,wCAAwC,CAAA;AAOnG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAA;AAa7E,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG;IACzD,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,GAAG,CACE;IACE,wBAAwB;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,qDAAqD;IACrD,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC,CAAA;CAChD,CACJ,CAAA;AAKH,2EAA2E;AAC3E,MAAM,MAAM,WAAW,GAAG,OAAO,KAAK,CAAA;AAEtC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GAAU,sFAO/B;IACD,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,cAAc,CAAA;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,uEAAuE;IACvE,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;CACzF,KAAG,OAAO,CACT,aAAa,CAAC;IACZ,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,QAAQ,CAAA;CAC3B,CAAC,CA8DH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"send-request.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/send-request.ts"],"sourcesContent":["import { ERRORS, type ErrorResponse, normalizeError } from '@scalar/helpers/errors/normalize-error'\nimport { isElectron } from '@scalar/helpers/general/is-electron'\nimport { buildSafeBodyRequest } from '@scalar/helpers/http/can-method-have-body'\nimport type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { httpStatusCodes } from '@scalar/helpers/http/http-status-codes'\nimport { normalizeHeaders } from '@scalar/helpers/http/normalize-headers'\nimport { X_SCALAR_SET_COOKIE } from '@scalar/helpers/http/scalar-headers'\nimport { serializeCookie } from '@scalar/helpers/http/serialize-cookie'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { RequestPayload } from '@scalar/workspace-store/request-example'\nimport { parseSetCookie } from 'set-cookie-parser'\n\nimport { getCookieHeaderKeys } from '@/v2/blocks/operation-block/helpers/get-cookie-header-keys'\nimport { resolveResponseBodyHandler } from '@/v2/blocks/response-block/helpers/resolve-response-body-handler'\nimport {\n resolveResponseContentType,\n resolveResponseMimeType,\n} from '@/v2/blocks/response-block/helpers/resolve-response-content-type'\nimport { getResponseStreamFormat } from '@/v2/blocks/response-block/helpers/response-stream'\n\nimport { decodeBuffer } from './decode-buffer'\n\n/** A single set of populated values for a sent request */\nexport type ResponseInstance = Omit<Response, 'headers'> & {\n /** Store headers as an object to match what we had with axios */\n headers: Record<string, string>\n /** Keys of headers which set cookies */\n cookieHeaderKeys: string[]\n /** Time in ms the request took */\n duration: number\n /** The response status */\n status: number\n /** The response status text */\n statusText: string\n /** The response method */\n method: HttpMethod\n /** The request path */\n path: string\n} & (\n | {\n /** The response data */\n data: string | Blob\n /** The response size in bytes */\n size: number\n }\n | {\n /** A stream reader for a streamable response body */\n reader: ReadableStreamDefaultReader<Uint8Array>\n }\n )\n\n/** HTTP status codes that should not include a response body */\nconst NO_BODY_STATUS_CODES = [204, 205, 304]\n\n/** Custom fetch function signature compatible with the global fetch API */\nexport type CustomFetch = typeof fetch\n\n/**\n * Execute the built fetch request and return a structured response.\n *\n * This function handles the complete request lifecycle including plugin hooks,\n * response processing, streaming detection, and error handling. It supports both\n * standard responses and server-sent event streams.\n *\n * @param request - The request built by the buildRequest helper\n * @param operation - The OpenAPI operation being executed\n * @param plugins - Array of client plugins to execute hooks\n * @param isUsingProxy - Whether the request is being proxied for header handling\n * @returns A tuple with either an error or the response data\n */\nexport const sendRequest = async ({\n isUsingProxy,\n requestPayload,\n request,\n plugins = [],\n customFetch = fetch,\n onResponseReceived,\n}: {\n isUsingProxy: boolean\n requestPayload: RequestPayload\n /**\n * Pre-built fetch Request to send as-is. When provided, it is used instead of rebuilding\n * from the request payload so plugin hooks observe the exact bytes that go over the wire\n * (rebuilding a multipart body generates a different boundary).\n */\n request?: Request\n /** Registered client plugins for custom content type handling */\n plugins?: ClientPlugin[]\n /** Optional custom fetch implementation, overrides the global fetch */\n customFetch?: CustomFetch\n /** Runs before response processing and returns the response to use. */\n onResponseReceived?: (response: Response, responseDuration: number) => Promise<Response>\n}): Promise<\n ErrorResponse<{\n response: ResponseInstance\n requestPayload: RequestPayload\n timestamp: number\n originalResponse: Response\n }>\n> => {\n try {\n // Execute the request and measure duration\n const startTime = performance.now()\n\n // In electron we allow GET requests to have a body\n const fetchedResponse = isElectron()\n ? await customFetch(...requestPayload)\n : await customFetch(request ?? buildSafeBodyRequest(...requestPayload))\n\n const endTime = performance.now()\n const timestamp = Date.now()\n const duration = endTime - startTime\n\n const response = onResponseReceived ? await onResponseReceived(fetchedResponse, duration) : fetchedResponse\n\n // Extract response metadata early for reuse\n const contentType = response.headers.get('content-type')\n const responseHeaders = normalizeHeaders(response.headers, isUsingProxy)\n // A Response built with the Response constructor has an empty url. For intercepted responses,\n // fall back to the original network response destination, and finally to the requested URL.\n const responseUrl = new URL(response.url || fetchedResponse.url || requestPayload[0])\n const fullPath = responseUrl.pathname + responseUrl.search\n const statusText = response.statusText || httpStatusCodes[response.status]?.name || ''\n const method = (requestPayload[1].method ?? 'GET') as HttpMethod\n const shouldSkipBody = NO_BODY_STATUS_CODES.includes(response.status)\n\n /**\n * Handle sequential response formats without buffering the complete body.\n * These responses need a reader instead of buffered data.\n * We check this early to avoid unnecessary body reading.\n */\n if (!shouldSkipBody && contentType && getResponseStreamFormat(contentType) && response.body) {\n return buildStreamingResponse({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n })\n }\n\n return await buildStandardResponse({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n contentType,\n shouldSkipBody,\n plugins,\n })\n } catch (error) {\n return [normalizeError(error, ERRORS.REQUEST_FAILED), null]\n }\n}\n\n/**\n * Extracts and serializes custom cookies from the response using the custom cookie header.\n *\n * This function parses the custom cookie header (if present), serializes each cookie using our\n * in-repo `serializeCookie` helper, and then deletes the custom cookie header from the response.\n * Returns an array of serialized cookie strings, or null if no cookies were found.\n */\nconst getCustomCookie = (response: Response): string[] | null => {\n const result = parseSetCookie(response.headers.get(X_SCALAR_SET_COOKIE) ?? '').map((c) =>\n serializeCookie(c.name, c.value, {\n ...c,\n sameSite: c.sameSite as boolean | 'lax' | 'strict' | 'none' | undefined,\n }),\n )\n\n if (result.length) {\n return result\n }\n\n return null\n}\n\n/**\n * Build a streaming response for sequential media types.\n * Streaming responses use a reader instead of buffering the entire body.\n */\nconst buildStreamingResponse = ({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n}: {\n response: Response\n requestPayload: RequestPayload\n timestamp: number\n duration: number\n responseHeaders: Record<string, string>\n statusText: string\n method: HttpMethod\n fullPath: string\n}): ErrorResponse<{\n response: ResponseInstance\n requestPayload: RequestPayload\n timestamp: number\n originalResponse: Response\n}> => {\n const normalizedResponse = new Response(null, {\n status: response.status,\n statusText,\n headers: response.headers,\n })\n\n const customCookie = getCustomCookie(normalizedResponse)\n const cookieHeaderKeys = customCookie ?? getCookieHeaderKeys(normalizedResponse.headers)\n\n return [\n null,\n {\n timestamp,\n requestPayload,\n response: {\n ...normalizedResponse,\n status: response.status,\n statusText,\n headers: responseHeaders,\n cookieHeaderKeys,\n reader: response.body!.getReader(),\n duration,\n method,\n path: fullPath,\n },\n originalResponse: normalizedResponse.clone(),\n },\n ]\n}\n\n/**\n * Build a standard response with buffered body data.\n * This handles all non-streaming responses including JSON, text, and binary data.\n */\nconst buildStandardResponse = async ({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n contentType,\n shouldSkipBody,\n plugins,\n}: {\n response: Response\n requestPayload: RequestPayload\n timestamp: number\n duration: number\n responseHeaders: Record<string, string>\n statusText: string\n method: HttpMethod\n fullPath: string\n contentType: string | null\n shouldSkipBody: boolean\n plugins: ClientPlugin[]\n}): Promise<\n ErrorResponse<{\n response: ResponseInstance\n requestPayload: RequestPayload\n timestamp: number\n originalResponse: Response\n }>\n> => {\n /**\n * Clone the response to preserve the original for body reading.\n * Read the body once and reuse the buffer for both decoding and creating a new Response.\n */\n const clonedResponse = response.clone()\n const arrayBuffer = await clonedResponse.arrayBuffer()\n const responseType = resolveResponseContentType(contentType)\n const mimeEssence = resolveResponseMimeType(contentType).essence\n const pluginHandler = resolveResponseBodyHandler(mimeEssence, plugins)\n const responseData = await decodeBuffer(arrayBuffer, responseType, pluginHandler)\n\n /**\n * Create a new Response using the arrayBuffer we already read.\n * ArrayBuffers can be reused to create new Response objects without additional memory.\n */\n const normalizedResponse = new Response(shouldSkipBody ? null : arrayBuffer, {\n status: response.status,\n statusText,\n headers: response.headers,\n })\n\n const customCookie = getCustomCookie(normalizedResponse)\n const cookieHeaderKeys = customCookie ?? getCookieHeaderKeys(normalizedResponse.headers)\n\n return [\n null,\n {\n timestamp,\n requestPayload,\n response: {\n ...normalizedResponse,\n status: response.status,\n statusText,\n headers: responseHeaders,\n cookieHeaderKeys,\n data: responseData,\n size: arrayBuffer.byteLength,\n duration,\n method,\n path: fullPath,\n },\n originalResponse: response.clone(),\n },\n ]\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"send-request.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/send-request.ts"],"sourcesContent":["import { ERRORS, type ErrorResponse, normalizeError } from '@scalar/helpers/errors/normalize-error'\nimport { isElectron } from '@scalar/helpers/general/is-electron'\nimport { buildSafeBodyRequest } from '@scalar/helpers/http/can-method-have-body'\nimport { httpStatusCodes } from '@scalar/helpers/http/http-status-codes'\nimport { normalizeHeaders } from '@scalar/helpers/http/normalize-headers'\nimport { X_SCALAR_SET_COOKIE } from '@scalar/helpers/http/scalar-headers'\nimport { serializeCookie } from '@scalar/helpers/http/serialize-cookie'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { RequestPayload } from '@scalar/workspace-store/request-example'\nimport { parseSetCookie } from 'set-cookie-parser'\n\nimport { getCookieHeaderKeys } from '@/v2/blocks/operation-block/helpers/get-cookie-header-keys'\nimport { resolveResponseBodyHandler } from '@/v2/blocks/response-block/helpers/resolve-response-body-handler'\nimport {\n resolveResponseContentType,\n resolveResponseMimeType,\n} from '@/v2/blocks/response-block/helpers/resolve-response-content-type'\nimport { getResponseStreamFormat } from '@/v2/blocks/response-block/helpers/response-stream'\n\nimport { decodeBuffer } from './decode-buffer'\n\n/** A single set of populated values for a sent request */\nexport type ResponseInstance = Omit<Response, 'headers'> & {\n /** Store headers as an object to match what we had with axios */\n headers: Record<string, string>\n /** Keys of headers which set cookies */\n cookieHeaderKeys: string[]\n /** Time in ms the request took */\n duration: number\n /** The response status */\n status: number\n /** The response status text */\n statusText: string\n /** The response method */\n method: string\n /** The request path */\n path: string\n} & (\n | {\n /** The response data */\n data: string | Blob\n /** The response size in bytes */\n size: number\n }\n | {\n /** A stream reader for a streamable response body */\n reader: ReadableStreamDefaultReader<Uint8Array>\n }\n )\n\n/** HTTP status codes that should not include a response body */\nconst NO_BODY_STATUS_CODES = [204, 205, 304]\n\n/** Custom fetch function signature compatible with the global fetch API */\nexport type CustomFetch = typeof fetch\n\n/**\n * Execute the built fetch request and return a structured response.\n *\n * This function handles the complete request lifecycle including plugin hooks,\n * response processing, streaming detection, and error handling. It supports both\n * standard responses and server-sent event streams.\n *\n * @param request - The request built by the buildRequest helper\n * @param operation - The OpenAPI operation being executed\n * @param plugins - Array of client plugins to execute hooks\n * @param isUsingProxy - Whether the request is being proxied for header handling\n * @returns A tuple with either an error or the response data\n */\nexport const sendRequest = async ({\n isUsingProxy,\n requestPayload,\n request,\n plugins = [],\n customFetch = fetch,\n onResponseReceived,\n}: {\n isUsingProxy: boolean\n requestPayload: RequestPayload\n /**\n * Pre-built fetch Request to send as-is. When provided, it is used instead of rebuilding\n * from the request payload so plugin hooks observe the exact bytes that go over the wire\n * (rebuilding a multipart body generates a different boundary).\n */\n request?: Request\n /** Registered client plugins for custom content type handling */\n plugins?: ClientPlugin[]\n /** Optional custom fetch implementation, overrides the global fetch */\n customFetch?: CustomFetch\n /** Runs before response processing and returns the response to use. */\n onResponseReceived?: (response: Response, responseDuration: number) => Promise<Response>\n}): Promise<\n ErrorResponse<{\n response: ResponseInstance\n requestPayload: RequestPayload\n timestamp: number\n originalResponse: Response\n }>\n> => {\n try {\n // Execute the request and measure duration\n const startTime = performance.now()\n\n // In electron we allow GET requests to have a body\n const fetchedResponse = isElectron()\n ? await customFetch(...requestPayload)\n : await customFetch(request ?? buildSafeBodyRequest(...requestPayload))\n\n const endTime = performance.now()\n const timestamp = Date.now()\n const duration = endTime - startTime\n\n const response = onResponseReceived ? await onResponseReceived(fetchedResponse, duration) : fetchedResponse\n\n // Extract response metadata early for reuse\n const contentType = response.headers.get('content-type')\n const responseHeaders = normalizeHeaders(response.headers, isUsingProxy)\n // A Response built with the Response constructor has an empty url. For intercepted responses,\n // fall back to the original network response destination, and finally to the requested URL.\n const responseUrl = new URL(response.url || fetchedResponse.url || requestPayload[0])\n const fullPath = responseUrl.pathname + responseUrl.search\n const statusText = response.statusText || httpStatusCodes[response.status]?.name || ''\n const method = (requestPayload[1].method ?? 'GET') as string\n const shouldSkipBody = NO_BODY_STATUS_CODES.includes(response.status)\n\n /**\n * Handle sequential response formats without buffering the complete body.\n * These responses need a reader instead of buffered data.\n * We check this early to avoid unnecessary body reading.\n */\n if (!shouldSkipBody && contentType && getResponseStreamFormat(contentType) && response.body) {\n return buildStreamingResponse({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n })\n }\n\n return await buildStandardResponse({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n contentType,\n shouldSkipBody,\n plugins,\n })\n } catch (error) {\n return [normalizeError(error, ERRORS.REQUEST_FAILED), null]\n }\n}\n\n/**\n * Extracts and serializes custom cookies from the response using the custom cookie header.\n *\n * This function parses the custom cookie header (if present), serializes each cookie using our\n * in-repo `serializeCookie` helper, and then deletes the custom cookie header from the response.\n * Returns an array of serialized cookie strings, or null if no cookies were found.\n */\nconst getCustomCookie = (response: Response): string[] | null => {\n const result = parseSetCookie(response.headers.get(X_SCALAR_SET_COOKIE) ?? '').map((c) =>\n serializeCookie(c.name, c.value, {\n ...c,\n sameSite: c.sameSite as boolean | 'lax' | 'strict' | 'none' | undefined,\n }),\n )\n\n if (result.length) {\n return result\n }\n\n return null\n}\n\n/**\n * Build a streaming response for sequential media types.\n * Streaming responses use a reader instead of buffering the entire body.\n */\nconst buildStreamingResponse = ({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n}: {\n response: Response\n requestPayload: RequestPayload\n timestamp: number\n duration: number\n responseHeaders: Record<string, string>\n statusText: string\n method: string\n fullPath: string\n}): ErrorResponse<{\n response: ResponseInstance\n requestPayload: RequestPayload\n timestamp: number\n originalResponse: Response\n}> => {\n const normalizedResponse = new Response(null, {\n status: response.status,\n statusText,\n headers: response.headers,\n })\n\n const customCookie = getCustomCookie(normalizedResponse)\n const cookieHeaderKeys = customCookie ?? getCookieHeaderKeys(normalizedResponse.headers)\n\n return [\n null,\n {\n timestamp,\n requestPayload,\n response: {\n ...normalizedResponse,\n status: response.status,\n statusText,\n headers: responseHeaders,\n cookieHeaderKeys,\n reader: response.body!.getReader(),\n duration,\n method,\n path: fullPath,\n },\n originalResponse: normalizedResponse.clone(),\n },\n ]\n}\n\n/**\n * Build a standard response with buffered body data.\n * This handles all non-streaming responses including JSON, text, and binary data.\n */\nconst buildStandardResponse = async ({\n response,\n requestPayload,\n timestamp,\n duration,\n responseHeaders,\n statusText,\n method,\n fullPath,\n contentType,\n shouldSkipBody,\n plugins,\n}: {\n response: Response\n requestPayload: RequestPayload\n timestamp: number\n duration: number\n responseHeaders: Record<string, string>\n statusText: string\n method: string\n fullPath: string\n contentType: string | null\n shouldSkipBody: boolean\n plugins: ClientPlugin[]\n}): Promise<\n ErrorResponse<{\n response: ResponseInstance\n requestPayload: RequestPayload\n timestamp: number\n originalResponse: Response\n }>\n> => {\n /**\n * Clone the response to preserve the original for body reading.\n * Read the body once and reuse the buffer for both decoding and creating a new Response.\n */\n const clonedResponse = response.clone()\n const arrayBuffer = await clonedResponse.arrayBuffer()\n const responseType = resolveResponseContentType(contentType)\n const mimeEssence = resolveResponseMimeType(contentType).essence\n const pluginHandler = resolveResponseBodyHandler(mimeEssence, plugins)\n const responseData = await decodeBuffer(arrayBuffer, responseType, pluginHandler)\n\n /**\n * Create a new Response using the arrayBuffer we already read.\n * ArrayBuffers can be reused to create new Response objects without additional memory.\n */\n const normalizedResponse = new Response(shouldSkipBody ? null : arrayBuffer, {\n status: response.status,\n statusText,\n headers: response.headers,\n })\n\n const customCookie = getCustomCookie(normalizedResponse)\n const cookieHeaderKeys = customCookie ?? getCookieHeaderKeys(normalizedResponse.headers)\n\n return [\n null,\n {\n timestamp,\n requestPayload,\n response: {\n ...normalizedResponse,\n status: response.status,\n statusText,\n headers: responseHeaders,\n cookieHeaderKeys,\n data: responseData,\n size: arrayBuffer.byteLength,\n duration,\n method,\n path: fullPath,\n },\n originalResponse: response.clone(),\n },\n ]\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import type { ClientOptionGroup } from '@scalar/blocks/code-example';
2
- import type { HttpMethod } from '@scalar/helpers/http/http-methods';
3
2
  import type { ClientPlugin } from '@scalar/oas-utils/helpers';
4
3
  import type { WorkspaceStore } from '@scalar/workspace-store/client';
5
4
  import type { SelectedSecurity } from '@scalar/workspace-store/entities/auth';
@@ -21,7 +20,7 @@ export type RequestBlockProps = {
21
20
  /** Slug of the document the operation belongs to */
22
21
  documentSlug: string;
23
22
  layout: ClientLayout;
24
- method: HttpMethod;
23
+ method: string;
25
24
  operation: OperationObject;
26
25
  /** Operation before downloaded examples are overlaid, for parameter edit targets. */
27
26
  sourceOperation?: OperationObject;
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBlock.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"names":[],"mappings":"AAqzBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,EAEV,QAAQ,EACR,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AAIvC,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAChC,MAAM,yCAAyC,CAAA;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AACxG,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,8DAA8D,CAAA;AAerE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAA;AAEjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAWrD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,iBAAiB,EAAE,CAAA;IAClC,WAAW,EAAE,kBAAkB,CAAA;IAC/B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,aAAa,EAAE,CAAA;IACjC,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,UAAU,CAAA;IAClB,SAAS,EAAE,eAAe,CAAA;IAC1B,qFAAqF;IACrF,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,eAAe,CAAC,UAAU,CAAC,CAAA;IACjD,eAAe,EAAE,qBAAqB,CAAA;IACtC,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD,cAAc,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,yBAAyB,CAAC,CAAA;IACtE,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,uBAAuB,EAAE,0BAA0B,EAAE,CAAA;IACrD,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,mHAAmH;IACnH,sBAAsB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACvC,uDAAuD;IACvD,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAi8BD,QAAA,MAAM,YAAY,8SAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"RequestBlock.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"names":[],"mappings":"AAu0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAKpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,KAAK,EAEV,QAAQ,EACR,iBAAiB,EAClB,MAAM,gCAAgC,CAAA;AAIvC,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAChC,MAAM,yCAAyC,CAAA;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AACxG,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,8DAA8D,CAAA;AAerE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8DAA8D,CAAA;AAEjG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAWrD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,QAAQ,CAAA;IAClB,aAAa,EAAE,iBAAiB,EAAE,CAAA;IAClC,WAAW,EAAE,kBAAkB,CAAA;IAC/B,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,aAAa,EAAE,CAAA;IACjC,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,eAAe,CAAA;IAC1B,qFAAqF;IACrF,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,eAAe,CAAC,UAAU,CAAC,CAAA;IACjD,eAAe,EAAE,qBAAqB,CAAA;IACtC,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD,cAAc,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,yBAAyB,CAAC,CAAA;IACtE,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,uBAAuB,EAAE,0BAA0B,EAAE,CAAA;IACrD,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,mHAAmH;IACnH,sBAAsB,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACvC,uDAAuD;IACvD,OAAO,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AAg+BD,QAAA,MAAM,YAAY,8SAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}