eslint-plugin-templ 0.0.1 → 0.0.3

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.
@@ -1,5 +1,7 @@
1
+ import { parse as parseCSS, toPlainObject } from "css-tree";
2
+ import { NodeTypes } from "es-html-parser";
1
3
  import { runTemplAstToJsonBinary } from "./run-templ-ast-to-json-binary.js";
2
- import { convertToESLintAST } from "./templ-ast-to-eslint-ast.js";
4
+ import { convertToESLintAST, TemplASTConversionError, } from "./templ-ast-to-eslint-ast.js";
3
5
  import { validateTemplAST } from "./templ-ast.js";
4
6
  export function parseForESLint(code) {
5
7
  let stdout;
@@ -18,37 +20,50 @@ export function parseForESLint(code) {
18
20
  parsedJSON = JSON.parse(stdout);
19
21
  }
20
22
  catch (error) {
21
- const message = error instanceof Error ? error.message : "Unknown error";
22
- return createFatalError(`Failed to parse JSON output from templ-ast-to-json: ${message}`);
23
+ return createFatalError(`Failed to parse JSON output from templ-ast-to-json: ${error instanceof Error ? error.message : "Unknown error"}`);
23
24
  }
24
25
  try {
25
26
  validateTemplAST(parsedJSON);
27
+ const documentNode = convertToESLintAST(parsedJSON);
28
+ // Following html-eslint's approach: the Program body contains the DocumentNode
29
+ // instead of ESLint Statement nodes. This is the standard pattern for HTML parsers.
30
+ // See: https://github.com/yeonjuan/html-eslint/blob/main/packages/parser/lib/parser.js
31
+ const ast = {
32
+ type: "Program",
33
+ sourceType: "module",
34
+ // @ts-expect-error - html-eslint pattern: body contains DocumentNode, not Statement[]
35
+ body: [documentNode],
36
+ loc: documentNode.loc,
37
+ range: documentNode.range,
38
+ tokens: [],
39
+ comments: [],
40
+ };
41
+ attachStylesheets(ast);
42
+ return {
43
+ ok: true,
44
+ ast,
45
+ comments: [],
46
+ };
26
47
  }
27
48
  catch (error) {
28
- if (!(error instanceof Error)) {
29
- throw error;
49
+ if (error instanceof TemplASTConversionError) {
50
+ const serializedNode = JSON.stringify(error.node, null, 2);
51
+ const messageWithNode = serializedNode === undefined
52
+ ? error.message
53
+ : `${error.message}\nProblematic node:\n${serializedNode}`;
54
+ return {
55
+ ok: false,
56
+ errors: [
57
+ {
58
+ message: messageWithNode,
59
+ line: error.line,
60
+ column: error.column,
61
+ },
62
+ ],
63
+ };
30
64
  }
31
- return createFatalError(error.message);
65
+ return createFatalError(error instanceof Error ? error.message : "Unknown error");
32
66
  }
33
- const documentNode = convertToESLintAST(parsedJSON);
34
- // Following html-eslint's approach: the Program body contains the DocumentNode
35
- // instead of ESLint Statement nodes. This is the standard pattern for HTML parsers.
36
- // See: https://github.com/yeonjuan/html-eslint/blob/main/packages/parser/lib/parser.js
37
- const ast = {
38
- type: "Program",
39
- sourceType: "module",
40
- // @ts-expect-error - html-eslint pattern: body contains DocumentNode, not Statement[]
41
- body: [documentNode],
42
- loc: documentNode.loc,
43
- range: documentNode.range,
44
- tokens: [],
45
- comments: [],
46
- };
47
- return {
48
- ok: true,
49
- ast,
50
- comments: [],
51
- };
52
67
  }
53
68
  /**
54
69
  * Creates a fatal error result for errors that prevent parsing
@@ -67,4 +82,127 @@ function createFatalError(message) {
67
82
  ],
68
83
  };
69
84
  }
85
+ function attachStylesheets(ast) {
86
+ const visit = (node) => {
87
+ if (!node || typeof node !== "object" || !("type" in node)) {
88
+ return;
89
+ }
90
+ if (node.type === NodeTypes.StyleTag) {
91
+ const styleNode = node;
92
+ if (styleNode.value?.type === NodeTypes.StyleTagContent) {
93
+ const cssNode = toPlainObject(parseCSS(styleNode.value.value, {
94
+ context: "stylesheet",
95
+ offset: styleNode.value.range[0],
96
+ positions: true,
97
+ line: styleNode.value.loc.start.line,
98
+ // css-tree uses 1-based columns.
99
+ column: styleNode.value.loc.start.column + 1,
100
+ }));
101
+ assertIsCssTraversalNode(cssNode);
102
+ traverseCss(cssNode, (cssChild) => {
103
+ cssChild.type = `Css${cssChild.type}`;
104
+ if (cssChild.loc) {
105
+ cssChild.range = [
106
+ cssChild.loc.start.offset,
107
+ cssChild.loc.end.offset,
108
+ ];
109
+ cssChild.loc.start.column -= 1;
110
+ cssChild.loc.end.column -= 1;
111
+ }
112
+ });
113
+ styleNode.value.stylesheet = cssNode;
114
+ }
115
+ }
116
+ for (const value of Object.values(node)) {
117
+ if (Array.isArray(value)) {
118
+ for (const child of value) {
119
+ visit(child);
120
+ }
121
+ }
122
+ else {
123
+ visit(value);
124
+ }
125
+ }
126
+ };
127
+ visit(ast);
128
+ }
129
+ function assertIsCssTraversalNode(value) {
130
+ if (!value || typeof value !== "object") {
131
+ throw new TypeError("Expected css-tree to produce an object node");
132
+ }
133
+ if (!("type" in value) || typeof value.type !== "string") {
134
+ throw new TypeError("Expected css-tree node to have a string type");
135
+ }
136
+ }
137
+ function traverseCss(node, visitor) {
138
+ if (!node) {
139
+ return;
140
+ }
141
+ const cssVisitorKeys = {
142
+ CssAnPlusB: [],
143
+ CssAtrule: ["prelude", "block"],
144
+ CssAtrulePrelude: ["children"],
145
+ CssAttributeSelector: ["name", "value"],
146
+ CssBlock: ["children"],
147
+ CssBrackets: ["children"],
148
+ CssCDC: [],
149
+ CssCDO: [],
150
+ CssClassSelector: [],
151
+ CssCombinator: [],
152
+ CssCondition: ["children"],
153
+ CssDeclaration: ["value"],
154
+ CssDeclarationList: ["children"],
155
+ CssDimension: [],
156
+ CssFeature: ["value"],
157
+ CssFeatureFunction: ["value"],
158
+ CssFeatureRange: ["left", "middle", "right"],
159
+ CssFunction: ["children"],
160
+ CssGeneralEnclosed: ["children"],
161
+ CssHash: [],
162
+ CssIdSelector: [],
163
+ CssIdentifier: [],
164
+ CssLayer: [],
165
+ CssLayerList: ["children"],
166
+ CssMediaQuery: ["condition"],
167
+ CssMediaQueryList: ["children"],
168
+ CssNestingSelector: [],
169
+ CssNth: ["nth", "selector"],
170
+ CssNumber: [],
171
+ CssOperator: [],
172
+ CssParentheses: ["children"],
173
+ CssPercentage: [],
174
+ CssPseudoClassSelector: ["children"],
175
+ CssPseudoElementSelector: ["children"],
176
+ CssRatio: ["left", "right"],
177
+ CssRaw: [],
178
+ CssRule: ["prelude", "block"],
179
+ CssScope: ["root", "limit"],
180
+ CssSelector: ["children"],
181
+ CssSelectorList: ["children"],
182
+ CssString: [],
183
+ CssStyleSheet: ["children"],
184
+ CssSupportsDeclaration: ["declaration"],
185
+ CssTypeSelector: [],
186
+ CssUnicodeRange: [],
187
+ CssUrl: [],
188
+ CssValue: ["children"],
189
+ CssWhiteSpace: [],
190
+ };
191
+ visitor(node);
192
+ const keys = cssVisitorKeys[node.type];
193
+ if (!keys) {
194
+ return;
195
+ }
196
+ for (const key of keys) {
197
+ const value = node[key];
198
+ if (Array.isArray(value)) {
199
+ for (const child of value) {
200
+ traverseCss(child, visitor);
201
+ }
202
+ }
203
+ else {
204
+ traverseCss(value, visitor);
205
+ }
206
+ }
207
+ }
70
208
  //# sourceMappingURL=parse-for-eslint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-for-eslint.js","sourceRoot":"","sources":["../src/parse-for-eslint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,oBAAoB;IACpB,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,OAAO,gBAAgB,CACrB,uDAAuD,OAAO,EAAE,CACjE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEpD,+EAA+E;IAC/E,oFAAoF;IACpF,uFAAuF;IACvF,MAAM,GAAG,GAAgB;QACvB,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,QAAQ;QACpB,sFAAsF;QACtF,IAAI,EAAE,CAAC,YAAY,CAAC;QACpB,GAAG,EAAE,YAAY,CAAC,GAAG;QACrB,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG;QACH,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE;YACN;gBACE,OAAO;gBACP,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;aACV;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"parse-for-eslint.js","sourceRoot":"","sources":["../src/parse-for-eslint.ts"],"names":[],"mappings":"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"}
@@ -8,16 +8,18 @@ export function runTemplAstToJsonBinary(code) {
8
8
  encoding: "utf8",
9
9
  maxBuffer: 10 * 1024 * 1024, // 10MB
10
10
  timeout: 2000, // 2 seconds
11
+ // Suppress stderr output in console
12
+ stdio: "pipe",
11
13
  });
12
14
  }
13
15
  catch (error) {
14
16
  if (error instanceof Error) {
15
17
  const message = "code" in error && error.code === "ENOENT"
16
18
  ? `templ-ast-to-json binary not found at ${binaryPath}. Please ensure the binary is built.`
17
- : `templ-ast-to-json failed: ${"stderr" in error && typeof error.stderr === "string"
19
+ : "stderr" in error && typeof error.stderr === "string"
18
20
  ? error.stderr.trim()
19
- : error.message}`;
20
- throw new Error(message);
21
+ : error.message;
22
+ throw new Error(message, { cause: error });
21
23
  }
22
24
  throw error;
23
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run-templ-ast-to-json-binary.js","sourceRoot":"","sources":["../src/run-templ-ast-to-json-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,UAAU,EAAE,EAAE,EAAE;YAClC,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;YACpC,OAAO,EAAE,IAAI,EAAE,YAAY;SAC5B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GACX,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBACxC,CAAC,CAAC,yCAAyC,UAAU,sCAAsC;gBAC3F,CAAC,CAAC,6BACE,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;oBACnD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;oBACrB,CAAC,CAAC,KAAK,CAAC,OACZ,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,EAAE,GAAW,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,EAAE,GAAG,SAAS,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,uBAAuB,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAChE,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"run-templ-ast-to-json-binary.js","sourceRoot":"","sources":["../src/run-templ-ast-to-json-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,UAAU,EAAE,EAAE,EAAE;YAClC,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;YACpC,OAAO,EAAE,IAAI,EAAE,YAAY;YAC3B,oCAAoC;YACpC,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GACX,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBACxC,CAAC,CAAC,yCAAyC,UAAU,sCAAsC;gBAC3F,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;oBACrD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;oBACrB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,EAAE,GAAW,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QACnB,EAAE,GAAG,SAAS,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,uBAAuB,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAChE,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -2,6 +2,21 @@
2
2
  * Conversion utilities for transforming templ AST to ESLint-compatible HTML AST
3
3
  */
4
4
  import type { DocumentNode } from "es-html-parser";
5
- import type { TemplAST } from "./templ-ast.ts";
5
+ import type { TemplAST, TemplAttribute, TemplChild } from "./templ-ast.ts";
6
+ /**
7
+ * Converts a templ AST to an ESLint-compatible HTML AST (DocumentNode).
8
+ *
9
+ * This function is a pure converter — it consumes only the templ AST and does
10
+ * not accept or use source text. All information needed for the conversion must
11
+ * be present in the AST. If something is missing, the fix belongs in the templ
12
+ * parser (github.com/AdamVig/templ), not here.
13
+ */
6
14
  export declare function convertToESLintAST(templAST: TemplAST): DocumentNode;
15
+ export declare class TemplASTConversionError extends SyntaxError {
16
+ name: string;
17
+ line: number;
18
+ column: number;
19
+ node: TemplChild | TemplAttribute;
20
+ constructor(message: string, node: TemplChild | TemplAttribute, options?: ErrorOptions);
21
+ }
7
22
  //# sourceMappingURL=templ-ast-to-eslint-ast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templ-ast-to-eslint-ast.d.ts","sourceRoot":"","sources":["../src/templ-ast-to-eslint-ast.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAKV,YAAY,EAKb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EACV,QAAQ,EAQT,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAoCnE"}
1
+ {"version":3,"file":"templ-ast-to-eslint-ast.d.ts","sourceRoot":"","sources":["../src/templ-ast-to-eslint-ast.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAUV,YAAY,EAab,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EAGd,UAAU,EAUX,MAAM,gBAAgB,CAAC;AAExB;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,YAAY,CAoDnE;AAkqBD,qBAAa,uBAAwB,SAAQ,WAAW;IAC7C,IAAI,SAA6B;IAE1C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC;gBAGhC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,UAAU,GAAG,cAAc,EACjC,OAAO,CAAC,EAAE,YAAY;CAezB"}