@eventcatalog/generator-openapi 7.10.0 → 7.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2024-2026 EventCatalog Ltd
2
+
3
+ This software is dual-licensed:
4
+
5
+ * For open-source projects: licensed under the GNU Affero General Public
6
+ License v3.0 (AGPL-3.0). See LICENSE-OPENSOURCE.md for the full terms.
7
+
8
+ * For proprietary, internal, or commercial use: licensed under the EventCatalog
9
+ Commercial License. See LICENSE-COMMERCIAL.md for the full terms.
10
+
11
+ If you are using these plugins for internal business purposes and do not wish
12
+ to release your source code under AGPL-3.0, you must obtain a Commercial
13
+ License.
14
+
15
+ To obtain a Commercial License:
16
+ - Purchase a subscription at https://www.eventcatalog.dev/pricing
17
+ - Purchase individual plugins at https://eventcatalog.cloud/
18
+ - Free 14-day trial at https://eventcatalog.cloud/
19
+ - Contact us at hello@eventcatalog.dev
package/dist/index.js CHANGED
@@ -4213,7 +4213,7 @@ var import_node_path = require("path");
4213
4213
  // package.json
4214
4214
  var package_default = {
4215
4215
  name: "@eventcatalog/generator-openapi",
4216
- version: "7.10.0",
4216
+ version: "7.11.1",
4217
4217
  description: "OpenAPI generator for EventCatalog",
4218
4218
  scripts: {
4219
4219
  build: "tsup",
@@ -4390,6 +4390,65 @@ var mergeSpecifications = (existing, incoming, options) => {
4390
4390
  return merged;
4391
4391
  };
4392
4392
 
4393
+ // src/utils/consumers.ts
4394
+ var toArray2 = (value) => Array.isArray(value) ? value : [value];
4395
+ var matchesWildcard = (operationPath, pattern) => {
4396
+ const regexStr = "^" + pattern.replace(/\*/g, "[^/]+(/[^/]+)*") + "$";
4397
+ return new RegExp(regexStr).test(operationPath);
4398
+ };
4399
+ var matchesSingleFilter = (operationPath, filter) => {
4400
+ const checks = [];
4401
+ if (filter.path !== void 0) {
4402
+ const paths = toArray2(filter.path);
4403
+ checks.push(paths.some((p) => operationPath === p));
4404
+ }
4405
+ if (filter.prefix !== void 0) {
4406
+ const prefixes = toArray2(filter.prefix);
4407
+ checks.push(prefixes.some((p) => operationPath.startsWith(p)));
4408
+ }
4409
+ if (filter.suffix !== void 0) {
4410
+ const suffixes = toArray2(filter.suffix);
4411
+ checks.push(suffixes.some((s) => operationPath.endsWith(s)));
4412
+ }
4413
+ if (filter.match !== void 0) {
4414
+ const patterns = toArray2(filter.match);
4415
+ checks.push(patterns.some((p) => matchesWildcard(operationPath, p)));
4416
+ }
4417
+ return checks.length > 0 && checks.every(Boolean);
4418
+ };
4419
+ var filterMessagesByRoutes = (allMessages, routes) => {
4420
+ if (!routes || routes.length === 0) {
4421
+ return allMessages.map(({ id, version }) => ({ id, version }));
4422
+ }
4423
+ const matched = /* @__PURE__ */ new Map();
4424
+ for (const message2 of allMessages) {
4425
+ for (const route of routes) {
4426
+ if (matchesSingleFilter(message2.path, route)) {
4427
+ matched.set(message2.id, { id: message2.id, version: message2.version });
4428
+ break;
4429
+ }
4430
+ }
4431
+ }
4432
+ return Array.from(matched.values());
4433
+ };
4434
+ var mergeSends = (existing, incoming) => {
4435
+ const merged = /* @__PURE__ */ new Map();
4436
+ for (const entry of existing) {
4437
+ merged.set(entry.id, { ...entry });
4438
+ }
4439
+ for (const entry of incoming) {
4440
+ const current = merged.get(entry.id);
4441
+ if (current) {
4442
+ if (current.version !== void 0) {
4443
+ current.version = entry.version;
4444
+ }
4445
+ } else {
4446
+ merged.set(entry.id, { ...entry });
4447
+ }
4448
+ }
4449
+ return Array.from(merged.values());
4450
+ };
4451
+
4393
4452
  // src/index.ts
4394
4453
  var toUniqueArray = (array) => {
4395
4454
  return array.filter((item, index, self) => index === self.findIndex((t) => t.id === item.id && t.version === item.version));
@@ -4542,7 +4601,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
4542
4601
  await versionService(service.id);
4543
4602
  console.log(import_chalk4.default.cyan(` - Versioned previous service (v${latestServiceInCatalog.version})`));
4544
4603
  }
4545
- let { sends, receives } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4604
+ let { sends, receives, allGeneratedMessages } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4546
4605
  ...options,
4547
4606
  owners: service.setMessageOwnersToServiceOwners ? service.owners : [],
4548
4607
  serviceHasMultipleSpecFiles: Array.isArray(serviceSpec.path),
@@ -4623,6 +4682,52 @@ Processing domain: ${domainName} (v${domainVersion})`));
4623
4682
  );
4624
4683
  }
4625
4684
  console.log(import_chalk4.default.cyan(` - Service (v${version}) created`));
4685
+ const consumers = serviceSpec.consumers || [];
4686
+ for (const consumer of consumers) {
4687
+ const consumerVersion = consumer.version || "1.0.0";
4688
+ const filteredSends = filterMessagesByRoutes(allGeneratedMessages, consumer.routes);
4689
+ const existingConsumer = await getService(consumer.id, consumerVersion);
4690
+ if (existingConsumer) {
4691
+ const mergedSends = mergeSends(existingConsumer.sends || [], filteredSends);
4692
+ const consumerResource = await getResourcePath(process.env.PROJECT_DIR, consumer.id, consumerVersion);
4693
+ const consumerWritePath = consumerResource ? (0, import_node_path.join)("../", consumerResource.directory) : consumer.id;
4694
+ await writeService(
4695
+ {
4696
+ ...existingConsumer,
4697
+ ...mergedSends.length > 0 ? { sends: mergedSends } : {}
4698
+ },
4699
+ { path: consumerWritePath, override: true }
4700
+ );
4701
+ } else {
4702
+ let consumerPath = consumer.id;
4703
+ if (options.domain) {
4704
+ const domainResource = await getResourcePath(
4705
+ process.env.PROJECT_DIR,
4706
+ options.domain.id,
4707
+ options.domain.version
4708
+ );
4709
+ if (domainResource) {
4710
+ consumerPath = (0, import_node_path.join)("../", domainResource.directory, "services", consumer.id);
4711
+ } else {
4712
+ consumerPath = (0, import_node_path.join)("../", "domains", options.domain.id, "services", consumer.id);
4713
+ }
4714
+ }
4715
+ await writeService(
4716
+ {
4717
+ id: consumer.id,
4718
+ version: consumerVersion,
4719
+ name: consumer.id,
4720
+ markdown: "<NodeGraph />",
4721
+ ...filteredSends.length > 0 ? { sends: filteredSends } : {}
4722
+ },
4723
+ { path: consumerPath, override: true }
4724
+ );
4725
+ if (options.domain) {
4726
+ await addServiceToDomain(options.domain.id, { id: consumer.id, version: consumerVersion }, options.domain.version);
4727
+ }
4728
+ }
4729
+ console.log(import_chalk4.default.cyan(` - Consumer service: ${consumer.id} (v${consumerVersion}) processed`));
4730
+ }
4626
4731
  }
4627
4732
  }
4628
4733
  };
@@ -4663,6 +4768,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4663
4768
  const parseExamples = options.parseExamples ?? true;
4664
4769
  const isDraft = options.isDraft ?? null;
4665
4770
  let receives = [], sends = [];
4771
+ let allGeneratedMessages = [];
4666
4772
  for (const operation of operations) {
4667
4773
  const { requestBodiesAndResponses, sidebar, messageName, ...message2 } = await buildMessage(
4668
4774
  pathToSpec,
@@ -4728,6 +4834,11 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4728
4834
  version: message2.version
4729
4835
  });
4730
4836
  }
4837
+ allGeneratedMessages.push({
4838
+ id: message2.id,
4839
+ version: message2.version,
4840
+ path: operation.path
4841
+ });
4731
4842
  if (requestBodiesAndResponses?.requestBody) {
4732
4843
  await addFileToMessage(
4733
4844
  message2.id,
@@ -4783,7 +4894,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4783
4894
  console.log(import_chalk4.default.yellow(` - Use operationIds to give better unique names for EventCatalog`));
4784
4895
  }
4785
4896
  }
4786
- return { receives, sends };
4897
+ return { receives, sends, allGeneratedMessages };
4787
4898
  };
4788
4899
  var getParsedSpecFile = (service, document2) => {
4789
4900
  const specPath = service.path;