diff --git a/helpers/codegen/codegen.js b/helpers/codegen/codegen.js
index 2ac7956b0..8f0afcb30 100644
--- a/helpers/codegen/codegen.js
+++ b/helpers/codegen/codegen.js
@@ -4,6 +4,7 @@ import { CurlCodegen } from "./generators/curl"
import { JSAxiosCodegen } from "./generators/js-axios"
import { GoNativeCodegen } from "./generators/go-native"
import { NodeJsRequestCodegen } from "./generators/nodejs-request"
+import { NodeJsNativeCodegen } from "./generators/nodejs-native"
import { JSjQueryCodegen } from "./generators/js-jQuery"
import { PowerShellRestMethod } from "./generators/powershell"
import { PhpCurlCodegen } from "./generators/php-curl"
@@ -25,6 +26,7 @@ export const codegens = [
JSjQueryCodegen,
JSXHRCodegen,
NodeJsRequestCodegen,
+ NodeJsNativeCodegen,
PhpCurlCodegen,
PowerShellRestMethod,
PythonRequestsCodegen,
diff --git a/helpers/codegen/generators/__tests__/__snapshots__/nodejs-native.spec.js.snap b/helpers/codegen/generators/__tests__/__snapshots__/nodejs-native.spec.js.snap
new file mode 100644
index 000000000..0653fdb79
--- /dev/null
+++ b/helpers/codegen/generators/__tests__/__snapshots__/nodejs-native.spec.js.snap
@@ -0,0 +1,98 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`generate request for NodeJs Native generate GET request 1`] = `
+"const http = require('http');
+
+const url = 'https://httpbin.org/path/to?a=b';
+const options = {
+ method: 'GET',
+ headers: {
+ \\"Authorization\\": \\"Basic bW9ja1VzZXI6bW9ja1Bhc3N3b3Jk\\",
+ \\"h1\\": \\"h1v\\",
+ \\"h2\\": \\"h2v\\"
+ }};
+
+const request = http.request(url, options, (response) => {
+ console.log(response);
+});
+
+request.on('error', (e) => {
+ console.error(e);
+});
+request.end();"
+`;
+
+exports[`generate request for NodeJs Native generate POST request for JSON 1`] = `
+"const http = require('http');
+
+const url = 'https://httpbin.org/path/to?a=b';
+const options = {
+ method: 'POST',
+ headers: {
+ \\"Authorization\\": \\"Bearer abcdefghijklmn\\",
+ \\"Content-Type\\": \\"application/json; charset=utf-8\\",
+ \\"h1\\": \\"h1v\\",
+ \\"h2\\": \\"h2v\\"
+ }};
+
+const request = http.request(url, options, (response) => {
+ console.log(response);
+});
+
+request.on('error', (e) => {
+ console.error(e);
+});
+
+request.write(JSON.stringify({\\"foo\\": \\"bar\\", \\"baz\\": \\"qux\\"}));
+request.end();"
+`;
+
+exports[`generate request for NodeJs Native generate POST request for XML 1`] = `
+"const http = require('http');
+
+const url = 'https://httpbin.org/path/to?a=b';
+const options = {
+ method: 'POST',
+ headers: {
+ \\"Authorization\\": \\"Bearer abcdefghijklmn\\",
+ \\"Content-Type\\": \\"application/xml; charset=utf-8\\",
+ \\"h1\\": \\"h1v\\",
+ \\"h2\\": \\"h2v\\"
+ }};
+
+const request = http.request(url, options, (response) => {
+ console.log(response);
+});
+
+request.on('error', (e) => {
+ console.error(e);
+});
+
+request.write(\`
+
+
+\`);
+request.end();"
+`;
+
+exports[`generate request for NodeJs Native generate PUT request for www-form-urlencoded 1`] = `
+"const http = require('http');
+
+const url = 'https://httpbin.org/path/to?a=b';
+const options = {
+ method: 'PUT',
+ headers: {
+ \\"Content-Type\\": \\"application/x-www-form-urlencoded; charset=utf-8\\"
+ }};
+
+const request = http.request(url, options, (response) => {
+ console.log(response);
+});
+
+request.on('error', (e) => {
+ console.error(e);
+});
+
+request.write(\`foo=bar&baz=qux\`);
+request.end();"
+`;
diff --git a/helpers/codegen/generators/__tests__/fixtures.js b/helpers/codegen/generators/__tests__/fixtures.js
new file mode 100644
index 000000000..8fc60aaf0
--- /dev/null
+++ b/helpers/codegen/generators/__tests__/fixtures.js
@@ -0,0 +1,16 @@
+export const TEST_URL = "https://httpbin.org"
+export const TEST_PATH_NAME = "/path/to"
+export const TEST_QUERY_STRING = "?a=b"
+export const TEST_HTTP_USER = "mockUser"
+export const TEST_HTTP_PASSWORD = "mockPassword"
+export const TEST_BEARER_TOKEN = "abcdefghijklmn"
+export const TEST_RAW_REQUEST_BODY = "foo=bar&baz=qux"
+export const TEST_RAW_PARAMS_JSON = '{"foo": "bar", "baz": "qux"}'
+export const TEST_RAW_PARAMS_XML = `
+
+
+`
+export const TEST_HEADERS = [
+ { key: "h1", value: "h1v" },
+ { key: "h2", value: "h2v" },
+]
diff --git a/helpers/codegen/generators/__tests__/nodejs-native.spec.js b/helpers/codegen/generators/__tests__/nodejs-native.spec.js
new file mode 100644
index 000000000..c9ab09264
--- /dev/null
+++ b/helpers/codegen/generators/__tests__/nodejs-native.spec.js
@@ -0,0 +1,74 @@
+import { NodeJsNativeCodegen } from "../nodejs-native"
+import {
+ TEST_BEARER_TOKEN,
+ TEST_HEADERS,
+ TEST_HTTP_PASSWORD,
+ TEST_HTTP_USER,
+ TEST_PATH_NAME,
+ TEST_QUERY_STRING,
+ TEST_RAW_PARAMS_JSON,
+ TEST_RAW_PARAMS_XML,
+ TEST_RAW_REQUEST_BODY,
+ TEST_URL,
+} from "./fixtures"
+
+describe("generate request for NodeJs Native", () => {
+ test("generate GET request", () => {
+ const result = NodeJsNativeCodegen.generator({
+ url: TEST_URL,
+ pathName: TEST_PATH_NAME,
+ queryString: TEST_QUERY_STRING,
+ auth: "Basic Auth",
+ httpUser: TEST_HTTP_USER,
+ httpPassword: TEST_HTTP_PASSWORD,
+ method: "GET",
+ headers: TEST_HEADERS,
+ })
+ expect(result).toMatchSnapshot()
+ })
+
+ test("generate POST request for JSON", () => {
+ const result = NodeJsNativeCodegen.generator({
+ url: TEST_URL,
+ pathName: TEST_PATH_NAME,
+ queryString: TEST_QUERY_STRING,
+ auth: "Bearer Token",
+ bearerToken: TEST_BEARER_TOKEN,
+ method: "POST",
+ rawInput: true,
+ rawParams: TEST_RAW_PARAMS_JSON,
+ contentType: "application/json",
+ headers: TEST_HEADERS,
+ })
+ expect(result).toMatchSnapshot()
+ })
+
+ test("generate POST request for XML", () => {
+ const result = NodeJsNativeCodegen.generator({
+ url: TEST_URL,
+ pathName: TEST_PATH_NAME,
+ queryString: TEST_QUERY_STRING,
+ auth: "OAuth 2.0",
+ bearerToken: TEST_BEARER_TOKEN,
+ method: "POST",
+ rawInput: true,
+ rawParams: TEST_RAW_PARAMS_XML,
+ contentType: "application/xml",
+ headers: TEST_HEADERS,
+ })
+ expect(result).toMatchSnapshot()
+ })
+
+ test("generate PUT request for www-form-urlencoded", () => {
+ const result = NodeJsNativeCodegen.generator({
+ url: TEST_URL,
+ pathName: TEST_PATH_NAME,
+ queryString: TEST_QUERY_STRING,
+ method: "PUT",
+ rawInput: false,
+ rawRequestBody: TEST_RAW_REQUEST_BODY,
+ contentType: "application/x-www-form-urlencoded",
+ })
+ expect(result).toMatchSnapshot()
+ })
+})
diff --git a/helpers/codegen/generators/nodejs-native.js b/helpers/codegen/generators/nodejs-native.js
new file mode 100644
index 000000000..9b35d8953
--- /dev/null
+++ b/helpers/codegen/generators/nodejs-native.js
@@ -0,0 +1,81 @@
+import { isJSONContentType } from "~/helpers/utils/contenttypes"
+
+export const NodeJsNativeCodegen = {
+ id: "nodejs-native",
+ name: "NodeJs Native",
+ generator: ({
+ url,
+ pathName,
+ queryString,
+ auth,
+ httpUser,
+ httpPassword,
+ bearerToken,
+ method,
+ rawInput,
+ rawParams,
+ rawRequestBody,
+ contentType,
+ headers,
+ }) => {
+ const requestString = []
+ const genHeaders = []
+
+ requestString.push(`const http = require('http');\n\n`)
+
+ requestString.push(`const url = '${url}${pathName}${queryString}';\n`)
+
+ requestString.push(`const options = {\n`)
+ requestString.push(` method: '${method}',\n`)
+
+ if (auth === "Basic Auth") {
+ const basic = `${httpUser}:${httpPassword}`
+ genHeaders.push(
+ ` "Authorization": "Basic ${window.btoa(unescape(encodeURIComponent(basic)))}",\n`
+ )
+ } else if (auth === "Bearer Token" || auth === "OAuth 2.0") {
+ genHeaders.push(` "Authorization": "Bearer ${bearerToken}",\n`)
+ }
+
+ let requestBody
+ if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
+ console.log("===== rawInput = " + rawInput)
+ console.log("===== rawParams = " + rawParams)
+ console.log("===== rawRequestBody = " + rawRequestBody)
+ requestBody = rawInput ? rawParams : rawRequestBody
+ if (isJSONContentType(contentType)) {
+ requestBody = `JSON.stringify(${requestBody})`
+ } else {
+ requestBody = `\`${requestBody}\``
+ }
+ if (contentType) {
+ genHeaders.push(` "Content-Type": "${contentType}; charset=utf-8",\n`)
+ }
+ }
+
+ if (headers) {
+ headers.forEach(({ key, value }) => {
+ if (key) genHeaders.push(` "${key}": "${value}",\n`)
+ })
+ }
+ if (genHeaders.length > 0 || headers.length > 0) {
+ requestString.push(` headers: {\n${genHeaders.join("").slice(0, -2)}\n }`)
+ }
+ requestString.push(`};\n\n`)
+
+ requestString.push(`const request = http.request(url, options, (response) => {\n`)
+ requestString.push(` console.log(response);\n`)
+ requestString.push(`});\n\n`)
+
+ requestString.push(`request.on('error', (e) => {\n`)
+ requestString.push(` console.error(e);\n`)
+ requestString.push(`});\n`)
+
+ if (requestBody) {
+ requestString.push(`\nrequest.write(${requestBody});\n`)
+ }
+
+ requestString.push(`request.end();`)
+ return requestString.join("")
+ },
+}