mson2json
Version:
Convert API Blueprints in MSON format to JSON!
71 lines (55 loc) • 2.15 kB
JavaScript
(function (protagonist, bpCompiler, Transaction) {
'use strict';
function parseBluprint(data, cb) {
protagonist.parse(data, { type: 'ast' }, function (err, result) {
if (err) throw err;
// get all url template params in an object for easy key-based retrieval
var params = result.ast.resourceGroups.reduce(function (params, rg) {
rg.resources.forEach(function (t) {
params[rg.name + t.name + t.uriTemplate] = t.parameters;
});
return params;
}, {});
var transactions =
bpCompiler.compile(result.ast).transactions.map(function (t) {
var key = t.origin.resourceGroupName +
t.origin.resourceName +
t.origin.uriTemplate;
t.origin.parameters = params[key];
return t;
});
return cb(transactions);
});
}
function convertToJson(transactions, cb) {
var resourceHead, resourceGroup;
if (transactions.length === 0) return;
var output = "# " + transactions[0].origin.apiName + "\n\n";
transactions.forEach(function (t) {
t = new Transaction(t);
// only append resource declartion and params when we've switched to
// a new one.
output += resourceGroup === t.groupName
? ''
: '# Group ' + (resourceGroup = t.groupName) + "\n\n";
output += resourceHead === t.resourceHead()
? ''
: (resourceHead = t.resourceHead()) + "\n\n";
output += t.body() + "\n\n";
});
return cb(output);
}
/**
* msonData - mson data from anywhere
* cb - function (JSON data)
*/
module.exports = function main(msonData, cb) {
return parseBluprint(msonData, function (parsedData) {
convertToJson(parsedData, cb);
});
};
})(
require('protagonist'),
require('blueprint-transactions'),
require('./transaction')
);