@scalar/api-client 3.21.5 → 3.23.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 (150) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/hooks/use-file-dialog.js +1 -1
  3. package/dist/hooks/use-file-dialog.js.map +1 -1
  4. package/dist/style.css +1226 -69
  5. package/dist/styles/tailwind.config.css +1 -0
  6. package/dist/v2/blocks/operation-block/helpers/persist-response-cookies.d.ts +3 -3
  7. package/dist/v2/blocks/operation-block/helpers/persist-response-cookies.d.ts.map +1 -1
  8. package/dist/v2/blocks/operation-block/helpers/persist-response-cookies.js +4 -4
  9. package/dist/v2/blocks/operation-block/helpers/persist-response-cookies.js.map +1 -1
  10. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js +1 -1
  11. package/dist/v2/blocks/operation-block/helpers/validate-path-parameters.js.map +1 -1
  12. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
  13. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  14. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  15. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +13 -8
  16. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  17. package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
  18. package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
  19. package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -1
  20. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +64 -13
  21. package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
  22. package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.d.ts +2 -0
  23. package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.d.ts.map +1 -1
  24. package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.js.map +1 -1
  25. package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.script.js +5 -3
  26. package/dist/v2/blocks/request-block/components/RequestBodyForm.vue.script.js.map +1 -1
  27. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.d.ts +9 -3
  28. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.d.ts.map +1 -1
  29. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.js.map +1 -1
  30. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.script.js +44 -16
  31. package/dist/v2/blocks/request-block/components/RequestBodyViewToggle.vue.script.js.map +1 -1
  32. package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts +12 -0
  33. package/dist/v2/blocks/request-block/components/RequestParams.vue.d.ts.map +1 -1
  34. package/dist/v2/blocks/request-block/components/RequestParams.vue.js.map +1 -1
  35. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js +132 -32
  36. package/dist/v2/blocks/request-block/components/RequestParams.vue.script.js.map +1 -1
  37. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +3 -1
  38. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts.map +1 -1
  39. package/dist/v2/blocks/request-block/components/RequestTable.vue.js +1 -1
  40. package/dist/v2/blocks/request-block/components/RequestTable.vue.js.map +1 -1
  41. package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js +13 -2
  42. package/dist/v2/blocks/request-block/components/RequestTable.vue.script.js.map +1 -1
  43. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts +3 -1
  44. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
  45. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
  46. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +6 -2
  47. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
  48. package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.d.ts.map +1 -1
  49. package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.js +10 -3
  50. package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.js.map +1 -1
  51. package/dist/v2/blocks/request-block/helpers/create-parameter-rows.d.ts.map +1 -1
  52. package/dist/v2/blocks/request-block/helpers/create-parameter-rows.js +10 -1
  53. package/dist/v2/blocks/request-block/helpers/create-parameter-rows.js.map +1 -1
  54. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts +3 -2
  55. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts.map +1 -1
  56. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js +14 -11
  57. package/dist/v2/blocks/request-block/helpers/get-form-body-rows.js.map +1 -1
  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 +3 -3
  62. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.script.js.map +1 -1
  63. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  64. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  65. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
  66. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +55 -16
  67. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
  68. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.d.ts +3 -3
  69. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.d.ts.map +1 -1
  70. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.js.map +1 -1
  71. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js +20 -7
  72. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js.map +1 -1
  73. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
  74. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
  75. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js +32 -27
  76. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
  77. package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.d.ts.map +1 -1
  78. package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js +2 -1
  79. package/dist/v2/blocks/scalar-auth-selector-block/helpers/openid-discovery-to-flows.js.map +1 -1
  80. package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
  81. package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
  82. package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -1
  83. package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
  84. package/dist/v2/components/code-input/PillTooltipHost.vue.d.ts.map +1 -1
  85. package/dist/v2/components/code-input/PillTooltipHost.vue.js.map +1 -1
  86. package/dist/v2/components/code-input/PillTooltipHost.vue.script.js +4 -1
  87. package/dist/v2/components/code-input/PillTooltipHost.vue.script.js.map +1 -1
  88. package/dist/v2/components/code-input/code-variable-widget.js +1 -1
  89. package/dist/v2/components/code-input/code-variable-widget.js.map +1 -1
  90. package/dist/v2/components/data-table/DataTableInput.vue.d.ts +3 -1
  91. package/dist/v2/components/data-table/DataTableInput.vue.d.ts.map +1 -1
  92. package/dist/v2/components/data-table/DataTableInput.vue.js +1 -1
  93. package/dist/v2/components/data-table/DataTableInput.vue.js.map +1 -1
  94. package/dist/v2/components/data-table/DataTableInput.vue.script.js +46 -15
  95. package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -1
  96. package/dist/v2/components/server/ServerDropdown.vue.d.ts.map +1 -1
  97. package/dist/v2/components/server/ServerDropdown.vue.js.map +1 -1
  98. package/dist/v2/components/server/ServerDropdown.vue.script.js +7 -9
  99. package/dist/v2/components/server/ServerDropdown.vue.script.js.map +1 -1
  100. package/dist/v2/constants.js +1 -1
  101. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
  102. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -1
  103. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +27 -31
  104. package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
  105. package/dist/v2/features/localization/index.d.ts.map +1 -1
  106. package/dist/v2/features/localization/index.js +2 -0
  107. package/dist/v2/features/localization/index.js.map +1 -1
  108. package/dist/v2/features/localization/locales/ar.d.ts +4 -0
  109. package/dist/v2/features/localization/locales/ar.d.ts.map +1 -1
  110. package/dist/v2/features/localization/locales/ar.js +4 -0
  111. package/dist/v2/features/localization/locales/ar.js.map +1 -1
  112. package/dist/v2/features/localization/locales/de.d.ts +4 -0
  113. package/dist/v2/features/localization/locales/de.d.ts.map +1 -1
  114. package/dist/v2/features/localization/locales/de.js +4 -0
  115. package/dist/v2/features/localization/locales/de.js.map +1 -1
  116. package/dist/v2/features/localization/locales/es.d.ts +4 -0
  117. package/dist/v2/features/localization/locales/es.d.ts.map +1 -1
  118. package/dist/v2/features/localization/locales/es.js +4 -0
  119. package/dist/v2/features/localization/locales/es.js.map +1 -1
  120. package/dist/v2/features/localization/locales/fr.d.ts +4 -0
  121. package/dist/v2/features/localization/locales/fr.d.ts.map +1 -1
  122. package/dist/v2/features/localization/locales/fr.js +4 -0
  123. package/dist/v2/features/localization/locales/fr.js.map +1 -1
  124. package/dist/v2/features/localization/locales/pt.d.ts +4 -0
  125. package/dist/v2/features/localization/locales/pt.d.ts.map +1 -1
  126. package/dist/v2/features/localization/locales/pt.js +4 -0
  127. package/dist/v2/features/localization/locales/pt.js.map +1 -1
  128. package/dist/v2/features/localization/locales/ru.d.ts +4 -0
  129. package/dist/v2/features/localization/locales/ru.d.ts.map +1 -1
  130. package/dist/v2/features/localization/locales/ru.js +4 -0
  131. package/dist/v2/features/localization/locales/ru.js.map +1 -1
  132. package/dist/v2/features/localization/locales/zh-cn.d.ts +4 -0
  133. package/dist/v2/features/localization/locales/zh-cn.d.ts.map +1 -1
  134. package/dist/v2/features/localization/locales/zh-cn.js +4 -0
  135. package/dist/v2/features/localization/locales/zh-cn.js.map +1 -1
  136. package/dist/v2/features/localization/locales/zh-tw.d.ts +398 -0
  137. package/dist/v2/features/localization/locales/zh-tw.d.ts.map +1 -0
  138. package/dist/v2/features/localization/locales/zh-tw.js +360 -0
  139. package/dist/v2/features/localization/locales/zh-tw.js.map +1 -0
  140. package/dist/v2/features/localization/translations.d.ts +4 -0
  141. package/dist/v2/features/localization/translations.d.ts.map +1 -1
  142. package/dist/v2/features/localization/translations.js +4 -0
  143. package/dist/v2/features/localization/translations.js.map +1 -1
  144. package/dist/v2/features/modal/index.d.ts +1 -1
  145. package/dist/v2/features/modal/index.d.ts.map +1 -1
  146. package/dist/v2/helpers/handle-hotkeys.d.ts.map +1 -1
  147. package/dist/v2/helpers/handle-hotkeys.js +4 -1
  148. package/dist/v2/helpers/handle-hotkeys.js.map +1 -1
  149. package/dist/vue-styles.css +39 -40
  150. package/package.json +13 -13
@@ -7,6 +7,7 @@
7
7
 
8
8
  /* Dependency Tailwind Configurations */
9
9
  @import "@scalar/components/tailwind.config.css";
10
+ @import "@scalar/blocks/tailwind.config.css";
10
11
  @import "@scalar/sidebar/tailwind.config.css";
11
12
 
12
13
  /* Search for Tailwind classes in the API Client */
@@ -34,9 +34,9 @@ export declare const getCookieRequestUrl: (payloadUrl: string) => string;
34
34
  *
35
35
  * Cookies are scoped like a browser would scope them — using the `Set-Cookie`
36
36
  * `Domain`/`Path` attributes, or falling back to the request host and default
37
- * path — so they are only replayed on matching requests. Expired cookies (an
38
- * `Expires` in the past or a non-positive `Max-Age`) remove the matching cookie,
39
- * matching how a server deletes a cookie.
37
+ * path — so they are only replayed on matching requests. A non-positive
38
+ * `Max-Age`, or a past `Expires` when `Max-Age` is absent, removes the matching
39
+ * cookie. `Max-Age` takes precedence when both attributes are present.
40
40
  *
41
41
  * @param cookieHeaderKeys - Serialized `Set-Cookie` values from the response
42
42
  * @param documentCookies - The current persisted document cookies (order matches the store)
