@domainlang/language 0.1.20

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 (212) hide show
  1. package/README.md +163 -0
  2. package/out/ast-augmentation.d.ts +6 -0
  3. package/out/ast-augmentation.js +2 -0
  4. package/out/ast-augmentation.js.map +1 -0
  5. package/out/domain-lang-module.d.ts +57 -0
  6. package/out/domain-lang-module.js +67 -0
  7. package/out/domain-lang-module.js.map +1 -0
  8. package/out/generated/ast.d.ts +759 -0
  9. package/out/generated/ast.js +556 -0
  10. package/out/generated/ast.js.map +1 -0
  11. package/out/generated/grammar.d.ts +6 -0
  12. package/out/generated/grammar.js +2407 -0
  13. package/out/generated/grammar.js.map +1 -0
  14. package/out/generated/module.d.ts +13 -0
  15. package/out/generated/module.js +21 -0
  16. package/out/generated/module.js.map +1 -0
  17. package/out/index.d.ts +16 -0
  18. package/out/index.js +22 -0
  19. package/out/index.js.map +1 -0
  20. package/out/lsp/domain-lang-code-actions.d.ts +55 -0
  21. package/out/lsp/domain-lang-code-actions.js +143 -0
  22. package/out/lsp/domain-lang-code-actions.js.map +1 -0
  23. package/out/lsp/domain-lang-completion.d.ts +37 -0
  24. package/out/lsp/domain-lang-completion.js +452 -0
  25. package/out/lsp/domain-lang-completion.js.map +1 -0
  26. package/out/lsp/domain-lang-formatter.d.ts +15 -0
  27. package/out/lsp/domain-lang-formatter.js +43 -0
  28. package/out/lsp/domain-lang-formatter.js.map +1 -0
  29. package/out/lsp/domain-lang-naming.d.ts +34 -0
  30. package/out/lsp/domain-lang-naming.js +49 -0
  31. package/out/lsp/domain-lang-naming.js.map +1 -0
  32. package/out/lsp/domain-lang-scope.d.ts +59 -0
  33. package/out/lsp/domain-lang-scope.js +102 -0
  34. package/out/lsp/domain-lang-scope.js.map +1 -0
  35. package/out/lsp/domain-lang-workspace-manager.d.ts +21 -0
  36. package/out/lsp/domain-lang-workspace-manager.js +93 -0
  37. package/out/lsp/domain-lang-workspace-manager.js.map +1 -0
  38. package/out/lsp/hover/ddd-pattern-explanations.d.ts +50 -0
  39. package/out/lsp/hover/ddd-pattern-explanations.js +196 -0
  40. package/out/lsp/hover/ddd-pattern-explanations.js.map +1 -0
  41. package/out/lsp/hover/domain-lang-hover.d.ts +19 -0
  42. package/out/lsp/hover/domain-lang-hover.js +302 -0
  43. package/out/lsp/hover/domain-lang-hover.js.map +1 -0
  44. package/out/lsp/hover/domain-lang-keywords.d.ts +13 -0
  45. package/out/lsp/hover/domain-lang-keywords.js +47 -0
  46. package/out/lsp/hover/domain-lang-keywords.js.map +1 -0
  47. package/out/lsp/manifest-diagnostics.d.ts +82 -0
  48. package/out/lsp/manifest-diagnostics.js +230 -0
  49. package/out/lsp/manifest-diagnostics.js.map +1 -0
  50. package/out/main-browser.d.ts +1 -0
  51. package/out/main-browser.js +11 -0
  52. package/out/main-browser.js.map +1 -0
  53. package/out/main.d.ts +1 -0
  54. package/out/main.js +74 -0
  55. package/out/main.js.map +1 -0
  56. package/out/sdk/ast-augmentation.d.ts +136 -0
  57. package/out/sdk/ast-augmentation.js +62 -0
  58. package/out/sdk/ast-augmentation.js.map +1 -0
  59. package/out/sdk/index.d.ts +94 -0
  60. package/out/sdk/index.js +97 -0
  61. package/out/sdk/index.js.map +1 -0
  62. package/out/sdk/indexes.d.ts +16 -0
  63. package/out/sdk/indexes.js +97 -0
  64. package/out/sdk/indexes.js.map +1 -0
  65. package/out/sdk/loader-node.d.ts +51 -0
  66. package/out/sdk/loader-node.js +119 -0
  67. package/out/sdk/loader-node.js.map +1 -0
  68. package/out/sdk/loader.d.ts +49 -0
  69. package/out/sdk/loader.js +85 -0
  70. package/out/sdk/loader.js.map +1 -0
  71. package/out/sdk/patterns.d.ts +93 -0
  72. package/out/sdk/patterns.js +123 -0
  73. package/out/sdk/patterns.js.map +1 -0
  74. package/out/sdk/query.d.ts +90 -0
  75. package/out/sdk/query.js +679 -0
  76. package/out/sdk/query.js.map +1 -0
  77. package/out/sdk/resolution.d.ts +52 -0
  78. package/out/sdk/resolution.js +68 -0
  79. package/out/sdk/resolution.js.map +1 -0
  80. package/out/sdk/types.d.ts +280 -0
  81. package/out/sdk/types.js +8 -0
  82. package/out/sdk/types.js.map +1 -0
  83. package/out/services/dependency-analyzer.d.ts +58 -0
  84. package/out/services/dependency-analyzer.js +254 -0
  85. package/out/services/dependency-analyzer.js.map +1 -0
  86. package/out/services/dependency-resolver.d.ts +146 -0
  87. package/out/services/dependency-resolver.js +452 -0
  88. package/out/services/dependency-resolver.js.map +1 -0
  89. package/out/services/git-url-resolver.browser.d.ts +10 -0
  90. package/out/services/git-url-resolver.browser.js +19 -0
  91. package/out/services/git-url-resolver.browser.js.map +1 -0
  92. package/out/services/git-url-resolver.d.ts +158 -0
  93. package/out/services/git-url-resolver.js +416 -0
  94. package/out/services/git-url-resolver.js.map +1 -0
  95. package/out/services/governance-validator.d.ts +44 -0
  96. package/out/services/governance-validator.js +153 -0
  97. package/out/services/governance-validator.js.map +1 -0
  98. package/out/services/import-resolver.d.ts +77 -0
  99. package/out/services/import-resolver.js +240 -0
  100. package/out/services/import-resolver.js.map +1 -0
  101. package/out/services/performance-optimizer.d.ts +60 -0
  102. package/out/services/performance-optimizer.js +140 -0
  103. package/out/services/performance-optimizer.js.map +1 -0
  104. package/out/services/relationship-inference.d.ts +11 -0
  105. package/out/services/relationship-inference.js +98 -0
  106. package/out/services/relationship-inference.js.map +1 -0
  107. package/out/services/semver.d.ts +98 -0
  108. package/out/services/semver.js +195 -0
  109. package/out/services/semver.js.map +1 -0
  110. package/out/services/types.d.ts +340 -0
  111. package/out/services/types.js +46 -0
  112. package/out/services/types.js.map +1 -0
  113. package/out/services/workspace-manager.d.ts +123 -0
  114. package/out/services/workspace-manager.js +489 -0
  115. package/out/services/workspace-manager.js.map +1 -0
  116. package/out/syntaxes/domain-lang.monarch.d.ts +76 -0
  117. package/out/syntaxes/domain-lang.monarch.js +29 -0
  118. package/out/syntaxes/domain-lang.monarch.js.map +1 -0
  119. package/out/utils/import-utils.d.ts +49 -0
  120. package/out/utils/import-utils.js +128 -0
  121. package/out/utils/import-utils.js.map +1 -0
  122. package/out/validation/bounded-context.d.ts +11 -0
  123. package/out/validation/bounded-context.js +79 -0
  124. package/out/validation/bounded-context.js.map +1 -0
  125. package/out/validation/classification.d.ts +3 -0
  126. package/out/validation/classification.js +3 -0
  127. package/out/validation/classification.js.map +1 -0
  128. package/out/validation/constants.d.ts +180 -0
  129. package/out/validation/constants.js +235 -0
  130. package/out/validation/constants.js.map +1 -0
  131. package/out/validation/domain-lang-validator.d.ts +2 -0
  132. package/out/validation/domain-lang-validator.js +27 -0
  133. package/out/validation/domain-lang-validator.js.map +1 -0
  134. package/out/validation/domain.d.ts +11 -0
  135. package/out/validation/domain.js +63 -0
  136. package/out/validation/domain.js.map +1 -0
  137. package/out/validation/import.d.ts +68 -0
  138. package/out/validation/import.js +237 -0
  139. package/out/validation/import.js.map +1 -0
  140. package/out/validation/manifest.d.ts +144 -0
  141. package/out/validation/manifest.js +327 -0
  142. package/out/validation/manifest.js.map +1 -0
  143. package/out/validation/maps.d.ts +21 -0
  144. package/out/validation/maps.js +60 -0
  145. package/out/validation/maps.js.map +1 -0
  146. package/out/validation/metadata.d.ts +7 -0
  147. package/out/validation/metadata.js +16 -0
  148. package/out/validation/metadata.js.map +1 -0
  149. package/out/validation/model.d.ts +12 -0
  150. package/out/validation/model.js +29 -0
  151. package/out/validation/model.js.map +1 -0
  152. package/out/validation/relationships.d.ts +12 -0
  153. package/out/validation/relationships.js +94 -0
  154. package/out/validation/relationships.js.map +1 -0
  155. package/out/validation/shared.d.ts +6 -0
  156. package/out/validation/shared.js +12 -0
  157. package/out/validation/shared.js.map +1 -0
  158. package/package.json +110 -0
  159. package/src/ast-augmentation.ts +5 -0
  160. package/src/domain-lang-module.ts +112 -0
  161. package/src/domain-lang.langium +351 -0
  162. package/src/generated/ast.ts +986 -0
  163. package/src/generated/grammar.ts +2409 -0
  164. package/src/generated/module.ts +25 -0
  165. package/src/index.ts +24 -0
  166. package/src/lsp/domain-lang-code-actions.ts +189 -0
  167. package/src/lsp/domain-lang-completion.ts +514 -0
  168. package/src/lsp/domain-lang-formatter.ts +51 -0
  169. package/src/lsp/domain-lang-naming.ts +56 -0
  170. package/src/lsp/domain-lang-scope.ts +137 -0
  171. package/src/lsp/domain-lang-workspace-manager.ts +104 -0
  172. package/src/lsp/hover/ddd-pattern-explanations.ts +237 -0
  173. package/src/lsp/hover/domain-lang-hover.ts +338 -0
  174. package/src/lsp/hover/domain-lang-keywords.ts +50 -0
  175. package/src/lsp/manifest-diagnostics.ts +290 -0
  176. package/src/main-browser.ts +15 -0
  177. package/src/main.ts +85 -0
  178. package/src/sdk/README.md +297 -0
  179. package/src/sdk/ast-augmentation.ts +157 -0
  180. package/src/sdk/index.ts +126 -0
  181. package/src/sdk/indexes.ts +155 -0
  182. package/src/sdk/loader-node.ts +146 -0
  183. package/src/sdk/loader.ts +99 -0
  184. package/src/sdk/patterns.ts +147 -0
  185. package/src/sdk/query.ts +802 -0
  186. package/src/sdk/resolution.ts +78 -0
  187. package/src/sdk/types.ts +323 -0
  188. package/src/services/dependency-analyzer.ts +321 -0
  189. package/src/services/dependency-resolver.ts +551 -0
  190. package/src/services/git-url-resolver.browser.ts +26 -0
  191. package/src/services/git-url-resolver.ts +517 -0
  192. package/src/services/governance-validator.ts +177 -0
  193. package/src/services/import-resolver.ts +292 -0
  194. package/src/services/performance-optimizer.ts +170 -0
  195. package/src/services/relationship-inference.ts +121 -0
  196. package/src/services/semver.ts +213 -0
  197. package/src/services/types.ts +415 -0
  198. package/src/services/workspace-manager.ts +607 -0
  199. package/src/syntaxes/domain-lang.monarch.ts +29 -0
  200. package/src/utils/import-utils.ts +152 -0
  201. package/src/validation/bounded-context.ts +99 -0
  202. package/src/validation/classification.ts +5 -0
  203. package/src/validation/constants.ts +304 -0
  204. package/src/validation/domain-lang-validator.ts +33 -0
  205. package/src/validation/domain.ts +77 -0
  206. package/src/validation/import.ts +295 -0
  207. package/src/validation/manifest.ts +439 -0
  208. package/src/validation/maps.ts +76 -0
  209. package/src/validation/metadata.ts +18 -0
  210. package/src/validation/model.ts +37 -0
  211. package/src/validation/relationships.ts +154 -0
  212. package/src/validation/shared.ts +14 -0
