auto-request
Version:
通过Yapi JSON Schema生成接口Axios或Taro接口
241 lines (220 loc) • 6.59 kB
text/typescript
/**
* 参数对比功能演示
* 展示新的 Swagger 参数级别对比功能
*/
import { compareSwagger, generateComparisonMarkdown } from '../src/core/swagger-comparator';
// 创建旧版本的 Swagger
const oldSwagger = {
swagger: '2.0',
info: { title: 'User API', version: '1.0.0' },
paths: {
'/users': {
get: {
summary: 'Get users',
description: 'Get all users',
parameters: [
{
name: 'page',
in: 'query',
type: 'integer',
required: false,
description: 'Page number',
},
{
name: 'limit',
in: 'query',
type: 'integer',
required: false,
description: 'Items per page',
},
],
responses: {
'200': { description: 'Success' },
},
},
post: {
summary: 'Create user',
parameters: [
{
name: 'username',
in: 'body',
type: 'string',
required: true,
},
{
name: 'age',
in: 'body',
type: 'string',
required: false,
},
],
responses: {
'201': { description: 'Created' },
},
},
},
'/users/{id}': {
get: {
summary: 'Get user by ID',
responses: {
'200': { description: 'Success' },
},
},
},
},
};
// 创建新版本的 Swagger(包含多种变化)
const newSwagger = {
swagger: '2.0',
info: { title: 'User API', version: '2.0.0' },
paths: {
'/users': {
get: {
summary: 'Get all users', // 修改了摘要
description: 'Get all users with pagination support', // 修改了描述
parameters: [
{
name: 'page',
in: 'query',
type: 'integer',
required: true, // 改为必填
description: 'Page number (starting from 1)',
},
{
name: 'pageSize', // 参数改名(实际是删除 limit,新增 pageSize)
in: 'query',
type: 'integer',
required: true,
description: 'Number of items per page',
},
{
name: 'sort', // 新增参数
in: 'query',
type: 'string',
required: false,
description: 'Sort field',
},
],
responses: {
'200': { description: 'Success' },
},
},
post: {
summary: 'Create user',
parameters: [
{
name: 'username',
in: 'body',
type: 'string',
required: true,
},
{
name: 'age',
in: 'body',
type: 'integer', // 类型从 string 改为 integer
required: true, // 改为必填
},
{
name: 'email', // 新增参数
in: 'body',
type: 'string',
required: true,
description: 'User email address',
},
],
responses: {
'201': { description: 'Created' },
},
},
},
'/users/{id}': {
put: {
summary: 'Update user',
parameters: [
{
name: 'id',
in: 'path',
type: 'integer',
required: true,
},
],
responses: {
'200': { description: 'Success' },
},
},
},
'/products': {
get: {
summary: 'Get products',
responses: {
'200': { description: 'Success' },
},
},
},
},
};
console.log('🚀 参数对比功能演示\n');
console.log('=' .repeat(80));
// 执行对比
const result = compareSwagger(JSON.stringify(oldSwagger), JSON.stringify(newSwagger));
// 输出统计信息
console.log('\n📊 对比统计:');
console.log(` 新增接口: ${result.added.length} 个`);
console.log(` 删除接口: ${result.removed.length} 个`);
console.log(` 修改接口: ${result.modified.length} 个`);
// 统计参数变化
const paramChanges = result.modified.reduce(
(acc, item) => {
if (item.parameterChanges) {
acc.added += item.parameterChanges.filter(p => p.changeType === 'added').length;
acc.removed += item.parameterChanges.filter(p => p.changeType === 'removed').length;
acc.modified += item.parameterChanges.filter(p => p.changeType === 'modified').length;
}
return acc;
},
{ added: 0, removed: 0, modified: 0 }
);
const totalParamChanges = paramChanges.added + paramChanges.removed + paramChanges.modified;
if (totalParamChanges > 0) {
console.log('\n📝 参数变化详情:');
console.log(` 新增参数: ${paramChanges.added} 个`);
console.log(` 删除参数: ${paramChanges.removed} 个`);
console.log(` 修改参数: ${paramChanges.modified} 个`);
}
console.log('\n' + '=' .repeat(80));
// 详细输出修改的接口和参数变化
if (result.modified.length > 0) {
console.log('\n🔍 详细变化:\n');
result.modified.forEach(({ endpoint, changes, parameterChanges }) => {
console.log(`📍 ${endpoint.method} ${endpoint.path}`);
console.log(` 变化: ${changes.join(', ')}`);
if (parameterChanges && parameterChanges.length > 0) {
console.log('\n 参数详细变化:');
const added = parameterChanges.filter(p => p.changeType === 'added');
const removed = parameterChanges.filter(p => p.changeType === 'removed');
const modified = parameterChanges.filter(p => p.changeType === 'modified');
if (added.length > 0) {
console.log(' ✨ 新增:');
added.forEach(p => console.log(` • ${p.details}`));
}
if (removed.length > 0) {
console.log(' ❌ 删除:');
removed.forEach(p => console.log(` • ${p.details}`));
}
if (modified.length > 0) {
console.log(' 🔄 修改:');
modified.forEach(p => console.log(` • ${p.details}`));
}
}
console.log('');
});
}
// 生成 Markdown 报告
console.log('=' .repeat(80));
console.log('\n📄 Markdown 格式报告:\n');
console.log('=' .repeat(80));
const markdown = generateComparisonMarkdown(result);
console.log(markdown);
console.log('=' .repeat(80));
console.log('\n✅ 演示完成!');
console.log('\n💡 提示: 这个对比结果会自动保存到快照文件中(如果配置了 snapshotsPath)');