@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.
- package/README.md +512 -0
- package/dist/index.d.ts +164 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/consistent-return.d.ts +7 -0
- package/dist/rules/consistent-return.d.ts.map +1 -0
- package/dist/rules/consistent-return.js +56 -0
- package/dist/rules/consistent-return.js.map +1 -0
- package/dist/rules/exhaustive-switch.d.ts +5 -0
- package/dist/rules/exhaustive-switch.d.ts.map +1 -0
- package/dist/rules/exhaustive-switch.js +83 -0
- package/dist/rules/exhaustive-switch.js.map +1 -0
- package/dist/rules/index.d.ts +50 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +50 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/no-any.d.ts +5 -0
- package/dist/rules/no-any.d.ts.map +1 -0
- package/dist/rules/no-any.js +20 -0
- package/dist/rules/no-any.js.map +1 -0
- package/dist/rules/no-array-mutating-methods.d.ts +5 -0
- package/dist/rules/no-array-mutating-methods.d.ts.map +1 -0
- package/dist/rules/no-array-mutating-methods.js +65 -0
- package/dist/rules/no-array-mutating-methods.js.map +1 -0
- package/dist/rules/no-async-without-await.d.ts +5 -0
- package/dist/rules/no-async-without-await.d.ts.map +1 -0
- package/dist/rules/no-async-without-await.js +45 -0
- package/dist/rules/no-async-without-await.js.map +1 -0
- package/dist/rules/no-catch-instanceof.d.ts +5 -0
- package/dist/rules/no-catch-instanceof.d.ts.map +1 -0
- package/dist/rules/no-catch-instanceof.js +55 -0
- package/dist/rules/no-catch-instanceof.js.map +1 -0
- package/dist/rules/no-catch-unknown.d.ts +5 -0
- package/dist/rules/no-catch-unknown.d.ts.map +1 -0
- package/dist/rules/no-catch-unknown.js +32 -0
- package/dist/rules/no-catch-unknown.js.map +1 -0
- package/dist/rules/no-class-mutation.d.ts +5 -0
- package/dist/rules/no-class-mutation.d.ts.map +1 -0
- package/dist/rules/no-class-mutation.js +44 -0
- package/dist/rules/no-class-mutation.js.map +1 -0
- package/dist/rules/no-comments.d.ts +5 -0
- package/dist/rules/no-comments.d.ts.map +1 -0
- package/dist/rules/no-comments.js +27 -0
- package/dist/rules/no-comments.js.map +1 -0
- package/dist/rules/no-default-export.d.ts +5 -0
- package/dist/rules/no-default-export.d.ts.map +1 -0
- package/dist/rules/no-default-export.js +22 -0
- package/dist/rules/no-default-export.js.map +1 -0
- package/dist/rules/no-define-property.d.ts +5 -0
- package/dist/rules/no-define-property.d.ts.map +1 -0
- package/dist/rules/no-define-property.js +37 -0
- package/dist/rules/no-define-property.js.map +1 -0
- package/dist/rules/no-delete.d.ts +5 -0
- package/dist/rules/no-delete.d.ts.map +1 -0
- package/dist/rules/no-delete.js +35 -0
- package/dist/rules/no-delete.js.map +1 -0
- package/dist/rules/no-empty-string.d.ts +5 -0
- package/dist/rules/no-empty-string.d.ts.map +1 -0
- package/dist/rules/no-empty-string.js +24 -0
- package/dist/rules/no-empty-string.js.map +1 -0
- package/dist/rules/no-eval.d.ts +5 -0
- package/dist/rules/no-eval.d.ts.map +1 -0
- package/dist/rules/no-eval.js +33 -0
- package/dist/rules/no-eval.js.map +1 -0
- package/dist/rules/no-floating-promise.d.ts +5 -0
- package/dist/rules/no-floating-promise.d.ts.map +1 -0
- package/dist/rules/no-floating-promise.js +74 -0
- package/dist/rules/no-floating-promise.js.map +1 -0
- package/dist/rules/no-for-in.d.ts +5 -0
- package/dist/rules/no-for-in.d.ts.map +1 -0
- package/dist/rules/no-for-in.js +24 -0
- package/dist/rules/no-for-in.js.map +1 -0
- package/dist/rules/no-generic-names.d.ts +12 -0
- package/dist/rules/no-generic-names.d.ts.map +1 -0
- package/dist/rules/no-generic-names.js +104 -0
- package/dist/rules/no-generic-names.js.map +1 -0
- package/dist/rules/no-implicit-coercion.d.ts +7 -0
- package/dist/rules/no-implicit-coercion.d.ts.map +1 -0
- package/dist/rules/no-implicit-coercion.js +33 -0
- package/dist/rules/no-implicit-coercion.js.map +1 -0
- package/dist/rules/no-legacy-globals.d.ts +7 -0
- package/dist/rules/no-legacy-globals.d.ts.map +1 -0
- package/dist/rules/no-legacy-globals.js +58 -0
- package/dist/rules/no-legacy-globals.js.map +1 -0
- package/dist/rules/no-loop-func.d.ts +5 -0
- package/dist/rules/no-loop-func.d.ts.map +1 -0
- package/dist/rules/no-loop-func.js +50 -0
- package/dist/rules/no-loop-func.js.map +1 -0
- package/dist/rules/no-map-set-mutation.d.ts +5 -0
- package/dist/rules/no-map-set-mutation.d.ts.map +1 -0
- package/dist/rules/no-map-set-mutation.js +69 -0
- package/dist/rules/no-map-set-mutation.js.map +1 -0
- package/dist/rules/no-mutable-exports.d.ts +5 -0
- package/dist/rules/no-mutable-exports.d.ts.map +1 -0
- package/dist/rules/no-mutable-exports.js +29 -0
- package/dist/rules/no-mutable-exports.js.map +1 -0
- package/dist/rules/no-nan-array-indexof.d.ts +5 -0
- package/dist/rules/no-nan-array-indexof.d.ts.map +1 -0
- package/dist/rules/no-nan-array-indexof.js +33 -0
- package/dist/rules/no-nan-array-indexof.js.map +1 -0
- package/dist/rules/no-nan-in-math-result.d.ts +5 -0
- package/dist/rules/no-nan-in-math-result.d.ts.map +1 -0
- package/dist/rules/no-nan-in-math-result.js +58 -0
- package/dist/rules/no-nan-in-math-result.js.map +1 -0
- package/dist/rules/no-nan.d.ts +5 -0
- package/dist/rules/no-nan.d.ts.map +1 -0
- package/dist/rules/no-nan.js +26 -0
- package/dist/rules/no-nan.js.map +1 -0
- package/dist/rules/no-new-wrappers.d.ts +5 -0
- package/dist/rules/no-new-wrappers.d.ts.map +1 -0
- package/dist/rules/no-new-wrappers.js +47 -0
- package/dist/rules/no-new-wrappers.js.map +1 -0
- package/dist/rules/no-new.d.ts +5 -0
- package/dist/rules/no-new.d.ts.map +1 -0
- package/dist/rules/no-new.js +111 -0
- package/dist/rules/no-new.js.map +1 -0
- package/dist/rules/no-non-null-assertion.d.ts +5 -0
- package/dist/rules/no-non-null-assertion.d.ts.map +1 -0
- package/dist/rules/no-non-null-assertion.js +22 -0
- package/dist/rules/no-non-null-assertion.js.map +1 -0
- package/dist/rules/no-null-undefined.d.ts +7 -0
- package/dist/rules/no-null-undefined.d.ts.map +1 -0
- package/dist/rules/no-null-undefined.js +34 -0
- package/dist/rules/no-null-undefined.js.map +1 -0
- package/dist/rules/no-nullish-operators.d.ts +7 -0
- package/dist/rules/no-nullish-operators.d.ts.map +1 -0
- package/dist/rules/no-nullish-operators.js +31 -0
- package/dist/rules/no-nullish-operators.js.map +1 -0
- package/dist/rules/no-object-assign-mutation.d.ts +5 -0
- package/dist/rules/no-object-assign-mutation.d.ts.map +1 -0
- package/dist/rules/no-object-assign-mutation.js +36 -0
- package/dist/rules/no-object-assign-mutation.js.map +1 -0
- package/dist/rules/no-param-reassign.d.ts +5 -0
- package/dist/rules/no-param-reassign.d.ts.map +1 -0
- package/dist/rules/no-param-reassign.js +89 -0
- package/dist/rules/no-param-reassign.js.map +1 -0
- package/dist/rules/no-parseint-nan.d.ts +5 -0
- package/dist/rules/no-parseint-nan.d.ts.map +1 -0
- package/dist/rules/no-parseint-nan.js +64 -0
- package/dist/rules/no-parseint-nan.js.map +1 -0
- package/dist/rules/no-placeholder-names.d.ts +12 -0
- package/dist/rules/no-placeholder-names.d.ts.map +1 -0
- package/dist/rules/no-placeholder-names.js +107 -0
- package/dist/rules/no-placeholder-names.js.map +1 -0
- package/dist/rules/no-process-env.d.ts +5 -0
- package/dist/rules/no-process-env.d.ts.map +1 -0
- package/dist/rules/no-process-env.js +31 -0
- package/dist/rules/no-process-env.js.map +1 -0
- package/dist/rules/no-prototype-mutation.d.ts +5 -0
- package/dist/rules/no-prototype-mutation.d.ts.map +1 -0
- package/dist/rules/no-prototype-mutation.js +30 -0
- package/dist/rules/no-prototype-mutation.js.map +1 -0
- package/dist/rules/no-require.d.ts +5 -0
- package/dist/rules/no-require.d.ts.map +1 -0
- package/dist/rules/no-require.js +37 -0
- package/dist/rules/no-require.js.map +1 -0
- package/dist/rules/no-shadow.d.ts +5 -0
- package/dist/rules/no-shadow.d.ts.map +1 -0
- package/dist/rules/no-shadow.js +103 -0
- package/dist/rules/no-shadow.js.map +1 -0
- package/dist/rules/no-string-concat.d.ts +5 -0
- package/dist/rules/no-string-concat.d.ts.map +1 -0
- package/dist/rules/no-string-concat.js +36 -0
- package/dist/rules/no-string-concat.js.map +1 -0
- package/dist/rules/no-throw-literal.d.ts +5 -0
- package/dist/rules/no-throw-literal.d.ts.map +1 -0
- package/dist/rules/no-throw-literal.js +33 -0
- package/dist/rules/no-throw-literal.js.map +1 -0
- package/dist/rules/no-type-assertion.d.ts +5 -0
- package/dist/rules/no-type-assertion.d.ts.map +1 -0
- package/dist/rules/no-type-assertion.js +25 -0
- package/dist/rules/no-type-assertion.js.map +1 -0
- package/dist/rules/no-typeof.d.ts +5 -0
- package/dist/rules/no-typeof.d.ts.map +1 -0
- package/dist/rules/no-typeof.js +24 -0
- package/dist/rules/no-typeof.js.map +1 -0
- package/dist/rules/no-unknown.d.ts +5 -0
- package/dist/rules/no-unknown.d.ts.map +1 -0
- package/dist/rules/no-unknown.js +22 -0
- package/dist/rules/no-unknown.js.map +1 -0
- package/dist/rules/prefer-includes.d.ts +5 -0
- package/dist/rules/prefer-includes.d.ts.map +1 -0
- package/dist/rules/prefer-includes.js +50 -0
- package/dist/rules/prefer-includes.js.map +1 -0
- package/dist/rules/prefer-readonly-params.d.ts +5 -0
- package/dist/rules/prefer-readonly-params.d.ts.map +1 -0
- package/dist/rules/prefer-readonly-params.js +100 -0
- package/dist/rules/prefer-readonly-params.js.map +1 -0
- package/dist/rules/require-boolean-condition.d.ts +5 -0
- package/dist/rules/require-boolean-condition.d.ts.map +1 -0
- package/dist/rules/require-boolean-condition.js +60 -0
- package/dist/rules/require-boolean-condition.js.map +1 -0
- package/dist/rules/require-curly.d.ts +5 -0
- package/dist/rules/require-curly.d.ts.map +1 -0
- package/dist/rules/require-curly.js +55 -0
- package/dist/rules/require-curly.js.map +1 -0
- package/dist/rules/require-explicit-return-type.d.ts +5 -0
- package/dist/rules/require-explicit-return-type.d.ts.map +1 -0
- package/dist/rules/require-explicit-return-type.js +66 -0
- package/dist/rules/require-explicit-return-type.js.map +1 -0
- package/dist/rules/require-private-constructor.d.ts +5 -0
- package/dist/rules/require-private-constructor.d.ts.map +1 -0
- package/dist/rules/require-private-constructor.js +34 -0
- package/dist/rules/require-private-constructor.js.map +1 -0
- package/dist/rules/same-type-comparison.d.ts +5 -0
- package/dist/rules/same-type-comparison.d.ts.map +1 -0
- package/dist/rules/same-type-comparison.js +71 -0
- package/dist/rules/same-type-comparison.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|