httpsnippet-lite
Version:
HTTP Request snippet generator for *most* languages
124 lines (123 loc) • 4.9 kB
JavaScript
"use strict";
/**
* @description
* HTTP code snippet generator for R using httr
*
* @author
* @gabrielakoreeda
*
* for any questions or issues regarding the generated code snippet, please open an issue mentioning the author.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.httr = void 0;
const code_builder_js_1 = require("../../../helpers/code-builder.js");
const escape_js_1 = require("../../../helpers/escape.js");
const headers_js_1 = require("../../../helpers/headers.js");
exports.httr = {
info: {
key: 'httr',
title: 'httr',
link: 'https://cran.r-project.org/web/packages/httr/vignettes/quickstart.html',
description: 'httr: Tools for Working with URLs and HTTP',
},
convert: ({ url, queryObj, queryString, postData, allHeaders, method }, options = {}) => {
var _a, _b;
// Start snippet
const { push, blank, join } = new code_builder_js_1.CodeBuilder({
indent: (_a = options.indent) !== null && _a !== void 0 ? _a : ' ',
});
// Import httr
push('library(httr)');
blank();
// Set URL
push(`url <- "${url}"`);
blank();
// Construct query string
const qs = queryObj;
delete queryObj.key;
const entries = Object.entries(qs);
const entriesCount = entries.length;
if (entriesCount === 1) {
const entry = entries[0];
push(`queryString <- list(${entry[0]} = "${entry[1]}")`);
blank();
}
else if (entriesCount > 1) {
push('queryString <- list(');
entries.forEach(([key, value], i) => {
const isLastItem = i !== entriesCount - 1;
const maybeComma = isLastItem ? ',' : '';
push(`${key} = "${value}"${maybeComma}`, 1);
});
push(')');
blank();
}
// Construct payload
const payload = JSON.stringify(postData === null || postData === void 0 ? void 0 : postData.text);
if (payload) {
push(`payload <- ${payload}`);
blank();
}
// Define encode
if (postData && (postData.text || postData.jsonObj || postData.params)) {
switch (postData.mimeType) {
case 'application/x-www-form-urlencoded':
push('encode <- "form"');
blank();
break;
case 'application/json':
push('encode <- "json"');
blank();
break;
case 'multipart/form-data':
push('encode <- "multipart"');
blank();
break;
default:
push('encode <- "raw"');
blank();
break;
}
}
// Construct headers
const cookieHeader = (0, headers_js_1.getHeader)(allHeaders, 'cookie');
const acceptHeader = (0, headers_js_1.getHeader)(allHeaders, 'accept');
const setCookies = cookieHeader
? `set_cookies(\`${String(cookieHeader)
.replace(/;/g, '", `')
.replace(/` /g, '`')
.replace(/[=]/g, '` = "')}")`
: undefined;
const setAccept = acceptHeader ? `accept("${(0, escape_js_1.escapeForDoubleQuotes)(acceptHeader)}")` : undefined;
const setContentType = `content_type("${(0, escape_js_1.escapeForDoubleQuotes)((_b = postData === null || postData === void 0 ? void 0 : postData.mimeType) !== null && _b !== void 0 ? _b : 'application/octet-stream')}")`;
const otherHeaders = Object.entries(allHeaders)
// These headers are all handled separately:
.filter(([key]) => !['cookie', 'accept', 'content-type'].includes(key.toLowerCase()))
.map(([key, value]) => `'${key}' = '${(0, escape_js_1.escapeForSingleQuotes)(value)}'`)
.join(', ');
const setHeaders = otherHeaders ? `add_headers(${otherHeaders})` : undefined;
// Construct request
let request = `response <- VERB("${method}", url`;
if (payload) {
request += ', body = payload';
}
if (queryString.length) {
request += ', query = queryString';
}
const headerAdditions = [setHeaders, setContentType, setAccept, setCookies]
.filter(x => !!x)
.join(', ');
if (headerAdditions) {
request += `, ${headerAdditions}`;
}
if (postData && (postData.text || postData.jsonObj || postData.params)) {
request += ', encode = encode';
}
request += ')';
push(request);
blank();
// Print response
push('content(response, "text")');
return join();
},
};