@apidevtools/swagger-parser
Version:
Swagger 2.0 and OpenAPI 3.0 parser and validator for Node and browsers
72 lines (65 loc) • 2.27 kB
JavaScript
const { getJsonSchemaRefParserDefaultOptions } = require("@apidevtools/json-schema-ref-parser");
const schemaValidator = require("./validators/schema");
const specValidator = require("./validators/spec");
module.exports = ParserOptions;
/**
* Merges the properties of the source object into the target object.
*
* @param target - The object that we're populating
* @param source - The options that are being merged
* @returns
*/
function merge(target, source) {
if (isMergeable(source)) {
// prevent prototype pollution
const keys = Object.keys(source).filter((key) => !["__proto__", "constructor", "prototype"].includes(key));
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const sourceSetting = source[key];
const targetSetting = target[key];
if (isMergeable(sourceSetting)) {
// It's a nested object, so merge it recursively
target[key] = merge(targetSetting || {}, sourceSetting);
} else if (sourceSetting !== undefined) {
// It's a scalar value, function, or array. No merging necessary. Just overwrite the target value.
target[key] = sourceSetting;
}
}
}
return target;
}
/**
* Determines whether the given value can be merged,
* or if it is a scalar value that should just override the target value.
*
* @param val
* @returns
*/
function isMergeable(val) {
return val && typeof val === "object" && !Array.isArray(val) && !(val instanceof RegExp) && !(val instanceof Date);
}
/**
* Options that determine how Swagger APIs are parsed, resolved, dereferenced, and validated.
*
* @param {object|ParserOptions} [_options] - Overridden options
* @class
* @augments $RefParserOptions
*/
function ParserOptions(_options) {
const defaultOptions = getJsonSchemaRefParserDefaultOptions();
const options = merge(defaultOptions, ParserOptions.defaults);
return merge(options, _options);
}
ParserOptions.defaults = {
/**
* Determines how the API definition will be validated.
*
* You can add additional validators of your own, replace an existing one with
* your own implemenation, or disable any validator by setting it to false.
*/
validate: {
schema: schemaValidator,
spec: specValidator,
},
};
;