mcp-swagger-parser
Version:
Enterprise-grade OpenAPI/Swagger specification parser for Model Context Protocol (MCP) projects
143 lines • 5.46 kB
JavaScript
;
/**
* 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