fix: sidebar codegen crashing and AWS Signature Auth flow (#4315)
Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> Co-authored-by: Anwarul Islam <anwaarulislaam@gmail.com>
This commit is contained in:
@@ -292,7 +292,8 @@
|
|||||||
"team_name": "Workspace name empty",
|
"team_name": "Workspace name empty",
|
||||||
"teams": "You don't belong to any workspaces",
|
"teams": "You don't belong to any workspaces",
|
||||||
"tests": "There are no tests for this request",
|
"tests": "There are no tests for this request",
|
||||||
"access_tokens": "Access tokens are empty"
|
"access_tokens": "Access tokens are empty",
|
||||||
|
"response": "No response received"
|
||||||
},
|
},
|
||||||
"environment": {
|
"environment": {
|
||||||
"add_to_global": "Add to Global",
|
"add_to_global": "Add to Global",
|
||||||
|
|||||||
@@ -259,6 +259,10 @@ const selectAWSSignatureAuthType = () => {
|
|||||||
...auth.value,
|
...auth.value,
|
||||||
authType: "aws-signature",
|
authType: "aws-signature",
|
||||||
addTo: "HEADERS",
|
addTo: "HEADERS",
|
||||||
|
accessKey: "",
|
||||||
|
secretKey: "",
|
||||||
|
region: "",
|
||||||
|
serviceName: "",
|
||||||
} as HoppGQLAuth
|
} as HoppGQLAuth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -184,6 +184,7 @@ import IconHelpCircle from "~icons/lucide/help-circle"
|
|||||||
import IconTrash2 from "~icons/lucide/trash-2"
|
import IconTrash2 from "~icons/lucide/trash-2"
|
||||||
|
|
||||||
import { getDefaultAuthCodeOauthFlowParams } from "~/services/oauth/flows/authCode"
|
import { getDefaultAuthCodeOauthFlowParams } from "~/services/oauth/flows/authCode"
|
||||||
|
import { HoppRESTAuth, HoppRESTAuthOAuth2 } from "@hoppscotch/data"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -239,6 +240,10 @@ const selectAWSSignatureAuthType = () => {
|
|||||||
...auth.value,
|
...auth.value,
|
||||||
authType: "aws-signature",
|
authType: "aws-signature",
|
||||||
addTo: "HEADERS",
|
addTo: "HEADERS",
|
||||||
|
accessKey: "",
|
||||||
|
secretKey: "",
|
||||||
|
region: "",
|
||||||
|
serviceName: "",
|
||||||
} as HoppRESTAuth
|
} as HoppRESTAuth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ import { platform } from "~/platform"
|
|||||||
import { RESTTabService } from "~/services/tab/rest"
|
import { RESTTabService } from "~/services/tab/rest"
|
||||||
import IconCheck from "~icons/lucide/check"
|
import IconCheck from "~icons/lucide/check"
|
||||||
import IconWrapText from "~icons/lucide/wrap-text"
|
import IconWrapText from "~icons/lucide/wrap-text"
|
||||||
|
import { asyncComputed } from "@vueuse/core"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -156,7 +157,7 @@ const emit = defineEmits<{
|
|||||||
(e: "request-code", value: string): void
|
(e: "request-code", value: string): void
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
const requestCode = computed(() => {
|
const requestCode = asyncComputed(async () => {
|
||||||
const aggregateEnvs = getAggregateEnvs()
|
const aggregateEnvs = getAggregateEnvs()
|
||||||
const requestVariables = request.value.requestVariables.map(
|
const requestVariables = request.value.requestVariables.map(
|
||||||
(requestVariable) => {
|
(requestVariable) => {
|
||||||
@@ -178,10 +179,19 @@ const requestCode = computed(() => {
|
|||||||
...aggregateEnvs,
|
...aggregateEnvs,
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
const effectiveRequest = getEffectiveRESTRequest(request.value, env, true)
|
|
||||||
|
// Calculating this before to keep the reactivity as asyncComputed will lose
|
||||||
|
// reactivity tracking after the await point
|
||||||
|
const lang = codegenType.value
|
||||||
|
|
||||||
|
const effectiveRequest = await getEffectiveRESTRequest(
|
||||||
|
request.value,
|
||||||
|
env,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
|
||||||
const result = generateCode(
|
const result = generateCode(
|
||||||
codegenType.value,
|
lang,
|
||||||
makeRESTRequest({
|
makeRESTRequest({
|
||||||
...effectiveRequest,
|
...effectiveRequest,
|
||||||
body: resolvesEnvsInBody(effectiveRequest.body, env),
|
body: resolvesEnvsInBody(effectiveRequest.body, env),
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
@close="close()"
|
@close="close()"
|
||||||
>
|
>
|
||||||
<template #content>
|
<template #content>
|
||||||
<div class="flex flex-col px-4 flex-1 overflow-y-auto">
|
<div v-if="response" class="flex flex-col px-4 flex-1 overflow-y-auto">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<tippy
|
<tippy
|
||||||
interactive
|
interactive
|
||||||
@@ -110,6 +110,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<HoppSmartPlaceholder
|
||||||
|
v-else
|
||||||
|
:src="`/images/states/${colorMode.value}/add_files.svg`"
|
||||||
|
:alt="`${t('empty.response')}`"
|
||||||
|
:text="`${t('empty.response')}`"
|
||||||
|
>
|
||||||
|
</HoppSmartPlaceholder>
|
||||||
</template>
|
</template>
|
||||||
</HoppSmartSlideOver>
|
</HoppSmartSlideOver>
|
||||||
</template>
|
</template>
|
||||||
@@ -134,8 +142,10 @@ import IconWrapText from "~icons/lucide/wrap-text"
|
|||||||
import jsonToLanguage from "~/helpers/utils/json-to-language"
|
import jsonToLanguage from "~/helpers/utils/json-to-language"
|
||||||
import { watch } from "vue"
|
import { watch } from "vue"
|
||||||
import { GQLTabService } from "~/services/tab/graphql"
|
import { GQLTabService } from "~/services/tab/graphql"
|
||||||
|
import { useColorMode } from "~/composables/theming"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
const colorMode = useColorMode()
|
||||||
|
|
||||||
defineProps<{
|
defineProps<{
|
||||||
show: boolean
|
show: boolean
|
||||||
@@ -189,7 +199,10 @@ const errorState = ref(false)
|
|||||||
const interfaceCode = ref("")
|
const interfaceCode = ref("")
|
||||||
|
|
||||||
const setInterfaceCode = async () => {
|
const setInterfaceCode = async () => {
|
||||||
const res = await jsonToLanguage(selectedInterface.value, response.value)
|
const res = await jsonToLanguage(
|
||||||
|
selectedInterface.value,
|
||||||
|
response.value || "{}"
|
||||||
|
) // to avoid possible errors empty object is passed
|
||||||
interfaceCode.value = res.lines.join("\n")
|
interfaceCode.value = res.lines.join("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ export function runRESTRequest$(
|
|||||||
combineEnvVariables(finalEnvs)
|
combineEnvVariables(finalEnvs)
|
||||||
)
|
)
|
||||||
|
|
||||||
const effectiveRequest = getEffectiveRESTRequest(finalRequest, {
|
const effectiveRequest = await getEffectiveRESTRequest(finalRequest, {
|
||||||
id: "env-id",
|
id: "env-id",
|
||||||
v: 1,
|
v: 1,
|
||||||
name: "Env",
|
name: "Env",
|
||||||
@@ -321,7 +321,7 @@ export function runRESTRequest$(
|
|||||||
{
|
{
|
||||||
name: env.name,
|
name: env.name,
|
||||||
v: 1,
|
v: 1,
|
||||||
id: env.id ?? "",
|
id: "id" in env ? env.id : "",
|
||||||
variables: updatedRunResult.envs.selected,
|
variables: updatedRunResult.envs.selected,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,30 +1,32 @@
|
|||||||
|
import {
|
||||||
|
Environment,
|
||||||
|
FormDataKeyValue,
|
||||||
|
HoppRESTAuth,
|
||||||
|
HoppRESTHeader,
|
||||||
|
HoppRESTHeaders,
|
||||||
|
HoppRESTParam,
|
||||||
|
HoppRESTParams,
|
||||||
|
HoppRESTReqBody,
|
||||||
|
HoppRESTRequest,
|
||||||
|
parseBodyEnvVariables,
|
||||||
|
parseRawKeyValueEntriesE,
|
||||||
|
parseTemplateString,
|
||||||
|
parseTemplateStringE,
|
||||||
|
} from "@hoppscotch/data"
|
||||||
|
import { AwsV4Signer } from "aws4fetch"
|
||||||
import * as A from "fp-ts/Array"
|
import * as A from "fp-ts/Array"
|
||||||
import * as E from "fp-ts/Either"
|
import * as E from "fp-ts/Either"
|
||||||
|
import { flow, pipe } from "fp-ts/function"
|
||||||
import * as O from "fp-ts/Option"
|
import * as O from "fp-ts/Option"
|
||||||
import * as RA from "fp-ts/ReadonlyArray"
|
import * as RA from "fp-ts/ReadonlyArray"
|
||||||
import * as S from "fp-ts/string"
|
import * as S from "fp-ts/string"
|
||||||
import qs from "qs"
|
import qs from "qs"
|
||||||
import { flow, pipe } from "fp-ts/function"
|
|
||||||
import { combineLatest, Observable } from "rxjs"
|
import { combineLatest, Observable } from "rxjs"
|
||||||
import { map } from "rxjs/operators"
|
import { map } from "rxjs/operators"
|
||||||
import {
|
|
||||||
FormDataKeyValue,
|
|
||||||
HoppRESTReqBody,
|
|
||||||
HoppRESTRequest,
|
|
||||||
parseTemplateString,
|
|
||||||
parseBodyEnvVariables,
|
|
||||||
Environment,
|
|
||||||
HoppRESTHeader,
|
|
||||||
HoppRESTParam,
|
|
||||||
parseRawKeyValueEntriesE,
|
|
||||||
parseTemplateStringE,
|
|
||||||
HoppRESTAuth,
|
|
||||||
HoppRESTHeaders,
|
|
||||||
} from "@hoppscotch/data"
|
|
||||||
import { arrayFlatMap, arraySort } from "../functional/array"
|
import { arrayFlatMap, arraySort } from "../functional/array"
|
||||||
import { toFormData } from "../functional/formData"
|
import { toFormData } from "../functional/formData"
|
||||||
import { tupleWithSameKeysToRecord } from "../functional/record"
|
import { tupleWithSameKeysToRecord } from "../functional/record"
|
||||||
import { AwsV4Signer } from "aws4fetch"
|
|
||||||
|
|
||||||
export interface EffectiveHoppRESTRequest extends HoppRESTRequest {
|
export interface EffectiveHoppRESTRequest extends HoppRESTRequest {
|
||||||
/**
|
/**
|
||||||
@@ -33,8 +35,8 @@ export interface EffectiveHoppRESTRequest extends HoppRESTRequest {
|
|||||||
* This contains path, params and environment variables all applied to it
|
* This contains path, params and environment variables all applied to it
|
||||||
*/
|
*/
|
||||||
effectiveFinalURL: string
|
effectiveFinalURL: string
|
||||||
effectiveFinalHeaders: { key: string; value: string }[]
|
effectiveFinalHeaders: HoppRESTHeaders
|
||||||
effectiveFinalParams: { key: string; value: string }[]
|
effectiveFinalParams: HoppRESTParams
|
||||||
effectiveFinalBody: FormData | string | null
|
effectiveFinalBody: FormData | string | null
|
||||||
effectiveFinalRequestVariables: { key: string; value: string }[]
|
effectiveFinalRequestVariables: { key: string; value: string }[]
|
||||||
}
|
}
|
||||||
@@ -502,6 +504,7 @@ export async function getEffectiveRESTRequest(
|
|||||||
false,
|
false,
|
||||||
showKeyIfSecret
|
showKeyIfSecret
|
||||||
),
|
),
|
||||||
|
description: x.description,
|
||||||
}))
|
}))
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -525,6 +528,7 @@ export async function getEffectiveRESTRequest(
|
|||||||
false,
|
false,
|
||||||
showKeyIfSecret
|
showKeyIfSecret
|
||||||
),
|
),
|
||||||
|
description: x.description,
|
||||||
}))
|
}))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user