wormaworma

参数修改器

灵活修改 API 接口的请求和响应参数,支持增加、删除、修改参数类型

参数修改器

本插件用于灵活修改 API 接口的请求和响应参数,支持增加、删除和修改参数类型。

主要功能

  • 支持修改 paramspathParamsdataresponse 四个维度的参数
  • 支持增加、删除、修改参数类型
  • 支持修改参数层级(flat
  • 通过 match 规则精确控制需要修改的字段
  • 通过 path 规则限定仅对匹配的接口路径生效
  • 通过 handler 函数动态修改参数的类型和必填性

基本使用

import { defineConfig } from 'wormajs';
import { payloadModifier } from 'wormajs/plugin';

export default defineConfig({
  generator: [
    {
      // ...
      plugins: [
        // 修改请求参数中的 userId 字段
        payloadModifier([
          {
            scope: 'params',
            match: key => key === 'userId',
            handler: schema => {
              return {
                attr1: { required: false, type: 'string' }, // 生成为可选参数
                attr2: 'number', // 生成为必填参数
                attr3: {
                  // 嵌套数据
                  innerAttr: { oneOf: ['string', 'number'] },
                },
              };
            },
          },
        ]),
      ],
    },
  ],
});

配置参数

ModifierScope(修改范围)

type ModifierScope = 'params' | 'pathParams' | 'data' | 'response';

Schema(数据模式定义)

定义参数类型的核心类型,支持多种模式:

  • 基本类型'number' | 'string' | 'boolean' | 'undefined' | 'null' | 'unknown' | 'any' | 'never'
  • 数组类型Schema[](由元素类型组成的原生数组,例如 ['string'] 表示 string[]['string', 'number'] 表示元组 [string, number]
  • 引用类型(对象){ [attr: string]: Schema }(可选属性使用 SchemaOptional 包装形式 { required: false, type: Schema }
  • 联合类型{ oneOf: Schema[] } | { anyOf: Schema[] } | { allOf: Schema[] }
  • 枚举类型{ enum: Array<string | number | boolean | null>; type?: SchemaPrimitive }(值必须是给定集合之一,type 可选表示枚举元素的基础类型)
  • 可选普通类型{ required: boolean; type: Schema }(独立的普通类型字段本身可选时使用,以 type 字段为准)

Config(插件配置接口)

interface Config {
  /** 生效范围 */
  scope: ModifierScope;
  /** 接口路径过滤:仅当 apiDescriptor.url 命中时才生效;省略则对所有接口生效。匹配规则与 match 一致 */
  path?: string | RegExp | ((url: string) => boolean);
  /** 匹配规则,不指定则匹配全部 */
  match?: string | RegExp | ((key: string) => boolean);
  /**
   * 处理器
   * - 返回 Schema 表示修改类型
   * - 返回 { required: boolean; type: Schema } 表示修改必填性(以 type 字段为准)
   * - 返回 void | null | undefined 表示移除字段
   * handler 第一个参数为当前字段的 Schema,第二个参数为命中的字段名 key(未配置 match 时为 undefined)
   * handler 参数默认类型为 Schema,如需更精确的类型可在 handler 内部进行断言(as)
   */
  handler: (
    schema: Schema,
    key?: string,
  ) => Schema | { required: boolean; type: Schema } | void | null | undefined;
}

示例

修改参数类型

params 中的 age 字段修改为 number 类型:

payloadModifier([
  {
    scope: 'params',
    match: 'age',
    handler: () => 'number',
  },
]);

修改嵌套参数

修改 data 中的 user 对象及其嵌套结构:

payloadModifier([
  {
    scope: 'data',
    match: 'user',
    handler: () => ({
      name: 'string',
      age: 'number',
      address: {
        city: 'string',
        zipCode: 'number',
      },
    }),
  },
]);

移除参数

移除 response 中的 debugInfo 字段:

payloadModifier([
  {
    scope: 'response',
    match: 'debugInfo',
    handler: () => undefined,
  },
]);

联合类型

pathParams 中的 id 字段修改为 string | number 类型:

payloadModifier([
  {
    scope: 'pathParams',
    match: 'id',
    handler: () => ({ oneOf: ['string', 'number'] }),
  },
]);

枚举类型

params 中的 status 字段修改为枚举类型,值只能是给定集合之一:

payloadModifier([
  {
    scope: 'params',
    match: 'status',
    handler: () => ({ enum: ['active', 'inactive', 'pending'], type: 'string' }),
  },
]);

SchemaEnum 也可用于接收入参时的判断:当字段在 OpenAPI 中本身就是枚举时,handler 收到的 schema 即为 { enum: [...], type?: ... },可据此再转换。

常用场景示例

以下为日常使用中高频出现的组合配置,可直接复制并按需调整。

数字 id 统一改为 string(避免前端精度丢失)

后端 id 多为 integer,前端用 number 接收会丢失精度。用正则把以 id/Id 结尾的字段统一改为 string

payloadModifier([
  { scope: 'response', match: /[Ii]d$/, handler: () => 'string' },
  { scope: 'params', match: /[Ii]d$/, handler: () => 'string' },
]);

时间字段统一改为 number 时间戳

把以 time/at 结尾的字段(如 createTimeupdated_at)统一改为 number

payloadModifier([
  { scope: 'data', match: /(time|at)$/i, handler: () => 'number' },
  { scope: 'response', match: /(time|at)$/i, handler: () => 'number' },
]);

批量移除内部 / 调试字段

移除以 debug_internal 开头的响应字段:

payloadModifier([
  { scope: 'response', match: /^(debug|_|internal)/i, handler: () => undefined },
]);

必填与可选互转

nickname 改为可选、把 phone 改为必填:

payloadModifier([
  { scope: 'data', match: 'nickname', handler: () => ({ required: false, type: 'string' }) },
  { scope: 'data', match: 'phone', handler: () => ({ required: true, type: 'string' }) },
]);

根据原类型动态改写(handler 接收 schema)

把疑似数组(以 list/List 结尾)的响应字段统一规整为 string[]

payloadModifier([
  {
    scope: 'response',
    match: /list$/i,
    handler: (schema) => ({ type: ['string'] }),
  },
]);

组合多个 scope / path 的实战配置

一个真实项目中常见的完整配置,兼顾路径过滤与类型修正:

payloadModifier([
  // 1) 仅对 /api/admin 下的接口,给请求体增加内部字段
  {
    path: /^\/api\/admin/,
    scope: 'data',
    match: 'operatorId',
    handler: () => ({ required: true, type: 'string' }),
  },
  // 2) 所有接口:数字 id 转 string
  { scope: 'response', match: /[Ii]d$/, handler: () => 'string' },
  // 3) 所有接口:移除调试字段
  { scope: 'response', match: /^(debug|internal)/i, handler: () => undefined },
]);

高级用法

动态修改必填性

通过返回 { required: true/false, type: schema } 对象来控制(以 type 字段为准):

payloadModifier([
  {
    scope: 'data',
    match: 'email',
    handler: () => ({ required: true, type: 'string' }),
  },
]);

可选参数与必填参数

在 Schema 对象中,必填属性直接写;可选属性使用 SchemaOptional 包装形式 { required: false, type: Schema } 表示:

handler: () => ({
  username: 'string',                       // 必填
  age: { required: false, type: 'number' }, // 可选
});

SchemaOptional 与逐字段调用时「可选普通类型」的入参表示完全一致,因此整段调用和逐字段调用的 handler 处理逻辑可以统一。

使用正则匹配

匹配所有以 _date 结尾的 params 参数:

payloadModifier([
  {
    scope: 'params',
    match: /_date$/,
    handler: () => 'string',
  },
]);

支持 oneOf、anyOf、allOf

联合类型统一使用关键字写法:

handler: () => ({
  oneOf: [
    { type: 'string', cardNumber: 'string' },
    { type: 'number', email: 'string' },
  ],
});
  • anyOf:定义可选参数组合
  • allOf:定义参数组合(必须同时满足)

数组类型

返回由元素类型组成的原生数组即可表示数组:

handler: () => (['string']); // string[]
handler: () => (['string', 'number']); // 元组 [string, number]

指定接口路径(path 过滤)

通过 path 限定配置仅对匹配的接口路径生效,未命中的接口将原样返回、不受影响。匹配规则与 match 一致,支持字符串子串、正则、函数三种形式:

payloadModifier([
  // 仅对路径包含 /pets 的接口生效
  {
    path: '/pets',
    scope: 'data',
    match: 'userId',
    handler: () => ({ required: true, type: 'string' }),
  },
  // 仅对 /admin 开头的接口生效(正则)
  {
    path: /^\/admin/,
    scope: 'params',
    match: 'token',
    handler: () => ({ required: true, type: 'string' }),
  },
]);

On this page