123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- import HTTPSnippet from "httpsnippet"
- import { HoppRESTRequest } from "@hoppscotch/data"
- import * as O from "fp-ts/Option"
- import * as E from "fp-ts/Either"
- import { pipe } from "fp-ts/function"
- import { buildHarRequest } from "./har"
- // Hoppscotch's Code Generation is Powered by HTTPSnippet (https://github.com/Kong/httpsnippet)
- // If you want to add support for your favorite language/library, please contribute to the HTTPSnippet repo <3
- /**
- * An array defining all the code generators and their info
- */
- export const CodegenDefinitions = [
- {
- name: "c-curl",
- lang: "c",
- mode: "libcurl",
- caption: "C - cURL",
- },
- {
- name: "clojure-clj_http",
- lang: "clojure",
- mode: "clj_http",
- caption: "Clojure - clj-http",
- },
- {
- name: "csharp-httpclient",
- lang: "csharp",
- mode: "httpclient",
- caption: "C# - HttpClient",
- },
- {
- name: "csharp-restsharp",
- lang: "csharp",
- mode: "restsharp",
- caption: "C# - RestSharp",
- },
- {
- name: "go-native",
- lang: "go",
- mode: "native",
- caption: "Go",
- },
- {
- name: "http-http1.1",
- lang: "http",
- mode: "http1.1",
- caption: "HTTP - HTTP 1.1 Request String",
- },
- {
- name: "java-asynchttp",
- lang: "java",
- mode: "asynchttp",
- caption: "Java - AsyncHTTPClient",
- },
- {
- name: "java-nethttp",
- lang: "java",
- mode: "nethttp",
- caption: "Java - java.net.http",
- },
- {
- name: "java-okhttp",
- lang: "java",
- mode: "okhttp",
- caption: "Java - OkHttp",
- },
- {
- name: "java-unirest",
- lang: "java",
- mode: "unirest",
- caption: "Java - Unirest",
- },
- {
- name: "javascript-axios",
- lang: "javascript",
- mode: "axios",
- caption: "JavaScript - Axios",
- },
- {
- name: "javascript-fetch",
- lang: "javascript",
- mode: "fetch",
- caption: "JavaScript - Fetch",
- },
- {
- name: "javascript-jquery",
- lang: "javascript",
- mode: "jquery",
- caption: "JavaScript - jQuery",
- },
- {
- name: "javascript-xhr",
- lang: "javascript",
- mode: "xhr",
- caption: "JavaScript - XMLHttpRequest",
- },
- {
- name: "kotlin-okhttp",
- lang: "kotlin",
- mode: "okhttp",
- caption: "Kotlin - OkHttp",
- },
- {
- name: "objc-nsurlsession",
- lang: "objc",
- mode: "nsurlsession",
- caption: "Objective C - NSURLSession",
- },
- {
- name: "ocaml-cohttp",
- lang: "ocaml",
- mode: "cohttp",
- caption: "OCaml - cohttp",
- },
- {
- name: "php-curl",
- lang: "php",
- mode: "curl",
- caption: "PHP - cURL",
- },
- {
- name: "powershell-restmethod",
- lang: "powershell",
- mode: "restmethod",
- caption: "Powershell - Invoke-RestMethod",
- },
- {
- name: "powershell-webrequest",
- lang: "powershell",
- mode: "webrequest",
- caption: "Powershell - Invoke-WebRequest",
- },
- {
- name: "python-python3",
- lang: "python",
- mode: "python3",
- caption: "Python - Python 3 Native",
- },
- {
- name: "python-requests",
- lang: "python",
- mode: "requests",
- caption: "Python - Requests",
- },
- {
- name: "r-httr",
- lang: "r",
- mode: "httr",
- caption: "R - httr",
- },
- {
- name: "ruby-native",
- lang: "ruby",
- mode: "native",
- caption: "Ruby - Ruby Native",
- },
- {
- name: "shell-curl",
- lang: "shell",
- mode: "curl",
- caption: "Shell - cURL",
- },
- {
- name: "shell-httpie",
- lang: "shell",
- mode: "httpie",
- caption: "Shell - HTTPie",
- },
- {
- name: "shell-wget",
- lang: "shell",
- mode: "wget",
- caption: "Shell - Wget",
- },
- {
- name: "swift-nsurlsession",
- lang: "swift",
- mode: "nsurlsession",
- caption: "Swift - NSURLSession",
- },
- ] as const
- /**
- * A type which defines all the valid code generators
- */
- export type CodegenName = typeof CodegenDefinitions[number]["name"]
- /**
- * Generates Source Code for the given codgen
- * @param codegen The codegen to apply
- * @param req The request to generate using
- * @returns An Option with the generated code snippet
- */
- export const generateCode = (
- codegen: CodegenName,
- req: HoppRESTRequest
- ): O.Option<string> => {
- // Since the Type contract guarantees a match in the array, we are enforcing non-null
- const codegenInfo = CodegenDefinitions.find((v) => v.name === codegen)!
- return pipe(
- E.tryCatch(
- () =>
- new HTTPSnippet({
- ...buildHarRequest(req),
- }).convert(codegenInfo.lang, codegenInfo.mode, {
- indent: " ",
- }),
- (e) => e
- ),
- // Only allow string output to pass through, else none
- E.chainW(
- E.fromPredicate(
- (val): val is string => typeof val === "string",
- () => "code generator failed" as const
- )
- ),
- O.fromEither
- )
- }
|