@cwygoda/service-catalog-core 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/adapters/index.d.ts +8 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/index.js +8 -0
  4. package/dist/adapters/index.js.map +1 -0
  5. package/dist/adapters/loaders/filesystem.loader.d.ts +27 -0
  6. package/dist/adapters/loaders/filesystem.loader.d.ts.map +1 -0
  7. package/dist/adapters/loaders/filesystem.loader.js +183 -0
  8. package/dist/adapters/loaders/filesystem.loader.js.map +1 -0
  9. package/dist/adapters/loaders/filesystem.loader.test.d.ts +2 -0
  10. package/dist/adapters/loaders/filesystem.loader.test.d.ts.map +1 -0
  11. package/dist/adapters/loaders/filesystem.loader.test.js +576 -0
  12. package/dist/adapters/loaders/filesystem.loader.test.js.map +1 -0
  13. package/dist/adapters/parsers/bpmn-steps.d.ts +5 -0
  14. package/dist/adapters/parsers/bpmn-steps.d.ts.map +1 -0
  15. package/dist/adapters/parsers/bpmn-steps.js +124 -0
  16. package/dist/adapters/parsers/bpmn-steps.js.map +1 -0
  17. package/dist/adapters/parsers/bpmn-steps.test.d.ts +2 -0
  18. package/dist/adapters/parsers/bpmn-steps.test.d.ts.map +1 -0
  19. package/dist/adapters/parsers/bpmn-steps.test.js +112 -0
  20. package/dist/adapters/parsers/bpmn-steps.test.js.map +1 -0
  21. package/dist/adapters/parsers/bpmn-txt.parser.d.ts +21 -0
  22. package/dist/adapters/parsers/bpmn-txt.parser.d.ts.map +1 -0
  23. package/dist/adapters/parsers/bpmn-txt.parser.js +56 -0
  24. package/dist/adapters/parsers/bpmn-txt.parser.js.map +1 -0
  25. package/dist/adapters/parsers/bpmn-txt.parser.test.d.ts +2 -0
  26. package/dist/adapters/parsers/bpmn-txt.parser.test.d.ts.map +1 -0
  27. package/dist/adapters/parsers/bpmn-txt.parser.test.js +71 -0
  28. package/dist/adapters/parsers/bpmn-txt.parser.test.js.map +1 -0
  29. package/dist/adapters/parsers/markdown.parser.d.ts +22 -0
  30. package/dist/adapters/parsers/markdown.parser.d.ts.map +1 -0
  31. package/dist/adapters/parsers/markdown.parser.js +85 -0
  32. package/dist/adapters/parsers/markdown.parser.js.map +1 -0
  33. package/dist/adapters/parsers/markdown.parser.test.d.ts +2 -0
  34. package/dist/adapters/parsers/markdown.parser.test.d.ts.map +1 -0
  35. package/dist/adapters/parsers/markdown.parser.test.js +149 -0
  36. package/dist/adapters/parsers/markdown.parser.test.js.map +1 -0
  37. package/dist/adapters/parsers/sidecar.transforms.d.ts +104 -0
  38. package/dist/adapters/parsers/sidecar.transforms.d.ts.map +1 -0
  39. package/dist/adapters/parsers/sidecar.transforms.js +133 -0
  40. package/dist/adapters/parsers/sidecar.transforms.js.map +1 -0
  41. package/dist/adapters/parsers/toml.parser.d.ts +17 -0
  42. package/dist/adapters/parsers/toml.parser.d.ts.map +1 -0
  43. package/dist/adapters/parsers/toml.parser.js +91 -0
  44. package/dist/adapters/parsers/toml.parser.js.map +1 -0
  45. package/dist/adapters/parsers/toml.parser.test.d.ts +2 -0
  46. package/dist/adapters/parsers/toml.parser.test.d.ts.map +1 -0
  47. package/dist/adapters/parsers/toml.parser.test.js +345 -0
  48. package/dist/adapters/parsers/toml.parser.test.js.map +1 -0
  49. package/dist/adapters/parsers/yaml.parser.d.ts +17 -0
  50. package/dist/adapters/parsers/yaml.parser.d.ts.map +1 -0
  51. package/dist/adapters/parsers/yaml.parser.js +67 -0
  52. package/dist/adapters/parsers/yaml.parser.js.map +1 -0
  53. package/dist/adapters/parsers/yaml.parser.test.d.ts +2 -0
  54. package/dist/adapters/parsers/yaml.parser.test.d.ts.map +1 -0
  55. package/dist/adapters/parsers/yaml.parser.test.js +171 -0
  56. package/dist/adapters/parsers/yaml.parser.test.js.map +1 -0
  57. package/dist/adapters/persistence/json.writer.d.ts +7 -0
  58. package/dist/adapters/persistence/json.writer.d.ts.map +1 -0
  59. package/dist/adapters/persistence/json.writer.js +14 -0
  60. package/dist/adapters/persistence/json.writer.js.map +1 -0
  61. package/dist/adapters/persistence/json.writer.test.d.ts +2 -0
  62. package/dist/adapters/persistence/json.writer.test.d.ts.map +1 -0
  63. package/dist/adapters/persistence/json.writer.test.js +111 -0
  64. package/dist/adapters/persistence/json.writer.test.js.map +1 -0
  65. package/dist/domain/catalog.d.ts +28 -0
  66. package/dist/domain/catalog.d.ts.map +1 -0
  67. package/dist/domain/catalog.js +46 -0
  68. package/dist/domain/catalog.js.map +1 -0
  69. package/dist/domain/catalog.test.d.ts +2 -0
  70. package/dist/domain/catalog.test.d.ts.map +1 -0
  71. package/dist/domain/catalog.test.js +346 -0
  72. package/dist/domain/catalog.test.js.map +1 -0
  73. package/dist/domain/connection.d.ts +28 -0
  74. package/dist/domain/connection.d.ts.map +1 -0
  75. package/dist/domain/connection.js +53 -0
  76. package/dist/domain/connection.js.map +1 -0
  77. package/dist/domain/connection.test.d.ts +2 -0
  78. package/dist/domain/connection.test.d.ts.map +1 -0
  79. package/dist/domain/connection.test.js +150 -0
  80. package/dist/domain/connection.test.js.map +1 -0
  81. package/dist/domain/data-store.d.ts +23 -0
  82. package/dist/domain/data-store.d.ts.map +1 -0
  83. package/dist/domain/data-store.js +42 -0
  84. package/dist/domain/data-store.js.map +1 -0
  85. package/dist/domain/data-store.test.d.ts +2 -0
  86. package/dist/domain/data-store.test.d.ts.map +1 -0
  87. package/dist/domain/data-store.test.js +93 -0
  88. package/dist/domain/data-store.test.js.map +1 -0
  89. package/dist/domain/domain.d.ts +9 -0
  90. package/dist/domain/domain.d.ts.map +1 -0
  91. package/dist/domain/domain.js +26 -0
  92. package/dist/domain/domain.js.map +1 -0
  93. package/dist/domain/domain.test.d.ts +2 -0
  94. package/dist/domain/domain.test.d.ts.map +1 -0
  95. package/dist/domain/domain.test.js +92 -0
  96. package/dist/domain/domain.test.js.map +1 -0
  97. package/dist/domain/graph.d.ts +23 -0
  98. package/dist/domain/graph.d.ts.map +1 -0
  99. package/dist/domain/graph.js +2 -0
  100. package/dist/domain/graph.js.map +1 -0
  101. package/dist/domain/index.d.ts +8 -0
  102. package/dist/domain/index.d.ts.map +1 -0
  103. package/dist/domain/index.js +8 -0
  104. package/dist/domain/index.js.map +1 -0
  105. package/dist/domain/service.d.ts +66 -0
  106. package/dist/domain/service.d.ts.map +1 -0
  107. package/dist/domain/service.js +61 -0
  108. package/dist/domain/service.js.map +1 -0
  109. package/dist/domain/service.test.d.ts +2 -0
  110. package/dist/domain/service.test.d.ts.map +1 -0
  111. package/dist/domain/service.test.js +181 -0
  112. package/dist/domain/service.test.js.map +1 -0
  113. package/dist/domain/use-case.d.ts +47 -0
  114. package/dist/domain/use-case.d.ts.map +1 -0
  115. package/dist/domain/use-case.js +70 -0
  116. package/dist/domain/use-case.js.map +1 -0
  117. package/dist/domain/use-case.test.d.ts +2 -0
  118. package/dist/domain/use-case.test.d.ts.map +1 -0
  119. package/dist/domain/use-case.test.js +249 -0
  120. package/dist/domain/use-case.test.js.map +1 -0
  121. package/dist/index.d.ts +6 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +11 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/ports/catalog-loader.port.d.ts +5 -0
  126. package/dist/ports/catalog-loader.port.d.ts.map +1 -0
  127. package/dist/ports/catalog-loader.port.js +2 -0
  128. package/dist/ports/catalog-loader.port.js.map +1 -0
  129. package/dist/ports/catalog-writer.port.d.ts +5 -0
  130. package/dist/ports/catalog-writer.port.d.ts.map +1 -0
  131. package/dist/ports/catalog-writer.port.js +2 -0
  132. package/dist/ports/catalog-writer.port.js.map +1 -0
  133. package/dist/ports/index.d.ts +3 -0
  134. package/dist/ports/index.d.ts.map +1 -0
  135. package/dist/ports/index.js +3 -0
  136. package/dist/ports/index.js.map +1 -0
  137. package/dist/schemas/catalog-config.schema.d.ts +23 -0
  138. package/dist/schemas/catalog-config.schema.d.ts.map +1 -0
  139. package/dist/schemas/catalog-config.schema.js +20 -0
  140. package/dist/schemas/catalog-config.schema.js.map +1 -0
  141. package/dist/schemas/catalog.schema.d.ts +248 -0
  142. package/dist/schemas/catalog.schema.d.ts.map +1 -0
  143. package/dist/schemas/catalog.schema.js +94 -0
  144. package/dist/schemas/catalog.schema.js.map +1 -0
  145. package/dist/schemas/connection.schema.d.ts +19 -0
  146. package/dist/schemas/connection.schema.d.ts.map +1 -0
  147. package/dist/schemas/connection.schema.js +25 -0
  148. package/dist/schemas/connection.schema.js.map +1 -0
  149. package/dist/schemas/connection.schema.test.d.ts +2 -0
  150. package/dist/schemas/connection.schema.test.d.ts.map +1 -0
  151. package/dist/schemas/connection.schema.test.js +114 -0
  152. package/dist/schemas/connection.schema.test.js.map +1 -0
  153. package/dist/schemas/data-store.schema.d.ts +20 -0
  154. package/dist/schemas/data-store.schema.d.ts.map +1 -0
  155. package/dist/schemas/data-store.schema.js +22 -0
  156. package/dist/schemas/data-store.schema.js.map +1 -0
  157. package/dist/schemas/data-store.schema.test.d.ts +2 -0
  158. package/dist/schemas/data-store.schema.test.d.ts.map +1 -0
  159. package/dist/schemas/data-store.schema.test.js +68 -0
  160. package/dist/schemas/data-store.schema.test.js.map +1 -0
  161. package/dist/schemas/domain.schema.d.ts +11 -0
  162. package/dist/schemas/domain.schema.d.ts.map +1 -0
  163. package/dist/schemas/domain.schema.js +10 -0
  164. package/dist/schemas/domain.schema.js.map +1 -0
  165. package/dist/schemas/domain.schema.test.d.ts +2 -0
  166. package/dist/schemas/domain.schema.test.d.ts.map +1 -0
  167. package/dist/schemas/domain.schema.test.js +95 -0
  168. package/dist/schemas/domain.schema.test.js.map +1 -0
  169. package/dist/schemas/index.d.ts +8 -0
  170. package/dist/schemas/index.d.ts.map +1 -0
  171. package/dist/schemas/index.js +8 -0
  172. package/dist/schemas/index.js.map +1 -0
  173. package/dist/schemas/service.schema.d.ts +61 -0
  174. package/dist/schemas/service.schema.d.ts.map +1 -0
  175. package/dist/schemas/service.schema.js +59 -0
  176. package/dist/schemas/service.schema.js.map +1 -0
  177. package/dist/schemas/service.schema.test.d.ts +2 -0
  178. package/dist/schemas/service.schema.test.d.ts.map +1 -0
  179. package/dist/schemas/service.schema.test.js +137 -0
  180. package/dist/schemas/service.schema.test.js.map +1 -0
  181. package/dist/schemas/use-case.schema.d.ts +54 -0
  182. package/dist/schemas/use-case.schema.d.ts.map +1 -0
  183. package/dist/schemas/use-case.schema.js +38 -0
  184. package/dist/schemas/use-case.schema.js.map +1 -0
  185. package/dist/schemas/use-case.schema.test.d.ts +2 -0
  186. package/dist/schemas/use-case.schema.test.d.ts.map +1 -0
  187. package/dist/schemas/use-case.schema.test.js +152 -0
  188. package/dist/schemas/use-case.schema.test.js.map +1 -0
  189. package/dist/services/graph-builder.d.ts +21 -0
  190. package/dist/services/graph-builder.d.ts.map +1 -0
  191. package/dist/services/graph-builder.js +138 -0
  192. package/dist/services/graph-builder.js.map +1 -0
  193. package/dist/services/graph-builder.test.d.ts +2 -0
  194. package/dist/services/graph-builder.test.d.ts.map +1 -0
  195. package/dist/services/graph-builder.test.js +393 -0
  196. package/dist/services/graph-builder.test.js.map +1 -0
  197. package/dist/services/index.d.ts +2 -0
  198. package/dist/services/index.d.ts.map +1 -0
  199. package/dist/services/index.js +2 -0
  200. package/dist/services/index.js.map +1 -0
  201. package/package.json +50 -0
