Simon Priet e69a613a37 feat: Created a mini nodeJS server with NewMan for testing without PostMan GUI.
This will mimic a run in a CD/CI environment or docker container.
2021-09-08 14:01:19 +02:00

149 lines
5.8 KiB
JavaScript

#!/usr/bin/env node
const fs = require('fs'),
log = require('intel'),
{ Command } = require('commander'),
stripJSONComments = require('strip-json-comments'),
transformer = require('..'),
program = new Command(),
FSWF_FLAG_W = { flag: 'w' },
FSWF_FLAG_WX = { flag: 'wx' },
/**
* Loads a JSON in a safe and compatible way from a file
*
* @param {String} path - The file path to read JSON content from.
*/
loadJSON = function (path) {
const data = fs.readFileSync(path); // eslint-disable-line security/detect-non-literal-fs-filename
return JSON.parse(stripJSONComments(data.toString()));
},
/**
* Writes a JSON blob to the given path.
* ``options.path`` must contain the path to the output file.
* If ``options.pretty`` is true, output will be pretty printed. (Default false)
* If ``options.overwrite`` is false, output file will be overwritten (Default true)
*
* @param {Object} data - The JSON data to be written.
* @param {Object} options - The options for JSON data writing.
* @param {Boolean} [options.pretty=false] - When set to true, indents JSON data by 4 spaces.
* @param {String} options.output - The file to write data to.
* @param {Boolean} [options.overwrite=false] - When set to true, allows overwriting files that exist.
* @param {Function} callback - A function to be invoked after writing is complete ,
*/
writeJSON = function (data, options, callback) {
let json;
try {
json = JSON.stringify(data, null, options.pretty ? 4 : 0);
}
catch (e) {
return callback(e);
}
// eslint-disable-next-line security/detect-non-literal-fs-filename
return fs.writeFile(options.output, json, options.overwrite ? FSWF_FLAG_W : FSWF_FLAG_WX, callback);
};
// Setup logging
log.basicConfig({
format: '%(date)s [%(levelname)s] %(message)s',
level: log.DEBUG
});
program
.usage('[command] [options]')
.version(require('../package.json').version);
// Describe the options and usage instruction for the `convert` command
program
.command('convert')
.description('Convert Postman Collection from one format to another')
.option('-e, --env <path>', 'optional path to the associated postman environment file to be used')
.option('-i, --input <path>', 'path to the input postman collection file')
.option('-j, --input-version [version]', 'the version of the input collection format standard (v1 or v2)')
.option('-o, --output <path>', 'target file path where the converted collection will be written')
.option('-p, --output-version [version]', 'required version to which the collection is needed to be converted to')
.option('-P, --pretty', 'Pretty print the output')
.option('--retain-ids', 'Retain the request and folder IDs during conversion (collection ID is always retained)')
.option('-w, --overwrite', 'Overwrite the output file if it exists')
.action((options) => {
let input;
if (!options.output) {
return log.error('Output file must be specified!');
}
if (!options.input) {
return log.error('Input file must be specified!');
}
try {
input = loadJSON(options.input);
}
catch (e) {
return log.error('Unable to load the input file!', e);
}
return transformer.convert(input, options, (err, result) => {
if (err) {
return log.error('Unable to convert the input:', err);
}
return writeJSON(result, options, (error) => {
if (error) {
log.error('Could not create output file %s', options.output, error);
}
});
});
});
program
.command('normalize')
.description('Normalizes a postman collection according to the provided version')
.option('-i, --input <path>', 'Path to the collection JSON file to be normalized')
.option('-n, --normalize-version <version>', 'The version to normalize the provided collection on')
.option('-o, --output <path>', 'Path to the target file, where the normalized collection will be written')
.option('-P, --pretty', 'Pretty print the output')
.option('--retain-ids', 'Retain the request and folder IDs during conversion (collection ID is always retained)')
.option('-w, --overwrite', 'Overwrite the output file if it exists')
.action((options) => {
if (!options.input) { return log.error('Input file must be specified!'); }
if (!options.output) { return log.error('Output file must be specified!'); }
let input;
try { input = loadJSON(options.input); }
catch (e) { return log.error('Unable to load the input file!', e); }
return transformer.normalize(input, options, (err, result) => {
if (err) { return log.error('Unable to convert the input: ', err); }
return writeJSON(result, options, (error) => {
error && log.error('Could not create output file %s', options.output, error);
});
});
});
// Describe the options and usage instructions for the `validate` command
program
.command('validate')
.description('Verify whether a postman collection adheres to version specifications')
.option('-i, --input <path>', 'path to the input postman collection file')
.option('-s, --schema [version]', 'the version of the input collection format standard')
.action((options) => {
console.warn('yet to be implemented', options);
// @todo implement with as little and concise code as possible with least external dependencies
});
// Warn on invalid command and then exits.
program.on('command:*', (command) => {
console.error(`error: invalid command \`${command}\`\n`);
program.help();
});
program.parse(process.argv);