import { CONTENT_TYPE_HEADER_KEY } from "constants/ApiEditorConstants/CommonApiConstants"; import { getDynamicStringSegments, isDynamicValue, } from "./DynamicBindingUtils"; /** * This function updates the header at a given index. * If headerIndexToUpdate is -1, i.e the header we are looking for is not present, then * update the header key-value pair in the first non-empty row * @param headers * @param headerIndexToUpdate * @returns */ export const getIndextoUpdate = (headers: any, headerIndexToUpdate: number) => { const firstEmptyHeaderRowIndex: number = headers?.findIndex( (element: { key: string; value: string }) => element && element.key === "" && element.value === "", ); const newHeaderIndex = firstEmptyHeaderRowIndex > -1 ? firstEmptyHeaderRowIndex : headers.length; const indexToUpdate = headerIndexToUpdate > -1 ? headerIndexToUpdate : newHeaderIndex; return indexToUpdate; }; export const queryParamsRegEx = /([\s\S]*?)(\?(?![^{]*})[\s\S]*)?$/; export function parseUrlForQueryParams(url: string) { const padQueryParams = { key: "", value: "" }; let params = Array(2).fill(padQueryParams); const dynamicValuesDetected: string[] = []; const matchGroup = url.match(queryParamsRegEx) || []; const parsedUrlWithQueryParams = matchGroup[2] || ""; const dynamicStringSegments = getDynamicStringSegments( parsedUrlWithQueryParams, ); const templateStringSegments = dynamicStringSegments.map((segment) => { if (isDynamicValue(segment)) { dynamicValuesDetected.push(segment); return "~"; } return segment; }); if (parsedUrlWithQueryParams.indexOf("?") > -1) { const paramsString = templateStringSegments .join("") .slice(parsedUrlWithQueryParams.indexOf("?") + 1); const paramsWithDynamicValues = paramsString.split("&").map((p) => { const firstEqualPos = p.indexOf("="); const keyValue = firstEqualPos > -1 ? [p.substring(0, firstEqualPos), p.substring(firstEqualPos + 1)] : []; return { key: keyValue[0] || "", value: keyValue[1] || "" }; }); params = paramsWithDynamicValues.map((queryParam) => { // this time around we check for both key and values. if (queryParam.value.includes("~") || queryParam.key.includes("~")) { let newVal = queryParam.value; let newKey = queryParam.key; if (queryParam.key.includes("~")) { newKey = queryParam?.key?.replace(/~/, dynamicValuesDetected[0]); // remove the first index from detected dynamic values. dynamicValuesDetected.shift(); } if (queryParam.value.includes("~")) { newVal = queryParam?.value?.replace(/~/, dynamicValuesDetected[0]); // remove the first index from detected dynamic values. dynamicValuesDetected.shift(); } // dynamicValuesDetected.shift(); return { key: newKey, value: newVal }; } return queryParam; }); } return params; } /** * * @param headers Array of key value pairs * @returns string body type of API request */ export function getContentTypeHeaderValue( headers: Array<{ key: string; value: string }>, ): string { return ( headers.find( (h: { key: string; value: string }) => h.key?.trim().toLowerCase() === CONTENT_TYPE_HEADER_KEY, )?.value || "" ); }