@fookiejs/eslint-plugin 0.1.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.
Files changed (210) hide show
  1. package/README.md +512 -0
  2. package/dist/index.d.ts +164 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +167 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/rules/consistent-return.d.ts +7 -0
  7. package/dist/rules/consistent-return.d.ts.map +1 -0
  8. package/dist/rules/consistent-return.js +56 -0
  9. package/dist/rules/consistent-return.js.map +1 -0
  10. package/dist/rules/exhaustive-switch.d.ts +5 -0
  11. package/dist/rules/exhaustive-switch.d.ts.map +1 -0
  12. package/dist/rules/exhaustive-switch.js +83 -0
  13. package/dist/rules/exhaustive-switch.js.map +1 -0
  14. package/dist/rules/index.d.ts +50 -0
  15. package/dist/rules/index.d.ts.map +1 -0
  16. package/dist/rules/index.js +50 -0
  17. package/dist/rules/index.js.map +1 -0
  18. package/dist/rules/no-any.d.ts +5 -0
  19. package/dist/rules/no-any.d.ts.map +1 -0
  20. package/dist/rules/no-any.js +20 -0
  21. package/dist/rules/no-any.js.map +1 -0
  22. package/dist/rules/no-array-mutating-methods.d.ts +5 -0
  23. package/dist/rules/no-array-mutating-methods.d.ts.map +1 -0
  24. package/dist/rules/no-array-mutating-methods.js +65 -0
  25. package/dist/rules/no-array-mutating-methods.js.map +1 -0
  26. package/dist/rules/no-async-without-await.d.ts +5 -0
  27. package/dist/rules/no-async-without-await.d.ts.map +1 -0
  28. package/dist/rules/no-async-without-await.js +45 -0
  29. package/dist/rules/no-async-without-await.js.map +1 -0
  30. package/dist/rules/no-catch-instanceof.d.ts +5 -0
  31. package/dist/rules/no-catch-instanceof.d.ts.map +1 -0
  32. package/dist/rules/no-catch-instanceof.js +55 -0
  33. package/dist/rules/no-catch-instanceof.js.map +1 -0
  34. package/dist/rules/no-catch-unknown.d.ts +5 -0
  35. package/dist/rules/no-catch-unknown.d.ts.map +1 -0
  36. package/dist/rules/no-catch-unknown.js +32 -0
  37. package/dist/rules/no-catch-unknown.js.map +1 -0
  38. package/dist/rules/no-class-mutation.d.ts +5 -0
  39. package/dist/rules/no-class-mutation.d.ts.map +1 -0
  40. package/dist/rules/no-class-mutation.js +44 -0
  41. package/dist/rules/no-class-mutation.js.map +1 -0
  42. package/dist/rules/no-comments.d.ts +5 -0
  43. package/dist/rules/no-comments.d.ts.map +1 -0
  44. package/dist/rules/no-comments.js +27 -0
  45. package/dist/rules/no-comments.js.map +1 -0
  46. package/dist/rules/no-default-export.d.ts +5 -0
  47. package/dist/rules/no-default-export.d.ts.map +1 -0
  48. package/dist/rules/no-default-export.js +22 -0
  49. package/dist/rules/no-default-export.js.map +1 -0
  50. package/dist/rules/no-define-property.d.ts +5 -0
  51. package/dist/rules/no-define-property.d.ts.map +1 -0
  52. package/dist/rules/no-define-property.js +37 -0
  53. package/dist/rules/no-define-property.js.map +1 -0
  54. package/dist/rules/no-delete.d.ts +5 -0
  55. package/dist/rules/no-delete.d.ts.map +1 -0
  56. package/dist/rules/no-delete.js +35 -0
  57. package/dist/rules/no-delete.js.map +1 -0
  58. package/dist/rules/no-empty-string.d.ts +5 -0
  59. package/dist/rules/no-empty-string.d.ts.map +1 -0
  60. package/dist/rules/no-empty-string.js +24 -0
  61. package/dist/rules/no-empty-string.js.map +1 -0
  62. package/dist/rules/no-eval.d.ts +5 -0
  63. package/dist/rules/no-eval.d.ts.map +1 -0
  64. package/dist/rules/no-eval.js +33 -0
  65. package/dist/rules/no-eval.js.map +1 -0
  66. package/dist/rules/no-floating-promise.d.ts +5 -0
  67. package/dist/rules/no-floating-promise.d.ts.map +1 -0
  68. package/dist/rules/no-floating-promise.js +74 -0
  69. package/dist/rules/no-floating-promise.js.map +1 -0
  70. package/dist/rules/no-for-in.d.ts +5 -0
  71. package/dist/rules/no-for-in.d.ts.map +1 -0
  72. package/dist/rules/no-for-in.js +24 -0
  73. package/dist/rules/no-for-in.js.map +1 -0
  74. package/dist/rules/no-generic-names.d.ts +12 -0
  75. package/dist/rules/no-generic-names.d.ts.map +1 -0
  76. package/dist/rules/no-generic-names.js +104 -0
  77. package/dist/rules/no-generic-names.js.map +1 -0
  78. package/dist/rules/no-implicit-coercion.d.ts +7 -0
  79. package/dist/rules/no-implicit-coercion.d.ts.map +1 -0
  80. package/dist/rules/no-implicit-coercion.js +33 -0
  81. package/dist/rules/no-implicit-coercion.js.map +1 -0
  82. package/dist/rules/no-legacy-globals.d.ts +7 -0
  83. package/dist/rules/no-legacy-globals.d.ts.map +1 -0
  84. package/dist/rules/no-legacy-globals.js +58 -0
  85. package/dist/rules/no-legacy-globals.js.map +1 -0
  86. package/dist/rules/no-loop-func.d.ts +5 -0
  87. package/dist/rules/no-loop-func.d.ts.map +1 -0
  88. package/dist/rules/no-loop-func.js +50 -0
  89. package/dist/rules/no-loop-func.js.map +1 -0
  90. package/dist/rules/no-map-set-mutation.d.ts +5 -0
  91. package/dist/rules/no-map-set-mutation.d.ts.map +1 -0
  92. package/dist/rules/no-map-set-mutation.js +69 -0
  93. package/dist/rules/no-map-set-mutation.js.map +1 -0
  94. package/dist/rules/no-mutable-exports.d.ts +5 -0
  95. package/dist/rules/no-mutable-exports.d.ts.map +1 -0
  96. package/dist/rules/no-mutable-exports.js +29 -0
  97. package/dist/rules/no-mutable-exports.js.map +1 -0
  98. package/dist/rules/no-nan-array-indexof.d.ts +5 -0
  99. package/dist/rules/no-nan-array-indexof.d.ts.map +1 -0
  100. package/dist/rules/no-nan-array-indexof.js +33 -0
  101. package/dist/rules/no-nan-array-indexof.js.map +1 -0
  102. package/dist/rules/no-nan-in-math-result.d.ts +5 -0
  103. package/dist/rules/no-nan-in-math-result.d.ts.map +1 -0
  104. package/dist/rules/no-nan-in-math-result.js +58 -0
  105. package/dist/rules/no-nan-in-math-result.js.map +1 -0
  106. package/dist/rules/no-nan.d.ts +5 -0
  107. package/dist/rules/no-nan.d.ts.map +1 -0
  108. package/dist/rules/no-nan.js +26 -0
  109. package/dist/rules/no-nan.js.map +1 -0
  110. package/dist/rules/no-new-wrappers.d.ts +5 -0
  111. package/dist/rules/no-new-wrappers.d.ts.map +1 -0
  112. package/dist/rules/no-new-wrappers.js +47 -0
  113. package/dist/rules/no-new-wrappers.js.map +1 -0
  114. package/dist/rules/no-new.d.ts +5 -0
  115. package/dist/rules/no-new.d.ts.map +1 -0
  116. package/dist/rules/no-new.js +111 -0
  117. package/dist/rules/no-new.js.map +1 -0
  118. package/dist/rules/no-non-null-assertion.d.ts +5 -0
  119. package/dist/rules/no-non-null-assertion.d.ts.map +1 -0
  120. package/dist/rules/no-non-null-assertion.js +22 -0
  121. package/dist/rules/no-non-null-assertion.js.map +1 -0
  122. package/dist/rules/no-null-undefined.d.ts +7 -0
  123. package/dist/rules/no-null-undefined.d.ts.map +1 -0
  124. package/dist/rules/no-null-undefined.js +34 -0
  125. package/dist/rules/no-null-undefined.js.map +1 -0
  126. package/dist/rules/no-nullish-operators.d.ts +7 -0
  127. package/dist/rules/no-nullish-operators.d.ts.map +1 -0
  128. package/dist/rules/no-nullish-operators.js +31 -0
  129. package/dist/rules/no-nullish-operators.js.map +1 -0
  130. package/dist/rules/no-object-assign-mutation.d.ts +5 -0
  131. package/dist/rules/no-object-assign-mutation.d.ts.map +1 -0
  132. package/dist/rules/no-object-assign-mutation.js +36 -0
  133. package/dist/rules/no-object-assign-mutation.js.map +1 -0
  134. package/dist/rules/no-param-reassign.d.ts +5 -0
  135. package/dist/rules/no-param-reassign.d.ts.map +1 -0
  136. package/dist/rules/no-param-reassign.js +89 -0
  137. package/dist/rules/no-param-reassign.js.map +1 -0
  138. package/dist/rules/no-parseint-nan.d.ts +5 -0
  139. package/dist/rules/no-parseint-nan.d.ts.map +1 -0
  140. package/dist/rules/no-parseint-nan.js +64 -0
  141. package/dist/rules/no-parseint-nan.js.map +1 -0
  142. package/dist/rules/no-placeholder-names.d.ts +12 -0
  143. package/dist/rules/no-placeholder-names.d.ts.map +1 -0
  144. package/dist/rules/no-placeholder-names.js +107 -0
  145. package/dist/rules/no-placeholder-names.js.map +1 -0
  146. package/dist/rules/no-process-env.d.ts +5 -0
  147. package/dist/rules/no-process-env.d.ts.map +1 -0
  148. package/dist/rules/no-process-env.js +31 -0
  149. package/dist/rules/no-process-env.js.map +1 -0
  150. package/dist/rules/no-prototype-mutation.d.ts +5 -0
  151. package/dist/rules/no-prototype-mutation.d.ts.map +1 -0
  152. package/dist/rules/no-prototype-mutation.js +30 -0
  153. package/dist/rules/no-prototype-mutation.js.map +1 -0
  154. package/dist/rules/no-require.d.ts +5 -0
  155. package/dist/rules/no-require.d.ts.map +1 -0
  156. package/dist/rules/no-require.js +37 -0
  157. package/dist/rules/no-require.js.map +1 -0
  158. package/dist/rules/no-shadow.d.ts +5 -0
  159. package/dist/rules/no-shadow.d.ts.map +1 -0
  160. package/dist/rules/no-shadow.js +103 -0
  161. package/dist/rules/no-shadow.js.map +1 -0
  162. package/dist/rules/no-string-concat.d.ts +5 -0
  163. package/dist/rules/no-string-concat.d.ts.map +1 -0
  164. package/dist/rules/no-string-concat.js +36 -0
  165. package/dist/rules/no-string-concat.js.map +1 -0
  166. package/dist/rules/no-throw-literal.d.ts +5 -0
  167. package/dist/rules/no-throw-literal.d.ts.map +1 -0
  168. package/dist/rules/no-throw-literal.js +33 -0
  169. package/dist/rules/no-throw-literal.js.map +1 -0
  170. package/dist/rules/no-type-assertion.d.ts +5 -0
  171. package/dist/rules/no-type-assertion.d.ts.map +1 -0
  172. package/dist/rules/no-type-assertion.js +25 -0
  173. package/dist/rules/no-type-assertion.js.map +1 -0
  174. package/dist/rules/no-typeof.d.ts +5 -0
  175. package/dist/rules/no-typeof.d.ts.map +1 -0
  176. package/dist/rules/no-typeof.js +24 -0
  177. package/dist/rules/no-typeof.js.map +1 -0
  178. package/dist/rules/no-unknown.d.ts +5 -0
  179. package/dist/rules/no-unknown.d.ts.map +1 -0
  180. package/dist/rules/no-unknown.js +22 -0
  181. package/dist/rules/no-unknown.js.map +1 -0
  182. package/dist/rules/prefer-includes.d.ts +5 -0
  183. package/dist/rules/prefer-includes.d.ts.map +1 -0
  184. package/dist/rules/prefer-includes.js +50 -0
  185. package/dist/rules/prefer-includes.js.map +1 -0
  186. package/dist/rules/prefer-readonly-params.d.ts +5 -0
  187. package/dist/rules/prefer-readonly-params.d.ts.map +1 -0
  188. package/dist/rules/prefer-readonly-params.js +100 -0
  189. package/dist/rules/prefer-readonly-params.js.map +1 -0
  190. package/dist/rules/require-boolean-condition.d.ts +5 -0
  191. package/dist/rules/require-boolean-condition.d.ts.map +1 -0
  192. package/dist/rules/require-boolean-condition.js +60 -0
  193. package/dist/rules/require-boolean-condition.js.map +1 -0
  194. package/dist/rules/require-curly.d.ts +5 -0
  195. package/dist/rules/require-curly.d.ts.map +1 -0
  196. package/dist/rules/require-curly.js +55 -0
  197. package/dist/rules/require-curly.js.map +1 -0
  198. package/dist/rules/require-explicit-return-type.d.ts +5 -0
  199. package/dist/rules/require-explicit-return-type.d.ts.map +1 -0
  200. package/dist/rules/require-explicit-return-type.js +66 -0
  201. package/dist/rules/require-explicit-return-type.js.map +1 -0
  202. package/dist/rules/require-private-constructor.d.ts +5 -0
  203. package/dist/rules/require-private-constructor.d.ts.map +1 -0
  204. package/dist/rules/require-private-constructor.js +34 -0
  205. package/dist/rules/require-private-constructor.js.map +1 -0
  206. package/dist/rules/same-type-comparison.d.ts +5 -0
  207. package/dist/rules/same-type-comparison.d.ts.map +1 -0
  208. package/dist/rules/same-type-comparison.js +71 -0
  209. package/dist/rules/same-type-comparison.js.map +1 -0
  210. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,512 @@
