@elurjs/language-server 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -0
- package/bin/elur-language-server.js +3 -0
- package/dist/capabilities.d.ts +6 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +22 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/codeActions/fixes.d.ts +16 -0
- package/dist/codeActions/fixes.d.ts.map +1 -0
- package/dist/codeActions/fixes.js +94 -0
- package/dist/codeActions/fixes.js.map +1 -0
- package/dist/codeActions/provider.d.ts +7 -0
- package/dist/codeActions/provider.d.ts.map +1 -0
- package/dist/codeActions/provider.js +46 -0
- package/dist/codeActions/provider.js.map +1 -0
- package/dist/completion/directives.d.ts +6 -0
- package/dist/completion/directives.d.ts.map +1 -0
- package/dist/completion/directives.js +16 -0
- package/dist/completion/directives.js.map +1 -0
- package/dist/completion/events.d.ts +6 -0
- package/dist/completion/events.d.ts.map +1 -0
- package/dist/completion/events.js +20 -0
- package/dist/completion/events.js.map +1 -0
- package/dist/completion/modifiers.d.ts +6 -0
- package/dist/completion/modifiers.d.ts.map +1 -0
- package/dist/completion/modifiers.js +19 -0
- package/dist/completion/modifiers.js.map +1 -0
- package/dist/completion/provider.d.ts +7 -0
- package/dist/completion/provider.d.ts.map +1 -0
- package/dist/completion/provider.js +46 -0
- package/dist/completion/provider.js.map +1 -0
- package/dist/diagnostics/provider.d.ts +7 -0
- package/dist/diagnostics/provider.d.ts.map +1 -0
- package/dist/diagnostics/provider.js +49 -0
- package/dist/diagnostics/provider.js.map +1 -0
- package/dist/diagnostics/rules.d.ts +29 -0
- package/dist/diagnostics/rules.d.ts.map +1 -0
- package/dist/diagnostics/rules.js +46 -0
- package/dist/diagnostics/rules.js.map +1 -0
- package/dist/formatting/ast.d.ts +37 -0
- package/dist/formatting/ast.d.ts.map +1 -0
- package/dist/formatting/ast.js +112 -0
- package/dist/formatting/ast.js.map +1 -0
- package/dist/formatting/attributes.d.ts +7 -0
- package/dist/formatting/attributes.d.ts.map +1 -0
- package/dist/formatting/attributes.js +7 -0
- package/dist/formatting/attributes.js.map +1 -0
- package/dist/formatting/printer.d.ts +34 -0
- package/dist/formatting/printer.d.ts.map +1 -0
- package/dist/formatting/printer.js +380 -0
- package/dist/formatting/printer.js.map +1 -0
- package/dist/formatting/provider.d.ts +10 -0
- package/dist/formatting/provider.d.ts.map +1 -0
- package/dist/formatting/provider.js +82 -0
- package/dist/formatting/provider.js.map +1 -0
- package/dist/formatting/renderer.d.ts +11 -0
- package/dist/formatting/renderer.d.ts.map +1 -0
- package/dist/formatting/renderer.js +175 -0
- package/dist/formatting/renderer.js.map +1 -0
- package/dist/formatting/tokenizer.d.ts +7 -0
- package/dist/formatting/tokenizer.d.ts.map +1 -0
- package/dist/formatting/tokenizer.js +7 -0
- package/dist/formatting/tokenizer.js.map +1 -0
- package/dist/hover/provider.d.ts +7 -0
- package/dist/hover/provider.d.ts.map +1 -0
- package/dist/hover/provider.js +48 -0
- package/dist/hover/provider.js.map +1 -0
- package/dist/modifiers/analyzer.d.ts +18 -0
- package/dist/modifiers/analyzer.d.ts.map +1 -0
- package/dist/modifiers/analyzer.js +75 -0
- package/dist/modifiers/analyzer.js.map +1 -0
- package/dist/modifiers/constants.d.ts +17 -0
- package/dist/modifiers/constants.d.ts.map +1 -0
- package/dist/modifiers/constants.js +58 -0
- package/dist/modifiers/constants.js.map +1 -0
- package/dist/modifiers/normalizer.d.ts +20 -0
- package/dist/modifiers/normalizer.d.ts.map +1 -0
- package/dist/modifiers/normalizer.js +62 -0
- package/dist/modifiers/normalizer.js.map +1 -0
- package/dist/modifiers/parser.d.ts +33 -0
- package/dist/modifiers/parser.d.ts.map +1 -0
- package/dist/modifiers/parser.js +73 -0
- package/dist/modifiers/parser.js.map +1 -0
- package/dist/modifiers/suggestions.d.ts +20 -0
- package/dist/modifiers/suggestions.d.ts.map +1 -0
- package/dist/modifiers/suggestions.js +60 -0
- package/dist/modifiers/suggestions.js.map +1 -0
- package/dist/server-browser.d.ts +16 -0
- package/dist/server-browser.d.ts.map +1 -0
- package/dist/server-browser.js +16 -0
- package/dist/server-browser.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +29 -0
- package/dist/server.js.map +1 -0
- package/dist/template/detector.d.ts +43 -0
- package/dist/template/detector.d.ts.map +1 -0
- package/dist/template/detector.js +184 -0
- package/dist/template/detector.js.map +1 -0
- package/dist/template/parser.d.ts +42 -0
- package/dist/template/parser.d.ts.map +1 -0
- package/dist/template/parser.js +225 -0
- package/dist/template/parser.js.map +1 -0
- package/dist/template/scope.d.ts +18 -0
- package/dist/template/scope.d.ts.map +1 -0
- package/dist/template/scope.js +44 -0
- package/dist/template/scope.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +13 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/levenshtein.d.ts +7 -0
- package/dist/utils/levenshtein.d.ts.map +1 -0
- package/dist/utils/levenshtein.js +7 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provider.ts — Formatting provider for the LSP server.
|
|
3
|
+
*
|
|
4
|
+
* Formats html`` tagged template regions in JS/TS documents.
|
|
5
|
+
* Uses a tree-based formatter that produces JSX/Lit-style output.
|
|
6
|
+
*/
|
|
7
|
+
import { findTemplateRegions } from "../template/detector.js";
|
|
8
|
+
import { formatTemplateInner } from "./printer.js";
|
|
9
|
+
function formatTemplateRegion(region, indentChar, tabSize) {
|
|
10
|
+
const { inner, baseIndent } = region;
|
|
11
|
+
if (inner.trim() === "")
|
|
12
|
+
return null;
|
|
13
|
+
const formatted = formatTemplateInner(inner, baseIndent, indentChar);
|
|
14
|
+
if (formatted === inner)
|
|
15
|
+
return null;
|
|
16
|
+
return formatted;
|
|
17
|
+
}
|
|
18
|
+
export function registerFormatting(connection, documents) {
|
|
19
|
+
connection.onDocumentFormatting((params) => {
|
|
20
|
+
const document = documents.get(params.textDocument.uri);
|
|
21
|
+
if (!document)
|
|
22
|
+
return null;
|
|
23
|
+
const text = document.getText();
|
|
24
|
+
const tabSize = params.options.tabSize ?? 2;
|
|
25
|
+
const insertSpaces = params.options.insertSpaces ?? true;
|
|
26
|
+
const indentChar = insertSpaces ? " ".repeat(tabSize) : "\t";
|
|
27
|
+
const regions = findTemplateRegions(text, tabSize);
|
|
28
|
+
const edits = [];
|
|
29
|
+
for (const region of regions) {
|
|
30
|
+
const isContained = regions.some((other) => other !== region &&
|
|
31
|
+
region.innerStart >= other.innerStart &&
|
|
32
|
+
region.innerEnd <= other.innerEnd);
|
|
33
|
+
if (isContained)
|
|
34
|
+
continue;
|
|
35
|
+
const formatted = formatTemplateRegion(region, indentChar, tabSize);
|
|
36
|
+
if (formatted !== null) {
|
|
37
|
+
edits.push({
|
|
38
|
+
range: {
|
|
39
|
+
start: document.positionAt(region.innerStart),
|
|
40
|
+
end: document.positionAt(region.innerEnd),
|
|
41
|
+
},
|
|
42
|
+
newText: formatted,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return edits;
|
|
47
|
+
});
|
|
48
|
+
connection.onDocumentRangeFormatting((params) => {
|
|
49
|
+
const document = documents.get(params.textDocument.uri);
|
|
50
|
+
if (!document)
|
|
51
|
+
return null;
|
|
52
|
+
const text = document.getText();
|
|
53
|
+
const tabSize = params.options.tabSize ?? 2;
|
|
54
|
+
const insertSpaces = params.options.insertSpaces ?? true;
|
|
55
|
+
const indentChar = insertSpaces ? " ".repeat(tabSize) : "\t";
|
|
56
|
+
const rangeStart = document.offsetAt(params.range.start);
|
|
57
|
+
const rangeEnd = document.offsetAt(params.range.end);
|
|
58
|
+
const regions = findTemplateRegions(text, tabSize);
|
|
59
|
+
const edits = [];
|
|
60
|
+
for (const region of regions) {
|
|
61
|
+
if (region.innerEnd < rangeStart || region.innerStart > rangeEnd)
|
|
62
|
+
continue;
|
|
63
|
+
const isContained = regions.some((other) => other !== region &&
|
|
64
|
+
region.innerStart >= other.innerStart &&
|
|
65
|
+
region.innerEnd <= other.innerEnd);
|
|
66
|
+
if (isContained)
|
|
67
|
+
continue;
|
|
68
|
+
const formatted = formatTemplateRegion(region, indentChar, tabSize);
|
|
69
|
+
if (formatted !== null) {
|
|
70
|
+
edits.push({
|
|
71
|
+
range: {
|
|
72
|
+
start: document.positionAt(region.innerStart),
|
|
73
|
+
end: document.positionAt(region.innerEnd),
|
|
74
|
+
},
|
|
75
|
+
newText: formatted,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return edits;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/formatting/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renderer.ts — Render tokens to formatted lines.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/formatter.js renderTokens() and formatOpenTag().
|
|
5
|
+
*/
|
|
6
|
+
import { type Token } from "./tokenizer.js";
|
|
7
|
+
/**
|
|
8
|
+
* Renders a token list into formatted lines at the given base depth.
|
|
9
|
+
*/
|
|
10
|
+
export declare function renderTokens(tokens: Token[], baseDepth: number, indentChar: string): string[];
|
|
11
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/formatting/renderer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAOL,KAAK,KAAK,EACX,MAAM,gBAAgB,CAAC;AA+DxB;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,KAAK,EAAE,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CA8GV"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renderer.ts — Render tokens to formatted lines.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/formatter.js renderTokens() and formatOpenTag().
|
|
5
|
+
*/
|
|
6
|
+
import { TOKEN, INLINE_ELEMENTS, PRE_ELEMENTS, parseAttributes, isBlockExpr, collapseWhitespace, } from "./tokenizer.js";
|
|
7
|
+
const MAX_LINE_WIDTH = 80;
|
|
8
|
+
/**
|
|
9
|
+
* Re-indents a multiline expression so lines after the first align to `depth`.
|
|
10
|
+
*/
|
|
11
|
+
function reindentExpr(raw, depth, indentChar) {
|
|
12
|
+
const lines = raw.split("\n");
|
|
13
|
+
if (lines.length === 1)
|
|
14
|
+
return raw.trimStart();
|
|
15
|
+
const first = lines[0].trimStart();
|
|
16
|
+
const rest = lines.slice(1);
|
|
17
|
+
let minIndent = Infinity;
|
|
18
|
+
for (const l of rest) {
|
|
19
|
+
if (l.trim().length === 0)
|
|
20
|
+
continue;
|
|
21
|
+
const match = l.match(/^([ \t]*)/);
|
|
22
|
+
const cols = match ? match[1].length : 0;
|
|
23
|
+
if (cols < minIndent)
|
|
24
|
+
minIndent = cols;
|
|
25
|
+
}
|
|
26
|
+
const safeMin = isFinite(minIndent) ? minIndent : 0;
|
|
27
|
+
const baseStr = indentChar.repeat(depth);
|
|
28
|
+
const reindented = rest.map((l) => {
|
|
29
|
+
if (l.trim().length === 0)
|
|
30
|
+
return "";
|
|
31
|
+
return baseStr + l.slice(safeMin);
|
|
32
|
+
});
|
|
33
|
+
return [first, ...reindented].join("\n");
|
|
34
|
+
}
|
|
35
|
+
function formatOpenTag(raw, tag, attrsRaw, selfClose, depth, indentChar) {
|
|
36
|
+
const indent = indentChar.repeat(depth);
|
|
37
|
+
const attrIndent = indentChar.repeat(depth + 1);
|
|
38
|
+
const attrs = parseAttributes(attrsRaw);
|
|
39
|
+
const close = selfClose ? " />" : ">";
|
|
40
|
+
const tagInline = `<${tag}${attrs.length ? " " + attrs.join(" ") : ""}${close}`;
|
|
41
|
+
const singleLine = `${indent}${tagInline}`;
|
|
42
|
+
if (attrs.length <= 1)
|
|
43
|
+
return [singleLine];
|
|
44
|
+
if (attrs.length === 2 && tagInline.length <= MAX_LINE_WIDTH)
|
|
45
|
+
return [singleLine];
|
|
46
|
+
const result = [`${indent}<${tag}`];
|
|
47
|
+
for (const attr of attrs) {
|
|
48
|
+
result.push(`${attrIndent}${attr}`);
|
|
49
|
+
}
|
|
50
|
+
if (selfClose) {
|
|
51
|
+
result.push(`${indent}/>`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
result.push(`${indent}>`);
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Renders a token list into formatted lines at the given base depth.
|
|
60
|
+
*/
|
|
61
|
+
export function renderTokens(tokens, baseDepth, indentChar) {
|
|
62
|
+
const lines = [];
|
|
63
|
+
let depth = baseDepth;
|
|
64
|
+
let pendingText = "";
|
|
65
|
+
let inPre = false;
|
|
66
|
+
const promotedInline = [];
|
|
67
|
+
function flushText() {
|
|
68
|
+
if (pendingText.trim() === "") {
|
|
69
|
+
pendingText = "";
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
lines.push(indentChar.repeat(depth) + pendingText.trim());
|
|
73
|
+
pendingText = "";
|
|
74
|
+
}
|
|
75
|
+
for (const token of tokens) {
|
|
76
|
+
if (inPre) {
|
|
77
|
+
if (token.type === TOKEN.CLOSE_TAG && PRE_ELEMENTS.has(token.tag || "")) {
|
|
78
|
+
flushText();
|
|
79
|
+
depth--;
|
|
80
|
+
lines.push(indentChar.repeat(depth) + token.raw.trim());
|
|
81
|
+
inPre = false;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
pendingText += token.raw;
|
|
85
|
+
}
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
switch (token.type) {
|
|
89
|
+
case TOKEN.DOCTYPE:
|
|
90
|
+
case TOKEN.COMMENT: {
|
|
91
|
+
flushText();
|
|
92
|
+
lines.push(indentChar.repeat(depth) + token.raw.trim());
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case TOKEN.SELF_CLOSE: {
|
|
96
|
+
flushText();
|
|
97
|
+
const formatted = formatOpenTag(token.raw, token.tag || "", token.attrs || "", true, depth, indentChar);
|
|
98
|
+
lines.push(...formatted);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case TOKEN.OPEN_TAG: {
|
|
102
|
+
const isBlock = !INLINE_ELEMENTS.has(token.tag || "");
|
|
103
|
+
if (isBlock) {
|
|
104
|
+
flushText();
|
|
105
|
+
const formatted = formatOpenTag(token.raw, token.tag || "", token.attrs || "", false, depth, indentChar);
|
|
106
|
+
lines.push(...formatted);
|
|
107
|
+
depth++;
|
|
108
|
+
if (PRE_ELEMENTS.has(token.tag || ""))
|
|
109
|
+
inPre = true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const formatted = formatOpenTag(token.raw, token.tag || "", token.attrs || "", false, depth, indentChar);
|
|
113
|
+
if (formatted.length === 1) {
|
|
114
|
+
pendingText += formatted[0].trimStart();
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
flushText();
|
|
118
|
+
lines.push(...formatted);
|
|
119
|
+
depth++;
|
|
120
|
+
promotedInline.push(token.tag || "");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
case TOKEN.CLOSE_TAG: {
|
|
126
|
+
const isBlock = !INLINE_ELEMENTS.has(token.tag || "");
|
|
127
|
+
const wasPromoted = !isBlock &&
|
|
128
|
+
promotedInline.length > 0 &&
|
|
129
|
+
promotedInline[promotedInline.length - 1] === token.tag;
|
|
130
|
+
if (isBlock || wasPromoted) {
|
|
131
|
+
flushText();
|
|
132
|
+
depth = Math.max(baseDepth, depth - 1);
|
|
133
|
+
lines.push(indentChar.repeat(depth) + token.raw.trim());
|
|
134
|
+
if (wasPromoted)
|
|
135
|
+
promotedInline.pop();
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
pendingText += token.raw.trim();
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case TOKEN.EXPR: {
|
|
143
|
+
if (isBlockExpr(token.raw)) {
|
|
144
|
+
flushText();
|
|
145
|
+
const reindented = reindentExpr(token.raw, depth, indentChar);
|
|
146
|
+
const exprLines = reindented.split("\n");
|
|
147
|
+
lines.push(indentChar.repeat(depth) + exprLines[0]);
|
|
148
|
+
for (let i = 1; i < exprLines.length; i++) {
|
|
149
|
+
lines.push(exprLines[i]);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
pendingText += token.raw;
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case TOKEN.TEXT: {
|
|
158
|
+
const collapsed = collapseWhitespace(token.raw);
|
|
159
|
+
if (collapsed.trim() === "") {
|
|
160
|
+
if ((token.raw.match(/\n/g) || []).length > 1) {
|
|
161
|
+
flushText();
|
|
162
|
+
lines.push("");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
pendingText += collapsed;
|
|
167
|
+
}
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
flushText();
|
|
173
|
+
return lines;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/formatting/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tokenizer.ts — Tokenize html`` template content.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from template/parser.ts for the formatting module.
|
|
5
|
+
*/
|
|
6
|
+
export { tokenize, parseAttributes, isBlockExpr, collapseWhitespace, TOKEN, VOID_ELEMENTS, INLINE_ELEMENTS, PRE_ELEMENTS, type Token, type TokenType, } from "../template/parser.js";
|
|
7
|
+
//# sourceMappingURL=tokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/formatting/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,KAAK,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,KAAK,KAAK,EACV,KAAK,SAAS,GACf,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tokenizer.ts — Tokenize html`` template content.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports from template/parser.ts for the formatting module.
|
|
5
|
+
*/
|
|
6
|
+
export { tokenize, parseAttributes, isBlockExpr, collapseWhitespace, TOKEN, VOID_ELEMENTS, INLINE_ELEMENTS, PRE_ELEMENTS, } from "../template/parser.js";
|
|
7
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/formatting/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,KAAK,EACL,aAAa,EACb,eAAe,EACf,YAAY,GAGb,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provider.ts — Hover provider for modifier help.
|
|
3
|
+
*/
|
|
4
|
+
import type { Connection, TextDocuments } from "vscode-languageserver/node.js";
|
|
5
|
+
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
6
|
+
export declare function registerHover(connection: Connection, documents: TextDocuments<TextDocument>): void;
|
|
7
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/hover/provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AASvE,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,GACrC,IAAI,CAyCN"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* provider.ts — Hover provider for modifier help.
|
|
3
|
+
*/
|
|
4
|
+
import { MarkupKind } from "vscode-languageserver/node.js";
|
|
5
|
+
import { MODIFIER_HELP } from "../modifiers/constants.js";
|
|
6
|
+
import { isInsideTaggedTemplate } from "../template/detector.js";
|
|
7
|
+
const SUPPORTED_LANGUAGES = new Set([
|
|
8
|
+
"javascript", "typescript", "javascriptreact", "typescriptreact",
|
|
9
|
+
]);
|
|
10
|
+
export function registerHover(connection, documents) {
|
|
11
|
+
connection.onHover((params) => {
|
|
12
|
+
const document = documents.get(params.textDocument.uri);
|
|
13
|
+
if (!document || !SUPPORTED_LANGUAGES.has(document.languageId)) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const text = document.getText();
|
|
17
|
+
const offset = document.offsetAt(params.position);
|
|
18
|
+
if (!isInsideTaggedTemplate(text, offset)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const line = document.getText({
|
|
22
|
+
start: { line: params.position.line, character: 0 },
|
|
23
|
+
end: { line: params.position.line, character: Number.MAX_SAFE_INTEGER },
|
|
24
|
+
});
|
|
25
|
+
const wordRangeMatch = line.slice(0, params.position.character).match(/[a-zA-Z][a-zA-Z0-9-]*$/);
|
|
26
|
+
if (!wordRangeMatch)
|
|
27
|
+
return null;
|
|
28
|
+
const startChar = params.position.character - wordRangeMatch[0].length;
|
|
29
|
+
const prevChar = startChar > 0 ? line[startChar - 1] : "";
|
|
30
|
+
if (prevChar !== ".")
|
|
31
|
+
return null;
|
|
32
|
+
const modifier = wordRangeMatch[0].toLowerCase();
|
|
33
|
+
const help = MODIFIER_HELP[modifier];
|
|
34
|
+
if (!help)
|
|
35
|
+
return null;
|
|
36
|
+
return {
|
|
37
|
+
contents: {
|
|
38
|
+
kind: MarkupKind.Markdown,
|
|
39
|
+
value: `**.${modifier}**\n\n${help}`,
|
|
40
|
+
},
|
|
41
|
+
range: {
|
|
42
|
+
start: { line: params.position.line, character: startChar },
|
|
43
|
+
end: { line: params.position.line, character: params.position.character },
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/hover/provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAS,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB;CACjE,CAAC,CAAC;AAEH,MAAM,UAAU,aAAa,CAC3B,UAAsB,EACtB,SAAsC;IAEtC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC5B,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE;YACnD,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE;SACxE,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAChG,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACvE,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,IAAI,QAAQ,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,OAAO;YACL,QAAQ,EAAE;gBACR,IAAI,EAAE,UAAU,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,QAAQ,SAAS,IAAI,EAAE;aACrC;YACD,KAAK,EAAE;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE;gBAC3D,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE;aAC1E;SACO,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analyzer.ts — Analyze event modifiers for issues.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/event-modifiers.js analyzeEventModifiers().
|
|
5
|
+
*/
|
|
6
|
+
export type ModifierIssueType = "unknown-modifier" | "duplicate-modifier" | "passive-prevent-conflict" | "key-modifier-on-non-key-event" | "modifier-order-noncanonical";
|
|
7
|
+
export interface ModifierIssue {
|
|
8
|
+
code: ModifierIssueType;
|
|
9
|
+
severity: "warning" | "information";
|
|
10
|
+
modifier: string;
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function isKeyEventName(eventName: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Analyzes a list of modifiers on an event and returns all issues found.
|
|
16
|
+
*/
|
|
17
|
+
export declare function analyzeEventModifiers(eventName: string, modifiers: string[], enableStyleHints?: boolean): ModifierIssue[];
|
|
18
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/modifiers/analyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,oBAAoB,GACpB,0BAA0B,GAC1B,+BAA+B,GAC/B,6BAA6B,CAAC;AAElC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,SAAS,GAAG,aAAa,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,gBAAgB,UAAO,GACtB,aAAa,EAAE,CAkEjB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* analyzer.ts — Analyze event modifiers for issues.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/event-modifiers.js analyzeEventModifiers().
|
|
5
|
+
*/
|
|
6
|
+
import { KEY_MODIFIERS, KEY_EVENTS, KNOWN_MODIFIERS } from "./constants.js";
|
|
7
|
+
import { normalizeModifierOrder } from "./normalizer.js";
|
|
8
|
+
export function isKeyEventName(eventName) {
|
|
9
|
+
return KEY_EVENTS.includes((eventName || "").toLowerCase());
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Analyzes a list of modifiers on an event and returns all issues found.
|
|
13
|
+
*/
|
|
14
|
+
export function analyzeEventModifiers(eventName, modifiers, enableStyleHints = true) {
|
|
15
|
+
const lowerEvent = (eventName || "").toLowerCase();
|
|
16
|
+
const mods = (modifiers || []).map((mod) => mod.toLowerCase());
|
|
17
|
+
const issues = [];
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
for (const mod of mods) {
|
|
20
|
+
if (!KNOWN_MODIFIERS.has(mod)) {
|
|
21
|
+
issues.push({
|
|
22
|
+
code: "unknown-modifier",
|
|
23
|
+
severity: "warning",
|
|
24
|
+
modifier: mod,
|
|
25
|
+
message: `Unknown modifier .${mod}`,
|
|
26
|
+
});
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (seen.has(mod)) {
|
|
30
|
+
issues.push({
|
|
31
|
+
code: "duplicate-modifier",
|
|
32
|
+
severity: "warning",
|
|
33
|
+
modifier: mod,
|
|
34
|
+
message: `Duplicate modifier .${mod}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
seen.add(mod);
|
|
38
|
+
}
|
|
39
|
+
// passive + prevent conflict
|
|
40
|
+
if (seen.has("passive") && seen.has("prevent")) {
|
|
41
|
+
issues.push({
|
|
42
|
+
code: "passive-prevent-conflict",
|
|
43
|
+
severity: "warning",
|
|
44
|
+
modifier: "passive",
|
|
45
|
+
message: "Avoid combining .passive with .prevent",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Key modifier on non-key event
|
|
49
|
+
if (!isKeyEventName(lowerEvent)) {
|
|
50
|
+
for (const keyMod of KEY_MODIFIERS) {
|
|
51
|
+
if (seen.has(keyMod)) {
|
|
52
|
+
issues.push({
|
|
53
|
+
code: "key-modifier-on-non-key-event",
|
|
54
|
+
severity: "information",
|
|
55
|
+
modifier: keyMod,
|
|
56
|
+
message: `Modifier .${keyMod} is typically used with keydown/keyup`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Non-canonical order (style hint)
|
|
62
|
+
if (enableStyleHints) {
|
|
63
|
+
const normalized = normalizeModifierOrder(lowerEvent, mods);
|
|
64
|
+
if (normalized.join(".") !== mods.join(".")) {
|
|
65
|
+
issues.push({
|
|
66
|
+
code: "modifier-order-noncanonical",
|
|
67
|
+
severity: "information",
|
|
68
|
+
modifier: mods.join("."),
|
|
69
|
+
message: `Consider normalizing modifier order: .${normalized.join(".")}`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return issues;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/modifiers/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* constants.ts — Event modifiers, key modifiers, events, directives.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/event-modifiers.js and extension.js.
|
|
5
|
+
* Single source of truth for all Elur template tooling.
|
|
6
|
+
*/
|
|
7
|
+
export declare const EVENT_MODIFIERS: readonly ["prevent", "stop", "self", "once", "capture", "passive"];
|
|
8
|
+
export declare const KEY_MODIFIERS: readonly ["enter", "escape", "space", "tab", "delete", "backspace", "up", "down", "left", "right"];
|
|
9
|
+
export declare const KEY_EVENTS: readonly ["keydown", "keyup", "keypress"];
|
|
10
|
+
export declare const KNOWN_MODIFIERS: Set<string>;
|
|
11
|
+
export declare const EVENT_BINDINGS: readonly ["click", "input", "change", "submit", "keydown", "keyup", "focus", "blur", "mouseenter", "mouseleave", "mousedown", "mouseup", "touchstart", "touchend", "dblclick", "contextmenu", "keypress", "scroll", "wheel", "drag", "dragstart", "dragend", "dragover", "dragenter", "dragleave", "drop", "touchmove", "touchcancel", "pointerdown", "pointerup", "pointermove", "animationstart", "animationend", "animationiteration", "transitionstart", "transitionend", "load", "error", "copy", "cut", "paste"];
|
|
12
|
+
export declare const DIRECTIVE_ATTRIBUTES: readonly ["ref", "show", "hide"];
|
|
13
|
+
export declare const TEMPLATE_TAGS: readonly ["html", "raw"];
|
|
14
|
+
export declare const MODIFIER_HELP: Readonly<Record<string, string>>;
|
|
15
|
+
export declare const EVENT_MODIFIER_ORDER: Record<string, number>;
|
|
16
|
+
export declare const KEY_MODIFIER_ORDER: Record<string, number>;
|
|
17
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/modifiers/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,oEAElB,CAAC;AAEX,eAAO,MAAM,aAAa,oGAIhB,CAAC;AAEX,eAAO,MAAM,UAAU,2CAA4C,CAAC;AAEpE,eAAO,MAAM,eAAe,aAG1B,CAAC;AAEH,eAAO,MAAM,cAAc,wfAejB,CAAC;AAEX,eAAO,MAAM,oBAAoB,kCAAmC,CAAC;AAErE,eAAO,MAAM,aAAa,0BAA2B,CAAC;AAEtD,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB1D,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAErD,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* constants.ts — Event modifiers, key modifiers, events, directives.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/event-modifiers.js and extension.js.
|
|
5
|
+
* Single source of truth for all Elur template tooling.
|
|
6
|
+
*/
|
|
7
|
+
export const EVENT_MODIFIERS = [
|
|
8
|
+
"prevent", "stop", "self", "once", "capture", "passive",
|
|
9
|
+
];
|
|
10
|
+
export const KEY_MODIFIERS = [
|
|
11
|
+
"enter", "escape", "space", "tab",
|
|
12
|
+
"delete", "backspace",
|
|
13
|
+
"up", "down", "left", "right",
|
|
14
|
+
];
|
|
15
|
+
export const KEY_EVENTS = ["keydown", "keyup", "keypress"];
|
|
16
|
+
export const KNOWN_MODIFIERS = new Set([
|
|
17
|
+
...EVENT_MODIFIERS,
|
|
18
|
+
...KEY_MODIFIERS,
|
|
19
|
+
]);
|
|
20
|
+
export const EVENT_BINDINGS = [
|
|
21
|
+
"click", "input", "change", "submit",
|
|
22
|
+
"keydown", "keyup", "focus", "blur",
|
|
23
|
+
"mouseenter", "mouseleave",
|
|
24
|
+
"mousedown", "mouseup",
|
|
25
|
+
"touchstart", "touchend",
|
|
26
|
+
"dblclick", "contextmenu",
|
|
27
|
+
"keypress", "scroll", "wheel",
|
|
28
|
+
"drag", "dragstart", "dragend", "dragover", "dragenter", "dragleave", "drop",
|
|
29
|
+
"touchmove", "touchcancel",
|
|
30
|
+
"pointerdown", "pointerup", "pointermove",
|
|
31
|
+
"animationstart", "animationend", "animationiteration",
|
|
32
|
+
"transitionstart", "transitionend",
|
|
33
|
+
"load", "error",
|
|
34
|
+
"copy", "cut", "paste",
|
|
35
|
+
];
|
|
36
|
+
export const DIRECTIVE_ATTRIBUTES = ["ref", "show", "hide"];
|
|
37
|
+
export const TEMPLATE_TAGS = ["html", "raw"];
|
|
38
|
+
export const MODIFIER_HELP = {
|
|
39
|
+
prevent: "Calls event.preventDefault()",
|
|
40
|
+
stop: "Calls event.stopPropagation()",
|
|
41
|
+
self: "Runs only when event.target === currentTarget",
|
|
42
|
+
once: "Listener is removed after first call",
|
|
43
|
+
capture: "Registers listener with capture: true",
|
|
44
|
+
passive: "Registers listener with passive: true",
|
|
45
|
+
enter: "Only runs when key is Enter",
|
|
46
|
+
escape: "Only runs when key is Escape",
|
|
47
|
+
space: "Only runs when key is Space",
|
|
48
|
+
tab: "Only runs when key is Tab",
|
|
49
|
+
delete: "Only runs when key is Delete",
|
|
50
|
+
backspace: "Only runs when key is Backspace",
|
|
51
|
+
up: "Only runs when key is ArrowUp",
|
|
52
|
+
down: "Only runs when key is ArrowDown",
|
|
53
|
+
left: "Only runs when key is ArrowLeft",
|
|
54
|
+
right: "Only runs when key is ArrowRight",
|
|
55
|
+
};
|
|
56
|
+
export const EVENT_MODIFIER_ORDER = Object.fromEntries(EVENT_MODIFIERS.map((m, i) => [m, i]));
|
|
57
|
+
export const KEY_MODIFIER_ORDER = Object.fromEntries(KEY_MODIFIERS.map((m, i) => [m, i]));
|
|
58
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/modifiers/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS;CAC/C,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK;IACjC,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;CACrB,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAU,CAAC;AAEpE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS;IAC7C,GAAG,eAAe;IAClB,GAAG,aAAa;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ;IACpC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IACnC,YAAY,EAAE,YAAY;IAC1B,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,UAAU;IACxB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,QAAQ,EAAE,OAAO;IAC7B,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM;IAC5E,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,WAAW,EAAE,aAAa;IACzC,gBAAgB,EAAE,cAAc,EAAE,oBAAoB;IACtD,iBAAiB,EAAE,eAAe;IAClC,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,KAAK,EAAE,OAAO;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAErE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,CAAU,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,OAAO,EAAE,8BAA8B;IACvC,IAAI,EAAE,+BAA+B;IACrC,IAAI,EAAE,+CAA+C;IACrD,IAAI,EAAE,sCAAsC;IAC5C,OAAO,EAAE,uCAAuC;IAChD,OAAO,EAAE,uCAAuC;IAChD,KAAK,EAAE,6BAA6B;IACpC,MAAM,EAAE,8BAA8B;IACtC,KAAK,EAAE,6BAA6B;IACpC,GAAG,EAAE,2BAA2B;IAChC,MAAM,EAAE,8BAA8B;IACtC,SAAS,EAAE,iCAAiC;IAC5C,EAAE,EAAE,+BAA+B;IACnC,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,kCAAkC;CAC1C,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAA2B,MAAM,CAAC,WAAW,CAC5E,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACtC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAA2B,MAAM,CAAC,WAAW,CAC1E,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACpC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* normalizer.ts — Normalize modifier order.
|
|
3
|
+
*
|
|
4
|
+
* Ported from elur-vscode/event-modifiers.js.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Sorts modifiers into canonical order: event modifiers first (in their
|
|
8
|
+
* declared order), then key modifiers (in their declared order), then
|
|
9
|
+
* unknown modifiers (stable — preserve original relative order).
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeModifierOrder(eventName: string, modifiers: string[]): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Deduplicates modifiers, preserving first occurrence order.
|
|
14
|
+
*/
|
|
15
|
+
export declare function uniqueModifiers(modifiers: string[]): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Removes all occurrences of a modifier from the list.
|
|
18
|
+
*/
|
|
19
|
+
export declare function removeModifier(modifiers: string[], modifierToRemove: string): string[];
|
|
20
|
+
//# sourceMappingURL=normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizer.d.ts","sourceRoot":"","sources":["../../src/modifiers/normalizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAcvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAU7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,CAGtF"}
|