UNPKG

mcp-swagger-parser

Version:

Enterprise-grade OpenAPI/Swagger specification parser for Model Context Protocol (MCP) projects

143 lines 5.46 kB
"use strict"; /** * Swagger 2.0 to OpenAPI 3.0 converter */ 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.Swagger2OpenAPIConverter = void 0; const index_1 = require("../errors/index"); const swagger2openapi = __importStar(require("swagger2openapi")); /** * Swagger 2.0 to OpenAPI 3.0 converter */ class Swagger2OpenAPIConverter { constructor(options = {}) { this.options = { patch: options.patch ?? true, warnOnly: options.warnOnly ?? false, resolveInternal: options.resolveInternal ?? false, targetVersion: options.targetVersion ?? '3.0.0', warnProperty: options.warnProperty ?? 'x-s2o-warning', url: options.url, debug: options.debug ?? false, // Additional swagger2openapi options refSiblings: options.preserveRefs ? 'preserve' : 'remove', direct: false, // We want the full options object back }; } /** * Convert a Swagger 2.0 specification to OpenAPI 3.0 */ async convert(swagger2Spec) { const startTime = Date.now(); try { // Validate input if (!swagger2Spec || typeof swagger2Spec !== 'object') { throw new Error('Invalid specification: must be a valid object'); } // Check if it's actually a Swagger 2.0 spec if (!swagger2Spec.swagger || !swagger2Spec.swagger.startsWith('2.')) { throw new index_1.UnsupportedVersionError(swagger2Spec.swagger || swagger2Spec.openapi || 'unknown'); } // Create a copy of the spec to avoid modifying the original const specCopy = JSON.parse(JSON.stringify(swagger2Spec)); // Perform conversion const result = await swagger2openapi.convertObj(specCopy, this.options); const duration = Date.now() - startTime; return { openapi: result.openapi, warnings: result.warnings || [], patches: result.patches || 0, duration, originalVersion: swagger2Spec.swagger, targetVersion: this.options.targetVersion }; } catch (error) { const duration = Date.now() - startTime; if (error instanceof index_1.UnsupportedVersionError) { throw error; } throw new index_1.Swagger2OpenAPIConversionError(`Failed to convert Swagger 2.0 to OpenAPI 3.0: ${error.message}`, error, { ...this.options, duration, originalVersion: swagger2Spec?.swagger }); } } /** * Convert from object with additional validation */ async convertWithValidation(swagger2Spec) { // Pre-conversion validation if (!swagger2Spec) { throw new Error('Specification is required'); } if (typeof swagger2Spec !== 'object') { throw new Error('Specification must be an object'); } if (!swagger2Spec.swagger) { throw new Error('Missing required "swagger" property'); } if (!swagger2Spec.swagger.startsWith('2.')) { throw new index_1.UnsupportedVersionError(swagger2Spec.swagger); } if (!swagger2Spec.info) { throw new Error('Missing required "info" property'); } if (!swagger2Spec.paths) { throw new Error('Missing required "paths" property'); } return this.convert(swagger2Spec); } /** * Update conversion options */ updateOptions(options) { this.options = { ...this.options, ...options, refSiblings: options.preserveRefs ? 'preserve' : this.options.refSiblings }; } /** * Get current conversion options */ getOptions() { return { ...this.options }; } } exports.Swagger2OpenAPIConverter = Swagger2OpenAPIConverter; //# sourceMappingURL=swagger2openapi-converter.js.map