@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
@@ -0,0 +1,45 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noAsyncWithoutAwait = createRule({
4
+ name: "no-async-without-await",
5
+ meta: {
6
+ type: "problem",
7
+ docs: {
8
+ description: "Disallow async functions that contain no await expression",
9
+ },
10
+ schema: [],
11
+ messages: {
12
+ noAsyncWithoutAwait: "Async function has no await expression. Remove the async keyword or add an await.",
13
+ },
14
+ },
15
+ defaultOptions: [],
16
+ create(context) {
17
+ const stack = [];
18
+ function enter(node) {
19
+ if (node.async)
20
+ stack.push({ node, hasAwait: false });
21
+ }
22
+ function exit(node) {
23
+ if (!node.async)
24
+ return;
25
+ const frame = stack.pop();
26
+ if (frame && !frame.hasAwait) {
27
+ context.report({ node, messageId: "noAsyncWithoutAwait" });
28
+ }
29
+ }
30
+ return {
31
+ FunctionDeclaration: enter,
32
+ FunctionExpression: enter,
33
+ ArrowFunctionExpression: enter,
34
+ "FunctionDeclaration:exit": exit,
35
+ "FunctionExpression:exit": exit,
36
+ "ArrowFunctionExpression:exit": exit,
37
+ AwaitExpression() {
38
+ if (stack.length > 0) {
39
+ stack[stack.length - 1].hasAwait = true;
40
+ }
41
+ },
42
+ };
43
+ },
44
+ });
45
+ //# sourceMappingURL=no-async-without-await.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-async-without-await.js","sourceRoot":"","sources":["../../src/rules/no-async-without-await.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAeD,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAsB;IACjE,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,2DAA2D;SACzE;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,mBAAmB,EACjB,mFAAmF;SACtF;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,MAAM,KAAK,GAAgB,EAAE,CAAA;QAE7B,SAAS,KAAK,CAAC,IAAkB;YAC/B,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;QACvD,CAAC;QAED,SAAS,IAAI,CAAC,IAAkB;YAC9B,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,OAAM;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;YACzB,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,OAAO;YACL,mBAAmB,EAAE,KAAK;YAC1B,kBAAkB,EAAE,KAAK;YACzB,uBAAuB,EAAE,KAAK;YAC9B,0BAA0B,EAAE,IAAI;YAChC,yBAAyB,EAAE,IAAI;YAC/B,8BAA8B,EAAE,IAAI;YAEpC,eAAe;gBACb,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,QAAQ,GAAG,IAAI,CAAA;gBAC1C,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noCatchInstanceof: ESLintUtils.RuleModule<"noCatchInstanceof", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-catch-instanceof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-catch-instanceof.d.ts","sourceRoot":"","sources":["../../src/rules/no-catch-instanceof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAY,MAAM,0BAA0B,CAAA;AA8BhF,eAAO,MAAM,iBAAiB;;CAkC5B,CAAA"}
@@ -0,0 +1,55 @@
1
+ import { AST_NODE_TYPES, ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ function getCatchParam(node) {
4
+ let current = node.parent;
5
+ while (current) {
6
+ if (current.type === AST_NODE_TYPES.CatchClause) {
7
+ const param = current.param;
8
+ if (param !== null && param.type === AST_NODE_TYPES.Identifier)
9
+ return param.name;
10
+ return false;
11
+ }
12
+ if (current.type === AST_NODE_TYPES.FunctionDeclaration ||
13
+ current.type === AST_NODE_TYPES.FunctionExpression ||
14
+ current.type === AST_NODE_TYPES.ArrowFunctionExpression) {
15
+ return false;
16
+ }
17
+ current = current.parent;
18
+ }
19
+ return false;
20
+ }
21
+ export const noCatchInstanceof = createRule({
22
+ name: "no-catch-instanceof",
23
+ meta: {
24
+ type: "suggestion",
25
+ docs: {
26
+ description: "Disallow instanceof Error checks inside catch blocks. Pair with no-throw-literal to guarantee the caught value is always an Error.",
27
+ },
28
+ schema: [],
29
+ messages: {
30
+ noCatchInstanceof: "Unnecessary 'instanceof Error' check in catch block. Use no-throw-literal to guarantee all thrown values are Error instances.",
31
+ },
32
+ },
33
+ defaultOptions: [],
34
+ create(context) {
35
+ return {
36
+ BinaryExpression(node) {
37
+ if (node.operator !== "instanceof")
38
+ return;
39
+ const right = node.right;
40
+ if (right.type !== AST_NODE_TYPES.Identifier || right.name !== "Error")
41
+ return;
42
+ const left = node.left;
43
+ if (left.type !== AST_NODE_TYPES.Identifier)
44
+ return;
45
+ const catchParam = getCatchParam(node);
46
+ if (catchParam === false)
47
+ return;
48
+ if (left.name !== catchParam)
49
+ return;
50
+ context.report({ node, messageId: "noCatchInstanceof" });
51
+ },
52
+ };
53
+ },
54
+ });
55
+ //# sourceMappingURL=no-catch-instanceof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-catch-instanceof.js","sourceRoot":"","sources":["../../src/rules/no-catch-instanceof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,SAAS,aAAa,CAAC,IAAmB;IACxC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;IACzB,OAAO,OAAO,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;YAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAC,IAAI,CAAA;YACjF,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IACE,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,mBAAmB;YACnD,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,kBAAkB;YAClD,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,uBAAuB,EACvD,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAsB;IAC/D,IAAI,EAAE,qBAAqB;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,oIAAoI;SACvI;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,iBAAiB,EACf,+HAA+H;SAClI;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,gBAAgB,CAAC,IAA+B;gBAC9C,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;oBAAE,OAAM;gBAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;gBACxB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;oBAAE,OAAM;gBAE9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;gBACtB,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAAE,OAAM;gBAEnD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;gBACtC,IAAI,UAAU,KAAK,KAAK;oBAAE,OAAM;gBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;oBAAE,OAAM;gBAEpC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAA;YAC1D,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noCatchUnknown: ESLintUtils.RuleModule<"noCatchUnknown", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-catch-unknown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-catch-unknown.d.ts","sourceRoot":"","sources":["../../src/rules/no-catch-unknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhF,eAAO,MAAM,cAAc;;CA4BzB,CAAA"}
@@ -0,0 +1,32 @@
1
+ import { AST_NODE_TYPES, ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noCatchUnknown = createRule({
4
+ name: "no-catch-unknown",
5
+ meta: {
6
+ type: "suggestion",
7
+ docs: {
8
+ description: "Disallow explicit `unknown` type annotation on catch bindings. Pair with no-throw-literal to guarantee catch variables are always Error instances.",
9
+ },
10
+ schema: [],
11
+ messages: {
12
+ noCatchUnknown: "Do not annotate catch bindings as `unknown`. Pair this plugin's no-throw-literal rule to guarantee the caught value is always an Error.",
13
+ },
14
+ },
15
+ defaultOptions: [],
16
+ create(context) {
17
+ return {
18
+ CatchClause(node) {
19
+ const param = node.param;
20
+ if (!param)
21
+ return;
22
+ if (param.type !== AST_NODE_TYPES.Identifier)
23
+ return;
24
+ const typeAnnotation = param.typeAnnotation;
25
+ if (typeAnnotation !== undefined && typeAnnotation.typeAnnotation.type === AST_NODE_TYPES.TSUnknownKeyword) {
26
+ context.report({ node: param, messageId: "noCatchUnknown" });
27
+ }
28
+ },
29
+ };
30
+ },
31
+ });
32
+ //# sourceMappingURL=no-catch-unknown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-catch-unknown.js","sourceRoot":"","sources":["../../src/rules/no-catch-unknown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhF,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAsB;IAC5D,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EACT,oJAAoJ;SACvJ;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,cAAc,EACZ,yIAAyI;SAC5I;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,WAAW,CAAC,IAA0B;gBACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;gBACxB,IAAI,CAAC,KAAK;oBAAE,OAAM;gBAClB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;oBAAE,OAAM;gBACpD,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAA;gBAC3C,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,CAAC,cAAc,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB,EAAE,CAAC;oBAC3G,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;gBAC9D,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noClassMutation: ESLintUtils.RuleModule<"noClassMutation", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-class-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-class-mutation.d.ts","sourceRoot":"","sources":["../../src/rules/no-class-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AA8BhE,eAAO,MAAM,eAAe;;CA4B1B,CAAA"}
@@ -0,0 +1,44 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ function isInsideConstructor(node) {
4
+ let current = node.parent;
5
+ while (current) {
6
+ if (current.type === "MethodDefinition" &&
7
+ current.kind === "constructor") {
8
+ return true;
9
+ }
10
+ if (current.type === "ClassDeclaration" ||
11
+ current.type === "ClassExpression") {
12
+ return false;
13
+ }
14
+ current = current.parent;
15
+ }
16
+ return false;
17
+ }
18
+ export const noClassMutation = createRule({
19
+ name: "no-class-mutation",
20
+ meta: {
21
+ type: "problem",
22
+ docs: {
23
+ description: "Disallow this.property assignments outside of the constructor",
24
+ },
25
+ schema: [],
26
+ messages: {
27
+ noClassMutation: "Do not mutate class properties outside the constructor. Use readonly fields or return new instances.",
28
+ },
29
+ },
30
+ defaultOptions: [],
31
+ create(context) {
32
+ return {
33
+ AssignmentExpression(node) {
34
+ const left = node.left;
35
+ if (left.type === "MemberExpression" &&
36
+ left.object.type === "ThisExpression" &&
37
+ !isInsideConstructor(node)) {
38
+ context.report({ node, messageId: "noClassMutation" });
39
+ }
40
+ },
41
+ };
42
+ },
43
+ });
44
+ //# sourceMappingURL=no-class-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-class-mutation.js","sourceRoot":"","sources":["../../src/rules/no-class-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,SAAS,mBAAmB,CAAC,IAAmB;IAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;IACzB,OAAO,OAAO,EAAE,CAAC;QACf,IACE,OAAO,CAAC,IAAI,KAAK,kBAAkB;YACnC,OAAO,CAAC,IAAI,KAAK,aAAa,EAC9B,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IACE,OAAO,CAAC,IAAI,KAAK,kBAAkB;YACnC,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAClC,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAsB;IAC7D,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,+DAA+D;SAC7E;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EACb,sGAAsG;SACzG;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,oBAAoB,CAAC,IAAmC;gBACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;gBACtB,IACE,IAAI,CAAC,IAAI,KAAK,kBAAkB;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,gBAAgB;oBACrC,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAC1B,CAAC;oBACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noComments: ESLintUtils.RuleModule<"noComment", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-comments.d.ts","sourceRoot":"","sources":["../../src/rules/no-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAUtD,eAAO,MAAM,UAAU;;CAuBrB,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noComments = createRule({
4
+ name: "no-comments",
5
+ meta: {
6
+ type: "problem",
7
+ docs: {
8
+ description: "Disallow all comments — both line (//) and block (/* */)",
9
+ },
10
+ schema: [],
11
+ messages: {
12
+ noComment: "Comments are not allowed. Let the code speak for itself.",
13
+ },
14
+ },
15
+ defaultOptions: [],
16
+ create(context) {
17
+ return {
18
+ Program() {
19
+ const comments = context.sourceCode.getAllComments();
20
+ for (const comment of comments) {
21
+ context.report({ loc: comment.loc, messageId: "noComment" });
22
+ }
23
+ },
24
+ };
25
+ },
26
+ });
27
+ //# sourceMappingURL=no-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-comments.js","sourceRoot":"","sources":["../../src/rules/no-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAsB;IACxD,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,0DAA0D;SACxE;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,SAAS,EAAE,0DAA0D;SACtE;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,OAAO;gBACL,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAA;gBACpD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAA;gBAC9D,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noDefaultExport: ESLintUtils.RuleModule<"noDefaultExport", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-default-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-default-export.d.ts","sourceRoot":"","sources":["../../src/rules/no-default-export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhE,eAAO,MAAM,eAAe;;CAmB1B,CAAA"}
@@ -0,0 +1,22 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noDefaultExport = createRule({
4
+ name: "no-default-export",
5
+ meta: {
6
+ type: "suggestion",
7
+ docs: { description: "Disallow default exports. Use named exports instead." },
8
+ schema: [],
9
+ messages: {
10
+ noDefaultExport: "Do not use default exports. Use named exports so imports stay stable across refactors.",
11
+ },
12
+ },
13
+ defaultOptions: [],
14
+ create(context) {
15
+ return {
16
+ ExportDefaultDeclaration(node) {
17
+ context.report({ node, messageId: "noDefaultExport" });
18
+ },
19
+ };
20
+ },
21
+ });
22
+ //# sourceMappingURL=no-default-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-default-export.js","sourceRoot":"","sources":["../../src/rules/no-default-export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAsB;IAC7D,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE;QAC7E,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,eAAe,EACb,wFAAwF;SAC3F;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,wBAAwB,CAAC,IAAuC;gBAC9D,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAA;YACxD,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noDefineProperty: ESLintUtils.RuleModule<"noDefineProperty", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-define-property.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-define-property.d.ts","sourceRoot":"","sources":["../../src/rules/no-define-property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhE,eAAO,MAAM,gBAAgB;;CAsC3B,CAAA"}
@@ -0,0 +1,37 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noDefineProperty = createRule({
4
+ name: "no-define-property",
5
+ meta: {
6
+ type: "problem",
7
+ docs: {
8
+ description: "Disallow Object.defineProperty and Object.defineProperties. They silently redefine property descriptors and produce invisible mutations.",
9
+ },
10
+ schema: [],
11
+ messages: {
12
+ noDefineProperty: "Do not use Object.{{method}}(). It produces invisible property mutations. Use plain property assignment or class syntax instead.",
13
+ },
14
+ },
15
+ defaultOptions: [],
16
+ create(context) {
17
+ return {
18
+ CallExpression(node) {
19
+ if (node.callee.type !== "MemberExpression" ||
20
+ node.callee.object.type !== "Identifier" ||
21
+ node.callee.object.name !== "Object" ||
22
+ node.callee.property.type !== "Identifier") {
23
+ return;
24
+ }
25
+ const method = node.callee.property.name;
26
+ if (method === "defineProperty" || method === "defineProperties") {
27
+ context.report({
28
+ node,
29
+ messageId: "noDefineProperty",
30
+ data: { method },
31
+ });
32
+ }
33
+ },
34
+ };
35
+ },
36
+ });
37
+ //# sourceMappingURL=no-define-property.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-define-property.js","sourceRoot":"","sources":["../../src/rules/no-define-property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAsB;IAC9D,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EACT,0IAA0I;SAC7I;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,gBAAgB,EACd,kIAAkI;SACrI;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAA6B;gBAC1C,IACE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB;oBACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY;oBACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;oBACpC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,EAC1C,CAAC;oBACD,OAAM;gBACR,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAA;gBACxC,IAAI,MAAM,KAAK,gBAAgB,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;oBACjE,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI;wBACJ,SAAS,EAAE,kBAAkB;wBAC7B,IAAI,EAAE,EAAE,MAAM,EAAE;qBACjB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noDelete: ESLintUtils.RuleModule<"noDelete", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-delete.d.ts","sourceRoot":"","sources":["../../src/rules/no-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhE,eAAO,MAAM,QAAQ;;CA+BnB,CAAA"}
@@ -0,0 +1,35 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noDelete = createRule({
4
+ name: "no-delete",
5
+ meta: {
6
+ type: "problem",
7
+ docs: {
8
+ description: "Disallow the delete operator",
9
+ },
10
+ schema: [],
11
+ messages: {
12
+ noDelete: "Do not use 'delete'. Use destructuring instead: const { {{key}}, ...rest } = obj.",
13
+ },
14
+ },
15
+ defaultOptions: [],
16
+ create(context) {
17
+ return {
18
+ UnaryExpression(node) {
19
+ if (node.operator !== "delete")
20
+ return;
21
+ let key = "key";
22
+ const arg = node.argument;
23
+ if (arg.type === "MemberExpression") {
24
+ const prop = arg.property;
25
+ if (prop.type === "Identifier")
26
+ key = prop.name;
27
+ else if (prop.type === "Literal")
28
+ key = String(prop.value);
29
+ }
30
+ context.report({ node, messageId: "noDelete", data: { key } });
31
+ },
32
+ };
33
+ },
34
+ });
35
+ //# sourceMappingURL=no-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-delete.js","sourceRoot":"","sources":["../../src/rules/no-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAsB;IACtD,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,8BAA8B;SAC5C;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,QAAQ,EACN,mFAAmF;SACtF;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,eAAe,CAAC,IAA8B;gBAC5C,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;oBAAE,OAAM;gBAEtC,IAAI,GAAG,GAAG,KAAK,CAAA;gBACf,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;gBACzB,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBACpC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAA;oBACzB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;wBAAE,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA;yBAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;wBAAE,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC5D,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;YAChE,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noEmptyString: ESLintUtils.RuleModule<"noEmptyString", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-empty-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-empty-string.d.ts","sourceRoot":"","sources":["../../src/rules/no-empty-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhE,eAAO,MAAM,aAAa;;CAqBxB,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noEmptyString = createRule({
4
+ name: "no-empty-string",
5
+ meta: {
6
+ type: "problem",
7
+ docs: { description: "Disallow empty string literals (\"\") as values" },
8
+ schema: [],
9
+ messages: {
10
+ noEmptyString: "Do not use empty string (\"\"). Use a named constant or a more explicit sentinel value.",
11
+ },
12
+ },
13
+ defaultOptions: [],
14
+ create(context) {
15
+ return {
16
+ Literal(node) {
17
+ if (typeof node.value === "string" && node.value === "") {
18
+ context.report({ node, messageId: "noEmptyString" });
19
+ }
20
+ },
21
+ };
22
+ },
23
+ });
24
+ //# sourceMappingURL=no-empty-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-empty-string.js","sourceRoot":"","sources":["../../src/rules/no-empty-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAsB;IAC3D,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE;QACxE,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,aAAa,EACX,yFAAyF;SAC5F;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,OAAO,CAAC,IAAsB;gBAC5B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;oBACxD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAA;gBACtD,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noEval: ESLintUtils.RuleModule<"noEval", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-eval.d.ts","sourceRoot":"","sources":["../../src/rules/no-eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhE,eAAO,MAAM,MAAM;;CA+BjB,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
3
+ export const noEval = createRule({
4
+ name: "no-eval",
5
+ meta: {
6
+ type: "problem",
7
+ docs: { description: "Disallow eval() and indirect eval patterns" },
8
+ schema: [],
9
+ messages: {
10
+ noEval: "Do not use eval(). It executes arbitrary code and bypasses the type system.",
11
+ },
12
+ },
13
+ defaultOptions: [],
14
+ create(context) {
15
+ return {
16
+ CallExpression(node) {
17
+ const callee = node.callee;
18
+ if (callee.type === "Identifier" && callee.name === "eval") {
19
+ context.report({ node, messageId: "noEval" });
20
+ }
21
+ },
22
+ MemberExpression(node) {
23
+ const prop = node.property;
24
+ if (!node.computed &&
25
+ prop.type === "Identifier" &&
26
+ prop.name === "eval") {
27
+ context.report({ node, messageId: "noEval" });
28
+ }
29
+ },
30
+ };
31
+ },
32
+ });
33
+ //# sourceMappingURL=no-eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-eval.js","sourceRoot":"","sources":["../../src/rules/no-eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEhE,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,CACP,yEAAyE,IAAI,KAAK,CACrF,CAAA;AAKD,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAsB;IACpD,IAAI,EAAE,SAAS;IACf,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE;QACnE,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,MAAM,EAAE,6EAA6E;SACtF;KACF;IACD,cAAc,EAAE,EAAE;IAClB,MAAM,CAAC,OAAO;QACZ,OAAO;YACL,cAAc,CAAC,IAA6B;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;gBAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC3D,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAC/C,CAAC;YACH,CAAC;YACD,gBAAgB,CAAC,IAA+B;gBAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAA;gBAC1B,IACE,CAAC,IAAI,CAAC,QAAQ;oBACd,IAAI,CAAC,IAAI,KAAK,YAAY;oBAC1B,IAAI,CAAC,IAAI,KAAK,MAAM,EACpB,CAAC;oBACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAC/C,CAAC;YACH,CAAC;SACF,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noFloatingPromise: ESLintUtils.RuleModule<"noFloatingPromise", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-floating-promise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-floating-promise.d.ts","sourceRoot":"","sources":["../../src/rules/no-floating-promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAY,MAAM,0BAA0B,CAAA;AA8BhF,eAAO,MAAM,iBAAiB;;CAqD5B,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { AST_NODE_TYPES, ESLintUtils, TSESTree } from "@typescript-eslint/utils";
2
+ import * as ts from "typescript";
3
+ const createRule = ESLintUtils.RuleCreator((name) => `https://github.com/fookiejs/eslint-plugin-fookie/blob/main/docs/rules/${name}.md`);
4
+ function isPromiseLike(type, checker) {
5
+ if (type.isUnion()) {
6
+ return type.types.some((t) => isPromiseLike(t, checker));
7
+ }
8
+ const symbol = type.getSymbol();
9
+ if (symbol !== undefined && ["Promise", "PromiseLike"].includes(symbol.getName())) {
10
+ return true;
11
+ }
12
+ const thenProp = checker.getPropertyOfType(type, "then");
13
+ if (thenProp !== undefined) {
14
+ const valueDecl = thenProp.valueDeclaration;
15
+ if (valueDecl !== undefined) {
16
+ const thenType = checker.getTypeOfSymbolAtLocation(thenProp, valueDecl);
17
+ if (thenType.getCallSignatures().length > 0)
18
+ return true;
19
+ }
20
+ }
21
+ return false;
22
+ }
23
+ export const noFloatingPromise = createRule({
24
+ name: "no-floating-promise",
25
+ meta: {
26
+ type: "problem",
27
+ docs: { description: "Disallow unhandled floating promises" },
28
+ schema: [],
29
+ messages: {
30
+ noFloatingPromise: "Promise is not handled. Use await, return, or .catch() to handle it.",
31
+ },
32
+ },
33
+ defaultOptions: [],
34
+ create(context) {
35
+ const services = ESLintUtils.getParserServices(context);
36
+ const checker = services.program.getTypeChecker();
37
+ function isChainHandled(node) {
38
+ if (node.type !== AST_NODE_TYPES.CallExpression)
39
+ return false;
40
+ const callee = node.callee;
41
+ if (callee.type === AST_NODE_TYPES.MemberExpression) {
42
+ const prop = callee.property;
43
+ if (prop.type === AST_NODE_TYPES.Identifier &&
44
+ ["catch", "finally"].includes(prop.name)) {
45
+ return true;
46
+ }
47
+ if (prop.type === AST_NODE_TYPES.Identifier && prop.name === "then") {
48
+ const args = node.arguments;
49
+ if (args.length >= 2) {
50
+ const secondArg = args[1];
51
+ if (secondArg !== undefined && secondArg.type !== AST_NODE_TYPES.Literal)
52
+ return true;
53
+ }
54
+ }
55
+ }
56
+ return false;
57
+ }
58
+ return {
59
+ ExpressionStatement(node) {
60
+ const expr = node.expression;
61
+ if (expr.type !== AST_NODE_TYPES.CallExpression)
62
+ return;
63
+ if (isChainHandled(expr))
64
+ return;
65
+ const tsNode = services.esTreeNodeToTSNodeMap.get(expr);
66
+ const type = checker.getTypeAtLocation(tsNode);
67
+ if (isPromiseLike(type, checker)) {
68
+ context.report({ node, messageId: "noFloatingPromise" });
69
+ }
70
+ },
71
+ };
72
+ },
73
+ });
74
+ //# sourceMappingURL=no-floating-promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-floating-promise.js","sourceRoot":"","sources":["../../src/rules/no-floating-promise.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const noForIn: ESLintUtils.RuleModule<"noForIn", [], unknown, ESLintUtils.RuleListener> & {
3
+ name: string;
4
+ };
5
+ //# sourceMappingURL=no-for-in.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-for-in.d.ts","sourceRoot":"","sources":["../../src/rules/no-for-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAY,MAAM,0BAA0B,CAAA;AAUhE,eAAO,MAAM,OAAO;;CAqBlB,CAAA"}