eslint-plugin-lube 0.4.1 → 0.4.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.
- package/README.md +1 -0
- package/docs/pretty-sequence.md +1 -1
- package/package.json +4 -6
- package/private.d.ts +1 -1
- package/rules/pretty-imports.js +15 -15
- package/rules/pretty-jsdoc-casting.js +25 -25
- package/rules/pretty-sequence.js +48 -46
- package/rules/svelte-naming-convention.js +16 -17
- package/test/pretty-imports.js +3 -3
- package/test/pretty-jsdoc-casting/case_by_expression.js +1 -1
- package/test/pretty-jsdoc-casting.js +3 -3
- package/test/pretty-sequence/various_situations.js +11 -0
- package/test/pretty-sequence.js +3 -3
- package/test/svelte-naming-convention.js +3 -3
- package/tsconfig.json +1 -1
package/README.md
CHANGED
|
@@ -5,4 +5,5 @@
|
|
|
5
5
|
|---|---|---|---|
|
|
6
6
|
| pretty-imports | [docs](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/docs/pretty-imports.md) | [code](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/rules/pretty-imports.js) | [test](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/test/pretty-imports) |
|
|
7
7
|
| pretty-jsdoc-casting | [docs](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/docs/pretty-jsdoc-casting.md) | [code](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/rules/pretty-jsdoc-casting.js) | [test](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/test/pretty-jsdoc-casting) |
|
|
8
|
+
| pretty-sequence | [docs](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/docs/pretty-sequence.md) | [code](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/rules/pretty-sequence.js) | [test](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/test/pretty-sequence) |
|
|
8
9
|
| svelte-naming-convention | [docs](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/docs/svelte-naming-convention.md) | [code](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/rules/svelte-naming-convention.js) | [test](https://github.com/Artxe2/lube-series/blob/master/packages/eslint-plugin-lube/test/svelte-naming-convention) |
|
package/docs/pretty-sequence.md
CHANGED
package/package.json
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"@types/estree": "^1.0.3",
|
|
10
10
|
"@typescript-eslint/parser": "^6.9.0",
|
|
11
11
|
"eslint": "^8.52.0",
|
|
12
|
-
"mocha": "^10.2.0"
|
|
12
|
+
"mocha": "^10.2.0",
|
|
13
|
+
"typescript": "^5.2.2"
|
|
13
14
|
},
|
|
14
15
|
"keywords": [
|
|
15
16
|
"eslint-plugin",
|
|
@@ -25,10 +26,7 @@
|
|
|
25
26
|
"type": "git",
|
|
26
27
|
"url": "https://github.com/Artxe2/lube-series"
|
|
27
28
|
},
|
|
28
|
-
"scripts": {
|
|
29
|
-
"dts": "tsc",
|
|
30
|
-
"test": "mocha"
|
|
31
|
-
},
|
|
29
|
+
"scripts": { "dts": "tsc", "test": "mocha" },
|
|
32
30
|
"type": "commonjs",
|
|
33
|
-
"version": "0.4.
|
|
31
|
+
"version": "0.4.3"
|
|
34
32
|
}
|
package/private.d.ts
CHANGED
package/rules/pretty-imports.js
CHANGED
|
@@ -28,17 +28,17 @@ module.exports = {
|
|
|
28
28
|
},
|
|
29
29
|
create(context) {
|
|
30
30
|
/** @type {import("../private").RuleOptions["pretty-imports"]} */
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
let option = context.options[0]
|
|
32
|
+
let check_exports = option?.checkExports ?? true
|
|
33
|
+
let check_imports = option?.checkImports ?? true
|
|
34
|
+
let indent = option?.indent ?? "\t"
|
|
35
|
+
let max_length = option?.maxLength ?? 30
|
|
36
|
+
let semicolon = option?.semicolon ?? false
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
let source_code = context.sourceCode
|
|
39
|
+
let text = source_code.text
|
|
40
|
+
let indent_regex = /[ \t]*(?=[^\n]*$)/
|
|
41
|
+
let _r_regex = /\r/g
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
44
|
* @param {number} index
|
|
@@ -62,7 +62,7 @@ module.exports = {
|
|
|
62
62
|
* @returns {string}
|
|
63
63
|
*/
|
|
64
64
|
function get_text(node_or_start, end) {
|
|
65
|
-
|
|
65
|
+
let substr = typeof node_or_start == "number"
|
|
66
66
|
? text.slice(node_or_start, end)
|
|
67
67
|
: text.slice(
|
|
68
68
|
node_or_start.range[0],
|
|
@@ -95,9 +95,9 @@ module.exports = {
|
|
|
95
95
|
*/
|
|
96
96
|
ExportNamedDeclaration(node) {
|
|
97
97
|
if (check_exports && node.specifiers[0]?.type == "ExportSpecifier") {
|
|
98
|
-
|
|
98
|
+
let line_indent = get_indent(node.range[0])
|
|
99
99
|
let length = 0
|
|
100
|
-
for (
|
|
100
|
+
for (let s of node.specifiers) {
|
|
101
101
|
length += s.range[1] - s.range[0]
|
|
102
102
|
}
|
|
103
103
|
let corrected_text = length > max_length
|
|
@@ -123,9 +123,9 @@ module.exports = {
|
|
|
123
123
|
*/
|
|
124
124
|
ImportDeclaration(node) {
|
|
125
125
|
if (check_imports && node.specifiers[0]?.type == "ImportSpecifier") {
|
|
126
|
-
|
|
126
|
+
let line_indent = get_indent(node.range[0])
|
|
127
127
|
let length = 0
|
|
128
|
-
for (
|
|
128
|
+
for (let s of node.specifiers) {
|
|
129
129
|
length += s.range[1] - s.range[0]
|
|
130
130
|
}
|
|
131
131
|
let corrected_text = length > max_length
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
let left_space_regex = /\s+$/
|
|
4
|
+
let right_space_regex = /^\s+/
|
|
5
|
+
let type_regex = /(?<=(?:^|.*\s*)@type\s*\{).+(?=\}.*?$)/
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* @param {number} length
|
|
9
9
|
* @returns {number[]}
|
|
10
10
|
*/
|
|
11
11
|
function get_indexed_array(length) {
|
|
12
|
-
|
|
12
|
+
let array = []
|
|
13
13
|
while (length) array[--length] = length
|
|
14
14
|
return array
|
|
15
15
|
}
|
|
@@ -29,21 +29,21 @@ module.exports = {
|
|
|
29
29
|
type: "layout"
|
|
30
30
|
},
|
|
31
31
|
create(context) {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
let source_code = context.sourceCode
|
|
33
|
+
let origin_text = source_code.text
|
|
34
34
|
let fixed_text = origin_text
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
let text_length = fixed_text.length + 1
|
|
36
|
+
let text_indexes = get_indexed_array(text_length)
|
|
37
37
|
/** @type {import("../private").Comment[]} */
|
|
38
|
-
|
|
39
|
-
for (
|
|
38
|
+
let comments = []
|
|
39
|
+
for (let comment of /** @type {import("../private").Comment[]} */(source_code.getAllComments())/**/) {
|
|
40
40
|
let [ start, end ] = comment.range
|
|
41
41
|
while (start < end) comments[start++] = comment
|
|
42
42
|
}
|
|
43
43
|
/** @type {import("../private").AstNode[] & import("estree").Expression[]} */
|
|
44
|
-
|
|
44
|
+
let expressions = []
|
|
45
45
|
/** @type {Set<string>} */
|
|
46
|
-
|
|
46
|
+
let node_ranges = new Set
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
49
|
* @param {import("../private").AstNode} node
|
|
@@ -51,11 +51,11 @@ module.exports = {
|
|
|
51
51
|
*/
|
|
52
52
|
function verify_correct(node) {
|
|
53
53
|
let temp_text = fixed_text
|
|
54
|
-
|
|
54
|
+
let temp_indexes = [ ...text_indexes ]
|
|
55
55
|
/** @type {(string | undefined)[]} */
|
|
56
|
-
|
|
56
|
+
let types = []
|
|
57
57
|
/** @type {true[]} */
|
|
58
|
-
|
|
58
|
+
let extras = []
|
|
59
59
|
/**
|
|
60
60
|
* @param {number} start
|
|
61
61
|
* @param {number} end
|
|
@@ -63,7 +63,7 @@ module.exports = {
|
|
|
63
63
|
* @returns {void}
|
|
64
64
|
*/
|
|
65
65
|
function temp_text_changes(start, end, insert = "") {
|
|
66
|
-
|
|
66
|
+
let gap = insert.length + temp_indexes[start] - temp_indexes[end]
|
|
67
67
|
temp_text = temp_text.slice(0, temp_indexes[start]) + insert + temp_text.slice(temp_indexes[end])
|
|
68
68
|
if (gap) {
|
|
69
69
|
while (end < text_length) {
|
|
@@ -78,26 +78,26 @@ module.exports = {
|
|
|
78
78
|
let [ left, right ] = node.range
|
|
79
79
|
W: while (left > 0) {
|
|
80
80
|
if (comments[left - 1]) {
|
|
81
|
-
|
|
81
|
+
let comment = comments[left - 1]
|
|
82
82
|
left = comment.range[0]
|
|
83
83
|
if (open && !types[open - 1]) {
|
|
84
|
-
|
|
84
|
+
let type = comment.type == "Block" && type_regex.exec(comment.value)?.[0]
|
|
85
85
|
if (type) {
|
|
86
86
|
types[open - 1] = type
|
|
87
87
|
temp_text_changes(...comment.range)
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
} else {
|
|
91
|
-
|
|
91
|
+
let left_space = left_space_regex.exec(origin_text.slice(0, left))?.[0].length
|
|
92
92
|
if (left_space) {
|
|
93
93
|
left -= left_space
|
|
94
94
|
} else if (origin_text[left - 1] == "(") {
|
|
95
95
|
while (right < text_length) {
|
|
96
96
|
if (comments[right]) {
|
|
97
|
-
|
|
97
|
+
let comment = comments[right]
|
|
98
98
|
right = comment.range[1]
|
|
99
99
|
} else {
|
|
100
|
-
|
|
100
|
+
let right_space = right_space_regex.exec(origin_text.slice(right))?.[0].length
|
|
101
101
|
if (right_space) {
|
|
102
102
|
right += right_space
|
|
103
103
|
} else {
|
|
@@ -132,7 +132,7 @@ module.exports = {
|
|
|
132
132
|
temp_text_changes(prev_open, prev_open, "(")
|
|
133
133
|
temp_text_changes(prev_close, prev_close, ")")
|
|
134
134
|
}
|
|
135
|
-
|
|
135
|
+
let start = temp_indexes[node.range[0]]
|
|
136
136
|
let end = temp_indexes[node.range[1]]
|
|
137
137
|
if (extras[end] || open && temp_text.slice(end, end + 4) == "/**/") {
|
|
138
138
|
end += 4
|
|
@@ -162,7 +162,7 @@ module.exports = {
|
|
|
162
162
|
*/
|
|
163
163
|
function report(node, start, end, corrected_text) {
|
|
164
164
|
fixed_text = fixed_text.slice(0, text_indexes[start]) + corrected_text + fixed_text.slice(text_indexes[end])
|
|
165
|
-
|
|
165
|
+
let gap = corrected_text.length + text_indexes[start] - text_indexes[end]
|
|
166
166
|
if (gap) {
|
|
167
167
|
for (let i = end; i < text_length; i++) {
|
|
168
168
|
text_indexes[i] += gap
|
|
@@ -187,14 +187,14 @@ module.exports = {
|
|
|
187
187
|
* @returns {void}
|
|
188
188
|
*/
|
|
189
189
|
function push_to_reverse(node) {
|
|
190
|
-
|
|
190
|
+
let range = `${node.range[0]} ${node.range[1]}`
|
|
191
191
|
if (node_ranges.has(range)) return
|
|
192
192
|
node_ranges.add(range)
|
|
193
193
|
expressions.push(node)
|
|
194
194
|
}
|
|
195
195
|
return {
|
|
196
196
|
"Program:exit": () => {
|
|
197
|
-
for (
|
|
197
|
+
for (let node of expressions.reverse()) {
|
|
198
198
|
verify_correct(node)
|
|
199
199
|
}
|
|
200
200
|
},
|
package/rules/pretty-sequence.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
let indent_regex = /[ \t]*(?=[^\n]*$)/
|
|
4
|
+
let left_space_regex = /\s+$/
|
|
5
|
+
let right_space_regex = /^\s+/
|
|
6
|
+
let __n_regex = /(?<=\n)/g
|
|
7
|
+
let _r_regex = /\r/g
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* @param {number} length
|
|
11
11
|
* @returns {number[]}
|
|
12
12
|
*/
|
|
13
13
|
function get_indexed_array(length) {
|
|
14
|
-
|
|
14
|
+
let array = []
|
|
15
15
|
while (length) array[--length] = length
|
|
16
16
|
return array
|
|
17
17
|
}
|
|
@@ -49,33 +49,33 @@ module.exports = {
|
|
|
49
49
|
},
|
|
50
50
|
create(context) {
|
|
51
51
|
/** @type {import("../private").RuleOptions["pretty-sequence"]} */
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
52
|
+
let option = context.options[0]
|
|
53
|
+
let array_bracket_spacing = option?.arrayBracketSpacing ?? true
|
|
54
|
+
let check_array = option?.checkArray ?? true
|
|
55
|
+
let check_call = option?.checkCall ?? true
|
|
56
|
+
let check_object = option?.checkObject ?? true
|
|
57
|
+
let check_sequence = option?.checkSequence ?? true
|
|
58
|
+
let func_call_spacing = option?.funcCallSpacing ?? false
|
|
59
|
+
let ignore_template_literal = option?.ignoreTemplateLiteral ?? true
|
|
60
|
+
let indent = option?.indent ?? "\t"
|
|
61
|
+
let max_length = option?.maxLength ?? 30
|
|
62
|
+
let object_curly_spacing = option?.objectCurlySpacing ?? true
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
let source_code = context.sourceCode
|
|
65
|
+
let origin_text = source_code.text
|
|
66
66
|
let fixed_text = origin_text
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
let text_length = fixed_text.length + 1
|
|
68
|
+
let text_indexes = get_indexed_array(text_length)
|
|
69
69
|
/** @type {import("../private").Comment[]} */
|
|
70
|
-
|
|
71
|
-
for (
|
|
70
|
+
let comments = []
|
|
71
|
+
for (let comment of /** @type {import("../private").Comment[]} */(source_code.getAllComments())/**/) {
|
|
72
72
|
let [ start, end ] = comment.range
|
|
73
73
|
while (start < end) comments[start++] = comment
|
|
74
74
|
}
|
|
75
75
|
/** @type {true[]} */
|
|
76
|
-
|
|
76
|
+
let ignored_indexes = []
|
|
77
77
|
/** @type {import("../private").AstNode[] & import("estree").Expression[]} */
|
|
78
|
-
|
|
78
|
+
let nodes = []
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
81
|
* @param {import("../private").AstNode} node
|
|
@@ -91,17 +91,17 @@ module.exports = {
|
|
|
91
91
|
if (comments[left - 1]) {
|
|
92
92
|
left = comments[left - 1].range[0]
|
|
93
93
|
} else {
|
|
94
|
-
|
|
94
|
+
let left_space = left_space_regex.exec(origin_text.slice(0, left))?.[0].length
|
|
95
95
|
if (left_space) {
|
|
96
96
|
left -= left_space
|
|
97
97
|
} else if (origin_text[left - 1] == "(") {
|
|
98
98
|
open_paren = true
|
|
99
99
|
while (right < end) {
|
|
100
100
|
if (comments[right]) {
|
|
101
|
-
|
|
101
|
+
let comment = comments[right]
|
|
102
102
|
right = comment.range[1]
|
|
103
103
|
} else {
|
|
104
|
-
|
|
104
|
+
let right_space = right_space_regex.exec(origin_text.slice(right))?.[0].length
|
|
105
105
|
if (right_space) {
|
|
106
106
|
right += right_space
|
|
107
107
|
} else {
|
|
@@ -122,10 +122,10 @@ module.exports = {
|
|
|
122
122
|
}
|
|
123
123
|
while (right < end) {
|
|
124
124
|
if (comments[right]) {
|
|
125
|
-
|
|
125
|
+
let comment = comments[right]
|
|
126
126
|
right = comment.range[1]
|
|
127
127
|
} else {
|
|
128
|
-
|
|
128
|
+
let right_space = right_space_regex.exec(origin_text.slice(right))?.[0].length
|
|
129
129
|
if (right_space) {
|
|
130
130
|
right += right_space
|
|
131
131
|
} else {
|
|
@@ -133,7 +133,7 @@ module.exports = {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
|
-
|
|
136
|
+
let substr = fixed_text.slice(
|
|
137
137
|
text_indexes[left],
|
|
138
138
|
text_indexes[right]
|
|
139
139
|
)
|
|
@@ -163,7 +163,7 @@ module.exports = {
|
|
|
163
163
|
*/
|
|
164
164
|
function report(node, start, end, corrected_text) {
|
|
165
165
|
fixed_text = fixed_text.slice(0, text_indexes[start]) + corrected_text + fixed_text.slice(text_indexes[end])
|
|
166
|
-
|
|
166
|
+
let gap = corrected_text.length + text_indexes[start] - text_indexes[end]
|
|
167
167
|
if (gap) {
|
|
168
168
|
for (let i = end; i < text_length; i++) {
|
|
169
169
|
text_indexes[i] += gap
|
|
@@ -206,17 +206,17 @@ module.exports = {
|
|
|
206
206
|
start = node.range[0] + 1
|
|
207
207
|
end = node.range[1] - 1
|
|
208
208
|
let null_anchor = start
|
|
209
|
-
|
|
209
|
+
let elements = node.elements.map(
|
|
210
210
|
v => {
|
|
211
|
-
|
|
211
|
+
let n = v ?? {
|
|
212
212
|
range: [ null_anchor, null_anchor ]
|
|
213
213
|
}
|
|
214
|
-
|
|
214
|
+
let text = get_text(n, start, end)
|
|
215
215
|
null_anchor += text.length + 1
|
|
216
216
|
return n
|
|
217
217
|
}
|
|
218
218
|
)
|
|
219
|
-
for (
|
|
219
|
+
for (let text of elements.map(v => get_text(v, start, end))) {
|
|
220
220
|
if (text.includes("\n")) {
|
|
221
221
|
length = max_length + 1
|
|
222
222
|
break
|
|
@@ -261,11 +261,9 @@ module.exports = {
|
|
|
261
261
|
[ start, end ] = node.params[0].range
|
|
262
262
|
}
|
|
263
263
|
} else {
|
|
264
|
-
start = node.
|
|
264
|
+
start = node.id
|
|
265
265
|
? origin_text.indexOf("(", node.id.range[1]) + 1
|
|
266
|
-
: node.
|
|
267
|
-
? origin_text.indexOf("(", node.id.range[1]) + 1
|
|
268
|
-
: origin_text.indexOf("(", node.range[0]) + 1
|
|
266
|
+
: origin_text.indexOf("(", node.range[0]) + 1
|
|
269
267
|
end = origin_text.indexOf(
|
|
270
268
|
")",
|
|
271
269
|
node.params.length
|
|
@@ -273,7 +271,7 @@ module.exports = {
|
|
|
273
271
|
: start
|
|
274
272
|
)
|
|
275
273
|
}
|
|
276
|
-
for (
|
|
274
|
+
for (let text of node.params.map(v => get_text(v, start, end))) {
|
|
277
275
|
if (text.includes("\n")) {
|
|
278
276
|
length = max_length + 1
|
|
279
277
|
break
|
|
@@ -302,7 +300,7 @@ module.exports = {
|
|
|
302
300
|
line_indent = get_indent(node.callee.range[1])
|
|
303
301
|
start = origin_text.indexOf("(", node.callee.range[1]) + 1
|
|
304
302
|
end = node.range[1] - 1
|
|
305
|
-
for (
|
|
303
|
+
for (let text of node.arguments.map(v => get_text(v, start, end))) {
|
|
306
304
|
if (text.includes("\n")) {
|
|
307
305
|
length = max_length + 1
|
|
308
306
|
break
|
|
@@ -329,7 +327,7 @@ module.exports = {
|
|
|
329
327
|
case "ObjectPattern":
|
|
330
328
|
start = node.range[0] + 1
|
|
331
329
|
end = node.range[1] - 1
|
|
332
|
-
for (
|
|
330
|
+
for (let text of node.properties.map(v => get_text(v, start, end))) {
|
|
333
331
|
if (text.includes("\n")) {
|
|
334
332
|
length = max_length + 1
|
|
335
333
|
break
|
|
@@ -356,7 +354,7 @@ module.exports = {
|
|
|
356
354
|
case "SequenceExpression":
|
|
357
355
|
start = node.range[0]
|
|
358
356
|
end = node.range[1]
|
|
359
|
-
for (
|
|
357
|
+
for (let text of node.expressions.map(v => get_text(v, start, end))) {
|
|
360
358
|
if (text.includes("\n")) {
|
|
361
359
|
length = max_length + 1
|
|
362
360
|
break
|
|
@@ -386,8 +384,12 @@ module.exports = {
|
|
|
386
384
|
}
|
|
387
385
|
return /** @type {import("../private").RuleListener} */({
|
|
388
386
|
"Program:exit": () => {
|
|
389
|
-
for (
|
|
390
|
-
|
|
387
|
+
for (let node of nodes.reverse()) {
|
|
388
|
+
try {
|
|
389
|
+
verify_correct(node)
|
|
390
|
+
} catch (error) {
|
|
391
|
+
console.error(node.type, node, error)
|
|
392
|
+
}
|
|
391
393
|
}
|
|
392
394
|
},
|
|
393
395
|
ArrayExpression: node => {
|
|
@@ -23,21 +23,21 @@ module.exports = {
|
|
|
23
23
|
},
|
|
24
24
|
create(context) {
|
|
25
25
|
/** @type {import("../private").RuleOptions["svelte-naming-convention"]} */
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
let option = context.options[0]
|
|
27
|
+
let fix_same_names = option?.fixSameNames ?? true
|
|
28
28
|
|
|
29
|
-
// let name |
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
// let name | let name | class name
|
|
30
|
+
let allow_regex = /^[_$]?[_$]?(?:[\da-z]+(?:_[\da-z]+)*\$?\$?)?$|^[A-Z](?:_?[\dA-Z]+)*$|^(?:[\dA-Z][\da-z]*)+$/
|
|
31
|
+
let fixable_name_regex = /^[_$]?[_$]?(?:[\dA-Za-z]+(?:_[\dA-Za-z]+)*\$?\$?)?$/
|
|
32
|
+
let fix_regex = /([\da-z]?)([A-Z][\dA-Z]*)/g
|
|
33
|
+
let camel_case_regex = /^[\da-z]+([A-Z][\da-z]*)*$/
|
|
34
34
|
|
|
35
35
|
/** @type {Map<string, import("../private").AstNode[]>} */
|
|
36
|
-
|
|
36
|
+
let pending_usages = new Map()
|
|
37
37
|
/** @type {Set<string>} */
|
|
38
|
-
|
|
38
|
+
let reported_declarations = new Set()
|
|
39
39
|
/** @type {Set<import("../private").AstNode>} */
|
|
40
|
-
|
|
40
|
+
let shortand_properties = new Set()
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* @param {import("../private").AstNode & import("estree").Identifier} node
|
|
@@ -45,7 +45,7 @@ module.exports = {
|
|
|
45
45
|
*/
|
|
46
46
|
function defer(node) {
|
|
47
47
|
if (fix_same_names) {
|
|
48
|
-
|
|
48
|
+
let name = node.name
|
|
49
49
|
if (reported_declarations.has(name)) report(node)
|
|
50
50
|
else {
|
|
51
51
|
let usages = pending_usages.get(name)
|
|
@@ -71,7 +71,7 @@ module.exports = {
|
|
|
71
71
|
* @returns {void}
|
|
72
72
|
*/
|
|
73
73
|
function report(node) {
|
|
74
|
-
|
|
74
|
+
let name = node.name
|
|
75
75
|
context.report(
|
|
76
76
|
{
|
|
77
77
|
data: { name },
|
|
@@ -90,7 +90,7 @@ module.exports = {
|
|
|
90
90
|
}
|
|
91
91
|
)
|
|
92
92
|
if (fix_same_names) {
|
|
93
|
-
|
|
93
|
+
let usages = pending_usages.get(name)
|
|
94
94
|
while (usages?.length) {
|
|
95
95
|
report(
|
|
96
96
|
/** @type {import("../private").AstNode & import("estree").Identifier} */(usages.pop())/**/
|
|
@@ -103,11 +103,10 @@ module.exports = {
|
|
|
103
103
|
return {
|
|
104
104
|
/** @param {import("../private").AstNode & import("estree").Identifier} node */
|
|
105
105
|
Identifier(node) {
|
|
106
|
-
|
|
106
|
+
let name = node.name
|
|
107
107
|
if (allow_regex.test(name)) return
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
switch (type) {
|
|
108
|
+
let parent = node.parent
|
|
109
|
+
switch (parent.type) {
|
|
111
110
|
case "ArrayExpression":
|
|
112
111
|
// var value = [ camelCase ]
|
|
113
112
|
defer(node)
|
package/test/pretty-imports.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict"
|
|
2
|
-
|
|
2
|
+
let { RuleTester } = require("eslint")
|
|
3
3
|
|
|
4
4
|
/** @type {RuleTester.ValidTestCase[]} */
|
|
5
|
-
|
|
5
|
+
let valid = []
|
|
6
6
|
/** @type {RuleTester.InvalidTestCase[]} */
|
|
7
|
-
|
|
7
|
+
let invalid = []
|
|
8
8
|
|
|
9
9
|
require(
|
|
10
10
|
"./pretty-imports/ExportNamedDeclaration"
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @param {string} value
|
|
4
4
|
* @returns {import("eslint").RuleTester.InvalidTestCase}
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
let test_case = (type, value) => ({
|
|
7
7
|
code: `
|
|
8
8
|
var value = /** @type {A} */(${value})
|
|
9
9
|
var value = /** @type {B} */(${value}) // comment...
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict"
|
|
2
|
-
|
|
2
|
+
let { RuleTester } = require("eslint")
|
|
3
3
|
|
|
4
4
|
/** @type {RuleTester.ValidTestCase[]} */
|
|
5
|
-
|
|
5
|
+
let valid = []
|
|
6
6
|
/** @type {RuleTester.InvalidTestCase[]} */
|
|
7
|
-
|
|
7
|
+
let invalid = []
|
|
8
8
|
|
|
9
9
|
require(
|
|
10
10
|
"./pretty-jsdoc-casting/case_by_expression"
|
|
@@ -46,6 +46,17 @@ exports.module = (valid, invalid) => {
|
|
|
46
46
|
)
|
|
47
47
|
`,
|
|
48
48
|
parserOptions: { ecmaVersion: "latest" }
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
code: `
|
|
52
|
+
export default function(abc) {
|
|
53
|
+
return [ abc, abc ]
|
|
54
|
+
}
|
|
55
|
+
`,
|
|
56
|
+
parserOptions: {
|
|
57
|
+
ecmaVersion: "latest",
|
|
58
|
+
sourceType: "module"
|
|
59
|
+
}
|
|
49
60
|
}
|
|
50
61
|
)
|
|
51
62
|
invalid.push(
|
package/test/pretty-sequence.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict"
|
|
2
|
-
|
|
2
|
+
let { RuleTester } = require("eslint")
|
|
3
3
|
|
|
4
4
|
/** @type {RuleTester.ValidTestCase[]} */
|
|
5
|
-
|
|
5
|
+
let valid = []
|
|
6
6
|
/** @type {RuleTester.InvalidTestCase[]} */
|
|
7
|
-
|
|
7
|
+
let invalid = []
|
|
8
8
|
|
|
9
9
|
require(
|
|
10
10
|
"./pretty-sequence/case_by_node_type"
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict"
|
|
2
|
-
|
|
2
|
+
let { RuleTester } = require("eslint")
|
|
3
3
|
|
|
4
4
|
/** @type {RuleTester.ValidTestCase[]} */
|
|
5
|
-
|
|
5
|
+
let valid = []
|
|
6
6
|
/** @type {RuleTester.InvalidTestCase[]} */
|
|
7
|
-
|
|
7
|
+
let invalid = []
|
|
8
8
|
|
|
9
9
|
require(
|
|
10
10
|
"./svelte-naming-convention/basic_snake_case"
|