@eventcatalog/generator-openapi 3.3.3 → 4.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/dist/index.d.mts CHANGED
@@ -7,6 +7,7 @@ type Props = {
7
7
  debug?: boolean;
8
8
  saveParsedSpecFile?: boolean;
9
9
  licenseKey?: string;
10
+ writeFilesToRoot?: boolean;
10
11
  };
11
12
  declare const _default: (_: any, options: Props) => Promise<void>;
12
13
 
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ type Props = {
7
7
  debug?: boolean;
8
8
  saveParsedSpecFile?: boolean;
9
9
  licenseKey?: string;
10
+ writeFilesToRoot?: boolean;
10
11
  };
11
12
  declare const _default: (_: any, options: Props) => Promise<void>;
12
13
 
package/dist/index.js CHANGED
@@ -188,25 +188,24 @@ var markdownForResponses = (openAPIOperation) => {
188
188
  for (const [statusCode, content] of Object.entries(openAPIOperation.responses)) {
189
189
  if (content.isSchema) {
190
190
  markdown += `**${statusCode} Response**
191
- <SchemaViewer file="response-${statusCode}.json" maxHeight="500" id="response-${statusCode}" />
192
- `;
191
+ `;
192
+ markdown += `<SchemaViewer file="response-${statusCode}.json" maxHeight="500" id="response-${statusCode}" />
193
+
194
+ `;
193
195
  } else {
194
196
  markdown += `**${statusCode} Response**
195
- \`\`\`json
197
+ `;
198
+ markdown += `\`\`\`json
196
199
  ${JSON.stringify(content, null, 2)}
197
200
  \`\`\`
198
- `;
201
+
202
+ `;
199
203
  }
200
204
  }
201
205
  return markdown;
202
206
  };
203
207
  var defaultMarkdown3 = (message, openAPIOperation = {}) => {
204
208
  return `
205
-
206
-
207
- ## Architecture
208
- <NodeGraph />
209
-
210
209
  ${message.description ? `
211
210
  ## Overview
212
211
  ${message.description}
@@ -228,6 +227,10 @@ ${openAPIOperation.requestBody ? `
228
227
 
229
228
  ${markdownForResponses(openAPIOperation)}
230
229
 
230
+ ## Architecture
231
+
232
+ <NodeGraph />
233
+
231
234
  `;
232
235
  };
233
236
  var getSummary2 = (message) => {
@@ -292,21 +295,24 @@ var getMessageTypeUtils = (projectDirectory, messageType) => {
292
295
  getMessage: getEvent,
293
296
  rmMessageById: rmEventById,
294
297
  writeMessage: writeEvent,
295
- addFileToMessage: addFileToEvent
298
+ addFileToMessage: addFileToEvent,
299
+ collection: "events"
296
300
  },
297
301
  command: {
298
302
  versionMessage: versionCommand,
299
303
  getMessage: getCommand,
300
304
  rmMessageById: rmCommandById,
301
305
  writeMessage: writeCommand,
302
- addFileToMessage: addFileToCommand
306
+ addFileToMessage: addFileToCommand,
307
+ collection: "commands"
303
308
  },
304
309
  query: {
305
310
  versionMessage: versionQuery,
306
311
  getMessage: getQuery,
307
312
  rmMessageById: rmQueryById,
308
313
  writeMessage: writeQuery,
309
- addFileToMessage: addFileToQuery
314
+ addFileToMessage: addFileToQuery,
315
+ collection: "queries"
310
316
  }
311
317
  };
312
318
  return messageTypeMap[messageType] || messageTypeMap.query;
@@ -318,7 +324,7 @@ var import_chalk = __toESM(require("chalk"));
318
324
  // package.json
319
325
  var package_default = {
320
326
  name: "@eventcatalog/generator-openapi",
321
- version: "3.3.3",
327
+ version: "4.0.1",
322
328
  description: "OpenAPI generator for EventCatalog",
323
329
  scripts: {
324
330
  build: "tsup",
@@ -403,6 +409,7 @@ You are using a trial license for this plugin`));
403
409
 
404
410
  // src/index.ts
405
411
  var import_js_yaml = __toESM(require("js-yaml"));
412
+ var import_node_path = require("path");
406
413
  var index_default = async (_, options) => {
407
414
  if (!process.env.PROJECT_DIR) {
408
415
  process.env.PROJECT_DIR = process.cwd();
@@ -438,6 +445,10 @@ var index_default = async (_, options) => {
438
445
  let serviceMarkdown = service.markdown;
439
446
  let serviceSpecificationsFiles = [];
440
447
  let serviceSpecifications = service.specifications;
448
+ let servicePath = options.domain ? (0, import_node_path.join)("../", "domains", options.domain.id, "services", service.id) : (0, import_node_path.join)("../", "services", service.id);
449
+ if (options.writeFilesToRoot) {
450
+ servicePath = service.id;
451
+ }
441
452
  if (options.domain) {
442
453
  const { id: domainId, name: domainName, version: domainVersion } = options.domain;
443
454
  const domain = await getDomain(options.domain.id, domainVersion || "latest");
@@ -462,7 +473,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
462
473
  }
463
474
  await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
464
475
  }
465
- let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document);
476
+ let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document, servicePath, options);
466
477
  let owners = [];
467
478
  let repository = null;
468
479
  const latestServiceInCatalog = await getService(service.id, "latest");
@@ -495,7 +506,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
495
506
  ...owners ? { owners } : {},
496
507
  ...repository ? { repository } : {}
497
508
  },
498
- { path: service.id, override: true }
509
+ { path: (0, import_node_path.join)(servicePath), override: true }
499
510
  );
500
511
  const specFiles = [
501
512
  // add any previous spec files to the list
@@ -518,7 +529,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
518
529
  console.log(import_chalk2.default.cyan(` - Service (v${version}) created`));
519
530
  }
520
531
  };
521
- var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
532
+ var processMessagesForOpenAPISpec = async (pathToSpec, document, servicePath, options) => {
522
533
  const operations = await getOperationsByType(pathToSpec);
523
534
  const version = document.info.version;
524
535
  let receives = [], sends = [];
@@ -528,10 +539,13 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
528
539
  const messageType = operation.type;
529
540
  const messageAction = operation.action;
530
541
  console.log(import_chalk2.default.blue(`Processing message: ${message.name} (v${message.version})`));
531
- const { addFileToMessage, writeMessage, getMessage, versionMessage } = getMessageTypeUtils(
532
- process.env.PROJECT_DIR,
533
- messageType
534
- );
542
+ const {
543
+ addFileToMessage,
544
+ writeMessage,
545
+ getMessage,
546
+ versionMessage,
547
+ collection: folder
548
+ } = getMessageTypeUtils(process.env.PROJECT_DIR, messageType);
535
549
  const catalogedMessage = await getMessage(message.id, "latest");
536
550
  if (catalogedMessage) {
537
551
  messageMarkdown = catalogedMessage.markdown;
@@ -540,7 +554,11 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
540
554
  console.log(import_chalk2.default.cyan(` - Versioned previous message: (v${catalogedMessage.version})`));
541
555
  }
542
556
  }
