openapi-docs-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +92 -0
- package/dist/cli.js.map +1 -0
- package/dist/formatter/operation.d.ts +4 -0
- package/dist/formatter/operation.d.ts.map +1 -0
- package/dist/formatter/operation.js +135 -0
- package/dist/formatter/operation.js.map +1 -0
- package/dist/formatter/schema.d.ts +7 -0
- package/dist/formatter/schema.d.ts.map +1 -0
- package/dist/formatter/schema.js +142 -0
- package/dist/formatter/schema.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +89 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/openapi/loader.d.ts +9 -0
- package/dist/openapi/loader.d.ts.map +1 -0
- package/dist/openapi/loader.js +125 -0
- package/dist/openapi/loader.js.map +1 -0
- package/dist/openapi/operations.d.ts +13 -0
- package/dist/openapi/operations.d.ts.map +1 -0
- package/dist/openapi/operations.js +71 -0
- package/dist/openapi/operations.js.map +1 -0
- package/dist/search/search.d.ts +4 -0
- package/dist/search/search.d.ts.map +1 -0
- package/dist/search/search.js +117 -0
- package/dist/search/search.js.map +1 -0
- package/dist/service.d.ts +21 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +40 -0
- package/dist/service.js.map +1 -0
- package/dist/types.d.ts +46 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
# OpenAPI Docs MCP
|
|
2
|
+
|
|
3
|
+
一个厂商无关的 MCP Server,帮助编码 Agent 搜索和理解 OpenAPI/Swagger 文档,且不会调用文档中描述的真实后端接口。
|
|
4
|
+
|
|
5
|
+
第一版重点保证结果确定、准确和稳定:
|
|
6
|
+
|
|
7
|
+
- 启动时加载并校验本地或远程 OpenAPI 文档;
|
|
8
|
+
- 启动完成后,所有工具调用都直接读取内存;
|
|
9
|
+
- 使用明确的字段权重搜索中英文接口元数据;
|
|
10
|
+
- 只在查询接口或 Schema 时按需展开本地 `$ref`;
|
|
11
|
+
- 限制 Schema 展开深度,并检测循环引用;
|
|
12
|
+
- 通过 stdio 暴露 4 个只读 MCP 工具;
|
|
13
|
+
- 不绑定 OpenAI、Claude 或其他模型厂商。
|
|
14
|
+
|
|
15
|
+
## 环境要求
|
|
16
|
+
|
|
17
|
+
- Node.js 20 或更高版本
|
|
18
|
+
- 开发时建议使用 pnpm 11 或更高版本
|
|
19
|
+
|
|
20
|
+
## 安装与构建
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pnpm install
|
|
24
|
+
pnpm build
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
构建产物位于 `dist/`。
|
|
28
|
+
|
|
29
|
+
## 启动服务
|
|
30
|
+
|
|
31
|
+
### 加载本地文档
|
|
32
|
+
|
|
33
|
+
支持 OpenAPI/Swagger JSON 和 YAML 文件:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
node dist/cli.js --source ./openapi.json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
也可以直接使用位置参数:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node dist/cli.js ./openapi.yaml
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 加载远程文档
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node dist/cli.js --source https://api.example.com/v3/api-docs
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
默认远程加载超时时间为 10 秒,可以通过 `--timeout` 修改:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
node dist/cli.js \
|
|
55
|
+
--source https://api.example.com/v3/api-docs \
|
|
56
|
+
--timeout 20000
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 加载需要鉴权的文档
|
|
60
|
+
|
|
61
|
+
可以重复使用 `--header`,格式为 `NAME=VALUE`:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
node dist/cli.js \
|
|
65
|
+
--source https://api.example.com/v3/api-docs \
|
|
66
|
+
--header Authorization="Bearer token" \
|
|
67
|
+
--header X-Tenant-Id=tenant-1
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
日志和错误信息只会写入 stderr,stdout 专门用于传输 MCP 消息。
|
|
71
|
+
|
|
72
|
+
## CLI 参数
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
用法:openapi-docs-mcp --source <文件或URL> [选项]
|
|
76
|
+
|
|
77
|
+
选项:
|
|
78
|
+
-s, --source <value> OpenAPI JSON/YAML 文件或 HTTP(S) URL
|
|
79
|
+
--header NAME=VALUE 加载远程文档时使用的请求头,可重复传入
|
|
80
|
+
--timeout <ms> 远程加载超时时间,默认 10000 毫秒
|
|
81
|
+
--strict-validation 严格模式:任何 OpenAPI 校验警告都会阻止启动
|
|
82
|
+
-h, --help 显示帮助信息
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## MCP Client 配置
|
|
86
|
+
|
|
87
|
+
构建完成后,可以在任意支持 stdio MCP Server 的 Client 中添加配置。
|
|
88
|
+
|
|
89
|
+
路径建议使用绝对路径:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"mcpServers": {
|
|
94
|
+
"project-api-docs": {
|
|
95
|
+
"command": "node",
|
|
96
|
+
"args": [
|
|
97
|
+
"C:/absolute/path/openapi-docs-mcp/dist/cli.js",
|
|
98
|
+
"--source",
|
|
99
|
+
"C:/absolute/path/openapi.json"
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
同一个 npm 包可以使用不同 OpenAPI 文档启动多个实例,因此不同项目之间不会冲突。
|
|
107
|
+
|
|
108
|
+
## MCP 工具
|
|
109
|
+
|
|
110
|
+
### `search_api`
|
|
111
|
+
|
|
112
|
+
根据自然语言关键词、路径、标签、描述或 `operationId` 搜索接口,返回经过排序的轻量候选结果。
|
|
113
|
+
|
|
114
|
+
正常工作流是先调用 `search_api` 找到接口,再把结果中的 `id` 传给 `get_api`。
|
|
115
|
+
|
|
116
|
+
输入参数:
|
|
117
|
+
|
|
118
|
+
| 参数 | 必填 | 说明 |
|
|
119
|
+
|---|---:|---|
|
|
120
|
+
| `query` | 否 | 搜索关键词,例如 `异常分页列表` 或 `create user` |
|
|
121
|
+
| `method` | 否 | HTTP 方法过滤条件,例如 `GET`、`POST` |
|
|
122
|
+
| `tag` | 否 | 精确匹配 OpenAPI Tag |
|
|
123
|
+
| `limit` | 否 | 返回数量,默认 10,最大 50 |
|
|
124
|
+
|
|
125
|
+
搜索字段权重:
|
|
126
|
+
|
|
127
|
+
| 字段 | 权重 |
|
|
128
|
+
|---|---:|
|
|
129
|
+
| `summary` | 10 |
|
|
130
|
+
| `tags` | 8 |
|
|
131
|
+
| `path` | 6 |
|
|
132
|
+
| `description` | 4 |
|
|
133
|
+
| `operationId` | 2 |
|
|
134
|
+
|
|
135
|
+
中文搜索不依赖空格分词,会使用标准化、包含匹配以及二元/三元字符片段进行评分。
|
|
136
|
+
|
|
137
|
+
### `get_api`
|
|
138
|
+
|
|
139
|
+
获取单个接口的完整上下文,包括:
|
|
140
|
+
|
|
141
|
+
- HTTP 方法和路径;
|
|
142
|
+
- Summary、Description 和 Tags;
|
|
143
|
+
- Path、Query、Header、Cookie 参数;
|
|
144
|
+
- Request Body 和 Content-Type;
|
|
145
|
+
- Responses;
|
|
146
|
+
- Security 和 Deprecated 元数据;
|
|
147
|
+
- 按需展开后的 Schema。
|
|
148
|
+
|
|
149
|
+
优先传入 `search_api` 返回的 `id`,也可以传入精确的 `path` 和可选的 `method`。
|
|
150
|
+
|
|
151
|
+
`maxDepth` 用于控制 Schema 最大展开深度,默认值为 5,允许范围为 1 到 12。
|
|
152
|
+
|
|
153
|
+
### `get_schema`
|
|
154
|
+
|
|
155
|
+
根据精确名称读取 `components.schemas` 中的 Schema。
|
|
156
|
+
|
|
157
|
+
本地 `$ref` 会按需展开,同时具有:
|
|
158
|
+
|
|
159
|
+
- 最大深度限制;
|
|
160
|
+
- 最大属性数量限制;
|
|
161
|
+
- 循环引用检测;
|
|
162
|
+
- 无法解析的引用标记。
|
|
163
|
+
|
|
164
|
+
### `list_groups`
|
|
165
|
+
|
|
166
|
+
列出 OpenAPI Tags 及每个 Tag 下的接口数量。
|
|
167
|
+
|
|
168
|
+
没有 Tag 的接口会归入 `untagged`。
|
|
169
|
+
|
|
170
|
+
## 推荐调用流程
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
用户描述需要实现的功能
|
|
174
|
+
↓
|
|
175
|
+
search_api 搜索候选接口
|
|
176
|
+
↓
|
|
177
|
+
根据 summary、tag、path 选择接口
|
|
178
|
+
↓
|
|
179
|
+
get_api 一次获取请求和响应结构
|
|
180
|
+
↓
|
|
181
|
+
必要时再调用 get_schema
|
|
182
|
+
↓
|
|
183
|
+
生成 TypeScript 类型、API 方法和页面调用代码
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## 开发与测试
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
pnpm typecheck
|
|
190
|
+
pnpm test
|
|
191
|
+
pnpm build
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
当前测试覆盖:
|
|
195
|
+
|
|
196
|
+
- OpenAPI 3.0 文档加载;
|
|
197
|
+
- OpenAPI 3.1 YAML 文档加载;
|
|
198
|
+
- Swagger 2.0 文档加载;
|
|
199
|
+
- 无效文档错误处理;
|
|
200
|
+
- 中文加权搜索;
|
|
201
|
+
- Method 和 Tag 过滤;
|
|
202
|
+
- 接口请求与响应 Schema 展开;
|
|
203
|
+
- 循环引用保护;
|
|
204
|
+
- MCP 工具发现与调用。
|
|
205
|
+
|
|
206
|
+
## 当前版本边界
|
|
207
|
+
|
|
208
|
+
第一版有意保持较小的功能范围。
|
|
209
|
+
|
|
210
|
+
已经支持:
|
|
211
|
+
|
|
212
|
+
- OpenAPI 3.0、3.1;
|
|
213
|
+
- Swagger 2.0;
|
|
214
|
+
- JSON 和 YAML;
|
|
215
|
+
- 本地文件和 HTTP(S) URL;
|
|
216
|
+
- 本地 `$ref` 按需展开;
|
|
217
|
+
- stdio MCP 传输。
|
|
218
|
+
|
|
219
|
+
暂不支持:
|
|
220
|
+
|
|
221
|
+
- 调用真实后端 API;
|
|
222
|
+
- 保存或管理后端鉴权凭证;
|
|
223
|
+
- 展开其他文件或 URL 中的外部 `$ref`;
|
|
224
|
+
- 向量数据库或 Embedding 搜索;
|
|
225
|
+
- Streamable HTTP MCP 部署;
|
|
226
|
+
- OpenAPI 文档自动刷新;
|
|
227
|
+
- 模型厂商私有能力。
|
|
228
|
+
|
|
229
|
+
当 OpenAPI 文档发生变化时,重启 MCP Server 即可重新加载和建立索引。
|
|
230
|
+
|
|
231
|
+
## 设计原则
|
|
232
|
+
|
|
233
|
+
```text
|
|
234
|
+
OpenAPI / Swagger
|
|
235
|
+
↓
|
|
236
|
+
加载与校验
|
|
237
|
+
↓
|
|
238
|
+
标准 OpenAPI Document
|
|
239
|
+
↓
|
|
240
|
+
内存 Operation 索引
|
|
241
|
+
↓
|
|
242
|
+
Search + Formatter
|
|
243
|
+
↓
|
|
244
|
+
标准 MCP Tools
|
|
245
|
+
↓
|
|
246
|
+
任意支持 MCP 的 Agent 或 IDE
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
项目不会把 OpenAPI 数据重新转换成一套重复的核心模型。OpenAPI Document 始终是事实来源,自定义类型只用于搜索结果和 MCP 输出。
|
|
250
|
+
|
|
251
|
+
Formatter 也不会擅自修复后端文档中的可疑定义,而是忠实返回 OpenAPI 声明的内容,避免工具本身成为新的错误来源。
|
|
252
|
+
|
|
253
|
+
默认使用兼容校验模式。部分 Springdoc 文档会生成包含中文名称的本地 `$ref`;严格的 URI 校验器可能拒绝这类引用。只要引用目标真实存在,本项目会保留警告并继续加载。需要完全遵循严格校验结果时,可以添加 `--strict-validation`。
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
interface CliOptions {
|
|
3
|
+
source: string;
|
|
4
|
+
timeoutMs?: number;
|
|
5
|
+
headers: Record<string, string>;
|
|
6
|
+
strictValidation: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseArgs(args: string[]): CliOptions;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAMA,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAsBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA2CpD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { serveStdio } from "@modelcontextprotocol/server/stdio";
|
|
3
|
+
import { loadOpenApi } from "./openapi/loader.js";
|
|
4
|
+
import { createMcpServer } from "./mcp/server.js";
|
|
5
|
+
import { OpenApiService } from "./service.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const options = parseArgs(process.argv.slice(2));
|
|
8
|
+
const context = await loadOpenApi(options.source, {
|
|
9
|
+
...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),
|
|
10
|
+
...(Object.keys(options.headers).length ? { headers: options.headers } : {}),
|
|
11
|
+
validationMode: options.strictValidation ? "strict" : "compatible",
|
|
12
|
+
});
|
|
13
|
+
const service = new OpenApiService(context);
|
|
14
|
+
console.error(`Loaded ${context.operations.length} operations from ${context.source} (OpenAPI ${context.version})`);
|
|
15
|
+
for (const warning of context.validationWarnings) {
|
|
16
|
+
console.error(`Validation warning (${warning.count}): ${warning.message}`);
|
|
17
|
+
}
|
|
18
|
+
serveStdio(() => createMcpServer(service), {
|
|
19
|
+
onerror: (error) => console.error(error),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function parseArgs(args) {
|
|
23
|
+
let source;
|
|
24
|
+
let timeoutMs;
|
|
25
|
+
let strictValidation = false;
|
|
26
|
+
const headers = {};
|
|
27
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
28
|
+
const argument = args[index];
|
|
29
|
+
if (argument === "--source" || argument === "-s") {
|
|
30
|
+
source = requireValue(args, ++index, argument);
|
|
31
|
+
}
|
|
32
|
+
else if (argument === "--timeout") {
|
|
33
|
+
const raw = requireValue(args, ++index, argument);
|
|
34
|
+
timeoutMs = Number(raw);
|
|
35
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
36
|
+
throw new Error("--timeout must be a positive number in milliseconds");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (argument === "--header") {
|
|
40
|
+
const raw = requireValue(args, ++index, argument);
|
|
41
|
+
const separator = raw.indexOf("=");
|
|
42
|
+
if (separator <= 0)
|
|
43
|
+
throw new Error("--header must use NAME=VALUE");
|
|
44
|
+
headers[raw.slice(0, separator)] = raw.slice(separator + 1);
|
|
45
|
+
}
|
|
46
|
+
else if (argument === "--strict-validation") {
|
|
47
|
+
strictValidation = true;
|
|
48
|
+
}
|
|
49
|
+
else if (argument === "--help" || argument === "-h") {
|
|
50
|
+
printHelp();
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
else if (argument?.startsWith("-")) {
|
|
54
|
+
throw new Error(`Unknown option: ${argument}`);
|
|
55
|
+
}
|
|
56
|
+
else if (argument) {
|
|
57
|
+
if (source)
|
|
58
|
+
throw new Error("Only one OpenAPI source may be provided");
|
|
59
|
+
source = argument;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!source) {
|
|
63
|
+
throw new Error("Missing OpenAPI source. Pass --source <file-or-url>.");
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
source,
|
|
67
|
+
headers,
|
|
68
|
+
strictValidation,
|
|
69
|
+
...(timeoutMs !== undefined ? { timeoutMs } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function requireValue(args, index, option) {
|
|
73
|
+
const value = args[index];
|
|
74
|
+
if (!value)
|
|
75
|
+
throw new Error(`Missing value for ${option}`);
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
function printHelp() {
|
|
79
|
+
console.error(`Usage: openapi-docs-mcp --source <file-or-url> [options]
|
|
80
|
+
|
|
81
|
+
Options:
|
|
82
|
+
-s, --source <value> OpenAPI JSON/YAML file or HTTP(S) URL
|
|
83
|
+
--header NAME=VALUE Header used when loading a remote document (repeatable)
|
|
84
|
+
--timeout <ms> Remote loading timeout (default: 10000)
|
|
85
|
+
--strict-validation Reject every OpenAPI validation warning
|
|
86
|
+
-h, --help Show this help`);
|
|
87
|
+
}
|
|
88
|
+
main().catch((error) => {
|
|
89
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { OpenAPI } from "@scalar/openapi-types";
|
|
2
|
+
import type { JsonObject, OperationEntry, SchemaFormatOptions } from "../types.js";
|
|
3
|
+
export declare function formatOperation(document: OpenAPI.Document, entry: OperationEntry, options?: SchemaFormatOptions): JsonObject;
|
|
4
|
+
//# sourceMappingURL=operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../src/formatter/operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAInF,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,mBAAwB,GAChC,UAAU,CAyBZ"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { asObject, asString } from "../openapi/operations.js";
|
|
2
|
+
import { formatSchema, resolveLocalReference } from "./schema.js";
|
|
3
|
+
export function formatOperation(document, entry, options = {}) {
|
|
4
|
+
const operation = entry.operation;
|
|
5
|
+
const parameters = [
|
|
6
|
+
...asArray(entry.pathItem.parameters),
|
|
7
|
+
...asArray(operation.parameters),
|
|
8
|
+
].map((parameter) => formatParameter(document, parameter, options));
|
|
9
|
+
const result = {
|
|
10
|
+
id: entry.id,
|
|
11
|
+
method: entry.method.toUpperCase(),
|
|
12
|
+
path: entry.path,
|
|
13
|
+
tags: entry.tags,
|
|
14
|
+
parameters,
|
|
15
|
+
responses: formatResponses(document, operation.responses, options),
|
|
16
|
+
};
|
|
17
|
+
copyIfDefined(result, "summary", entry.summary);
|
|
18
|
+
copyIfDefined(result, "description", entry.description);
|
|
19
|
+
copyIfDefined(result, "operationId", entry.operationId);
|
|
20
|
+
copyIfDefined(result, "deprecated", operation.deprecated);
|
|
21
|
+
copyIfDefined(result, "security", operation.security);
|
|
22
|
+
const requestBody = asObject(operation.requestBody);
|
|
23
|
+
if (requestBody)
|
|
24
|
+
result.requestBody = formatRequestBody(document, requestBody, options);
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
function formatParameter(document, rawParameter, options) {
|
|
28
|
+
const parameter = asObject(rawParameter);
|
|
29
|
+
if (!parameter)
|
|
30
|
+
return rawParameter;
|
|
31
|
+
const ref = asString(parameter.$ref);
|
|
32
|
+
if (ref) {
|
|
33
|
+
const resolved = resolveLocalReference(document, ref);
|
|
34
|
+
return referenceEnvelope(ref, resolved === undefined
|
|
35
|
+
? undefined
|
|
36
|
+
: formatParameter(document, withoutSameReference(resolved, ref), options), "parameter");
|
|
37
|
+
}
|
|
38
|
+
const result = {};
|
|
39
|
+
for (const key of ["name", "in", "required", "description", "deprecated", "style", "explode"]) {
|
|
40
|
+
copyIfDefined(result, key, parameter[key]);
|
|
41
|
+
}
|
|
42
|
+
if (parameter.schema !== undefined) {
|
|
43
|
+
result.schema = formatSchema(document, parameter.schema, options);
|
|
44
|
+
}
|
|
45
|
+
if (parameter.content !== undefined) {
|
|
46
|
+
result.content = formatContent(document, parameter.content, options);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function formatRequestBody(document, requestBody, options) {
|
|
51
|
+
const ref = asString(requestBody.$ref);
|
|
52
|
+
if (ref) {
|
|
53
|
+
const resolved = resolveLocalReference(document, ref);
|
|
54
|
+
const body = asObject(withoutSameReference(resolved, ref));
|
|
55
|
+
return referenceEnvelope(ref, body ? formatRequestBody(document, body, options) : undefined, "requestBody");
|
|
56
|
+
}
|
|
57
|
+
const result = {
|
|
58
|
+
required: requestBody.required === true,
|
|
59
|
+
content: formatContent(document, requestBody.content, options),
|
|
60
|
+
};
|
|
61
|
+
copyIfDefined(result, "description", requestBody.description);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
function formatResponses(document, rawResponses, options) {
|
|
65
|
+
const responses = asObject(rawResponses);
|
|
66
|
+
if (!responses)
|
|
67
|
+
return {};
|
|
68
|
+
return Object.fromEntries(Object.entries(responses).map(([status, rawResponse]) => {
|
|
69
|
+
const response = asObject(rawResponse);
|
|
70
|
+
if (!response)
|
|
71
|
+
return [status, rawResponse];
|
|
72
|
+
const ref = asString(response.$ref);
|
|
73
|
+
if (ref) {
|
|
74
|
+
const resolved = asObject(withoutSameReference(resolveLocalReference(document, ref), ref));
|
|
75
|
+
return [
|
|
76
|
+
status,
|
|
77
|
+
referenceEnvelope(ref, resolved
|
|
78
|
+
? formatResponses(document, { resolved }, options).resolved
|
|
79
|
+
: undefined, "response"),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
const formatted = {};
|
|
83
|
+
copyIfDefined(formatted, "description", response.description);
|
|
84
|
+
if (response.headers !== undefined)
|
|
85
|
+
formatted.headers = response.headers;
|
|
86
|
+
if (response.content !== undefined) {
|
|
87
|
+
formatted.content = formatContent(document, response.content, options);
|
|
88
|
+
}
|
|
89
|
+
if (response.schema !== undefined) {
|
|
90
|
+
formatted.schema = formatSchema(document, response.schema, options);
|
|
91
|
+
}
|
|
92
|
+
return [status, formatted];
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
function formatContent(document, rawContent, options) {
|
|
96
|
+
const content = asObject(rawContent);
|
|
97
|
+
if (!content)
|
|
98
|
+
return {};
|
|
99
|
+
return Object.fromEntries(Object.entries(content).map(([mediaType, rawMedia]) => {
|
|
100
|
+
const media = asObject(rawMedia);
|
|
101
|
+
if (!media)
|
|
102
|
+
return [mediaType, rawMedia];
|
|
103
|
+
const formatted = {};
|
|
104
|
+
if (media.schema !== undefined) {
|
|
105
|
+
formatted.schema = formatSchema(document, media.schema, options);
|
|
106
|
+
}
|
|
107
|
+
copyIfDefined(formatted, "example", media.example);
|
|
108
|
+
copyIfDefined(formatted, "examples", media.examples);
|
|
109
|
+
copyIfDefined(formatted, "encoding", media.encoding);
|
|
110
|
+
return [mediaType, formatted];
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
function asArray(value) {
|
|
114
|
+
return Array.isArray(value) ? value : [];
|
|
115
|
+
}
|
|
116
|
+
function copyIfDefined(target, key, value) {
|
|
117
|
+
if (value !== undefined)
|
|
118
|
+
target[key] = value;
|
|
119
|
+
}
|
|
120
|
+
function referenceEnvelope(ref, value, key) {
|
|
121
|
+
const result = {
|
|
122
|
+
$ref: ref,
|
|
123
|
+
name: decodeURIComponent(ref.split("/").at(-1) ?? ref),
|
|
124
|
+
};
|
|
125
|
+
if (value === undefined)
|
|
126
|
+
result.unresolved = true;
|
|
127
|
+
else
|
|
128
|
+
result[key] = value;
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
function withoutSameReference(value, ref) {
|
|
132
|
+
const object = asObject(value);
|
|
133
|
+
return object?.$ref === ref ? undefined : value;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=operation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation.js","sourceRoot":"","sources":["../../src/formatter/operation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { OpenAPI } from "@scalar/openapi-types";
|
|
2
|
+
import type { SchemaFormatOptions } from "../types.js";
|
|
3
|
+
export declare function formatSchema(document: OpenAPI.Document, schema: unknown, options?: SchemaFormatOptions): unknown;
|
|
4
|
+
export declare function listSchemaNames(document: OpenAPI.Document): string[];
|
|
5
|
+
export declare function findSchema(document: OpenAPI.Document, name: string): unknown;
|
|
6
|
+
export declare function resolveLocalReference(document: OpenAPI.Document, ref: string): unknown;
|
|
7
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/formatter/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAc,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQnE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,MAAM,EAAE,OAAO,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAKT;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,EAAE,CAKpE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK5E;AAwHD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAYtF"}
|