@refrakt-md/language-server 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/language-server",
3
3
  "description": "Language server for refrakt.md rune authoring",
4
- "version": "0.5.0",
4
+ "version": "0.6.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -26,8 +26,8 @@
26
26
  "build": "tsc"
27
27
  },
28
28
  "dependencies": {
29
- "@refrakt-md/runes": "0.5.0",
30
- "@refrakt-md/transform": "0.5.0",
29
+ "@refrakt-md/runes": "0.6.0",
30
+ "@refrakt-md/transform": "0.6.0",
31
31
  "@markdoc/markdoc": "0.4.0",
32
32
  "reflect-metadata": "^0.2.0",
33
33
  "vscode-languageserver": "^9.0.1",
@@ -1,36 +0,0 @@
1
- /**
2
- * Regex-based document context parser.
3
- * Scans backward from cursor position to determine what context we're in
4
- * (tag name, attribute name, attribute value, closing tag).
5
- *
6
- * We use regex rather than Markdoc.parse() because the AST parser fails
7
- * on incomplete/mid-typing tags.
8
- */
9
- export interface TagContext {
10
- /** The tag name typed so far (may be partial) */
11
- tagName: string;
12
- /** Whether this is a closing tag ({% / ... %}) */
13
- isClosing: boolean;
14
- /** Attribute context if cursor is in attribute position */
15
- attribute?: {
16
- /** Attribute name (may be partial if we're still typing the name) */
17
- name: string;
18
- /** Whether cursor is inside the value (after =") */
19
- inValue: boolean;
20
- /** The partial value typed so far (only when inValue=true) */
21
- valuePrefix: string;
22
- };
23
- /** Names of attributes already present on this tag */
24
- existingAttributes: string[];
25
- }
26
- /**
27
- * Analyze the text before the cursor to determine the tag context.
28
- * Returns undefined if the cursor is not inside a rune tag.
29
- */
30
- export declare function getTagContext(textBeforeCursor: string): TagContext | undefined;
31
- /**
32
- * Find unclosed rune tags before the cursor for closing tag completion.
33
- * Returns tag names of unclosed tags in order (outermost first).
34
- */
35
- export declare function findUnclosedTags(textBeforeCursor: string): string[];
36
- //# sourceMappingURL=document.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/parser/document.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;IACnB,2DAA2D;IAC3D,SAAS,CAAC,EAAE;QACV,qEAAqE;QACrE,IAAI,EAAE,MAAM,CAAC;QACb,oDAAoD;QACpD,OAAO,EAAE,OAAO,CAAC;QACjB,8DAA8D;QAC9D,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CA+F9E;AA+BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBnE"}
@@ -1,152 +0,0 @@
1
- /**
2
- * Regex-based document context parser.
3
- * Scans backward from cursor position to determine what context we're in
4
- * (tag name, attribute name, attribute value, closing tag).
5
- *
6
- * We use regex rather than Markdoc.parse() because the AST parser fails
7
- * on incomplete/mid-typing tags.
8
- */
9
- /**
10
- * Analyze the text before the cursor to determine the tag context.
11
- * Returns undefined if the cursor is not inside a rune tag.
12
- */
13
- export function getTagContext(textBeforeCursor) {
14
- // Find the last unclosed {% — scan backward
15
- const lastOpen = findLastUnclosedTag(textBeforeCursor);
16
- if (lastOpen === -1)
17
- return undefined;
18
- const inside = textBeforeCursor.slice(lastOpen);
19
- // Check for closing tag: {% /tagname
20
- const closingMatch = inside.match(/^\{%\s*\/\s*([a-zA-Z][a-zA-Z0-9-]*)?\s*$/);
21
- if (closingMatch) {
22
- return {
23
- tagName: closingMatch[1] ?? '',
24
- isClosing: true,
25
- existingAttributes: [],
26
- };
27
- }
28
- // Opening/self-closing tag: {% tagname ...attributes...
29
- const openMatch = inside.match(/^\{%\s*([a-zA-Z][a-zA-Z0-9-]*)?\s*/);
30
- if (!openMatch)
31
- return undefined;
32
- const tagName = openMatch[1] ?? '';
33
- const afterTag = inside.slice(openMatch[0].length);
34
- // Parse existing attributes and determine cursor position
35
- const existingAttributes = [];
36
- // Match completed attributes: name="value" or name (boolean)
37
- const attrRegex = /([a-zA-Z_][a-zA-Z0-9_-]*)\s*=\s*"[^"]*"/g;
38
- let attrMatch;
39
- while ((attrMatch = attrRegex.exec(afterTag)) !== null) {
40
- existingAttributes.push(attrMatch[1]);
41
- }
42
- // Check if we're currently typing an attribute value
43
- // Pattern: ...name="partialValue (no closing quote)
44
- const valueMatch = afterTag.match(/([a-zA-Z_][a-zA-Z0-9_-]*)\s*=\s*"([^"]*)$/);
45
- if (valueMatch) {
46
- return {
47
- tagName,
48
- isClosing: false,
49
- attribute: {
50
- name: valueMatch[1],
51
- inValue: true,
52
- valuePrefix: valueMatch[2],
53
- },
54
- existingAttributes,
55
- };
56
- }
57
- // Check if we're right after = (about to type value)
58
- const equalsMatch = afterTag.match(/([a-zA-Z_][a-zA-Z0-9_-]*)\s*=\s*$/);
59
- if (equalsMatch) {
60
- return {
61
- tagName,
62
- isClosing: false,
63
- attribute: {
64
- name: equalsMatch[1],
65
- inValue: true,
66
- valuePrefix: '',
67
- },
68
- existingAttributes,
69
- };
70
- }
71
- // Check if we're typing an attribute name
72
- const nameMatch = afterTag.match(/(?:^|\s)([a-zA-Z_][a-zA-Z0-9_-]*)$/);
73
- if (nameMatch) {
74
- return {
75
- tagName,
76
- isClosing: false,
77
- attribute: {
78
- name: nameMatch[1],
79
- inValue: false,
80
- valuePrefix: '',
81
- },
82
- existingAttributes,
83
- };
84
- }
85
- // We're after the tag name with a trailing space — attribute position
86
- if (afterTag.match(/\s$/)) {
87
- return {
88
- tagName,
89
- isClosing: false,
90
- existingAttributes,
91
- };
92
- }
93
- // Just the tag name (possibly partial)
94
- return {
95
- tagName,
96
- isClosing: false,
97
- existingAttributes,
98
- };
99
- }
100
- /**
101
- * Find the position of the last unclosed {% in the text.
102
- * Skips over matched {% ... %} pairs.
103
- */
104
- function findLastUnclosedTag(text) {
105
- // Find all {% and %} positions
106
- const opens = [];
107
- const openRegex = /\{%/g;
108
- let match;
109
- while ((match = openRegex.exec(text)) !== null) {
110
- opens.push(match.index);
111
- }
112
- // For each open from the end, check if it has a matching close after it
113
- for (let i = opens.length - 1; i >= 0; i--) {
114
- const openPos = opens[i];
115
- const afterOpen = text.slice(openPos);
116
- // Check if there's a %} that closes this tag
117
- const closeIdx = afterOpen.indexOf('%}');
118
- if (closeIdx === -1) {
119
- // No matching close — this is our unclosed tag
120
- return openPos;
121
- }
122
- }
123
- return -1;
124
- }
125
- /**
126
- * Find unclosed rune tags before the cursor for closing tag completion.
127
- * Returns tag names of unclosed tags in order (outermost first).
128
- */
129
- export function findUnclosedTags(textBeforeCursor) {
130
- const stack = [];
131
- // Match opening tags: {% tagname ... %} (not self-closing, not closing)
132
- // and closing tags: {% /tagname %}
133
- const tagRegex = /\{%\s*(?:(\/)\s*)?([a-zA-Z][a-zA-Z0-9-]*)[^%]*?(\/)?\s*%\}/g;
134
- let match;
135
- while ((match = tagRegex.exec(textBeforeCursor)) !== null) {
136
- const isClosing = match[1] === '/';
137
- const isSelfClosing = match[3] === '/';
138
- const name = match[2];
139
- if (isClosing) {
140
- // Pop matching tag from stack
141
- const idx = stack.lastIndexOf(name);
142
- if (idx !== -1) {
143
- stack.splice(idx, 1);
144
- }
145
- }
146
- else if (!isSelfClosing) {
147
- stack.push(name);
148
- }
149
- }
150
- return stack;
151
- }
152
- //# sourceMappingURL=document.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/parser/document.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,gBAAwB;IACpD,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IACvD,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAEtC,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEhD,qCAAqC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9E,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE;YAC9B,SAAS,EAAE,IAAI;YACf,kBAAkB,EAAE,EAAE;SACvB,CAAC;IACJ,CAAC;IAED,wDAAwD;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrE,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEnD,0DAA0D;IAC1D,MAAM,kBAAkB,GAAa,EAAE,CAAC;IAExC,6DAA6D;IAC7D,MAAM,SAAS,GAAG,0CAA0C,CAAC;IAC7D,IAAI,SAAS,CAAC;IACd,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,qDAAqD;IACrD,oDAAoD;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/E,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,OAAO;YACP,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;gBACnB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;aAC3B;YACD,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACxE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,OAAO;YACP,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;gBACpB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,EAAE;aAChB;YACD,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACvE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,OAAO;YACP,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE;gBACT,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;gBAClB,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,EAAE;aAChB;YACD,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO;YACP,SAAS,EAAE,KAAK;YAChB,kBAAkB;SACnB,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,OAAO;QACL,OAAO;QACP,SAAS,EAAE,KAAK;QAChB,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,+BAA+B;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,MAAM,CAAC;IACzB,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,wEAAwE;IACxE,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,+CAA+C;YAC/C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,gBAAwB;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,yEAAyE;IACzE,mCAAmC;IACnC,MAAM,QAAQ,GAAG,6DAA6D,CAAC;IAE/E,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QACnC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,SAAS,EAAE,CAAC;YACd,8BAA8B;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,12 +0,0 @@
1
- import Markdoc from '@markdoc/markdoc';
2
- import type { ValidateError } from '@markdoc/markdoc';
3
- /**
4
- * Parse a Markdoc document string into an AST.
5
- */
6
- export declare function parse(content: string): Markdoc.Node;
7
- /**
8
- * Validate a Markdoc AST using the full rune tag/node configuration.
9
- * Returns an array of validation errors.
10
- */
11
- export declare function validate(content: string): ValidateError[];
12
- //# sourceMappingURL=markdoc.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdoc.d.ts","sourceRoot":"","sources":["../../src/parser/markdoc.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,gBAEpC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAMzD"}
@@ -1,20 +0,0 @@
1
- import Markdoc from '@markdoc/markdoc';
2
- import { getMarkdocTags, getMarkdocNodes } from '../registry/loader.js';
3
- /**
4
- * Parse a Markdoc document string into an AST.
5
- */
6
- export function parse(content) {
7
- return Markdoc.parse(content);
8
- }
9
- /**
10
- * Validate a Markdoc AST using the full rune tag/node configuration.
11
- * Returns an array of validation errors.
12
- */
13
- export function validate(content) {
14
- const ast = Markdoc.parse(content);
15
- return Markdoc.validate(ast, {
16
- tags: getMarkdocTags(),
17
- nodes: getMarkdocNodes(),
18
- });
19
- }
20
- //# sourceMappingURL=markdoc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdoc.js","sourceRoot":"","sources":["../../src/parser/markdoc.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExE;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC3B,IAAI,EAAE,cAAc,EAAE;QACtB,KAAK,EAAE,eAAe,EAAE;KACzB,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +0,0 @@
1
- import { CompletionItem, type CompletionParams, type TextDocuments } from 'vscode-languageserver';
2
- import type { TextDocument } from 'vscode-languageserver-textdocument';
3
- export declare function provideCompletion(params: CompletionParams, documents: TextDocuments<TextDocument>): CompletionItem[];
4
- //# sourceMappingURL=completion.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/providers/completion.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAGd,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIvE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,GACrC,cAAc,EAAE,CAiClB"}
@@ -1,200 +0,0 @@
1
- import { CompletionItemKind, InsertTextFormat, } from 'vscode-languageserver';
2
- import { getAllRunes, getRune } from '../registry/loader.js';
3
- import { getTagContext, findUnclosedTags } from '../parser/document.js';
4
- export function provideCompletion(params, documents) {
5
- const document = documents.get(params.textDocument.uri);
6
- if (!document)
7
- return [];
8
- const text = document.getText();
9
- const offset = document.offsetAt(params.position);
10
- const textBefore = text.slice(0, offset);
11
- const ctx = getTagContext(textBefore);
12
- if (!ctx)
13
- return [];
14
- // Closing tag completion: {% /
15
- if (ctx.isClosing) {
16
- return completeClosingTags(textBefore, ctx.tagName);
17
- }
18
- // Attribute value completion: {% hint type="
19
- if (ctx.attribute?.inValue) {
20
- return completeAttributeValues(ctx.tagName, ctx.attribute.name, ctx.attribute.valuePrefix);
21
- }
22
- // Attribute name completion: {% hint | (cursor after space, or partial attribute name)
23
- if (ctx.attribute && !ctx.attribute.inValue) {
24
- return completeAttributeNames(ctx.tagName, ctx.attribute.name, ctx.existingAttributes);
25
- }
26
- // If we have a tag name and trailing space, offer attributes
27
- if (ctx.tagName && textBefore.match(/\{%\s*[a-zA-Z][a-zA-Z0-9-]*\s+$/)) {
28
- return completeAttributeNames(ctx.tagName, '', ctx.existingAttributes);
29
- }
30
- // Tag name completion: {% | or {% partial-name
31
- return completeTagNames(ctx.tagName);
32
- }
33
- function completeTagNames(prefix) {
34
- const items = [];
35
- const seen = new Set();
36
- for (const rune of getAllRunes()) {
37
- // Primary name
38
- if (rune.name.startsWith(prefix) && !seen.has(rune.name)) {
39
- seen.add(rune.name);
40
- const requiredAttrs = Object.entries(rune.attributes)
41
- .filter(([, attr]) => attr.required)
42
- .map(([name]) => name);
43
- let insertText;
44
- let insertFormat;
45
- if (requiredAttrs.length > 0) {
46
- // Build snippet with required attributes
47
- const attrSnippets = requiredAttrs.map((name, i) => {
48
- const attr = rune.attributes[name];
49
- if (attr.matches && Array.isArray(attr.matches)) {
50
- return `${name}="\${${i + 1}|${attr.matches.join(',')}|}"`;
51
- }
52
- return `${name}="\${${i + 1}}"`;
53
- });
54
- insertText = `${rune.name} ${attrSnippets.join(' ')} `;
55
- insertFormat = InsertTextFormat.Snippet;
56
- }
57
- else {
58
- insertText = rune.name;
59
- insertFormat = InsertTextFormat.PlainText;
60
- }
61
- items.push({
62
- label: rune.name,
63
- kind: CompletionItemKind.Class,
64
- detail: rune.description,
65
- documentation: buildRuneDocumentation(rune),
66
- insertText,
67
- insertTextFormat: insertFormat,
68
- sortText: `0_${rune.name}`,
69
- });
70
- }
71
- // Aliases
72
- for (const alias of rune.allNames.slice(1)) {
73
- if (alias.startsWith(prefix) && !seen.has(alias)) {
74
- seen.add(alias);
75
- items.push({
76
- label: alias,
77
- kind: CompletionItemKind.Class,
78
- detail: `Alias for ${rune.name}`,
79
- documentation: buildRuneDocumentation(rune),
80
- insertText: alias,
81
- sortText: `1_${alias}`,
82
- });
83
- }
84
- }
85
- }
86
- return items;
87
- }
88
- function completeAttributeNames(tagName, prefix, existingAttributes) {
89
- const rune = getRune(tagName);
90
- if (!rune)
91
- return [];
92
- const items = [];
93
- const existing = new Set(existingAttributes);
94
- for (const [name, attr] of Object.entries(rune.attributes)) {
95
- if (existing.has(name))
96
- continue;
97
- if (!name.startsWith(prefix))
98
- continue;
99
- let insertText;
100
- let insertFormat;
101
- if (attr.matches && Array.isArray(attr.matches)) {
102
- // Enum attribute — offer choice snippet
103
- insertText = `${name}="\${1|${attr.matches.join(',')}|}"`;
104
- insertFormat = InsertTextFormat.Snippet;
105
- }
106
- else if (attr.type === Boolean) {
107
- // Boolean attribute — no value needed
108
- insertText = name;
109
- insertFormat = InsertTextFormat.PlainText;
110
- }
111
- else {
112
- insertText = `${name}="\$1"`;
113
- insertFormat = InsertTextFormat.Snippet;
114
- }
115
- const detail = buildAttributeDetail(name, attr);
116
- items.push({
117
- label: name,
118
- kind: CompletionItemKind.Property,
119
- detail,
120
- insertText,
121
- insertTextFormat: insertFormat,
122
- sortText: attr.required ? `0_${name}` : `1_${name}`,
123
- });
124
- }
125
- return items;
126
- }
127
- function completeAttributeValues(tagName, attrName, prefix) {
128
- const rune = getRune(tagName);
129
- if (!rune)
130
- return [];
131
- const attr = rune.attributes[attrName];
132
- if (!attr || !attr.matches || !Array.isArray(attr.matches))
133
- return [];
134
- return attr.matches
135
- .filter((v) => v.startsWith(prefix))
136
- .map((value, i) => ({
137
- label: value,
138
- kind: CompletionItemKind.EnumMember,
139
- sortText: String(i).padStart(3, '0'),
140
- }));
141
- }
142
- function completeClosingTags(textBefore, prefix) {
143
- const unclosed = findUnclosedTags(textBefore);
144
- return unclosed
145
- .filter(name => name.startsWith(prefix))
146
- .reverse() // Innermost first (most likely to close)
147
- .map((name, i) => ({
148
- label: name,
149
- kind: CompletionItemKind.Class,
150
- detail: `Close {% ${name} %}`,
151
- sortText: String(i).padStart(3, '0'),
152
- }));
153
- }
154
- function buildRuneDocumentation(rune) {
155
- const parts = [rune.description];
156
- if (Object.keys(rune.reinterprets).length > 0) {
157
- parts.push('');
158
- parts.push('**Reinterprets:**');
159
- for (const [element, meaning] of Object.entries(rune.reinterprets)) {
160
- parts.push(`- ${element} → ${meaning}`);
161
- }
162
- }
163
- if (rune.seoType) {
164
- parts.push('');
165
- parts.push(`**SEO:** ${rune.seoType}`);
166
- }
167
- const attrs = Object.entries(rune.attributes);
168
- if (attrs.length > 0) {
169
- parts.push('');
170
- parts.push('**Attributes:**');
171
- for (const [name, attr] of attrs) {
172
- parts.push(`- \`${name}\`${attr.required ? ' (required)' : ''}: ${formatType(attr)}`);
173
- }
174
- }
175
- return parts.join('\n');
176
- }
177
- function buildAttributeDetail(name, attr) {
178
- const parts = [];
179
- if (attr.required)
180
- parts.push('required');
181
- parts.push(formatType(attr));
182
- if (attr.default !== undefined)
183
- parts.push(`default: ${JSON.stringify(attr.default)}`);
184
- return parts.join(' · ');
185
- }
186
- function formatType(attr) {
187
- if (attr.matches && Array.isArray(attr.matches)) {
188
- return attr.matches.map((v) => `"${v}"`).join(' | ');
189
- }
190
- if (attr.type === String)
191
- return 'string';
192
- if (attr.type === Number)
193
- return 'number';
194
- if (attr.type === Boolean)
195
- return 'boolean';
196
- if (Array.isArray(attr.type))
197
- return 'array';
198
- return 'any';
199
- }
200
- //# sourceMappingURL=completion.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/providers/completion.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { Diagnostic } from 'vscode-languageserver';
2
- import type { TextDocument } from 'vscode-languageserver-textdocument';
3
- export declare function provideDiagnostics(document: TextDocument): Diagnostic[];
4
- //# sourceMappingURL=diagnostics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/providers/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIvE,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAkDd"}
@@ -1,50 +0,0 @@
1
- import { DiagnosticSeverity, } from 'vscode-languageserver';
2
- import { validate } from '../parser/markdoc.js';
3
- import { findSimilar } from '../registry/loader.js';
4
- export function provideDiagnostics(document) {
5
- const text = document.getText();
6
- const errors = validate(text);
7
- return errors.map(error => {
8
- let severity;
9
- switch (error.error.level) {
10
- case 'critical':
11
- severity = DiagnosticSeverity.Error;
12
- break;
13
- case 'error':
14
- severity = DiagnosticSeverity.Error;
15
- break;
16
- case 'warning':
17
- severity = DiagnosticSeverity.Warning;
18
- break;
19
- case 'info':
20
- severity = DiagnosticSeverity.Information;
21
- break;
22
- default:
23
- severity = DiagnosticSeverity.Warning;
24
- }
25
- // Determine line range
26
- const startLine = error.lines?.[0] ?? 0;
27
- const endLine = error.lines?.[error.lines.length - 1] ?? startLine;
28
- let message = error.error.message;
29
- // Enhance "tag-undefined" errors with suggestions
30
- if (error.error.id === 'tag-undefined') {
31
- const tagMatch = message.match(/'([^']+)'/) ?? message.match(/"([^"]+)"/);
32
- if (tagMatch) {
33
- const similar = findSimilar(tagMatch[1], 2);
34
- if (similar.length > 0) {
35
- message += ` Did you mean: ${similar.slice(0, 3).map(s => `'${s}'`).join(', ')}?`;
36
- }
37
- }
38
- }
39
- return {
40
- severity,
41
- range: {
42
- start: { line: startLine, character: 0 },
43
- end: { line: endLine + 1, character: 0 },
44
- },
45
- message,
46
- source: 'refrakt',
47
- };
48
- });
49
- }
50
- //# sourceMappingURL=diagnostics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/providers/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,GAEnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,UAAU,kBAAkB,CAChC,QAAsB;IAEtB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACxB,IAAI,QAA4B,CAAC;QACjC,QAAQ,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,UAAU;gBACb,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC;gBACpC,MAAM;YACR,KAAK,OAAO;gBACV,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC;gBACpC,MAAM;YACR,KAAK,SAAS;gBACZ,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBACtC,MAAM;YACR,KAAK,MAAM;gBACT,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC;gBAC1C,MAAM;YACR;gBACE,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC1C,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;QAEnE,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QAElC,kDAAkD;QAClD,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1E,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,IAAI,kBAAkB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpF,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,KAAK,EAAE;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE;gBACxC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;aACzC;YACD,OAAO;YACP,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,4 +0,0 @@
1
- import { Hover, type HoverParams, type TextDocuments } from 'vscode-languageserver';
2
- import type { TextDocument } from 'vscode-languageserver-textdocument';
3
- export declare function provideHover(params: HoverParams, documents: TextDocuments<TextDocument>): Hover | null;
4
- //# sourceMappingURL=hover.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/providers/hover.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAIvE,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,GACrC,KAAK,GAAG,IAAI,CAYd"}