import stampit from 'stampit'; import { defaultTo, propEq } from 'ramda'; import { createNamespace, visit } from '@swagger-api/apidom-core'; import openApi2Namespace, { getNodeType, isSwaggerElement, keyMap, mediaTypes } from '@swagger-api/apidom-ns-openapi-2'; import DereferenceStrategy from "../DereferenceStrategy.mjs"; import Reference from "../../../Reference.mjs"; import ReferenceSet from "../../../ReferenceSet.mjs"; import OpenApi2DereferenceVisitor from "./visitor.mjs"; // @ts-ignore const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')]; const OpenApi2DereferenceStrategy = stampit(DereferenceStrategy, { init() { this.name = 'openapi-2'; }, methods: { canDereference(file) { var _file$parseResult; // assert by media type if (file.mediaType !== 'text/plain') { return mediaTypes.includes(file.mediaType); } // assert by inspecting ApiDOM return isSwaggerElement((_file$parseResult = file.parseResult) === null || _file$parseResult === void 0 ? void 0 : _file$parseResult.api); }, async dereference(file, options) { const namespace = createNamespace(openApi2Namespace); const refSet = defaultTo(ReferenceSet(), options.dereference.refSet); let reference; if (!refSet.has(file.uri)) { reference = Reference({ uri: file.uri, value: file.parseResult }); refSet.add(reference); } else { // pre-computed refSet was provided as configuration option reference = refSet.find(propEq(file.uri, 'uri')); } const visitor = OpenApi2DereferenceVisitor({ reference, namespace, options }); const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor, { keyMap, nodeTypeGetter: getNodeType }); /** * Release all memory if this refSet was not provided as an configuration option. * If provided as configuration option, then provider is responsible for cleanup. */ if (options.dereference.refSet === null) { refSet.clean(); } return dereferencedElement; } } }); export default OpenApi2DereferenceStrategy;