api-client/packages/hoppscotch-app/helpers/codegen/codegen.ts

198 lines
5.6 KiB
TypeScript
Raw Normal View History

2021-08-26 05:32:05 +00:00
import {
FormDataKeyValue,
HoppRESTHeader,
HoppRESTParam,
} from "../types/HoppRESTRequest"
import { EffectiveHoppRESTRequest } from "../utils/EffectiveURL"
2020-10-30 12:46:34 +00:00
import { CLibcurlCodegen } from "./generators/c-libcurl"
import { CsRestsharpCodegen } from "./generators/cs-restsharp"
2020-09-26 03:45:18 +00:00
import { CurlCodegen } from "./generators/curl"
2020-10-03 06:50:20 +00:00
import { GoNativeCodegen } from "./generators/go-native"
2020-10-30 12:46:34 +00:00
import { JavaOkhttpCodegen } from "./generators/java-okhttp"
import { JavaUnirestCodegen } from "./generators/java-unirest"
import { JavascriptFetchCodegen } from "./generators/javascript-fetch"
import { JavascriptJqueryCodegen } from "./generators/javascript-jquery"
import { JavascriptXhrCodegen } from "./generators/javascript-xhr"
import { NodejsAxiosCodegen } from "./generators/nodejs-axios"
import { NodejsNativeCodegen } from "./generators/nodejs-native"
import { NodejsRequestCodegen } from "./generators/nodejs-request"
import { NodejsUnirestCodegen } from "./generators/nodejs-unirest"
import { PhpCurlCodegen } from "./generators/php-curl"
2020-10-30 12:46:34 +00:00
import { PowershellRestmethodCodegen } from "./generators/powershell-restmethod"
import { PythonHttpClientCodegen } from "./generators/python-http-client"
2020-10-30 12:46:34 +00:00
import { PythonRequestsCodegen } from "./generators/python-requests"
import { RubyNetHttpCodeGen } from "./generators/ruby-net-http"
2020-10-17 07:09:23 +00:00
import { SalesforceApexCodegen } from "./generators/salesforce-apex"
2020-10-30 12:46:34 +00:00
import { ShellHttpieCodegen } from "./generators/shell-httpie"
import { ShellWgetCodegen } from "./generators/shell-wget"
2020-10-29 12:17:25 +00:00
2020-09-26 03:45:18 +00:00
/* Register code generators here.
* A code generator is defined as an object with the following structure.
*
* id: string
* name: string
* language: string // a string identifier used in ace editor for syntax highlighting
* // see node_modules/ace-builds/src-noconflict/mode-** files for valid value
2020-09-26 03:45:18 +00:00
* generator: (ctx) => string
*
*/
export const codegens = [
2020-10-30 12:46:34 +00:00
CLibcurlCodegen,
CsRestsharpCodegen,
CurlCodegen,
GoNativeCodegen,
2020-10-30 12:46:34 +00:00
JavaOkhttpCodegen,
JavaUnirestCodegen,
2020-10-30 12:46:34 +00:00
JavascriptFetchCodegen,
JavascriptJqueryCodegen,
JavascriptXhrCodegen,
NodejsAxiosCodegen,
NodejsNativeCodegen,
NodejsRequestCodegen,
NodejsUnirestCodegen,
PhpCurlCodegen,
2020-10-30 12:46:34 +00:00
PowershellRestmethodCodegen,
PythonHttpClientCodegen,
2020-10-30 12:46:34 +00:00
PythonRequestsCodegen,
RubyNetHttpCodeGen,
2020-10-17 07:09:23 +00:00
SalesforceApexCodegen,
2020-10-30 12:46:34 +00:00
ShellHttpieCodegen,
ShellWgetCodegen,
]
2020-09-26 03:45:18 +00:00
2021-07-18 04:33:52 +00:00
export type HoppCodegenContext = {
name: string
method: string
uri: string
url: string
pathName: string
auth: any // TODO: Change this
httpUser: string | null
httpPassword: string | null
bearerToken: string | null
headers: HoppRESTHeader[]
params: HoppRESTParam[]
2021-08-26 05:32:05 +00:00
bodyParams: FormDataKeyValue[]
2021-07-18 04:33:52 +00:00
rawParams: string | null
rawInput: boolean
2021-08-26 07:32:53 +00:00
rawRequestBody: string | null
2021-08-26 05:32:05 +00:00
contentType: string | null
2021-07-18 04:33:52 +00:00
queryString: string
}
export function generateCodeWithGenerator(
codegenID: string,
context: HoppCodegenContext
) {
2020-09-26 03:45:18 +00:00
if (codegenID) {
2020-09-27 18:04:15 +00:00
const gen = codegens.find(({ id }) => id === codegenID)
2020-09-26 03:45:18 +00:00
return gen ? gen.generator(context) : ""
}
return ""
}
2021-08-26 05:32:05 +00:00
function getCodegenAuth(
request: EffectiveHoppRESTRequest
): Pick<
HoppCodegenContext,
"auth" | "bearerToken" | "httpUser" | "httpPassword"
> {
if (!request.auth.authActive || request.auth.authType === "none") {
return {
auth: "None",
httpUser: null,
httpPassword: null,
bearerToken: null,
}
}
if (request.auth.authType === "basic") {
return {
auth: "Basic Auth",
httpUser: request.auth.username,
httpPassword: request.auth.password,
bearerToken: null,
}
} else {
return {
auth: "Bearer Token",
httpUser: null,
httpPassword: null,
bearerToken: request.auth.token,
}
}
}
function getCodegenGeneralRESTInfo(
request: EffectiveHoppRESTRequest
): Pick<
HoppCodegenContext,
| "name"
| "uri"
| "url"
| "method"
| "queryString"
| "pathName"
| "params"
| "headers"
> {
const urlObj = new URL(request.effectiveFinalURL)
2021-08-26 07:32:53 +00:00
request.effectiveFinalParams.forEach(({ key, value }) => {
urlObj.searchParams.append(key, value)
})
2021-08-26 05:32:05 +00:00
2021-09-02 14:33:50 +00:00
// Remove authorization headers if auth is specified (because see #1798)
const finalHeaders =
request.auth.authActive && request.auth.authType !== "none"
? request.effectiveFinalHeaders
.filter((x) => x.key.toLowerCase() !== "authorization")
.map((x) => ({ ...x, active: true }))
: request.effectiveFinalHeaders.map((x) => ({ ...x, active: true }))
2021-08-26 05:32:05 +00:00
return {
name: request.name,
uri: request.effectiveFinalURL,
2021-09-02 14:33:50 +00:00
headers: finalHeaders,
2021-08-26 05:32:05 +00:00
params: request.effectiveFinalParams.map((x) => ({ ...x, active: true })),
method: request.method,
url: urlObj.origin,
queryString: urlObj.searchParams.toString(),
pathName: urlObj.pathname,
}
}
function getCodegenReqBodyData(
request: EffectiveHoppRESTRequest
): Pick<
HoppCodegenContext,
"rawRequestBody" | "rawInput" | "contentType" | "bodyParams" | "rawParams"
> {
return {
contentType: request.body.contentType,
rawInput: request.body.contentType !== "multipart/form-data",
rawRequestBody:
request.body.contentType !== "multipart/form-data"
? request.body.body
: null,
bodyParams:
request.body.contentType === "multipart/form-data"
? request.body.body
: [],
2021-08-26 07:32:53 +00:00
rawParams:
request.body.contentType !== "multipart/form-data"
? request.body.body
: null,
2021-08-26 05:32:05 +00:00
}
}
export function generateCodegenContext(
request: EffectiveHoppRESTRequest
): HoppCodegenContext {
return {
...getCodegenAuth(request),
...getCodegenGeneralRESTInfo(request),
...getCodegenReqBodyData(request),
}
}