src/targets/node/request/client.ts
/**
* @description
* HTTP code snippet generator for Node.js using Request.
*
* @author
* @AhmadNassri
*
* for any questions or issues regarding the generated code snippet, please open an issue mentioning the author.
*/
import stringifyObject from 'stringify-object';
import { CodeBuilder } from '../../../helpers/code-builder';
import { Client } from '../../targets';
export const request: Client = {
info: {
key: 'request',
title: 'Request',
link: 'https://github.com/request/request',
description: 'Simplified HTTP request client',
},
convert: ({ method, url, queryObj, postData, headersObj, cookies }, options) => {
const opts = {
indent: ' ',
...options,
};
let includeFS = false;
const { push, blank, join, unshift } = new CodeBuilder({ indent: opts.indent });
push("const request = require('request');");
blank();
const reqOpts: Record<string, any> = {
method,
url,
};
if (Object.keys(queryObj).length) {
reqOpts.qs = queryObj;
}
if (Object.keys(headersObj).length) {
reqOpts.headers = headersObj;
}
switch (postData.mimeType) {
case 'application/x-www-form-urlencoded':
reqOpts.form = postData.paramsObj;
break;
case 'application/json':
if (postData.jsonObj) {
reqOpts.body = postData.jsonObj;
reqOpts.json = true;
}
break;
case 'multipart/form-data':
if (!postData.params) {
break;
}
reqOpts.formData = {};
postData.params.forEach(param => {
if (!param.fileName && !param.fileName && !param.contentType) {
reqOpts.formData[param.name] = param.value;
return;
}
let attachment: {
value?: string;
options?: {
filename: string;
contentType: string | null;
};
} = {};
if (param.fileName) {
includeFS = true;
attachment = {
value: `fs.createReadStream(${param.fileName})`,
options: {
filename: param.fileName,
contentType: param.contentType ? param.contentType : null,
},
};
} else if (param.value) {
attachment.value = param.value;
}
reqOpts.formData[param.name] = attachment;
});
break;
default:
if (postData.text) {
reqOpts.body = postData.text;
}
}
// construct cookies argument
if (cookies.length) {
reqOpts.jar = 'JAR';
push('const jar = request.jar();');
cookies.forEach(cookie => {
push(
`jar.setCookie(request.cookie('${encodeURIComponent(cookie.name)}=${encodeURIComponent(
cookie.value,
)}'), '${url}');`,
);
});
blank();
}
if (includeFS) {
unshift("const fs = require('fs');");
}
push(
`const options = ${stringifyObject(reqOpts, { indent: ' ', inlineCharacterLimit: 80 })};`,
);
blank();
push('request(options, function (error, response, body) {');
push('if (error) throw new Error(error);', 1);
blank();
push('console.log(body);', 1);
push('});');
return join()
.replace("'JAR'", 'jar')
.replace(/'fs\.createReadStream\((.*)\)'/, "fs.createReadStream('$1')");
},
};