eslint-plugin-templ 0.0.1

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.
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Conversion utilities for transforming templ AST to ESLint-compatible HTML AST
3
+ */
4
+ import { NodeTypes } from "es-html-parser";
5
+ export function convertToESLintAST(templAST) {
6
+ const children = [];
7
+ for (const node of templAST) {
8
+ // Only process HTMLTemplate nodes which have Children
9
+ // Skip FileGoExpression, CSSTemplate, and ScriptTemplate as they don't contain HTML
10
+ if ("Children" in node && Array.isArray(node.Children)) {
11
+ for (const child of node.Children) {
12
+ const converted = convertChild(child);
13
+ if (converted) {
14
+ children.push(converted);
15
+ }
16
+ }
17
+ }
18
+ }
19
+ // Calculate overall document range
20
+ const firstChild = children[0];
21
+ const lastChild = children[children.length - 1];
22
+ const range = firstChild && lastChild
23
+ ? [firstChild.range[0], lastChild.range[1]]
24
+ : [0, 0];
25
+ const loc = firstChild && lastChild
26
+ ? { start: firstChild.loc.start, end: lastChild.loc.end }
27
+ : { start: { line: 1, column: 0 }, end: { line: 1, column: 0 } };
28
+ return {
29
+ type: NodeTypes.Document,
30
+ children,
31
+ range,
32
+ loc,
33
+ };
34
+ }
35
+ function convertChild(child) {
36
+ if (isElementNode(child)) {
37
+ return convertElement(child);
38
+ }
39
+ if (isWhitespace(child)) {
40
+ // For whitespace, we need to create synthetic position info
41
+ // Since we don't have position info, we'll create minimal text nodes
42
+ return {
43
+ type: NodeTypes.Text,
44
+ value: child.Value,
45
+ range: [0, child.Value.length],
46
+ loc: {
47
+ start: { line: 1, column: 0 },
48
+ end: { line: 1, column: child.Value.length },
49
+ },
50
+ parts: [],
51
+ };
52
+ }
53
+ if (isStringExpression(child)) {
54
+ return {
55
+ type: NodeTypes.Text,
56
+ value: child.Value,
57
+ range: convertRange(child.Range),
58
+ loc: convertLoc(child.Range),
59
+ parts: [],
60
+ };
61
+ }
62
+ // For now, ignore Go expressions and call expressions
63
+ return null;
64
+ }
65
+ function convertElement(node) {
66
+ const range = convertRange(node.Range);
67
+ const loc = convertLoc(node.Range);
68
+ const openStartRange = convertRange({
69
+ From: node.Range.From,
70
+ To: node.NameRange.To,
71
+ });
72
+ const openStart = {
73
+ type: NodeTypes.OpenTagStart,
74
+ value: `<${node.Name}`,
75
+ range: openStartRange,
76
+ loc: convertLoc({
77
+ From: node.Range.From,
78
+ To: node.NameRange.To,
79
+ }),
80
+ };
81
+ // Estimate the position of the closing > of the opening tag
82
+ const lastAttr = node.Attributes && node.Attributes.length > 0
83
+ ? node.Attributes[node.Attributes.length - 1]
84
+ : null;
85
+ const openEndStart = lastAttr
86
+ ? lastAttr.Key.NameRange.To.Index +
87
+ 2 +
88
+ (lastAttr.Value?.length ?? lastAttr.Expression?.Value.length ?? 0) +
89
+ 1
90
+ : node.NameRange.To.Index;
91
+ const openEnd = {
92
+ type: NodeTypes.OpenTagEnd,
93
+ value: ">",
94
+ range: [openEndStart, openEndStart + 1],
95
+ loc: {
96
+ start: {
97
+ line: node.NameRange.To.Line + 1,
98
+ column: node.NameRange.To.Col,
99
+ },
100
+ end: {
101
+ line: node.NameRange.To.Line + 1,
102
+ column: node.NameRange.To.Col + 1,
103
+ },
104
+ },
105
+ };
106
+ // Estimate close tag position (at the end of the element range)
107
+ const closeTagStart = node.Range.To.Index - (node.Name.length + 3); // -3 for </>
108
+ const close = {
109
+ type: NodeTypes.CloseTag,
110
+ value: `</${node.Name}>`,
111
+ range: [closeTagStart, node.Range.To.Index],
112
+ loc: {
113
+ start: {
114
+ line: node.Range.To.Line + 1,
115
+ column: Math.max(0, node.Range.To.Col - (node.Name.length + 3)),
116
+ },
117
+ end: convertPosition(node.Range.To),
118
+ },
119
+ };
120
+ const attributes = node.Attributes
121
+ ? node.Attributes.map(convertAttribute)
122
+ : [];
123
+ const children = node.Children.map(convertChild).filter((child) => child !== null);
124
+ return {
125
+ type: NodeTypes.Tag,
126
+ name: node.Name,
127
+ selfClosing: false,
128
+ openStart,
129
+ openEnd,
130
+ close,
131
+ attributes,
132
+ children,
133
+ range,
134
+ loc,
135
+ };
136
+ }
137
+ function convertAttribute(attr) {
138
+ const keyRange = convertRange(attr.Key.NameRange);
139
+ const keyLoc = convertLoc(attr.Key.NameRange);
140
+ const key = {
141
+ type: NodeTypes.AttributeKey,
142
+ value: attr.Key.Name,
143
+ range: keyRange,
144
+ loc: keyLoc,
145
+ parts: [],
146
+ };
147
+ // Handle both constant attributes (Value) and expression attributes (Expression)
148
+ const attrValue = attr.Value ?? "";
149
+ const valueLength = attr.Expression
150
+ ? attr.Expression.Range.To.Index - attr.Expression.Range.From.Index + 4 // +4 for { and }
151
+ : attrValue.length;
152
+ // Calculate the value range - it comes after the key, =, and quote (or just = for expressions)
153
+ const valueStartIndex = attr.Key.NameRange.To.Index + 2; // +2 for '="' or '={'
154
+ const valueEndIndex = valueStartIndex + valueLength;
155
+ const valueRange = [valueStartIndex, valueEndIndex];
156
+ const value = {
157
+ type: NodeTypes.AttributeValue,
158
+ value: attrValue,
159
+ range: valueRange,
160
+ loc: {
161
+ start: {
162
+ line: attr.Key.NameRange.To.Line + 1,
163
+ column: attr.Key.NameRange.To.Col + 2,
164
+ },
165
+ end: {
166
+ line: attr.Key.NameRange.To.Line + 1,
167
+ column: attr.Key.NameRange.To.Col + 2 + valueLength,
168
+ },
169
+ },
170
+ parts: [],
171
+ };
172
+ // Attribute node spans from key start to after value and closing quote/brace
173
+ const attrRange = [keyRange[0], valueEndIndex + 1]; // +1 for closing quote or }
174
+ return {
175
+ type: NodeTypes.Attribute,
176
+ key,
177
+ value,
178
+ range: attrRange,
179
+ loc: {
180
+ start: keyLoc.start,
181
+ end: {
182
+ line: value.loc.end.line,
183
+ column: value.loc.end.column + 1,
184
+ },
185
+ },
186
+ };
187
+ }
188
+ function convertLoc(range) {
189
+ return {
190
+ start: convertPosition(range.From),
191
+ end: convertPosition(range.To),
192
+ };
193
+ }
194
+ function convertRange(range) {
195
+ return [range.From.Index, range.To.Index];
196
+ }
197
+ function convertPosition(pos) {
198
+ return {
199
+ line: pos.Line + 1, // Convert from 0-based to 1-based
200
+ column: pos.Col,
201
+ };
202
+ }
203
+ function isElementNode(node) {
204
+ return "Name" in node && "Range" in node && "Children" in node;
205
+ }
206
+ function isWhitespace(node) {
207
+ return ("Value" in node &&
208
+ !("Range" in node) &&
209
+ !("Expression" in node) &&
210
+ !("TrailingSpace" in node));
211
+ }
212
+ function isStringExpression(node) {
213
+ return ("Value" in node &&
214
+ "Range" in node &&
215
+ "TrailingSpace" in node &&
216
+ !("Expression" in node));
217
+ }
218
+ //# sourceMappingURL=templ-ast-to-eslint-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templ-ast-to-eslint-ast.js","sourceRoot":"","sources":["../src/templ-ast-to-eslint-ast.ts"],"names":[],"mappings":"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"}