@scalar/oas-utils
Version:
Open API spec and Yaml handling utilities
267 lines (266 loc) • 11.2 kB
JavaScript
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