@eventcatalog/generator-openapi 0.0.1
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.md +661 -0
- package/README.md +132 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +427 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +396 -0
- package/dist/index.mjs.map +1 -0
- package/dist/types.d.mts +56 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +43 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import utils2 from "@eventcatalog/sdk";
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import SwaggerParser2 from "@apidevtools/swagger-parser";
|
|
6
|
+
|
|
7
|
+
// src/utils/domains.ts
|
|
8
|
+
var defaultMarkdown = () => {
|
|
9
|
+
return `
|
|
10
|
+
|
|
11
|
+
## Architecture diagram
|
|
12
|
+
<NodeGraph />
|
|
13
|
+
|
|
14
|
+
`;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/utils/services.ts
|
|
18
|
+
import slugify from "slugify";
|
|
19
|
+
var defaultMarkdown2 = (document, fileName) => {
|
|
20
|
+
return `
|
|
21
|
+
|
|
22
|
+
${document.info.description ? `${document.info.description}` : ""}
|
|
23
|
+
|
|
24
|
+
## Architecture diagram
|
|
25
|
+
<NodeGraph />
|
|
26
|
+
|
|
27
|
+
## OpenAPI Specification
|
|
28
|
+
<OpenAPI file="${fileName}"/>
|
|
29
|
+
|
|
30
|
+
${document.externalDocs ? `
|
|
31
|
+
## External documentation
|
|
32
|
+
- [${document.externalDocs.description}](${document.externalDocs.url})
|
|
33
|
+
` : ""}
|
|
34
|
+
|
|
35
|
+
`;
|
|
36
|
+
};
|
|
37
|
+
var getSummary = (document) => {
|
|
38
|
+
const summary = document.info.description ? document.info.description : "";
|
|
39
|
+
return summary && summary.length < 150 ? summary : "";
|
|
40
|
+
};
|
|
41
|
+
var buildService = (pathToFile, document) => {
|
|
42
|
+
const schemaPath = pathToFile.split("/").pop() || "openapi.yml";
|
|
43
|
+
const documentTags = document.tags || [];
|
|
44
|
+
return {
|
|
45
|
+
id: slugify(document.info.title, { lower: true, strict: true }),
|
|
46
|
+
version: document.info.version,
|
|
47
|
+
name: document.info.title,
|
|
48
|
+
summary: getSummary(document),
|
|
49
|
+
schemaPath,
|
|
50
|
+
markdown: defaultMarkdown2(document, schemaPath),
|
|
51
|
+
badges: documentTags.map((tag) => ({ content: tag.name, textColor: "blue", backgroundColor: "blue" }))
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// src/utils/openapi.ts
|
|
56
|
+
import SwaggerParser from "@apidevtools/swagger-parser";
|
|
57
|
+
var DEFAULT_MESSAGE_TYPE = "query";
|
|
58
|
+
async function getSchemasByOperationId(filePath, operationId) {
|
|
59
|
+
try {
|
|
60
|
+
const api = await SwaggerParser.dereference(filePath);
|
|
61
|
+
const schemas = {
|
|
62
|
+
parameters: [],
|
|
63
|
+
requestBody: null,
|
|
64
|
+
responses: {}
|
|
65
|
+
};
|
|
66
|
+
for (const [path, pathItem] of Object.entries(api.paths)) {
|
|
67
|
+
for (const [method, operation] of Object.entries(pathItem)) {
|
|
68
|
+
const typedOperation = operation;
|
|
69
|
+
if (typedOperation.operationId === operationId) {
|
|
70
|
+
if (typedOperation.parameters) {
|
|
71
|
+
schemas.parameters = typedOperation.parameters;
|
|
72
|
+
}
|
|
73
|
+
if (typedOperation.requestBody && typedOperation.requestBody.content) {
|
|
74
|
+
const contentType = Object.keys(typedOperation.requestBody.content)[0];
|
|
75
|
+
schemas.requestBody = typedOperation.requestBody.content[contentType].schema;
|
|
76
|
+
}
|
|
77
|
+
if (typedOperation.responses) {
|
|
78
|
+
for (const [statusCode, response] of Object.entries(typedOperation.responses)) {
|
|
79
|
+
if (response.content) {
|
|
80
|
+
const contentType = Object.keys(response.content)[0];
|
|
81
|
+
schemas.responses[statusCode] = response.content[contentType].schema || response.content[contentType];
|
|
82
|
+
schemas.responses[statusCode].isSchema = !!response.content[contentType].schema;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return schemas;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`Operation with ID "${operationId}" not found.`);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error("Error parsing OpenAPI file or finding operation:", error);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function getOperationsByType(openApiPath) {
|
|
97
|
+
try {
|
|
98
|
+
const api = await SwaggerParser.validate(openApiPath);
|
|
99
|
+
const operations = [];
|
|
100
|
+
for (const path in api.paths) {
|
|
101
|
+
const pathItem = api.paths[path];
|
|
102
|
+
for (const method in pathItem) {
|
|
103
|
+
const openAPIOperation = pathItem[method];
|
|
104
|
+
const messageType = openAPIOperation["x-eventcatalog-message-type"] || DEFAULT_MESSAGE_TYPE;
|
|
105
|
+
const operation = {
|
|
106
|
+
path,
|
|
107
|
+
method: method.toUpperCase(),
|
|
108
|
+
operationId: openAPIOperation.operationId,
|
|
109
|
+
externalDocs: openAPIOperation.externalDocs,
|
|
110
|
+
type: messageType,
|
|
111
|
+
description: openAPIOperation.description,
|
|
112
|
+
summary: openAPIOperation.summary,
|
|
113
|
+
tags: openAPIOperation.tags || []
|
|
114
|
+
};
|
|
115
|
+
operations.push(operation);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return operations;
|
|
119
|
+
} catch (err) {
|
|
120
|
+
console.error("Error parsing OpenAPI document:", err);
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/utils/messages.ts
|
|
126
|
+
var markdownForParameters = (parameters) => {
|
|
127
|
+
let markdown = "### Parameters\n";
|
|
128
|
+
for (const parameter of parameters) {
|
|
129
|
+
markdown += `- **${parameter.name}** (${parameter.in})`;
|
|
130
|
+
if (parameter.required) {
|
|
131
|
+
markdown += " (required)";
|
|
132
|
+
}
|
|
133
|
+
if (parameter.description) {
|
|
134
|
+
markdown += `: ${parameter.description}`;
|
|
135
|
+
}
|
|
136
|
+
markdown += "\n";
|
|
137
|
+
}
|
|
138
|
+
return markdown;
|
|
139
|
+
};
|
|
140
|
+
var markdownForResponses = (openAPIOperation) => {
|
|
141
|
+
let markdown = "### Responses\n";
|
|
142
|
+
for (const [statusCode, content] of Object.entries(openAPIOperation.responses)) {
|
|
143
|
+
if (content.isSchema) {
|
|
144
|
+
markdown += `**${statusCode} Response**
|
|
145
|
+
<SchemaViewer file="response-${statusCode}.json" maxHeight="500" id="response-${statusCode}" />
|
|
146
|
+
`;
|
|
147
|
+
} else {
|
|
148
|
+
markdown += `**${statusCode} Response**
|
|
149
|
+
\`\`\`json
|
|
150
|
+
${JSON.stringify(content, null, 2)}
|
|
151
|
+
\`\`\`
|
|
152
|
+
`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return markdown;
|
|
156
|
+
};
|
|
157
|
+
var defaultMarkdown3 = (message, openAPIOperation = {}) => {
|
|
158
|
+
return `
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
## Architecture
|
|
162
|
+
<NodeGraph />
|
|
163
|
+
|
|
164
|
+
${message.externalDocs ? `
|
|
165
|
+
## External documentation
|
|
166
|
+
- [${message.externalDocs.description}](${message.externalDocs.url})
|
|
167
|
+
` : ""}
|
|
168
|
+
|
|
169
|
+
## ${message.method.toUpperCase()} \`(${message.path})\`
|
|
170
|
+
|
|
171
|
+
${openAPIOperation.parameters && openAPIOperation.parameters.length > 0 ? markdownForParameters(openAPIOperation.parameters) : ""}
|
|
172
|
+
|
|
173
|
+
${openAPIOperation.requestBody ? `
|
|
174
|
+
### Request Body
|
|
175
|
+
<SchemaViewer file="request-body.json" maxHeight="500" id="request-body" />
|
|
176
|
+
` : ""}
|
|
177
|
+
|
|
178
|
+
${markdownForResponses(openAPIOperation)}
|
|
179
|
+
|
|
180
|
+
`;
|
|
181
|
+
};
|
|
182
|
+
var getSummary2 = (message) => {
|
|
183
|
+
const messageSummary = message.summary ? message.summary : "";
|
|
184
|
+
const messageDescription = message.description ? message.description : "";
|
|
185
|
+
let eventCatalogMessageSummary = messageSummary;
|
|
186
|
+
if (!eventCatalogMessageSummary) {
|
|
187
|
+
eventCatalogMessageSummary = messageDescription && messageDescription.length < 150 ? messageDescription : "";
|
|
188
|
+
}
|
|
189
|
+
return eventCatalogMessageSummary;
|
|
190
|
+
};
|
|
191
|
+
var buildMessage = async (pathToFile, document, operation) => {
|
|
192
|
+
const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);
|
|
193
|
+
const operationTags = operation.tags.map((badge) => ({
|
|
194
|
+
content: `tag:${badge}`,
|
|
195
|
+
textColor: "blue",
|
|
196
|
+
backgroundColor: "blue"
|
|
197
|
+
}));
|
|
198
|
+
const badges = [{ content: operation.method.toUpperCase(), textColor: "blue", backgroundColor: "blue" }, ...operationTags];
|
|
199
|
+
return {
|
|
200
|
+
id: operation.operationId,
|
|
201
|
+
version: document.info.version,
|
|
202
|
+
name: operation.operationId,
|
|
203
|
+
summary: getSummary2(operation),
|
|
204
|
+
markdown: defaultMarkdown3(operation, requestBodiesAndResponses),
|
|
205
|
+
schemaPath: requestBodiesAndResponses?.requestBody ? "request-body.json" : "",
|
|
206
|
+
badges,
|
|
207
|
+
requestBodiesAndResponses
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// src/utils/catalog-shorthand.ts
|
|
212
|
+
import utils from "@eventcatalog/sdk";
|
|
213
|
+
var getMessageTypeUtils = (projectDirectory, messageType) => {
|
|
214
|
+
const {
|
|
215
|
+
writeEvent,
|
|
216
|
+
versionCommand,
|
|
217
|
+
getEvent,
|
|
218
|
+
getCommand,
|
|
219
|
+
rmCommandById,
|
|
220
|
+
rmEventById,
|
|
221
|
+
writeCommand,
|
|
222
|
+
addFileToCommand,
|
|
223
|
+
addFileToEvent,
|
|
224
|
+
versionEvent
|
|
225
|
+
} = utils(projectDirectory);
|
|
226
|
+
if (messageType === "event") {
|
|
227
|
+
return {
|
|
228
|
+
versionMessage: versionEvent,
|
|
229
|
+
getMessage: getEvent,
|
|
230
|
+
rmMessageById: rmEventById,
|
|
231
|
+
writeMessage: writeEvent,
|
|
232
|
+
addFileToMessage: addFileToEvent
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
versionMessage: versionCommand,
|
|
237
|
+
getMessage: getCommand,
|
|
238
|
+
rmMessageById: rmCommandById,
|
|
239
|
+
writeMessage: writeCommand,
|
|
240
|
+
addFileToMessage: addFileToCommand
|
|
241
|
+
};
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/index.ts
|
|
245
|
+
var src_default = async (_, options) => {
|
|
246
|
+
if (!process.env.PROJECT_DIR) {
|
|
247
|
+
throw new Error("Please provide catalog url (env variable PROJECT_DIR)");
|
|
248
|
+
}
|
|
249
|
+
const {
|
|
250
|
+
getDomain,
|
|
251
|
+
versionDomain,
|
|
252
|
+
writeDomain,
|
|
253
|
+
addServiceToDomain,
|
|
254
|
+
getService,
|
|
255
|
+
versionService,
|
|
256
|
+
rmService,
|
|
257
|
+
writeService,
|
|
258
|
+
addFileToService
|
|
259
|
+
} = utils2(process.env.PROJECT_DIR);
|
|
260
|
+
const openAPIFiles = Array.isArray(options.path) ? options.path : [options.path];
|
|
261
|
+
for (const path of openAPIFiles) {
|
|
262
|
+
console.log(chalk.green(`Processing ${path}`));
|
|
263
|
+
try {
|
|
264
|
+
await SwaggerParser2.validate(path);
|
|
265
|
+
} catch (error) {
|
|
266
|
+
console.error(chalk.red(`Failed to parse OpenAPI file: ${path}`));
|
|
267
|
+
console.error(chalk.red(error));
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const openAPIFile = await readFile(path, "utf-8");
|
|
271
|
+
const document = await SwaggerParser2.parse(path);
|
|
272
|
+
const version = document.info.version;
|
|
273
|
+
const service = buildService(path, document);
|
|
274
|
+
let serviceMarkdown = service.markdown;
|
|
275
|
+
if (options.domain) {
|
|
276
|
+
const { id: domainId, name: domainName, version: domainVersion } = options.domain;
|
|
277
|
+
const domain = await getDomain(options.domain.id, domainVersion || "latest");
|
|
278
|
+
const currentDomain = await getDomain(options.domain.id, "latest");
|
|
279
|
+
console.log(chalk.blue(`
|
|
280
|
+
Processing domain: ${domainName} (v${domainVersion})`));
|
|
281
|
+
if (currentDomain && currentDomain.version !== domainVersion) {
|
|
282
|
+
await versionDomain(domainId);
|
|
283
|
+
console.log(chalk.cyan(` - Versioned previous domain (v${currentDomain.version})`));
|
|
284
|
+
}
|
|
285
|
+
if (!domain || domain && domain.version !== domainVersion) {
|
|
286
|
+
await writeDomain({
|
|
287
|
+
id: domainId,
|
|
288
|
+
name: domainName,
|
|
289
|
+
version: domainVersion,
|
|
290
|
+
markdown: defaultMarkdown()
|
|
291
|
+
});
|
|
292
|
+
console.log(chalk.cyan(` - Domain (v${domainVersion}) created`));
|
|
293
|
+
}
|
|
294
|
+
if (currentDomain && currentDomain.version === domainVersion) {
|
|
295
|
+
console.log(chalk.yellow(` - Domain (v${domainVersion}) already exists, skipped creation...`));
|
|
296
|
+
}
|
|
297
|
+
await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
|
|
298
|
+
}
|
|
299
|
+
let { sends, receives } = await processMessagesForOpenAPISpec(path, document);
|
|
300
|
+
const latestServiceInCatalog = await getService(service.id, "latest");
|
|
301
|
+
console.log(chalk.blue(`Processing service: ${document.info.title} (v${version})`));
|
|
302
|
+
if (latestServiceInCatalog) {
|
|
303
|
+
serviceMarkdown = latestServiceInCatalog.markdown;
|
|
304
|
+
sends = latestServiceInCatalog.sends || [];
|
|
305
|
+
if (latestServiceInCatalog.version !== version) {
|
|
306
|
+
await versionService(service.id);
|
|
307
|
+
console.log(chalk.cyan(` - Versioned previous service (v${latestServiceInCatalog.version})`));
|
|
308
|
+
}
|
|
309
|
+
if (latestServiceInCatalog.version === version) {
|
|
310
|
+
await rmService(service.name);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
await writeService(
|
|
314
|
+
{
|
|
315
|
+
...service,
|
|
316
|
+
markdown: serviceMarkdown,
|
|
317
|
+
sends,
|
|
318
|
+
receives
|
|
319
|
+
},
|
|
320
|
+
{ path: service.name }
|
|
321
|
+
);
|
|
322
|
+
await addFileToService(
|
|
323
|
+
service.id,
|
|
324
|
+
{
|
|
325
|
+
fileName: service.schemaPath,
|
|
326
|
+
content: openAPIFile
|
|
327
|
+
},
|
|
328
|
+
version
|
|
329
|
+
);
|
|
330
|
+
console.log(chalk.cyan(` - Service (v${version}) created`));
|
|
331
|
+
console.log(chalk.green(`
|
|
332
|
+
Finished generating event catalog for OpenAPI ${service.name} (v${version})`));
|
|
333
|
+
console.log(chalk.bgBlue(`
|
|
334
|
+
You are using a free version of this plugin`));
|
|
335
|
+
console.log(chalk.blueBright(`This plugin is governed and published under the AGPL-3.0 copy-left license.
|
|
336
|
+
If using for commercial purposes or proprietary software, please contact hello@eventcatalog.dev for a license to support the project.`));
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
|
|
340
|
+
const operations = await getOperationsByType(pathToSpec);
|
|
341
|
+
const version = document.info.version;
|
|
342
|
+
let receives = [];
|
|
343
|
+
for (const operation of operations) {
|
|
344
|
+
const { requestBodiesAndResponses, ...message } = await buildMessage(pathToSpec, document, operation);
|
|
345
|
+
let messageMarkdown = message.markdown;
|
|
346
|
+
const messageType = operation.type;
|
|
347
|
+
console.log(chalk.blue(`Processing message: ${message.name} (v${version})`));
|
|
348
|
+
const { addFileToMessage, writeMessage, rmMessageById, getMessage, versionMessage } = getMessageTypeUtils(
|
|
349
|
+
process.env.PROJECT_DIR,
|
|
350
|
+
messageType
|
|
351
|
+
);
|
|
352
|
+
const catalogedMessage = await getMessage(message.id, "latest");
|
|
353
|
+
if (catalogedMessage) {
|
|
354
|
+
messageMarkdown = catalogedMessage.markdown;
|
|
355
|
+
if (catalogedMessage.version === version) {
|
|
356
|
+
await rmMessageById(message.id, version);
|
|
357
|
+
} else {
|
|
358
|
+
await versionMessage(message.id);
|
|
359
|
+
console.log(chalk.cyan(` - Versioned previous message: (v${catalogedMessage.version})`));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
await writeMessage({ ...message, markdown: messageMarkdown }, { path: message.name });
|
|
363
|
+
receives.push({
|
|
364
|
+
id: operation.operationId,
|
|
365
|
+
version: message.version
|
|
366
|
+
});
|
|
367
|
+
if (requestBodiesAndResponses?.requestBody) {
|
|
368
|
+
await addFileToMessage(
|
|
369
|
+
message.id,
|
|
370
|
+
{
|
|
371
|
+
fileName: "request-body.json",
|
|
372
|
+
content: JSON.stringify(requestBodiesAndResponses.requestBody, null, 2)
|
|
373
|
+
},
|
|
374
|
+
message.version
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
if (requestBodiesAndResponses?.responses) {
|
|
378
|
+
for (const [statusCode, schema] of Object.entries(requestBodiesAndResponses.responses)) {
|
|
379
|
+
await addFileToMessage(
|
|
380
|
+
message.id,
|
|
381
|
+
{
|
|
382
|
+
fileName: `response-${statusCode}.json`,
|
|
383
|
+
content: JSON.stringify(schema, null, 2)
|
|
384
|
+
},
|
|
385
|
+
message.version
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
console.log(chalk.cyan(` - Message (v${version}) created`));
|
|
390
|
+
}
|
|
391
|
+
return { receives, sends: [] };
|
|
392
|
+
};
|
|
393
|
+
export {
|
|
394
|
+
src_default as default
|
|
395
|
+
};
|
|
396
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/domains.ts","../src/utils/services.ts","../src/utils/openapi.ts","../src/utils/messages.ts","../src/utils/catalog-shorthand.ts"],"sourcesContent":["import utils from '@eventcatalog/sdk';\nimport { readFile } from 'node:fs/promises';\nimport chalk from 'chalk';\nimport SwaggerParser from '@apidevtools/swagger-parser';\n\nimport { defaultMarkdown as generateMarkdownForDomain } from './utils/domains';\nimport { buildService } from './utils/services';\nimport { buildMessage } from './utils/messages';\nimport { getOperationsByType } from './utils/openapi';\nimport { Domain } from './types';\nimport { getMessageTypeUtils } from './utils/catalog-shorthand';\nimport { OpenAPI } from 'openapi-types';\n\ntype Props = {\n path: string | string[];\n domain?: Domain;\n debug?: boolean;\n};\n\nexport default async (_: any, options: Props) => {\n if (!process.env.PROJECT_DIR) {\n throw new Error('Please provide catalog url (env variable PROJECT_DIR)');\n }\n\n const {\n getDomain,\n versionDomain,\n writeDomain,\n addServiceToDomain,\n getService,\n versionService,\n rmService,\n writeService,\n addFileToService,\n } = utils(process.env.PROJECT_DIR);\n\n const openAPIFiles = Array.isArray(options.path) ? options.path : [options.path];\n\n for (const path of openAPIFiles) {\n console.log(chalk.green(`Processing ${path}`));\n\n try {\n await SwaggerParser.validate(path);\n } catch (error) {\n console.error(chalk.red(`Failed to parse OpenAPI file: ${path}`));\n console.error(chalk.red(error));\n continue;\n }\n\n const openAPIFile = await readFile(path, 'utf-8');\n const document = await SwaggerParser.parse(path);\n const version = document.info.version;\n\n const service = buildService(path, document);\n let serviceMarkdown = service.markdown;\n\n // Manage domain\n if (options.domain) {\n // Try and get the domain\n const { id: domainId, name: domainName, version: domainVersion } = options.domain;\n const domain = await getDomain(options.domain.id, domainVersion || 'latest');\n const currentDomain = await getDomain(options.domain.id, 'latest');\n\n console.log(chalk.blue(`\\nProcessing domain: ${domainName} (v${domainVersion})`));\n\n // Found a domain, but the versions do not match\n if (currentDomain && currentDomain.version !== domainVersion) {\n await versionDomain(domainId);\n console.log(chalk.cyan(` - Versioned previous domain (v${currentDomain.version})`));\n }\n\n // Do we need to create a new domain?\n if (!domain || (domain && domain.version !== domainVersion)) {\n await writeDomain({\n id: domainId,\n name: domainName,\n version: domainVersion,\n markdown: generateMarkdownForDomain(),\n });\n console.log(chalk.cyan(` - Domain (v${domainVersion}) created`));\n }\n\n if (currentDomain && currentDomain.version === domainVersion) {\n console.log(chalk.yellow(` - Domain (v${domainVersion}) already exists, skipped creation...`));\n }\n\n // Add the service to the domain\n await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);\n }\n\n // Process all messages for the OpenAPI spec\n let { sends, receives } = await processMessagesForOpenAPISpec(path, document);\n\n // Check if service is already defined... if the versions do not match then create service.\n const latestServiceInCatalog = await getService(service.id, 'latest');\n console.log(chalk.blue(`Processing service: ${document.info.title} (v${version})`));\n\n if (latestServiceInCatalog) {\n serviceMarkdown = latestServiceInCatalog.markdown;\n sends = latestServiceInCatalog.sends || ([] as any);\n // Found a service, and versions do not match, we need to version the one already there\n if (latestServiceInCatalog.version !== version) {\n await versionService(service.id);\n console.log(chalk.cyan(` - Versioned previous service (v${latestServiceInCatalog.version})`));\n }\n\n // Match found, override it\n if (latestServiceInCatalog.version === version) {\n await rmService(service.name);\n }\n }\n\n await writeService(\n {\n ...service,\n markdown: serviceMarkdown,\n sends,\n receives,\n },\n { path: service.name }\n );\n\n await addFileToService(\n service.id,\n {\n fileName: service.schemaPath,\n content: openAPIFile,\n },\n version\n );\n\n console.log(chalk.cyan(` - Service (v${version}) created`));\n\n console.log(chalk.green(`\\nFinished generating event catalog for OpenAPI ${service.name} (v${version})`));\n\n console.log(chalk.bgBlue(`\\nYou are using a free version of this plugin`));\n console.log(chalk.blueBright(`This plugin is governed and published under the AGPL-3.0 copy-left license. \\nIf using for commercial purposes or proprietary software, please contact hello@eventcatalog.dev for a license to support the project.`));\n }\n};\n\nconst processMessagesForOpenAPISpec = async (pathToSpec: string, document: OpenAPI.Document) => {\n const operations = await getOperationsByType(pathToSpec);\n const version = document.info.version;\n let receives = [];\n\n // Go through all messages\n for (const operation of operations) {\n\n const { requestBodiesAndResponses, ...message } = await buildMessage(pathToSpec, document, operation);\n let messageMarkdown = message.markdown;\n const messageType = operation.type;\n\n console.log(chalk.blue(`Processing message: ${message.name} (v${version})`));\n\n const { addFileToMessage, writeMessage, rmMessageById, getMessage, versionMessage } = getMessageTypeUtils(\n process.env.PROJECT_DIR as string,\n messageType\n );\n\n // Check if the message already exists in the catalog\n const catalogedMessage = await getMessage(message.id, 'latest');\n\n if (catalogedMessage) {\n messageMarkdown = catalogedMessage.markdown;\n // if the version matches, we can override the message but keep markdown as it was\n if (catalogedMessage.version === version) {\n await rmMessageById(message.id, version);\n } else {\n // if the version does not match, we need to version the message\n await versionMessage(message.id);\n console.log(chalk.cyan(` - Versioned previous message: (v${catalogedMessage.version})`));\n }\n }\n\n // Write the message to the catalog\n await writeMessage({...message, markdown: messageMarkdown}, { path: message.name });\n\n // messages will always be messages the service receives\n receives.push({\n id: operation.operationId,\n version: message.version,\n });\n\n // Does the message have a request body or responses?\n if (requestBodiesAndResponses?.requestBody) {\n await addFileToMessage(\n message.id,\n {\n fileName: 'request-body.json',\n content: JSON.stringify(requestBodiesAndResponses.requestBody, null, 2),\n },\n message.version\n );\n }\n\n if (requestBodiesAndResponses?.responses) {\n for (const [statusCode, schema] of Object.entries(requestBodiesAndResponses.responses)) {\n await addFileToMessage(\n message.id,\n {\n fileName: `response-${statusCode}.json`,\n content: JSON.stringify(schema, null, 2),\n },\n message.version\n );\n }\n }\n\n console.log(chalk.cyan(` - Message (v${version}) created`));\n }\n return { receives, sends: [] };\n};\n","export const defaultMarkdown = () => {\n return `\n\n## Architecture diagram\n<NodeGraph />\n\n`;\n};\n","import { OpenAPI } from 'openapi-types';\nimport slugify from 'slugify';\n\nexport const defaultMarkdown = (document: OpenAPI.Document, fileName: string) => {\n return `\n\n${document.info.description ? `${document.info.description}` : ''} \n\n## Architecture diagram\n<NodeGraph />\n\n## OpenAPI Specification\n<OpenAPI file=\"${fileName}\"/>\n\n${\n document.externalDocs\n ? `\n## External documentation\n- [${document.externalDocs.description}](${document.externalDocs.url})\n`\n : ''\n}\n\n`;\n};\n\nexport const getSummary = (document: OpenAPI.Document) => {\n const summary = document.info.description ? document.info.description : '';\n return summary && summary.length < 150 ? summary : '';\n};\n\n\nexport const buildService = (pathToFile:string, document: OpenAPI.Document) => {\n const schemaPath = pathToFile.split('/').pop() || 'openapi.yml';\n const documentTags = document.tags || [];\n return {\n id: slugify(document.info.title, { lower: true, strict: true }),\n version: document.info.version,\n name: document.info.title,\n summary: getSummary(document),\n schemaPath,\n markdown: defaultMarkdown(document, schemaPath),\n badges: documentTags.map((tag) => ({ content: tag.name, textColor: 'blue', backgroundColor: 'blue' }))\n }\n};","import SwaggerParser from '@apidevtools/swagger-parser';\nimport { OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, Operation } from '../types';\nimport { OpenAPIV3_1 } from \"openapi-types\";\n\nconst DEFAULT_MESSAGE_TYPE = 'query';\n\nexport async function getSchemasByOperationId(filePath: string, operationId: string): Promise<OpenAPIOperation | undefined> {\n try {\n // Parse and resolve all references in the OpenAPI document\n const api = (await SwaggerParser.dereference(filePath)) as OpenAPIDocument;\n const schemas: {\n parameters: OpenAPIParameter[];\n requestBody: any;\n responses: { [statusCode: string]: any };\n } = {\n parameters: [],\n requestBody: null,\n responses: {},\n };\n\n // Iterate through paths and operations\n for (const [path, pathItem] of Object.entries(api.paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n // Cast operation to OpenAPIOperation type\n const typedOperation = operation as OpenAPIOperation;\n\n if (typedOperation.operationId === operationId) {\n // Extract query parameters\n if (typedOperation.parameters) {\n schemas.parameters = typedOperation.parameters;\n }\n\n // Extract request body schema\n if (typedOperation.requestBody && typedOperation.requestBody.content) {\n const contentType = Object.keys(typedOperation.requestBody.content)[0];\n schemas.requestBody = typedOperation.requestBody.content[contentType].schema;\n }\n\n // Extract response schemas\n if (typedOperation.responses) {\n for (const [statusCode, response] of Object.entries(typedOperation.responses)) {\n if (response.content) {\n const contentType = Object.keys(response.content)[0];\n schemas.responses[statusCode] = response.content[contentType].schema || response.content[contentType];\n schemas.responses[statusCode].isSchema = !!response.content[contentType].schema;\n }\n }\n }\n\n return schemas;\n }\n }\n }\n\n throw new Error(`Operation with ID \"${operationId}\" not found.`);\n } catch (error) {\n console.error('Error parsing OpenAPI file or finding operation:', error);\n return;\n }\n}\n\nexport async function getOperationsByType(openApiPath: string) {\n try {\n // Parse the OpenAPI document\n const api = await SwaggerParser.validate(openApiPath);\n\n const operations = [];\n\n // Iterate through paths\n for (const path in api.paths) {\n const pathItem = api.paths[path];\n\n // Iterate through each HTTP method in the path\n for (const method in pathItem) {\n // @ts-ignore\n const openAPIOperation = pathItem[method];\n\n // Check if the x-eventcatalog-message-type field is set\n const messageType = openAPIOperation['x-eventcatalog-message-type'] || DEFAULT_MESSAGE_TYPE;\n\n const operation = {\n path: path,\n method: method.toUpperCase(),\n operationId: openAPIOperation.operationId,\n externalDocs: openAPIOperation.externalDocs,\n type: messageType,\n description: openAPIOperation.description,\n summary: openAPIOperation.summary,\n tags: openAPIOperation.tags || [],\n } as Operation;\n\n operations.push(operation);\n }\n }\n\n return operations;\n } catch (err) {\n console.error('Error parsing OpenAPI document:', err);\n return [];\n }\n}\n","import { OpenAPI } from 'openapi-types';\nimport { getSchemasByOperationId } from './openapi';\nimport { OpenAPIOperation, OpenAPIParameter, Operation } from '../types';\n\nconst markdownForParameters = (parameters: OpenAPIParameter[]) => {\n let markdown = '### Parameters\\n';\n\n for (const parameter of parameters) {\n markdown += `- **${parameter.name}** (${parameter.in})`;\n if (parameter.required) {\n markdown += ' (required)';\n }\n if (parameter.description) {\n markdown += `: ${parameter.description}`;\n }\n markdown += '\\n';\n }\n\n return markdown;\n};\n\nexport const markdownForResponses = (openAPIOperation: OpenAPIOperation) => {\n let markdown = '### Responses\\n';\n\n for (const [statusCode, content] of Object.entries(openAPIOperation.responses as any)) {\n if (content.isSchema) {\n markdown += `**${statusCode} Response**\n<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\n `;\n } else {\n markdown += `**${statusCode} Response**\n \\`\\`\\`json\n${JSON.stringify(content, null, 2)}\n\\`\\`\\`\n `;\n }\n }\n\n return markdown;\n};\n\nexport const defaultMarkdown = (message: Operation, openAPIOperation: OpenAPIOperation = {}) => {\n return `\n\n\n## Architecture\n<NodeGraph />\n\n${\n message.externalDocs\n ? `\n## External documentation\n- [${message.externalDocs.description}](${message.externalDocs.url})\n`\n : ''\n}\n\n## ${message.method.toUpperCase()} \\`(${message.path})\\`\n\n${openAPIOperation.parameters && openAPIOperation.parameters.length > 0 ? markdownForParameters(openAPIOperation.parameters) : ''}\n\n${\n openAPIOperation.requestBody\n ? `\n### Request Body\n<SchemaViewer file=\"request-body.json\" maxHeight=\"500\" id=\"request-body\" />\n`\n : ''\n}\n\n${markdownForResponses(openAPIOperation)}\n\n`;\n};\n\nexport const getSummary = (message: Operation) => {\n const messageSummary = message.summary ? message.summary : '';\n const messageDescription = message.description ? message.description : '';\n\n let eventCatalogMessageSummary = messageSummary;\n\n if (!eventCatalogMessageSummary) {\n eventCatalogMessageSummary = messageDescription && messageDescription.length < 150 ? messageDescription : '';\n }\n\n return eventCatalogMessageSummary;\n};\n\nexport const buildMessage = async (pathToFile: string, document: OpenAPI.Document, operation: Operation) => {\n\n const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);\n\n const operationTags = operation.tags.map((badge) => ({\n content: `tag:${badge}`,\n textColor: 'blue',\n backgroundColor: 'blue',\n }));\n\n const badges = [{ content: operation.method.toUpperCase(), textColor: 'blue', backgroundColor: 'blue' }, ...operationTags];\n\n return {\n id: operation.operationId,\n version: document.info.version,\n name: operation.operationId,\n summary: getSummary(operation),\n markdown: defaultMarkdown(operation, requestBodiesAndResponses),\n schemaPath: requestBodiesAndResponses?.requestBody ? 'request-body.json' : '',\n badges,\n requestBodiesAndResponses\n };\n};","/**\n * TODO: Move this into the SDK\n */\n\nimport utils from '@eventcatalog/sdk';\n\nexport const getMessageTypeUtils = (projectDirectory: string, messageType: string) => {\n const {\n writeEvent,\n versionCommand,\n getEvent,\n getCommand,\n rmCommandById,\n rmEventById,\n writeCommand,\n addFileToCommand,\n addFileToEvent,\n versionEvent,\n } = utils(projectDirectory);\n\n if (messageType === 'event') {\n return {\n versionMessage: versionEvent,\n getMessage: getEvent,\n rmMessageById: rmEventById,\n writeMessage: writeEvent,\n addFileToMessage: addFileToEvent,\n };\n }\n\n // default command\n return {\n versionMessage: versionCommand,\n getMessage: getCommand,\n rmMessageById: rmCommandById,\n writeMessage: writeCommand,\n addFileToMessage: addFileToCommand,\n };\n \n};\n"],"mappings":"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","names":["utils","SwaggerParser","defaultMarkdown","defaultMarkdown","getSummary","utils","SwaggerParser"]}
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { OpenAPIV3_1 } from 'openapi-types';
|
|
2
|
+
|
|
3
|
+
type Domain = {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
};
|
|
8
|
+
type Operation = {
|
|
9
|
+
path: string;
|
|
10
|
+
method: string;
|
|
11
|
+
operationId: string;
|
|
12
|
+
summary?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
type: string;
|
|
15
|
+
externalDocs?: OpenAPIV3_1.ExternalDocumentationObject;
|
|
16
|
+
tags: string[];
|
|
17
|
+
};
|
|
18
|
+
interface OpenAPIParameter {
|
|
19
|
+
name: string;
|
|
20
|
+
in: string;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
schema?: any;
|
|
23
|
+
description?: string;
|
|
24
|
+
}
|
|
25
|
+
interface OpenAPIOperation {
|
|
26
|
+
operationId?: string;
|
|
27
|
+
parameters?: OpenAPIParameter[];
|
|
28
|
+
requestBody?: {
|
|
29
|
+
content?: {
|
|
30
|
+
[contentType: string]: {
|
|
31
|
+
schema: any;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
responses?: {
|
|
36
|
+
[statusCode: string]: {
|
|
37
|
+
isSchema?: boolean;
|
|
38
|
+
content?: {
|
|
39
|
+
[contentType: string]: {
|
|
40
|
+
schema: any;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface OpenAPIPathItem {
|
|
47
|
+
[method: string]: OpenAPIOperation;
|
|
48
|
+
}
|
|
49
|
+
interface OpenAPIPaths {
|
|
50
|
+
[path: string]: OpenAPIPathItem;
|
|
51
|
+
}
|
|
52
|
+
interface OpenAPIDocument {
|
|
53
|
+
paths: OpenAPIPaths;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type { Domain, OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, OpenAPIPathItem, OpenAPIPaths, Operation };
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { OpenAPIV3_1 } from 'openapi-types';
|
|
2
|
+
|
|
3
|
+
type Domain = {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
};
|
|
8
|
+
type Operation = {
|
|
9
|
+
path: string;
|
|
10
|
+
method: string;
|
|
11
|
+
operationId: string;
|
|
12
|
+
summary?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
type: string;
|
|
15
|
+
externalDocs?: OpenAPIV3_1.ExternalDocumentationObject;
|
|
16
|
+
tags: string[];
|
|
17
|
+
};
|
|
18
|
+
interface OpenAPIParameter {
|
|
19
|
+
name: string;
|
|
20
|
+
in: string;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
schema?: any;
|
|
23
|
+
description?: string;
|
|
24
|
+
}
|
|
25
|
+
interface OpenAPIOperation {
|
|
26
|
+
operationId?: string;
|
|
27
|
+
parameters?: OpenAPIParameter[];
|
|
28
|
+
requestBody?: {
|
|
29
|
+
content?: {
|
|
30
|
+
[contentType: string]: {
|
|
31
|
+
schema: any;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
responses?: {
|
|
36
|
+
[statusCode: string]: {
|
|
37
|
+
isSchema?: boolean;
|
|
38
|
+
content?: {
|
|
39
|
+
[contentType: string]: {
|
|
40
|
+
schema: any;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
interface OpenAPIPathItem {
|
|
47
|
+
[method: string]: OpenAPIOperation;
|
|
48
|
+
}
|
|
49
|
+
interface OpenAPIPaths {
|
|
50
|
+
[path: string]: OpenAPIPathItem;
|
|
51
|
+
}
|
|
52
|
+
interface OpenAPIDocument {
|
|
53
|
+
paths: OpenAPIPaths;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type { Domain, OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, OpenAPIPathItem, OpenAPIPaths, Operation };
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/types.ts
|
|
17
|
+
var types_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(types_exports);
|
|
19
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { OpenAPIV3_1 } from 'openapi-types';\n\nexport type Domain = {\n id: string;\n name: string;\n version: string;\n};\n\nexport type Operation = {\n path: string;\n method: string;\n operationId: string;\n summary?: string;\n description?: string;\n type: string;\n externalDocs?: OpenAPIV3_1.ExternalDocumentationObject;\n tags: string[];\n};\n\nexport interface OpenAPIParameter {\n name: string;\n in: string;\n required?: boolean;\n schema?: any;\n description?: string;\n}\n\nexport interface OpenAPIOperation {\n operationId?: string;\n parameters?: OpenAPIParameter[];\n requestBody?: {\n content?: {\n [contentType: string]: {\n schema: any;\n };\n };\n };\n responses?: {\n [statusCode: string]: {\n isSchema?: boolean;\n content?: {\n [contentType: string]: {\n schema: any;\n };\n };\n };\n };\n}\n\nexport interface OpenAPIPathItem {\n [method: string]: OpenAPIOperation;\n}\n\nexport interface OpenAPIPaths {\n [path: string]: OpenAPIPathItem;\n}\n\nexport interface OpenAPIDocument {\n paths: OpenAPIPaths;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
package/dist/types.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@eventcatalog/generator-openapi",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "OpenAPI generator for EventCatalog",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"keywords": [],
|
|
9
|
+
"author": "",
|
|
10
|
+
"license": "ISC",
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@types/fs-extra": "^11.0.4",
|
|
13
|
+
"@types/lodash": "^4.17.7",
|
|
14
|
+
"@types/node": "^20.16.1",
|
|
15
|
+
"prettier": "^3.3.3",
|
|
16
|
+
"tsup": "^8.1.0",
|
|
17
|
+
"typescript": "^5.5.3",
|
|
18
|
+
"vitest": "^2.0.2"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"package.json"
|
|
23
|
+
],
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"module": "./dist/index.mjs",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@apidevtools/swagger-parser": "^10.1.0",
|
|
29
|
+
"@changesets/cli": "^2.27.7",
|
|
30
|
+
"@eventcatalog/sdk": "^0.0.12",
|
|
31
|
+
"chalk": "^4",
|
|
32
|
+
"openapi-types": "^12.1.3",
|
|
33
|
+
"slugify": "^1.6.6"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"test": "vitest",
|
|
38
|
+
"format": "prettier --write .",
|
|
39
|
+
"format:diff": "prettier --list-different .",
|
|
40
|
+
"changeset": "changeset",
|
|
41
|
+
"release": "changeset publish"
|
|
42
|
+
}
|
|
43
|
+
}
|