eslint-plugin-lube 0.4.3 → 0.5.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/index.js CHANGED
@@ -1,125 +1,125 @@
1
- /**
2
- * @type {import("eslint").ESLint.Plugin & {
3
- * configs: Record<string, import("eslint").ESLint.ConfigData|{}>
4
- * }}
5
- */
6
- module.exports = {
7
- configs: {
8
- recommended: {
9
- extends: [ "eslint:recommended" ],
10
- plugins: [ "lube" ],
11
- rules: {
12
- "array-bracket-newline": [ "error", "consistent" ],
13
- "array-element-newline": [ "error", "consistent" ],
14
- "arrow-parens": [ "error", "as-needed" ],
15
- "arrow-spacing": [
16
- "error",
17
- { "before": true, "after": true }
18
- ],
19
- "block-spacing": [ "error", "always" ],
20
- "brace-style": [ "error", "1tbs" ],
21
- "comma-dangle": [ "error", "never" ],
22
- "comma-spacing": [
23
- "error",
24
- { "before": false, "after": true }
25
- ],
26
- "comma-style": [ "error", "last" ],
27
- "computed-property-spacing": [ "error", "never" ],
28
- "dot-location": [ "error", "property" ],
29
- "eol-last": [ "error", "never" ],
30
- "func-call-spacing": [ "error", "never" ],
31
- "function-call-argument-newline": [ "error", "consistent" ],
32
- "generator-star-spacing": [ "error", "after" ],
33
- "indent": [ "error", "tab" ],
34
- "jsx-quotes": [ "error", "prefer-double" ],
35
- "key-spacing": [
36
- "error",
37
- {
38
- "afterColon": true,
39
- "beforeColon": false
40
- }
41
- ],
42
- "keyword-spacing": [
43
- "error",
44
- { "after": true, "before": true }
45
- ],
46
- "max-len": [ "warn", 120 ],
47
- "max-statements-per-line": [ "error", { "max": 1 } ],
48
- "multiline-ternary": [ "error", "always-multiline" ],
49
- "newline-per-chained-call": [
50
- "error",
51
- { "ignoreChainWithDepth": 2 }
52
- ],
53
- "no-await-in-loop": "warn",
54
- "no-case-declarations": "off",
55
- "no-console": "warn",
56
- "no-duplicate-imports": "error",
57
- "no-lonely-if": "error",
58
- "no-multi-spaces": "error",
59
- "no-new-native-nonconstructor": "error",
60
- "no-self-compare": "error",
61
- "no-shadow": "error",
62
- "no-shadow-restricted-names": "error",
63
- "no-trailing-spaces": [
64
- "error",
65
- {
66
- "ignoreComments": false,
67
- "skipBlankLines": false
68
- }
69
- ],
70
- "object-curly-newline": [ "error", { "consistent": true } ],
71
- "object-curly-spacing": [ "error", "always" ],
72
- "operator-linebreak": [ "error", "before" ],
73
- "prefer-const": [
74
- "warn",
75
- {
76
- "destructuring": "all",
77
- "ignoreReadBeforeAssign": false
78
- }
79
- ],
80
- "quotes": [ "error", "double" ],
81
- "rest-spread-spacing": [ "error", "never" ],
82
- "semi": [ "error", "never" ],
83
- "semi-spacing": [
84
- "error",
85
- { "after": true, "before": false }
86
- ],
87
- "semi-style": [ "error", "first" ],
88
- "space-before-blocks": [ "error", "always" ],
89
- "space-before-function-paren": [
90
- "error",
91
- {
92
- "anonymous": "never",
93
- "asyncArrow": "always",
94
- "named": "never"
95
- }
96
- ],
97
- "space-in-parens": [ "error", "never" ],
98
- "space-infix-ops": [ "error", { "int32Hint": true } ],
99
- "space-unary-ops": [
100
- "error",
101
- { "words": true, "nonwords": false }
102
- ],
103
- "switch-colon-spacing": [
104
- "error",
105
- { "after": true, "before": false }
106
- ],
107
- "template-curly-spacing": [ "error", "never" ],
108
- "template-tag-spacing": [ "error", "never" ],
109
- "yield-star-spacing": [ "error", "after" ],
110
- "lube/pretty-imports": "error",
111
- "lube/pretty-jsdoc-casting": "error",
112
- "lube/pretty-sequence": "error",
113
- "lube/svelte-naming-convention": "error"
114
- }
115
- }
116
- },
117
- rules: {
118
- "pretty-imports": require("./rules/pretty-imports"),
119
- "pretty-jsdoc-casting": require("./rules/pretty-jsdoc-casting"),
120
- "pretty-sequence": require("./rules/pretty-sequence"),
121
- "svelte-naming-convention": require(
122
- "./rules/svelte-naming-convention"
123
- )
124
- }
125
- }
1
+ const plugin = {
2
+ configs: { plugins: {}, rules: {} },
3
+ meta: { name: "eslint-plugin-lube" },
4
+ rules: {
5
+ "pretty-imports": require("./rules/pretty-imports"),
6
+ "pretty-jsdoc-casting": require("./rules/pretty-jsdoc-casting"),
7
+ "pretty-sequence": require("./rules/pretty-sequence"),
8
+ "svelte-naming-convention": require(
9
+ "./rules/svelte-naming-convention"
10
+ )
11
+ }
12
+ }
13
+
14
+ Object.assign(
15
+ plugin.configs,
16
+ {
17
+ plugins: { lube: plugin },
18
+ rules: {
19
+ "array-bracket-newline": [ "error", "consistent" ],
20
+ "array-element-newline": [ "error", "consistent" ],
21
+ "arrow-parens": [ "error", "as-needed" ],
22
+ "arrow-spacing": [
23
+ "error",
24
+ { "before": true, "after": true }
25
+ ],
26
+ "block-spacing": [ "error", "always" ],
27
+ "brace-style": [ "error", "1tbs" ],
28
+ "comma-dangle": [ "error", "never" ],
29
+ "comma-spacing": [
30
+ "error",
31
+ { "before": false, "after": true }
32
+ ],
33
+ "comma-style": [ "error", "last" ],
34
+ "computed-property-spacing": [ "error", "never" ],
35
+ "dot-location": [ "error", "property" ],
36
+ "eol-last": [ "error", "never" ],
37
+ "func-call-spacing": [ "error", "never" ],
38
+ "function-call-argument-newline": [ "error", "consistent" ],
39
+ "generator-star-spacing": [ "error", "after" ],
40
+ "indent": [ "error", "tab" ],
41
+ "jsx-quotes": [ "error", "prefer-double" ],
42
+ "key-spacing": [
43
+ "error",
44
+ {
45
+ "afterColon": true,
46
+ "beforeColon": false
47
+ }
48
+ ],
49
+ "keyword-spacing": [
50
+ "error",
51
+ { "after": true, "before": true }
52
+ ],
53
+ "max-len": [ "warn", 120 ],
54
+ "max-statements-per-line": [ "error", { "max": 1 } ],
55
+ "multiline-ternary": [ "error", "always-multiline" ],
56
+ "newline-per-chained-call": [
57
+ "error",
58
+ { "ignoreChainWithDepth": 2 }
59
+ ],
60
+ "no-await-in-loop": "warn",
61
+ "no-case-declarations": "off",
62
+ "no-console": "warn",
63
+ "no-duplicate-imports": "error",
64
+ "no-lonely-if": "error",
65
+ "no-multi-spaces": "error",
66
+ "no-new-native-nonconstructor": "error",
67
+ "no-self-compare": "error",
68
+ "no-shadow": "error",
69
+ "no-shadow-restricted-names": "error",
70
+ "no-trailing-spaces": [
71
+ "error",
72
+ {
73
+ "ignoreComments": false,
74
+ "skipBlankLines": false
75
+ }
76
+ ],
77
+ "object-curly-newline": [ "error", { "consistent": true } ],
78
+ "object-curly-spacing": [ "error", "always" ],
79
+ "operator-linebreak": [ "error", "before" ],
80
+ "prefer-const": [
81
+ "warn",
82
+ {
83
+ "destructuring": "all",
84
+ "ignoreReadBeforeAssign": false
85
+ }
86
+ ],
87
+ "quotes": [ "error", "double" ],
88
+ "rest-spread-spacing": [ "error", "never" ],
89
+ "semi": [ "error", "never" ],
90
+ "semi-spacing": [
91
+ "error",
92
+ { "after": true, "before": false }
93
+ ],
94
+ "semi-style": [ "error", "first" ],
95
+ "space-before-blocks": [ "error", "always" ],
96
+ "space-before-function-paren": [
97
+ "error",
98
+ {
99
+ "anonymous": "never",
100
+ "asyncArrow": "always",
101
+ "named": "never"
102
+ }
103
+ ],
104
+ "space-in-parens": [ "error", "never" ],
105
+ "space-infix-ops": [ "error", { "int32Hint": true } ],
106
+ "space-unary-ops": [
107
+ "error",
108
+ { "words": true, "nonwords": false }
109
+ ],
110
+ "switch-colon-spacing": [
111
+ "error",
112
+ { "after": true, "before": false }
113
+ ],
114
+ "template-curly-spacing": [ "error", "never" ],
115
+ "template-tag-spacing": [ "error", "never" ],
116
+ "yield-star-spacing": [ "error", "after" ],
117
+ "lube/pretty-imports": "error",
118
+ "lube/pretty-jsdoc-casting": "error",
119
+ "lube/pretty-sequence": "error",
120
+ "lube/svelte-naming-convention": "error"
121
+ }
122
+ }
123
+ )
124
+
125
+ module.exports = plugin
package/package.json CHANGED
@@ -1,32 +1,38 @@
1
- {
2
- "author": "artxe2",
3
- "bugs": {
4
- "url": "https://github.com/Artxe2/lube-series/issues"
5
- },
6
- "description": "Full fixable rules for auto-formatting with ESLint only without Prettier",
7
- "devDependencies": {
8
- "@types/eslint": "^8.44.6",
9
- "@types/estree": "^1.0.3",
10
- "@typescript-eslint/parser": "^6.9.0",
11
- "eslint": "^8.52.0",
12
- "mocha": "^10.2.0",
13
- "typescript": "^5.2.2"
14
- },
15
- "keywords": [
16
- "eslint-plugin",
17
- "lube",
18
- "eslint-plugin-lube",
19
- "prettier",
20
- "jsdoc"
21
- ],
22
- "license": "MIT",
23
- "name": "eslint-plugin-lube",
24
- "repository": {
25
- "directory": "packages/eslint-plugin-lube",
26
- "type": "git",
27
- "url": "https://github.com/Artxe2/lube-series"
28
- },
29
- "scripts": { "dts": "tsc", "test": "mocha" },
30
- "type": "commonjs",
31
- "version": "0.4.3"
1
+ {
2
+ "author": "artxe2",
3
+ "bugs": {
4
+ "url": "https://github.com/Artxe2/lube-series/issues"
5
+ },
6
+ "description": "Full fixable rules for auto-formatting with ESLint only without Prettier",
7
+ "devDependencies": {
8
+ "@types/eslint": "^9.6.1",
9
+ "@types/estree": "^1.0.8",
10
+ "@typescript-eslint/parser": "^8.35.0",
11
+ "eslint": "^9.29.0",
12
+ "mocha": "^11.7.0",
13
+ "typescript": "^5.8.3"
14
+ },
15
+ "keywords": [
16
+ "eslint-plugin",
17
+ "lube",
18
+ "eslint-plugin-lube",
19
+ "prettier",
20
+ "jsdoc"
21
+ ],
22
+ "license": "MIT",
23
+ "name": "eslint-plugin-lube",
24
+ "peerDependencies": {
25
+ "eslint": ">=9.0.0"
26
+ },
27
+ "repository": {
28
+ "directory": "packages/eslint-plugin-lube",
29
+ "type": "git",
30
+ "url": "https://github.com/Artxe2/lube-series"
31
+ },
32
+ "scripts": {
33
+ "dts": "tsc",
34
+ "test": "mocha"
35
+ },
36
+ "type": "commonjs",
37
+ "version": "0.5.0"
32
38
  }
@@ -28,17 +28,17 @@ module.exports = {
28
28
  },
29
29
  create(context) {
30
30
  /** @type {import("../private").RuleOptions["pretty-imports"]} */
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
31
+ const option = context.options[0]
32
+ const check_exports = option?.checkExports ?? true
33
+ const check_imports = option?.checkImports ?? true
34
+ const indent = option?.indent ?? "\t"
35
+ const max_length = option?.maxLength ?? 30
36
+ const semicolon = option?.semicolon ?? false
37
37
 
38
- let source_code = context.sourceCode
39
- let text = source_code.text
40
- let indent_regex = /[ \t]*(?=[^\n]*$)/
41
- let _r_regex = /\r/g
38
+ const source_code = context.sourceCode
39
+ const text = source_code.text
40
+ const indent_regex = /[ \t]*(?=[^\n]*$)/
41
+ const _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
- let substr = typeof node_or_start == "number"
65
+ const 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
- let line_indent = get_indent(node.range[0])
98
+ const line_indent = get_indent(node.range[0])
99
99
  let length = 0
100
- for (let s of node.specifiers) {
100
+ for (const 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
- let line_indent = get_indent(node.range[0])
126
+ const line_indent = get_indent(node.range[0])
127
127
  let length = 0
128
- for (let s of node.specifiers) {
128
+ for (const 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
- let left_space_regex = /\s+$/
4
- let right_space_regex = /^\s+/
5
- let type_regex = /(?<=(?:^|.*\s*)@type\s*\{).+(?=\}.*?$)/
3
+ const left_space_regex = /\s+$/
4
+ const right_space_regex = /^\s+/
5
+ const 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
- let array = []
12
+ const 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
- let source_code = context.sourceCode
33
- let origin_text = source_code.text
32
+ const source_code = context.sourceCode
33
+ const origin_text = source_code.text
34
34
  let fixed_text = origin_text
35
- let text_length = fixed_text.length + 1
36
- let text_indexes = get_indexed_array(text_length)
35
+ const text_length = fixed_text.length + 1
36
+ const text_indexes = get_indexed_array(text_length)
37
37
  /** @type {import("../private").Comment[]} */
38
- let comments = []
39
- for (let comment of /** @type {import("../private").Comment[]} */(source_code.getAllComments())/**/) {
38
+ const comments = []
39
+ for (const 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
- let expressions = []
44
+ const expressions = []
45
45
  /** @type {Set<string>} */
46
- let node_ranges = new Set
46
+ const 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
- let temp_indexes = [ ...text_indexes ]
54
+ const temp_indexes = [ ...text_indexes ]
55
55
  /** @type {(string | undefined)[]} */
56
- let types = []
56
+ const types = []
57
57
  /** @type {true[]} */
58
- let extras = []
58
+ const extras = []
59
59
  /**
60
60
  * @param {number} start
61
61
  * @param {number} end
@@ -63,41 +63,45 @@ module.exports = {
63
63
  * @returns {void}
64
64
  */
65
65
  function temp_text_changes(start, end, insert = "") {
66
- let gap = insert.length + temp_indexes[start] - temp_indexes[end]
67
- temp_text = temp_text.slice(0, temp_indexes[start]) + insert + temp_text.slice(temp_indexes[end])
66
+ const s = temp_indexes[start]
67
+ const e = temp_indexes[end]
68
+ if (s == null || e == null) return
69
+ const gap = insert.length + s - e
70
+ temp_text = temp_text.slice(0, s) + insert + temp_text.slice(e)
68
71
  if (gap) {
69
72
  while (end < text_length) {
70
73
  temp_indexes[end++] += gap
71
74
  }
72
75
  }
73
76
  }
77
+ let comment
74
78
  let open = 0
75
79
  let close = 0
76
80
  let prev_open = 0
77
81
  let prev_close = 0
78
82
  let [ left, right ] = node.range
79
83
  W: while (left > 0) {
80
- if (comments[left - 1]) {
81
- let comment = comments[left - 1]
84
+ comment = comments[left - 1]
85
+ if (comment) {
82
86
  left = comment.range[0]
83
87
  if (open && !types[open - 1]) {
84
- let type = comment.type == "Block" && type_regex.exec(comment.value)?.[0]
88
+ const type = comment.type == "Block" && type_regex.exec(comment.value)?.[0]
85
89
  if (type) {
86
90
  types[open - 1] = type
87
91
  temp_text_changes(...comment.range)
88
92
  }
89
93
  }
90
94
  } else {
91
- let left_space = left_space_regex.exec(origin_text.slice(0, left))?.[0].length
95
+ const left_space = left_space_regex.exec(origin_text.slice(0, left))?.[0].length
92
96
  if (left_space) {
93
97
  left -= left_space
94
98
  } else if (origin_text[left - 1] == "(") {
95
99
  while (right < text_length) {
96
- if (comments[right]) {
97
- let comment = comments[right]
100
+ comment = comments[right]
101
+ if (comment) {
98
102
  right = comment.range[1]
99
103
  } else {
100
- let right_space = right_space_regex.exec(origin_text.slice(right))?.[0].length
104
+ const right_space = right_space_regex.exec(origin_text.slice(right))?.[0].length
101
105
  if (right_space) {
102
106
  right += right_space
103
107
  } else {
@@ -132,8 +136,9 @@ module.exports = {
132
136
  temp_text_changes(prev_open, prev_open, "(")
133
137
  temp_text_changes(prev_close, prev_close, ")")
134
138
  }
135
- let start = temp_indexes[node.range[0]]
139
+ const start = temp_indexes[node.range[0]]
136
140
  let end = temp_indexes[node.range[1]]
141
+ if (!end) return
137
142
  if (extras[end] || open && temp_text.slice(end, end + 4) == "/**/") {
138
143
  end += 4
139
144
  }
@@ -161,8 +166,11 @@ module.exports = {
161
166
  * @returns {void}
162
167
  */
163
168
  function report(node, start, end, corrected_text) {
164
- fixed_text = fixed_text.slice(0, text_indexes[start]) + corrected_text + fixed_text.slice(text_indexes[end])
165
- let gap = corrected_text.length + text_indexes[start] - text_indexes[end]
169
+ const s = text_indexes[start]
170
+ const e = text_indexes[end]
171
+ if (s == null || e == null) return
172
+ fixed_text = fixed_text.slice(0, s) + corrected_text + fixed_text.slice(e)
173
+ const gap = corrected_text.length + s - e
166
174
  if (gap) {
167
175
  for (let i = end; i < text_length; i++) {
168
176
  text_indexes[i] += gap
@@ -187,14 +195,14 @@ module.exports = {
187
195
  * @returns {void}
188
196
  */
189
197
  function push_to_reverse(node) {
190
- let range = `${node.range[0]} ${node.range[1]}`
198
+ const range = `${node.range[0]} ${node.range[1]}`
191
199
  if (node_ranges.has(range)) return
192
200
  node_ranges.add(range)
193
201
  expressions.push(node)
194
202
  }
195
203
  return {
196
204
  "Program:exit": () => {
197
- for (let node of expressions.reverse()) {
205
+ for (const node of expressions.reverse()) {
198
206
  verify_correct(node)
199
207
  }
200
208
  },