wormaworma
API 参考

插件 API

ApiPlugin 接口与生命周期钩子

关于插件系统概述和内置插件列表,请参阅 插件系统

createPlugin

创建类型安全的插件工厂函数。

import { createPlugin } from "wormajs";

const myPlugin = createPlugin((options: { key: string }) => ({
  name: "my-plugin",
  beforeCodeGenerate({ data }) {
    data.config.customKey = options.key;
  },
}));

// 使用
defineConfig({
  generator: [
    {
      plugins: [myPlugin({ key: "value" })],
    },
  ],
});

ApiPlugin

type MaybePromise<T> = T | Promise<T>;

type ReportProgress = (progress: number, message?: string) => void;

interface ApiPlugin {
  name?: string;

  /** ① 配置阶段:可修改 config */
  config?: (
    params: ConfigHookParams,
  ) => MaybePromise<GeneratorConfig | undefined | null | void>;

  /** ② 规范解析前:拿到原始规范文本,可返回新字符串替换后再解析 */
  beforeSpecParse?: (params: BeforeSpecParseHookParams) => MaybePromise<string | undefined | null | void>;

  /** ③ OpenAPI 解析后:可修改 document */
  specParsed?: (
    params: SpecParsedHookParams,
  ) => MaybePromise<OpenAPIDocument | undefined | null | void>;

  /** ④ 获取模板路径 */
  getTemplate?: (
    params: GetTemplateHookParams,
  ) => MaybePromise<TemplateConfigResult | undefined | null | void>;

  /** ⑤ 渲染前:注入/修改 templateData */
  beforeCodeGenerate?: (
    params: BeforeCodeGenerateHookParams,
  ) => MaybePromise<void>;

  /** ⑥ 每个文件写盘前:可修改单个文件内容 */
  beforeFileWrite?: (params: BeforeFileWriteHookParams) => MaybePromise<string>;

  /** ⑦ 所有文件写盘完成后 */
  codeGenerated?: (params: CodeGeneratedHookParams) => MaybePromise<void>;

  /** ⑧ Handlebars 实例创建时:注册自定义 helper 或 partial */
  onHandlebarsCreated?: (
    params: OnHandlebarsCreatedHookParams,
  ) => MaybePromise<void>;
}

钩子参数类型

ConfigHookParams

interface ConfigHookParams {
  config: GeneratorConfig;
  projectPath: string;
  reportProgress: ReportProgress;
}

BeforeSpecParseHookParams

beforeSpecParse 在规范文件(OpenAPI/Swagger 的 JSON 或 YAML 文本)取回之后、解析之前触发,params.spec 即原始规范文本字符串。

转换规范文件内容:钩子可以返回一个新的字符串来替换待解析的规范文本,返回的字符串会作为后续解析(含 JSON/YAML 识别、Swagger 2.0 → OpenAPI 3.0 转换)的输入。若不返回值(或返回非字符串),则保持原始文本不变。多个插件的 beforeSpecParse 会依次串联执行——前一个插件的返回结果作为后一个插件的 spec 入参。

常见用途:修复非法/不规范的原始规范文本、注入或删改字段、在解析前做字符串级别的替换等。

interface BeforeSpecParseHookParams {
  config: Readonly<GeneratorConfig>;
  /** 原始规范文本(JSON 或 YAML),解析前的字符串内容 */
  spec: string;
  projectPath: string;
  reportProgress: ReportProgress;
}

示例:解析前替换规范文本内容。

import { createPlugin } from "wormajs/plugin";

const patchSpecPlugin = createPlugin(() => ({
  name: "patch-spec",
  beforeSpecParse({ spec }) {
    // spec 是原始规范文本,返回新字符串即可替换后再解析
    return spec.replace(/"nullable":\s*"true"/g, '"nullable": true');
  },
}));

SpecParsedHookParams

interface SpecParsedHookParams {
  config: Readonly<GeneratorConfig>;
  document: OpenAPIDocument;
  projectPath: string;
  reportProgress: ReportProgress;
}

GetTemplateHookParams

interface GetTemplateHookParams {
  config: Readonly<GeneratorConfig>;
  projectPath: string;
  reportProgress: ReportProgress;
}

返回 TemplateConfigResult

interface TemplateConfigResult {
  /** 模板路径(相对或绝对,相对是相对于 process.cwd()) */
  path: string;
}

BeforeCodeGenerateHookParams

interface BeforeCodeGenerateHookParams {
  config: Readonly<GeneratorConfig>;
  data: TemplateData;
  projectPath: string;
  reportProgress: ReportProgress;
}

直接修改 params.data 注入数据,不再返回值。

BeforeFileWriteHookParams

interface BeforeFileWriteHookParams {
  config: Readonly<GeneratorConfig>;
  data: TemplateData;
  filePath: string;
  content: string;
  projectPath: string;
  reportProgress: ReportProgress;
  /** 模板文件元数据 */
  meta: {
    templateType?: "tag" | "api";
    tag?: string;
    api?: string;
  };
}

返回修改后的文件内容字符串。

CodeGeneratedHookParams

interface CodeGeneratedHookParams {
  config: Readonly<GeneratorConfig>;
  data: TemplateData;
  /** 所有生成文件的路径(不含内容) */
  filePaths: string[];
  /** 绝对输出目录 */
  outputDir: string;
  projectPath: string;
  error?: Error;
  reportProgress: ReportProgress;
}

OnHandlebarsCreatedHookParams

interface OnHandlebarsCreatedHookParams {
  hbs: typeof import("handlebars");
  config: Readonly<GeneratorConfig>;
  projectPath: string;
  reportProgress: ReportProgress;
}

On this page