#!/usr/bin/env node
import { RestParser } from "rest-cli";
import flatten from "flat";
const usage = (errorNumber = 0) => {
console.error("Usage: ./bin/generate-example-metadata.mjs <instance> [requestName|requestNumber]");
process.exit(errorNumber);
}
const json2dotNotationLitteral = (j) => JSON.stringify(j)
.replace(/^"|"$/g, "")
.replace(/\\"/g, '"');
const json2dotNotation = (
json,
prefix = "post.responses.default.content.application/json.example."
) => {
const flattened = flatten(json, { safe: false });
const str = Object.keys(flattened)
.map(key => `${prefix + key} = ${json2dotNotationLitteral(flattened[key])}`)
.join("\n");
return str;
};
/** @param {string} s */
const isInteger = (s) => Number.isInteger(Number(s));
const content2json = (o) => {
const body = o.getBody();
const contentType = o.headers.get("content-type");
const json = contentType === "application/json"
? JSON.parse(body)
: body.split("\n").slice(0, -1).map(s => s.replace(/\r/g, ""));
return json;
}
///////////////////////////////////////////////////////////:
const [, , instanceName, requestName] = process.argv;
if (!instanceName) {
console.error("Instance name needed as a first paramater!");
usage(1);
}
// Get Response from examples.http file
const parser = new RestParser();
await parser.readFile(`./${instanceName}/examples.http`);
const requestId = isInteger(requestName) ? Number(requestName) : requestName;
if (requestId === undefined) {
console.error("requestName needed as a second parameter (could be a string or an integer).");
usage(2);
}
const request = await parser.get(requestId);
if (request) {
// request
const requestJSON = content2json(request);
console.log(
json2dotNotation(
requestJSON,
"post.requestBody.content.application/json.example.")
);
// response
const { response } = await request.request();
const responseJSON = content2json(response);
console.log(json2dotNotation(responseJSON));
} else {
console.error(`Request "${requestId}" not found.`);
usage(3);
}