@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.
Files changed (115) hide show
  1. package/README.md +71 -0
  2. package/bin/elur-language-server.js +3 -0
  3. package/dist/capabilities.d.ts +6 -0
  4. package/dist/capabilities.d.ts.map +1 -0
  5. package/dist/capabilities.js +22 -0
  6. package/dist/capabilities.js.map +1 -0
  7. package/dist/codeActions/fixes.d.ts +16 -0
  8. package/dist/codeActions/fixes.d.ts.map +1 -0
  9. package/dist/codeActions/fixes.js +94 -0
  10. package/dist/codeActions/fixes.js.map +1 -0
  11. package/dist/codeActions/provider.d.ts +7 -0
  12. package/dist/codeActions/provider.d.ts.map +1 -0
  13. package/dist/codeActions/provider.js +46 -0
  14. package/dist/codeActions/provider.js.map +1 -0
  15. package/dist/completion/directives.d.ts +6 -0
  16. package/dist/completion/directives.d.ts.map +1 -0
  17. package/dist/completion/directives.js +16 -0
  18. package/dist/completion/directives.js.map +1 -0
  19. package/dist/completion/events.d.ts +6 -0
  20. package/dist/completion/events.d.ts.map +1 -0
  21. package/dist/completion/events.js +20 -0
  22. package/dist/completion/events.js.map +1 -0
  23. package/dist/completion/modifiers.d.ts +6 -0
  24. package/dist/completion/modifiers.d.ts.map +1 -0
  25. package/dist/completion/modifiers.js +19 -0
  26. package/dist/completion/modifiers.js.map +1 -0
  27. package/dist/completion/provider.d.ts +7 -0
  28. package/dist/completion/provider.d.ts.map +1 -0
  29. package/dist/completion/provider.js +46 -0
  30. package/dist/completion/provider.js.map +1 -0
  31. package/dist/diagnostics/provider.d.ts +7 -0
  32. package/dist/diagnostics/provider.d.ts.map +1 -0
  33. package/dist/diagnostics/provider.js +49 -0
  34. package/dist/diagnostics/provider.js.map +1 -0
  35. package/dist/diagnostics/rules.d.ts +29 -0
  36. package/dist/diagnostics/rules.d.ts.map +1 -0
  37. package/dist/diagnostics/rules.js +46 -0
  38. package/dist/diagnostics/rules.js.map +1 -0
  39. package/dist/formatting/ast.d.ts +37 -0
  40. package/dist/formatting/ast.d.ts.map +1 -0
  41. package/dist/formatting/ast.js +112 -0
  42. package/dist/formatting/ast.js.map +1 -0
  43. package/dist/formatting/attributes.d.ts +7 -0
  44. package/dist/formatting/attributes.d.ts.map +1 -0
  45. package/dist/formatting/attributes.js +7 -0
  46. package/dist/formatting/attributes.js.map +1 -0
  47. package/dist/formatting/printer.d.ts +34 -0
  48. package/dist/formatting/printer.d.ts.map +1 -0
  49. package/dist/formatting/printer.js +380 -0
  50. package/dist/formatting/printer.js.map +1 -0
  51. package/dist/formatting/provider.d.ts +10 -0
  52. package/dist/formatting/provider.d.ts.map +1 -0
  53. package/dist/formatting/provider.js +82 -0
  54. package/dist/formatting/provider.js.map +1 -0
  55. package/dist/formatting/renderer.d.ts +11 -0
  56. package/dist/formatting/renderer.d.ts.map +1 -0
  57. package/dist/formatting/renderer.js +175 -0
  58. package/dist/formatting/renderer.js.map +1 -0
  59. package/dist/formatting/tokenizer.d.ts +7 -0
  60. package/dist/formatting/tokenizer.d.ts.map +1 -0
  61. package/dist/formatting/tokenizer.js +7 -0
  62. package/dist/formatting/tokenizer.js.map +1 -0
  63. package/dist/hover/provider.d.ts +7 -0
  64. package/dist/hover/provider.d.ts.map +1 -0
  65. package/dist/hover/provider.js +48 -0
  66. package/dist/hover/provider.js.map +1 -0
  67. package/dist/modifiers/analyzer.d.ts +18 -0
  68. package/dist/modifiers/analyzer.d.ts.map +1 -0
  69. package/dist/modifiers/analyzer.js +75 -0
  70. package/dist/modifiers/analyzer.js.map +1 -0
  71. package/dist/modifiers/constants.d.ts +17 -0
  72. package/dist/modifiers/constants.d.ts.map +1 -0
  73. package/dist/modifiers/constants.js +58 -0
  74. package/dist/modifiers/constants.js.map +1 -0
  75. package/dist/modifiers/normalizer.d.ts +20 -0
  76. package/dist/modifiers/normalizer.d.ts.map +1 -0
  77. package/dist/modifiers/normalizer.js +62 -0
  78. package/dist/modifiers/normalizer.js.map +1 -0
  79. package/dist/modifiers/parser.d.ts +33 -0
  80. package/dist/modifiers/parser.d.ts.map +1 -0
  81. package/dist/modifiers/parser.js +73 -0
  82. package/dist/modifiers/parser.js.map +1 -0
  83. package/dist/modifiers/suggestions.d.ts +20 -0
  84. package/dist/modifiers/suggestions.d.ts.map +1 -0
  85. package/dist/modifiers/suggestions.js +60 -0
  86. package/dist/modifiers/suggestions.js.map +1 -0
  87. package/dist/server-browser.d.ts +16 -0
  88. package/dist/server-browser.d.ts.map +1 -0
  89. package/dist/server-browser.js +16 -0
  90. package/dist/server-browser.js.map +1 -0
  91. package/dist/server.d.ts +8 -0
  92. package/dist/server.d.ts.map +1 -0
  93. package/dist/server.js +29 -0
  94. package/dist/server.js.map +1 -0
  95. package/dist/template/detector.d.ts +43 -0
  96. package/dist/template/detector.d.ts.map +1 -0
  97. package/dist/template/detector.js +184 -0
  98. package/dist/template/detector.js.map +1 -0
  99. package/dist/template/parser.d.ts +42 -0
  100. package/dist/template/parser.d.ts.map +1 -0
  101. package/dist/template/parser.js +225 -0
  102. package/dist/template/parser.js.map +1 -0
  103. package/dist/template/scope.d.ts +18 -0
  104. package/dist/template/scope.d.ts.map +1 -0
  105. package/dist/template/scope.js +44 -0
  106. package/dist/template/scope.js.map +1 -0
  107. package/dist/utils/config.d.ts +14 -0
  108. package/dist/utils/config.d.ts.map +1 -0
  109. package/dist/utils/config.js +13 -0
  110. package/dist/utils/config.js.map +1 -0
  111. package/dist/utils/levenshtein.d.ts +7 -0
  112. package/dist/utils/levenshtein.d.ts.map +1 -0
  113. package/dist/utils/levenshtein.js +7 -0
  114. package/dist/utils/levenshtein.js.map +1 -0
  115. 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,7 @@
1
+ /**
2
+ * attributes.ts — Format open tag attributes.
3
+ *
4
+ * Re-exports the attribute formatting logic from the renderer.
5
+ */
6
+ export { parseAttributes } from "./tokenizer.js";
7
+ //# sourceMappingURL=attributes.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * attributes.ts — Format open tag attributes.
3
+ *
4
+ * Re-exports the attribute formatting logic from the renderer.
5
+ */
6
+ export { parseAttributes } from "./tokenizer.js";
7
+ //# sourceMappingURL=attributes.js.map
@@ -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"}