@eventcatalog/generator-openapi 4.0.2 → 4.0.3

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.js CHANGED
@@ -84,7 +84,9 @@ var buildService = (serviceOptions, document) => {
84
84
  openapiPath: schemaPath
85
85
  },
86
86
  markdown: defaultMarkdown2(document, schemaPath),
87
- badges: documentTags.map((tag) => ({ content: tag.name, textColor: "blue", backgroundColor: "blue" }))
87
+ badges: documentTags.map((tag) => ({ content: tag.name, textColor: "blue", backgroundColor: "blue" })),
88
+ owners: serviceOptions.owners || [],
89
+ setMessageOwnersToServiceOwners: serviceOptions.setMessageOwnersToServiceOwners || true
88
90
  };
89
91
  };
90
92
 
@@ -361,7 +363,7 @@ var import_chalk = __toESM(require("chalk"));
361
363
  // package.json
362
364
  var package_default = {
363
365
  name: "@eventcatalog/generator-openapi",
364
- version: "4.0.2",
366
+ version: "4.0.3",
365
367
  description: "OpenAPI generator for EventCatalog",
366
368
  scripts: {
367
369
  build: "tsup",
@@ -501,7 +503,8 @@ Processing domain: ${domainName} (v${domainVersion})`));
501
503
  id: domainId,
502
504
  name: domainName,
503
505
  version: domainVersion,
504
- markdown: defaultMarkdown()
506
+ markdown: defaultMarkdown(),
507
+ ...options.domain?.owners ? { owners: options.domain.owners } : {}
505
508
  });
506
509
  console.log(import_chalk2.default.cyan(` - Domain (v${domainVersion}) created`));
507
510
  }
@@ -510,8 +513,11 @@ Processing domain: ${domainName} (v${domainVersion})`));
510
513
  }
511
514
  await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
512
515
  }
513
- let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document, servicePath, options);
514
- let owners = [];
516
+ let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document, servicePath, {
517
+ ...options,
518
+ owners: service.setMessageOwnersToServiceOwners ? service.owners : []
519
+ });
520
+ let owners = service.owners || [];
515
521
  let repository = null;
516
522
  const latestServiceInCatalog = await getService(service.id, "latest");
517
523
  console.log(import_chalk2.default.blue(`Processing service: ${document.info.title} (v${version})`));
@@ -595,7 +601,10 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document, servicePath, op
595
601
  if (options.writeFilesToRoot) {
596
602
  messagePath = message.id;
597
603
  }
