@eventcatalog/sdk 0.1.3 → 1.0.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/commands.d.mts +27 -1
- package/dist/commands.d.ts +27 -1
- package/dist/commands.js +10 -3
- package/dist/commands.js.map +1 -1
- package/dist/commands.mjs +9 -3
- package/dist/commands.mjs.map +1 -1
- package/dist/domains.js +1 -1
- package/dist/domains.js.map +1 -1
- package/dist/domains.mjs +2 -2
- package/dist/domains.mjs.map +1 -1
- package/dist/events.d.mts +29 -1
- package/dist/events.d.ts +29 -1
- package/dist/events.js +13 -4
- package/dist/events.js.map +1 -1
- package/dist/events.mjs +12 -4
- package/dist/events.mjs.map +1 -1
- package/dist/index.d.mts +43 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +88 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +89 -25
- package/dist/index.mjs.map +1 -1
- package/dist/services.d.mts +28 -1
- package/dist/services.d.ts +28 -1
- package/dist/services.js +31 -4
- package/dist/services.js.map +1 -1
- package/dist/services.mjs +30 -4
- package/dist/services.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -63,7 +63,7 @@ var findFileById = async (catalogDir, id, version) => {
|
|
|
63
63
|
return { ...data, path };
|
|
64
64
|
});
|
|
65
65
|
const semverRange = (0, import_semver.validRange)(version);
|
|
66
|
-
if (semverRange) {
|
|
66
|
+
if (semverRange && (0, import_semver.valid)(version)) {
|
|
67
67
|
const match2 = parsedFiles.filter((c) => (0, import_semver.satisfies)(c.version, semverRange));
|
|
68
68
|
return match2.length > 0 ? match2[0].path : void 0;
|
|
69
69
|
}
|
|
@@ -113,6 +113,17 @@ var copyDir = async (catalogDir, source, target, filter) => {
|
|
|
113
113
|
});
|
|
114
114
|
await import_promises.default.rm(tmpDirectory, { recursive: true });
|
|
115
115
|
};
|
|
116
|
+
var uniqueMessages = (messages) => {
|
|
117
|
+
const uniqueSet = /* @__PURE__ */ new Set();
|
|
118
|
+
return messages.filter((message) => {
|
|
119
|
+
const key = `${message.id}-${message.version}`;
|
|
120
|
+
if (!uniqueSet.has(key)) {
|
|
121
|
+
uniqueSet.add(key);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
});
|
|
126
|
+
};
|
|
116
127
|
|
|
117
128
|
// src/internal/resources.ts
|
|
118
129
|
var import_path = require("path");
|
|
@@ -186,10 +197,17 @@ var getFileFromResource = async (catalogDir, id, file, version) => {
|
|
|
186
197
|
// src/events.ts
|
|
187
198
|
var getEvent = (directory) => async (id, version) => getResource(directory, id, version, { type: "event" });
|
|
188
199
|
var writeEvent = (directory) => async (event, options = { path: "" }) => writeResource(directory, { ...event }, { ...options, type: "event" });
|
|
200
|
+
var writeEventToService = (directory) => async (event, service, options = { path: "" }) => {
|
|
201
|
+
let pathForEvent = service.version && service.version !== "latest" ? `/${service.id}/versioned/${service.version}/events` : `/${service.id}/events`;
|
|
202
|
+
pathForEvent = (0, import_node_path2.join)(pathForEvent, event.id);
|
|
203
|
+
await writeResource(directory, { ...event }, { ...options, path: pathForEvent, type: "event" });
|
|
204
|
+
};
|
|
189
205
|
var rmEvent = (directory) => async (path) => {
|
|
190
206
|
await import_promises3.default.rm((0, import_node_path2.join)(directory, path), { recursive: true });
|
|
191
207
|
};
|
|
192
|
-
var rmEventById = (directory) => async (id, version) =>
|
|
208
|
+
var rmEventById = (directory) => async (id, version) => {
|
|
209
|
+
await rmResourceById(directory, id, version, { type: "event" });
|
|
210
|
+
};
|
|
193
211
|
var versionEvent = (directory) => async (id) => versionResource(directory, id);
|
|
194
212
|
var addFileToEvent = (directory) => async (id, file, version) => addFileToResource(directory, id, file, version);
|
|
195
213
|
var addSchemaToEvent = (directory) => async (id, schema, version) => {
|
|
@@ -205,6 +223,11 @@ var import_promises4 = __toESM(require("fs/promises"));
|
|
|
205
223
|
var import_node_path3 = require("path");
|
|
206
224
|
var getCommand = (directory) => async (id, version) => getResource(directory, id, version, { type: "command" });
|
|
207
225
|
var writeCommand = (directory) => async (command, options = { path: "" }) => writeResource(directory, { ...command }, { ...options, type: "command" });
|
|
226
|
+
var writeCommandToService = (directory) => async (command, service, options = { path: "" }) => {
|
|
227
|
+
let pathForEvent = service.version && service.version !== "latest" ? `/${service.id}/versioned/${service.version}/commands` : `/${service.id}/commands`;
|
|
228
|
+
pathForEvent = (0, import_node_path3.join)(pathForEvent, command.id);
|
|
229
|
+
await writeResource(directory, { ...command }, { ...options, path: pathForEvent, type: "command" });
|
|
230
|
+
};
|
|
208
231
|
var rmCommand = (directory) => async (path) => {
|
|
209
232
|
await import_promises4.default.rm((0, import_node_path3.join)(directory, path), { recursive: true });
|
|
210
233
|
};
|
|
@@ -223,7 +246,21 @@ var commandHasVersion = (directory) => async (id, version) => {
|
|
|
223
246
|
var import_promises5 = __toESM(require("fs/promises"));
|
|
224
247
|
var import_node_path4 = require("path");
|
|
225
248
|
var getService = (directory) => async (id, version) => getResource(directory, id, version, { type: "service" });
|
|
226
|
-
var writeService = (directory) => async (service, options = { path: "" }) =>
|
|
249
|
+
var writeService = (directory) => async (service, options = { path: "" }) => {
|
|
250
|
+
const resource = { ...service };
|
|
251
|
+
if (Array.isArray(service.sends)) {
|
|
252
|
+
resource.sends = uniqueMessages(service.sends);
|
|
253
|
+
}
|
|
254
|
+
if (Array.isArray(service.receives)) {
|
|
255
|
+
resource.receives = uniqueMessages(service.receives);
|
|
256
|
+
}
|
|
257
|
+
return writeResource(directory, resource, { ...options, type: "service" });
|
|
258
|
+
};
|
|
259
|
+
var writeServiceToDomain = (directory) => async (service, domain, options = { path: "" }) => {
|
|
260
|
+
let pathForService = domain.version && domain.version !== "latest" ? `/${domain.id}/versioned/${domain.version}/services` : `/${domain.id}/services`;
|
|
261
|
+
pathForService = (0, import_node_path4.join)(pathForService, service.id);
|
|
262
|
+
await writeResource(directory, { ...service }, { ...options, path: pathForService, type: "service" });
|
|
263
|
+
};
|
|
227
264
|
var versionService = (directory) => async (id) => versionResource(directory, id);
|
|
228
265
|
var rmService = (directory) => async (path) => {
|
|
229
266
|
await import_promises5.default.rm((0, import_node_path4.join)(directory, path), { recursive: true });
|
|
@@ -321,7 +358,7 @@ var src_default = (path) => {
|
|
|
321
358
|
* @param version - Optional id of the version to get (supports semver)
|
|
322
359
|
* @returns Event|Undefined
|
|
323
360
|
*/
|
|
324
|
-
getEvent: getEvent((0, import_node_path6.join)(path
|
|
361
|
+
getEvent: getEvent((0, import_node_path6.join)(path)),
|
|
325
362
|
/**
|
|
326
363
|
* Adds an event to EventCatalog
|
|
327
364
|
*
|
|
@@ -330,6 +367,15 @@ var src_default = (path) => {
|
|
|
330
367
|
*
|
|
331
368
|
*/
|
|
332
369
|
writeEvent: writeEvent((0, import_node_path6.join)(path, "events")),
|
|
370
|
+
/**
|
|
371
|
+
* Adds an event to a service in EventCatalog
|
|
372
|
+
*
|
|
373
|
+
* @param event - The event to write to the service
|
|
374
|
+
* @param service - The service and it's id to write to the event to
|
|
375
|
+
* @param options - Optional options to write the event
|
|
376
|
+
*
|
|
377
|
+
*/
|
|
378
|
+
writeEventToService: writeEventToService((0, import_node_path6.join)(path, "services")),
|
|
333
379
|
/**
|
|
334
380
|
* Remove an event to EventCatalog (modeled on the standard POSIX rm utility)
|
|
335
381
|
*
|
|
@@ -343,12 +389,12 @@ var src_default = (path) => {
|
|
|
343
389
|
* @param id - The id of the event you want to remove
|
|
344
390
|
*
|
|
345
391
|
*/
|
|
346
|
-
rmEventById: rmEventById((0, import_node_path6.join)(path
|
|
392
|
+
rmEventById: rmEventById((0, import_node_path6.join)(path)),
|
|
347
393
|
/**
|
|
348
394
|
* Moves a given event id to the version directory
|
|
349
395
|
* @param directory
|
|
350
396
|
*/
|
|
351
|
-
versionEvent: versionEvent((0, import_node_path6.join)(path
|
|
397
|
+
versionEvent: versionEvent((0, import_node_path6.join)(path)),
|
|
352
398
|
/**
|
|
353
399
|
* Adds a file to the given event
|
|
354
400
|
* @param id - The id of the event to add the file to
|
|
@@ -356,7 +402,7 @@ var src_default = (path) => {
|
|
|
356
402
|
* @param version - Optional version of the event to add the file to
|
|
357
403
|
* @returns
|
|
358
404
|
*/
|
|
359
|
-
addFileToEvent: addFileToEvent((0, import_node_path6.join)(path
|
|
405
|
+
addFileToEvent: addFileToEvent((0, import_node_path6.join)(path)),
|
|
360
406
|
/**
|
|
361
407
|
* Adds a schema to the given event
|
|
362
408
|
* @param id - The id of the event to add the schema to
|
|
@@ -364,14 +410,14 @@ var src_default = (path) => {
|
|
|
364
410
|
* @param version - Optional version of the event to add the schema to
|
|
365
411
|
* @returns
|
|
366
412
|
*/
|
|
367
|
-
addSchemaToEvent: addSchemaToEvent((0, import_node_path6.join)(path
|
|
413
|
+
addSchemaToEvent: addSchemaToEvent((0, import_node_path6.join)(path)),
|
|
368
414
|
/**
|
|
369
415
|
* Check to see if an event version exists
|
|
370
416
|
* @param id - The id of the event
|
|
371
417
|
* @param version - The version of the event (supports semver)
|
|
372
418
|
* @returns
|
|
373
419
|
*/
|
|
374
|
-
eventHasVersion: eventHasVersion((0, import_node_path6.join)(path
|
|
420
|
+
eventHasVersion: eventHasVersion((0, import_node_path6.join)(path)),
|
|
375
421
|
/**
|
|
376
422
|
* ================================
|
|
377
423
|
* Commands
|
|
@@ -383,7 +429,7 @@ var src_default = (path) => {
|
|
|
383
429
|
* @param version - Optional id of the version to get (supports semver)
|
|
384
430
|
* @returns Command|Undefined
|
|
385
431
|
*/
|
|
386
|
-
getCommand: getCommand((0, import_node_path6.join)(path
|
|
432
|
+
getCommand: getCommand((0, import_node_path6.join)(path)),
|
|
387
433
|
/**
|
|
388
434
|
* Adds an command to EventCatalog
|
|
389
435
|
*
|
|
@@ -392,6 +438,15 @@ var src_default = (path) => {
|
|
|
392
438
|
*
|
|
393
439
|
*/
|
|
394
440
|
writeCommand: writeCommand((0, import_node_path6.join)(path, "commands")),
|
|
441
|
+
/**
|
|
442
|
+
* Adds a command to a service in EventCatalog
|
|
443
|
+
*
|
|
444
|
+
* @param command - The command to write to the service
|
|
445
|
+
* @param service - The service and it's id to write to the command to
|
|
446
|
+
* @param options - Optional options to write the command
|
|
447
|
+
*
|
|
448
|
+
*/
|
|
449
|
+
writeCommandToService: writeCommandToService((0, import_node_path6.join)(path, "services")),
|
|
395
450
|
/**
|
|
396
451
|
* Remove an command to EventCatalog (modeled on the standard POSIX rm utility)
|
|
397
452
|
*
|
|
@@ -405,12 +460,12 @@ var src_default = (path) => {
|
|
|
405
460
|
* @param id - The id of the command you want to remove
|
|
406
461
|
*
|
|
407
462
|
*/
|
|
408
|
-
rmCommandById: rmCommandById((0, import_node_path6.join)(path
|
|
463
|
+
rmCommandById: rmCommandById((0, import_node_path6.join)(path)),
|
|
409
464
|
/**
|
|
410
465
|
* Moves a given command id to the version directory
|
|
411
466
|
* @param directory
|
|
412
467
|
*/
|
|
413
|
-
versionCommand: versionCommand((0, import_node_path6.join)(path
|
|
468
|
+
versionCommand: versionCommand((0, import_node_path6.join)(path)),
|
|
414
469
|
/**
|
|
415
470
|
* Adds a file to the given command
|
|
416
471
|
* @param id - The id of the command to add the file to
|
|
@@ -418,7 +473,7 @@ var src_default = (path) => {
|
|
|
418
473
|
* @param version - Optional version of the command to add the file to
|
|
419
474
|
* @returns
|
|
420
475
|
*/
|
|
421
|
-
addFileToCommand: addFileToCommand((0, import_node_path6.join)(path
|
|
476
|
+
addFileToCommand: addFileToCommand((0, import_node_path6.join)(path)),
|
|
422
477
|
/**
|
|
423
478
|
* Adds a schema to the given command
|
|
424
479
|
* @param id - The id of the command to add the schema to
|
|
@@ -426,14 +481,14 @@ var src_default = (path) => {
|
|
|
426
481
|
* @param version - Optional version of the command to add the schema to
|
|
427
482
|
* @returns
|
|
428
483
|
*/
|
|
429
|
-
addSchemaToCommand: addSchemaToCommand((0, import_node_path6.join)(path
|
|
484
|
+
addSchemaToCommand: addSchemaToCommand((0, import_node_path6.join)(path)),
|
|
430
485
|
/**
|
|
431
486
|
* Check to see if a command version exists
|
|
432
487
|
* @param id - The id of the command
|
|
433
488
|
* @param version - The version of the command (supports semver)
|
|
434
489
|
* @returns
|
|
435
490
|
*/
|
|
436
|
-
commandHasVersion: commandHasVersion((0, import_node_path6.join)(path
|
|
491
|
+
commandHasVersion: commandHasVersion((0, import_node_path6.join)(path)),
|
|
437
492
|
/**
|
|
438
493
|
* ================================
|
|
439
494
|
* SERVICES
|
|
@@ -447,18 +502,27 @@ var src_default = (path) => {
|
|
|
447
502
|
*
|
|
448
503
|
*/
|
|
449
504
|
writeService: writeService((0, import_node_path6.join)(path, "services")),
|
|
505
|
+
/**
|
|
506
|
+
* Adds a service to a domain in EventCatalog
|
|
507
|
+
*
|
|
508
|
+
* @param service - The service to write
|
|
509
|
+
* @param domain - The domain to add the service to
|
|
510
|
+
* @param options - Optional options to write the event
|
|
511
|
+
*
|
|
512
|
+
*/
|
|
513
|
+
writeServiceToDomain: writeServiceToDomain((0, import_node_path6.join)(path, "domains")),
|
|
450
514
|
/**
|
|
451
515
|
* Returns a service from EventCatalog
|
|
452
516
|
* @param id - The id of the service to retrieve
|
|
453
517
|
* @param version - Optional id of the version to get (supports semver)
|
|
454
518
|
* @returns Service|Undefined
|
|
455
519
|
*/
|
|
456
|
-
getService: getService((0, import_node_path6.join)(path
|
|
520
|
+
getService: getService((0, import_node_path6.join)(path)),
|
|
457
521
|
/**
|
|
458
522
|
* Moves a given service id to the version directory
|
|
459
523
|
* @param directory
|
|
460
524
|
*/
|
|
461
|
-
versionService: versionService((0, import_node_path6.join)(path
|
|
525
|
+
versionService: versionService((0, import_node_path6.join)(path)),
|
|
462
526
|
/**
|
|
463
527
|
* Remove a service from EventCatalog (modeled on the standard POSIX rm utility)
|
|
464
528
|
*
|
|
@@ -472,7 +536,7 @@ var src_default = (path) => {
|
|
|
472
536
|
* @param id - The id of the service you want to remove
|
|
473
537
|
*
|
|
474
538
|
*/
|
|
475
|
-
rmServiceById: rmServiceById((0, import_node_path6.join)(path
|
|
539
|
+
rmServiceById: rmServiceById((0, import_node_path6.join)(path)),
|
|
476
540
|
/**
|
|
477
541
|
* Adds a file to the given service
|
|
478
542
|
* @param id - The id of the service to add the file to
|
|
@@ -480,21 +544,21 @@ var src_default = (path) => {
|
|
|
480
544
|
* @param version - Optional version of the service to add the file to
|
|
481
545
|
* @returns
|
|
482
546
|
*/
|
|
483
|
-
addFileToService: addFileToService((0, import_node_path6.join)(path
|
|
547
|
+
addFileToService: addFileToService((0, import_node_path6.join)(path)),
|
|
484
548
|
/**
|
|
485
549
|
* Returns the specifications for a given service
|
|
486
550
|
* @param id - The id of the service to retrieve the specifications for
|
|
487
551
|
* @param version - Optional version of the service
|
|
488
552
|
* @returns
|
|
489
553
|
*/
|
|
490
|
-
getSpecificationFilesForService: getSpecificationFilesForService((0, import_node_path6.join)(path
|
|
554
|
+
getSpecificationFilesForService: getSpecificationFilesForService((0, import_node_path6.join)(path)),
|
|
491
555
|
/**
|
|
492
556
|
* Check to see if a service version exists
|
|
493
557
|
* @param id - The id of the service
|
|
494
558
|
* @param version - The version of the service (supports semver)
|
|
495
559
|
* @returns
|
|
496
560
|
*/
|
|
497
|
-
serviceHasVersion: serviceHasVersion((0, import_node_path6.join)(path
|
|
561
|
+
serviceHasVersion: serviceHasVersion((0, import_node_path6.join)(path)),
|
|
498
562
|
/**
|
|
499
563
|
* ================================
|
|
500
564
|
* Domains
|
|
@@ -561,7 +625,7 @@ var src_default = (path) => {
|
|
|
561
625
|
*
|
|
562
626
|
* ```
|
|
563
627
|
*/
|
|
564
|
-
addEventToService: addMessageToService((0, import_node_path6.join)(path
|
|
628
|
+
addEventToService: addMessageToService((0, import_node_path6.join)(path)),
|
|
565
629
|
/**
|
|
566
630
|
* Add a command to a service by it's id.
|
|
567
631
|
*
|
|
@@ -581,14 +645,14 @@ var src_default = (path) => {
|
|
|
581
645
|
*
|
|
582
646
|
* ```
|
|
583
647
|
*/
|
|
584
|
-
addCommandToService: addMessageToService((0, import_node_path6.join)(path
|
|
648
|
+
addCommandToService: addMessageToService((0, import_node_path6.join)(path)),
|
|
585
649
|
/**
|
|
586
650
|
* Check to see if a domain version exists
|
|
587
651
|
* @param id - The id of the domain
|
|
588
652
|
* @param version - The version of the domain (supports semver)
|
|
589
653
|
* @returns
|
|
590
654
|
*/
|
|
591
|
-
domainHasVersion: domainHasVersion((0, import_node_path6.join)(path
|
|
655
|
+
domainHasVersion: domainHasVersion((0, import_node_path6.join)(path)),
|
|
592
656
|
/**
|
|
593
657
|
* Adds a given service to a domain
|
|
594
658
|
* @param id - The id of the domain
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/events.ts","../src/internal/utils.ts","../src/internal/resources.ts","../src/commands.ts","../src/services.ts","../src/domains.ts"],"sourcesContent":["import { join } from 'node:path';\nimport {\n rmEvent,\n rmEventById,\n writeEvent,\n versionEvent,\n getEvent,\n addFileToEvent,\n addSchemaToEvent,\n eventHasVersion,\n} from './events';\nimport {\n rmCommand,\n rmCommandById,\n writeCommand,\n versionCommand,\n getCommand,\n addFileToCommand,\n addSchemaToCommand,\n commandHasVersion,\n} from './commands';\nimport {\n writeService,\n getService,\n versionService,\n rmService,\n rmServiceById,\n addFileToService,\n addMessageToService,\n serviceHasVersion,\n getSpecificationFilesForService,\n} from './services';\nimport {\n writeDomain,\n getDomain,\n versionDomain,\n rmDomain,\n rmDomainById,\n addFileToDomain,\n domainHasVersion,\n addServiceToDomain,\n} from './domains';\n\n/**\n * Init the SDK for EventCatalog\n *\n * @param path - The path to the EventCatalog directory\n *\n */\nexport default (path: string) => {\n return {\n /**\n * Returns an events from EventCatalog\n * @param id - The id of the event to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Event|Undefined\n */\n getEvent: getEvent(join(path, 'events')),\n /**\n * Adds an event to EventCatalog\n *\n * @param event - The event to write\n * @param options - Optional options to write the event\n *\n */\n writeEvent: writeEvent(join(path, 'events')),\n /**\n * Remove an event to EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your event, e.g. `/Inventory/InventoryAdjusted`\n *\n */\n rmEvent: rmEvent(join(path, 'events')),\n /**\n * Remove an event by an Event id\n *\n * @param id - The id of the event you want to remove\n *\n */\n rmEventById: rmEventById(join(path, 'events')),\n /**\n * Moves a given event id to the version directory\n * @param directory\n */\n versionEvent: versionEvent(join(path, 'events')),\n /**\n * Adds a file to the given event\n * @param id - The id of the event to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the event to add the file to\n * @returns\n */\n addFileToEvent: addFileToEvent(join(path, 'events')),\n /**\n * Adds a schema to the given event\n * @param id - The id of the event to add the schema to\n * @param schema - Schema contents to add including the content and the file name\n * @param version - Optional version of the event to add the schema to\n * @returns\n */\n addSchemaToEvent: addSchemaToEvent(join(path, 'events')),\n /**\n * Check to see if an event version exists\n * @param id - The id of the event\n * @param version - The version of the event (supports semver)\n * @returns\n */\n eventHasVersion: eventHasVersion(join(path, 'events')),\n\n /**\n * ================================\n * Commands\n * ================================\n */\n\n /**\n * Returns a command from EventCatalog\n * @param id - The id of the command to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Command|Undefined\n */\n getCommand: getCommand(join(path, 'commands')),\n /**\n * Adds an command to EventCatalog\n *\n * @param command - The command to write\n * @param options - Optional options to write the command\n *\n */\n writeCommand: writeCommand(join(path, 'commands')),\n /**\n * Remove an command to EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your command, e.g. `/Inventory/InventoryAdjusted`\n *\n */\n rmCommand: rmCommand(join(path, 'commands')),\n /**\n * Remove an command by an Event id\n *\n * @param id - The id of the command you want to remove\n *\n */\n rmCommandById: rmCommandById(join(path, 'commands')),\n /**\n * Moves a given command id to the version directory\n * @param directory\n */\n versionCommand: versionCommand(join(path, 'commands')),\n /**\n * Adds a file to the given command\n * @param id - The id of the command to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the command to add the file to\n * @returns\n */\n addFileToCommand: addFileToCommand(join(path, 'commands')),\n /**\n * Adds a schema to the given command\n * @param id - The id of the command to add the schema to\n * @param schema - Schema contents to add including the content and the file name\n * @param version - Optional version of the command to add the schema to\n * @returns\n */\n addSchemaToCommand: addSchemaToCommand(join(path, 'commands')),\n\n /**\n * Check to see if a command version exists\n * @param id - The id of the command\n * @param version - The version of the command (supports semver)\n * @returns\n */\n commandHasVersion: commandHasVersion(join(path, 'commands')),\n\n /**\n * ================================\n * SERVICES\n * ================================\n */\n\n /**\n * Adds a service to EventCatalog\n *\n * @param service - The service to write\n * @param options - Optional options to write the event\n *\n */\n writeService: writeService(join(path, 'services')),\n /**\n * Returns a service from EventCatalog\n * @param id - The id of the service to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Service|Undefined\n */\n getService: getService(join(path, 'services')),\n /**\n * Moves a given service id to the version directory\n * @param directory\n */\n versionService: versionService(join(path, 'services')),\n /**\n * Remove a service from EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your service, e.g. `/InventoryService`\n *\n */\n rmService: rmService(join(path, 'services')),\n /**\n * Remove an service by an service id\n *\n * @param id - The id of the service you want to remove\n *\n */\n rmServiceById: rmServiceById(join(path, 'services')),\n /**\n * Adds a file to the given service\n * @param id - The id of the service to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the service to add the file to\n * @returns\n */\n addFileToService: addFileToService(join(path, 'services')),\n\n /**\n * Returns the specifications for a given service\n * @param id - The id of the service to retrieve the specifications for\n * @param version - Optional version of the service\n * @returns\n */\n getSpecificationFilesForService: getSpecificationFilesForService(join(path, 'services')),\n\n /**\n * Check to see if a service version exists\n * @param id - The id of the service\n * @param version - The version of the service (supports semver)\n * @returns\n */\n serviceHasVersion: serviceHasVersion(join(path, 'services')),\n\n /**\n * ================================\n * Domains\n * ================================\n */\n\n /**\n * Adds a domain to EventCatalog\n *\n * @param domain - The domain to write\n * @param options - Optional options to write the event\n *\n */\n writeDomain: writeDomain(join(path, 'domains')),\n /**\n * Returns a domain from EventCatalog\n * @param id - The id of the domain to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Domain|Undefined\n */\n getDomain: getDomain(join(path, 'domains')),\n /**\n * Moves a given domain id to the version directory\n * @param directory\n */\n versionDomain: versionDomain(join(path, 'domains')),\n /**\n * Remove a domain from EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your domain, e.g. `/Payment`\n *\n */\n rmDomain: rmDomain(join(path, 'domains')),\n /**\n * Remove an service by an domain id\n *\n * @param id - The id of the domain you want to remove\n *\n */\n rmDomainById: rmDomainById(join(path, 'domains')),\n /**\n * Adds a file to the given domain\n * @param id - The id of the domain to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the domain to add the file to\n * @returns\n */\n addFileToDomain: addFileToDomain(join(path, 'domains')),\n /**\n * Add an event to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addEventToService } = utils('/path/to/eventcatalog');\n *\n * // adds a new event (InventoryUpdatedEvent) that the InventoryService will send\n * await addEventToService('InventoryService', 'sends', { event: 'InventoryUpdatedEvent', version: '2.0.0' });\n *\n * // adds a new event (OrderComplete) that the InventoryService will receive\n * await addEventToService('InventoryService', 'receives', { event: 'OrderComplete', version: '2.0.0' });\n *\n * ```\n */\n addEventToService: addMessageToService(join(path, 'services')),\n /**\n * Add a command to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addCommandToService } = utils('/path/to/eventcatalog');\n *\n * // adds a new command (UpdateInventoryCommand) that the InventoryService will send\n * await addCommandToService('InventoryService', 'sends', { command: 'UpdateInventoryCommand', version: '2.0.0' });\n *\n * // adds a new command (VerifyInventory) that the InventoryService will receive\n * await addCommandToService('InventoryService', 'receives', { command: 'VerifyInventory', version: '2.0.0' });\n *\n * ```\n */\n addCommandToService: addMessageToService(join(path, 'services')),\n\n /**\n * Check to see if a domain version exists\n * @param id - The id of the domain\n * @param version - The version of the domain (supports semver)\n * @returns\n */\n domainHasVersion: domainHasVersion(join(path, 'domains')),\n\n /**\n * Adds a given service to a domain\n * @param id - The id of the domain\n * @param service - The id and version of the service to add\n * @param version - (Optional) The version of the domain to add the service to\n * @returns\n */\n addServiceToDomain: addServiceToDomain(join(path, 'domains')),\n };\n};\n","import matter from 'gray-matter';\nimport fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { dirname } from 'node:path';\nimport { copyDir, findFileById, getFiles, searchFilesForId, versionExists } from './internal/utils';\nimport type { Event } from './types';\nimport { addFileToResource, getResource, rmResourceById, versionResource, writeResource } from './internal/resources';\n\n/**\n * Returns an event from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the event\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getEvent } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the event\n * const event = await getEvent('InventoryAdjusted');\n *\n * // Gets a version of the event\n * const event = await getEvent('InventoryAdjusted', '0.0.1');\n * ```\n */\nexport const getEvent =\n (directory: string) =>\n async (id: string, version?: string): Promise<Event> =>\n getResource(directory, id, version, { type: 'event' }) as Promise<Event>;\n\n/**\n * Write an event to EventCatalog.\n *\n * You can optionally overide the path of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeEvent } = utils('/path/to/eventcatalog');\n *\n * // Write an event to the catalog\n * // Event would be written to events/InventoryAdjusted\n * await writeEvent({\n * id: 'InventoryAdjusted',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * });\n *\n * // Write an event to the catalog but override the path\n * // Event would be written to events/Inventory/InventoryAdjusted\n * await writeEvent({\n * id: 'InventoryAdjusted',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/InventoryAdjusted\"});\n * ```\n */\nexport const writeEvent =\n (directory: string) =>\n async (event: Event, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...event }, { ...options, type: 'event' });\n\n/**\n * Delete an event at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmEvent } = utils('/path/to/eventcatalog');\n *\n * // removes an event at the given path (events dir is appended to the given path)\n * // Removes the event at events/InventoryAdjusted\n * await rmEvent('/InventoryAdjusted');\n * ```\n */\nexport const rmEvent = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete an event by it's id.\n *\n * Optionally specify a version to delete a specific version of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmEventById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest InventoryAdjusted event\n * await rmEventById('InventoryAdjusted');\n *\n * // deletes a specific version of the InventoryAdjusted event\n * await rmEventById('InventoryAdjusted', '0.0.1');\n * ```\n */\nexport const rmEventById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'event' });\n\n/**\n * Version an event by it's id.\n *\n * Takes the latest event and moves it to a versioned directory.\n * All files with this event are also versioned (e.g /events/InventoryAdjusted/schema.json)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionEvent } = utils('/path/to/eventcatalog');\n *\n * // moves the latest InventoryAdjusted event to a versioned directory\n * // the version within that event is used as the version number.\n * await versionEvent('InventoryAdjusted');\n *\n * ```\n */\nexport const versionEvent = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Add a file to an event by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToEvent } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest InventoryAdjusted event\n * await addFileToEvent('InventoryAdjusted', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the InventoryAdjusted event\n * await addFileToEvent('InventoryAdjusted', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\nexport const addFileToEvent =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Add a schema to an event by it's id.\n *\n * Optionally specify a version to add a schema to a specific version of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addSchemaToEvent } = utils('/path/to/eventcatalog');\n *\n * // JSON schema example\n * const schema = {\n * \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n * \"type\": \"object\",\n * \"properties\": {\n * \"name\": {\n * \"type\": \"string\"\n * },\n * \"age\": {\n * \"type\": \"number\"\n * }\n * },\n * \"required\": [\"name\", \"age\"]\n * };\n *\n * // adds a schema to the latest InventoryAdjusted event\n * await addSchemaToEvent('InventoryAdjusted', { schema, fileName: 'schema.json' });\n *\n * // adds a file to a specific version of the InventoryAdjusted event\n * await addSchemaToEvent('InventoryAdjusted', { schema, fileName: 'schema.json' }, '0.0.1');\n *\n * ```\n */\nexport const addSchemaToEvent =\n (directory: string) => async (id: string, schema: { schema: string; fileName: string }, version?: string) => {\n await addFileToEvent(directory)(id, { content: schema.schema, fileName: schema.fileName }, version);\n };\n\n/**\n * Check to see if the catalog has a version for the given event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { eventHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await eventHasVersion('InventoryAdjusted', '0.0.1');\n * await eventHasVersion('InventoryAdjusted', 'latest');\n * await eventHasVersion('InventoryAdjusted', '0.0.x');*\n *\n * ```\n */\nexport const eventHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n","import { glob } from 'glob';\nimport fs from 'node:fs/promises';\nimport { copy, CopyFilterAsync, CopyFilterSync } from 'fs-extra';\nimport { join } from 'node:path';\nimport matter from 'gray-matter';\nimport { satisfies, validRange } from 'semver';\n\n/**\n * Returns true if a given version of a resource id exists in the catalog\n */\nexport const versionExists = async (catalogDir: string, id: string, version: string) => {\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = (await searchFilesForId(files, id, version)) || [];\n return matchedFiles.length > 0;\n};\n\nexport const findFileById = async (catalogDir: string, id: string, version?: string): Promise<string | undefined> => {\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = (await searchFilesForId(files, id)) || [];\n const latestVersion = matchedFiles.find((path) => !path.includes('versioned'));\n\n // If no version is provided, return the latest version\n if (!version) {\n return latestVersion;\n }\n\n // map files into gray matter to get versions\n const parsedFiles = matchedFiles.map((path) => {\n const { data } = matter.read(path);\n return { ...data, path };\n }) as any[];\n\n const semverRange = validRange(version);\n\n if (semverRange) {\n const match = parsedFiles.filter((c) => satisfies(c.version, semverRange));\n return match.length > 0 ? match[0].path : undefined;\n }\n\n // Order by version\n const sorted = parsedFiles.sort((a, b) => {\n return a.version.localeCompare(b.version);\n });\n\n // latest version\n const match = sorted.length > 0 ? [sorted[sorted.length - 1]] : [];\n\n if (match.length > 0) {\n return match[0].path;\n }\n};\n\nexport const getFiles = async (pattern: string) => {\n try {\n const files = await glob(pattern, { ignore: 'node_modules/**' });\n return files;\n } catch (error) {\n throw new Error(`Error finding files: ${error}`);\n }\n};\n\nexport const searchFilesForId = async (files: string[], id: string, version?: string) => {\n const idRegex = new RegExp(`^id:\\\\s*(['\"]|>-)?\\\\s*${id}['\"]?\\\\s*$`, 'm');\n const versionRegex = new RegExp(`^version:\\\\s*['\"]?${version}['\"]?\\\\s*$`, 'm');\n\n const matches = await Promise.all(\n files.map(async (file) => {\n const content = await fs.readFile(file, 'utf-8');\n const hasIdMatch = content.match(idRegex);\n\n // Check version if provided\n if (version && !content.match(versionRegex)) {\n return undefined;\n }\n\n if (hasIdMatch) {\n return file;\n }\n })\n );\n\n return matches.filter(Boolean).filter((file) => file !== undefined);\n};\n\n/**\n * Function to copy a directory from source to target, uses a tmp directory\n * @param catalogDir\n * @param source\n * @param target\n * @param filter\n */\nexport const copyDir = async (catalogDir: string, source: string, target: string, filter?: CopyFilterAsync | CopyFilterSync) => {\n const tmpDirectory = join(catalogDir, 'tmp');\n await fs.mkdir(tmpDirectory, { recursive: true });\n\n // Copy everything over\n await copy(source, tmpDirectory, {\n overwrite: true,\n filter,\n });\n\n await copy(tmpDirectory, target, {\n overwrite: true,\n filter,\n });\n\n // Remove the tmp directory\n await fs.rm(tmpDirectory, { recursive: true });\n};\n","import { dirname, join } from 'path';\nimport { copyDir, findFileById, getFiles, searchFilesForId, versionExists } from './utils';\nimport matter from 'gray-matter';\nimport fs from 'node:fs/promises';\nimport { Message, Service } from '../types';\n\ntype Resource = Service | Message;\n\nexport const versionResource = async (catalogDir: string, id: string) => {\n // Find all the events in the directory\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = await searchFilesForId(files, id);\n\n if (matchedFiles.length === 0) {\n throw new Error(`No event found with id: ${id}`);\n }\n\n // Event that is in the route of the project\n const file = matchedFiles[0];\n const sourceDirectory = dirname(file);\n const { data: { version = '0.0.1' } = {} } = matter.read(file);\n const targetDirectory = join(sourceDirectory, 'versioned', version);\n\n await fs.mkdir(targetDirectory, { recursive: true });\n\n // Copy the event to the versioned directory\n await copyDir(catalogDir, sourceDirectory, targetDirectory, (src) => {\n return !src.includes('versioned');\n });\n\n // Remove all the files in the root of the resource as they have now been versioned\n await fs.readdir(sourceDirectory).then(async (resourceFiles) => {\n await Promise.all(\n resourceFiles.map(async (file) => {\n if (file !== 'versioned') {\n await fs.rm(join(sourceDirectory, file), { recursive: true });\n }\n })\n );\n });\n};\n\nexport const writeResource = async (\n catalogDir: string,\n resource: Resource,\n options: { path: string; type: string } = { path: '', type: '' }\n) => {\n // Get the path\n const path = options.path || `/${resource.id}`;\n const exists = await versionExists(catalogDir, resource.id, resource.version);\n\n if (exists) {\n throw new Error(`Failed to write ${options.type} as the version ${resource.version} already exists`);\n }\n\n const { markdown, ...frontmatter } = resource;\n const document = matter.stringify(markdown.trim(), frontmatter);\n await fs.mkdir(join(catalogDir, path), { recursive: true });\n await fs.writeFile(join(catalogDir, path, 'index.md'), document);\n};\n\nexport const getResource = async (\n catalogDir: string,\n id: string,\n version?: string,\n options?: { type: string }\n): Promise<Resource | undefined> => {\n const file = await findFileById(catalogDir, id, version);\n if (!file) return;\n\n const { data, content } = matter.read(file);\n\n return {\n ...data,\n markdown: content.trim(),\n } as Resource;\n};\n\nexport const rmResourceById = async (catalogDir: string, id: string, version?: string, options?: { type: string }) => {\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = await searchFilesForId(files, id, version);\n\n if (matchedFiles.length === 0) {\n throw new Error(`No ${options?.type || 'resource'} found with id: ${id}`);\n }\n\n await Promise.all(matchedFiles.map((file) => fs.rm(file)));\n};\n\nexport const addFileToResource = async (\n catalogDir: string,\n id: string,\n file: { content: string; fileName: string },\n version?: string\n) => {\n const pathToResource = await findFileById(catalogDir, id, version);\n\n if (!pathToResource) throw new Error('Cannot find directory to write file to');\n\n await fs.writeFile(join(dirname(pathToResource), file.fileName), file.content);\n};\n\nexport const getFileFromResource = async (catalogDir: string, id: string, file: { fileName: string }, version?: string) => {\n const pathToResource = await findFileById(catalogDir, id, version);\n\n if (!pathToResource) throw new Error('Cannot find directory of resource');\n\n const exists = await fs\n .access(join(dirname(pathToResource), file.fileName))\n .then(() => true)\n .catch(() => false);\n if (!exists) throw new Error(`File ${file.fileName} does not exist in resource ${id} v(${version})`);\n\n return fs.readFile(join(dirname(pathToResource), file.fileName), 'utf-8');\n};\n","import fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Command } from './types';\nimport { addFileToResource, getResource, rmResourceById, versionResource, writeResource } from './internal/resources';\nimport { findFileById } from './internal/utils';\n\n/**\n * Returns a command from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the command\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getCommand } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the command\n * const command = await getCommand('UpdateInventory');\n *\n * // Gets a version of the command\n * const command = await getCommand('UpdateInventory', '0.0.1');\n * ```\n */\nexport const getCommand =\n (directory: string) =>\n async (id: string, version?: string): Promise<Command> =>\n getResource(directory, id, version, { type: 'command' }) as Promise<Command>;\n\n/**\n * Write a command to EventCatalog.\n *\n * You can optionally override the path of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeCommand } = utils('/path/to/eventcatalog');\n *\n * // Write a command to the catalog\n * // Command would be written to commands/UpdateInventory\n * await writeCommand({\n * id: 'UpdateInventory',\n * name: 'Update Inventory',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * });\n *\n * // Write a command to the catalog but override the path\n * // Command would be written to commands/Inventory/UpdateInventory\n * await writeCommand({\n * id: 'UpdateInventory',\n * name: 'Update Inventory',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/UpdateInventory\"});\n * ```\n */\nexport const writeCommand =\n (directory: string) =>\n async (command: Command, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...command }, { ...options, type: 'command' });\n\n/**\n * Delete a command at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmCommand } = utils('/path/to/eventcatalog');\n *\n * // removes a command at the given path (commands dir is appended to the given path)\n * // Removes the command at commands/UpdateInventory\n * await rmCommand('/UpdateInventory');\n * ```\n */\nexport const rmCommand = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete a command by it's id.\n *\n * Optionally specify a version to delete a specific version of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmCommandById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest UpdateInventory command\n * await rmCommandById('UpdateInventory');\n *\n * // deletes a specific version of the UpdateInventory command\n * await rmCommandById('UpdateInventory', '0.0.1');\n * ```\n */\nexport const rmCommandById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'command' });\n\n/**\n * Version a command by it's id.\n *\n * Takes the latest command and moves it to a versioned directory.\n * All files with this command are also versioned (e.g /commands/UpdateInventory/schema.json)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionCommand } = utils('/path/to/eventcatalog');\n *\n * // moves the latest UpdateInventory command to a versioned directory\n * // the version within that command is used as the version number.\n * await versionCommand('UpdateInventory');\n *\n * ```\n */\nexport const versionCommand = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Add a file to a command by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToCommand } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest UpdateInventory command\n * await addFileToCommand('UpdateInventory', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the UpdateInventory command\n * await addFileToCommand('UpdateInventory', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\nexport const addFileToCommand =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Add a schema to a command by it's id.\n *\n * Optionally specify a version to add a schema to a specific version of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addSchemaToCommand } = utils('/path/to/eventcatalog');\n *\n * // JSON schema example\n * const schema = {\n * \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n * \"type\": \"object\",\n * \"properties\": {\n * \"name\": {\n * \"type\": \"string\"\n * },\n * \"age\": {\n * \"type\": \"number\"\n * }\n * },\n * \"required\": [\"name\", \"age\"]\n * };\n *\n * // adds a schema to the latest UpdateInventory command\n * await addSchemaToCommand('UpdateInventory', { schema, fileName: 'schema.json' });\n *\n * // adds a file to a specific version of the UpdateInventory command\n * await addSchemaToCommand('UpdateInventory', { schema, fileName: 'schema.json' }, '0.0.1');\n *\n * ```\n */\nexport const addSchemaToCommand =\n (directory: string) => async (id: string, schema: { schema: string; fileName: string }, version?: string) => {\n await addFileToCommand(directory)(id, { content: schema.schema, fileName: schema.fileName }, version);\n };\n\n/**\n * Check to see if the catalog has a version for the given command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { commandHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await commandHasVersion('InventoryAdjusted', '0.0.1');\n * await commandHasVersion('InventoryAdjusted', 'latest');\n * await commandHasVersion('InventoryAdjusted', '0.0.x');*\n *\n * ```\n */\nexport const commandHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n","import type { Service, Specifications } from './types';\nimport fs from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport {\n addFileToResource,\n getFileFromResource,\n getResource,\n rmResourceById,\n versionResource,\n writeResource,\n} from './internal/resources';\nimport { findFileById } from './internal/utils';\n\n/**\n * Returns a service from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the service\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getService } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the event\n * const service = await getService('InventoryService');\n *\n * // Gets a version of the event\n * const service = await getService('InventoryService', '0.0.1');\n * ```\n */\nexport const getService =\n (directory: string) =>\n async (id: string, version?: string): Promise<Service> =>\n getResource(directory, id, version, { type: 'service' }) as Promise<Service>;\n/**\n * Write an event to EventCatalog.\n *\n * You can optionally overide the path of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeService } = utils('/path/to/eventcatalog');\n *\n * // Write a service\n * // Event would be written to services/InventoryService\n * await writeService({\n * id: 'InventoryService',\n * name: 'Inventory Service',\n * version: '0.0.1',\n * summary: 'Service that handles the inventory',\n * markdown: '# Hello world',\n * });\n *\n * // Write an event to the catalog but override the path\n * // Event would be written to services/Inventory/InventoryService\n * await writeService({\n * id: 'InventoryService',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/InventoryService\"});\n * ```\n */\nexport const writeService =\n (directory: string) =>\n async (service: Service, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...service }, { ...options, type: 'service' });\n\n/**\n * Version a service by it's id.\n *\n * Takes the latest service and moves it to a versioned directory.\n * All files with this service are also versioned. (e.g /services/InventoryService/openapi.yml)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionService } = utils('/path/to/eventcatalog');\n *\n * // moves the latest InventoryService service to a versioned directory\n * // the version within that service is used as the version number.\n * await versionService('InventoryService');\n *\n * ```\n */\nexport const versionService = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Delete a service at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmService } = utils('/path/to/eventcatalog');\n *\n * // Removes the service at services/InventoryService\n * await rmService('/InventoryService');\n * ```\n */\nexport const rmService = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete a service by it's id.\n *\n * Optionally specify a version to delete a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmServiceById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest InventoryService event\n * await rmServiceById('InventoryService');\n *\n * // deletes a specific version of the InventoryService event\n * await rmServiceById('InventoryService', '0.0.1');\n * ```\n */\nexport const rmServiceById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'service' });\n\n/**\n * Add a file to a service by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToService } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest InventoryService event\n * await addFileToService('InventoryService', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the InventoryService event\n * await addFileToService('InventoryService', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\n\nexport const addFileToService =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Returns specification files for a service\n *\n * Optionally specify a version to of the service\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getSpecificationFilesForService } = utils('/path/to/eventcatalog');\n *\n * // returns a list of specification files for a service\n * await getSpecificationFilesForService('InventoryService', '0.0.1');\n *\n * ```\n */\n\nexport const getSpecificationFilesForService = (directory: string) => async (id: string, version?: string) => {\n let service: Service = await getService(directory)(id, version);\n const filePathToService = await findFileById(directory, id, version);\n\n if (!filePathToService) throw new Error('Cannot find directory of service');\n\n let specs = [] as any;\n if (service.specifications) {\n const serviceSpecifications = service.specifications;\n const specificationFiles = Object.keys(serviceSpecifications);\n\n const getSpecs = specificationFiles.map(async (specFile) => {\n const fileName = serviceSpecifications[specFile as keyof Specifications];\n\n if (!fileName) {\n throw new Error(`Specification file name for ${specFile} is undefined`);\n }\n const rawFile = await getFileFromResource(directory, id, { fileName }, version);\n\n return { key: specFile, content: rawFile, fileName: fileName, path: join(dirname(filePathToService), fileName) };\n });\n\n specs = await Promise.all(getSpecs);\n }\n return specs;\n};\n\n/**\n * Add an event/command to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * // Adds an event to the service or command to the service\n * const { addEventToService, addCommandToService } = utils('/path/to/eventcatalog');\n *\n * // Adds a new event (InventoryUpdatedEvent) that the InventoryService will send\n * await addEventToService('InventoryService', 'sends', { event: 'InventoryUpdatedEvent', version: '2.0.0' });\n * * // Adds a new event (OrderComplete) that the InventoryService will receive\n * await addEventToService('InventoryService', 'receives', { event: 'OrderComplete', version: '1.0.0' });\n *\n * // Adds a new command (UpdateInventoryCommand) that the InventoryService will send\n * await addCommandToService('InventoryService', 'sends', { command: 'UpdateInventoryCommand', version: '2.0.0' });\n * // Adds a new command (VerifyInventory) that the InventoryService will receive\n * await addCommandToService('InventoryService', 'receives', { command: 'VerifyInventory', version: '1.0.0' });\n *\n * ```\n */\n\nexport const addMessageToService =\n (directory: string) => async (id: string, direction: string, event: { id: string; version: string }, version?: string) => {\n let service: Service = await getService(directory)(id, version);\n\n if (direction === 'sends') {\n if (service.sends === undefined) {\n service.sends = [];\n }\n // We first check if the event is already in the list\n for (let i = 0; i < service.sends.length; i++) {\n if (service.sends[i].id === event.id && service.sends[i].version === event.version) {\n return;\n }\n }\n service.sends.push({ id: event.id, version: event.version });\n } else if (direction === 'receives') {\n if (service.receives === undefined) {\n service.receives = [];\n }\n // We first check if the event is already in the list\n for (let i = 0; i < service.receives.length; i++) {\n if (service.receives[i].id === event.id && service.receives[i].version === event.version) {\n return;\n }\n }\n service.receives.push({ id: event.id, version: event.version });\n } else {\n throw new Error(`Direction ${direction} is invalid, only 'receives' and 'sends' are supported`);\n }\n\n await rmServiceById(directory)(id, version);\n await writeService(directory)(service);\n };\n\n/**\n * Check to see if the catalog has a version for the given service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { serviceHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await serviceHasVersion('InventoryService', '0.0.1');\n * await serviceHasVersion('InventoryService', 'latest');\n * await serviceHasVersion('InventoryService', '0.0.x');*\n *\n * ```\n */\nexport const serviceHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n","import type { Domain } from './types';\nimport fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { addFileToResource, getResource, rmResourceById, versionResource, writeResource } from './internal/resources';\nimport { findFileById } from './internal/utils';\n\n/**\n * Returns a domain from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the domain\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getDomain } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the domain\n * const domain = await getDomain('Payment');\n *\n * // Gets a version of the domain\n * const domain = await getDomain('Payment', '0.0.1');\n * ```\n */\nexport const getDomain =\n (directory: string) =>\n async (id: string, version?: string): Promise<Domain> =>\n getResource(directory, id, version, { type: 'domain' }) as Promise<Domain>;\n/**\n * Write a domain to EventCatalog.\n *\n * You can optionally overide the path of the domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeDomain } = utils('/path/to/eventcatalog');\n *\n * // Write a domain\n * // Event would be written to domains/Payment\n * await writeDomain({\n * id: 'Payment',\n * name: 'Payment domain',\n * version: '0.0.1',\n * summary: 'Domain for all things to do with payments',\n * markdown: '# Hello world',\n * });\n *\n * // Write a domain to the catalog but override the path\n * // Event would be written to domains/Inventory/Payment\n * await writeDomain({\n * id: 'Payment',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/Payment\"});\n * ```\n */\nexport const writeDomain =\n (directory: string) =>\n async (domain: Domain, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...domain }, { ...options, type: 'domain' });\n\n/**\n * Version a domain by it's id.\n *\n * Takes the latest domain and moves it to a versioned directory.\n * All files with this domain are also versioned. (e.g /domains/Payment/openapi.yml)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionDomain } = utils('/path/to/eventcatalog');\n *\n * // moves the latest Payment domain to a versioned directory\n * // the version within that domain is used as the version number.\n * await versionDomain('Payment');\n *\n * ```\n */\nexport const versionDomain = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Delete a domain at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmDomain } = utils('/path/to/eventcatalog');\n *\n * // Removes the domain at domains/Payment\n * await rmDomain('/Payment');\n * ```\n */\nexport const rmDomain = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete a domain by it's id.\n *\n * Optionally specify a version to delete a specific version of the domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmDomainById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest Payment event\n * await rmDomainById('Payment');\n *\n * // deletes a specific version of the Payment event\n * await rmDomainById('Payment', '0.0.1');\n * ```\n */\nexport const rmDomainById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'domain' });\n\n/**\n * Add a file to a domain by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToDomain } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest Payment event\n * await addFileToDomain('Payment', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the Payment event\n * await addFileToDomain('Payment', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\n\nexport const addFileToDomain =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Check to see if the catalog has a version for the given domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { domainHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await domainHasVersion('Orders', '0.0.1');\n * await domainHasVersion('Orders', 'latest');\n * await domainHasVersion('Orders', '0.0.x');*\n *\n * ```\n */\nexport const domainHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n\n/**\n * Add an event/command to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * // Adds a service to the domain\n * const { addServiceToDomain } = utils('/path/to/eventcatalog');\n *\n * // Adds a service (Orders Service) to the domain (Orders)\n * await addServiceToDomain('Orders', { service: 'Order Service', version: '2.0.0' });\n * // Adds a service (Orders Service) to the domain (Orders) with a specific version\n * await addServiceToDomain('Orders', { service: 'Order Service', version: '2.0.0' }, '1.0.0');\n * ```\n */\n\nexport const addServiceToDomain =\n (directory: string) => async (id: string, service: { id: string; version: string }, version?: string) => {\n let domain: Domain = await getDomain(directory)(id, version);\n\n if (domain.services === undefined) {\n domain.services = [];\n }\n\n const eventExistsInList = domain.services.some((s) => s.id === service.id && s.version === service.version);\n\n if (eventExistsInList) {\n return;\n }\n\n // Add service to the list\n domain.services.push(service);\n\n await rmDomainById(directory)(id, version);\n await writeDomain(directory)(domain);\n };\n"],"mappings":"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","names":["import_node_path","import_promises","import_node_path","matter","match","fs","import_gray_matter","import_promises","matter","fs","file","fs","import_promises","import_node_path","fs","import_promises","import_node_path","fs","import_promises","import_node_path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/events.ts","../src/internal/utils.ts","../src/internal/resources.ts","../src/commands.ts","../src/services.ts","../src/domains.ts"],"sourcesContent":["import { join } from 'node:path';\nimport {\n rmEvent,\n rmEventById,\n writeEvent,\n writeEventToService,\n versionEvent,\n getEvent,\n addFileToEvent,\n addSchemaToEvent,\n eventHasVersion,\n} from './events';\nimport {\n rmCommand,\n rmCommandById,\n writeCommand,\n writeCommandToService,\n versionCommand,\n getCommand,\n addFileToCommand,\n addSchemaToCommand,\n commandHasVersion,\n} from './commands';\nimport {\n writeService,\n writeServiceToDomain,\n getService,\n versionService,\n rmService,\n rmServiceById,\n addFileToService,\n addMessageToService,\n serviceHasVersion,\n getSpecificationFilesForService,\n} from './services';\nimport {\n writeDomain,\n getDomain,\n versionDomain,\n rmDomain,\n rmDomainById,\n addFileToDomain,\n domainHasVersion,\n addServiceToDomain,\n} from './domains';\n\n/**\n * Init the SDK for EventCatalog\n *\n * @param path - The path to the EventCatalog directory\n *\n */\nexport default (path: string) => {\n return {\n /**\n * Returns an events from EventCatalog\n * @param id - The id of the event to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Event|Undefined\n */\n getEvent: getEvent(join(path)),\n /**\n * Adds an event to EventCatalog\n *\n * @param event - The event to write\n * @param options - Optional options to write the event\n *\n */\n writeEvent: writeEvent(join(path, 'events')),\n /**\n * Adds an event to a service in EventCatalog\n *\n * @param event - The event to write to the service\n * @param service - The service and it's id to write to the event to\n * @param options - Optional options to write the event\n *\n */\n writeEventToService: writeEventToService(join(path, 'services')),\n /**\n * Remove an event to EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your event, e.g. `/Inventory/InventoryAdjusted`\n *\n */\n rmEvent: rmEvent(join(path, 'events')),\n /**\n * Remove an event by an Event id\n *\n * @param id - The id of the event you want to remove\n *\n */\n rmEventById: rmEventById(join(path)),\n /**\n * Moves a given event id to the version directory\n * @param directory\n */\n versionEvent: versionEvent(join(path)),\n /**\n * Adds a file to the given event\n * @param id - The id of the event to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the event to add the file to\n * @returns\n */\n addFileToEvent: addFileToEvent(join(path)),\n /**\n * Adds a schema to the given event\n * @param id - The id of the event to add the schema to\n * @param schema - Schema contents to add including the content and the file name\n * @param version - Optional version of the event to add the schema to\n * @returns\n */\n addSchemaToEvent: addSchemaToEvent(join(path)),\n /**\n * Check to see if an event version exists\n * @param id - The id of the event\n * @param version - The version of the event (supports semver)\n * @returns\n */\n eventHasVersion: eventHasVersion(join(path)),\n\n /**\n * ================================\n * Commands\n * ================================\n */\n\n /**\n * Returns a command from EventCatalog\n * @param id - The id of the command to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Command|Undefined\n */\n getCommand: getCommand(join(path)),\n /**\n * Adds an command to EventCatalog\n *\n * @param command - The command to write\n * @param options - Optional options to write the command\n *\n */\n writeCommand: writeCommand(join(path, 'commands')),\n\n /**\n * Adds a command to a service in EventCatalog\n *\n * @param command - The command to write to the service\n * @param service - The service and it's id to write to the command to\n * @param options - Optional options to write the command\n *\n */\n writeCommandToService: writeCommandToService(join(path, 'services')),\n\n /**\n * Remove an command to EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your command, e.g. `/Inventory/InventoryAdjusted`\n *\n */\n rmCommand: rmCommand(join(path, 'commands')),\n /**\n * Remove an command by an Event id\n *\n * @param id - The id of the command you want to remove\n *\n */\n rmCommandById: rmCommandById(join(path)),\n /**\n * Moves a given command id to the version directory\n * @param directory\n */\n versionCommand: versionCommand(join(path)),\n /**\n * Adds a file to the given command\n * @param id - The id of the command to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the command to add the file to\n * @returns\n */\n addFileToCommand: addFileToCommand(join(path)),\n /**\n * Adds a schema to the given command\n * @param id - The id of the command to add the schema to\n * @param schema - Schema contents to add including the content and the file name\n * @param version - Optional version of the command to add the schema to\n * @returns\n */\n addSchemaToCommand: addSchemaToCommand(join(path)),\n\n /**\n * Check to see if a command version exists\n * @param id - The id of the command\n * @param version - The version of the command (supports semver)\n * @returns\n */\n commandHasVersion: commandHasVersion(join(path)),\n\n /**\n * ================================\n * SERVICES\n * ================================\n */\n\n /**\n * Adds a service to EventCatalog\n *\n * @param service - The service to write\n * @param options - Optional options to write the event\n *\n */\n writeService: writeService(join(path, 'services')),\n\n /**\n * Adds a service to a domain in EventCatalog\n *\n * @param service - The service to write\n * @param domain - The domain to add the service to\n * @param options - Optional options to write the event\n *\n */\n writeServiceToDomain: writeServiceToDomain(join(path, 'domains')),\n /**\n * Returns a service from EventCatalog\n * @param id - The id of the service to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Service|Undefined\n */\n getService: getService(join(path)),\n /**\n * Moves a given service id to the version directory\n * @param directory\n */\n versionService: versionService(join(path)),\n /**\n * Remove a service from EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your service, e.g. `/InventoryService`\n *\n */\n rmService: rmService(join(path, 'services')),\n /**\n * Remove an service by an service id\n *\n * @param id - The id of the service you want to remove\n *\n */\n rmServiceById: rmServiceById(join(path)),\n /**\n * Adds a file to the given service\n * @param id - The id of the service to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the service to add the file to\n * @returns\n */\n addFileToService: addFileToService(join(path)),\n\n /**\n * Returns the specifications for a given service\n * @param id - The id of the service to retrieve the specifications for\n * @param version - Optional version of the service\n * @returns\n */\n getSpecificationFilesForService: getSpecificationFilesForService(join(path)),\n\n /**\n * Check to see if a service version exists\n * @param id - The id of the service\n * @param version - The version of the service (supports semver)\n * @returns\n */\n serviceHasVersion: serviceHasVersion(join(path)),\n\n /**\n * ================================\n * Domains\n * ================================\n */\n\n /**\n * Adds a domain to EventCatalog\n *\n * @param domain - The domain to write\n * @param options - Optional options to write the event\n *\n */\n writeDomain: writeDomain(join(path, 'domains')),\n\n /**\n * Returns a domain from EventCatalog\n * @param id - The id of the domain to retrieve\n * @param version - Optional id of the version to get (supports semver)\n * @returns Domain|Undefined\n */\n getDomain: getDomain(join(path, 'domains')),\n /**\n * Moves a given domain id to the version directory\n * @param directory\n */\n versionDomain: versionDomain(join(path, 'domains')),\n /**\n * Remove a domain from EventCatalog (modeled on the standard POSIX rm utility)\n *\n * @param path - The path to your domain, e.g. `/Payment`\n *\n */\n rmDomain: rmDomain(join(path, 'domains')),\n /**\n * Remove an service by an domain id\n *\n * @param id - The id of the domain you want to remove\n *\n */\n rmDomainById: rmDomainById(join(path, 'domains')),\n /**\n * Adds a file to the given domain\n * @param id - The id of the domain to add the file to\n * @param file - File contents to add including the content and the file name\n * @param version - Optional version of the domain to add the file to\n * @returns\n */\n addFileToDomain: addFileToDomain(join(path, 'domains')),\n /**\n * Add an event to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addEventToService } = utils('/path/to/eventcatalog');\n *\n * // adds a new event (InventoryUpdatedEvent) that the InventoryService will send\n * await addEventToService('InventoryService', 'sends', { event: 'InventoryUpdatedEvent', version: '2.0.0' });\n *\n * // adds a new event (OrderComplete) that the InventoryService will receive\n * await addEventToService('InventoryService', 'receives', { event: 'OrderComplete', version: '2.0.0' });\n *\n * ```\n */\n addEventToService: addMessageToService(join(path)),\n /**\n * Add a command to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addCommandToService } = utils('/path/to/eventcatalog');\n *\n * // adds a new command (UpdateInventoryCommand) that the InventoryService will send\n * await addCommandToService('InventoryService', 'sends', { command: 'UpdateInventoryCommand', version: '2.0.0' });\n *\n * // adds a new command (VerifyInventory) that the InventoryService will receive\n * await addCommandToService('InventoryService', 'receives', { command: 'VerifyInventory', version: '2.0.0' });\n *\n * ```\n */\n addCommandToService: addMessageToService(join(path)),\n\n /**\n * Check to see if a domain version exists\n * @param id - The id of the domain\n * @param version - The version of the domain (supports semver)\n * @returns\n */\n domainHasVersion: domainHasVersion(join(path)),\n\n /**\n * Adds a given service to a domain\n * @param id - The id of the domain\n * @param service - The id and version of the service to add\n * @param version - (Optional) The version of the domain to add the service to\n * @returns\n */\n addServiceToDomain: addServiceToDomain(join(path, 'domains')),\n };\n};\n","import fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { findFileById } from './internal/utils';\nimport type { Event } from './types';\nimport { addFileToResource, getResource, rmResourceById, versionResource, writeResource } from './internal/resources';\n\n/**\n * Returns an event from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the event\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getEvent } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the event\n * const event = await getEvent('InventoryAdjusted');\n *\n * // Gets a version of the event\n * const event = await getEvent('InventoryAdjusted', '0.0.1');\n * ```\n */\nexport const getEvent =\n (directory: string) =>\n async (id: string, version?: string): Promise<Event> =>\n getResource(directory, id, version, { type: 'event' }) as Promise<Event>;\n\n/**\n * Write an event to EventCatalog.\n *\n * You can optionally overide the path of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeEvent } = utils('/path/to/eventcatalog');\n *\n * // Write an event to the catalog\n * // Event would be written to events/InventoryAdjusted\n * await writeEvent({\n * id: 'InventoryAdjusted',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * });\n *\n * // Write an event to the catalog but override the path\n * // Event would be written to events/Inventory/InventoryAdjusted\n * await writeEvent({\n * id: 'InventoryAdjusted',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/InventoryAdjusted\"});\n * ```\n */\nexport const writeEvent =\n (directory: string) =>\n async (event: Event, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...event }, { ...options, type: 'event' });\n/**\n * Write an event to a service in EventCatalog.\n *\n * You can optionally override the path of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeEventToService } = utils('/path/to/eventcatalog');\n *\n * // Write an event to a given service in the catalog\n * // Event would be written to services/Inventory/events/InventoryAdjusted\n * await writeEventToService({\n * id: 'InventoryAdjusted',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { id: 'Inventory' });\n * ```\n */\nexport const writeEventToService =\n (directory: string) =>\n async (event: Event, service: { id: string; version?: string }, options: { path: string } = { path: '' }) => {\n let pathForEvent =\n service.version && service.version !== 'latest'\n ? `/${service.id}/versioned/${service.version}/events`\n : `/${service.id}/events`;\n pathForEvent = join(pathForEvent, event.id);\n await writeResource(directory, { ...event }, { ...options, path: pathForEvent, type: 'event' });\n };\n\n/**\n * Delete an event at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmEvent } = utils('/path/to/eventcatalog');\n *\n * // removes an event at the given path (events dir is appended to the given path)\n * // Removes the event at events/InventoryAdjusted\n * await rmEvent('/InventoryAdjusted');\n * ```\n */\nexport const rmEvent = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete an event by it's id.\n *\n * Optionally specify a version to delete a specific version of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmEventById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest InventoryAdjusted event\n * await rmEventById('InventoryAdjusted');\n *\n * // deletes a specific version of the InventoryAdjusted event\n * await rmEventById('InventoryAdjusted', '0.0.1');\n * ```\n */\nexport const rmEventById = (directory: string) => async (id: string, version?: string) => {\n await rmResourceById(directory, id, version, { type: 'event' });\n};\n\n/**\n * Version an event by it's id.\n *\n * Takes the latest event and moves it to a versioned directory.\n * All files with this event are also versioned (e.g /events/InventoryAdjusted/schema.json)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionEvent } = utils('/path/to/eventcatalog');\n *\n * // moves the latest InventoryAdjusted event to a versioned directory\n * // the version within that event is used as the version number.\n * await versionEvent('InventoryAdjusted');\n *\n * ```\n */\nexport const versionEvent = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Add a file to an event by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToEvent } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest InventoryAdjusted event\n * await addFileToEvent('InventoryAdjusted', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the InventoryAdjusted event\n * await addFileToEvent('InventoryAdjusted', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\nexport const addFileToEvent =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Add a schema to an event by it's id.\n *\n * Optionally specify a version to add a schema to a specific version of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addSchemaToEvent } = utils('/path/to/eventcatalog');\n *\n * // JSON schema example\n * const schema = {\n * \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n * \"type\": \"object\",\n * \"properties\": {\n * \"name\": {\n * \"type\": \"string\"\n * },\n * \"age\": {\n * \"type\": \"number\"\n * }\n * },\n * \"required\": [\"name\", \"age\"]\n * };\n *\n * // adds a schema to the latest InventoryAdjusted event\n * await addSchemaToEvent('InventoryAdjusted', { schema, fileName: 'schema.json' });\n *\n * // adds a file to a specific version of the InventoryAdjusted event\n * await addSchemaToEvent('InventoryAdjusted', { schema, fileName: 'schema.json' }, '0.0.1');\n *\n * ```\n */\nexport const addSchemaToEvent =\n (directory: string) => async (id: string, schema: { schema: string; fileName: string }, version?: string) => {\n await addFileToEvent(directory)(id, { content: schema.schema, fileName: schema.fileName }, version);\n };\n\n/**\n * Check to see if the catalog has a version for the given event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { eventHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await eventHasVersion('InventoryAdjusted', '0.0.1');\n * await eventHasVersion('InventoryAdjusted', 'latest');\n * await eventHasVersion('InventoryAdjusted', '0.0.x');*\n *\n * ```\n */\nexport const eventHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n","import { glob } from 'glob';\nimport fs from 'node:fs/promises';\nimport { copy, CopyFilterAsync, CopyFilterSync } from 'fs-extra';\nimport { join } from 'node:path';\nimport matter from 'gray-matter';\nimport { satisfies, validRange, valid } from 'semver';\n\n/**\n * Returns true if a given version of a resource id exists in the catalog\n */\nexport const versionExists = async (catalogDir: string, id: string, version: string) => {\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = (await searchFilesForId(files, id, version)) || [];\n return matchedFiles.length > 0;\n};\n\nexport const findFileById = async (catalogDir: string, id: string, version?: string): Promise<string | undefined> => {\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = (await searchFilesForId(files, id)) || [];\n const latestVersion = matchedFiles.find((path) => !path.includes('versioned'));\n\n // If no version is provided, return the latest version\n if (!version) {\n return latestVersion;\n }\n\n // map files into gray matter to get versions\n const parsedFiles = matchedFiles.map((path) => {\n const { data } = matter.read(path);\n return { ...data, path };\n }) as any[];\n\n const semverRange = validRange(version);\n\n if (semverRange && valid(version)) {\n const match = parsedFiles.filter((c) => satisfies(c.version, semverRange));\n return match.length > 0 ? match[0].path : undefined;\n }\n\n // Order by version\n const sorted = parsedFiles.sort((a, b) => {\n return a.version.localeCompare(b.version);\n });\n\n // latest version\n const match = sorted.length > 0 ? [sorted[sorted.length - 1]] : [];\n\n if (match.length > 0) {\n return match[0].path;\n }\n};\n\nexport const getFiles = async (pattern: string) => {\n try {\n const files = await glob(pattern, { ignore: 'node_modules/**' });\n return files;\n } catch (error) {\n throw new Error(`Error finding files: ${error}`);\n }\n};\n\nexport const searchFilesForId = async (files: string[], id: string, version?: string) => {\n const idRegex = new RegExp(`^id:\\\\s*(['\"]|>-)?\\\\s*${id}['\"]?\\\\s*$`, 'm');\n const versionRegex = new RegExp(`^version:\\\\s*['\"]?${version}['\"]?\\\\s*$`, 'm');\n\n const matches = await Promise.all(\n files.map(async (file) => {\n const content = await fs.readFile(file, 'utf-8');\n const hasIdMatch = content.match(idRegex);\n\n // Check version if provided\n if (version && !content.match(versionRegex)) {\n return undefined;\n }\n\n if (hasIdMatch) {\n return file;\n }\n })\n );\n\n return matches.filter(Boolean).filter((file) => file !== undefined);\n};\n\n/**\n * Function to copy a directory from source to target, uses a tmp directory\n * @param catalogDir\n * @param source\n * @param target\n * @param filter\n */\nexport const copyDir = async (catalogDir: string, source: string, target: string, filter?: CopyFilterAsync | CopyFilterSync) => {\n const tmpDirectory = join(catalogDir, 'tmp');\n await fs.mkdir(tmpDirectory, { recursive: true });\n\n // Copy everything over\n await copy(source, tmpDirectory, {\n overwrite: true,\n filter,\n });\n\n await copy(tmpDirectory, target, {\n overwrite: true,\n filter,\n });\n\n // Remove the tmp directory\n await fs.rm(tmpDirectory, { recursive: true });\n};\n\n// Makes sure values in sends/recieves are unique\nexport const uniqueMessages = (messages: { id: string; version: string }[]): { id: string; version: string }[] => {\n const uniqueSet = new Set();\n\n return messages.filter((message) => {\n const key = `${message.id}-${message.version}`;\n if (!uniqueSet.has(key)) {\n uniqueSet.add(key);\n return true;\n }\n return false;\n });\n};\n","import { dirname, join } from 'path';\nimport { copyDir, findFileById, getFiles, searchFilesForId, versionExists } from './utils';\nimport matter from 'gray-matter';\nimport fs from 'node:fs/promises';\nimport { Message, Service } from '../types';\n\ntype Resource = Service | Message;\n\nexport const versionResource = async (catalogDir: string, id: string) => {\n // Find all the events in the directory\n const files = await getFiles(`${catalogDir}/**/index.md`);\n const matchedFiles = await searchFilesForId(files, id);\n\n if (matchedFiles.length === 0) {\n throw new Error(`No event found with id: ${id}`);\n }\n\n // Event that is in the route of the project\n const file = matchedFiles[0];\n const sourceDirectory = dirname(file);\n const { data: { version = '0.0.1' } = {} } = matter.read(file);\n const targetDirectory = join(sourceDirectory, 'versioned', version);\n\n await fs.mkdir(targetDirectory, { recursive: true });\n\n // Copy the event to the versioned directory\n await copyDir(catalogDir, sourceDirectory, targetDirectory, (src) => {\n return !src.includes('versioned');\n });\n\n // Remove all the files in the root of the resource as they have now been versioned\n await fs.readdir(sourceDirectory).then(async (resourceFiles) => {\n await Promise.all(\n resourceFiles.map(async (file) => {\n if (file !== 'versioned') {\n await fs.rm(join(sourceDirectory, file), { recursive: true });\n }\n })\n );\n });\n};\n\nexport const writeResource = async (\n catalogDir: string,\n resource: Resource,\n options: { path: string; type: string } = { path: '', type: '' }\n) => {\n // Get the path\n const path = options.path || `/${resource.id}`;\n const exists = await versionExists(catalogDir, resource.id, resource.version);\n\n if (exists) {\n throw new Error(`Failed to write ${options.type} as the version ${resource.version} already exists`);\n }\n\n const { markdown, ...frontmatter } = resource;\n const document = matter.stringify(markdown.trim(), frontmatter);\n await fs.mkdir(join(catalogDir, path), { recursive: true });\n await fs.writeFile(join(catalogDir, path, 'index.md'), document);\n};\n\nexport const getResource = async (\n catalogDir: string,\n id: string,\n version?: string,\n options?: { type: string }\n): Promise<Resource | undefined> => {\n const file = await findFileById(catalogDir, id, version);\n if (!file) return;\n\n const { data, content } = matter.read(file);\n\n return {\n ...data,\n markdown: content.trim(),\n } as Resource;\n};\n\nexport const rmResourceById = async (catalogDir: string, id: string, version?: string, options?: { type: string }) => {\n const files = await getFiles(`${catalogDir}/**/index.md`);\n\n const matchedFiles = await searchFilesForId(files, id, version);\n\n if (matchedFiles.length === 0) {\n throw new Error(`No ${options?.type || 'resource'} found with id: ${id}`);\n }\n\n await Promise.all(matchedFiles.map((file) => fs.rm(file)));\n};\n\nexport const addFileToResource = async (\n catalogDir: string,\n id: string,\n file: { content: string; fileName: string },\n version?: string\n) => {\n const pathToResource = await findFileById(catalogDir, id, version);\n\n if (!pathToResource) throw new Error('Cannot find directory to write file to');\n\n await fs.writeFile(join(dirname(pathToResource), file.fileName), file.content);\n};\n\nexport const getFileFromResource = async (catalogDir: string, id: string, file: { fileName: string }, version?: string) => {\n const pathToResource = await findFileById(catalogDir, id, version);\n\n if (!pathToResource) throw new Error('Cannot find directory of resource');\n\n const exists = await fs\n .access(join(dirname(pathToResource), file.fileName))\n .then(() => true)\n .catch(() => false);\n if (!exists) throw new Error(`File ${file.fileName} does not exist in resource ${id} v(${version})`);\n\n return fs.readFile(join(dirname(pathToResource), file.fileName), 'utf-8');\n};\n","import fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Command } from './types';\nimport { addFileToResource, getResource, rmResourceById, versionResource, writeResource } from './internal/resources';\nimport { findFileById } from './internal/utils';\nimport { addMessageToService } from './services';\n\n/**\n * Returns a command from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the command\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getCommand } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the command\n * const command = await getCommand('UpdateInventory');\n *\n * // Gets a version of the command\n * const command = await getCommand('UpdateInventory', '0.0.1');\n * ```\n */\nexport const getCommand =\n (directory: string) =>\n async (id: string, version?: string): Promise<Command> =>\n getResource(directory, id, version, { type: 'command' }) as Promise<Command>;\n\n/**\n * Write a command to EventCatalog.\n *\n * You can optionally override the path of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeCommand } = utils('/path/to/eventcatalog');\n *\n * // Write a command to the catalog\n * // Command would be written to commands/UpdateInventory\n * await writeCommand({\n * id: 'UpdateInventory',\n * name: 'Update Inventory',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * });\n *\n * // Write a command to the catalog but override the path\n * // Command would be written to commands/Inventory/UpdateInventory\n * await writeCommand({\n * id: 'UpdateInventory',\n * name: 'Update Inventory',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/UpdateInventory\"});\n * ```\n */\nexport const writeCommand =\n (directory: string) =>\n async (command: Command, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...command }, { ...options, type: 'command' });\n\n/**\n * Write an command to a service in EventCatalog.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeCommandToService } = utils('/path/to/eventcatalog');\n *\n * // Write an event to a given service in the catalog\n * // Event would be written to services/Inventory/commands/UpdateInventory\n * await writeCommandToService({\n * id: 'UpdateInventory',\n * name: 'Update Inventory',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { id: 'Inventory' });\n * ```\n */\nexport const writeCommandToService =\n (directory: string) =>\n async (command: Command, service: { id: string; version?: string }, options: { path: string } = { path: '' }) => {\n let pathForEvent =\n service.version && service.version !== 'latest'\n ? `/${service.id}/versioned/${service.version}/commands`\n : `/${service.id}/commands`;\n pathForEvent = join(pathForEvent, command.id);\n\n await writeResource(directory, { ...command }, { ...options, path: pathForEvent, type: 'command' });\n };\n\n/**\n * Delete a command at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmCommand } = utils('/path/to/eventcatalog');\n *\n * // removes a command at the given path (commands dir is appended to the given path)\n * // Removes the command at commands/UpdateInventory\n * await rmCommand('/UpdateInventory');\n * ```\n */\nexport const rmCommand = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete a command by it's id.\n *\n * Optionally specify a version to delete a specific version of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmCommandById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest UpdateInventory command\n * await rmCommandById('UpdateInventory');\n *\n * // deletes a specific version of the UpdateInventory command\n * await rmCommandById('UpdateInventory', '0.0.1');\n * ```\n */\nexport const rmCommandById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'command' });\n\n/**\n * Version a command by it's id.\n *\n * Takes the latest command and moves it to a versioned directory.\n * All files with this command are also versioned (e.g /commands/UpdateInventory/schema.json)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionCommand } = utils('/path/to/eventcatalog');\n *\n * // moves the latest UpdateInventory command to a versioned directory\n * // the version within that command is used as the version number.\n * await versionCommand('UpdateInventory');\n *\n * ```\n */\nexport const versionCommand = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Add a file to a command by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToCommand } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest UpdateInventory command\n * await addFileToCommand('UpdateInventory', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the UpdateInventory command\n * await addFileToCommand('UpdateInventory', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\nexport const addFileToCommand =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Add a schema to a command by it's id.\n *\n * Optionally specify a version to add a schema to a specific version of the command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addSchemaToCommand } = utils('/path/to/eventcatalog');\n *\n * // JSON schema example\n * const schema = {\n * \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n * \"type\": \"object\",\n * \"properties\": {\n * \"name\": {\n * \"type\": \"string\"\n * },\n * \"age\": {\n * \"type\": \"number\"\n * }\n * },\n * \"required\": [\"name\", \"age\"]\n * };\n *\n * // adds a schema to the latest UpdateInventory command\n * await addSchemaToCommand('UpdateInventory', { schema, fileName: 'schema.json' });\n *\n * // adds a file to a specific version of the UpdateInventory command\n * await addSchemaToCommand('UpdateInventory', { schema, fileName: 'schema.json' }, '0.0.1');\n *\n * ```\n */\nexport const addSchemaToCommand =\n (directory: string) => async (id: string, schema: { schema: string; fileName: string }, version?: string) => {\n await addFileToCommand(directory)(id, { content: schema.schema, fileName: schema.fileName }, version);\n };\n\n/**\n * Check to see if the catalog has a version for the given command.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { commandHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await commandHasVersion('InventoryAdjusted', '0.0.1');\n * await commandHasVersion('InventoryAdjusted', 'latest');\n * await commandHasVersion('InventoryAdjusted', '0.0.x');*\n *\n * ```\n */\nexport const commandHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n","import type { Service, Specifications } from './types';\nimport fs from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport {\n addFileToResource,\n getFileFromResource,\n getResource,\n rmResourceById,\n versionResource,\n writeResource,\n} from './internal/resources';\nimport { findFileById, uniqueMessages } from './internal/utils';\n\n/**\n * Returns a service from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the service\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getService } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the event\n * const service = await getService('InventoryService');\n *\n * // Gets a version of the event\n * const service = await getService('InventoryService', '0.0.1');\n * ```\n */\nexport const getService =\n (directory: string) =>\n async (id: string, version?: string): Promise<Service> =>\n getResource(directory, id, version, { type: 'service' }) as Promise<Service>;\n/**\n * Write an event to EventCatalog.\n *\n * You can optionally overide the path of the event.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeService } = utils('/path/to/eventcatalog');\n *\n * // Write a service\n * // Event would be written to services/InventoryService\n * await writeService({\n * id: 'InventoryService',\n * name: 'Inventory Service',\n * version: '0.0.1',\n * summary: 'Service that handles the inventory',\n * markdown: '# Hello world',\n * });\n *\n * // Write an event to the catalog but override the path\n * // Event would be written to services/Inventory/InventoryService\n * await writeService({\n * id: 'InventoryService',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/InventoryService\"});\n * ```\n */\nexport const writeService =\n (directory: string) =>\n async (service: Service, options: { path: string } = { path: '' }) => {\n const resource: Service = { ...service };\n\n if (Array.isArray(service.sends)) {\n resource.sends = uniqueMessages(service.sends);\n }\n\n if (Array.isArray(service.receives)) {\n resource.receives = uniqueMessages(service.receives);\n }\n\n return writeResource(directory, resource, { ...options, type: 'service' });\n };\n\n/**\n * Write a service to a domain in EventCatalog.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeServiceToDomain } = utils('/path/to/eventcatalog');\n *\n * // Write a service to a domain\n * // Service would be written to domains/Shopping/services/InventoryService\n * await writeServiceToDomain({\n * id: 'InventoryService',\n * name: 'Inventory Service',\n * version: '0.0.1',\n * summary: 'Service that handles the inventory',\n * markdown: '# Hello world',\n * }, { id: 'Shopping' });\n * ```\n */\nexport const writeServiceToDomain =\n (directory: string) =>\n async (\n service: Service,\n domain: { id: string; version?: string; direction?: string },\n options: { path: string } = { path: '' }\n ) => {\n let pathForService =\n domain.version && domain.version !== 'latest'\n ? `/${domain.id}/versioned/${domain.version}/services`\n : `/${domain.id}/services`;\n pathForService = join(pathForService, service.id);\n\n //\n await writeResource(directory, { ...service }, { ...options, path: pathForService, type: 'service' });\n };\n\n/**\n * Version a service by it's id.\n *\n * Takes the latest service and moves it to a versioned directory.\n * All files with this service are also versioned. (e.g /services/InventoryService/openapi.yml)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionService } = utils('/path/to/eventcatalog');\n *\n * // moves the latest InventoryService service to a versioned directory\n * // the version within that service is used as the version number.\n * await versionService('InventoryService');\n *\n * ```\n */\nexport const versionService = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Delete a service at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmService } = utils('/path/to/eventcatalog');\n *\n * // Removes the service at services/InventoryService\n * await rmService('/InventoryService');\n * ```\n */\nexport const rmService = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete a service by it's id.\n *\n * Optionally specify a version to delete a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmServiceById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest InventoryService event\n * await rmServiceById('InventoryService');\n *\n * // deletes a specific version of the InventoryService event\n * await rmServiceById('InventoryService', '0.0.1');\n * ```\n */\nexport const rmServiceById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'service' });\n\n/**\n * Add a file to a service by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToService } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest InventoryService event\n * await addFileToService('InventoryService', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the InventoryService event\n * await addFileToService('InventoryService', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\n\nexport const addFileToService =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Returns specification files for a service\n *\n * Optionally specify a version to of the service\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getSpecificationFilesForService } = utils('/path/to/eventcatalog');\n *\n * // returns a list of specification files for a service\n * await getSpecificationFilesForService('InventoryService', '0.0.1');\n *\n * ```\n */\n\nexport const getSpecificationFilesForService = (directory: string) => async (id: string, version?: string) => {\n let service: Service = await getService(directory)(id, version);\n const filePathToService = await findFileById(directory, id, version);\n\n if (!filePathToService) throw new Error('Cannot find directory of service');\n\n let specs = [] as any;\n if (service.specifications) {\n const serviceSpecifications = service.specifications;\n const specificationFiles = Object.keys(serviceSpecifications);\n\n const getSpecs = specificationFiles.map(async (specFile) => {\n const fileName = serviceSpecifications[specFile as keyof Specifications];\n\n if (!fileName) {\n throw new Error(`Specification file name for ${specFile} is undefined`);\n }\n const rawFile = await getFileFromResource(directory, id, { fileName }, version);\n\n return { key: specFile, content: rawFile, fileName: fileName, path: join(dirname(filePathToService), fileName) };\n });\n\n specs = await Promise.all(getSpecs);\n }\n return specs;\n};\n\n/**\n * Add an event/command to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * // Adds an event to the service or command to the service\n * const { addEventToService, addCommandToService } = utils('/path/to/eventcatalog');\n *\n * // Adds a new event (InventoryUpdatedEvent) that the InventoryService will send\n * await addEventToService('InventoryService', 'sends', { event: 'InventoryUpdatedEvent', version: '2.0.0' });\n * * // Adds a new event (OrderComplete) that the InventoryService will receive\n * await addEventToService('InventoryService', 'receives', { event: 'OrderComplete', version: '1.0.0' });\n *\n * // Adds a new command (UpdateInventoryCommand) that the InventoryService will send\n * await addCommandToService('InventoryService', 'sends', { command: 'UpdateInventoryCommand', version: '2.0.0' });\n * // Adds a new command (VerifyInventory) that the InventoryService will receive\n * await addCommandToService('InventoryService', 'receives', { command: 'VerifyInventory', version: '1.0.0' });\n *\n * ```\n */\n\nexport const addMessageToService =\n (directory: string) => async (id: string, direction: string, event: { id: string; version: string }, version?: string) => {\n let service: Service = await getService(directory)(id, version);\n\n if (direction === 'sends') {\n if (service.sends === undefined) {\n service.sends = [];\n }\n // We first check if the event is already in the list\n for (let i = 0; i < service.sends.length; i++) {\n if (service.sends[i].id === event.id && service.sends[i].version === event.version) {\n return;\n }\n }\n service.sends.push({ id: event.id, version: event.version });\n } else if (direction === 'receives') {\n if (service.receives === undefined) {\n service.receives = [];\n }\n // We first check if the event is already in the list\n for (let i = 0; i < service.receives.length; i++) {\n if (service.receives[i].id === event.id && service.receives[i].version === event.version) {\n return;\n }\n }\n service.receives.push({ id: event.id, version: event.version });\n } else {\n throw new Error(`Direction ${direction} is invalid, only 'receives' and 'sends' are supported`);\n }\n\n await rmServiceById(directory)(id, version);\n await writeService(directory)(service);\n };\n\n/**\n * Check to see if the catalog has a version for the given service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { serviceHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await serviceHasVersion('InventoryService', '0.0.1');\n * await serviceHasVersion('InventoryService', 'latest');\n * await serviceHasVersion('InventoryService', '0.0.x');*\n *\n * ```\n */\nexport const serviceHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n","import type { Domain } from './types';\nimport fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { addFileToResource, getResource, rmResourceById, versionResource, writeResource } from './internal/resources';\nimport { findFileById } from './internal/utils';\n\n/**\n * Returns a domain from EventCatalog.\n *\n * You can optionally specify a version to get a specific version of the domain\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { getDomain } = utils('/path/to/eventcatalog');\n *\n * // Gets the latest version of the domain\n * const domain = await getDomain('Payment');\n *\n * // Gets a version of the domain\n * const domain = await getDomain('Payment', '0.0.1');\n * ```\n */\nexport const getDomain =\n (directory: string) =>\n async (id: string, version?: string): Promise<Domain> =>\n getResource(directory, id, version, { type: 'domain' }) as Promise<Domain>;\n/**\n * Write a domain to EventCatalog.\n *\n * You can optionally overide the path of the domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { writeDomain } = utils('/path/to/eventcatalog');\n *\n * // Write a domain\n * // Event would be written to domains/Payment\n * await writeDomain({\n * id: 'Payment',\n * name: 'Payment domain',\n * version: '0.0.1',\n * summary: 'Domain for all things to do with payments',\n * markdown: '# Hello world',\n * });\n *\n * // Write a domain to the catalog but override the path\n * // Event would be written to domains/Inventory/Payment\n * await writeDomain({\n * id: 'Payment',\n * name: 'Inventory Adjusted',\n * version: '0.0.1',\n * summary: 'This is a summary',\n * markdown: '# Hello world',\n * }, { path: \"/Inventory/Payment\"});\n * ```\n */\nexport const writeDomain =\n (directory: string) =>\n async (domain: Domain, options: { path: string } = { path: '' }) =>\n writeResource(directory, { ...domain }, { ...options, type: 'domain' });\n\n/**\n * Version a domain by it's id.\n *\n * Takes the latest domain and moves it to a versioned directory.\n * All files with this domain are also versioned. (e.g /domains/Payment/openapi.yml)\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { versionDomain } = utils('/path/to/eventcatalog');\n *\n * // moves the latest Payment domain to a versioned directory\n * // the version within that domain is used as the version number.\n * await versionDomain('Payment');\n *\n * ```\n */\nexport const versionDomain = (directory: string) => async (id: string) => versionResource(directory, id);\n\n/**\n * Delete a domain at it's given path.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmDomain } = utils('/path/to/eventcatalog');\n *\n * // Removes the domain at domains/Payment\n * await rmDomain('/Payment');\n * ```\n */\nexport const rmDomain = (directory: string) => async (path: string) => {\n await fs.rm(join(directory, path), { recursive: true });\n};\n\n/**\n * Delete a domain by it's id.\n *\n * Optionally specify a version to delete a specific version of the domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { rmDomainById } = utils('/path/to/eventcatalog');\n *\n * // deletes the latest Payment event\n * await rmDomainById('Payment');\n *\n * // deletes a specific version of the Payment event\n * await rmDomainById('Payment', '0.0.1');\n * ```\n */\nexport const rmDomainById = (directory: string) => async (id: string, version?: string) =>\n rmResourceById(directory, id, version, { type: 'domain' });\n\n/**\n * Add a file to a domain by it's id.\n *\n * Optionally specify a version to add a file to a specific version of the domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { addFileToDomain } = utils('/path/to/eventcatalog');\n *\n * // adds a file to the latest Payment event\n * await addFileToDomain('Payment', { content: 'Hello world', fileName: 'hello.txt' });\n *\n * // adds a file to a specific version of the Payment event\n * await addFileToDomain('Payment', { content: 'Hello world', fileName: 'hello.txt' }, '0.0.1');\n *\n * ```\n */\n\nexport const addFileToDomain =\n (directory: string) => async (id: string, file: { content: string; fileName: string }, version?: string) =>\n addFileToResource(directory, id, file, version);\n\n/**\n * Check to see if the catalog has a version for the given domain.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * const { domainHasVersion } = utils('/path/to/eventcatalog');\n *\n * // returns true if version is found for the given event and version (supports semver)\n * await domainHasVersion('Orders', '0.0.1');\n * await domainHasVersion('Orders', 'latest');\n * await domainHasVersion('Orders', '0.0.x');*\n *\n * ```\n */\nexport const domainHasVersion = (directory: string) => async (id: string, version: string) => {\n const file = await findFileById(directory, id, version);\n return !!file;\n};\n\n/**\n * Add an event/command to a service by it's id.\n *\n * Optionally specify a version to add the event to a specific version of the service.\n *\n * @example\n * ```ts\n * import utils from '@eventcatalog/utils';\n *\n * // Adds a service to the domain\n * const { addServiceToDomain } = utils('/path/to/eventcatalog');\n *\n * // Adds a service (Orders Service) to the domain (Orders)\n * await addServiceToDomain('Orders', { service: 'Order Service', version: '2.0.0' });\n * // Adds a service (Orders Service) to the domain (Orders) with a specific version\n * await addServiceToDomain('Orders', { service: 'Order Service', version: '2.0.0' }, '1.0.0');\n * ```\n */\n\nexport const addServiceToDomain =\n (directory: string) => async (id: string, service: { id: string; version: string }, version?: string) => {\n let domain: Domain = await getDomain(directory)(id, version);\n\n if (domain.services === undefined) {\n domain.services = [];\n }\n\n const eventExistsInList = domain.services.some((s) => s.id === service.id && s.version === service.version);\n\n if (eventExistsInList) {\n return;\n }\n\n // Add service to the list\n domain.services.push(service);\n\n await rmDomainById(directory)(id, version);\n await writeDomain(directory)(domain);\n };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,oBAAqB;;;ACArB,IAAAC,mBAAe;AACf,IAAAC,oBAAqB;;;ACDrB,kBAAqB;AACrB,sBAAe;AACf,sBAAsD;AACtD,uBAAqB;AACrB,yBAAmB;AACnB,oBAA6C;AAKtC,IAAM,gBAAgB,OAAO,YAAoB,IAAY,YAAoB;AACtF,QAAM,QAAQ,MAAM,SAAS,GAAG,UAAU,cAAc;AACxD,QAAM,eAAgB,MAAM,iBAAiB,OAAO,IAAI,OAAO,KAAM,CAAC;AACtE,SAAO,aAAa,SAAS;AAC/B;AAEO,IAAM,eAAe,OAAO,YAAoB,IAAY,YAAkD;AACnH,QAAM,QAAQ,MAAM,SAAS,GAAG,UAAU,cAAc;AACxD,QAAM,eAAgB,MAAM,iBAAiB,OAAO,EAAE,KAAM,CAAC;AAC7D,QAAM,gBAAgB,aAAa,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,WAAW,CAAC;AAG7E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,aAAa,IAAI,CAAC,SAAS;AAC7C,UAAM,EAAE,KAAK,IAAI,mBAAAC,QAAO,KAAK,IAAI;AACjC,WAAO,EAAE,GAAG,MAAM,KAAK;AAAA,EACzB,CAAC;AAED,QAAM,kBAAc,0BAAW,OAAO;AAEtC,MAAI,mBAAe,qBAAM,OAAO,GAAG;AACjC,UAAMC,SAAQ,YAAY,OAAO,CAAC,UAAM,yBAAU,EAAE,SAAS,WAAW,CAAC;AACzE,WAAOA,OAAM,SAAS,IAAIA,OAAM,CAAC,EAAE,OAAO;AAAA,EAC5C;AAGA,QAAM,SAAS,YAAY,KAAK,CAAC,GAAG,MAAM;AACxC,WAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,EAC1C,CAAC;AAGD,QAAM,QAAQ,OAAO,SAAS,IAAI,CAAC,OAAO,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC;AAEjE,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,MAAM,CAAC,EAAE;AAAA,EAClB;AACF;AAEO,IAAM,WAAW,OAAO,YAAoB;AACjD,MAAI;AACF,UAAM,QAAQ,UAAM,kBAAK,SAAS,EAAE,QAAQ,kBAAkB,CAAC;AAC/D,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,EACjD;AACF;AAEO,IAAM,mBAAmB,OAAO,OAAiB,IAAY,YAAqB;AACvF,QAAM,UAAU,IAAI,OAAO,yBAAyB,EAAE,cAAc,GAAG;AACvE,QAAM,eAAe,IAAI,OAAO,qBAAqB,OAAO,cAAc,GAAG;AAE7E,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,MAAM,IAAI,OAAO,SAAS;AACxB,YAAM,UAAU,MAAM,gBAAAC,QAAG,SAAS,MAAM,OAAO;AAC/C,YAAM,aAAa,QAAQ,MAAM,OAAO;AAGxC,UAAI,WAAW,CAAC,QAAQ,MAAM,YAAY,GAAG;AAC3C,eAAO;AAAA,MACT;AAEA,UAAI,YAAY;AACd,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,OAAO,OAAO,EAAE,OAAO,CAAC,SAAS,SAAS,MAAS;AACpE;AASO,IAAM,UAAU,OAAO,YAAoB,QAAgB,QAAgB,WAA8C;AAC9H,QAAM,mBAAe,uBAAK,YAAY,KAAK;AAC3C,QAAM,gBAAAA,QAAG,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAGhD,YAAM,sBAAK,QAAQ,cAAc;AAAA,IAC/B,WAAW;AAAA,IACX;AAAA,EACF,CAAC;AAED,YAAM,sBAAK,cAAc,QAAQ;AAAA,IAC/B,WAAW;AAAA,IACX;AAAA,EACF,CAAC;AAGD,QAAM,gBAAAA,QAAG,GAAG,cAAc,EAAE,WAAW,KAAK,CAAC;AAC/C;AAGO,IAAM,iBAAiB,CAAC,aAAmF;AAChH,QAAM,YAAY,oBAAI,IAAI;AAE1B,SAAO,SAAS,OAAO,CAAC,YAAY;AAClC,UAAM,MAAM,GAAG,QAAQ,EAAE,IAAI,QAAQ,OAAO;AAC5C,QAAI,CAAC,UAAU,IAAI,GAAG,GAAG;AACvB,gBAAU,IAAI,GAAG;AACjB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;AC1HA,kBAA8B;AAE9B,IAAAC,sBAAmB;AACnB,IAAAC,mBAAe;AAKR,IAAM,kBAAkB,OAAO,YAAoB,OAAe;AAEvE,QAAM,QAAQ,MAAM,SAAS,GAAG,UAAU,cAAc;AACxD,QAAM,eAAe,MAAM,iBAAiB,OAAO,EAAE;AAErD,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,2BAA2B,EAAE,EAAE;AAAA,EACjD;AAGA,QAAM,OAAO,aAAa,CAAC;AAC3B,QAAM,sBAAkB,qBAAQ,IAAI;AACpC,QAAM,EAAE,MAAM,EAAE,UAAU,QAAQ,IAAI,CAAC,EAAE,IAAI,oBAAAC,QAAO,KAAK,IAAI;AAC7D,QAAM,sBAAkB,kBAAK,iBAAiB,aAAa,OAAO;AAElE,QAAM,iBAAAC,QAAG,MAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAGnD,QAAM,QAAQ,YAAY,iBAAiB,iBAAiB,CAAC,QAAQ;AACnE,WAAO,CAAC,IAAI,SAAS,WAAW;AAAA,EAClC,CAAC;AAGD,QAAM,iBAAAA,QAAG,QAAQ,eAAe,EAAE,KAAK,OAAO,kBAAkB;AAC9D,UAAM,QAAQ;AAAA,MACZ,cAAc,IAAI,OAAOC,UAAS;AAChC,YAAIA,UAAS,aAAa;AACxB,gBAAM,iBAAAD,QAAG,OAAG,kBAAK,iBAAiBC,KAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEO,IAAM,gBAAgB,OAC3B,YACA,UACA,UAA0C,EAAE,MAAM,IAAI,MAAM,GAAG,MAC5D;AAEH,QAAM,OAAO,QAAQ,QAAQ,IAAI,SAAS,EAAE;AAC5C,QAAM,SAAS,MAAM,cAAc,YAAY,SAAS,IAAI,SAAS,OAAO;AAE5E,MAAI,QAAQ;AACV,UAAM,IAAI,MAAM,mBAAmB,QAAQ,IAAI,mBAAmB,SAAS,OAAO,iBAAiB;AAAA,EACrG;AAEA,QAAM,EAAE,UAAU,GAAG,YAAY,IAAI;AACrC,QAAM,WAAW,oBAAAF,QAAO,UAAU,SAAS,KAAK,GAAG,WAAW;AAC9D,QAAM,iBAAAC,QAAG,UAAM,kBAAK,YAAY,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAM,iBAAAA,QAAG,cAAU,kBAAK,YAAY,MAAM,UAAU,GAAG,QAAQ;AACjE;AAEO,IAAM,cAAc,OACzB,YACA,IACA,SACA,YACkC;AAClC,QAAM,OAAO,MAAM,aAAa,YAAY,IAAI,OAAO;AACvD,MAAI,CAAC,KAAM;AAEX,QAAM,EAAE,MAAM,QAAQ,IAAI,oBAAAD,QAAO,KAAK,IAAI;AAE1C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,QAAQ,KAAK;AAAA,EACzB;AACF;AAEO,IAAM,iBAAiB,OAAO,YAAoB,IAAY,SAAkB,YAA+B;AACpH,QAAM,QAAQ,MAAM,SAAS,GAAG,UAAU,cAAc;AAExD,QAAM,eAAe,MAAM,iBAAiB,OAAO,IAAI,OAAO;AAE9D,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,IAAI,MAAM,MAAM,SAAS,QAAQ,UAAU,mBAAmB,EAAE,EAAE;AAAA,EAC1E;AAEA,QAAM,QAAQ,IAAI,aAAa,IAAI,CAAC,SAAS,iBAAAC,QAAG,GAAG,IAAI,CAAC,CAAC;AAC3D;AAEO,IAAM,oBAAoB,OAC/B,YACA,IACA,MACA,YACG;AACH,QAAM,iBAAiB,MAAM,aAAa,YAAY,IAAI,OAAO;AAEjE,MAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,wCAAwC;AAE7E,QAAM,iBAAAA,QAAG,cAAU,sBAAK,qBAAQ,cAAc,GAAG,KAAK,QAAQ,GAAG,KAAK,OAAO;AAC/E;AAEO,IAAM,sBAAsB,OAAO,YAAoB,IAAY,MAA4B,YAAqB;AACzH,QAAM,iBAAiB,MAAM,aAAa,YAAY,IAAI,OAAO;AAEjE,MAAI,CAAC,eAAgB,OAAM,IAAI,MAAM,mCAAmC;AAExE,QAAM,SAAS,MAAM,iBAAAA,QAClB,WAAO,sBAAK,qBAAQ,cAAc,GAAG,KAAK,QAAQ,CAAC,EACnD,KAAK,MAAM,IAAI,EACf,MAAM,MAAM,KAAK;AACpB,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,QAAQ,KAAK,QAAQ,+BAA+B,EAAE,MAAM,OAAO,GAAG;AAEnG,SAAO,iBAAAA,QAAG,aAAS,sBAAK,qBAAQ,cAAc,GAAG,KAAK,QAAQ,GAAG,OAAO;AAC1E;;;AF3FO,IAAM,WACX,CAAC,cACD,OAAO,IAAY,YACjB,YAAY,WAAW,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAC;AAkClD,IAAM,aACX,CAAC,cACD,OAAO,OAAc,UAA4B,EAAE,MAAM,GAAG,MAC1D,cAAc,WAAW,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,SAAS,MAAM,QAAQ,CAAC;AAuBjE,IAAM,sBACX,CAAC,cACD,OAAO,OAAc,SAA2C,UAA4B,EAAE,MAAM,GAAG,MAAM;AAC3G,MAAI,eACF,QAAQ,WAAW,QAAQ,YAAY,WACnC,IAAI,QAAQ,EAAE,cAAc,QAAQ,OAAO,YAC3C,IAAI,QAAQ,EAAE;AACpB,qBAAe,wBAAK,cAAc,MAAM,EAAE;AAC1C,QAAM,cAAc,WAAW,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,SAAS,MAAM,cAAc,MAAM,QAAQ,CAAC;AAChG;AAgBK,IAAM,UAAU,CAAC,cAAsB,OAAO,SAAiB;AACpE,QAAM,iBAAAE,QAAG,OAAG,wBAAK,WAAW,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD;AAoBO,IAAM,cAAc,CAAC,cAAsB,OAAO,IAAY,YAAqB;AACxF,QAAM,eAAe,WAAW,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAC;AAChE;AAoBO,IAAM,eAAe,CAAC,cAAsB,OAAO,OAAe,gBAAgB,WAAW,EAAE;AAqB/F,IAAM,iBACX,CAAC,cAAsB,OAAO,IAAY,MAA6C,YACrF,kBAAkB,WAAW,IAAI,MAAM,OAAO;AAoC3C,IAAM,mBACX,CAAC,cAAsB,OAAO,IAAY,QAA8C,YAAqB;AAC3G,QAAM,eAAe,SAAS,EAAE,IAAI,EAAE,SAAS,OAAO,QAAQ,UAAU,OAAO,SAAS,GAAG,OAAO;AACpG;AAkBK,IAAM,kBAAkB,CAAC,cAAsB,OAAO,IAAY,YAAoB;AAC3F,QAAM,OAAO,MAAM,aAAa,WAAW,IAAI,OAAO;AACtD,SAAO,CAAC,CAAC;AACX;;;AG/OA,IAAAC,mBAAe;AACf,IAAAC,oBAAqB;AAwBd,IAAM,aACX,CAAC,cACD,OAAO,IAAY,YACjB,YAAY,WAAW,IAAI,SAAS,EAAE,MAAM,UAAU,CAAC;AAkCpD,IAAM,eACX,CAAC,cACD,OAAO,SAAkB,UAA4B,EAAE,MAAM,GAAG,MAC9D,cAAc,WAAW,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,SAAS,MAAM,UAAU,CAAC;AAsBrE,IAAM,wBACX,CAAC,cACD,OAAO,SAAkB,SAA2C,UAA4B,EAAE,MAAM,GAAG,MAAM;AAC/G,MAAI,eACF,QAAQ,WAAW,QAAQ,YAAY,WACnC,IAAI,QAAQ,EAAE,cAAc,QAAQ,OAAO,cAC3C,IAAI,QAAQ,EAAE;AACpB,qBAAe,wBAAK,cAAc,QAAQ,EAAE;AAE5C,QAAM,cAAc,WAAW,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,SAAS,MAAM,cAAc,MAAM,UAAU,CAAC;AACpG;AAgBK,IAAM,YAAY,CAAC,cAAsB,OAAO,SAAiB;AACtE,QAAM,iBAAAC,QAAG,OAAG,wBAAK,WAAW,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD;AAoBO,IAAM,gBAAgB,CAAC,cAAsB,OAAO,IAAY,YACrE,eAAe,WAAW,IAAI,SAAS,EAAE,MAAM,UAAU,CAAC;AAoBrD,IAAM,iBAAiB,CAAC,cAAsB,OAAO,OAAe,gBAAgB,WAAW,EAAE;AAqBjG,IAAM,mBACX,CAAC,cAAsB,OAAO,IAAY,MAA6C,YACrF,kBAAkB,WAAW,IAAI,MAAM,OAAO;AAoC3C,IAAM,qBACX,CAAC,cAAsB,OAAO,IAAY,QAA8C,YAAqB;AAC3G,QAAM,iBAAiB,SAAS,EAAE,IAAI,EAAE,SAAS,OAAO,QAAQ,UAAU,OAAO,SAAS,GAAG,OAAO;AACtG;AAkBK,IAAM,oBAAoB,CAAC,cAAsB,OAAO,IAAY,YAAoB;AAC7F,QAAM,OAAO,MAAM,aAAa,WAAW,IAAI,OAAO;AACtD,SAAO,CAAC,CAAC;AACX;;;AC9OA,IAAAC,mBAAe;AACf,IAAAC,oBAA8B;AA6BvB,IAAM,aACX,CAAC,cACD,OAAO,IAAY,YACjB,YAAY,WAAW,IAAI,SAAS,EAAE,MAAM,UAAU,CAAC;AAiCpD,IAAM,eACX,CAAC,cACD,OAAO,SAAkB,UAA4B,EAAE,MAAM,GAAG,MAAM;AACpE,QAAM,WAAoB,EAAE,GAAG,QAAQ;AAEvC,MAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAChC,aAAS,QAAQ,eAAe,QAAQ,KAAK;AAAA,EAC/C;AAEA,MAAI,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACnC,aAAS,WAAW,eAAe,QAAQ,QAAQ;AAAA,EACrD;AAEA,SAAO,cAAc,WAAW,UAAU,EAAE,GAAG,SAAS,MAAM,UAAU,CAAC;AAC3E;AAsBK,IAAM,uBACX,CAAC,cACD,OACE,SACA,QACA,UAA4B,EAAE,MAAM,GAAG,MACpC;AACH,MAAI,iBACF,OAAO,WAAW,OAAO,YAAY,WACjC,IAAI,OAAO,EAAE,cAAc,OAAO,OAAO,cACzC,IAAI,OAAO,EAAE;AACnB,uBAAiB,wBAAK,gBAAgB,QAAQ,EAAE;AAGhD,QAAM,cAAc,WAAW,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,SAAS,MAAM,gBAAgB,MAAM,UAAU,CAAC;AACtG;AAoBK,IAAM,iBAAiB,CAAC,cAAsB,OAAO,OAAe,gBAAgB,WAAW,EAAE;AAejG,IAAM,YAAY,CAAC,cAAsB,OAAO,SAAiB;AACtE,QAAM,iBAAAC,QAAG,OAAG,wBAAK,WAAW,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD;AAoBO,IAAM,gBAAgB,CAAC,cAAsB,OAAO,IAAY,YACrE,eAAe,WAAW,IAAI,SAAS,EAAE,MAAM,UAAU,CAAC;AAsBrD,IAAM,mBACX,CAAC,cAAsB,OAAO,IAAY,MAA6C,YACrF,kBAAkB,WAAW,IAAI,MAAM,OAAO;AAmB3C,IAAM,kCAAkC,CAAC,cAAsB,OAAO,IAAY,YAAqB;AAC5G,MAAI,UAAmB,MAAM,WAAW,SAAS,EAAE,IAAI,OAAO;AAC9D,QAAM,oBAAoB,MAAM,aAAa,WAAW,IAAI,OAAO;AAEnE,MAAI,CAAC,kBAAmB,OAAM,IAAI,MAAM,kCAAkC;AAE1E,MAAI,QAAQ,CAAC;AACb,MAAI,QAAQ,gBAAgB;AAC1B,UAAM,wBAAwB,QAAQ;AACtC,UAAM,qBAAqB,OAAO,KAAK,qBAAqB;AAE5D,UAAM,WAAW,mBAAmB,IAAI,OAAO,aAAa;AAC1D,YAAM,WAAW,sBAAsB,QAAgC;AAEvE,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,+BAA+B,QAAQ,eAAe;AAAA,MACxE;AACA,YAAM,UAAU,MAAM,oBAAoB,WAAW,IAAI,EAAE,SAAS,GAAG,OAAO;AAE9E,aAAO,EAAE,KAAK,UAAU,SAAS,SAAS,UAAoB,UAAM,4BAAK,2BAAQ,iBAAiB,GAAG,QAAQ,EAAE;AAAA,IACjH,CAAC;AAED,YAAQ,MAAM,QAAQ,IAAI,QAAQ;AAAA,EACpC;AACA,SAAO;AACT;AA2BO,IAAM,sBACX,CAAC,cAAsB,OAAO,IAAY,WAAmB,OAAwC,YAAqB;AACxH,MAAI,UAAmB,MAAM,WAAW,SAAS,EAAE,IAAI,OAAO;AAE9D,MAAI,cAAc,SAAS;AACzB,QAAI,QAAQ,UAAU,QAAW;AAC/B,cAAQ,QAAQ,CAAC;AAAA,IACnB;AAEA,aAAS,IAAI,GAAG,IAAI,QAAQ,MAAM,QAAQ,KAAK;AAC7C,UAAI,QAAQ,MAAM,CAAC,EAAE,OAAO,MAAM,MAAM,QAAQ,MAAM,CAAC,EAAE,YAAY,MAAM,SAAS;AAClF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,MAAM,KAAK,EAAE,IAAI,MAAM,IAAI,SAAS,MAAM,QAAQ,CAAC;AAAA,EAC7D,WAAW,cAAc,YAAY;AACnC,QAAI,QAAQ,aAAa,QAAW;AAClC,cAAQ,WAAW,CAAC;AAAA,IACtB;AAEA,aAAS,IAAI,GAAG,IAAI,QAAQ,SAAS,QAAQ,KAAK;AAChD,UAAI,QAAQ,SAAS,CAAC,EAAE,OAAO,MAAM,MAAM,QAAQ,SAAS,CAAC,EAAE,YAAY,MAAM,SAAS;AACxF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,SAAS,KAAK,EAAE,IAAI,MAAM,IAAI,SAAS,MAAM,QAAQ,CAAC;AAAA,EAChE,OAAO;AACL,UAAM,IAAI,MAAM,aAAa,SAAS,wDAAwD;AAAA,EAChG;AAEA,QAAM,cAAc,SAAS,EAAE,IAAI,OAAO;AAC1C,QAAM,aAAa,SAAS,EAAE,OAAO;AACvC;AAkBK,IAAM,oBAAoB,CAAC,cAAsB,OAAO,IAAY,YAAoB;AAC7F,QAAM,OAAO,MAAM,aAAa,WAAW,IAAI,OAAO;AACtD,SAAO,CAAC,CAAC;AACX;;;ACnUA,IAAAC,mBAAe;AACf,IAAAC,oBAAqB;AAsBd,IAAM,YACX,CAAC,cACD,OAAO,IAAY,YACjB,YAAY,WAAW,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAiCnD,IAAM,cACX,CAAC,cACD,OAAO,QAAgB,UAA4B,EAAE,MAAM,GAAG,MAC5D,cAAc,WAAW,EAAE,GAAG,OAAO,GAAG,EAAE,GAAG,SAAS,MAAM,SAAS,CAAC;AAoBnE,IAAM,gBAAgB,CAAC,cAAsB,OAAO,OAAe,gBAAgB,WAAW,EAAE;AAehG,IAAM,WAAW,CAAC,cAAsB,OAAO,SAAiB;AACrE,QAAM,iBAAAC,QAAG,OAAG,wBAAK,WAAW,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD;AAoBO,IAAM,eAAe,CAAC,cAAsB,OAAO,IAAY,YACpE,eAAe,WAAW,IAAI,SAAS,EAAE,MAAM,SAAS,CAAC;AAsBpD,IAAM,kBACX,CAAC,cAAsB,OAAO,IAAY,MAA6C,YACrF,kBAAkB,WAAW,IAAI,MAAM,OAAO;AAkB3C,IAAM,mBAAmB,CAAC,cAAsB,OAAO,IAAY,YAAoB;AAC5F,QAAM,OAAO,MAAM,aAAa,WAAW,IAAI,OAAO;AACtD,SAAO,CAAC,CAAC;AACX;AAqBO,IAAM,qBACX,CAAC,cAAsB,OAAO,IAAY,SAA0C,YAAqB;AACvG,MAAI,SAAiB,MAAM,UAAU,SAAS,EAAE,IAAI,OAAO;AAE3D,MAAI,OAAO,aAAa,QAAW;AACjC,WAAO,WAAW,CAAC;AAAA,EACrB;AAEA,QAAM,oBAAoB,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,MAAM,EAAE,YAAY,QAAQ,OAAO;AAE1G,MAAI,mBAAmB;AACrB;AAAA,EACF;AAGA,SAAO,SAAS,KAAK,OAAO;AAE5B,QAAM,aAAa,SAAS,EAAE,IAAI,OAAO;AACzC,QAAM,YAAY,SAAS,EAAE,MAAM;AACrC;;;AN1JF,IAAO,cAAQ,CAAC,SAAiB;AAC/B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL,UAAU,aAAS,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ7B,YAAY,eAAW,wBAAK,MAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAS3C,qBAAqB,wBAAoB,wBAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO/D,SAAS,YAAQ,wBAAK,MAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOrC,aAAa,gBAAY,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKnC,cAAc,iBAAa,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQrC,gBAAgB,mBAAe,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQzC,kBAAkB,qBAAiB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO7C,iBAAiB,oBAAgB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAc3C,YAAY,eAAW,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQjC,cAAc,iBAAa,wBAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUjD,uBAAuB,0BAAsB,wBAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQnE,WAAW,cAAU,wBAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO3C,eAAe,kBAAc,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKvC,gBAAgB,mBAAe,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQzC,kBAAkB,qBAAiB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ7C,oBAAoB,uBAAmB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQjD,mBAAmB,sBAAkB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAe/C,cAAc,iBAAa,wBAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUjD,sBAAsB,yBAAqB,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOhE,YAAY,eAAW,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjC,gBAAgB,mBAAe,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOzC,WAAW,cAAU,wBAAK,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO3C,eAAe,kBAAc,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQvC,kBAAkB,qBAAiB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ7C,iCAAiC,oCAAgC,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ3E,mBAAmB,sBAAkB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAe/C,aAAa,gBAAY,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQ9C,WAAW,cAAU,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK1C,eAAe,kBAAc,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOlD,UAAU,aAAS,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOxC,cAAc,iBAAa,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQhD,iBAAiB,oBAAgB,wBAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBtD,mBAAmB,wBAAoB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBjD,qBAAqB,wBAAoB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQnD,kBAAkB,qBAAiB,wBAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAS7C,oBAAoB,uBAAmB,wBAAK,MAAM,SAAS,CAAC;AAAA,EAC9D;AACF;","names":["import_node_path","import_promises","import_node_path","matter","match","fs","import_gray_matter","import_promises","matter","fs","file","fs","import_promises","import_node_path","fs","import_promises","import_node_path","fs","import_promises","import_node_path","fs"]}
|