@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.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.0",
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 mergeReceives = (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 filteredReceives = filterMessagesByRoutes(allGeneratedMessages, consumer.routes);
4689
+ const existingConsumer = await getService(consumer.id, consumerVersion);
4690
+ if (existingConsumer) {
4691
+ const mergedReceives = mergeReceives(existingConsumer.receives || [], filteredReceives);
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
+ ...mergedReceives.length > 0 ? { receives: mergedReceives } : {}
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
+ ...filteredReceives.length > 0 ? { receives: filteredReceives } : {}
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;