598
- await writeMessage({ ...message, markdown: messageMarkdown }, { path: messagePath, override: true });
604
+ await writeMessage(
605
+ { ...message, markdown: messageMarkdown, ...options.owners ? { owners: options.owners } : {} },
606
+ { path: messagePath, override: true }
607
+ );
599
608
  if (messageAction === "sends") {
600
609
  sends.push({
601
610
  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';\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\n const getStatusCodeColor = (code: string) => {\n const firstDigit = code[0];\n switch (firstDigit) {\n case '2':\n return 'green';\n case '4':\n return 'orange';\n case '5':\n return 'red';\n default:\n return 'gray';\n }\n };\n\n for (const [statusCode, content] of Object.entries(openAPIOperation.responses as any)) {\n const color = getStatusCodeColor(statusCode);\n const statusText =\n {\n '200': 'OK',\n '201': 'Created',\n '202': 'Accepted',\n '204': 'No Content',\n '301': 'Moved Permanently',\n '302': 'Found',\n '304': 'Not Modified',\n '400': 'Bad Request',\n '401': 'Unauthorized',\n '403': 'Forbidden',\n '404': 'Not Found',\n '405': 'Method Not Allowed',\n '409': 'Conflict',\n '422': 'Unprocessable Entity',\n '429': 'Too Many Requests',\n '500': 'Internal Server Error',\n '502': 'Bad Gateway',\n '503': 'Service Unavailable',\n '504': 'Gateway Timeout',\n }[statusCode] || '';\n\n markdown += `#### <span className=\"text-${color}-500\">${statusCode}${statusText ? ` ${statusText}` : ''}</span>\\n`;\n\n // Add description if available\n if ((content as any).description) {\n markdown += `${(content as any).description}\\n`;\n }\n\n // Add schema viewer or JSON content\n if ((content as any).isSchema) {\n markdown += `<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\\n\\n`;\n } else {\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.2\",\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 ...(options.domain?.owners ? { owners: options.domain.owners } : {}),\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, {\n ...options,\n owners: service.setMessageOwnersToServiceOwners ? service.owners : [],\n });\n\n let owners = service.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 & { owners: string[] }\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(\n { ...message, markdown: messageMarkdown, ...(options.owners ? { owners: options.owners } : {}) },\n { path: messagePath, override: true }\n );\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 owners: serviceOptions.owners || [],\n setMessageOwnersToServiceOwners: serviceOptions.setMessageOwnersToServiceOwners || true,\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\n const getStatusCodeColor = (code: string) => {\n const firstDigit = code[0];\n switch (firstDigit) {\n case '2':\n return 'green';\n case '4':\n return 'orange';\n case '5':\n return 'red';\n default:\n return 'gray';\n }\n };\n\n for (const [statusCode, content] of Object.entries(openAPIOperation.responses as any)) {\n const color = getStatusCodeColor(statusCode);\n const statusText =\n {\n '200': 'OK',\n '201': 'Created',\n '202': 'Accepted',\n '204': 'No Content',\n '301': 'Moved Permanently',\n '302': 'Found',\n '304': 'Not Modified',\n '400': 'Bad Request',\n '401': 'Unauthorized',\n '403': 'Forbidden',\n '404': 'Not Found',\n '405': 'Method Not Allowed',\n '409': 'Conflict',\n '422': 'Unprocessable Entity',\n '429': 'Too Many Requests',\n '500': 'Internal Server Error',\n '502': 'Bad Gateway',\n '503': 'Service Unavailable',\n '504': 'Gateway Timeout',\n }[statusCode] || '';\n\n markdown += `#### <span className=\"text-${color}-500\">${statusCode}${statusText ? ` ${statusText}` : ''}</span>\\n`;\n\n // Add description if available\n if ((content as any).description) {\n markdown += `${(content as any).description}\\n`;\n }\n\n // Add schema viewer or JSON content\n if ((content as any).isSchema) {\n markdown += `<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\\n\\n`;\n } else {\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.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"]}
package/dist/index.mjs CHANGED
@@ -50,7 +50,9 @@ var buildService = (serviceOptions, document) => {
50
50
  openapiPath: schemaPath
51
51
  },
52
52
  markdown: defaultMarkdown2(document, schemaPath),
53
- badges: documentTags.map((tag) => ({ content: tag.name, textColor: "blue", backgroundColor: "blue" }))
53
+ badges: documentTags.map((tag) => ({ content: tag.name, textColor: "blue", backgroundColor: "blue" })),
54
+ owners: serviceOptions.owners || [],
55
+ setMessageOwnersToServiceOwners: serviceOptions.setMessageOwnersToServiceOwners || true
54
56
  };
55
57
  };
56
58
 
@@ -327,7 +329,7 @@ import chalk from "chalk";
327
329
  // package.json
328
330
  var package_default = {
329
331
  name: "@eventcatalog/generator-openapi",
330
- version: "4.0.2",
332
+ version: "4.0.3",
331
333
  description: "OpenAPI generator for EventCatalog",
332
334
  scripts: {
333
335
  build: "tsup",
@@ -467,7 +469,8 @@ Processing domain: ${domainName} (v${domainVersion})`));
467
469
  id: domainId,
468
470
  name: domainName,
469
471
  version: domainVersion,
470
- markdown: defaultMarkdown()
472
+ markdown: defaultMarkdown(),
473
+ ...options.domain?.owners ? { owners: options.domain.owners } : {}
471
474
  });
472
475
  console.log(chalk2.cyan(` - Domain (v${domainVersion}) created`));
473
476
  }
@@ -476,8 +479,11 @@ Processing domain: ${domainName} (v${domainVersion})`));
476
479
  }
477
480
  await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
478
481
  }
479
- let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document, servicePath, options);
480
- let owners = [];
482
+ let { sends, receives } = await processMessagesForOpenAPISpec(serviceSpec.path, document, servicePath, {
483
+ ...options,
484
+ owners: service.setMessageOwnersToServiceOwners ? service.owners : []
485
+ });
486
+ let owners = service.owners || [];
481
487
  let repository = null;
