feat: init v.0.0.1
commit
76517ea608
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules
|
||||||
|
package-lock.json
|
|
@ -0,0 +1,7 @@
|
||||||
|
const postmanToPdf = require("./utils/postman-to-pdf");
|
||||||
|
|
||||||
|
const inputFilePath = "./input/collection.json";
|
||||||
|
const apiRoute = "https://example.com/api"
|
||||||
|
const outputPath = "./output"
|
||||||
|
|
||||||
|
postmanToPdf(inputFilePath, outputPath, apiRoute);
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "postmantopdf",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Converts Postman API collection v2.1 into a proper documentated PDF/html file",
|
||||||
|
"main": "app.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node ./"
|
||||||
|
},
|
||||||
|
"author": "EvgeniySugonyako",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"html-pdf": "3.0.1"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,487 @@
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
function parseExampleRes(data) {
|
||||||
|
let html = '';
|
||||||
|
let header_html = "";
|
||||||
|
if (data.response.headers.length > 0) {
|
||||||
|
data.response.headers.forEach(elem => {
|
||||||
|
if (elem.key === "Content-Type") {
|
||||||
|
header_html += "<p style='margin-left: 27px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.response.bodyOptions && data.response.bodyOptions !== "") {
|
||||||
|
if (header_html === "") {
|
||||||
|
Object.keys(data.response.bodyOptions).forEach(function(typeName) {
|
||||||
|
if (typeName === "language") {
|
||||||
|
header_html += `
|
||||||
|
<p style='margin-left: 20px; word-wrap: break-word;'>
|
||||||
|
"Content-type" : "${data.response.bodyOptions[typeName]}"
|
||||||
|
</p>`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (header_html !== "") {
|
||||||
|
header_html = `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>Headers : </strong>
|
||||||
|
</p>
|
||||||
|
${header_html}
|
||||||
|
`;
|
||||||
|
html += header_html;
|
||||||
|
}
|
||||||
|
if (data.response.cookies.length > 0) {
|
||||||
|
html += `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>Cookies : </strong>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
data.response.cookies.forEach(elem => {
|
||||||
|
html += "<p style='margin-left: 27px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.response.body !== "") {
|
||||||
|
let body = `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<b>Body : </b>
|
||||||
|
</p>`;
|
||||||
|
switch (typeof data.response.body) {
|
||||||
|
case 'string':
|
||||||
|
body += `<pre style='font-size: 16px; margin-left: 27px; word-wrap: break-word;'>${data.response.body}</pre>`;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'object':
|
||||||
|
body = "";
|
||||||
|
data.response.body.forEach(item => {
|
||||||
|
body += `<pre style='font-size: 16px; margin-left: 27px; word-wrap: break-word;'>${JSON.stringify(item, null, 2)}</pre>`;
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
body = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
html += body;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseExampleReq(data) {
|
||||||
|
let html = '';
|
||||||
|
let header_html = "";
|
||||||
|
if (data.request.header.length > 0) {
|
||||||
|
data.request.header.forEach(elem => {
|
||||||
|
if (elem.key === "Content-Type") {
|
||||||
|
header_html += "<p style='margin-left: 27px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.request.bodyOptions && data.request.bodyOptions !== "") {
|
||||||
|
if (header_html === "") {
|
||||||
|
Object.keys(data.request.bodyOptions).forEach(function(typeName) {
|
||||||
|
if (typeName === "language") {
|
||||||
|
header_html += `
|
||||||
|
<p style='margin-left: 27px; word-wrap: break-word;'>
|
||||||
|
"Content-type" : "${data.request.bodyOptions[typeName]}"
|
||||||
|
</p>`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (header_html !== "") {
|
||||||
|
header_html = `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>Headers : </strong>
|
||||||
|
</p>
|
||||||
|
${header_html}
|
||||||
|
`;
|
||||||
|
html += header_html;
|
||||||
|
}
|
||||||
|
if(data.request.auth.length > 0) {
|
||||||
|
html += "<p style='margin-left: 25px; word-wrap: break-word;'><strong>Auth : </strong></p>";
|
||||||
|
data.request.auth.forEach(elem => {
|
||||||
|
html += "<p style='margin-left: 27px; word-wrap: break-word;'>key : "+elem.key+", value : "+elem.value+", type : "+elem.type+"</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.request.variables.length > 0) {
|
||||||
|
html += `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<b>Path Variables: </b>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
data.request.variables.forEach(elem => {
|
||||||
|
html += "<p style='margin-left: 27px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.request.queryes.length > 0) {
|
||||||
|
html += `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<b>Query Parameters : </b>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
data.request.queryes.forEach(elem => {
|
||||||
|
html += "<p style='margin-left: 27px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.request.body !== "") {
|
||||||
|
let body = `
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<b>Body : </b>
|
||||||
|
</p>`;
|
||||||
|
switch (typeof data.request.body) {
|
||||||
|
case 'string':
|
||||||
|
body += `<pre style='font-size: 16px; margin-left: 27px; word-wrap: break-word;'>${data.request.body}</pre>`;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'object':
|
||||||
|
data.request.body.forEach(item => {
|
||||||
|
body += `<pre style='font-size: 16px; margin-left: 27px; word-wrap: break-word;'>${JSON.stringify(item, null, 2)}</pre>`;
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
body = "";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
html += body;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateExamples(data) {
|
||||||
|
let html = `
|
||||||
|
<p style='margin-left: 20px;'>
|
||||||
|
<b><u>Success : </u></b>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
if (data.success.length > 0) {
|
||||||
|
data.success.forEach(function(item) {
|
||||||
|
let desc = "";
|
||||||
|
if (item.desc && item.desc !== "") {
|
||||||
|
desc = `
|
||||||
|
<p style='margin-left: 22px;'>
|
||||||
|
<strong>Description : </strong>
|
||||||
|
<span style='white-space: pre;'>${item.desc.replace(/ /g, " ")}</span>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
html += `
|
||||||
|
<p style='margin-left: 22px;'>
|
||||||
|
<b>Request : </b>${item.name}
|
||||||
|
</p>
|
||||||
|
${desc}
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>URL : </strong>
|
||||||
|
${item.request.url}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>Method : </strong>
|
||||||
|
${item.request.method}
|
||||||
|
</p>
|
||||||
|
${parseExampleReq(item)}
|
||||||
|
<p style='margin-left: 22px;'>
|
||||||
|
<b>Response : </b>
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px;'>
|
||||||
|
<b>Status : </b> ${item.response.status}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px;'>
|
||||||
|
<b>Code : </b> ${item.response.code}
|
||||||
|
</p>
|
||||||
|
${parseExampleRes(item)}
|
||||||
|
<br>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
html += `<p style='margin-left: 25px; word-wrap: break-word;'>No examples</p>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
html += `
|
||||||
|
<p style='margin-left: 20px;'>
|
||||||
|
<b><u>Exceptions : </u></b>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
if (data.exceptions.length > 0) {
|
||||||
|
data.exceptions.forEach(function(item){
|
||||||
|
let desc = "";
|
||||||
|
if (item.desc && item.desc !== "") {
|
||||||
|
desc = `
|
||||||
|
<p style='margin-left: 22px;'>
|
||||||
|
<strong>Description : </strong>
|
||||||
|
<span style='white-space: pre;'>${item.desc.replace(/ /g, " ")}</span>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
html += `
|
||||||
|
<p style='margin-left: 22px;'>
|
||||||
|
<b>Request : </b>${item.name}
|
||||||
|
</p>
|
||||||
|
${desc}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>URL : </strong>
|
||||||
|
${item.request.url}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px; word-wrap: break-word;'>
|
||||||
|
<strong>Method : </strong>
|
||||||
|
${item.request.method}
|
||||||
|
</p>
|
||||||
|
${parseExampleReq(item)}
|
||||||
|
<p style='margin-left: 22px;'>
|
||||||
|
<b>Response : </b>
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px;'>
|
||||||
|
<b>Code : </b> ${item.response.code}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 25px;'>
|
||||||
|
<b>Status : </b> ${item.response.status}
|
||||||
|
</p>
|
||||||
|
${parseExampleRes(item)}
|
||||||
|
<br>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
html += `<p style='margin-left: 25px; word-wrap: break-word;'>No examples</p>`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateApiHtml(data) {
|
||||||
|
let html = `
|
||||||
|
<h3 style='margin-left: 10px;'>
|
||||||
|
<b>${data.name}</b>
|
||||||
|
</h3>
|
||||||
|
`;
|
||||||
|
let header_html = "";
|
||||||
|
let auth_html = "";
|
||||||
|
if (data.header.length > 0) {
|
||||||
|
header_html = "";
|
||||||
|
data.header.forEach(elem => {
|
||||||
|
header_html += "<p style='margin-left: 20px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if(data.auth.length > 0) {
|
||||||
|
auth_html="<p style='margin-left: 15px; word-wrap: break-word;'><strong>Auth : </strong></p>";
|
||||||
|
data.auth.forEach(elem => {
|
||||||
|
auth_html += "<p style='margin-left: 20px; word-wrap: break-word;'>key : "+elem.key+", value : "+elem.value+", type : "+elem.type+"</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let body = "<pre style='font-size: 16px; margin-left: 20px; word-wrap: break-word;'>not required, leave blank</pre>";
|
||||||
|
switch (typeof data.body) {
|
||||||
|
case 'string':
|
||||||
|
if (data.body !== "") {
|
||||||
|
body = `<pre style='font-size: 16px; margin-left: 20px; word-wrap: break-word;'>${data.body}</pre>`;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'object':
|
||||||
|
body = "";
|
||||||
|
data.body.forEach(item => {
|
||||||
|
body += `<pre style='font-size: 16px; margin-left: 20px; word-wrap: break-word;'>${JSON.stringify(item, null, 2)}</pre>`;
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
body = "<pre style='font-size: 16px; margin-left: 20px; word-wrap: break-word;'>not required, leave blank</pre>";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.bodyOptions && data.bodyOptions !== "") {
|
||||||
|
Object.keys(data.bodyOptions).forEach(function(typeName) {
|
||||||
|
if (typeName === "language") {
|
||||||
|
header_html += `
|
||||||
|
<p style='margin-left: 20px; word-wrap: break-word;'>
|
||||||
|
"Content-type" : "${data.bodyOptions[typeName]}"
|
||||||
|
</p>`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let variables = "<p style='margin-left: 20px; word-wrap: break-word;'>not required, leave blank</p>";
|
||||||
|
if (data.variables.length > 0) {
|
||||||
|
variables = "";
|
||||||
|
data.variables.forEach(elem => {
|
||||||
|
variables += "<p style='margin-left: 20px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let queryes = "<p style='margin-left: 20px; word-wrap: break-word;'>not required, leave blank</p>";
|
||||||
|
if (data.queryes.length > 0) {
|
||||||
|
queryes = "";
|
||||||
|
data.queryes.forEach(elem => {
|
||||||
|
queryes += "<p style='margin-left: 20px; word-wrap: break-word;'>""+elem.key+"" : ""+elem.value+""</p>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header_html === "") {
|
||||||
|
header_html = "<p style='margin-left: 20px; word-wrap: break-word;'>not required, leave blank</p>";
|
||||||
|
}
|
||||||
|
let desc = "";
|
||||||
|
if (data.desc && data.desc !== "") {
|
||||||
|
desc = `
|
||||||
|
<p style='margin-left: 15px;'>
|
||||||
|
<strong>Description : </strong>
|
||||||
|
<span style='white-space: pre;'>${data.desc.replace(/ /g, " ")}</span>
|
||||||
|
</p>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
html +=
|
||||||
|
`${desc}
|
||||||
|
<p style='margin-left: 15px; word-wrap: break-word;'>
|
||||||
|
<strong>URL : </strong>
|
||||||
|
${data.url}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 15px; word-wrap: break-word;'>
|
||||||
|
<strong>Method : </strong>
|
||||||
|
${data.method}
|
||||||
|
</p>
|
||||||
|
<p style='margin-left: 15px; word-wrap: break-word;'>
|
||||||
|
<strong>Headers : </strong>
|
||||||
|
</p>
|
||||||
|
${header_html+auth_html}
|
||||||
|
<p style='margin-left: 15px; word-wrap: break-word;'>
|
||||||
|
<b>Path Variables: </b>
|
||||||
|
</p>
|
||||||
|
${variables}
|
||||||
|
<p style='margin-left: 15px; word-wrap: break-word;'>
|
||||||
|
<b>Query Parameters : </b>
|
||||||
|
</p>
|
||||||
|
${queryes}
|
||||||
|
<p style='margin-left: 15px; word-wrap: break-word;'>
|
||||||
|
<b>Body : </b>
|
||||||
|
</p>
|
||||||
|
${body}
|
||||||
|
<br>
|
||||||
|
<p style='margin-left: 15px;'>
|
||||||
|
<b>Examples : </b>
|
||||||
|
</p>
|
||||||
|
${generateExamples(data.examples)}
|
||||||
|
<br><hr>`;
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function htmlGenerator(collection_name, data, outputPath) {
|
||||||
|
console.log("Start parse");
|
||||||
|
let html =
|
||||||
|
`<html>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
padding: 0;
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
h2, h3 {
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
.page {
|
||||||
|
page-break-after: always;
|
||||||
|
counter-increment: page;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
font-family: Courier New, monospace;
|
||||||
|
word-wrap: break-word;
|
||||||
|
page-break-inside: avoid;
|
||||||
|
}
|
||||||
|
@page {
|
||||||
|
size: A4;
|
||||||
|
margin: 0.5cm;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
<h1 style='text-align: center;'>
|
||||||
|
<u>${collection_name} Documentation</u>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
Object.keys(data).forEach(function(scope) {
|
||||||
|
if (!data[scope].apis) {
|
||||||
|
let trigger = false;
|
||||||
|
Object.keys(data[scope]).forEach(function(subScope) {
|
||||||
|
if (trigger === false) {
|
||||||
|
html += `
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
<h2 style='text-align: center;'>
|
||||||
|
<u>${scope}</u>
|
||||||
|
</h2>
|
||||||
|
<h3 style='margin-left: 5px;'>
|
||||||
|
<u>${subScope}</u>
|
||||||
|
</h3>
|
||||||
|
<hr>
|
||||||
|
`;
|
||||||
|
trigger = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
html += `
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
<h3 style='margin-left: 5px;'>
|
||||||
|
<u>${subScope}</u>
|
||||||
|
</h3>
|
||||||
|
<hr>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
data[scope][subScope].apis.forEach(api => {
|
||||||
|
html += `
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
`;
|
||||||
|
html += generateApiHtml(api);
|
||||||
|
html += `
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
});
|
||||||
|
html += `
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
html += `
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
<h2 style='margin-left: 5px;'>
|
||||||
|
<u>${scope}</u>
|
||||||
|
</h2>
|
||||||
|
<hr>
|
||||||
|
`;
|
||||||
|
data[scope].apis.forEach(api => {
|
||||||
|
html += `
|
||||||
|
<div class="page">
|
||||||
|
<div class="content">
|
||||||
|
`;
|
||||||
|
html += generateApiHtml(api);
|
||||||
|
html += `
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
});
|
||||||
|
html += `
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
html += "</body></html>";
|
||||||
|
fs.writeFile(`${outputPath}/${collection_name}.html`, html, 'utf8', (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
console.log(`${outputPath}/${collection_name}.html`);
|
||||||
|
});
|
||||||
|
console.log("End parse");
|
||||||
|
return html;
|
||||||
|
};
|
|
@ -0,0 +1,26 @@
|
||||||
|
const pdf = require('html-pdf');
|
||||||
|
|
||||||
|
module.exports = function pdfGenerator(html, file, outputPath) {
|
||||||
|
const filepath = outputPath + "/" + file;
|
||||||
|
const options = {
|
||||||
|
format: 'A4',
|
||||||
|
timeout: 60000,
|
||||||
|
"border": "5mm",
|
||||||
|
"height": '297mm',
|
||||||
|
"footer": {
|
||||||
|
"height": "5mm",
|
||||||
|
"contents": {
|
||||||
|
default: '<span style="display: block; color: #444; font-size: 15px; text-align: right; width: 100%;">{{page}} / {{pages}}</span>',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log("Generate PDF");
|
||||||
|
pdf.create(html, options).toFile(filepath, function(err, res) {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
if (res) {
|
||||||
|
console.log("End generation PDF");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
|
@ -0,0 +1,238 @@
|
||||||
|
const fs = require('fs');
|
||||||
|
const generatePdf = require('./pdf-generator');
|
||||||
|
const generateHtml = require('./html-generator');
|
||||||
|
|
||||||
|
function getExamples(data, scopeAuth, apiRoute) {
|
||||||
|
const examples = {
|
||||||
|
success: [],
|
||||||
|
exceptions: []
|
||||||
|
};
|
||||||
|
|
||||||
|
data.forEach(function(item) {
|
||||||
|
const method = item.originalRequest.method;
|
||||||
|
const headers = [];
|
||||||
|
const auth = [];
|
||||||
|
const variables = [];
|
||||||
|
const queryes = [];
|
||||||
|
item.originalRequest.header.forEach(headeritem => {
|
||||||
|
const header_obj = {
|
||||||
|
key: headeritem.key,
|
||||||
|
value: headeritem.value
|
||||||
|
};
|
||||||
|
headers.push(header_obj);
|
||||||
|
});
|
||||||
|
|
||||||
|
if(item.originalRequest.auth) {
|
||||||
|
const auth_type = item.originalRequest.auth.type;
|
||||||
|
item.originalRequest.auth[auth_type].forEach(authitem=> {
|
||||||
|
const auth_obj = {
|
||||||
|
key: authitem.key,
|
||||||
|
value: authitem.value,
|
||||||
|
type: authitem.type
|
||||||
|
};
|
||||||
|
auth.push(auth_obj);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (scopeAuth !== null) {
|
||||||
|
const auth_type = scopeAuth.type;
|
||||||
|
scopeAuth[auth_type].forEach(authitem=> {
|
||||||
|
const auth_obj = {
|
||||||
|
key: authitem.key,
|
||||||
|
value: authitem.value,
|
||||||
|
type: authitem.type
|
||||||
|
};
|
||||||
|
req_auth.push(auth_obj);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let body = "";
|
||||||
|
let mode = "";
|
||||||
|
let options = "";
|
||||||
|
if(item.originalRequest.body) {
|
||||||
|
body = item.originalRequest.body[item.originalRequest.body.mode];
|
||||||
|
mode = item.originalRequest.body.mode;
|
||||||
|
if (item.originalRequest.body.options) {
|
||||||
|
options = item.originalRequest.body.options[item.originalRequest.body.mode];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = item.originalRequest.url.raw.replace("{{api_url}}", apiRoute);
|
||||||
|
if (item.originalRequest.url.variable) {
|
||||||
|
item.originalRequest.url.variable.forEach(item=> {
|
||||||
|
variables.push(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (item.originalRequest.url.query) {
|
||||||
|
item.originalRequest.url.query.forEach(item=> {
|
||||||
|
queryes.push(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
name: item.name,
|
||||||
|
request: {
|
||||||
|
header: headers,
|
||||||
|
auth: auth,
|
||||||
|
method: method,
|
||||||
|
body: body,
|
||||||
|
bodyMode: mode,
|
||||||
|
bodyOptions: options,
|
||||||
|
url: url,
|
||||||
|
variables: variables,
|
||||||
|
queryes: queryes,
|
||||||
|
desc: item.originalRequest.description || ""
|
||||||
|
},
|
||||||
|
response: {
|
||||||
|
status: item.status,
|
||||||
|
code: item.code,
|
||||||
|
language: item._postman_previewlanguage,
|
||||||
|
headers: item.header,
|
||||||
|
cookies: item.cookie,
|
||||||
|
body: item.body
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (item.code === 200) {
|
||||||
|
examples.success.push(result);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
examples.exceptions.push(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return examples;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseData(data, scopeAuth, apiRoute) {
|
||||||
|
const req_name = data.name;
|
||||||
|
const req_method = data.request.method;
|
||||||
|
const req_headers = [];
|
||||||
|
const req_auth = [];
|
||||||
|
const variables = [];
|
||||||
|
const queryes = [];
|
||||||
|
|
||||||
|
let examples;
|
||||||
|
if (data.response && data.response.length > 0) {
|
||||||
|
examples = getExamples(data.response, scopeAuth, apiRoute);
|
||||||
|
}
|
||||||
|
|
||||||
|
data.request.header.forEach(headeritem => {
|
||||||
|
const header_obj = {
|
||||||
|
key: headeritem.key,
|
||||||
|
value: headeritem.value
|
||||||
|
};
|
||||||
|
if (header_obj.key !== 'Authorization') {
|
||||||
|
req_headers.push(header_obj);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if(data.request.auth) {
|
||||||
|
const auth_type = data.request.auth.type;
|
||||||
|
data.request.auth[auth_type].forEach(authitem=> {
|
||||||
|
const auth_obj = {
|
||||||
|
key: authitem.key,
|
||||||
|
value: authitem.value,
|
||||||
|
type: authitem.type
|
||||||
|
};
|
||||||
|
req_auth.push(auth_obj);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (scopeAuth !== null) {
|
||||||
|
const auth_type = scopeAuth.type;
|
||||||
|
scopeAuth[auth_type].forEach(authitem=> {
|
||||||
|
const auth_obj = {
|
||||||
|
key: authitem.key,
|
||||||
|
value: authitem.value,
|
||||||
|
type: authitem.type
|
||||||
|
};
|
||||||
|
req_auth.push(auth_obj);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let req_body = "";
|
||||||
|
let req_mode = "";
|
||||||
|
let req_options = "";
|
||||||
|
if(data.request.body) {
|
||||||
|
req_body = data.request.body[data.request.body.mode];
|
||||||
|
req_mode = data.request.body.mode;
|
||||||
|
if (data.request.body.options) {
|
||||||
|
req_options = data.request.body.options[data.request.body.mode];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const reqUrl = data.request.url.raw.replace("{{api_url}}", apiRoute);
|
||||||
|
if (reqUrl.includes('public')) {
|
||||||
|
req_headers.push({key: 'Authorization (optional)', value: 'Bearer |token|'});
|
||||||
|
}
|
||||||
|
if (reqUrl.includes('user')) {
|
||||||
|
req_headers.push({key: 'Authorization (required)', value: 'Bearer |token|'});
|
||||||
|
}
|
||||||
|
if (reqUrl.includes('admin')) {
|
||||||
|
req_headers.push({key: 'Authorization (required)', value: 'Bearer |token|'});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.request.url.variable) {
|
||||||
|
data.request.url.variable.forEach(item=> {
|
||||||
|
variables.push(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (data.request.url.query) {
|
||||||
|
data.request.url.query.forEach(item=> {
|
||||||
|
queryes.push(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: req_name,
|
||||||
|
header: req_headers,
|
||||||
|
auth: req_auth,
|
||||||
|
method: req_method,
|
||||||
|
body: req_body,
|
||||||
|
bodyMode: req_mode,
|
||||||
|
bodyOptions: req_options,
|
||||||
|
url: reqUrl,
|
||||||
|
variables: variables,
|
||||||
|
queryes: queryes,
|
||||||
|
desc: data.request.description || "",
|
||||||
|
examples: examples || {success: [],exceptions: []}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = function filereader(filepath, outputPath, apiRoute) {
|
||||||
|
fs.readFile(filepath, 'utf-8', (err, data) => {
|
||||||
|
if(err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
const jsonData = JSON.parse(data);
|
||||||
|
const collection_name = jsonData.info.name;
|
||||||
|
const resultData = {};
|
||||||
|
jsonData.item.forEach(scope => {
|
||||||
|
if(scope.item) {
|
||||||
|
let auth = null;
|
||||||
|
if (scope.auth && scope.auth.length > 0) {
|
||||||
|
auth = scope.auth;
|
||||||
|
}
|
||||||
|
resultData[scope.name] = {};
|
||||||
|
scope.item.forEach(subscope => {
|
||||||
|
if(subscope.item) {
|
||||||
|
resultData[scope.name][subscope.name] = {};
|
||||||
|
resultData[scope.name][subscope.name].apis = [];
|
||||||
|
subscope.item.forEach(reqitem => {
|
||||||
|
resultData[scope.name][subscope.name].apis.push(parseData(reqitem, auth, apiRoute));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(!resultData[scope.name].apis) {
|
||||||
|
resultData[scope.name].apis = [];
|
||||||
|
}
|
||||||
|
resultData[scope.name].apis.push(parseData(subscope, auth, apiRoute));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
generatePdf(generateHtml(collection_name, resultData, outputPath),`${collection_name}.pdf`, outputPath);
|
||||||
|
});
|
||||||
|
};
|
Loading…
Reference in New Issue