UNPKG

@scalar/oas-utils

Version:

Open API spec and Yaml handling utilities

267 lines (266 loc) 11.2 kB
import { getExampleFromSchema } from "../../spec-getters/get-example-from-schema.js"; import { isReference } from "@scalar/workspace-store/schemas/v3.1/type-guard"; const deReferenceParams = (params) => { if (isReference(params)) { return []; } return (params ?? []).filter((param) => !isReference(param)); }; const getParameterStyleAndExplode = (param) => { if (param.in === "header") { const explode2 = "explode" in param && param.explode !== void 0 ? param.explode : false; return { style: "simple", explode: explode2 }; } if (param.in === "cookie") { const explode2 = "explode" in param && param.explode !== void 0 ? param.explode : true; return { style: "form", explode: explode2 }; } const defaultStyle = { path: "simple", query: "form", header: "simple", cookie: "form" }[param.in]; const style = "style" in param && param.style ? param.style : defaultStyle; const explode = "explode" in param && param.explode !== void 0 ? param.explode : style === "form"; return { style, explode }; }; const getParameterValue = (param, example) => { if (example && typeof example === "object" && param.name) { const exampleValue = example[param.name]; if (exampleValue !== void 0) { return exampleValue; } } if ("example" in param && param.example) { return param.example; } if ("examples" in param && param.examples) { const examples = param.examples; return examples[param.name] || Object.values(examples)[0]?.value; } if ("schema" in param && param.schema) { const options = param.in === "path" ? { emptyString: `{${param.name}}` } : {}; return getExampleFromSchema(param.schema, options); } return void 0; }; const processParameters = (harRequest, parameters, example) => { const newHeaders = [...harRequest.headers]; const newQueryString = [...harRequest.queryString]; let newUrl = harRequest.url; const deReferencedParams = deReferenceParams(parameters); for (const param of deReferencedParams) { if (!param.in || !param.name) { continue; } const paramValue = getParameterValue(param, example); if (paramValue === void 0) { continue; } const { style, explode } = getParameterStyleAndExplode(param); switch (param.in) { case "path": { newUrl = processPathParameters(newUrl, param, paramValue, style, explode); break; } case "query": { switch (style) { case "form": { if (explode) { if (Array.isArray(paramValue)) { for (const value of paramValue) { newQueryString.push({ name: param.name, value: String(value) }); } } else if (typeof paramValue === "object" && paramValue !== null) { for (const [key, value] of Object.entries(paramValue)) { newQueryString.push({ name: key, value: String(value) }); } } else { newQueryString.push({ name: param.name, value: String(paramValue) }); } } else { if (Array.isArray(paramValue)) { newQueryString.push({ name: param.name, value: paramValue.join(",") }); } else if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k},${v}`).join(","); newQueryString.push({ name: param.name, value: values }); } else { newQueryString.push({ name: param.name, value: String(paramValue) }); } } break; } case "spaceDelimited": { if (Array.isArray(paramValue)) { newQueryString.push({ name: param.name, value: paramValue.join(" ") }); } else if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k} ${v}`).join(" "); newQueryString.push({ name: param.name, value: values }); } break; } case "pipeDelimited": { if (Array.isArray(paramValue)) { newQueryString.push({ name: param.name, value: paramValue.join("|") }); } else if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).flat().join("|"); newQueryString.push({ name: param.name, value: values }); } break; } case "deepObject": { if (explode && typeof paramValue === "object" && paramValue !== null) { for (const [key, value] of Object.entries(paramValue)) { newQueryString.push({ name: `${param.name}[${key}]`, value: String(value) }); } } break; } // Default to form style default: newQueryString.push({ name: param.name, value: String(paramValue) }); } break; } case "header": if (explode) { if (Array.isArray(paramValue)) { for (const value of paramValue) { newHeaders.push({ name: param.name, value: String(value) }); } } else if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k}=${v}`).join(","); newHeaders.push({ name: param.name, value: values }); } else { newHeaders.push({ name: param.name, value: String(paramValue) }); } } else { if (Array.isArray(paramValue)) { newHeaders.push({ name: param.name, value: paramValue.join(",") }); } else if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k},${v}`).join(","); newHeaders.push({ name: param.name, value: values }); } else { newHeaders.push({ name: param.name, value: String(paramValue) }); } } break; case "cookie": if (explode) { if (Array.isArray(paramValue)) { for (const value of paramValue) { harRequest.cookies.push({ name: param.name, value: value === null ? "null" : String(value) }); } } else if (typeof paramValue === "object" && paramValue !== null) { for (const [key, value] of Object.entries(paramValue)) { harRequest.cookies.push({ name: key, value: value === null ? "null" : String(value) }); } } else { harRequest.cookies.push({ name: param.name, value: paramValue === null ? "null" : String(paramValue) }); } } else { if (Array.isArray(paramValue)) { const serializedValues = paramValue.map((v) => v === null ? "null" : String(v)).join(","); harRequest.cookies.push({ name: param.name, value: serializedValues }); } else if (typeof paramValue === "object" && paramValue !== null) { const flattenObject = (obj) => { const result = []; for (const [key, value] of Object.entries(obj)) { if (typeof value === "object" && value !== null && !Array.isArray(value)) { result.push(key, ...flattenObject(value)); } else { result.push(key, value === null ? "null" : String(value)); } } return result; }; const values = flattenObject(paramValue).join(","); harRequest.cookies.push({ name: param.name, value: values }); } else { harRequest.cookies.push({ name: param.name, value: paramValue === null ? "null" : String(paramValue) }); } } break; } } return { url: newUrl, headers: newHeaders, queryString: newQueryString, cookies: harRequest.cookies }; }; const processPathParameters = (url, param, paramValue, style, explode) => { switch (style) { case "matrix": { if (explode) { if (Array.isArray(paramValue)) { const values = paramValue.map((v) => `${param.name}=${v}`).join(";"); return url.replace(`{;${param.name}}`, `;${values}`); } if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k}=${v}`).join(";"); return url.replace(`{;${param.name}}`, `;${values}`); } return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`); } if (Array.isArray(paramValue)) { return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue.join(",")}`); } if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k},${v}`).join(","); return url.replace(`{;${param.name}}`, `;${param.name}=${values}`); } return url.replace(`{;${param.name}}`, `;${param.name}=${paramValue}`); } case "label": { if (explode) { if (Array.isArray(paramValue)) { return url.replace(`{.${param.name}}`, `.${paramValue.join(".")}`); } if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k}=${v}`).join("."); return url.replace(`{.${param.name}}`, `.${values}`); } return url.replace(`{.${param.name}}`, `.${paramValue}`); } if (Array.isArray(paramValue)) { return url.replace(`{.${param.name}}`, `.${paramValue.join(",")}`); } if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k},${v}`).join(","); return url.replace(`{.${param.name}}`, `.${values}`); } return url.replace(`{.${param.name}}`, `.${paramValue}`); } case "simple": { if (explode) { if (Array.isArray(paramValue)) { return url.replace(`{${param.name}}`, paramValue.join(",")); } if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k}=${v}`).join(","); return url.replace(`{${param.name}}`, values); } return url.replace(`{${param.name}}`, String(paramValue)); } if (Array.isArray(paramValue)) { return url.replace(`{${param.name}}`, paramValue.join(",")); } if (typeof paramValue === "object" && paramValue !== null) { const values = Object.entries(paramValue).map(([k, v]) => `${k},${v}`).join(","); return url.replace(`{${param.name}}`, values); } return url.replace(`{${param.name}}`, String(paramValue)); } // Default to simple style default: return url.replace(`{${param.name}}`, String(paramValue)); } }; export { deReferenceParams, processParameters }; //# sourceMappingURL=process-parameters.js.map