jumbo-cli 3.18.0 → 3.20.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.
Files changed (125) hide show
  1. package/dist/application/context/relations/audit/AmbiguousRelationNodeFinding.d.ts +6 -0
  2. package/dist/application/context/relations/audit/AmbiguousRelationNodeFinding.d.ts.map +1 -0
  3. package/dist/application/context/relations/audit/AmbiguousRelationNodeFinding.js +2 -0
  4. package/dist/application/context/relations/audit/AmbiguousRelationNodeFinding.js.map +1 -0
  5. package/dist/application/context/relations/audit/AuditRelationsController.d.ts +13 -0
  6. package/dist/application/context/relations/audit/AuditRelationsController.d.ts.map +1 -0
  7. package/dist/application/context/relations/audit/AuditRelationsController.js +15 -0
  8. package/dist/application/context/relations/audit/AuditRelationsController.js.map +1 -0
  9. package/dist/application/context/relations/audit/AuditRelationsRequest.d.ts +6 -0
  10. package/dist/application/context/relations/audit/AuditRelationsRequest.d.ts.map +1 -0
  11. package/dist/application/context/relations/audit/AuditRelationsRequest.js +2 -0
  12. package/dist/application/context/relations/audit/AuditRelationsRequest.js.map +1 -0
  13. package/dist/application/context/relations/audit/DanglingRelationFinding.d.ts +8 -0
  14. package/dist/application/context/relations/audit/DanglingRelationFinding.d.ts.map +1 -0
  15. package/dist/application/context/relations/audit/DanglingRelationFinding.js +2 -0
  16. package/dist/application/context/relations/audit/DanglingRelationFinding.js.map +1 -0
  17. package/dist/application/context/relations/audit/IRelationNodeCatalog.d.ts +5 -0
  18. package/dist/application/context/relations/audit/IRelationNodeCatalog.d.ts.map +1 -0
  19. package/dist/application/context/relations/audit/IRelationNodeCatalog.js +2 -0
  20. package/dist/application/context/relations/audit/IRelationNodeCatalog.js.map +1 -0
  21. package/dist/application/context/relations/audit/InactiveOnlyRelationNodeFinding.d.ts +8 -0
  22. package/dist/application/context/relations/audit/InactiveOnlyRelationNodeFinding.d.ts.map +1 -0
  23. package/dist/application/context/relations/audit/InactiveOnlyRelationNodeFinding.js +2 -0
  24. package/dist/application/context/relations/audit/InactiveOnlyRelationNodeFinding.js.map +1 -0
  25. package/dist/application/context/relations/audit/IsolatedRelationNodeFinding.d.ts +7 -0
  26. package/dist/application/context/relations/audit/IsolatedRelationNodeFinding.d.ts.map +1 -0
  27. package/dist/application/context/relations/audit/IsolatedRelationNodeFinding.js +2 -0
  28. package/dist/application/context/relations/audit/IsolatedRelationNodeFinding.js.map +1 -0
  29. package/dist/application/context/relations/audit/RelationAuditPolicy.d.ts +15 -0
  30. package/dist/application/context/relations/audit/RelationAuditPolicy.d.ts.map +1 -0
  31. package/dist/application/context/relations/audit/RelationAuditPolicy.js +131 -0
  32. package/dist/application/context/relations/audit/RelationAuditPolicy.js.map +1 -0
  33. package/dist/application/context/relations/audit/RelationAuditResult.d.ts +30 -0
  34. package/dist/application/context/relations/audit/RelationAuditResult.d.ts.map +1 -0
  35. package/dist/application/context/relations/audit/RelationAuditResult.js +2 -0
  36. package/dist/application/context/relations/audit/RelationAuditResult.js.map +1 -0
  37. package/dist/application/context/relations/audit/RelationAuditSummary.d.ts +13 -0
  38. package/dist/application/context/relations/audit/RelationAuditSummary.d.ts.map +1 -0
  39. package/dist/application/context/relations/audit/RelationAuditSummary.js +2 -0
  40. package/dist/application/context/relations/audit/RelationAuditSummary.js.map +1 -0
  41. package/dist/application/context/relations/audit/RelationNodeCatalogEntry.d.ts +8 -0
  42. package/dist/application/context/relations/audit/RelationNodeCatalogEntry.d.ts.map +1 -0
  43. package/dist/application/context/relations/audit/RelationNodeCatalogEntry.js +2 -0
  44. package/dist/application/context/relations/audit/RelationNodeCatalogEntry.js.map +1 -0
  45. package/dist/application/context/relations/path/FindRelationPathController.d.ts +9 -0
  46. package/dist/application/context/relations/path/FindRelationPathController.d.ts.map +1 -0
  47. package/dist/application/context/relations/path/FindRelationPathController.js +9 -0
  48. package/dist/application/context/relations/path/FindRelationPathController.js.map +1 -0
  49. package/dist/application/context/relations/path/FindRelationPathRequest.d.ts +16 -0
  50. package/dist/application/context/relations/path/FindRelationPathRequest.d.ts.map +1 -0
  51. package/dist/application/context/relations/path/FindRelationPathRequest.js +2 -0
  52. package/dist/application/context/relations/path/FindRelationPathRequest.js.map +1 -0
  53. package/dist/application/context/relations/path/IFindRelationPathGateway.d.ts +6 -0
  54. package/dist/application/context/relations/path/IFindRelationPathGateway.d.ts.map +1 -0
  55. package/dist/application/context/relations/path/IFindRelationPathGateway.js +2 -0
  56. package/dist/application/context/relations/path/IFindRelationPathGateway.js.map +1 -0
  57. package/dist/application/context/relations/path/LocalFindRelationPathGateway.d.ts +14 -0
  58. package/dist/application/context/relations/path/LocalFindRelationPathGateway.d.ts.map +1 -0
  59. package/dist/application/context/relations/path/LocalFindRelationPathGateway.js +21 -0
  60. package/dist/application/context/relations/path/LocalFindRelationPathGateway.js.map +1 -0
  61. package/dist/application/context/relations/path/RelationPathQueryMetadata.d.ts +12 -0
  62. package/dist/application/context/relations/path/RelationPathQueryMetadata.d.ts.map +1 -0
  63. package/dist/application/context/relations/path/RelationPathQueryMetadata.js +2 -0
  64. package/dist/application/context/relations/path/RelationPathQueryMetadata.js.map +1 -0
  65. package/dist/application/context/relations/path/RelationPathResult.d.ts +13 -0
  66. package/dist/application/context/relations/path/RelationPathResult.d.ts.map +1 -0
  67. package/dist/application/context/relations/path/RelationPathResult.js +2 -0
  68. package/dist/application/context/relations/path/RelationPathResult.js.map +1 -0
  69. package/dist/application/context/relations/path/RelationShortestPathFinder.d.ts +16 -0
  70. package/dist/application/context/relations/path/RelationShortestPathFinder.d.ts.map +1 -0
  71. package/dist/application/context/relations/path/RelationShortestPathFinder.js +104 -0
  72. package/dist/application/context/relations/path/RelationShortestPathFinder.js.map +1 -0
  73. package/dist/application/context/relations/traverse/LocalTraverseRelationsGateway.d.ts +7 -6
  74. package/dist/application/context/relations/traverse/LocalTraverseRelationsGateway.d.ts.map +1 -1
  75. package/dist/application/context/relations/traverse/LocalTraverseRelationsGateway.js +19 -72
  76. package/dist/application/context/relations/traverse/LocalTraverseRelationsGateway.js.map +1 -1
  77. package/dist/application/context/relations/traverse/RelationNodeReferenceResolver.d.ts +9 -0
  78. package/dist/application/context/relations/traverse/RelationNodeReferenceResolver.d.ts.map +1 -0
  79. package/dist/application/context/relations/traverse/RelationNodeReferenceResolver.js +29 -0
  80. package/dist/application/context/relations/traverse/RelationNodeReferenceResolver.js.map +1 -0
  81. package/dist/application/context/relations/traverse/RelationTraversalPolicy.d.ts +10 -0
  82. package/dist/application/context/relations/traverse/RelationTraversalPolicy.d.ts.map +1 -0
  83. package/dist/application/context/relations/traverse/RelationTraversalPolicy.js +31 -0
  84. package/dist/application/context/relations/traverse/RelationTraversalPolicy.js.map +1 -0
  85. package/dist/application/context/relations/traverse/RelationTraversalQuery.d.ts +12 -0
  86. package/dist/application/context/relations/traverse/RelationTraversalQuery.d.ts.map +1 -0
  87. package/dist/application/context/relations/traverse/RelationTraversalQuery.js +2 -0
  88. package/dist/application/context/relations/traverse/RelationTraversalQuery.js.map +1 -0
  89. package/dist/application/context/relations/traverse/RelationTraversalQueryNormalizer.d.ts +17 -0
  90. package/dist/application/context/relations/traverse/RelationTraversalQueryNormalizer.d.ts.map +1 -0
  91. package/dist/application/context/relations/traverse/RelationTraversalQueryNormalizer.js +34 -0
  92. package/dist/application/context/relations/traverse/RelationTraversalQueryNormalizer.js.map +1 -0
  93. package/dist/application/host/IApplicationContainer.d.ts +6 -0
  94. package/dist/application/host/IApplicationContainer.d.ts.map +1 -1
  95. package/dist/domain/relations/Constants.d.ts +8 -0
  96. package/dist/domain/relations/Constants.d.ts.map +1 -1
  97. package/dist/domain/relations/Constants.js +8 -0
  98. package/dist/domain/relations/Constants.js.map +1 -1
  99. package/dist/infrastructure/context/relations/audit/SqliteRelationNodeCatalog.d.ts +11 -0
  100. package/dist/infrastructure/context/relations/audit/SqliteRelationNodeCatalog.d.ts.map +1 -0
  101. package/dist/infrastructure/context/relations/audit/SqliteRelationNodeCatalog.js +36 -0
  102. package/dist/infrastructure/context/relations/audit/SqliteRelationNodeCatalog.js.map +1 -0
  103. package/dist/infrastructure/host/HostBuilder.d.ts.map +1 -1
  104. package/dist/infrastructure/host/HostBuilder.js +22 -1
  105. package/dist/infrastructure/host/HostBuilder.js.map +1 -1
  106. package/dist/presentation/cli/commands/registry/generated-commands.d.ts.map +1 -1
  107. package/dist/presentation/cli/commands/registry/generated-commands.js +12 -0
  108. package/dist/presentation/cli/commands/registry/generated-commands.js.map +1 -1
  109. package/dist/presentation/cli/commands/relations/audit/RelationAuditOutputBuilder.d.ts +11 -0
  110. package/dist/presentation/cli/commands/relations/audit/RelationAuditOutputBuilder.d.ts.map +1 -0
  111. package/dist/presentation/cli/commands/relations/audit/RelationAuditOutputBuilder.js +91 -0
  112. package/dist/presentation/cli/commands/relations/audit/RelationAuditOutputBuilder.js.map +1 -0
  113. package/dist/presentation/cli/commands/relations/audit/relations.audit.d.ts +8 -0
  114. package/dist/presentation/cli/commands/relations/audit/relations.audit.d.ts.map +1 -0
  115. package/dist/presentation/cli/commands/relations/audit/relations.audit.js +58 -0
  116. package/dist/presentation/cli/commands/relations/audit/relations.audit.js.map +1 -0
  117. package/dist/presentation/cli/commands/relations/path/RelationPathOutputBuilder.d.ts +12 -0
  118. package/dist/presentation/cli/commands/relations/path/RelationPathOutputBuilder.d.ts.map +1 -0
  119. package/dist/presentation/cli/commands/relations/path/RelationPathOutputBuilder.js +96 -0
  120. package/dist/presentation/cli/commands/relations/path/RelationPathOutputBuilder.js.map +1 -0
  121. package/dist/presentation/cli/commands/relations/path/relations.path.d.ts +16 -0
  122. package/dist/presentation/cli/commands/relations/path/relations.path.d.ts.map +1 -0
  123. package/dist/presentation/cli/commands/relations/path/relations.path.js +101 -0
  124. package/dist/presentation/cli/commands/relations/path/relations.path.js.map +1 -0
  125. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationPathResult.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/path/RelationPathResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,EAAE,EAAE,qBAAqB,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RelationPathResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationPathResult.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/path/RelationPathResult.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { IRelationViewReader } from "../get/IRelationViewReader.js";