@@ -0,0 +1,38 @@
1
+ import { Type } from '@sinclair/typebox';
2
+ export const ParticipantSchema = Type.Object({
3
+ service: Type.String({ minLength: 1 }),
4
+ role: Type.String({ minLength: 1 }),
5
+ });
6
+ export const StepSchema = Type.Object({
7
+ sequence: Type.Number({ minimum: 1 }),
8
+ actor: Type.Optional(Type.String({ minLength: 1 })),
9
+ service: Type.Optional(Type.String({ minLength: 1 })),
10
+ action: Type.String({ minLength: 1 }),
11
+ endpoint: Type.Optional(Type.String()),
12
+ });
13
+ export const UseCaseSidecarSchema = Type.Object({
14
+ use_case: Type.Object({
15
+ id: Type.String({ minLength: 1 }),
16
+ name: Type.String({ minLength: 1 }),
17
+ description: Type.String(),
18
+ domain: Type.Optional(Type.String({ minLength: 1 })),
19
+ bpmn: Type.Optional(Type.String()),
20
+ participants: Type.Array(ParticipantSchema),
21
+ steps: Type.Array(StepSchema),
22
+ }),
23
+ });
24
+ export const DocLinkSchema = Type.Object({
25
+ elementId: Type.String({ minLength: 1 }),
26
+ anchor: Type.String({ minLength: 1 }),
27
+ });
28
+ export const ServiceRefSchema = Type.Object({
29
+ elementId: Type.String({ minLength: 1 }),
30
+ serviceId: Type.String({ minLength: 1 }),
31
+ });
32
+ export const UseCaseMarkdownFrontmatterSchema = Type.Object({
33
+ id: Type.String({ minLength: 1 }),
34
+ name: Type.String({ minLength: 1 }),
35
+ domain: Type.Optional(Type.String({ minLength: 1 })),
36
+ participants: Type.Optional(Type.Array(ParticipantSchema)),
37
+ });
38
+ //# sourceMappingURL=use-case.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-case.schema.js","sourceRoot":"","sources":["../../src/schemas/use-case.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAEtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACrC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;QACpB,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACnC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE;QAC1B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAC3C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;KAC9B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACxC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACxC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gCAAgC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1D,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACnC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;CAC3D,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=use-case.schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-case.schema.test.d.ts","sourceRoot":"","sources":["../../src/schemas/use-case.schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { Value } from '@sinclair/typebox/value';
3
+ import { UseCaseSidecarSchema, ParticipantSchema, StepSchema, } from './use-case.schema.js';
4
+ describe('ParticipantSchema', () => {
5
+ it('validates valid participant', () => {
6
+ const participant = { service: 'order-service', role: 'Creates orders' };
7
+ expect(Value.Check(ParticipantSchema, participant)).toBe(true);
8
+ });
9
+ it('rejects empty service', () => {
10
+ const participant = { service: '', role: 'Creates orders' };
11
+ expect(Value.Check(ParticipantSchema, participant)).toBe(false);
12
+ });
13
+ it('rejects empty role', () => {
14
+ const participant = { service: 'order-service', role: '' };
15
+ expect(Value.Check(ParticipantSchema, participant)).toBe(false);
16
+ });
17
+ it('rejects missing fields', () => {
18
+ expect(Value.Check(ParticipantSchema, { service: 'svc' })).toBe(false);
19
+ expect(Value.Check(ParticipantSchema, { role: 'role' })).toBe(false);
20
+ expect(Value.Check(ParticipantSchema, {})).toBe(false);
21
+ });
22
+ });
23
+ describe('StepSchema', () => {
24
+ it('validates minimal step with actor', () => {
25
+ const step = { sequence: 1, actor: 'Customer', action: 'Submit order' };
26
+ expect(Value.Check(StepSchema, step)).toBe(true);
27
+ });
28
+ it('validates step with service and endpoint', () => {
29
+ const step = {
30
+ sequence: 2,
31
+ service: 'order-service',
32
+ action: 'Validate order',
33
+ endpoint: 'POST /orders',
34
+ };
35
+ expect(Value.Check(StepSchema, step)).toBe(true);
36
+ });
37
+ it('validates step with all fields', () => {
38
+ const step = {
39
+ sequence: 1,
40
+ actor: 'Customer',
41
+ service: 'frontend',
42
+ action: 'Click submit',
43
+ endpoint: 'POST /submit',
44
+ };
45
+ expect(Value.Check(StepSchema, step)).toBe(true);
46
+ });
47
+ it('rejects sequence less than 1', () => {
48
+ const step = { sequence: 0, action: 'Submit' };
49
+ expect(Value.Check(StepSchema, step)).toBe(false);
50
+ });
51
+ it('rejects negative sequence', () => {
52
+ const step = { sequence: -1, action: 'Submit' };
53
+ expect(Value.Check(StepSchema, step)).toBe(false);
54
+ });
55
+ it('rejects missing sequence', () => {
56
+ const step = { action: 'Submit' };
57
+ expect(Value.Check(StepSchema, step)).toBe(false);
58
+ });
59
+ it('rejects missing action', () => {
60
+ const step = { sequence: 1 };
61
+ expect(Value.Check(StepSchema, step)).toBe(false);
62
+ });
63
+ it('rejects empty action', () => {
64
+ const step = { sequence: 1, action: '' };
65
+ expect(Value.Check(StepSchema, step)).toBe(false);
66
+ });
67
+ });
68
+ describe('UseCaseSidecarSchema', () => {
69
+ const validSidecar = {
70
+ use_case: {
71
+ id: 'checkout-flow',
72
+ name: 'Customer Checkout',
73
+ description: 'Handles customer checkout process',
74
+ participants: [
75
+ { service: 'order-service', role: 'Creates orders' },
76
+ { service: 'billing-service', role: 'Processes payment' },
77
+ ],
78
+ steps: [
79
+ { sequence: 1, actor: 'Customer', action: 'Submit order' },
80
+ { sequence: 2, service: 'order-service', action: 'Validate', endpoint: 'POST /orders' },
81
+ ],
82
+ },
83
+ };
84
+ it('validates complete use case sidecar', () => {
85
+ expect(Value.Check(UseCaseSidecarSchema, validSidecar)).toBe(true);
86
+ });
87
+ it('validates use case with bpmn path', () => {
88
+ const withBpmn = {
89
+ use_case: {
90
+ ...validSidecar.use_case,
91
+ bpmn: './checkout.bpmn.txt',
92
+ },
93
+ };
94
+ expect(Value.Check(UseCaseSidecarSchema, withBpmn)).toBe(true);
95
+ });
96
+ it('validates minimal use case with empty arrays', () => {
97
+ const minimal = {
98
+ use_case: {
99
+ id: 'simple',
100
+ name: 'Simple Flow',
101
+ description: 'A simple flow',
102
+ participants: [],
103
+ steps: [],
104
+ },
105
+ };
106
+ expect(Value.Check(UseCaseSidecarSchema, minimal)).toBe(true);
107
+ });
108
+ it('rejects empty id', () => {
109
+ const invalid = {
110
+ use_case: { ...validSidecar.use_case, id: '' },
111
+ };
112
+ expect(Value.Check(UseCaseSidecarSchema, invalid)).toBe(false);
113
+ });
114
+ it('rejects empty name', () => {
115
+ const invalid = {
116
+ use_case: { ...validSidecar.use_case, name: '' },
117
+ };
118
+ expect(Value.Check(UseCaseSidecarSchema, invalid)).toBe(false);
119
+ });
120
+ it('rejects missing participants array', () => {
121
+ const { participants: _, ...rest } = validSidecar.use_case;
122
+ const invalid = { use_case: { ...rest, steps: [] } };
123
+ expect(Value.Check(UseCaseSidecarSchema, invalid)).toBe(false);
124
+ });
125
+ it('rejects missing steps array', () => {
126
+ const { steps: _, ...rest } = validSidecar.use_case;
127
+ const invalid = { use_case: { ...rest, participants: [] } };
128
+ expect(Value.Check(UseCaseSidecarSchema, invalid)).toBe(false);
129
+ });
130
+ it('rejects invalid participant in array', () => {
131
+ const invalid = {
132
+ use_case: {
133
+ ...validSidecar.use_case,
134
+ participants: [{ service: '', role: 'role' }],
135
+ },
136
+ };
137
+ expect(Value.Check(UseCaseSidecarSchema, invalid)).toBe(false);
138
+ });
139
+ it('rejects invalid step in array', () => {
140
+ const invalid = {
141
+ use_case: {
142
+ ...validSidecar.use_case,
143
+ steps: [{ sequence: 0, action: 'Invalid' }],
144
+ },
145
+ };
146
+ expect(Value.Check(UseCaseSidecarSchema, invalid)).toBe(false);
147
+ });
148
+ it('rejects missing use_case wrapper', () => {
149
+ expect(Value.Check(UseCaseSidecarSchema, validSidecar.use_case)).toBe(false);
150
+ });
151
+ });
152
+ //# sourceMappingURL=use-case.schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-case.schema.test.js","sourceRoot":"","sources":["../../src/schemas/use-case.schema.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Graph builder service - builds service connection graph from catalog data.
3
+ *
4
+ * Combines:
5
+ * 1. Explicit connections declared in service sidecars
6
+ * 2. Implicit connections derived from use case steps
7
+ */
8
+ import type { Catalog } from '../domain/catalog.js';
9
+ import type { Connection } from '../domain/connection.js';
10
+ import type { GraphNode, GraphEdge, ServiceGraph } from '../domain/graph.js';
11
+ export type { GraphNode, GraphEdge, ServiceGraph };
12
+ /**
13
+ * Derives connections from use case steps.
14
+ * When step N has service A and step N+1 has service B, that implies A -> B connection.
15
+ */
16
+ export declare function deriveConnectionsFromUseCases(catalog: Catalog): Map<string, Connection[]>;
17
+ /**
18
+ * Builds a service graph from catalog data.
19
+ */
20
+ export declare function buildServiceGraph(catalog: Catalog): ServiceGraph;
21
+ //# sourceMappingURL=graph-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.d.ts","sourceRoot":"","sources":["../../src/services/graph-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7E,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAuDzF;AAuCD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CA4ChE"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Graph builder service - builds service connection graph from catalog data.
3
+ *
4
+ * Combines:
5
+ * 1. Explicit connections declared in service sidecars
6
+ * 2. Implicit connections derived from use case steps
7
+ */
8
+ /**
9
+ * Derives connections from use case steps.
10
+ * When step N has service A and step N+1 has service B, that implies A -> B connection.
11
+ */
12
+ export function deriveConnectionsFromUseCases(catalog) {
13
+ const connectionMap = new Map();
14
+ for (const useCase of catalog.useCases) {
15
+ const steps = useCase.steps;
16
+ for (let i = 0; i < steps.length - 1; i++) {
17
+ const current = steps[i];
18
+ const next = steps[i + 1];
19
+ // Both steps must exist and have services and they must be different
20
+ if (!current || !next)
21
+ continue;
22
+ if (!current.service || !next.service)
23
+ continue;
24
+ if (current.service === next.service)
25
+ continue;
26
+ const sourceId = current.service;
27
+ const targetId = next.service;
28
+ const nextEndpoint = next.endpoint;
29
+ // Determine connection type from the next step
30
+ const type = nextEndpoint ? 'http' : 'event';
31
+ // Get or create connection list for this source
32
+ let connections = connectionMap.get(sourceId);
33
+ if (!connections) {
34
+ connections = [];
35
+ connectionMap.set(sourceId, connections);
36
+ }
37
+ // Check if this connection already exists
38
+ const existing = connections.find((c) => c.target === targetId && c.type === type);
39
+ if (existing) {
40
+ // Merge endpoint/event info
41
+ if (type === 'http' && nextEndpoint) {
42
+ existing.endpoints = existing.endpoints ?? [];
43
+ if (!existing.endpoints.includes(nextEndpoint)) {
44
+ existing.endpoints.push(nextEndpoint);
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ // Create new connection
50
+ const conn = {
51
+ target: targetId,
52
+ type,
53
+ };
54
+ if (type === 'http' && nextEndpoint) {
55
+ conn.endpoints = [nextEndpoint];
56
+ }
57
+ connections.push(conn);
58
+ }
59
+ }
60
+ }
61
+ return connectionMap;
62
+ }
63
+ /**
64
+ * Merges explicit connections with derived connections.
65
+ * Explicit connections take precedence.
66
+ */
67
+ function mergeConnections(explicit, derived) {
68
+ const merged = new Map();
69
+ // Add explicit connections first (they take precedence)
70
+ for (const conn of explicit ?? []) {
71
+ const key = `${conn.target}:${conn.type}`;
72
+ merged.set(key, { ...conn });
73
+ }
74
+ // Add derived connections if not already present
75
+ for (const conn of derived ?? []) {
76
+ const key = `${conn.target}:${conn.type}`;
77
+ if (!merged.has(key)) {
78
+ merged.set(key, { ...conn });
79
+ }
80
+ else {
81
+ // Merge endpoints/events from derived into explicit
82
+ const existing = merged.get(key);
83
+ if (!existing)
84
+ continue; // Should never happen since we checked has()
85
+ if (conn.endpoints) {
86
+ existing.endpoints = [...new Set([...(existing.endpoints ?? []), ...conn.endpoints])];
87
+ }
88
+ if (conn.events) {
89
+ existing.events = [...new Set([...(existing.events ?? []), ...conn.events])];
90
+ }
91
+ }
92
+ }
93
+ return Array.from(merged.values());
94
+ }
95
+ /**
96
+ * Builds a service graph from catalog data.
97
+ */
98
+ export function buildServiceGraph(catalog) {
99
+ // Create nodes from services
100
+ const nodes = catalog.services.map((s) => ({
101
+ id: s.id,
102
+ name: s.name,
103
+ ...(s.domain && { domain: s.domain }),
104
+ type: s.type,
105
+ lifecycle: s.lifecycle,
106
+ }));
107
+ // Derive connections from use cases
108
+ const derivedConnections = deriveConnectionsFromUseCases(catalog);
109
+ // Build edges combining explicit and derived connections
110
+ const edgeMap = new Map();
111
+ for (const service of catalog.services) {
112
+ const derived = derivedConnections.get(service.id);
113
+ const merged = mergeConnections(service.connections, derived);
114
+ for (const conn of merged) {
115
+ // Only add edge if target service exists
116
+ const targetExists = catalog.services.some((s) => s.id === conn.target);
117
+ if (!targetExists)
118
+ continue;
119
+ const key = `${service.id}->${conn.target}:${conn.type}`;
120
+ if (!edgeMap.has(key)) {
121
+ edgeMap.set(key, {
122
+ source: service.id,
123
+ target: conn.target,
124
+ type: conn.type,
125
+ ...(conn.role && { role: conn.role }),
126
+ ...(conn.endpoints && { endpoints: conn.endpoints }),
127
+ ...(conn.events && { events: conn.events }),
128
+ ...(conn.description && { description: conn.description }),
129
+ });
130
+ }
131
+ }
132
+ }
133
+ return {
134
+ nodes,
135
+ edges: Array.from(edgeMap.values()),
136
+ };
137
+ }
138
+ //# sourceMappingURL=graph-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../../src/services/graph-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=graph-builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.test.d.ts","sourceRoot":"","sources":["../../src/services/graph-builder.test.ts"],"names":[],"mappings":""}