httpsnippet-lite
Version:
HTTP Request snippet generator for *most* languages
182 lines (181 loc) • 6.3 kB
JavaScript
"use strict";
/**
* @description
* HTTP code snippet generator for Clojure using clj-http.
*
* @author
* @tggreene
*
* for any questions or issues regarding the generated code snippet, please open an issue mentioning the author.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.clj_http = void 0;
const code_builder_js_1 = require("../../../helpers/code-builder.cjs");
const headers_js_1 = require("../../../helpers/headers.cjs");
class Keyword {
constructor(name) {
this.name = '';
this.toString = () => `:${this.name}`;
this.name = name;
}
}
class File {
constructor(path) {
this.path = '';
this.toString = () => `(clojure.java.io/file "${this.path}")`;
this.path = path;
}
}
const jsType = (input) => {
if (input === undefined) {
return null;
}
if (input === null) {
return 'null';
}
return input.constructor.name.toLowerCase();
};
const objEmpty = (input) => {
if (jsType(input) === 'object') {
return Object.keys(input).length === 0;
}
return false;
};
const filterEmpty = (input) => {
Object.keys(input)
.filter(x => objEmpty(input[x]))
.forEach(x => {
delete input[x];
});
return input;
};
const padBlock = (padSize, input) => {
const padding = ' '.repeat(padSize);
return input.replace(/\n/g, `\n${padding}`);
};
const jsToEdn = (js) => {
switch (jsType(js)) {
case 'string':
return `"${js.replace(/"/g, '\\"')}"`;
case 'file':
return js.toString();
case 'keyword':
return js.toString();
case 'null':
return 'nil';
case 'regexp':
return `#"${js.source}"`;
case 'object': {
// simple vertical format
const obj = Object.keys(js)
.reduce((accumulator, key) => {
const val = padBlock(key.length + 2, jsToEdn(js[key]));
return `${accumulator}:${key} ${val}\n `;
}, '')
.trim();
return `{${padBlock(1, obj)}}`;
}
case 'array': {
// simple horizontal format
const arr = js
.reduce((accumulator, value) => `${accumulator} ${jsToEdn(value)}`, '')
.trim();
return `[${padBlock(1, arr)}]`;
}
default: // 'number' 'boolean'
return js.toString();
}
};
exports.clj_http = {
info: {
key: 'clj_http',
title: 'clj-http',
link: 'https://github.com/dakrone/clj-http',
description: 'An idiomatic clojure http client wrapping the apache client.',
},
convert: ({ queryObj, method, postData, url, allHeaders }, options) => {
const { push, join } = new code_builder_js_1.CodeBuilder({ indent: options === null || options === void 0 ? void 0 : options.indent });
const methods = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];
method = method.toLowerCase();
if (!methods.includes(method)) {
push('Method not supported');
return join();
}
const params = {
headers: allHeaders,
'query-params': queryObj,
};
switch (postData === null || postData === void 0 ? void 0 : postData.mimeType) {
case 'application/json':
{
params['content-type'] = new Keyword('json');
params['form-params'] = postData.jsonObj;
const header = (0, headers_js_1.getHeaderName)(params.headers, 'content-type');
if (header) {
delete params.headers[header];
}
}
break;
case 'application/x-www-form-urlencoded':
{
params['form-params'] = postData.paramsObj;
const header = (0, headers_js_1.getHeaderName)(params.headers, 'content-type');
if (header) {
delete params.headers[header];
}
}
break;
case 'text/plain':
{
params.body = postData.text;
const header = (0, headers_js_1.getHeaderName)(params.headers, 'content-type');
if (header) {
delete params.headers[header];
}
}
break;
case 'multipart/form-data': {
if (postData.params) {
params.multipart = postData.params.map(param => {
if (param.fileName && !param.value) {
return {
name: param.name,
content: new File(param.fileName),
};
}
return {
name: param.name,
content: param.value,
};
});
const header = (0, headers_js_1.getHeaderName)(params.headers, 'content-type');
if (header) {
delete params.headers[header];
}
}
break;
}
}
switch ((0, headers_js_1.getHeader)(params.headers, 'accept')) {
case 'application/json':
{
params.accept = new Keyword('json');
const header = (0, headers_js_1.getHeaderName)(params.headers, 'accept');
if (header) {
delete params.headers[header];
}
}
break;
}
push("(require '[clj-http.client :as client])\n");
if (objEmpty(filterEmpty(params))) {
push(`(client/${method} "${url}")`);
}
else {
const padding = 11 + method.length + url.length;
const formattedParams = padBlock(padding, jsToEdn(filterEmpty(params)));
push(`(client/${method} "${url}" ${formattedParams})`);
}
return join();
},
};