krakentyio-exegesis-koa
Version:
Parses OpenAPI documents
115 lines • 5.49 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateStringParser = generateStringParser;
exports.generateBodyParser = generateBodyParser;
const jsonPtr = __importStar(require("json-ptr"));
const querystring_1 = __importDefault(require("querystring"));
const BodyParserWrapper_1 = __importDefault(require("../bodyParsers/BodyParserWrapper"));
const json_schema_resolve_ref_1 = require("../utils/json-schema-resolve-ref");
const jsonSchema_1 = require("../utils/jsonSchema");
const parameterParsers_1 = require("./parameterParsers");
// OAS3 has special handling for 'application/x-www-form-urlencoded'. Parameters
// and bodies of this type are allowed to define an `encoding` section with
// special treatment for specific properties. This handles generating a parser
// for this content-type.
// Find a property in a JSON Schema.
function findProperty(path, schema, propertyName) {
if (schema.properties && schema.properties[propertyName]) {
return path;
}
const allOf = schema.allOf || [];
for (let index = 0; index < allOf.length; index++) {
const childSchema = (0, json_schema_resolve_ref_1.resolveRef)(schema, allOf[index]);
const answer = findProperty(path.concat(['allOf', `${index}`]), childSchema, propertyName);
if (answer) {
return answer;
}
}
return undefined;
}
function generateStringParser(context, mediaType, parameterLocation) {
const parameterParsers = [];
if (mediaType.encoding) {
if (!mediaType.schema) {
throw new Error(`Media Type Object ${context.jsonPointer} with 'content' must have a 'schema'`);
}
// Find the schema object for the mediaType.
const schema = (0, json_schema_resolve_ref_1.resolveRef)(context.openApiDoc, `${context.jsonPointer}/schema`);
// The encoding object describes how parameters should be parsed from the document.
for (const parameterName of Object.keys(mediaType.encoding)) {
const encoding = mediaType.encoding[parameterName];
const parameterSchemaPath = findProperty([], schema, parameterName);
if (!parameterSchemaPath) {
throw new Error(`Cannot find parameter ${parameterName} in schema for ${context.jsonPointer}`);
}
const parameterSchema = (0, jsonSchema_1.extractSchema)(context.openApiDoc, jsonPtr.encodePointer(parameterSchemaPath));
let parameterDescriptor;
if (encoding.contentType) {
const parser = context.options.parameterParsers.get(encoding.contentType);
if (!parser) {
throw new Error(`No string parser found for ${encoding.contentType} in ${context.jsonPointer}`);
}
parameterDescriptor = {
contentType: encoding.contentType,
parser,
uriEncoded: true,
schema: parameterSchema,
};
}
else {
parameterDescriptor = {
style: encoding.style || 'form',
explode: encoding.explode || false,
allowReserved: encoding.allowReserved || false,
schema: parameterSchema,
};
}
parameterParsers.push({
location: {
in: parameterLocation.in,
name: parameterName,
docPath: context.childContext(['encoding', parameterName]).jsonPointer,
},
parser: (0, parameterParsers_1.generateParser)(parameterDescriptor),
});
}
}
return {
parseString(encoded) {
const rawResult = querystring_1.default.parse(encoded);
const parsedResult = (0, parameterParsers_1.parseQueryParameters)(parameterParsers, encoded);
return Object.assign(rawResult, parsedResult);
},
};
}
function generateBodyParser(context, mediaType, parameterLocation) {
const stringParser = generateStringParser(context, mediaType, parameterLocation);
return new BodyParserWrapper_1.default(stringParser, context.options.defaultMaxBodySize);
}
//# sourceMappingURL=urlEncodedBodyParser.js.map