diff --git a/packages/hoppscotch-app/helpers/utils/EffectiveURL.ts b/packages/hoppscotch-app/helpers/utils/EffectiveURL.ts index d2ede9952..276f9d08b 100644 --- a/packages/hoppscotch-app/helpers/utils/EffectiveURL.ts +++ b/packages/hoppscotch-app/helpers/utils/EffectiveURL.ts @@ -14,7 +14,6 @@ import { HoppRESTHeader, HoppRESTParam, } from "@hoppscotch/data" -import { parseTemplateStringV } from "@hoppscotch/data/src/variables" import { arrayFlatMap, arraySort } from "../functional/array" import { toFormData } from "../functional/formData" import { tupleToRecord } from "../functional/record" @@ -306,7 +305,7 @@ export function getEffectiveRESTRequest( return { ...request, - effectiveFinalURL: parseTemplateStringV( + effectiveFinalURL: parseTemplateString( request.endpoint, envVariables, request.vars diff --git a/packages/hoppscotch-data/src/environment.ts b/packages/hoppscotch-data/src/environment.ts index 9d79556d3..15804de3b 100644 --- a/packages/hoppscotch-data/src/environment.ts +++ b/packages/hoppscotch-data/src/environment.ts @@ -9,7 +9,13 @@ export type Environment = { }[] } +export type Variables = { + key: string + value: string +}[] + const REGEX_ENV_VAR = /<<([^>]*)>>/g // "<>" +const REGEX_MY_VAR = /{{([^}]*)}}/g // "{{myVariable}}" /** * How much times can we expand environment variables @@ -60,13 +66,16 @@ export const parseBodyEnvVariables = ( export function parseTemplateStringE( str: string, variables: Environment["variables"], + myVariables?: Variables ) { - if (!variables || !str ) { + + if (!variables || !str || !myVariables) { return E.right(str) } let result = str let depth = 0 + let errorBound = 0 while (result.match(REGEX_ENV_VAR) != null && depth <= ENV_MAX_EXPAND_LIMIT) { result = decodeURI(encodeURI(result)).replace( @@ -76,9 +85,15 @@ export function parseTemplateStringE( depth++ } - return depth > ENV_MAX_EXPAND_LIMIT - ? E.left(ENV_EXPAND_LOOP) - : E.right(result) + while (result.match(REGEX_MY_VAR) != null && errorBound <= ENV_MAX_EXPAND_LIMIT) { + result = decodeURI(encodeURI(result)).replace( + REGEX_MY_VAR, + (_, p1) => myVariables.find((x) => x.key === p1)?.value || "" + ) + errorBound++ + } + + return depth <= ENV_MAX_EXPAND_LIMIT && errorBound <= ENV_MAX_EXPAND_LIMIT ? E.right(result) : E.left(ENV_EXPAND_LOOP); } /** @@ -86,9 +101,10 @@ export function parseTemplateStringE( */ export const parseTemplateString = ( str: string, - variables: Environment["variables"] + variables: Environment["variables"], + myVariables?: Variables ) => pipe( - parseTemplateStringE(str, variables), + parseTemplateStringE(str, variables, myVariables), E.getOrElse(() => str) )