84 lines
3.3 KiB
JavaScript
84 lines
3.3 KiB
JavaScript
// import libraries
|
|
const protobuf = require("protobufjs");
|
|
const getStdin = require("get-stdin");
|
|
const find = require("lodash/find");
|
|
const forEach = require("lodash/forEach");
|
|
const pick = require("lodash/pick");
|
|
|
|
// import messages
|
|
const root = protobuf.Root.fromJSON(require("./bundle.json"));
|
|
const Request = root.lookupType("gnostic.plugin.v1.Request");
|
|
const Response = root.lookupType("gnostic.plugin.v1.Response");
|
|
const Document = root.lookupType("openapi.v2.Document");
|
|
|
|
getStdin.buffer().then(buffer => {
|
|
const request = Request.decode(buffer);
|
|
var messages = [];
|
|
for (var j in request.models) {
|
|
const m = request.models[j];
|
|
if (m.type_url == "openapi.v2.Document") {
|
|
const openapi2 = Document.decode(m.value);
|
|
const paths = openapi2.paths.path;
|
|
for (var i in paths) {
|
|
const path = paths[i];
|
|
// console.error('path %s\n\n', path.name)
|
|
|
|
// Arrays MUST NOT be returned as the top-level structure in a response body.
|
|
let pathOps = pick(path.value, ["get","head","post", "put", "patch", "delete", "options"]);
|
|
forEach(pathOps, (op, opKey) => {
|
|
if (op != null) {
|
|
forEach(op.responses.responseCode, responseObj => {
|
|
// console.error('responseObj is %j', responseObj)
|
|
name = responseObj.name;
|
|
response = responseObj.value.response;
|
|
if (response.schema && response.schema.schema) {
|
|
if (!response.schema.schema._ref) {
|
|
if (
|
|
response.schema.schema.type != null &&
|
|
response.schema.schema.type.value == "array"
|
|
) {
|
|
messages.push({
|
|
level: 3,
|
|
code: "NO_ARRAY_RESPONSES",
|
|
text: "Arrays MUST NOT be returned as the top-level structure in a response body.",
|
|
keys: ["paths", path.name, opKey, "responses", name, "schema"]
|
|
});
|
|
}
|
|
} else {
|
|
let schemaName = response.schema.schema._ref.match(/#\/definitions\/(\w+)/);
|
|
if (schemaName) {
|
|
const definitions = openapi2.definitions.additionalProperties;
|
|
const schemaKvp = find(definitions, {name: schemaName[1]
|
|
});
|
|
//console.error('schemaKvp.value.type = %s', schemaKvp.value.type.value)
|
|
if (schemaKvp && schemaKvp.value.type && schemaKvp.value.type.value.indexOf("array") >= 0) {
|
|
messages.push({
|
|
level: 3,
|
|
code: "NO_ARRAY_RESPONSES",
|
|
text: "Arrays MUST NOT be returned as the top-level structure in a response body.",
|
|
keys: ["paths", path.name, opKey, "responses", name, "schema" ]
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
const payload = {
|
|
messages: messages
|
|
};
|
|
|
|
// Verify the payload if necessary (i.e. when possibly incomplete or invalid)
|
|
const errMsg = Response.verify(payload);
|
|
if (errMsg) throw Error(errMsg);
|
|
|
|
const message = Response.create(payload);
|
|
process.stdout.write(Response.encode(message).finish());
|
|
})
|
|
.catch(err => console.error(err));
|