@@ -0,0 +1,154 @@
1
+ import type { ValidationAcceptor } from 'langium';
2
+ import type { Relationship, BoundedContextRef } from '../generated/ast.js';
3
+ import { isThisRef } from '../generated/ast.js';
4
+ import { ValidationMessages, buildCodeDescription } from './constants.js';
5
+
6
+ /**
7
+ * Gets a display name for a BoundedContextRef (handles 'this' and regular refs).
8
+ */
9
+ function getContextName(ref: BoundedContextRef): string {
10
+ if (isThisRef(ref)) {
11
+ return 'this';
12
+ }
13
+ return ref.link?.$refText ?? 'unknown';
14
+ }
15
+
16
+ /**
17
+ * Validates that SharedKernel patterns use bidirectional relationships.
18
+ * SharedKernel implies mutual dependency and shared code ownership.
19
+ *
20
+ * @param relationship - The relationship to validate
21
+ * @param accept - The validation acceptor for reporting issues
22
+ */
23
+ function validateSharedKernelBidirectional(
24
+ relationship: Relationship,
25
+ accept: ValidationAcceptor
26
+ ): void {
27
+ // Check if SharedKernel pattern exists on either side
28
+ const hasSharedKernelLeft = relationship.leftPatterns?.some(
29
+ pattern => pattern === 'SK' || pattern === 'SharedKernel'
30
+ );
31
+ const hasSharedKernelRight = relationship.rightPatterns?.some(
32
+ pattern => pattern === 'SK' || pattern === 'SharedKernel'
33
+ );
34
+
35
+ if ((hasSharedKernelLeft || hasSharedKernelRight) && relationship.arrow !== '<->') {
36
+ const leftName = getContextName(relationship.left);
37
+ const rightName = getContextName(relationship.right);
38
+
39
+ accept('warning',
40
+ ValidationMessages.SHARED_KERNEL_MUST_BE_BIDIRECTIONAL(leftName, rightName, relationship.arrow),
41
+ { node: relationship, property: 'arrow', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
42
+ );
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Validates that Anti-Corruption Layer (ACL) is on the consuming side.
48
+ * ACL protects downstream context from upstream changes.
49
+ *
50
+ * @param relationship - The relationship to validate
51
+ * @param accept - The validation acceptor for reporting issues
52
+ */
53
+ function validateACLPlacement(
54
+ relationship: Relationship,
55
+ accept: ValidationAcceptor
56
+ ): void {
57
+ const hasACLLeft = relationship.leftPatterns?.some(
58
+ pattern => pattern === 'ACL' || pattern === 'AntiCorruptionLayer'
59
+ );
60
+ const hasACLRight = relationship.rightPatterns?.some(
61
+ pattern => pattern === 'ACL' || pattern === 'AntiCorruptionLayer'
62
+ );
63
+
64
+ // ACL on left side with -> arrow means upstream has ACL (incorrect)
65
+ if (hasACLLeft && relationship.arrow === '->') {
66
+ const leftName = getContextName(relationship.left);
67
+ accept('warning',
68
+ ValidationMessages.ACL_ON_WRONG_SIDE(leftName, 'left'),
69
+ { node: relationship, property: 'leftPatterns', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
70
+ );
71
+ }
72
+
73
+ // ACL on right side with <- arrow means upstream has ACL (incorrect)
74
+ if (hasACLRight && relationship.arrow === '<-') {
75
+ const rightName = getContextName(relationship.right);
76
+ accept('warning',
77
+ ValidationMessages.ACL_ON_WRONG_SIDE(rightName, 'right'),
78
+ { node: relationship, property: 'rightPatterns', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
79
+ );
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Validates that Conformist pattern is on the consuming side.
85
+ * Conformist means accepting upstream model without translation.
86
+ *
87
+ * @param relationship - The relationship to validate
88
+ * @param accept - The validation acceptor for reporting issues
89
+ */
90
+ function validateConformistPlacement(
91
+ relationship: Relationship,
92
+ accept: ValidationAcceptor
93
+ ): void {
94
+ const hasCFLeft = relationship.leftPatterns?.some(
95
+ pattern => pattern === 'CF' || pattern === 'Conformist'
96
+ );
97
+ const hasCFRight = relationship.rightPatterns?.some(
98
+ pattern => pattern === 'CF' || pattern === 'Conformist'
99
+ );
100
+
101
+ // CF on left side with -> arrow means upstream is conformist (incorrect)
102
+ if (hasCFLeft && relationship.arrow === '->') {
103
+ const leftName = getContextName(relationship.left);
104
+ accept('warning',
105
+ ValidationMessages.CONFORMIST_ON_WRONG_SIDE(leftName, 'left'),
106
+ { node: relationship, property: 'leftPatterns', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
107
+ );
108
+ }
109
+
110
+ // CF on right side with <- arrow means upstream is conformist (incorrect)
111
+ if (hasCFRight && relationship.arrow === '<-') {
112
+ const rightName = getContextName(relationship.right);
113
+ accept('warning',
114
+ ValidationMessages.CONFORMIST_ON_WRONG_SIDE(rightName, 'right'),
115
+ { node: relationship, property: 'rightPatterns', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
116
+ );
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Validates that relationships don't have too many integration patterns.
122
+ * More than 3 patterns on one side suggests syntax confusion.
123
+ *
124
+ * @param relationship - The relationship to validate
125
+ * @param accept - The validation acceptor for reporting issues
126
+ */
127
+ function validatePatternCount(
128
+ relationship: Relationship,
129
+ accept: ValidationAcceptor
130
+ ): void {
131
+ const leftCount = relationship.leftPatterns?.length ?? 0;
132
+ const rightCount = relationship.rightPatterns?.length ?? 0;
133
+
134
+ if (leftCount > 3) {
135
+ accept('info',
136
+ ValidationMessages.TOO_MANY_PATTERNS(leftCount, 'left'),
137
+ { node: relationship, property: 'leftPatterns', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
138
+ );
139
+ }
140
+
141
+ if (rightCount > 3) {
142
+ accept('info',
143
+ ValidationMessages.TOO_MANY_PATTERNS(rightCount, 'right'),
144
+ { node: relationship, property: 'rightPatterns', codeDescription: buildCodeDescription('language.md', 'integration-patterns') }
145
+ );
146
+ }
147
+ }
148
+
149
+ export const relationshipChecks = [
150
+ validateSharedKernelBidirectional,
151
+ validateACLPlacement,
152
+ validateConformistPlacement,
153
+ validatePatternCount
154
+ ];
@@ -0,0 +1,14 @@
1
+ import type { AstNode } from 'langium';
2
+ import type { Container } from '../generated/ast.js';
3
+ import { isContainer } from '../generated/ast.js';
4
+ import { QualifiedNameProvider } from '../lsp/domain-lang-naming.js';
5
+
6
+ export function* extractNames(element: Container): Generator<{fqn: string, node: AstNode}> {
7
+ const fqnProvider = new QualifiedNameProvider();
8
+ for (const child of element.children) {
9
+ yield {fqn: fqnProvider.getQualifiedName(child.$container, child.name), node: child};
10
+ if (isContainer(child)) {
11
+ yield* extractNames(child);
12
+ }
13
+ }
14
+ }