@domainlang/language 0.5.2 → 0.6.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.
- package/out/domain-lang-module.js +3 -1
- package/out/domain-lang-module.js.map +1 -1
- package/out/generated/ast.d.ts +24 -0
- package/out/generated/ast.js.map +1 -1
- package/out/generated/grammar.js +22 -32
- package/out/generated/grammar.js.map +1 -1
- package/out/index.d.ts +2 -5
- package/out/index.js +10 -6
- package/out/index.js.map +1 -1
- package/out/lsp/domain-lang-code-actions.js +14 -8
- package/out/lsp/domain-lang-code-actions.js.map +1 -1
- package/out/lsp/domain-lang-completion.d.ts +3 -0
- package/out/lsp/domain-lang-completion.js +41 -13
- package/out/lsp/domain-lang-completion.js.map +1 -1
- package/out/lsp/domain-lang-formatter.js +24 -18
- package/out/lsp/domain-lang-formatter.js.map +1 -1
- package/out/lsp/domain-lang-index-manager.d.ts +102 -0
- package/out/lsp/domain-lang-index-manager.js +221 -0
- package/out/lsp/domain-lang-index-manager.js.map +1 -0
- package/out/lsp/domain-lang-scope.js +31 -17
- package/out/lsp/domain-lang-scope.js.map +1 -1
- package/out/lsp/domain-lang-workspace-manager.d.ts +51 -9
- package/out/lsp/domain-lang-workspace-manager.js +86 -63
- package/out/lsp/domain-lang-workspace-manager.js.map +1 -1
- package/out/lsp/hover/domain-lang-hover.d.ts +45 -1
- package/out/lsp/hover/domain-lang-hover.js +308 -232
- package/out/lsp/hover/domain-lang-hover.js.map +1 -1
- package/out/lsp/hover/domain-lang-keywords.d.ts +3 -7
- package/out/lsp/hover/domain-lang-keywords.js +115 -38
- package/out/lsp/hover/domain-lang-keywords.js.map +1 -1
- package/out/lsp/manifest-diagnostics.js +95 -50
- package/out/lsp/manifest-diagnostics.js.map +1 -1
- package/out/main.js +109 -17
- package/out/main.js.map +1 -1
- package/out/services/import-resolver.d.ts +16 -2
- package/out/services/import-resolver.js +37 -11
- package/out/services/import-resolver.js.map +1 -1
- package/out/services/types.d.ts +2 -2
- package/out/services/workspace-manager.d.ts +33 -31
- package/out/services/workspace-manager.js +92 -148
- package/out/services/workspace-manager.js.map +1 -1
- package/out/utils/document-utils.d.ts +41 -0
- package/out/utils/document-utils.js +64 -0
- package/out/utils/document-utils.js.map +1 -0
- package/out/utils/import-utils.d.ts +0 -17
- package/out/utils/import-utils.js +2 -32
- package/out/utils/import-utils.js.map +1 -1
- package/out/utils/manifest-utils.d.ts +56 -0
- package/out/utils/manifest-utils.js +119 -0
- package/out/utils/manifest-utils.js.map +1 -0
- package/out/validation/import.d.ts +1 -2
- package/out/validation/import.js +33 -20
- package/out/validation/import.js.map +1 -1
- package/package.json +1 -1
- package/src/domain-lang-module.ts +4 -1
- package/src/domain-lang.langium +37 -13
- package/src/generated/ast.ts +24 -0
- package/src/generated/grammar.ts +22 -32
- package/src/index.ts +12 -6
- package/src/lsp/domain-lang-code-actions.ts +13 -8
- package/src/lsp/domain-lang-completion.ts +61 -13
- package/src/lsp/domain-lang-formatter.ts +28 -23
- package/src/lsp/domain-lang-index-manager.ts +256 -0
- package/src/lsp/domain-lang-scope.ts +29 -17
- package/src/lsp/domain-lang-workspace-manager.ts +89 -66
- package/src/lsp/hover/domain-lang-hover.ts +332 -226
- package/src/lsp/hover/domain-lang-keywords.ts +129 -43
- package/src/lsp/manifest-diagnostics.ts +100 -59
- package/src/main.ts +127 -16
- package/src/services/import-resolver.ts +39 -11
- package/src/services/types.ts +2 -2
- package/src/services/workspace-manager.ts +101 -175
- package/src/utils/document-utils.ts +80 -0
- package/src/utils/import-utils.ts +2 -40
- package/src/utils/manifest-utils.ts +132 -0
- package/src/validation/import.ts +32 -22
- package/out/lsp/hover/ddd-pattern-explanations.d.ts +0 -50
- package/out/lsp/hover/ddd-pattern-explanations.js +0 -196
- package/out/lsp/hover/ddd-pattern-explanations.js.map +0 -1
- package/out/services/dependency-analyzer.d.ts +0 -58
- package/out/services/dependency-analyzer.js +0 -254
- package/out/services/dependency-analyzer.js.map +0 -1
- package/out/services/dependency-resolver.d.ts +0 -146
- package/out/services/dependency-resolver.js +0 -452
- package/out/services/dependency-resolver.js.map +0 -1
- package/out/services/git-url-resolver.browser.d.ts +0 -10
- package/out/services/git-url-resolver.browser.js +0 -19
- package/out/services/git-url-resolver.browser.js.map +0 -1
- package/out/services/git-url-resolver.d.ts +0 -158
- package/out/services/git-url-resolver.js +0 -416
- package/out/services/git-url-resolver.js.map +0 -1
- package/out/services/governance-validator.d.ts +0 -44
- package/out/services/governance-validator.js +0 -153
- package/out/services/governance-validator.js.map +0 -1
- package/out/services/semver.d.ts +0 -98
- package/out/services/semver.js +0 -195
- package/out/services/semver.js.map +0 -1
- package/src/lsp/hover/ddd-pattern-explanations.ts +0 -237
- package/src/services/dependency-analyzer.ts +0 -321
- package/src/services/dependency-resolver.ts +0 -551
- package/src/services/git-url-resolver.browser.ts +0 -26
- package/src/services/git-url-resolver.ts +0 -517
- package/src/services/governance-validator.ts +0 -177
- package/src/services/semver.ts +0 -213
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Keyword explanations for DomainLang hover documentation.
|
|
3
3
|
*
|
|
4
|
-
* This dictionary provides
|
|
5
|
-
*
|
|
4
|
+
* This dictionary provides concise hover content for all DomainLang keywords,
|
|
5
|
+
* DDD patterns, and special symbols. Uses exact casing from grammar.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
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
|
|
7
|
+
* @see https://domainlang.net/reference/language for full documentation
|
|
12
8
|
*/
|
|
13
9
|
export declare const keywordExplanations: Record<string, string>;
|
|
@@ -1,47 +1,124 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Keyword explanations for DomainLang hover documentation.
|
|
3
3
|
*
|
|
4
|
-
* This dictionary provides
|
|
5
|
-
*
|
|
4
|
+
* This dictionary provides concise hover content for all DomainLang keywords,
|
|
5
|
+
* DDD patterns, and special symbols. Uses exact casing from grammar.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
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
|
|
7
|
+
* @see https://domainlang.net/reference/language for full documentation
|
|
12
8
|
*/
|
|
9
|
+
// Documentation links
|
|
10
|
+
const DOMAIN_LINK = '\n\n[Read more](https://domainlang.net/guide/domains)';
|
|
11
|
+
const BC_LINK = '\n\n[Read more](https://domainlang.net/guide/bounded-contexts)';
|
|
12
|
+
const TEAM_LINK = '\n\n[Read more](https://domainlang.net/guide/teams-classifications)';
|
|
13
|
+
const MAP_LINK = '\n\n[Read more](https://domainlang.net/guide/context-maps)';
|
|
14
|
+
const REL_LINK = '\n\n[Read more](https://domainlang.net/guide/context-maps#relationships)';
|
|
15
|
+
const IMPORT_LINK = '\n\n[Read more](https://domainlang.net/guide/imports)';
|
|
16
|
+
const NS_LINK = '\n\n[Read more](https://domainlang.net/guide/namespaces)';
|
|
17
|
+
const TERM_LINK = '\n\n[Read more](https://domainlang.net/reference/language#terminology)';
|
|
18
|
+
const DECISION_LINK = '\n\n[Read more](https://domainlang.net/reference/language#decisions-policies-rules)';
|
|
19
|
+
const METADATA_LINK = '\n\n[Read more](https://domainlang.net/reference/language#metadata)';
|
|
20
|
+
const SYNTAX_LINK = '\n\n[Read more](https://domainlang.net/reference/language)';
|
|
13
21
|
export const keywordExplanations = {
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
// ========================================================================
|
|
23
|
+
// Primary Constructs
|
|
24
|
+
// ========================================================================
|
|
25
|
+
domain: `**Domain** - A sphere of knowledge or activity. Can be nested to show subdomain hierarchy.${DOMAIN_LINK}`,
|
|
26
|
+
dom: `**Domain** - A sphere of knowledge or activity. Can be nested to show subdomain hierarchy.${DOMAIN_LINK}`,
|
|
27
|
+
boundedcontext: `**BoundedContext** - A boundary where a domain model is defined. Central DDD pattern for managing complexity.${BC_LINK}`,
|
|
28
|
+
bc: `**BoundedContext** - A boundary where a domain model is defined. Central DDD pattern for managing complexity.${BC_LINK}`,
|
|
29
|
+
team: `**Team** - A group responsible for one or more bounded contexts.${TEAM_LINK}`,
|
|
30
|
+
classification: `**Classification** - Reusable label for categorizing elements (e.g., Core, Supporting, Generic).${TEAM_LINK}`,
|
|
31
|
+
metadata: `**Metadata** - Defines a key that can be used in metadata blocks.${METADATA_LINK}`,
|
|
32
|
+
meta: `**Metadata** - Defines a key that can be used in metadata blocks.${METADATA_LINK}`,
|
|
33
|
+
// ========================================================================
|
|
34
|
+
// Maps
|
|
35
|
+
// ========================================================================
|
|
36
|
+
contextmap: `**ContextMap** - Shows relationships between bounded contexts.${MAP_LINK}`,
|
|
37
|
+
cmap: `**ContextMap** - Shows relationships between bounded contexts.${MAP_LINK}`,
|
|
38
|
+
domainmap: `**DomainMap** - Visualizes domains and their subdomain structure.${MAP_LINK}`,
|
|
39
|
+
dmap: `**DomainMap** - Visualizes domains and their subdomain structure.${MAP_LINK}`,
|
|
40
|
+
contains: `**contains** - Specifies which elements are part of a map.${MAP_LINK}`,
|
|
41
|
+
// ========================================================================
|
|
42
|
+
// Bounded Context & Domain Properties
|
|
43
|
+
// ========================================================================
|
|
44
|
+
for: `**for** - Associates a bounded context with its parent domain.${BC_LINK}`,
|
|
45
|
+
as: `**as** - Assigns a classification to an element.${BC_LINK}`,
|
|
46
|
+
by: `**by** - Assigns a team responsible for an element.${BC_LINK}`,
|
|
47
|
+
in: `**in** - Specifies parent domain for subdomain nesting.${DOMAIN_LINK}`,
|
|
48
|
+
description: `**description** - Human-readable explanation of the element's purpose.${SYNTAX_LINK}`,
|
|
49
|
+
vision: `**vision** - Strategic vision statement for a domain.${DOMAIN_LINK}`,
|
|
50
|
+
type: `**type** - Assigns a classification type to a domain or relationship.${DOMAIN_LINK}`,
|
|
51
|
+
businessmodel: `**businessModel** - Revenue or engagement model for a context.${BC_LINK}`,
|
|
52
|
+
evolution: `**evolution** - Maturity stage (Genesis, Custom, Product, Commodity).${BC_LINK}`,
|
|
53
|
+
archetype: `**archetype** - Behavioral role (Gateway, Execution, etc.).${BC_LINK}`,
|
|
54
|
+
relationships: `**relationships** - Block defining integration patterns with other contexts.${REL_LINK}`,
|
|
55
|
+
integrations: `**integrations** - Block defining integration patterns with other contexts.${REL_LINK}`,
|
|
56
|
+
// ========================================================================
|
|
57
|
+
// Terminology & Glossary
|
|
58
|
+
// ========================================================================
|
|
59
|
+
terminology: `**terminology** - Block defining domain-specific terms and definitions.${TERM_LINK}`,
|
|
60
|
+
glossary: `**glossary** - Block defining domain-specific terms and definitions.${TERM_LINK}`,
|
|
61
|
+
term: `**Term** - Defines a domain term with its meaning.${TERM_LINK}`,
|
|
62
|
+
aka: `**aka** - Alternative names (also known as) for a term.${TERM_LINK}`,
|
|
63
|
+
synonyms: `**synonyms** - Alternative names (also known as) for a term.${TERM_LINK}`,
|
|
64
|
+
examples: `**examples** - Example usage of a term.${TERM_LINK}`,
|
|
65
|
+
meaning: `**meaning** - The definition or explanation of a term.${TERM_LINK}`,
|
|
66
|
+
// ========================================================================
|
|
67
|
+
// Decisions, Policies & Rules
|
|
68
|
+
// ========================================================================
|
|
69
|
+
decisions: `**decisions** - Block containing architectural decisions or business rules.${DECISION_LINK}`,
|
|
70
|
+
rules: `**rules** - Block containing architectural decisions or business rules.${DECISION_LINK}`,
|
|
71
|
+
decision: `**Decision** - An architectural or domain decision.${DECISION_LINK}`,
|
|
72
|
+
policy: `**Policy** - A business policy or organizational rule.${DECISION_LINK}`,
|
|
73
|
+
rule: `**Rule** - A business rule or constraint (also BusinessRule).${DECISION_LINK}`,
|
|
74
|
+
// ========================================================================
|
|
75
|
+
// Import System
|
|
76
|
+
// ========================================================================
|
|
77
|
+
import: `**Import** - Imports definitions from an external model or file.${IMPORT_LINK}`,
|
|
78
|
+
// ========================================================================
|
|
79
|
+
// Namespaces
|
|
80
|
+
// ========================================================================
|
|
81
|
+
namespace: `**Namespace** - Groups elements under a qualified name.${NS_LINK}`,
|
|
82
|
+
ns: `**Namespace** - Groups elements under a qualified name.${NS_LINK}`,
|
|
83
|
+
// ========================================================================
|
|
84
|
+
// Assignment Operators
|
|
85
|
+
// ========================================================================
|
|
86
|
+
':': `**:** - Assignment operator (property: value).${SYNTAX_LINK}`,
|
|
87
|
+
is: `**is** - Assignment operator (property is value).${SYNTAX_LINK}`,
|
|
88
|
+
'=': `**=** - Assignment operator (property = value).${SYNTAX_LINK}`,
|
|
89
|
+
// ========================================================================
|
|
90
|
+
// Context Reference
|
|
91
|
+
// ========================================================================
|
|
92
|
+
this: `**this** - References the current bounded context in relationships.${REL_LINK}`,
|
|
93
|
+
// ========================================================================
|
|
28
94
|
// DDD Integration Patterns
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
95
|
+
// ========================================================================
|
|
96
|
+
acl: `**ACL** - Anti-Corruption Layer. Protects from external models by translating between domains.${REL_LINK}`,
|
|
97
|
+
anticorruptionlayer: `**AntiCorruptionLayer** - Protects from external models by translating between domains.${REL_LINK}`,
|
|
98
|
+
ohs: `**OHS** - Open Host Service. Provides a well-documented API for integration.${REL_LINK}`,
|
|
99
|
+
openhostservice: `**OpenHostService** - Provides a well-documented API for integration.${REL_LINK}`,
|
|
100
|
+
pl: `**PL** - Published Language. Documented language for inter-context communication.${REL_LINK}`,
|
|
101
|
+
publishedlanguage: `**PublishedLanguage** - Documented language for inter-context communication.${REL_LINK}`,
|
|
102
|
+
cf: `**CF** - Conformist. Adopts upstream model without translation.${REL_LINK}`,
|
|
103
|
+
conformist: `**Conformist** - Adopts upstream model without translation.${REL_LINK}`,
|
|
104
|
+
p: `**P** - Partnership. Two teams with mutual dependency and shared goals.${REL_LINK}`,
|
|
105
|
+
partnership: `**Partnership** - Two teams with mutual dependency and shared goals.${REL_LINK}`,
|
|
106
|
+
sk: `**SK** - Shared Kernel. Shared code/data requiring careful coordination.${REL_LINK}`,
|
|
107
|
+
sharedkernel: `**SharedKernel** - Shared code/data requiring careful coordination.${REL_LINK}`,
|
|
108
|
+
bbom: `**BBoM** - Big Ball of Mud. Legacy area without clear boundaries.${REL_LINK}`,
|
|
109
|
+
bigballofmud: `**BigBallOfMud** - Legacy area without clear boundaries.${REL_LINK}`,
|
|
110
|
+
// ========================================================================
|
|
111
|
+
// Relationship Types
|
|
112
|
+
// ========================================================================
|
|
113
|
+
customersupplier: `**CustomerSupplier** - Downstream depends on upstream with influence over priorities.${REL_LINK}`,
|
|
114
|
+
upstreamdownstream: `**UpstreamDownstream** - One context depends on another's model.${REL_LINK}`,
|
|
115
|
+
separateways: `**SeparateWays** - Contexts with no integration, solving problems independently.${REL_LINK}`,
|
|
116
|
+
// ========================================================================
|
|
117
|
+
// Relationship Arrows
|
|
118
|
+
// ========================================================================
|
|
119
|
+
'->': `**->** - Unidirectional dependency (upstream to downstream).${REL_LINK}`,
|
|
120
|
+
'<->': `**<->** - Bidirectional dependency (mutual).${REL_LINK}`,
|
|
121
|
+
'<-': `**<-** - Reverse unidirectional dependency (downstream to upstream).${REL_LINK}`,
|
|
122
|
+
'><': `**><** - Separate Ways (no integration).${REL_LINK}`,
|
|
46
123
|
};
|
|
47
124
|
//# sourceMappingURL=domain-lang-keywords.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain-lang-keywords.js","sourceRoot":"","sources":["../../../src/lsp/hover/domain-lang-keywords.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"domain-lang-keywords.js","sourceRoot":"","sources":["../../../src/lsp/hover/domain-lang-keywords.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,14 +36,31 @@ export class ManifestDiagnosticsService {
|
|
|
36
36
|
* @param options - Validation options
|
|
37
37
|
*/
|
|
38
38
|
async validateAndSendDiagnostics(manifestUri, content, options) {
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
try {
|
|
40
|
+
if (!this.connection) {
|
|
41
|
+
return; // No connection, skip diagnostics
|
|
42
|
+
}
|
|
43
|
+
const diagnostics = this.validate(content, options);
|
|
44
|
+
await this.connection.sendDiagnostics({
|
|
45
|
+
uri: manifestUri,
|
|
46
|
+
diagnostics
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Error in validateAndSendDiagnostics:', error);
|
|
51
|
+
// Send minimal error diagnostic instead of crashing
|
|
52
|
+
if (this.connection) {
|
|
53
|
+
await this.connection.sendDiagnostics({
|
|
54
|
+
uri: manifestUri,
|
|
55
|
+
diagnostics: [{
|
|
56
|
+
severity: DiagnosticSeverity.Error,
|
|
57
|
+
range: Range.create(Position.create(0, 0), Position.create(0, 1)),
|
|
58
|
+
message: 'Internal error validating manifest file',
|
|
59
|
+
source: 'domainlang'
|
|
60
|
+
}]
|
|
61
|
+
});
|
|
62
|
+
}
|
|
41
63
|
}
|
|
42
|
-
const diagnostics = this.validate(content, options);
|
|
43
|
-
await this.connection.sendDiagnostics({
|
|
44
|
-
uri: manifestUri,
|
|
45
|
-
diagnostics
|
|
46
|
-
});
|
|
47
64
|
}
|
|
48
65
|
/**
|
|
49
66
|
* Validates manifest content and returns LSP diagnostics.
|
|
@@ -53,36 +70,48 @@ export class ManifestDiagnosticsService {
|
|
|
53
70
|
* @returns Array of LSP diagnostics
|
|
54
71
|
*/
|
|
55
72
|
validate(content, options) {
|
|
56
|
-
// Parse YAML to get both the manifest object and source map
|
|
57
|
-
let yamlDoc;
|
|
58
|
-
let manifest;
|
|
59
73
|
try {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
74
|
+
// Parse YAML to get both the manifest object and source map
|
|
75
|
+
let yamlDoc;
|
|
76
|
+
let manifest;
|
|
77
|
+
try {
|
|
78
|
+
yamlDoc = YAML.parseDocument(content);
|
|
79
|
+
// Check for YAML parse errors (they're in the errors array, not thrown)
|
|
80
|
+
if (yamlDoc.errors && yamlDoc.errors.length > 0) {
|
|
81
|
+
return yamlDoc.errors.map(err => ({
|
|
82
|
+
severity: DiagnosticSeverity.Error,
|
|
83
|
+
range: this.yamlErrorToRange(err, content),
|
|
84
|
+
message: `YAML parse error: ${err.message}`,
|
|
85
|
+
source: 'domainlang'
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
manifest = (yamlDoc.toJSON() ?? {});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Fallback for unexpected errors
|
|
92
|
+
const message = error instanceof Error ? error.message : 'Invalid YAML syntax';
|
|
93
|
+
return [{
|
|
94
|
+
severity: DiagnosticSeverity.Error,
|
|
95
|
+
range: Range.create(Position.create(0, 0), Position.create(0, 1)),
|
|
96
|
+
message: `YAML parse error: ${message}`,
|
|
97
|
+
source: 'domainlang'
|
|
98
|
+
}];
|
|
69
99
|
}
|
|
70
|
-
|
|
100
|
+
// Run manifest validation
|
|
101
|
+
const result = this.validator.validate(manifest, options);
|
|
102
|
+
// Convert to LSP diagnostics with source locations
|
|
103
|
+
return result.diagnostics.map(diag => this.toVSCodeDiagnostic(diag, yamlDoc));
|
|
71
104
|
}
|
|
72
105
|
catch (error) {
|
|
73
|
-
|
|
74
|
-
|
|
106
|
+
console.error('Error in validate:', error);
|
|
107
|
+
// Return minimal error diagnostic
|
|
75
108
|
return [{
|
|
76
109
|
severity: DiagnosticSeverity.Error,
|
|
77
110
|
range: Range.create(Position.create(0, 0), Position.create(0, 1)),
|
|
78
|
-
message:
|
|
111
|
+
message: 'Internal error during validation',
|
|
79
112
|
source: 'domainlang'
|
|
80
113
|
}];
|
|
81
114
|
}
|
|
82
|
-
// Run manifest validation
|
|
83
|
-
const result = this.validator.validate(manifest, options);
|
|
84
|
-
// Convert to LSP diagnostics with source locations
|
|
85
|
-
return result.diagnostics.map(diag => this.toVSCodeDiagnostic(diag, yamlDoc));
|
|
86
115
|
}
|
|
87
116
|
/**
|
|
88
117
|
* Converts a YAML error to an LSP Range.
|
|
@@ -104,30 +133,49 @@ export class ManifestDiagnosticsService {
|
|
|
104
133
|
* Call this when the file is closed or deleted.
|
|
105
134
|
*/
|
|
106
135
|
async clearDiagnostics(manifestUri) {
|
|
107
|
-
|
|
108
|
-
|
|
136
|
+
try {
|
|
137
|
+
if (!this.connection) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
await this.connection.sendDiagnostics({
|
|
141
|
+
uri: manifestUri,
|
|
142
|
+
diagnostics: []
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('Error in clearDiagnostics:', error);
|
|
147
|
+
// Ignore - don't crash on cleanup
|
|
109
148
|
}
|
|
110
|
-
await this.connection.sendDiagnostics({
|
|
111
|
-
uri: manifestUri,
|
|
112
|
-
diagnostics: []
|
|
113
|
-
});
|
|
114
149
|
}
|
|
115
150
|
/**
|
|
116
151
|
* Converts a ManifestDiagnostic to an LSP Diagnostic.
|
|
117
152
|
*/
|
|
118
153
|
toVSCodeDiagnostic(diag, yamlDoc) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
154
|
+
try {
|
|
155
|
+
const range = this.findRangeForPath(diag.path, yamlDoc);
|
|
156
|
+
let message = diag.message;
|
|
157
|
+
if (diag.hint) {
|
|
158
|
+
message += `\nHint: ${diag.hint}`;
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
severity: this.toVSCodeSeverity(diag.severity),
|
|
162
|
+
range,
|
|
163
|
+
message,
|
|
164
|
+
source: 'domainlang',
|
|
165
|
+
code: diag.code
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error('Error converting diagnostic:', error);
|
|
170
|
+
// Return minimal diagnostic at file start
|
|
171
|
+
return {
|
|
172
|
+
severity: DiagnosticSeverity.Error,
|
|
173
|
+
range: Range.create(Position.create(0, 0), Position.create(0, 1)),
|
|
174
|
+
message: diag.message,
|
|
175
|
+
source: 'domainlang',
|
|
176
|
+
code: diag.code
|
|
177
|
+
};
|
|
123
178
|
}
|
|
124
|
-
return {
|
|
125
|
-
severity: this.toVSCodeSeverity(diag.severity),
|
|
126
|
-
range,
|
|
127
|
-
message,
|
|
128
|
-
source: 'domainlang',
|
|
129
|
-
code: diag.code
|
|
130
|
-
};
|
|
131
179
|
}
|
|
132
180
|
/**
|
|
133
181
|
* Converts ManifestSeverity to LSP DiagnosticSeverity.
|
|
@@ -159,13 +207,12 @@ export class ManifestDiagnosticsService {
|
|
|
159
207
|
if (!isMap(currentNode)) {
|
|
160
208
|
return fallback;
|
|
161
209
|
}
|
|
162
|
-
const
|
|
163
|
-
const item = mapNode.items.find((pair) => isPair(pair) && isScalar(pair.key) && String(pair.key.value) === part);
|
|
210
|
+
const item = currentNode.items.find((pair) => isPair(pair) && isScalar(pair.key) && String(pair.key.value) === part);
|
|
164
211
|
if (!item) {
|
|
165
212
|
return fallback;
|
|
166
213
|
}
|
|
167
214
|
// If this is the last part, return the range of the key
|
|
168
|
-
if (part === parts
|
|
215
|
+
if (part === parts.at(-1)) {
|
|
169
216
|
const keyNode = item.key;
|
|
170
217
|
if (isScalar(keyNode) && keyNode.range) {
|
|
171
218
|
const [start, end] = keyNode.range;
|
|
@@ -213,9 +260,7 @@ let manifestDiagnosticsService;
|
|
|
213
260
|
* Gets or creates the manifest diagnostics service singleton.
|
|
214
261
|
*/
|
|
215
262
|
export function getManifestDiagnosticsService() {
|
|
216
|
-
|
|
217
|
-
manifestDiagnosticsService = new ManifestDiagnosticsService();
|
|
218
|
-
}
|
|
263
|
+
manifestDiagnosticsService ?? (manifestDiagnosticsService = new ManifestDiagnosticsService());
|
|
219
264
|
return manifestDiagnosticsService;
|
|
220
265
|
}
|
|
221
266
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-diagnostics.js","sourceRoot":"","sources":["../../src/lsp/manifest-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAc,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC9F,OAAO,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"manifest-diagnostics.js","sourceRoot":"","sources":["../../src/lsp/manifest-diagnostics.ts"],"names":[],"mappings":"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"}
|
package/out/main.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { startLanguageServer } from 'langium/lsp';
|
|
2
2
|
import { NodeFileSystem } from 'langium/node';
|
|
3
|
-
import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js';
|
|
3
|
+
import { createConnection, ProposedFeatures, FileChangeType } from 'vscode-languageserver/node.js';
|
|
4
4
|
import { createDomainLangServices } from './domain-lang-module.js';
|
|
5
5
|
import { ensureImportGraphFromEntryFile } from './utils/import-utils.js';
|
|
6
6
|
import { URI } from 'langium';
|
|
@@ -8,28 +8,119 @@ import { URI } from 'langium';
|
|
|
8
8
|
const connection = createConnection(ProposedFeatures.all);
|
|
9
9
|
// Inject the shared services and language-specific services
|
|
10
10
|
const { shared, DomainLang } = createDomainLangServices({ connection, ...NodeFileSystem });
|
|
11
|
-
// Initialize workspace
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
// Initialize workspace manager when language server initializes
|
|
12
|
+
// Uses Langium's LanguageServer.onInitialize hook (not raw connection handler)
|
|
13
|
+
// This integrates properly with Langium's initialization flow
|
|
14
|
+
shared.lsp.LanguageServer.onInitialize((params) => {
|
|
15
|
+
// Use workspaceFolders (preferred) over deprecated rootUri
|
|
16
|
+
const folders = params.workspaceFolders;
|
|
17
|
+
const workspaceRoot = folders?.[0]?.uri
|
|
18
|
+
? URI.parse(folders[0].uri).fsPath
|
|
19
|
+
: undefined;
|
|
14
20
|
if (workspaceRoot) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.warn(`DomainLang workspace initialized: ${workspaceRoot}`);
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
21
|
+
// Initialize workspace manager synchronously (just sets root path)
|
|
22
|
+
// Heavy work happens in initializeWorkspace() called by Langium later
|
|
23
|
+
const workspaceManager = DomainLang.imports.WorkspaceManager;
|
|
24
|
+
workspaceManager.initialize(workspaceRoot).catch(error => {
|
|
22
25
|
const message = error instanceof Error ? error.message : String(error);
|
|
23
26
|
console.warn(`Failed to initialize workspace: ${message}`);
|
|
24
27
|
// Continue without workspace - local imports will still work
|
|
28
|
+
});
|
|
29
|
+
console.warn(`DomainLang workspace root: ${workspaceRoot}`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// Handle file changes for model.yaml and model.lock (PRS-010)
|
|
33
|
+
// Uses Langium's built-in file watcher which already watches **/* in workspace
|
|
34
|
+
// This invalidates caches when config files change externally
|
|
35
|
+
shared.lsp.DocumentUpdateHandler?.onWatchedFilesChange(async (params) => {
|
|
36
|
+
try {
|
|
37
|
+
await handleConfigFileChanges(params, DomainLang.imports.WorkspaceManager, shared);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
41
|
+
console.error(`Error handling file change notification: ${message}`);
|
|
42
|
+
// Continue - don't crash the server
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Handles changes to model.yaml and model.lock files.
|
|
47
|
+
* Invalidates caches and rebuilds workspace as needed.
|
|
48
|
+
* Uses incremental updates: only rebuilds if dependencies actually changed.
|
|
49
|
+
*/
|
|
50
|
+
async function handleConfigFileChanges(params, workspaceManager, sharedServices) {
|
|
51
|
+
let manifestChanged = false;
|
|
52
|
+
let lockFileChanged = false;
|
|
53
|
+
for (const change of params.changes) {
|
|
54
|
+
const uri = URI.parse(change.uri);
|
|
55
|
+
const fileName = uri.path.split('/').pop() ?? '';
|
|
56
|
+
if (fileName === 'model.yaml') {
|
|
57
|
+
console.warn(`model.yaml changed: ${change.uri}`);
|
|
58
|
+
workspaceManager.invalidateManifestCache();
|
|
59
|
+
DomainLang.imports.ImportResolver.clearCache();
|
|
60
|
+
// Clear IndexManager import dependencies - resolved paths may have changed
|
|
61
|
+
const indexManager = sharedServices.workspace.IndexManager;
|
|
62
|
+
indexManager.clearImportDependencies();
|
|
63
|
+
manifestChanged = true;
|
|
64
|
+
}
|
|
65
|
+
else if (fileName === 'model.lock') {
|
|
66
|
+
await handleLockFileChange(change, workspaceManager);
|
|
67
|
+
DomainLang.imports.ImportResolver.clearCache();
|
|
68
|
+
lockFileChanged = true;
|
|
25
69
|
}
|
|
26
70
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
71
|
+
// Only rebuild if dependencies changed, not just any manifest change
|
|
72
|
+
if (manifestChanged || lockFileChanged) {
|
|
73
|
+
await rebuildWorkspace(sharedServices, workspaceManager, manifestChanged);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handles lock file creation, change, or deletion.
|
|
78
|
+
*/
|
|
79
|
+
async function handleLockFileChange(change, workspaceManager) {
|
|
80
|
+
console.warn(`model.lock changed: ${change.uri}`);
|
|
81
|
+
if (change.type === FileChangeType.Changed || change.type === FileChangeType.Created) {
|
|
82
|
+
await workspaceManager.refreshLockFile();
|
|
83
|
+
}
|
|
84
|
+
else if (change.type === FileChangeType.Deleted) {
|
|
85
|
+
workspaceManager.invalidateLockCache();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Rebuilds the workspace after config file changes.
|
|
90
|
+
* Uses incremental strategy: only full rebuild if dependencies changed.
|
|
91
|
+
*
|
|
92
|
+
* @param sharedServices - Shared Langium services
|
|
93
|
+
* @param workspaceManager - Workspace manager for manifest access
|
|
94
|
+
* @param manifestChanged - Whether model.yaml changed (vs just model.lock)
|
|
95
|
+
*/
|
|
96
|
+
async function rebuildWorkspace(sharedServices, workspaceManager, manifestChanged) {
|
|
97
|
+
try {
|
|
98
|
+
// If only lock file changed, caches are already invalidated - no rebuild needed
|
|
99
|
+
// Lock file changes mean resolved versions changed, but import resolver cache is cleared
|
|
100
|
+
// Documents will re-resolve imports on next access
|
|
101
|
+
if (!manifestChanged) {
|
|
102
|
+
console.warn('Lock file changed - caches invalidated, no rebuild needed');
|
|
103
|
+
return;
|
|
30
104
|
}
|
|
31
|
-
|
|
32
|
-
|
|
105
|
+
// For manifest changes, check if dependencies section actually changed
|
|
106
|
+
// If only metadata changed (name, version, etc.), no rebuild needed
|
|
107
|
+
const manifest = await workspaceManager.getManifest();
|
|
108
|
+
const hasDependencies = manifest?.dependencies && Object.keys(manifest.dependencies).length > 0;
|
|
109
|
+
if (!hasDependencies) {
|
|
110
|
+
console.warn('Manifest changed but has no dependencies - skipping rebuild');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Dependencies exist and manifest changed - do full rebuild
|
|
114
|
+
const documents = sharedServices.workspace.LangiumDocuments.all.toArray();
|
|
115
|
+
const uris = documents.map(doc => doc.uri);
|
|
116
|
+
await sharedServices.workspace.DocumentBuilder.update([], uris);
|
|
117
|
+
console.warn(`Workspace rebuilt: ${documents.length} documents revalidated`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
121
|
+
console.error(`Failed to rebuild workspace: ${message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
33
124
|
// Optionally start from a single entry file and follow imports.
|
|
34
125
|
// Configure via env DOMAINLANG_ENTRY (absolute or workspace-relative path)
|
|
35
126
|
const entryFile = process.env.DOMAINLANG_ENTRY;
|
|
@@ -52,7 +143,8 @@ if (entryFile) {
|
|
|
52
143
|
}
|
|
53
144
|
};
|
|
54
145
|
// Initial load from entry file, then start the server
|
|
55
|
-
reloadFromEntry()
|
|
146
|
+
await reloadFromEntry();
|
|
147
|
+
startLanguageServer(shared);
|
|
56
148
|
// Any change within the loaded graph should trigger a reload from the entry
|
|
57
149
|
shared.workspace.TextDocuments.onDidChangeContent(async (event) => {
|
|
58
150
|
const changed = event.document.uri;
|
package/out/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|