chore: swagger support

This commit is contained in:
xiaojunnuo
2026-03-15 14:01:34 +08:00
parent 8a3841f638
commit 684964da4f
40 changed files with 110 additions and 22 deletions

View File

@@ -116,7 +116,7 @@ export abstract class BaseController {
await authService.checkProjectId(service, id, projectId);
}else{
if(userId === 0){
if(userId === Constants.systemUserId){
//系统级别,不检查权限
}else{
if(allowAdmin){

View File

@@ -4,6 +4,7 @@ import { Inject } from '@midwayjs/core';
import { TypeORMDataSourceManager } from '@midwayjs/typeorm';
import { EntityManager } from 'typeorm/entity-manager/EntityManager.js';
import { FindManyOptions } from 'typeorm';
import { Constants } from './constants.js';
export type PageReq<T = any> = {
page?: { offset: number; limit: number };
@@ -258,7 +259,7 @@ export abstract class BaseService<T> {
export function checkUserProjectParam(userId: number, projectId: number) {
if (projectId != null ){
if( userId !==-1) {
if( userId !== Constants.enterpriseUserId) {
throw new ValidateException('userId projectId 错误');
}
return true

View File

@@ -120,4 +120,6 @@ export const Constants = {
message: '用户邮箱还未配置',
},
},
systemUserId: 0, // 系统级别userid固定为0
enterpriseUserId: -1 // 企业模式用户id固定为-1
};

View File

@@ -78,6 +78,7 @@
"@midwayjs/koa": "3.20.13",
"@midwayjs/logger": "3.4.2",
"@midwayjs/static-file": "3.20.13",
"@midwayjs/swagger": "3.20.11",
"@midwayjs/typeorm": "3.20.11",
"@midwayjs/upload": "3.20.13",
"@midwayjs/validate": "3.20.13",

View File

@@ -131,6 +131,12 @@ const development = {
contactText: '',
contactLink: '',
},
swagger: {
isGenerateTagForController: false,
routerFilter: (url: string) => {
return url.startsWith('/api/sys');
}
}
} as MidwayConfig;
loadDotEnv();

View File

@@ -20,7 +20,7 @@ import * as commercial from '@certd/commercial-core';
import * as upload from '@midwayjs/upload';
import { setLogger } from '@certd/acme-client';
import {HiddenMiddleware} from "./middleware/hidden.js";
import * as swagger from '@midwayjs/swagger';
//@ts-ignore
// process.env.UV_THREADPOOL_SIZE = 2
process.on('uncaughtException', error => {
@@ -62,6 +62,7 @@ process.on('uncaughtException', error => {
upload,
libServer,
commercial,
swagger,
{
component: info,
enabledEnvironment: ['local'],

View File

@@ -5,6 +5,7 @@ import { OpenKey } from "../../../modules/open/service/open-key-service.js";
import { BaseOpenController } from "../base-open-controller.js";
import { CertInfoFacade } from "../../../modules/monitor/facade/cert-info-facade.js";
import { merge } from "lodash-es";
import { ApiTags } from "@midwayjs/swagger";
export type CertGetReq = {
domains?: string;
@@ -17,6 +18,7 @@ export type CertGetReq = {
*/
@Provide()
@Controller('/api/v1/cert')
@ApiTags(['openapi'])
export class OpenCertController extends BaseOpenController {
@Inject()
certInfoFacade: CertInfoFacade;

View File

@@ -12,12 +12,14 @@ import { AuthService } from "../../../modules/sys/authority/service/auth-service
import { checkPlus } from "@certd/plus-core";
import { http, logger, utils } from "@certd/basic";
import { TaskServiceBuilder } from "../../../modules/pipeline/service/getter/task-service-getter.js";
import { ApiTags } from "@midwayjs/swagger";
/**
* Addon
*/
@Provide()
@Controller("/api/addon")
@ApiTags(['addon'])
export class AddonController extends CrudController<AddonService> {
@Inject()
service: AddonService;

View File

@@ -2,12 +2,14 @@ import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/c
import { Constants, CrudController } from '@certd/lib-server';
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { GroupService } from '../../../modules/basic/service/group-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 通知
*/
@Provide()
@Controller('/api/basic/group')
@ApiTags(['basic-group'])
export class GroupController extends CrudController<GroupService> {
@Inject()
service: GroupService;

View File

@@ -5,12 +5,14 @@ import { AuthService } from '../../../modules/sys/authority/service/auth-service
import { UserService } from '../../../modules/sys/authority/service/user-service.js';
import { BasicController } from '../../basic/code-controller.js';
import { RoleService } from '../../../modules/sys/authority/service/role-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 通知
*/
@Provide()
@Controller('/api/basic/user')
@ApiTags(['basic-user'])
export class BasicUserController extends BasicController {
@Inject()
service: UserService;

View File

@@ -2,12 +2,14 @@ import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/c
import { Constants, CrudController } from '@certd/lib-server';
import { DomainService } from "../../../modules/cert/service/domain-service.js";
import { checkPlus } from '@certd/plus-core';
import { ApiTags } from '@midwayjs/swagger';
/**
* 授权
*/
@Provide()
@Controller('/api/cert/domain')
@ApiTags(['cert'])
export class DomainController extends CrudController<DomainService> {
@Inject()
service: DomainService;

View File

@@ -2,12 +2,14 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
import { BaseController, Constants } from '@certd/lib-server';
import { CnameRecordService } from '../../../modules/cname/service/cname-record-service.js';
import { CnameProviderService } from '../../../modules/cname/service/cname-provider-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 授权
*/
@Provide()
@Controller('/api/cname/provider')
@ApiTags(['pipeline-cname'])
export class CnameProviderController extends BaseController {
@Inject()
service: CnameRecordService;

View File

@@ -1,12 +1,14 @@
import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
import { Constants, CrudController } from '@certd/lib-server';
import { CnameRecordService } from '../../../modules/cname/service/cname-record-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 授权
*/
@Provide()
@Controller('/api/cname/record')
@ApiTags(['pipeline-cname'])
export class CnameRecordController extends CrudController<CnameRecordService> {
@Inject()
service: CnameRecordService;

View File

@@ -5,6 +5,7 @@ import { RoleService } from '../../../modules/sys/authority/service/role-service
import { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';
import { HistoryService } from '../../../modules/pipeline/service/history-service.js';
import { CertInfoService } from '../../../modules/monitor/index.js';
import { ApiTags } from '@midwayjs/swagger';
export type ChartItem = {
name: string;
@@ -30,6 +31,7 @@ export type UserStatisticCount = {
*/
@Provide()
@Controller('/api/statistic/')
@ApiTags(['dashboard'])
export class StatisticController extends BaseController {
@Inject()
userService: UserService;

View File

@@ -3,11 +3,13 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { ProjectService } from '../../../modules/sys/enterprise/service/project-service.js';
import { ProjectMemberService } from '../../../modules/sys/enterprise/service/project-member-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
*/
@Provide()
@Controller('/api/enterprise/project')
@ApiTags(['enterprise-project'])
export class UserProjectController extends BaseController {
@Inject()
service: ProjectService;

View File

@@ -4,10 +4,12 @@ import { ProjectMemberEntity } from "../../../modules/sys/enterprise/entity/proj
import { ProjectMemberService } from "../../../modules/sys/enterprise/service/project-member-service.js";
import { merge } from "lodash-es";
import { ProjectService } from "../../../modules/sys/enterprise/service/project-service.js";
import { ApiTags } from "@midwayjs/swagger";
/**
*/
@Provide()
@Controller("/api/enterprise/projectMember")
@ApiTags(['enterprise-project-member'])
export class ProjectMemberController extends CrudController<ProjectMemberEntity> {
@Inject()
service: ProjectMemberService;

View File

@@ -1,11 +1,13 @@
import { BaseController, Constants } from '@certd/lib-server';
import { Controller, Inject, Post, Provide } from '@midwayjs/core';
import { TransferService } from '../../../modules/sys/enterprise/service/transfer-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
*/
@Provide()
@Controller('/api/enterprise/transfer')
@ApiTags(['enterprise-project'])
export class TransferController extends BaseController {
@Inject()
service: TransferService;

View File

@@ -2,11 +2,13 @@ import { Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
import { BaseController } from '@certd/lib-server';
import { Constants } from '@certd/lib-server';
import { EmailService } from '../../../modules/basic/service/email-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
*/
@Provide()
@Controller('/api/mine/email')
@ApiTags(['mine'])
export class EmailController extends BaseController {
@Inject()
emailService: EmailService;

View File

@@ -3,11 +3,13 @@ import { ALL, Body, Controller, Inject, Post, Provide } from '@midwayjs/core';
import { PasskeyService } from '../../../modules/login/service/passkey-service.js';
import { RoleService } from '../../../modules/sys/authority/service/role-service.js';
import { UserService } from '../../../modules/sys/authority/service/user-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
*/
@Provide()
@Controller('/api/mine')
@ApiTags(['mine'])
export class MineController extends BaseController {
@Inject()
userService: UserService;

View File

@@ -2,9 +2,11 @@ import { ALL, Body, Controller, Inject, Post, Provide, RequestIP } from "@midway
import { PasskeyService } from "../../../modules/login/service/passkey-service.js";
import { BaseController, Constants } from "@certd/lib-server";
import { UserService } from "../../../modules/sys/authority/service/user-service.js";
import { ApiTags } from "@midwayjs/swagger";
@Provide()
@Controller('/api/mine/passkey')
@ApiTags(['mine'])
export class MinePasskeyController extends BaseController {
@Inject()
passkeyService: PasskeyService;

View File

@@ -5,11 +5,13 @@ import { UserTwoFactorSetting } from "../../../modules/mine/service/models.js";
import { merge } from "lodash-es";
import { TwoFactorService } from "../../../modules/mine/service/two-factor-service.js";
import {isPlus} from "@certd/plus-core";
import { ApiTags } from "@midwayjs/swagger";
/**
*/
@Provide()
@Controller("/api/user/settings/twoFactor")
@ApiTags(['mine'])
export class UserTwoFactorSettingController extends BaseController {
@Inject()
service: UserSettingsService;

View File

@@ -5,11 +5,13 @@ import { UserSettingsEntity } from "../../../modules/mine/entity/user-settings.j
import { UserGrantSetting } from "../../../modules/mine/service/models.js";
import { isPlus } from "@certd/plus-core";
import { merge } from "lodash-es";
import { ApiTags } from "@midwayjs/swagger";
/**
*/
@Provide()
@Controller('/api/user/settings')
@ApiTags(['mine'])
export class UserSettingsController extends CrudController<UserSettingsService> {
@Inject()
service: UserSettingsService;

View File

@@ -7,11 +7,13 @@ import { SelectQueryBuilder } from "typeorm";
import { logger } from "@certd/basic";
import fs from "fs";
import dayjs from "dayjs";
import { ApiTags } from "@midwayjs/swagger";
/**
*/
@Provide()
@Controller('/api/monitor/cert')
@ApiTags(['cert'])
export class CertInfoController extends CrudController<CertInfoService> {
@Inject()
service: CertInfoService;

View File

@@ -6,11 +6,13 @@ import { UserSiteMonitorSetting } from "../../../modules/mine/service/models.js"
import { merge } from "lodash-es";
import {SiteIpService} from "../../../modules/monitor/service/site-ip-service.js";
import { utils } from "@certd/basic";
import { ApiTags } from "@midwayjs/swagger";
/**
*/
@Provide()
@Controller('/api/monitor/site')
@ApiTags(['monitor'])
export class SiteInfoController extends CrudController<SiteInfoService> {
@Inject()
service: SiteInfoService;

View File

@@ -3,11 +3,13 @@ import { Constants, CrudController } from "@certd/lib-server";
import { AuthService } from "../../../modules/sys/authority/service/auth-service.js";
import { SiteIpService } from "../../../modules/monitor/service/site-ip-service.js";
import { SiteInfoService } from "../../../modules/monitor/index.js";
import { ApiTags } from "@midwayjs/swagger";
/**
*/
@Provide()
@Controller('/api/monitor/site/ip')
@ApiTags(['monitor'])
export class SiteInfoController extends CrudController<SiteIpService> {
@Inject()
service: SiteIpService;

View File

@@ -2,11 +2,13 @@ import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/c
import { Constants, CrudController } from '@certd/lib-server';
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { OpenKeyService } from '../../../modules/open/service/open-key-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
*/
@Provide()
@Controller('/api/open/key')
@ApiTags(['open'])
export class OpenKeyController extends CrudController<OpenKeyService> {
@Inject()
service: OpenKeyService;

View File

@@ -3,11 +3,13 @@ import { Constants, CrudController } from '@certd/lib-server';
import { AccessService } from '@certd/lib-server';
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { AccessDefine } from '@certd/pipeline';
import { ApiTags } from '@midwayjs/swagger';
/**
* 授权
*/
@Provide()
@ApiTags(['pipeline-access'])
@Controller('/api/pi/access')
export class AccessController extends CrudController<AccessService> {
@Inject()

View File

@@ -5,9 +5,11 @@ import { StorageService } from '../../../modules/pipeline/service/storage-servic
import { CertReader } from "@certd/plugin-cert";
import { UserSettingsService } from '../../../modules/mine/service/user-settings-service.js';
import { UserGrantSetting } from '../../../modules/mine/service/models.js';
import { ApiTags } from '@midwayjs/swagger';
@Provide()
@Controller('/api/pi/cert')
@ApiTags(['pipeline-cert'])
export class CertController extends BaseController {
@Inject()
pipelineService: PipelineService;

View File

@@ -2,12 +2,14 @@ import { ALL, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
import { DnsProviderService } from '../../../modules/pipeline/service/dns-provider-service.js';
import { BaseController } from '@certd/lib-server';
import { Constants } from '@certd/lib-server';
import { ApiTags } from '@midwayjs/swagger';
/**
* 插件
*/
@Provide()
@Controller('/api/pi/dnsProvider')
@ApiTags(['pipeline-dns-provider'])
export class DnsProviderController extends BaseController {
@Inject()
service: DnsProviderService;

View File

@@ -16,9 +16,11 @@ import {http, HttpRequestConfig, logger, mergeUtils, utils} from '@certd/basic';
import {NotificationService} from '../../../modules/pipeline/service/notification-service.js';
import {TaskServiceBuilder} from "../../../modules/pipeline/service/getter/task-service-getter.js";
import { cloneDeep } from 'lodash-es';
import { ApiTags } from '@midwayjs/swagger';
@Provide()
@Controller('/api/pi/handle')
@ApiTags(['pipeline-handle'])
export class HandleController extends BaseController {
@Inject()
accessService: AccessService;

View File

@@ -12,12 +12,14 @@ import { HistoryLogService } from "../../../modules/pipeline/service/history-log
import { HistoryService } from "../../../modules/pipeline/service/history-service.js";
import { PipelineService } from "../../../modules/pipeline/service/pipeline-service.js";
import { AuthService } from "../../../modules/sys/authority/service/auth-service.js";
import { ApiTags } from "@midwayjs/swagger";
/**
* 证书
*/
@Provide()
@Controller('/api/pi/history')
@ApiTags(['pipeline-history'])
export class HistoryController extends CrudController<HistoryService> {
@Inject()
service: HistoryService;

View File

@@ -4,12 +4,14 @@ import { NotificationService } from '../../../modules/pipeline/service/notificat
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { NotificationDefine } from '@certd/pipeline';
import { checkPlus } from '@certd/plus-core';
import { ApiTags } from '@midwayjs/swagger';
/**
* 通知
*/
@Provide()
@Controller('/api/pi/notification')
@ApiTags(['pipeline-notification'])
export class NotificationController extends CrudController<NotificationService> {
@Inject()
service: NotificationService;

View File

@@ -6,11 +6,13 @@ import { PipelineEntity } from '../../../modules/pipeline/entity/pipeline.js';
import { HistoryService } from '../../../modules/pipeline/service/history-service.js';
import { PipelineService } from '../../../modules/pipeline/service/pipeline-service.js';
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 证书
*/
@Provide()
@ApiTags(['pipeline'])
@Controller('/api/pi/pipeline')
export class PipelineController extends CrudController<PipelineService> {
@Inject()
@@ -85,23 +87,23 @@ export class PipelineController extends CrudController<PipelineService> {
}
@Post('/add', { summary: Constants.per.authOnly })
async add(@Body(ALL) bean: PipelineEntity) {
const { projectId, userId } = await this.getProjectUserIdWrite()
bean.userId = userId
bean.projectId = projectId
return super.add(bean);
}
// @Post('/add', { summary: Constants.per.authOnly })
// async add(@Body(ALL) bean: PipelineEntity) {
// const { projectId, userId } = await this.getProjectUserIdWrite()
// bean.userId = userId
// bean.projectId = projectId
// return super.add(bean);
// }
@Post('/update', { summary: Constants.per.authOnly })
async update(@Body(ALL) bean) {
await this.checkOwner(this.getService(), bean.id,"write",true);
delete bean.userId;
delete bean.projectId;
return super.update(bean);
}
// @Post('/update', { summary: Constants.per.authOnly })
// async update(@Body(ALL) bean) {
// await this.checkOwner(this.getService(), bean.id,"write",true);
// delete bean.userId;
// delete bean.projectId;
// return super.update(bean);
// }
@Post('/save', { summary: Constants.per.authOnly })
@Post('/save', { summary: Constants.per.authOnly,description: '新增/更新流水线' })
async save(@Body(ALL) bean: { addToMonitorEnabled: boolean, addToMonitorDomains: string } & PipelineEntity) {
const { userId ,projectId} = await this.getProjectUserIdWrite()
if (bean.id > 0) {

View File

@@ -2,12 +2,14 @@ import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/c
import { Constants, CrudController } from '@certd/lib-server';
import { AuthService } from '../../../modules/sys/authority/service/auth-service.js';
import { PipelineGroupService } from '../../../modules/pipeline/service/pipeline-group-service.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 通知
*/
@Provide()
@Controller('/api/pi/pipeline/group')
@ApiTags(['pipeline-group'])
export class PipelineGroupController extends CrudController<PipelineGroupService> {
@Inject()
service: PipelineGroupService;

View File

@@ -3,12 +3,14 @@ import { BaseController, Constants } from '@certd/lib-server';
import { PluginService } from '../../../modules/plugin/service/plugin-service.js';
import { PluginConfigService } from '../../../modules/plugin/service/plugin-config-service.js';
import {pluginGroups} from "@certd/pipeline";
import { ApiTags } from '@midwayjs/swagger';
/**
* 插件
*/
@Provide()
@Controller('/api/pi/plugin')
@ApiTags(['pipeline-plugin'])
export class PluginController extends BaseController {
@Inject()
service: PluginService;

View File

@@ -3,12 +3,14 @@ import { DomainParser } from '@certd/plugin-cert';
import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core';
import { SubDomainService } from "../../../modules/pipeline/service/sub-domain-service.js";
import { TaskServiceBuilder } from '../../../modules/pipeline/service/getter/task-service-getter.js';
import { ApiTags } from '@midwayjs/swagger';
/**
* 子域名托管
*/
@Provide()
@Controller('/api/pi/subDomain')
@ApiTags(['pipeline-subdomain'])
export class SubDomainController extends CrudController<SubDomainService> {
@Inject()
service: SubDomainService;

View File

@@ -2,12 +2,14 @@ import {ALL, Body, Controller, Inject, Post, Provide, Query} from '@midwayjs/cor
import {Constants, CrudController} from '@certd/lib-server';
import { TemplateService } from '../../../modules/pipeline/service/template-service.js';
import { checkPlus } from '@certd/plus-core';
import { ApiTags } from '@midwayjs/swagger';
/**
* 流水线模版
*/
@Provide()
@Controller('/api/pi/template')
@ApiTags(['pipeline-template'])
export class TemplateController extends CrudController<TemplateService> {
@Inject()
service: TemplateService;

View File

@@ -128,8 +128,11 @@ export class AuthorityMiddleware implements IWebMiddleware {
//校验 openKey
const openKeyRes = await this.openKeyService.verifyOpenKey(openKey);
const roles = await this.roleService.getRoleIdsByUserId(openKeyRes.userId);
ctx.user = { id: openKeyRes.userId, roles };
let roles = [1]
if (!openKeyRes.projectId || openKeyRes.projectId <= 0) {
roles = await this.roleService.getRoleIdsByUserId(openKeyRes.userId);
}
ctx.user = { id: openKeyRes.userId, roles ,projectId:openKeyRes.projectId};
ctx.openKey = openKeyRes;
return openKeyRes;
}

View File

@@ -1,4 +1,4 @@
import { BaseService, SysSettingsService } from '@certd/lib-server';
import { BaseService, Constants, SysSettingsService } from '@certd/lib-server';
import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
import { InjectEntityModel } from '@midwayjs/typeorm';
import { LRUCache } from 'lru-cache';
@@ -11,7 +11,7 @@ const projectCache = new LRUCache<string, any>({
ttl: 1000 * 60 * 10,
});
const ENTERPRISE_USER_ID = -1 //企业模式下 企业userId 固定为-1
const ENTERPRISE_USER_ID = Constants.enterpriseUserId; //企业模式下 企业userId 固定为-1
@Provide()
@Scope(ScopeEnum.Request, { allowDowngrade: true })
@@ -182,6 +182,10 @@ export class ProjectService extends BaseService<ProjectEntity> {
throw new Error('项目ID不能为空');
}
if (userId === ENTERPRISE_USER_ID) {
return true
}
const cacheKey = `projectPermission:${projectId}:${userId}`
let savedPermission = projectCache.get(cacheKey);

8
pnpm-lock.yaml generated
View File

@@ -1527,6 +1527,9 @@ importers:
'@midwayjs/static-file':
specifier: 3.20.13
version: 3.20.13
'@midwayjs/swagger':
specifier: 3.20.11
version: 3.20.11
'@midwayjs/typeorm':
specifier: 3.20.11
version: 3.20.11
@@ -3846,6 +3849,9 @@ packages:
resolution: {integrity: sha512-aX67LvpIPYVWpuhuWSATgTBNvaNbvOFk7wbh0BTS0XRaO6vVieNe0mJoBXFkf89w1qExAHgIPHZDPIoEOHEBiQ==}
engines: {node: '>=12'}
'@midwayjs/swagger@3.20.11':
resolution: {integrity: sha512-ZF4BJC/ogVYVM4F3ve7Y9cZWDiM+TIAfUFyTNcSw3TgcLB+QnJVHkXSeKXL+PoUHHfE/cztboOk1UEfWxikIuA==}
'@midwayjs/typeorm@3.20.11':
resolution: {integrity: sha512-QMCUwLhQStK1RuF+7hbpHoPOGT5DxIt4YalJNC8KtnaBMsIBVf4W+7dHbk9WpsBBx/GCraKfTYIoPA2wJWVj5g==}
engines: {node: '>=12'}
@@ -16271,6 +16277,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@midwayjs/swagger@3.20.11': {}
'@midwayjs/typeorm@3.20.11': {}
'@midwayjs/upload@3.20.13':