@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.
- package/lib/rules/indent/indent-level.js +61 -0
- package/lib/rules/{indent.js → indent/indent.js} +69 -47
- package/lib/rules/indent/index.js +2 -0
- package/package.json +4 -4
- package/types/rules/indent/indent-level.d.ts +55 -0
- package/types/rules/indent/indent-level.d.ts.map +1 -0
- package/types/rules/indent/indent.d.ts +22 -0
- package/types/rules/indent/indent.d.ts.map +1 -0
- package/types/rules/indent/index.d.ts +3 -0
- package/types/rules/indent/index.d.ts.map +1 -0
- package/types/rules/indent.d.ts.map +1 -1
|
@@ -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("
|
|
3
|
-
* @typedef { import("
|
|
4
|
-
* @typedef { import("
|
|
5
|
-
* @typedef { import("
|
|
6
|
-
* @typedef { import("
|
|
7
|
-
* @typedef { import("
|
|
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("
|
|
20
|
-
const { splitToLineNodes } = require("
|
|
19
|
+
const { RULE_CATEGORY } = require("../../constants");
|
|
20
|
+
const { splitToLineNodes } = require("../utils/node");
|
|
21
21
|
const {
|
|
22
22
|
shouldCheckTaggedTemplateExpression,
|
|
23
23
|
shouldCheckTemplateLiteral,
|
|
24
|
-
} = require("
|
|
25
|
-
const { getSourceCode } = require("
|
|
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(
|
|
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,
|
|
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
|
|
295
|
-
|
|
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
|
-
|
|
320
|
+
indentLevel.dedent(node);
|
|
309
321
|
},
|
|
310
322
|
|
|
311
323
|
// Attribute
|
|
312
|
-
Attribute
|
|
324
|
+
Attribute(node) {
|
|
325
|
+
indentLevel.indent(node);
|
|
326
|
+
},
|
|
313
327
|
AttributeKey: checkIndent,
|
|
314
328
|
AttributeValue: checkIndent,
|
|
315
|
-
"Attribute:exit"
|
|
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"
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
Comment
|
|
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"
|
|
349
|
-
|
|
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
|
-
|
|
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
|
-
|
|
384
|
+
indentLevel.setBase(0);
|
|
363
385
|
}
|
|
364
386
|
},
|
|
365
387
|
TemplateLiteral(node) {
|
|
366
388
|
if (shouldCheckTemplateLiteral(node, context)) {
|
|
367
|
-
|
|
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
|
-
|
|
395
|
+
indentLevel.setBase(0);
|
|
374
396
|
}
|
|
375
397
|
},
|
|
376
398
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@html-eslint/eslint-plugin",
|
|
3
|
-
"version": "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.
|
|
48
|
+
"@html-eslint/template-parser": "^0.31.0"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@html-eslint/parser": "^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": "
|
|
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 @@
|
|
|
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":";;;
|
|
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"}
|