@ianwalter/blueline
Version:
Toolkit for converting API Blueprint files to JSON and consuming that JSON
124 lines (102 loc) • 3.46 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var findNested = require('@ianwalter/find-nested');
var drafter = _interopDefault(require('drafter.js'));
class Blueprint {
constructor (json) {
this.json = json;
}
find (filter = 0, prop) {
let json = this.json;
// Filter the JSON schema using the filter parameter.
if (Number.isInteger(filter)) {
const found = findNested.findNested(json, prop) || json;
json = prop !== undefined ? found[filter] : found;
} else if (typeof filter === 'string') {
const val = i => {
if (Array.isArray(i)) {
return i.find(val)
} else if (i && typeof i === 'object') {
return obj(i)
} else {
return i === filter
}
};
const obj = i => Object.values(i).find(val);
const descriminator = i => i && Array.isArray(i) && i.find(obj);
json = (findNested.findNested(json, prop, descriminator) || json).find(obj);
}
// Return this instance so user can chain calls.
return new Blueprint(json)
}
group (filter) {
return this.find(filter)
}
resource (filter) {
return this.find(filter, 'resources')
}
action (filter) {
return this.find(filter, 'actions')
}
example (filter) {
return this.find(filter, 'examples')
}
request (filter) {
return this.find(filter, 'requests')
}
response (filter) {
return this.find(filter, 'responses')
}
body () {
return this.json.body
}
}
function parse (input) {
return new Promise((resolve, reject) => {
drafter.parse(input, { type: 'ast' }, (err, { ast }) => {
if (err) {
reject(err);
}
// If request/response headers contain 'json', parse the body strings.
const hasJsonBody = obj => obj.headers.some(h => h.value.includes('json'));
let results = findNested.findAllNested(ast.resourceGroups, undefined, hasJsonBody);
results.map(result => {
try {
result.body = JSON.parse(result.body);
} catch (err) {
// If there is a JSON.parse error, don't mutate the result.
return result
}
});
// Find all JSON schemas.
results = findNested.findAllNested(ast.resourceGroups, undefined, obj => obj.schema);
results.map(result => {
try {
const schema = JSON.parse(result.schema);
const requiredIsArray = schema && Array.isArray(schema.required);
if (requiredIsArray && schema.required.length === 0) {
// Delete the JSON Schema because it was not generated properly and
// is invalid.
delete result.schema;
} else if (schema) {
// De-duplicate required values since there is a bug in drafter.
if (requiredIsArray) {
schema.required = Array.from(new Set(schema.required));
}
// Save the parse schema back to the containing object so it's
// easier to read.
result.schema = schema;
}
return result
} catch (err) {
// If there is a JSON.parse error, don't mutate the result.
return result
}
});
resolve(ast.resourceGroups);
});
})
}
exports.Blueprint = Blueprint;
exports.parse = parse;