跳到主要内容

配置

没有独立的配置文件。生成行为由传给 generate() 的 GenerateOptions 对象控制。

GenerateOptions​

interface GenerateOptions {
language: string;
client: string;
request?: RequestIR;
document?: unknown;
path?: string;
method?: string;
serverUrl?: string;
securityValues?: Record<string, string>;
softRefMode?: boolean;
}
选项类型必填说明
languagestring是目标语言标识符,不区分大小写,例如 "javascript"
clientstring是目标 HTTP 客户端标识符,例如 "fetch"
requestRequestIR二选一*已规范化的请求;跳过 normalize
documentunknown二选一*已解析的 OpenAPI 文档对象
pathstring使用 document 时精确的 OpenAPI 路径模板,例如 "/pets/{id}"
methodstring使用 document 时HTTP 方法,例如 "get" / "post"
serverUrlstring否覆盖文档中的服务器 URL
securityValuesRecord<string, string>否以安全方案名称为键的凭据
softRefModeboolean否遇到失效或循环的 $ref 时不抛错,返回部分值

* 必须提供单独的 request,或同时提供 document + path + method。提供 request 时,会忽略 document、path、method、serverUrl、securityValues 和 softRefMode。

输入校验错误​

缺少必填输入时,generate() 会抛出错误:

  • TypeError: generate() requires an options object — 未提供选项对象。
  • Error: Unsupported generator: <language>/<client> — 未知的组合。
  • TypeError: generate() requires either a 'request' or a 'document' option
  • TypeError: generate() requires a 'path' option when using 'document'
  • TypeError: generate() requires a 'method' option when using 'document'

对于不支持的方法、缺少 paths、未知路径或缺少操作,normalize() 本身会抛出 Error;文档不是对象时则抛出 TypeError。

RequestIR​

单个请求的规范化表示,不依赖具体代码生成器。可以直接构造并通过 options.request 传入,从而跳过 normalize。

interface RequestIR {
method: string;
baseUrl: string;
path: string;
parameters: Parameter[];
headers: Parameter[];
body?: Body;
security: Security[];
}

Parameter​

interface Parameter {
name: string;
in: ParameterLocation;
value: unknown;
style?: string;
explode?: boolean;
allowReserved?: boolean;
}

type ParameterLocation = "path" | "query" | "querystring" | "header" | "cookie";

Body​

interface Body {
mediaType: string;
value: unknown;
encoding?: Record<string, unknown>;
}

Security​

interface Security {
name: string;
type: string; // e.g. "apiKey" | "http"
scheme?: string; // e.g. "bearer" | "basic"
in?: string; // e.g. "header" | "query" | "cookie"
paramName?: string;
value: string;
}

FileValue​

Multipart 文件占位符使用以下标记结构:

interface FileValue {
__file: true;
path?: string;
name?: string;
contentType?: string;
data?: string | ArrayBuffer | Uint8Array | Blob;
}

Generator​

符合此接口的对象都可以作为生成器。内置生成器由 createGenerator(language, client, emit) 包装,也可以注册自己的生成器:

interface Generator {
language: string;
client: string;
generate(request: RequestIR): string;
}

generate 接收 RequestIR,返回生成的源代码字符串。

Plugin​

插件通过 use() 注册一个或多个生成器:

interface Plugin {
name: string;
register(api: { register(generator: Generator): void }): void;
}

示例:

import { use } from "@powerduck/openapi-codegen";

use({
name: "my-plugin",
register({ register }) {
register({
language: "mylang",
client: "my-client",
generate(request) {
return `// ${request.method} ${request.path}`;
},
});
},
});

GenerateResult​

此类型为将来可能包含多个文件的生成结果预留。目前 generate() 仍然返回 string:

interface GenerateResult {
code: string;
files?: Record<string, string>;
metadata?: Record<string, unknown>;
}

normalize 的输出结构​

直接调用 normalize()(参见 API 参考)会返回比 RequestIR 略丰富的对象:

{
preWarnings: string[]; // lightweight structural warnings
method: string; // uppercase
baseUrl: string;
path: string;
parameters: NormalizedParameter[];
headers: NormalizedParameter[]; // parameters filtered to in === "header"
body?: { mediaType, value, encoding? };
security: NormalizedSecurity[];
}

服务器 URL 的解析顺序​

baseUrl 使用下列顺序中的首个非空值:

  1. options.serverUrl
  2. 操作级的 servers
  3. 路径项的 servers
  4. 根级的 servers
  5. 回退值 "https://example.com"

服务器中的 {variable} 占位符从 server.variables 读取 default 值,缺失时使用 example,并进行 URI 编码。