543
- await writeMessage({ ...message, markdown: messageMarkdown }, { path: message.id, override: true });
557
+ let messagePath = (0, import_node_path.join)(servicePath, folder, message.id);
558
+ if (options.writeFilesToRoot) {
559
+ messagePath = message.id;
560
+ }
561
+ await writeMessage({ ...message, markdown: messageMarkdown }, { path: messagePath, override: true });
544
562
  if (messageAction === "sends") {
545
563
  sends.push({
546
564
  id: message.id,
package/dist/index.js.map CHANGED
@@ -1 +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","../src/utils/checkLicense.ts","../package.json"],"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, Service } from './types';\nimport { getMessageTypeUtils } from './utils/catalog-shorthand';\nimport { OpenAPI } from 'openapi-types';\nimport checkLicense from './utils/checkLicense';\nimport yaml from 'js-yaml';\n\ntype Props = {\n services: Service[];\n domain?: Domain;\n debug?: boolean;\n saveParsedSpecFile?: boolean;\n licenseKey?: string;\n};\n\nexport default async (_: any, options: Props) => {\n if (!process.env.PROJECT_DIR) {\n process.env.PROJECT_DIR = process.cwd();\n }\n\n if (!process.env.PROJECT_DIR) {\n throw new Error('Please provide catalog url (env variable PROJECT_DIR)');\n }\n\n // Check if the license is valid\n await checkLicense(options.licenseKey);\n\n const {\n getDomain,\n versionDomain,\n writeDomain,\n addServiceToDomain,\n getService,\n versionService,\n writeService,\n addFileToService,\n getSpecificationFilesForService,\n } = utils(process.env.PROJECT_DIR);\n\n const { services = [], saveParsedSpecFile = false } = options;\n for (const serviceSpec of services) {\n console.log(chalk.green(`Processing ${serviceSpec.path}`));\n\n try {\n await SwaggerParser.validate(serviceSpec.path);\n } catch (error) {\n console.error(chalk.red(`Failed to parse OpenAPI file: ${serviceSpec.path}`));\n console.error(chalk.red(error));\n continue;\n }\n\n const document = await SwaggerParser.dereference(serviceSpec.path);\n const version = document.info.version;\n\n const service = buildService(serviceSpec, document);\n let serviceMarkdown = service.markdown;\n let serviceSpecificationsFiles = [];\n let serviceSpecifications = service.specifications;\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(serviceSpec.path, document);\n let owners = [];\n let repository = null;\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 serviceSpecificationsFiles = await getSpecificationFilesForService(service.id, 'latest');\n sends = latestServiceInCatalog.sends || ([] as any);\n owners = latestServiceInCatalog.owners || ([] as any);\n repository = latestServiceInCatalog.repository || null;\n // persist any specifications that are already in the catalog\n serviceSpecifications = {\n ...serviceSpecifications,\n ...latestServiceInCatalog.specifications,\n };\n\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 receives = latestServiceInCatalog.receives ? [...latestServiceInCatalog.receives, ...receives] : receives;\n }\n }\n\n await writeService(\n {\n ...service,\n markdown: serviceMarkdown,\n specifications: serviceSpecifications,\n sends,\n receives,\n ...(owners ? { owners } : {}),\n ...(repository ? { repository } : {}),\n },\n { path: service.id, override: true }\n );\n\n // What files need added to the service (specification files)\n const specFiles = [\n // add any previous spec files to the list\n ...serviceSpecificationsFiles,\n {\n content: saveParsedSpecFile ? getParsedSpecFile(serviceSpec, document) : await getRawSpecFile(serviceSpec),\n fileName: service.schemaPath,\n },\n ];\n\n for (const specFile of specFiles) {\n await addFileToService(\n service.id,\n {\n fileName: specFile.fileName,\n content: specFile.content,\n },\n version\n );\n }\n\n console.log(chalk.cyan(` - Service (v${version}) created`));\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 sends = [];\n\n // Go through all messages\n for (const operation of operations) {\n const { requestBodiesAndResponses, ...message } = await buildMessage(pathToSpec, document, operation);\n let messageMarkdown = message.markdown;\n const messageType = operation.type;\n const messageAction = operation.action;\n\n console.log(chalk.blue(`Processing message: ${message.name} (v${message.version})`));\n\n const { addFileToMessage, writeMessage, 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 // 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.id, override: true });\n\n // If the message send or recieved by the service?\n if (messageAction === 'sends') {\n sends.push({\n id: message.id,\n version: message.version,\n });\n } else {\n receives.push({\n id: message.id,\n version: message.version,\n });\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${message.version}) created`));\n if (!operation.operationId) {\n console.log(chalk.yellow(` - OperationId not found for ${operation.method} ${operation.path}, creating one...`));\n console.log(chalk.yellow(` - Use operationIds to give better unique names for EventCatalog`));\n }\n }\n return { receives, sends };\n};\n\nconst getParsedSpecFile = (service: Service, document: OpenAPI.Document) => {\n const isSpecFileJSON = service.path.endsWith('.json');\n return isSpecFileJSON ? JSON.stringify(document, null, 2) : yaml.dump(document, { noRefs: true });\n};\n\nconst getRawSpecFile = async (service: Service) => {\n if (service.path.startsWith('http')) {\n const file = await fetch(service.path, { method: 'GET' });\n if (!file.ok) {\n throw new Error(`Failed to fetch file: ${service.path}, status: ${file.status}`);\n }\n return await file.text();\n }\n return await readFile(service.path, 'utf8');\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';\nimport { Service } from '../types';\nimport path from 'path';\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${\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\nexport const buildService = (serviceOptions: Service, document: OpenAPI.Document) => {\n const schemaPath = path.basename(serviceOptions.path) || 'openapi.yml';\n const documentTags = document.tags || [];\n const serviceId = serviceOptions.id || slugify(document.info.title, { lower: true, strict: true });\n return {\n id: serviceId,\n version: document.info.version,\n name: document.info.title,\n summary: getSummary(document),\n schemaPath,\n specifications: {\n openapiPath: schemaPath,\n },\n markdown: defaultMarkdown(document, schemaPath),\n badges: documentTags.map((tag) => ({ content: tag.name, textColor: 'blue', backgroundColor: 'blue' })),\n };\n};\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport { OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, Operation } from '../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 const messageAction = openAPIOperation['x-eventcatalog-message-action'] === 'sends' ? 'sends' : 'receives';\n const extensions = Object.keys(openAPIOperation).reduce((acc: { [key: string]: any }, key) => {\n if (key.startsWith('x-eventcatalog-')) {\n acc[key] = openAPIOperation[key];\n }\n return acc;\n }, {});\n\n const operation = {\n path: path,\n method: method.toUpperCase(),\n operationId: openAPIOperation.operationId,\n externalDocs: openAPIOperation.externalDocs,\n type: messageType,\n action: messageAction,\n description: openAPIOperation.description,\n summary: openAPIOperation.summary,\n tags: openAPIOperation.tags || [],\n extensions,\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';\nimport slugify from 'slugify';\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.description\n ? `\n## Overview\n${message.description}\n`\n : ''\n}\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 const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);\n const extensions = operation.extensions || {};\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 const apiName = slugify(document.info.title, { lower: true });\n const path = operation.path.replace(/\\//, '').replace(/\\//g, '_');\n let uniqueIdentifier = operation.operationId || `${apiName}_${operation.method}`;\n\n if (!operation.operationId && path) {\n uniqueIdentifier = uniqueIdentifier.concat(`_${path}`);\n }\n\n return {\n id: extensions['x-eventcatalog-message-id'] || uniqueIdentifier,\n version: extensions['x-eventcatalog-message-version'] || document.info.version,\n name: extensions['x-eventcatalog-message-name'] || uniqueIdentifier,\n summary: getSummary(operation),\n markdown: defaultMarkdown(operation, requestBodiesAndResponses),\n schemaPath: requestBodiesAndResponses?.requestBody ? 'request-body.json' : '',\n badges,\n requestBodiesAndResponses,\n };\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 versionQuery,\n getQuery,\n rmQueryById,\n writeQuery,\n addFileToQuery,\n } = utils(projectDirectory);\n\n const messageTypeMap: { [key: string]: any } = {\n event: {\n versionMessage: versionEvent,\n getMessage: getEvent,\n rmMessageById: rmEventById,\n writeMessage: writeEvent,\n addFileToMessage: addFileToEvent,\n },\n command: {\n versionMessage: versionCommand,\n getMessage: getCommand,\n rmMessageById: rmCommandById,\n writeMessage: writeCommand,\n addFileToMessage: addFileToCommand,\n },\n query: {\n versionMessage: versionQuery,\n getMessage: getQuery,\n rmMessageById: rmQueryById,\n writeMessage: writeQuery,\n addFileToMessage: addFileToQuery,\n },\n };\n\n return messageTypeMap[messageType] || messageTypeMap.query;\n};\n","import chalk from 'chalk';\nimport pkg from '../../package.json';\n\ntype LicenseResponse = {\n is_trial: boolean;\n plugin: string;\n state: string;\n};\n\nexport default async (licenseKey?: string) => {\n const LICENSE_KEY = process.env.EVENTCATALOG_LICENSE_KEY_OPENAPI || licenseKey || null;\n\n if (!LICENSE_KEY) {\n console.log(chalk.bgRed(`\\nThis plugin requires a license key to use`));\n console.log(chalk.redBright(`\\nVisit https://eventcatalog.cloud/ to get a 14 day trial or purchase a license`));\n process.exit(1);\n }\n\n // Verify the license key\n const response = await fetch('https://api.eventcatalog.cloud/functions/v1/license', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${LICENSE_KEY}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.status !== 200) {\n console.log(chalk.bgRed(`\\nInvalid license key`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (response.status === 200) {\n const data = (await response.json()) as LicenseResponse;\n\n if (pkg.name !== data.plugin) {\n console.log(chalk.bgRed(`\\nInvalid license key for this plugin`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (data.is_trial) {\n console.log(chalk.bgBlue(`\\nYou are using a trial license for this plugin`));\n }\n }\n\n return Promise.resolve();\n};\n","{\n \"name\": \"@eventcatalog/generator-openapi\",\n \"version\": \"3.3.3\",\n \"description\": \"OpenAPI generator for EventCatalog\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:diff\": \"prettier --list-different .\",\n \"changeset\": \"changeset\",\n \"release\": \"changeset publish\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/lodash\": \"^4.17.7\",\n \"@types/node\": \"^20.16.1\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.5.3\",\n \"vitest\": \"^2.0.2\"\n },\n \"files\": [\n \"dist\",\n \"package.json\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"@changesets/cli\": \"^2.27.7\",\n \"@eventcatalog/sdk\": \"^1.4.8\",\n \"chalk\": \"^4\",\n \"js-yaml\": \"^4.1.0\",\n \"openapi-types\": \"^12.1.3\",\n \"slugify\": \"^1.6.6\"\n }\n}\n"],"mappings":"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","names":["import_sdk","import_chalk","import_swagger_parser","defaultMarkdown","path","slugify","SwaggerParser","path","import_slugify","defaultMarkdown","getSummary","slugify","path","utils","chalk","utils","chalk","SwaggerParser","yaml"]}
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","../src/utils/checkLicense.ts","../package.json"],"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, Service } from './types';\nimport { getMessageTypeUtils } from './utils/catalog-shorthand';\nimport { OpenAPI } from 'openapi-types';\nimport checkLicense from './utils/checkLicense';\nimport yaml from 'js-yaml';\nimport { join } from 'node:path';\ntype Props = {\n services: Service[];\n domain?: Domain;\n debug?: boolean;\n saveParsedSpecFile?: boolean;\n licenseKey?: string;\n writeFilesToRoot?: boolean;\n};\n\nexport default async (_: any, options: Props) => {\n if (!process.env.PROJECT_DIR) {\n process.env.PROJECT_DIR = process.cwd();\n }\n\n if (!process.env.PROJECT_DIR) {\n throw new Error('Please provide catalog url (env variable PROJECT_DIR)');\n }\n\n // Check if the license is valid\n await checkLicense(options.licenseKey);\n\n const {\n getDomain,\n versionDomain,\n writeDomain,\n addServiceToDomain,\n getService,\n versionService,\n writeService,\n addFileToService,\n getSpecificationFilesForService,\n } = utils(process.env.PROJECT_DIR);\n\n const { services = [], saveParsedSpecFile = false } = options;\n for (const serviceSpec of services) {\n console.log(chalk.green(`Processing ${serviceSpec.path}`));\n\n try {\n await SwaggerParser.validate(serviceSpec.path);\n } catch (error) {\n console.error(chalk.red(`Failed to parse OpenAPI file: ${serviceSpec.path}`));\n console.error(chalk.red(error));\n continue;\n }\n\n const document = await SwaggerParser.dereference(serviceSpec.path);\n const version = document.info.version;\n\n const service = buildService(serviceSpec, document);\n let serviceMarkdown = service.markdown;\n let serviceSpecificationsFiles = [];\n let serviceSpecifications = service.specifications;\n\n // Have to ../ as the SDK will put the files into hard coded folders\n let servicePath = options.domain\n ? join('../', 'domains', options.domain.id, 'services', service.id)\n : join('../', 'services', service.id);\n if (options.writeFilesToRoot) {\n servicePath = service.id;\n }\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(serviceSpec.path, document, servicePath, options);\n let owners = [];\n let repository = null;\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 serviceSpecificationsFiles = await getSpecificationFilesForService(service.id, 'latest');\n sends = latestServiceInCatalog.sends || ([] as any);\n owners = latestServiceInCatalog.owners || ([] as any);\n repository = latestServiceInCatalog.repository || null;\n // persist any specifications that are already in the catalog\n serviceSpecifications = {\n ...serviceSpecifications,\n ...latestServiceInCatalog.specifications,\n };\n\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 receives = latestServiceInCatalog.receives ? [...latestServiceInCatalog.receives, ...receives] : receives;\n }\n }\n\n await writeService(\n {\n ...service,\n markdown: serviceMarkdown,\n specifications: serviceSpecifications,\n sends,\n receives,\n ...(owners ? { owners } : {}),\n ...(repository ? { repository } : {}),\n },\n { path: join(servicePath), override: true }\n );\n\n // What files need added to the service (specification files)\n const specFiles = [\n // add any previous spec files to the list\n ...serviceSpecificationsFiles,\n {\n content: saveParsedSpecFile ? getParsedSpecFile(serviceSpec, document) : await getRawSpecFile(serviceSpec),\n fileName: service.schemaPath,\n },\n ];\n\n for (const specFile of specFiles) {\n await addFileToService(\n service.id,\n {\n fileName: specFile.fileName,\n content: specFile.content,\n },\n version\n );\n }\n\n console.log(chalk.cyan(` - Service (v${version}) created`));\n }\n};\n\nconst processMessagesForOpenAPISpec = async (\n pathToSpec: string,\n document: OpenAPI.Document,\n servicePath: string,\n options: Props\n) => {\n const operations = await getOperationsByType(pathToSpec);\n const version = document.info.version;\n let receives = [],\n sends = [];\n\n // Go through all messages\n for (const operation of operations) {\n const { requestBodiesAndResponses, ...message } = await buildMessage(pathToSpec, document, operation);\n let messageMarkdown = message.markdown;\n const messageType = operation.type;\n const messageAction = operation.action;\n\n console.log(chalk.blue(`Processing message: ${message.name} (v${message.version})`));\n\n const {\n addFileToMessage,\n writeMessage,\n getMessage,\n versionMessage,\n collection: folder,\n } = getMessageTypeUtils(process.env.PROJECT_DIR as string, messageType);\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 // 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 let messagePath = join(servicePath, folder, message.id);\n if (options.writeFilesToRoot) {\n messagePath = message.id;\n }\n\n // Write the message to the catalog\n await writeMessage({ ...message, markdown: messageMarkdown }, { path: messagePath, override: true });\n\n // If the message send or recieved by the service?\n if (messageAction === 'sends') {\n sends.push({\n id: message.id,\n version: message.version,\n });\n } else {\n receives.push({\n id: message.id,\n version: message.version,\n });\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${message.version}) created`));\n if (!operation.operationId) {\n console.log(chalk.yellow(` - OperationId not found for ${operation.method} ${operation.path}, creating one...`));\n console.log(chalk.yellow(` - Use operationIds to give better unique names for EventCatalog`));\n }\n }\n return { receives, sends };\n};\n\nconst getParsedSpecFile = (service: Service, document: OpenAPI.Document) => {\n const isSpecFileJSON = service.path.endsWith('.json');\n return isSpecFileJSON ? JSON.stringify(document, null, 2) : yaml.dump(document, { noRefs: true });\n};\n\nconst getRawSpecFile = async (service: Service) => {\n if (service.path.startsWith('http')) {\n const file = await fetch(service.path, { method: 'GET' });\n if (!file.ok) {\n throw new Error(`Failed to fetch file: ${service.path}, status: ${file.status}`);\n }\n return await file.text();\n }\n return await readFile(service.path, 'utf8');\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';\nimport { Service } from '../types';\nimport path from 'path';\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${\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\nexport const buildService = (serviceOptions: Service, document: OpenAPI.Document) => {\n const schemaPath = path.basename(serviceOptions.path) || 'openapi.yml';\n const documentTags = document.tags || [];\n const serviceId = serviceOptions.id || slugify(document.info.title, { lower: true, strict: true });\n return {\n id: serviceId,\n version: document.info.version,\n name: document.info.title,\n summary: getSummary(document),\n schemaPath,\n specifications: {\n openapiPath: schemaPath,\n },\n markdown: defaultMarkdown(document, schemaPath),\n badges: documentTags.map((tag) => ({ content: tag.name, textColor: 'blue', backgroundColor: 'blue' })),\n };\n};\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport { OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, Operation } from '../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 const messageAction = openAPIOperation['x-eventcatalog-message-action'] === 'sends' ? 'sends' : 'receives';\n const extensions = Object.keys(openAPIOperation).reduce((acc: { [key: string]: any }, key) => {\n if (key.startsWith('x-eventcatalog-')) {\n acc[key] = openAPIOperation[key];\n }\n return acc;\n }, {});\n\n const operation = {\n path: path,\n method: method.toUpperCase(),\n operationId: openAPIOperation.operationId,\n externalDocs: openAPIOperation.externalDocs,\n type: messageType,\n action: messageAction,\n description: openAPIOperation.description,\n summary: openAPIOperation.summary,\n tags: openAPIOperation.tags || [],\n extensions,\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';\nimport slugify from 'slugify';\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 // @ts-ignore\n if (content.isSchema) {\n markdown += `**${statusCode} Response**\\n`;\n markdown += `<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\\n\\n`;\n } else {\n markdown += `**${statusCode} Response**\\n`;\n markdown += `\\`\\`\\`json\\n${JSON.stringify(content, null, 2)}\\n\\`\\`\\`\\n\\n`;\n }\n }\n\n return markdown;\n};\n\nexport const defaultMarkdown = (message: Operation, openAPIOperation: OpenAPIOperation = {}) => {\n return `\n${\n message.description\n ? `\n## Overview\n${message.description}\n`\n : ''\n}\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## Architecture\n\n<NodeGraph />\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 const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);\n const extensions = operation.extensions || {};\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 const apiName = slugify(document.info.title, { lower: true });\n const path = operation.path.replace(/\\//, '').replace(/\\//g, '_');\n let uniqueIdentifier = operation.operationId || `${apiName}_${operation.method}`;\n\n if (!operation.operationId && path) {\n uniqueIdentifier = uniqueIdentifier.concat(`_${path}`);\n }\n\n return {\n id: extensions['x-eventcatalog-message-id'] || uniqueIdentifier,\n version: extensions['x-eventcatalog-message-version'] || document.info.version,\n name: extensions['x-eventcatalog-message-name'] || uniqueIdentifier,\n summary: getSummary(operation),\n markdown: defaultMarkdown(operation, requestBodiesAndResponses),\n schemaPath: requestBodiesAndResponses?.requestBody ? 'request-body.json' : '',\n badges,\n requestBodiesAndResponses,\n };\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 versionQuery,\n getQuery,\n rmQueryById,\n writeQuery,\n addFileToQuery,\n } = utils(projectDirectory);\n\n const messageTypeMap: { [key: string]: any } = {\n event: {\n versionMessage: versionEvent,\n getMessage: getEvent,\n rmMessageById: rmEventById,\n writeMessage: writeEvent,\n addFileToMessage: addFileToEvent,\n collection: 'events',\n },\n command: {\n versionMessage: versionCommand,\n getMessage: getCommand,\n rmMessageById: rmCommandById,\n writeMessage: writeCommand,\n addFileToMessage: addFileToCommand,\n collection: 'commands',\n },\n query: {\n versionMessage: versionQuery,\n getMessage: getQuery,\n rmMessageById: rmQueryById,\n writeMessage: writeQuery,\n addFileToMessage: addFileToQuery,\n collection: 'queries',\n },\n };\n\n return messageTypeMap[messageType] || messageTypeMap.query;\n};\n","import chalk from 'chalk';\nimport pkg from '../../package.json';\n\ntype LicenseResponse = {\n is_trial: boolean;\n plugin: string;\n state: string;\n};\n\nexport default async (licenseKey?: string) => {\n const LICENSE_KEY = process.env.EVENTCATALOG_LICENSE_KEY_OPENAPI || licenseKey || null;\n\n if (!LICENSE_KEY) {\n console.log(chalk.bgRed(`\\nThis plugin requires a license key to use`));\n console.log(chalk.redBright(`\\nVisit https://eventcatalog.cloud/ to get a 14 day trial or purchase a license`));\n process.exit(1);\n }\n\n // Verify the license key\n const response = await fetch('https://api.eventcatalog.cloud/functions/v1/license', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${LICENSE_KEY}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.status !== 200) {\n console.log(chalk.bgRed(`\\nInvalid license key`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (response.status === 200) {\n const data = (await response.json()) as LicenseResponse;\n\n if (pkg.name !== data.plugin) {\n console.log(chalk.bgRed(`\\nInvalid license key for this plugin`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (data.is_trial) {\n console.log(chalk.bgBlue(`\\nYou are using a trial license for this plugin`));\n }\n }\n\n return Promise.resolve();\n};\n","{\n \"name\": \"@eventcatalog/generator-openapi\",\n \"version\": \"4.0.1\",\n \"description\": \"OpenAPI generator for EventCatalog\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:diff\": \"prettier --list-different .\",\n \"changeset\": \"changeset\",\n \"release\": \"changeset publish\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/lodash\": \"^4.17.7\",\n \"@types/node\": \"^20.16.1\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.5.3\",\n \"vitest\": \"^2.0.2\"\n },\n \"files\": [\n \"dist\",\n \"package.json\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"@changesets/cli\": \"^2.27.7\",\n \"@eventcatalog/sdk\": \"^1.4.8\",\n \"chalk\": \"^4\",\n \"js-yaml\": \"^4.1.0\",\n \"openapi-types\": \"^12.1.3\",\n \"slugify\": \"^1.6.6\"\n }\n}\n"],"mappings":"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","names":["import_sdk","import_chalk","import_swagger_parser","defaultMarkdown","path","slugify","SwaggerParser","path","import_slugify","defaultMarkdown","getSummary","slugify","path","utils","chalk","utils","chalk","SwaggerParser","yaml"]}
package/dist/index.mjs CHANGED
@@ -154,25 +154,24 @@ var markdownForResponses = (openAPIOperation) => {
154
154
  for (const [statusCode, content] of Object.entries(openAPIOperation.responses)) {
155
155
  if (content.isSchema) {
156
156
  markdown += `**${statusCode} Response**
157
- <SchemaViewer file="response-${statusCode}.json" maxHeight="500" id="response-${statusCode}" />
158
- `;
157
+ `;
158
+ markdown += `<SchemaViewer file="response-${statusCode}.json" maxHeight="500" id="response-${statusCode}" />
159
+
160
+ `;
159
161
  } else {
160
162
  markdown += `**${statusCode} Response**
161
- \`\`\`json
163
+ `;
164
+ markdown += `\`\`\`json
162
165
  ${JSON.stringify(content, null, 2)}
163
166
  \`\`\`
164
- `;
167
+
168
+ `;
165
169
  }
166
170
  }
167
171
  return markdown;
168
172
  };
169
173
  var defaultMarkdown3 = (message, openAPIOperation = {}) => {
170
174
  return `
171
-
172
-
173
- ## Architecture
174
- <NodeGraph />
175
-
176
175
  ${message.description ? `
177
176
  ## Overview
178
177
  ${message.description}
@@ -194,6 +193,10 @@ ${openAPIOperation.requestBody ? `
194
193
 
195
194
  ${markdownForResponses(openAPIOperation)}
196
195
 
196
+ ## Architecture
197
+
198
+ <NodeGraph />
199
+
197
200
  `;
198
201
  };
199
202
  var getSummary2 = (message) => {
@@ -258,21 +261,24 @@ var getMessageTypeUtils = (projectDirectory, messageType) => {
258
261
  getMessage: getEvent,
259
262
  rmMessageById: rmEventById,
260
263
  writeMessage: writeEvent,
261
- addFileToMessage: addFileToEvent
264
+ addFileToMessage: addFileToEvent,
265
+ collection: "events"
262
266
  },
263
267
  command: {
264
268
  versionMessage: versionCommand,
265
269
  getMessage: getCommand,
266
270
  rmMessageById: rmCommandById,
267
271
  writeMessage: writeCommand,
268
- addFileToMessage: addFileToCommand
272
+ addFileToMessage: addFileToCommand,
273
+ collection: "commands"
269
274
  },
270
275
  query: {
271
276
  versionMessage: versionQuery,
272
277
  getMessage: getQuery,
273
278
  rmMessageById: rmQueryById,
274
279
  writeMessage: writeQuery,
275
- addFileToMessage: addFileToQuery
280
+ addFileToMessage: addFileToQuery,
281
+ collection: "queries"
276
282
  }
277
283
  };
278
284
  return messageTypeMap[messageType] || messageTypeMap.query;
@@ -284,7 +290,7 @@ import chalk from "chalk";
284
290
  // package.json
285
291
  var package_default = {
286
292
  name: "@eventcatalog/generator-openapi",
287
- version: "3.3.3",
293
+ version: "4.0.1",
288
294
  description: "OpenAPI generator for EventCatalog",
289
295
  scripts: {
290
296
  build: "tsup",
@@ -369,6 +375,7 @@ You are using a trial license for this plugin`));
369
375
 
370
376
  // src/index.ts
371
377
  import yaml from "js-yaml";
378
+ import { join } from "node:path";
372
379
  var index_default = async (_, options) => {
373
380
  if (!process.env.PROJECT_DIR) {
374
381
  process.env.PROJECT_DIR = process.cwd();
@@ -404,6 +411,10 @@ var index_default = async (_, options) => {
404
411
  let serviceMarkdown = service.markdown;
405
412
  let serviceSpecificationsFiles = [];
406
413
  let serviceSpecifications = service.specifications;
414
+ let servicePath = options.domain ? join("../", "domains", options.domain.id, "services", service.id) : join("../", "services", service.id);
415
+ if (options.writeFilesToRoot) {
416
+ servicePath = service.id;
417
+ }
407
418
  if (options.domain) {
408
419
  const { id: domainId, name: domainName, version: domainVersion } = options.domain;
409
420
  const domain = await getDomain(options.domain.id, domainVersion || "latest");
@@ -428,7 +439,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
428
439
  }
429
440
  await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
430
441
  }
431
- let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document);
442
+ let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document, servicePath, options);
432
443
  let owners = [];
433
444
  let repository = null;
434
445
  const latestServiceInCatalog = await getService(service.id, "latest");
@@ -461,7 +472,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
461
472
  ...owners ? { owners } : {},
462
473
  ...repository ? { repository } : {}
463
474
  },
464
- { path: service.id, override: true }
475
+ { path: join(servicePath), override: true }
465
476
  );
466
477
  const specFiles = [
467
478
  // add any previous spec files to the list
@@ -484,7 +495,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
484
495
  console.log(chalk2.cyan(` - Service (v${version}) created`));
485
496
  }
486
497
  };
487
- var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
498
+ var processMessagesForOpenAPISpec = async (pathToSpec, document, servicePath, options) => {
488
499
  const operations = await getOperationsByType(pathToSpec);
489
500
  const version = document.info.version;
490
501
  let receives = [], sends = [];
@@ -494,10 +505,13 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
494
505
  const messageType = operation.type;
495
506
  const messageAction = operation.action;
496
507
  console.log(chalk2.blue(`Processing message: ${message.name} (v${message.version})`));
497
- const { addFileToMessage, writeMessage, getMessage, versionMessage } = getMessageTypeUtils(
498
- process.env.PROJECT_DIR,
499
- messageType
500
- );
508
+ const {
509
+ addFileToMessage,
510
+ writeMessage,
511
+ getMessage,
512
+ versionMessage,
513
+ collection: folder
514
+ } = getMessageTypeUtils(process.env.PROJECT_DIR, messageType);
501
515
  const catalogedMessage = await getMessage(message.id, "latest");
502
516
  if (catalogedMessage) {
503
517
  messageMarkdown = catalogedMessage.markdown;
@@ -506,7 +520,11 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document) => {
506
520
  console.log(chalk2.cyan(` - Versioned previous message: (v${catalogedMessage.version})`));
507
521
  }
508
522
  }
509
- await writeMessage({ ...message, markdown: messageMarkdown }, { path: message.id, override: true });
523
+ let messagePath = join(servicePath, folder, message.id);
524
+ if (options.writeFilesToRoot) {
525
+ messagePath = message.id;
526
+ }
527
+ await writeMessage({ ...message, markdown: messageMarkdown }, { path: messagePath, override: true });
510
528
  if (messageAction === "sends") {
511
529
  sends.push({
512
530
  id: message.id,
@@ -1 +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","../src/utils/checkLicense.ts","../package.json"],"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, Service } from './types';\nimport { getMessageTypeUtils } from './utils/catalog-shorthand';\nimport { OpenAPI } from 'openapi-types';\nimport checkLicense from './utils/checkLicense';\nimport yaml from 'js-yaml';\n\ntype Props = {\n services: Service[];\n domain?: Domain;\n debug?: boolean;\n saveParsedSpecFile?: boolean;\n licenseKey?: string;\n};\n\nexport default async (_: any, options: Props) => {\n if (!process.env.PROJECT_DIR) {\n process.env.PROJECT_DIR = process.cwd();\n }\n\n if (!process.env.PROJECT_DIR) {\n throw new Error('Please provide catalog url (env variable PROJECT_DIR)');\n }\n\n // Check if the license is valid\n await checkLicense(options.licenseKey);\n\n const {\n getDomain,\n versionDomain,\n writeDomain,\n addServiceToDomain,\n getService,\n versionService,\n writeService,\n addFileToService,\n getSpecificationFilesForService,\n } = utils(process.env.PROJECT_DIR);\n\n const { services = [], saveParsedSpecFile = false } = options;\n for (const serviceSpec of services) {\n console.log(chalk.green(`Processing ${serviceSpec.path}`));\n\n try {\n await SwaggerParser.validate(serviceSpec.path);\n } catch (error) {\n console.error(chalk.red(`Failed to parse OpenAPI file: ${serviceSpec.path}`));\n console.error(chalk.red(error));\n continue;\n }\n\n const document = await SwaggerParser.dereference(serviceSpec.path);\n const version = document.info.version;\n\n const service = buildService(serviceSpec, document);\n let serviceMarkdown = service.markdown;\n let serviceSpecificationsFiles = [];\n let serviceSpecifications = service.specifications;\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(serviceSpec.path, document);\n let owners = [];\n let repository = null;\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 serviceSpecificationsFiles = await getSpecificationFilesForService(service.id, 'latest');\n sends = latestServiceInCatalog.sends || ([] as any);\n owners = latestServiceInCatalog.owners || ([] as any);\n repository = latestServiceInCatalog.repository || null;\n // persist any specifications that are already in the catalog\n serviceSpecifications = {\n ...serviceSpecifications,\n ...latestServiceInCatalog.specifications,\n };\n\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 receives = latestServiceInCatalog.receives ? [...latestServiceInCatalog.receives, ...receives] : receives;\n }\n }\n\n await writeService(\n {\n ...service,\n markdown: serviceMarkdown,\n specifications: serviceSpecifications,\n sends,\n receives,\n ...(owners ? { owners } : {}),\n ...(repository ? { repository } : {}),\n },\n { path: service.id, override: true }\n );\n\n // What files need added to the service (specification files)\n const specFiles = [\n // add any previous spec files to the list\n ...serviceSpecificationsFiles,\n {\n content: saveParsedSpecFile ? getParsedSpecFile(serviceSpec, document) : await getRawSpecFile(serviceSpec),\n fileName: service.schemaPath,\n },\n ];\n\n for (const specFile of specFiles) {\n await addFileToService(\n service.id,\n {\n fileName: specFile.fileName,\n content: specFile.content,\n },\n version\n );\n }\n\n console.log(chalk.cyan(` - Service (v${version}) created`));\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 sends = [];\n\n // Go through all messages\n for (const operation of operations) {\n const { requestBodiesAndResponses, ...message } = await buildMessage(pathToSpec, document, operation);\n let messageMarkdown = message.markdown;\n const messageType = operation.type;\n const messageAction = operation.action;\n\n console.log(chalk.blue(`Processing message: ${message.name} (v${message.version})`));\n\n const { addFileToMessage, writeMessage, 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 // 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.id, override: true });\n\n // If the message send or recieved by the service?\n if (messageAction === 'sends') {\n sends.push({\n id: message.id,\n version: message.version,\n });\n } else {\n receives.push({\n id: message.id,\n version: message.version,\n });\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${message.version}) created`));\n if (!operation.operationId) {\n console.log(chalk.yellow(` - OperationId not found for ${operation.method} ${operation.path}, creating one...`));\n console.log(chalk.yellow(` - Use operationIds to give better unique names for EventCatalog`));\n }\n }\n return { receives, sends };\n};\n\nconst getParsedSpecFile = (service: Service, document: OpenAPI.Document) => {\n const isSpecFileJSON = service.path.endsWith('.json');\n return isSpecFileJSON ? JSON.stringify(document, null, 2) : yaml.dump(document, { noRefs: true });\n};\n\nconst getRawSpecFile = async (service: Service) => {\n if (service.path.startsWith('http')) {\n const file = await fetch(service.path, { method: 'GET' });\n if (!file.ok) {\n throw new Error(`Failed to fetch file: ${service.path}, status: ${file.status}`);\n }\n return await file.text();\n }\n return await readFile(service.path, 'utf8');\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';\nimport { Service } from '../types';\nimport path from 'path';\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${\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\nexport const buildService = (serviceOptions: Service, document: OpenAPI.Document) => {\n const schemaPath = path.basename(serviceOptions.path) || 'openapi.yml';\n const documentTags = document.tags || [];\n const serviceId = serviceOptions.id || slugify(document.info.title, { lower: true, strict: true });\n return {\n id: serviceId,\n version: document.info.version,\n name: document.info.title,\n summary: getSummary(document),\n schemaPath,\n specifications: {\n openapiPath: schemaPath,\n },\n markdown: defaultMarkdown(document, schemaPath),\n badges: documentTags.map((tag) => ({ content: tag.name, textColor: 'blue', backgroundColor: 'blue' })),\n };\n};\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport { OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, Operation } from '../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 const messageAction = openAPIOperation['x-eventcatalog-message-action'] === 'sends' ? 'sends' : 'receives';\n const extensions = Object.keys(openAPIOperation).reduce((acc: { [key: string]: any }, key) => {\n if (key.startsWith('x-eventcatalog-')) {\n acc[key] = openAPIOperation[key];\n }\n return acc;\n }, {});\n\n const operation = {\n path: path,\n method: method.toUpperCase(),\n operationId: openAPIOperation.operationId,\n externalDocs: openAPIOperation.externalDocs,\n type: messageType,\n action: messageAction,\n description: openAPIOperation.description,\n summary: openAPIOperation.summary,\n tags: openAPIOperation.tags || [],\n extensions,\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';\nimport slugify from 'slugify';\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.description\n ? `\n## Overview\n${message.description}\n`\n : ''\n}\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 const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);\n const extensions = operation.extensions || {};\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 const apiName = slugify(document.info.title, { lower: true });\n const path = operation.path.replace(/\\//, '').replace(/\\//g, '_');\n let uniqueIdentifier = operation.operationId || `${apiName}_${operation.method}`;\n\n if (!operation.operationId && path) {\n uniqueIdentifier = uniqueIdentifier.concat(`_${path}`);\n }\n\n return {\n id: extensions['x-eventcatalog-message-id'] || uniqueIdentifier,\n version: extensions['x-eventcatalog-message-version'] || document.info.version,\n name: extensions['x-eventcatalog-message-name'] || uniqueIdentifier,\n summary: getSummary(operation),\n markdown: defaultMarkdown(operation, requestBodiesAndResponses),\n schemaPath: requestBodiesAndResponses?.requestBody ? 'request-body.json' : '',\n badges,\n requestBodiesAndResponses,\n };\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 versionQuery,\n getQuery,\n rmQueryById,\n writeQuery,\n addFileToQuery,\n } = utils(projectDirectory);\n\n const messageTypeMap: { [key: string]: any } = {\n event: {\n versionMessage: versionEvent,\n getMessage: getEvent,\n rmMessageById: rmEventById,\n writeMessage: writeEvent,\n addFileToMessage: addFileToEvent,\n },\n command: {\n versionMessage: versionCommand,\n getMessage: getCommand,\n rmMessageById: rmCommandById,\n writeMessage: writeCommand,\n addFileToMessage: addFileToCommand,\n },\n query: {\n versionMessage: versionQuery,\n getMessage: getQuery,\n rmMessageById: rmQueryById,\n writeMessage: writeQuery,\n addFileToMessage: addFileToQuery,\n },\n };\n\n return messageTypeMap[messageType] || messageTypeMap.query;\n};\n","import chalk from 'chalk';\nimport pkg from '../../package.json';\n\ntype LicenseResponse = {\n is_trial: boolean;\n plugin: string;\n state: string;\n};\n\nexport default async (licenseKey?: string) => {\n const LICENSE_KEY = process.env.EVENTCATALOG_LICENSE_KEY_OPENAPI || licenseKey || null;\n\n if (!LICENSE_KEY) {\n console.log(chalk.bgRed(`\\nThis plugin requires a license key to use`));\n console.log(chalk.redBright(`\\nVisit https://eventcatalog.cloud/ to get a 14 day trial or purchase a license`));\n process.exit(1);\n }\n\n // Verify the license key\n const response = await fetch('https://api.eventcatalog.cloud/functions/v1/license', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${LICENSE_KEY}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.status !== 200) {\n console.log(chalk.bgRed(`\\nInvalid license key`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (response.status === 200) {\n const data = (await response.json()) as LicenseResponse;\n\n if (pkg.name !== data.plugin) {\n console.log(chalk.bgRed(`\\nInvalid license key for this plugin`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (data.is_trial) {\n console.log(chalk.bgBlue(`\\nYou are using a trial license for this plugin`));\n }\n }\n\n return Promise.resolve();\n};\n","{\n \"name\": \"@eventcatalog/generator-openapi\",\n \"version\": \"3.3.3\",\n \"description\": \"OpenAPI generator for EventCatalog\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:diff\": \"prettier --list-different .\",\n \"changeset\": \"changeset\",\n \"release\": \"changeset publish\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/lodash\": \"^4.17.7\",\n \"@types/node\": \"^20.16.1\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.5.3\",\n \"vitest\": \"^2.0.2\"\n },\n \"files\": [\n \"dist\",\n \"package.json\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"@changesets/cli\": \"^2.27.7\",\n \"@eventcatalog/sdk\": \"^1.4.8\",\n \"chalk\": \"^4\",\n \"js-yaml\": \"^4.1.0\",\n \"openapi-types\": \"^12.1.3\",\n \"slugify\": \"^1.6.6\"\n }\n}\n"],"mappings":";AAAA,OAAOA,YAAW;AAClB,SAAS,gBAAgB;AACzB,OAAOC,YAAW;AAClB,OAAOC,oBAAmB;;;ACHnB,IAAM,kBAAkB,MAAM;AACnC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMT;;;ACNA,OAAO,aAAa;AAEpB,OAAO,UAAU;AAEV,IAAMC,mBAAkB,CAAC,UAA4B,aAAqB;AAC/E,SAAO;AAAA;AAAA,EAEP,SAAS,KAAK,cAAc,GAAG,SAAS,KAAK,WAAW,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/D,SAAS,eACL;AAAA;AAAA,KAED,SAAS,aAAa,WAAW,KAAK,SAAS,aAAa,GAAG;AAAA,IAE9D,EACN;AAAA;AAAA;AAGA;AAEO,IAAM,aAAa,CAAC,aAA+B;AACxD,QAAM,UAAU,SAAS,KAAK,cAAc,SAAS,KAAK,cAAc;AACxE,SAAO,WAAW,QAAQ,SAAS,MAAM,UAAU;AACrD;AAEO,IAAM,eAAe,CAAC,gBAAyB,aAA+B;AACnF,QAAM,aAAa,KAAK,SAAS,eAAe,IAAI,KAAK;AACzD,QAAM,eAAe,SAAS,QAAQ,CAAC;AACvC,QAAM,YAAY,eAAe,MAAM,QAAQ,SAAS,KAAK,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC;AACjG,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,SAAS,KAAK;AAAA,IACvB,MAAM,SAAS,KAAK;AAAA,IACpB,SAAS,WAAW,QAAQ;AAAA,IAC5B;AAAA,IACA,gBAAgB;AAAA,MACd,aAAa;AAAA,IACf;AAAA,IACA,UAAUA,iBAAgB,UAAU,UAAU;AAAA,IAC9C,QAAQ,aAAa,IAAI,CAAC,SAAS,EAAE,SAAS,IAAI,MAAM,WAAW,QAAQ,iBAAiB,OAAO,EAAE;AAAA,EACvG;AACF;;;AC9CA,OAAO,mBAAmB;AAG1B,IAAM,uBAAuB;AAE7B,eAAsB,wBAAwB,UAAkB,aAA4D;AAC1H,MAAI;AAEF,UAAM,MAAO,MAAM,cAAc,YAAY,QAAQ;AACrD,UAAM,UAIF;AAAA,MACF,YAAY,CAAC;AAAA,MACb,aAAa;AAAA,MACb,WAAW,CAAC;AAAA,IACd;AAGA,eAAW,CAACC,OAAM,QAAQ,KAAK,OAAO,QAAQ,IAAI,KAAK,GAAG;AACxD,iBAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAE1D,cAAM,iBAAiB;AAEvB,YAAI,eAAe,gBAAgB,aAAa;AAE9C,cAAI,eAAe,YAAY;AAC7B,oBAAQ,aAAa,eAAe;AAAA,UACtC;AAGA,cAAI,eAAe,eAAe,eAAe,YAAY,SAAS;AACpE,kBAAM,cAAc,OAAO,KAAK,eAAe,YAAY,OAAO,EAAE,CAAC;AACrE,oBAAQ,cAAc,eAAe,YAAY,QAAQ,WAAW,EAAE;AAAA,UACxE;AAGA,cAAI,eAAe,WAAW;AAC5B,uBAAW,CAAC,YAAY,QAAQ,KAAK,OAAO,QAAQ,eAAe,SAAS,GAAG;AAC7E,kBAAI,SAAS,SAAS;AACpB,sBAAM,cAAc,OAAO,KAAK,SAAS,OAAO,EAAE,CAAC;AACnD,wBAAQ,UAAU,UAAU,IAAI,SAAS,QAAQ,WAAW,EAAE,UAAU,SAAS,QAAQ,WAAW;AACpG,wBAAQ,UAAU,UAAU,EAAE,WAAW,CAAC,CAAC,SAAS,QAAQ,WAAW,EAAE;AAAA,cAC3E;AAAA,YACF;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,sBAAsB,WAAW,cAAc;AAAA,EACjE,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AACvE;AAAA,EACF;AACF;AAEA,eAAsB,oBAAoB,aAAqB;AAC7D,MAAI;AAEF,UAAM,MAAM,MAAM,cAAc,SAAS,WAAW;AAEpD,UAAM,aAAa,CAAC;AAGpB,eAAWA,SAAQ,IAAI,OAAO;AAC5B,YAAM,WAAW,IAAI,MAAMA,KAAI;AAG/B,iBAAW,UAAU,UAAU;AAE7B,cAAM,mBAAmB,SAAS,MAAM;AAGxC,cAAM,cAAc,iBAAiB,6BAA6B,KAAK;AACvE,cAAM,gBAAgB,iBAAiB,+BAA+B,MAAM,UAAU,UAAU;AAChG,cAAM,aAAa,OAAO,KAAK,gBAAgB,EAAE,OAAO,CAAC,KAA6B,QAAQ;AAC5F,cAAI,IAAI,WAAW,iBAAiB,GAAG;AACrC,gBAAI,GAAG,IAAI,iBAAiB,GAAG;AAAA,UACjC;AACA,iBAAO;AAAA,QACT,GAAG,CAAC,CAAC;AAEL,cAAM,YAAY;AAAA,UAChB,MAAMA;AAAA,UACN,QAAQ,OAAO,YAAY;AAAA,UAC3B,aAAa,iBAAiB;AAAA,UAC9B,cAAc,iBAAiB;AAAA,UAC/B,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,aAAa,iBAAiB;AAAA,UAC9B,SAAS,iBAAiB;AAAA,UAC1B,MAAM,iBAAiB,QAAQ,CAAC;AAAA,UAChC;AAAA,QACF;AAEA,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,YAAQ,MAAM,mCAAmC,GAAG;AACpD,WAAO,CAAC;AAAA,EACV;AACF;;;ACzGA,OAAOC,cAAa;AAEpB,IAAM,wBAAwB,CAAC,eAAmC;AAChE,MAAI,WAAW;AAEf,aAAW,aAAa,YAAY;AAClC,gBAAY,OAAO,UAAU,IAAI,OAAO,UAAU,EAAE;AACpD,QAAI,UAAU,UAAU;AACtB,kBAAY;AAAA,IACd;AACA,QAAI,UAAU,aAAa;AACzB,kBAAY,KAAK,UAAU,WAAW;AAAA,IACxC;AACA,gBAAY;AAAA,EACd;AAEA,SAAO;AACT;AAEO,IAAM,uBAAuB,CAAC,qBAAuC;AAC1E,MAAI,WAAW;AAEf,aAAW,CAAC,YAAY,OAAO,KAAK,OAAO,QAAQ,iBAAiB,SAAgB,GAAG;AACrF,QAAI,QAAQ,UAAU;AACpB,kBAAY,KAAK,UAAU;AAAA,+BACF,UAAU,uCAAuC,UAAU;AAAA;AAAA,IAEtF,OAAO;AACL,kBAAY,KAAK,UAAU;AAAA;AAAA,EAE/B,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,IAG9B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAMC,mBAAkB,CAAC,SAAoB,mBAAqC,CAAC,MAAM;AAC9F,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOP,QAAQ,cACJ;AAAA;AAAA,EAEJ,QAAQ,WAAW;AAAA,IAEf,EACN;AAAA;AAAA,EAGE,QAAQ,eACJ;AAAA;AAAA,KAED,QAAQ,aAAa,WAAW,KAAK,QAAQ,aAAa,GAAG;AAAA,IAE5D,EACN;AAAA;AAAA,KAEK,QAAQ,OAAO,YAAY,CAAC,OAAO,QAAQ,IAAI;AAAA;AAAA,EAElD,iBAAiB,cAAc,iBAAiB,WAAW,SAAS,IAAI,sBAAsB,iBAAiB,UAAU,IAAI,EAAE;AAAA;AAAA,EAG/H,iBAAiB,cACb;AAAA;AAAA;AAAA,IAIA,EACN;AAAA;AAAA,EAEE,qBAAqB,gBAAgB,CAAC;AAAA;AAAA;AAGxC;AAEO,IAAMC,cAAa,CAAC,YAAuB;AAChD,QAAM,iBAAiB,QAAQ,UAAU,QAAQ,UAAU;AAC3D,QAAM,qBAAqB,QAAQ,cAAc,QAAQ,cAAc;AAEvE,MAAI,6BAA6B;AAEjC,MAAI,CAAC,4BAA4B;AAC/B,iCAA6B,sBAAsB,mBAAmB,SAAS,MAAM,qBAAqB;AAAA,EAC5G;AAEA,SAAO;AACT;AAEO,IAAM,eAAe,OAAO,YAAoB,UAA4B,cAAyB;AAC1G,QAAM,4BAA4B,MAAM,wBAAwB,YAAY,UAAU,WAAW;AACjG,QAAM,aAAa,UAAU,cAAc,CAAC;AAE5C,QAAM,gBAAgB,UAAU,KAAK,IAAI,CAAC,WAAW;AAAA,IACnD,SAAS,OAAO,KAAK;AAAA,IACrB,WAAW;AAAA,IACX,iBAAiB;AAAA,EACnB,EAAE;AAEF,QAAM,SAAS,CAAC,EAAE,SAAS,UAAU,OAAO,YAAY,GAAG,WAAW,QAAQ,iBAAiB,OAAO,GAAG,GAAG,aAAa;AAEzH,QAAM,UAAUF,SAAQ,SAAS,KAAK,OAAO,EAAE,OAAO,KAAK,CAAC;AAC5D,QAAMG,QAAO,UAAU,KAAK,QAAQ,MAAM,EAAE,EAAE,QAAQ,OAAO,GAAG;AAChE,MAAI,mBAAmB,UAAU,eAAe,GAAG,OAAO,IAAI,UAAU,MAAM;AAE9E,MAAI,CAAC,UAAU,eAAeA,OAAM;AAClC,uBAAmB,iBAAiB,OAAO,IAAIA,KAAI,EAAE;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,IAAI,WAAW,2BAA2B,KAAK;AAAA,IAC/C,SAAS,WAAW,gCAAgC,KAAK,SAAS,KAAK;AAAA,IACvE,MAAM,WAAW,6BAA6B,KAAK;AAAA,IACnD,SAASD,YAAW,SAAS;AAAA,IAC7B,UAAUD,iBAAgB,WAAW,yBAAyB;AAAA,IAC9D,YAAY,2BAA2B,cAAc,sBAAsB;AAAA,IAC3E;AAAA,IACA;AAAA,EACF;AACF;;;AC5HA,OAAO,WAAW;AAEX,IAAM,sBAAsB,CAAC,kBAA0B,gBAAwB;AACpF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,MAAM,gBAAgB;AAE1B,QAAM,iBAAyC;AAAA,IAC7C,OAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,IACpB;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,IACpB;AAAA,IACA,OAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,eAAe,WAAW,KAAK,eAAe;AACvD;;;AClDA,OAAO,WAAW;;;ACAlB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,SAAW;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,eAAe;AAAA,IACf,WAAa;AAAA,IACb,SAAW;AAAA,EACb;AAAA,EACA,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,UAAY,CAAC;AAAA,EACb,QAAU;AAAA,EACV,SAAW;AAAA,EACX,iBAAmB;AAAA,IACjB,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,OAAS;AAAA,EACT,cAAgB;AAAA,IACd,+BAA+B;AAAA,IAC/B,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,OAAS;AAAA,IACT,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,SAAW;AAAA,EACb;AACF;;;ADnCA,IAAO,uBAAQ,OAAO,eAAwB;AAC5C,QAAM,cAAc,QAAQ,IAAI,oCAAoC,cAAc;AAElF,MAAI,CAAC,aAAa;AAChB,YAAQ,IAAI,MAAM,MAAM;AAAA,0CAA6C,CAAC;AACtE,YAAQ,IAAI,MAAM,UAAU;AAAA,8EAAiF,CAAC;AAC9G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,WAAW,MAAM,MAAM,uDAAuD;AAAA,IAClF,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,WAAW;AAAA,MACpC,gBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,MAAI,SAAS,WAAW,KAAK;AAC3B,YAAQ,IAAI,MAAM,MAAM;AAAA,oBAAuB,CAAC;AAChD,YAAQ,IAAI,MAAM,UAAU,2FAA2F,CAAC;AACxH,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,QAAI,gBAAI,SAAS,KAAK,QAAQ;AAC5B,cAAQ,IAAI,MAAM,MAAM;AAAA,oCAAuC,CAAC;AAChE,cAAQ,IAAI,MAAM,UAAU,2FAA2F,CAAC;AACxH,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,KAAK,UAAU;AACjB,cAAQ,IAAI,MAAM,OAAO;AAAA,8CAAiD,CAAC;AAAA,IAC7E;AAAA,EACF;AAEA,SAAO,QAAQ,QAAQ;AACzB;;;ANnCA,OAAO,UAAU;AAUjB,IAAO,gBAAQ,OAAO,GAAQ,YAAmB;AAC/C,MAAI,CAAC,QAAQ,IAAI,aAAa;AAC5B,YAAQ,IAAI,cAAc,QAAQ,IAAI;AAAA,EACxC;AAEA,MAAI,CAAC,QAAQ,IAAI,aAAa;AAC5B,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAGA,QAAM,qBAAa,QAAQ,UAAU;AAErC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAIG,OAAM,QAAQ,IAAI,WAAW;AAEjC,QAAM,EAAE,WAAW,CAAC,GAAG,qBAAqB,MAAM,IAAI;AACtD,aAAW,eAAe,UAAU;AAClC,YAAQ,IAAIC,OAAM,MAAM,cAAc,YAAY,IAAI,EAAE,CAAC;AAEzD,QAAI;AACF,YAAMC,eAAc,SAAS,YAAY,IAAI;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAMD,OAAM,IAAI,iCAAiC,YAAY,IAAI,EAAE,CAAC;AAC5E,cAAQ,MAAMA,OAAM,IAAI,KAAK,CAAC;AAC9B;AAAA,IACF;AAEA,UAAM,WAAW,MAAMC,eAAc,YAAY,YAAY,IAAI;AACjE,UAAM,UAAU,SAAS,KAAK;AAE9B,UAAM,UAAU,aAAa,aAAa,QAAQ;AAClD,QAAI,kBAAkB,QAAQ;AAC9B,QAAI,6BAA6B,CAAC;AAClC,QAAI,wBAAwB,QAAQ;AAGpC,QAAI,QAAQ,QAAQ;AAElB,YAAM,EAAE,IAAI,UAAU,MAAM,YAAY,SAAS,cAAc,IAAI,QAAQ;AAC3E,YAAM,SAAS,MAAM,UAAU,QAAQ,OAAO,IAAI,iBAAiB,QAAQ;AAC3E,YAAM,gBAAgB,MAAM,UAAU,QAAQ,OAAO,IAAI,QAAQ;AAEjE,cAAQ,IAAID,OAAM,KAAK;AAAA,qBAAwB,UAAU,MAAM,aAAa,GAAG,CAAC;AAGhF,UAAI,iBAAiB,cAAc,YAAY,eAAe;AAC5D,cAAM,cAAc,QAAQ;AAC5B,gBAAQ,IAAIA,OAAM,KAAK,kCAAkC,cAAc,OAAO,GAAG,CAAC;AAAA,MACpF;AAGA,UAAI,CAAC,UAAW,UAAU,OAAO,YAAY,eAAgB;AAC3D,cAAM,YAAY;AAAA,UAChB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,UAAU,gBAA0B;AAAA,QACtC,CAAC;AACD,gBAAQ,IAAIA,OAAM,KAAK,eAAe,aAAa,WAAW,CAAC;AAAA,MACjE;AAEA,UAAI,iBAAiB,cAAc,YAAY,eAAe;AAC5D,gBAAQ,IAAIA,OAAM,OAAO,eAAe,aAAa,uCAAuC,CAAC;AAAA,MAC/F;AAGA,YAAM,mBAAmB,UAAU,EAAE,IAAI,QAAQ,IAAI,SAAS,QAAQ,QAAQ,GAAG,aAAa;AAAA,IAChG;AAGA,QAAI,EAAE,OAAO,SAAS,IAAI,MAAM,8BAA8B,YAAY,MAAM,QAAQ;AACxF,QAAI,SAAS,CAAC;AACd,QAAI,aAAa;AAGjB,UAAM,yBAAyB,MAAM,WAAW,QAAQ,IAAI,QAAQ;AACpE,YAAQ,IAAIA,OAAM,KAAK,uBAAuB,SAAS,KAAK,KAAK,MAAM,OAAO,GAAG,CAAC;AAElF,QAAI,wBAAwB;AAC1B,wBAAkB,uBAAuB;AACzC,mCAA6B,MAAM,gCAAgC,QAAQ,IAAI,QAAQ;AACvF,cAAQ,uBAAuB,SAAU,CAAC;AAC1C,eAAS,uBAAuB,UAAW,CAAC;AAC5C,mBAAa,uBAAuB,cAAc;AAElD,8BAAwB;AAAA,QACtB,GAAG;AAAA,QACH,GAAG,uBAAuB;AAAA,MAC5B;AAGA,UAAI,uBAAuB,YAAY,SAAS;AAC9C,cAAM,eAAe,QAAQ,EAAE;AAC/B,gBAAQ,IAAIA,OAAM,KAAK,mCAAmC,uBAAuB,OAAO,GAAG,CAAC;AAAA,MAC9F;AAGA,UAAI,uBAAuB,YAAY,SAAS;AAC9C,mBAAW,uBAAuB,WAAW,CAAC,GAAG,uBAAuB,UAAU,GAAG,QAAQ,IAAI;AAAA,MACnG;AAAA,IACF;AAEA,UAAM;AAAA,MACJ;AAAA,QACE,GAAG;AAAA,QACH,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,QAC3B,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACrC;AAAA,MACA,EAAE,MAAM,QAAQ,IAAI,UAAU,KAAK;AAAA,IACrC;AAGA,UAAM,YAAY;AAAA;AAAA,MAEhB,GAAG;AAAA,MACH;AAAA,QACE,SAAS,qBAAqB,kBAAkB,aAAa,QAAQ,IAAI,MAAM,eAAe,WAAW;AAAA,QACzG,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,eAAW,YAAY,WAAW;AAChC,YAAM;AAAA,QACJ,QAAQ;AAAA,QACR;AAAA,UACE,UAAU,SAAS;AAAA,UACnB,SAAS,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,gBAAgB,OAAO,WAAW,CAAC;AAAA,EAC5D;AACF;AAEA,IAAM,gCAAgC,OAAO,YAAoB,aAA+B;AAC9F,QAAM,aAAa,MAAM,oBAAoB,UAAU;AACvD,QAAM,UAAU,SAAS,KAAK;AAC9B,MAAI,WAAW,CAAC,GACd,QAAQ,CAAC;AAGX,aAAW,aAAa,YAAY;AAClC,UAAM,EAAE,2BAA2B,GAAG,QAAQ,IAAI,MAAM,aAAa,YAAY,UAAU,SAAS;AACpG,QAAI,kBAAkB,QAAQ;AAC9B,UAAM,cAAc,UAAU;AAC9B,UAAM,gBAAgB,UAAU;AAEhC,YAAQ,IAAIA,OAAM,KAAK,uBAAuB,QAAQ,IAAI,MAAM,QAAQ,OAAO,GAAG,CAAC;AAEnF,UAAM,EAAE,kBAAkB,cAAc,YAAY,eAAe,IAAI;AAAA,MACrE,QAAQ,IAAI;AAAA,MACZ;AAAA,IACF;AAGA,UAAM,mBAAmB,MAAM,WAAW,QAAQ,IAAI,QAAQ;AAE9D,QAAI,kBAAkB;AACpB,wBAAkB,iBAAiB;AAEnC,UAAI,iBAAiB,YAAY,SAAS;AAExC,cAAM,eAAe,QAAQ,EAAE;AAC/B,gBAAQ,IAAIA,OAAM,KAAK,oCAAoC,iBAAiB,OAAO,GAAG,CAAC;AAAA,MACzF;AAAA,IACF;AAGA,UAAM,aAAa,EAAE,GAAG,SAAS,UAAU,gBAAgB,GAAG,EAAE,MAAM,QAAQ,IAAI,UAAU,KAAK,CAAC;AAGlG,QAAI,kBAAkB,SAAS;AAC7B,YAAM,KAAK;AAAA,QACT,IAAI,QAAQ;AAAA,QACZ,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH,OAAO;AACL,eAAS,KAAK;AAAA,QACZ,IAAI,QAAQ;AAAA,QACZ,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH;AAGA,QAAI,2BAA2B,aAAa;AAC1C,YAAM;AAAA,QACJ,QAAQ;AAAA,QACR;AAAA,UACE,UAAU;AAAA,UACV,SAAS,KAAK,UAAU,0BAA0B,aAAa,MAAM,CAAC;AAAA,QACxE;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,2BAA2B,WAAW;AACxC,iBAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,0BAA0B,SAAS,GAAG;AACtF,cAAM;AAAA,UACJ,QAAQ;AAAA,UACR;AAAA,YACE,UAAU,YAAY,UAAU;AAAA,YAChC,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UACzC;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,IAAIA,OAAM,KAAK,gBAAgB,QAAQ,OAAO,WAAW,CAAC;AAClE,QAAI,CAAC,UAAU,aAAa;AAC1B,cAAQ,IAAIA,OAAM,OAAO,iCAAiC,UAAU,MAAM,IAAI,UAAU,IAAI,mBAAmB,CAAC;AAChH,cAAQ,IAAIA,OAAM,OAAO,mEAAmE,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,SAAO,EAAE,UAAU,MAAM;AAC3B;AAEA,IAAM,oBAAoB,CAAC,SAAkB,aAA+B;AAC1E,QAAM,iBAAiB,QAAQ,KAAK,SAAS,OAAO;AACpD,SAAO,iBAAiB,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI,KAAK,KAAK,UAAU,EAAE,QAAQ,KAAK,CAAC;AAClG;AAEA,IAAM,iBAAiB,OAAO,YAAqB;AACjD,MAAI,QAAQ,KAAK,WAAW,MAAM,GAAG;AACnC,UAAM,OAAO,MAAM,MAAM,QAAQ,MAAM,EAAE,QAAQ,MAAM,CAAC;AACxD,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,yBAAyB,QAAQ,IAAI,aAAa,KAAK,MAAM,EAAE;AAAA,IACjF;AACA,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AACA,SAAO,MAAM,SAAS,QAAQ,MAAM,MAAM;AAC5C;","names":["utils","chalk","SwaggerParser","defaultMarkdown","path","slugify","defaultMarkdown","getSummary","path","utils","chalk","SwaggerParser"]}
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","../src/utils/checkLicense.ts","../package.json"],"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, Service } from './types';\nimport { getMessageTypeUtils } from './utils/catalog-shorthand';\nimport { OpenAPI } from 'openapi-types';\nimport checkLicense from './utils/checkLicense';\nimport yaml from 'js-yaml';\nimport { join } from 'node:path';\ntype Props = {\n services: Service[];\n domain?: Domain;\n debug?: boolean;\n saveParsedSpecFile?: boolean;\n licenseKey?: string;\n writeFilesToRoot?: boolean;\n};\n\nexport default async (_: any, options: Props) => {\n if (!process.env.PROJECT_DIR) {\n process.env.PROJECT_DIR = process.cwd();\n }\n\n if (!process.env.PROJECT_DIR) {\n throw new Error('Please provide catalog url (env variable PROJECT_DIR)');\n }\n\n // Check if the license is valid\n await checkLicense(options.licenseKey);\n\n const {\n getDomain,\n versionDomain,\n writeDomain,\n addServiceToDomain,\n getService,\n versionService,\n writeService,\n addFileToService,\n getSpecificationFilesForService,\n } = utils(process.env.PROJECT_DIR);\n\n const { services = [], saveParsedSpecFile = false } = options;\n for (const serviceSpec of services) {\n console.log(chalk.green(`Processing ${serviceSpec.path}`));\n\n try {\n await SwaggerParser.validate(serviceSpec.path);\n } catch (error) {\n console.error(chalk.red(`Failed to parse OpenAPI file: ${serviceSpec.path}`));\n console.error(chalk.red(error));\n continue;\n }\n\n const document = await SwaggerParser.dereference(serviceSpec.path);\n const version = document.info.version;\n\n const service = buildService(serviceSpec, document);\n let serviceMarkdown = service.markdown;\n let serviceSpecificationsFiles = [];\n let serviceSpecifications = service.specifications;\n\n // Have to ../ as the SDK will put the files into hard coded folders\n let servicePath = options.domain\n ? join('../', 'domains', options.domain.id, 'services', service.id)\n : join('../', 'services', service.id);\n if (options.writeFilesToRoot) {\n servicePath = service.id;\n }\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(serviceSpec.path, document, servicePath, options);\n let owners = [];\n let repository = null;\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 serviceSpecificationsFiles = await getSpecificationFilesForService(service.id, 'latest');\n sends = latestServiceInCatalog.sends || ([] as any);\n owners = latestServiceInCatalog.owners || ([] as any);\n repository = latestServiceInCatalog.repository || null;\n // persist any specifications that are already in the catalog\n serviceSpecifications = {\n ...serviceSpecifications,\n ...latestServiceInCatalog.specifications,\n };\n\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 receives = latestServiceInCatalog.receives ? [...latestServiceInCatalog.receives, ...receives] : receives;\n }\n }\n\n await writeService(\n {\n ...service,\n markdown: serviceMarkdown,\n specifications: serviceSpecifications,\n sends,\n receives,\n ...(owners ? { owners } : {}),\n ...(repository ? { repository } : {}),\n },\n { path: join(servicePath), override: true }\n );\n\n // What files need added to the service (specification files)\n const specFiles = [\n // add any previous spec files to the list\n ...serviceSpecificationsFiles,\n {\n content: saveParsedSpecFile ? getParsedSpecFile(serviceSpec, document) : await getRawSpecFile(serviceSpec),\n fileName: service.schemaPath,\n },\n ];\n\n for (const specFile of specFiles) {\n await addFileToService(\n service.id,\n {\n fileName: specFile.fileName,\n content: specFile.content,\n },\n version\n );\n }\n\n console.log(chalk.cyan(` - Service (v${version}) created`));\n }\n};\n\nconst processMessagesForOpenAPISpec = async (\n pathToSpec: string,\n document: OpenAPI.Document,\n servicePath: string,\n options: Props\n) => {\n const operations = await getOperationsByType(pathToSpec);\n const version = document.info.version;\n let receives = [],\n sends = [];\n\n // Go through all messages\n for (const operation of operations) {\n const { requestBodiesAndResponses, ...message } = await buildMessage(pathToSpec, document, operation);\n let messageMarkdown = message.markdown;\n const messageType = operation.type;\n const messageAction = operation.action;\n\n console.log(chalk.blue(`Processing message: ${message.name} (v${message.version})`));\n\n const {\n addFileToMessage,\n writeMessage,\n getMessage,\n versionMessage,\n collection: folder,\n } = getMessageTypeUtils(process.env.PROJECT_DIR as string, messageType);\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 // 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 let messagePath = join(servicePath, folder, message.id);\n if (options.writeFilesToRoot) {\n messagePath = message.id;\n }\n\n // Write the message to the catalog\n await writeMessage({ ...message, markdown: messageMarkdown }, { path: messagePath, override: true });\n\n // If the message send or recieved by the service?\n if (messageAction === 'sends') {\n sends.push({\n id: message.id,\n version: message.version,\n });\n } else {\n receives.push({\n id: message.id,\n version: message.version,\n });\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${message.version}) created`));\n if (!operation.operationId) {\n console.log(chalk.yellow(` - OperationId not found for ${operation.method} ${operation.path}, creating one...`));\n console.log(chalk.yellow(` - Use operationIds to give better unique names for EventCatalog`));\n }\n }\n return { receives, sends };\n};\n\nconst getParsedSpecFile = (service: Service, document: OpenAPI.Document) => {\n const isSpecFileJSON = service.path.endsWith('.json');\n return isSpecFileJSON ? JSON.stringify(document, null, 2) : yaml.dump(document, { noRefs: true });\n};\n\nconst getRawSpecFile = async (service: Service) => {\n if (service.path.startsWith('http')) {\n const file = await fetch(service.path, { method: 'GET' });\n if (!file.ok) {\n throw new Error(`Failed to fetch file: ${service.path}, status: ${file.status}`);\n }\n return await file.text();\n }\n return await readFile(service.path, 'utf8');\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';\nimport { Service } from '../types';\nimport path from 'path';\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${\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\nexport const buildService = (serviceOptions: Service, document: OpenAPI.Document) => {\n const schemaPath = path.basename(serviceOptions.path) || 'openapi.yml';\n const documentTags = document.tags || [];\n const serviceId = serviceOptions.id || slugify(document.info.title, { lower: true, strict: true });\n return {\n id: serviceId,\n version: document.info.version,\n name: document.info.title,\n summary: getSummary(document),\n schemaPath,\n specifications: {\n openapiPath: schemaPath,\n },\n markdown: defaultMarkdown(document, schemaPath),\n badges: documentTags.map((tag) => ({ content: tag.name, textColor: 'blue', backgroundColor: 'blue' })),\n };\n};\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport { OpenAPIDocument, OpenAPIOperation, OpenAPIParameter, Operation } from '../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 const messageAction = openAPIOperation['x-eventcatalog-message-action'] === 'sends' ? 'sends' : 'receives';\n const extensions = Object.keys(openAPIOperation).reduce((acc: { [key: string]: any }, key) => {\n if (key.startsWith('x-eventcatalog-')) {\n acc[key] = openAPIOperation[key];\n }\n return acc;\n }, {});\n\n const operation = {\n path: path,\n method: method.toUpperCase(),\n operationId: openAPIOperation.operationId,\n externalDocs: openAPIOperation.externalDocs,\n type: messageType,\n action: messageAction,\n description: openAPIOperation.description,\n summary: openAPIOperation.summary,\n tags: openAPIOperation.tags || [],\n extensions,\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';\nimport slugify from 'slugify';\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 // @ts-ignore\n if (content.isSchema) {\n markdown += `**${statusCode} Response**\\n`;\n markdown += `<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\\n\\n`;\n } else {\n markdown += `**${statusCode} Response**\\n`;\n markdown += `\\`\\`\\`json\\n${JSON.stringify(content, null, 2)}\\n\\`\\`\\`\\n\\n`;\n }\n }\n\n return markdown;\n};\n\nexport const defaultMarkdown = (message: Operation, openAPIOperation: OpenAPIOperation = {}) => {\n return `\n${\n message.description\n ? `\n## Overview\n${message.description}\n`\n : ''\n}\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## Architecture\n\n<NodeGraph />\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 const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);\n const extensions = operation.extensions || {};\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 const apiName = slugify(document.info.title, { lower: true });\n const path = operation.path.replace(/\\//, '').replace(/\\//g, '_');\n let uniqueIdentifier = operation.operationId || `${apiName}_${operation.method}`;\n\n if (!operation.operationId && path) {\n uniqueIdentifier = uniqueIdentifier.concat(`_${path}`);\n }\n\n return {\n id: extensions['x-eventcatalog-message-id'] || uniqueIdentifier,\n version: extensions['x-eventcatalog-message-version'] || document.info.version,\n name: extensions['x-eventcatalog-message-name'] || uniqueIdentifier,\n summary: getSummary(operation),\n markdown: defaultMarkdown(operation, requestBodiesAndResponses),\n schemaPath: requestBodiesAndResponses?.requestBody ? 'request-body.json' : '',\n badges,\n requestBodiesAndResponses,\n };\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 versionQuery,\n getQuery,\n rmQueryById,\n writeQuery,\n addFileToQuery,\n } = utils(projectDirectory);\n\n const messageTypeMap: { [key: string]: any } = {\n event: {\n versionMessage: versionEvent,\n getMessage: getEvent,\n rmMessageById: rmEventById,\n writeMessage: writeEvent,\n addFileToMessage: addFileToEvent,\n collection: 'events',\n },\n command: {\n versionMessage: versionCommand,\n getMessage: getCommand,\n rmMessageById: rmCommandById,\n writeMessage: writeCommand,\n addFileToMessage: addFileToCommand,\n collection: 'commands',\n },\n query: {\n versionMessage: versionQuery,\n getMessage: getQuery,\n rmMessageById: rmQueryById,\n writeMessage: writeQuery,\n addFileToMessage: addFileToQuery,\n collection: 'queries',\n },\n };\n\n return messageTypeMap[messageType] || messageTypeMap.query;\n};\n","import chalk from 'chalk';\nimport pkg from '../../package.json';\n\ntype LicenseResponse = {\n is_trial: boolean;\n plugin: string;\n state: string;\n};\n\nexport default async (licenseKey?: string) => {\n const LICENSE_KEY = process.env.EVENTCATALOG_LICENSE_KEY_OPENAPI || licenseKey || null;\n\n if (!LICENSE_KEY) {\n console.log(chalk.bgRed(`\\nThis plugin requires a license key to use`));\n console.log(chalk.redBright(`\\nVisit https://eventcatalog.cloud/ to get a 14 day trial or purchase a license`));\n process.exit(1);\n }\n\n // Verify the license key\n const response = await fetch('https://api.eventcatalog.cloud/functions/v1/license', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${LICENSE_KEY}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.status !== 200) {\n console.log(chalk.bgRed(`\\nInvalid license key`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (response.status === 200) {\n const data = (await response.json()) as LicenseResponse;\n\n if (pkg.name !== data.plugin) {\n console.log(chalk.bgRed(`\\nInvalid license key for this plugin`));\n console.log(chalk.redBright('Please check your plugin license key or purchase a license at https://eventcatalog.cloud/'));\n process.exit(1);\n }\n\n if (data.is_trial) {\n console.log(chalk.bgBlue(`\\nYou are using a trial license for this plugin`));\n }\n }\n\n return Promise.resolve();\n};\n","{\n \"name\": \"@eventcatalog/generator-openapi\",\n \"version\": \"4.0.1\",\n \"description\": \"OpenAPI generator for EventCatalog\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:diff\": \"prettier --list-different .\",\n \"changeset\": \"changeset\",\n \"release\": \"changeset publish\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/lodash\": \"^4.17.7\",\n \"@types/node\": \"^20.16.1\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.5.3\",\n \"vitest\": \"^2.0.2\"\n },\n \"files\": [\n \"dist\",\n \"package.json\"\n ],\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"@changesets/cli\": \"^2.27.7\",\n \"@eventcatalog/sdk\": \"^1.4.8\",\n \"chalk\": \"^4\",\n \"js-yaml\": \"^4.1.0\",\n \"openapi-types\": \"^12.1.3\",\n \"slugify\": \"^1.6.6\"\n }\n}\n"],"mappings":"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","names":["utils","chalk","SwaggerParser","defaultMarkdown","path","slugify","defaultMarkdown","getSummary","path","utils","chalk","SwaggerParser"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventcatalog/generator-openapi",
3
- "version": "3.3.3",
3
+ "version": "4.0.1",
4
4
  "description": "OpenAPI generator for EventCatalog",
5
5
  "publishConfig": {
6
6
  "access": "public"