@blokjs/lsp-server 0.2.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.
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateWorkflow = validateWorkflow;
4
+ exports.findKeyRange = findKeyRange;
5
+ exports.findValueRange = findValueRange;
6
+ exports.offsetToPosition = offsetToPosition;
7
+ const vscode_languageserver_1 = require("vscode-languageserver");
8
+ const constants_1 = require("./constants");
9
+ /**
10
+ * Provides workflow validation diagnostics for the LSP server.
11
+ *
12
+ * Validates:
13
+ * - Required fields (name, version, trigger, steps, nodes)
14
+ * - Version format (semver)
15
+ * - Trigger configuration (type-specific validation)
16
+ * - Step structure (name, node, type)
17
+ * - Node configuration references
18
+ * - Unused nodes
19
+ * - Runtime field validation
20
+ */
21
+ function validateWorkflow(text) {
22
+ const diagnostics = [];
23
+ let workflow;
24
+ try {
25
+ workflow = JSON.parse(text);
26
+ }
27
+ catch {
28
+ diagnostics.push({
29
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
30
+ range: createRange(0, 0, 0, 1),
31
+ message: "Invalid JSON: failed to parse workflow file",
32
+ source: "blok",
33
+ });
34
+ return diagnostics;
35
+ }
36
+ if (typeof workflow !== "object" || workflow === null || Array.isArray(workflow)) {
37
+ diagnostics.push({
38
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
39
+ range: createRange(0, 0, 0, 1),
40
+ message: "Workflow must be a JSON object",
41
+ source: "blok",
42
+ });
43
+ return diagnostics;
44
+ }
45
+ validateRequiredFields(text, workflow, diagnostics);
46
+ validateVersion(text, workflow, diagnostics);
47
+ validateTrigger(text, workflow, diagnostics);
48
+ validateSteps(text, workflow, diagnostics);
49
+ validateNodeReferences(text, workflow, diagnostics);
50
+ return diagnostics;
51
+ }
52
+ function validateRequiredFields(text, workflow, diagnostics) {
53
+ const required = [
54
+ { key: "name", label: "name" },
55
+ { key: "version", label: "version" },
56
+ { key: "trigger", label: "trigger" },
57
+ { key: "steps", label: "steps" },
58
+ { key: "nodes", label: "nodes" },
59
+ ];
60
+ for (const { key, label } of required) {
61
+ if (workflow[key] === undefined) {
62
+ diagnostics.push({
63
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
64
+ range: createRange(0, 0, 0, 1),
65
+ message: `Missing required field: "${label}"`,
66
+ source: "blok",
67
+ });
68
+ }
69
+ }
70
+ if (typeof workflow.name === "string" && workflow.name.length === 0) {
71
+ const range = findKeyRange(text, "name");
72
+ diagnostics.push({
73
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
74
+ range,
75
+ message: "Workflow name cannot be empty",
76
+ source: "blok",
77
+ });
78
+ }
79
+ }
80
+ function validateVersion(text, workflow, diagnostics) {
81
+ if (typeof workflow.version !== "string")
82
+ return;
83
+ const semverRegex = /^\d+\.\d+\.\d+$/;
84
+ if (!semverRegex.test(workflow.version)) {
85
+ const range = findKeyRange(text, "version");
86
+ diagnostics.push({
87
+ severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
88
+ range,
89
+ message: `Invalid version format "${workflow.version}". Expected semver (e.g., 1.0.0)`,
90
+ source: "blok",
91
+ });
92
+ }
93
+ }
94
+ function validateTrigger(text, workflow, diagnostics) {
95
+ if (!workflow.trigger || typeof workflow.trigger !== "object")
96
+ return;
97
+ const triggerKeys = Object.keys(workflow.trigger);
98
+ if (triggerKeys.length === 0) {
99
+ const range = findKeyRange(text, "trigger");
100
+ diagnostics.push({
101
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
102
+ range,
103
+ message: "Trigger must have at least one type defined",
104
+ source: "blok",
105
+ });
106
+ return;
107
+ }
108
+ if (triggerKeys.length > 1) {
109
+ const range = findKeyRange(text, "trigger");
110
+ diagnostics.push({
111
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
112
+ range,
113
+ message: `Only one trigger type allowed per workflow. Found: ${triggerKeys.join(", ")}`,
114
+ source: "blok",
115
+ });
116
+ }
117
+ const triggerType = triggerKeys[0];
118
+ if (!constants_1.VALID_TRIGGERS.includes(triggerType)) {
119
+ const range = findKeyRange(text, triggerType);
120
+ diagnostics.push({
121
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
122
+ range,
123
+ message: `Unknown trigger type "${triggerType}". Valid types: ${constants_1.VALID_TRIGGERS.join(", ")}`,
124
+ source: "blok",
125
+ });
126
+ }
127
+ // HTTP trigger validation
128
+ if (triggerType === "http") {
129
+ const httpConfig = workflow.trigger.http;
130
+ if (httpConfig && typeof httpConfig === "object") {
131
+ if (!httpConfig.method) {
132
+ const range = findKeyRange(text, "http");
133
+ diagnostics.push({
134
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
135
+ range,
136
+ message: 'HTTP trigger requires "method" field',
137
+ source: "blok",
138
+ });
139
+ }
140
+ else if (typeof httpConfig.method === "string" &&
141
+ !constants_1.VALID_HTTP_METHODS.includes(httpConfig.method)) {
142
+ const range = findValueRange(text, "method", httpConfig.method);
143
+ diagnostics.push({
144
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
145
+ range,
146
+ message: `Invalid HTTP method "${httpConfig.method}". Valid: ${constants_1.VALID_HTTP_METHODS.join(", ")}`,
147
+ source: "blok",
148
+ });
149
+ }
150
+ if (!httpConfig.path) {
151
+ const range = findKeyRange(text, "http");
152
+ diagnostics.push({
153
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
154
+ range,
155
+ message: 'HTTP trigger requires "path" field',
156
+ source: "blok",
157
+ });
158
+ }
159
+ }
160
+ }
161
+ // Cron trigger validation
162
+ if (triggerType === "cron") {
163
+ const cronConfig = workflow.trigger.cron;
164
+ if (cronConfig && typeof cronConfig === "object") {
165
+ if (!cronConfig.schedule) {
166
+ const range = findKeyRange(text, "cron");
167
+ diagnostics.push({
168
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
169
+ range,
170
+ message: 'Cron trigger requires "schedule" field',
171
+ source: "blok",
172
+ });
173
+ }
174
+ else if (typeof cronConfig.schedule === "string") {
175
+ const parts = cronConfig.schedule.trim().split(/\s+/);
176
+ if (parts.length < 5 || parts.length > 6) {
177
+ const range = findValueRange(text, "schedule", cronConfig.schedule);
178
+ diagnostics.push({
179
+ severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
180
+ range,
181
+ message: "Invalid cron expression. Expected 5-6 fields (minute hour day month weekday [second])",
182
+ source: "blok",
183
+ });
184
+ }
185
+ }
186
+ }
187
+ }
188
+ // Queue trigger validation
189
+ if (triggerType === "queue") {
190
+ const queueConfig = workflow.trigger.queue;
191
+ if (queueConfig && typeof queueConfig === "object") {
192
+ if (!queueConfig.provider) {
193
+ const range = findKeyRange(text, "queue");
194
+ diagnostics.push({
195
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
196
+ range,
197
+ message: 'Queue trigger requires "provider" field',
198
+ source: "blok",
199
+ });
200
+ }
201
+ if (!queueConfig.topic) {
202
+ const range = findKeyRange(text, "queue");
203
+ diagnostics.push({
204
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
205
+ range,
206
+ message: 'Queue trigger requires "topic" field',
207
+ source: "blok",
208
+ });
209
+ }
210
+ }
211
+ }
212
+ // Webhook trigger validation
213
+ if (triggerType === "webhook") {
214
+ const webhookConfig = workflow.trigger.webhook;
215
+ if (webhookConfig && typeof webhookConfig === "object") {
216
+ if (!webhookConfig.source) {
217
+ const range = findKeyRange(text, "webhook");
218
+ diagnostics.push({
219
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
220
+ range,
221
+ message: 'Webhook trigger requires "source" field',
222
+ source: "blok",
223
+ });
224
+ }
225
+ if (!webhookConfig.events || !Array.isArray(webhookConfig.events)) {
226
+ const range = findKeyRange(text, "webhook");
227
+ diagnostics.push({
228
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
229
+ range,
230
+ message: 'Webhook trigger requires "events" array',
231
+ source: "blok",
232
+ });
233
+ }
234
+ }
235
+ }
236
+ // Pubsub trigger validation
237
+ if (triggerType === "pubsub") {
238
+ const pubsubConfig = workflow.trigger.pubsub;
239
+ if (pubsubConfig && typeof pubsubConfig === "object") {
240
+ if (!pubsubConfig.provider) {
241
+ const range = findKeyRange(text, "pubsub");
242
+ diagnostics.push({
243
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
244
+ range,
245
+ message: 'Pub/Sub trigger requires "provider" field',
246
+ source: "blok",
247
+ });
248
+ }
249
+ if (!pubsubConfig.topic && !pubsubConfig.channel) {
250
+ const range = findKeyRange(text, "pubsub");
251
+ diagnostics.push({
252
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
253
+ range,
254
+ message: 'Pub/Sub trigger requires "topic" or "channel" field',
255
+ source: "blok",
256
+ });
257
+ }
258
+ }
259
+ }
260
+ // Worker trigger validation
261
+ if (triggerType === "worker") {
262
+ const workerConfig = workflow.trigger.worker;
263
+ if (workerConfig && typeof workerConfig === "object") {
264
+ if (!workerConfig.queue) {
265
+ const range = findKeyRange(text, "worker");
266
+ diagnostics.push({
267
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
268
+ range,
269
+ message: 'Worker trigger requires "queue" field',
270
+ source: "blok",
271
+ });
272
+ }
273
+ }
274
+ }
275
+ }
276
+ function validateSteps(text, workflow, diagnostics) {
277
+ if (!Array.isArray(workflow.steps))
278
+ return;
279
+ const stepNames = new Set();
280
+ for (let i = 0; i < workflow.steps.length; i++) {
281
+ const step = workflow.steps[i];
282
+ if (!step || typeof step !== "object") {
283
+ diagnostics.push({
284
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
285
+ range: findArrayItemRange(text, "steps", i),
286
+ message: `Step ${i} must be an object`,
287
+ source: "blok",
288
+ });
289
+ continue;
290
+ }
291
+ if (!step.name || typeof step.name !== "string") {
292
+ diagnostics.push({
293
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
294
+ range: findArrayItemRange(text, "steps", i),
295
+ message: `Step ${i} is missing required "name" field`,
296
+ source: "blok",
297
+ });
298
+ }
299
+ else {
300
+ if (stepNames.has(step.name)) {
301
+ diagnostics.push({
302
+ severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
303
+ range: findValueRange(text, "name", step.name),
304
+ message: `Duplicate step name "${step.name}"`,
305
+ source: "blok",
306
+ });
307
+ }
308
+ stepNames.add(step.name);
309
+ }
310
+ if (!step.node || typeof step.node !== "string") {
311
+ diagnostics.push({
312
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
313
+ range: findArrayItemRange(text, "steps", i),
314
+ message: `Step "${step.name || i}" is missing required "node" field`,
315
+ source: "blok",
316
+ });
317
+ }
318
+ if (!step.type || typeof step.type !== "string") {
319
+ diagnostics.push({
320
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
321
+ range: findArrayItemRange(text, "steps", i),
322
+ message: `Step "${step.name || i}" is missing required "type" field`,
323
+ source: "blok",
324
+ });
325
+ }
326
+ else if (!constants_1.VALID_STEP_TYPES.includes(step.type)) {
327
+ diagnostics.push({
328
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
329
+ range: findValueRange(text, "type", step.type),
330
+ message: `Invalid step type "${step.type}". Valid: ${constants_1.VALID_STEP_TYPES.join(", ")}`,
331
+ source: "blok",
332
+ });
333
+ }
334
+ if (step.runtime &&
335
+ typeof step.runtime === "string" &&
336
+ !constants_1.VALID_RUNTIMES.includes(step.runtime)) {
337
+ diagnostics.push({
338
+ severity: vscode_languageserver_1.DiagnosticSeverity.Error,
339
+ range: findValueRange(text, "runtime", step.runtime),
340
+ message: `Invalid runtime "${step.runtime}". Valid: ${constants_1.VALID_RUNTIMES.join(", ")}`,
341
+ source: "blok",
342
+ });
343
+ }
344
+ }
345
+ }
346
+ function validateNodeReferences(text, workflow, diagnostics) {
347
+ if (!Array.isArray(workflow.steps) || typeof workflow.nodes !== "object" || !workflow.nodes)
348
+ return;
349
+ const referencedNodes = collectStepNames(workflow.steps);
350
+ const definedNodes = new Set(Object.keys(workflow.nodes));
351
+ // Check for steps referencing undefined nodes
352
+ for (const stepName of referencedNodes) {
353
+ if (!definedNodes.has(stepName)) {
354
+ const range = findValueRange(text, "name", stepName);
355
+ diagnostics.push({
356
+ severity: vscode_languageserver_1.DiagnosticSeverity.Warning,
357
+ range,
358
+ message: `Step "${stepName}" references a node that is not defined in "nodes"`,
359
+ source: "blok",
360
+ });
361
+ }
362
+ }
363
+ // Check for nodes with conditions and collect nested step names
364
+ const allReferenced = new Set(referencedNodes);
365
+ for (const [, nodeConfig] of Object.entries(workflow.nodes)) {
366
+ if (nodeConfig && typeof nodeConfig === "object") {
367
+ const cfg = nodeConfig;
368
+ if (Array.isArray(cfg.conditions)) {
369
+ for (const cond of cfg.conditions) {
370
+ if (cond && typeof cond === "object" && Array.isArray(cond.steps)) {
371
+ const nestedNames = collectStepNames(cond.steps);
372
+ for (const n of nestedNames)
373
+ allReferenced.add(n);
374
+ }
375
+ }
376
+ }
377
+ }
378
+ }
379
+ // Check for unused nodes
380
+ for (const nodeName of definedNodes) {
381
+ if (!allReferenced.has(nodeName)) {
382
+ const range = findKeyRange(text, nodeName);
383
+ diagnostics.push({
384
+ severity: vscode_languageserver_1.DiagnosticSeverity.Information,
385
+ range,
386
+ message: `Node "${nodeName}" is defined but not referenced by any step`,
387
+ source: "blok",
388
+ });
389
+ }
390
+ }
391
+ }
392
+ function collectStepNames(steps) {
393
+ const names = new Set();
394
+ for (const step of steps) {
395
+ if (step && typeof step === "object") {
396
+ const s = step;
397
+ if (typeof s.name === "string") {
398
+ names.add(s.name);
399
+ }
400
+ }
401
+ }
402
+ return names;
403
+ }
404
+ // --- Range helpers ---
405
+ function createRange(startLine, startChar, endLine, endChar) {
406
+ return vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(startLine, startChar), vscode_languageserver_1.Position.create(endLine, endChar));
407
+ }
408
+ function findKeyRange(text, key) {
409
+ const pattern = new RegExp(`"${escapeRegex(key)}"\\s*:`);
410
+ const match = pattern.exec(text);
411
+ if (match) {
412
+ const pos = offsetToPosition(text, match.index);
413
+ return createRange(pos.line, pos.character, pos.line, pos.character + match[0].length);
414
+ }
415
+ return createRange(0, 0, 0, 1);
416
+ }
417
+ function findValueRange(text, key, value) {
418
+ const pattern = new RegExp(`"${escapeRegex(key)}"\\s*:\\s*"${escapeRegex(value)}"`);
419
+ const match = pattern.exec(text);
420
+ if (match) {
421
+ const pos = offsetToPosition(text, match.index);
422
+ return createRange(pos.line, pos.character, pos.line, pos.character + match[0].length);
423
+ }
424
+ return findKeyRange(text, key);
425
+ }
426
+ function findArrayItemRange(text, arrayKey, index) {
427
+ const keyMatch = new RegExp(`"${escapeRegex(arrayKey)}"\\s*:\\s*\\[`).exec(text);
428
+ if (!keyMatch)
429
+ return createRange(0, 0, 0, 1);
430
+ let depth = 0;
431
+ let itemCount = 0;
432
+ const start = keyMatch.index + keyMatch[0].length;
433
+ for (let i = start; i < text.length; i++) {
434
+ if (text[i] === "{" || text[i] === "[") {
435
+ if (depth === 0 && itemCount === index) {
436
+ const pos = offsetToPosition(text, i);
437
+ return createRange(pos.line, pos.character, pos.line, pos.character + 1);
438
+ }
439
+ depth++;
440
+ }
441
+ else if (text[i] === "}" || text[i] === "]") {
442
+ depth--;
443
+ if (depth === 0)
444
+ itemCount++;
445
+ }
446
+ }
447
+ return createRange(0, 0, 0, 1);
448
+ }
449
+ function offsetToPosition(text, offset) {
450
+ let line = 0;
451
+ let col = 0;
452
+ for (let i = 0; i < offset && i < text.length; i++) {
453
+ if (text[i] === "\n") {
454
+ line++;
455
+ col = 0;
456
+ }
457
+ else {
458
+ col++;
459
+ }
460
+ }
461
+ return vscode_languageserver_1.Position.create(line, col);
462
+ }
463
+ function escapeRegex(str) {
464
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
465
+ }
466
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Hover } from "vscode-languageserver";
2
+ /**
3
+ * Provides hover documentation for Blok workflow JSON files via LSP.
4
+ *
5
+ * Shows contextual documentation when hovering over:
6
+ * - Trigger type keys (http, grpc, cron, queue, etc.)
7
+ * - Workflow fields (name, version, steps, nodes, etc.)
8
+ * - Node configuration fields (inputs, conditions, set_var)
9
+ * - Step fields (node, type, runtime)
10
+ * - HTTP method values, runtime type values, node packages
11
+ */
12
+ export declare function getHover(text: string, line: number, character: number): Hover | null;
package/dist/hover.js ADDED
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getHover = getHover;
4
+ const vscode_languageserver_1 = require("vscode-languageserver");
5
+ const constants_1 = require("./constants");
6
+ /**
7
+ * Provides hover documentation for Blok workflow JSON files via LSP.
8
+ *
9
+ * Shows contextual documentation when hovering over:
10
+ * - Trigger type keys (http, grpc, cron, queue, etc.)
11
+ * - Workflow fields (name, version, steps, nodes, etc.)
12
+ * - Node configuration fields (inputs, conditions, set_var)
13
+ * - Step fields (node, type, runtime)
14
+ * - HTTP method values, runtime type values, node packages
15
+ */
16
+ function getHover(text, line, character) {
17
+ const lines = text.split("\n");
18
+ if (line >= lines.length)
19
+ return null;
20
+ const lineText = lines[line];
21
+ // Find the quoted word at the cursor position
22
+ const wordInfo = findQuotedWordAt(lineText, character);
23
+ if (!wordInfo)
24
+ return null;
25
+ const { word, startChar, endChar } = wordInfo;
26
+ const range = vscode_languageserver_1.Range.create(vscode_languageserver_1.Position.create(line, startChar), vscode_languageserver_1.Position.create(line, endChar));
27
+ // Check if it's a key (followed by colon)
28
+ const afterWord = lineText.substring(endChar).trimStart();
29
+ const isKey = afterWord.startsWith(":");
30
+ if (isKey) {
31
+ // Trigger type documentation
32
+ if (constants_1.TRIGGER_DOCS[word]) {
33
+ return createDocHover(constants_1.TRIGGER_DOCS[word], range);
34
+ }
35
+ // Field documentation
36
+ if (constants_1.FIELD_DOCS[word]) {
37
+ return createDocHover(constants_1.FIELD_DOCS[word], range);
38
+ }
39
+ // Step field documentation
40
+ if (constants_1.STEP_FIELD_DOCS[word]) {
41
+ return createDocHover(constants_1.STEP_FIELD_DOCS[word], range);
42
+ }
43
+ }
44
+ // Value-based hover
45
+ if (!isKey) {
46
+ // HTTP methods
47
+ if (["GET", "POST", "PUT", "DELETE", "PATCH", "ANY"].includes(word)) {
48
+ return {
49
+ contents: {
50
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
51
+ value: `**HTTP Method: ${word}**\n\nHTTP request method that will trigger this workflow.`,
52
+ },
53
+ range,
54
+ };
55
+ }
56
+ // Runtime type values (runtime.go, runtime.python3, etc.)
57
+ if (word.startsWith("runtime.")) {
58
+ const lang = word.replace("runtime.", "");
59
+ return {
60
+ contents: {
61
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
62
+ value: `**Runtime Type: ${lang}**\n\nExecutes this node using the ${lang} runtime adapter. The node code must be written in ${lang} and served via the Blok runtime protocol (HTTP/gRPC).`,
63
+ },
64
+ range,
65
+ };
66
+ }
67
+ // Common node packages
68
+ if (word === "@blok/api-call") {
69
+ return {
70
+ contents: {
71
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
72
+ value: "**@blok/api-call**\n\nMakes HTTP API calls to external services.\n\n**Inputs:** `url`, `method`, `headers`, `body`, `responseType`",
73
+ },
74
+ range,
75
+ };
76
+ }
77
+ if (word === "@blok/if-else") {
78
+ return {
79
+ contents: {
80
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
81
+ value: "**@blok/if-else**\n\nConditional branching node. Evaluates JavaScript conditions against the workflow context.\n\nConfigure conditions in the `nodes` section using the `conditions` array.",
82
+ },
83
+ range,
84
+ };
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ function findQuotedWordAt(line, character) {
90
+ // Find all quoted strings in the line and check if cursor is inside one
91
+ const regex = /"([^"]*)"/g;
92
+ for (const match of line.matchAll(regex)) {
93
+ const start = match.index; // position of opening quote
94
+ const end = match.index + match[0].length; // position after closing quote
95
+ if (character >= start && character <= end) {
96
+ return {
97
+ word: match[1],
98
+ startChar: start,
99
+ endChar: end,
100
+ };
101
+ }
102
+ }
103
+ return null;
104
+ }
105
+ function createDocHover(doc, range) {
106
+ let value = `**${doc.title}**\n\n${doc.description}\n\n`;
107
+ if (doc.example) {
108
+ value += "```json\n" + doc.example + "\n```";
109
+ }
110
+ return {
111
+ contents: {
112
+ kind: vscode_languageserver_1.MarkupKind.Markdown,
113
+ value,
114
+ },
115
+ range,
116
+ };
117
+ }
118
+ //# sourceMappingURL=hover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../src/hover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};