@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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ast.ts — Tree node types for html`` template formatting.
|
|
3
|
+
*
|
|
4
|
+
* A proper tree structure allows making informed inline/block decisions
|
|
5
|
+
* based on children, line width, and nesting — similar to how Prettier
|
|
6
|
+
* formats JSX.
|
|
7
|
+
*/
|
|
8
|
+
export type Node = ElementNode | TextNode | ExprNode | CommentNode | DoctypeNode;
|
|
9
|
+
export interface ElementNode {
|
|
10
|
+
type: "element";
|
|
11
|
+
tag: string;
|
|
12
|
+
attrs: string;
|
|
13
|
+
selfClose: boolean;
|
|
14
|
+
children: Node[];
|
|
15
|
+
/** Raw open tag text including <tag attrs> */
|
|
16
|
+
openRaw: string;
|
|
17
|
+
/** Raw close tag text including </tag> */
|
|
18
|
+
closeRaw: string;
|
|
19
|
+
}
|
|
20
|
+
export interface TextNode {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ExprNode {
|
|
25
|
+
type: "expr";
|
|
26
|
+
raw: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CommentNode {
|
|
29
|
+
type: "comment";
|
|
30
|
+
raw: string;
|
|
31
|
+
}
|
|
32
|
+
export interface DoctypeNode {
|
|
33
|
+
type: "doctype";
|
|
34
|
+
raw: string;
|
|
35
|
+
}
|
|
36
|
+
export declare function buildTree(html: string): Node[];
|
|
37
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/formatting/ast.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,IAAI,GACZ,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,WAAW,CAAC;AAEhB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAQD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAI9C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ast.ts — Tree node types for html`` template formatting.
|
|
3
|
+
*
|
|
4
|
+
* A proper tree structure allows making informed inline/block decisions
|
|
5
|
+
* based on children, line width, and nesting — similar to how Prettier
|
|
6
|
+
* formats JSX.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Builds a tree from a token list.
|
|
10
|
+
* Tokens are produced by tokenize() from template/parser.ts.
|
|
11
|
+
*/
|
|
12
|
+
import { tokenize, TOKEN, VOID_ELEMENTS } from "../template/parser.js";
|
|
13
|
+
export function buildTree(html) {
|
|
14
|
+
const tokens = tokenize(html);
|
|
15
|
+
const parser = new TreeParser(tokens);
|
|
16
|
+
return parser.parseNodes();
|
|
17
|
+
}
|
|
18
|
+
class TreeParser {
|
|
19
|
+
tokens;
|
|
20
|
+
pos = 0;
|
|
21
|
+
constructor(tokens) {
|
|
22
|
+
this.tokens = tokens;
|
|
23
|
+
}
|
|
24
|
+
parseNodes(stopAtTag) {
|
|
25
|
+
const nodes = [];
|
|
26
|
+
while (this.pos < this.tokens.length) {
|
|
27
|
+
const token = this.tokens[this.pos];
|
|
28
|
+
if (token.type === TOKEN.CLOSE_TAG) {
|
|
29
|
+
if (stopAtTag && token.tag === stopAtTag) {
|
|
30
|
+
return nodes;
|
|
31
|
+
}
|
|
32
|
+
// Stray close tag — emit as text
|
|
33
|
+
this.pos++;
|
|
34
|
+
nodes.push({ type: "text", text: token.raw });
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (token.type === TOKEN.OPEN_TAG) {
|
|
38
|
+
const tag = token.tag || "";
|
|
39
|
+
const selfClose = VOID_ELEMENTS.has(tag.toLowerCase()) || token.selfClose === true;
|
|
40
|
+
if (selfClose) {
|
|
41
|
+
this.pos++;
|
|
42
|
+
nodes.push({
|
|
43
|
+
type: "element",
|
|
44
|
+
tag,
|
|
45
|
+
attrs: token.attrs || "",
|
|
46
|
+
selfClose: true,
|
|
47
|
+
children: [],
|
|
48
|
+
openRaw: token.raw,
|
|
49
|
+
closeRaw: "",
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
this.pos++;
|
|
54
|
+
const children = this.parseNodes(tag);
|
|
55
|
+
const closeToken = this.tokens[this.pos];
|
|
56
|
+
const closeRaw = closeToken && closeToken.type === TOKEN.CLOSE_TAG
|
|
57
|
+
? closeToken.raw
|
|
58
|
+
: "";
|
|
59
|
+
if (closeToken && closeToken.type === TOKEN.CLOSE_TAG) {
|
|
60
|
+
this.pos++;
|
|
61
|
+
}
|
|
62
|
+
nodes.push({
|
|
63
|
+
type: "element",
|
|
64
|
+
tag,
|
|
65
|
+
attrs: token.attrs || "",
|
|
66
|
+
selfClose: false,
|
|
67
|
+
children,
|
|
68
|
+
openRaw: token.raw,
|
|
69
|
+
closeRaw,
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (token.type === TOKEN.SELF_CLOSE) {
|
|
74
|
+
this.pos++;
|
|
75
|
+
nodes.push({
|
|
76
|
+
type: "element",
|
|
77
|
+
tag: token.tag || "",
|
|
78
|
+
attrs: token.attrs || "",
|
|
79
|
+
selfClose: true,
|
|
80
|
+
children: [],
|
|
81
|
+
openRaw: token.raw,
|
|
82
|
+
closeRaw: "",
|
|
83
|
+
});
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (token.type === TOKEN.EXPR) {
|
|
87
|
+
this.pos++;
|
|
88
|
+
nodes.push({ type: "expr", raw: token.raw });
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (token.type === TOKEN.TEXT) {
|
|
92
|
+
this.pos++;
|
|
93
|
+
nodes.push({ type: "text", text: token.raw });
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (token.type === TOKEN.COMMENT) {
|
|
97
|
+
this.pos++;
|
|
98
|
+
nodes.push({ type: "comment", raw: token.raw });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (token.type === TOKEN.DOCTYPE) {
|
|
102
|
+
this.pos++;
|
|
103
|
+
nodes.push({ type: "doctype", raw: token.raw });
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
// Unknown token — skip
|
|
107
|
+
this.pos++;
|
|
108
|
+
}
|
|
109
|
+
return nodes;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/formatting/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/formatting/attributes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/formatting/attributes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* printer.ts — Format a template AST into JSX/Lit-style output.
|
|
3
|
+
*
|
|
4
|
+
* Philosophy:
|
|
5
|
+
* 1. Sibling elements → each on its own line (like JSX/Prettier)
|
|
6
|
+
* 2. Text + inline elements mixed → keep on one line if they fit
|
|
7
|
+
* 3. Element with only simple children that fits → single line
|
|
8
|
+
* 4. Element with element children → multi-line (open, indented children, close)
|
|
9
|
+
* 5. When open tag + attrs exceeds MAX_WIDTH → wrap attributes
|
|
10
|
+
* 6. Simple expressions (${value}, ${() => x}) → inline
|
|
11
|
+
* 7. Multi-line expressions / nested html`` → block (own indented line)
|
|
12
|
+
* 8. <pre>, <script>, <style> → preserve content as-is
|
|
13
|
+
* 9. If the entire template fits on one line → keep it inline
|
|
14
|
+
*/
|
|
15
|
+
import type { Node } from "./ast.js";
|
|
16
|
+
/**
|
|
17
|
+
* Formats a list of nodes at a given indent depth.
|
|
18
|
+
*
|
|
19
|
+
* Rules:
|
|
20
|
+
* - Block elements → each on its own line
|
|
21
|
+
* - Inline elements mixed with text/expr → grouped on one line (greedy packing)
|
|
22
|
+
* - Sibling inline elements with only whitespace between them → each on its own line
|
|
23
|
+
* - Block expressions → own line
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatNodes(nodes: Node[], depth: number, indentChar: string): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Formats the inner content of a html`` template.
|
|
28
|
+
* Returns the formatted string (without surrounding backticks).
|
|
29
|
+
*
|
|
30
|
+
* If the entire template fits on one line, keeps it inline.
|
|
31
|
+
* Otherwise, formats with proper indentation.
|
|
32
|
+
*/
|
|
33
|
+
export declare function formatTemplateInner(inner: string, baseIndent: number, indentChar: string): string;
|
|
34
|
+
//# sourceMappingURL=printer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.d.ts","sourceRoot":"","sources":["../../src/formatting/printer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,UAAU,CAAC;AAwKlD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAoGV;AAqGD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,MAAM,CA0BR"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* printer.ts — Format a template AST into JSX/Lit-style output.
|
|
3
|
+
*
|
|
4
|
+
* Philosophy:
|
|
5
|
+
* 1. Sibling elements → each on its own line (like JSX/Prettier)
|
|
6
|
+
* 2. Text + inline elements mixed → keep on one line if they fit
|
|
7
|
+
* 3. Element with only simple children that fits → single line
|
|
8
|
+
* 4. Element with element children → multi-line (open, indented children, close)
|
|
9
|
+
* 5. When open tag + attrs exceeds MAX_WIDTH → wrap attributes
|
|
10
|
+
* 6. Simple expressions (${value}, ${() => x}) → inline
|
|
11
|
+
* 7. Multi-line expressions / nested html`` → block (own indented line)
|
|
12
|
+
* 8. <pre>, <script>, <style> → preserve content as-is
|
|
13
|
+
* 9. If the entire template fits on one line → keep it inline
|
|
14
|
+
*/
|
|
15
|
+
import { buildTree } from "./ast.js";
|
|
16
|
+
import { INLINE_ELEMENTS, VOID_ELEMENTS, PRE_ELEMENTS, parseAttributes, collapseWhitespace, } from "../template/parser.js";
|
|
17
|
+
const MAX_WIDTH = 100;
|
|
18
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
19
|
+
function isBlockExpr(raw) {
|
|
20
|
+
if (raw.includes("\n"))
|
|
21
|
+
return true;
|
|
22
|
+
if (/\bhtml\s*`/.test(raw))
|
|
23
|
+
return true;
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
function isSimpleNode(node) {
|
|
27
|
+
if (node.type === "text")
|
|
28
|
+
return true;
|
|
29
|
+
if (node.type === "expr")
|
|
30
|
+
return !isBlockExpr(node.raw);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
function hasOnlySimpleChildren(element) {
|
|
34
|
+
return element.children.every(isSimpleNode);
|
|
35
|
+
}
|
|
36
|
+
function hasElementChildren(element) {
|
|
37
|
+
return element.children.some((c) => c.type === "element");
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Renders inline content (text + simple expressions) as a single string.
|
|
41
|
+
*/
|
|
42
|
+
function renderInlineContent(children) {
|
|
43
|
+
let result = "";
|
|
44
|
+
for (const child of children) {
|
|
45
|
+
if (child.type === "text") {
|
|
46
|
+
result += collapseWhitespace(child.text);
|
|
47
|
+
}
|
|
48
|
+
else if (child.type === "expr") {
|
|
49
|
+
result += child.raw;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return result.trim();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Renders a single node as an inline string (no indent).
|
|
56
|
+
*/
|
|
57
|
+
function renderNodeInline(node) {
|
|
58
|
+
if (node.type === "text") {
|
|
59
|
+
return collapseWhitespace(node.text);
|
|
60
|
+
}
|
|
61
|
+
if (node.type === "expr") {
|
|
62
|
+
return node.raw;
|
|
63
|
+
}
|
|
64
|
+
if (node.type === "element") {
|
|
65
|
+
if (node.selfClose) {
|
|
66
|
+
const attrs = node.attrs.trim();
|
|
67
|
+
return `<${node.tag}${attrs ? " " + attrs : ""} />`;
|
|
68
|
+
}
|
|
69
|
+
const attrs = node.attrs.trim();
|
|
70
|
+
const open = `<${node.tag}${attrs ? " " + attrs : ""}>`;
|
|
71
|
+
const content = renderInlineContent(node.children);
|
|
72
|
+
const close = `</${node.tag}>`;
|
|
73
|
+
return `${open}${content}${close}`;
|
|
74
|
+
}
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
// ── Open tag formatting ──────────────────────────────────────────────────────
|
|
78
|
+
/**
|
|
79
|
+
* Formats an open tag with attributes.
|
|
80
|
+
* Returns array of strings (without indent prefix).
|
|
81
|
+
*/
|
|
82
|
+
function formatOpenTag(element, indent) {
|
|
83
|
+
const tag = element.tag;
|
|
84
|
+
const close = element.selfClose ? " />" : ">";
|
|
85
|
+
const attrs = parseAttributes(element.attrs);
|
|
86
|
+
if (attrs.length === 0) {
|
|
87
|
+
return [`<${tag}${close}`];
|
|
88
|
+
}
|
|
89
|
+
const singleLine = `<${tag} ${attrs.join(" ")}${close}`;
|
|
90
|
+
if (indent.length + singleLine.length <= MAX_WIDTH) {
|
|
91
|
+
return [singleLine];
|
|
92
|
+
}
|
|
93
|
+
// Wrap attributes
|
|
94
|
+
const attrIndent = indent + " ";
|
|
95
|
+
const lines = [`<${tag}`];
|
|
96
|
+
for (const attr of attrs) {
|
|
97
|
+
lines.push(`${attrIndent}${attr}`);
|
|
98
|
+
}
|
|
99
|
+
lines.push(`${indent}${element.selfClose ? "/>" : ">"}`);
|
|
100
|
+
return lines;
|
|
101
|
+
}
|
|
102
|
+
// ── Single-line attempt ──────────────────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Tries to render an element as a single inline line.
|
|
105
|
+
* Returns the line string (with indent) or null if it doesn't fit.
|
|
106
|
+
*/
|
|
107
|
+
function trySingleLine(element, indent) {
|
|
108
|
+
if (element.selfClose) {
|
|
109
|
+
const tagParts = formatOpenTag(element, indent);
|
|
110
|
+
if (tagParts.length === 1) {
|
|
111
|
+
return `${indent}${tagParts[0]}`;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
if (!hasOnlySimpleChildren(element))
|
|
116
|
+
return null;
|
|
117
|
+
const attrs = element.attrs.trim();
|
|
118
|
+
const open = `<${element.tag}${attrs ? " " + attrs : ""}>`;
|
|
119
|
+
const content = renderInlineContent(element.children);
|
|
120
|
+
const close = `</${element.tag}>`;
|
|
121
|
+
const line = `${indent}${open}${content}${close}`;
|
|
122
|
+
if (line.length <= MAX_WIDTH) {
|
|
123
|
+
return line;
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
// ── Main formatting ──────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Checks if a node is an inline element (inline HTML tag with only simple children).
|
|
130
|
+
* These can be part of a text run instead of going on their own line.
|
|
131
|
+
*/
|
|
132
|
+
function isInlineSimpleElement(node) {
|
|
133
|
+
if (node.type !== "element")
|
|
134
|
+
return false;
|
|
135
|
+
if (node.selfClose) {
|
|
136
|
+
return INLINE_ELEMENTS.has(node.tag.toLowerCase()) || VOID_ELEMENTS.has(node.tag.toLowerCase());
|
|
137
|
+
}
|
|
138
|
+
return INLINE_ELEMENTS.has(node.tag.toLowerCase()) && hasOnlySimpleChildren(node);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Checks if a node can be rendered inline (recursively).
|
|
142
|
+
* - Text/expr → yes (if not block expr)
|
|
143
|
+
* - Self-closing elements → yes
|
|
144
|
+
* - Inline elements with only simple children → yes
|
|
145
|
+
* - Block elements (div, section, p, etc.) → NO (always multi-line)
|
|
146
|
+
*/
|
|
147
|
+
function canBeInline(node) {
|
|
148
|
+
if (node.type === "text")
|
|
149
|
+
return true;
|
|
150
|
+
if (node.type === "expr")
|
|
151
|
+
return !isBlockExpr(node.raw);
|
|
152
|
+
if (node.type === "comment" || node.type === "doctype")
|
|
153
|
+
return false;
|
|
154
|
+
if (node.type === "element") {
|
|
155
|
+
if (node.selfClose)
|
|
156
|
+
return true;
|
|
157
|
+
// Block elements must always be multi-line
|
|
158
|
+
if (!INLINE_ELEMENTS.has(node.tag.toLowerCase()))
|
|
159
|
+
return false;
|
|
160
|
+
// Inline elements can be inline only if children are also inline
|
|
161
|
+
return node.children.every(canBeInline);
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Formats a list of nodes at a given indent depth.
|
|
167
|
+
*
|
|
168
|
+
* Rules:
|
|
169
|
+
* - Block elements → each on its own line
|
|
170
|
+
* - Inline elements mixed with text/expr → grouped on one line (greedy packing)
|
|
171
|
+
* - Sibling inline elements with only whitespace between them → each on its own line
|
|
172
|
+
* - Block expressions → own line
|
|
173
|
+
*/
|
|
174
|
+
export function formatNodes(nodes, depth, indentChar) {
|
|
175
|
+
const lines = [];
|
|
176
|
+
const indent = indentChar.repeat(depth);
|
|
177
|
+
// Collect text/expr/inline-element nodes into a text run (as strings)
|
|
178
|
+
let textRun = [];
|
|
179
|
+
function textRunHasContent() {
|
|
180
|
+
return textRun.join("").trim().length > 0;
|
|
181
|
+
}
|
|
182
|
+
function flushTextRun() {
|
|
183
|
+
if (textRun.length === 0)
|
|
184
|
+
return;
|
|
185
|
+
const joined = textRun.join("").trim();
|
|
186
|
+
if (!joined) {
|
|
187
|
+
textRun = [];
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const fullLine = `${indent}${joined}`;
|
|
191
|
+
if (fullLine.length <= MAX_WIDTH) {
|
|
192
|
+
lines.push(fullLine);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Line too long — greedily pack into multiple lines
|
|
196
|
+
let current = indent;
|
|
197
|
+
for (const part of textRun) {
|
|
198
|
+
const trimmedPart = current === indent ? part.trimStart() : part;
|
|
199
|
+
if (current === indent && trimmedPart.trim() === "")
|
|
200
|
+
continue;
|
|
201
|
+
if (current.length + trimmedPart.length > MAX_WIDTH && current.trim().length > indent.length) {
|
|
202
|
+
lines.push(current.trimEnd());
|
|
203
|
+
current = indent + trimmedPart.trimStart();
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
current += trimmedPart;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (current.trim().length > indent.length) {
|
|
210
|
+
lines.push(current.trimEnd());
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
textRun = [];
|
|
214
|
+
}
|
|
215
|
+
for (const node of nodes) {
|
|
216
|
+
// Comments and doctypes on their own lines
|
|
217
|
+
if (node.type === "comment") {
|
|
218
|
+
flushTextRun();
|
|
219
|
+
lines.push(`${indent}${node.raw.trim()}`);
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (node.type === "doctype") {
|
|
223
|
+
flushTextRun();
|
|
224
|
+
lines.push(`${indent}${node.raw.trim()}`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
// Block expressions on their own line
|
|
228
|
+
if (node.type === "expr" && isBlockExpr(node.raw)) {
|
|
229
|
+
flushTextRun();
|
|
230
|
+
lines.push(`${indent}${node.raw.trim()}`);
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
// Inline elements with simple children
|
|
234
|
+
if (isInlineSimpleElement(node)) {
|
|
235
|
+
if (textRunHasContent()) {
|
|
236
|
+
// There's text/expr before this inline element → add to text run
|
|
237
|
+
textRun.push(renderNodeInline(node));
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// No text before → this is a sibling element, put on its own line
|
|
241
|
+
const single = trySingleLine(node, indent);
|
|
242
|
+
if (single) {
|
|
243
|
+
flushTextRun();
|
|
244
|
+
lines.push(single);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
flushTextRun();
|
|
248
|
+
lines.push(...formatElement(node, depth, indentChar));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
// Block elements — flush text run, then format on own line(s)
|
|
254
|
+
if (node.type === "element") {
|
|
255
|
+
flushTextRun();
|
|
256
|
+
lines.push(...formatElement(node, depth, indentChar));
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
// Text and simple expressions — collect into text run
|
|
260
|
+
if (node.type === "text") {
|
|
261
|
+
const collapsed = collapseWhitespace(node.text);
|
|
262
|
+
textRun.push(collapsed);
|
|
263
|
+
}
|
|
264
|
+
else if (node.type === "expr") {
|
|
265
|
+
textRun.push(node.raw);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
flushTextRun();
|
|
269
|
+
return lines;
|
|
270
|
+
}
|
|
271
|
+
// ── Element formatting ───────────────────────────────────────────────────────
|
|
272
|
+
/**
|
|
273
|
+
* Formats an element as a single line (if possible) or multi-line block.
|
|
274
|
+
*/
|
|
275
|
+
function formatElement(element, depth, indentChar) {
|
|
276
|
+
const indent = indentChar.repeat(depth);
|
|
277
|
+
// Self-closing / void element
|
|
278
|
+
if (element.selfClose) {
|
|
279
|
+
const tagParts = formatOpenTag(element, indent);
|
|
280
|
+
if (tagParts.length === 1) {
|
|
281
|
+
return [`${indent}${tagParts[0]}`];
|
|
282
|
+
}
|
|
283
|
+
// Multi-line self-closing tag
|
|
284
|
+
const lines = [`${indent}${tagParts[0]}`];
|
|
285
|
+
for (let j = 1; j < tagParts.length; j++) {
|
|
286
|
+
lines.push(tagParts[j]);
|
|
287
|
+
}
|
|
288
|
+
return lines;
|
|
289
|
+
}
|
|
290
|
+
// Try single line first
|
|
291
|
+
const single = trySingleLine(element, indent);
|
|
292
|
+
if (single)
|
|
293
|
+
return [single];
|
|
294
|
+
// Block formatting
|
|
295
|
+
const openParts = formatOpenTag(element, indent);
|
|
296
|
+
const lines = [];
|
|
297
|
+
// Opening tag
|
|
298
|
+
for (let j = 0; j < openParts.length; j++) {
|
|
299
|
+
lines.push(j === 0 ? `${indent}${openParts[j]}` : openParts[j]);
|
|
300
|
+
}
|
|
301
|
+
// Children
|
|
302
|
+
const childLines = formatElementChildren(element, depth + 1, indentChar);
|
|
303
|
+
lines.push(...childLines);
|
|
304
|
+
// Closing tag
|
|
305
|
+
lines.push(`${indent}</${element.tag}>`);
|
|
306
|
+
return lines;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Formats an element's children.
|
|
310
|
+
*/
|
|
311
|
+
function formatElementChildren(element, depth, indentChar) {
|
|
312
|
+
// <pre>, <script>, <style>, <textarea> — preserve content as-is
|
|
313
|
+
if (PRE_ELEMENTS.has(element.tag.toLowerCase())) {
|
|
314
|
+
const indent = indentChar.repeat(depth);
|
|
315
|
+
const content = element.children
|
|
316
|
+
.map((c) => (c.type === "text" ? c.text : c.type === "expr" ? c.raw : ""))
|
|
317
|
+
.join("");
|
|
318
|
+
const trimmed = content.trim();
|
|
319
|
+
if (trimmed) {
|
|
320
|
+
return trimmed.split("\n").map((l) => `${indent}${l}`);
|
|
321
|
+
}
|
|
322
|
+
return [];
|
|
323
|
+
}
|
|
324
|
+
// Empty element
|
|
325
|
+
if (element.children.length === 0) {
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
// If all children are simple (text/expr), try to fit on one line
|
|
329
|
+
if (hasOnlySimpleChildren(element)) {
|
|
330
|
+
const content = renderInlineContent(element.children);
|
|
331
|
+
if (content.length > 0) {
|
|
332
|
+
const indent = indentChar.repeat(depth);
|
|
333
|
+
const line = `${indent}${content}`;
|
|
334
|
+
if (line.length <= MAX_WIDTH) {
|
|
335
|
+
return [line];
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// Check if children are a mix of text + inline elements (no block elements)
|
|
340
|
+
// If so, try to render them as a single text run
|
|
341
|
+
if (!hasElementChildren(element)) {
|
|
342
|
+
// All text/expr — already handled above
|
|
343
|
+
}
|
|
344
|
+
// Multi-line children
|
|
345
|
+
return formatNodes(element.children, depth, indentChar);
|
|
346
|
+
}
|
|
347
|
+
// ── Top-level template formatting ────────────────────────────────────────────
|
|
348
|
+
/**
|
|
349
|
+
* Formats the inner content of a html`` template.
|
|
350
|
+
* Returns the formatted string (without surrounding backticks).
|
|
351
|
+
*
|
|
352
|
+
* If the entire template fits on one line, keeps it inline.
|
|
353
|
+
* Otherwise, formats with proper indentation.
|
|
354
|
+
*/
|
|
355
|
+
export function formatTemplateInner(inner, baseIndent, indentChar) {
|
|
356
|
+
if (inner.trim() === "")
|
|
357
|
+
return inner;
|
|
358
|
+
// Build tree
|
|
359
|
+
const tree = buildTree(inner);
|
|
360
|
+
// Try single-line: if all nodes can be rendered inline and fit
|
|
361
|
+
if (tree.every((n) => canBeInline(n))) {
|
|
362
|
+
let flat = "";
|
|
363
|
+
for (const n of tree) {
|
|
364
|
+
flat += renderNodeInline(n);
|
|
365
|
+
}
|
|
366
|
+
flat = flat.trim();
|
|
367
|
+
const indentWidth = baseIndent * indentChar.length;
|
|
368
|
+
if (flat.length > 0 && indentWidth + flat.length <= MAX_WIDTH) {
|
|
369
|
+
return flat;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Multi-line
|
|
373
|
+
const contentIndent = baseIndent + 1;
|
|
374
|
+
const lines = formatNodes(tree, contentIndent, indentChar);
|
|
375
|
+
if (lines.length === 0)
|
|
376
|
+
return inner;
|
|
377
|
+
const body = lines.join("\n");
|
|
378
|
+
return `\n${body}\n${indentChar.repeat(baseIndent)}`;
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=printer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.js","sourceRoot":"","sources":["../../src/formatting/printer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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 type { Connection, TextDocuments } from "vscode-languageserver/node.js";
|
|
8
|
+
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
9
|
+
export declare function registerFormatting(connection: Connection, documents: TextDocuments<TextDocument>): void;
|
|
10
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/formatting/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAkBvE,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,GACrC,IAAI,CA8EN"}
|