2
+ import { RelationNodeReference } from "../get/RelationNodeReference.js";
3
+ import { RelationTraversalPolicy } from "../traverse/RelationTraversalPolicy.js";
4
+ import { RelationTraversalQuery } from "../traverse/RelationTraversalQuery.js";
5
+ import { RelationPathResult } from "./RelationPathResult.js";
6
+ export declare class RelationShortestPathFinder {
7
+ private readonly relationViewReader;
8
+ private readonly traversalPolicy;
9
+ constructor(relationViewReader: IRelationViewReader, traversalPolicy?: RelationTraversalPolicy);
10
+ find(from: RelationNodeReference, to: RelationNodeReference, query: RelationTraversalQuery): Promise<RelationPathResult>;
11
+ private stableTransitions;
12
+ private reconstruct;
13
+ private foundResult;
14
+ private toQueryMetadata;
15
+ }
16
+ //# sourceMappingURL=RelationShortestPathFinder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationShortestPathFinder.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/path/RelationShortestPathFinder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAY7D,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,kBAAkB,EAAE,mBAAmB,EACvC,eAAe,0BAAgC;IAG5D,IAAI,CACR,IAAI,EAAE,qBAAqB,EAC3B,EAAE,EAAE,qBAAqB,EACzB,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAiE9B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,eAAe;CAYxB"}
@@ -0,0 +1,104 @@
1
+ import { RelationTraversalPolicy } from "../traverse/RelationTraversalPolicy.js";
2
+ export class RelationShortestPathFinder {
3
+ constructor(relationViewReader, traversalPolicy = new RelationTraversalPolicy()) {
4
+ this.relationViewReader = relationViewReader;
5
+ this.traversalPolicy = traversalPolicy;
6
+ }
7
+ async find(from, to, query) {
8
+ const queryMetadata = this.toQueryMetadata(query);
9
+ if (this.traversalPolicy.nodeKey(from) === this.traversalPolicy.nodeKey(to)) {
10
+ return this.foundResult(from, to, [from], [], queryMetadata);
11
+ }
12
+ const visited = new Set([this.traversalPolicy.nodeKey(from)]);
13
+ const predecessors = new Map();
14
+ let frontier = [from];
15
+ for (let depth = 1; depth <= query.depth && frontier.length > 0; depth++) {
16
+ const next = new Map();
17
+ const stableFrontier = [...frontier].sort((left, right) => this.traversalPolicy.compareNodes(left, right));
18
+ for (const current of stableFrontier) {
19
+ const adjacent = await this.relationViewReader.findAll({
20
+ entity: current,
21
+ direction: query.direction,
22
+ relationType: query.relationType,
23
+ relatedEntityType: query.relatedEntityType,
24
+ strength: query.strength,
25
+ status: query.status,
26
+ });
27
+ const transitions = this.stableTransitions(current, adjacent, query);
28
+ for (const transition of transitions) {
29
+ const key = this.traversalPolicy.nodeKey(transition.node);
30
+ if (visited.has(key))
31
+ continue;
32
+ visited.add(key);
33
+ predecessors.set(key, { previous: current, edge: transition.edge });
34
+ if (key === this.traversalPolicy.nodeKey(to)) {
35
+ const path = this.reconstruct(from, to, predecessors);
36
+ return this.foundResult(from, to, path.nodes, path.edges, queryMetadata);
37
+ }
38
+ next.set(key, transition.node);
39
+ }
40
+ }
41
+ frontier = [...next.values()];
42
+ }
43
+ return {
44
+ found: false,
45
+ from,
46
+ to,
47
+ hopCount: 0,
48
+ nodes: [],
49
+ edges: [],
50
+ query: queryMetadata,
51
+ };
52
+ }
53
+ stableTransitions(current, adjacent, query) {
54
+ return adjacent
55
+ .map((edge) => {
56
+ const node = this.traversalPolicy.relatedNode(current, edge, query.direction);
57
+ return node ? { node, edge } : undefined;
58
+ })
59
+ .filter((transition) => transition !== undefined)
60
+ .sort((left, right) => this.traversalPolicy.compareNodes(left.node, right.node) ||
61
+ this.traversalPolicy.compareEdges(left.edge, right.edge));
62
+ }
63
+ reconstruct(from, to, predecessors) {
64
+ const reversedNodes = [to];
65
+ const reversedEdges = [];
66
+ let cursor = to;
67
+ while (this.traversalPolicy.nodeKey(cursor) !==
68
+ this.traversalPolicy.nodeKey(from)) {
69
+ const predecessor = predecessors.get(this.traversalPolicy.nodeKey(cursor));
70
+ if (!predecessor) {
71
+ throw new Error("Relation path reconstruction encountered an incomplete predecessor chain.");
72
+ }
73
+ reversedEdges.push(predecessor.edge);
74
+ reversedNodes.push(predecessor.previous);
75
+ cursor = predecessor.previous;
76
+ }
77
+ return {
78
+ nodes: reversedNodes.reverse(),
79
+ edges: reversedEdges.reverse(),
80
+ };
81
+ }
82
+ foundResult(from, to, nodes, edges, query) {
83
+ return {
84
+ found: true,
85
+ from,
86
+ to,
87
+ hopCount: edges.length,
88
+ nodes,
89
+ edges,
90
+ query,
91
+ };
92
+ }
93
+ toQueryMetadata(query) {
94
+ return {
95
+ maxDepth: query.depth,
96
+ direction: query.direction,
97
+ relationType: query.relationType,
98
+ entityType: query.relatedEntityType,
99
+ strength: query.strength,
100
+ status: query.status,
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=RelationShortestPathFinder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationShortestPathFinder.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/path/RelationShortestPathFinder.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,18 @@
1
1
  import { IRelationViewReader } from "../get/IRelationViewReader.js";
2
2
  import { ITraverseRelationsGateway } from "./ITraverseRelationsGateway.js";
3
+ import { RelationNodeReferenceResolver } from "./RelationNodeReferenceResolver.js";
4
+ import { RelationTraversalPolicy } from "./RelationTraversalPolicy.js";
5
+ import { RelationTraversalQueryNormalizer } from "./RelationTraversalQueryNormalizer.js";
3
6
  import { RelationTraversalResult } from "./RelationTraversalResult.js";
4
7
  import { TraverseRelationsRequest } from "./TraverseRelationsRequest.js";
5
8
  export declare class LocalTraverseRelationsGateway implements ITraverseRelationsGateway {
6
9
  private readonly relationViewReader;
7
- constructor(relationViewReader: IRelationViewReader);
10
+ private readonly nodeResolver;
11
+ private readonly queryNormalizer;
12
+ private readonly traversalPolicy;
13
+ constructor(relationViewReader: IRelationViewReader, nodeResolver?: RelationNodeReferenceResolver, queryNormalizer?: RelationTraversalQueryNormalizer, traversalPolicy?: RelationTraversalPolicy);
8
14
  traverse(request: TraverseRelationsRequest): Promise<RelationTraversalResult>;
9
15
  private normalize;
10
16
  private resolveRoot;
11
- private relatedNode;
12
- private assertEntityType;
13
- private nodeKey;
14
- private compareNodes;
15
- private compareEdges;
16
17
  }
17
18
  //# sourceMappingURL=LocalTraverseRelationsGateway.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalTraverseRelationsGateway.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/LocalTraverseRelationsGateway.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAIpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAczE,qBAAa,6BAA8B,YAAW,yBAAyB;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,mBAAmB;IAE9D,QAAQ,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAgEnF,OAAO,CAAC,SAAS;YAwCH,WAAW;IAoBzB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAQrB"}
1
+ {"version":3,"file":"LocalTraverseRelationsGateway.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/LocalTraverseRelationsGateway.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAQzE,qBAAa,6BAA8B,YAAW,yBAAyB;IAE3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAHf,kBAAkB,EAAE,mBAAmB,EACvC,YAAY,gCAAwD,EACpE,eAAe,mCAAyC,EACxD,eAAe,0BAAgC;IAG5D,QAAQ,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA2EnF,OAAO,CAAC,SAAS;YAkBH,WAAW;CAM1B"}
@@ -1,19 +1,24 @@
1
- import { EntityType, RelationStrength, } from "../../../../domain/relations/Constants.js";
1
+ import { RelationNodeReferenceResolver } from "./RelationNodeReferenceResolver.js";
2
+ import { RelationTraversalPolicy } from "./RelationTraversalPolicy.js";
3
+ import { RelationTraversalQueryNormalizer } from "./RelationTraversalQueryNormalizer.js";
2
4
  export class LocalTraverseRelationsGateway {
3
- constructor(relationViewReader) {
5
+ constructor(relationViewReader, nodeResolver = new RelationNodeReferenceResolver(relationViewReader), queryNormalizer = new RelationTraversalQueryNormalizer(), traversalPolicy = new RelationTraversalPolicy()) {
4
6
  this.relationViewReader = relationViewReader;
7
+ this.nodeResolver = nodeResolver;
8
+ this.queryNormalizer = queryNormalizer;
9
+ this.traversalPolicy = traversalPolicy;
5
10
  }
6
11
  async traverse(request) {
7
12
  const normalized = this.normalize(request);
8
13
  const root = await this.resolveRoot(normalized.entityId, normalized.entityType);
9
- const visited = new Set([this.nodeKey(root)]);
14
+ const visited = new Set([this.traversalPolicy.nodeKey(root)]);
10
15
  const nodes = new Map();
11
16
  const edges = new Map();
12
17
  let frontier = [root];
13
18
  let truncated = false;
14
19
  traversal: for (let distance = 1; distance <= normalized.depth && frontier.length > 0; distance++) {
15
20
  const next = new Map();
16
- for (const current of [...frontier].sort((left, right) => this.compareNodes(left, right))) {
21
+ for (const current of [...frontier].sort((left, right) => this.traversalPolicy.compareNodes(left, right))) {
17
22
  const adjacent = await this.relationViewReader.findAll({
18
23
  entity: current,
19
24
  direction: normalized.direction,
@@ -22,13 +27,13 @@ export class LocalTraverseRelationsGateway {
22
27
  strength: normalized.strength,
23
28
  status: normalized.status,
24
29
  });
25
- for (const edge of [...adjacent].sort((left, right) => this.compareEdges(left, right))) {
30
+ for (const edge of [...adjacent].sort((left, right) => this.traversalPolicy.compareEdges(left, right))) {
26
31
  if (edges.has(edge.relationId))
27
32
  continue;
28
33
  edges.set(edge.relationId, edge);
29
- const related = this.relatedNode(current, edge, normalized.direction);
34
+ const related = this.traversalPolicy.relatedNode(current, edge, normalized.direction);
30
35
  if (related) {
31
- const relatedKey = this.nodeKey(related);
36
+ const relatedKey = this.traversalPolicy.nodeKey(related);
32
37
  if (!visited.has(relatedKey)) {
33
38
  visited.add(relatedKey);
34
39
  const traversalNode = { ...related, distance };
@@ -44,8 +49,9 @@ export class LocalTraverseRelationsGateway {
44
49
  }
45
50
  frontier = [...next.values()];
46
51
  }
47
- const stableNodes = [...nodes.values()].sort((left, right) => left.distance - right.distance || this.compareNodes(left, right));
48
- const stableEdges = [...edges.values()].sort((left, right) => this.compareEdges(left, right));
52
+ const stableNodes = [...nodes.values()].sort((left, right) => left.distance - right.distance ||
53
+ this.traversalPolicy.compareNodes(left, right));
54
+ const stableEdges = [...edges.values()].sort((left, right) => this.traversalPolicy.compareEdges(left, right));
49
55
  return {
50
56
  root,
51
57
  nodes: stableNodes,
@@ -60,79 +66,20 @@ export class LocalTraverseRelationsGateway {
60
66
  const entityId = request.entityId?.trim();
61
67
  if (!entityId)
62
68
  throw new Error("Entity ID must be provided.");
63
- const depth = request.depth ?? 1;
64
- if (!Number.isInteger(depth) || depth < 1 || depth > 5) {
65
- throw new Error("Depth must be an integer from 1 through 5.");
66
- }
67
69
  const limit = request.limit ?? 100;
68
70
  if (!Number.isInteger(limit) || limit < 1 || limit > 1000) {
69
71
  throw new Error("Limit must be an integer from 1 through 1000.");
70
72
  }
71
- const direction = request.direction ?? "both";
72
- if (!["in", "out", "both"].includes(direction)) {
73
- throw new Error("Direction must be one of: in, out, both.");
74
- }
75
- const status = request.status ?? "active";
76
- if (!["active", "deactivated", "removed", "all"].includes(status)) {
77
- throw new Error("Status must be one of: active, deactivated, removed, all.");
78
- }
79
- if (request.entityType)
80
- this.assertEntityType(request.entityType, "Entity type");
81
- if (request.relatedEntityType)
82
- this.assertEntityType(request.relatedEntityType, "Related entity type");
83
- if (request.strength && !Object.values(RelationStrength).includes(request.strength)) {
84
- throw new Error("Strength must be one of: strong, medium, weak.");
85
- }
73
+ const query = this.queryNormalizer.normalize(request);
86
74
  return {
87
- ...request,
75
+ ...query,
88
76
  entityId,
89
- depth,
90
- direction,
91
- status,
77
+ entityType: request.entityType,
92
78
  limit,
93
79
  };
94
80
  }
95
81
  async resolveRoot(entityId, explicitType) {
96
- if (explicitType)
97
- return { entityType: explicitType, entityId };
98
- const candidates = await this.relationViewReader.findEndpointTypes(entityId);
99
- if (candidates.length === 1)
100
- return { entityType: candidates[0], entityId };
101
- if (candidates.length === 0) {
102
- throw new Error(`No endpoint type can be inferred for entity ID '${entityId}'. Specify --entity-type explicitly.`);
103
- }
104
- throw new Error(`Entity ID '${entityId}' matches multiple endpoint types: ${[...candidates].sort().join(", ")}. ` +
105
- "Specify --entity-type explicitly.");
106
- }
107
- relatedNode(current, edge, direction) {
108
- const isFrom = edge.fromEntityType === current.entityType && edge.fromEntityId === current.entityId;
109
- const isTo = edge.toEntityType === current.entityType && edge.toEntityId === current.entityId;
110
- if (isFrom && direction !== "in") {
111
- return { entityType: edge.toEntityType, entityId: edge.toEntityId };
112
- }
113
- if (isTo && direction !== "out") {
114
- return { entityType: edge.fromEntityType, entityId: edge.fromEntityId };
115
- }
116
- return undefined;
117
- }
118
- assertEntityType(value, label) {
119
- if (!Object.values(EntityType).includes(value)) {
120
- throw new Error(`${label} must be one of: ${Object.values(EntityType).join(", ")}.`);
121
- }
122
- }
123
- nodeKey(node) {
124
- return `${node.entityType}\u0000${node.entityId}`;
125
- }
126
- compareNodes(left, right) {
127
- return left.entityType.localeCompare(right.entityType) || left.entityId.localeCompare(right.entityId);
128
- }
129
- compareEdges(left, right) {
130
- return left.createdAt.localeCompare(right.createdAt)
131
- || left.relationId.localeCompare(right.relationId)
132
- || left.fromEntityType.localeCompare(right.fromEntityType)
133
- || left.fromEntityId.localeCompare(right.fromEntityId)
134
- || left.toEntityType.localeCompare(right.toEntityType)
135
- || left.toEntityId.localeCompare(right.toEntityId);
82
+ return this.nodeResolver.resolve(entityId, explicitType);
136
83
  }
137
84
  }
138
85
  //# sourceMappingURL=LocalTraverseRelationsGateway.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalTraverseRelationsGateway.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/LocalTraverseRelationsGateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LocalTraverseRelationsGateway.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/LocalTraverseRelationsGateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { EntityTypeValue } from "../../../../domain/relations/Constants.js";
2
+ import { IRelationViewReader } from "../get/IRelationViewReader.js";
3
+ import { RelationNodeReference } from "../get/RelationNodeReference.js";
4
+ export declare class RelationNodeReferenceResolver {
5
+ private readonly relationViewReader;
6
+ constructor(relationViewReader: IRelationViewReader);
7
+ resolve(entityId: string, explicitType?: EntityTypeValue, typeOption?: string, endpointLabel?: string): Promise<RelationNodeReference>;
8
+ }
9
+ //# sourceMappingURL=RelationNodeReferenceResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationNodeReferenceResolver.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationNodeReferenceResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAChB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,qBAAa,6BAA6B;IAC5B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAAlB,kBAAkB,EAAE,mBAAmB;IAE9D,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,eAAe,EAC9B,UAAU,SAAkB,EAC5B,aAAa,SAAW,GACvB,OAAO,CAAC,qBAAqB,CAAC;CAgClC"}
@@ -0,0 +1,29 @@
1
+ import { EntityType, } from "../../../../domain/relations/Constants.js";
2
+ export class RelationNodeReferenceResolver {
3
+ constructor(relationViewReader) {
4
+ this.relationViewReader = relationViewReader;
5
+ }
6
+ async resolve(entityId, explicitType, typeOption = "--entity-type", endpointLabel = "Entity") {
7
+ const normalizedEntityId = entityId?.trim();
8
+ if (!normalizedEntityId) {
9
+ throw new Error(`${endpointLabel} ID must be provided.`);
10
+ }
11
+ if (explicitType) {
12
+ if (!Object.values(EntityType).includes(explicitType)) {
13
+ throw new Error(`${endpointLabel} type must be one of: ${Object.values(EntityType).join(", ")}.`);
14
+ }
15
+ return { entityType: explicitType, entityId: normalizedEntityId };
16
+ }
17
+ const candidates = await this.relationViewReader.findEndpointTypes(normalizedEntityId);
18
+ if (candidates.length === 1) {
19
+ return { entityType: candidates[0], entityId: normalizedEntityId };
20
+ }
21
+ if (candidates.length === 0) {
22
+ throw new Error(`No endpoint type can be inferred for entity ID '${normalizedEntityId}'. ` +
23
+ `Specify ${typeOption} explicitly.`);
24
+ }
25
+ throw new Error(`Entity ID '${normalizedEntityId}' matches multiple endpoint types: ` +
26
+ `${[...candidates].sort().join(", ")}. Specify ${typeOption} explicitly.`);
27
+ }
28
+ }
29
+ //# sourceMappingURL=RelationNodeReferenceResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationNodeReferenceResolver.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationNodeReferenceResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,GAEX,MAAM,2CAA2C,CAAC;AAInD,MAAM,OAAO,6BAA6B;IACxC,YAA6B,kBAAuC;QAAvC,uBAAkB,GAAlB,kBAAkB,CAAqB;IAAG,CAAC;IAExE,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,YAA8B,EAC9B,UAAU,GAAG,eAAe,EAC5B,aAAa,GAAG,QAAQ;QAExB,MAAM,kBAAkB,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,aAAa,uBAAuB,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,yBAAyB,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACjF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,UAAU,GACd,MAAM,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;QACrE,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,mDAAmD,kBAAkB,KAAK;gBACxE,WAAW,UAAU,cAAc,CACtC,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CACb,cAAc,kBAAkB,qCAAqC;YACnE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,UAAU,cAAc,CAC5E,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { RelationView } from "../RelationView.js";
2
+ import { RelationDirection } from "../get/RelationDirection.js";
3
+ import { RelationNodeReference } from "../get/RelationNodeReference.js";
4
+ export declare class RelationTraversalPolicy {
5
+ relatedNode(current: RelationNodeReference, edge: RelationView, direction: RelationDirection): RelationNodeReference | undefined;
6
+ nodeKey(node: RelationNodeReference): string;
7
+ compareNodes(left: RelationNodeReference, right: RelationNodeReference): number;
8
+ compareEdges(left: RelationView, right: RelationView): number;
9
+ }
10
+ //# sourceMappingURL=RelationTraversalPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationTraversalPolicy.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationTraversalPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,qBAAa,uBAAuB;IAClC,WAAW,CACT,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,iBAAiB,GAC3B,qBAAqB,GAAG,SAAS;IAiBpC,OAAO,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM;IAI5C,YAAY,CACV,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,qBAAqB,GAC3B,MAAM;IAOT,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM;CAU9D"}
@@ -0,0 +1,31 @@
1
+ export class RelationTraversalPolicy {
2
+ relatedNode(current, edge, direction) {
3
+ const isFrom = edge.fromEntityType === current.entityType &&
4
+ edge.fromEntityId === current.entityId;
5
+ const isTo = edge.toEntityType === current.entityType &&
6
+ edge.toEntityId === current.entityId;
7
+ if (isFrom && direction !== "in") {
8
+ return { entityType: edge.toEntityType, entityId: edge.toEntityId };
9
+ }
10
+ if (isTo && direction !== "out") {
11
+ return { entityType: edge.fromEntityType, entityId: edge.fromEntityId };
12
+ }
13
+ return undefined;
14
+ }
15
+ nodeKey(node) {
16
+ return `${node.entityType}\u0000${node.entityId}`;
17
+ }
18
+ compareNodes(left, right) {
19
+ return (left.entityType.localeCompare(right.entityType) ||
20
+ left.entityId.localeCompare(right.entityId));
21
+ }
22
+ compareEdges(left, right) {
23
+ return (left.createdAt.localeCompare(right.createdAt) ||
24
+ left.relationId.localeCompare(right.relationId) ||
25
+ left.fromEntityType.localeCompare(right.fromEntityType) ||
26
+ left.fromEntityId.localeCompare(right.fromEntityId) ||
27
+ left.toEntityType.localeCompare(right.toEntityType) ||
28
+ left.toEntityId.localeCompare(right.toEntityId));
29
+ }
30
+ }
31
+ //# sourceMappingURL=RelationTraversalPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationTraversalPolicy.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationTraversalPolicy.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,uBAAuB;IAClC,WAAW,CACT,OAA8B,EAC9B,IAAkB,EAClB,SAA4B;QAE5B,MAAM,MAAM,GACV,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC,UAAU;YAC1C,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC;QACzC,MAAM,IAAI,GACR,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,UAAU;YACxC,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC;QAEvC,IAAI,MAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACjC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QACtE,CAAC;QACD,IAAI,IAAI,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,IAA2B;QACjC,OAAO,GAAG,IAAI,CAAC,UAAU,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC;IAED,YAAY,CACV,IAA2B,EAC3B,KAA4B;QAE5B,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC5C,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,IAAkB,EAAE,KAAmB;QAClD,OAAO,CACL,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/C,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC;YACvD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAChD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import { EntityTypeValue, RelationStrengthValue } from "../../../../domain/relations/Constants.js";
2
+ import { RelationDirection } from "../get/RelationDirection.js";
3
+ import { RelationStatusFilter } from "../get/RelationStatusFilter.js";
4
+ export interface RelationTraversalQuery {
5
+ readonly depth: number;
6
+ readonly direction: RelationDirection;
7
+ readonly relationType?: string;
8
+ readonly relatedEntityType?: EntityTypeValue;
9
+ readonly strength?: RelationStrengthValue;
10
+ readonly status: RelationStatusFilter;
11
+ }
12
+ //# sourceMappingURL=RelationTraversalQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationTraversalQuery.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationTraversalQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,qBAAqB,EACtB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RelationTraversalQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationTraversalQuery.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationTraversalQuery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { EntityTypeValue, RelationStrengthValue } from "../../../../domain/relations/Constants.js";
2
+ import { RelationDirection } from "../get/RelationDirection.js";
3
+ import { RelationStatusFilter } from "../get/RelationStatusFilter.js";
4
+ import { RelationTraversalQuery } from "./RelationTraversalQuery.js";
5
+ type RelationTraversalQueryInput = {
6
+ readonly depth?: number;
7
+ readonly direction?: RelationDirection;
8
+ readonly relationType?: string;
9
+ readonly relatedEntityType?: EntityTypeValue;
10
+ readonly strength?: RelationStrengthValue;
11
+ readonly status?: RelationStatusFilter;
12
+ };
13
+ export declare class RelationTraversalQueryNormalizer {
14
+ normalize(request: RelationTraversalQueryInput, defaultDepth?: number): RelationTraversalQuery;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=RelationTraversalQueryNormalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationTraversalQueryNormalizer.d.ts","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationTraversalQueryNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEf,qBAAqB,EACtB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,KAAK,2BAA2B,GAAG;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;CACxC,CAAC;AAEF,qBAAa,gCAAgC;IAC3C,SAAS,CACP,OAAO,EAAE,2BAA2B,EACpC,YAAY,SAAI,GACf,sBAAsB;CA+C1B"}
@@ -0,0 +1,34 @@
1
+ import { EntityType, RelationStrength, } from "../../../../domain/relations/Constants.js";
2
+ export class RelationTraversalQueryNormalizer {
3
+ normalize(request, defaultDepth = 1) {
4
+ const depth = request.depth ?? defaultDepth;
5
+ if (!Number.isInteger(depth) || depth < 1 || depth > 5) {
6
+ throw new Error("Depth must be an integer from 1 through 5.");
7
+ }
8
+ const direction = request.direction ?? "both";
9
+ if (!["in", "out", "both"].includes(direction)) {
10
+ throw new Error("Direction must be one of: in, out, both.");
11
+ }
12
+ const status = request.status ?? "active";
13
+ if (!["active", "deactivated", "removed", "all"].includes(status)) {
14
+ throw new Error("Status must be one of: active, deactivated, removed, all.");
15
+ }
16
+ if (request.relatedEntityType &&
17
+ !Object.values(EntityType).includes(request.relatedEntityType)) {
18
+ throw new Error(`Related entity type must be one of: ${Object.values(EntityType).join(", ")}.`);
19
+ }
20
+ if (request.strength &&
21
+ !Object.values(RelationStrength).includes(request.strength)) {
22
+ throw new Error("Strength must be one of: strong, medium, weak.");
23
+ }
24
+ return {
25
+ depth,
26
+ direction,
27
+ relationType: request.relationType,
28
+ relatedEntityType: request.relatedEntityType,
29
+ strength: request.strength,
30
+ status,
31
+ };
32
+ }
33
+ }
34
+ //# sourceMappingURL=RelationTraversalQueryNormalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelationTraversalQueryNormalizer.js","sourceRoot":"","sources":["../../../../../src/application/context/relations/traverse/RelationTraversalQueryNormalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,gBAAgB,GAEjB,MAAM,2CAA2C,CAAC;AAcnD,MAAM,OAAO,gCAAgC;IAC3C,SAAS,CACP,OAAoC,EACpC,YAAY,GAAG,CAAC;QAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;QAC9C,IAAI,CAAE,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;QAC1C,IACE,CAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,CAAc,CAAC,QAAQ,CACjE,MAAM,CACP,EACD,CAAC;YACD,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QAED,IACE,OAAO,CAAC,iBAAiB;YACzB,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAC9D,CAAC;YACD,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC/E,CAAC;QACJ,CAAC;QAED,IACE,OAAO,CAAC,QAAQ;YAChB,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC3D,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,OAAO;YACL,KAAK;YACL,SAAS;YACT,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;YAC5C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;CACF"}
@@ -188,6 +188,8 @@ import { IRelationRemovedProjector } from "../context/relations/remove/IRelation
188
188
  import { IRelationRemovedReader } from "../context/relations/remove/IRelationRemovedReader.js";
189
189
  import { IRelationReader } from "../context/relations/IRelationReader.js";
190
190
  import { IRelationViewReader } from "../context/relations/get/IRelationViewReader.js";
191
+ import { AuditRelationsController } from "../context/relations/audit/AuditRelationsController.js";
192
+ import { IRelationNodeCatalog } from "../context/relations/audit/IRelationNodeCatalog.js";
191
193
  import { IAudiencePainAddedProjector } from "../context/audience-pains/add/IAudiencePainAddedProjector.js";
192
194
  import { IAudiencePainUpdatedProjector } from "../context/audience-pains/update/IAudiencePainUpdatedProjector.js";
193
195
  import { IAudiencePainUpdateReader } from "../context/audience-pains/update/IAudiencePainUpdateReader.js";
@@ -297,6 +299,7 @@ import { AddRelationController } from "../context/relations/add/AddRelationContr
297
299
  import { RemoveRelationController } from "../context/relations/remove/RemoveRelationController.js";
298
300
  import { GetRelationsController } from "../context/relations/get/GetRelationsController.js";
299
301
  import { TraverseRelationsController } from "../context/relations/traverse/TraverseRelationsController.js";
302
+ import { FindRelationPathController } from "../context/relations/path/FindRelationPathController.js";
300
303
  import { AddGuidelineController } from "../context/guidelines/add/AddGuidelineController.js";
301
304
  import { UpdateGuidelineController } from "../context/guidelines/update/UpdateGuidelineController.js";
302
305
  import { RemoveGuidelineController } from "../context/guidelines/remove/RemoveGuidelineController.js";
@@ -540,10 +543,13 @@ export interface IApplicationContainer {
540
543
  removeRelationController: RemoveRelationController;
541
544
  getRelationsController: GetRelationsController;
542
545
  traverseRelationsController: TraverseRelationsController;
546
+ findRelationPathController: FindRelationPathController;
547
+ auditRelationsController: AuditRelationsController;
543
548
  relationAddedEventStore: IRelationAddedEventWriter;
544
549
  relationRemovedEventStore: IRelationRemovedEventWriter & IRelationRemovedEventReader;
545
550
  relationAddedProjector: IRelationAddedProjector & IRelationAddedReader;
546
551
  relationRemovedProjector: IRelationRemovedProjector & IRelationRemovedReader & IRelationReader;
547
552
  relationViewReader: IRelationViewReader;
553
+ relationNodeCatalog: IRelationNodeCatalog;
548
554
  }
549
555
  //# sourceMappingURL=IApplicationContainer.d.ts.map