@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.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.9.1",
4211
+ version: "7.11.0",
4212
4212
  description: "OpenAPI generator for EventCatalog",
4213
4213
  scripts: {
4214
4214
  build: "tsup",
@@ -4245,7 +4245,7 @@ var package_default = {
4245
4245
  dependencies: {
4246
4246
  "@apidevtools/swagger-parser": "^10.1.0",
4247
4247
  "@changesets/cli": "^2.27.7",
4248
- "@eventcatalog/sdk": "2.17.4",
4248
+ "@eventcatalog/sdk": "^2.18.2",
4249
4249
  chalk: "4.1.2",
4250
4250
  "js-yaml": "^4.1.0",
4251
4251
  "openapi-types": "^12.1.3",
@@ -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));
@@ -4426,7 +4485,8 @@ var index_default = async (_, options) => {
4426
4485
  getService,
4427
4486
  versionService,
4428
4487
  writeService,
4429
- addFileToService
4488
+ addFileToService,
4489
+ getResourcePath
4430
4490
  } = utils2(process.env.PROJECT_DIR);
4431
4491
  const { services = [], saveParsedSpecFile = false } = options;
4432
4492
  for (const serviceSpec of services) {
@@ -4483,10 +4543,6 @@ var index_default = async (_, options) => {
4483
4543
  // @ts-ignore
4484
4544
  isDomainMarkedAsDraft || document2.info?.["x-eventcatalog-draft"] || serviceSpec.draft || null
4485
4545
  );
4486
- let servicePath = options.domain ? join("../", "domains", options.domain.id, "services", service.id) : join("../", "services", service.id);
4487
- if (options.writeFilesToRoot) {
4488
- servicePath = service.id;
4489
- }
4490
4546
  if (options.domain) {
4491
4547
  const { id: domainId, name: domainName, version: domainVersion } = options.domain;
4492
4548
  const domain = await getDomain(options.domain.id, domainVersion || "latest");
@@ -4514,6 +4570,22 @@ Processing domain: ${domainName} (v${domainVersion})`));
4514
4570
  }
4515
4571
  await addServiceToDomain(domainId, { id: service.id, version: service.version }, domainVersion);
4516
4572
  }
4573
+ let servicePath = join("../", "services", service.id);
4574
+ if (options.domain) {
4575
+ const domainResource = await getResourcePath(
4576
+ process.env.PROJECT_DIR,
4577
+ options.domain.id,
4578
+ options.domain.version
4579
+ );
4580
+ if (domainResource) {
4581
+ servicePath = join("../", domainResource.directory, "services", service.id);
4582
+ } else {
4583
+ servicePath = join("../", "domains", options.domain.id, "services", service.id);
4584
+ }
4585
+ }
4586
+ if (options.writeFilesToRoot) {
4587
+ servicePath = service.id;
4588
+ }
4517
4589
  const latestServiceInCatalog = await getService(service.id, "latest");
4518
4590
  const versionTheService = latestServiceInCatalog && isVersionGreaterThan(version, latestServiceInCatalog.version);
4519
4591
  console.log(chalk4.blue(`Processing service: ${document2.info.title} (v${version})`));
@@ -4524,7 +4596,7 @@ Processing domain: ${domainName} (v${domainVersion})`));
4524
4596
  await versionService(service.id);
4525
4597
  console.log(chalk4.cyan(` - Versioned previous service (v${latestServiceInCatalog.version})`));
4526
4598
  }
4527
- let { sends, receives } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4599
+ let { sends, receives, allGeneratedMessages } = await processMessagesForOpenAPISpec(specPath, document2, servicePath, {
4528
4600
  ...options,
4529
4601
  owners: service.setMessageOwnersToServiceOwners ? service.owners : [],
4530
4602
  serviceHasMultipleSpecFiles: Array.isArray(serviceSpec.path),
@@ -4605,6 +4677,52 @@ Processing domain: ${domainName} (v${domainVersion})`));
4605
4677
  );
4606
4678
  }
4607
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
+ }
4608
4726
  }
4609
4727
  }
4610
4728
  };
@@ -4645,6 +4763,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4645
4763
  const parseExamples = options.parseExamples ?? true;
4646
4764
  const isDraft = options.isDraft ?? null;
4647
4765
  let receives = [], sends = [];
4766
+ let allGeneratedMessages = [];
4648
4767
  for (const operation of operations) {
4649
4768
  const { requestBodiesAndResponses, sidebar, messageName, ...message2 } = await buildMessage(
4650
4769
  pathToSpec,
@@ -4710,6 +4829,11 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4710
4829
  version: message2.version
4711
4830
  });
4712
4831
  }
4832
+ allGeneratedMessages.push({
4833
+ id: message2.id,
4834
+ version: message2.version,
4835
+ path: operation.path
4836
+ });
4713
4837
  if (requestBodiesAndResponses?.requestBody) {
4714
4838
  await addFileToMessage(
4715
4839
  message2.id,
@@ -4765,7 +4889,7 @@ var processMessagesForOpenAPISpec = async (pathToSpec, document2, servicePath, o
4765
4889
  console.log(chalk4.yellow(` - Use operationIds to give better unique names for EventCatalog`));
4766
4890
  }
4767
4891
  }
4768
- return { receives, sends };
4892
+ return { receives, sends, allGeneratedMessages };
4769
4893
  };
4770
4894
  var getParsedSpecFile = (service, document2) => {
4771
4895
  const specPath = service.path;