Newer
Older
web-services / bin / generate-example-metadata.mjs
#!/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);
    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 [, , 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 body = request.getBody();
    console.log(
        json2dotNotation(
            JSON.parse(body),
            "post.requestBody.content.application/json.example.")
    );

    // response
    const { response } = await request.request();

    const json = JSON.parse(response.getBody());
    console.log(json2dotNotation(json));
}