@scalar/api-client 3.15.0 → 3.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/style.css +2 -2
  3. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  4. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  5. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +34 -4
  6. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  7. package/dist/v2/blocks/operation-block/helpers/persist-script-environment.d.ts +53 -0
  8. package/dist/v2/blocks/operation-block/helpers/persist-script-environment.d.ts.map +1 -0
  9. package/dist/v2/blocks/operation-block/helpers/persist-script-environment.js +91 -0
  10. package/dist/v2/blocks/operation-block/helpers/persist-script-environment.js.map +1 -0
  11. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  12. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.d.ts.map +1 -1
  13. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js +1 -1
  14. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.js.map +1 -1
  15. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js +9 -2
  16. package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.script.js.map +1 -1
  17. package/dist/v2/blocks/response-block/helpers/media-types.d.ts +1 -1
  18. package/dist/v2/blocks/response-block/helpers/media-types.d.ts.map +1 -1
  19. package/dist/v2/blocks/response-block/helpers/media-types.js +12 -0
  20. package/dist/v2/blocks/response-block/helpers/media-types.js.map +1 -1
  21. package/dist/v2/blocks/response-block/helpers/prettify-ndjson.d.ts +12 -0
  22. package/dist/v2/blocks/response-block/helpers/prettify-ndjson.d.ts.map +1 -0
  23. package/dist/v2/blocks/response-block/helpers/prettify-ndjson.js +19 -0
  24. package/dist/v2/blocks/response-block/helpers/prettify-ndjson.js.map +1 -0
  25. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  26. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts.map +1 -1
  27. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.js.map +1 -1
  28. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js +23 -16
  29. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.script.js.map +1 -1
  30. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.d.ts +20 -0
  31. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.d.ts.map +1 -0
  32. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.js +27 -0
  33. package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth-flows.js.map +1 -0
  34. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts.map +1 -1
  35. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js +15 -6
  36. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js.map +1 -1
  37. package/dist/v2/constants.js +1 -1
  38. package/dist/vue-styles.css +2 -2
  39. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"security-scheme.js","names":[],"sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.ts"],"sourcesContent":["import { generateHash } from '@scalar/helpers/string/generate-hash'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport type { MergedSecuritySchemes, OAuthFlowsObjectSecret } from '@scalar/workspace-store/request-example'\nimport type {\n ComponentsObject,\n OpenApiDocument,\n SecurityRequirementObject,\n SecuritySchemeObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\n\nimport { authOptions } from '@/v2/blocks/scalar-auth-selector-block/helpers/auth-options'\n\n/** A single security scheme option used in the auth dropdown */\nexport type SecuritySchemeOption = {\n id: string\n label: string\n value: SecurityRequirementObject\n isDeletable?: boolean\n payload?: SecuritySchemeObject\n}\n\n/** A group of security scheme options used in the auth dropdown */\nexport type SecuritySchemeGroup = {\n label: string\n options: SecuritySchemeOption[]\n}\n\nconst requirementSignature = (requirement: SecurityRequirementObject): string =>\n JSON.stringify(Object.keys(requirement))\n\n/**\n * Format a scheme object into a display object\n *\n * We also add a hash to the id to ensure it is unique across\n * multiple requirements of the same scheme with different scopes\n */\nexport const formatScheme = ({ name, value }: { name: string; value: SecurityRequirementObject }) => ({\n id: generateHash(JSON.stringify(value)),\n label: name,\n value,\n isDeletable: true,\n})\n\n/** Formats complex security schemes */\nexport const formatComplexScheme = (scheme: NonNullable<OpenApiDocument['security']>[number]) =>\n formatScheme({\n name: Object.keys(scheme).join(' & '),\n value: scheme,\n })\n\n/**\n * Formats a security requirement into a SecuritySchemeOption.\n * Handles both simple (single key) and complex (multiple keys) auth schemes.\n */\nconst formatSecurityRequirement = (\n requirement: SecurityRequirementObject,\n securitySchemes: NonNullable<ComponentsObject['securitySchemes']> | MergedSecuritySchemes,\n): SecuritySchemeOption | undefined => {\n const keys = Object.keys(requirement)\n\n // Complex auth (multiple keys)\n if (keys.length > 1) {\n return formatComplexScheme(requirement)\n }\n\n // Simple auth (single key)\n if (keys[0]) {\n const scheme = getResolvedRef(securitySchemes[keys[0]])\n if (!scheme) {\n return undefined\n }\n return formatScheme({ name: keys[0], value: requirement })\n }\n\n return undefined\n}\n\n/**\n * Finds the oauth2 scheme best suited to power a bearer scheme's \"Authorize via OAuth2\" shortcut:\n * the first scheme with an interactive grant (authorization code / implicit), the kind that sends\n * a user to an IdP login. Prefers the authorization-code grant (which can refresh) over one\n * offering only implicit, so the more capable flow wins even when it is declared later.\n *\n * This only surfaces a convenience shortcut on the bearer form — it never hides the oauth2 scheme,\n * which stays independently selectable in the auth dropdown.\n */\nexport const getOauth2AcquisitionTarget = (\n securitySchemes: NonNullable<ComponentsObject['securitySchemes']> | MergedSecuritySchemes,\n): {\n name: string\n flows: OAuthFlowsObjectSecret\n flowType: 'authorizationCode' | 'implicit'\n scopes: string[]\n} | null => {\n let implicitFallback: {\n name: string\n flows: OAuthFlowsObjectSecret\n flowType: 'implicit'\n scopes: string[]\n } | null = null\n\n for (const [name, schemeRef] of Object.entries(securitySchemes)) {\n const scheme = getResolvedRef(schemeRef)\n if (scheme?.type !== 'oauth2') {\n continue\n }\n const flows = scheme.flows as OAuthFlowsObjectSecret | undefined\n if (!flows) {\n continue\n }\n const scopes = (scheme as { 'x-default-scopes'?: string[] })['x-default-scopes'] ?? []\n\n // Authorization code can refresh, so it wins outright the moment we find one.\n if (flows.authorizationCode) {\n return { name, flows, flowType: 'authorizationCode', scopes }\n }\n // Otherwise remember the first implicit-only scheme in case no auth-code flow turns up.\n if (flows.implicit && !implicitFallback) {\n implicitFallback = { name, flows, flowType: 'implicit', scopes }\n }\n }\n\n return implicitFallback\n}\n\n/**\n * Generates the options for the security scheme combobox\n *\n * Contains either a flat list, or different groups of required, available, and add new\n */\nexport const getSecuritySchemeOptions = (\n security: NonNullable<OpenApiDocument['security']>,\n securitySchemes: NonNullable<ComponentsObject['securitySchemes']> | MergedSecuritySchemes,\n /** We need to add the selected schemes if they do not already exist in the calculated options */\n selectedSchemes: SecurityRequirementObject[],\n /** Allows adding authentication which is not in the document */\n canAddNewAuth = false,\n): SecuritySchemeOption[] | SecuritySchemeGroup[] => {\n const selectedByRequirement = new Map(\n selectedSchemes.map((selectedScheme) => [requirementSignature(selectedScheme), selectedScheme]),\n )\n\n /**\n * Build required schemes formatted as options and track scheme names in a single pass.\n * We use names (not full IDs) because we want to exclude any scheme that is already\n * required, regardless of its specific scopes or hash.\n */\n const { requiredFormatted, requiredSchemeNames, existingIds } = security.reduce(\n (acc, requirement) => {\n // If a required requirement is selected with scopes, use that selected value to\n // keep a single option entry and avoid a phantom duplicate.\n const requirementValue = selectedByRequirement.get(requirementSignature(requirement)) ?? requirement\n const formatted = formatSecurityRequirement(requirementValue, securitySchemes)\n if (formatted) {\n acc.requiredFormatted.push(formatted)\n acc.existingIds.add(formatted.id)\n }\n for (const name of Object.keys(requirement)) {\n acc.requiredSchemeNames.add(name)\n }\n return acc\n },\n {\n requiredFormatted: [] as SecuritySchemeOption[],\n requiredSchemeNames: new Set<string>(),\n existingIds: new Set<string>(),\n },\n )\n\n // Build available schemes (excluding schemes that are in the required list)\n const availableFormatted: SecuritySchemeOption[] = []\n for (const [name, schemeRef] of Object.entries(securitySchemes)) {\n if (requiredSchemeNames.has(name)) {\n continue\n }\n\n const scheme = getResolvedRef(schemeRef)\n if (scheme) {\n const formatted = formatScheme({ name, value: { [name]: [] } })\n availableFormatted.push(formatted)\n existingIds.add(formatted.id)\n }\n }\n\n /**\n * Add selected schemes to available if they do not already exist\n * This ensures that selected schemes with specific scopes are always available as options\n */\n for (const selectedScheme of selectedSchemes) {\n const formatted = formatSecurityRequirement(selectedScheme, securitySchemes)\n if (formatted && !existingIds.has(formatted.id)) {\n availableFormatted.push(formatted)\n existingIds.add(formatted.id)\n }\n }\n\n const options = [\n { label: 'Required authentication', options: requiredFormatted },\n { label: 'Available authentication', options: availableFormatted },\n ]\n\n // We don't return the groups if we don't have any required schemes\n if (!canAddNewAuth) {\n return requiredFormatted.length ? options : availableFormatted\n }\n\n // Add new authentication options (unless explicitly hidden)\n options.push({\n label: 'Add new authentication',\n options: Object.entries(authOptions).map(([key, value]) => ({\n id: key,\n label: value.label,\n value: { [key]: [] },\n payload: value.payload,\n isDeletable: false,\n })),\n })\n\n return options\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"security-scheme.js","names":[],"sources":["../../../../../src/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.ts"],"sourcesContent":["import { generateHash } from '@scalar/helpers/string/generate-hash'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport { isHidden } from '@scalar/workspace-store/helpers/is-hidden'\nimport type { MergedSecuritySchemes, OAuthFlowsObjectSecret } from '@scalar/workspace-store/request-example'\nimport type {\n ComponentsObject,\n OpenApiDocument,\n SecurityRequirementObject,\n SecuritySchemeObject,\n} from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document'\n\nimport { authOptions } from '@/v2/blocks/scalar-auth-selector-block/helpers/auth-options'\n\n/**\n * Minimal shape read by `isHidden`. Some scheme union members (AsyncAPI broker schemes) do not\n * structurally carry the ignore extensions, so we cast to this before the check to satisfy the\n * weak-type check without widening `isHidden` itself.\n */\ntype Hideable = { 'x-internal'?: boolean; 'x-scalar-ignore'?: boolean }\n\n/** A single security scheme option used in the auth dropdown */\nexport type SecuritySchemeOption = {\n id: string\n label: string\n value: SecurityRequirementObject\n isDeletable?: boolean\n payload?: SecuritySchemeObject\n}\n\n/** A group of security scheme options used in the auth dropdown */\nexport type SecuritySchemeGroup = {\n label: string\n options: SecuritySchemeOption[]\n}\n\nconst requirementSignature = (requirement: SecurityRequirementObject): string =>\n JSON.stringify(Object.keys(requirement))\n\n/**\n * Format a scheme object into a display object\n *\n * We also add a hash to the id to ensure it is unique across\n * multiple requirements of the same scheme with different scopes\n */\nexport const formatScheme = ({ name, value }: { name: string; value: SecurityRequirementObject }) => ({\n id: generateHash(JSON.stringify(value)),\n label: name,\n value,\n isDeletable: true,\n})\n\n/** Formats complex security schemes */\nexport const formatComplexScheme = (scheme: NonNullable<OpenApiDocument['security']>[number]) =>\n formatScheme({\n name: Object.keys(scheme).join(' & '),\n value: scheme,\n })\n\n/**\n * Formats a security requirement into a SecuritySchemeOption.\n * Handles both simple (single key) and complex (multiple keys) auth schemes.\n */\nconst formatSecurityRequirement = (\n requirement: SecurityRequirementObject,\n securitySchemes: NonNullable<ComponentsObject['securitySchemes']> | MergedSecuritySchemes,\n): SecuritySchemeOption | undefined => {\n const keys = Object.keys(requirement)\n\n // Complex auth (multiple keys)\n if (keys.length > 1) {\n // Drop the whole AND combination if any of its schemes is hidden via x-scalar-ignore — a\n // partly hidden requirement cannot be configured, so it should not appear as an option.\n const anyHidden = keys.some((key) => {\n const scheme = getResolvedRef(securitySchemes[key])\n return scheme ? isHidden(scheme as Hideable) : false\n })\n if (anyHidden) {\n return undefined\n }\n return formatComplexScheme(requirement)\n }\n\n // Simple auth (single key)\n if (keys[0]) {\n const scheme = getResolvedRef(securitySchemes[keys[0]])\n // Drop schemes that do not exist or are hidden from the auth UI via x-scalar-ignore.\n if (!scheme || isHidden(scheme as Hideable)) {\n return undefined\n }\n return formatScheme({ name: keys[0], value: requirement })\n }\n\n return undefined\n}\n\n/**\n * Finds the oauth2 scheme best suited to power a bearer scheme's \"Authorize via OAuth2\" shortcut:\n * the first scheme with an interactive grant (authorization code / implicit), the kind that sends\n * a user to an IdP login. Prefers the authorization-code grant (which can refresh) over one\n * offering only implicit, so the more capable flow wins even when it is declared later.\n *\n * This only surfaces a convenience shortcut on the bearer form — it never hides the oauth2 scheme,\n * which stays independently selectable in the auth dropdown.\n */\nexport const getOauth2AcquisitionTarget = (\n securitySchemes: NonNullable<ComponentsObject['securitySchemes']> | MergedSecuritySchemes,\n): {\n name: string\n flows: OAuthFlowsObjectSecret\n flowType: 'authorizationCode' | 'implicit'\n scopes: string[]\n} | null => {\n let implicitFallback: {\n name: string\n flows: OAuthFlowsObjectSecret\n flowType: 'implicit'\n scopes: string[]\n } | null = null\n\n for (const [name, schemeRef] of Object.entries(securitySchemes)) {\n const scheme = getResolvedRef(schemeRef)\n // Skip schemes hidden from the auth UI via x-scalar-ignore, so the shortcut never\n // targets a flow the user cannot see or configure.\n if (scheme?.type !== 'oauth2' || isHidden(scheme)) {\n continue\n }\n const flows = scheme.flows as OAuthFlowsObjectSecret | undefined\n if (!flows) {\n continue\n }\n const scopes = (scheme as { 'x-default-scopes'?: string[] })['x-default-scopes'] ?? []\n\n // Authorization code can refresh, so it wins outright the moment we find one.\n if (flows.authorizationCode && !isHidden(flows.authorizationCode)) {\n return { name, flows, flowType: 'authorizationCode', scopes }\n }\n // Otherwise remember the first implicit-only scheme in case no auth-code flow turns up.\n if (flows.implicit && !isHidden(flows.implicit) && !implicitFallback) {\n implicitFallback = { name, flows, flowType: 'implicit', scopes }\n }\n }\n\n return implicitFallback\n}\n\n/**\n * Generates the options for the security scheme combobox\n *\n * Contains either a flat list, or different groups of required, available, and add new\n */\nexport const getSecuritySchemeOptions = (\n security: NonNullable<OpenApiDocument['security']>,\n securitySchemes: NonNullable<ComponentsObject['securitySchemes']> | MergedSecuritySchemes,\n /** We need to add the selected schemes if they do not already exist in the calculated options */\n selectedSchemes: SecurityRequirementObject[],\n /** Allows adding authentication which is not in the document */\n canAddNewAuth = false,\n): SecuritySchemeOption[] | SecuritySchemeGroup[] => {\n const selectedByRequirement = new Map(\n selectedSchemes.map((selectedScheme) => [requirementSignature(selectedScheme), selectedScheme]),\n )\n\n /**\n * Build required schemes formatted as options and track scheme names in a single pass.\n * We use names (not full IDs) because we want to exclude any scheme that is already\n * required, regardless of its specific scopes or hash.\n */\n const { requiredFormatted, requiredSchemeNames, existingIds } = security.reduce(\n (acc, requirement) => {\n // If a required requirement is selected with scopes, use that selected value to\n // keep a single option entry and avoid a phantom duplicate.\n const requirementValue = selectedByRequirement.get(requirementSignature(requirement)) ?? requirement\n const formatted = formatSecurityRequirement(requirementValue, securitySchemes)\n if (formatted) {\n acc.requiredFormatted.push(formatted)\n acc.existingIds.add(formatted.id)\n }\n for (const name of Object.keys(requirement)) {\n acc.requiredSchemeNames.add(name)\n }\n return acc\n },\n {\n requiredFormatted: [] as SecuritySchemeOption[],\n requiredSchemeNames: new Set<string>(),\n existingIds: new Set<string>(),\n },\n )\n\n // Build available schemes (excluding schemes that are in the required list)\n const availableFormatted: SecuritySchemeOption[] = []\n for (const [name, schemeRef] of Object.entries(securitySchemes)) {\n if (requiredSchemeNames.has(name)) {\n continue\n }\n\n const scheme = getResolvedRef(schemeRef)\n // Skip schemes hidden from the auth UI via x-scalar-ignore.\n if (scheme && !isHidden(scheme as Hideable)) {\n const formatted = formatScheme({ name, value: { [name]: [] } })\n availableFormatted.push(formatted)\n existingIds.add(formatted.id)\n }\n }\n\n /**\n * Add selected schemes to available if they do not already exist\n * This ensures that selected schemes with specific scopes are always available as options\n */\n for (const selectedScheme of selectedSchemes) {\n const formatted = formatSecurityRequirement(selectedScheme, securitySchemes)\n if (formatted && !existingIds.has(formatted.id)) {\n availableFormatted.push(formatted)\n existingIds.add(formatted.id)\n }\n }\n\n const options = [\n { label: 'Required authentication', options: requiredFormatted },\n { label: 'Available authentication', options: availableFormatted },\n ]\n\n // We don't return the groups if we don't have any required schemes\n if (!canAddNewAuth) {\n return requiredFormatted.length ? options : availableFormatted\n }\n\n // Add new authentication options (unless explicitly hidden)\n options.push({\n label: 'Add new authentication',\n options: Object.entries(authOptions).map(([key, value]) => ({\n id: key,\n label: value.label,\n value: { [key]: [] },\n payload: value.payload,\n isDeletable: false,\n })),\n })\n\n return options\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  //#region src/v2/constants.ts
2
2
  /** The version number taken from the package.json. Consumers can override at build time via define (e.g. OVERRIDE_PACKAGE_VERSION: JSON.stringify('1.2.3')). */
3
- var APP_VERSION = typeof OVERRIDE_PACKAGE_VERSION !== "undefined" ? OVERRIDE_PACKAGE_VERSION : "3.15.0";
3
+ var APP_VERSION = typeof OVERRIDE_PACKAGE_VERSION !== "undefined" ? OVERRIDE_PACKAGE_VERSION : "3.16.0";
4
4
  //#endregion
5
5
  export { APP_VERSION };
6
6
 
@@ -510,10 +510,10 @@ input[data-v-a6f4752a]::placeholder {
510
510
  min-width: 100%;
511
511
  }
512
512
 
513
- .light-mode .bg-preview[data-v-8bc927e4] {
513
+ .light-mode .bg-preview[data-v-a10b4008] {
514
514
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23000' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E");
515
515
  }
516
- .dark-mode .bg-preview[data-v-8bc927e4] {
516
+ .dark-mode .bg-preview[data-v-a10b4008] {
517
517
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23FFF' fill-opacity='10%25'%3E%3Crect width='8' height='8' /%3E%3Crect x='8' y='8' width='8' height='8' /%3E%3C/svg%3E");
518
518
  }
519
519
 
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "rest",
19
19
  "testing"
20
20
  ],
21
- "version": "3.15.0",
21
+ "version": "3.16.0",
22
22
  "engines": {
23
23
  "node": ">=22"
24
24
  },
@@ -309,20 +309,20 @@
309
309
  "vue": "^3.5.40",
310
310
  "yaml": "^2.9.0",
311
311
  "zod": "^4.3.5",
312
- "@scalar/blocks": "0.1.10",
313
- "@scalar/helpers": "0.10.0",
312
+ "@scalar/blocks": "0.1.11",
314
313
  "@scalar/components": "0.27.11",
314
+ "@scalar/helpers": "0.10.0",
315
+ "@scalar/oas-utils": "0.19.11",
315
316
  "@scalar/icons": "0.7.5",
317
+ "@scalar/sidebar": "0.9.36",
316
318
  "@scalar/openapi-types": "0.9.4",
317
- "@scalar/oas-utils": "0.19.10",
318
- "@scalar/sidebar": "0.9.35",
319
- "@scalar/snippetz": "0.9.25",
319
+ "@scalar/snippetz": "0.9.26",
320
+ "@scalar/types": "0.18.0",
320
321
  "@scalar/themes": "0.17.2",
321
322
  "@scalar/use-codemirror": "0.14.14",
322
323
  "@scalar/use-hooks": "0.4.9",
323
324
  "@scalar/use-toasts": "0.10.4",
324
- "@scalar/workspace-store": "0.56.1",
325
- "@scalar/types": "0.17.1"
325
+ "@scalar/workspace-store": "0.57.0"
326
326
  },
327
327
  "devDependencies": {
328
328
  "@tailwindcss/cli": "^4.3.3",