@scalar/blocks 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @scalar/blocks
2
2
 
3
+ ## 0.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#10489](https://github.com/scalar/scalar/pull/10489): Report invalid non-exploded structured cookies in OpenAPI 3.2 documents and prevent invalid request and code sample generation. Recommend `style: cookie` with `explode: true`.
8
+ - [#10479](https://github.com/scalar/scalar/pull/10479): Keep query parameter values raw for code examples that use client query maps, and encode values once when constructing snippet URLs.
9
+ - [#10487](https://github.com/scalar/scalar/pull/10487): Honor OpenAPI 3.2 allowReserved for path parameters while escaping forbidden path characters and preserving the encoded path in Ruby code examples.
10
+
3
11
  ## 0.5.0
4
12
 
5
13
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"generate-code-snippet.d.ts","sourceRoot":"","sources":["../../../src/code-example/helpers/generate-code-snippet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,kBAAkB,CAAA;AAE3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AACxG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AAEjH,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAA;AAIvF,KAAK,wBAAwB,GAAG;IAC9B,wGAAwG;IACxG,QAAQ,EAAE,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAA;IAC1D,qFAAqF;IACrF,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,mFAAmF;IACnF,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,SAAS,EAAE,eAAe,CAAA;IAC1B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,iFAAiF;IACjF,eAAe,EAAE,0BAA0B,EAAE,CAAA;IAC7C,mEAAmE;IACnE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,mCAAmC;IACnC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B,qFAAqF;IACrF,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,gFAAgF;IAChF,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD,gDAAgD;IAChD,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,CAAA;AAED,oHAAoH;AACpH,eAAO,MAAM,mBAAmB,GAAI,4NAejC,wBAAwB,KAAG,MAAM,GAAG,IAmDtC,CAAA"}
1
+ {"version":3,"file":"generate-code-snippet.d.ts","sourceRoot":"","sources":["../../../src/code-example/helpers/generate-code-snippet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,kBAAkB,CAAA;AAE3E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAA;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AACxG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sDAAsD,CAAA;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AAEjH,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAA;AAKvF,KAAK,wBAAwB,GAAG;IAC9B,wGAAwG;IACxG,QAAQ,EAAE,eAAe,GAAG,kBAAkB,GAAG,SAAS,CAAA;IAC1D,qFAAqF;IACrF,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,mFAAmF;IACnF,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAA;IACd,wEAAwE;IACxE,SAAS,EAAE,eAAe,CAAA;IAC1B,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,iFAAiF;IACjF,eAAe,EAAE,0BAA0B,EAAE,CAAA;IAC7C,mEAAmE;IACnE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,mCAAmC;IACnC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B,qFAAqF;IACrF,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,gFAAgF;IAChF,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD,gDAAgD;IAChD,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,CAAA;AAED,oHAAoH;AACpH,eAAO,MAAM,mBAAmB,GAAI,4NAejC,wBAAwB,KAAG,MAAM,GAAG,IAmDtC,CAAA"}
@@ -1,37 +1,38 @@
1
1
  import { getCustomClientIds as e } from "./generate-client-options.js";
2
2
  import { getSnippet as t } from "./get-snippet.js";
3
- import { operationToHar as n } from "./operation-to-har/operation-to-har.js";
4
- import { getResolvedRef as r } from "@scalar/workspace-store/helpers/get-resolved-ref";
3
+ import { CookieSerializationError as n } from "./operation-to-har/process-parameters.js";
4
+ import { operationToHar as r } from "./operation-to-har/operation-to-har.js";
5
+ import { getResolvedRef as i } from "@scalar/workspace-store/helpers/get-resolved-ref";
5
6
  //#region src/code-example/helpers/generate-code-snippet.ts
6
- var i = ({ clientId: i, customCodeSamples: a, includeDefaultHeaders: o = !1, operation: s, method: c, path: l, example: u, contentType: d, server: f, securitySchemes: p, globalCookies: m, openapiVersion: h, requestBodyCompositionSelection: g, defaultDisabledParameters: _ }) => {
7
+ var a = ({ clientId: a, customCodeSamples: o, includeDefaultHeaders: s = !1, operation: c, method: l, path: u, example: d, contentType: f, server: p, securitySchemes: m, globalCookies: h, openapiVersion: g, requestBodyCompositionSelection: _, defaultDisabledParameters: v }) => {
7
8
  try {
8
- if (!i) return "";
9
- if (i.startsWith("custom")) {
10
- let t = e(a), n = a.filter((e, n) => t[n] === i);
9
+ if (!a) return "";
10
+ if (a.startsWith("custom")) {
11
+ let t = e(o), n = o.filter((e, n) => t[n] === a);
11
12
  if (!n.some((e) => e.example !== void 0)) return n[0]?.source ?? "Custom example not found";
12
- let o = r(s.requestBody)?.content ?? {}, c = d ?? Object.keys(o)[0], l = u ?? Object.keys(o[c ?? ""]?.examples ?? {})[0];
13
- return (n.find((e) => e.example === l && e.contentType === c) ?? n.find((e) => e.example === l && e.contentType === void 0))?.source ?? null;
13
+ let r = i(c.requestBody)?.content ?? {}, s = f ?? Object.keys(r)[0], l = d ?? Object.keys(r[s ?? ""]?.examples ?? {})[0];
14
+ return (n.find((e) => e.example === l && e.contentType === s) ?? n.find((e) => e.example === l && e.contentType === void 0))?.source ?? null;
14
15
  }
15
- let v = n({
16
- operation: s,
17
- contentType: d,
18
- method: c,
19
- path: l,
20
- server: f,
21
- securitySchemes: p,
22
- example: u,
23
- globalCookies: m,
24
- includeDefaultHeaders: o,
25
- openapiVersion: h,
26
- requestBodyCompositionSelection: g,
27
- defaultDisabledParameters: _
28
- }), [y, b] = i.split("/"), [x, S] = t(y, b, v);
16
+ let n = r({
17
+ operation: c,
18
+ contentType: f,
19
+ method: l,
20
+ path: u,
21
+ server: p,
22
+ securitySchemes: m,
23
+ example: d,
24
+ globalCookies: h,
25
+ includeDefaultHeaders: s,
26
+ openapiVersion: g,
27
+ requestBodyCompositionSelection: _,
28
+ defaultDisabledParameters: v
29
+ }), [y, b] = a.split("/"), [x, S] = t(y, b, n);
29
30
  return x ? (console.error("[generateCodeSnippet]", x), x.message ?? "Error generating code snippet") : S;
30
31
  } catch (e) {
31
- return console.error("[generateCodeSnippet]", e), "Error generating code snippet";
32
+ return console.error("[generateCodeSnippet]", e), e instanceof n ? e.message : "Error generating code snippet";
32
33
  }
33
34
  };
34
35
  //#endregion
35
- export { i as generateCodeSnippet };
36
+ export { a as generateCodeSnippet };
36
37
 
37
38
  //# sourceMappingURL=generate-code-snippet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-code-snippet.js","names":[],"sources":["../../../src/code-example/helpers/generate-code-snippet.ts"],"sourcesContent":["import type { AvailableClient, ClientId, TargetId } from '@scalar/snippetz'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type { XCodeSample } from '@scalar/workspace-store/schemas/extensions/operation'\nimport type { OperationObject, ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nimport { type CustomCodeSampleId, getCustomClientIds } from './generate-client-options'\nimport { getSnippet } from './get-snippet'\nimport { operationToHar } from './operation-to-har/operation-to-har'\n\ntype GenerateCodeSnippetProps = {\n /** The selected client/language for code generation (e.g., 'node/fetch') or a custom code sample ID. */\n clientId: AvailableClient | CustomCodeSampleId | undefined\n /** The Content-Type header value for the request body (e.g., 'application/json'). */\n contentType: string | undefined\n /** Array of custom code samples defined in the OpenAPI x-codeSamples extension. */\n customCodeSamples: XCodeSample[]\n /** The specific example value to use when generating the code snippet. */\n example: string | undefined\n /** The HTTP method for the operation (e.g., GET, POST, PUT). */\n method: string\n /** The OpenAPI operation object containing request/response details. */\n operation: OperationObject\n /** The API endpoint path (e.g., '/users/{id}'). */\n path: string\n /** Array of security schemes to apply to the request (e.g., API keys, OAuth). */\n securitySchemes: SecuritySchemeObjectSecret[]\n /** The server object defining the base URL for the API request. */\n server: ServerObject | null\n /** Workspace + document cookies */\n globalCookies?: XScalarCookie[]\n /** Whether to include default headers (e.g., Accept, Content-Type) automatically. */\n includeDefaultHeaders?: boolean\n /** Selected oneOf/anyOf variants for nested request body example generation. */\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n /** Whether to disable parameters by default. */\n defaultDisabledParameters?: boolean\n}\n\n/** Generate the code snippet for the selected example OR operation, or null when a linked sample is unavailable. */\nexport const generateCodeSnippet = ({\n clientId,\n customCodeSamples,\n includeDefaultHeaders = false,\n operation,\n method,\n path,\n example,\n contentType,\n server,\n securitySchemes,\n globalCookies,\n openapiVersion,\n requestBodyCompositionSelection,\n defaultDisabledParameters,\n}: GenerateCodeSnippetProps): string | null => {\n try {\n if (!clientId) {\n return ''\n }\n\n // Use the selected custom example, matched by its language-keyed id\n if (clientId.startsWith('custom')) {\n const ids = getCustomClientIds(customCodeSamples)\n const samples = customCodeSamples.filter((_, index) => ids[index] === clientId)\n if (!samples.some((sample) => sample.example !== undefined)) {\n return samples[0]?.source ?? 'Custom example not found'\n }\n\n const content = getResolvedRef(operation.requestBody)?.content ?? {}\n const mediaType = contentType ?? Object.keys(content)[0]\n const exampleKey = example ?? Object.keys(content[mediaType ?? '']?.examples ?? {})[0]\n const sample =\n samples.find((sample) => sample.example === exampleKey && sample.contentType === mediaType) ??\n samples.find((sample) => sample.example === exampleKey && sample.contentType === undefined)\n return sample?.source ?? null\n }\n\n const harRequest = operationToHar({\n operation,\n contentType,\n method,\n path,\n server,\n securitySchemes,\n example,\n globalCookies,\n includeDefaultHeaders,\n openapiVersion,\n requestBodyCompositionSelection,\n defaultDisabledParameters,\n })\n\n const [targetKey, clientKey] = clientId.split('/') as [TargetId, ClientId<TargetId>]\n\n const [error, payload] = getSnippet(targetKey, clientKey, harRequest)\n if (error) {\n console.error('[generateCodeSnippet]', error)\n return error.message ?? 'Error generating code snippet'\n }\n\n return payload\n } catch (error) {\n console.error('[generateCodeSnippet]', error)\n return 'Error generating code snippet'\n }\n}\n"],"mappings":";;;;;AA2CA,IAAa,KAAuB,EAClC,aACA,sBACA,2BAAwB,IACxB,cACA,WACA,SACA,YACA,gBACA,WACA,oBACA,kBACA,mBACA,oCACA,mCAC6C;CAC7C,IAAI;EACF,IAAI,CAAC,GACH,OAAO;EAIT,IAAI,EAAS,WAAW,QAAQ,GAAG;GACjC,IAAM,IAAM,EAAmB,CAAiB,GAC1C,IAAU,EAAkB,QAAQ,GAAG,MAAU,EAAI,OAAW,CAAQ;GAC9E,IAAI,CAAC,EAAQ,MAAM,MAAW,EAAO,YAAY,KAAA,CAAS,GACxD,OAAO,EAAQ,EAAE,EAAE,UAAU;GAG/B,IAAM,IAAU,EAAe,EAAU,WAAW,CAAC,EAAE,WAAW,CAAC,GAC7D,IAAY,KAAe,OAAO,KAAK,CAAO,CAAC,CAAC,IAChD,IAAa,KAAW,OAAO,KAAK,EAAQ,KAAa,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;GAIpF,QAFE,EAAQ,MAAM,MAAW,EAAO,YAAY,KAAc,EAAO,gBAAgB,CAAS,KAC1F,EAAQ,MAAM,MAAW,EAAO,YAAY,KAAc,EAAO,gBAAgB,KAAA,CAAS,EAAA,EAC7E,UAAU;EAC3B;EAEA,IAAM,IAAa,EAAe;GAChC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,GAEK,CAAC,GAAW,KAAa,EAAS,MAAM,GAAG,GAE3C,CAAC,GAAO,KAAW,EAAW,GAAW,GAAW,CAAU;EAMpE,OALI,KACF,QAAQ,MAAM,yBAAyB,CAAK,GACrC,EAAM,WAAW,mCAGnB;CACT,SAAS,GAAO;EAEd,OADA,QAAQ,MAAM,yBAAyB,CAAK,GACrC;CACT;AACF"}
1
+ {"version":3,"file":"generate-code-snippet.js","names":[],"sources":["../../../src/code-example/helpers/generate-code-snippet.ts"],"sourcesContent":["import type { AvailableClient, ClientId, TargetId } from '@scalar/snippetz'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport type { SecuritySchemeObjectSecret } from '@scalar/workspace-store/request-example'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type { XCodeSample } from '@scalar/workspace-store/schemas/extensions/operation'\nimport type { OperationObject, ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\n\nimport { type CustomCodeSampleId, getCustomClientIds } from './generate-client-options'\nimport { getSnippet } from './get-snippet'\nimport { operationToHar } from './operation-to-har/operation-to-har'\nimport { CookieSerializationError } from './operation-to-har/process-parameters'\n\ntype GenerateCodeSnippetProps = {\n /** The selected client/language for code generation (e.g., 'node/fetch') or a custom code sample ID. */\n clientId: AvailableClient | CustomCodeSampleId | undefined\n /** The Content-Type header value for the request body (e.g., 'application/json'). */\n contentType: string | undefined\n /** Array of custom code samples defined in the OpenAPI x-codeSamples extension. */\n customCodeSamples: XCodeSample[]\n /** The specific example value to use when generating the code snippet. */\n example: string | undefined\n /** The HTTP method for the operation (e.g., GET, POST, PUT). */\n method: string\n /** The OpenAPI operation object containing request/response details. */\n operation: OperationObject\n /** The API endpoint path (e.g., '/users/{id}'). */\n path: string\n /** Array of security schemes to apply to the request (e.g., API keys, OAuth). */\n securitySchemes: SecuritySchemeObjectSecret[]\n /** The server object defining the base URL for the API request. */\n server: ServerObject | null\n /** Workspace + document cookies */\n globalCookies?: XScalarCookie[]\n /** Whether to include default headers (e.g., Accept, Content-Type) automatically. */\n includeDefaultHeaders?: boolean\n /** Selected oneOf/anyOf variants for nested request body example generation. */\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n /** Whether to disable parameters by default. */\n defaultDisabledParameters?: boolean\n}\n\n/** Generate the code snippet for the selected example OR operation, or null when a linked sample is unavailable. */\nexport const generateCodeSnippet = ({\n clientId,\n customCodeSamples,\n includeDefaultHeaders = false,\n operation,\n method,\n path,\n example,\n contentType,\n server,\n securitySchemes,\n globalCookies,\n openapiVersion,\n requestBodyCompositionSelection,\n defaultDisabledParameters,\n}: GenerateCodeSnippetProps): string | null => {\n try {\n if (!clientId) {\n return ''\n }\n\n // Use the selected custom example, matched by its language-keyed id\n if (clientId.startsWith('custom')) {\n const ids = getCustomClientIds(customCodeSamples)\n const samples = customCodeSamples.filter((_, index) => ids[index] === clientId)\n if (!samples.some((sample) => sample.example !== undefined)) {\n return samples[0]?.source ?? 'Custom example not found'\n }\n\n const content = getResolvedRef(operation.requestBody)?.content ?? {}\n const mediaType = contentType ?? Object.keys(content)[0]\n const exampleKey = example ?? Object.keys(content[mediaType ?? '']?.examples ?? {})[0]\n const sample =\n samples.find((sample) => sample.example === exampleKey && sample.contentType === mediaType) ??\n samples.find((sample) => sample.example === exampleKey && sample.contentType === undefined)\n return sample?.source ?? null\n }\n\n const harRequest = operationToHar({\n operation,\n contentType,\n method,\n path,\n server,\n securitySchemes,\n example,\n globalCookies,\n includeDefaultHeaders,\n openapiVersion,\n requestBodyCompositionSelection,\n defaultDisabledParameters,\n })\n\n const [targetKey, clientKey] = clientId.split('/') as [TargetId, ClientId<TargetId>]\n\n const [error, payload] = getSnippet(targetKey, clientKey, harRequest)\n if (error) {\n console.error('[generateCodeSnippet]', error)\n return error.message ?? 'Error generating code snippet'\n }\n\n return payload\n } catch (error) {\n console.error('[generateCodeSnippet]', error)\n return error instanceof CookieSerializationError ? error.message : 'Error generating code snippet'\n }\n}\n"],"mappings":";;;;;;AA4CA,IAAa,KAAuB,EAClC,aACA,sBACA,2BAAwB,IACxB,cACA,WACA,SACA,YACA,gBACA,WACA,oBACA,kBACA,mBACA,oCACA,mCAC6C;CAC7C,IAAI;EACF,IAAI,CAAC,GACH,OAAO;EAIT,IAAI,EAAS,WAAW,QAAQ,GAAG;GACjC,IAAM,IAAM,EAAmB,CAAiB,GAC1C,IAAU,EAAkB,QAAQ,GAAG,MAAU,EAAI,OAAW,CAAQ;GAC9E,IAAI,CAAC,EAAQ,MAAM,MAAW,EAAO,YAAY,KAAA,CAAS,GACxD,OAAO,EAAQ,EAAE,EAAE,UAAU;GAG/B,IAAM,IAAU,EAAe,EAAU,WAAW,CAAC,EAAE,WAAW,CAAC,GAC7D,IAAY,KAAe,OAAO,KAAK,CAAO,CAAC,CAAC,IAChD,IAAa,KAAW,OAAO,KAAK,EAAQ,KAAa,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;GAIpF,QAFE,EAAQ,MAAM,MAAW,EAAO,YAAY,KAAc,EAAO,gBAAgB,CAAS,KAC1F,EAAQ,MAAM,MAAW,EAAO,YAAY,KAAc,EAAO,gBAAgB,KAAA,CAAS,EAAA,EAC7E,UAAU;EAC3B;EAEA,IAAM,IAAa,EAAe;GAChC;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,GAEK,CAAC,GAAW,KAAa,EAAS,MAAM,GAAG,GAE3C,CAAC,GAAO,KAAW,EAAW,GAAW,GAAW,CAAU;EAMpE,OALI,KACF,QAAQ,MAAM,yBAAyB,CAAK,GACrC,EAAM,WAAW,mCAGnB;CACT,SAAS,GAAO;EAEd,OADA,QAAQ,MAAM,yBAAyB,CAAK,GACrC,aAAiB,IAA2B,EAAM,UAAU;CACrE;AACF"}
@@ -38,7 +38,7 @@ export type OperationToHarProps = {
38
38
  * Selected oneOf/anyOf variants for nested request body example generation
39
39
  * (e.g. from the schema dropdowns in the API reference).
40
40
  */
41
- /** Originating OpenAPI version, used for XML mapping rules. */
41
+ /** Originating OpenAPI version, used for version-specific serialization. */
42
42
  openapiVersion?: string;
43
43
  requestBodyCompositionSelection?: Record<string, number>;
44
44
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"operation-to-har.d.ts","sourceRoot":"","sources":["../../../../src/code-example/helpers/operation-to-har/operation-to-har.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,0BAA0B,EAIhC,MAAM,yCAAyC,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AACxG,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AACjH,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AASvD,MAAM,MAAM,mBAAmB,GAAG;IAChC,+BAA+B;IAC/B,SAAS,EAAE,eAAe,CAAA;IAC1B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;IAC5B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,0BAA0B,EAAE,CAAA;IAC9C,mCAAmC;IACnC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B;;;OAGG;IACH,+DAA+D;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,GAAI,+LAa5B,mBAAmB,KAAG,UAkKxB,CAAA"}
1
+ {"version":3,"file":"operation-to-har.d.ts","sourceRoot":"","sources":["../../../../src/code-example/helpers/operation-to-har/operation-to-har.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,0BAA0B,EAIhC,MAAM,yCAAyC,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAA;AACxG,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAA;AACjH,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AASvD,MAAM,MAAM,mBAAmB,GAAG;IAChC,+BAA+B;IAC/B,SAAS,EAAE,eAAe,CAAA;IAC1B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;IAC5B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,0BAA0B,EAAE,CAAA;IAC9C,mCAAmC;IACnC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAA;IAC/B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B;;;OAGG;IACH,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+BAA+B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxD;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,GAAI,+LAa5B,mBAAmB,KAAG,UAgKxB,CAAA"}
@@ -36,6 +36,7 @@ var u = ({ includeDefaultHeaders: u = !1, operation: d, contentType: f, method:
36
36
  let { url: e, headers: t, queryString: r, cookies: i, hasCookieStyleEntries: a, hasSerializedQuery: o } = n({
37
37
  harRequest: w,
38
38
  parameters: d.parameters,
39
+ openapiVersion: y,
39
40
  example: g,
40
41
  defaultDisabled: x
41
42
  }), c = v?.filter((t) => s({
@@ -68,10 +69,7 @@ var u = ({ includeDefaultHeaders: u = !1, operation: d, contentType: f, method:
68
69
  let O = E || d.parameters?.some((e) => a(e)?.in === "querystring");
69
70
  if (_) {
70
71
  let { headers: e, queryString: t, cookies: n } = r(_);
71
- w.headers.push(...e), w.queryString.push(...t.map((e) => O ? {
72
- ...e,
73
- value: encodeURIComponent(e.value)
74
- } : e)), w.cookies.push(...n);
72
+ w.headers.push(...e), w.queryString.push(...t), w.cookies.push(...n);
75
73
  }
76
74
  let k = w.headers.find((e) => e.name.toLowerCase() === "cookie");
77
75
  if (T && k && w.cookies.length) {
@@ -79,7 +77,7 @@ var u = ({ includeDefaultHeaders: u = !1, operation: d, contentType: f, method:
79
77
  k.value = k.value ? `${k.value}; ${e}` : e, w.cookies = [];
80
78
  }
81
79
  if (O && w.queryString.length) {
82
- let e = w.url.indexOf("#"), t = e === -1 ? "" : w.url.slice(e), n = e === -1 ? w.url : w.url.slice(0, e), r = w.queryString.map(({ name: e, value: t }) => `${encodeURIComponent(e)}=${t}`).join("&");
80
+ let e = w.url.indexOf("#"), t = e === -1 ? "" : w.url.slice(e), n = e === -1 ? w.url : w.url.slice(0, e), r = w.queryString.map(({ name: e, value: t }) => `${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&");
83
81
  w.url = `${n}${n.includes("?") ? "&" : "?"}${r}${t}`, w.queryString = [];
84
82
  }
85
83
  w.postData?.mimeType === "multipart/form-data" && w.postData.params?.some((e) => e.fileName !== void 0) && (w.headers = w.headers.filter((e) => e.name.toLowerCase() !== "content-type"));
@@ -1 +1 @@
1
- {"version":3,"file":"operation-to-har.js","names":[],"sources":["../../../../src/code-example/helpers/operation-to-har/operation-to-har.ts"],"sourcesContent":["import { isElectron } from '@scalar/helpers/general/is-electron'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n type SecuritySchemeObjectSecret,\n filterGlobalCookie,\n getDefaultHeaders,\n restoreConventionalDefaultHeaderNames,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type { OperationObject, ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { Request as HarRequest } from 'har-format'\n\nimport { APP_VERSION } from '@/constants'\n\nimport { processBody } from './process-body'\nimport { processParameters } from './process-parameters'\nimport { processSecuritySchemes } from './process-security-schemes'\nimport { processServerUrl } from './process-server-url'\n\nexport type OperationToHarProps = {\n /** OpenAPI Operation object */\n operation: OperationObject\n /** HTTP method of the operation */\n method: string\n /** Path of the operation */\n path: string\n /**\n * Name of the currently selected operation example\n *\n * Applies to both the body and the parameters\n */\n example?: string\n /**\n * Content type of the operation\n *\n * Applies to both the body and the parameters (if applicable)\n * @defaults to the first content type in the MediaTypeObject\n */\n contentType?: string\n /** OpenAPI Server object */\n server?: ServerObject | null\n /** OpenAPI SecurityScheme objects which are applicable to the operation */\n securitySchemes?: SecuritySchemeObjectSecret[]\n /** Workspace + document cookies */\n globalCookies?: XScalarCookie[]\n /**\n * Whether to include default headers (e.g., Accept, Content-Type) automatically.\n * If false, default headers will be omitted from the HAR request.\n * @default true\n */\n includeDefaultHeaders?: boolean\n /**\n * Selected oneOf/anyOf variants for nested request body example generation\n * (e.g. from the schema dropdowns in the API reference).\n */\n /** Originating OpenAPI version, used for XML mapping rules. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n /**\n * Whether to disable parameters by default.\n * @default false\n */\n defaultDisabledParameters?: boolean\n}\n\n/**\n * Converts an OpenAPI Operation to a HarRequest format for generating HTTP request snippets.\n *\n * This function transforms OpenAPI 3.1 operation objects into HAR (HTTP Archive) format requests,\n * which can be used to generate code snippets for various programming languages and HTTP clients.\n *\n * The conversion handles:\n * - Server URL processing and path parameter substitution\n * - Query parameter formatting based on OpenAPI parameter styles\n * - Request body processing with content type handling\n * - Security scheme integration (API keys, etc.)\n *\n * The resulting HarRequest object follows the HAR specification and includes:\n * - HTTP method and URL\n * - Headers and query parameters\n * - Request body (if present)\n * - Cookie information\n * - Size calculations for headers and body\n *\n * @see https://w3c.github.io/web-performance/specs/HAR/Overview.html\n * @see https://spec.openapis.org/oas/v3.1.0#operation-object\n */\nexport const operationToHar = ({\n includeDefaultHeaders = false,\n operation,\n contentType,\n method,\n path,\n server = null,\n example,\n securitySchemes,\n globalCookies,\n openapiVersion,\n requestBodyCompositionSelection,\n defaultDisabledParameters = false,\n}: OperationToHarProps): HarRequest => {\n const defaultHeaders = includeDefaultHeaders\n ? getDefaultHeaders({\n method,\n operation,\n exampleName: example ?? 'default',\n hideDisabledHeaders: true,\n hideOverriddenHeaders: true,\n options: { isElectron: isElectron(), appVersion: APP_VERSION },\n })\n : {}\n const defaultHeadersWithConventionalNames = restoreConventionalDefaultHeaderNames(defaultHeaders)\n\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[example ?? 'default'] ?? {}\n\n const serverUrl = processServerUrl(server, path)\n\n // Initialize the HAR request with basic properties\n const harRequest: HarRequest = {\n method,\n url: serverUrl,\n headers: Object.entries(defaultHeadersWithConventionalNames).map(([name, value]) => ({ name, value })),\n queryString: [],\n postData: undefined,\n httpVersion: 'HTTP/1.1',\n cookies: [],\n headersSize: -1,\n bodySize: -1,\n }\n\n let hasCookieStyleEntries = false\n let hasSerializedQuery = false\n\n // Handle parameters\n if (operation.parameters) {\n const {\n url,\n headers,\n queryString,\n cookies,\n hasCookieStyleEntries: processedCookieStyleEntries,\n hasSerializedQuery: processedSerializedQuery,\n } = processParameters({\n harRequest,\n parameters: operation.parameters,\n example,\n defaultDisabled: defaultDisabledParameters,\n })\n\n // Correctly filter the global cookies by the processed url\n const filteredGlobalCookies =\n globalCookies\n ?.filter((cookie) => filterGlobalCookie({ cookie, url, disabledGlobalCookies }))\n ?.map((cookie) => ({ name: cookie.name, value: cookie.value })) ?? []\n\n hasCookieStyleEntries = processedCookieStyleEntries\n hasSerializedQuery = processedSerializedQuery ?? false\n harRequest.url = url\n harRequest.headers = headers\n harRequest.queryString = queryString\n harRequest.cookies = [...filteredGlobalCookies, ...cookies]\n }\n\n const body = getResolvedRef(operation.requestBody)\n\n // Handle request body\n if (body?.content) {\n const postData = processBody({\n requestBody: body,\n contentType,\n example,\n openapiVersion,\n requestBodyCompositionSelection,\n })\n\n if (postData) {\n harRequest.postData = postData\n harRequest.bodySize = postData.text?.length ?? -1\n\n // Add or update Content-Type header\n if (postData.mimeType) {\n const existingContentTypeHeader = harRequest.headers.find(\n (header) => header.name.toLowerCase() === 'content-type',\n )\n // Update existing header if it has an empty value\n if (\n existingContentTypeHeader &&\n (!existingContentTypeHeader.value ||\n (postData.mimeType.startsWith('multipart/') &&\n postData.mimeType.includes('boundary=') &&\n postData.text !== undefined))\n ) {\n existingContentTypeHeader.value = postData.mimeType\n }\n // Add new header if none exists\n else if (!existingContentTypeHeader) {\n harRequest.headers.push({\n name: 'Content-Type',\n value: postData.mimeType,\n })\n }\n }\n }\n }\n\n const hasUriReadyQuery =\n hasSerializedQuery || operation.parameters?.some((parameter) => getResolvedRef(parameter)?.in === 'querystring')\n\n // Handle security schemes\n if (securitySchemes) {\n const { headers, queryString, cookies } = processSecuritySchemes(securitySchemes)\n harRequest.headers.push(...headers)\n // Named parameter values are already serialized, but authentication values are still raw.\n harRequest.queryString.push(\n ...queryString.map((parameter) =>\n hasUriReadyQuery ? { ...parameter, value: encodeURIComponent(parameter.value) } : parameter,\n ),\n )\n harRequest.cookies.push(...cookies)\n }\n\n // Keep authentication and global cookies in the explicit header as well, so\n // snippet generators cannot replace cookie-style parameters with their own header.\n const cookieHeader = harRequest.headers.find((header) => header.name.toLowerCase() === 'cookie')\n if (hasCookieStyleEntries && cookieHeader && harRequest.cookies.length) {\n const extraCookies = harRequest.cookies\n .map((cookie) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`)\n .join('; ')\n cookieHeader.value = cookieHeader.value ? `${cookieHeader.value}; ${extraCookies}` : extraCookies\n harRequest.cookies = []\n }\n\n // Whole-query content and serialized examples must retain their authored URI encoding.\n // Keeping all query data in the URL avoids snippet generators introducing a second question mark.\n if (hasUriReadyQuery && harRequest.queryString.length) {\n const hashIndex = harRequest.url.indexOf('#')\n const hash = hashIndex === -1 ? '' : harRequest.url.slice(hashIndex)\n const url = hashIndex === -1 ? harRequest.url : harRequest.url.slice(0, hashIndex)\n const query = harRequest.queryString.map(({ name, value }) => `${encodeURIComponent(name)}=${value}`).join('&')\n harRequest.url = `${url}${url.includes('?') ? '&' : '?'}${query}${hash}`\n harRequest.queryString = []\n }\n\n // Multipart file parts are encoded by the HTTP client, which owns the boundary.\n // Raw multipart text already has its boundary and must retain its Content-Type.\n if (\n harRequest.postData?.mimeType === 'multipart/form-data' &&\n harRequest.postData.params?.some((param) => param.fileName !== undefined)\n ) {\n harRequest.headers = harRequest.headers.filter((header) => header.name.toLowerCase() !== 'content-type')\n }\n\n // Calculate headers size without allocating a large joined string\n let headersSize = 0\n for (const h of harRequest.headers) {\n // name + \": \" + value + \"\\r\\n\"\n headersSize += (h.name?.length ?? 0) + 2 + (h.value?.length ?? 0) + 2\n }\n harRequest.headersSize = headersSize\n\n return harRequest\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"operation-to-har.js","names":[],"sources":["../../../../src/code-example/helpers/operation-to-har/operation-to-har.ts"],"sourcesContent":["import { isElectron } from '@scalar/helpers/general/is-electron'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n type SecuritySchemeObjectSecret,\n filterGlobalCookie,\n getDefaultHeaders,\n restoreConventionalDefaultHeaderNames,\n} from '@scalar/workspace-store/request-example'\nimport type { XScalarCookie } from '@scalar/workspace-store/schemas/extensions/general/x-scalar-cookies'\nimport type { OperationObject, ServerObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { Request as HarRequest } from 'har-format'\n\nimport { APP_VERSION } from '@/constants'\n\nimport { processBody } from './process-body'\nimport { processParameters } from './process-parameters'\nimport { processSecuritySchemes } from './process-security-schemes'\nimport { processServerUrl } from './process-server-url'\n\nexport type OperationToHarProps = {\n /** OpenAPI Operation object */\n operation: OperationObject\n /** HTTP method of the operation */\n method: string\n /** Path of the operation */\n path: string\n /**\n * Name of the currently selected operation example\n *\n * Applies to both the body and the parameters\n */\n example?: string\n /**\n * Content type of the operation\n *\n * Applies to both the body and the parameters (if applicable)\n * @defaults to the first content type in the MediaTypeObject\n */\n contentType?: string\n /** OpenAPI Server object */\n server?: ServerObject | null\n /** OpenAPI SecurityScheme objects which are applicable to the operation */\n securitySchemes?: SecuritySchemeObjectSecret[]\n /** Workspace + document cookies */\n globalCookies?: XScalarCookie[]\n /**\n * Whether to include default headers (e.g., Accept, Content-Type) automatically.\n * If false, default headers will be omitted from the HAR request.\n * @default true\n */\n includeDefaultHeaders?: boolean\n /**\n * Selected oneOf/anyOf variants for nested request body example generation\n * (e.g. from the schema dropdowns in the API reference).\n */\n /** Originating OpenAPI version, used for version-specific serialization. */\n openapiVersion?: string\n requestBodyCompositionSelection?: Record<string, number>\n /**\n * Whether to disable parameters by default.\n * @default false\n */\n defaultDisabledParameters?: boolean\n}\n\n/**\n * Converts an OpenAPI Operation to a HarRequest format for generating HTTP request snippets.\n *\n * This function transforms OpenAPI 3.1 operation objects into HAR (HTTP Archive) format requests,\n * which can be used to generate code snippets for various programming languages and HTTP clients.\n *\n * The conversion handles:\n * - Server URL processing and path parameter substitution\n * - Query parameter formatting based on OpenAPI parameter styles\n * - Request body processing with content type handling\n * - Security scheme integration (API keys, etc.)\n *\n * The resulting HarRequest object follows the HAR specification and includes:\n * - HTTP method and URL\n * - Headers and query parameters\n * - Request body (if present)\n * - Cookie information\n * - Size calculations for headers and body\n *\n * @see https://w3c.github.io/web-performance/specs/HAR/Overview.html\n * @see https://spec.openapis.org/oas/v3.1.0#operation-object\n */\nexport const operationToHar = ({\n includeDefaultHeaders = false,\n operation,\n contentType,\n method,\n path,\n server = null,\n example,\n securitySchemes,\n globalCookies,\n openapiVersion,\n requestBodyCompositionSelection,\n defaultDisabledParameters = false,\n}: OperationToHarProps): HarRequest => {\n const defaultHeaders = includeDefaultHeaders\n ? getDefaultHeaders({\n method,\n operation,\n exampleName: example ?? 'default',\n hideDisabledHeaders: true,\n hideOverriddenHeaders: true,\n options: { isElectron: isElectron(), appVersion: APP_VERSION },\n })\n : {}\n const defaultHeadersWithConventionalNames = restoreConventionalDefaultHeaderNames(defaultHeaders)\n\n const disabledGlobalCookies =\n operation['x-scalar-disable-parameters']?.['global-cookies']?.[example ?? 'default'] ?? {}\n\n const serverUrl = processServerUrl(server, path)\n\n // Initialize the HAR request with basic properties\n const harRequest: HarRequest = {\n method,\n url: serverUrl,\n headers: Object.entries(defaultHeadersWithConventionalNames).map(([name, value]) => ({ name, value })),\n queryString: [],\n postData: undefined,\n httpVersion: 'HTTP/1.1',\n cookies: [],\n headersSize: -1,\n bodySize: -1,\n }\n\n let hasCookieStyleEntries = false\n let hasSerializedQuery = false\n\n // Handle parameters\n if (operation.parameters) {\n const {\n url,\n headers,\n queryString,\n cookies,\n hasCookieStyleEntries: processedCookieStyleEntries,\n hasSerializedQuery: processedSerializedQuery,\n } = processParameters({\n harRequest,\n parameters: operation.parameters,\n openapiVersion,\n example,\n defaultDisabled: defaultDisabledParameters,\n })\n\n // Correctly filter the global cookies by the processed url\n const filteredGlobalCookies =\n globalCookies\n ?.filter((cookie) => filterGlobalCookie({ cookie, url, disabledGlobalCookies }))\n ?.map((cookie) => ({ name: cookie.name, value: cookie.value })) ?? []\n\n hasCookieStyleEntries = processedCookieStyleEntries\n hasSerializedQuery = processedSerializedQuery ?? false\n harRequest.url = url\n harRequest.headers = headers\n harRequest.queryString = queryString\n harRequest.cookies = [...filteredGlobalCookies, ...cookies]\n }\n\n const body = getResolvedRef(operation.requestBody)\n\n // Handle request body\n if (body?.content) {\n const postData = processBody({\n requestBody: body,\n contentType,\n example,\n openapiVersion,\n requestBodyCompositionSelection,\n })\n\n if (postData) {\n harRequest.postData = postData\n harRequest.bodySize = postData.text?.length ?? -1\n\n // Add or update Content-Type header\n if (postData.mimeType) {\n const existingContentTypeHeader = harRequest.headers.find(\n (header) => header.name.toLowerCase() === 'content-type',\n )\n // Update existing header if it has an empty value\n if (\n existingContentTypeHeader &&\n (!existingContentTypeHeader.value ||\n (postData.mimeType.startsWith('multipart/') &&\n postData.mimeType.includes('boundary=') &&\n postData.text !== undefined))\n ) {\n existingContentTypeHeader.value = postData.mimeType\n }\n // Add new header if none exists\n else if (!existingContentTypeHeader) {\n harRequest.headers.push({\n name: 'Content-Type',\n value: postData.mimeType,\n })\n }\n }\n }\n }\n\n const hasUriReadyQuery =\n hasSerializedQuery || operation.parameters?.some((parameter) => getResolvedRef(parameter)?.in === 'querystring')\n\n // Handle security schemes\n if (securitySchemes) {\n const { headers, queryString, cookies } = processSecuritySchemes(securitySchemes)\n harRequest.headers.push(...headers)\n harRequest.queryString.push(...queryString)\n harRequest.cookies.push(...cookies)\n }\n\n // Keep authentication and global cookies in the explicit header as well, so\n // snippet generators cannot replace cookie-style parameters with their own header.\n const cookieHeader = harRequest.headers.find((header) => header.name.toLowerCase() === 'cookie')\n if (hasCookieStyleEntries && cookieHeader && harRequest.cookies.length) {\n const extraCookies = harRequest.cookies\n .map((cookie) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`)\n .join('; ')\n cookieHeader.value = cookieHeader.value ? `${cookieHeader.value}; ${extraCookies}` : extraCookies\n harRequest.cookies = []\n }\n\n // Whole-query content and serialized examples must retain their authored URI encoding.\n // Keeping all query data in the URL avoids snippet generators introducing a second question mark.\n if (hasUriReadyQuery && harRequest.queryString.length) {\n const hashIndex = harRequest.url.indexOf('#')\n const hash = hashIndex === -1 ? '' : harRequest.url.slice(hashIndex)\n const url = hashIndex === -1 ? harRequest.url : harRequest.url.slice(0, hashIndex)\n const query = harRequest.queryString\n .map(({ name, value }) => `${encodeURIComponent(name)}=${encodeURIComponent(value)}`)\n .join('&')\n harRequest.url = `${url}${url.includes('?') ? '&' : '?'}${query}${hash}`\n harRequest.queryString = []\n }\n\n // Multipart file parts are encoded by the HTTP client, which owns the boundary.\n // Raw multipart text already has its boundary and must retain its Content-Type.\n if (\n harRequest.postData?.mimeType === 'multipart/form-data' &&\n harRequest.postData.params?.some((param) => param.fileName !== undefined)\n ) {\n harRequest.headers = harRequest.headers.filter((header) => header.name.toLowerCase() !== 'content-type')\n }\n\n // Calculate headers size without allocating a large joined string\n let headersSize = 0\n for (const h of harRequest.headers) {\n // name + \": \" + value + \"\\r\\n\"\n headersSize += (h.name?.length ?? 0) + 2 + (h.value?.length ?? 0) + 2\n }\n harRequest.headersSize = headersSize\n\n return harRequest\n}\n"],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  import type { OperationObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document';
2
2
  import type { Request as HarRequest } from 'har-format';
3
+ /** An invalid cookie declaration that authors can repair before generating a sample. */
4
+ export declare class CookieSerializationError extends Error {
5
+ }
3
6
  type ProcessedParameters = {
4
7
  /** Named serialized examples already embedded in the URL. */
5
8
  hasSerializedQuery?: boolean;
@@ -16,13 +19,15 @@ type ProcessedParameters = {
16
19
  *
17
20
  * @see https://spec.openapis.org/oas/latest.html#style-values
18
21
  */
19
- export declare const processParameters: ({ harRequest, parameters, example, defaultDisabled, }: {
22
+ export declare const processParameters: ({ harRequest, parameters, example, defaultDisabled, openapiVersion, }: {
20
23
  harRequest: HarRequest;
21
24
  parameters: OperationObject["parameters"];
22
25
  /** The name of the example to use */
23
26
  example?: string | undefined;
24
27
  /** Whether to disable parameters by default. */
25
28
  defaultDisabled: boolean;
29
+ /** Originating API description version. */
30
+ openapiVersion?: string;
26
31
  }) => ProcessedParameters;
27
32
  export {};
28
33
  //# sourceMappingURL=process-parameters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../../src/code-example/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,8DAA8D,CAAA;AACpH,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,KAAK,mBAAmB,GAAG;IACzB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,+EAA+E;IAC/E,qBAAqB,EAAE,OAAO,CAAA;CAC/B,CAAA;AAyFD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,uDAK/B;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAA;CACzB,KAAG,mBA0NH,CAAA"}
1
+ {"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../../src/code-example/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,8DAA8D,CAAA;AACpH,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,wFAAwF;AACxF,qBAAa,wBAAyB,SAAQ,KAAK;CAAG;AAEtD,KAAK,mBAAmB,GAAG;IACzB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,+EAA+E;IAC/E,qBAAqB,EAAE,OAAO,CAAA;CAC/B,CAAA;AAiFD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,uEAM/B;IACD,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IACzC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC5B,gDAAgD;IAChD,eAAe,EAAE,OAAO,CAAA;IACxB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,KAAG,mBAwPH,CAAA"}
@@ -1,10 +1,12 @@
1
1
  import { getResolvedRef as e } from "@scalar/workspace-store/helpers/get-resolved-ref";
2
2
  import { deSerializeParameter as t, getExampleFromSchema as n, isParamDisabled as r, serializeContentValue as i, serializeCookieStyle as a, serializeDeepObjectStyle as o, serializeFormStyle as s, serializeFormStyleForCookies as c, serializePipeDelimitedStyle as l, serializeSimpleStyle as u, serializeSpaceDelimitedStyle as d } from "@scalar/workspace-store/request-example";
3
- import { isObjectLike as f } from "@scalar/helpers/object/is-object";
4
- import { getParameterExample as p } from "@scalar/workspace-store/helpers/get-parameter-example";
5
- import { getQuerystringParameter as m, serializeQuerystringParameter as h } from "@scalar/workspace-store/helpers/querystring-parameter";
3
+ import { getCookieSerializationError as f } from "@scalar/helpers/http/get-cookie-serialization-error";
4
+ import { isObjectLike as p } from "@scalar/helpers/object/is-object";
5
+ import { assertReservedPathUrl as m, serializeReservedPathParameter as h } from "@scalar/workspace-store/helpers/encode-path-parameter";
6
+ import { getParameterExample as g } from "@scalar/workspace-store/helpers/get-parameter-example";
7
+ import { getQuerystringParameter as _, serializeQuerystringParameter as v } from "@scalar/workspace-store/helpers/querystring-parameter";
6
8
  //#region src/code-example/helpers/operation-to-har/process-parameters.ts
7
- var g = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), _ = (e) => "allowReserved" in e && e.allowReserved !== void 0 ? e.allowReserved : "schema" in e && e.schema && typeof e.schema == "object" && "allowReserved" in e.schema ? e.schema.allowReserved === !0 : !1, v = (e, t) => _(t) ? e : encodeURIComponent(e), y = (e) => {
9
+ var y = class extends Error {}, b = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), x = (e) => "allowReserved" in e && e.allowReserved !== void 0 ? e.allowReserved : "schema" in e && e.schema && typeof e.schema == "object" && "allowReserved" in e.schema ? e.schema.allowReserved === !0 : !1, S = (e) => {
8
10
  if (e.in === "header") return {
9
11
  style: "simple",
10
12
  explode: "explode" in e && e.explode !== void 0 && e.explode
@@ -27,67 +29,69 @@ var g = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), _ = (e) =
27
29
  style: n,
28
30
  explode: "explode" in e && e.explode !== void 0 ? e.explode : n === "form"
29
31
  };
30
- }, b = (i, a, o) => {
31
- let s = p(i, a), c = s.example;
32
+ }, C = (i, a, o) => {
33
+ let s = g(i, a), c = s.example;
32
34
  if (r(i, c, o)) return;
33
35
  if (s.value !== void 0) return t(s.value, i);
34
36
  if (!("schema" in i) || !i.schema) return;
35
37
  let l = i.in === "path" ? { emptyString: `{${i.name}}` } : {}, u = e(i.schema);
36
38
  return u ? n(u, l) : void 0;
37
- }, x = ({ harRequest: e, parameters: t, example: n, defaultDisabled: f }) => {
38
- let _ = [...e.headers], x = [...e.queryString], C = [...e.cookies], w = [], T = e.url, E = [], D = [], O = g(t);
39
- for (let e of O) {
39
+ }, w = ({ harRequest: e, parameters: t, example: n, defaultDisabled: p, openapiVersion: w }) => {
40
+ let E = [...e.headers], D = [...e.queryString], O = [...e.cookies], k = [], A = e.url, j = !1, M = [], N = [], P = (e, t, n) => {
41
+ x(n) ? M.push(`${encodeURIComponent(e)}=${t}`) : D.push({
42
+ name: e,
43
+ value: t
44
+ });
45
+ }, F = b(t);
46
+ for (let e of F) {
40
47
  if (!e.in || !e.name) continue;
41
48
  if (e.in === "querystring") {
42
- let t = m(e, n, { defaultDisabled: f });
49
+ let t = _(e, n, { defaultDisabled: p });
43
50
  if (t) {
44
- let e = T.indexOf("#"), n = e === -1 ? "" : T.slice(e), r = (e === -1 ? T : T.slice(0, e)).split("?")[0], i = h(t);
45
- T = `${r}${i ? `?${i}` : ""}${n}`;
51
+ let e = A.indexOf("#"), n = e === -1 ? "" : A.slice(e), r = (e === -1 ? A : A.slice(0, e)).split("?")[0], i = v(t);
52
+ A = `${r}${i ? `?${i}` : ""}${n}`;
46
53
  }
47
54
  continue;
48
55
  }
49
- let t = p(e, n);
50
- if (t.serialized && !r(e, t.example, f)) {
56
+ let t = g(e, n);
57
+ if (t.serialized && !r(e, t.example, p)) {
51
58
  let n = String(t.value);
52
59
  switch (e.in) {
53
60
  case "path":
54
- T = T.replaceAll(`{${e.name}}`, () => n);
61
+ A = A.replaceAll(`{${e.name}}`, () => n);
55
62
  break;
56
63
  case "query":
57
- E.push(n);
64
+ M.push(n);
58
65
  break;
59
66
  case "header":
60
- _.push({
67
+ E.push({
61
68
  name: e.name,
62
69
  value: n
63
70
  });
64
71
  break;
65
72
  case "cookie":
66
- D.push(n);
73
+ N.push(n);
67
74
  break;
68
75
  }
69
76
  continue;
70
77
  }
71
- if (t.mediaSerialized && !r(e, t.example, f)) {
78
+ if (t.mediaSerialized && !r(e, t.example, p)) {
72
79
  let n = String(t.value);
73
80
  switch (e.in) {
74
81
  case "query":
75
- x.push({
76
- name: e.name,
77
- value: v(n, e)
78
- });
82
+ P(e.name, n, e);
79
83
  break;
80
84
  case "header":
81
- _.push({
85
+ E.push({
82
86
  name: e.name,
83
87
  value: n
84
88
  });
85
89
  break;
86
90
  case "path":
87
- T = T.replaceAll(`{${e.name}}`, () => encodeURIComponent(n));
91
+ A = A.replaceAll(`{${e.name}}`, () => encodeURIComponent(n));
88
92
  break;
89
93
  case "cookie":
90
- C.push({
94
+ O.push({
91
95
  name: e.name,
92
96
  value: n
93
97
  });
@@ -95,141 +99,118 @@ var g = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), _ = (e) =
95
99
  }
96
100
  continue;
97
101
  }
98
- let g = b(e, n, f);
99
- if (g === void 0) continue;
100
- let { style: O, explode: k } = y(e);
102
+ let m = C(e, n, p);
103
+ if (m === void 0) continue;
104
+ let { style: b, explode: x } = S(e);
101
105
  switch (e.in) {
102
- case "path":
103
- T = S(T, e, g, O, k);
106
+ case "path": {
107
+ let t = w?.startsWith("3.2.") && "schema" in e && e.allowReserved === !0;
108
+ j ||= !!t;
109
+ let n = t ? h(e.name, {
110
+ value: m,
111
+ style: b,
112
+ explode: x
113
+ }) : void 0;
114
+ A = n === void 0 ? T(A, e, m, b, x) : A.replaceAll(`{${e.name}}`, () => n);
104
115
  break;
116
+ }
105
117
  case "query":
106
118
  if ("content" in e && e.content) {
107
- let t = i(g, Object.keys(e.content)[0] ?? "application/json");
108
- x.push({
109
- name: e.name,
110
- value: v(t, e)
111
- });
119
+ let t = i(m, Object.keys(e.content)[0] ?? "application/json");
120
+ P(e.name, t, e);
112
121
  break;
113
122
  }
114
- switch (O) {
123
+ switch (b) {
115
124
  case "form": {
116
- let t = s(g, k);
117
- if (Array.isArray(t)) for (let n of t) {
118
- let t = n.key || e.name;
119
- x.push({
120
- name: t,
121
- value: v(String(n.value), e)
122
- });
123
- }
124
- else x.push({
125
- name: e.name,
126
- value: v(String(t), e)
127
- });
125
+ let t = s(m, x);
126
+ if (Array.isArray(t)) for (let n of t) P(n.key || e.name, String(n.value), e);
127
+ else P(e.name, String(t), e);
128
128
  break;
129
129
  }
130
130
  case "spaceDelimited": {
131
- let t = d(g);
132
- x.push({
133
- name: e.name,
134
- value: v(t, e)
135
- });
131
+ let t = d(m);
132
+ P(e.name, t, e);
136
133
  break;
137
134
  }
138
135
  case "pipeDelimited": {
139
- let t = l(g);
140
- x.push({
141
- name: e.name,
142
- value: v(t, e)
143
- });
136
+ let t = l(m);
137
+ P(e.name, t, e);
144
138
  break;
145
139
  }
146
140
  case "deepObject":
147
- if (Array.isArray(g)) {
148
- let t = s(g, !0);
149
- if (Array.isArray(t)) for (let n of t) {
150
- let t = n.key || e.name;
151
- x.push({
152
- name: t,
153
- value: v(String(n.value), e)
154
- });
155
- }
156
- else x.push({
157
- name: e.name,
158
- value: v(String(t), e)
159
- });
141
+ if (Array.isArray(m)) {
142
+ let t = s(m, !0);
143
+ if (Array.isArray(t)) for (let n of t) P(n.key || e.name, String(n.value), e);
144
+ else P(e.name, String(t), e);
160
145
  } else {
161
- let t = o(e.name, g);
162
- for (let n of t) x.push({
163
- name: n.key,
164
- value: v(n.value, e)
165
- });
146
+ let t = o(e.name, m);
147
+ for (let n of t) P(n.key, n.value, e);
166
148
  }
167
149
  break;
168
- default: x.push({
169
- name: e.name,
170
- value: v(String(g), e)
171
- });
150
+ default: P(e.name, String(m), e);
172
151
  }
173
152
  break;
174
153
  case "header": {
175
- let t = u(g, k);
176
- _.push({
154
+ let t = u(m, x);
155
+ E.push({
177
156
  name: e.name,
178
157
  value: String(t)
179
158
  });
180
159
  break;
181
160
  }
182
161
  case "cookie": {
183
- if (O === "cookie") {
184
- w.push(...a(e.name, g, k));
162
+ let [t, n] = (w ?? "").split("."), r = t === "3" && n === "2" && !("content" in e) ? f(e, m) : void 0;
163
+ if (r) throw new y(r);
164
+ if (b === "cookie") {
165
+ k.push(...a(e.name, m, x));
185
166
  break;
186
167
  }
187
- let t = c(g, k);
188
- if (Array.isArray(t)) for (let n of t) {
189
- let t = n.key || e.name, r = n.value === null ? "null" : String(n.value);
190
- C.push({
191
- name: t,
168
+ let i = c(m, x);
169
+ if (Array.isArray(i)) for (let t of i) {
170
+ let n = t.key || e.name, r = t.value === null ? "null" : String(t.value);
171
+ O.push({
172
+ name: n,
192
173
  value: r
193
174
  });
194
175
  }
195
176
  else {
196
- let n = t === null ? "null" : String(t);
197
- C.push({
177
+ let t = i === null ? "null" : String(i);
178
+ O.push({
198
179
  name: e.name,
199
- value: n
180
+ value: t
200
181
  });
201
182
  }
202
183
  break;
203
184
  }
204
185
  }
205
186
  }
206
- if (w.length || D.length) {
187
+ if (k.length || N.length) {
207
188
  let e = [
208
- ...C.map((e) => `${encodeURIComponent(e.name)}=${encodeURIComponent(e.value)}`),
209
- ...w.map((e) => `${e.name}=${e.value}`),
210
- ...D
211
- ].join("; "), t = _.find((e) => e.name.toLowerCase() === "cookie");
212
- t ? _.splice(_.indexOf(t), 1, {
189
+ ...O.map((e) => `${encodeURIComponent(e.name)}=${encodeURIComponent(e.value)}`),
190
+ ...k.map((e) => `${e.name}=${e.value}`),
191
+ ...N
192
+ ].join("; "), t = E.find((e) => e.name.toLowerCase() === "cookie");
193
+ t ? E.splice(E.indexOf(t), 1, {
213
194
  ...t,
214
195
  value: t.value ? `${t.value}; ${e}` : e
215
- }) : _.push({
196
+ }) : E.push({
216
197
  name: "Cookie",
217
198
  value: e
218
199
  });
219
200
  }
220
- if (E.length) {
221
- let e = T.indexOf("#"), t = e < 0 ? "" : T.slice(e), n = e < 0 ? T : T.slice(0, e);
222
- T = `${n}${n.includes("?") ? "&" : "?"}${E.join("&")}${t}`;
201
+ if (M.length) {
202
+ let e = A.indexOf("#"), t = e < 0 ? "" : A.slice(e), n = e < 0 ? A : A.slice(0, e);
203
+ A = `${n}${n.includes("?") ? "&" : "?"}${M.join("&")}${t}`;
223
204
  }
224
- return {
225
- url: T,
226
- headers: _,
227
- queryString: x,
228
- cookies: w.length || D.length ? [] : C,
229
- hasCookieStyleEntries: w.length > 0 || D.length > 0,
230
- ...E.length ? { hasSerializedQuery: !0 } : {}
205
+ return j && m(A), {
206
+ url: A,
207
+ headers: E,
208
+ queryString: D,
209
+ cookies: k.length || N.length ? [] : O,
210
+ hasCookieStyleEntries: k.length > 0 || N.length > 0,
211
+ ...M.length ? { hasSerializedQuery: !0 } : {}
231
212
  };
232
- }, S = (e, t, n, r, i) => {
213
+ }, T = (e, t, n, r, i) => {
233
214
  switch (r) {
234
215
  case "matrix":
235
216
  if (i) {
@@ -237,14 +218,14 @@ var g = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), _ = (e) =
237
218
  let r = n.map((e) => `${t.name}=${e}`).join(";");
238
219
  return e.replace(`{;${t.name}}`, `;${r}`);
239
220
  }
240
- if (f(n)) {
221
+ if (p(n)) {
241
222
  let r = Object.entries(n).map(([e, t]) => `${e}=${t}`).join(";");
242
223
  return e.replace(`{;${t.name}}`, `;${r}`);
243
224
  }
244
225
  return e.replace(`{;${t.name}}`, `;${t.name}=${n}`);
245
226
  }
246
227
  if (Array.isArray(n)) return e.replace(`{;${t.name}}`, `;${t.name}=${n.join(",")}`);
247
- if (f(n)) {
228
+ if (p(n)) {
248
229
  let r = Object.entries(n).map(([e, t]) => `${e},${t}`).join(",");
249
230
  return e.replace(`{;${t.name}}`, `;${t.name}=${r}`);
250
231
  }
@@ -252,14 +233,14 @@ var g = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), _ = (e) =
252
233
  case "label":
253
234
  if (i) {
254
235
  if (Array.isArray(n)) return e.replace(`{.${t.name}}`, `.${n.join(".")}`);
255
- if (f(n)) {
236
+ if (p(n)) {
256
237
  let r = Object.entries(n).map(([e, t]) => `${e}=${t}`).join(".");
257
238
  return e.replace(`{.${t.name}}`, `.${r}`);
258
239
  }
259
240
  return e.replace(`{.${t.name}}`, `.${n}`);
260
241
  }
261
242
  if (Array.isArray(n)) return e.replace(`{.${t.name}}`, `.${n.join(",")}`);
262
- if (f(n)) {
243
+ if (p(n)) {
263
244
  let r = Object.entries(n).map(([e, t]) => `${e},${t}`).join(",");
264
245
  return e.replace(`{.${t.name}}`, `.${r}`);
265
246
  }
@@ -272,6 +253,6 @@ var g = (t) => (t ?? []).map((t) => e(t)).filter((e) => e !== void 0), _ = (e) =
272
253
  }
273
254
  };
274
255
  //#endregion
275
- export { x as processParameters };
256
+ export { y as CookieSerializationError, w as processParameters };
276
257
 
277
258
  //# sourceMappingURL=process-parameters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-parameters.js","names":[],"sources":["../../../../src/code-example/helpers/operation-to-har/process-parameters.ts"],"sourcesContent":["import { isObjectLike } from '@scalar/helpers/object/is-object'\nimport { getParameterExample } from '@scalar/workspace-store/helpers/get-parameter-example'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n getQuerystringParameter,\n serializeQuerystringParameter,\n} from '@scalar/workspace-store/helpers/querystring-parameter'\nimport {\n deSerializeParameter,\n getExampleFromSchema,\n isParamDisabled,\n serializeContentValue,\n serializeCookieStyle,\n serializeDeepObjectStyle,\n serializeFormStyle,\n serializeFormStyleForCookies,\n serializePipeDelimitedStyle,\n serializeSimpleStyle,\n serializeSpaceDelimitedStyle,\n} from '@scalar/workspace-store/request-example'\nimport type { OperationObject, ParameterObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedParameters = {\n /** Named serialized examples already embedded in the URL. */\n hasSerializedQuery?: boolean\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n /** Whether serialized cookie-style values require a complete Cookie header. */\n hasCookieStyleEntries: boolean\n}\n\n/** Ensures we don't have any references in the parameters */\nconst deReferenceParams = (params: OperationObject['parameters']): ParameterObject[] =>\n (params ?? []).map((param) => getResolvedRef(param)).filter((param) => param !== undefined)\n\n/** Whether the parameter allows reserved characters (from param or schema). */\nconst isAllowReserved = (param: ParameterObject): boolean => {\n if ('allowReserved' in param && param.allowReserved !== undefined) {\n return param.allowReserved\n }\n if ('schema' in param && param.schema && typeof param.schema === 'object' && 'allowReserved' in param.schema) {\n return (param.schema as { allowReserved?: boolean }).allowReserved === true\n }\n return false\n}\n\n/** URL encode a value if allowReserved is not set to true. */\nconst encodeQueryValue = (value: string, param: ParameterObject): string => {\n if (isAllowReserved(param)) {\n return value\n }\n return encodeURIComponent(value)\n}\n\n/**\n * Get the style and explode values for a parameter according to OpenAPI 3.1.1 specification.\n * Handles defaults and validation for parameter location restrictions.\n */\nconst getParameterStyleAndExplode = (param: ParameterObject): { style: string; explode: boolean } => {\n // Headers only support 'simple' style\n if (param.in === 'header') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : false\n return { style: 'simple', explode }\n }\n\n // Cookies default to form for compatibility and also support cookie style.\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'style' in param && param.style === 'cookie' ? 'cookie' : 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: 'form',\n querystring: 'form',\n header: 'simple',\n cookie: 'form',\n }[param.in]\n\n // Use provided style or default based on location\n const style = 'style' in param && param.style ? param.style : defaultStyle\n\n // Determine explode value: use provided value or default based on style\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : style === 'form'\n\n return { style, explode }\n}\n\n/**\n * Extract the value for a parameter from example data or schema.\n * Prioritizes example data over schema examples.\n * Returns null if the parameter is disabled so we can skip it.\n */\nconst getParameterValue = (param: ParameterObject, example: string | undefined, defaultDisabled: boolean): unknown => {\n // Try to get value from example first\n const selected = getParameterExample(param, example)\n const exampleValue = selected.example\n\n // If the parameter is disabled, return undefined so we can skip it.\n if (isParamDisabled(param, exampleValue, defaultDisabled)) {\n return undefined\n }\n\n // If the example value is set, return it.\n if (selected.value !== undefined) {\n return deSerializeParameter(selected.value, param)\n }\n\n // Fall back to schema example if available\n if (!('schema' in param) || !param.schema) {\n return undefined\n }\n\n const options = param.in === 'path' ? { emptyString: `{${param.name}}` } : {}\n const schema = getResolvedRef(param.schema)\n return schema ? getExampleFromSchema(schema, options) : undefined\n}\n\n/**\n * Process OpenAPI parameters and return the updated properties.\n * Handles path, query, and header parameters with various styles and explode options.\n *\n * @see https://spec.openapis.org/oas/latest.html#style-values\n */\nexport const processParameters = ({\n harRequest,\n parameters,\n example,\n defaultDisabled,\n}: {\n harRequest: HarRequest\n parameters: OperationObject['parameters']\n /** The name of the example to use */\n example?: string | undefined\n /** Whether to disable parameters by default. */\n defaultDisabled: boolean\n}): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n const newCookies = [...harRequest.cookies]\n const cookieStyleEntries: HarRequest['cookies'] = []\n let newUrl = harRequest.url\n const serializedQuery: string[] = []\n const serializedCookies: string[] = []\n\n // Filter out references\n const deReferencedParams = deReferenceParams(parameters)\n\n for (const param of deReferencedParams) {\n if (!param.in || !param.name) {\n continue\n }\n\n if (param.in === 'querystring') {\n const querystring = getQuerystringParameter(param, example, { defaultDisabled })\n if (querystring) {\n const hashIndex = newUrl.indexOf('#')\n const hash = hashIndex === -1 ? '' : newUrl.slice(hashIndex)\n const base = (hashIndex === -1 ? newUrl : newUrl.slice(0, hashIndex)).split('?')[0]\n const query = serializeQuerystringParameter(querystring)\n newUrl = `${base}${query ? `?${query}` : ''}${hash}`\n }\n continue\n }\n\n const selected = getParameterExample(param, example)\n if (selected.serialized && !isParamDisabled(param, selected.example, defaultDisabled)) {\n const wireValue = String(selected.value)\n switch (param.in) {\n case 'path':\n newUrl = newUrl.replaceAll(`{${param.name}}`, () => wireValue)\n break\n case 'query':\n serializedQuery.push(wireValue)\n break\n case 'header':\n newHeaders.push({ name: param.name, value: wireValue })\n break\n case 'cookie':\n serializedCookies.push(wireValue)\n break\n }\n continue\n }\n if (selected.mediaSerialized && !isParamDisabled(param, selected.example, defaultDisabled)) {\n const text = String(selected.value)\n switch (param.in) {\n case 'query':\n newQueryString.push({ name: param.name, value: encodeQueryValue(text, param) })\n break\n case 'header':\n newHeaders.push({ name: param.name, value: text })\n break\n case 'path':\n newUrl = newUrl.replaceAll(`{${param.name}}`, () => encodeURIComponent(text))\n break\n case 'cookie':\n newCookies.push({ name: param.name, value: text })\n break\n }\n continue\n }\n const paramValue = getParameterValue(param, example, defaultDisabled)\n if (paramValue === undefined) {\n continue\n }\n\n const { style, explode } = getParameterStyleAndExplode(param)\n\n switch (param.in) {\n case 'path': {\n newUrl = processPathParameters(newUrl, param, paramValue, style, explode)\n break\n }\n\n case 'query': {\n // Content type parameters should be serialized according to the parameter's own content type\n if ('content' in param && param.content) {\n // We grab the first for now but eventually we should support selecting the content type per parameter\n const paramContentType = Object.keys(param.content)[0] ?? 'application/json'\n const serializedValue = serializeContentValue(paramValue, paramContentType)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serializedValue, param) })\n break\n }\n\n // Handle query parameters\n switch (style) {\n case 'form': {\n const serialized = serializeFormStyle(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n newQueryString.push({ name: key, value: encodeQueryValue(String(entry.value), param) })\n }\n }\n // Otherwise, convert to string\n else {\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(serialized), param) })\n }\n break\n }\n case 'spaceDelimited': {\n const serialized = serializeSpaceDelimitedStyle(paramValue)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serialized, param) })\n break\n }\n case 'pipeDelimited': {\n const serialized = serializePipeDelimitedStyle(paramValue)\n newQueryString.push({ name: param.name, value: encodeQueryValue(serialized, param) })\n break\n }\n case 'deepObject': {\n // OAS marks deepObject-on-array and deepObject+explode:false as undefined.\n // Mirror process-body: fall back to form/explode:true for arrays and always\n // invoke the serializer for objects so authors get useful output instead of\n // a silently-dropped parameter.\n if (Array.isArray(paramValue)) {\n const serialized = serializeFormStyle(paramValue, true)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n newQueryString.push({ name: key, value: encodeQueryValue(String(entry.value), param) })\n }\n } else {\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(serialized), param) })\n }\n } else {\n const entries = serializeDeepObjectStyle(param.name, paramValue)\n for (const entry of entries) {\n newQueryString.push({ name: entry.key, value: encodeQueryValue(entry.value, param) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: encodeQueryValue(String(paramValue), param) })\n }\n break\n }\n\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n // For arrays, simple style always produces comma-separated values regardless of explode\n // The explode parameter only affects object serialization\n case 'header': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n newHeaders.push({ name: param.name, value: String(serialized) })\n break\n }\n\n // Keep cookie style separate so snippet generators cannot percent-encode it.\n case 'cookie': {\n if (style === 'cookie') {\n cookieStyleEntries.push(...serializeCookieStyle(param.name, paramValue, explode))\n break\n }\n const serialized = serializeFormStyleForCookies(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n const value = entry.value === null ? 'null' : String(entry.value)\n newCookies.push({ name: key, value })\n }\n }\n // Otherwise, convert to string\n else {\n const value = serialized === null ? 'null' : String(serialized)\n newCookies.push({ name: param.name, value })\n }\n break\n }\n }\n }\n\n // HAR cookie entries are encoded by snippet generators. Use a complete header\n // when cookie style is present, preserving legacy encoding for other cookies.\n if (cookieStyleEntries.length || serializedCookies.length) {\n const cookieValue = [\n ...newCookies.map((cookie) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`),\n ...cookieStyleEntries.map((cookie) => `${cookie.name}=${cookie.value}`),\n ...serializedCookies,\n ].join('; ')\n const existing = newHeaders.find((header) => header.name.toLowerCase() === 'cookie')\n if (existing) {\n newHeaders.splice(newHeaders.indexOf(existing), 1, {\n ...existing,\n value: existing.value ? `${existing.value}; ${cookieValue}` : cookieValue,\n })\n } else {\n newHeaders.push({ name: 'Cookie', value: cookieValue })\n }\n }\n\n if (serializedQuery.length) {\n const hashIndex = newUrl.indexOf('#')\n const hash = hashIndex < 0 ? '' : newUrl.slice(hashIndex)\n const base = hashIndex < 0 ? newUrl : newUrl.slice(0, hashIndex)\n newUrl = `${base}${base.includes('?') ? '&' : '?'}${serializedQuery.join('&')}${hash}`\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: cookieStyleEntries.length || serializedCookies.length ? [] : newCookies,\n hasCookieStyleEntries: cookieStyleEntries.length > 0 || serializedCookies.length > 0,\n ...(serializedQuery.length ? { hasSerializedQuery: true } : {}),\n }\n}\n\n/**\n * Process path parameters according to OpenAPI specification.\n * Handles matrix, label, and simple styles with explode options.\n *\n * @param url - The URL to process\n * @param param - The parameter object\n * @param paramValue - The value of the parameter\n * @param style - The style of the parameter (matrix, label, simple)\n * @param explode - Whether to explode the parameter\n * @returns The updated URL with processed path parameters\n */\nconst processPathParameters = (\n url: string,\n param: ParameterObject,\n paramValue: unknown,\n style: string,\n explode: boolean,\n): string => {\n switch (style) {\n case 'matrix': {\n if (explode) {\n // Matrix explode array: ;color=blue;color=black;color=brown\n if (Array.isArray(paramValue)) {\n const values = paramValue.map((v: unknown) => `${param.name}=${v}`).join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode object: ;R=100;G=200;B=150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k}=${v}`)\n .join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n\n // Matrix no explode array: ;color=blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue.join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n return url.replace(`{;${param.name}}`, `;${param.name}=${values}`)\n }\n\n // Matrix no explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n case 'label': {\n if (explode) {\n // Label explode array: .blue.black.brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${paramValue.join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n // Label no explode array: .blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${paramValue.join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label no explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n case 'simple': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n return url.replace(`{${param.name}}`, String(serialized))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"process-parameters.js","names":[],"sources":["../../../../src/code-example/helpers/operation-to-har/process-parameters.ts"],"sourcesContent":["import { getCookieSerializationError } from '@scalar/helpers/http/get-cookie-serialization-error'\nimport { isObjectLike } from '@scalar/helpers/object/is-object'\nimport {\n assertReservedPathUrl,\n serializeReservedPathParameter,\n} from '@scalar/workspace-store/helpers/encode-path-parameter'\nimport { getParameterExample } from '@scalar/workspace-store/helpers/get-parameter-example'\nimport { getResolvedRef } from '@scalar/workspace-store/helpers/get-resolved-ref'\nimport {\n getQuerystringParameter,\n serializeQuerystringParameter,\n} from '@scalar/workspace-store/helpers/querystring-parameter'\nimport {\n deSerializeParameter,\n getExampleFromSchema,\n isParamDisabled,\n serializeContentValue,\n serializeCookieStyle,\n serializeDeepObjectStyle,\n serializeFormStyle,\n serializeFormStyleForCookies,\n serializePipeDelimitedStyle,\n serializeSimpleStyle,\n serializeSpaceDelimitedStyle,\n} from '@scalar/workspace-store/request-example'\nimport type { OperationObject, ParameterObject } from '@scalar/workspace-store/schemas/v3.2/strict/openapi-document'\nimport type { Request as HarRequest } from 'har-format'\n\n/** An invalid cookie declaration that authors can repair before generating a sample. */\nexport class CookieSerializationError extends Error {}\n\ntype ProcessedParameters = {\n /** Named serialized examples already embedded in the URL. */\n hasSerializedQuery?: boolean\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n /** Whether serialized cookie-style values require a complete Cookie header. */\n hasCookieStyleEntries: boolean\n}\n\n/** Ensures we don't have any references in the parameters */\nconst deReferenceParams = (params: OperationObject['parameters']): ParameterObject[] =>\n (params ?? []).map((param) => getResolvedRef(param)).filter((param) => param !== undefined)\n\n/** Whether the parameter allows reserved characters (from param or schema). */\nconst isAllowReserved = (param: ParameterObject): boolean => {\n if ('allowReserved' in param && param.allowReserved !== undefined) {\n return param.allowReserved\n }\n if ('schema' in param && param.schema && typeof param.schema === 'object' && 'allowReserved' in param.schema) {\n return (param.schema as { allowReserved?: boolean }).allowReserved === true\n }\n return false\n}\n\n/**\n * Get the style and explode values for a parameter according to OpenAPI 3.1.1 specification.\n * Handles defaults and validation for parameter location restrictions.\n */\nconst getParameterStyleAndExplode = (param: ParameterObject): { style: string; explode: boolean } => {\n // Headers only support 'simple' style\n if (param.in === 'header') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : false\n return { style: 'simple', explode }\n }\n\n // Cookies default to form for compatibility and also support cookie style.\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'style' in param && param.style === 'cookie' ? 'cookie' : 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: 'form',\n querystring: 'form',\n header: 'simple',\n cookie: 'form',\n }[param.in]\n\n // Use provided style or default based on location\n const style = 'style' in param && param.style ? param.style : defaultStyle\n\n // Determine explode value: use provided value or default based on style\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : style === 'form'\n\n return { style, explode }\n}\n\n/**\n * Extract the value for a parameter from example data or schema.\n * Prioritizes example data over schema examples.\n * Returns null if the parameter is disabled so we can skip it.\n */\nconst getParameterValue = (param: ParameterObject, example: string | undefined, defaultDisabled: boolean): unknown => {\n // Try to get value from example first\n const selected = getParameterExample(param, example)\n const exampleValue = selected.example\n\n // If the parameter is disabled, return undefined so we can skip it.\n if (isParamDisabled(param, exampleValue, defaultDisabled)) {\n return undefined\n }\n\n // If the example value is set, return it.\n if (selected.value !== undefined) {\n return deSerializeParameter(selected.value, param)\n }\n\n // Fall back to schema example if available\n if (!('schema' in param) || !param.schema) {\n return undefined\n }\n\n const options = param.in === 'path' ? { emptyString: `{${param.name}}` } : {}\n const schema = getResolvedRef(param.schema)\n return schema ? getExampleFromSchema(schema, options) : undefined\n}\n\n/**\n * Process OpenAPI parameters and return the updated properties.\n * Handles path, query, and header parameters with various styles and explode options.\n *\n * @see https://spec.openapis.org/oas/latest.html#style-values\n */\nexport const processParameters = ({\n harRequest,\n parameters,\n example,\n defaultDisabled,\n openapiVersion,\n}: {\n harRequest: HarRequest\n parameters: OperationObject['parameters']\n /** The name of the example to use */\n example?: string | undefined\n /** Whether to disable parameters by default. */\n defaultDisabled: boolean\n /** Originating API description version. */\n openapiVersion?: string\n}): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n const newCookies = [...harRequest.cookies]\n const cookieStyleEntries: HarRequest['cookies'] = []\n let newUrl = harRequest.url\n let hasReservedPathParameter = false\n const serializedQuery: string[] = []\n const serializedCookies: string[] = []\n\n const appendQueryParameter = (name: string, value: string, param: ParameterObject): void => {\n if (isAllowReserved(param)) {\n // HTTP clients cannot infer reserved expansion from a HAR name/value pair.\n serializedQuery.push(`${encodeURIComponent(name)}=${value}`)\n } else {\n newQueryString.push({ name, value })\n }\n }\n\n // Filter out references\n const deReferencedParams = deReferenceParams(parameters)\n\n for (const param of deReferencedParams) {\n if (!param.in || !param.name) {\n continue\n }\n\n if (param.in === 'querystring') {\n const querystring = getQuerystringParameter(param, example, { defaultDisabled })\n if (querystring) {\n const hashIndex = newUrl.indexOf('#')\n const hash = hashIndex === -1 ? '' : newUrl.slice(hashIndex)\n const base = (hashIndex === -1 ? newUrl : newUrl.slice(0, hashIndex)).split('?')[0]\n const query = serializeQuerystringParameter(querystring)\n newUrl = `${base}${query ? `?${query}` : ''}${hash}`\n }\n continue\n }\n\n const selected = getParameterExample(param, example)\n if (selected.serialized && !isParamDisabled(param, selected.example, defaultDisabled)) {\n const wireValue = String(selected.value)\n switch (param.in) {\n case 'path':\n newUrl = newUrl.replaceAll(`{${param.name}}`, () => wireValue)\n break\n case 'query':\n serializedQuery.push(wireValue)\n break\n case 'header':\n newHeaders.push({ name: param.name, value: wireValue })\n break\n case 'cookie':\n serializedCookies.push(wireValue)\n break\n }\n continue\n }\n if (selected.mediaSerialized && !isParamDisabled(param, selected.example, defaultDisabled)) {\n const text = String(selected.value)\n switch (param.in) {\n case 'query':\n appendQueryParameter(param.name, text, param)\n break\n case 'header':\n newHeaders.push({ name: param.name, value: text })\n break\n case 'path':\n newUrl = newUrl.replaceAll(`{${param.name}}`, () => encodeURIComponent(text))\n break\n case 'cookie':\n newCookies.push({ name: param.name, value: text })\n break\n }\n continue\n }\n const paramValue = getParameterValue(param, example, defaultDisabled)\n if (paramValue === undefined) {\n continue\n }\n\n const { style, explode } = getParameterStyleAndExplode(param)\n\n switch (param.in) {\n case 'path': {\n const allowReserved = openapiVersion?.startsWith('3.2.') && 'schema' in param && param.allowReserved === true\n hasReservedPathParameter ||= Boolean(allowReserved)\n const pathValue = allowReserved\n ? serializeReservedPathParameter(param.name, { value: paramValue, style, explode })\n : undefined\n newUrl =\n pathValue === undefined\n ? processPathParameters(newUrl, param, paramValue, style, explode)\n : newUrl.replaceAll(`{${param.name}}`, () => pathValue)\n break\n }\n\n case 'query': {\n // Content type parameters should be serialized according to the parameter's own content type\n if ('content' in param && param.content) {\n // We grab the first for now but eventually we should support selecting the content type per parameter\n const paramContentType = Object.keys(param.content)[0] ?? 'application/json'\n const serializedValue = serializeContentValue(paramValue, paramContentType)\n appendQueryParameter(param.name, serializedValue, param)\n break\n }\n\n // Handle query parameters\n switch (style) {\n case 'form': {\n const serialized = serializeFormStyle(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n appendQueryParameter(key, String(entry.value), param)\n }\n }\n // Otherwise, convert to string\n else {\n appendQueryParameter(param.name, String(serialized), param)\n }\n break\n }\n case 'spaceDelimited': {\n const serialized = serializeSpaceDelimitedStyle(paramValue)\n appendQueryParameter(param.name, serialized, param)\n break\n }\n case 'pipeDelimited': {\n const serialized = serializePipeDelimitedStyle(paramValue)\n appendQueryParameter(param.name, serialized, param)\n break\n }\n case 'deepObject': {\n // OAS marks deepObject-on-array and deepObject+explode:false as undefined.\n // Mirror process-body: fall back to form/explode:true for arrays and always\n // invoke the serializer for objects so authors get useful output instead of\n // a silently-dropped parameter.\n if (Array.isArray(paramValue)) {\n const serialized = serializeFormStyle(paramValue, true)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n appendQueryParameter(key, String(entry.value), param)\n }\n } else {\n appendQueryParameter(param.name, String(serialized), param)\n }\n } else {\n const entries = serializeDeepObjectStyle(param.name, paramValue)\n for (const entry of entries) {\n appendQueryParameter(entry.key, entry.value, param)\n }\n }\n break\n }\n\n // Default to form style\n default:\n appendQueryParameter(param.name, String(paramValue), param)\n }\n break\n }\n\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n // For arrays, simple style always produces comma-separated values regardless of explode\n // The explode parameter only affects object serialization\n case 'header': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n newHeaders.push({ name: param.name, value: String(serialized) })\n break\n }\n\n // Keep cookie style separate so snippet generators cannot percent-encode it.\n case 'cookie': {\n const [major, minor] = (openapiVersion ?? '').split('.')\n const error =\n major === '3' && minor === '2' && !('content' in param)\n ? getCookieSerializationError(param, paramValue)\n : undefined\n if (error) {\n throw new CookieSerializationError(error)\n }\n if (style === 'cookie') {\n cookieStyleEntries.push(...serializeCookieStyle(param.name, paramValue, explode))\n break\n }\n const serialized = serializeFormStyleForCookies(paramValue, explode)\n\n // If serialized is an array of key-value pairs (exploded object or array)\n if (Array.isArray(serialized)) {\n for (const entry of serialized) {\n const key = entry.key || param.name\n const value = entry.value === null ? 'null' : String(entry.value)\n newCookies.push({ name: key, value })\n }\n }\n // Otherwise, convert to string\n else {\n const value = serialized === null ? 'null' : String(serialized)\n newCookies.push({ name: param.name, value })\n }\n break\n }\n }\n }\n\n // HAR cookie entries are encoded by snippet generators. Use a complete header\n // when cookie style is present, preserving legacy encoding for other cookies.\n if (cookieStyleEntries.length || serializedCookies.length) {\n const cookieValue = [\n ...newCookies.map((cookie) => `${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`),\n ...cookieStyleEntries.map((cookie) => `${cookie.name}=${cookie.value}`),\n ...serializedCookies,\n ].join('; ')\n const existing = newHeaders.find((header) => header.name.toLowerCase() === 'cookie')\n if (existing) {\n newHeaders.splice(newHeaders.indexOf(existing), 1, {\n ...existing,\n value: existing.value ? `${existing.value}; ${cookieValue}` : cookieValue,\n })\n } else {\n newHeaders.push({ name: 'Cookie', value: cookieValue })\n }\n }\n\n if (serializedQuery.length) {\n const hashIndex = newUrl.indexOf('#')\n const hash = hashIndex < 0 ? '' : newUrl.slice(hashIndex)\n const base = hashIndex < 0 ? newUrl : newUrl.slice(0, hashIndex)\n newUrl = `${base}${base.includes('?') ? '&' : '?'}${serializedQuery.join('&')}${hash}`\n }\n\n if (hasReservedPathParameter) {\n assertReservedPathUrl(newUrl)\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: cookieStyleEntries.length || serializedCookies.length ? [] : newCookies,\n hasCookieStyleEntries: cookieStyleEntries.length > 0 || serializedCookies.length > 0,\n ...(serializedQuery.length ? { hasSerializedQuery: true } : {}),\n }\n}\n\n/**\n * Process path parameters according to OpenAPI specification.\n * Handles matrix, label, and simple styles with explode options.\n *\n * @param url - The URL to process\n * @param param - The parameter object\n * @param paramValue - The value of the parameter\n * @param style - The style of the parameter (matrix, label, simple)\n * @param explode - Whether to explode the parameter\n * @returns The updated URL with processed path parameters\n */\nconst processPathParameters = (\n url: string,\n param: ParameterObject,\n paramValue: unknown,\n style: string,\n explode: boolean,\n): string => {\n switch (style) {\n case 'matrix': {\n if (explode) {\n // Matrix explode array: ;color=blue;color=black;color=brown\n if (Array.isArray(paramValue)) {\n const values = paramValue.map((v: unknown) => `${param.name}=${v}`).join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode object: ;R=100;G=200;B=150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k}=${v}`)\n .join(';')\n return url.replace(`{;${param.name}}`, `;${values}`)\n }\n\n // Matrix explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n\n // Matrix no explode array: ;color=blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue.join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n return url.replace(`{;${param.name}}`, `;${param.name}=${values}`)\n }\n\n // Matrix no explode primitive: ;color=blue\n return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`)\n }\n case 'label': {\n if (explode) {\n // Label explode array: .blue.black.brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${paramValue.join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n // Label no explode array: .blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{.${param.name}}`, `.${paramValue.join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (isObjectLike(paramValue)) {\n const values = Object.entries(paramValue)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{.${param.name}}`, `.${values}`)\n }\n\n // Label no explode primitive: .blue\n return url.replace(`{.${param.name}}`, `.${paramValue}`)\n }\n\n case 'simple': {\n const serialized = serializeSimpleStyle(paramValue, explode)\n return url.replace(`{${param.name}}`, String(serialized))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],"mappings":"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"}
package/dist/constants.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region src/constants.ts
2
- var e = typeof OVERRIDE_PACKAGE_VERSION < "u" ? OVERRIDE_PACKAGE_VERSION : "0.5.0";
2
+ var e = typeof OVERRIDE_PACKAGE_VERSION < "u" ? OVERRIDE_PACKAGE_VERSION : "0.5.1";
3
3
  //#endregion
4
4
  export { e as APP_VERSION };
5
5
 
package/dist/style.css CHANGED
@@ -3964,11 +3964,6 @@
3964
3964
  opacity: 1;
3965
3965
  }
3966
3966
 
3967
- .scalar-app .shadow {
3968
- --tw-shadow: var(--scalar-shadow-1);
3969
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3970
- }
3971
-
3972
3967
  .scalar-app .shadow-border {
3973
3968
  --tw-shadow: inset 0 0 0 var(--scalar-border-width) var(--scalar-border-color);
3974
3969
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -3994,6 +3989,11 @@
3994
3989
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3995
3990
  }
3996
3991
 
3992
+ .scalar-app .inset-shadow-border {
3993
+ --tw-inset-shadow: inset 0 0 0 var(--scalar-border-width) var(--scalar-border-color);
3994
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
3995
+ }
3996
+
3997
3997
  .scalar-app .outline {
3998
3998
  outline-style: var(--tw-outline-style);
3999
3999
  outline-width: 1px;
@@ -4020,11 +4020,6 @@
4020
4020
  filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
4021
4021
  }
4022
4022
 
4023
- .scalar-app .brightness-lifted {
4024
- --tw-brightness: brightness(var(--scalar-lifted-brightness));
4025
- filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
4026
- }
4027
-
4028
4023
  .scalar-app .filter {
4029
4024
  filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
4030
4025
  }
@@ -4280,32 +4275,6 @@
4280
4275
  display: none !important;
4281
4276
  }
4282
4277
 
4283
- .scalar-app .after\:pointer-events-none:after {
4284
- content: var(--tw-content);
4285
- pointer-events: none;
4286
- }
4287
-
4288
- .scalar-app .after\:absolute:after {
4289
- content: var(--tw-content);
4290
- position: absolute;
4291
- }
4292
-
4293
- .scalar-app .after\:inset-0:after {
4294
- content: var(--tw-content);
4295
- inset: 0;
4296
- }
4297
-
4298
- .scalar-app .after\:rounded-\[inherit\]:after {
4299
- content: var(--tw-content);
4300
- border-radius: inherit;
4301
- }
4302
-
4303
- .scalar-app .after\:shadow-border:after {
4304
- content: var(--tw-content);
4305
- --tw-shadow: inset 0 0 0 var(--scalar-border-width) var(--scalar-border-color);
4306
- box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
4307
- }
4308
-
4309
4278
  .scalar-app .first\:rounded-t-\[inherit\]:first-child {
4310
4279
  border-top-left-radius: inherit;
4311
4280
  border-top-right-radius: inherit;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "blocks",
18
18
  "docs"
19
19
  ],
20
- "version": "0.5.0",
20
+ "version": "0.5.1",
21
21
  "engines": {
22
22
  "node": ">=22"
23
23
  },
@@ -62,15 +62,15 @@
62
62
  "CHANGELOG.md"
63
63
  ],
64
64
  "dependencies": {
65
- "@scalar/components": "0.30.7",
66
- "@scalar/helpers": "0.16.1",
65
+ "@scalar/components": "0.31.0",
66
+ "@scalar/helpers": "0.16.2",
67
67
  "@scalar/icons": "0.7.6",
68
- "@scalar/localization": "0.2.5",
69
- "@scalar/snippetz": "0.10.6",
70
- "@scalar/themes": "0.18.1",
71
- "@scalar/types": "0.23.0",
72
- "@scalar/use-hooks": "0.4.18",
73
- "@scalar/workspace-store": "0.68.1",
68
+ "@scalar/localization": "0.2.6",
69
+ "@scalar/snippetz": "0.10.7",
70
+ "@scalar/themes": "0.19.0",
71
+ "@scalar/types": "0.23.1",
72
+ "@scalar/use-hooks": "0.4.19",
73
+ "@scalar/workspace-store": "0.68.2",
74
74
  "@types/har-format": "^1.2.16",
75
75
  "@vueuse/core": "13.9.0",
76
76
  "js-base64": "^3.9.2",