.pipe(insert.transform((contents) => { drafter.validate(contents, validationOptions, (err, res) => { if (err) { console.error(err); } if (res) { console.log(colors.yellow(`API Blueprint contains ${ res.content.length } semantic issues:`)); res.content.forEach((iss) => { // List each sematic issue console.log(colors.bgYellow(colors.black(`[APIB${ iss.attributes.code }]: ${ iss.content }`))); // Provide the offending line from source let map = ''; iss.attributes.sourceMap[0].content.forEach((pos) => { // The output only provides the start and end position in the input APIB // We'll add it to the map output with a simple substring. map += contents.substr(pos[0], pos[1]); }); console.log(colors.white(map)); }); } }); return contents; }));
exports.noconvert = function (data, callback) { try { var result = drafter.parse(data, {type: 'ast'}); return callback(null, result); } catch (error) { return callback(error, {}); } };
APIBlueprint.prototype.parsers = [ function (data, callback) { var result; try { result = Drafter.parse(data, {type: 'ast'}).ast; } catch (e) { return callback(e); } callback(null, result); }];
function parseBlueprint(file, cb) { var data = fs.readFileSync(file, {encoding: 'utf8'}); var options = {type: 'ast'}; drafter.parse(data, options, function (error, result) { if (error) { return cb(error, null, data); } cb(false, result, data); }); }
exports.convert = function (data, callback) { try { var result = drafter.parse(data, {type: 'ast'}); //for (var i = 0; i < result.warnings.length; i++) { // var warn = result.warnings[i]; // console.log(warn); //} var swagger = apib2swagger(result.ast); return callback(null, {swagger: swagger}); } catch (error) { return callback(error, {}); } };
return function(cb) { var data = fs.readFileSync(filePath, {encoding: 'utf8'}); var options = { type: 'ast' }; drafter.parse(data, options, function(err, result) { if (err) { console.log(err); return cb(err); } var allRoutesList = []; result.ast.resourceGroups.forEach(function(resourceGroup){ resourceGroup.resources.forEach(setupResourceAndUrl); }); // add OPTIONS route where its missing - this must be done after all routes are parsed if (autoOptions) { addOptionsRoutesWhereMissing(allRoutesList); } cb(); function setupResourceAndUrl(resource) { var parsedUrl = urlParser.parse(resource.uriTemplate); var key = parsedUrl.url; routeMap[key] = routeMap[key] || { urlExpression: key, methods: {} }; parseParameters(parsedUrl, resource.parameters, routeMap); resource.actions.forEach(function(action){ parseAction(parsedUrl, action, routeMap); saveRouteToTheList(parsedUrl, action); }); } /** * Adds route and its action to the allRoutesList. It appends the action when route already exists in the list. * @param resource Route URI * @param action HTTP action */ function saveRouteToTheList(parsedUrl, action) { // used to add options routes later if (typeof allRoutesList[parsedUrl.url] === 'undefined') { allRoutesList[parsedUrl.url] = []; } allRoutesList[parsedUrl.url].push(action); } function addOptionsRoutesWhereMissing(allRoutes) { var routesWithoutOptions = []; // extracts only routes without OPTIONS _.forIn(allRoutes, function (actions, route) { var containsOptions = _.reduce(actions, function (previousResult, iteratedAction) { return previousResult || (iteratedAction.method === 'OPTIONS'); }, false); if (!containsOptions) { routesWithoutOptions.push(route); } }); _.forEach(routesWithoutOptions, function (uriTemplate) { // adds prepared OPTIONS action for route var parsedUrl = urlParser.parse(uriTemplate); parseAction(parsedUrl, autoOptionsAction, routeMap); }); } }); };
'APIB': Promise.method(data => Drafter.parse(data, {type: 'ast'}).ast)