1
+ # fookie-eslint
2
+
3
+ > `fookie-eslint-plugin` — Opinionated ESLint rules for TypeScript enforcing explicit types, immutable data flow, and zero JS gotchas.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install --save-dev fookie-eslint-plugin
9
+ ```
10
+
11
+ ## Setup
12
+
13
+ ```js
14
+ import fookie from 'fookie-eslint-plugin'
15
+
16
+ export default [
17
+ fookie.configs['recommended'],
18
+ {
19
+ languageOptions: {
20
+ parserOptions: {
21
+ project: './tsconfig.json',
22
+ },
23
+ },
24
+ },
25
+ ]
26
+ ```
27
+
28
+ ---
29
+
30
+ ## Rules
31
+
32
+ ### Type Safety
33
+
34
+ #### `no-any`
35
+ Disallow the `any` type.
36
+ ```ts
37
+ // ❌
38
+ const user: any = fetchUser(url)
39
+
40
+ // ✅
41
+ const user: User = await fetchUser(url)
42
+ ```
43
+
44
+ #### `no-type-assertion`
45
+ Disallow `as` type assertions.
46
+ ```ts
47
+ // ❌
48
+ const user = response as User
49
+
50
+ // ✅
51
+ function isUser(value: User | Response): value is User {
52
+ return value instanceof User
53
+ }
54
+ ```
55
+
56
+ #### `no-non-null-assertion`
57
+ Disallow non-null assertions (`!`).
58
+ ```ts
59
+ // ❌
60
+ getElement('app')!.innerHTML = ''
61
+
62
+ // ✅
63
+ const element = getElement('app')
64
+ element.innerHTML = ''
65
+ ```
66
+
67
+ #### `same-type-comparison`
68
+ Both sides of `===` must have the same TypeScript type.
69
+ ```ts
70
+ // ❌
71
+ if (count === '5') { }
72
+
73
+ // ✅
74
+ if (count === 5) { }
75
+ ```
76
+
77
+ ---
78
+
79
+ ### Error Handling
80
+
81
+ #### `no-throw-literal`
82
+ Only `Error` instances can be thrown.
83
+ ```ts
84
+ // ❌
85
+ throw 'something went wrong'
86
+ throw { message: 'oops' }
87
+
88
+ // ✅
89
+ throw new Error('something went wrong')
90
+ ```
91
+
92
+ #### `no-catch-unknown`
93
+ Disallow explicit `unknown` annotation on catch bindings.
94
+ ```ts
95
+ // ❌
96
+ catch (e: unknown) { }
97
+
98
+ // ✅
99
+ catch (e) {
100
+ console.log(e.message)
101
+ }
102
+ ```
103
+
104
+ #### `no-catch-instanceof`
105
+ Disallow `instanceof Error` checks inside catch blocks. Pair with `no-throw-literal` — `e` is always an `Error`.
106
+ ```ts
107
+ // ❌
108
+ catch (e) {
109
+ if (e instanceof Error) console.log(e.message)
110
+ }
111
+
112
+ // ✅
113
+ catch (e) {
114
+ console.log(e.message)
115
+ }
116
+ ```
117
+
118
+ #### `no-floating-promise`
119
+ Promises must be awaited, returned, or `.catch()`-handled.
120
+ ```ts
121
+ // ❌
122
+ saveUser(user)
123
+
124
+ // ✅
125
+ await saveUser(user)
126
+ ```
127
+
128
+ ---
129
+
130
+ ### Immutability
131
+
132
+ #### `no-array-mutating-methods`
133
+ Disallow in-place array mutation methods.
134
+ ```ts
135
+ // ❌
136
+ items.sort()
137
+ items.reverse()
138
+ items.splice(0, 1)
139
+
140
+ // ✅
141
+ [...items].sort()
142
+ [...items].reverse()
143
+ items.filter((item, index) => index !== 0)
144
+ ```
145
+
146
+ #### `no-param-reassign`
147
+ Disallow reassignment of function parameters.
148
+ ```ts
149
+ // ❌
150
+ function normalize(user: User): void {
151
+ user = sanitize(user)
152
+ }
153
+
154
+ // ✅
155
+ function normalize(user: User): User {
156
+ return sanitize(user)
157
+ }
158
+ ```
159
+
160
+ #### `no-delete`
161
+ Disallow the `delete` operator.
162
+ ```ts
163
+ // ❌
164
+ delete record.key
165
+
166
+ // ✅
167
+ const { key, ...rest } = record
168
+ ```
169
+
170
+ #### `no-mutable-exports`
171
+ Disallow exporting `let` variables.
172
+ ```ts
173
+ // ❌
174
+ export let count = 0
175
+
176
+ // ✅
177
+ export const count = 0
178
+ ```
179
+
180
+ #### `no-class-mutation`
181
+ Disallow `this.prop =` assignments outside the constructor.
182
+ ```ts
183
+ // ❌
184
+ class Store {
185
+ update(): void { this.value = 42 }
186
+ }
187
+
188
+ // ✅
189
+ class Store {
190
+ private constructor(readonly value: number) {}
191
+ withValue(newValue: number): Store { return new Store(newValue) }
192
+ }
193
+ ```
194
+
195
+ #### `prefer-readonly-params`
196
+ Array parameters must be typed as `readonly`.
197
+ ```ts
198
+ // ❌
199
+ function sum(nums: number[]): number
200
+
201
+ // ✅
202
+ function sum(nums: readonly number[]): number
203
+ ```
204
+
205
+ ---
206
+
207
+ ### Control Flow
208
+
209
+ #### `require-boolean-condition`
210
+ Conditions in `if`/`while`/ternary must be explicitly boolean.
211
+ ```ts
212
+ // ❌
213
+ if (user) { }
214
+ if (items.length) { }
215
+
216
+ // ✅
217
+ if (user.isActive === true) { }
218
+ if (items.length > 0) { }
219
+ ```
220
+
221
+ #### `exhaustive-switch`
222
+ Switch over union types must cover all members without a `default` fallback.
223
+ ```ts
224
+ // ❌
225
+ type Status = 'active' | 'inactive' | 'banned'
226
+ switch (status) {
227
+ case 'active': return 'Active'
228
+ case 'inactive': return 'Inactive'
229
+ }
230
+
231
+ // ✅
232
+ switch (status) {
233
+ case 'active': return 'Active'
234
+ case 'inactive': return 'Inactive'
235
+ case 'banned': return 'Banned'
236
+ }
237
+ ```
238
+
239
+ #### `consistent-return`
240
+ Functions must either always or never return a value.
241
+ ```ts
242
+ // ❌
243
+ function getLabel(status: string) {
244
+ if (status === 'active') return 'Active'
245
+ }
246
+
247
+ // ✅
248
+ function getLabel(status: string): string {
249
+ if (status === 'active') return 'Active'
250
+ return 'Unknown'
251
+ }
252
+ ```
253
+
254
+ #### `no-async-without-await`
255
+ Async functions must contain at least one `await`.
256
+ ```ts
257
+ // ❌
258
+ async function getUser(): Promise<User> {
259
+ return db.find()
260
+ }
261
+
262
+ // ✅
263
+ async function getUser(): Promise<User> {
264
+ return await db.find()
265
+ }
266
+ ```
267
+
268
+ #### `no-loop-func`
269
+ Disallow function definitions inside loops.
270
+ ```ts
271
+ // ❌
272
+ for (let count = 0; count < 3; count++) {
273
+ setTimeout(() => console.log(count), 0)
274
+ }
275
+
276
+ // ✅
277
+ for (const item of items) {
278
+ process(item)
279
+ }
280
+ ```
281
+
282
+ ---
283
+
284
+ ### Naming
285
+
286
+ #### `no-generic-names`
287
+ Disallow vague names like `data`, `info`, `temp`, `result`, `obj`.
288
+ ```ts
289
+ // ❌
290
+ const data = await fetchUser()
291
+ const temp = data.name
292
+
293
+ // ✅
294
+ const user = await fetchUser()
295
+ const displayName = user.name
296
+ ```
297
+
298
+ #### `no-placeholder-names`
299
+ Disallow single-letter variable names.
300
+ ```ts
301
+ // ❌
302
+ items.map(x => x.name)
303
+
304
+ // ✅
305
+ items.map(item => item.name)
306
+ ```
307
+
308
+ #### `no-shadow`
309
+ Disallow variable declarations that shadow outer scope variables.
310
+ ```ts
311
+ // ❌
312
+ const user = getUser()
313
+ users.map(user => user.name)
314
+
315
+ // ✅
316
+ const currentUser = getUser()
317
+ users.map(member => member.name)
318
+ ```
319
+
320
+ ---
321
+
322
+ ### JS Gotchas
323
+
324
+ #### `no-for-in`
325
+ Disallow `for...in` — it iterates the prototype chain.
326
+ ```ts
327
+ // ❌
328
+ for (const key in config) { }
329
+
330
+ // ✅
331
+ for (const key of Object.keys(config)) { }
332
+ ```
333
+
334
+ #### `no-implicit-coercion`
335
+ Disallow implicit type coercions.
336
+ ```ts
337
+ // ❌
338
+ const parsed = +'42'
339
+ const flag = !!value
340
+
341
+ // ✅
342
+ const parsed = Number('42')
343
+ const flag = Boolean(value)
344
+ ```
345
+
346
+ #### `no-typeof`
347
+ Disallow `typeof` checks — use `instanceof` or type predicates.
348
+ ```ts
349
+ // ❌
350
+ if (typeof response === 'string') { }
351
+
352
+ // ✅
353
+ if (response instanceof HttpError) { }
354
+ ```
355
+
356
+ #### `no-eval`
357
+ Disallow `eval()` and indirect eval patterns.
358
+ ```ts
359
+ // ❌
360
+ eval('console.log(1)')
361
+ ```
362
+
363
+ #### `no-new-wrappers`
364
+ Disallow `new String()`, `new Number()`, `new Boolean()`.
365
+ ```ts
366
+ // ❌
367
+ const greeting = new String('hello')
368
+
369
+ // ✅
370
+ const greeting = 'hello'
371
+ ```
372
+
373
+ #### `prefer-includes`
374
+ Require `.includes()` over `.indexOf()` comparisons.
375
+ ```ts
376
+ // ❌
377
+ items.indexOf('target') !== -1
378
+
379
+ // ✅
380
+ items.includes('target')
381
+ ```
382
+
383
+ #### `no-string-concat`
384
+ Disallow `+` string concatenation. Use template literals.
385
+ ```ts
386
+ // ❌
387
+ 'Hello, ' + name + '!'
388
+
389
+ // ✅
390
+ `Hello, ${name}!`
391
+ ```
392
+
393
+ #### `no-legacy-globals`
394
+ Disallow `window`, `document`, `global` direct access.
395
+ ```ts
396
+ // ❌
397
+ window.addEventListener('click', handler)
398
+
399
+ // ✅
400
+ addEventListener('click', handler)
401
+ ```
402
+
403
+ ---
404
+
405
+ ### Modules
406
+
407
+ #### `no-require`
408
+ Disallow `require()`. Use ES `import`.
409
+ ```ts
410
+ // ❌
411
+ const fs = require('fs')
412
+
413
+ // ✅
414
+ import fs from 'fs'
415
+ ```
416
+
417
+ #### `no-default-export`
418
+ Disallow default exports. Use named exports.
419
+ ```ts
420
+ // ❌
421
+ export default function handler() { }
422
+
423
+ // ✅
424
+ export function handler() { }
425
+ ```
426
+
427
+ #### `no-process-env`
428
+ Disallow direct `process.env` access. Use a typed config module.
429
+ ```ts
430
+ // ❌
431
+ const port = process.env.PORT
432
+
433
+ // ✅
434
+ import { config } from './config.js'
435
+ const port = config.port
436
+ ```
437
+
438
+ ---
439
+
440
+ ### Classes
441
+
442
+ #### `require-private-constructor`
443
+ Class constructors must be `private`. Use static factory methods.
444
+ ```ts
445
+ // ❌
446
+ class User {
447
+ constructor(public name: string) {}
448
+ }
449
+
450
+ // ✅
451
+ class User {
452
+ private constructor(public name: string) {}
453
+ static create(name: string): User { return new User(name) }
454
+ }
455
+ ```
456
+
457
+ #### `no-class-mutation`
458
+ Disallow `this.prop =` outside the constructor.
459
+ ```ts
460
+ // ❌
461
+ class Counter {
462
+ increment(): void { this.value++ }
463
+ }
464
+
465
+ // ✅
466
+ class Counter {
467
+ private constructor(readonly value: number) {}
468
+ increment(): Counter { return new Counter(this.value + 1) }
469
+ }
470
+ ```
471
+
472
+ ---
473
+
474
+ ### Functions
475
+
476
+ #### `require-explicit-return-type`
477
+ Exported functions and public class methods must declare return types.
478
+ ```ts
479
+ // ❌
480
+ export function getUser(id: string) {
481
+ return db.find(id)
482
+ }
483
+
484
+ // ✅
485
+ export function getUser(id: string): Promise<User> {
486
+ return db.find(id)
487
+ }
488
+ ```
489
+
490
+ #### `no-comments`
491
+ Disallow code comments — write self-documenting code instead.
492
+ ```ts
493
+ // ❌
494
+ const result = await get(id)
495
+
496
+ // ✅
497
+ const user = await fetchUserById(id)
498
+ ```
499
+
500
+ #### `no-null-undefined`
501
+ Disallow `null`, `undefined`, and `void` as values. Use optional types with implicit return.
502
+ ```ts
503
+ // ❌
504
+ function find(id: string): User | null {
505
+ return null
506
+ }
507
+
508
+ // ✅
509
+ function find(id: string): User | undefined {
510
+ return records.get(id)
511
+ }
512
+ ```
@@ -0,0 +1,164 @@
1
+ declare const plugin: {
2
+ meta: {
3
+ name: string;
4
+ version: string;
5
+ };
6
+ rules: {
7
+ "no-placeholder-names": import("@typescript-eslint/utils/ts-eslint").RuleModule<"placeholderName", [{
8
+ blocklist?: string[];
9
+ allowSingleLetterInLoops?: boolean;
10
+ }?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
11
+ name: string;
12
+ };
13
+ "no-generic-names": import("@typescript-eslint/utils/ts-eslint").RuleModule<"genericName", [{
14
+ allow?: string[];
15
+ additionalNames?: string[];
16
+ }?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
17
+ name: string;
18
+ };
19
+ "no-null-undefined": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNull" | "noUndefined" | "noVoidExpr", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
20
+ name: string;
21
+ };
22
+ "no-comments": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noComment", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
23
+ name: string;
24
+ };
25
+ "require-boolean-condition": import("@typescript-eslint/utils/ts-eslint").RuleModule<"requireBoolean", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
26
+ name: string;
27
+ };
28
+ "same-type-comparison": import("@typescript-eslint/utils/ts-eslint").RuleModule<"mismatchedTypes", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
29
+ name: string;
30
+ };
31
+ "no-any": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noAny", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
32
+ name: string;
33
+ };
34
+ "no-type-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noTypeAssertion", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
35
+ name: string;
36
+ };
37
+ "no-non-null-assertion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNonNull", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
38
+ name: string;
39
+ };
40
+ "no-nullish-operators": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNullish" | "noOptionalChain", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
41
+ name: string;
42
+ };
43
+ "no-empty-string": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noEmptyString", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
44
+ name: string;
45
+ };
46
+ "no-typeof": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noTypeof", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
47
+ name: string;
48
+ };
49
+ "no-legacy-globals": import("@typescript-eslint/utils/ts-eslint").RuleModule<"legacyGlobal" | "noArguments", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
50
+ name: string;
51
+ };
52
+ "no-new-wrappers": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNewWrapper", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
53
+ name: string;
54
+ };
55
+ "no-string-concat": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noStringConcat", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
56
+ name: string;
57
+ };
58
+ "no-implicit-coercion": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noUnaryPlus" | "noDoubleNegation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
59
+ name: string;
60
+ };
61
+ "no-throw-literal": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noThrowLiteral", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
62
+ name: string;
63
+ };
64
+ "no-catch-unknown": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noCatchUnknown", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
65
+ name: string;
66
+ };
67
+ "no-floating-promise": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noFloatingPromise", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
68
+ name: string;
69
+ };
70
+ "no-param-reassign": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noParamReassign", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
71
+ name: string;
72
+ };
73
+ "require-explicit-return-type": import("@typescript-eslint/utils/ts-eslint").RuleModule<"requireReturnType", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
74
+ name: string;
75
+ };
76
+ "no-array-mutating-methods": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noArrayMutatingMethod", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
77
+ name: string;
78
+ };
79
+ "no-delete": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDelete", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
80
+ name: string;
81
+ };
82
+ "no-mutable-exports": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noMutableExport", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
83
+ name: string;
84
+ };
85
+ "prefer-includes": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferIncludes", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
86
+ name: string;
87
+ };
88
+ "no-loop-func": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noLoopFunc", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
89
+ name: string;
90
+ };
91
+ "consistent-return": import("@typescript-eslint/utils/ts-eslint").RuleModule<"missingReturnValue" | "unexpectedReturnValue", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
92
+ name: string;
93
+ };
94
+ "no-shadow": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noShadow", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
95
+ name: string;
96
+ };
97
+ "no-catch-instanceof": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noCatchInstanceof", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
98
+ name: string;
99
+ };
100
+ "no-eval": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noEval", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
101
+ name: string;
102
+ };
103
+ "no-process-env": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noProcessEnv", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
104
+ name: string;
105
+ };
106
+ "prefer-readonly-params": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferReadonlyParams", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
107
+ name: string;
108
+ };
109
+ "no-for-in": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noForIn", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
110
+ name: string;
111
+ };
112
+ "no-async-without-await": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noAsyncWithoutAwait", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
113
+ name: string;
114
+ };
115
+ "no-class-mutation": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noClassMutation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
116
+ name: string;
117
+ };
118
+ "exhaustive-switch": import("@typescript-eslint/utils/ts-eslint").RuleModule<"nonExhaustiveSwitch", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
119
+ name: string;
120
+ };
121
+ "no-require": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noRequire", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
122
+ name: string;
123
+ };
124
+ "no-default-export": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDefaultExport", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
125
+ name: string;
126
+ };
127
+ "require-private-constructor": import("@typescript-eslint/utils/ts-eslint").RuleModule<"requirePrivateConstructor", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
128
+ name: string;
129
+ };
130
+ "no-unknown": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noUnknown", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
131
+ name: string;
132
+ };
133
+ "require-curly": import("@typescript-eslint/utils/ts-eslint").RuleModule<"requireCurly", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
134
+ name: string;
135
+ };
136
+ "no-nan": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNaN", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
137
+ name: string;
138
+ };
139
+ "no-nan-in-math-result": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNanInMathResult", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
140
+ name: string;
141
+ };
142
+ "no-parseint-nan": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noParseIntNan", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
143
+ name: string;
144
+ };
145
+ "no-nan-array-indexof": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noNanArrayIndexOf", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
146
+ name: string;
147
+ };
148
+ "no-object-assign-mutation": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noObjectAssignMutation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
149
+ name: string;
150
+ };
151
+ "no-prototype-mutation": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noPrototypeMutation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
152
+ name: string;
153
+ };
154
+ "no-define-property": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDefineProperty", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
155
+ name: string;
156
+ };
157
+ "no-map-set-mutation": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noMapSetMutation", [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener> & {
158
+ name: string;
159
+ };
160
+ };
161
+ configs: Record<string, unknown>;
162
+ };
163
+ export default plugin;
164
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAwGA,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIX,CAAA;AAgED,eAAe,MAAM,CAAA"}