@eventcatalog/language-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +71 -0
  2. package/SPEC.md +1939 -0
  3. package/dist/ast-utils.d.ts +96 -0
  4. package/dist/ast-utils.d.ts.map +1 -0
  5. package/dist/ast-utils.js +241 -0
  6. package/dist/ast-utils.js.map +1 -0
  7. package/dist/compiler.d.ts +7 -0
  8. package/dist/compiler.d.ts.map +1 -0
  9. package/dist/compiler.js +654 -0
  10. package/dist/compiler.js.map +1 -0
  11. package/dist/ec-completion-provider.d.ts +15 -0
  12. package/dist/ec-completion-provider.d.ts.map +1 -0
  13. package/dist/ec-completion-provider.js +202 -0
  14. package/dist/ec-completion-provider.js.map +1 -0
  15. package/dist/ec-module.d.ts +18 -0
  16. package/dist/ec-module.d.ts.map +1 -0
  17. package/dist/ec-module.js +27 -0
  18. package/dist/ec-module.js.map +1 -0
  19. package/dist/ec-scope-provider.d.ts +2 -0
  20. package/dist/ec-scope-provider.d.ts.map +1 -0
  21. package/dist/ec-scope-provider.js +2 -0
  22. package/dist/ec-scope-provider.js.map +1 -0
  23. package/dist/ec-scope.d.ts +10 -0
  24. package/dist/ec-scope.d.ts.map +1 -0
  25. package/dist/ec-scope.js +18 -0
  26. package/dist/ec-scope.js.map +1 -0
  27. package/dist/ec-validator.d.ts +9 -0
  28. package/dist/ec-validator.d.ts.map +1 -0
  29. package/dist/ec-validator.js +238 -0
  30. package/dist/ec-validator.js.map +1 -0
  31. package/dist/formatter.d.ts +6 -0
  32. package/dist/formatter.d.ts.map +1 -0
  33. package/dist/formatter.js +88 -0
  34. package/dist/formatter.js.map +1 -0
  35. package/dist/generated/ast.d.ts +970 -0
  36. package/dist/generated/ast.d.ts.map +1 -0
  37. package/dist/generated/ast.js +1537 -0
  38. package/dist/generated/ast.js.map +1 -0
  39. package/dist/generated/grammar.d.ts +7 -0
  40. package/dist/generated/grammar.d.ts.map +1 -0
  41. package/dist/generated/grammar.js +6062 -0
  42. package/dist/generated/grammar.js.map +1 -0
  43. package/dist/generated/module.d.ts +14 -0
  44. package/dist/generated/module.d.ts.map +1 -0
  45. package/dist/generated/module.js +21 -0
  46. package/dist/generated/module.js.map +1 -0
  47. package/dist/graph-types.d.ts +32 -0
  48. package/dist/graph-types.d.ts.map +1 -0
  49. package/dist/graph-types.js +2 -0
  50. package/dist/graph-types.js.map +1 -0
  51. package/dist/graph.d.ts +4 -0
  52. package/dist/graph.d.ts.map +1 -0
  53. package/dist/graph.js +931 -0
  54. package/dist/graph.js.map +1 -0
  55. package/dist/index.d.ts +12 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +10 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/main-browser.d.ts +2 -0
  60. package/dist/main-browser.d.ts.map +1 -0
  61. package/dist/main-browser.js +16 -0
  62. package/dist/main-browser.js.map +1 -0
  63. package/dist/main.d.ts +2 -0
  64. package/dist/main.d.ts.map +1 -0
  65. package/dist/main.js +15 -0
  66. package/dist/main.js.map +1 -0
  67. package/package.json +55 -0
  68. package/specification/00-overview.md +99 -0
  69. package/specification/01-domain.md +80 -0
  70. package/specification/02-service.md +50 -0
  71. package/specification/03-event.md +28 -0
  72. package/specification/04-command.md +25 -0
  73. package/specification/05-query.md +25 -0
  74. package/specification/06-channel.md +131 -0
  75. package/specification/08-container.md +54 -0
  76. package/specification/09-data-product.md +39 -0
  77. package/specification/10-flow.md +163 -0
  78. package/specification/11-diagram.md +3 -0
  79. package/specification/12-user.md +54 -0
  80. package/specification/13-team.md +62 -0
  81. package/specification/14-relationships.md +89 -0
  82. package/specification/15-versioning.md +41 -0
  83. package/specification/16-annotations.md +100 -0
  84. package/specification/17-examples.md +373 -0
  85. package/specification/18-grammar.md +242 -0
  86. package/specification/19-visualizer.md +197 -0
  87. package/specification/build-spec.sh +49 -0
  88. package/syntaxes/ec.tmLanguage.json +61 -0
