@eventcatalog/generator-openapi 7.10.0 → 7.11.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
@@ -4208,7 +4208,7 @@ import { join } from "path";
4208
4208
  // package.json
4209
4209
  var package_default = {
4210
4210
  name: "@eventcatalog/generator-openapi",
4211
- version: "7.10.0",
4211
+ version: "7.11.0",
4212
4212
  description: "OpenAPI generator for EventCatalog",
4213
4213
  scripts: {
4214
4214
  build: "tsup",
@@ -4385,6 +4385,65 @@ var mergeSpecifications = (existing, incoming, options) => {
4385
4385
  return merged;
4386
4386
  };
4387
4387
 
4388
+ // src/utils/consumers.ts
4389
+ var toArray2 = (value) => Array.isArray(value) ? value : [value];
4390
+ var matchesWildcard = (operationPath, pattern) => {
4391
+ const regexStr = "^" + pattern.replace(/\*/g, "[^/]+(/[^/]+)*") + "$";
4392
+ return new RegExp(regexStr).test(operationPath);
4393
+ };
4394
+ var matchesSingleFilter = (operationPath, filter) => {
4395
+ const checks = [];
4396
+ if (filter.path !== void 0) {
4397
+ const paths = toArray2(filter.path);
4398
+ checks.push(paths.some((p) => operationPath === p));
4399
+ }
4400
+ if (filter.prefix !== void 0) {
4401
+ const prefixes = toArray2(filter.prefix);
4402
+ checks.push(prefixes.some((p) => operationPath.startsWith(p)));
4403
+ }
4404
+ if (filter.suffix !== void 0) {
4405
+ const suffixes = toArray2(filter.suffix);
4406
+ checks.push(suffixes.some((s) => operationPath.endsWith(s)));
4407
+ }
4408
+ if (filter.match !== void 0) {
4409
+ const patterns = toArray2(filter.match);
4410
+ checks.push(patterns.some((p) => matchesWildcard(operationPath, p)));
4411
+ }
4412
+ return checks.length > 0 && checks.every(Boolean);
4413
+ };
4414
+ var filterMessagesByRoutes = (allMessages, routes) => {
4415
+ if (!routes || routes.length === 0) {
4416
+ return allMessages.map(({ id, version }) => ({ id, version }));
4417
+ }
4418
+ const matched = /* @__PURE__ */ new Map();
4419
+ for (const message2 of allMessages) {
4420
+ for (const route of routes) {
4421
+ if (matchesSingleFilter(message2.path, route)) {
4422
+ matched.set(message2.id, { id: message2.id, version: message2.version });
4423
+ break;
4424
+ }
4425
+ }
4426
+ }
4427
+ return Array.from(matched.values());
4428
+ };
4429
+ var mergeReceives = (existing, incoming) => {
4430
+ const merged = /* @__PURE__ */ new Map();
4431
+ for (const entry of existing) {
4432
+ merged.set(entry.id, { ...entry });
4433
+ }
4434
+ for (const entry of incoming) {
4435
+ const current = merged.get(entry.id);
4436
+ if (current) {
4437
+ if (current.version !== void 0) {
4438
+ current.version = entry.version;
4439
+ }
4440
+ } else {
4441
+ merged.set(entry.id, { ...entry });
4442
+ }
4443
+ }
4444
+ return Array.from(merged.values());
4445
+ };
4446
+
4388
4447
  // src/index.ts
4389
4448
  var toUniqueArray = (array) => {
4390
4449
  return array.filter((item, index, self) => index === self.findIndex((t) => t.id === item.id && t.version === item.version));
@@ -4537,7 +4596,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
4537
4596
  await versionService(service.id);
4538
4597
  console.log(chalk4.cyan(` - Versioned previous service (v${latestServiceInCatalog.version})`));
4539
4598
  }
4540
- let { sends, receives } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4599
+ let { sends, receives, allGeneratedMessages } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4541
4600
  ...options,
4542
4601
  owners: service.setMessageOwnersToServiceOwners ? service.owners : [],
4543
4602
  serviceHasMultipleSpecFiles: Array.isArray(serviceSpec.path),
@@ -4618,6 +4677,52 @@ Processing domain: ${domainName} (v${domainVersion})`));
4618
4677
  );
4619
4678
  }
4620
4679
  console.log(chalk4.cyan(` - Service (v${version}) created`));
4680
+ const consumers = serviceSpec.consumers || [];
4681
+ for (const consumer of consumers) {
4682
+ const consumerVersion = consumer.version || "1.0.0";
4683
+ const filteredReceives = filterMessagesByRoutes(allGeneratedMessages, consumer.routes);
4684
+ const existingConsumer = await getService(consumer.id, consumerVersion);
4685
+ if (existingConsumer) {
4686
+ const mergedReceives = mergeReceives(existingConsumer.receives || [], filteredReceives);
4687
+ const consumerResource = await getResourcePath(process.env.PROJECT_DIR, consumer.id, consumerVersion);
4688
+ const consumerWritePath = consumerResource ? join("../", consumerResource.directory) : consumer.id;
4689
+ await writeService(
4690
+ {
4691
+ ...existingConsumer,
4692
+ ...mergedReceives.length > 0 ? { receives: mergedReceives } : {}
4693
+ },
4694
+ { path: consumerWritePath, override: true }
4695
+ );
4696
+ } else {
4697
+ let consumerPath = consumer.id;
4698
+ if (options.domain) {
4699
+ const domainResource = await getResourcePath(
4700
+ process.env.PROJECT_DIR,
4701
+ options.domain.id,
4702
+ options.domain.version
4703
+ );
4704
+ if (domainResource) {
4705
+ consumerPath = join(domainResource.directory, "services", consumer.id);
4706
+ } else {
4707
+ consumerPath = join("domains", options.domain.id, "services", consumer.id);
4708
+ }
4709
+ }
4710
+ await writeService(
4711
+ {
4712
+ id: consumer.id,
4713
+ version: consumerVersion,
4714
+ name: consumer.id,
4715
+ markdown: "<NodeGraph />",
4716
+ ...filteredReceives.length > 0 ? { receives: filteredReceives } : {}
4717
+ },
4718
+ { path: consumerPath, override: true }
4719
+ );
4720
+ if (options.domain) {
4721
+ await addServiceToDomain(options.domain.id, { id: consumer.id, version: consumerVersion }, options.domain.version);
4722
+ }
4723
+ }
4724
+ console.log(chalk4.cyan(` - Consumer service: ${consumer.id} (v${consumerVersion}) processed`));
4725
+ }
4621
4726
  }
4622
4727
  }
4623
4728
  };
@@ -4658,6 +4763,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4658
4763
  const parseExamples = options.parseExamples ?? true;
4659
4764
  const isDraft = options.isDraft ?? null;
4660
4765
  let receives = [], sends = [];
4766
+ let allGeneratedMessages = [];
4661
4767
  for (const operation of operations) {
4662
4768
  const { requestBodiesAndResponses, sidebar, messageName, ...message2 } = await buildMessage(
4663
4769
  pathToSpec,
@@ -4723,6 +4829,11 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4723
4829
  version: message2.version
4724
4830
  });
4725
4831
  }
4832
+ allGeneratedMessages.push({
4833
+ id: message2.id,
4834
+ version: message2.version,
4835
+ path: operation.path
4836
+ });
4726
4837
  if (requestBodiesAndResponses?.requestBody) {
4727
4838
  await addFileToMessage(
4728
4839
  message2.id,
@@ -4778,7 +4889,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4778
4889
  console.log(chalk4.yellow(` - Use operationIds to give better unique names for EventCatalog`));
4779
4890
  }
4780
4891
  }
4781
- return { receives, sends };
4892
+ return { receives, sends, allGeneratedMessages };
4782
4893
  };
4783
4894
  var getParsedSpecFile = (service, document2) => {
4784
4895
  const specPath = service.path;