@html-eslint/eslint-plugin 0.30.0-alpha.0 → 0.31.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.
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @typedef {import("../../types").AnyNode} AnyNode
3
+ * @typedef {{ [key in AnyNode['type']]?: number}} IncLevelOptions
4
+ * @typedef {(node: AnyNode) => number} GetIncreasingLevel
5
+ */
6
+
7
+ class IndentLevel {
8
+ /**
9
+ * @param {Object} config
10
+ * @param {GetIncreasingLevel} config.getIncreasingLevel
11
+ */
12
+ constructor(config) {
13
+ /**
14
+ * @member
15
+ * @private
16
+ * @type {number}
17
+ */
18
+ this.level = -1;
19
+ /**
20
+ * @member
21
+ * @private
22
+ * @type {number}
23
+ */
24
+ this.baseLevel = 0;
25
+ /**
26
+ * @member
27
+ * @private
28
+ */
29
+ this.getInc = config.getIncreasingLevel;
30
+ }
31
+
32
+ /**
33
+ * @returns {number}
34
+ */
35
+ value() {
36
+ return this.level + this.baseLevel;
37
+ }
38
+
39
+ /**
40
+ * @param {AnyNode} node
41
+ */
42
+ indent(node) {
43
+ this.level += this.getInc(node);
44
+ }
45
+
46
+ /**
47
+ * @param {AnyNode} node
48
+ */
49
+ dedent(node) {
50
+ this.level -= this.getInc(node);
51
+ }
52
+
53
+ /**
54
+ * @param {number} base
55
+ */
56
+ setBase(base) {
57
+ this.baseLevel = base;
58
+ }
59
+ }
60
+
61
+ module.exports = IndentLevel;
@@ -1,10 +1,10 @@
1
1
  /**
2
- * @typedef { import("../types").RuleModule } RuleModule
3
- * @typedef { import("../types").AnyNode } AnyNode
4
- * @typedef { import("../types").LineNode } LineNode
5
- * @typedef { import("../types").BaseNode } BaseNode
6
- * @typedef { import("../types").TagNode } TagNode
7
- * @typedef { import("../types").RuleListener } RuleListener
2
+ * @typedef { import("../../types").RuleModule } RuleModule
3
+ * @typedef { import("../../types").AnyNode } AnyNode
4
+ * @typedef { import("../../types").LineNode } LineNode
5
+ * @typedef { import("../../types").BaseNode } BaseNode
6
+ * @typedef { import("../../types").TagNode } TagNode
7
+ * @typedef { import("../../types").RuleListener } RuleListener
8
8
  * @typedef { import("eslint").AST.Token } Token
9
9
  * @typedef { import("eslint").SourceCode } SourceCode
10
10
  * @typedef { import("estree").TemplateLiteral } TemplateLiteral
@@ -16,13 +16,14 @@
16
16
  */
17
17
 
18
18
  const { parse } = require("@html-eslint/template-parser");
19
- const { RULE_CATEGORY } = require("../constants");
20
- const { splitToLineNodes } = require("./utils/node");
19
+ const { RULE_CATEGORY } = require("../../constants");
20
+ const { splitToLineNodes } = require("../utils/node");
21
21
  const {
22
22
  shouldCheckTaggedTemplateExpression,
23
23
  shouldCheckTemplateLiteral,
24
- } = require("./utils/settings");
25
- const { getSourceCode } = require("./utils/source-code");
24
+ } = require("../utils/settings");
25
+ const { getSourceCode } = require("../utils/source-code");
26
+ const IndentLevel = require("./indent-level");
26
27
 
27
28
  /** @type {MessageId} */
28
29
  const MESSAGE_ID = {
@@ -63,6 +64,16 @@ module.exports = {
63
64
  },
64
65
  ],
65
66
  },
67
+ {
68
+ type: "object",
69
+ properties: {
70
+ Attribute: {
71
+ type: "integer",
72
+ minimum: 1,
73
+ default: 1,
74
+ },
75
+ },
76
+ },
66
77
  ],
