openapi-diff
Version:
A CLI tool to identify differences between Swagger/OpenAPI specs.
38 lines (37 loc) • 1.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.dereferenceObject = void 0;
const jsonPointer = require("jsonpointer");
const open_api_diff_error_impl_1 = require("../../../common/open-api-diff-error-impl");
const toJsonPointer = ($ref) => $ref.substr(1);
const followReference = (reference, spec) => {
const pointer = toJsonPointer(reference.$ref);
return jsonPointer.get(spec, pointer);
};
const throwCircularException = () => {
throw new open_api_diff_error_impl_1.OpenApiDiffErrorImpl('OPENAPI_DIFF_PARSE_ERROR', 'the spec can not be parsed due to invalid circular references');
};
const hasBeenVisited = (reference, visitedReferences) => {
return visitedReferences.indexOf(reference.$ref) !== -1;
};
const getContentFromReference = (reference, spec, visitedReferences) => {
const updatedVisitedReferences = [...visitedReferences, reference.$ref];
const referenceContent = followReference(reference, spec);
return dereference(referenceContent, spec, updatedVisitedReferences);
};
const attemptDereference = (reference, spec, visitedReferences) => {
return hasBeenVisited(reference, visitedReferences)
? throwCircularException()
: getContentFromReference(reference, spec, visitedReferences);
};
const isReference = (object) => typeof object.$ref === 'string';
const dereference = (objectOrReference, spec, visitedReferences) => {
return isReference(objectOrReference)
? attemptDereference(objectOrReference, spec, visitedReferences)
: objectOrReference;
};
const dereferenceObject = (objectOrReference, spec) => {
const initialVisitedReferencesArray = [];
return dereference(objectOrReference, spec, initialVisitedReferencesArray);
};
exports.dereferenceObject = dereferenceObject;