@@ -0,0 +1,238 @@
1
+ import { isDomainDef, isSubdomainDef, isServiceDef, isUserDef, isTeamDef, isVisualizerDef, isSendsStmt, isReceivesStmt, isEventDef, isCommandDef, isQueryDef, isChannelDef, isContainerDef, isDataProductDef, isFlowDef, } from "./generated/ast.js";
2
+ import { getVersion } from "./ast-utils.js";
3
+ export function registerValidationChecks(services) {
4
+ const registry = services.validation.ValidationRegistry;
5
+ const validator = new EcValidator();
6
+ const checks = {
7
+ Program: [
8
+ validator.checkDuplicateDefinitions,
9
+ validator.checkRequiredVersions,
10
+ ],
11
+ };
12
+ registry.register(checks, validator);
13
+ }
14
+ export class EcValidator {
15
+ checkDuplicateDefinitions(program, accept) {
16
+ // Resources are uniquely identified by name + version (cross-type).
17
+ // E.g. event Foo 1.0.0 and query Foo 1.0.0 is a duplicate,
18
+ // but event Foo 1.0.0 and event Foo 2.0.0 is allowed.
19
+ const seen = new Map();
20
+ function registerDef(def) {
21
+ const version = def.body ? getVersion(def.body) : undefined;
22
+ const key = version ? `${def.name}@${version}` : def.name;
23
+ if (seen.has(key)) {
24
+ const label = version
25
+ ? `'${def.name}' version ${version}`
26
+ : `'${def.name}'`;
27
+ accept("error", `Duplicate resource definition: ${label}`, {
28
+ node: def,
29
+ property: "name",
30
+ });
31
+ }
32
+ else {
33
+ seen.set(key, def);
34
+ }
35
+ }
36
+ for (const def of program.definitions) {
37
+ if ("name" in def && typeof def.name === "string") {
38
+ registerDef(def);
39
+ // Also check inline definitions nested inside domains/services
40
+ if (isDomainDef(def) || isSubdomainDef(def)) {
41
+ checkNestedDuplicates(def.body, seen, accept);
42
+ }
43
+ if (isServiceDef(def)) {
44
+ checkInlineDuplicates(def.body, seen, accept);
45
+ }
46
+ if (isVisualizerDef(def)) {
47
+ checkVisualizerDuplicates(def.body, seen, accept);
48
+ }
49
+ }
50
+ }
51
+ }
52
+ checkRequiredVersions(program, accept) {
53
+ for (const def of program.definitions) {
54
+ checkVersionRecursive(def, accept);
55
+ }
56
+ }
57
+ }
58
+ function checkNestedDuplicates(body, seen, accept) {
59
+ for (const item of body) {
60
+ if (isServiceDef(item)) {
61
+ const version = getVersion(item.body);
62
+ const key = version ? `${item.name}@${version}` : item.name;
63
+ if (seen.has(key)) {
64
+ const label = version
65
+ ? `'${item.name}' version ${version}`
66
+ : `'${item.name}'`;
67
+ accept("error", `Duplicate resource definition: ${label}`, {
68
+ node: item,
69
+ property: "name",
70
+ });
71
+ }
72
+ else {
73
+ seen.set(key, item);
74
+ }
75
+ checkInlineDuplicates(item.body, seen, accept);
76
+ }
77
+ if (isSubdomainDef(item)) {
78
+ const version = getVersion(item.body);
79
+ const key = version ? `${item.name}@${version}` : item.name;
80
+ if (seen.has(key)) {
81
+ const label = version
82
+ ? `'${item.name}' version ${version}`
83
+ : `'${item.name}'`;
84
+ accept("error", `Duplicate resource definition: ${label}`, {
85
+ node: item,
86
+ property: "name",
87
+ });
88
+ }
89
+ else {
90
+ seen.set(key, item);
91
+ }
92
+ checkNestedDuplicates(item.body, seen, accept);
93
+ }
94
+ }
95
+ }
96
+ function checkInlineDuplicates(body, seen, accept) {
97
+ for (const item of body) {
98
+ if ((isSendsStmt(item) || isReceivesStmt(item)) && item.body.length > 0) {
99
+ const version = getVersion(item.body);
100
+ const key = version ? `${item.messageName}@${version}` : item.messageName;
101
+ if (seen.has(key)) {
102
+ const label = version
103
+ ? `'${item.messageName}' version ${version}`
104
+ : `'${item.messageName}'`;
105
+ accept("error", `Duplicate resource definition: ${label}`, {
106
+ node: item,
107
+ property: "messageName",
108
+ });
109
+ }
110
+ else {
111
+ seen.set(key, item);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ function checkVersionRecursive(def, accept) {
117
+ // Users, teams, and visualizers don't need versions
118
+ if (isUserDef(def) || isTeamDef(def) || isVisualizerDef(def)) {
119
+ // But check inline resources inside visualizers
120
+ if (isVisualizerDef(def)) {
121
+ for (const item of def.body) {
122
+ if (isDomainDef(item) ||
123
+ isServiceDef(item) ||
124
+ isChannelDef(item) ||
125
+ isContainerDef(item) ||
126
+ isDataProductDef(item) ||
127
+ isFlowDef(item)) {
128
+ checkVersionRecursive(item, accept);
129
+ }
130
+ if (isEventDef(item) || isCommandDef(item) || isQueryDef(item)) {
131
+ if (item.body && item.body.length > 0) {
132
+ const version = getVersion(item.body);
133
+ if (!version) {
134
+ const typeName = item.$type.replace("Def", "");
135
+ accept("error", `${typeName} '${item.name}' is missing a required 'version' statement`, {
136
+ node: item,
137
+ property: "name",
138
+ });
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ return;
145
+ }
146
+ if ("body" in def && Array.isArray(def.body)) {
147
+ const version = getVersion(def.body);
148
+ if (!version) {
149
+ const typeName = def.$type.replace("Def", "");
150
+ accept("error", `${typeName} '${def.name}' is missing a required 'version' statement`, {
151
+ node: def,
152
+ property: "name",
153
+ });
154
+ }
155
+ // Check nested resources
156
+ if (isDomainDef(def) || isSubdomainDef(def)) {
157
+ for (const item of def.body) {
158
+ if (isServiceDef(item))
159
+ checkVersionRecursive(item, accept);
160
+ if (isSubdomainDef(item))
161
+ checkVersionRecursive(item, accept);
162
+ }
163
+ }
164
+ if (isServiceDef(def)) {
165
+ for (const item of def.body) {
166
+ if (isSendsStmt(item) || isReceivesStmt(item)) {
167
+ checkInlineMessage(item, accept);
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ function checkInlineMessage(clause, accept) {
174
+ if (clause.body.length > 0) {
175
+ const version = getVersion(clause.body);
176
+ if (!version) {
177
+ const typeName = clause.messageType.charAt(0).toUpperCase() +
178
+ clause.messageType.slice(1);
179
+ accept("error", `${typeName} '${clause.messageName}' is missing a required 'version' statement`, {
180
+ node: clause,
181
+ property: "messageName",
182
+ });
183
+ }
184
+ }
185
+ }
186
+ function checkVisualizerDuplicates(body, seen, accept) {
187
+ for (const item of body) {
188
+ if (isDomainDef(item) ||
189
+ isServiceDef(item) ||
190
+ isChannelDef(item) ||
191
+ isContainerDef(item) ||
192
+ isDataProductDef(item) ||
193
+ isFlowDef(item)) {
194
+ const itemBody = "body" in item && Array.isArray(item.body)
195
+ ? item.body
196
+ : [];
197
+ const version = getVersion(itemBody);
198
+ const key = version ? `${item.name}@${version}` : item.name;
199
+ if (seen.has(key)) {
200
+ const label = version
201
+ ? `'${item.name}' version ${version}`
202
+ : `'${item.name}'`;
203
+ accept("error", `Duplicate resource definition: ${label}`, {
204
+ node: item,
205
+ property: "name",
206
+ });
207
+ }
208
+ else {
209
+ seen.set(key, item);
210
+ }
211
+ if (isServiceDef(item)) {
212
+ checkInlineDuplicates(item.body, seen, accept);
213
+ }
214
+ if (isDomainDef(item)) {
215
+ checkNestedDuplicates(item.body, seen, accept);
216
+ }
217
+ }
218
+ if (isEventDef(item) || isCommandDef(item) || isQueryDef(item)) {
219
+ if (item.body && item.body.length > 0) {
220
+ const version = getVersion(item.body);
221
+ const key = version ? `${item.name}@${version}` : item.name;
222
+ if (seen.has(key)) {
223
+ const label = version
224
+ ? `'${item.name}' version ${version}`
225
+ : `'${item.name}'`;
226
+ accept("error", `Duplicate resource definition: ${label}`, {
227
+ node: item,
228
+ property: "name",
229
+ });
230
+ }
231
+ else {
232
+ seen.set(key, item);
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ //# sourceMappingURL=ec-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ec-validator.js","sourceRoot":"","sources":["../src/ec-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Simple text-based formatter for .ec DSL files.
3
+ * Uses brace-depth tracking for indentation — no AST needed.
4
+ */
5
+ export declare function formatEc(source: string): string;
6
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoE/C"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Simple text-based formatter for .ec DSL files.
3
+ * Uses brace-depth tracking for indentation — no AST needed.
4
+ */
5
+ export function formatEc(source) {
6
+ const lines = source.split("\n");
7
+ const result = [];
8
+ const indent = " "; // 2-space indentation
9
+ let depth = 0;
10
+ let prevBlank = false;
11
+ let inBlockComment = false;
12
+ for (const rawLine of lines) {
13
+ const trimmed = rawLine.trim();
14
+ // Handle blank lines — collapse multiple into one
15
+ if (trimmed === "") {
16
+ if (!prevBlank) {
17
+ result.push("");
18
+ prevBlank = true;
19
+ }
20
+ continue;
21
+ }
22
+ prevBlank = false;
23
+ // Track block comment state
24
+ if (inBlockComment) {
25
+ // Inside a block comment, preserve content with current depth
26
+ result.push(indent.repeat(depth) + trimmed);
27
+ if (trimmed.includes("*/")) {
28
+ inBlockComment = false;
29
+ }
30
+ continue;
31
+ }
32
+ if (trimmed.startsWith("/*")) {
33
+ if (!trimmed.includes("*/")) {
34
+ inBlockComment = true;
35
+ }
36
+ // Decrease depth before printing if line starts with }
37
+ // (unlikely in a comment opener, but handle gracefully)
38
+ result.push(indent.repeat(depth) + trimmed);
39
+ continue;
40
+ }
41
+ // Decrease depth for closing braces before writing the line
42
+ if (trimmed.startsWith("}")) {
43
+ depth = Math.max(0, depth - 1);
44
+ }
45
+ result.push(indent.repeat(depth) + trimmed);
46
+ // Increase depth for opening braces
47
+ // Count braces outside of strings and comments
48
+ const stripped = stripStringsAndComments(trimmed);
49
+ const opens = (stripped.match(/{/g) || []).length;
50
+ const closes = (stripped.match(/}/g) || []).length;
51
+ // We already decremented for a leading }, so adjust
52
+ if (trimmed.startsWith("}")) {
53
+ // Re-add the one we already subtracted, let the net calculation handle it
54
+ depth = depth + 1;
55
+ }
56
+ depth = Math.max(0, depth + opens - closes);
57
+ }
58
+ // Remove trailing blank lines
59
+ while (result.length > 0 && result[result.length - 1] === "") {
60
+ result.pop();
61
+ }
62
+ return result.join("\n") + "\n";
63
+ }
64
+ /** Strip string literals and line comments from a line for brace counting */
65
+ function stripStringsAndComments(line) {
66
+ let result = "";
67
+ let inString = null;
68
+ for (let i = 0; i < line.length; i++) {
69
+ const ch = line[i];
70
+ if (inString) {
71
+ if (ch === inString && line[i - 1] !== "\\") {
72
+ inString = null;
73
+ }
74
+ continue;
75
+ }
76
+ if (ch === '"' || ch === "'") {
77
+ inString = ch;
78
+ continue;
79
+ }
80
+ // Line comment — skip rest
81
+ if (ch === "/" && line[i + 1] === "/") {
82
+ break;
83
+ }
84
+ result += ch;
85
+ }
86
+ return result;
87
+ }
88
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}