482
488
  const latestServiceInCatalog = await getService(service.id, "latest");
483
489
  console.log(chalk2.blue(`Processing service: ${document.info.title} (v${version})`));
@@ -561,7 +567,10 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document, servicePath, op
561
567
  if (options.writeFilesToRoot) {
562
568
  messagePath = message.id;
563
569
  }
564
- await writeMessage({ ...message, markdown: messageMarkdown }, { path: messagePath, override: true });
570
+ await writeMessage(
571
+ { ...message, markdown: messageMarkdown, ...options.owners ? { owners: options.owners } : {} },
572
+ { path: messagePath, override: true }
573
+ );
565
574
  if (messageAction === "sends") {
566
575
  sends.push({
567
576
  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';\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\n const getStatusCodeColor = (code: string) => {\n const firstDigit = code[0];\n switch (firstDigit) {\n case '2':\n return 'green';\n case '4':\n return 'orange';\n case '5':\n return 'red';\n default:\n return 'gray';\n }\n };\n\n for (const [statusCode, content] of Object.entries(openAPIOperation.responses as any)) {\n const color = getStatusCodeColor(statusCode);\n const statusText =\n {\n '200': 'OK',\n '201': 'Created',\n '202': 'Accepted',\n '204': 'No Content',\n '301': 'Moved Permanently',\n '302': 'Found',\n '304': 'Not Modified',\n '400': 'Bad Request',\n '401': 'Unauthorized',\n '403': 'Forbidden',\n '404': 'Not Found',\n '405': 'Method Not Allowed',\n '409': 'Conflict',\n '422': 'Unprocessable Entity',\n '429': 'Too Many Requests',\n '500': 'Internal Server Error',\n '502': 'Bad Gateway',\n '503': 'Service Unavailable',\n '504': 'Gateway Timeout',\n }[statusCode] || '';\n\n markdown += `#### <span className=\"text-${color}-500\">${statusCode}${statusText ? ` ${statusText}` : ''}</span>\\n`;\n\n // Add description if available\n if ((content as any).description) {\n markdown += `${(content as any).description}\\n`;\n }\n\n // Add schema viewer or JSON content\n if ((content as any).isSchema) {\n markdown += `<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\\n\\n`;\n } else {\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.2\",\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"]}
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 ...(options.domain?.owners ? { owners: options.domain.owners } : {}),\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, {\n ...options,\n owners: service.setMessageOwnersToServiceOwners ? service.owners : [],\n });\n\n let owners = service.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 & { owners: string[] }\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(\n { ...message, markdown: messageMarkdown, ...(options.owners ? { owners: options.owners } : {}) },\n { path: messagePath, override: true }\n );\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 owners: serviceOptions.owners || [],\n setMessageOwnersToServiceOwners: serviceOptions.setMessageOwnersToServiceOwners || true,\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\n const getStatusCodeColor = (code: string) => {\n const firstDigit = code[0];\n switch (firstDigit) {\n case '2':\n return 'green';\n case '4':\n return 'orange';\n case '5':\n return 'red';\n default:\n return 'gray';\n }\n };\n\n for (const [statusCode, content] of Object.entries(openAPIOperation.responses as any)) {\n const color = getStatusCodeColor(statusCode);\n const statusText =\n {\n '200': 'OK',\n '201': 'Created',\n '202': 'Accepted',\n '204': 'No Content',\n '301': 'Moved Permanently',\n '302': 'Found',\n '304': 'Not Modified',\n '400': 'Bad Request',\n '401': 'Unauthorized',\n '403': 'Forbidden',\n '404': 'Not Found',\n '405': 'Method Not Allowed',\n '409': 'Conflict',\n '422': 'Unprocessable Entity',\n '429': 'Too Many Requests',\n '500': 'Internal Server Error',\n '502': 'Bad Gateway',\n '503': 'Service Unavailable',\n '504': 'Gateway Timeout',\n }[statusCode] || '';\n\n markdown += `#### <span className=\"text-${color}-500\">${statusCode}${statusText ? ` ${statusText}` : ''}</span>\\n`;\n\n // Add description if available\n if ((content as any).description) {\n markdown += `${(content as any).description}\\n`;\n }\n\n // Add schema viewer or JSON content\n if ((content as any).isSchema) {\n markdown += `<SchemaViewer file=\"response-${statusCode}.json\" maxHeight=\"500\" id=\"response-${statusCode}\" />\\n\\n`;\n } else {\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.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":["utils","chalk","SwaggerParser","defaultMarkdown","path","slugify","defaultMarkdown","getSummary","path","utils","chalk","SwaggerParser"]}
package/dist/types.d.mts CHANGED
@@ -4,10 +4,13 @@ type Domain = {
4
4
  id: string;
5
5
  name: string;
6
6
  version: string;
7
+ owners?: string[];
7
8
  };
8
9
  type Service = {
9
10
  id: string;
10
11
  path: string;
12
+ owners?: string[];
13
+ setMessageOwnersToServiceOwners?: boolean;
11
14
  };
12
15
  type Operation = {
13
16
  path: string;
package/dist/types.d.ts CHANGED
@@ -4,10 +4,13 @@ type Domain = {
4
4
  id: string;
5
5
  name: string;
6
6
  version: string;
7
+ owners?: string[];
7
8
  };
8
9
  type Service = {
9
10
  id: string;
10
11
  path: string;
12
+ owners?: string[];
13
+ setMessageOwnersToServiceOwners?: boolean;
11
14
  };
12
15
  type Operation = {
13
16
  path: string;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { OpenAPIV3_1 } from 'openapi-types';\n\nexport type Domain = {\n id: string;\n name: string;\n version: string;\n};\n\nexport type Service = {\n id: string;\n path: string;\n};\n\nexport type Operation = {\n path: string;\n method: string;\n operationId: string;\n summary?: string;\n description?: string;\n type: string;\n action: string;\n externalDocs?: OpenAPIV3_1.ExternalDocumentationObject;\n tags: string[];\n extensions?: {\n [key: string]: any;\n };\n};\n\nexport interface OpenAPIParameter {\n name: string;\n in: string;\n required?: boolean;\n schema?: any;\n description?: string;\n}\n\nexport interface OpenAPIOperation {\n operationId?: string;\n parameters?: OpenAPIParameter[];\n requestBody?: {\n content?: {\n [contentType: string]: {\n schema: any;\n };\n };\n };\n responses?: {\n [statusCode: string]: {\n isSchema?: boolean;\n content?: {\n [contentType: string]: {\n schema: any;\n };\n };\n };\n };\n}\n\nexport interface OpenAPIPathItem {\n [method: string]: OpenAPIOperation;\n}\n\nexport interface OpenAPIPaths {\n [path: string]: OpenAPIPathItem;\n}\n\nexport interface OpenAPIDocument {\n paths: OpenAPIPaths;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { OpenAPIV3_1 } from 'openapi-types';\n\nexport type Domain = {\n id: string;\n name: string;\n version: string;\n owners?: string[];\n};\n\nexport type Service = {\n id: string;\n path: string;\n owners?: string[];\n setMessageOwnersToServiceOwners?: boolean;\n};\n\nexport type Operation = {\n path: string;\n method: string;\n operationId: string;\n summary?: string;\n description?: string;\n type: string;\n action: string;\n externalDocs?: OpenAPIV3_1.ExternalDocumentationObject;\n tags: string[];\n extensions?: {\n [key: string]: any;\n };\n};\n\nexport interface OpenAPIParameter {\n name: string;\n in: string;\n required?: boolean;\n schema?: any;\n description?: string;\n}\n\nexport interface OpenAPIOperation {\n operationId?: string;\n parameters?: OpenAPIParameter[];\n requestBody?: {\n content?: {\n [contentType: string]: {\n schema: any;\n };\n };\n };\n responses?: {\n [statusCode: string]: {\n isSchema?: boolean;\n content?: {\n [contentType: string]: {\n schema: any;\n };\n };\n };\n };\n}\n\nexport interface OpenAPIPathItem {\n [method: string]: OpenAPIOperation;\n}\n\nexport interface OpenAPIPaths {\n [path: string]: OpenAPIPathItem;\n}\n\nexport interface OpenAPIDocument {\n paths: OpenAPIPaths;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventcatalog/generator-openapi",
3
- "version": "4.0.2",
3
+ "version": "4.0.3",
4
4
  "description": "OpenAPI generator for EventCatalog",
5
5
  "publishConfig": {
6
6
  "access": "public"