@eventcatalog/language-server 0.6.0 → 0.6.1
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/dist/browser.d.ts +22 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/compiler.js +1 -1
- package/dist/compiler.js.map +1 -1
- package/dist/completion-data.d.ts +15 -0
- package/dist/completion-data.d.ts.map +1 -0
- package/dist/completion-data.js +453 -0
- package/dist/completion-data.js.map +1 -0
- package/dist/completion-utils.d.ts +29 -0
- package/dist/completion-utils.d.ts.map +1 -0
- package/dist/completion-utils.js +128 -0
- package/dist/completion-utils.js.map +1 -0
- package/dist/ec-completion-provider.d.ts +22 -1
- package/dist/ec-completion-provider.d.ts.map +1 -1
- package/dist/ec-completion-provider.js +461 -150
- package/dist/ec-completion-provider.js.map +1 -1
- package/dist/ec-definition-provider.d.ts +14 -0
- package/dist/ec-definition-provider.d.ts.map +1 -0
- package/dist/ec-definition-provider.js +123 -0
- package/dist/ec-definition-provider.js.map +1 -0
- package/dist/ec-formatter-provider.d.ts +10 -0
- package/dist/ec-formatter-provider.d.ts.map +1 -0
- package/dist/ec-formatter-provider.js +28 -0
- package/dist/ec-formatter-provider.js.map +1 -0
- package/dist/ec-hover-provider.d.ts +10 -0
- package/dist/ec-hover-provider.d.ts.map +1 -0
- package/dist/ec-hover-provider.js +41 -0
- package/dist/ec-hover-provider.js.map +1 -0
- package/dist/ec-module.d.ts +0 -6
- package/dist/ec-module.d.ts.map +1 -1
- package/dist/ec-module.js +0 -10
- package/dist/ec-module.js.map +1 -1
- package/dist/ec-resource-index.d.ts +64 -0
- package/dist/ec-resource-index.d.ts.map +1 -0
- package/dist/ec-resource-index.js +281 -0
- package/dist/ec-resource-index.js.map +1 -0
- package/dist/ec-validator.d.ts.map +1 -1
- package/dist/ec-validator.js +22 -87
- package/dist/ec-validator.js.map +1 -1
- package/dist/generated/ast.d.ts +2 -2
- package/dist/generated/ast.d.ts.map +1 -1
- package/dist/generated/ast.js +1 -1
- package/dist/generated/ast.js.map +1 -1
- package/dist/generated/grammar.d.ts.map +1 -1
- package/dist/generated/grammar.js +103 -53
- package/dist/generated/grammar.js.map +1 -1
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +83 -35
- package/dist/graph.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/main.js +16 -1
- package/dist/main.js.map +1 -1
- package/dist/resolvers/asyncapi.d.ts +5 -0
- package/dist/resolvers/asyncapi.d.ts.map +1 -1
- package/dist/resolvers/asyncapi.js +50 -14
- package/dist/resolvers/asyncapi.js.map +1 -1
- package/dist/resolvers/catalog.d.ts +34 -0
- package/dist/resolvers/catalog.d.ts.map +1 -0
- package/dist/resolvers/catalog.js +291 -0
- package/dist/resolvers/catalog.js.map +1 -0
- package/dist/resolvers/index.d.ts +4 -2
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +4 -2
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/openapi.d.ts.map +1 -1
- package/dist/resolvers/openapi.js +30 -0
- package/dist/resolvers/openapi.js.map +1 -1
- package/dist/resolvers/resolve.d.ts +5 -2
- package/dist/resolvers/resolve.d.ts.map +1 -1
- package/dist/resolvers/resolve.js +161 -5
- package/dist/resolvers/resolve.js.map +1 -1
- package/dist/resolvers/types.d.ts +16 -1
- package/dist/resolvers/types.d.ts.map +1 -1
- package/dist/resolvers/types.js +11 -1
- package/dist/resolvers/types.js.map +1 -1
- package/package.json +7 -2
- package/specification/03-event.md +1 -0
- package/specification/04-command.md +4 -1
- package/specification/05-query.md +4 -1
- package/specification/06-channel.md +24 -4
- package/specification/16-annotations.md +52 -0
- package/syntaxes/ec.tmLanguage.json +1 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared completion data used by both the language server (LSP) and the playground (Monaco).
|
|
3
|
+
* This is the single source of truth for all snippet templates, annotations, and context-aware suggestions.
|
|
4
|
+
*/
|
|
5
|
+
// ─── Message type → plural form ─────────────────────────
|
|
6
|
+
export const MESSAGE_TYPE_PLURAL = {
|
|
7
|
+
event: "events",
|
|
8
|
+
command: "commands",
|
|
9
|
+
query: "queries",
|
|
10
|
+
};
|
|
11
|
+
// ─── Top-level resource keyword snippets ─────────────────
|
|
12
|
+
export const RESOURCE_KEYWORDS = [
|
|
13
|
+
{
|
|
14
|
+
label: "domain",
|
|
15
|
+
detail: "Top-level bounded context",
|
|
16
|
+
insertText: 'domain ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Bounded context responsible for $1}"\n\n $0\n}',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
label: "service",
|
|
20
|
+
detail: "Microservice or application",
|
|
21
|
+
insertText: 'service ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Service that manages and processes $1 operations}"\n\n $0\n}',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
label: "event",
|
|
25
|
+
detail: "Domain event",
|
|
26
|
+
insertText: 'event ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Triggered when a significant change occurs in the domain}"\n}',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
label: "command",
|
|
30
|
+
detail: "Command message",
|
|
31
|
+
insertText: 'command ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Requests an action to be performed in the system}"\n}',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
label: "query",
|
|
35
|
+
detail: "Query message",
|
|
36
|
+
insertText: 'query ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Retrieves data from the system without side effects}"\n}',
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
label: "channel",
|
|
40
|
+
detail: "Communication channel",
|
|
41
|
+
insertText: 'channel ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Message channel for routing events between services}"\n address "${4:topic}"\n\n $0\n}',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
label: "user",
|
|
45
|
+
detail: "User definition",
|
|
46
|
+
insertText: 'user ${1:username} {\n name "${2:Full Name}"\n\n $0\n}',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
label: "team",
|
|
50
|
+
detail: "Team definition",
|
|
51
|
+
insertText: 'team ${1:team-name} {\n name "${2:Team Name}"\n\n $0\n}',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
label: "flow",
|
|
55
|
+
detail: "Flow definition",
|
|
56
|
+
insertText: 'flow ${1:Name} {\n version ${2:1.0.0}\n summary "${3:End-to-end flow describing how messages move through the system}"\n\n $0\n}',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
label: "container",
|
|
60
|
+
detail: "Data container",
|
|
61
|
+
insertText: 'container ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Data store that persists and manages $1 data}"\n\n $0\n}',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
label: "data-product",
|
|
65
|
+
detail: "Data product",
|
|
66
|
+
insertText: 'data-product ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Data product that provides curated data for consumers}"\n\n $0\n}',
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
label: "visualizer",
|
|
70
|
+
detail: "Visualizer view",
|
|
71
|
+
insertText: 'visualizer ${1:main} {\n name "${2:View Name}"\n\n $0\n}',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
label: "actor",
|
|
75
|
+
detail: "Human actor (for flows)",
|
|
76
|
+
insertText: 'actor ${1:Name} {\n name "${2:Display Name}"\n summary "${3:User or persona that interacts with the system}"\n}',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
label: "external-system",
|
|
80
|
+
detail: "External system (for flows)",
|
|
81
|
+
insertText: 'external-system ${1:Name} {\n name "${2:Display Name}"\n summary "${3:Third-party system that integrates with the platform}"\n}',
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
// ─── Common properties (shared across most resource types) ──
|
|
85
|
+
export const COMMON_PROPS = [
|
|
86
|
+
{
|
|
87
|
+
label: "version",
|
|
88
|
+
detail: "Semantic version",
|
|
89
|
+
insertText: "version ${1:1.0.0}",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
label: "name",
|
|
93
|
+
detail: "Display name",
|
|
94
|
+
insertText: 'name "${1:Display Name}"',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
label: "summary",
|
|
98
|
+
detail: "Short description",
|
|
99
|
+
insertText: 'summary "${1:description}"',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
label: "owner",
|
|
103
|
+
detail: "Owner reference",
|
|
104
|
+
insertText: "owner ${1:MyTeam}",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
label: "deprecated",
|
|
108
|
+
detail: "Mark as deprecated",
|
|
109
|
+
insertText: "deprecated true",
|
|
110
|
+
},
|
|
111
|
+
{ label: "draft", detail: "Mark as draft", insertText: "draft true" },
|
|
112
|
+
];
|
|
113
|
+
// ─── Annotation snippets with full argument scaffolding ──
|
|
114
|
+
export const ANNOTATION_SUGGESTIONS = [
|
|
115
|
+
{
|
|
116
|
+
label: "@api",
|
|
117
|
+
detail: "HTTP API metadata",
|
|
118
|
+
insertText: 'api(method: "${1|GET,POST,PUT,PATCH,DELETE|}", path: "${2:/resource}", statusCodes: "${3:200}")',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
label: "@badge",
|
|
122
|
+
detail: "Visual badge",
|
|
123
|
+
insertText: 'badge("${1:label}", bg: "${2:#22c55e}", text: "${3:#fff}")',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
label: "@note",
|
|
127
|
+
detail: "Developer note or reminder",
|
|
128
|
+
insertText: 'note("${1:note text}")',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
label: "@note (with params)",
|
|
132
|
+
detail: "Note with author and priority",
|
|
133
|
+
insertText: 'note("${1:note text}", author: "${2:name}", priority: "${3|low,medium,high|}")',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
label: "@repository",
|
|
137
|
+
detail: "Source code repository",
|
|
138
|
+
insertText: 'repository(url: "${1:https://github.com/...}", language: "${2:TypeScript}")',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
label: "@specification",
|
|
142
|
+
detail: "API specification",
|
|
143
|
+
insertText: 'specification(type: ${1|openapi,asyncapi,graphql|}, path: "${2:./spec.yml}")',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
label: "@externalId",
|
|
147
|
+
detail: "External identifier",
|
|
148
|
+
insertText: 'externalId("${1:id}")',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
label: "@tag",
|
|
152
|
+
detail: "Add a tag to the resource",
|
|
153
|
+
insertText: 'tag("${1:tag-name}")',
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
// ─── Context-aware completions per resource type ─────────
|
|
157
|
+
export const CONTEXT_SUGGESTIONS = {
|
|
158
|
+
service: [
|
|
159
|
+
...COMMON_PROPS,
|
|
160
|
+
{
|
|
161
|
+
label: "sends",
|
|
162
|
+
detail: "Service sends a message",
|
|
163
|
+
insertText: "sends ${1|event,command,query|} ${2:Name}",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
label: "receives",
|
|
167
|
+
detail: "Service receives a message",
|
|
168
|
+
insertText: "receives ${1|event,command,query|} ${2:Name}",
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
label: "writes-to",
|
|
172
|
+
detail: "Writes to a container",
|
|
173
|
+
insertText: "writes-to container ${1:Container}",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
label: "reads-from",
|
|
177
|
+
detail: "Reads from a container",
|
|
178
|
+
insertText: "reads-from container ${1:Container}",
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
domain: [
|
|
182
|
+
...COMMON_PROPS,
|
|
183
|
+
{
|
|
184
|
+
label: "service",
|
|
185
|
+
detail: "Nested service",
|
|
186
|
+
insertText: "service ${1:Name} {\n version ${2:1.0.0}\n\n $0\n}",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
label: "subdomain",
|
|
190
|
+
detail: "Nested subdomain",
|
|
191
|
+
insertText: "subdomain ${1:Name} {\n version ${2:1.0.0}\n\n $0\n}",
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
event: [
|
|
195
|
+
...COMMON_PROPS,
|
|
196
|
+
{
|
|
197
|
+
label: "schema",
|
|
198
|
+
detail: "Schema path",
|
|
199
|
+
insertText: 'schema "${1:path}"',
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
command: [
|
|
203
|
+
...COMMON_PROPS,
|
|
204
|
+
{
|
|
205
|
+
label: "schema",
|
|
206
|
+
detail: "Schema path",
|
|
207
|
+
insertText: 'schema "${1:path}"',
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
query: [
|
|
211
|
+
...COMMON_PROPS,
|
|
212
|
+
{
|
|
213
|
+
label: "schema",
|
|
214
|
+
detail: "Schema path",
|
|
215
|
+
insertText: 'schema "${1:path}"',
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
channel: [
|
|
219
|
+
...COMMON_PROPS,
|
|
220
|
+
{
|
|
221
|
+
label: "address",
|
|
222
|
+
detail: "Channel address/topic",
|
|
223
|
+
insertText: 'address "${1:topic}"',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
label: "protocol",
|
|
227
|
+
detail: "Channel protocol",
|
|
228
|
+
insertText: 'protocol "${1:protocol}"',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
label: "route",
|
|
232
|
+
detail: "Route to another channel",
|
|
233
|
+
insertText: "route ${1:ChannelName}",
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
user: [
|
|
237
|
+
{
|
|
238
|
+
label: "name",
|
|
239
|
+
detail: "Display name",
|
|
240
|
+
insertText: 'name "${1:Full Name}"',
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
label: "avatar",
|
|
244
|
+
detail: "Avatar URL",
|
|
245
|
+
insertText: 'avatar "${1:https://example.com/avatar.png}"',
|
|
246
|
+
},
|
|
247
|
+
{ label: "role", detail: "User role", insertText: 'role "${1:role}"' },
|
|
248
|
+
],
|
|
249
|
+
team: [
|
|
250
|
+
{
|
|
251
|
+
label: "name",
|
|
252
|
+
detail: "Team display name",
|
|
253
|
+
insertText: 'name "${1:Team Name}"',
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
label: "avatar",
|
|
257
|
+
detail: "Avatar URL",
|
|
258
|
+
insertText: 'avatar "${1:https://example.com/avatar.png}"',
|
|
259
|
+
},
|
|
260
|
+
{ label: "role", detail: "Team role", insertText: 'role "${1:role}"' },
|
|
261
|
+
{
|
|
262
|
+
label: "member",
|
|
263
|
+
detail: "Team member",
|
|
264
|
+
insertText: "member ${1:username}",
|
|
265
|
+
},
|
|
266
|
+
],
|
|
267
|
+
flow: [
|
|
268
|
+
...COMMON_PROPS,
|
|
269
|
+
{
|
|
270
|
+
label: "entry chain",
|
|
271
|
+
detail: "Starting arrow chain",
|
|
272
|
+
insertText: '${1:Source} "${2:description}" -> ${3:Target}',
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
label: "when block",
|
|
276
|
+
detail: "React to an event",
|
|
277
|
+
insertText: 'when ${1:TriggerName}\n ${2:ServiceName} "${3:description}"\n -> ${0:OutputName}',
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
label: "when (convergence)",
|
|
281
|
+
detail: "React to multiple events",
|
|
282
|
+
insertText: 'when ${1:EventA} and ${2:EventB}\n ${3:ServiceName} "${4:description}"\n -> ${0:OutputName}',
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
label: "labeled output",
|
|
286
|
+
detail: "Output with label",
|
|
287
|
+
insertText: '-> "${1:label}": ${2:TargetName}',
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
container: [
|
|
291
|
+
...COMMON_PROPS,
|
|
292
|
+
{
|
|
293
|
+
label: "container-type",
|
|
294
|
+
detail: "Type of container",
|
|
295
|
+
insertText: "container-type ${1|database,cache,objectStore,searchIndex,dataWarehouse,dataLake,externalSaaS,other|}",
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
label: "technology",
|
|
299
|
+
detail: "Technology/implementation",
|
|
300
|
+
insertText: 'technology "${1:postgres@14}"',
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
label: "authoritative",
|
|
304
|
+
detail: "Authoritative source",
|
|
305
|
+
insertText: "authoritative ${1|true,false|}",
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
label: "access-mode",
|
|
309
|
+
detail: "Access pattern",
|
|
310
|
+
insertText: "access-mode ${1|read,write,readWrite,appendOnly|}",
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
label: "classification",
|
|
314
|
+
detail: "Data classification",
|
|
315
|
+
insertText: "classification ${1|public,internal,confidential,regulated|}",
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
label: "residency",
|
|
319
|
+
detail: "Data residency",
|
|
320
|
+
insertText: 'residency "${1:region}"',
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
label: "retention",
|
|
324
|
+
detail: "Data retention policy",
|
|
325
|
+
insertText: 'retention "${1:policy}"',
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
"data-product": [
|
|
329
|
+
...COMMON_PROPS,
|
|
330
|
+
{
|
|
331
|
+
label: "input",
|
|
332
|
+
detail: "Input data source",
|
|
333
|
+
insertText: "input ${1|event,command,query|} ${2:ResourceName}",
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
label: "output",
|
|
337
|
+
detail: "Output dataset",
|
|
338
|
+
insertText: "output ${1|event,command,query|} ${2:DatasetName}",
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
label: "output (with contract)",
|
|
342
|
+
detail: "Output with schema contract",
|
|
343
|
+
insertText: 'output ${1|event,command,query|} ${2:DatasetName} {\n contract {\n path "${3:./schemas/schema.json}"\n name "${4:SchemaName}"\n type "${5:json-schema}"\n }\n}',
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
actor: [
|
|
347
|
+
{
|
|
348
|
+
label: "name",
|
|
349
|
+
detail: "Display name",
|
|
350
|
+
insertText: 'name "${1:Display Name}"',
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
label: "summary",
|
|
354
|
+
detail: "Short description",
|
|
355
|
+
insertText: 'summary "${1:description}"',
|
|
356
|
+
},
|
|
357
|
+
],
|
|
358
|
+
"external-system": [
|
|
359
|
+
{
|
|
360
|
+
label: "name",
|
|
361
|
+
detail: "Display name",
|
|
362
|
+
insertText: 'name "${1:Display Name}"',
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
label: "summary",
|
|
366
|
+
detail: "Short description",
|
|
367
|
+
insertText: 'summary "${1:description}"',
|
|
368
|
+
},
|
|
369
|
+
],
|
|
370
|
+
visualizer: [
|
|
371
|
+
{
|
|
372
|
+
label: "name",
|
|
373
|
+
detail: "Display name",
|
|
374
|
+
insertText: 'name "${1:View Name}"',
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
label: "summary",
|
|
378
|
+
detail: "Short description",
|
|
379
|
+
insertText: 'summary "${1:description}"',
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
label: "legend",
|
|
383
|
+
detail: "Show/hide legend",
|
|
384
|
+
insertText: "legend ${1|true,false|}",
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
label: "search",
|
|
388
|
+
detail: "Show/hide search",
|
|
389
|
+
insertText: "search ${1|true,false|}",
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
label: "toolbar",
|
|
393
|
+
detail: "Show/hide toolbar",
|
|
394
|
+
insertText: "toolbar ${1|true,false|}",
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
label: "focus-mode",
|
|
398
|
+
detail: "Enable/disable focus mode",
|
|
399
|
+
insertText: "focus-mode ${1|true,false|}",
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
label: "animated",
|
|
403
|
+
detail: "Simulate message flow animation",
|
|
404
|
+
insertText: "animated ${1|true,false|}",
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
label: "style",
|
|
408
|
+
detail: "Node rendering style",
|
|
409
|
+
insertText: "style ${1|default,post-it|}",
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
label: "service",
|
|
413
|
+
detail: "Include a service",
|
|
414
|
+
insertText: 'service ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Service that manages and processes $1 operations}"\n\n $0\n}',
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
label: "domain",
|
|
418
|
+
detail: "Include a domain",
|
|
419
|
+
insertText: 'domain ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Bounded context responsible for $1}"\n\n $0\n}',
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
label: "event",
|
|
423
|
+
detail: "Include an event",
|
|
424
|
+
insertText: 'event ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Triggered when a significant change occurs in the domain}"\n}',
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
label: "command",
|
|
428
|
+
detail: "Include a command",
|
|
429
|
+
insertText: 'command ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Requests an action to be performed in the system}"\n}',
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
label: "query",
|
|
433
|
+
detail: "Include a query",
|
|
434
|
+
insertText: 'query ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Retrieves data from the system without side effects}"\n}',
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
label: "channel",
|
|
438
|
+
detail: "Include a channel",
|
|
439
|
+
insertText: 'channel ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Message channel for routing events between services}"\n address "${4:topic}"\n\n $0\n}',
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
label: "container",
|
|
443
|
+
detail: "Include a container",
|
|
444
|
+
insertText: 'container ${1:Name} {\n version ${2:1.0.0}\n summary "${3:Data store that persists and manages $1 data}"\n}',
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
label: "flow",
|
|
448
|
+
detail: "Include a flow",
|
|
449
|
+
insertText: 'flow ${1:Name} {\n version ${2:1.0.0}\n summary "${3:End-to-end flow describing how messages move through the system}"\n}',
|
|
450
|
+
},
|
|
451
|
+
],
|
|
452
|
+
};
|
|
453
|
+
//# sourceMappingURL=completion-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-data.js","sourceRoot":"","sources":["../src/completion-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SpecMessage, SpecChannel } from "./resolvers/types.js";
|
|
2
|
+
export interface ParsedSpecResult {
|
|
3
|
+
messages: Map<string, SpecMessage>;
|
|
4
|
+
channels: Map<string, SpecChannel>;
|
|
5
|
+
}
|
|
6
|
+
export declare function collectRegexMatches(pattern: RegExp, text: string): string[];
|
|
7
|
+
/**
|
|
8
|
+
* Extract version numbers for resources from workspace text.
|
|
9
|
+
* Optionally filter to a single resource type for efficiency.
|
|
10
|
+
*/
|
|
11
|
+
export declare function extractResourceVersions(text: string, filterType?: string): Map<string, string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Parse a spec file, auto-detecting AsyncAPI vs OpenAPI format.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseSpecAuto(content: string): ParsedSpecResult;
|
|
16
|
+
/**
|
|
17
|
+
* Collect all channel names from workspace text via regex patterns.
|
|
18
|
+
*/
|
|
19
|
+
export declare function collectChannelNames(allText: string): Set<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Collect all message names of a given type from workspace text via regex patterns.
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectMessageNames(allText: string, msgType: string, pluralType: string): Set<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Walk text tracking brace depth to determine which resource block the cursor is inside.
|
|
26
|
+
* Returns the resource type string (e.g. "service", "domain") or null if at top level.
|
|
27
|
+
*/
|
|
28
|
+
export declare function findEnclosingResource(text: string): string | null;
|
|
29
|
+
//# sourceMappingURL=completion-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-utils.d.ts","sourceRoot":"","sources":["../src/completion-utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACpC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAoDvB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAW/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAoBhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,GAAG,CAAC,MAAM,CAAC,CA0Bb;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBjE"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { parseSpec } from "./resolvers/asyncapi.js";
|
|
2
|
+
import { parseOpenApiSpec } from "./resolvers/openapi.js";
|
|
3
|
+
import { detectSpecType } from "./resolvers/resolve.js";
|
|
4
|
+
export function collectRegexMatches(pattern, text) {
|
|
5
|
+
const results = [];
|
|
6
|
+
let m;
|
|
7
|
+
while ((m = pattern.exec(text)) !== null) {
|
|
8
|
+
results.push(m[1]);
|
|
9
|
+
}
|
|
10
|
+
return results;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extract version numbers for resources from workspace text.
|
|
14
|
+
* Optionally filter to a single resource type for efficiency.
|
|
15
|
+
*/
|
|
16
|
+
export function extractResourceVersions(text, filterType) {
|
|
17
|
+
const versions = new Map();
|
|
18
|
+
const allTypes = [
|
|
19
|
+
"event",
|
|
20
|
+
"command",
|
|
21
|
+
"query",
|
|
22
|
+
"channel",
|
|
23
|
+
"service",
|
|
24
|
+
"domain",
|
|
25
|
+
"flow",
|
|
26
|
+
"container",
|
|
27
|
+
"data-product",
|
|
28
|
+
];
|
|
29
|
+
const resourceTypes = filterType
|
|
30
|
+
? allTypes.filter((t) => t === filterType)
|
|
31
|
+
: allTypes;
|
|
32
|
+
for (const type of resourceTypes) {
|
|
33
|
+
const defRegex = new RegExp(`\\b${type}\\s+([a-zA-Z_][a-zA-Z0-9_.{}\\-]*)\\s*\\{[^}]*?version\\s+(\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9_.]+)*)`, "g");
|
|
34
|
+
let match;
|
|
35
|
+
const seen = new Set();
|
|
36
|
+
while ((match = defRegex.exec(text)) !== null) {
|
|
37
|
+
const key = `${type}:${match[1]}`;
|
|
38
|
+
const ver = match[2];
|
|
39
|
+
const dedup = `${key}:${ver}`;
|
|
40
|
+
if (seen.has(dedup))
|
|
41
|
+
continue;
|
|
42
|
+
seen.add(dedup);
|
|
43
|
+
const arr = versions.get(key) ?? [];
|
|
44
|
+
arr.push(ver);
|
|
45
|
+
versions.set(key, arr);
|
|
46
|
+
}
|
|
47
|
+
const inlineRegex = new RegExp(`\\b(?:sends|receives)\\s+${type}\\s+([a-zA-Z_][a-zA-Z0-9_.\\-]*)\\s*\\{[^}]*?version\\s+(\\d+\\.\\d+\\.\\d+(?:-[a-zA-Z0-9_.]+)*)`, "g");
|
|
48
|
+
while ((match = inlineRegex.exec(text)) !== null) {
|
|
49
|
+
const key = `${type}:${match[1]}`;
|
|
50
|
+
const ver = match[2];
|
|
51
|
+
const dedup = `${key}:${ver}`;
|
|
52
|
+
if (seen.has(dedup))
|
|
53
|
+
continue;
|
|
54
|
+
seen.add(dedup);
|
|
55
|
+
const arr = versions.get(key) ?? [];
|
|
56
|
+
arr.push(ver);
|
|
57
|
+
versions.set(key, arr);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return versions;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parse a spec file, auto-detecting AsyncAPI vs OpenAPI format.
|
|
64
|
+
*/
|
|
65
|
+
export function parseSpecAuto(content) {
|
|
66
|
+
const specType = detectSpecType(content);
|
|
67
|
+
if (specType === "openapi") {
|
|
68
|
+
const parsed = parseOpenApiSpec(content);
|
|
69
|
+
return {
|
|
70
|
+
messages: parsed.messages,
|
|
71
|
+
channels: new Map(),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const parsed = parseSpec(content);
|
|
75
|
+
return { messages: parsed.messages, channels: parsed.channels };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Collect all channel names from workspace text via regex patterns.
|
|
79
|
+
*/
|
|
80
|
+
export function collectChannelNames(allText) {
|
|
81
|
+
return new Set([
|
|
82
|
+
...collectRegexMatches(/\bchannel\s+([a-zA-Z_][a-zA-Z0-9_.\-]*)\s*\{/g, allText),
|
|
83
|
+
...collectRegexMatches(/\b(?:sends|receives)\s+(?:event|command|query)\s+[a-zA-Z_][a-zA-Z0-9_.\-]*(?:@[^\s]*)?\s+(?:to|from)\s+([a-zA-Z_][a-zA-Z0-9_.\-]*)/g, allText),
|
|
84
|
+
...collectRegexMatches(/import\s+channels\s*\{([^}]*)\}\s*from\s*"[^"]+"/g, allText).flatMap((match) => match
|
|
85
|
+
.split(",")
|
|
86
|
+
.map((s) => s.trim())
|
|
87
|
+
.filter(Boolean)),
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Collect all message names of a given type from workspace text via regex patterns.
|
|
92
|
+
*/
|
|
93
|
+
export function collectMessageNames(allText, msgType, pluralType) {
|
|
94
|
+
return new Set([
|
|
95
|
+
...collectRegexMatches(new RegExp(`\\b${msgType}\\s+([a-zA-Z_][a-zA-Z0-9_.\\-]*)\\s*\\{`, "g"), allText),
|
|
96
|
+
...collectRegexMatches(new RegExp(`\\b(?:sends|receives)\\s+${msgType}\\s+([a-zA-Z_][a-zA-Z0-9_.\\-]*)`, "g"), allText),
|
|
97
|
+
...collectRegexMatches(new RegExp(`import\\s+${pluralType}\\s*\\{([^}]*)\\}\\s*from\\s*"[^"]+"`, "g"), allText).flatMap((match) => match
|
|
98
|
+
.split(",")
|
|
99
|
+
.map((s) => s.trim())
|
|
100
|
+
.filter(Boolean)),
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Walk text tracking brace depth to determine which resource block the cursor is inside.
|
|
105
|
+
* Returns the resource type string (e.g. "service", "domain") or null if at top level.
|
|
106
|
+
*/
|
|
107
|
+
export function findEnclosingResource(text) {
|
|
108
|
+
const stack = [];
|
|
109
|
+
const tokenRegex = /\b(domain|service|event|command|query|channel|user|team|flow|container|data-product|subdomain|visualizer|actor|external-system)\b(?:[^{}]|\{[a-zA-Z0-9_]+\})*\{|\{|\}/g;
|
|
110
|
+
let match;
|
|
111
|
+
while ((match = tokenRegex.exec(text)) !== null) {
|
|
112
|
+
const token = match[0];
|
|
113
|
+
if (token === "}") {
|
|
114
|
+
stack.pop();
|
|
115
|
+
}
|
|
116
|
+
else if (token === "{") {
|
|
117
|
+
stack.push("unknown");
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
stack.push(match[1]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (stack.length === 0)
|
|
124
|
+
return null;
|
|
125
|
+
const top = stack[stack.length - 1];
|
|
126
|
+
return top === "subdomain" ? "domain" : top;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=completion-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-utils.js","sourceRoot":"","sources":["../src/completion-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,30 @@ import type { CompletionAcceptor, CompletionContext, CompletionProviderOptions }
|
|
|
6
6
|
import type { NextFeature } from "langium/lsp";
|
|
7
7
|
export declare class EcCompletionProvider extends DefaultCompletionProvider {
|
|
8
8
|
readonly completionOptions: CompletionProviderOptions;
|
|
9
|
+
private langiumServices;
|
|
10
|
+
/** Snapshot for the current completion request. Reset on each `completionFor` call. */
|
|
11
|
+
private snapshot;
|
|
9
12
|
constructor(services: LangiumServices);
|
|
10
|
-
protected completionFor(context: CompletionContext, next: NextFeature, acceptor: CompletionAcceptor):
|
|
13
|
+
protected completionFor(context: CompletionContext, next: NextFeature, acceptor: CompletionAcceptor): Promise<void>;
|
|
11
14
|
protected completionForKeyword(context: CompletionContext, keyword: GrammarAST.Keyword, acceptor: CompletionAcceptor): MaybePromise<void>;
|
|
15
|
+
private tryDynamicCompletion;
|
|
16
|
+
private getAllWorkspaceText;
|
|
17
|
+
private getFullLineContent;
|
|
18
|
+
private getDocumentDir;
|
|
19
|
+
/**
|
|
20
|
+
* Read the workspace directory listing once per request.
|
|
21
|
+
* Returns files (spec + .ec), directories, and the base dir.
|
|
22
|
+
*/
|
|
23
|
+
private getDirListing;
|
|
24
|
+
private getWorkspaceFilenames;
|
|
25
|
+
private readSpecFile;
|
|
26
|
+
private parseWorkspaceSpecs;
|
|
27
|
+
private completeImportPaths;
|
|
28
|
+
private completeImportNames;
|
|
29
|
+
private completeCatalogImportNames;
|
|
30
|
+
private completeChannelNames;
|
|
31
|
+
private completeMessageNames;
|
|
32
|
+
private completeVersions;
|
|
12
33
|
private isAnnotationNameContext;
|
|
13
34
|
private completeAnnotationNames;
|
|
14
35
|
}
|