@eventcatalog/generator-openapi 7.6.4 → 7.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1589,9 +1589,9 @@ var buildService = (serviceOptions, document2, generateMarkdown) => {
1589
1589
  // src/utils/openapi.ts
1590
1590
  import SwaggerParser from "@apidevtools/swagger-parser";
1591
1591
  var DEFAULT_MESSAGE_TYPE = "query";
1592
- async function getSchemasByOperationId(filePath, operationId) {
1592
+ async function getSchemasByOperationId(filePath, operationId, parsedDocument) {
1593
1593
  try {
1594
- const api = await SwaggerParser.dereference(filePath);
1594
+ const api = parsedDocument || await SwaggerParser.dereference(filePath);
1595
1595
  const schemas = {
1596
1596
  parameters: [],
1597
1597
  requestBody: null,
@@ -1612,7 +1612,8 @@ async function getSchemasByOperationId(filePath, operationId) {
1612
1612
  for (const [statusCode, response] of Object.entries(typedOperation.responses)) {
1613
1613
  if (response.content) {
1614
1614
  const contentType = Object.keys(response.content)[0];
1615
- schemas.responses[statusCode] = response.content[contentType].schema || response.content[contentType];
1615
+ const schemaOrContent = response.content[contentType].schema || response.content[contentType];
1616
+ schemas.responses[statusCode] = { ...schemaOrContent };
1616
1617
  schemas.responses[statusCode].isSchema = !!response.content[contentType].schema;
1617
1618
  }
1618
1619
  }
@@ -1640,9 +1641,9 @@ function getDeprecatedValues(openAPIOperation) {
1640
1641
  }
1641
1642
  return deprecated;
1642
1643
  }
1643
- async function getOperationsByType(openApiPath, httpMethodsToMessages) {
1644
+ async function getOperationsByType(openApiPath, httpMethodsToMessages, parsedDocument) {
1644
1645
  try {
1645
- const api = await SwaggerParser.validate(openApiPath);
1646
+ const api = parsedDocument || await SwaggerParser.validate(openApiPath);
1646
1647
  const operations = [];
1647
1648
  for (const path4 in api.paths) {
1648
1649
  const pathItem = api.paths[path4];
@@ -1810,7 +1811,7 @@ var getSummary2 = (message2) => {
1810
1811
  return escapeSpecialCharactersThatBreakMarkdown(eventCatalogMessageSummary);
1811
1812
  };
1812
1813
  var buildMessage = async (pathToFile, document2, operation, generateMarkdown, messageIdConfig, serviceId, serviceVersion) => {
1813
- const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);
1814
+ const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId, document2);
1814
1815
  const extensions = operation.extensions || {};
1815
1816
  const operationTags = operation.tags.map((badge) => ({
1816
1817
  content: `tag:${badge}`,
@@ -4067,7 +4068,7 @@ import { join } from "path";
4067
4068
  // package.json
4068
4069
  var package_default = {
4069
4070
  name: "@eventcatalog/generator-openapi",
4070
- version: "7.6.4",
4071
+ version: "7.7.0",
4071
4072
  description: "OpenAPI generator for EventCatalog",
4072
4073
  scripts: {
4073
4074
  build: "tsup",
@@ -4180,6 +4181,32 @@ var isVersionLessThan = (version, givenVersion) => {
4180
4181
  var toUniqueArray = (array) => {
4181
4182
  return array.filter((item, index, self) => index === self.findIndex((t) => t.id === item.id && t.version === item.version));
4182
4183
  };
4184
+ var fetchAuthenticatedSpec = async (specUrl, headers) => {
4185
+ const response = await fetch(specUrl, { method: "GET", headers });
4186
+ if (!response.ok) {
4187
+ throw new Error(`Failed to fetch file: ${specUrl}, status: ${response.status}`);
4188
+ }
4189
+ const content = await response.text();
4190
+ const contentType = response.headers.get("content-type") || "";
4191
+ if (contentType.includes("json")) {
4192
+ return JSON.parse(content);
4193
+ }
4194
+ if (contentType.includes("yaml")) {
4195
+ return yaml.load(content);
4196
+ }
4197
+ try {
4198
+ return JSON.parse(content);
4199
+ } catch {
4200
+ return yaml.load(content);
4201
+ }
4202
+ };
4203
+ var mergeOpenApiIntoSpecifications = (existingSpecs, openapiFileName) => {
4204
+ if (Array.isArray(existingSpecs)) {
4205
+ return [...existingSpecs.filter((spec) => spec.type !== "openapi"), { type: "openapi", path: openapiFileName }];
4206
+ }
4207
+ const { openapiPath: _, ...rest } = existingSpecs || {};
4208
+ return { openapiPath: openapiFileName, ...rest };
4209
+ };
4183
4210
  var index_default = async (_, options) => {
4184
4211
  if (!process.env.PROJECT_DIR) {
4185
4212
  process.env.PROJECT_DIR = process.cwd();
@@ -4206,8 +4233,17 @@ var index_default = async (_, options) => {
4206
4233
  const specFiles = Array.isArray(serviceSpec.path) ? serviceSpec.path : [serviceSpec.path];
4207
4234
  const specs = specFiles.map(async (specFile) => {
4208
4235
  try {
4209
- await SwaggerParser2.validate(specFile);
4210
- const document2 = await SwaggerParser2.dereference(specFile);
4236
+ const isUrl = specFile.startsWith("http");
4237
+ const hasHeaders = serviceSpec.headers && Object.keys(serviceSpec.headers).length > 0;
4238
+ let document2;
4239
+ if (isUrl && hasHeaders) {
4240
+ const parsedSpec = await fetchAuthenticatedSpec(specFile, serviceSpec.headers);
4241
+ await SwaggerParser2.validate(parsedSpec);
4242
+ document2 = await SwaggerParser2.dereference(parsedSpec);
4243
+ } else {
4244
+ await SwaggerParser2.validate(specFile);
4245
+ document2 = await SwaggerParser2.dereference(specFile);
4246
+ }
4211
4247
  return {
4212
4248
  document: document2,
4213
4249
  path: specFile,
@@ -4318,16 +4354,14 @@ Processing domain: ${domainName} (v${domainVersion})`));
4318
4354
  serviceAttachments = latestServiceInCatalog.attachments || null;
4319
4355
  serviceWritesTo = latestServiceInCatalog.writesTo || [];
4320
4356
  serviceReadsFrom = latestServiceInCatalog.readsFrom || [];
4321
- serviceSpecifications = {
4322
- ...serviceSpecifications,
4323
- ...persistPreviousSpecificationFiles ? latestServiceInCatalog.specifications : {}
4324
- };
4357
+ if (persistPreviousSpecificationFiles && latestServiceInCatalog.specifications) {
4358
+ serviceSpecifications = mergeOpenApiIntoSpecifications(latestServiceInCatalog.specifications, service.schemaPath);
4359
+ }
4325
4360
  if (latestServiceInCatalog.version === version) {
4326
4361
  receives = latestServiceInCatalog.receives ? (
4327
4362
  // @ts-ignore
4328
4363
  toUniqueArray([...latestServiceInCatalog.receives, ...receives])
4329
4364
  ) : receives;
4330
- console.log("MEOW", "HELLO", latestServiceInCatalog.writesTo, serviceWritesTo);
4331
4365
  serviceWritesTo = latestServiceInCatalog.writesTo ? toUniqueArray([...latestServiceInCatalog.writesTo, ...configuredWritesTo]) : configuredWritesTo;
4332
4366
  serviceReadsFrom = latestServiceInCatalog.readsFrom ? toUniqueArray([...latestServiceInCatalog.readsFrom, ...configuredReadsFrom]) : configuredReadsFrom;
4333
4367
  }
@@ -4375,7 +4409,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
4375
4409
  }
4376
4410
  };
4377
4411
  var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, options) => {
4378
- const operations = await getOperationsByType(pathToSpec, options.httpMethodsToMessages);
4412
+ const operations = await getOperationsByType(pathToSpec, options.httpMethodsToMessages, document2);
4379
4413
  const sidebarBadgeType = options.sidebarBadgeType || "HTTP_METHOD";
4380
4414
  const version = options.serviceVersion || document2.info.version;
4381
4415
  const preserveExistingMessages = options.preserveExistingMessages ?? true;
@@ -4501,7 +4535,11 @@ var getParsedSpecFile = (service, document2) => {
4501
4535
  var getRawSpecFile = async (service) => {
4502
4536
  const specPath = service.path;
4503
4537
  if (specPath.startsWith("http")) {
4504
- const file = await fetch(specPath, { method: "GET" });
4538
+ const fetchOptions = { method: "GET" };
4539
+ if (service.headers && Object.keys(service.headers).length > 0) {
4540
+ fetchOptions.headers = service.headers;
4541
+ }
4542
+ const file = await fetch(specPath, fetchOptions);
4505
4543
  if (!file.ok) {
4506
4544
  throw new Error(`Failed to fetch file: ${specPath}, status: ${file.status}`);
4507
4545
  }