From 79bb3971361f5221c449dd422b738076a5d91a3e Mon Sep 17 00:00:00 2001 From: liyasthomas Date: Thu, 27 Jan 2022 21:11:09 +0530 Subject: [PATCH 01/10] feat: smartEnv in environments --- .../hoppscotch-app/components/environments/Edit.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/hoppscotch-app/components/environments/Edit.vue b/packages/hoppscotch-app/components/environments/Edit.vue index 826a0c4fb..2bda3f7d5 100644 --- a/packages/hoppscotch-app/components/environments/Edit.vue +++ b/packages/hoppscotch-app/components/environments/Edit.vue @@ -53,9 +53,15 @@ :placeholder="`${$t('count.variable', { count: index + 1 })}`" :name="'param' + index" /> - From 4003d47cbb7b28152f555ecd5e3fbe52b519517d Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Fri, 28 Jan 2022 16:54:45 +0530 Subject: [PATCH 02/10] feat: recursive environment variable resolution --- packages/hoppscotch-app/helpers/templating.ts | 86 ++++++++++++++++--- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/packages/hoppscotch-app/helpers/templating.ts b/packages/hoppscotch-app/helpers/templating.ts index 64f9556be..0c4a9667c 100644 --- a/packages/hoppscotch-app/helpers/templating.ts +++ b/packages/hoppscotch-app/helpers/templating.ts @@ -1,25 +1,87 @@ +import * as E from "fp-ts/Either" +import { pipe } from "fp-ts/function" import { Environment } from "~/newstore/environments" -export function parseBodyEnvVariables( +const REGEX_ENV_VAR = /<<([^>]*)>>/g // "<>" + +/** + * How much times can we expand environment variables + */ +const ENV_MAX_EXPAND_LIMIT = 10 + +/** + * Error state when there is a suspected loop while + * recursively expanding variables + */ +const ENV_EXPAND_LOOP = "ENV_EXPAND_LOOP" as const + +export function parseBodyEnvVariablesE( body: string, env: Environment["variables"] ) { - return body.replace(/<<\w+>>/g, (key) => { - const found = env.find((envVar) => envVar.key === key.replace(/[<>]/g, "")) - return found ? found.value : key - }) + let result = body + let depth = 0 + + while (result.match(REGEX_ENV_VAR) != null && depth <= ENV_MAX_EXPAND_LIMIT) { + result = result.replace(/<<\w+>>/g, (key) => { + const found = env.find( + (envVar) => envVar.key === key.replace(/[<>]/g, "") + ) + return found ? found.value : key + }) + + depth++ + } + + return depth > ENV_MAX_EXPAND_LIMIT + ? E.left(ENV_EXPAND_LOOP) + : E.right(result) } -export function parseTemplateString( +/** + * @deprecated Use `parseBodyEnvVariablesE` instead. + */ +export const parseBodyEnvVariables = ( + body: string, + env: Environment["variables"] +) => + pipe( + parseBodyEnvVariablesE(body, env), + E.getOrElse(() => body) + ) + +export function parseTemplateStringE( str: string, variables: Environment["variables"] ) { if (!variables || !str) { - return str + return E.right(str) } - const searchTerm = /<<([^>]*)>>/g // "<>" - return decodeURI(encodeURI(str)).replace( - searchTerm, - (_, p1) => variables.find((x) => x.key === p1)?.value || "" - ) + + let result = str + let depth = 0 + + while (result.match(REGEX_ENV_VAR) != null && depth <= ENV_MAX_EXPAND_LIMIT) { + result = decodeURI(encodeURI(result)).replace( + REGEX_ENV_VAR, + (_, p1) => variables.find((x) => x.key === p1)?.value || "" + ) + depth++ + } + + return depth > ENV_MAX_EXPAND_LIMIT + ? E.left(ENV_EXPAND_LOOP) + : E.right(result) } + +/** + * @deprecated Use `parseTemplateStringE` instead + */ +export const parseTemplateString = ( + str: string, + variables: Environment["variables"] +) => + pipe( + parseTemplateStringE(str, variables), + E.getOrElse(() => str) + ) From a9c35c179dd533e903352710937a4c3c74890281 Mon Sep 17 00:00:00 2001 From: liyasthomas Date: Fri, 28 Jan 2022 22:40:15 +0530 Subject: [PATCH 03/10] fix: display nested environment value in tooltip --- packages/hoppscotch-app/assets/scss/styles.scss | 3 ++- packages/hoppscotch-app/components/smart/EnvInput.vue | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/hoppscotch-app/assets/scss/styles.scss b/packages/hoppscotch-app/assets/scss/styles.scss index 959fe38d9..4fd4b1007 100644 --- a/packages/hoppscotch-app/assets/scss/styles.scss +++ b/packages/hoppscotch-app/assets/scss/styles.scss @@ -146,7 +146,7 @@ a { font-size: 86%; - kbd { + xmp { @apply hidden; @apply sm:inline-flex; @apply font-sans; @@ -156,6 +156,7 @@ a { @apply rounded-sm; @apply px-1; @apply ml-1; + @apply my-0; @apply truncate; } } diff --git a/packages/hoppscotch-app/components/smart/EnvInput.vue b/packages/hoppscotch-app/components/smart/EnvInput.vue index c2cabfa83..05a2bd242 100644 --- a/packages/hoppscotch-app/components/smart/EnvInput.vue +++ b/packages/hoppscotch-app/components/smart/EnvInput.vue @@ -216,9 +216,9 @@ export default defineComponent({ : "bg-accentDark text-accentContrast hover:bg-accent" }" v-tippy data-tippy-content="${this.getEnvName( this.aggregateEnvs.find((k) => k.key === envVar)?.sourceEnv - )} ${this.getEnvValue( + )}${this.getEnvValue( this.aggregateEnvs.find((k) => k.key === envVar)?.value - )}</kbd>">${this.safe_tags_replace( + )}">${this.safe_tags_replace( this.internalValue.substring(position.start, position.end + 1) )}` startingPosition = position.end + 1 From 0668be971b32a25cc1f338c3224498f6ba8e96f3 Mon Sep 17 00:00:00 2001 From: liyasthomas Date: Sat, 29 Jan 2022 18:04:08 +0530 Subject: [PATCH 04/10] feat: display nested env variable value in tooltip --- .../components/smart/EnvInput.vue | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/hoppscotch-app/components/smart/EnvInput.vue b/packages/hoppscotch-app/components/smart/EnvInput.vue index 05a2bd242..b84da1325 100644 --- a/packages/hoppscotch-app/components/smart/EnvInput.vue +++ b/packages/hoppscotch-app/components/smart/EnvInput.vue @@ -28,8 +28,10 @@ import IntervalTree from "node-interval-tree" import debounce from "lodash/debounce" import isUndefined from "lodash/isUndefined" import { tippy } from "vue-tippy" +import * as E from "fp-ts/Either" import { aggregateEnvs$ } from "~/newstore/environments" import { useReadonlyStream } from "~/helpers/utils/composables" +import { parseTemplateStringE } from "~/helpers/templating" const tagsToReplace = { "&": "&", @@ -217,7 +219,7 @@ export default defineComponent({ }" v-tippy data-tippy-content="${this.getEnvName( this.aggregateEnvs.find((k) => k.key === envVar)?.sourceEnv )}${this.getEnvValue( - this.aggregateEnvs.find((k) => k.key === envVar)?.value + this.constructEnv(envVar) )}">${this.safe_tags_replace( this.internalValue.substring(position.start, position.end + 1) )}` @@ -479,6 +481,21 @@ export default defineComponent({ // it does not filter special characters before adding them to HTML. return "not found" }, + constructEnv(envVar) { + const result = parseTemplateStringE( + this.getEnvValue( + this.aggregateEnvs.find((k) => k.key === envVar)?.value + ), + this.aggregateEnvs + ) + + if (E.isLeft(result)) { + console.error("error", result.left) + return "" + } else { + return result.right + } + }, }, }) From 65fc66088131f1094698edd35b75926e66fd11ea Mon Sep 17 00:00:00 2001 From: liyasthomas Date: Sat, 29 Jan 2022 18:42:19 +0530 Subject: [PATCH 05/10] feat: visually indicate nested env expand overflow --- .../hoppscotch-app/assets/scss/styles.scss | 5 ++ .../components/smart/EnvInput.vue | 19 +++++-- .../hoppscotch-app/helpers/terndoc/ecma.json | 57 ++++++------------- packages/hoppscotch-app/locales/af.json | 3 +- packages/hoppscotch-app/locales/ar.json | 3 +- packages/hoppscotch-app/locales/ca.json | 3 +- packages/hoppscotch-app/locales/cn.json | 3 +- packages/hoppscotch-app/locales/cs.json | 3 +- packages/hoppscotch-app/locales/da.json | 3 +- packages/hoppscotch-app/locales/de.json | 3 +- packages/hoppscotch-app/locales/el.json | 3 +- packages/hoppscotch-app/locales/en.json | 3 +- packages/hoppscotch-app/locales/es.json | 3 +- packages/hoppscotch-app/locales/fi.json | 3 +- packages/hoppscotch-app/locales/fr.json | 3 +- packages/hoppscotch-app/locales/he.json | 3 +- packages/hoppscotch-app/locales/hu.json | 3 +- packages/hoppscotch-app/locales/it.json | 3 +- packages/hoppscotch-app/locales/ja.json | 3 +- packages/hoppscotch-app/locales/ko.json | 3 +- packages/hoppscotch-app/locales/nl.json | 3 +- packages/hoppscotch-app/locales/no.json | 3 +- packages/hoppscotch-app/locales/pl.json | 3 +- packages/hoppscotch-app/locales/pt-br.json | 3 +- packages/hoppscotch-app/locales/pt.json | 3 +- packages/hoppscotch-app/locales/ro.json | 3 +- packages/hoppscotch-app/locales/ru.json | 3 +- packages/hoppscotch-app/locales/sr.json | 3 +- packages/hoppscotch-app/locales/sv.json | 3 +- packages/hoppscotch-app/locales/tr.json | 3 +- packages/hoppscotch-app/locales/tw.json | 3 +- packages/hoppscotch-app/locales/uk.json | 3 +- packages/hoppscotch-app/locales/vi.json | 3 +- 33 files changed, 95 insertions(+), 76 deletions(-) diff --git a/packages/hoppscotch-app/assets/scss/styles.scss b/packages/hoppscotch-app/assets/scss/styles.scss index 4fd4b1007..4ee18fa5c 100644 --- a/packages/hoppscotch-app/assets/scss/styles.scss +++ b/packages/hoppscotch-app/assets/scss/styles.scss @@ -158,6 +158,11 @@ a { @apply ml-1; @apply my-0; @apply truncate; + + &.expand-loop { + @apply bg-error; + @apply text-accentContrast; + } } } diff --git a/packages/hoppscotch-app/components/smart/EnvInput.vue b/packages/hoppscotch-app/components/smart/EnvInput.vue index b84da1325..d0bfd771b 100644 --- a/packages/hoppscotch-app/components/smart/EnvInput.vue +++ b/packages/hoppscotch-app/components/smart/EnvInput.vue @@ -213,14 +213,22 @@ export default defineComponent({ .substring(position.start, position.end + 1) .slice(2, -2) result += `${this.safe_tags_replace( + )}${ + this.getEnvValue(this.constructEnv(envVar)) === "ENV_EXPAND_LOOP" + ? this.$t("environment.nested_overflow") + : this.getEnvValue(this.constructEnv(envVar)) + }">${this.safe_tags_replace( this.internalValue.substring(position.start, position.end + 1) )}` startingPosition = position.end + 1 @@ -478,6 +486,7 @@ export default defineComponent({ }, getEnvValue(value) { if (value) return value.replace(/"/g, """) + if (value === "ENV_EXPAND_LOOP") return "ENV_EXPAND_LOOP" // it does not filter special characters before adding them to HTML. return "not found" }, @@ -491,7 +500,7 @@ export default defineComponent({ if (E.isLeft(result)) { console.error("error", result.left) - return "" + return result.left } else { return result.right } diff --git a/packages/hoppscotch-app/helpers/terndoc/ecma.json b/packages/hoppscotch-app/helpers/terndoc/ecma.json index 95d9ada2b..3f0b48339 100644 --- a/packages/hoppscotch-app/helpers/terndoc/ecma.json +++ b/packages/hoppscotch-app/helpers/terndoc/ecma.json @@ -281,15 +281,11 @@ "!stdProto": "Function", "apply": { "!type": "fn(this: ?, args: [?])", - "!effects": [ - "call and return !this this=!0 !1. !1. !1." - ] + "!effects": ["call and return !this this=!0 !1. !1. !1."] }, "call": { "!type": "fn(this: ?, args?: ?) -> !this.!ret", - "!effects": [ - "call and return !this this=!0 !1 !2 !3 !4" - ] + "!effects": ["call and return !this this=!0 !1 !2 !3 !4"] }, "bind": { "!type": "fn(this: ?, args?: ?) -> !custom:Function_bind" @@ -304,9 +300,7 @@ }, "from": { "!type": "fn(arrayLike: ?, mapFn?: fn(elt: ?, i: number) -> ?, thisArg?: ?) -> [!0.]", - "!effects": [ - "call !1 this=!2 !0. number" - ] + "!effects": ["call !1 this=!2 !0. number"] }, "of": { "!type": "fn(elementN: ?) -> [!0]" @@ -330,18 +324,14 @@ }, "push": { "!type": "fn(newelt: ?) -> number", - "!effects": [ - "propagate !0 !this." - ] + "!effects": ["propagate !0 !this."] }, "shift": { "!type": "fn() -> !this." }, "unshift": { "!type": "fn(newelt: ?) -> number", - "!effects": [ - "propagate !0 !this." - ] + "!effects": ["propagate !0 !this."] }, "slice": { "!type": "fn(from?: number, to?: number) -> !this" @@ -351,9 +341,7 @@ }, "sort": { "!type": "fn(compare?: fn(a: ?, b: ?) -> number)", - "!effects": [ - "call !0 !this. !this." - ] + "!effects": ["call !0 !this. !this."] }, "indexOf": { "!type": "fn(elt: ?, from?: number) -> number" @@ -363,45 +351,31 @@ }, "every": { "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> bool", - "!effects": [ - "call !0 this=!1 !this. number !this" - ] + "!effects": ["call !0 this=!1 !this. number !this"] }, "some": { "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> bool", - "!effects": [ - "call !0 this=!1 !this. number !this" - ] + "!effects": ["call !0 this=!1 !this. number !this"] }, "filter": { "!type": "fn(test: fn(elt: ?, i: number, array: +Array) -> bool, context?: ?) -> !this", - "!effects": [ - "call !0 this=!1 !this. number !this" - ] + "!effects": ["call !0 this=!1 !this. number !this"] }, "forEach": { "!type": "fn(f: fn(elt: ?, i: number, array: +Array), context?: ?)", - "!effects": [ - "call !0 this=!1 !this. number !this" - ] + "!effects": ["call !0 this=!1 !this. number !this"] }, "map": { "!type": "fn(f: fn(elt: ?, i: number, array: +Array) -> ?, context?: ?) -> [!0.!ret]", - "!effects": [ - "call !0 this=!1 !this. number !this" - ] + "!effects": ["call !0 this=!1 !this. number !this"] }, "reduce": { "!type": "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", - "!effects": [ - "call !0 !1 !this. number !this" - ] + "!effects": ["call !0 !1 !this. number !this"] }, "reduceRight": { "!type": "fn(combine: fn(sum: ?, elt: ?, i: number, array: +Array) -> ?, init?: ?) -> !0.!ret", - "!effects": [ - "call !0 !1 !this. number !this" - ] + "!effects": ["call !0 !1 !this. number !this"] }, "copyWithin": { "!type": "fn(target: number, start: number, end?: number) -> !this" @@ -797,9 +771,10 @@ "toJSON": { "!type": "fn() -> string" } - } + }, + "nested_overflow": "nested environment variables are limited to 10 levels" }, - "Error": { + "error": { "!type": "fn(message: string)", "prototype": { "name": { diff --git a/packages/hoppscotch-app/locales/af.json b/packages/hoppscotch-app/locales/af.json index 9c3e3b8f9..a56a1f5f5 100644 --- a/packages/hoppscotch-app/locales/af.json +++ b/packages/hoppscotch-app/locales/af.json @@ -165,7 +165,8 @@ "no_environment": "Geen omgewing nie", "select": "Kies omgewing", "title": "Omgewings", - "variable_list": "Veranderlike lys" + "variable_list": "Veranderlike lys", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Dit lyk nie asof hierdie blaaier ondersteuning vir bedieners gestuurde geleenthede het nie.", diff --git a/packages/hoppscotch-app/locales/ar.json b/packages/hoppscotch-app/locales/ar.json index f9830694b..556c340b1 100644 --- a/packages/hoppscotch-app/locales/ar.json +++ b/packages/hoppscotch-app/locales/ar.json @@ -166,7 +166,8 @@ "no_environment": "لا بيئة", "select": "حدد البيئة", "title": "البيئات", - "variable_list": "قائمة متغيرة" + "variable_list": "قائمة متغيرة", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "يبدو أن هذا المستعرض لا يدعم أحداث إرسال الخادم.", diff --git a/packages/hoppscotch-app/locales/ca.json b/packages/hoppscotch-app/locales/ca.json index 709b9c22c..5d2ec5144 100644 --- a/packages/hoppscotch-app/locales/ca.json +++ b/packages/hoppscotch-app/locales/ca.json @@ -165,7 +165,8 @@ "no_environment": "Sense entorn", "select": "Seleccioneu un entorn", "title": "Entorns", - "variable_list": "Llista de variables" + "variable_list": "Llista de variables", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Sembla que aquest navegador no és compatible amb els esdeveniments enviats per servidor.", diff --git a/packages/hoppscotch-app/locales/cn.json b/packages/hoppscotch-app/locales/cn.json index f17d4c4ea..10c789391 100644 --- a/packages/hoppscotch-app/locales/cn.json +++ b/packages/hoppscotch-app/locales/cn.json @@ -165,7 +165,8 @@ "no_environment": "无环境", "select": "选择环境", "title": "环境", - "variable_list": "变量列表" + "variable_list": "变量列表", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "该浏览器似乎不支持 SSE。", diff --git a/packages/hoppscotch-app/locales/cs.json b/packages/hoppscotch-app/locales/cs.json index 568cf217c..742976069 100644 --- a/packages/hoppscotch-app/locales/cs.json +++ b/packages/hoppscotch-app/locales/cs.json @@ -165,7 +165,8 @@ "no_environment": "Žádné prostředí", "select": "Vyberte prostředí", "title": "Prostředí", - "variable_list": "Seznam proměnných" + "variable_list": "Seznam proměnných", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Zdá se, že tento prohlížeč nemá podporu událostí odeslaných serverem.", diff --git a/packages/hoppscotch-app/locales/da.json b/packages/hoppscotch-app/locales/da.json index e1cbb859b..465ec11f7 100644 --- a/packages/hoppscotch-app/locales/da.json +++ b/packages/hoppscotch-app/locales/da.json @@ -165,7 +165,8 @@ "no_environment": "Intet miljø", "select": "Vælg miljø", "title": "Miljøer", - "variable_list": "Variabel liste" + "variable_list": "Variabel liste", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Det ser ikke ud til, at denne browser understøtter Server Sent Events.", diff --git a/packages/hoppscotch-app/locales/de.json b/packages/hoppscotch-app/locales/de.json index 40866f6b5..d4dbffdff 100644 --- a/packages/hoppscotch-app/locales/de.json +++ b/packages/hoppscotch-app/locales/de.json @@ -165,7 +165,8 @@ "no_environment": "Keine Umgebung", "select": "Umgebung auswählen", "title": "Umgebungen", - "variable_list": "Variablenliste" + "variable_list": "Variablenliste", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Dieser Browser scheint keine Unterstützung für vom Server gesendete Ereignisse zu haben.", diff --git a/packages/hoppscotch-app/locales/el.json b/packages/hoppscotch-app/locales/el.json index 665359d08..10e3ddd66 100644 --- a/packages/hoppscotch-app/locales/el.json +++ b/packages/hoppscotch-app/locales/el.json @@ -165,7 +165,8 @@ "no_environment": "Χωρίς περιβάλλον", "select": "Επιλέξτε περιβάλλον", "title": "Περιβάλλοντα", - "variable_list": "Λίστα μεταβλητών" + "variable_list": "Λίστα μεταβλητών", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Αυτό το πρόγραμμα περιήγησης δεν φαίνεται να υποστηρίζει διακομιστές που έχουν σταλεί συμβάντα.", diff --git a/packages/hoppscotch-app/locales/en.json b/packages/hoppscotch-app/locales/en.json index 045d15544..14dce1b96 100644 --- a/packages/hoppscotch-app/locales/en.json +++ b/packages/hoppscotch-app/locales/en.json @@ -165,7 +165,8 @@ "no_environment": "No environment", "select": "Select environment", "title": "Environments", - "variable_list": "Variable List" + "variable_list": "Variable List", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "This browser doesn't seems to have Server Sent Events support.", diff --git a/packages/hoppscotch-app/locales/es.json b/packages/hoppscotch-app/locales/es.json index c6d66a97f..51fc91050 100644 --- a/packages/hoppscotch-app/locales/es.json +++ b/packages/hoppscotch-app/locales/es.json @@ -165,7 +165,8 @@ "no_environment": "Sin entorno", "select": "Seleccionar entorno", "title": "Entornos", - "variable_list": "Lista de variables" + "variable_list": "Lista de variables", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Este navegador no parece ser compatible con los eventos enviados por el servidor.", diff --git a/packages/hoppscotch-app/locales/fi.json b/packages/hoppscotch-app/locales/fi.json index 34b9e5da6..f78707409 100644 --- a/packages/hoppscotch-app/locales/fi.json +++ b/packages/hoppscotch-app/locales/fi.json @@ -165,7 +165,8 @@ "no_environment": "Ei ympäristöä", "select": "Valitse ympäristö", "title": "Ympäristöt", - "variable_list": "Muuttujien luettelo" + "variable_list": "Muuttujien luettelo", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Tämä selain ei näytä tukevan palvelimen lähettämiä tapahtumia.", diff --git a/packages/hoppscotch-app/locales/fr.json b/packages/hoppscotch-app/locales/fr.json index c4d776c7d..03b623880 100644 --- a/packages/hoppscotch-app/locales/fr.json +++ b/packages/hoppscotch-app/locales/fr.json @@ -165,7 +165,8 @@ "no_environment": "Pas d'environnement", "select": "Sélectionnez l'environnement", "title": "Environnements", - "variable_list": "Liste des variables" + "variable_list": "Liste des variables", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Ce navigateur ne semble pas prendre en charge les événements envoyés par le serveur.", diff --git a/packages/hoppscotch-app/locales/he.json b/packages/hoppscotch-app/locales/he.json index 5ac68f6ce..118f9e630 100644 --- a/packages/hoppscotch-app/locales/he.json +++ b/packages/hoppscotch-app/locales/he.json @@ -165,7 +165,8 @@ "no_environment": "אין סביבה", "select": "בחר סביבה", "title": "סביבות", - "variable_list": "רשימת משתנים" + "variable_list": "רשימת משתנים", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "נראה שלדפדפן זה אין תמיכה באירועי שרת נשלח.", diff --git a/packages/hoppscotch-app/locales/hu.json b/packages/hoppscotch-app/locales/hu.json index 81602fc84..37cb0e15a 100644 --- a/packages/hoppscotch-app/locales/hu.json +++ b/packages/hoppscotch-app/locales/hu.json @@ -165,7 +165,8 @@ "no_environment": "Nincs környezet", "select": "Környezet kiválasztása", "title": "Környezetek", - "variable_list": "Változólista" + "variable_list": "Változólista", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Úgy tűnik, hogy ez a böngésző nem támogatja a kiszolgáló által küldött eseményeket.", diff --git a/packages/hoppscotch-app/locales/it.json b/packages/hoppscotch-app/locales/it.json index 88bafcbe0..ebd686520 100644 --- a/packages/hoppscotch-app/locales/it.json +++ b/packages/hoppscotch-app/locales/it.json @@ -165,7 +165,8 @@ "no_environment": "Nessun ambiente", "select": "Seleziona ambiente", "title": "Ambienti", - "variable_list": "Elenco variabili" + "variable_list": "Elenco variabili", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Questo browser non sembra supportare gli eventi inviati dal server (Server Sent Events).", diff --git a/packages/hoppscotch-app/locales/ja.json b/packages/hoppscotch-app/locales/ja.json index 9cc3bb472..dd7915383 100644 --- a/packages/hoppscotch-app/locales/ja.json +++ b/packages/hoppscotch-app/locales/ja.json @@ -165,7 +165,8 @@ "no_environment": "環境なし", "select": "環境を選択する", "title": "環境", - "variable_list": "変数リスト" + "variable_list": "変数リスト", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "このブラウザはサーバー送信イベントをサポートしていないようです。", diff --git a/packages/hoppscotch-app/locales/ko.json b/packages/hoppscotch-app/locales/ko.json index 30d27dcbd..2e4a1ab66 100644 --- a/packages/hoppscotch-app/locales/ko.json +++ b/packages/hoppscotch-app/locales/ko.json @@ -165,7 +165,8 @@ "no_environment": "환경 없음", "select": "환경 선택", "title": "환경", - "variable_list": "변수 목록" + "variable_list": "변수 목록", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "이 브라우저는 서버 전송 이벤트를 지원하지 않는 것 같습니다.", diff --git a/packages/hoppscotch-app/locales/nl.json b/packages/hoppscotch-app/locales/nl.json index 5595ac2d5..c8c99108a 100644 --- a/packages/hoppscotch-app/locales/nl.json +++ b/packages/hoppscotch-app/locales/nl.json @@ -165,7 +165,8 @@ "no_environment": "Geen omgeving", "select": "Selecteer omgeving", "title": "omgevingen", - "variable_list": "Variabele lijst" + "variable_list": "Variabele lijst", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Deze browser lijkt geen ondersteuning te hebben voor door de server verzonden gebeurtenissen.", diff --git a/packages/hoppscotch-app/locales/no.json b/packages/hoppscotch-app/locales/no.json index a655b787b..922ad2ae8 100644 --- a/packages/hoppscotch-app/locales/no.json +++ b/packages/hoppscotch-app/locales/no.json @@ -165,7 +165,8 @@ "no_environment": "Ingen miljø", "select": "Velg miljø", "title": "Miljøer", - "variable_list": "Variabel liste" + "variable_list": "Variabel liste", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Denne nettleseren ser ikke ut til å ha Server Sent Events -støtte.", diff --git a/packages/hoppscotch-app/locales/pl.json b/packages/hoppscotch-app/locales/pl.json index 26357af13..d44da8e70 100644 --- a/packages/hoppscotch-app/locales/pl.json +++ b/packages/hoppscotch-app/locales/pl.json @@ -165,7 +165,8 @@ "no_environment": "Brak środowiska", "select": "Wybierz środowisko", "title": "Środowiska", - "variable_list": "Lista zmiennych" + "variable_list": "Lista zmiennych", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Wygląda na to, że ta przeglądarka nie obsługuje zdarzeń wysłanych przez serwer.", diff --git a/packages/hoppscotch-app/locales/pt-br.json b/packages/hoppscotch-app/locales/pt-br.json index 2d854b783..b3e2f3889 100644 --- a/packages/hoppscotch-app/locales/pt-br.json +++ b/packages/hoppscotch-app/locales/pt-br.json @@ -165,7 +165,8 @@ "no_environment": "Sem ambiente", "select": "Selecione o ambiente", "title": "Ambientes", - "variable_list": "Lista de Variáveis" + "variable_list": "Lista de Variáveis", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Este navegador não parece ter suporte para eventos enviados pelo servidor.", diff --git a/packages/hoppscotch-app/locales/pt.json b/packages/hoppscotch-app/locales/pt.json index 2d854b783..b3e2f3889 100644 --- a/packages/hoppscotch-app/locales/pt.json +++ b/packages/hoppscotch-app/locales/pt.json @@ -165,7 +165,8 @@ "no_environment": "Sem ambiente", "select": "Selecione o ambiente", "title": "Ambientes", - "variable_list": "Lista de Variáveis" + "variable_list": "Lista de Variáveis", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Este navegador não parece ter suporte para eventos enviados pelo servidor.", diff --git a/packages/hoppscotch-app/locales/ro.json b/packages/hoppscotch-app/locales/ro.json index d8c96cb71..1166f7851 100644 --- a/packages/hoppscotch-app/locales/ro.json +++ b/packages/hoppscotch-app/locales/ro.json @@ -165,7 +165,8 @@ "no_environment": "Fără mediu", "select": "Selectați mediul", "title": "Medii", - "variable_list": "Lista variabilelor" + "variable_list": "Lista variabilelor", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Acest browser pare să nu aibă suport pentru Server Sent Events.", diff --git a/packages/hoppscotch-app/locales/ru.json b/packages/hoppscotch-app/locales/ru.json index 278014bc8..7ee107b59 100644 --- a/packages/hoppscotch-app/locales/ru.json +++ b/packages/hoppscotch-app/locales/ru.json @@ -165,7 +165,8 @@ "no_environment": "Нет окружающей среды", "select": "Выберите среду", "title": "Среды", - "variable_list": "Список переменных" + "variable_list": "Список переменных", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Похоже, в этом браузере нет поддержки событий, отправленных сервером.", diff --git a/packages/hoppscotch-app/locales/sr.json b/packages/hoppscotch-app/locales/sr.json index 19e8d5529..89211ceb2 100644 --- a/packages/hoppscotch-app/locales/sr.json +++ b/packages/hoppscotch-app/locales/sr.json @@ -166,7 +166,8 @@ "no_environment": "Нема окружења", "select": "Изаберите окружење", "title": "Енвиронментс", - "variable_list": "Листа променљивих" + "variable_list": "Листа променљивих", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Изгледа да овај прегледач нема подршку за Послане догађаје са сервера.", diff --git a/packages/hoppscotch-app/locales/sv.json b/packages/hoppscotch-app/locales/sv.json index 8ab93d5d8..03f4b6cae 100644 --- a/packages/hoppscotch-app/locales/sv.json +++ b/packages/hoppscotch-app/locales/sv.json @@ -165,7 +165,8 @@ "no_environment": "Ingen miljö", "select": "Välj miljö", "title": "Miljöer", - "variable_list": "Variabel lista" + "variable_list": "Variabel lista", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Den här webbläsaren verkar inte ha stöd för Server Sent Events.", diff --git a/packages/hoppscotch-app/locales/tr.json b/packages/hoppscotch-app/locales/tr.json index 5220aa93b..236b7761a 100644 --- a/packages/hoppscotch-app/locales/tr.json +++ b/packages/hoppscotch-app/locales/tr.json @@ -165,7 +165,8 @@ "no_environment": "Ortam yok", "select": "Ortam seçin", "title": "Ortamlar", - "variable_list": "Değişken Listesi" + "variable_list": "Değişken Listesi", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Bu tarayıcıda Sunucu Gönderilen Olaylar desteği yok gibi görünüyor.", diff --git a/packages/hoppscotch-app/locales/tw.json b/packages/hoppscotch-app/locales/tw.json index ce8ba3efe..fd5ac696a 100644 --- a/packages/hoppscotch-app/locales/tw.json +++ b/packages/hoppscotch-app/locales/tw.json @@ -165,7 +165,8 @@ "no_environment": "無環境", "select": "選擇環境", "title": "環境", - "variable_list": "變數列表" + "variable_list": "變數列表", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "此瀏覽器似乎不支援 SSE。", diff --git a/packages/hoppscotch-app/locales/uk.json b/packages/hoppscotch-app/locales/uk.json index 451f6b30d..e50e6eea6 100644 --- a/packages/hoppscotch-app/locales/uk.json +++ b/packages/hoppscotch-app/locales/uk.json @@ -165,7 +165,8 @@ "no_environment": "Жодного середовища", "select": "Виберіть середовище", "title": "Середовища", - "variable_list": "Список змінних" + "variable_list": "Список змінних", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Схоже, цей браузер не підтримує події, надіслані сервером.", diff --git a/packages/hoppscotch-app/locales/vi.json b/packages/hoppscotch-app/locales/vi.json index 6123aeae7..a8836ac0e 100644 --- a/packages/hoppscotch-app/locales/vi.json +++ b/packages/hoppscotch-app/locales/vi.json @@ -165,7 +165,8 @@ "no_environment": "Không có môi trường", "select": "Chọn môi trường", "title": "Môi trường", - "variable_list": "Danh sách biến" + "variable_list": "Danh sách biến", + "nested_overflow": "nested environment variables are limited to 10 levels" }, "error": { "browser_support_sse": "Trình duyệt này dường như không có hỗ trợ Sự kiện do Máy chủ gửi.", From 902aecf4f0f6e1d918f2d869f677070bf7aea63c Mon Sep 17 00:00:00 2001 From: liyasthomas Date: Sun, 30 Jan 2022 17:55:35 +0530 Subject: [PATCH 06/10] feat: expand overflow error warning --- .../components/environments/Edit.vue | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/hoppscotch-app/components/environments/Edit.vue b/packages/hoppscotch-app/components/environments/Edit.vue index 2bda3f7d5..48bdc6fb7 100644 --- a/packages/hoppscotch-app/components/environments/Edit.vue +++ b/packages/hoppscotch-app/components/environments/Edit.vue @@ -41,6 +41,12 @@ /> +
+ {{ $t("environment.nested_overflow") }} +
import clone from "lodash/clone" import { computed, defineComponent, PropType } from "@nuxtjs/composition-api" +import * as E from "fp-ts/Either" import { Environment, getEnviroment, @@ -124,6 +131,7 @@ import { setGlobalEnvVariables, updateEnvironment, } from "~/newstore/environments" +import { parseTemplateStringE } from "~/helpers/templating" export default defineComponent({ props: { @@ -158,6 +166,22 @@ export default defineComponent({ clearIcon: "trash-2", } }, + computed: { + evnExpandError(): boolean { + for (const variable of this.vars) { + const result = parseTemplateStringE( + variable.value, + this.workingEnv?.variables ?? [] + ) + + if (E.isLeft(result)) { + console.error("error", result.left) + return true + } + } + return false + }, + }, watch: { show() { this.name = this.workingEnv?.name ?? null From 0c4c8ac8bd9841163d8b989072b8cf5717cc2cc0 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Sun, 30 Jan 2022 20:41:29 +0530 Subject: [PATCH 07/10] fix: correct envExpanError calculation --- packages/hoppscotch-app/components/environments/Edit.vue | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/hoppscotch-app/components/environments/Edit.vue b/packages/hoppscotch-app/components/environments/Edit.vue index 48bdc6fb7..533c39630 100644 --- a/packages/hoppscotch-app/components/environments/Edit.vue +++ b/packages/hoppscotch-app/components/environments/Edit.vue @@ -169,10 +169,7 @@ export default defineComponent({ computed: { evnExpandError(): boolean { for (const variable of this.vars) { - const result = parseTemplateStringE( - variable.value, - this.workingEnv?.variables ?? [] - ) + const result = parseTemplateStringE(variable.value, this.vars) if (E.isLeft(result)) { console.error("error", result.left) From fc11cea590fed5c25385bd63f27279e08766911b Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Mon, 31 Jan 2022 17:18:06 +0530 Subject: [PATCH 08/10] refactor: cleanup env highlight tooltip calculation --- .../components/smart/EnvInput.vue | 74 ++++++++----------- 1 file changed, 30 insertions(+), 44 deletions(-) diff --git a/packages/hoppscotch-app/components/smart/EnvInput.vue b/packages/hoppscotch-app/components/smart/EnvInput.vue index d0bfd771b..0e3f547e9 100644 --- a/packages/hoppscotch-app/components/smart/EnvInput.vue +++ b/packages/hoppscotch-app/components/smart/EnvInput.vue @@ -29,6 +29,8 @@ import debounce from "lodash/debounce" import isUndefined from "lodash/isUndefined" import { tippy } from "vue-tippy" import * as E from "fp-ts/Either" +import { pipe } from "fp-ts/function" +import { Subject } from "rxjs" import { aggregateEnvs$ } from "~/newstore/environments" import { useReadonlyStream } from "~/helpers/utils/composables" import { parseTemplateStringE } from "~/helpers/templating" @@ -138,6 +140,33 @@ export default defineComponent({ }, 5) this.debouncedHandler() }, + getResultSpan(envVar, highlightPos, position) { + const env = this.aggregateEnvs.find((k) => k.key === envVar) + + const envName = env?.sourceEnv ?? "choose an environment" + const value = pipe( + parseTemplateStringE(env?.value ?? "", this.aggregateEnvs), + E.map((value) => value.replace(/"/g, """)) + ) + + const isError = env === undefined || E.isLeft(value) + + return `${ + E.isLeft(value) && value.left === "ENV_EXPAND_LOOP" + ? this.$t("environment.nested_overflow") + : value.right + }">${this.safe_tags_replace( + this.internalValue.substring(position.start, position.end + 1) + )}` + }, processHighlights() { if (!this.highlightEnabled) { this.htmlOutput = this.internalValue @@ -212,25 +241,7 @@ export default defineComponent({ const envVar = this.internalValue .substring(position.start, position.end + 1) .slice(2, -2) - result += `${ - this.getEnvValue(this.constructEnv(envVar)) === "ENV_EXPAND_LOOP" - ? this.$t("environment.nested_overflow") - : this.getEnvValue(this.constructEnv(envVar)) - }">${this.safe_tags_replace( - this.internalValue.substring(position.start, position.end + 1) - )}` + result += this.getResultSpan(envVar, highlightPositions[k], position) startingPosition = position.end + 1 } if (startingPosition < this.internalValue.length) @@ -480,31 +491,6 @@ export default defineComponent({ textRange.select() } }, - getEnvName(name) { - if (name) return name - return "choose an environment" - }, - getEnvValue(value) { - if (value) return value.replace(/"/g, """) - if (value === "ENV_EXPAND_LOOP") return "ENV_EXPAND_LOOP" - // it does not filter special characters before adding them to HTML. - return "not found" - }, - constructEnv(envVar) { - const result = parseTemplateStringE( - this.getEnvValue( - this.aggregateEnvs.find((k) => k.key === envVar)?.value - ), - this.aggregateEnvs - ) - - if (E.isLeft(result)) { - console.error("error", result.left) - return result.left - } else { - return result.right - } - }, }, }) From 4da34109639cd5eefb841c9b147fd108dd70b8a3 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Tue, 1 Feb 2022 15:13:29 +0530 Subject: [PATCH 09/10] refactor: initial cm-backend envinput implementation --- .../components/smart/EnvInput.vue | 554 +++--------------- 1 file changed, 80 insertions(+), 474 deletions(-) diff --git a/packages/hoppscotch-app/components/smart/EnvInput.vue b/packages/hoppscotch-app/components/smart/EnvInput.vue index 0e3f547e9..7dd0a6e3c 100644 --- a/packages/hoppscotch-app/components/smart/EnvInput.vue +++ b/packages/hoppscotch-app/components/smart/EnvInput.vue @@ -10,488 +10,94 @@ :placeholder="placeholder" class="env-input" :class="styles" - contenteditable="true" - spellcheck="false" - @keydown.enter.prevent="$emit('enter', $event)" - @keyup="$emit('keyup', $event)" - @click="$emit('click', $event)" - @keydown="$emit('keydown', $event)" - @paste="handlePaste" - @compositionend="handleCompositionEnd" + @keydown.enter.prevent="emit('enter', $event)" + @keyup="emit('keyup', $event)" + @click="emit('click', $event)" + @keydown="emit('keydown', $event)" >
- From 6d394b6e0e28a87916605d0e77aa4187d230a2ce Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Mon, 7 Feb 2022 04:08:19 +0530 Subject: [PATCH 10/10] feat: implement paste handling and value sync on new env input --- .../components/http/Request.vue | 11 +--- .../components/smart/EnvInput.vue | 56 +++++++++++++++++-- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/packages/hoppscotch-app/components/http/Request.vue b/packages/hoppscotch-app/components/http/Request.vue index 4759408f0..b6ff556fb 100644 --- a/packages/hoppscotch-app/components/http/Request.vue +++ b/packages/hoppscotch-app/components/http/Request.vue @@ -361,20 +361,15 @@ const ensureMethodInEndpoint = () => { } } -const onPasteUrl = (e: { event: ClipboardEvent; previousValue: string }) => { +const onPasteUrl = (e: { pastedValue: string; prevValue: string }) => { if (!e) return - const clipboardData = e.event.clipboardData - - const pastedData = clipboardData?.getData("Text") - - if (!pastedData) return + const pastedData = e.pastedValue if (isCURL(pastedData)) { - e.event.preventDefault() showCurlImportModal.value = true curlText.value = pastedData - newEndpoint.value = e.previousValue + newEndpoint.value = e.prevValue } } diff --git a/packages/hoppscotch-app/components/smart/EnvInput.vue b/packages/hoppscotch-app/components/smart/EnvInput.vue index 7dd0a6e3c..30741f57e 100644 --- a/packages/hoppscotch-app/components/smart/EnvInput.vue +++ b/packages/hoppscotch-app/components/smart/EnvInput.vue @@ -19,9 +19,15 @@