@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.js CHANGED
@@ -1594,9 +1594,9 @@ var buildService = (serviceOptions, document2, generateMarkdown) => {
1594
1594
  // src/utils/openapi.ts
1595
1595
  var import_swagger_parser = __toESM(require("@apidevtools/swagger-parser"));
1596
1596
  var DEFAULT_MESSAGE_TYPE = "query";
1597
- async function getSchemasByOperationId(filePath, operationId) {
1597
+ async function getSchemasByOperationId(filePath, operationId, parsedDocument) {
1598
1598
  try {
1599
- const api = await import_swagger_parser.default.dereference(filePath);
1599
+ const api = parsedDocument || await import_swagger_parser.default.dereference(filePath);
1600
1600
  const schemas = {
1601
1601
  parameters: [],
1602
1602
  requestBody: null,
@@ -1617,7 +1617,8 @@ async function getSchemasByOperationId(filePath, operationId) {
1617
1617
  for (const [statusCode, response] of Object.entries(typedOperation.responses)) {
1618
1618
  if (response.content) {
1619
1619
  const contentType = Object.keys(response.content)[0];
1620
- schemas.responses[statusCode] = response.content[contentType].schema || response.content[contentType];
1620
+ const schemaOrContent = response.content[contentType].schema || response.content[contentType];
1621
+ schemas.responses[statusCode] = { ...schemaOrContent };
1621
1622
  schemas.responses[statusCode].isSchema = !!response.content[contentType].schema;
1622
1623
  }
1623
1624
  }
@@ -1645,9 +1646,9 @@ function getDeprecatedValues(openAPIOperation) {
1645
1646
  }
1646
1647
  return deprecated;
1647
1648
  }
1648
- async function getOperationsByType(openApiPath, httpMethodsToMessages) {
1649
+ async function getOperationsByType(openApiPath, httpMethodsToMessages, parsedDocument) {
1649
1650
  try {
1650
- const api = await import_swagger_parser.default.validate(openApiPath);
1651
+ const api = parsedDocument || await import_swagger_parser.default.validate(openApiPath);
1651
1652
  const operations = [];
1652
1653
  for (const path4 in api.paths) {
1653
1654
  const pathItem = api.paths[path4];
@@ -1815,7 +1816,7 @@ var getSummary2 = (message2) => {
1815
1816
  return escapeSpecialCharactersThatBreakMarkdown(eventCatalogMessageSummary);
1816
1817
  };
1817
1818
  var buildMessage = async (pathToFile, document2, operation, generateMarkdown, messageIdConfig, serviceId, serviceVersion) => {
1818
- const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId);
1819
+ const requestBodiesAndResponses = await getSchemasByOperationId(pathToFile, operation.operationId, document2);
1819
1820
  const extensions = operation.extensions || {};
1820
1821
  const operationTags = operation.tags.map((badge) => ({
1821
1822
  content: `tag:${badge}`,
@@ -4072,7 +4073,7 @@ var import_node_path = require("path");
4072
4073
  // package.json
4073
4074
  var package_default = {
4074
4075
  name: "@eventcatalog/generator-openapi",
4075
- version: "7.6.4",
4076
+ version: "7.7.0",
4076
4077
  description: "OpenAPI generator for EventCatalog",
4077
4078
  scripts: {
4078
4079
  build: "tsup",
@@ -4185,6 +4186,32 @@ var isVersionLessThan = (version, givenVersion) => {
4185
4186
  var toUniqueArray = (array) => {
4186
4187
  return array.filter((item, index, self) => index === self.findIndex((t) => t.id === item.id && t.version === item.version));
4187
4188
  };
4189
+ var fetchAuthenticatedSpec = async (specUrl, headers) => {
4190
+ const response = await fetch(specUrl, { method: "GET", headers });
4191
+ if (!response.ok) {
4192
+ throw new Error(`Failed to fetch file: ${specUrl}, status: ${response.status}`);
4193
+ }
4194
+ const content = await response.text();
4195
+ const contentType = response.headers.get("content-type") || "";
4196
+ if (contentType.includes("json")) {
4197
+ return JSON.parse(content);
4198
+ }
4199
+ if (contentType.includes("yaml")) {
4200
+ return import_js_yaml.default.load(content);
4201
+ }
4202
+ try {
4203
+ return JSON.parse(content);
4204
+ } catch {
4205
+ return import_js_yaml.default.load(content);
4206
+ }
4207
+ };
4208
+ var mergeOpenApiIntoSpecifications = (existingSpecs, openapiFileName) => {
4209
+ if (Array.isArray(existingSpecs)) {
4210
+ return [...existingSpecs.filter((spec) => spec.type !== "openapi"), { type: "openapi", path: openapiFileName }];
4211
+ }
4212
+ const { openapiPath: _, ...rest } = existingSpecs || {};
4213
+ return { openapiPath: openapiFileName, ...rest };
4214
+ };
4188
4215
  var index_default = async (_, options) => {
4189
4216
  if (!process.env.PROJECT_DIR) {
4190
4217
  process.env.PROJECT_DIR = process.cwd();
@@ -4211,8 +4238,17 @@ var index_default = async (_, options) => {
4211
4238
  const specFiles = Array.isArray(serviceSpec.path) ? serviceSpec.path : [serviceSpec.path];
4212
4239
  const specs = specFiles.map(async (specFile) => {
4213
4240
  try {
4214
- await import_swagger_parser2.default.validate(specFile);
4215
- const document2 = await import_swagger_parser2.default.dereference(specFile);
4241
+ const isUrl = specFile.startsWith("http");
4242
+ const hasHeaders = serviceSpec.headers && Object.keys(serviceSpec.headers).length > 0;
4243
+ let document2;
4244
+ if (isUrl && hasHeaders) {
4245
+ const parsedSpec = await fetchAuthenticatedSpec(specFile, serviceSpec.headers);
4246
+ await import_swagger_parser2.default.validate(parsedSpec);
4247
+ document2 = await import_swagger_parser2.default.dereference(parsedSpec);
4248
+ } else {
4249
+ await import_swagger_parser2.default.validate(specFile);
4250
+ document2 = await import_swagger_parser2.default.dereference(specFile);
4251
+ }
4216
4252
  return {
4217
4253
  document: document2,
4218
4254
  path: specFile,
@@ -4323,16 +4359,14 @@ Processing domain: ${domainName} (v${domainVersion})`));
4323
4359
  serviceAttachments = latestServiceInCatalog.attachments || null;
4324
4360
  serviceWritesTo = latestServiceInCatalog.writesTo || [];
4325
4361
  serviceReadsFrom = latestServiceInCatalog.readsFrom || [];
4326
- serviceSpecifications = {
4327
- ...serviceSpecifications,
4328
- ...persistPreviousSpecificationFiles ? latestServiceInCatalog.specifications : {}
4329
- };
4362
+ if (persistPreviousSpecificationFiles && latestServiceInCatalog.specifications) {
4363
+ serviceSpecifications = mergeOpenApiIntoSpecifications(latestServiceInCatalog.specifications, service.schemaPath);
4364
+ }
4330
4365
  if (latestServiceInCatalog.version === version) {
4331
4366
  receives = latestServiceInCatalog.receives ? (
4332
4367
  // @ts-ignore
4333
4368
  toUniqueArray([...latestServiceInCatalog.receives, ...receives])
4334
4369
  ) : receives;
4335
- console.log("MEOW", "HELLO", latestServiceInCatalog.writesTo, serviceWritesTo);
4336
4370
  serviceWritesTo = latestServiceInCatalog.writesTo ? toUniqueArray([...latestServiceInCatalog.writesTo, ...configuredWritesTo]) : configuredWritesTo;
4337
4371
  serviceReadsFrom = latestServiceInCatalog.readsFrom ? toUniqueArray([...latestServiceInCatalog.readsFrom, ...configuredReadsFrom]) : configuredReadsFrom;
4338
4372
  }
@@ -4380,7 +4414,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
4380
4414
  }
4381
4415
  };
4382
4416
  var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, options) => {
4383
- const operations = await getOperationsByType(pathToSpec, options.httpMethodsToMessages);
4417
+ const operations = await getOperationsByType(pathToSpec, options.httpMethodsToMessages, document2);
4384
4418
  const sidebarBadgeType = options.sidebarBadgeType || "HTTP_METHOD";
4385
4419
  const version = options.serviceVersion || document2.info.version;
4386
4420
  const preserveExistingMessages = options.preserveExistingMessages ?? true;
@@ -4506,7 +4540,11 @@ var getParsedSpecFile = (service, document2) => {
4506
4540
  var getRawSpecFile = async (service) => {
4507
4541
  const specPath = service.path;
4508
4542
  if (specPath.startsWith("http")) {
4509
- const file = await fetch(specPath, { method: "GET" });
4543
+ const fetchOptions = { method: "GET" };
4544
+ if (service.headers && Object.keys(service.headers).length > 0) {
4545
+ fetchOptions.headers = service.headers;
4546
+ }
4547
+ const file = await fetch(specPath, fetchOptions);
4510
4548
  if (!file.ok) {
4511
4549
  throw new Error(`Failed to fetch file: ${specPath}, status: ${file.status}`);
4512
4550
  }