@birdcc/lsp 0.0.1-alpha.1 → 0.1.0-beta.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/README.md +25 -23
- package/dist/asn-completion.d.ts +21 -0
- package/dist/asn-completion.d.ts.map +1 -0
- package/dist/asn-completion.js +42 -0
- package/dist/asn-completion.js.map +1 -0
- package/dist/asn-context.d.ts +9 -0
- package/dist/asn-context.d.ts.map +1 -0
- package/dist/asn-context.js +203 -0
- package/dist/asn-context.js.map +1 -0
- package/dist/asn-hover.d.ts +11 -0
- package/dist/asn-hover.d.ts.map +1 -0
- package/dist/asn-hover.js +33 -0
- package/dist/asn-hover.js.map +1 -0
- package/dist/asn-inlay-hints.d.ts +13 -0
- package/dist/asn-inlay-hints.d.ts.map +1 -0
- package/dist/asn-inlay-hints.js +47 -0
- package/dist/asn-inlay-hints.js.map +1 -0
- package/dist/diagnostic.d.ts.map +1 -1
- package/dist/diagnostic.js +2 -10
- package/dist/diagnostic.js.map +1 -1
- package/dist/document-symbol.js +1 -1
- package/dist/document-symbol.js.map +1 -1
- package/dist/hover-context.d.ts +31 -0
- package/dist/hover-context.d.ts.map +1 -0
- package/dist/hover-context.js +125 -0
- package/dist/hover-context.js.map +1 -0
- package/dist/hover-docs/00-base.yaml +5 -0
- package/dist/hover-docs/10-global-options.yaml +442 -0
- package/dist/hover-docs/20-filter-language.yaml +209 -0
- package/dist/hover-docs/30-channel-options.yaml +244 -0
- package/dist/hover-docs/40-protocol-common.yaml +59 -0
- package/dist/hover-docs/41-protocol-igp.yaml +305 -0
- package/dist/hover-docs/42-protocol-kernel-static.yaml +220 -0
- package/dist/hover-docs/43-protocol-mpls.yaml +40 -0
- package/dist/hover-docs/44-protocol-extended.yaml +635 -0
- package/dist/hover-docs/50-protocol-bgp.yaml +482 -0
- package/dist/hover-docs/60-protocol-ospf.yaml +527 -0
- package/dist/hover-docs.d.ts +5 -1
- package/dist/hover-docs.d.ts.map +1 -1
- package/dist/hover-docs.js +376 -51
- package/dist/hover-docs.js.map +1 -1
- package/dist/hover-usage/00-base.yaml +2 -0
- package/dist/hover-usage/10-global-usage.yaml +73 -0
- package/dist/hover-usage/20-filter-usage.yaml +41 -0
- package/dist/hover-usage/30-channel-usage.yaml +41 -0
- package/dist/hover-usage/40-protocol-usage.yaml +258 -0
- package/dist/hover-usage/50-bgp-usage.yaml +254 -0
- package/dist/hover-usage/60-ospf-usage.yaml +340 -0
- package/dist/hover.d.ts +10 -0
- package/dist/hover.d.ts.map +1 -1
- package/dist/hover.js +152 -46
- package/dist/hover.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/init/workspace-init.d.ts +28 -0
- package/dist/init/workspace-init.d.ts.map +1 -0
- package/dist/init/workspace-init.js +72 -0
- package/dist/init/workspace-init.js.map +1 -0
- package/dist/lsp-server.d.ts +7 -1
- package/dist/lsp-server.d.ts.map +1 -1
- package/dist/lsp-server.js +277 -65
- package/dist/lsp-server.js.map +1 -1
- package/dist/project-config.d.ts +22 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +307 -0
- package/dist/project-config.js.map +1 -0
- package/dist/shared.d.ts +1 -0
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +4 -24
- package/dist/shared.js.map +1 -1
- package/dist/symbol-utils.d.ts +6 -6
- package/dist/symbol-utils.d.ts.map +1 -1
- package/dist/symbol-utils.js +24 -25
- package/dist/symbol-utils.js.map +1 -1
- package/dist/type-hint-inlay.d.ts +4 -0
- package/dist/type-hint-inlay.d.ts.map +1 -0
- package/dist/type-hint-inlay.js +27 -0
- package/dist/type-hint-inlay.js.map +1 -0
- package/dist/utils.d.ts +65 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +97 -0
- package/dist/utils.js.map +1 -0
- package/package.json +11 -7
- package/dist/hover-docs.yaml +0 -600
package/dist/hover-docs.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { parse } from "yaml";
|
|
5
|
+
import { toCanonicalKey } from "./utils.js";
|
|
6
|
+
const HOVER_MARKDOWN_CACHE_LIMIT = 2048;
|
|
7
|
+
const hoverMarkdownCache = new Map();
|
|
5
8
|
const normalizeAnchor = (value) => {
|
|
6
9
|
if (typeof value !== "string") {
|
|
7
10
|
return undefined;
|
|
@@ -9,27 +12,219 @@ const normalizeAnchor = (value) => {
|
|
|
9
12
|
const normalized = value.trim().replace(/^#/, "");
|
|
10
13
|
return normalized.length > 0 ? normalized : undefined;
|
|
11
14
|
};
|
|
15
|
+
const normalizePathSegments = (value) => value
|
|
16
|
+
.trim()
|
|
17
|
+
.toLowerCase()
|
|
18
|
+
.split(/[./]/)
|
|
19
|
+
.map((segment) => segment.trim())
|
|
20
|
+
.filter((segment) => segment.length > 0);
|
|
21
|
+
const toNormalizedPaths = (value) => {
|
|
22
|
+
if (!value) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
if (typeof value === "string") {
|
|
26
|
+
const normalized = normalizePathSegments(value);
|
|
27
|
+
return normalized.length > 0 ? [normalized] : [];
|
|
28
|
+
}
|
|
29
|
+
return value
|
|
30
|
+
.map((item) => normalizePathSegments(item))
|
|
31
|
+
.filter((segments) => segments.length > 0);
|
|
32
|
+
};
|
|
33
|
+
const resolveDataDir = (directoryName) => {
|
|
34
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const candidates = [
|
|
36
|
+
path.join(currentDir, directoryName),
|
|
37
|
+
path.resolve(currentDir, "..", "data", directoryName),
|
|
38
|
+
];
|
|
39
|
+
const resolved = candidates.find((candidate) => existsSync(candidate));
|
|
40
|
+
if (!resolved) {
|
|
41
|
+
throw new Error(`${directoryName} directory not found`);
|
|
42
|
+
}
|
|
43
|
+
return resolved;
|
|
44
|
+
};
|
|
12
45
|
const loadHoverDocYaml = () => {
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
46
|
+
const hoverDocsDir = resolveDataDir("hover-docs");
|
|
47
|
+
const fileNames = readdirSync(hoverDocsDir)
|
|
48
|
+
.filter((fileName) => fileName.endsWith(".yaml"))
|
|
49
|
+
.sort((left, right) => left.localeCompare(right));
|
|
50
|
+
if (fileNames.length === 0) {
|
|
51
|
+
throw new Error("Hover docs directory is empty");
|
|
52
|
+
}
|
|
53
|
+
let version = 1;
|
|
54
|
+
let v2BaseUrl;
|
|
55
|
+
let v3BaseUrl;
|
|
56
|
+
const entries = [];
|
|
57
|
+
for (const fileName of fileNames) {
|
|
58
|
+
const filePath = path.join(hoverDocsDir, fileName);
|
|
59
|
+
const raw = readFileSync(filePath, "utf8");
|
|
60
|
+
const parsed = parse(raw);
|
|
61
|
+
if (!parsed || typeof parsed !== "object") {
|
|
62
|
+
throw new Error(`Invalid hover docs yaml fragment: ${fileName}`);
|
|
63
|
+
}
|
|
64
|
+
if (typeof parsed.version === "number") {
|
|
65
|
+
version = parsed.version;
|
|
66
|
+
}
|
|
67
|
+
if (parsed.baseUrls?.v2) {
|
|
68
|
+
v2BaseUrl = parsed.baseUrls.v2;
|
|
69
|
+
}
|
|
70
|
+
if (parsed.baseUrls?.v3) {
|
|
71
|
+
v3BaseUrl = parsed.baseUrls.v3;
|
|
72
|
+
}
|
|
73
|
+
if (parsed.entries !== undefined && !Array.isArray(parsed.entries)) {
|
|
74
|
+
throw new Error(`Invalid entries in hover docs yaml fragment: ${fileName}`);
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(parsed.entries)) {
|
|
77
|
+
entries.push(...parsed.entries);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!v2BaseUrl || !v3BaseUrl) {
|
|
81
|
+
throw new Error("Missing baseUrls.v2 or baseUrls.v3 in hover docs yaml");
|
|
82
|
+
}
|
|
83
|
+
if (entries.length === 0) {
|
|
84
|
+
throw new Error("No hover docs entries found");
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
version,
|
|
88
|
+
baseUrls: {
|
|
89
|
+
v2: v2BaseUrl,
|
|
90
|
+
v3: v3BaseUrl,
|
|
91
|
+
},
|
|
92
|
+
entries,
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
const loadHoverUsageEntries = () => {
|
|
96
|
+
const hoverUsageDir = resolveDataDir("hover-usage");
|
|
97
|
+
const fileNames = readdirSync(hoverUsageDir)
|
|
98
|
+
.filter((fileName) => fileName.endsWith(".yaml"))
|
|
99
|
+
.sort((left, right) => left.localeCompare(right));
|
|
100
|
+
if (fileNames.length === 0) {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
const usageEntries = [];
|
|
104
|
+
for (const fileName of fileNames) {
|
|
105
|
+
const filePath = path.join(hoverUsageDir, fileName);
|
|
106
|
+
const raw = readFileSync(filePath, "utf8");
|
|
107
|
+
const parsed = parse(raw);
|
|
108
|
+
if (!parsed || typeof parsed !== "object") {
|
|
109
|
+
throw new Error(`Invalid hover usage yaml fragment: ${fileName}`);
|
|
110
|
+
}
|
|
111
|
+
if (parsed.entries !== undefined && !Array.isArray(parsed.entries)) {
|
|
112
|
+
throw new Error(`Invalid entries in hover usage yaml fragment: ${fileName}`);
|
|
113
|
+
}
|
|
114
|
+
for (const entry of parsed.entries ?? []) {
|
|
115
|
+
if (!entry ||
|
|
116
|
+
typeof entry.keyword !== "string" ||
|
|
117
|
+
typeof entry.usage !== "string") {
|
|
118
|
+
throw new Error(`Invalid usage entry in fragment: ${fileName}`);
|
|
119
|
+
}
|
|
120
|
+
const keyword = toCanonicalKey(entry.keyword);
|
|
121
|
+
const usage = entry.usage.trim();
|
|
122
|
+
if (keyword.length === 0 || usage.length === 0) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
usageEntries.push({
|
|
126
|
+
keyword,
|
|
127
|
+
usage,
|
|
128
|
+
normalizedPaths: toNormalizedPaths(entry.path),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
18
131
|
}
|
|
19
|
-
return
|
|
132
|
+
return usageEntries;
|
|
20
133
|
};
|
|
21
134
|
const isDiffType = (value) => value === "same" ||
|
|
22
135
|
value === "added" ||
|
|
23
136
|
value === "modified" ||
|
|
24
137
|
value === "removed";
|
|
25
138
|
const isVersionTag = (value) => value === "v2+" || value === "v3+" || value === "v2" || value === "v2-v3";
|
|
139
|
+
const isPrefixPath = (pathSegments, contextSegments) => {
|
|
140
|
+
if (pathSegments.length === 0 ||
|
|
141
|
+
pathSegments.length > contextSegments.length) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
for (let index = 0; index < pathSegments.length; index += 1) {
|
|
145
|
+
if (pathSegments[index] !== contextSegments[index]) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
};
|
|
151
|
+
const isSubsequencePath = (pathSegments, contextSegments) => {
|
|
152
|
+
if (pathSegments.length === 0 ||
|
|
153
|
+
pathSegments.length > contextSegments.length) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
let contextIndex = 0;
|
|
157
|
+
for (const segment of pathSegments) {
|
|
158
|
+
while (contextIndex < contextSegments.length &&
|
|
159
|
+
contextSegments[contextIndex] !== segment) {
|
|
160
|
+
contextIndex += 1;
|
|
161
|
+
}
|
|
162
|
+
if (contextIndex >= contextSegments.length) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
contextIndex += 1;
|
|
166
|
+
}
|
|
167
|
+
return true;
|
|
168
|
+
};
|
|
169
|
+
const scorePathMatch = (normalizedPaths, contextPath) => {
|
|
170
|
+
if (!contextPath || contextPath.length === 0) {
|
|
171
|
+
return normalizedPaths.length === 0 ? 0 : -1;
|
|
172
|
+
}
|
|
173
|
+
if (normalizedPaths.length === 0) {
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
const normalizedContext = contextPath.map((segment) => segment.toLowerCase());
|
|
177
|
+
let bestScore = -1;
|
|
178
|
+
for (const pathSegments of normalizedPaths) {
|
|
179
|
+
if (isPrefixPath(pathSegments, normalizedContext)) {
|
|
180
|
+
bestScore = Math.max(bestScore, pathSegments.length * 10);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (isSubsequencePath(pathSegments, normalizedContext)) {
|
|
184
|
+
bestScore = Math.max(bestScore, pathSegments.length * 5);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return bestScore;
|
|
188
|
+
};
|
|
189
|
+
const resolveDefaultUsage = (entries) => {
|
|
190
|
+
if (entries.length === 0) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
const genericEntry = entries.find((entry) => entry.normalizedPaths.length === 0);
|
|
194
|
+
if (genericEntry) {
|
|
195
|
+
return genericEntry.usage;
|
|
196
|
+
}
|
|
197
|
+
return entries[0]?.usage;
|
|
198
|
+
};
|
|
199
|
+
const resolveUsageForContext = (entries, contextPath) => {
|
|
200
|
+
if (entries.length === 0) {
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
let selectedUsage;
|
|
204
|
+
let selectedScore = Number.NEGATIVE_INFINITY;
|
|
205
|
+
for (const entry of entries) {
|
|
206
|
+
const score = scorePathMatch(entry.normalizedPaths, contextPath);
|
|
207
|
+
if (score > selectedScore) {
|
|
208
|
+
selectedUsage = entry.usage;
|
|
209
|
+
selectedScore = score;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return selectedUsage ?? entries[0]?.usage;
|
|
213
|
+
};
|
|
26
214
|
const hoverDocSource = loadHoverDocYaml();
|
|
215
|
+
const hoverUsageEntries = loadHoverUsageEntries();
|
|
216
|
+
const hoverUsageByKeyword = new Map();
|
|
217
|
+
for (const usageEntry of hoverUsageEntries) {
|
|
218
|
+
const existing = hoverUsageByKeyword.get(usageEntry.keyword) ?? [];
|
|
219
|
+
existing.push(usageEntry);
|
|
220
|
+
hoverUsageByKeyword.set(usageEntry.keyword, existing);
|
|
221
|
+
}
|
|
27
222
|
const VERSION_BASE_URLS = {
|
|
28
223
|
v2: hoverDocSource.baseUrls.v2,
|
|
29
224
|
v3: hoverDocSource.baseUrls.v3,
|
|
30
225
|
};
|
|
31
226
|
const toCanonicalEntry = (entry) => {
|
|
32
|
-
const keyword = entry.keyword
|
|
227
|
+
const keyword = toCanonicalKey(entry.keyword);
|
|
33
228
|
if (keyword.length === 0) {
|
|
34
229
|
throw new Error("Hover keyword must not be empty");
|
|
35
230
|
}
|
|
@@ -61,23 +256,36 @@ const toCanonicalEntry = (entry) => {
|
|
|
61
256
|
(!anchors || Object.keys(anchors).length === 0)) {
|
|
62
257
|
throw new Error(`Keyword '${keyword}' requires anchor or anchors for version 'v2-v3'`);
|
|
63
258
|
}
|
|
259
|
+
const usageCandidates = hoverUsageByKeyword.get(keyword) ?? [];
|
|
64
260
|
return {
|
|
65
261
|
...entry,
|
|
66
262
|
keyword,
|
|
263
|
+
usage: entry.usage ?? resolveDefaultUsage(usageCandidates),
|
|
67
264
|
anchor,
|
|
68
265
|
anchors,
|
|
266
|
+
normalizedPaths: toNormalizedPaths(entry.path),
|
|
267
|
+
usageCandidates,
|
|
69
268
|
};
|
|
70
269
|
};
|
|
71
270
|
const normalizedEntries = hoverDocSource.entries.map(toCanonicalEntry);
|
|
72
|
-
const
|
|
73
|
-
const seenKeywords = new Set();
|
|
271
|
+
const entriesByKeyword = new Map();
|
|
74
272
|
for (const entry of normalizedEntries) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
seenKeywords.add(entry.keyword);
|
|
79
|
-
dedupedEntries.push(entry);
|
|
273
|
+
const existing = entriesByKeyword.get(entry.keyword) ?? [];
|
|
274
|
+
existing.push(entry);
|
|
275
|
+
entriesByKeyword.set(entry.keyword, existing);
|
|
80
276
|
}
|
|
277
|
+
const selectEntryForContext = (entries, contextPath) => {
|
|
278
|
+
let selected;
|
|
279
|
+
let selectedScore = Number.NEGATIVE_INFINITY;
|
|
280
|
+
for (const entry of entries) {
|
|
281
|
+
const score = scorePathMatch(entry.normalizedPaths, contextPath);
|
|
282
|
+
if (score > selectedScore) {
|
|
283
|
+
selected = entry;
|
|
284
|
+
selectedScore = score;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return selected;
|
|
288
|
+
};
|
|
81
289
|
const buildDocUrl = (version, anchor) => {
|
|
82
290
|
const baseUrl = VERSION_BASE_URLS[version];
|
|
83
291
|
if (!anchor || anchor.length === 0) {
|
|
@@ -86,56 +294,173 @@ const buildDocUrl = (version, anchor) => {
|
|
|
86
294
|
return `${baseUrl}#${anchor}`;
|
|
87
295
|
};
|
|
88
296
|
const buildDocsSection = (entry) => {
|
|
89
|
-
const lines = [];
|
|
90
297
|
if (entry.version === "v2+") {
|
|
91
|
-
|
|
298
|
+
return `Reference: [BIRD User's Guide](${buildDocUrl("v2", entry.anchor)})`;
|
|
92
299
|
}
|
|
93
|
-
|
|
94
|
-
|
|
300
|
+
if (entry.version === "v3+") {
|
|
301
|
+
return `Reference: [BIRD v3 User's Guide](${buildDocUrl("v3", entry.anchor)})`;
|
|
95
302
|
}
|
|
96
|
-
|
|
97
|
-
|
|
303
|
+
if (entry.version === "v2") {
|
|
304
|
+
return `Reference: [BIRD v2 User's Guide](${buildDocUrl("v2", entry.anchor)})`;
|
|
98
305
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
306
|
+
// v2-v3: separate anchors
|
|
307
|
+
const v2Anchor = entry.anchors?.v2 ?? entry.anchor;
|
|
308
|
+
const v3Anchor = entry.anchors?.v3 ?? entry.anchor;
|
|
309
|
+
const links = [];
|
|
310
|
+
if (v2Anchor) {
|
|
311
|
+
links.push(`[BIRD v2 User's Guide](${buildDocUrl("v2", v2Anchor)})`);
|
|
312
|
+
}
|
|
313
|
+
if (v3Anchor) {
|
|
314
|
+
links.push(`[BIRD v3 User's Guide](${buildDocUrl("v3", v3Anchor)})`);
|
|
108
315
|
}
|
|
109
|
-
return
|
|
316
|
+
return links.length > 0 ? `Reference: ${links.join(" | ")}` : "";
|
|
110
317
|
};
|
|
111
318
|
const buildNotesSection = (entry) => {
|
|
112
319
|
if (!entry.notes) {
|
|
113
320
|
return "";
|
|
114
321
|
}
|
|
115
|
-
const
|
|
322
|
+
const parts = [];
|
|
116
323
|
if (entry.notes.v2) {
|
|
117
|
-
|
|
324
|
+
parts.push(`v2: ${entry.notes.v2}`);
|
|
118
325
|
}
|
|
119
326
|
if (entry.notes.v3) {
|
|
120
|
-
|
|
327
|
+
parts.push(`v3: ${entry.notes.v3}`);
|
|
121
328
|
}
|
|
122
|
-
|
|
329
|
+
return parts.length > 0 ? `\n\n> **Note:** ${parts.join(" \u00b7 ")}` : "";
|
|
330
|
+
};
|
|
331
|
+
const buildContextSection = (entry) => {
|
|
332
|
+
if (!entry.path) {
|
|
333
|
+
return "";
|
|
334
|
+
}
|
|
335
|
+
const paths = Array.isArray(entry.path) ? entry.path : [entry.path];
|
|
336
|
+
if (paths.length === 0) {
|
|
337
|
+
return "";
|
|
338
|
+
}
|
|
339
|
+
return `**Context:** ${paths.map((item) => `\`${item}\``).join(", ")}`;
|
|
340
|
+
};
|
|
341
|
+
const buildRelatedSection = (entry) => {
|
|
342
|
+
if (!entry.related || entry.related.length === 0) {
|
|
123
343
|
return "";
|
|
124
344
|
}
|
|
125
|
-
return
|
|
126
|
-
};
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
345
|
+
return `**Related:** ${entry.related.map((item) => `\`${item}\``).join(", ")}`;
|
|
346
|
+
};
|
|
347
|
+
const buildParametersSection = (entry) => {
|
|
348
|
+
if (!entry.parameters || entry.parameters.length === 0) {
|
|
349
|
+
return "";
|
|
350
|
+
}
|
|
351
|
+
const header = "\n| Parameter | | Description |\n|:---|:---|:---|";
|
|
352
|
+
const rows = entry.parameters.map((parameter) => {
|
|
353
|
+
const requiredLabel = parameter.required ? "required" : "optional";
|
|
354
|
+
return `| \`${parameter.name}\` | *${requiredLabel}* | ${parameter.description} |`;
|
|
355
|
+
});
|
|
356
|
+
return `${header}\n${rows.join("\n")}`;
|
|
357
|
+
};
|
|
358
|
+
const DIFF_LABELS = {
|
|
359
|
+
same: "Behaves identically to BIRD2",
|
|
360
|
+
added: "Introduced in BIRD3",
|
|
361
|
+
modified: "Behavior revised from BIRD2",
|
|
362
|
+
removed: "Deprecated since BIRD3",
|
|
363
|
+
};
|
|
364
|
+
const DIFF_ICONS = {
|
|
365
|
+
same: "\uD83D\uDFE2 \u2714", // 🟢 ✔
|
|
366
|
+
added: "\uD83D\uDD35 \u2795", // 🔵 ➕
|
|
367
|
+
modified: "\uD83D\uDFE0 \u270E", // 🟠 ✎
|
|
368
|
+
removed: "\uD83D\uDD34 \u2716", // 🔴 ✖
|
|
369
|
+
};
|
|
370
|
+
/**
|
|
371
|
+
* Build a complete, self-contained hover markdown document for a keyword entry.
|
|
372
|
+
* The output intentionally includes the keyword heading so callers can render
|
|
373
|
+
* the result directly without prepending extra titles.
|
|
374
|
+
*/
|
|
375
|
+
const toHoverMarkdown = (entry, usage) => {
|
|
376
|
+
const sections = [];
|
|
377
|
+
// ── Title ──────────────────────────────────────────────────────────────
|
|
378
|
+
sections.push(`## \`${entry.keyword}\`\n`);
|
|
379
|
+
sections.push(`> ${entry.description}\n`);
|
|
380
|
+
sections.push(entry.detail);
|
|
381
|
+
// ── Separator ──────────────────────────────────────────────────────────
|
|
382
|
+
sections.push("\n---\n");
|
|
383
|
+
// ── Metadata ───────────────────────────────────────────────────────────
|
|
384
|
+
const diffIcon = DIFF_ICONS[entry.diff];
|
|
385
|
+
const diffLabel = DIFF_LABELS[entry.diff];
|
|
386
|
+
sections.push(`${diffIcon} *${diffLabel}*\u2002\u00b7\u2002Version \`${entry.version}\`\n`);
|
|
387
|
+
sections.push(buildDocsSection(entry));
|
|
388
|
+
// ── Usage ──────────────────────────────────────────────────────────────
|
|
389
|
+
if (usage) {
|
|
390
|
+
sections.push(`\n\`\`\`bird\n${usage}\n\`\`\``);
|
|
391
|
+
}
|
|
392
|
+
// ── Parameters (table for wider hover) ─────────────────────────────────
|
|
393
|
+
const parametersSection = buildParametersSection(entry);
|
|
394
|
+
if (parametersSection) {
|
|
395
|
+
sections.push(parametersSection);
|
|
396
|
+
}
|
|
397
|
+
// ── Footer: context, related, notes ────────────────────────────────────
|
|
398
|
+
const footerParts = [];
|
|
399
|
+
const contextSection = buildContextSection(entry);
|
|
400
|
+
if (contextSection) {
|
|
401
|
+
footerParts.push(contextSection);
|
|
402
|
+
}
|
|
403
|
+
const relatedSection = buildRelatedSection(entry);
|
|
404
|
+
if (relatedSection) {
|
|
405
|
+
footerParts.push(relatedSection);
|
|
406
|
+
}
|
|
407
|
+
if (footerParts.length > 0) {
|
|
408
|
+
sections.push(`\n${footerParts.join("\u2002\u00b7\u2002")}`);
|
|
409
|
+
}
|
|
410
|
+
const notesSection = buildNotesSection(entry);
|
|
411
|
+
if (notesSection) {
|
|
412
|
+
sections.push(notesSection);
|
|
413
|
+
}
|
|
414
|
+
return sections.join("\n");
|
|
415
|
+
};
|
|
416
|
+
const toContextCacheKey = (contextPath) => contextPath && contextPath.length > 0
|
|
417
|
+
? contextPath.map((segment) => segment.toLowerCase()).join(".")
|
|
418
|
+
: "";
|
|
419
|
+
const setCachedMarkdown = (cacheKey, markdown) => {
|
|
420
|
+
if (hoverMarkdownCache.has(cacheKey)) {
|
|
421
|
+
hoverMarkdownCache.delete(cacheKey);
|
|
422
|
+
}
|
|
423
|
+
hoverMarkdownCache.set(cacheKey, markdown);
|
|
424
|
+
if (hoverMarkdownCache.size > HOVER_MARKDOWN_CACHE_LIMIT) {
|
|
425
|
+
const oldestKey = hoverMarkdownCache.keys().next().value;
|
|
426
|
+
if (oldestKey) {
|
|
427
|
+
hoverMarkdownCache.delete(oldestKey);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
};
|
|
431
|
+
export const resolveHoverKeywordDoc = (keyword, options) => {
|
|
432
|
+
const canonicalKey = toCanonicalKey(keyword);
|
|
433
|
+
if (canonicalKey.length === 0) {
|
|
434
|
+
return undefined;
|
|
435
|
+
}
|
|
436
|
+
const contextCacheKey = toContextCacheKey(options?.contextPath);
|
|
437
|
+
const cacheKey = `${canonicalKey}::${contextCacheKey}`;
|
|
438
|
+
const cachedMarkdown = hoverMarkdownCache.get(cacheKey);
|
|
439
|
+
if (cachedMarkdown !== undefined) {
|
|
440
|
+
return cachedMarkdown;
|
|
441
|
+
}
|
|
442
|
+
const entries = entriesByKeyword.get(canonicalKey);
|
|
443
|
+
if (!entries || entries.length === 0) {
|
|
444
|
+
return undefined;
|
|
445
|
+
}
|
|
446
|
+
const entry = selectEntryForContext(entries, options?.contextPath);
|
|
447
|
+
if (!entry) {
|
|
448
|
+
return undefined;
|
|
449
|
+
}
|
|
450
|
+
const usage = resolveUsageForContext(entry.usageCandidates, options?.contextPath) ??
|
|
451
|
+
entry.usage;
|
|
452
|
+
const markdown = toHoverMarkdown(entry, usage);
|
|
453
|
+
setCachedMarkdown(cacheKey, markdown);
|
|
454
|
+
return markdown;
|
|
455
|
+
};
|
|
456
|
+
export const HOVER_KEYWORDS = Object.freeze([
|
|
457
|
+
...entriesByKeyword.keys(),
|
|
458
|
+
]);
|
|
459
|
+
export const HOVER_KEYWORD_DOCS = Object.fromEntries(HOVER_KEYWORDS.flatMap((keyword) => {
|
|
460
|
+
const markdown = resolveHoverKeywordDoc(keyword);
|
|
461
|
+
if (!markdown) {
|
|
462
|
+
return [];
|
|
463
|
+
}
|
|
464
|
+
return [[keyword, markdown]];
|
|
465
|
+
}));
|
|
141
466
|
//# sourceMappingURL=hover-docs.js.map
|
package/dist/hover-docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover-docs.js","sourceRoot":"","sources":["../src/hover-docs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hover-docs.js","sourceRoot":"","sources":["../src/hover-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- keyword: attribute
|
|
3
|
+
usage: attribute int my_tag;
|
|
4
|
+
- keyword: define
|
|
5
|
+
usage: define LOCAL_AS = 65001;
|
|
6
|
+
- keyword: eval
|
|
7
|
+
usage: eval 1 + 1;
|
|
8
|
+
- keyword: filter
|
|
9
|
+
usage: |
|
|
10
|
+
filter only_bgp {
|
|
11
|
+
if source = RTS_BGP then accept;
|
|
12
|
+
reject;
|
|
13
|
+
}
|
|
14
|
+
- keyword: function
|
|
15
|
+
usage: |
|
|
16
|
+
function set_pref(int base) -> int {
|
|
17
|
+
return base + 100;
|
|
18
|
+
}
|
|
19
|
+
- keyword: include
|
|
20
|
+
usage: include "/etc/bird/conf.d/*.conf";
|
|
21
|
+
- keyword: log
|
|
22
|
+
usage: log syslog all;
|
|
23
|
+
- keyword: mrtdump
|
|
24
|
+
usage: mrtdump "/var/log/bird.mrt";
|
|
25
|
+
- keyword: protocol
|
|
26
|
+
usage: protocol device {}
|
|
27
|
+
- keyword: router id
|
|
28
|
+
usage: router id 10.0.0.1;
|
|
29
|
+
- keyword: router id from
|
|
30
|
+
usage: router id from "lo";
|
|
31
|
+
- keyword: sorted
|
|
32
|
+
usage: table master4 sorted;
|
|
33
|
+
- keyword: table
|
|
34
|
+
usage: table master4;
|
|
35
|
+
- keyword: template
|
|
36
|
+
usage: |
|
|
37
|
+
template bgp IBGP_BASE {
|
|
38
|
+
local as 65001;
|
|
39
|
+
}
|
|
40
|
+
- keyword: thread group
|
|
41
|
+
usage: thread group worker { threads 4; max latency 200 ms; };
|
|
42
|
+
- keyword: max latency
|
|
43
|
+
usage: max latency 200 ms;
|
|
44
|
+
- keyword: cork threshold
|
|
45
|
+
usage: cork threshold 50000;
|
|
46
|
+
- keyword: debug
|
|
47
|
+
usage: debug protocols { states, routes };
|
|
48
|
+
- keyword: debug latency
|
|
49
|
+
usage: debug latency { scheduling, timers };
|
|
50
|
+
- keyword: debug tables
|
|
51
|
+
usage: debug tables on;
|
|
52
|
+
- keyword: graceful restart wait
|
|
53
|
+
usage: graceful restart wait 240;
|
|
54
|
+
- keyword: hostname
|
|
55
|
+
usage: hostname "router-edge-01";
|
|
56
|
+
- keyword: threads
|
|
57
|
+
usage: threads 4;
|
|
58
|
+
- keyword: timeformat
|
|
59
|
+
usage: timeformat base "%F %T";
|
|
60
|
+
- keyword: trie
|
|
61
|
+
usage: trie on;
|
|
62
|
+
- keyword: watchdog warning
|
|
63
|
+
usage: watchdog warning 5 s;
|
|
64
|
+
- keyword: max settle time
|
|
65
|
+
usage: max settle time 30;
|
|
66
|
+
- keyword: min settle time
|
|
67
|
+
usage: min settle time 1;
|
|
68
|
+
- keyword: gc period
|
|
69
|
+
usage: gc period 60;
|
|
70
|
+
- keyword: gc threshold
|
|
71
|
+
usage: gc threshold 1000;
|
|
72
|
+
- keyword: export settle time
|
|
73
|
+
usage: export settle time 100 ms;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
entries:
|
|
2
|
+
- keyword: .asn
|
|
3
|
+
usage: if bgp_path.last.asn = 65001 then accept;
|
|
4
|
+
- keyword: .data
|
|
5
|
+
usage: if pair_value.data = 100 then accept;
|
|
6
|
+
- keyword: .ip
|
|
7
|
+
usage: if net.ip = 192.0.2.0 then accept;
|
|
8
|
+
- keyword: .len
|
|
9
|
+
usage: if net.len = 24 then accept;
|
|
10
|
+
- keyword: .mask
|
|
11
|
+
usage: if net.mask = 255.255.255.0 then accept;
|
|
12
|
+
- keyword: accept
|
|
13
|
+
usage: accept;
|
|
14
|
+
- keyword: reject
|
|
15
|
+
usage: reject;
|
|
16
|
+
- keyword: return
|
|
17
|
+
usage: return true;
|
|
18
|
+
- keyword: if
|
|
19
|
+
usage: if net ~ [10.0.0.0/8+] then accept;
|
|
20
|
+
- keyword: then
|
|
21
|
+
usage: if roa_check(roa4, net, bgp_path.last) = ROA_VALID then accept;
|
|
22
|
+
- keyword: else
|
|
23
|
+
usage: if source = RTS_STATIC then accept; else reject;
|
|
24
|
+
- keyword: case
|
|
25
|
+
usage: |
|
|
26
|
+
case source {
|
|
27
|
+
RTS_BGP: accept;
|
|
28
|
+
else: reject;
|
|
29
|
+
}
|
|
30
|
+
- keyword: defined
|
|
31
|
+
usage: if defined(bgp_next_hop) then accept;
|
|
32
|
+
- keyword: print
|
|
33
|
+
usage: print "reject route ", net;
|
|
34
|
+
- keyword: int
|
|
35
|
+
usage: int med;
|
|
36
|
+
- keyword: ip
|
|
37
|
+
usage: ip next_hop;
|
|
38
|
+
- keyword: prefix
|
|
39
|
+
usage: prefix allowed_net;
|
|
40
|
+
- keyword: string
|
|
41
|
+
usage: string policy_name;
|