@domainlang/language 0.1.81
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/README.md +32 -0
- package/out/ast-augmentation.d.ts +6 -0
- package/out/ast-augmentation.js +2 -0
- package/out/ast-augmentation.js.map +1 -0
- package/out/domain-lang-module.d.ts +55 -0
- package/out/domain-lang-module.js +59 -0
- package/out/domain-lang-module.js.map +1 -0
- package/out/generated/ast.d.ts +770 -0
- package/out/generated/ast.js +565 -0
- package/out/generated/ast.js.map +1 -0
- package/out/generated/grammar.d.ts +6 -0
- package/out/generated/grammar.js +2502 -0
- package/out/generated/grammar.js.map +1 -0
- package/out/generated/module.d.ts +13 -0
- package/out/generated/module.js +21 -0
- package/out/generated/module.js.map +1 -0
- package/out/index.d.ts +13 -0
- package/out/index.js +17 -0
- package/out/index.js.map +1 -0
- package/out/lsp/domain-lang-completion.d.ts +37 -0
- package/out/lsp/domain-lang-completion.js +452 -0
- package/out/lsp/domain-lang-completion.js.map +1 -0
- package/out/lsp/domain-lang-formatter.d.ts +15 -0
- package/out/lsp/domain-lang-formatter.js +43 -0
- package/out/lsp/domain-lang-formatter.js.map +1 -0
- package/out/lsp/domain-lang-naming.d.ts +34 -0
- package/out/lsp/domain-lang-naming.js +49 -0
- package/out/lsp/domain-lang-naming.js.map +1 -0
- package/out/lsp/domain-lang-scope.d.ts +59 -0
- package/out/lsp/domain-lang-scope.js +102 -0
- package/out/lsp/domain-lang-scope.js.map +1 -0
- package/out/lsp/hover/ddd-pattern-explanations.d.ts +50 -0
- package/out/lsp/hover/ddd-pattern-explanations.js +196 -0
- package/out/lsp/hover/ddd-pattern-explanations.js.map +1 -0
- package/out/lsp/hover/domain-lang-hover.d.ts +19 -0
- package/out/lsp/hover/domain-lang-hover.js +306 -0
- package/out/lsp/hover/domain-lang-hover.js.map +1 -0
- package/out/lsp/hover/domain-lang-keywords.d.ts +13 -0
- package/out/lsp/hover/domain-lang-keywords.js +47 -0
- package/out/lsp/hover/domain-lang-keywords.js.map +1 -0
- package/out/main-browser.d.ts +1 -0
- package/out/main-browser.js +11 -0
- package/out/main-browser.js.map +1 -0
- package/out/main.d.ts +1 -0
- package/out/main.js +74 -0
- package/out/main.js.map +1 -0
- package/out/sdk/ast-augmentation.d.ts +136 -0
- package/out/sdk/ast-augmentation.js +62 -0
- package/out/sdk/ast-augmentation.js.map +1 -0
- package/out/sdk/index.d.ts +94 -0
- package/out/sdk/index.js +97 -0
- package/out/sdk/index.js.map +1 -0
- package/out/sdk/indexes.d.ts +16 -0
- package/out/sdk/indexes.js +97 -0
- package/out/sdk/indexes.js.map +1 -0
- package/out/sdk/loader-node.d.ts +47 -0
- package/out/sdk/loader-node.js +104 -0
- package/out/sdk/loader-node.js.map +1 -0
- package/out/sdk/loader.d.ts +49 -0
- package/out/sdk/loader.js +85 -0
- package/out/sdk/loader.js.map +1 -0
- package/out/sdk/patterns.d.ts +93 -0
- package/out/sdk/patterns.js +123 -0
- package/out/sdk/patterns.js.map +1 -0
- package/out/sdk/query.d.ts +90 -0
- package/out/sdk/query.js +679 -0
- package/out/sdk/query.js.map +1 -0
- package/out/sdk/resolution.d.ts +52 -0
- package/out/sdk/resolution.js +68 -0
- package/out/sdk/resolution.js.map +1 -0
- package/out/sdk/types.d.ts +301 -0
- package/out/sdk/types.js +8 -0
- package/out/sdk/types.js.map +1 -0
- package/out/services/dependency-analyzer.d.ts +94 -0
- package/out/services/dependency-analyzer.js +279 -0
- package/out/services/dependency-analyzer.js.map +1 -0
- package/out/services/dependency-resolver.d.ts +123 -0
- package/out/services/dependency-resolver.js +252 -0
- package/out/services/dependency-resolver.js.map +1 -0
- package/out/services/git-url-resolver.browser.d.ts +18 -0
- package/out/services/git-url-resolver.browser.js +15 -0
- package/out/services/git-url-resolver.browser.js.map +1 -0
- package/out/services/git-url-resolver.d.ts +192 -0
- package/out/services/git-url-resolver.js +382 -0
- package/out/services/git-url-resolver.js.map +1 -0
- package/out/services/governance-validator.d.ts +80 -0
- package/out/services/governance-validator.js +159 -0
- package/out/services/governance-validator.js.map +1 -0
- package/out/services/import-resolver.d.ts +18 -0
- package/out/services/import-resolver.js +22 -0
- package/out/services/import-resolver.js.map +1 -0
- package/out/services/performance-optimizer.d.ts +60 -0
- package/out/services/performance-optimizer.js +140 -0
- package/out/services/performance-optimizer.js.map +1 -0
- package/out/services/relationship-inference.d.ts +11 -0
- package/out/services/relationship-inference.js +98 -0
- package/out/services/relationship-inference.js.map +1 -0
- package/out/services/workspace-manager.d.ts +76 -0
- package/out/services/workspace-manager.js +323 -0
- package/out/services/workspace-manager.js.map +1 -0
- package/out/syntaxes/domain-lang.monarch.d.ts +76 -0
- package/out/syntaxes/domain-lang.monarch.js +29 -0
- package/out/syntaxes/domain-lang.monarch.js.map +1 -0
- package/out/utils/import-utils.d.ts +57 -0
- package/out/utils/import-utils.js +228 -0
- package/out/utils/import-utils.js.map +1 -0
- package/out/validation/bounded-context.d.ts +11 -0
- package/out/validation/bounded-context.js +79 -0
- package/out/validation/bounded-context.js.map +1 -0
- package/out/validation/classification.d.ts +3 -0
- package/out/validation/classification.js +3 -0
- package/out/validation/classification.js.map +1 -0
- package/out/validation/constants.d.ts +77 -0
- package/out/validation/constants.js +96 -0
- package/out/validation/constants.js.map +1 -0
- package/out/validation/domain-lang-validator.d.ts +2 -0
- package/out/validation/domain-lang-validator.js +27 -0
- package/out/validation/domain-lang-validator.js.map +1 -0
- package/out/validation/domain.d.ts +11 -0
- package/out/validation/domain.js +18 -0
- package/out/validation/domain.js.map +1 -0
- package/out/validation/import.d.ts +44 -0
- package/out/validation/import.js +135 -0
- package/out/validation/import.js.map +1 -0
- package/out/validation/maps.d.ts +21 -0
- package/out/validation/maps.js +56 -0
- package/out/validation/maps.js.map +1 -0
- package/out/validation/metadata.d.ts +7 -0
- package/out/validation/metadata.js +12 -0
- package/out/validation/metadata.js.map +1 -0
- package/out/validation/model.d.ts +12 -0
- package/out/validation/model.js +29 -0
- package/out/validation/model.js.map +1 -0
- package/out/validation/relationships.d.ts +12 -0
- package/out/validation/relationships.js +94 -0
- package/out/validation/relationships.js.map +1 -0
- package/out/validation/shared.d.ts +6 -0
- package/out/validation/shared.js +12 -0
- package/out/validation/shared.js.map +1 -0
- package/package.json +97 -0
- package/src/ast-augmentation.ts +5 -0
- package/src/domain-lang-module.ts +100 -0
- package/src/domain-lang.langium +356 -0
- package/src/generated/ast.ts +999 -0
- package/src/generated/grammar.ts +2504 -0
- package/src/generated/module.ts +25 -0
- package/src/index.ts +17 -0
- package/src/lsp/domain-lang-completion.ts +514 -0
- package/src/lsp/domain-lang-formatter.ts +51 -0
- package/src/lsp/domain-lang-naming.ts +56 -0
- package/src/lsp/domain-lang-scope.ts +137 -0
- package/src/lsp/hover/ddd-pattern-explanations.ts +237 -0
- package/src/lsp/hover/domain-lang-hover.ts +340 -0
- package/src/lsp/hover/domain-lang-keywords.ts +50 -0
- package/src/main-browser.ts +15 -0
- package/src/main.ts +85 -0
- package/src/sdk/README.md +297 -0
- package/src/sdk/ast-augmentation.ts +157 -0
- package/src/sdk/index.ts +128 -0
- package/src/sdk/indexes.ts +155 -0
- package/src/sdk/loader-node.ts +126 -0
- package/src/sdk/loader.ts +99 -0
- package/src/sdk/patterns.ts +147 -0
- package/src/sdk/query.ts +802 -0
- package/src/sdk/resolution.ts +78 -0
- package/src/sdk/types.ts +346 -0
- package/src/services/dependency-analyzer.ts +381 -0
- package/src/services/dependency-resolver.ts +334 -0
- package/src/services/git-url-resolver.browser.ts +31 -0
- package/src/services/git-url-resolver.ts +524 -0
- package/src/services/governance-validator.ts +219 -0
- package/src/services/import-resolver.ts +30 -0
- package/src/services/performance-optimizer.ts +170 -0
- package/src/services/relationship-inference.ts +121 -0
- package/src/services/workspace-manager.ts +416 -0
- package/src/syntaxes/domain-lang.monarch.ts +29 -0
- package/src/utils/import-utils.ts +274 -0
- package/src/validation/bounded-context.ts +99 -0
- package/src/validation/classification.ts +5 -0
- package/src/validation/constants.ts +124 -0
- package/src/validation/domain-lang-validator.ts +33 -0
- package/src/validation/domain.ts +24 -0
- package/src/validation/import.ts +171 -0
- package/src/validation/maps.ts +72 -0
- package/src/validation/metadata.ts +14 -0
- package/src/validation/model.ts +37 -0
- package/src/validation/relationships.ts +154 -0
- package/src/validation/shared.ts +14 -0
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { CstUtils, isAstNodeWithComment, isJSDoc, isReference, parseJSDoc } from 'langium';
|
|
2
|
+
import { AstNodeHoverProvider } from 'langium/lsp';
|
|
3
|
+
import * as ast from '../../generated/ast.js';
|
|
4
|
+
import { keywordExplanations } from './domain-lang-keywords.js';
|
|
5
|
+
import { effectiveClassification, effectiveTeam } from '../../sdk/resolution.js';
|
|
6
|
+
/**
|
|
7
|
+
* Provides hover information for DomainLang elements.
|
|
8
|
+
*/
|
|
9
|
+
export class DomainLangHoverProvider extends AstNodeHoverProvider {
|
|
10
|
+
constructor(services) {
|
|
11
|
+
super(services);
|
|
12
|
+
this.documentationProvider = services.documentation.DocumentationProvider;
|
|
13
|
+
this.commentProvider = services.documentation.CommentProvider;
|
|
14
|
+
const domainServices = services;
|
|
15
|
+
this.qualifiedNameProvider = domainServices.references.QualifiedNameProvider;
|
|
16
|
+
}
|
|
17
|
+
async getHoverContent(document, params) {
|
|
18
|
+
try {
|
|
19
|
+
const rootNode = document.parseResult?.value?.$cstNode;
|
|
20
|
+
if (!rootNode) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const offset = document.textDocument.offsetAt(params.position);
|
|
24
|
+
const cstNode = CstUtils.findDeclarationNodeAtOffset(rootNode, offset, this.grammarConfig.nameRegexp);
|
|
25
|
+
if (!cstNode || cstNode.offset + cstNode.length <= offset) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const targetNodes = this.references.findDeclarations(cstNode);
|
|
29
|
+
const targetNode = targetNodes?.[0];
|
|
30
|
+
if (targetNode) {
|
|
31
|
+
const content = await this.getAstNodeHoverContent(targetNode);
|
|
32
|
+
if (content) {
|
|
33
|
+
return { contents: { kind: 'markdown', value: content } };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (cstNode.astNode && ast.isThisRef(cstNode.astNode)) {
|
|
37
|
+
const content = await this.getAstNodeHoverContent(cstNode.astNode);
|
|
38
|
+
if (content) {
|
|
39
|
+
return { contents: { kind: 'markdown', value: content } };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (cstNode.grammarSource?.$type === 'Keyword') {
|
|
43
|
+
const keywordHover = this.getKeywordHoverContent(cstNode.grammarSource);
|
|
44
|
+
if (keywordHover) {
|
|
45
|
+
return keywordHover;
|
|
46
|
+
}
|
|
47
|
+
const explanation = keywordExplanations[cstNode.text.toLowerCase()];
|
|
48
|
+
if (explanation) {
|
|
49
|
+
return { contents: { kind: 'markdown', value: `💡 ${explanation}` } };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error('Error in getHoverContent:', error);
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
getAstNodeHoverContent(node) {
|
|
59
|
+
try {
|
|
60
|
+
const content = this.documentationProvider.getDocumentation(node);
|
|
61
|
+
const commentBlock = content ? `*${content}*\n\n` : '';
|
|
62
|
+
if (ast.isDomain(node)) {
|
|
63
|
+
const description = node.description ?? '';
|
|
64
|
+
const vision = node.vision ?? '';
|
|
65
|
+
const typeRef = node.type?.ref;
|
|
66
|
+
const type = this.getRefName(typeRef);
|
|
67
|
+
const signatureParts = ['Domain', node.name];
|
|
68
|
+
if (node.parent?.ref?.name)
|
|
69
|
+
signatureParts.push('in', node.parent.ref.name);
|
|
70
|
+
const signature = `\`\`\`domain-lang\n${signatureParts.join(' ')}\n\`\`\``;
|
|
71
|
+
const fields = [signature];
|
|
72
|
+
if (description)
|
|
73
|
+
fields.push(description);
|
|
74
|
+
if (vision || type || node.parent)
|
|
75
|
+
fields.push('---');
|
|
76
|
+
if (vision)
|
|
77
|
+
fields.push(`**Vision:** ${vision}`);
|
|
78
|
+
if (type)
|
|
79
|
+
fields.push(`**Type:** ${this.refLink(typeRef, type)}`);
|
|
80
|
+
if (node.parent)
|
|
81
|
+
fields.push(`**Parent:** ${this.refLink(node.parent)}`);
|
|
82
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
83
|
+
`📁 **\`(domain)\` ${node.name}**\n\n` +
|
|
84
|
+
fields.join('\n\n');
|
|
85
|
+
}
|
|
86
|
+
if (ast.isThisRef(node)) {
|
|
87
|
+
let parent = node.$container;
|
|
88
|
+
while (parent) {
|
|
89
|
+
if (ast.isDomain(parent) ||
|
|
90
|
+
ast.isBoundedContext(parent) ||
|
|
91
|
+
ast.isNamespaceDeclaration(parent) ||
|
|
92
|
+
ast.isContextMap(parent) ||
|
|
93
|
+
ast.isDomainMap(parent) ||
|
|
94
|
+
ast.isModel(parent)) {
|
|
95
|
+
return this.getAstNodeHoverContent(parent);
|
|
96
|
+
}
|
|
97
|
+
parent = parent.$container;
|
|
98
|
+
}
|
|
99
|
+
return '*this* refers to the current context';
|
|
100
|
+
}
|
|
101
|
+
if (ast.isBoundedContext(node)) {
|
|
102
|
+
const description = node.description ?? '';
|
|
103
|
+
const classification = effectiveClassification(node);
|
|
104
|
+
const team = effectiveTeam(node);
|
|
105
|
+
const businessModel = node.businessModel?.ref;
|
|
106
|
+
const evolution = node.evolution?.ref;
|
|
107
|
+
const relationships = node.relationships ?? [];
|
|
108
|
+
const terminology = node.terminology ?? [];
|
|
109
|
+
const decisions = node.decisions ?? [];
|
|
110
|
+
const classificationName = classification?.name;
|
|
111
|
+
const teamName = team?.name;
|
|
112
|
+
const signatureParts = ['boundedcontext', node.name];
|
|
113
|
+
if (node.domain?.ref?.name)
|
|
114
|
+
signatureParts.push('for', node.domain.ref.name);
|
|
115
|
+
if (classificationName)
|
|
116
|
+
signatureParts.push('as', classificationName);
|
|
117
|
+
if (teamName)
|
|
118
|
+
signatureParts.push('by', teamName);
|
|
119
|
+
const signature = `\`\`\`domain-lang\n${signatureParts.join(' ')}\n\`\`\``;
|
|
120
|
+
const fields = [signature];
|
|
121
|
+
if (description)
|
|
122
|
+
fields.push(description);
|
|
123
|
+
if (classification || team || businessModel || evolution)
|
|
124
|
+
fields.push('---');
|
|
125
|
+
if (classification)
|
|
126
|
+
fields.push(`🔖 **Classification:** ${this.refLink(classification)}`);
|
|
127
|
+
if (team)
|
|
128
|
+
fields.push(`👥 **Team:** ${this.refLink(team)}`);
|
|
129
|
+
if (businessModel)
|
|
130
|
+
fields.push(`💼 **Business Model:** ${this.refLink(businessModel)}`);
|
|
131
|
+
if (evolution)
|
|
132
|
+
fields.push(`🔄 **Evolution:** ${this.refLink(evolution)}`);
|
|
133
|
+
if (relationships.length) {
|
|
134
|
+
const relationshipLines = relationships.map(rel => `- ${this.refLink(rel.left?.link)} ${rel.arrow} ${this.refLink(rel.right?.link)}${rel.type ? ` \`${rel.type}\`` : ''}`);
|
|
135
|
+
fields.push(`**Relationships:**\n${relationshipLines.join('\n')}`);
|
|
136
|
+
}
|
|
137
|
+
if (terminology.length) {
|
|
138
|
+
const termLines = terminology.map(t => `- \`${t.name}\`: ${t.meaning ?? ''}`);
|
|
139
|
+
fields.push(`**Terminology:**\n${termLines.join('\n')}`);
|
|
140
|
+
}
|
|
141
|
+
if (decisions.length) {
|
|
142
|
+
const decisionLines = decisions.map(d => `- \`${d.name}\`: ${d.value ?? ''}`);
|
|
143
|
+
fields.push(`**Decisions:**\n${decisionLines.join('\n')}`);
|
|
144
|
+
}
|
|
145
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
146
|
+
`📕 **\`(boundedcontext)\` ${node.name}**\n\n` +
|
|
147
|
+
fields.join('\n\n');
|
|
148
|
+
}
|
|
149
|
+
if (ast.isNamespaceDeclaration && ast.isNamespaceDeclaration(node)) {
|
|
150
|
+
const fields = [`Contains ${node.children.length} elements.`];
|
|
151
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
152
|
+
`🧭 **\`(namespace)\` ${node.name}**\n\n` +
|
|
153
|
+
fields.join('\n\n');
|
|
154
|
+
}
|
|
155
|
+
if (ast.isContextMap && ast.isContextMap(node)) {
|
|
156
|
+
const fields = [];
|
|
157
|
+
if (node.boundedContexts.length) {
|
|
158
|
+
fields.push('---');
|
|
159
|
+
fields.push(`**📕 Bounded Contexts**\n${node.boundedContexts.flatMap(bc => bc.items.map(item => `- ${this.refLink(item.ref)}`)).join('\n')}`);
|
|
160
|
+
}
|
|
161
|
+
if (node.relationships.length) {
|
|
162
|
+
fields.push('---');
|
|
163
|
+
fields.push(`**🔗 Relationships**\n${node.relationships.map(r => `- ${this.refLink(r.left?.link)} ${r.arrow} ${this.refLink(r.right?.link)}${r.type ? ` \`${r.type}\`` : ''}`).join('\n')}`);
|
|
164
|
+
}
|
|
165
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
166
|
+
`🗺️ **\`(contextmap)\` ${node.name}**\n\n` +
|
|
167
|
+
fields.join('\n\n');
|
|
168
|
+
}
|
|
169
|
+
if (ast.isDomainMap && ast.isDomainMap(node)) {
|
|
170
|
+
const fields = [];
|
|
171
|
+
if (node.domains.length) {
|
|
172
|
+
fields.push('---');
|
|
173
|
+
fields.push(`**📁 Domains**\n${node.domains.flatMap(d => d.items.map(item => `- ${this.refLink(item.ref)}`)).join('\n')}`);
|
|
174
|
+
}
|
|
175
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
176
|
+
`🗺️ **\`(domainmap)\` ${node.name}**\n\n` +
|
|
177
|
+
fields.join('\n\n');
|
|
178
|
+
}
|
|
179
|
+
if (ast.isDecision && ast.isDecision(node)) {
|
|
180
|
+
const fields = [];
|
|
181
|
+
if (node.value) {
|
|
182
|
+
fields.push('---');
|
|
183
|
+
fields.push(`*Definition:* ${node.value}`);
|
|
184
|
+
}
|
|
185
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
186
|
+
`⚖️ **\`(decision)\` ${node.name}**\n\n` +
|
|
187
|
+
fields.join('\n\n');
|
|
188
|
+
}
|
|
189
|
+
if (ast.isPolicy && ast.isPolicy(node)) {
|
|
190
|
+
const fields = [];
|
|
191
|
+
if (node.value) {
|
|
192
|
+
fields.push('---');
|
|
193
|
+
fields.push(`*Definition:* ${node.value}`);
|
|
194
|
+
}
|
|
195
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
196
|
+
`📜 **\`(policy)\` ${node.name}**\n\n` +
|
|
197
|
+
fields.join('\n\n');
|
|
198
|
+
}
|
|
199
|
+
if (ast.isBusinessRule && ast.isBusinessRule(node)) {
|
|
200
|
+
const fields = [];
|
|
201
|
+
if (node.value) {
|
|
202
|
+
fields.push('---');
|
|
203
|
+
fields.push(`*Definition:* ${node.value}`);
|
|
204
|
+
}
|
|
205
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
206
|
+
`⚖️ **\`(rule)\` ${node.name}**\n\n` +
|
|
207
|
+
fields.join('\n\n');
|
|
208
|
+
}
|
|
209
|
+
if (ast.isDomainTerm && ast.isDomainTerm(node)) {
|
|
210
|
+
const fields = [];
|
|
211
|
+
if (node.meaning) {
|
|
212
|
+
fields.push('---');
|
|
213
|
+
fields.push(`*${node.meaning}*`);
|
|
214
|
+
}
|
|
215
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
216
|
+
`🗝️ **\`(term)\` ${node.name}**\n\n` +
|
|
217
|
+
fields.join('\n\n');
|
|
218
|
+
}
|
|
219
|
+
if (ast.isTeam && ast.isTeam(node)) {
|
|
220
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
221
|
+
`👥 **\`(team)\` ${node.name}**`;
|
|
222
|
+
}
|
|
223
|
+
if (ast.isClassification && ast.isClassification(node)) {
|
|
224
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
225
|
+
`🏷️ **\`(classification)\` ${node.name}**`;
|
|
226
|
+
}
|
|
227
|
+
if (ast.isMetadata && ast.isMetadata(node)) {
|
|
228
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
229
|
+
`🔖 **\`(metadata)\` ${node.name}**`;
|
|
230
|
+
}
|
|
231
|
+
if (ast.isRelationship && ast.isRelationship(node)) {
|
|
232
|
+
const leftPatterns = node.leftPatterns.join(', ');
|
|
233
|
+
const rightPatterns = node.rightPatterns.join(', ');
|
|
234
|
+
const fields = [];
|
|
235
|
+
fields.push(`${this.refLink(node.left.link)} ${node.arrow} ${this.refLink(node.right.link)}`);
|
|
236
|
+
if (node.type)
|
|
237
|
+
fields.push(`**Type:** \`${node.type}\``);
|
|
238
|
+
if (leftPatterns)
|
|
239
|
+
fields.push(`**Left patterns:** ${leftPatterns}`);
|
|
240
|
+
if (rightPatterns)
|
|
241
|
+
fields.push(`**Right patterns:** ${rightPatterns}`);
|
|
242
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
243
|
+
`🔗 **\`(relationship)\`**\n\n` +
|
|
244
|
+
fields.join('\n\n');
|
|
245
|
+
}
|
|
246
|
+
if (ast.isImportStatement && ast.isImportStatement(node)) {
|
|
247
|
+
const fields = [];
|
|
248
|
+
fields.push(`**URI:** \`${node.uri}\``);
|
|
249
|
+
if (node.symbols.length)
|
|
250
|
+
fields.push(`**Imports:** ${node.symbols.map(s => `\`${s}\``).join(', ')}`);
|
|
251
|
+
if (node.alias)
|
|
252
|
+
fields.push(`**Alias:** \`${node.alias}\``);
|
|
253
|
+
if (node.integrity)
|
|
254
|
+
fields.push(`**Integrity:** \`${node.integrity}\``);
|
|
255
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
256
|
+
`📦 **\`(import)\`**\n\n` +
|
|
257
|
+
fields.join('\n\n');
|
|
258
|
+
}
|
|
259
|
+
const title = ast.isType(node) ? node.name : node.$type.toLowerCase();
|
|
260
|
+
return (commentBlock ? `${commentBlock}\n\n---\n\n` : '') +
|
|
261
|
+
`ℹ️ **\`(${node.$type.toLowerCase()})\`${ast.isType(node) ? ` ${title}` : ''}**`;
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
console.error('Error in getAstNodeHoverContent:', error);
|
|
265
|
+
return 'Unable to display complete information.';
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
getRefName(ref) {
|
|
269
|
+
const node = isReference(ref) ? ref.ref : ref;
|
|
270
|
+
if (node && ast.isType(node)) {
|
|
271
|
+
return node.name;
|
|
272
|
+
}
|
|
273
|
+
return '';
|
|
274
|
+
}
|
|
275
|
+
refLink(ref, label) {
|
|
276
|
+
if (label) {
|
|
277
|
+
return `[${label}](#${encodeURIComponent(label)})`;
|
|
278
|
+
}
|
|
279
|
+
const node = isReference(ref) ? ref.ref : ref;
|
|
280
|
+
if (node && ast.isType(node)) {
|
|
281
|
+
let linkLabel = node.name;
|
|
282
|
+
try {
|
|
283
|
+
linkLabel = this.qualifiedNameProvider.getQualifiedName(node.$container, node.name);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// fallback to name
|
|
287
|
+
}
|
|
288
|
+
return `[${linkLabel}](#${encodeURIComponent(linkLabel)})`;
|
|
289
|
+
}
|
|
290
|
+
return '';
|
|
291
|
+
}
|
|
292
|
+
getKeywordHoverContent(node) {
|
|
293
|
+
let comment = isAstNodeWithComment(node) ? node.$comment : undefined;
|
|
294
|
+
if (!comment) {
|
|
295
|
+
comment = CstUtils.findCommentNode(node.$cstNode, ['ML_COMMENT'])?.text;
|
|
296
|
+
}
|
|
297
|
+
if (comment && isJSDoc(comment)) {
|
|
298
|
+
const markdown = parseJSDoc(comment).toMarkdown();
|
|
299
|
+
if (markdown) {
|
|
300
|
+
return { contents: { kind: 'markdown', value: markdown } };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=domain-lang-hover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-lang-hover.js","sourceRoot":"","sources":["../../../src/lsp/hover/domain-lang-hover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyword explanations for DomainLang hover documentation.
|
|
3
|
+
*
|
|
4
|
+
* This dictionary provides fallback hover content for keywords that don't have
|
|
5
|
+
* JSDoc comments in the grammar file, or for providing richer DDD pattern explanations.
|
|
6
|
+
*
|
|
7
|
+
* Basic keyword documentation (domain, boundedcontext, etc.) is now in the grammar file
|
|
8
|
+
* as JSDoc comments. This dictionary focuses on DDD integration patterns and advanced concepts.
|
|
9
|
+
*
|
|
10
|
+
* @see src/language/domain-lang.langium for basic keyword JSDoc
|
|
11
|
+
* @see ddd-pattern-explanations.ts for role patterns and relationship types
|
|
12
|
+
*/
|
|
13
|
+
export declare const keywordExplanations: Record<string, string>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyword explanations for DomainLang hover documentation.
|
|
3
|
+
*
|
|
4
|
+
* This dictionary provides fallback hover content for keywords that don't have
|
|
5
|
+
* JSDoc comments in the grammar file, or for providing richer DDD pattern explanations.
|
|
6
|
+
*
|
|
7
|
+
* Basic keyword documentation (domain, boundedcontext, etc.) is now in the grammar file
|
|
8
|
+
* as JSDoc comments. This dictionary focuses on DDD integration patterns and advanced concepts.
|
|
9
|
+
*
|
|
10
|
+
* @see src/language/domain-lang.langium for basic keyword JSDoc
|
|
11
|
+
* @see ddd-pattern-explanations.ts for role patterns and relationship types
|
|
12
|
+
*/
|
|
13
|
+
export const keywordExplanations = {
|
|
14
|
+
// Advanced syntax keywords
|
|
15
|
+
implements: "**implements** - Declares that a Bounded Context or type implements a Domain or interface.",
|
|
16
|
+
as: "**as** - Used for aliasing or renaming imports or types.",
|
|
17
|
+
from: "**from** - Specifies the source module or file for an import statement.",
|
|
18
|
+
type: "**type** - Declares a new type or alias in the model.",
|
|
19
|
+
map: "**map** - Defines a mapping or transformation between elements.",
|
|
20
|
+
this: "**this** - Refers to the current context or object.",
|
|
21
|
+
// DDD Classifiers
|
|
22
|
+
entity: "**Entity** - Domain object with distinct identity that runs through time.",
|
|
23
|
+
valueobject: "**Value Object** - Immutable object that describes a characteristic.",
|
|
24
|
+
aggregate: "**Aggregate** - Cluster of domain objects with a root and boundary.",
|
|
25
|
+
service: "**Service** - Stateless domain operation.",
|
|
26
|
+
event: "**Event** - Significant domain occurrence or state change.",
|
|
27
|
+
businessrule: "**Business Rule** - Rule that constrains business behavior.",
|
|
28
|
+
// DDD Integration Patterns
|
|
29
|
+
acl: "**ACL (Anti-Corruption Layer)** - Translation layer protecting downstream context from upstream changes.",
|
|
30
|
+
ohs: "**OHS (Open Host Service)** - Well-defined protocol providing access to a subsystem.",
|
|
31
|
+
pl: "**PL (Published Language)** - Documented shared language for context communication.",
|
|
32
|
+
cf: "**CF (Conformist)** - Downstream adopts upstream model without translation.",
|
|
33
|
+
bbom: "**BBoM (Big Ball of Mud)** - System with tangled architecture and no clear boundaries.",
|
|
34
|
+
sk: "**SK (Shared Kernel)** - Shared domain model subset requiring coordination.",
|
|
35
|
+
p: "**P (Partnership)** - Teams collaborate closely with shared success/failure.",
|
|
36
|
+
// DDD Relationship Types
|
|
37
|
+
separateways: "**Separate Ways** - No connection between contexts, each solves problems independently.",
|
|
38
|
+
partnership: "**Partnership** - Teams share risks and rewards with close collaboration.",
|
|
39
|
+
sharedkernel: "**Shared Kernel** - Shared domain model subset requiring coordination.",
|
|
40
|
+
customersupplier: "**Customer-Supplier** - Upstream prioritizes downstream needs.",
|
|
41
|
+
upstreamdownstream: "**Upstream-Downstream** - Upstream changes affect downstream.",
|
|
42
|
+
// Relationship arrows
|
|
43
|
+
'<->': "**Bidirectional** - Two contexts connected in both directions.",
|
|
44
|
+
'->': "**Upstream → Downstream** - Left depends on right.",
|
|
45
|
+
'<-': "**Downstream ← Upstream** - Right depends on left.",
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=domain-lang-keywords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain-lang-keywords.js","sourceRoot":"","sources":["../../../src/lsp/hover/domain-lang-keywords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACvD,2BAA2B;IAC3B,UAAU,EAAE,4FAA4F;IACxG,EAAE,EAAE,0DAA0D;IAC9D,IAAI,EAAE,yEAAyE;IAC/E,IAAI,EAAE,uDAAuD;IAC7D,GAAG,EAAE,iEAAiE;IACtE,IAAI,EAAE,qDAAqD;IAE3D,kBAAkB;IAClB,MAAM,EAAE,2EAA2E;IACnF,WAAW,EAAE,sEAAsE;IACnF,SAAS,EAAE,qEAAqE;IAChF,OAAO,EAAE,2CAA2C;IACpD,KAAK,EAAE,4DAA4D;IACnE,YAAY,EAAE,6DAA6D;IAE3E,2BAA2B;IAC3B,GAAG,EAAE,0GAA0G;IAC/G,GAAG,EAAE,sFAAsF;IAC3F,EAAE,EAAE,qFAAqF;IACzF,EAAE,EAAE,6EAA6E;IACjF,IAAI,EAAE,wFAAwF;IAC9F,EAAE,EAAE,6EAA6E;IACjF,CAAC,EAAE,8EAA8E;IAEjF,yBAAyB;IACzB,YAAY,EAAE,yFAAyF;IACvG,WAAW,EAAE,2EAA2E;IACxF,YAAY,EAAE,wEAAwE;IACtF,gBAAgB,EAAE,gEAAgE;IAClF,kBAAkB,EAAE,+DAA+D;IAEnF,sBAAsB;IACtB,KAAK,EAAE,gEAAgE;IACvE,IAAI,EAAE,oDAAoD;IAC1D,IAAI,EAAE,oDAAoD;CAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EmptyFileSystem } from 'langium';
|
|
2
|
+
import { startLanguageServer } from 'langium/lsp';
|
|
3
|
+
import { BrowserMessageReader, BrowserMessageWriter, createConnection } from 'vscode-languageserver/browser.js';
|
|
4
|
+
import { createDomainLangServices } from './domain-lang-module.js';
|
|
5
|
+
// declare const self: DedicatedWorkerGlobalScope;
|
|
6
|
+
const messageReader = new BrowserMessageReader(self);
|
|
7
|
+
const messageWriter = new BrowserMessageWriter(self);
|
|
8
|
+
const connection = createConnection(messageReader, messageWriter);
|
|
9
|
+
const { shared } = createDomainLangServices({ connection, ...EmptyFileSystem });
|
|
10
|
+
startLanguageServer(shared);
|
|
11
|
+
//# sourceMappingURL=main-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-browser.js","sourceRoot":"","sources":["../src/main-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAChH,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,kDAAkD;AAElD,MAAM,aAAa,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACrD,MAAM,aAAa,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAElE,MAAM,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAAC,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;AAEhF,mBAAmB,CAAC,MAAM,CAAC,CAAC"}
|
package/out/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/out/main.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { startLanguageServer } from 'langium/lsp';
|
|
2
|
+
import { NodeFileSystem } from 'langium/node';
|
|
3
|
+
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js';
|
|
4
|
+
import { createDomainLangServices } from './domain-lang-module.js';
|
|
5
|
+
import { ensureImportGraphFromEntryFile } from './utils/import-utils.js';
|
|
6
|
+
import { URI } from 'langium';
|
|
7
|
+
// Create a connection to the client
|
|
8
|
+
const connection = createConnection(ProposedFeatures.all);
|
|
9
|
+
// Inject the shared services and language-specific services
|
|
10
|
+
const { shared, DomainLang } = createDomainLangServices({ connection, ...NodeFileSystem });
|
|
11
|
+
// Initialize workspace on connection
|
|
12
|
+
connection.onInitialize(async (params) => {
|
|
13
|
+
const workspaceRoot = params.rootUri ? URI.parse(params.rootUri).fsPath : undefined;
|
|
14
|
+
if (workspaceRoot) {
|
|
15
|
+
try {
|
|
16
|
+
// Initialize workspace manager
|
|
17
|
+
const workspaceManager = DomainLang.imports.WorkspaceManager;
|
|
18
|
+
await workspaceManager.initialize(workspaceRoot);
|
|
19
|
+
console.warn(`DomainLang workspace initialized: ${workspaceRoot}`);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
23
|
+
console.warn(`Failed to initialize workspace: ${message}`);
|
|
24
|
+
// Continue without workspace - local imports will still work
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
capabilities: {
|
|
29
|
+
// Language server capabilities are configured by Langium
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
// Optionally start from a single entry file and follow imports.
|
|
34
|
+
// Configure via env DOMAINLANG_ENTRY (absolute or workspace-relative path)
|
|
35
|
+
const entryFile = process.env.DOMAINLANG_ENTRY;
|
|
36
|
+
if (entryFile) {
|
|
37
|
+
let currentGraph = new Set();
|
|
38
|
+
/**
|
|
39
|
+
* Reloads the import graph from the entry file.
|
|
40
|
+
* Handles errors gracefully and notifies the LSP client.
|
|
41
|
+
*/
|
|
42
|
+
const reloadFromEntry = async () => {
|
|
43
|
+
try {
|
|
44
|
+
currentGraph = await ensureImportGraphFromEntryFile(entryFile, shared.workspace.LangiumDocuments);
|
|
45
|
+
console.warn(`Successfully loaded import graph from ${entryFile}`);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
49
|
+
console.error(`Failed to preload import graph from ${entryFile}: ${message}`);
|
|
50
|
+
// Notify LSP client of the error
|
|
51
|
+
connection.console.error(`DomainLang: Could not load entry file ${entryFile}. Error: ${message}`);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
// Initial load from entry file, then start the server
|
|
55
|
+
reloadFromEntry().finally(() => startLanguageServer(shared));
|
|
56
|
+
// Any change within the loaded graph should trigger a reload from the entry
|
|
57
|
+
shared.workspace.TextDocuments.onDidChangeContent(async (event) => {
|
|
58
|
+
const changed = event.document.uri;
|
|
59
|
+
if (currentGraph.has(changed)) {
|
|
60
|
+
await reloadFromEntry();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// If the entry file itself is opened/changed, also reload
|
|
64
|
+
shared.workspace.TextDocuments.onDidOpen(async (event) => {
|
|
65
|
+
if (URI.parse(event.document.uri).fsPath === URI.file(entryFile).fsPath) {
|
|
66
|
+
await reloadFromEntry();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// No entry file configured: start normally
|
|
72
|
+
startLanguageServer(shared);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=main.js.map
|
package/out/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK AST Augmentation - Module augmentation for native SDK properties.
|
|
3
|
+
*
|
|
4
|
+
* This file uses TypeScript's declaration merging to add computed helpers
|
|
5
|
+
* directly to the AST types. After importing this module, BoundedContext,
|
|
6
|
+
* Domain, and Relationship instances expose convenience getters.
|
|
7
|
+
*
|
|
8
|
+
* **Only properties that add value beyond direct AST access are augmented:**
|
|
9
|
+
* - Precedence resolution: `effectiveClassification`, `effectiveTeam` (for array-based properties)
|
|
10
|
+
* - Data transformation: `metadataMap` (array to Map)
|
|
11
|
+
* - Computed values: `fqn` (fully qualified name)
|
|
12
|
+
* - Helper methods: `hasClassification()`, `hasTeam()`, `hasMetadata()`, `hasType()`
|
|
13
|
+
*
|
|
14
|
+
* **Direct AST access (no augmentation needed):**
|
|
15
|
+
* - `bc.description` - Direct string property
|
|
16
|
+
* - `bc.businessModel?.ref` - Direct reference
|
|
17
|
+
* - `bc.evolution?.ref` - Direct reference
|
|
18
|
+
* - `bc.archetype?.ref` - Direct reference
|
|
19
|
+
* - `domain.description` - Direct string property
|
|
20
|
+
* - `domain.vision` - Direct string property
|
|
21
|
+
* - `domain.type?.ref` - Direct reference
|
|
22
|
+
*
|
|
23
|
+
* **Usage:**
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import '../sdk/ast-augmentation.js'; // Enable augmented properties
|
|
26
|
+
* import { fromDocument } from '../sdk/index.js';
|
|
27
|
+
*
|
|
28
|
+
* fromDocument(document); // Ensures augmentation
|
|
29
|
+
* const bc: BoundedContext = ...;
|
|
30
|
+
* console.log(bc.effectiveClassification?.name);
|
|
31
|
+
* console.log(bc.metadataMap.get('Language'));
|
|
32
|
+
* // Direct access for simple properties:
|
|
33
|
+
* console.log(bc.businessModel?.ref?.name);
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* **Properties added to BoundedContext:**
|
|
37
|
+
* - `effectiveClassification` - Inline `as` header → body `classification:`
|
|
38
|
+
* - `effectiveTeam` - Inline `team` header → body `team:`
|
|
39
|
+
* - `metadataMap` - Metadata entries exposed as a ReadonlyMap
|
|
40
|
+
* - `fqn` - Computed fully qualified name
|
|
41
|
+
* - `hasClassification(name)` - Check if classification matches
|
|
42
|
+
* - `hasTeam(name)` - Check if team matches
|
|
43
|
+
* - `hasMetadata(key, value?)` - Check metadata
|
|
44
|
+
*
|
|
45
|
+
* **Properties added to Domain:**
|
|
46
|
+
* - `fqn` - Computed fully qualified name
|
|
47
|
+
* - `hasType(name)` - Check type matches
|
|
48
|
+
*
|
|
49
|
+
* **Properties added to Relationship:**
|
|
50
|
+
* - `hasPattern(pattern)` - Check if pattern exists on either side
|
|
51
|
+
* - `hasLeftPattern(pattern)` - Check left patterns
|
|
52
|
+
* - `hasRightPattern(pattern)` - Check right patterns
|
|
53
|
+
* - `isUpstream(side)` - Check if side is upstream
|
|
54
|
+
* - `isDownstream(side)` - Check if side is downstream
|
|
55
|
+
* - `isBidirectional` - Check if relationship is bidirectional
|
|
56
|
+
* - `leftContextName` - Resolved name of left context
|
|
57
|
+
* - `rightContextName` - Resolved name of right context
|
|
58
|
+
*
|
|
59
|
+
* @module sdk/ast-augmentation
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* Module augmentation for native SDK properties on AST types.
|
|
63
|
+
*/
|
|
64
|
+
declare module '../generated/ast.js' {
|
|
65
|
+
/**
|
|
66
|
+
* Augmented BoundedContext with SDK-computed properties.
|
|
67
|
+
*
|
|
68
|
+
* Note: description, businessModel, evolution, archetype, metadata, relationships,
|
|
69
|
+
* terminology, and decisions are direct AST properties - use them directly.
|
|
70
|
+
*/
|
|
71
|
+
interface BoundedContext {
|
|
72
|
+
/** Effective classification with inline precedence (header `as` > body `classification:`) */
|
|
73
|
+
readonly effectiveClassification: import('../generated/ast.js').Classification | undefined;
|
|
74
|
+
/** Effective team with inline precedence (header `by` > body `team:`) */
|
|
75
|
+
readonly effectiveTeam: import('../generated/ast.js').Team | undefined;
|
|
76
|
+
/** Metadata entries exposed as a map for O(1) lookups */
|
|
77
|
+
readonly metadataMap: ReadonlyMap<string, string>;
|
|
78
|
+
/** SDK-computed fully qualified name */
|
|
79
|
+
readonly fqn: string;
|
|
80
|
+
/** Checks if this bounded context has the specified classification. */
|
|
81
|
+
hasClassification(name: string | import('../generated/ast.js').Classification): boolean;
|
|
82
|
+
/** Checks if this bounded context is owned by the specified team. */
|
|
83
|
+
hasTeam(name: string | import('../generated/ast.js').Team): boolean;
|
|
84
|
+
/** Checks if this bounded context has metadata with the given key (and optionally value). */
|
|
85
|
+
hasMetadata(key: string, value?: string): boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Augmented Domain with SDK-computed properties.
|
|
89
|
+
*
|
|
90
|
+
* Note: description, vision, and type are direct AST properties - use them directly.
|
|
91
|
+
*/
|
|
92
|
+
interface Domain {
|
|
93
|
+
/** SDK-computed fully qualified name */
|
|
94
|
+
readonly fqn: string;
|
|
95
|
+
/** Checks if this domain has the specified type. */
|
|
96
|
+
hasType(name: string | import('../generated/ast.js').Classification): boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Augmented Relationship with SDK helper methods.
|
|
100
|
+
*/
|
|
101
|
+
interface Relationship {
|
|
102
|
+
/** Resolved name of left context (handles 'this') */
|
|
103
|
+
readonly leftContextName: string;
|
|
104
|
+
/** Resolved name of right context (handles 'this') */
|
|
105
|
+
readonly rightContextName: string;
|
|
106
|
+
/** Whether this is a bidirectional relationship (<->) */
|
|
107
|
+
readonly isBidirectional: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Checks if the relationship has a specific integration pattern on either side.
|
|
110
|
+
* Accepts both abbreviations (SK, ACL) and full names (SharedKernel, AntiCorruptionLayer).
|
|
111
|
+
* @param pattern - Pattern abbreviation or full name
|
|
112
|
+
*/
|
|
113
|
+
hasPattern(pattern: import('./patterns.js').IntegrationPattern | string): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Checks if the left side has a specific integration pattern.
|
|
116
|
+
* @param pattern - Pattern abbreviation or full name
|
|
117
|
+
*/
|
|
118
|
+
hasLeftPattern(pattern: import('./patterns.js').IntegrationPattern | string): boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Checks if the right side has a specific integration pattern.
|
|
121
|
+
* @param pattern - Pattern abbreviation or full name
|
|
122
|
+
*/
|
|
123
|
+
hasRightPattern(pattern: import('./patterns.js').IntegrationPattern | string): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Checks if the specified side is upstream (provider) in this relationship.
|
|
126
|
+
* @param side - 'left' or 'right'
|
|
127
|
+
*/
|
|
128
|
+
isUpstream(side: 'left' | 'right'): boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Checks if the specified side is downstream (consumer) in this relationship.
|
|
131
|
+
* @param side - 'left' or 'right'
|
|
132
|
+
*/
|
|
133
|
+
isDownstream(side: 'left' | 'right'): boolean;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export {};
|