@@ -1 +1 @@
1
- {"version":3,"file":"persist-response-cookies.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/persist-response-cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AAGxG;;;;;GAKG;AACH,KAAK,oBAAoB,GACrB;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,uFAAuF;IACvF,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAA;IACjE,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GACD;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAEL;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,KAAG,MAQxD,CAAA;AAqCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,wBAAwB,GAAI,yDAKtC;IACD,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,KAAG,oBAAoB,EAqEvB,CAAA"}
1
+ {"version":3,"file":"persist-response-cookies.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/operation-block/helpers/persist-response-cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AAGxG;;;;;GAKG;AACH,KAAK,oBAAoB,GACrB;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,uFAAuF;IACvF,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAA;IACjE,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GACD;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAEL;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,KAAG,MAQxD,CAAA;AAqCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,wBAAwB,GAAI,yDAKtC;IACD,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,eAAe,EAAE,aAAa,EAAE,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,KAAG,oBAAoB,EAsEvB,CAAA"}
@@ -55,9 +55,9 @@ var isSameCookie = (a, b) => a.name === b.name && (a.domain ?? "") === (b.domain
55
55
  *
56
56
  * Cookies are scoped like a browser would scope them — using the `Set-Cookie`
57
57
  * `Domain`/`Path` attributes, or falling back to the request host and default
58
- * path — so they are only replayed on matching requests. Expired cookies (an
59
- * `Expires` in the past or a non-positive `Max-Age`) remove the matching cookie,
60
- * matching how a server deletes a cookie.
58
+ * path — so they are only replayed on matching requests. A non-positive
59
+ * `Max-Age`, or a past `Expires` when `Max-Age` is absent, removes the matching
60
+ * cookie. `Max-Age` takes precedence when both attributes are present.
61
61
  *
62
62
  * @param cookieHeaderKeys - Serialized `Set-Cookie` values from the response
63
63
  * @param documentCookies - The current persisted document cookies (order matches the store)
@@ -79,7 +79,7 @@ var getResponseCookieActions = ({ cookieHeaderKeys, documentCookies, requestUrl,
79
79
  if (!parsed?.name) continue;
80
80
  const domain = parsed.domain || hostname;
81
81
  const path = parsed.path || defaultPath;
82
- const expired = parsed.maxAge !== void 0 && parsed.maxAge <= 0 || parsed.expires instanceof Date && parsed.expires.getTime() <= now;
82
+ const expired = parsed.maxAge !== void 0 ? parsed.maxAge <= 0 : parsed.expires instanceof Date && parsed.expires.getTime() <= now;
83
83
  resolved.set(`${parsed.name}\n${domain}\n${path}`, {
84
84
  cookie: {
85
85
  name: parsed.name,
@@ -1 +1 @@
1
- {"version":3,"file":"persist-response-cookies.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/persist-response-cookies.ts"],"sourcesContent":["import type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport { parseSetCookie } from 'set-cookie-parser'\n\n/**\n * A single change to apply to the persisted document cookie jar in response to a\n * server's `Set-Cookie` headers. This mirrors how a browser stores server-set\n * cookies so that values like a Django CSRF token survive a page reload and get\n * replayed on the next request.\n */\ntype ResponseCookieAction =\n | {\n type: 'upsert'\n /** The cookie fields to store. Merged over the existing cookie when `index` is set. */\n cookie: Pick<XScalarCookie, 'name' | 'value' | 'domain' | 'path'>\n /** Index of the existing cookie to update, or undefined to add a new one. */\n index?: number\n }\n | {\n type: 'delete'\n cookieName: string\n /** Index of the existing cookie to remove. */\n index: number\n }\n\n/**\n * Resolve the real target URL a request was sent to, so cookies are scoped to\n * the API host rather than the proxy. When a request is proxied, the target URL\n * is carried in the `scalar_url` query parameter; otherwise the URL is used as-is.\n */\nexport const getCookieRequestUrl = (payloadUrl: string): string => {\n try {\n // Fall back to the proxied URL when `scalar_url` is missing or empty, so an\n // empty query value never scopes cookies against a placeholder host.\n return new URL(payloadUrl).searchParams.get('scalar_url') || payloadUrl\n } catch {\n return payloadUrl\n }\n}\n\n/**\n * Compute the default cookie path from a request pathname, following the browser\n * default-path algorithm (RFC 6265, section 5.1.4): the request path up to, but\n * not including, its rightmost slash — or \"/\" when there is nothing before it.\n */\nconst getDefaultPath = (pathname: string): string => {\n if (!pathname.startsWith('/')) {\n return '/'\n }\n\n const lastSlash = pathname.lastIndexOf('/')\n\n return lastSlash <= 0 ? '/' : pathname.slice(0, lastSlash)\n}\n\n/**\n * Derive the host and default path a cookie should be scoped to from the request\n * URL. The URL is parsed defensively: `getCookieRequestUrl` may hand back a value\n * that is not a valid URL (for example a malformed `scalar_url`), and a throw here\n * would otherwise abort persistence after an otherwise successful request.\n */\nconst getRequestScope = (requestUrl: string): { hostname: string; defaultPath: string } => {\n try {\n const { hostname, pathname } = new URL(requestUrl, 'https://example.com')\n\n return { hostname, defaultPath: getDefaultPath(pathname) }\n } catch {\n return { hostname: '', defaultPath: '/' }\n }\n}\n\n/** Two stored cookies share an identity when name, domain, and path all match. */\nconst isSameCookie = (a: Pick<XScalarCookie, 'name' | 'domain' | 'path'>, b: XScalarCookie): boolean =>\n a.name === b.name && (a.domain ?? '') === (b.domain ?? '') && (a.path ?? '') === (b.path ?? '')\n\n/**\n * Translate a response's `Set-Cookie` headers into a list of changes for the\n * document cookie jar.\n *\n * Scalar sends requests through a proxy and reads `Set-Cookie` from a custom\n * header because browsers hide it from `fetch`, so it has to maintain its own\n * cookie jar instead of relying on the browser. This function is that jar's\n * write path: it decides which cookies to add, update, or remove.\n *\n * Cookies are scoped like a browser would scope them — using the `Set-Cookie`\n * `Domain`/`Path` attributes, or falling back to the request host and default\n * path — so they are only replayed on matching requests. Expired cookies (an\n * `Expires` in the past or a non-positive `Max-Age`) remove the matching cookie,\n * matching how a server deletes a cookie.\n *\n * @param cookieHeaderKeys - Serialized `Set-Cookie` values from the response\n * @param documentCookies - The current persisted document cookies (order matches the store)\n * @param requestUrl - The request URL, used to derive the default domain and path\n * @param now - Current time in ms, injectable for testing\n */\nexport const getResponseCookieActions = ({\n cookieHeaderKeys,\n documentCookies,\n requestUrl,\n now = Date.now(),\n}: {\n cookieHeaderKeys: string[]\n documentCookies: XScalarCookie[]\n requestUrl: string\n now?: number\n}): ResponseCookieAction[] => {\n const { hostname, defaultPath } = getRequestScope(requestUrl)\n\n /**\n * Collapse the response's `Set-Cookie` headers into one final state per cookie\n * identity. A browser applies them in order, so a later header for the same\n * name/domain/path wins — whether it sets a new value or expires the cookie.\n * Resolving this first also keeps a single action per identity, so the same\n * stored cookie never gets a conflicting upsert and delete on the same index.\n */\n const resolved = new Map<\n string,\n { cookie: Pick<XScalarCookie, 'name' | 'value' | 'domain' | 'path'>; expired: boolean }\n >()\n\n for (const header of cookieHeaderKeys) {\n // Each header holds a single Set-Cookie value, so take the first parsed cookie.\n const [parsed] = parseSetCookie(header)\n\n if (!parsed?.name) {\n continue\n }\n\n // Scope the cookie the way a browser would, so it is only replayed on matching requests.\n const domain = parsed.domain || hostname\n const path = parsed.path || defaultPath\n\n // A cookie is deleted when it is already expired via Expires or Max-Age.\n const expired =\n (parsed.maxAge !== undefined && parsed.maxAge <= 0) ||\n (parsed.expires instanceof Date && parsed.expires.getTime() <= now)\n\n resolved.set(`${parsed.name}\\n${domain}\\n${path}`, {\n cookie: { name: parsed.name, value: parsed.value, domain, path },\n expired,\n })\n }\n\n const upserts: ResponseCookieAction[] = []\n const deletes: ResponseCookieAction[] = []\n\n for (const { cookie, expired } of resolved.values()) {\n const index = documentCookies.findIndex((existing) => isSameCookie(cookie, existing))\n\n if (expired) {\n if (index !== -1) {\n deletes.push({ type: 'delete', cookieName: cookie.name, index })\n }\n continue\n }\n\n upserts.push({\n type: 'upsert',\n cookie,\n ...(index === -1 ? {} : { index }),\n })\n }\n\n /**\n * Apply index-based changes (updates and deletes) before appends, and process\n * deletes from the highest index down, so earlier indices stay valid as the\n * underlying array shrinks.\n */\n const indexed = [...upserts.filter((action) => action.index !== undefined), ...deletes].sort(\n (a, b) => (b.index ?? 0) - (a.index ?? 0),\n )\n const appends = upserts.filter((action) => action.index === undefined)\n\n return [...indexed, ...appends]\n}\n"],"mappings":";;;;;;;AA6BA,IAAa,uBAAuB,eAA+B;CACjE,IAAI;EAGF,OAAO,IAAI,IAAI,UAAU,CAAC,CAAC,aAAa,IAAI,YAAY,KAAK;CAC/D,QAAQ;EACN,OAAO;CACT;AACF;;;;;;AAOA,IAAM,kBAAkB,aAA6B;CACnD,IAAI,CAAC,SAAS,WAAW,GAAG,GAC1B,OAAO;CAGT,MAAM,YAAY,SAAS,YAAY,GAAG;CAE1C,OAAO,aAAa,IAAI,MAAM,SAAS,MAAM,GAAG,SAAS;AAC3D;;;;;;;AAQA,IAAM,mBAAmB,eAAkE;CACzF,IAAI;EACF,MAAM,EAAE,UAAU,aAAa,IAAI,IAAI,YAAY,qBAAqB;EAExE,OAAO;GAAE;GAAU,aAAa,eAAe,QAAQ;EAAE;CAC3D,QAAQ;EACN,OAAO;GAAE,UAAU;GAAI,aAAa;EAAI;CAC1C;AACF;;AAGA,IAAM,gBAAgB,GAAoD,MACxE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,SAAS,EAAE,UAAU,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;AAsB9F,IAAa,4BAA4B,EACvC,kBACA,iBACA,YACA,MAAM,KAAK,IAAI,QAMa;CAC5B,MAAM,EAAE,UAAU,gBAAgB,gBAAgB,UAAU;;;;;;;;CAS5D,MAAM,2BAAW,IAAI,IAGnB;CAEF,KAAK,MAAM,UAAU,kBAAkB;EAErC,MAAM,CAAC,UAAU,eAAe,MAAM;EAEtC,IAAI,CAAC,QAAQ,MACX;EAIF,MAAM,SAAS,OAAO,UAAU;EAChC,MAAM,OAAO,OAAO,QAAQ;EAG5B,MAAM,UACH,OAAO,WAAW,KAAA,KAAa,OAAO,UAAU,KAChD,OAAO,mBAAmB,QAAQ,OAAO,QAAQ,QAAQ,KAAK;EAEjE,SAAS,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI,QAAQ;GACjD,QAAQ;IAAE,MAAM,OAAO;IAAM,OAAO,OAAO;IAAO;IAAQ;GAAK;GAC/D;EACF,CAAC;CACH;CAEA,MAAM,UAAkC,CAAC;CACzC,MAAM,UAAkC,CAAC;CAEzC,KAAK,MAAM,EAAE,QAAQ,aAAa,SAAS,OAAO,GAAG;EACnD,MAAM,QAAQ,gBAAgB,WAAW,aAAa,aAAa,QAAQ,QAAQ,CAAC;EAEpF,IAAI,SAAS;GACX,IAAI,UAAU,IACZ,QAAQ,KAAK;IAAE,MAAM;IAAU,YAAY,OAAO;IAAM;GAAM,CAAC;GAEjE;EACF;EAEA,QAAQ,KAAK;GACX,MAAM;GACN;GACA,GAAI,UAAU,KAAK,CAAC,IAAI,EAAE,MAAM;EAClC,CAAC;CACH;;;;;;CAOA,MAAM,UAAU,CAAC,GAAG,QAAQ,QAAQ,WAAW,OAAO,UAAU,KAAA,CAAS,GAAG,GAAG,OAAO,CAAC,CAAC,MACrF,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EACzC;CACA,MAAM,UAAU,QAAQ,QAAQ,WAAW,OAAO,UAAU,KAAA,CAAS;CAErE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO;AAChC"}
1
+ {"version":3,"file":"persist-response-cookies.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/persist-response-cookies.ts"],"sourcesContent":["import type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport { parseSetCookie } from 'set-cookie-parser'\n\n/**\n * A single change to apply to the persisted document cookie jar in response to a\n * server's `Set-Cookie` headers. This mirrors how a browser stores server-set\n * cookies so that values like a Django CSRF token survive a page reload and get\n * replayed on the next request.\n */\ntype ResponseCookieAction =\n | {\n type: 'upsert'\n /** The cookie fields to store. Merged over the existing cookie when `index` is set. */\n cookie: Pick<XScalarCookie, 'name' | 'value' | 'domain' | 'path'>\n /** Index of the existing cookie to update, or undefined to add a new one. */\n index?: number\n }\n | {\n type: 'delete'\n cookieName: string\n /** Index of the existing cookie to remove. */\n index: number\n }\n\n/**\n * Resolve the real target URL a request was sent to, so cookies are scoped to\n * the API host rather than the proxy. When a request is proxied, the target URL\n * is carried in the `scalar_url` query parameter; otherwise the URL is used as-is.\n */\nexport const getCookieRequestUrl = (payloadUrl: string): string => {\n try {\n // Fall back to the proxied URL when `scalar_url` is missing or empty, so an\n // empty query value never scopes cookies against a placeholder host.\n return new URL(payloadUrl).searchParams.get('scalar_url') || payloadUrl\n } catch {\n return payloadUrl\n }\n}\n\n/**\n * Compute the default cookie path from a request pathname, following the browser\n * default-path algorithm (RFC 6265, section 5.1.4): the request path up to, but\n * not including, its rightmost slash — or \"/\" when there is nothing before it.\n */\nconst getDefaultPath = (pathname: string): string => {\n if (!pathname.startsWith('/')) {\n return '/'\n }\n\n const lastSlash = pathname.lastIndexOf('/')\n\n return lastSlash <= 0 ? '/' : pathname.slice(0, lastSlash)\n}\n\n/**\n * Derive the host and default path a cookie should be scoped to from the request\n * URL. The URL is parsed defensively: `getCookieRequestUrl` may hand back a value\n * that is not a valid URL (for example a malformed `scalar_url`), and a throw here\n * would otherwise abort persistence after an otherwise successful request.\n */\nconst getRequestScope = (requestUrl: string): { hostname: string; defaultPath: string } => {\n try {\n const { hostname, pathname } = new URL(requestUrl, 'https://example.com')\n\n return { hostname, defaultPath: getDefaultPath(pathname) }\n } catch {\n return { hostname: '', defaultPath: '/' }\n }\n}\n\n/** Two stored cookies share an identity when name, domain, and path all match. */\nconst isSameCookie = (a: Pick<XScalarCookie, 'name' | 'domain' | 'path'>, b: XScalarCookie): boolean =>\n a.name === b.name && (a.domain ?? '') === (b.domain ?? '') && (a.path ?? '') === (b.path ?? '')\n\n/**\n * Translate a response's `Set-Cookie` headers into a list of changes for the\n * document cookie jar.\n *\n * Scalar sends requests through a proxy and reads `Set-Cookie` from a custom\n * header because browsers hide it from `fetch`, so it has to maintain its own\n * cookie jar instead of relying on the browser. This function is that jar's\n * write path: it decides which cookies to add, update, or remove.\n *\n * Cookies are scoped like a browser would scope them — using the `Set-Cookie`\n * `Domain`/`Path` attributes, or falling back to the request host and default\n * path — so they are only replayed on matching requests. A non-positive\n * `Max-Age`, or a past `Expires` when `Max-Age` is absent, removes the matching\n * cookie. `Max-Age` takes precedence when both attributes are present.\n *\n * @param cookieHeaderKeys - Serialized `Set-Cookie` values from the response\n * @param documentCookies - The current persisted document cookies (order matches the store)\n * @param requestUrl - The request URL, used to derive the default domain and path\n * @param now - Current time in ms, injectable for testing\n */\nexport const getResponseCookieActions = ({\n cookieHeaderKeys,\n documentCookies,\n requestUrl,\n now = Date.now(),\n}: {\n cookieHeaderKeys: string[]\n documentCookies: XScalarCookie[]\n requestUrl: string\n now?: number\n}): ResponseCookieAction[] => {\n const { hostname, defaultPath } = getRequestScope(requestUrl)\n\n /**\n * Collapse the response's `Set-Cookie` headers into one final state per cookie\n * identity. A browser applies them in order, so a later header for the same\n * name/domain/path wins — whether it sets a new value or expires the cookie.\n * Resolving this first also keeps a single action per identity, so the same\n * stored cookie never gets a conflicting upsert and delete on the same index.\n */\n const resolved = new Map<\n string,\n { cookie: Pick<XScalarCookie, 'name' | 'value' | 'domain' | 'path'>; expired: boolean }\n >()\n\n for (const header of cookieHeaderKeys) {\n // Each header holds a single Set-Cookie value, so take the first parsed cookie.\n const [parsed] = parseSetCookie(header)\n\n if (!parsed?.name) {\n continue\n }\n\n // Scope the cookie the way a browser would, so it is only replayed on matching requests.\n const domain = parsed.domain || hostname\n const path = parsed.path || defaultPath\n\n // Max-Age takes precedence over Expires (RFC 6265, section 5.3).\n const expired =\n parsed.maxAge !== undefined\n ? parsed.maxAge <= 0\n : parsed.expires instanceof Date && parsed.expires.getTime() <= now\n\n resolved.set(`${parsed.name}\\n${domain}\\n${path}`, {\n cookie: { name: parsed.name, value: parsed.value, domain, path },\n expired,\n })\n }\n\n const upserts: ResponseCookieAction[] = []\n const deletes: ResponseCookieAction[] = []\n\n for (const { cookie, expired } of resolved.values()) {\n const index = documentCookies.findIndex((existing) => isSameCookie(cookie, existing))\n\n if (expired) {\n if (index !== -1) {\n deletes.push({ type: 'delete', cookieName: cookie.name, index })\n }\n continue\n }\n\n upserts.push({\n type: 'upsert',\n cookie,\n ...(index === -1 ? {} : { index }),\n })\n }\n\n /**\n * Apply index-based changes (updates and deletes) before appends, and process\n * deletes from the highest index down, so earlier indices stay valid as the\n * underlying array shrinks.\n */\n const indexed = [...upserts.filter((action) => action.index !== undefined), ...deletes].sort(\n (a, b) => (b.index ?? 0) - (a.index ?? 0),\n )\n const appends = upserts.filter((action) => action.index === undefined)\n\n return [...indexed, ...appends]\n}\n"],"mappings":";;;;;;;AA6BA,IAAa,uBAAuB,eAA+B;CACjE,IAAI;EAGF,OAAO,IAAI,IAAI,UAAU,CAAC,CAAC,aAAa,IAAI,YAAY,KAAK;CAC/D,QAAQ;EACN,OAAO;CACT;AACF;;;;;;AAOA,IAAM,kBAAkB,aAA6B;CACnD,IAAI,CAAC,SAAS,WAAW,GAAG,GAC1B,OAAO;CAGT,MAAM,YAAY,SAAS,YAAY,GAAG;CAE1C,OAAO,aAAa,IAAI,MAAM,SAAS,MAAM,GAAG,SAAS;AAC3D;;;;;;;AAQA,IAAM,mBAAmB,eAAkE;CACzF,IAAI;EACF,MAAM,EAAE,UAAU,aAAa,IAAI,IAAI,YAAY,qBAAqB;EAExE,OAAO;GAAE;GAAU,aAAa,eAAe,QAAQ;EAAE;CAC3D,QAAQ;EACN,OAAO;GAAE,UAAU;GAAI,aAAa;EAAI;CAC1C;AACF;;AAGA,IAAM,gBAAgB,GAAoD,MACxE,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,SAAS,EAAE,UAAU,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;AAsB9F,IAAa,4BAA4B,EACvC,kBACA,iBACA,YACA,MAAM,KAAK,IAAI,QAMa;CAC5B,MAAM,EAAE,UAAU,gBAAgB,gBAAgB,UAAU;;;;;;;;CAS5D,MAAM,2BAAW,IAAI,IAGnB;CAEF,KAAK,MAAM,UAAU,kBAAkB;EAErC,MAAM,CAAC,UAAU,eAAe,MAAM;EAEtC,IAAI,CAAC,QAAQ,MACX;EAIF,MAAM,SAAS,OAAO,UAAU;EAChC,MAAM,OAAO,OAAO,QAAQ;EAG5B,MAAM,UACJ,OAAO,WAAW,KAAA,IACd,OAAO,UAAU,IACjB,OAAO,mBAAmB,QAAQ,OAAO,QAAQ,QAAQ,KAAK;EAEpE,SAAS,IAAI,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI,QAAQ;GACjD,QAAQ;IAAE,MAAM,OAAO;IAAM,OAAO,OAAO;IAAO;IAAQ;GAAK;GAC/D;EACF,CAAC;CACH;CAEA,MAAM,UAAkC,CAAC;CACzC,MAAM,UAAkC,CAAC;CAEzC,KAAK,MAAM,EAAE,QAAQ,aAAa,SAAS,OAAO,GAAG;EACnD,MAAM,QAAQ,gBAAgB,WAAW,aAAa,aAAa,QAAQ,QAAQ,CAAC;EAEpF,IAAI,SAAS;GACX,IAAI,UAAU,IACZ,QAAQ,KAAK;IAAE,MAAM;IAAU,YAAY,OAAO;IAAM;GAAM,CAAC;GAEjE;EACF;EAEA,QAAQ,KAAK;GACX,MAAM;GACN;GACA,GAAI,UAAU,KAAK,CAAC,IAAI,EAAE,MAAM;EAClC,CAAC;CACH;;;;;;CAOA,MAAM,UAAU,CAAC,GAAG,QAAQ,QAAQ,WAAW,OAAO,UAAU,KAAA,CAAS,GAAG,GAAG,OAAO,CAAC,CAAC,MACrF,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EACzC;CACA,MAAM,UAAU,QAAQ,QAAQ,WAAW,OAAO,UAAU,KAAA,CAAS;CAErE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO;AAChC"}
@@ -17,7 +17,7 @@ var validatePathParameters = (parameters = [], exampleKey = "default") => {
17
17
  const invalidParams = [];
18
18
  for (const referencedParam of parameters) {
19
19
  const param = getResolvedRef(referencedParam);
20
- if (!param || param.in !== "path") continue;
20
+ if (param?.in !== "path") continue;
21
21
  const example = getExample(param, exampleKey, void 0);
22
22
  if (isParamDisabled(param, example)) continue;
23
23
  if (isEmptyParamValue(example?.value)) invalidParams.push(param.name);
@@ -1 +1 @@
1
- {"version":3,"file":"validate-path-parameters.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/validate-path-parameters.ts"],"sourcesContent":["import { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { getExample, isParamDisabled } from '@scalar/workspace-store/request-example'\nimport type { ParameterObject, ReferenceType } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\ntype ValidatePathParametersResult = { ok: true } | { ok: false; invalidParams: string[] }\n\n/** Treats undefined, null, and blank/whitespace strings as empty. */\nconst isEmptyParamValue = (value: unknown): boolean => {\n if (value === undefined || value === null) {\n return true\n }\n if (typeof value === 'string') {\n return value.trim() === ''\n }\n return false\n}\n\n/**\n * Validates that all required path parameters have non-empty values.\n *\n * Path parameters are always required per the OpenAPI specification.\n * Returns the names of any path parameters that are missing values.\n */\nexport const validatePathParameters = (\n parameters: ReferenceType<ParameterObject>[] = [],\n exampleKey: string = 'default',\n): ValidatePathParametersResult => {\n const invalidParams: string[] = []\n\n for (const referencedParam of parameters) {\n const param = getResolvedRef(referencedParam)\n if (!param || param.in !== 'path') {\n continue\n }\n\n const example = getExample(param, exampleKey, undefined)\n if (isParamDisabled(param, example)) {\n continue\n }\n\n if (isEmptyParamValue(example?.value)) {\n invalidParams.push(param.name)\n }\n }\n\n return invalidParams.length > 0 ? { ok: false, invalidParams } : { ok: true }\n}\n"],"mappings":";;;;AAOA,IAAM,qBAAqB,UAA4B;CACrD,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,KAAK,MAAM;CAE1B,OAAO;AACT;;;;;;;AAQA,IAAa,0BACX,aAA+C,CAAC,GAChD,aAAqB,cACY;CACjC,MAAM,gBAA0B,CAAC;CAEjC,KAAK,MAAM,mBAAmB,YAAY;EACxC,MAAM,QAAQ,eAAe,eAAe;EAC5C,IAAI,CAAC,SAAS,MAAM,OAAO,QACzB;EAGF,MAAM,UAAU,WAAW,OAAO,YAAY,KAAA,CAAS;EACvD,IAAI,gBAAgB,OAAO,OAAO,GAChC;EAGF,IAAI,kBAAkB,SAAS,KAAK,GAClC,cAAc,KAAK,MAAM,IAAI;CAEjC;CAEA,OAAO,cAAc,SAAS,IAAI;EAAE,IAAI;EAAO;CAAc,IAAI,EAAE,IAAI,KAAK;AAC9E"}
1
+ {"version":3,"file":"validate-path-parameters.js","names":[],"sources":["../../../../../src/v2/blocks/operation-block/helpers/validate-path-parameters.ts"],"sourcesContent":["import { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { getExample, isParamDisabled } from '@scalar/workspace-store/request-example'\nimport type { ParameterObject, ReferenceType } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\ntype ValidatePathParametersResult = { ok: true } | { ok: false; invalidParams: string[] }\n\n/** Treats undefined, null, and blank/whitespace strings as empty. */\nconst isEmptyParamValue = (value: unknown): boolean => {\n if (value === undefined || value === null) {\n return true\n }\n if (typeof value === 'string') {\n return value.trim() === ''\n }\n return false\n}\n\n/**\n * Validates that all required path parameters have non-empty values.\n *\n * Path parameters are always required per the OpenAPI specification.\n * Returns the names of any path parameters that are missing values.\n */\nexport const validatePathParameters = (\n parameters: ReferenceType<ParameterObject>[] = [],\n exampleKey: string = 'default',\n): ValidatePathParametersResult => {\n const invalidParams: string[] = []\n\n for (const referencedParam of parameters) {\n const param = getResolvedRef(referencedParam)\n if (param?.in !== 'path') {\n continue\n }\n\n const example = getExample(param, exampleKey, undefined)\n if (isParamDisabled(param, example)) {\n continue\n }\n\n if (isEmptyParamValue(example?.value)) {\n invalidParams.push(param.name)\n }\n }\n\n return invalidParams.length > 0 ? { ok: false, invalidParams } : { ok: true }\n}\n"],"mappings":";;;;AAOA,IAAM,qBAAqB,UAA4B;CACrD,IAAI,UAAU,KAAA,KAAa,UAAU,MACnC,OAAO;CAET,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,KAAK,MAAM;CAE1B,OAAO;AACT;;;;;;;AAQA,IAAa,0BACX,aAA+C,CAAC,GAChD,aAAqB,cACY;CACjC,MAAM,gBAA0B,CAAC;CAEjC,KAAK,MAAM,mBAAmB,YAAY;EACxC,MAAM,QAAQ,eAAe,eAAe;EAC5C,IAAI,OAAO,OAAO,QAChB;EAGF,MAAM,UAAU,WAAW,OAAO,YAAY,KAAA,CAAS;EACvD,IAAI,gBAAgB,OAAO,OAAO,GAChC;EAGF,IAAI,kBAAkB,SAAS,KAAK,GAClC,cAAc,KAAK,MAAM,IAAI;CAEjC;CAEA,OAAO,cAAc,SAAS,IAAI;EAAE,IAAI;EAAO;CAAc,IAAI,EAAE,IAAI,KAAK;AAC9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBlock.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"names":[],"mappings":"AAq2BA,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;AAMjG,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,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+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;AA4/BD,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":"AAw2BA,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;AAMjG,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,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+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;AAigCD,QAAA,MAAM,YAAY,8SAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
2
2
  import RequestBlock_vue_vue_type_script_setup_true_lang_default from "./RequestBlock.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/v2/blocks/request-block/RequestBlock.vue
5
- var RequestBlock_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RequestBlock_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-5bf07c90"]]);
5
+ var RequestBlock_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RequestBlock_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-a55ce987"]]);
6
6
  //#endregion
7
7
  export { RequestBlock_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBlock.vue.js","names":[],"sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ClientOptionGroup } from '@scalar/blocks/code-example'\nimport { ScalarErrorBoundary } from '@scalar/components/error-boundary'\nimport { canMethodHaveBody } from '@scalar/helpers/http/can-method-have-body'\nimport { REGEX } from '@scalar/helpers/regex/regex-helpers'\nimport { replaceEnvVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n AuthMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { getUniqueExampleName } from '@scalar/workspace-store/navigation'\nimport {\n filterGlobalCookie,\n getEnvironmentVariables,\n getResolvedUrl,\n getSchemaExampleFromBody,\n type MergedSecuritySchemes,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n OperationObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed, provide, ref, useId, watch } from 'vue'\n\nimport SectionFilter from '@/components/SectionFilter.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport RequestBody from '@/v2/blocks/request-block/components/RequestBody.vue'\nimport RequestCodeSnippet from '@/v2/blocks/request-block/components/RequestCodeSnippet.vue'\nimport RequestParams from '@/v2/blocks/request-block/components/RequestParams.vue'\nimport type { TableRow } from '@/v2/blocks/request-block/components/RequestTableRow.vue'\nimport { createParameterHandlers } from '@/v2/blocks/request-block/helpers/create-parameter-handlers'\nimport { createParameterRows } from '@/v2/blocks/request-block/helpers/create-parameter-rows'\nimport { groupBy } from '@/v2/blocks/request-block/helpers/group-by'\nimport { groupGlobalCookies } from '@/v2/blocks/request-block/helpers/group-global-cookies'\nimport { getStructuredBodyCodec } from '@/v2/blocks/request-block/helpers/structured-body-codec'\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { OAuth2Options } from '@/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue'\nimport {\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n type CollapsibleSectionHeadingLevel,\n} from '@/v2/components/layout'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\ntype Filter =\n | 'All'\n | 'Auth'\n | 'Variables'\n | 'Cookies'\n | 'Headers'\n | 'Query'\n | 'Body'\n\nexport type RequestBlockProps = {\n authMeta: AuthMeta\n clientOptions: ClientOptionGroup[]\n environment: XScalarEnvironment\n eventBus: WorkspaceEventBus\n exampleKey: string\n workspaceCookies: XScalarCookie[]\n documentCookies: XScalarCookie[]\n /** Slug of the document the operation belongs to */\n documentSlug: string\n layout: ClientLayout\n method: string\n operation: OperationObject\n /** Operation before downloaded examples are overlaid, for parameter edit targets. */\n sourceOperation?: OperationObject\n path: string\n plugins: ClientPlugin[]\n proxyUrl: string\n securityRequirements: OpenApiDocument['security']\n securitySchemes: MergedSecuritySchemes\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n selectedSecurity: SelectedSecurity\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n server: ServerObject | null\n defaultHeaders: Record<string, string>\n /** Initial view for structured request bodies, from the `x-scalar-default-request-body-view` document extension */\n defaultRequestBodyView?: 'form' | 'raw'\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n}\n\nconst {\n authMeta = { type: 'document' },\n clientOptions,\n environment,\n eventBus,\n exampleKey,\n workspaceCookies,\n documentCookies,\n documentSlug,\n layout,\n method,\n operation,\n sourceOperation,\n path,\n plugins,\n proxyUrl,\n requestBodyCompositionSelection,\n openapiVersion,\n securityRequirements,\n securitySchemes,\n selectedClient,\n selectedSecurity,\n selectedSecuritySchemes,\n server,\n defaultHeaders: autoGeneratedHeaders,\n defaultRequestBodyView = 'raw',\n} = defineProps<RequestBlockProps>()\n\nconst { translate } = useLocalization()\n\n/** Base name for examples created by the \"generate example from schema\" button */\nconst GENERATED_EXAMPLE_NAME = 'Generated from schema'\n\n/** Operation metadata used across event emissions */\nconst meta = computed(() => ({\n method,\n path,\n exampleKey,\n}))\n\nconst deletedExpandedParameterPaths = ref<Record<string, string[][]>>({})\n\n/** Renamed expanded rows, tracked as old-schema-path -> typed-value-path per parameter. */\nconst renamedExpandedParameterPaths = ref<\n Record<string, { from: string[]; to: string[] }[]>\n>({})\n\nconst getExpandedParameterKey = (parameter: {\n in: string\n name: string\n}): string => `${parameter.in}:${parameter.name}`\n\nconst getHiddenValuePaths = (parameter: {\n in: string\n name: string\n}): string[][] =>\n deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\nconst getRenamedValuePaths = (parameter: {\n in: string\n name: string\n}): { from: string[]; to: string[] }[] =>\n renamedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\nconst pathsEqual = (a: string[], b: string[]): boolean =>\n a.length === b.length && a.every((segment, index) => segment === b[index])\n\n/**\n * Hides the schema path of an expanded row so it does not reappear as an empty suggestion. Used\n * both when a row is deleted and when its key is renamed (the old key should not pop back up).\n */\nconst hideExpandedRowPath = (row: TableRow): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const key = getExpandedParameterKey(row.originalParameter)\n deletedExpandedParameterPaths.value = {\n ...deletedExpandedParameterPaths.value,\n [key]: [\n ...(deletedExpandedParameterPaths.value[key] ?? []),\n row.sourceParameterValuePath,\n ],\n }\n}\n\n/**\n * Records that an expanded row was renamed from its current value path to the typed one, so the\n * read side can render the renamed key in the original property's slot instead of appending it to\n * the end of the table. Repeated renames of the same row stay anchored to the original schema path.\n */\nconst recordExpandedRowRename = (\n row: TableRow,\n newValuePath: string[],\n): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const from = row.sourceParameterValuePath\n const key = getExpandedParameterKey(row.originalParameter)\n const existing = renamedExpandedParameterPaths.value[key] ?? []\n\n // If this row was already renamed, the row's current path is the previous target. Re-anchor that\n // entry to the new target so a second rename does not create an orphaned mapping.\n const chained = existing.find((entry) => pathsEqual(entry.to, from))\n const next = chained\n ? existing.map((entry) =>\n entry === chained ? { from: entry.from, to: newValuePath } : entry,\n )\n : [...existing, { from, to: newValuePath }]\n\n renamedExpandedParameterPaths.value = {\n ...renamedExpandedParameterPaths.value,\n [key]: next,\n }\n}\n\n/** Whole-query parameters share the Query section but retain their original identity. */\nconst hasQuerystringParameter = computed(\n () =>\n operation.parameters?.some(\n (parameter) => getResolvedRef(parameter)?.in === 'querystring',\n ) ?? false,\n)\n\n/** Parameters grouped by type (path, query, header, cookie) */\nconst sections = computed(() =>\n groupBy(\n operation.parameters?.flatMap((reference, index) => {\n const param = getResolvedRef(reference)\n if (!param) return []\n return createParameterRows(param, exampleKey, {\n hiddenValuePaths:\n param.in === 'query' ? getHiddenValuePaths(param) : [],\n renamedValuePaths:\n param.in === 'query' ? getRenamedValuePaths(param) : [],\n }).map((row) => ({\n ...row,\n // Overlays retain parameter order, but their downloaded values are read-only.\n originalParameter:\n getResolvedRef(sourceOperation?.parameters?.[index]) ?? param,\n in: param.in === 'querystring' ? 'query' : param.in,\n }))\n }) ?? [],\n 'in',\n ({ in: _in, ...row }) => {\n return row\n },\n ),\n)\n\n// Generate a reverse map for fast lookup of headers by the name\nconst headersMap = computed(() =>\n groupBy(\n sections.value.header?.map((it) => ({\n ...it,\n name: it.name.toLowerCase(),\n })) ?? [],\n 'name',\n ),\n)\n\nconst defaultHeaders = computed(() => {\n const disableParameters =\n operation['x-scalar-disable-parameters']?.['default-headers']?.[\n exampleKey\n ] ?? {}\n\n const isOverridden = (name: string) => {\n const header = headersMap.value[name.toLowerCase()]?.[0]\n\n if (!header) {\n return false\n }\n\n return !header.isDisabled\n }\n\n return Object.entries(autoGeneratedHeaders).map(([name, value]) => {\n return {\n name,\n value,\n schema: undefined,\n isOverridden: isOverridden(name),\n isReadonly: true,\n isDisabled: disableParameters[name.toLowerCase()] ?? false,\n } satisfies TableRow\n })\n})\n\nconst headers = computed(() => [\n ...defaultHeaders.value,\n ...(sections.value.header ?? []),\n])\n\n/** Resolved request URL, used to filter global cookies by their domain and path. */\nconst requestCookieUrl = computed(() => {\n const environmentVariables = getEnvironmentVariables(environment)\n const resolvedUrl = getResolvedUrl({ server, path })\n return replaceEnvVariables(resolvedUrl, environmentVariables)\n})\n\n/**\n * Global cookies grouped by name. Same-named cookies collapse into a single logical cookie so\n * duplicate names no longer share one disabled state (which made toggling one toggle them all).\n * A name with multiple values becomes a preset the user can switch between.\n */\nconst globalCookieGroups = computed(() =>\n groupGlobalCookies({\n sources: [\n { location: 'workspace', cookies: workspaceCookies },\n { location: 'document', cookies: documentCookies },\n ],\n // Keep domain/path filtering but ignore the disabled flag, so a disabled preset value stays\n // selectable in the switcher (it is only hidden from the request, not from the dropdown).\n shouldInclude: (cookie) =>\n filterGlobalCookie({\n cookie: { ...cookie, isDisabled: false },\n url: requestCookieUrl.value,\n disabledGlobalCookies: {},\n }),\n }),\n)\n\nconst defaultCookies = computed<TableRow[]>(() => {\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[\n exampleKey\n ] ?? {}\n\n return globalCookieGroups.value.map((group) => ({\n name: group.name,\n value: group.selectedValue,\n globalRoute: { page: group.location, path: 'cookies' } as const,\n isReadonly: true,\n isDisabled: disabledGlobalCookies[group.name.toLowerCase()] ?? false,\n presetOptions: group.isPreset ? group.options : undefined,\n }))\n})\n\n/**\n * Switch a grouped global cookie preset to the chosen value by enabling the matching sibling and\n * disabling the rest. Selection is written back to the source `x-scalar-cookies` list so it\n * persists, and the send path drops disabled cookies, so only the selected value is sent.\n */\nconst handleSelectCookiePreset = (index: number, value: string): void => {\n const group = globalCookieGroups.value[index]\n if (!group) {\n return\n }\n\n for (const sibling of group.siblings) {\n eventBus.emit('cookie:upsert:cookie', {\n collectionType: sibling.location,\n index: sibling.index,\n payload: { isDisabled: sibling.value !== value },\n })\n }\n}\n\nconst cookies = computed(() => [\n ...(defaultCookies.value ?? []),\n ...(sections.value.cookie ?? []),\n])\n\n/** Currently selected filter for the request sections */\nconst selectedFilter = ref<Filter>('All')\n\n/** Available operation sections */\nconst OPERATION_SECTIONS: readonly Filter[] = [\n 'Auth',\n 'Variables',\n 'Cookies',\n 'Headers',\n 'Query',\n 'Body',\n] as const\n\n/**\n * Pre-generated stable IDs for all possible filter sections.\n * These are created once at setup time to avoid regenerating IDs on re-render.\n */\nconst sectionIds: Record<Filter, string> = {\n All: useId(),\n Auth: useId(),\n Variables: useId(),\n Cookies: useId(),\n Headers: useId(),\n Query: useId(),\n Body: useId(),\n}\n\n/** Filters available based on operation state */\nconst filters = computed<Filter[]>(() => {\n const availableFilters = new Set<Filter>(['All', ...OPERATION_SECTIONS])\n\n if (!sections.value.path?.length) {\n availableFilters.delete('Variables')\n }\n if (!canMethodHaveBody(method)) {\n availableFilters.delete('Body')\n }\n if (isAuthHidden.value) {\n availableFilters.delete('Auth')\n }\n\n return [...availableFilters]\n})\n\n/**\n * Map available filters to their pre-generated stable IDs.\n * Only includes IDs for filters that are currently available.\n */\nconst filterIds = computed(() =>\n filters.value.reduce<Partial<Record<Filter, string>>>((ids, section) => {\n ids[section] = sectionIds[section]\n return ids\n }, {}),\n)\n\n/**\n * Hide auth selector in readonly mode when no security schemes are defined.\n * This keeps the UI clean when there are no authentication options available.\n */\nconst isAuthHidden = computed(\n () => layout === 'modal' && !Object.keys(securitySchemes ?? {}).length,\n)\n\n/**\n * Keep auth available for unauthenticated operations, but collapse it by default\n * in readonly modal layouts unless a requirement or manual selection exists.\n */\nconst isAuthDefaultOpen = computed(\n () =>\n layout !== 'modal' ||\n Boolean(\n securityRequirements?.length || selectedSecurity.selectedSchemes.length,\n ),\n)\n\n/** Get a sensible placeholder for the request name input */\nconst requestNamePlaceholder = computed(() => {\n if (operation.summary) {\n return operation.summary\n }\n const cleanPath = path.replace(REGEX.PROTOCOL, '')\n return cleanPath || translate('apiClient.requestBlock.requestName')\n})\n\n/** Check if the section should be shown based on the selected filter */\nconst isSectionVisible = (section: Filter): boolean => {\n return selectedFilter.value === 'All' || selectedFilter.value === section\n}\n\n/**\n * Reset filter to 'All' if Body filter is selected but method changes to one that cannot have a body.\n * This prevents showing an empty Body section when switching methods.\n */\nwatch(\n () => method,\n (newMethod) => {\n if (selectedFilter.value === 'Body' && !canMethodHaveBody(newMethod)) {\n selectedFilter.value = 'All'\n }\n },\n)\n\n// Expanded-row bookkeeping is keyed by `in:name`, which is not unique across operations or\n// examples. Reset both maps when the operation or example changes so stale delete/rename mappings\n// do not leak onto another request that happens to share a query parameter name.\nwatch(\n () => [method, path, exampleKey],\n () => {\n deletedExpandedParameterPaths.value = {}\n renamedExpandedParameterPaths.value = {}\n },\n)\n\n/** Handle operation summary updates */\nconst handleSummaryUpdate = (event: Event): void => {\n if (!(event.target instanceof HTMLInputElement)) {\n return\n }\n const summary = event.target.value\n eventBus.emit('operation:update:meta', {\n meta: meta.value,\n payload: { summary: summary.trim() },\n })\n}\n\n/** Parameter handlers */\nconst parameterHandlers = computed(() => ({\n path: createParameterHandlers('path', eventBus, meta.value, {\n context: sections.value.path ?? [],\n }),\n cookie: {\n ...createParameterHandlers('cookie', eventBus, meta.value, {\n context: cookies.value ?? [],\n globalParameters: defaultCookies.value.length,\n }),\n selectPreset: handleSelectCookiePreset,\n },\n header: createParameterHandlers('header', eventBus, meta.value, {\n context: headers.value,\n defaultParameters: defaultHeaders.value.length,\n }),\n query: createParameterHandlers('query', eventBus, meta.value, {\n context: sections.value.query ?? [],\n onDeleteExpandedRow: hideExpandedRowPath,\n onRenameExpandedRow: recordExpandedRowRename,\n }),\n}))\n\n/** Handle request body content type update */\nconst handleUpdateContentType = (payload: { value: string }): void =>\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType: payload.value },\n meta: meta.value,\n })\n\n/** Handle request body value update */\nconst handleUpdateBodyValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:value'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey =\n typeof payload === 'string'\n ? `update:requestBody:value-${contentType}`\n : undefined\n\n eventBus.emit(\n 'operation:update:requestBody:value',\n {\n payload,\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/** Handle request body value update */\nconst handleUpdateBodyFormValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:formValue'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey = `update:requestBody:${contentType}-form-value`\n\n eventBus.emit(\n 'operation:update:requestBody:formValue',\n {\n payload: payload.map((row) => unpackProxyObject(row, { depth: 1 })),\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/**\n * Create a new example seeded with values generated from the request body schema.\n *\n * Custom examples in the document otherwise hide the auto-generated fields entirely. Rather than\n * only rendering the generated body, we write it into a fresh example so the user can edit it and\n * so it survives an export of the document.\n */\nconst handleGenerateExample = ({\n contentType,\n}: {\n contentType: string\n}): void => {\n const requestBody = getResolvedRef(operation.requestBody)\n const codec = getStructuredBodyCodec(contentType)\n if (!requestBody || !codec) {\n return\n }\n\n const value = getSchemaExampleFromBody(\n requestBody,\n contentType,\n requestBodyCompositionSelection,\n )\n\n // A schema that generates nothing writable would leave the user on an empty new example.\n if (value === undefined || value === null) {\n return\n }\n\n const exampleName = getUniqueExampleName(operation, GENERATED_EXAMPLE_NAME)\n const exampleMeta = { path, method, exampleKey: exampleName }\n\n eventBus.emit('operation:create:draft-example', {\n documentName: documentSlug,\n meta: { path, method },\n exampleName,\n })\n\n // Carry over the content type the user was looking at, otherwise the new example opens on\n // whichever content type happens to come first on the request body.\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType },\n meta: exampleMeta,\n })\n\n eventBus.emit('operation:update:requestBody:value', {\n payload: codec.stringify(value),\n contentType,\n meta: exampleMeta,\n })\n\n // The modal selects the example after its creation hook rebuilds the sidebar.\n if (layout === 'modal') {\n return\n }\n\n eventBus.emit('ui:navigate', {\n page: 'example',\n documentSlug,\n path,\n method,\n exampleName,\n })\n}\n\nconst labelRequestNameId = useId()\n\n/**\n * Where the collapsible sections below sit in the heading outline.\n *\n * The modal renders the operation summary as a heading above them, so they are\n * its subsections. Every other layout shows the summary as an editable input\n * rather than a heading, which leaves the sections at the top level.\n */\nprovide(\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n computed<CollapsibleSectionHeadingLevel>(() =>\n layout === 'modal' && operation.summary ? 3 : 2,\n ),\n)\n\nconst globalCookies = computed(() => [...workspaceCookies, ...documentCookies])\n\n/** Allow updating the operation extensions for the plugins */\nconst updateOperationExtension = (\n payload: ApiReferenceEvents['operation:update:extension']['payload'],\n): void =>\n eventBus.emit('operation:update:extension', { payload, meta: meta.value })\n\nconst filterLabels = computed(() => ({\n All: translate('apiClient.sectionFilter.all'),\n Auth: translate('apiClient.sectionFilter.auth'),\n Variables: translate('apiClient.sectionFilter.variables'),\n Cookies: translate('apiClient.sectionFilter.cookies'),\n Headers: translate('apiClient.sectionFilter.headers'),\n Query: translate('apiClient.sectionFilter.query'),\n Body: translate('apiClient.sectionFilter.body'),\n}))\n</script>\n<template>\n <ViewLayoutSection\n :aria-label=\"\n translate('apiClient.requestBlock.label', {\n name: operation.summary ?? '',\n })\n \">\n <template #title>\n <div\n class=\"group pointer-events-none flex flex-1 items-center gap-1 lg:pe-24\">\n <label\n v-if=\"layout !== 'modal'\"\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"labelRequestNameId\" />\n <input\n v-if=\"layout !== 'modal'\"\n :id=\"labelRequestNameId\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative z-10 -ml-0.5 h-8 w-full rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"requestNamePlaceholder\"\n :value=\"operation.summary\"\n @blur=\"handleSummaryUpdate\" />\n <!-- In the modal the summary is the title of everything below it, so\n it carries the heading role that lets screen reader users jump to\n it. An operation without a summary renders nothing, because an\n empty heading is worse than none. -->\n <h2\n v-else-if=\"operation.summary\"\n class=\"text-c-1 flex h-8 items-center\">\n {{ operation.summary }}\n </h2>\n <span\n v-else\n class=\"text-c-1 flex h-8 items-center\" />\n </div>\n <SectionFilter\n v-model=\"selectedFilter\"\n :filters=\"filters\"\n :labels=\"filterLabels\" />\n </template>\n\n <div\n :id=\"filterIds.All\"\n class=\"request-section-content custom-scroll relative flex flex-1 flex-col\"\n :role=\"selectedFilter === 'All' ? 'tabpanel' : 'none'\">\n <!-- Auth Selector -->\n <AuthSelector\n v-show=\"isSectionVisible('Auth') && !isAuthHidden\"\n :id=\"filterIds.Auth\"\n :createAnySecurityScheme=\"layout !== 'modal'\"\n :defaultOpen=\"isAuthDefaultOpen\"\n :environment\n :eventBus\n :meta=\"authMeta\"\n :options\n :proxyUrl\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :selectedSecuritySchemes\n :server\n :title=\"translate('apiClient.requestBlock.authentication')\" />\n\n <!-- Variables (Path Parameters) -->\n <RequestParams\n v-show=\"isSectionVisible('Variables') && sections.path?.length\"\n :id=\"filterIds.Variables\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.path ?? []\"\n :showAddRowPlaceholder=\"false\"\n :title=\"translate('apiClient.requestBlock.variables')\"\n v-on=\"parameterHandlers.path\" />\n\n <!-- Cookies -->\n <RequestParams\n v-show=\"isSectionVisible('Cookies')\"\n :id=\"filterIds.Cookies\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"cookies ?? []\"\n :showAddRowPlaceholder=\"true\"\n :title=\"translate('apiClient.requestBlock.cookies')\"\n v-on=\"parameterHandlers.cookie\" />\n\n <!-- Headers -->\n <RequestParams\n v-show=\"isSectionVisible('Headers')\"\n :id=\"filterIds.Headers\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"headers ?? []\"\n :title=\"translate('apiClient.requestBlock.headers')\"\n v-on=\"parameterHandlers.header\" />\n\n <!-- Query Parameters -->\n <RequestParams\n v-show=\"isSectionVisible('Query')\"\n :id=\"filterIds.Query\"\n :description=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryStringDescription')\n : undefined\n \"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.query ?? []\"\n :showAddRowPlaceholder=\"!hasQuerystringParameter\"\n :title=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryString')\n : translate('apiClient.requestBlock.queryParameters')\n \"\n v-on=\"parameterHandlers.query\" />\n\n <!-- Request Body -->\n <RequestBody\n v-show=\"isSectionVisible('Body') && canMethodHaveBody(method)\"\n :id=\"filterIds.Body\"\n :defaultView=\"defaultRequestBodyView\"\n :environment\n :exampleKey\n :openapiVersion\n :requestBody=\"getResolvedRef(operation.requestBody)\"\n :requestBodyCompositionSelection\n :title=\"translate('apiClient.requestBlock.requestBody')\"\n @generate:example=\"handleGenerateExample\"\n @update:contentType=\"handleUpdateContentType\"\n @update:formValue=\"handleUpdateBodyFormValue\"\n @update:value=\"handleUpdateBodyValue\" />\n\n <!-- Inject request section plugin components -->\n <ScalarErrorBoundary\n v-for=\"(plugin, index) in plugins\"\n :key=\"index\">\n <component\n :is=\"plugin.components.request.component\"\n v-if=\"plugin?.components?.request\"\n v-show=\"selectedFilter === 'All'\"\n :operation\n v-bind=\"plugin.components.request.additionalProps\"\n @operation:update:extension=\"updateOperationExtension\" />\n </ScalarErrorBoundary>\n\n <!-- Spacer -->\n <div class=\"flex grow\" />\n <!-- Code Snippet -->\n <RequestCodeSnippet\n v-show=\"selectedFilter === 'All'\"\n :clientOptions\n :eventBus\n :globalCookies\n integration=\"client\"\n :method\n :openapiVersion\n :operation\n :path\n :requestBodyCompositionSelection\n :securitySchemes=\"selectedSecuritySchemes\"\n :selectedClient\n :selectedContentType=\"\n getResolvedRef(operation.requestBody)?.[\n 'x-scalar-selected-content-type'\n ]?.[exampleKey]\n \"\n :selectedExample=\"exampleKey\"\n :selectedServer=\"server ?? undefined\" />\n </div>\n </ViewLayoutSection>\n</template>\n<style scoped>\n.request-section-content {\n --scalar-border-width: 0.5px;\n}\n.request-section-content-filter {\n box-shadow: 0 -10px 0 10px var(--scalar-background-1);\n}\n.request-item:focus-within .request-meta-buttons {\n opacity: 1;\n}\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"RequestBlock.vue.js","names":[],"sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ClientOptionGroup } from '@scalar/blocks/code-example'\nimport { ScalarErrorBoundary } from '@scalar/components/error-boundary'\nimport { canMethodHaveBody } from '@scalar/helpers/http/can-method-have-body'\nimport { REGEX } from '@scalar/helpers/regex/regex-helpers'\nimport { replaceEnvVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n AuthMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { getUniqueExampleName } from '@scalar/workspace-store/navigation'\nimport {\n filterGlobalCookie,\n getEnvironmentVariables,\n getResolvedUrl,\n getSchemaExampleFromBody,\n type MergedSecuritySchemes,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n OperationObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed, provide, ref, useId, watch } from 'vue'\n\nimport SectionFilter from '@/components/SectionFilter.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport RequestBody from '@/v2/blocks/request-block/components/RequestBody.vue'\nimport RequestCodeSnippet from '@/v2/blocks/request-block/components/RequestCodeSnippet.vue'\nimport RequestParams from '@/v2/blocks/request-block/components/RequestParams.vue'\nimport type { TableRow } from '@/v2/blocks/request-block/components/RequestTableRow.vue'\nimport { createParameterHandlers } from '@/v2/blocks/request-block/helpers/create-parameter-handlers'\nimport { createParameterRows } from '@/v2/blocks/request-block/helpers/create-parameter-rows'\nimport { groupBy } from '@/v2/blocks/request-block/helpers/group-by'\nimport { groupGlobalCookies } from '@/v2/blocks/request-block/helpers/group-global-cookies'\nimport { getStructuredBodyCodec } from '@/v2/blocks/request-block/helpers/structured-body-codec'\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { OAuth2Options } from '@/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue'\nimport {\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n type CollapsibleSectionHeadingLevel,\n} from '@/v2/components/layout'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\ntype Filter =\n | 'All'\n | 'Auth'\n | 'Variables'\n | 'Cookies'\n | 'Headers'\n | 'Query'\n | 'Body'\n\nexport type RequestBlockProps = {\n authMeta: AuthMeta\n clientOptions: ClientOptionGroup[]\n environment: XScalarEnvironment\n eventBus: WorkspaceEventBus\n exampleKey: string\n workspaceCookies: XScalarCookie[]\n documentCookies: XScalarCookie[]\n /** Slug of the document the operation belongs to */\n documentSlug: string\n layout: ClientLayout\n method: string\n operation: OperationObject\n /** Operation before downloaded examples are overlaid, for parameter edit targets. */\n sourceOperation?: OperationObject\n path: string\n plugins: ClientPlugin[]\n proxyUrl: string\n securityRequirements: OpenApiDocument['security']\n securitySchemes: MergedSecuritySchemes\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n selectedSecurity: SelectedSecurity\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n server: ServerObject | null\n defaultHeaders: Record<string, string>\n /** Initial view for structured request bodies, from the `x-scalar-default-request-body-view` document extension */\n defaultRequestBodyView?: 'form' | 'raw'\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n}\n\nconst {\n authMeta = { type: 'document' },\n clientOptions,\n environment,\n eventBus,\n exampleKey,\n workspaceCookies,\n documentCookies,\n documentSlug,\n layout,\n method,\n operation,\n sourceOperation,\n path,\n plugins,\n proxyUrl,\n requestBodyCompositionSelection,\n openapiVersion,\n securityRequirements,\n securitySchemes,\n selectedClient,\n selectedSecurity,\n selectedSecuritySchemes,\n server,\n defaultHeaders: autoGeneratedHeaders,\n defaultRequestBodyView = 'raw',\n} = defineProps<RequestBlockProps>()\n\nconst { translate } = useLocalization()\n\n/** Base name for examples created by the \"generate example from schema\" button */\nconst GENERATED_EXAMPLE_NAME = 'Generated from schema'\n\n/** Operation metadata used across event emissions */\nconst meta = computed(() => ({\n method,\n path,\n exampleKey,\n}))\n\nconst deletedExpandedParameterPaths = ref<Record<string, string[][]>>({})\n\n/** Renamed expanded rows, tracked as old-schema-path -> typed-value-path per parameter. */\nconst renamedExpandedParameterPaths = ref<\n Record<string, { from: string[]; to: string[] }[]>\n>({})\n\nconst getExpandedParameterKey = (parameter: {\n in: string\n name: string\n}): string => `${parameter.in}:${parameter.name}`\n\nconst getHiddenValuePaths = (parameter: {\n in: string\n name: string\n}): string[][] =>\n deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\n/** Multi-field objects remain available in the picker; single-field objects retain ordinary deletion. */\nconst hideExpandedRowPath = (row: TableRow): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) return\n const siblings =\n sections.value.query?.filter(\n (entry) => entry.originalParameter === row.originalParameter,\n ) ?? []\n if (siblings.length > 1) return\n const key = getExpandedParameterKey(row.originalParameter)\n deletedExpandedParameterPaths.value = {\n ...deletedExpandedParameterPaths.value,\n [key]: [\n ...(deletedExpandedParameterPaths.value[key] ?? []),\n row.sourceParameterValuePath,\n ],\n }\n}\n\nconst getRenamedValuePaths = (parameter: {\n in: string\n name: string\n}): { from: string[]; to: string[] }[] =>\n renamedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\nconst pathsEqual = (a: string[], b: string[]): boolean =>\n a.length === b.length && a.every((segment, index) => segment === b[index])\n\n/**\n * Records that an expanded row was renamed from its current value path to the typed one, so the\n * read side can render the renamed key in the original property's slot instead of appending it to\n * the end of the table. Repeated renames of the same row stay anchored to the original schema path.\n */\nconst recordExpandedRowRename = (\n row: TableRow,\n newValuePath: string[],\n): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const from = row.sourceParameterValuePath\n const key = getExpandedParameterKey(row.originalParameter)\n const existing = renamedExpandedParameterPaths.value[key] ?? []\n\n // If this row was already renamed, the row's current path is the previous target. Re-anchor that\n // entry to the new target so a second rename does not create an orphaned mapping.\n const chained = existing.find((entry) => pathsEqual(entry.to, from))\n const next = chained\n ? existing.map((entry) =>\n entry === chained ? { from: entry.from, to: newValuePath } : entry,\n )\n : [...existing, { from, to: newValuePath }]\n\n renamedExpandedParameterPaths.value = {\n ...renamedExpandedParameterPaths.value,\n [key]: next,\n }\n}\n\n/** Whole-query parameters share the Query section but retain their original identity. */\nconst hasQuerystringParameter = computed(\n () =>\n operation.parameters?.some(\n (parameter) => getResolvedRef(parameter)?.in === 'querystring',\n ) ?? false,\n)\n\n/** Parameters grouped by type (path, query, header, cookie) */\nconst sections = computed(() =>\n groupBy(\n operation.parameters?.flatMap((reference, index) => {\n const param = getResolvedRef(reference)\n if (!param) {\n return []\n }\n return createParameterRows(param, exampleKey, {\n hiddenValuePaths:\n param.in === 'query' ? getHiddenValuePaths(param) : [],\n renamedValuePaths:\n param.in === 'query' ? getRenamedValuePaths(param) : [],\n }).map((row) => ({\n ...row,\n // Overlays retain parameter order, but their downloaded values are read-only.\n originalParameter:\n getResolvedRef(sourceOperation?.parameters?.[index]) ?? param,\n in: param.in === 'querystring' ? 'query' : param.in,\n }))\n }) ?? [],\n 'in',\n ({ in: _in, ...row }) => {\n return row\n },\n ),\n)\n\n// Generate a reverse map for fast lookup of headers by the name\nconst headersMap = computed(() =>\n groupBy(\n sections.value.header?.map((it) => ({\n ...it,\n name: it.name.toLowerCase(),\n })) ?? [],\n 'name',\n ),\n)\n\nconst defaultHeaders = computed(() => {\n const disableParameters =\n operation['x-scalar-disable-parameters']?.['default-headers']?.[\n exampleKey\n ] ?? {}\n\n const isOverridden = (name: string) => {\n const header = headersMap.value[name.toLowerCase()]?.[0]\n\n if (!header) {\n return false\n }\n\n return !header.isDisabled\n }\n\n return Object.entries(autoGeneratedHeaders).map(([name, value]) => {\n return {\n name,\n value,\n schema: undefined,\n isOverridden: isOverridden(name),\n isReadonly: true,\n isDisabled: disableParameters[name.toLowerCase()] ?? false,\n } satisfies TableRow\n })\n})\n\nconst headers = computed(() => [\n ...defaultHeaders.value,\n ...(sections.value.header ?? []),\n])\n\n/** Resolved request URL, used to filter global cookies by their domain and path. */\nconst requestCookieUrl = computed(() => {\n const environmentVariables = getEnvironmentVariables(environment)\n const resolvedUrl = getResolvedUrl({ server, path })\n return replaceEnvVariables(resolvedUrl, environmentVariables)\n})\n\n/**\n * Global cookies grouped by name. Same-named cookies collapse into a single logical cookie so\n * duplicate names no longer share one disabled state (which made toggling one toggle them all).\n * A name with multiple values becomes a preset the user can switch between.\n */\nconst globalCookieGroups = computed(() =>\n groupGlobalCookies({\n sources: [\n { location: 'workspace', cookies: workspaceCookies },\n { location: 'document', cookies: documentCookies },\n ],\n // Keep domain/path filtering but ignore the disabled flag, so a disabled preset value stays\n // selectable in the switcher (it is only hidden from the request, not from the dropdown).\n shouldInclude: (cookie) =>\n filterGlobalCookie({\n cookie: { ...cookie, isDisabled: false },\n url: requestCookieUrl.value,\n disabledGlobalCookies: {},\n }),\n }),\n)\n\nconst defaultCookies = computed<TableRow[]>(() => {\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[\n exampleKey\n ] ?? {}\n\n return globalCookieGroups.value.map((group) => ({\n name: group.name,\n value: group.selectedValue,\n globalRoute: { page: group.location, path: 'cookies' } as const,\n isReadonly: true,\n isDisabled: disabledGlobalCookies[group.name.toLowerCase()] ?? false,\n presetOptions: group.isPreset ? group.options : undefined,\n }))\n})\n\n/**\n * Switch a grouped global cookie preset to the chosen value by enabling the matching sibling and\n * disabling the rest. Selection is written back to the source `x-scalar-cookies` list so it\n * persists, and the send path drops disabled cookies, so only the selected value is sent.\n */\nconst handleSelectCookiePreset = (index: number, value: string): void => {\n const group = globalCookieGroups.value[index]\n if (!group) {\n return\n }\n\n for (const sibling of group.siblings) {\n eventBus.emit('cookie:upsert:cookie', {\n collectionType: sibling.location,\n index: sibling.index,\n payload: { isDisabled: sibling.value !== value },\n })\n }\n}\n\nconst cookies = computed(() => [\n ...(defaultCookies.value ?? []),\n ...(sections.value.cookie ?? []),\n])\n\n/** Currently selected filter for the request sections */\nconst selectedFilter = ref<Filter>('All')\n\n/** Available operation sections */\nconst OPERATION_SECTIONS: readonly Filter[] = [\n 'Auth',\n 'Variables',\n 'Cookies',\n 'Headers',\n 'Query',\n 'Body',\n] as const\n\n/**\n * Pre-generated stable IDs for all possible filter sections.\n * These are created once at setup time to avoid regenerating IDs on re-render.\n */\nconst sectionIds: Record<Filter, string> = {\n All: useId(),\n Auth: useId(),\n Variables: useId(),\n Cookies: useId(),\n Headers: useId(),\n Query: useId(),\n Body: useId(),\n}\n\n/** Filters available based on operation state */\nconst filters = computed<Filter[]>(() => {\n const availableFilters = new Set<Filter>(['All', ...OPERATION_SECTIONS])\n\n if (!sections.value.path?.length) {\n availableFilters.delete('Variables')\n }\n if (!canMethodHaveBody(method)) {\n availableFilters.delete('Body')\n }\n if (isAuthHidden.value) {\n availableFilters.delete('Auth')\n }\n\n return [...availableFilters]\n})\n\n/**\n * Map available filters to their pre-generated stable IDs.\n * Only includes IDs for filters that are currently available.\n */\nconst filterIds = computed(() =>\n filters.value.reduce<Partial<Record<Filter, string>>>((ids, section) => {\n ids[section] = sectionIds[section]\n return ids\n }, {}),\n)\n\n/**\n * Hide auth selector in readonly mode when no security schemes are defined.\n * This keeps the UI clean when there are no authentication options available.\n */\nconst isAuthHidden = computed(\n () => layout === 'modal' && !Object.keys(securitySchemes ?? {}).length,\n)\n\n/**\n * Keep auth available for unauthenticated operations, but collapse it by default\n * in readonly modal layouts unless a requirement or manual selection exists.\n */\nconst isAuthDefaultOpen = computed(\n () =>\n layout !== 'modal' ||\n Boolean(\n securityRequirements?.length || selectedSecurity.selectedSchemes.length,\n ),\n)\n\n/** Get a sensible placeholder for the request name input */\nconst requestNamePlaceholder = computed(() => {\n if (operation.summary) {\n return operation.summary\n }\n const cleanPath = path.replace(REGEX.PROTOCOL, '')\n return cleanPath || translate('apiClient.requestBlock.requestName')\n})\n\n/** Check if the section should be shown based on the selected filter */\nconst isSectionVisible = (section: Filter): boolean => {\n return selectedFilter.value === 'All' || selectedFilter.value === section\n}\n\n/**\n * Reset filter to 'All' if Body filter is selected but method changes to one that cannot have a body.\n * This prevents showing an empty Body section when switching methods.\n */\nwatch(\n () => method,\n (newMethod) => {\n if (selectedFilter.value === 'Body' && !canMethodHaveBody(newMethod)) {\n selectedFilter.value = 'All'\n }\n },\n)\n\n// Expanded-row bookkeeping is keyed by `in:name`, which is not unique across operations or\n// examples. Reset both maps when the operation or example changes so stale delete/rename mappings\n// do not leak onto another request that happens to share a query parameter name.\nwatch(\n () => [method, path, exampleKey],\n () => {\n deletedExpandedParameterPaths.value = {}\n renamedExpandedParameterPaths.value = {}\n },\n)\n\n/** Handle operation summary updates */\nconst handleSummaryUpdate = (event: Event): void => {\n if (!(event.target instanceof HTMLInputElement)) {\n return\n }\n const summary = event.target.value\n eventBus.emit('operation:update:meta', {\n meta: meta.value,\n payload: { summary: summary.trim() },\n })\n}\n\n/** Parameter handlers */\nconst parameterHandlers = computed(() => ({\n path: createParameterHandlers('path', eventBus, meta.value, {\n context: sections.value.path ?? [],\n }),\n cookie: {\n ...createParameterHandlers('cookie', eventBus, meta.value, {\n context: cookies.value ?? [],\n globalParameters: defaultCookies.value.length,\n }),\n selectPreset: handleSelectCookiePreset,\n },\n header: createParameterHandlers('header', eventBus, meta.value, {\n context: headers.value,\n defaultParameters: defaultHeaders.value.length,\n }),\n query: createParameterHandlers('query', eventBus, meta.value, {\n context: sections.value.query ?? [],\n onDeleteExpandedRow: hideExpandedRowPath,\n onRenameExpandedRow: recordExpandedRowRename,\n }),\n}))\n\n/** Handle request body content type update */\nconst handleUpdateContentType = (payload: { value: string }): void =>\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType: payload.value },\n meta: meta.value,\n })\n\n/** Handle request body value update */\nconst handleUpdateBodyValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:value'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey =\n typeof payload === 'string'\n ? `update:requestBody:value-${contentType}`\n : undefined\n\n eventBus.emit(\n 'operation:update:requestBody:value',\n {\n payload,\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/** Handle request body value update */\nconst handleUpdateBodyFormValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:formValue'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey = `update:requestBody:${contentType}-form-value`\n\n eventBus.emit(\n 'operation:update:requestBody:formValue',\n {\n payload: payload.map((row) => unpackProxyObject(row, { depth: 1 })),\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/**\n * Create a new example seeded with values generated from the request body schema.\n *\n * Custom examples in the document otherwise hide the auto-generated fields entirely. Rather than\n * only rendering the generated body, we write it into a fresh example so the user can edit it and\n * so it survives an export of the document.\n */\nconst handleGenerateExample = ({\n contentType,\n}: {\n contentType: string\n}): void => {\n const requestBody = getResolvedRef(operation.requestBody)\n const codec = getStructuredBodyCodec(contentType)\n if (!requestBody || !codec) {\n return\n }\n\n const value = getSchemaExampleFromBody(\n requestBody,\n contentType,\n requestBodyCompositionSelection,\n )\n\n // A schema that generates nothing writable would leave the user on an empty new example.\n if (value === undefined || value === null) {\n return\n }\n\n const exampleName = getUniqueExampleName(operation, GENERATED_EXAMPLE_NAME)\n const exampleMeta = { path, method, exampleKey: exampleName }\n\n eventBus.emit('operation:create:draft-example', {\n documentName: documentSlug,\n meta: { path, method },\n exampleName,\n })\n\n // Carry over the content type the user was looking at, otherwise the new example opens on\n // whichever content type happens to come first on the request body.\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType },\n meta: exampleMeta,\n })\n\n eventBus.emit('operation:update:requestBody:value', {\n payload: codec.stringify(value),\n contentType,\n meta: exampleMeta,\n })\n\n // The modal selects the example after its creation hook rebuilds the sidebar.\n if (layout === 'modal') {\n return\n }\n\n eventBus.emit('ui:navigate', {\n page: 'example',\n documentSlug,\n path,\n method,\n exampleName,\n })\n}\n\nconst labelRequestNameId = useId()\n\n/**\n * Where the collapsible sections below sit in the heading outline.\n *\n * The modal renders the operation summary as a heading above them, so they are\n * its subsections. Every other layout shows the summary as an editable input\n * rather than a heading, which leaves the sections at the top level.\n */\nprovide(\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n computed<CollapsibleSectionHeadingLevel>(() =>\n layout === 'modal' && operation.summary ? 3 : 2,\n ),\n)\n\nconst globalCookies = computed(() => [...workspaceCookies, ...documentCookies])\n\n/** Allow updating the operation extensions for the plugins */\nconst updateOperationExtension = (\n payload: ApiReferenceEvents['operation:update:extension']['payload'],\n): void =>\n eventBus.emit('operation:update:extension', { payload, meta: meta.value })\n\nconst filterLabels = computed(() => ({\n All: translate('apiClient.sectionFilter.all'),\n Auth: translate('apiClient.sectionFilter.auth'),\n Variables: translate('apiClient.sectionFilter.variables'),\n Cookies: translate('apiClient.sectionFilter.cookies'),\n Headers: translate('apiClient.sectionFilter.headers'),\n Query: translate('apiClient.sectionFilter.query'),\n Body: translate('apiClient.sectionFilter.body'),\n}))\n</script>\n<template>\n <ViewLayoutSection\n :aria-label=\"\n translate('apiClient.requestBlock.label', {\n name: operation.summary ?? '',\n })\n \">\n <template #title>\n <div\n class=\"group pointer-events-none flex flex-1 items-center gap-1 lg:pe-24\">\n <label\n v-if=\"layout !== 'modal'\"\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"labelRequestNameId\" />\n <input\n v-if=\"layout !== 'modal'\"\n :id=\"labelRequestNameId\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative z-10 -ml-0.5 h-8 w-full rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"requestNamePlaceholder\"\n :value=\"operation.summary\"\n @blur=\"handleSummaryUpdate\" />\n <!-- In the modal the summary is the title of everything below it, so\n it carries the heading role that lets screen reader users jump to\n it. An operation without a summary renders nothing, because an\n empty heading is worse than none. -->\n <h2\n v-else-if=\"operation.summary\"\n class=\"text-c-1 flex h-8 items-center\">\n {{ operation.summary }}\n </h2>\n <span\n v-else\n class=\"text-c-1 flex h-8 items-center\" />\n </div>\n <SectionFilter\n v-model=\"selectedFilter\"\n :filters=\"filters\"\n :labels=\"filterLabels\" />\n </template>\n\n <div\n :id=\"filterIds.All\"\n class=\"request-section-content custom-scroll relative flex flex-1 flex-col\"\n :role=\"selectedFilter === 'All' ? 'tabpanel' : 'none'\">\n <!-- Auth Selector -->\n <AuthSelector\n v-show=\"isSectionVisible('Auth') && !isAuthHidden\"\n :id=\"filterIds.Auth\"\n :createAnySecurityScheme=\"layout !== 'modal'\"\n :defaultOpen=\"isAuthDefaultOpen\"\n :environment\n :eventBus\n :meta=\"authMeta\"\n :options\n :proxyUrl\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :selectedSecuritySchemes\n :server\n :title=\"translate('apiClient.requestBlock.authentication')\" />\n\n <!-- Variables (Path Parameters) -->\n <RequestParams\n v-show=\"isSectionVisible('Variables') && sections.path?.length\"\n :id=\"filterIds.Variables\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.path ?? []\"\n :showAddRowPlaceholder=\"false\"\n :title=\"translate('apiClient.requestBlock.variables')\"\n v-on=\"parameterHandlers.path\" />\n\n <!-- Cookies -->\n <RequestParams\n v-show=\"isSectionVisible('Cookies')\"\n :id=\"filterIds.Cookies\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"cookies ?? []\"\n :showAddRowPlaceholder=\"true\"\n :title=\"translate('apiClient.requestBlock.cookies')\"\n v-on=\"parameterHandlers.cookie\" />\n\n <!-- Headers -->\n <RequestParams\n v-show=\"isSectionVisible('Headers')\"\n :id=\"filterIds.Headers\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"headers ?? []\"\n :title=\"translate('apiClient.requestBlock.headers')\"\n v-on=\"parameterHandlers.header\" />\n\n <!-- Query Parameters -->\n <RequestParams\n v-show=\"isSectionVisible('Query')\"\n :id=\"filterIds.Query\"\n :key=\"JSON.stringify([documentSlug, method, path, exampleKey])\"\n :description=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryStringDescription')\n : undefined\n \"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.query ?? []\"\n selectExpandedParameters\n :showAddRowPlaceholder=\"!hasQuerystringParameter\"\n :title=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryString')\n : translate('apiClient.requestBlock.queryParameters')\n \"\n v-on=\"parameterHandlers.query\" />\n\n <!-- Request Body -->\n <RequestBody\n v-show=\"isSectionVisible('Body') && canMethodHaveBody(method)\"\n :id=\"filterIds.Body\"\n :defaultView=\"defaultRequestBodyView\"\n :environment\n :exampleKey\n :openapiVersion\n :requestBody=\"getResolvedRef(operation.requestBody)\"\n :requestBodyCompositionSelection\n :title=\"translate('apiClient.requestBlock.requestBody')\"\n @generate:example=\"handleGenerateExample\"\n @update:contentType=\"handleUpdateContentType\"\n @update:formValue=\"handleUpdateBodyFormValue\"\n @update:value=\"handleUpdateBodyValue\" />\n\n <!-- Inject request section plugin components -->\n <ScalarErrorBoundary\n v-for=\"(plugin, index) in plugins\"\n :key=\"index\">\n <component\n :is=\"plugin.components.request.component\"\n v-if=\"plugin?.components?.request\"\n v-show=\"selectedFilter === 'All'\"\n :operation\n v-bind=\"plugin.components.request.additionalProps\"\n @operation:update:extension=\"updateOperationExtension\" />\n </ScalarErrorBoundary>\n\n <!-- Spacer -->\n <div class=\"flex grow\" />\n <!-- Code Snippet -->\n <RequestCodeSnippet\n v-show=\"selectedFilter === 'All'\"\n :clientOptions\n :eventBus\n :globalCookies\n integration=\"client\"\n :method\n :openapiVersion\n :operation\n :path\n :requestBodyCompositionSelection\n :securitySchemes=\"selectedSecuritySchemes\"\n :selectedClient\n :selectedContentType=\"\n getResolvedRef(operation.requestBody)?.[\n 'x-scalar-selected-content-type'\n ]?.[exampleKey]\n \"\n :selectedExample=\"exampleKey\"\n :selectedServer=\"server ?? undefined\" />\n </div>\n </ViewLayoutSection>\n</template>\n<style scoped>\n.request-section-content {\n --scalar-border-width: 0.5px;\n}\n.request-section-content-filter {\n box-shadow: 0 -10px 0 10px var(--scalar-background-1);\n}\n.request-item:focus-within .request-meta-buttons {\n opacity: 1;\n}\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n"],"mappings":""}
@@ -82,20 +82,18 @@ var RequestBlock_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
82
82
  const renamedExpandedParameterPaths = ref({});
83
83
  const getExpandedParameterKey = (parameter) => `${parameter.in}:${parameter.name}`;
84
84
  const getHiddenValuePaths = (parameter) => deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? [];
85
- const getRenamedValuePaths = (parameter) => renamedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? [];
86
- const pathsEqual = (a, b) => a.length === b.length && a.every((segment, index) => segment === b[index]);
87
- /**
88
- * Hides the schema path of an expanded row so it does not reappear as an empty suggestion. Used
89
- * both when a row is deleted and when its key is renamed (the old key should not pop back up).
90
- */
85
+ /** Multi-field objects remain available in the picker; single-field objects retain ordinary deletion. */
91
86
  const hideExpandedRowPath = (row) => {
92
87
  if (!row.originalParameter || !row.sourceParameterValuePath) return;
88
+ if ((sections.value.query?.filter((entry) => entry.originalParameter === row.originalParameter) ?? []).length > 1) return;
93
89
  const key = getExpandedParameterKey(row.originalParameter);
94
90
  deletedExpandedParameterPaths.value = {
95
91
  ...deletedExpandedParameterPaths.value,
96
92
  [key]: [...deletedExpandedParameterPaths.value[key] ?? [], row.sourceParameterValuePath]
97
93
  };
98
94
  };
95
+ const getRenamedValuePaths = (parameter) => renamedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? [];
96
+ const pathsEqual = (a, b) => a.length === b.length && a.every((segment, index) => segment === b[index]);
99
97
  /**
100
98
  * Records that an expanded row was renamed from its current value path to the typed one, so the
101
99
  * read side can render the renamed key in the original property's slot instead of appending it to
@@ -519,13 +517,20 @@ var RequestBlock_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
519
517
  "rows",
520
518
  "title"
521
519
  ]), [[vShow, isSectionVisible("Headers")]]),
522
- withDirectives(createVNode(RequestParams_default, mergeProps({
520
+ withDirectives((openBlock(), createBlock(RequestParams_default, mergeProps({
523
521
  id: filterIds.value.Query,
522
+ key: JSON.stringify([
523
+ __props.documentSlug,
524
+ __props.method,
525
+ __props.path,
526
+ __props.exampleKey
527
+ ]),
524
528
  description: hasQuerystringParameter.value ? unref(translate)("apiClient.requestBlock.queryStringDescription") : void 0,
525
529
  environment: __props.environment,
526
530
  eventBus: __props.eventBus,
527
531
  exampleKey: __props.exampleKey,
528
532
  rows: sections.value.query ?? [],
533
+ selectExpandedParameters: "",
529
534
  showAddRowPlaceholder: !hasQuerystringParameter.value,
530
535
  title: hasQuerystringParameter.value ? unref(translate)("apiClient.requestBlock.queryString") : unref(translate)("apiClient.requestBlock.queryParameters")
531
536
  }, toHandlers(parameterHandlers.value.query)), null, 16, [
@@ -537,7 +542,7 @@ var RequestBlock_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
537
542
  "rows",
538
543
  "showAddRowPlaceholder",
539
544
  "title"
540
- ]), [[vShow, isSectionVisible("Query")]]),
545
+ ])), [[vShow, isSectionVisible("Query")]]),
541
546
  withDirectives(createVNode(RequestBody_default, {
542
547
  id: filterIds.value.Body,
543
548
  defaultView: __props.defaultRequestBodyView,
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBlock.vue.script.js","names":[],"sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ClientOptionGroup } from '@scalar/blocks/code-example'\nimport { ScalarErrorBoundary } from '@scalar/components/error-boundary'\nimport { canMethodHaveBody } from '@scalar/helpers/http/can-method-have-body'\nimport { REGEX } from '@scalar/helpers/regex/regex-helpers'\nimport { replaceEnvVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n AuthMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { getUniqueExampleName } from '@scalar/workspace-store/navigation'\nimport {\n filterGlobalCookie,\n getEnvironmentVariables,\n getResolvedUrl,\n getSchemaExampleFromBody,\n type MergedSecuritySchemes,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n OperationObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed, provide, ref, useId, watch } from 'vue'\n\nimport SectionFilter from '@/components/SectionFilter.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport RequestBody from '@/v2/blocks/request-block/components/RequestBody.vue'\nimport RequestCodeSnippet from '@/v2/blocks/request-block/components/RequestCodeSnippet.vue'\nimport RequestParams from '@/v2/blocks/request-block/components/RequestParams.vue'\nimport type { TableRow } from '@/v2/blocks/request-block/components/RequestTableRow.vue'\nimport { createParameterHandlers } from '@/v2/blocks/request-block/helpers/create-parameter-handlers'\nimport { createParameterRows } from '@/v2/blocks/request-block/helpers/create-parameter-rows'\nimport { groupBy } from '@/v2/blocks/request-block/helpers/group-by'\nimport { groupGlobalCookies } from '@/v2/blocks/request-block/helpers/group-global-cookies'\nimport { getStructuredBodyCodec } from '@/v2/blocks/request-block/helpers/structured-body-codec'\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { OAuth2Options } from '@/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue'\nimport {\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n type CollapsibleSectionHeadingLevel,\n} from '@/v2/components/layout'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\ntype Filter =\n | 'All'\n | 'Auth'\n | 'Variables'\n | 'Cookies'\n | 'Headers'\n | 'Query'\n | 'Body'\n\nexport type RequestBlockProps = {\n authMeta: AuthMeta\n clientOptions: ClientOptionGroup[]\n environment: XScalarEnvironment\n eventBus: WorkspaceEventBus\n exampleKey: string\n workspaceCookies: XScalarCookie[]\n documentCookies: XScalarCookie[]\n /** Slug of the document the operation belongs to */\n documentSlug: string\n layout: ClientLayout\n method: string\n operation: OperationObject\n /** Operation before downloaded examples are overlaid, for parameter edit targets. */\n sourceOperation?: OperationObject\n path: string\n plugins: ClientPlugin[]\n proxyUrl: string\n securityRequirements: OpenApiDocument['security']\n securitySchemes: MergedSecuritySchemes\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n selectedSecurity: SelectedSecurity\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n server: ServerObject | null\n defaultHeaders: Record<string, string>\n /** Initial view for structured request bodies, from the `x-scalar-default-request-body-view` document extension */\n defaultRequestBodyView?: 'form' | 'raw'\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n}\n\nconst {\n authMeta = { type: 'document' },\n clientOptions,\n environment,\n eventBus,\n exampleKey,\n workspaceCookies,\n documentCookies,\n documentSlug,\n layout,\n method,\n operation,\n sourceOperation,\n path,\n plugins,\n proxyUrl,\n requestBodyCompositionSelection,\n openapiVersion,\n securityRequirements,\n securitySchemes,\n selectedClient,\n selectedSecurity,\n selectedSecuritySchemes,\n server,\n defaultHeaders: autoGeneratedHeaders,\n defaultRequestBodyView = 'raw',\n} = defineProps<RequestBlockProps>()\n\nconst { translate } = useLocalization()\n\n/** Base name for examples created by the \"generate example from schema\" button */\nconst GENERATED_EXAMPLE_NAME = 'Generated from schema'\n\n/** Operation metadata used across event emissions */\nconst meta = computed(() => ({\n method,\n path,\n exampleKey,\n}))\n\nconst deletedExpandedParameterPaths = ref<Record<string, string[][]>>({})\n\n/** Renamed expanded rows, tracked as old-schema-path -> typed-value-path per parameter. */\nconst renamedExpandedParameterPaths = ref<\n Record<string, { from: string[]; to: string[] }[]>\n>({})\n\nconst getExpandedParameterKey = (parameter: {\n in: string\n name: string\n}): string => `${parameter.in}:${parameter.name}`\n\nconst getHiddenValuePaths = (parameter: {\n in: string\n name: string\n}): string[][] =>\n deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\nconst getRenamedValuePaths = (parameter: {\n in: string\n name: string\n}): { from: string[]; to: string[] }[] =>\n renamedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\nconst pathsEqual = (a: string[], b: string[]): boolean =>\n a.length === b.length && a.every((segment, index) => segment === b[index])\n\n/**\n * Hides the schema path of an expanded row so it does not reappear as an empty suggestion. Used\n * both when a row is deleted and when its key is renamed (the old key should not pop back up).\n */\nconst hideExpandedRowPath = (row: TableRow): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const key = getExpandedParameterKey(row.originalParameter)\n deletedExpandedParameterPaths.value = {\n ...deletedExpandedParameterPaths.value,\n [key]: [\n ...(deletedExpandedParameterPaths.value[key] ?? []),\n row.sourceParameterValuePath,\n ],\n }\n}\n\n/**\n * Records that an expanded row was renamed from its current value path to the typed one, so the\n * read side can render the renamed key in the original property's slot instead of appending it to\n * the end of the table. Repeated renames of the same row stay anchored to the original schema path.\n */\nconst recordExpandedRowRename = (\n row: TableRow,\n newValuePath: string[],\n): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const from = row.sourceParameterValuePath\n const key = getExpandedParameterKey(row.originalParameter)\n const existing = renamedExpandedParameterPaths.value[key] ?? []\n\n // If this row was already renamed, the row's current path is the previous target. Re-anchor that\n // entry to the new target so a second rename does not create an orphaned mapping.\n const chained = existing.find((entry) => pathsEqual(entry.to, from))\n const next = chained\n ? existing.map((entry) =>\n entry === chained ? { from: entry.from, to: newValuePath } : entry,\n )\n : [...existing, { from, to: newValuePath }]\n\n renamedExpandedParameterPaths.value = {\n ...renamedExpandedParameterPaths.value,\n [key]: next,\n }\n}\n\n/** Whole-query parameters share the Query section but retain their original identity. */\nconst hasQuerystringParameter = computed(\n () =>\n operation.parameters?.some(\n (parameter) => getResolvedRef(parameter)?.in === 'querystring',\n ) ?? false,\n)\n\n/** Parameters grouped by type (path, query, header, cookie) */\nconst sections = computed(() =>\n groupBy(\n operation.parameters?.flatMap((reference, index) => {\n const param = getResolvedRef(reference)\n if (!param) return []\n return createParameterRows(param, exampleKey, {\n hiddenValuePaths:\n param.in === 'query' ? getHiddenValuePaths(param) : [],\n renamedValuePaths:\n param.in === 'query' ? getRenamedValuePaths(param) : [],\n }).map((row) => ({\n ...row,\n // Overlays retain parameter order, but their downloaded values are read-only.\n originalParameter:\n getResolvedRef(sourceOperation?.parameters?.[index]) ?? param,\n in: param.in === 'querystring' ? 'query' : param.in,\n }))\n }) ?? [],\n 'in',\n ({ in: _in, ...row }) => {\n return row\n },\n ),\n)\n\n// Generate a reverse map for fast lookup of headers by the name\nconst headersMap = computed(() =>\n groupBy(\n sections.value.header?.map((it) => ({\n ...it,\n name: it.name.toLowerCase(),\n })) ?? [],\n 'name',\n ),\n)\n\nconst defaultHeaders = computed(() => {\n const disableParameters =\n operation['x-scalar-disable-parameters']?.['default-headers']?.[\n exampleKey\n ] ?? {}\n\n const isOverridden = (name: string) => {\n const header = headersMap.value[name.toLowerCase()]?.[0]\n\n if (!header) {\n return false\n }\n\n return !header.isDisabled\n }\n\n return Object.entries(autoGeneratedHeaders).map(([name, value]) => {\n return {\n name,\n value,\n schema: undefined,\n isOverridden: isOverridden(name),\n isReadonly: true,\n isDisabled: disableParameters[name.toLowerCase()] ?? false,\n } satisfies TableRow\n })\n})\n\nconst headers = computed(() => [\n ...defaultHeaders.value,\n ...(sections.value.header ?? []),\n])\n\n/** Resolved request URL, used to filter global cookies by their domain and path. */\nconst requestCookieUrl = computed(() => {\n const environmentVariables = getEnvironmentVariables(environment)\n const resolvedUrl = getResolvedUrl({ server, path })\n return replaceEnvVariables(resolvedUrl, environmentVariables)\n})\n\n/**\n * Global cookies grouped by name. Same-named cookies collapse into a single logical cookie so\n * duplicate names no longer share one disabled state (which made toggling one toggle them all).\n * A name with multiple values becomes a preset the user can switch between.\n */\nconst globalCookieGroups = computed(() =>\n groupGlobalCookies({\n sources: [\n { location: 'workspace', cookies: workspaceCookies },\n { location: 'document', cookies: documentCookies },\n ],\n // Keep domain/path filtering but ignore the disabled flag, so a disabled preset value stays\n // selectable in the switcher (it is only hidden from the request, not from the dropdown).\n shouldInclude: (cookie) =>\n filterGlobalCookie({\n cookie: { ...cookie, isDisabled: false },\n url: requestCookieUrl.value,\n disabledGlobalCookies: {},\n }),\n }),\n)\n\nconst defaultCookies = computed<TableRow[]>(() => {\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[\n exampleKey\n ] ?? {}\n\n return globalCookieGroups.value.map((group) => ({\n name: group.name,\n value: group.selectedValue,\n globalRoute: { page: group.location, path: 'cookies' } as const,\n isReadonly: true,\n isDisabled: disabledGlobalCookies[group.name.toLowerCase()] ?? false,\n presetOptions: group.isPreset ? group.options : undefined,\n }))\n})\n\n/**\n * Switch a grouped global cookie preset to the chosen value by enabling the matching sibling and\n * disabling the rest. Selection is written back to the source `x-scalar-cookies` list so it\n * persists, and the send path drops disabled cookies, so only the selected value is sent.\n */\nconst handleSelectCookiePreset = (index: number, value: string): void => {\n const group = globalCookieGroups.value[index]\n if (!group) {\n return\n }\n\n for (const sibling of group.siblings) {\n eventBus.emit('cookie:upsert:cookie', {\n collectionType: sibling.location,\n index: sibling.index,\n payload: { isDisabled: sibling.value !== value },\n })\n }\n}\n\nconst cookies = computed(() => [\n ...(defaultCookies.value ?? []),\n ...(sections.value.cookie ?? []),\n])\n\n/** Currently selected filter for the request sections */\nconst selectedFilter = ref<Filter>('All')\n\n/** Available operation sections */\nconst OPERATION_SECTIONS: readonly Filter[] = [\n 'Auth',\n 'Variables',\n 'Cookies',\n 'Headers',\n 'Query',\n 'Body',\n] as const\n\n/**\n * Pre-generated stable IDs for all possible filter sections.\n * These are created once at setup time to avoid regenerating IDs on re-render.\n */\nconst sectionIds: Record<Filter, string> = {\n All: useId(),\n Auth: useId(),\n Variables: useId(),\n Cookies: useId(),\n Headers: useId(),\n Query: useId(),\n Body: useId(),\n}\n\n/** Filters available based on operation state */\nconst filters = computed<Filter[]>(() => {\n const availableFilters = new Set<Filter>(['All', ...OPERATION_SECTIONS])\n\n if (!sections.value.path?.length) {\n availableFilters.delete('Variables')\n }\n if (!canMethodHaveBody(method)) {\n availableFilters.delete('Body')\n }\n if (isAuthHidden.value) {\n availableFilters.delete('Auth')\n }\n\n return [...availableFilters]\n})\n\n/**\n * Map available filters to their pre-generated stable IDs.\n * Only includes IDs for filters that are currently available.\n */\nconst filterIds = computed(() =>\n filters.value.reduce<Partial<Record<Filter, string>>>((ids, section) => {\n ids[section] = sectionIds[section]\n return ids\n }, {}),\n)\n\n/**\n * Hide auth selector in readonly mode when no security schemes are defined.\n * This keeps the UI clean when there are no authentication options available.\n */\nconst isAuthHidden = computed(\n () => layout === 'modal' && !Object.keys(securitySchemes ?? {}).length,\n)\n\n/**\n * Keep auth available for unauthenticated operations, but collapse it by default\n * in readonly modal layouts unless a requirement or manual selection exists.\n */\nconst isAuthDefaultOpen = computed(\n () =>\n layout !== 'modal' ||\n Boolean(\n securityRequirements?.length || selectedSecurity.selectedSchemes.length,\n ),\n)\n\n/** Get a sensible placeholder for the request name input */\nconst requestNamePlaceholder = computed(() => {\n if (operation.summary) {\n return operation.summary\n }\n const cleanPath = path.replace(REGEX.PROTOCOL, '')\n return cleanPath || translate('apiClient.requestBlock.requestName')\n})\n\n/** Check if the section should be shown based on the selected filter */\nconst isSectionVisible = (section: Filter): boolean => {\n return selectedFilter.value === 'All' || selectedFilter.value === section\n}\n\n/**\n * Reset filter to 'All' if Body filter is selected but method changes to one that cannot have a body.\n * This prevents showing an empty Body section when switching methods.\n */\nwatch(\n () => method,\n (newMethod) => {\n if (selectedFilter.value === 'Body' && !canMethodHaveBody(newMethod)) {\n selectedFilter.value = 'All'\n }\n },\n)\n\n// Expanded-row bookkeeping is keyed by `in:name`, which is not unique across operations or\n// examples. Reset both maps when the operation or example changes so stale delete/rename mappings\n// do not leak onto another request that happens to share a query parameter name.\nwatch(\n () => [method, path, exampleKey],\n () => {\n deletedExpandedParameterPaths.value = {}\n renamedExpandedParameterPaths.value = {}\n },\n)\n\n/** Handle operation summary updates */\nconst handleSummaryUpdate = (event: Event): void => {\n if (!(event.target instanceof HTMLInputElement)) {\n return\n }\n const summary = event.target.value\n eventBus.emit('operation:update:meta', {\n meta: meta.value,\n payload: { summary: summary.trim() },\n })\n}\n\n/** Parameter handlers */\nconst parameterHandlers = computed(() => ({\n path: createParameterHandlers('path', eventBus, meta.value, {\n context: sections.value.path ?? [],\n }),\n cookie: {\n ...createParameterHandlers('cookie', eventBus, meta.value, {\n context: cookies.value ?? [],\n globalParameters: defaultCookies.value.length,\n }),\n selectPreset: handleSelectCookiePreset,\n },\n header: createParameterHandlers('header', eventBus, meta.value, {\n context: headers.value,\n defaultParameters: defaultHeaders.value.length,\n }),\n query: createParameterHandlers('query', eventBus, meta.value, {\n context: sections.value.query ?? [],\n onDeleteExpandedRow: hideExpandedRowPath,\n onRenameExpandedRow: recordExpandedRowRename,\n }),\n}))\n\n/** Handle request body content type update */\nconst handleUpdateContentType = (payload: { value: string }): void =>\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType: payload.value },\n meta: meta.value,\n })\n\n/** Handle request body value update */\nconst handleUpdateBodyValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:value'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey =\n typeof payload === 'string'\n ? `update:requestBody:value-${contentType}`\n : undefined\n\n eventBus.emit(\n 'operation:update:requestBody:value',\n {\n payload,\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/** Handle request body value update */\nconst handleUpdateBodyFormValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:formValue'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey = `update:requestBody:${contentType}-form-value`\n\n eventBus.emit(\n 'operation:update:requestBody:formValue',\n {\n payload: payload.map((row) => unpackProxyObject(row, { depth: 1 })),\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/**\n * Create a new example seeded with values generated from the request body schema.\n *\n * Custom examples in the document otherwise hide the auto-generated fields entirely. Rather than\n * only rendering the generated body, we write it into a fresh example so the user can edit it and\n * so it survives an export of the document.\n */\nconst handleGenerateExample = ({\n contentType,\n}: {\n contentType: string\n}): void => {\n const requestBody = getResolvedRef(operation.requestBody)\n const codec = getStructuredBodyCodec(contentType)\n if (!requestBody || !codec) {\n return\n }\n\n const value = getSchemaExampleFromBody(\n requestBody,\n contentType,\n requestBodyCompositionSelection,\n )\n\n // A schema that generates nothing writable would leave the user on an empty new example.\n if (value === undefined || value === null) {\n return\n }\n\n const exampleName = getUniqueExampleName(operation, GENERATED_EXAMPLE_NAME)\n const exampleMeta = { path, method, exampleKey: exampleName }\n\n eventBus.emit('operation:create:draft-example', {\n documentName: documentSlug,\n meta: { path, method },\n exampleName,\n })\n\n // Carry over the content type the user was looking at, otherwise the new example opens on\n // whichever content type happens to come first on the request body.\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType },\n meta: exampleMeta,\n })\n\n eventBus.emit('operation:update:requestBody:value', {\n payload: codec.stringify(value),\n contentType,\n meta: exampleMeta,\n })\n\n // The modal selects the example after its creation hook rebuilds the sidebar.\n if (layout === 'modal') {\n return\n }\n\n eventBus.emit('ui:navigate', {\n page: 'example',\n documentSlug,\n path,\n method,\n exampleName,\n })\n}\n\nconst labelRequestNameId = useId()\n\n/**\n * Where the collapsible sections below sit in the heading outline.\n *\n * The modal renders the operation summary as a heading above them, so they are\n * its subsections. Every other layout shows the summary as an editable input\n * rather than a heading, which leaves the sections at the top level.\n */\nprovide(\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n computed<CollapsibleSectionHeadingLevel>(() =>\n layout === 'modal' && operation.summary ? 3 : 2,\n ),\n)\n\nconst globalCookies = computed(() => [...workspaceCookies, ...documentCookies])\n\n/** Allow updating the operation extensions for the plugins */\nconst updateOperationExtension = (\n payload: ApiReferenceEvents['operation:update:extension']['payload'],\n): void =>\n eventBus.emit('operation:update:extension', { payload, meta: meta.value })\n\nconst filterLabels = computed(() => ({\n All: translate('apiClient.sectionFilter.all'),\n Auth: translate('apiClient.sectionFilter.auth'),\n Variables: translate('apiClient.sectionFilter.variables'),\n Cookies: translate('apiClient.sectionFilter.cookies'),\n Headers: translate('apiClient.sectionFilter.headers'),\n Query: translate('apiClient.sectionFilter.query'),\n Body: translate('apiClient.sectionFilter.body'),\n}))\n</script>\n<template>\n <ViewLayoutSection\n :aria-label=\"\n translate('apiClient.requestBlock.label', {\n name: operation.summary ?? '',\n })\n \">\n <template #title>\n <div\n class=\"group pointer-events-none flex flex-1 items-center gap-1 lg:pe-24\">\n <label\n v-if=\"layout !== 'modal'\"\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"labelRequestNameId\" />\n <input\n v-if=\"layout !== 'modal'\"\n :id=\"labelRequestNameId\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative z-10 -ml-0.5 h-8 w-full rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"requestNamePlaceholder\"\n :value=\"operation.summary\"\n @blur=\"handleSummaryUpdate\" />\n <!-- In the modal the summary is the title of everything below it, so\n it carries the heading role that lets screen reader users jump to\n it. An operation without a summary renders nothing, because an\n empty heading is worse than none. -->\n <h2\n v-else-if=\"operation.summary\"\n class=\"text-c-1 flex h-8 items-center\">\n {{ operation.summary }}\n </h2>\n <span\n v-else\n class=\"text-c-1 flex h-8 items-center\" />\n </div>\n <SectionFilter\n v-model=\"selectedFilter\"\n :filters=\"filters\"\n :labels=\"filterLabels\" />\n </template>\n\n <div\n :id=\"filterIds.All\"\n class=\"request-section-content custom-scroll relative flex flex-1 flex-col\"\n :role=\"selectedFilter === 'All' ? 'tabpanel' : 'none'\">\n <!-- Auth Selector -->\n <AuthSelector\n v-show=\"isSectionVisible('Auth') && !isAuthHidden\"\n :id=\"filterIds.Auth\"\n :createAnySecurityScheme=\"layout !== 'modal'\"\n :defaultOpen=\"isAuthDefaultOpen\"\n :environment\n :eventBus\n :meta=\"authMeta\"\n :options\n :proxyUrl\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :selectedSecuritySchemes\n :server\n :title=\"translate('apiClient.requestBlock.authentication')\" />\n\n <!-- Variables (Path Parameters) -->\n <RequestParams\n v-show=\"isSectionVisible('Variables') && sections.path?.length\"\n :id=\"filterIds.Variables\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.path ?? []\"\n :showAddRowPlaceholder=\"false\"\n :title=\"translate('apiClient.requestBlock.variables')\"\n v-on=\"parameterHandlers.path\" />\n\n <!-- Cookies -->\n <RequestParams\n v-show=\"isSectionVisible('Cookies')\"\n :id=\"filterIds.Cookies\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"cookies ?? []\"\n :showAddRowPlaceholder=\"true\"\n :title=\"translate('apiClient.requestBlock.cookies')\"\n v-on=\"parameterHandlers.cookie\" />\n\n <!-- Headers -->\n <RequestParams\n v-show=\"isSectionVisible('Headers')\"\n :id=\"filterIds.Headers\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"headers ?? []\"\n :title=\"translate('apiClient.requestBlock.headers')\"\n v-on=\"parameterHandlers.header\" />\n\n <!-- Query Parameters -->\n <RequestParams\n v-show=\"isSectionVisible('Query')\"\n :id=\"filterIds.Query\"\n :description=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryStringDescription')\n : undefined\n \"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.query ?? []\"\n :showAddRowPlaceholder=\"!hasQuerystringParameter\"\n :title=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryString')\n : translate('apiClient.requestBlock.queryParameters')\n \"\n v-on=\"parameterHandlers.query\" />\n\n <!-- Request Body -->\n <RequestBody\n v-show=\"isSectionVisible('Body') && canMethodHaveBody(method)\"\n :id=\"filterIds.Body\"\n :defaultView=\"defaultRequestBodyView\"\n :environment\n :exampleKey\n :openapiVersion\n :requestBody=\"getResolvedRef(operation.requestBody)\"\n :requestBodyCompositionSelection\n :title=\"translate('apiClient.requestBlock.requestBody')\"\n @generate:example=\"handleGenerateExample\"\n @update:contentType=\"handleUpdateContentType\"\n @update:formValue=\"handleUpdateBodyFormValue\"\n @update:value=\"handleUpdateBodyValue\" />\n\n <!-- Inject request section plugin components -->\n <ScalarErrorBoundary\n v-for=\"(plugin, index) in plugins\"\n :key=\"index\">\n <component\n :is=\"plugin.components.request.component\"\n v-if=\"plugin?.components?.request\"\n v-show=\"selectedFilter === 'All'\"\n :operation\n v-bind=\"plugin.components.request.additionalProps\"\n @operation:update:extension=\"updateOperationExtension\" />\n </ScalarErrorBoundary>\n\n <!-- Spacer -->\n <div class=\"flex grow\" />\n <!-- Code Snippet -->\n <RequestCodeSnippet\n v-show=\"selectedFilter === 'All'\"\n :clientOptions\n :eventBus\n :globalCookies\n integration=\"client\"\n :method\n :openapiVersion\n :operation\n :path\n :requestBodyCompositionSelection\n :securitySchemes=\"selectedSecuritySchemes\"\n :selectedClient\n :selectedContentType=\"\n getResolvedRef(operation.requestBody)?.[\n 'x-scalar-selected-content-type'\n ]?.[exampleKey]\n \"\n :selectedExample=\"exampleKey\"\n :selectedServer=\"server ?? undefined\" />\n </div>\n </ViewLayoutSection>\n</template>\n<style scoped>\n.request-section-content {\n --scalar-border-width: 0.5px;\n}\n.request-section-content-filter {\n box-shadow: 0 -10px 0 10px var(--scalar-background-1);\n}\n.request-item:focus-within .request-meta-buttons {\n opacity: 1;\n}\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RequestBlock.vue.script.js","names":[],"sources":["../../../../src/v2/blocks/request-block/RequestBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ClientOptionGroup } from '@scalar/blocks/code-example'\nimport { ScalarErrorBoundary } from '@scalar/components/error-boundary'\nimport { canMethodHaveBody } from '@scalar/helpers/http/can-method-have-body'\nimport { REGEX } from '@scalar/helpers/regex/regex-helpers'\nimport { replaceEnvVariables } from '@scalar/helpers/regex/replace-variables'\nimport type { ClientPlugin } from '@scalar/oas-utils/helpers'\nimport type { WorkspaceStore } from '@scalar/workspace-store/client'\nimport type { SelectedSecurity } from '@scalar/workspace-store/entities/auth'\nimport type {\n ApiReferenceEvents,\n AuthMeta,\n WorkspaceEventBus,\n} from '@scalar/workspace-store/events'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@scalar/workspace-store/helpers/unpack-proxy'\nimport { getUniqueExampleName } from '@scalar/workspace-store/navigation'\nimport {\n filterGlobalCookie,\n getEnvironmentVariables,\n getResolvedUrl,\n getSchemaExampleFromBody,\n type MergedSecuritySchemes,\n type SecuritySchemeObjectSecret,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type {\n OpenApiDocument,\n OperationObject,\n ServerObject,\n} from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport { computed, provide, ref, useId, watch } from 'vue'\n\nimport SectionFilter from '@/components/SectionFilter.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport RequestBody from '@/v2/blocks/request-block/components/RequestBody.vue'\nimport RequestCodeSnippet from '@/v2/blocks/request-block/components/RequestCodeSnippet.vue'\nimport RequestParams from '@/v2/blocks/request-block/components/RequestParams.vue'\nimport type { TableRow } from '@/v2/blocks/request-block/components/RequestTableRow.vue'\nimport { createParameterHandlers } from '@/v2/blocks/request-block/helpers/create-parameter-handlers'\nimport { createParameterRows } from '@/v2/blocks/request-block/helpers/create-parameter-rows'\nimport { groupBy } from '@/v2/blocks/request-block/helpers/group-by'\nimport { groupGlobalCookies } from '@/v2/blocks/request-block/helpers/group-global-cookies'\nimport { getStructuredBodyCodec } from '@/v2/blocks/request-block/helpers/structured-body-codec'\nimport { AuthSelector } from '@/v2/blocks/scalar-auth-selector-block'\nimport type { OAuth2Options } from '@/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue'\nimport {\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n type CollapsibleSectionHeadingLevel,\n} from '@/v2/components/layout'\nimport { useLocalization } from '@/v2/features/localization'\nimport type { ClientLayout } from '@/v2/types/layout'\n\ntype Filter =\n | 'All'\n | 'Auth'\n | 'Variables'\n | 'Cookies'\n | 'Headers'\n | 'Query'\n | 'Body'\n\nexport type RequestBlockProps = {\n authMeta: AuthMeta\n clientOptions: ClientOptionGroup[]\n environment: XScalarEnvironment\n eventBus: WorkspaceEventBus\n exampleKey: string\n workspaceCookies: XScalarCookie[]\n documentCookies: XScalarCookie[]\n /** Slug of the document the operation belongs to */\n documentSlug: string\n layout: ClientLayout\n method: string\n operation: OperationObject\n /** Operation before downloaded examples are overlaid, for parameter edit targets. */\n sourceOperation?: OperationObject\n path: string\n plugins: ClientPlugin[]\n proxyUrl: string\n securityRequirements: OpenApiDocument['security']\n securitySchemes: MergedSecuritySchemes\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n selectedClient: WorkspaceStore['workspace']['x-scalar-default-client']\n selectedSecurity: SelectedSecurity\n selectedSecuritySchemes: SecuritySchemeObjectSecret[]\n server: ServerObject | null\n defaultHeaders: Record<string, string>\n /** Initial view for structured request bodies, from the `x-scalar-default-request-body-view` document extension */\n defaultRequestBodyView?: 'form' | 'raw'\n /** Any config options required for the OAuth2 flow */\n options?: OAuth2Options\n}\n\nconst {\n authMeta = { type: 'document' },\n clientOptions,\n environment,\n eventBus,\n exampleKey,\n workspaceCookies,\n documentCookies,\n documentSlug,\n layout,\n method,\n operation,\n sourceOperation,\n path,\n plugins,\n proxyUrl,\n requestBodyCompositionSelection,\n openapiVersion,\n securityRequirements,\n securitySchemes,\n selectedClient,\n selectedSecurity,\n selectedSecuritySchemes,\n server,\n defaultHeaders: autoGeneratedHeaders,\n defaultRequestBodyView = 'raw',\n} = defineProps<RequestBlockProps>()\n\nconst { translate } = useLocalization()\n\n/** Base name for examples created by the \"generate example from schema\" button */\nconst GENERATED_EXAMPLE_NAME = 'Generated from schema'\n\n/** Operation metadata used across event emissions */\nconst meta = computed(() => ({\n method,\n path,\n exampleKey,\n}))\n\nconst deletedExpandedParameterPaths = ref<Record<string, string[][]>>({})\n\n/** Renamed expanded rows, tracked as old-schema-path -> typed-value-path per parameter. */\nconst renamedExpandedParameterPaths = ref<\n Record<string, { from: string[]; to: string[] }[]>\n>({})\n\nconst getExpandedParameterKey = (parameter: {\n in: string\n name: string\n}): string => `${parameter.in}:${parameter.name}`\n\nconst getHiddenValuePaths = (parameter: {\n in: string\n name: string\n}): string[][] =>\n deletedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\n/** Multi-field objects remain available in the picker; single-field objects retain ordinary deletion. */\nconst hideExpandedRowPath = (row: TableRow): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) return\n const siblings =\n sections.value.query?.filter(\n (entry) => entry.originalParameter === row.originalParameter,\n ) ?? []\n if (siblings.length > 1) return\n const key = getExpandedParameterKey(row.originalParameter)\n deletedExpandedParameterPaths.value = {\n ...deletedExpandedParameterPaths.value,\n [key]: [\n ...(deletedExpandedParameterPaths.value[key] ?? []),\n row.sourceParameterValuePath,\n ],\n }\n}\n\nconst getRenamedValuePaths = (parameter: {\n in: string\n name: string\n}): { from: string[]; to: string[] }[] =>\n renamedExpandedParameterPaths.value[getExpandedParameterKey(parameter)] ?? []\n\nconst pathsEqual = (a: string[], b: string[]): boolean =>\n a.length === b.length && a.every((segment, index) => segment === b[index])\n\n/**\n * Records that an expanded row was renamed from its current value path to the typed one, so the\n * read side can render the renamed key in the original property's slot instead of appending it to\n * the end of the table. Repeated renames of the same row stay anchored to the original schema path.\n */\nconst recordExpandedRowRename = (\n row: TableRow,\n newValuePath: string[],\n): void => {\n if (!row.originalParameter || !row.sourceParameterValuePath) {\n return\n }\n\n const from = row.sourceParameterValuePath\n const key = getExpandedParameterKey(row.originalParameter)\n const existing = renamedExpandedParameterPaths.value[key] ?? []\n\n // If this row was already renamed, the row's current path is the previous target. Re-anchor that\n // entry to the new target so a second rename does not create an orphaned mapping.\n const chained = existing.find((entry) => pathsEqual(entry.to, from))\n const next = chained\n ? existing.map((entry) =>\n entry === chained ? { from: entry.from, to: newValuePath } : entry,\n )\n : [...existing, { from, to: newValuePath }]\n\n renamedExpandedParameterPaths.value = {\n ...renamedExpandedParameterPaths.value,\n [key]: next,\n }\n}\n\n/** Whole-query parameters share the Query section but retain their original identity. */\nconst hasQuerystringParameter = computed(\n () =>\n operation.parameters?.some(\n (parameter) => getResolvedRef(parameter)?.in === 'querystring',\n ) ?? false,\n)\n\n/** Parameters grouped by type (path, query, header, cookie) */\nconst sections = computed(() =>\n groupBy(\n operation.parameters?.flatMap((reference, index) => {\n const param = getResolvedRef(reference)\n if (!param) {\n return []\n }\n return createParameterRows(param, exampleKey, {\n hiddenValuePaths:\n param.in === 'query' ? getHiddenValuePaths(param) : [],\n renamedValuePaths:\n param.in === 'query' ? getRenamedValuePaths(param) : [],\n }).map((row) => ({\n ...row,\n // Overlays retain parameter order, but their downloaded values are read-only.\n originalParameter:\n getResolvedRef(sourceOperation?.parameters?.[index]) ?? param,\n in: param.in === 'querystring' ? 'query' : param.in,\n }))\n }) ?? [],\n 'in',\n ({ in: _in, ...row }) => {\n return row\n },\n ),\n)\n\n// Generate a reverse map for fast lookup of headers by the name\nconst headersMap = computed(() =>\n groupBy(\n sections.value.header?.map((it) => ({\n ...it,\n name: it.name.toLowerCase(),\n })) ?? [],\n 'name',\n ),\n)\n\nconst defaultHeaders = computed(() => {\n const disableParameters =\n operation['x-scalar-disable-parameters']?.['default-headers']?.[\n exampleKey\n ] ?? {}\n\n const isOverridden = (name: string) => {\n const header = headersMap.value[name.toLowerCase()]?.[0]\n\n if (!header) {\n return false\n }\n\n return !header.isDisabled\n }\n\n return Object.entries(autoGeneratedHeaders).map(([name, value]) => {\n return {\n name,\n value,\n schema: undefined,\n isOverridden: isOverridden(name),\n isReadonly: true,\n isDisabled: disableParameters[name.toLowerCase()] ?? false,\n } satisfies TableRow\n })\n})\n\nconst headers = computed(() => [\n ...defaultHeaders.value,\n ...(sections.value.header ?? []),\n])\n\n/** Resolved request URL, used to filter global cookies by their domain and path. */\nconst requestCookieUrl = computed(() => {\n const environmentVariables = getEnvironmentVariables(environment)\n const resolvedUrl = getResolvedUrl({ server, path })\n return replaceEnvVariables(resolvedUrl, environmentVariables)\n})\n\n/**\n * Global cookies grouped by name. Same-named cookies collapse into a single logical cookie so\n * duplicate names no longer share one disabled state (which made toggling one toggle them all).\n * A name with multiple values becomes a preset the user can switch between.\n */\nconst globalCookieGroups = computed(() =>\n groupGlobalCookies({\n sources: [\n { location: 'workspace', cookies: workspaceCookies },\n { location: 'document', cookies: documentCookies },\n ],\n // Keep domain/path filtering but ignore the disabled flag, so a disabled preset value stays\n // selectable in the switcher (it is only hidden from the request, not from the dropdown).\n shouldInclude: (cookie) =>\n filterGlobalCookie({\n cookie: { ...cookie, isDisabled: false },\n url: requestCookieUrl.value,\n disabledGlobalCookies: {},\n }),\n }),\n)\n\nconst defaultCookies = computed<TableRow[]>(() => {\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[\n exampleKey\n ] ?? {}\n\n return globalCookieGroups.value.map((group) => ({\n name: group.name,\n value: group.selectedValue,\n globalRoute: { page: group.location, path: 'cookies' } as const,\n isReadonly: true,\n isDisabled: disabledGlobalCookies[group.name.toLowerCase()] ?? false,\n presetOptions: group.isPreset ? group.options : undefined,\n }))\n})\n\n/**\n * Switch a grouped global cookie preset to the chosen value by enabling the matching sibling and\n * disabling the rest. Selection is written back to the source `x-scalar-cookies` list so it\n * persists, and the send path drops disabled cookies, so only the selected value is sent.\n */\nconst handleSelectCookiePreset = (index: number, value: string): void => {\n const group = globalCookieGroups.value[index]\n if (!group) {\n return\n }\n\n for (const sibling of group.siblings) {\n eventBus.emit('cookie:upsert:cookie', {\n collectionType: sibling.location,\n index: sibling.index,\n payload: { isDisabled: sibling.value !== value },\n })\n }\n}\n\nconst cookies = computed(() => [\n ...(defaultCookies.value ?? []),\n ...(sections.value.cookie ?? []),\n])\n\n/** Currently selected filter for the request sections */\nconst selectedFilter = ref<Filter>('All')\n\n/** Available operation sections */\nconst OPERATION_SECTIONS: readonly Filter[] = [\n 'Auth',\n 'Variables',\n 'Cookies',\n 'Headers',\n 'Query',\n 'Body',\n] as const\n\n/**\n * Pre-generated stable IDs for all possible filter sections.\n * These are created once at setup time to avoid regenerating IDs on re-render.\n */\nconst sectionIds: Record<Filter, string> = {\n All: useId(),\n Auth: useId(),\n Variables: useId(),\n Cookies: useId(),\n Headers: useId(),\n Query: useId(),\n Body: useId(),\n}\n\n/** Filters available based on operation state */\nconst filters = computed<Filter[]>(() => {\n const availableFilters = new Set<Filter>(['All', ...OPERATION_SECTIONS])\n\n if (!sections.value.path?.length) {\n availableFilters.delete('Variables')\n }\n if (!canMethodHaveBody(method)) {\n availableFilters.delete('Body')\n }\n if (isAuthHidden.value) {\n availableFilters.delete('Auth')\n }\n\n return [...availableFilters]\n})\n\n/**\n * Map available filters to their pre-generated stable IDs.\n * Only includes IDs for filters that are currently available.\n */\nconst filterIds = computed(() =>\n filters.value.reduce<Partial<Record<Filter, string>>>((ids, section) => {\n ids[section] = sectionIds[section]\n return ids\n }, {}),\n)\n\n/**\n * Hide auth selector in readonly mode when no security schemes are defined.\n * This keeps the UI clean when there are no authentication options available.\n */\nconst isAuthHidden = computed(\n () => layout === 'modal' && !Object.keys(securitySchemes ?? {}).length,\n)\n\n/**\n * Keep auth available for unauthenticated operations, but collapse it by default\n * in readonly modal layouts unless a requirement or manual selection exists.\n */\nconst isAuthDefaultOpen = computed(\n () =>\n layout !== 'modal' ||\n Boolean(\n securityRequirements?.length || selectedSecurity.selectedSchemes.length,\n ),\n)\n\n/** Get a sensible placeholder for the request name input */\nconst requestNamePlaceholder = computed(() => {\n if (operation.summary) {\n return operation.summary\n }\n const cleanPath = path.replace(REGEX.PROTOCOL, '')\n return cleanPath || translate('apiClient.requestBlock.requestName')\n})\n\n/** Check if the section should be shown based on the selected filter */\nconst isSectionVisible = (section: Filter): boolean => {\n return selectedFilter.value === 'All' || selectedFilter.value === section\n}\n\n/**\n * Reset filter to 'All' if Body filter is selected but method changes to one that cannot have a body.\n * This prevents showing an empty Body section when switching methods.\n */\nwatch(\n () => method,\n (newMethod) => {\n if (selectedFilter.value === 'Body' && !canMethodHaveBody(newMethod)) {\n selectedFilter.value = 'All'\n }\n },\n)\n\n// Expanded-row bookkeeping is keyed by `in:name`, which is not unique across operations or\n// examples. Reset both maps when the operation or example changes so stale delete/rename mappings\n// do not leak onto another request that happens to share a query parameter name.\nwatch(\n () => [method, path, exampleKey],\n () => {\n deletedExpandedParameterPaths.value = {}\n renamedExpandedParameterPaths.value = {}\n },\n)\n\n/** Handle operation summary updates */\nconst handleSummaryUpdate = (event: Event): void => {\n if (!(event.target instanceof HTMLInputElement)) {\n return\n }\n const summary = event.target.value\n eventBus.emit('operation:update:meta', {\n meta: meta.value,\n payload: { summary: summary.trim() },\n })\n}\n\n/** Parameter handlers */\nconst parameterHandlers = computed(() => ({\n path: createParameterHandlers('path', eventBus, meta.value, {\n context: sections.value.path ?? [],\n }),\n cookie: {\n ...createParameterHandlers('cookie', eventBus, meta.value, {\n context: cookies.value ?? [],\n globalParameters: defaultCookies.value.length,\n }),\n selectPreset: handleSelectCookiePreset,\n },\n header: createParameterHandlers('header', eventBus, meta.value, {\n context: headers.value,\n defaultParameters: defaultHeaders.value.length,\n }),\n query: createParameterHandlers('query', eventBus, meta.value, {\n context: sections.value.query ?? [],\n onDeleteExpandedRow: hideExpandedRowPath,\n onRenameExpandedRow: recordExpandedRowRename,\n }),\n}))\n\n/** Handle request body content type update */\nconst handleUpdateContentType = (payload: { value: string }): void =>\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType: payload.value },\n meta: meta.value,\n })\n\n/** Handle request body value update */\nconst handleUpdateBodyValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:value'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey =\n typeof payload === 'string'\n ? `update:requestBody:value-${contentType}`\n : undefined\n\n eventBus.emit(\n 'operation:update:requestBody:value',\n {\n payload,\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/** Handle request body value update */\nconst handleUpdateBodyFormValue = ({\n payload,\n contentType,\n}: Pick<\n ApiReferenceEvents['operation:update:requestBody:formValue'],\n 'payload' | 'contentType'\n>): void => {\n const debounceKey = `update:requestBody:${contentType}-form-value`\n\n eventBus.emit(\n 'operation:update:requestBody:formValue',\n {\n payload: payload.map((row) => unpackProxyObject(row, { depth: 1 })),\n contentType,\n meta: meta.value,\n },\n {\n debounceKey,\n },\n )\n}\n\n/**\n * Create a new example seeded with values generated from the request body schema.\n *\n * Custom examples in the document otherwise hide the auto-generated fields entirely. Rather than\n * only rendering the generated body, we write it into a fresh example so the user can edit it and\n * so it survives an export of the document.\n */\nconst handleGenerateExample = ({\n contentType,\n}: {\n contentType: string\n}): void => {\n const requestBody = getResolvedRef(operation.requestBody)\n const codec = getStructuredBodyCodec(contentType)\n if (!requestBody || !codec) {\n return\n }\n\n const value = getSchemaExampleFromBody(\n requestBody,\n contentType,\n requestBodyCompositionSelection,\n )\n\n // A schema that generates nothing writable would leave the user on an empty new example.\n if (value === undefined || value === null) {\n return\n }\n\n const exampleName = getUniqueExampleName(operation, GENERATED_EXAMPLE_NAME)\n const exampleMeta = { path, method, exampleKey: exampleName }\n\n eventBus.emit('operation:create:draft-example', {\n documentName: documentSlug,\n meta: { path, method },\n exampleName,\n })\n\n // Carry over the content type the user was looking at, otherwise the new example opens on\n // whichever content type happens to come first on the request body.\n eventBus.emit('operation:update:requestBody:contentType', {\n payload: { contentType },\n meta: exampleMeta,\n })\n\n eventBus.emit('operation:update:requestBody:value', {\n payload: codec.stringify(value),\n contentType,\n meta: exampleMeta,\n })\n\n // The modal selects the example after its creation hook rebuilds the sidebar.\n if (layout === 'modal') {\n return\n }\n\n eventBus.emit('ui:navigate', {\n page: 'example',\n documentSlug,\n path,\n method,\n exampleName,\n })\n}\n\nconst labelRequestNameId = useId()\n\n/**\n * Where the collapsible sections below sit in the heading outline.\n *\n * The modal renders the operation summary as a heading above them, so they are\n * its subsections. Every other layout shows the summary as an editable input\n * rather than a heading, which leaves the sections at the top level.\n */\nprovide(\n COLLAPSIBLE_SECTION_HEADING_LEVEL,\n computed<CollapsibleSectionHeadingLevel>(() =>\n layout === 'modal' && operation.summary ? 3 : 2,\n ),\n)\n\nconst globalCookies = computed(() => [...workspaceCookies, ...documentCookies])\n\n/** Allow updating the operation extensions for the plugins */\nconst updateOperationExtension = (\n payload: ApiReferenceEvents['operation:update:extension']['payload'],\n): void =>\n eventBus.emit('operation:update:extension', { payload, meta: meta.value })\n\nconst filterLabels = computed(() => ({\n All: translate('apiClient.sectionFilter.all'),\n Auth: translate('apiClient.sectionFilter.auth'),\n Variables: translate('apiClient.sectionFilter.variables'),\n Cookies: translate('apiClient.sectionFilter.cookies'),\n Headers: translate('apiClient.sectionFilter.headers'),\n Query: translate('apiClient.sectionFilter.query'),\n Body: translate('apiClient.sectionFilter.body'),\n}))\n</script>\n<template>\n <ViewLayoutSection\n :aria-label=\"\n translate('apiClient.requestBlock.label', {\n name: operation.summary ?? '',\n })\n \">\n <template #title>\n <div\n class=\"group pointer-events-none flex flex-1 items-center gap-1 lg:pe-24\">\n <label\n v-if=\"layout !== 'modal'\"\n class=\"pointer-events-auto absolute top-0 left-0 h-full w-full cursor-text opacity-0\"\n :for=\"labelRequestNameId\" />\n <input\n v-if=\"layout !== 'modal'\"\n :id=\"labelRequestNameId\"\n class=\"text-c-1 group-hover-input pointer-events-auto relative z-10 -ml-0.5 h-8 w-full rounded pl-1.25 has-[:focus-visible]:outline md:-ml-1.25\"\n :placeholder=\"requestNamePlaceholder\"\n :value=\"operation.summary\"\n @blur=\"handleSummaryUpdate\" />\n <!-- In the modal the summary is the title of everything below it, so\n it carries the heading role that lets screen reader users jump to\n it. An operation without a summary renders nothing, because an\n empty heading is worse than none. -->\n <h2\n v-else-if=\"operation.summary\"\n class=\"text-c-1 flex h-8 items-center\">\n {{ operation.summary }}\n </h2>\n <span\n v-else\n class=\"text-c-1 flex h-8 items-center\" />\n </div>\n <SectionFilter\n v-model=\"selectedFilter\"\n :filters=\"filters\"\n :labels=\"filterLabels\" />\n </template>\n\n <div\n :id=\"filterIds.All\"\n class=\"request-section-content custom-scroll relative flex flex-1 flex-col\"\n :role=\"selectedFilter === 'All' ? 'tabpanel' : 'none'\">\n <!-- Auth Selector -->\n <AuthSelector\n v-show=\"isSectionVisible('Auth') && !isAuthHidden\"\n :id=\"filterIds.Auth\"\n :createAnySecurityScheme=\"layout !== 'modal'\"\n :defaultOpen=\"isAuthDefaultOpen\"\n :environment\n :eventBus\n :meta=\"authMeta\"\n :options\n :proxyUrl\n :securityRequirements\n :securitySchemes\n :selectedSecurity\n :selectedSecuritySchemes\n :server\n :title=\"translate('apiClient.requestBlock.authentication')\" />\n\n <!-- Variables (Path Parameters) -->\n <RequestParams\n v-show=\"isSectionVisible('Variables') && sections.path?.length\"\n :id=\"filterIds.Variables\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.path ?? []\"\n :showAddRowPlaceholder=\"false\"\n :title=\"translate('apiClient.requestBlock.variables')\"\n v-on=\"parameterHandlers.path\" />\n\n <!-- Cookies -->\n <RequestParams\n v-show=\"isSectionVisible('Cookies')\"\n :id=\"filterIds.Cookies\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"cookies ?? []\"\n :showAddRowPlaceholder=\"true\"\n :title=\"translate('apiClient.requestBlock.cookies')\"\n v-on=\"parameterHandlers.cookie\" />\n\n <!-- Headers -->\n <RequestParams\n v-show=\"isSectionVisible('Headers')\"\n :id=\"filterIds.Headers\"\n :environment\n :eventBus\n :exampleKey\n :rows=\"headers ?? []\"\n :title=\"translate('apiClient.requestBlock.headers')\"\n v-on=\"parameterHandlers.header\" />\n\n <!-- Query Parameters -->\n <RequestParams\n v-show=\"isSectionVisible('Query')\"\n :id=\"filterIds.Query\"\n :key=\"JSON.stringify([documentSlug, method, path, exampleKey])\"\n :description=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryStringDescription')\n : undefined\n \"\n :environment\n :eventBus\n :exampleKey\n :rows=\"sections.query ?? []\"\n selectExpandedParameters\n :showAddRowPlaceholder=\"!hasQuerystringParameter\"\n :title=\"\n hasQuerystringParameter\n ? translate('apiClient.requestBlock.queryString')\n : translate('apiClient.requestBlock.queryParameters')\n \"\n v-on=\"parameterHandlers.query\" />\n\n <!-- Request Body -->\n <RequestBody\n v-show=\"isSectionVisible('Body') && canMethodHaveBody(method)\"\n :id=\"filterIds.Body\"\n :defaultView=\"defaultRequestBodyView\"\n :environment\n :exampleKey\n :openapiVersion\n :requestBody=\"getResolvedRef(operation.requestBody)\"\n :requestBodyCompositionSelection\n :title=\"translate('apiClient.requestBlock.requestBody')\"\n @generate:example=\"handleGenerateExample\"\n @update:contentType=\"handleUpdateContentType\"\n @update:formValue=\"handleUpdateBodyFormValue\"\n @update:value=\"handleUpdateBodyValue\" />\n\n <!-- Inject request section plugin components -->\n <ScalarErrorBoundary\n v-for=\"(plugin, index) in plugins\"\n :key=\"index\">\n <component\n :is=\"plugin.components.request.component\"\n v-if=\"plugin?.components?.request\"\n v-show=\"selectedFilter === 'All'\"\n :operation\n v-bind=\"plugin.components.request.additionalProps\"\n @operation:update:extension=\"updateOperationExtension\" />\n </ScalarErrorBoundary>\n\n <!-- Spacer -->\n <div class=\"flex grow\" />\n <!-- Code Snippet -->\n <RequestCodeSnippet\n v-show=\"selectedFilter === 'All'\"\n :clientOptions\n :eventBus\n :globalCookies\n integration=\"client\"\n :method\n :openapiVersion\n :operation\n :path\n :requestBodyCompositionSelection\n :securitySchemes=\"selectedSecuritySchemes\"\n :selectedClient\n :selectedContentType=\"\n getResolvedRef(operation.requestBody)?.[\n 'x-scalar-selected-content-type'\n ]?.[exampleKey]\n \"\n :selectedExample=\"exampleKey\"\n :selectedServer=\"server ?? undefined\" />\n </div>\n </ViewLayoutSection>\n</template>\n<style scoped>\n.request-section-content {\n --scalar-border-width: 0.5px;\n}\n.request-section-content-filter {\n box-shadow: 0 -10px 0 10px var(--scalar-background-1);\n}\n.request-item:focus-within .request-meta-buttons {\n opacity: 1;\n}\n.group-hover-input {\n border-width: var(--scalar-border-width);\n border-color: transparent;\n}\n.group:hover .group-hover-input {\n background: color-mix(\n in srgb,\n var(--scalar-background-1),\n var(--scalar-background-2)\n );\n border-color: var(--scalar-border-color);\n}\n.group-hover-input:focus {\n background: transparent !important;\n border-color: var(--scalar-border-color) !important;\n}\n</style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBody.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/request-block/components/RequestBody.vue"],"names":[],"mappings":"AAmmBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,8DAA8D,CAAA;AAmBrE,KAAK,WAAW,GAAG;IACjB,mBAAmB;IACnB,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;IAClB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAC7B,CAAC;AA83BF,QAAA,MAAM,YAAY;;;;;;+BAh8BlB,CAxRwD;mBAwRxD,CAvRA;;;;;;;;;;;eAsW8C,MAAM;;;qBAuBF,MAAM;;;;;;;;+BAtGxD,CAxRwD;mBAwRxD,CAvRA;;;;;;;;;;;eAsW8C,MAAM;;;qBAuBF,MAAM;;kFA61BtD,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"RequestBody.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/blocks/request-block/components/RequestBody.vue"],"names":[],"mappings":"AAirBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AACnH,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,8DAA8D,CAAA;AAuBrE,KAAK,WAAW,GAAG;IACjB,mBAAmB;IACnB,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;IAClB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,2BAA2B;IAC3B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAC7B,CAAC;AAq+BF,QAAA,MAAM,YAAY;;;;;;+BA5iClB,CA3VgD;mBA2VhD,CAzVI;;;;;;;;;;;eA6a0C,MAAM;;;qBAuBF,MAAM;;;;;;;;+BA3GxD,CA3VgD;mBA2VhD,CAzVI;;;;;;;;;;;eA6a0C,MAAM;;;qBAuBF,MAAM;;kFAo8BtD,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../../../../_virtual/_plugin-vue_
2
2
  import RequestBody_vue_vue_type_script_setup_true_lang_default from "./RequestBody.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/v2/blocks/request-block/components/RequestBody.vue
5
- var RequestBody_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RequestBody_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-bf90c7e1"]]);
5
+ var RequestBody_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RequestBody_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ec7e5b86"]]);
6
6
  //#endregion
7
7
  export { RequestBody_default as default };
8
8