@scalar/oas-utils 0.4.16 → 0.4.18
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 +18 -0
- package/dist/helpers/operation-to-har/operation-to-har.d.ts.map +1 -1
- package/dist/helpers/operation-to-har/operation-to-har.js +12 -5
- package/dist/helpers/operation-to-har/operation-to-har.js.map +2 -2
- package/dist/helpers/operation-to-har/process-body.d.ts +1 -1
- package/dist/helpers/operation-to-har/process-body.d.ts.map +1 -1
- package/dist/helpers/operation-to-har/process-body.js +4 -31
- package/dist/helpers/operation-to-har/process-body.js.map +2 -2
- package/dist/helpers/operation-to-har/process-parameters.d.ts.map +1 -1
- package/dist/helpers/operation-to-har/process-parameters.js +22 -1
- package/dist/helpers/operation-to-har/process-parameters.js.map +2 -2
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @scalar/oas-utils
|
|
2
2
|
|
|
3
|
+
## 0.4.18
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 46bfd2f: fix: show path parameter values in request examples
|
|
8
|
+
|
|
9
|
+
## 0.4.17
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 46ebe6e: fix: use schema to example generator for request example request body
|
|
14
|
+
- Updated dependencies [952bde2]
|
|
15
|
+
- Updated dependencies [5301a80]
|
|
16
|
+
- Updated dependencies [ae8d1b9]
|
|
17
|
+
- Updated dependencies [8199955]
|
|
18
|
+
- Updated dependencies [2888e18]
|
|
19
|
+
- @scalar/workspace-store@0.12.0
|
|
20
|
+
|
|
3
21
|
## 0.4.16
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-to-har.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/operation-to-har.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAMvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAA;AAClG,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,iDAAiD,CAAA;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oDAAoD,CAAA;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6DAA6D,CAAA;AAEvG,MAAM,MAAM,mBAAmB,GAAG;IAChC,+BAA+B;IAC/B,SAAS,EAAE,WAAW,CAAC,eAAe,CAAC,CAAA;IACvC,mCAAmC;IACnC,MAAM,EAAE,UAAU,CAAA;IAClB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACjC,2EAA2E;IAC3E,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAA;CACzC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,gFAQxB,mBAAmB,KAAG,
|
|
1
|
+
{"version":3,"file":"operation-to-har.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/operation-to-har.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAMvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAA;AAClG,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,iDAAiD,CAAA;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oDAAoD,CAAA;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6DAA6D,CAAA;AAEvG,MAAM,MAAM,mBAAmB,GAAG;IAChC,+BAA+B;IAC/B,SAAS,EAAE,WAAW,CAAC,eAAe,CAAC,CAAA;IACvC,mCAAmC;IACnC,MAAM,EAAE,UAAU,CAAA;IAClB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;IACjC,2EAA2E;IAC3E,eAAe,CAAC,EAAE,oBAAoB,EAAE,CAAA;CACzC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,gFAQxB,mBAAmB,KAAG,UAkExB,CAAA"}
|
|
@@ -37,11 +37,18 @@ const operationToHar = ({
|
|
|
37
37
|
const postData = processBody({ operation, contentType, example });
|
|
38
38
|
harRequest.postData = postData;
|
|
39
39
|
harRequest.bodySize = postData.text?.length ?? -1;
|
|
40
|
-
if (postData.mimeType
|
|
41
|
-
harRequest.headers.
|
|
42
|
-
name
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
if (postData.mimeType) {
|
|
41
|
+
const existingContentTypeHeader = harRequest.headers.find(
|
|
42
|
+
(header) => header.name.toLowerCase() === "content-type"
|
|
43
|
+
);
|
|
44
|
+
if (existingContentTypeHeader && !existingContentTypeHeader.value) {
|
|
45
|
+
existingContentTypeHeader.value = postData.mimeType;
|
|
46
|
+
} else {
|
|
47
|
+
harRequest.headers.push({
|
|
48
|
+
name: "Content-Type",
|
|
49
|
+
value: postData.mimeType
|
|
50
|
+
});
|
|
51
|
+
}
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
54
|
if (securitySchemes) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/helpers/operation-to-har/operation-to-har.ts"],
|
|
4
|
-
"sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport type { Request as HarRequest } from 'har-format'\n\nimport { processServerUrl } from './process-server-url'\nimport { processParameters } from './process-parameters'\nimport { processBody } from './process-body'\nimport { processSecuritySchemes } from './process-security-schemes'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/path-operations'\nimport { isReference, type Dereference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/server'\nimport type { SecuritySchemeObject } from '@scalar/workspace-store/schemas/v3.1/strict/security-scheme'\n\nexport type OperationToHarProps = {\n /** OpenAPI Operation object */\n operation: Dereference<OperationObject>\n /** HTTP method of the operation */\n method: HttpMethod\n /** Path of the operation */\n path: string\n /**\n * requestBody.content[contentType].example to use for the request, it should be pre-selected and discriminated\n */\n example?: unknown\n /**\n * Content type of the request\n *\n * @defaults to the first content type in the operation.requestBody.content\n */\n contentType?: string\n /** OpenAPI Server object */\n server?: ServerObject | undefined\n /** OpenAPI SecurityScheme objects which are applicable to the operation */\n securitySchemes?: SecuritySchemeObject[]\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 operation,\n contentType,\n method,\n path,\n server,\n securitySchemes,\n example,\n}: OperationToHarProps): HarRequest => {\n // Initialize the HAR request with basic properties\n const harRequest: HarRequest = {\n method,\n url: path,\n headers: [],\n queryString: [],\n postData: undefined,\n httpVersion: 'HTTP/1.1',\n cookies: [],\n headersSize: -1,\n bodySize: -1,\n }\n\n // Server URL\n if (server?.url) {\n harRequest.url = processServerUrl(server, path)\n }\n\n // Handle parameters\n if (operation.parameters) {\n const { url, headers, queryString, cookies } = processParameters(harRequest, operation.parameters, example)\n harRequest.url = url\n harRequest.headers = headers\n harRequest.queryString = queryString\n harRequest.cookies = cookies\n }\n\n // Handle request body\n if (!isReference(operation.requestBody) && operation.requestBody?.content) {\n const postData = processBody({ operation, contentType, example })\n harRequest.postData = postData\n harRequest.bodySize = postData.text?.length ?? -1\n\n // Add Content-Type header
|
|
5
|
-
"mappings": "AAGA,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAC5B,SAAS,8BAA8B;AAEvC,SAAS,mBAAqC;AAiDvC,MAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuC;AAErC,QAAM,aAAyB;AAAA,IAC7B;AAAA,IACA,KAAK;AAAA,IACL,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS,CAAC;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAGA,MAAI,QAAQ,KAAK;AACf,eAAW,MAAM,iBAAiB,QAAQ,IAAI;AAAA,EAChD;AAGA,MAAI,UAAU,YAAY;AACxB,UAAM,EAAE,KAAK,SAAS,aAAa,QAAQ,IAAI,kBAAkB,YAAY,UAAU,YAAY,OAAO;AAC1G,eAAW,MAAM;AACjB,eAAW,UAAU;AACrB,eAAW,cAAc;AACzB,eAAW,UAAU;AAAA,EACvB;AAGA,MAAI,CAAC,YAAY,UAAU,WAAW,KAAK,UAAU,aAAa,SAAS;AACzE,UAAM,WAAW,YAAY,EAAE,WAAW,aAAa,QAAQ,CAAC;AAChE,eAAW,WAAW;AACtB,eAAW,WAAW,SAAS,MAAM,UAAU;AAG/C,QAAI,SAAS,
|
|
4
|
+
"sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport type { Request as HarRequest } from 'har-format'\n\nimport { processServerUrl } from './process-server-url'\nimport { processParameters } from './process-parameters'\nimport { processBody } from './process-body'\nimport { processSecuritySchemes } from './process-security-schemes'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/path-operations'\nimport { isReference, type Dereference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { ServerObject } from '@scalar/workspace-store/schemas/v3.1/strict/server'\nimport type { SecuritySchemeObject } from '@scalar/workspace-store/schemas/v3.1/strict/security-scheme'\n\nexport type OperationToHarProps = {\n /** OpenAPI Operation object */\n operation: Dereference<OperationObject>\n /** HTTP method of the operation */\n method: HttpMethod\n /** Path of the operation */\n path: string\n /**\n * requestBody.content[contentType].example to use for the request, it should be pre-selected and discriminated\n */\n example?: unknown\n /**\n * Content type of the request\n *\n * @defaults to the first content type in the operation.requestBody.content\n */\n contentType?: string\n /** OpenAPI Server object */\n server?: ServerObject | undefined\n /** OpenAPI SecurityScheme objects which are applicable to the operation */\n securitySchemes?: SecuritySchemeObject[]\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 operation,\n contentType,\n method,\n path,\n server,\n securitySchemes,\n example,\n}: OperationToHarProps): HarRequest => {\n // Initialize the HAR request with basic properties\n const harRequest: HarRequest = {\n method,\n url: path,\n headers: [],\n queryString: [],\n postData: undefined,\n httpVersion: 'HTTP/1.1',\n cookies: [],\n headersSize: -1,\n bodySize: -1,\n }\n\n // Server URL\n if (server?.url) {\n harRequest.url = processServerUrl(server, path)\n }\n\n // Handle parameters\n if (operation.parameters) {\n const { url, headers, queryString, cookies } = processParameters(harRequest, operation.parameters, example)\n harRequest.url = url\n harRequest.headers = headers\n harRequest.queryString = queryString\n harRequest.cookies = cookies\n }\n\n // Handle request body\n if (!isReference(operation.requestBody) && operation.requestBody?.content) {\n const postData = processBody({ operation, contentType, example })\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 (existingContentTypeHeader && !existingContentTypeHeader.value) {\n existingContentTypeHeader.value = postData.mimeType\n }\n // Add new header if none exists\n else {\n harRequest.headers.push({\n name: 'Content-Type',\n value: postData.mimeType,\n })\n }\n }\n }\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 // Calculate headers size\n const headerText = harRequest.headers.map((h) => `${h.name}: ${h.value}`).join('\\r\\n')\n harRequest.headersSize = headerText.length\n\n return harRequest\n}\n"],
|
|
5
|
+
"mappings": "AAGA,SAAS,wBAAwB;AACjC,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAC5B,SAAS,8BAA8B;AAEvC,SAAS,mBAAqC;AAiDvC,MAAM,iBAAiB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuC;AAErC,QAAM,aAAyB;AAAA,IAC7B;AAAA,IACA,KAAK;AAAA,IACL,SAAS,CAAC;AAAA,IACV,aAAa,CAAC;AAAA,IACd,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS,CAAC;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAGA,MAAI,QAAQ,KAAK;AACf,eAAW,MAAM,iBAAiB,QAAQ,IAAI;AAAA,EAChD;AAGA,MAAI,UAAU,YAAY;AACxB,UAAM,EAAE,KAAK,SAAS,aAAa,QAAQ,IAAI,kBAAkB,YAAY,UAAU,YAAY,OAAO;AAC1G,eAAW,MAAM;AACjB,eAAW,UAAU;AACrB,eAAW,cAAc;AACzB,eAAW,UAAU;AAAA,EACvB;AAGA,MAAI,CAAC,YAAY,UAAU,WAAW,KAAK,UAAU,aAAa,SAAS;AACzE,UAAM,WAAW,YAAY,EAAE,WAAW,aAAa,QAAQ,CAAC;AAChE,eAAW,WAAW;AACtB,eAAW,WAAW,SAAS,MAAM,UAAU;AAG/C,QAAI,SAAS,UAAU;AACrB,YAAM,4BAA4B,WAAW,QAAQ;AAAA,QACnD,CAAC,WAAW,OAAO,KAAK,YAAY,MAAM;AAAA,MAC5C;AAEA,UAAI,6BAA6B,CAAC,0BAA0B,OAAO;AACjE,kCAA0B,QAAQ,SAAS;AAAA,MAC7C,OAEK;AACH,mBAAW,QAAQ,KAAK;AAAA,UACtB,MAAM;AAAA,UACN,OAAO,SAAS;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,iBAAiB;AACnB,UAAM,EAAE,SAAS,aAAa,QAAQ,IAAI,uBAAuB,eAAe;AAChF,eAAW,QAAQ,KAAK,GAAG,OAAO;AAClC,eAAW,YAAY,KAAK,GAAG,WAAW;AAC1C,eAAW,QAAQ,KAAK,GAAG,OAAO;AAAA,EACpC;AAGA,QAAM,aAAa,WAAW,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM;AACrF,aAAW,cAAc,WAAW;AAEpC,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OperationToHarProps } from '
|
|
1
|
+
import type { OperationToHarProps } from './operation-to-har.js';
|
|
2
2
|
import type { PostData } from 'har-format';
|
|
3
3
|
type ProcessBodyProps = Pick<OperationToHarProps, 'contentType' | 'operation' | 'example'>;
|
|
4
4
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-body.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"process-body.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D,OAAO,KAAK,EAAS,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEjD,KAAK,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAAC,CAAA;AAoC1F;;GAEG;AACH,eAAO,MAAM,WAAW,wCAAyC,gBAAgB,KAAG,QA6CnF,CAAA"}
|
|
@@ -1,32 +1,5 @@
|
|
|
1
|
+
import { getExampleFromSchema } from "../../spec-getters/get-example-from-schema.js";
|
|
1
2
|
import { isReference } from "@scalar/workspace-store/schemas/v3.1/type-guard";
|
|
2
|
-
const extractExamplesFromSchema = (schema, depth = 0) => {
|
|
3
|
-
if (!schema || depth > 10) {
|
|
4
|
-
return void 0;
|
|
5
|
-
}
|
|
6
|
-
if (schema.examples?.[0] !== void 0) {
|
|
7
|
-
return schema.examples[0];
|
|
8
|
-
}
|
|
9
|
-
if (schema.example !== void 0) {
|
|
10
|
-
return schema.example;
|
|
11
|
-
}
|
|
12
|
-
if (schema.type === "object" && schema.properties) {
|
|
13
|
-
const result = {};
|
|
14
|
-
let hasExamples = false;
|
|
15
|
-
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
16
|
-
const example = extractExamplesFromSchema(propSchema, depth + 1);
|
|
17
|
-
if (example !== void 0) {
|
|
18
|
-
result[key] = example;
|
|
19
|
-
hasExamples = true;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return hasExamples ? result : void 0;
|
|
23
|
-
}
|
|
24
|
-
if (schema.type === "array" && schema.items) {
|
|
25
|
-
const itemExample = extractExamplesFromSchema(schema.items, depth + 1);
|
|
26
|
-
return itemExample !== void 0 ? [itemExample] : void 0;
|
|
27
|
-
}
|
|
28
|
-
return void 0;
|
|
29
|
-
};
|
|
30
3
|
const objectToFormParams = (obj) => {
|
|
31
4
|
const params = [];
|
|
32
5
|
for (const [key, value] of Object.entries(obj)) {
|
|
@@ -50,7 +23,7 @@ const objectToFormParams = (obj) => {
|
|
|
50
23
|
};
|
|
51
24
|
const processBody = ({ operation, contentType, example }) => {
|
|
52
25
|
const content = !operation.requestBody || isReference(operation.requestBody) ? {} : operation.requestBody.content;
|
|
53
|
-
const _contentType = contentType || Object.keys(content)[0];
|
|
26
|
+
const _contentType = (contentType || Object.keys(content)[0]) ?? "";
|
|
54
27
|
const isFormData = _contentType === "multipart/form-data" || _contentType === "application/x-www-form-urlencoded";
|
|
55
28
|
if (example) {
|
|
56
29
|
if (isFormData && typeof example === "object" && example !== null) {
|
|
@@ -64,9 +37,9 @@ const processBody = ({ operation, contentType, example }) => {
|
|
|
64
37
|
text: JSON.stringify(example)
|
|
65
38
|
};
|
|
66
39
|
}
|
|
67
|
-
const contentSchema = content[_contentType
|
|
40
|
+
const contentSchema = content[_contentType]?.schema;
|
|
68
41
|
if (contentSchema) {
|
|
69
|
-
const extractedExample =
|
|
42
|
+
const extractedExample = getExampleFromSchema(contentSchema);
|
|
70
43
|
if (extractedExample !== void 0) {
|
|
71
44
|
if (isFormData && typeof extractedExample === "object" && extractedExample !== null) {
|
|
72
45
|
return {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/helpers/operation-to-har/process-body.ts"],
|
|
4
|
-
"sourcesContent": ["import type { OperationToHarProps } from '
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type { OperationToHarProps } from './operation-to-har'\nimport { getExampleFromSchema } from '@/spec-getters/get-example-from-schema'\nimport { isReference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { Param, PostData } from 'har-format'\n\ntype ProcessBodyProps = Pick<OperationToHarProps, 'contentType' | 'operation' | 'example'>\n\n/**\n * Converts an object to an array of form parameters\n * @param obj - The object to convert\n * @returns Array of form parameters with name and value properties\n */\nconst objectToFormParams = (obj: Record<string, unknown>): Param[] => {\n const params: Param[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null) {\n continue\n }\n\n // Handle arrays by adding each item with the same key\n if (Array.isArray(value)) {\n for (const item of value) {\n params.push({ name: key, value: String(item) })\n }\n }\n // Handle nested objects by flattening them\n else if (typeof value === 'object') {\n const nestedParams = objectToFormParams(value as Record<string, unknown>)\n\n for (const param of nestedParams) {\n params.push({ name: `${key}.${param.name}`, value: param.value })\n }\n } else {\n params.push({ name: key, value: String(value) })\n }\n }\n\n return params\n}\n\n/**\n * Processes the request body and returns the processed data\n */\nexport const processBody = ({ operation, contentType, example }: ProcessBodyProps): PostData => {\n const content = !operation.requestBody || isReference(operation.requestBody) ? {} : operation.requestBody.content\n\n const _contentType = (contentType || Object.keys(content)[0]) ?? ''\n\n // Check if this is a form data content type\n const isFormData = _contentType === 'multipart/form-data' || _contentType === 'application/x-www-form-urlencoded'\n\n // Return the provided top level example\n if (example) {\n if (isFormData && typeof example === 'object' && example !== null) {\n return {\n mimeType: _contentType,\n params: objectToFormParams(example as Record<string, unknown>),\n }\n }\n return {\n mimeType: _contentType,\n text: JSON.stringify(example),\n }\n }\n\n // Try to extract examples from the schema\n const contentSchema = content[_contentType]?.schema\n if (contentSchema) {\n const extractedExample = getExampleFromSchema(contentSchema)\n\n if (extractedExample !== undefined) {\n if (isFormData && typeof extractedExample === 'object' && extractedExample !== null) {\n return {\n mimeType: _contentType,\n params: objectToFormParams(extractedExample as Record<string, unknown>),\n }\n }\n return {\n mimeType: _contentType,\n text: JSON.stringify(extractedExample),\n }\n }\n }\n\n return {\n mimeType: _contentType,\n text: 'null',\n }\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAU5B,MAAM,qBAAqB,CAAC,QAA0C;AACpE,QAAM,SAAkB,CAAC;AAEzB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC;AAAA,IACF;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,QAAQ,OAAO;AACxB,eAAO,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,IAAI,EAAE,CAAC;AAAA,MAChD;AAAA,IACF,WAES,OAAO,UAAU,UAAU;AAClC,YAAM,eAAe,mBAAmB,KAAgC;AAExE,iBAAW,SAAS,cAAc;AAChC,eAAO,KAAK,EAAE,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,IAAI,OAAO,MAAM,MAAM,CAAC;AAAA,MAClE;AAAA,IACF,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,KAAK,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,SAAO;AACT;AAKO,MAAM,cAAc,CAAC,EAAE,WAAW,aAAa,QAAQ,MAAkC;AAC9F,QAAM,UAAU,CAAC,UAAU,eAAe,YAAY,UAAU,WAAW,IAAI,CAAC,IAAI,UAAU,YAAY;AAE1G,QAAM,gBAAgB,eAAe,OAAO,KAAK,OAAO,EAAE,CAAC,MAAM;AAGjE,QAAM,aAAa,iBAAiB,yBAAyB,iBAAiB;AAG9E,MAAI,SAAS;AACX,QAAI,cAAc,OAAO,YAAY,YAAY,YAAY,MAAM;AACjE,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,mBAAmB,OAAkC;AAAA,MAC/D;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,gBAAgB,QAAQ,YAAY,GAAG;AAC7C,MAAI,eAAe;AACjB,UAAM,mBAAmB,qBAAqB,aAAa;AAE3D,QAAI,qBAAqB,QAAW;AAClC,UAAI,cAAc,OAAO,qBAAqB,YAAY,qBAAqB,MAAM;AACnF,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,mBAAmB,gBAA2C;AAAA,QACxE;AAAA,MACF;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,KAAK,UAAU,gBAAgB;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"process-parameters.d.ts","sourceRoot":"","sources":["../../../src/helpers/operation-to-har/process-parameters.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6DAA6D,CAAA;AAClG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAA;AAC5F,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,iDAAiD,CAAA;AAC/F,OAAO,KAAK,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,KAAK,mBAAmB,GAAG;IACzB,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;CAC/B,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,WAAY,WAAW,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,KAAG,eAAe,EAKrG,CAAA;AAoED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,eAChB,UAAU,cACV,CAAC,eAAe,GAAG,eAAe,CAAC,EAAE,YACvC,OAAO,KAChB,mBAsNF,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getExampleFromSchema } from "../../spec-getters/get-example-from-schema.js";
|
|
1
2
|
import { isReference } from "@scalar/workspace-store/schemas/v3.1/type-guard";
|
|
2
3
|
const deReferenceParams = (params) => {
|
|
3
4
|
if (isReference(params)) {
|
|
@@ -24,6 +25,26 @@ const getParameterStyleAndExplode = (param) => {
|
|
|
24
25
|
const explode = "explode" in param && param.explode !== void 0 ? param.explode : style === "form";
|
|
25
26
|
return { style, explode };
|
|
26
27
|
};
|
|
28
|
+
const getParameterValue = (param, example) => {
|
|
29
|
+
if (example && typeof example === "object" && param.name) {
|
|
30
|
+
const exampleValue = example[param.name];
|
|
31
|
+
if (exampleValue !== void 0) {
|
|
32
|
+
return exampleValue;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if ("example" in param && param.example) {
|
|
36
|
+
return param.example;
|
|
37
|
+
}
|
|
38
|
+
if ("examples" in param && param.examples) {
|
|
39
|
+
const examples = param.examples;
|
|
40
|
+
return examples[param.name] || Object.values(examples)[0]?.value;
|
|
41
|
+
}
|
|
42
|
+
if ("schema" in param && param.schema) {
|
|
43
|
+
const options = param.in === "path" ? { emptyString: `{${param.name}}` } : {};
|
|
44
|
+
return getExampleFromSchema(param.schema, options);
|
|
45
|
+
}
|
|
46
|
+
return void 0;
|
|
47
|
+
};
|
|
27
48
|
const processParameters = (harRequest, parameters, example) => {
|
|
28
49
|
const newHeaders = [...harRequest.headers];
|
|
29
50
|
const newQueryString = [...harRequest.queryString];
|
|
@@ -33,7 +54,7 @@ const processParameters = (harRequest, parameters, example) => {
|
|
|
33
54
|
if (!param.in || !param.name) {
|
|
34
55
|
continue;
|
|
35
56
|
}
|
|
36
|
-
const paramValue =
|
|
57
|
+
const paramValue = getParameterValue(param, example);
|
|
37
58
|
if (paramValue === void 0) {
|
|
38
59
|
continue;
|
|
39
60
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/helpers/operation-to-har/process-parameters.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ParameterObject } from '@scalar/workspace-store/schemas/v3.1/strict/parameter'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/path-operations'\nimport type { ReferenceObject } from '@scalar/workspace-store/schemas/v3.1/strict/reference'\nimport { isReference, type Dereference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedParameters = {\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/** Ensures we don't have any references in the parameters */\nexport const deReferenceParams = (params: Dereference<OperationObject>['parameters']): ParameterObject[] => {\n if (isReference(params)) {\n return []\n }\n return (params ?? []).filter((param) => !isReference(param)) as ParameterObject[]\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 only support 'form' style\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: '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 * 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: HarRequest,\n parameters: (ParameterObject | ReferenceObject)[],\n example?: unknown,\n): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n let newUrl = harRequest.url\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 const paramValue =\n example && typeof example === 'object' ? (example as Record<string, unknown>)[param.name] : undefined\n\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 case 'query': {\n // Handle query parameters\n switch (style) {\n case 'form': {\n if (explode) {\n // Form explode array: color=blue&color=black&color=brown\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newQueryString.push({ name: param.name, value: String(value) })\n }\n }\n // Form explode object: R=100&G=200&B=150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: key, value: String(value) })\n }\n }\n // Form explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n } else {\n // Form no explode array: color=blue,black,brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Form no explode object: color=R,100,G,200,B,150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newQueryString.push({ name: param.name, value: values })\n }\n // Form no explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n }\n case 'spaceDelimited': {\n // SpaceDelimited array: color=blue black brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(' ') })\n }\n // SpaceDelimited object: color=R 100 G 200 B 150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k} ${v}`)\n .join(' ')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'pipeDelimited': {\n // PipeDelimited array: color=blue|black|brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join('|') })\n }\n // PipeDelimited object: color=R|100|G|200|B|150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .flat()\n .join('|')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'deepObject': {\n // DeepObject: color[R]=100&color[G]=200&color[B]=150\n if (explode && typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: `${param.name}[${key}]`, value: String(value) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n break\n }\n case 'header':\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n if (explode) {\n // Simple explode array: multiple header values\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newHeaders.push({ name: param.name, value: String(value) })\n }\n }\n // Simple explode object: key=value pairs\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n newHeaders.push({ name: param.name, value: values })\n }\n // Simple explode primitive: single value\n else {\n newHeaders.push({ name: param.name, value: String(paramValue) })\n }\n }\n // Simple no explode: all values joined with commas\n else {\n // Handle array values without explode\n if (Array.isArray(paramValue)) {\n newHeaders.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Handle object values without explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newHeaders.push({ name: param.name, value: values })\n }\n // Handle primitive values without explode\n else {\n newHeaders.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n case 'cookie':\n // Cookies only support 'form' style according to OpenAPI 3.1.1\n if (explode) {\n // Handle array values with explode\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n harRequest.cookies.push({ name: param.name, value: value === null ? 'null' : String(value) })\n }\n }\n // Handle object values with explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n harRequest.cookies.push({ name: key, value: value === null ? 'null' : String(value) })\n }\n }\n // Handle primitive values with explode\n else {\n harRequest.cookies.push({ name: param.name, value: paramValue === null ? 'null' : String(paramValue) })\n }\n } else {\n // Handle array values without explode\n if (Array.isArray(paramValue)) {\n const serializedValues = (paramValue as unknown[]).map((v) => (v === null ? 'null' : String(v))).join(',')\n harRequest.cookies.push({ name: param.name, value: serializedValues })\n }\n // Handle object values without explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n // Handle nested objects by recursively flattening them\n const flattenObject = (obj: Record<string, unknown>): string[] => {\n const result: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n // Recursively flatten nested objects\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n result.push(key, ...flattenObject(value as Record<string, unknown>))\n }\n // Handle primitive values\n else {\n result.push(key, value === null ? 'null' : String(value))\n }\n }\n\n return result\n }\n\n const values = flattenObject(paramValue as Record<string, unknown>).join(',')\n harRequest.cookies.push({ name: param.name, value: values })\n }\n // Handle primitive values without explode\n else {\n harRequest.cookies.push({ name: param.name, value: paramValue === null ? 'null' : String(paramValue) })\n }\n }\n break\n }\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: harRequest.cookies,\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 as unknown[]).map((v) => `${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 (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 as unknown[]).join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 as unknown[]).join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 as unknown[]).join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 if (explode) {\n // Simple explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple explode object: R=100,G=200,B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n // Simple no explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple no explode object: R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple no explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { getExampleFromSchema } from '@/spec-getters/get-example-from-schema'\nimport type { ExampleObject } from '@scalar/workspace-store/schemas/v3.1/strict/example'\nimport type { ParameterObject } from '@scalar/workspace-store/schemas/v3.1/strict/parameter'\nimport type { OperationObject } from '@scalar/workspace-store/schemas/v3.1/strict/path-operations'\nimport type { ReferenceObject } from '@scalar/workspace-store/schemas/v3.1/strict/reference'\nimport { isReference, type Dereference } from '@scalar/workspace-store/schemas/v3.1/type-guard'\nimport type { Request as HarRequest } from 'har-format'\n\ntype ProcessedParameters = {\n url: string\n headers: HarRequest['headers']\n queryString: HarRequest['queryString']\n cookies: HarRequest['cookies']\n}\n\n/** Ensures we don't have any references in the parameters */\nexport const deReferenceParams = (params: Dereference<OperationObject>['parameters']): ParameterObject[] => {\n if (isReference(params)) {\n return []\n }\n return (params ?? []).filter((param) => !isReference(param)) as ParameterObject[]\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 only support 'form' style\n if (param.in === 'cookie') {\n const explode = 'explode' in param && param.explode !== undefined ? param.explode : true\n return { style: 'form', explode }\n }\n\n const defaultStyle = {\n path: 'simple',\n query: '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 */\nconst getParameterValue = (param: ParameterObject, example?: unknown): unknown => {\n // First try to get value from example data\n if (example && typeof example === 'object' && param.name) {\n const exampleValue = (example as Record<string, unknown>)[param.name]\n if (exampleValue !== undefined) {\n return exampleValue\n }\n }\n\n // Check if the parameter itself has an example\n if ('example' in param && param.example) {\n return param.example\n }\n\n // Or multiple examples\n if ('examples' in param && param.examples) {\n const examples = param.examples as Record<string, unknown>\n return examples[param.name] || (Object.values(examples)[0] as ExampleObject | undefined)?.value\n }\n\n // Fall back to schema example if available\n if ('schema' in param && param.schema) {\n const options = param.in === 'path' ? { emptyString: `{${param.name}}` } : {}\n return getExampleFromSchema(param.schema, options)\n }\n\n return 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: HarRequest,\n parameters: (ParameterObject | ReferenceObject)[],\n example?: unknown,\n): ProcessedParameters => {\n // Create copies of the arrays to avoid modifying the input\n const newHeaders = [...harRequest.headers]\n const newQueryString = [...harRequest.queryString]\n let newUrl = harRequest.url\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 const paramValue = getParameterValue(param, example)\n\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 case 'query': {\n // Handle query parameters\n switch (style) {\n case 'form': {\n if (explode) {\n // Form explode array: color=blue&color=black&color=brown\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newQueryString.push({ name: param.name, value: String(value) })\n }\n }\n // Form explode object: R=100&G=200&B=150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: key, value: String(value) })\n }\n }\n // Form explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n } else {\n // Form no explode array: color=blue,black,brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Form no explode object: color=R,100,G,200,B,150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newQueryString.push({ name: param.name, value: values })\n }\n // Form no explode primitive: color=blue\n else {\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n }\n case 'spaceDelimited': {\n // SpaceDelimited array: color=blue black brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join(' ') })\n }\n // SpaceDelimited object: color=R 100 G 200 B 150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k} ${v}`)\n .join(' ')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'pipeDelimited': {\n // PipeDelimited array: color=blue|black|brown\n if (Array.isArray(paramValue)) {\n newQueryString.push({ name: param.name, value: (paramValue as unknown[]).join('|') })\n }\n // PipeDelimited object: color=R|100|G|200|B|150\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .flat()\n .join('|')\n newQueryString.push({ name: param.name, value: values })\n }\n break\n }\n case 'deepObject': {\n // DeepObject: color[R]=100&color[G]=200&color[B]=150\n if (explode && typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n newQueryString.push({ name: `${param.name}[${key}]`, value: String(value) })\n }\n }\n break\n }\n\n // Default to form style\n default:\n newQueryString.push({ name: param.name, value: String(paramValue) })\n }\n break\n }\n case 'header':\n // Headers only support 'simple' style according to OpenAPI 3.1.1\n if (explode) {\n // Simple explode array: multiple header values\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n newHeaders.push({ name: param.name, value: String(value) })\n }\n }\n // Simple explode object: key=value pairs\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n newHeaders.push({ name: param.name, value: values })\n }\n // Simple explode primitive: single value\n else {\n newHeaders.push({ name: param.name, value: String(paramValue) })\n }\n }\n // Simple no explode: all values joined with commas\n else {\n // Handle array values without explode\n if (Array.isArray(paramValue)) {\n newHeaders.push({ name: param.name, value: (paramValue as unknown[]).join(',') })\n }\n // Handle object values without explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n newHeaders.push({ name: param.name, value: values })\n }\n // Handle primitive values without explode\n else {\n newHeaders.push({ name: param.name, value: String(paramValue) })\n }\n }\n break\n case 'cookie':\n // Cookies only support 'form' style according to OpenAPI 3.1.1\n if (explode) {\n // Handle array values with explode\n if (Array.isArray(paramValue)) {\n for (const value of paramValue as unknown[]) {\n harRequest.cookies.push({ name: param.name, value: value === null ? 'null' : String(value) })\n }\n }\n // Handle object values with explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n for (const [key, value] of Object.entries(paramValue as Record<string, unknown>)) {\n harRequest.cookies.push({ name: key, value: value === null ? 'null' : String(value) })\n }\n }\n // Handle primitive values with explode\n else {\n harRequest.cookies.push({ name: param.name, value: paramValue === null ? 'null' : String(paramValue) })\n }\n } else {\n // Handle array values without explode\n if (Array.isArray(paramValue)) {\n const serializedValues = (paramValue as unknown[]).map((v) => (v === null ? 'null' : String(v))).join(',')\n harRequest.cookies.push({ name: param.name, value: serializedValues })\n }\n // Handle object values without explode\n else if (typeof paramValue === 'object' && paramValue !== null) {\n // Handle nested objects by recursively flattening them\n const flattenObject = (obj: Record<string, unknown>): string[] => {\n const result: string[] = []\n\n for (const [key, value] of Object.entries(obj)) {\n // Recursively flatten nested objects\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n result.push(key, ...flattenObject(value as Record<string, unknown>))\n }\n // Handle primitive values\n else {\n result.push(key, value === null ? 'null' : String(value))\n }\n }\n\n return result\n }\n\n const values = flattenObject(paramValue as Record<string, unknown>).join(',')\n harRequest.cookies.push({ name: param.name, value: values })\n }\n // Handle primitive values without explode\n else {\n harRequest.cookies.push({ name: param.name, value: paramValue === null ? 'null' : String(paramValue) })\n }\n }\n break\n }\n }\n\n return {\n url: newUrl,\n headers: newHeaders,\n queryString: newQueryString,\n cookies: harRequest.cookies,\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 as unknown[]).map((v) => `${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 (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 as unknown[]).join(',')}`)\n }\n\n // Matrix no explode object: ;color=R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 as unknown[]).join('.')}`)\n }\n\n // Label explode object: .R=100.G=200.B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 as unknown[]).join(',')}`)\n }\n\n // Label no explode object: .R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\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 if (explode) {\n // Simple explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple explode object: R=100,G=200,B=150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n // Simple no explode array: blue,black,brown\n if (Array.isArray(paramValue)) {\n return url.replace(`{${param.name}}`, (paramValue as unknown[]).join(','))\n }\n\n // Simple no explode object: R,100,G,200,B,150\n if (typeof paramValue === 'object' && paramValue !== null) {\n const values = Object.entries(paramValue as Record<string, unknown>)\n .map(([k, v]) => `${k},${v}`)\n .join(',')\n\n return url.replace(`{${param.name}}`, values)\n }\n\n // Simple no explode primitive: blue\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n\n // Default to simple style\n default:\n return url.replace(`{${param.name}}`, String(paramValue))\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["explode"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"specification",
|
|
17
17
|
"yaml"
|
|
18
18
|
],
|
|
19
|
-
"version": "0.4.
|
|
19
|
+
"version": "0.4.18",
|
|
20
20
|
"engines": {
|
|
21
21
|
"node": ">=20"
|
|
22
22
|
},
|
|
@@ -99,12 +99,12 @@
|
|
|
99
99
|
"type-fest": "4.41.0",
|
|
100
100
|
"yaml": "2.8.0",
|
|
101
101
|
"zod": "3.24.1",
|
|
102
|
-
"@scalar/
|
|
102
|
+
"@scalar/helpers": "0.0.7",
|
|
103
103
|
"@scalar/openapi-types": "0.3.7",
|
|
104
|
+
"@scalar/object-utils": "1.2.3",
|
|
104
105
|
"@scalar/themes": "0.13.12",
|
|
105
|
-
"@scalar/
|
|
106
|
-
"@scalar/workspace-store": "0.
|
|
107
|
-
"@scalar/types": "0.2.11"
|
|
106
|
+
"@scalar/types": "0.2.11",
|
|
107
|
+
"@scalar/workspace-store": "0.12.0"
|
|
108
108
|
},
|
|
109
109
|
"devDependencies": {
|
|
110
110
|
"@types/node": "^22.9.0",
|
|
@@ -113,8 +113,8 @@
|
|
|
113
113
|
"vitest": "^3.2.4",
|
|
114
114
|
"zod-to-ts": "github:amritk/zod-to-ts#build",
|
|
115
115
|
"@scalar/build-tooling": "0.2.4",
|
|
116
|
-
"@scalar/openapi-
|
|
117
|
-
"@scalar/openapi-
|
|
116
|
+
"@scalar/openapi-types": "0.3.7",
|
|
117
|
+
"@scalar/openapi-parser": "0.19.0"
|
|
118
118
|
},
|
|
119
119
|
"scripts": {
|
|
120
120
|
"build": "scalar-build-esbuild",
|