67
78
  messages: {
68
79
  [MESSAGE_ID.WRONG_INDENT]:
@@ -71,9 +82,15 @@ module.exports = {
71
82
  },
72
83
  create(context) {
73
84
  const sourceCode = getSourceCode(context);
85
+ const indentLevelOptions = (context.options && context.options[1]) || {};
86
+ const indentLevel = new IndentLevel({
87
+ getIncreasingLevel(node) {
88
+ return typeof indentLevelOptions[node.type] === "number"
89
+ ? indentLevelOptions[node.type]
90
+ : 1;
91
+ },
92
+ });
74
93
 
75
- let baseIndentLevel = 0;
76
- let indentLevel = -1;
77
94
  let parentIgnoringChildCount = 0;
78
95
 
79
96
  const { indentType, indentSize, indentChar } = (function () {
@@ -95,16 +112,6 @@ module.exports = {
95
112
  return { indentType, indentSize, indentChar };
96
113
  })();
97
114
 
98
- function indent() {
99
- indentLevel++;
100
- }
101
- function unindent() {
102
- indentLevel--;
103
- }
104
- function getIndentLevel() {
105
- return indentLevel + baseIndentLevel;
106
- }
107
-
108
115
  /**
109
116
  * @param {string} str
110
117
  * @returns {number}
@@ -141,7 +148,7 @@ module.exports = {
141
148
  * @returns {string}
142
149
  */
143
150
  function getExpectedIndent() {
144
- return indentChar.repeat(getIndentLevel());
151
+ return indentChar.repeat(indentLevel.value());
145
152
  }
146
153
 
147
154
  /**
@@ -221,7 +228,7 @@ module.exports = {
221
228
  context.report({
222
229
  node: targetNode,
223
230
  messageId: MESSAGE_ID.WRONG_INDENT,
224
- data: getMessageData(actualIndent, getIndentLevel()),
231
+ data: getMessageData(actualIndent, indentLevel.value()),
225
232
  fix(fixer) {
226
233
  return fixer.replaceText(targetNode, expectedIndent);
227
234
  },
@@ -285,38 +292,47 @@ module.exports = {
285
292
  if (IGNORING_NODES.includes(node.name)) {
286
293
  parentIgnoringChildCount++;
287
294
  }
288
- indent();
295
+ indentLevel.indent(node);
296
+ },
297
+ ScriptTag(node) {
298
+ indentLevel.indent(node);
299
+ },
300
+ "ScriptTag:exit"(node) {
301
+ indentLevel.dedent(node);
289
302
  },
290
- ScriptTag: indent,
291
- "ScriptTag:exit": unindent,
292
303
  OpenScriptTagStart: checkIndent,
293
304
  OpenScriptTagEnd: checkIndent,
294
- StyleTag: indent,
295
- "StyleTag:exit": unindent,
305
+ StyleTag(node) {
306
+ indentLevel.indent(node);
307
+ },
308
+ "StyleTag:exit"(node) {
309
+ indentLevel.dedent(node);
310
+ },
296
311
  OpenStyleTagStart: checkIndent,
297
312
  OpenStyleTagEnd: checkIndent,
298
313
  OpenTagStart: checkIndent,
299
314
  OpenTagEnd: checkIndent,
300
315
  CloseTag: checkIndent,
301
- /**
302
- * @param {TagNode} node
303
- */
304
316
  "Tag:exit"(node) {
305
317
  if (IGNORING_NODES.includes(node.name)) {
306
318
  parentIgnoringChildCount--;
307
319
  }
308
- unindent();
320
+ indentLevel.dedent(node);
309
321
  },
310
322
 
311
323
  // Attribute
312
- Attribute: indent,
324
+ Attribute(node) {
325
+ indentLevel.indent(node);
326
+ },
313
327
  AttributeKey: checkIndent,
314
328
  AttributeValue: checkIndent,
315
- "Attribute:exit": unindent,
329
+ "Attribute:exit"(node) {
330
+ indentLevel.dedent(node);
331
+ },
316
332
 
317
333
  // Text
318
334
  Text(node) {
319
- indent();
335
+ indentLevel.indent(node);
320
336
  const lineNodes = splitToLineNodes(node);
321
337
  lineNodes.forEach((lineNode) => {
322
338
  if (lineNode.skipIndentCheck) {
@@ -327,13 +343,15 @@ module.exports = {
327
343
  }
328
344
  });
329
345
  },
330
- "Text:exit": unindent,
331
-
332
- // Comment
333
- Comment: indent,
346
+ "Text:exit"(node) {
347
+ indentLevel.dedent(node);
348
+ },
349
+ Comment(node) {
350
+ indentLevel.indent(node);
351
+ },
334
352
  CommentOpen: checkIndent,
335
353
  CommentContent(node) {
336
- indent();
354
+ indentLevel.indent(node);
337
355
  const lineNodes = splitToLineNodes(node);
338
356
  lineNodes.forEach((lineNode) => {
339
357
  if (lineNode.skipIndentCheck) {
@@ -345,32 +363,36 @@ module.exports = {
345
363
  });
346
364
  },
347
365
  CommentClose: checkIndent,
348
- "Comment:exit": unindent,
349
- "CommentContent:exit": unindent,
366
+ "Comment:exit"(node) {
367
+ indentLevel.dedent(node);
368
+ },
369
+ "CommentContent:exit"(node) {
370
+ indentLevel.dedent(node);
371
+ },
350
372
  };
351
373
 
352
374
  return {
353
375
  ...visitor,
354
376
  TaggedTemplateExpression(node) {
355
377
  if (shouldCheckTaggedTemplateExpression(node, context)) {
356
- baseIndentLevel = getBaseIndentLevel(node.quasi) + 1;
378
+ indentLevel.setBase(getBaseIndentLevel(node.quasi) + 1);
357
379
  parse(node.quasi, getSourceCode(context), visitor);
358
380
  }
359
381
  },
360
382
  "TaggedTemplateExpression:exit"(node) {
361
383
  if (shouldCheckTaggedTemplateExpression(node, context)) {
362
- baseIndentLevel = 0;
384
+ indentLevel.setBase(0);
363
385
  }
364
386
  },
365
387
  TemplateLiteral(node) {
366
388
  if (shouldCheckTemplateLiteral(node, context)) {
367
- baseIndentLevel = getBaseIndentLevel(node) + 1;
389
+ indentLevel.setBase(getBaseIndentLevel(node) + 1);
368
390
  parse(node, getSourceCode(context), visitor);
369
391
  }
370
392
  },
371
393
  "TemplateLiteral:exit"(node) {
372
394
  if (shouldCheckTemplateLiteral(node, context)) {
373
- baseIndentLevel = 0;
395
+ indentLevel.setBase(0);
374
396
  }
375
397
  },
376
398
  };
@@ -0,0 +1,2 @@
1
+ const indent = require("./indent");
2
+ module.exports = indent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@html-eslint/eslint-plugin",
3
- "version": "0.30.0-alpha.0",
3
+ "version": "0.31.0",
4
4
  "description": "ESLint plugin for html",
5
5
  "author": "yeonjuan",
6
6
  "homepage": "https://github.com/yeonjuan/html-eslint#readme",
@@ -45,15 +45,15 @@
45
45
  "accessibility"
46
46
  ],
47
47
  "dependencies": {
48
- "@html-eslint/template-parser": "^0.29.0"
48
+ "@html-eslint/template-parser": "^0.31.0"
49
49
  },
50
50
  "devDependencies": {
51
- "@html-eslint/parser": "^0.29.0",
51
+ "@html-eslint/parser": "^0.31.0",
52
52
  "@types/eslint": "^9.6.1",
53
53
  "@types/estree": "^0.0.47",
54
54
  "es-html-parser": "^1.0.0-alpha.4",
55
55
  "espree": "^10.3.0",
56
56
  "typescript": "^5.7.2"
57
57
  },
58
- "gitHead": "bb592a93f1095534de5e0ac0c4f854cc1a49bcab"
58
+ "gitHead": "0e9ece917af191d223ccec4b17d9096f02a96508"
59
59
  }
@@ -0,0 +1,55 @@
1
+ export = IndentLevel;
2
+ /**
3
+ * @typedef {import("../../types").AnyNode} AnyNode
4
+ * @typedef {{ [key in AnyNode['type']]?: number}} IncLevelOptions
5
+ * @typedef {(node: AnyNode) => number} GetIncreasingLevel
6
+ */
7
+ declare class IndentLevel {
8
+ /**
9
+ * @param {Object} config
10
+ * @param {GetIncreasingLevel} config.getIncreasingLevel
11
+ */
12
+ constructor(config: {
13
+ getIncreasingLevel: GetIncreasingLevel;
14
+ });
15
+ /**
16
+ * @member
17
+ * @private
18
+ * @type {number}
19
+ */
20
+ private level;
21
+ /**
22
+ * @member
23
+ * @private
24
+ * @type {number}
25
+ */
26
+ private baseLevel;
27
+ /**
28
+ * @member
29
+ * @private
30
+ */
31
+ private getInc;
32
+ /**
33
+ * @returns {number}
34
+ */
35
+ value(): number;
36
+ /**
37
+ * @param {AnyNode} node
38
+ */
39
+ indent(node: AnyNode): void;
40
+ /**
41
+ * @param {AnyNode} node
42
+ */
43
+ dedent(node: AnyNode): void;
44
+ /**
45
+ * @param {number} base
46
+ */
47
+ setBase(base: number): void;
48
+ }
49
+ declare namespace IndentLevel {
50
+ export { AnyNode, IncLevelOptions, GetIncreasingLevel };
51
+ }
52
+ type AnyNode = import("../../types").AnyNode;
53
+ type IncLevelOptions = { [key in AnyNode["type"]]?: number; };
54
+ type GetIncreasingLevel = (node: AnyNode) => number;
55
+ //# sourceMappingURL=indent-level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indent-level.d.ts","sourceRoot":"","sources":["../../../lib/rules/indent/indent-level.js"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH;IACE;;;OAGG;IACH,oBAFG;QAAmC,kBAAkB,EAA7C,kBAAkB;KAC5B,EAmBA;IAjBC;;;;OAIG;IACH,cAAe;IACf;;;;OAIG;IACH,kBAAkB;IAClB;;;OAGG;IACH,eAAuC;IAGzC;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,aAFW,OAAO,QAIjB;IAED;;OAEG;IACH,aAFW,OAAO,QAIjB;IAED;;OAEG;IACH,cAFW,MAAM,QAIhB;CACF;;;;eAzDY,OAAO,aAAa,EAAE,OAAO;uBAC7B,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,GAAC;0BACpC,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM"}
@@ -0,0 +1,22 @@
1
+ declare namespace _exports {
2
+ export { RuleModule, AnyNode, LineNode, BaseNode, TagNode, RuleListener, Token, SourceCode, TemplateLiteral, IndentType, MessageId };
3
+ }
4
+ declare const _exports: RuleModule;
5
+ export = _exports;
6
+ type RuleModule = import("../../types").RuleModule;
7
+ type AnyNode = import("../../types").AnyNode;
8
+ type LineNode = import("../../types").LineNode;
9
+ type BaseNode = import("../../types").BaseNode;
10
+ type TagNode = import("../../types").TagNode;
11
+ type RuleListener = import("../../types").RuleListener;
12
+ type Token = import("eslint").AST.Token;
13
+ type SourceCode = import("eslint").SourceCode;
14
+ type TemplateLiteral = import("estree").TemplateLiteral;
15
+ type IndentType = {
16
+ TAB: "tab";
17
+ SPACE: "space";
18
+ };
19
+ type MessageId = {
20
+ WRONG_INDENT: "wrongIndent";
21
+ };
22
+ //# sourceMappingURL=indent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indent.d.ts","sourceRoot":"","sources":["../../../lib/rules/indent/indent.js"],"names":[],"mappings":";;;wBAyCU,UAAU;;kBAxCN,OAAO,aAAa,EAAE,UAAU;eAChC,OAAO,aAAa,EAAE,OAAO;gBAC7B,OAAO,aAAa,EAAE,QAAQ;gBAC9B,OAAO,aAAa,EAAE,QAAQ;eAC9B,OAAO,aAAa,EAAE,OAAO;oBAC7B,OAAO,aAAa,EAAE,YAAY;aAClC,OAAO,QAAQ,EAAE,GAAG,CAAC,KAAK;kBAC1B,OAAO,QAAQ,EAAE,UAAU;uBAC3B,OAAO,QAAQ,EAAE,eAAe;;SAEhC,KAAK;WACL,OAAO;;;kBAEP,aAAa"}
@@ -0,0 +1,3 @@
1
+ export = indent;
2
+ import indent = require("./indent");
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/rules/indent/index.js"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"indent.d.ts","sourceRoot":"","sources":["../../lib/rules/indent.js"],"names":[],"mappings":";;;wBAwCU,UAAU;;kBAvCN,OAAO,UAAU,EAAE,UAAU;eAC7B,OAAO,UAAU,EAAE,OAAO;gBAC1B,OAAO,UAAU,EAAE,QAAQ;gBAC3B,OAAO,UAAU,EAAE,QAAQ;eAC3B,OAAO,UAAU,EAAE,OAAO;oBAC1B,OAAO,UAAU,EAAE,YAAY;aAC/B,OAAO,QAAQ,EAAE,GAAG,CAAC,KAAK;kBAC1B,OAAO,QAAQ,EAAE,UAAU;uBAC3B,OAAO,QAAQ,EAAE,eAAe;;SAEhC,KAAK;WACL,OAAO;;;kBAEP,aAAa"}
1
+ {"version":3,"file":"indent.d.ts","sourceRoot":"","sources":["../../lib/rules/indent.js"],"names":[],"mappings":";;;wBAyCU,UAAU;;kBAxCN,OAAO,UAAU,EAAE,UAAU;eAC7B,OAAO,UAAU,EAAE,OAAO;gBAC1B,OAAO,UAAU,EAAE,QAAQ;gBAC3B,OAAO,UAAU,EAAE,QAAQ;eAC3B,OAAO,UAAU,EAAE,OAAO;oBAC1B,OAAO,UAAU,EAAE,YAAY;aAC/B,OAAO,QAAQ,EAAE,GAAG,CAAC,KAAK;kBAC1B,OAAO,QAAQ,EAAE,UAAU;uBAC3B,OAAO,QAAQ,EAAE,eAAe;;SAEhC,KAAK;WACL,OAAO;;;kBAEP,aAAa"}