@eventcatalog/generator-openapi 7.9.1 → 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.9.1",
4216
+ version: "7.11.0",
4217
4217
  description: "OpenAPI generator for EventCatalog",
4218
4218
  scripts: {
4219
4219
  build: "tsup",
@@ -4250,7 +4250,7 @@ var package_default = {
4250
4250
  dependencies: {
4251
4251
  "@apidevtools/swagger-parser": "^10.1.0",
4252
4252
  "@changesets/cli": "^2.27.7",
4253
- "@eventcatalog/sdk": "2.17.4",
4253
+ "@eventcatalog/sdk": "^2.18.2",
4254
4254
  chalk: "4.1.2",
4255
4255
  "js-yaml": "^4.1.0",
4256
4256
  "openapi-types": "^12.1.3",
@@ -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));
@@ -4431,7 +4490,8 @@ var index_default = async (_, options) => {
4431
4490
  getService,
4432
4491
  versionService,
4433
4492
  writeService,
4434
- addFileToService
4493
+ addFileToService,
4494
+ getResourcePath
4435
4495
  } = (0, import_sdk2.default)(process.env.PROJECT_DIR);
4436
4496
  const { services = [], saveParsedSpecFile = false } = options;
4437
4497
  for (const serviceSpec of services) {
@@ -4488,10 +4548,6 @@ var index_default = async (_, options) => {
4488
4548
  // @ts-ignore
4489
4549
  isDomainMarkedAsDraft || document2.info?.["x-eventcatalog-draft"] || serviceSpec.draft || null
4490
4550
  );
4491
- let servicePath = options.domain ? (0, import_node_path.join)("../", "domains", options.domain.id, "services", service.id) : (0, import_node_path.join)("../", "services", service.id);
4492
- if (options.writeFilesToRoot) {
4493
- servicePath = service.id;
4494
- }
4495
4551
  if (options.domain) {
4496
4552
  const { id: domainId, name: domainName, version: domainVersion } = options.domain;
4497
4553
  const domain = await getDomain(options.domain.id, domainVersion || "latest");
@@ -4519,6 +4575,22 @@ Processing domain: ${domainName} (v${domainVersion})`));
4519
4575
  }
4520
4576
  await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
4521
4577
  }
4578
+ let servicePath = (0, import_node_path.join)("../", "services", service.id);
4579
+ if (options.domain) {
4580
+ const domainResource = await getResourcePath(
4581
+ process.env.PROJECT_DIR,
4582
+ options.domain.id,
4583
+ options.domain.version
4584
+ );
4585
+ if (domainResource) {
4586
+ servicePath = (0, import_node_path.join)("../", domainResource.directory, "services", service.id);
4587
+ } else {
4588
+ servicePath = (0, import_node_path.join)("../", "domains", options.domain.id, "services", service.id);
4589
+ }
4590
+ }
4591
+ if (options.writeFilesToRoot) {
4592
+ servicePath = service.id;
4593
+ }
4522
4594
  const latestServiceInCatalog = await getService(service.id, "latest");
4523
4595
  const versionTheService = latestServiceInCatalog && isVersionGreaterThan(version, latestServiceInCatalog.version);
4524
4596
  console.log(import_chalk4.default.blue(`Processing service: ${document2.info.title} (v${version})`));
@@ -4529,7 +4601,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
4529
4601
  await versionService(service.id);
4530
4602
  console.log(import_chalk4.default.cyan(` - Versioned previous service (v${latestServiceInCatalog.version})`));
4531
4603
  }
4532
- let { sends, receives } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4604
+ let { sends, receives, allGeneratedMessages } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4533
4605
  ...options,
4534
4606
  owners: service.setMessageOwnersToServiceOwners ? service.owners : [],
4535
4607
  serviceHasMultipleSpecFiles: Array.isArray(serviceSpec.path),
@@ -4610,6 +4682,52 @@ Processing domain: ${domainName} (v${domainVersion})`));
4610
4682
  );
4611
4683
  }
4612
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
+ }
4613
4731
  }
4614
4732
  }
4615
4733
  };
@@ -4650,6 +4768,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4650
4768
  const parseExamples = options.parseExamples ?? true;
4651
4769
  const isDraft = options.isDraft ?? null;
4652
4770
  let receives = [], sends = [];
4771
+ let allGeneratedMessages = [];
4653
4772
  for (const operation of operations) {
4654
4773
  const { requestBodiesAndResponses, sidebar, messageName, ...message2 } = await buildMessage(
4655
4774
  pathToSpec,
@@ -4715,6 +4834,11 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4715
4834
  version: message2.version
4716
4835
  });
4717
4836
  }
4837
+ allGeneratedMessages.push({
4838
+ id: message2.id,
4839
+ version: message2.version,
4840
+ path: operation.path
4841
+ });
4718
4842
  if (requestBodiesAndResponses?.requestBody) {
4719
4843
  await addFileToMessage(
4720
4844
  message2.id,
@@ -4770,7 +4894,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4770
4894
  console.log(import_chalk4.default.yellow(` - Use operationIds to give better unique names for EventCatalog`));
4771
4895
  }
4772
4896
  }
4773
- return { receives, sends };
4897
+ return { receives, sends, allGeneratedMessages };
4774
4898
  };
4775
4899
  var getParsedSpecFile = (service, document2) => {
4776
4900
  const specPath = service.path;