@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.
- package/dist/adapters/index.d.ts +8 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.d.ts +27 -0
- package/dist/adapters/loaders/filesystem.loader.d.ts.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.js +183 -0
- package/dist/adapters/loaders/filesystem.loader.js.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.test.d.ts +2 -0
- package/dist/adapters/loaders/filesystem.loader.test.d.ts.map +1 -0
- package/dist/adapters/loaders/filesystem.loader.test.js +576 -0
- package/dist/adapters/loaders/filesystem.loader.test.js.map +1 -0
- package/dist/adapters/parsers/bpmn-steps.d.ts +5 -0
- package/dist/adapters/parsers/bpmn-steps.d.ts.map +1 -0
- package/dist/adapters/parsers/bpmn-steps.js +124 -0
- package/dist/adapters/parsers/bpmn-steps.js.map +1 -0
- package/dist/adapters/parsers/bpmn-steps.test.d.ts +2 -0
- package/dist/adapters/parsers/bpmn-steps.test.d.ts.map +1 -0
- package/dist/adapters/parsers/bpmn-steps.test.js +112 -0
- package/dist/adapters/parsers/bpmn-steps.test.js.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.d.ts +21 -0
- package/dist/adapters/parsers/bpmn-txt.parser.d.ts.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.js +56 -0
- package/dist/adapters/parsers/bpmn-txt.parser.js.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.d.ts +2 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.d.ts.map +1 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.js +71 -0
- package/dist/adapters/parsers/bpmn-txt.parser.test.js.map +1 -0
- package/dist/adapters/parsers/markdown.parser.d.ts +22 -0
- package/dist/adapters/parsers/markdown.parser.d.ts.map +1 -0
- package/dist/adapters/parsers/markdown.parser.js +85 -0
- package/dist/adapters/parsers/markdown.parser.js.map +1 -0
- package/dist/adapters/parsers/markdown.parser.test.d.ts +2 -0
- package/dist/adapters/parsers/markdown.parser.test.d.ts.map +1 -0
- package/dist/adapters/parsers/markdown.parser.test.js +149 -0
- package/dist/adapters/parsers/markdown.parser.test.js.map +1 -0
- package/dist/adapters/parsers/sidecar.transforms.d.ts +104 -0
- package/dist/adapters/parsers/sidecar.transforms.d.ts.map +1 -0
- package/dist/adapters/parsers/sidecar.transforms.js +133 -0
- package/dist/adapters/parsers/sidecar.transforms.js.map +1 -0
- package/dist/adapters/parsers/toml.parser.d.ts +17 -0
- package/dist/adapters/parsers/toml.parser.d.ts.map +1 -0
- package/dist/adapters/parsers/toml.parser.js +91 -0
- package/dist/adapters/parsers/toml.parser.js.map +1 -0
- package/dist/adapters/parsers/toml.parser.test.d.ts +2 -0
- package/dist/adapters/parsers/toml.parser.test.d.ts.map +1 -0
- package/dist/adapters/parsers/toml.parser.test.js +345 -0
- package/dist/adapters/parsers/toml.parser.test.js.map +1 -0
- package/dist/adapters/parsers/yaml.parser.d.ts +17 -0
- package/dist/adapters/parsers/yaml.parser.d.ts.map +1 -0
- package/dist/adapters/parsers/yaml.parser.js +67 -0
- package/dist/adapters/parsers/yaml.parser.js.map +1 -0
- package/dist/adapters/parsers/yaml.parser.test.d.ts +2 -0
- package/dist/adapters/parsers/yaml.parser.test.d.ts.map +1 -0
- package/dist/adapters/parsers/yaml.parser.test.js +171 -0
- package/dist/adapters/parsers/yaml.parser.test.js.map +1 -0
- package/dist/adapters/persistence/json.writer.d.ts +7 -0
- package/dist/adapters/persistence/json.writer.d.ts.map +1 -0
- package/dist/adapters/persistence/json.writer.js +14 -0
- package/dist/adapters/persistence/json.writer.js.map +1 -0
- package/dist/adapters/persistence/json.writer.test.d.ts +2 -0
- package/dist/adapters/persistence/json.writer.test.d.ts.map +1 -0
- package/dist/adapters/persistence/json.writer.test.js +111 -0
- package/dist/adapters/persistence/json.writer.test.js.map +1 -0
- package/dist/domain/catalog.d.ts +28 -0
- package/dist/domain/catalog.d.ts.map +1 -0
- package/dist/domain/catalog.js +46 -0
- package/dist/domain/catalog.js.map +1 -0
- package/dist/domain/catalog.test.d.ts +2 -0
- package/dist/domain/catalog.test.d.ts.map +1 -0
- package/dist/domain/catalog.test.js +346 -0
- package/dist/domain/catalog.test.js.map +1 -0
- package/dist/domain/connection.d.ts +28 -0
- package/dist/domain/connection.d.ts.map +1 -0
- package/dist/domain/connection.js +53 -0
- package/dist/domain/connection.js.map +1 -0
- package/dist/domain/connection.test.d.ts +2 -0
- package/dist/domain/connection.test.d.ts.map +1 -0
- package/dist/domain/connection.test.js +150 -0
- package/dist/domain/connection.test.js.map +1 -0
- package/dist/domain/data-store.d.ts +23 -0
- package/dist/domain/data-store.d.ts.map +1 -0
- package/dist/domain/data-store.js +42 -0
- package/dist/domain/data-store.js.map +1 -0
- package/dist/domain/data-store.test.d.ts +2 -0
- package/dist/domain/data-store.test.d.ts.map +1 -0
- package/dist/domain/data-store.test.js +93 -0
- package/dist/domain/data-store.test.js.map +1 -0
- package/dist/domain/domain.d.ts +9 -0
- package/dist/domain/domain.d.ts.map +1 -0
- package/dist/domain/domain.js +26 -0
- package/dist/domain/domain.js.map +1 -0
- package/dist/domain/domain.test.d.ts +2 -0
- package/dist/domain/domain.test.d.ts.map +1 -0
- package/dist/domain/domain.test.js +92 -0
- package/dist/domain/domain.test.js.map +1 -0
- package/dist/domain/graph.d.ts +23 -0
- package/dist/domain/graph.d.ts.map +1 -0
- package/dist/domain/graph.js +2 -0
- package/dist/domain/graph.js.map +1 -0
- package/dist/domain/index.d.ts +8 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +8 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/service.d.ts +66 -0
- package/dist/domain/service.d.ts.map +1 -0
- package/dist/domain/service.js +61 -0
- package/dist/domain/service.js.map +1 -0
- package/dist/domain/service.test.d.ts +2 -0
- package/dist/domain/service.test.d.ts.map +1 -0
- package/dist/domain/service.test.js +181 -0
- package/dist/domain/service.test.js.map +1 -0
- package/dist/domain/use-case.d.ts +47 -0
- package/dist/domain/use-case.d.ts.map +1 -0
- package/dist/domain/use-case.js +70 -0
- package/dist/domain/use-case.js.map +1 -0
- package/dist/domain/use-case.test.d.ts +2 -0
- package/dist/domain/use-case.test.d.ts.map +1 -0
- package/dist/domain/use-case.test.js +249 -0
- package/dist/domain/use-case.test.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/catalog-loader.port.d.ts +5 -0
- package/dist/ports/catalog-loader.port.d.ts.map +1 -0
- package/dist/ports/catalog-loader.port.js +2 -0
- package/dist/ports/catalog-loader.port.js.map +1 -0
- package/dist/ports/catalog-writer.port.d.ts +5 -0
- package/dist/ports/catalog-writer.port.d.ts.map +1 -0
- package/dist/ports/catalog-writer.port.js +2 -0
- package/dist/ports/catalog-writer.port.js.map +1 -0
- package/dist/ports/index.d.ts +3 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +3 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/schemas/catalog-config.schema.d.ts +23 -0
- package/dist/schemas/catalog-config.schema.d.ts.map +1 -0
- package/dist/schemas/catalog-config.schema.js +20 -0
- package/dist/schemas/catalog-config.schema.js.map +1 -0
- package/dist/schemas/catalog.schema.d.ts +248 -0
- package/dist/schemas/catalog.schema.d.ts.map +1 -0
- package/dist/schemas/catalog.schema.js +94 -0
- package/dist/schemas/catalog.schema.js.map +1 -0
- package/dist/schemas/connection.schema.d.ts +19 -0
- package/dist/schemas/connection.schema.d.ts.map +1 -0
- package/dist/schemas/connection.schema.js +25 -0
- package/dist/schemas/connection.schema.js.map +1 -0
- package/dist/schemas/connection.schema.test.d.ts +2 -0
- package/dist/schemas/connection.schema.test.d.ts.map +1 -0
- package/dist/schemas/connection.schema.test.js +114 -0
- package/dist/schemas/connection.schema.test.js.map +1 -0
- package/dist/schemas/data-store.schema.d.ts +20 -0
- package/dist/schemas/data-store.schema.d.ts.map +1 -0
- package/dist/schemas/data-store.schema.js +22 -0
- package/dist/schemas/data-store.schema.js.map +1 -0
- package/dist/schemas/data-store.schema.test.d.ts +2 -0
- package/dist/schemas/data-store.schema.test.d.ts.map +1 -0
- package/dist/schemas/data-store.schema.test.js +68 -0
- package/dist/schemas/data-store.schema.test.js.map +1 -0
- package/dist/schemas/domain.schema.d.ts +11 -0
- package/dist/schemas/domain.schema.d.ts.map +1 -0
- package/dist/schemas/domain.schema.js +10 -0
- package/dist/schemas/domain.schema.js.map +1 -0
- package/dist/schemas/domain.schema.test.d.ts +2 -0
- package/dist/schemas/domain.schema.test.d.ts.map +1 -0
- package/dist/schemas/domain.schema.test.js +95 -0
- package/dist/schemas/domain.schema.test.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +8 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/service.schema.d.ts +61 -0
- package/dist/schemas/service.schema.d.ts.map +1 -0
- package/dist/schemas/service.schema.js +59 -0
- package/dist/schemas/service.schema.js.map +1 -0
- package/dist/schemas/service.schema.test.d.ts +2 -0
- package/dist/schemas/service.schema.test.d.ts.map +1 -0
- package/dist/schemas/service.schema.test.js +137 -0
- package/dist/schemas/service.schema.test.js.map +1 -0
- package/dist/schemas/use-case.schema.d.ts +54 -0
- package/dist/schemas/use-case.schema.d.ts.map +1 -0
- package/dist/schemas/use-case.schema.js +38 -0
- package/dist/schemas/use-case.schema.js.map +1 -0
- package/dist/schemas/use-case.schema.test.d.ts +2 -0
- package/dist/schemas/use-case.schema.test.d.ts.map +1 -0
- package/dist/schemas/use-case.schema.test.js +152 -0
- package/dist/schemas/use-case.schema.test.js.map +1 -0
- package/dist/services/graph-builder.d.ts +21 -0
- package/dist/services/graph-builder.d.ts.map +1 -0
- package/dist/services/graph-builder.js +138 -0
- package/dist/services/graph-builder.js.map +1 -0
- package/dist/services/graph-builder.test.d.ts +2 -0
- package/dist/services/graph-builder.test.d.ts.map +1 -0
- package/dist/services/graph-builder.test.js +393 -0
- package/dist/services/graph-builder.test.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"graph-builder.test.d.ts","sourceRoot":"","sources":["../../src/services/graph-builder.test.ts"],"names":[],"mappings":""}
|