eslint-plugin-nima 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/configs/recommended.d.ts +5 -0
  2. package/dist/configs/recommended.js +9 -0
  3. package/dist/configs/recommended.js.map +1 -0
  4. package/dist/constants/boolean-prefixes.d.ts +1 -0
  5. package/dist/constants/boolean-prefixes.js +15 -0
  6. package/dist/constants/boolean-prefixes.js.map +1 -0
  7. package/dist/constants/consoles.d.ts +1 -0
  8. package/dist/constants/consoles.js +5 -0
  9. package/dist/constants/consoles.js.map +1 -0
  10. package/dist/constants/hooks.d.ts +2 -0
  11. package/dist/constants/hooks.js +29 -0
  12. package/dist/constants/hooks.js.map +1 -0
  13. package/dist/index.d.ts +93 -0
  14. package/dist/index.js +77 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/rules/boolean-naming-convention.d.ts +9 -0
  17. package/dist/rules/boolean-naming-convention.js +310 -0
  18. package/dist/rules/boolean-naming-convention.js.map +1 -0
  19. package/dist/rules/no-handler-suffix.d.ts +3 -0
  20. package/dist/rules/no-handler-suffix.js +85 -0
  21. package/dist/rules/no-handler-suffix.js.map +1 -0
  22. package/dist/rules/no-objects-in-deps.d.ts +3 -0
  23. package/dist/rules/no-objects-in-deps.js +80 -0
  24. package/dist/rules/no-objects-in-deps.js.map +1 -0
  25. package/dist/rules/no-optional-in-routes.d.ts +3 -0
  26. package/dist/rules/no-optional-in-routes.js +37 -0
  27. package/dist/rules/no-optional-in-routes.js.map +1 -0
  28. package/dist/rules/params-naming-convention.d.ts +8 -0
  29. package/dist/rules/params-naming-convention.js +95 -0
  30. package/dist/rules/params-naming-convention.js.map +1 -0
  31. package/dist/rules/prefer-arrow-functions.d.ts +10 -0
  32. package/dist/rules/prefer-arrow-functions.js +208 -0
  33. package/dist/rules/prefer-arrow-functions.js.map +1 -0
  34. package/dist/rules/prefer-react-fc.d.ts +6 -0
  35. package/dist/rules/prefer-react-fc.js +208 -0
  36. package/dist/rules/prefer-react-fc.js.map +1 -0
  37. package/dist/rules/prefer-react-with-hooks.d.ts +5 -0
  38. package/dist/rules/prefer-react-with-hooks.js +176 -0
  39. package/dist/rules/prefer-react-with-hooks.js.map +1 -0
  40. package/dist/rules/restrict-console-methods.d.ts +9 -0
  41. package/dist/rules/restrict-console-methods.js +75 -0
  42. package/dist/rules/restrict-console-methods.js.map +1 -0
  43. package/dist/utility/getFunctionName.d.ts +2 -0
  44. package/dist/utility/getFunctionName.js +36 -0
  45. package/dist/utility/getFunctionName.js.map +1 -0
  46. package/dist/utility/getType.d.ts +3 -0
  47. package/dist/utility/getType.js +24 -0
  48. package/dist/utility/getType.js.map +1 -0
  49. package/package.json +2 -2
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rule = exports.name = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ exports.name = "prefer-react-fc";
6
+ exports.rule = utils_1.ESLintUtils.RuleCreator.withoutDocs({
7
+ create(context, options) {
8
+ const allowArrowFunctions = options[0].allowArrowFunctions;
9
+ const allowFunctionDeclarations = options[0].allowFunctionDeclarations;
10
+ function isReactComponent(node) {
11
+ var _a, _b;
12
+ let functionName = "";
13
+ if (node.type === utils_1.AST_NODE_TYPES.FunctionDeclaration && node.id) {
14
+ functionName = node.id.name;
15
+ }
16
+ else if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.VariableDeclarator &&
17
+ node.parent.id.type === utils_1.AST_NODE_TYPES.Identifier) {
18
+ functionName = node.parent.id.name;
19
+ }
20
+ else if (((_b = node.parent) === null || _b === void 0 ? void 0 : _b.type) === utils_1.AST_NODE_TYPES.Property &&
21
+ node.parent.key.type === utils_1.AST_NODE_TYPES.Identifier) {
22
+ functionName = node.parent.key.name;
23
+ }
24
+ if (!functionName || !/^[A-Z]/.test(functionName)) {
25
+ return false;
26
+ }
27
+ return hasJSXReturn(node);
28
+ }
29
+ function hasJSXReturn(node) {
30
+ if (!node.body)
31
+ return false;
32
+ if (node.body.type === utils_1.AST_NODE_TYPES.BlockStatement) {
33
+ return checkBlockForJSX(node.body);
34
+ }
35
+ else {
36
+ return isJSXExpression(node.body);
37
+ }
38
+ }
39
+ function checkBlockForJSX(block) {
40
+ var _a;
41
+ for (const statement of block.body) {
42
+ if (statement.type === utils_1.AST_NODE_TYPES.ReturnStatement &&
43
+ statement.argument) {
44
+ if (isJSXExpression(statement.argument)) {
45
+ return true;
46
+ }
47
+ }
48
+ if (statement.type === utils_1.AST_NODE_TYPES.IfStatement) {
49
+ if (statement.consequent.type === utils_1.AST_NODE_TYPES.BlockStatement &&
50
+ checkBlockForJSX(statement.consequent)) {
51
+ return true;
52
+ }
53
+ if (((_a = statement.alternate) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.BlockStatement &&
54
+ checkBlockForJSX(statement.alternate)) {
55
+ return true;
56
+ }
57
+ }
58
+ }
59
+ return false;
60
+ }
61
+ function isJSXExpression(node) {
62
+ return (node.type === utils_1.AST_NODE_TYPES.JSXElement ||
63
+ node.type === utils_1.AST_NODE_TYPES.JSXFragment ||
64
+ (node.type === utils_1.AST_NODE_TYPES.ConditionalExpression &&
65
+ (isJSXExpression(node.consequent) ||
66
+ isJSXExpression(node.alternate))) ||
67
+ (node.type === utils_1.AST_NODE_TYPES.LogicalExpression &&
68
+ isJSXExpression(node.right)));
69
+ }
70
+ function hasReactFCAnnotation(node) {
71
+ var _a;
72
+ if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.VariableDeclarator &&
73
+ node.parent.id.type === utils_1.AST_NODE_TYPES.Identifier &&
74
+ node.parent.id.typeAnnotation) {
75
+ const typeAnnotation = node.parent.id.typeAnnotation.typeAnnotation;
76
+ return containsReactFCType(typeAnnotation);
77
+ }
78
+ if (node.type === utils_1.AST_NODE_TYPES.FunctionDeclaration && node.returnType) {
79
+ return containsReactFCType(node.returnType.typeAnnotation);
80
+ }
81
+ return false;
82
+ }
83
+ function hasCustomComponentTypeAnnotation(node) {
84
+ var _a;
85
+ if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === utils_1.AST_NODE_TYPES.VariableDeclarator &&
86
+ node.parent.id.type === utils_1.AST_NODE_TYPES.Identifier &&
87
+ node.parent.id.typeAnnotation) {
88
+ const typeAnnotation = node.parent.id.typeAnnotation.typeAnnotation;
89
+ return hasCustomComponentType(typeAnnotation);
90
+ }
91
+ if (node.type === utils_1.AST_NODE_TYPES.FunctionDeclaration && node.returnType) {
92
+ return hasCustomComponentType(node.returnType.typeAnnotation);
93
+ }
94
+ return false;
95
+ }
96
+ function hasCustomComponentType(typeNode) {
97
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSIntersectionType) {
98
+ return typeNode.types.some((type) => isCustomComponentType(type));
99
+ }
100
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSUnionType) {
101
+ return typeNode.types.some((type) => isCustomComponentType(type));
102
+ }
103
+ return isCustomComponentType(typeNode);
104
+ }
105
+ function isCustomComponentType(typeNode) {
106
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSTypeReference) {
107
+ const typeName = typeNode.typeName;
108
+ if (typeName.type === utils_1.AST_NODE_TYPES.TSQualifiedName) {
109
+ return true;
110
+ }
111
+ if (typeName.type === utils_1.AST_NODE_TYPES.Identifier) {
112
+ const name = typeName.name;
113
+ if (name === "FC" || name === "FunctionComponent") {
114
+ return false;
115
+ }
116
+ return name.endsWith("Component");
117
+ }
118
+ }
119
+ return false;
120
+ }
121
+ function containsReactFCType(typeNode) {
122
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSIntersectionType) {
123
+ return typeNode.types.some((type) => isReactFCType(type));
124
+ }
125
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSUnionType) {
126
+ return typeNode.types.some((type) => isReactFCType(type));
127
+ }
128
+ return isReactFCType(typeNode);
129
+ }
130
+ function isReactFCType(typeNode) {
131
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
132
+ typeNode.typeName.type === utils_1.AST_NODE_TYPES.TSQualifiedName &&
133
+ typeNode.typeName.left.type === utils_1.AST_NODE_TYPES.Identifier &&
134
+ typeNode.typeName.left.name === "React" &&
135
+ typeNode.typeName.right.type === utils_1.AST_NODE_TYPES.Identifier &&
136
+ (typeNode.typeName.right.name === "FC" ||
137
+ typeNode.typeName.right.name === "FunctionComponent")) {
138
+ return true;
139
+ }
140
+ if (typeNode.type === utils_1.AST_NODE_TYPES.TSTypeReference &&
141
+ typeNode.typeName.type === utils_1.AST_NODE_TYPES.Identifier &&
142
+ (typeNode.typeName.name === "FC" ||
143
+ typeNode.typeName.name === "FunctionComponent")) {
144
+ return true;
145
+ }
146
+ return false;
147
+ }
148
+ return {
149
+ ArrowFunctionExpression(node) {
150
+ if (typeof options !== "string" && !allowArrowFunctions)
151
+ return;
152
+ if (isReactComponent(node) &&
153
+ !hasReactFCAnnotation(node) &&
154
+ !hasCustomComponentTypeAnnotation(node)) {
155
+ context.report({
156
+ messageId: "requireReactFC",
157
+ node,
158
+ });
159
+ }
160
+ },
161
+ FunctionDeclaration(node) {
162
+ if (typeof options !== "string" && !allowFunctionDeclarations)
163
+ return;
164
+ if (isReactComponent(node) &&
165
+ !hasReactFCAnnotation(node) &&
166
+ !hasCustomComponentTypeAnnotation(node)) {
167
+ context.report({
168
+ messageId: "requireReactFC",
169
+ node: node.id || node,
170
+ });
171
+ }
172
+ },
173
+ };
174
+ },
175
+ defaultOptions: [
176
+ {
177
+ allowArrowFunctions: true,
178
+ allowFunctionDeclarations: true,
179
+ },
180
+ ],
181
+ meta: {
182
+ docs: {
183
+ description: "Enforce React.FC type annotation for React component functions",
184
+ },
185
+ fixable: "code",
186
+ messages: {
187
+ requireReactFC: "NIMA: Component functions must use React.FC type annotation.",
188
+ },
189
+ schema: [
190
+ {
191
+ additionalProperties: false,
192
+ properties: {
193
+ allowArrowFunctions: {
194
+ default: true,
195
+ type: "boolean",
196
+ },
197
+ allowFunctionDeclarations: {
198
+ default: true,
199
+ type: "boolean",
200
+ },
201
+ },
202
+ type: "object",
203
+ },
204
+ ],
205
+ type: "problem",
206
+ },
207
+ });
208
+ //# sourceMappingURL=prefer-react-fc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-react-fc.js","sourceRoot":"","sources":["../../src/rules/prefer-react-fc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ export declare const name = "prefer-react-with-hooks";
3
+ export declare const rule: ESLintUtils.RuleModule<"preferReact" | "preferReactPrefix", [{
4
+ autoFix: boolean;
5
+ }], unknown, ESLintUtils.RuleListener>;
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rule = exports.name = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const hooks_1 = require("../constants/hooks");
6
+ exports.name = "prefer-react-with-hooks";
7
+ exports.rule = utils_1.ESLintUtils.RuleCreator.withoutDocs({
8
+ create: (context) => {
9
+ let hasReactImport = false;
10
+ let reactImportNode = null;
11
+ let isAnalysisComplete = false;
12
+ // Pre-analyze all imports first
13
+ const analyzeImports = () => {
14
+ if (isAnalysisComplete)
15
+ return;
16
+ const sourceCode = context.getSourceCode();
17
+ const program = sourceCode.ast;
18
+ for (const node of program.body) {
19
+ if (node.type === utils_1.AST_NODE_TYPES.ImportDeclaration &&
20
+ node.source.value === "react") {
21
+ reactImportNode = node;
22
+ hasReactImport = node.specifiers.some((spec) => spec.type === utils_1.AST_NODE_TYPES.ImportDefaultSpecifier ||
23
+ (spec.type === utils_1.AST_NODE_TYPES.ImportNamespaceSpecifier &&
24
+ spec.local.name === "React"));
25
+ break;
26
+ }
27
+ }
28
+ isAnalysisComplete = true;
29
+ };
30
+ return {
31
+ CallExpression: (node) => {
32
+ if (node.callee.type === utils_1.AST_NODE_TYPES.Identifier &&
33
+ hooks_1.REACT_HOOKS.has(node.callee.name)) {
34
+ analyzeImports(); // Ensure we've analyzed imports first
35
+ const hookName = node.callee.name;
36
+ context.report({
37
+ data: { hook: hookName },
38
+ fix: (fixer) => {
39
+ const fixes = [];
40
+ const sourceCode = context.getSourceCode();
41
+ const program = sourceCode.ast;
42
+ // First, handle the import (this needs to come first in the fixes array)
43
+ if (!hasReactImport) {
44
+ if (reactImportNode) {
45
+ // There's an existing React import but no default import
46
+ const importText = sourceCode.getText(reactImportNode);
47
+ if (importText.includes("{") &&
48
+ !importText.match(/^import\s+\w+\s*,/)) {
49
+ // Transform { useState } to React, { useState }
50
+ fixes.push(fixer.replaceText(reactImportNode, importText.replace(/^import\s*{/, "import React, {")));
51
+ }
52
+ }
53
+ else {
54
+ // No React import exists at all - add at the top
55
+ if (program.body.length > 0) {
56
+ fixes.push(fixer.insertTextBefore(program.body[0], 'import React from "react";\n'));
57
+ }
58
+ else {
59
+ // Empty file case
60
+ fixes.push(fixer.insertTextBefore(node, 'import React from "react";\n'));
61
+ }
62
+ }
63
+ }
64
+ // Then, add the React. prefix
65
+ fixes.push(fixer.insertTextBefore(node.callee, "React."));
66
+ return fixes;
67
+ },
68
+ messageId: "preferReactPrefix",
69
+ node: node.callee,
70
+ });
71
+ }
72
+ },
73
+ ImportDeclaration: (node) => {
74
+ if (node.source.value === "react") {
75
+ reactImportNode = node;
76
+ hasReactImport = node.specifiers.some((spec) => spec.type === utils_1.AST_NODE_TYPES.ImportDefaultSpecifier ||
77
+ (spec.type === utils_1.AST_NODE_TYPES.ImportNamespaceSpecifier &&
78
+ spec.local.name === "React"));
79
+ const useImports = node.specifiers.filter((s) => s.type === utils_1.AST_NODE_TYPES.ImportSpecifier &&
80
+ s.imported.type === utils_1.AST_NODE_TYPES.Identifier &&
81
+ hooks_1.REACT_HOOKS.has(s.imported.name));
82
+ if (useImports.length > 0) {
83
+ const firstHookImport = useImports[0];
84
+ const hookNames = useImports
85
+ .map((spec) => spec.imported.type === utils_1.AST_NODE_TYPES.Identifier
86
+ ? spec.imported.name
87
+ : "")
88
+ .filter(Boolean);
89
+ context.report({
90
+ data: {
91
+ hook: hookNames.length === 1
92
+ ? hookNames[0]
93
+ : `${hookNames
94
+ .slice(0, -1)
95
+ .join(", ")} and ${hookNames.slice(-1)}`,
96
+ },
97
+ fix: (fixer) => {
98
+ const sourceCode = context.getSourceCode();
99
+ const fixes = [];
100
+ const remainingSpecifiers = node.specifiers.filter((spec) => !(spec.type === utils_1.AST_NODE_TYPES.ImportSpecifier &&
101
+ spec.imported.type === utils_1.AST_NODE_TYPES.Identifier &&
102
+ hooks_1.REACT_HOOKS.has(spec.imported.name)));
103
+ if (remainingSpecifiers.length === 0 && !hasReactImport) {
104
+ fixes.push(fixer.replaceText(node, 'import React from "react";'));
105
+ }
106
+ else if (remainingSpecifiers.length > 0 && !hasReactImport) {
107
+ const nonDefaultSpecifiers = remainingSpecifiers.filter((spec) => spec.type !== utils_1.AST_NODE_TYPES.ImportDefaultSpecifier);
108
+ if (nonDefaultSpecifiers.length > 0) {
109
+ const specifierTexts = nonDefaultSpecifiers
110
+ .map((spec) => sourceCode.getText(spec))
111
+ .join(", ");
112
+ fixes.push(fixer.replaceText(node, `import React, { ${specifierTexts} } from "react";`));
113
+ }
114
+ else {
115
+ fixes.push(fixer.replaceText(node, 'import React from "react";'));
116
+ }
117
+ }
118
+ else if (hasReactImport) {
119
+ const hasDefaultReact = remainingSpecifiers.some((spec) => spec.type === utils_1.AST_NODE_TYPES.ImportDefaultSpecifier);
120
+ const namedSpecifiers = remainingSpecifiers.filter((spec) => spec.type === utils_1.AST_NODE_TYPES.ImportSpecifier);
121
+ if (hasDefaultReact && namedSpecifiers.length > 0) {
122
+ const specifierTexts = namedSpecifiers
123
+ .map((spec) => sourceCode.getText(spec))
124
+ .join(", ");
125
+ fixes.push(fixer.replaceText(node, `import React, { ${specifierTexts} } from "react";`));
126
+ }
127
+ else if (hasDefaultReact && namedSpecifiers.length === 0) {
128
+ fixes.push(fixer.replaceText(node, 'import React from "react";'));
129
+ }
130
+ else if (!hasDefaultReact && namedSpecifiers.length > 0) {
131
+ const specifierTexts = namedSpecifiers
132
+ .map((spec) => sourceCode.getText(spec))
133
+ .join(", ");
134
+ fixes.push(fixer.replaceText(node, `import { ${specifierTexts} } from "react";`));
135
+ }
136
+ }
137
+ return fixes;
138
+ },
139
+ messageId: "preferReact",
140
+ node: firstHookImport,
141
+ });
142
+ }
143
+ }
144
+ },
145
+ };
146
+ },
147
+ defaultOptions: [
148
+ {
149
+ autoFix: false,
150
+ },
151
+ ],
152
+ meta: {
153
+ docs: {
154
+ description: "Enforce React.use* over named use* imports",
155
+ },
156
+ fixable: "code",
157
+ messages: {
158
+ preferReact: "NIMA: Use React.{{hook}} instead of importing {{hook}} directly.",
159
+ preferReactPrefix: "NIMA: Prefix {{hook}} with React.",
160
+ },
161
+ schema: [
162
+ {
163
+ additionalProperties: false,
164
+ properties: {
165
+ autoFix: {
166
+ default: true,
167
+ type: "boolean",
168
+ },
169
+ },
170
+ type: "object",
171
+ },
172
+ ],
173
+ type: "problem",
174
+ },
175
+ });
176
+ //# sourceMappingURL=prefer-react-with-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-react-with-hooks.js","sourceRoot":"","sources":["../../src/rules/prefer-react-with-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { ESLintUtils } from "@typescript-eslint/utils";
2
+ type Options = {
3
+ noConsoleError?: boolean;
4
+ noConsoleLog?: boolean;
5
+ noConsoleWarn?: boolean;
6
+ };
7
+ export declare const name = "restrict-console-methods";
8
+ export declare const rule: ESLintUtils.RuleModule<"noConsole", Options[], unknown, ESLintUtils.RuleListener>;
9
+ export {};
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rule = exports.name = void 0;
4
+ const utils_1 = require("@typescript-eslint/utils");
5
+ const consoles_1 = require("../constants/consoles");
6
+ exports.name = "restrict-console-methods";
7
+ exports.rule = utils_1.ESLintUtils.RuleCreator.withoutDocs({
8
+ create(context, options) {
9
+ const noConsoleError = options[0].noConsoleError;
10
+ const noConsoleLog = options[0].noConsoleLog;
11
+ const noConsoleWarn = options[0].noConsoleWarn;
12
+ return {
13
+ CallExpression(node) {
14
+ if (node.callee.type === "MemberExpression" &&
15
+ node.callee.object.type === "Identifier" &&
16
+ node.callee.object.name === "console" &&
17
+ node.callee.property.type === "Identifier") {
18
+ const methodName = node.callee.property.name;
19
+ if (!consoles_1.CONSOLES.has(methodName)) {
20
+ return;
21
+ }
22
+ if ((methodName === "error" && !noConsoleError) ||
23
+ (methodName === "log" && !noConsoleLog) ||
24
+ (methodName === "warn" && !noConsoleWarn)) {
25
+ return;
26
+ }
27
+ context.report({
28
+ data: {
29
+ console: node.callee.property.name,
30
+ },
31
+ messageId: "noConsole",
32
+ node,
33
+ });
34
+ }
35
+ },
36
+ };
37
+ },
38
+ defaultOptions: [
39
+ {
40
+ noConsoleError: true,
41
+ noConsoleLog: true,
42
+ noConsoleWarn: true,
43
+ },
44
+ ],
45
+ meta: {
46
+ docs: {
47
+ description: "Restrict the usage of console in the codebase",
48
+ },
49
+ messages: {
50
+ noConsole: "NIMA: The usage of console.{{ console }} is restricted.",
51
+ },
52
+ schema: [
53
+ {
54
+ additionalProperties: false,
55
+ properties: {
56
+ noConsoleError: {
57
+ default: true,
58
+ type: "boolean",
59
+ },
60
+ noConsoleLog: {
61
+ default: true,
62
+ type: "boolean",
63
+ },
64
+ noConsoleWarn: {
65
+ default: true,
66
+ type: "boolean",
67
+ },
68
+ },
69
+ type: "object",
70
+ },
71
+ ],
72
+ type: "suggestion",
73
+ },
74
+ });
75
+ //# sourceMappingURL=restrict-console-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restrict-console-methods.js","sourceRoot":"","sources":["../../src/rules/restrict-console-methods.ts"],"names":[],"mappings":";;;AAAA,oDAAuD;AAEvD,oDAAiD;AAUpC,QAAA,IAAI,GAAG,0BAA0B,CAAC;AAElC,QAAA,IAAI,GAAG,mBAAW,CAAC,WAAW,CAAC,WAAW,CAAsB;IAC3E,MAAM,CAAC,OAAO,EAAE,OAAO;QACrB,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;QAE/C,OAAO;YACL,cAAc,CAAC,IAAI;gBACjB,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,SAAS;oBACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,EAC1C,CAAC;oBACD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAE7C,IAAI,CAAC,mBAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC9B,OAAO;oBACT,CAAC;oBAED,IACE,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,cAAc,CAAC;wBAC3C,CAAC,UAAU,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC;wBACvC,CAAC,UAAU,KAAK,MAAM,IAAI,CAAC,aAAa,CAAC,EACzC,CAAC;wBACD,OAAO;oBACT,CAAC;oBAED,OAAO,CAAC,MAAM,CAAC;wBACb,IAAI,EAAE;4BACJ,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI;yBACnC;wBACD,SAAS,EAAE,WAAW;wBACtB,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,cAAc,EAAE;QACd;YACE,cAAc,EAAE,IAAI;YACpB,YAAY,EAAE,IAAI;YAClB,aAAa,EAAE,IAAI;SACpB;KACF;IAED,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,WAAW,EAAE,+CAA+C;SAC7D;QACD,QAAQ,EAAE;YACR,SAAS,EAAE,yDAAyD;SACrE;QACD,MAAM,EAAE;YACN;gBACE,oBAAoB,EAAE,KAAK;gBAC3B,UAAU,EAAE;oBACV,cAAc,EAAE;wBACd,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,SAAS;qBAChB;oBACD,YAAY,EAAE;wBACZ,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,SAAS;qBAChB;oBACD,aAAa,EAAE;wBACb,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,SAAS;qBAChB;iBACF;gBACD,IAAI,EAAE,QAAQ;aACf;SACF;QACD,IAAI,EAAE,YAAY;KACnB;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type TSESTree } from "@typescript-eslint/typescript-estree";
2
+ export declare function getFunctionName(node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression): string;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFunctionName = getFunctionName;
4
+ const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
5
+ function getFunctionName(node) {
6
+ var _a, _b, _c, _d, _e;
7
+ if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === typescript_estree_1.AST_NODE_TYPES.CallExpression) {
8
+ const callExpr = node.parent;
9
+ if (callExpr.callee.type === typescript_estree_1.AST_NODE_TYPES.MemberExpression &&
10
+ callExpr.callee.property.type === typescript_estree_1.AST_NODE_TYPES.Identifier) {
11
+ return callExpr.callee.property.name;
12
+ }
13
+ if (callExpr.callee.type === typescript_estree_1.AST_NODE_TYPES.Identifier) {
14
+ return callExpr.callee.name;
15
+ }
16
+ }
17
+ if ("id" in node && ((_b = node.id) === null || _b === void 0 ? void 0 : _b.type) === typescript_estree_1.AST_NODE_TYPES.Identifier) {
18
+ return node.id.name;
19
+ }
20
+ if (((_c = node.parent) === null || _c === void 0 ? void 0 : _c.type) === typescript_estree_1.AST_NODE_TYPES.Property &&
21
+ node.parent.key.type === typescript_estree_1.AST_NODE_TYPES.Identifier) {
22
+ return node.parent.key.name;
23
+ }
24
+ if (node.type === typescript_estree_1.AST_NODE_TYPES.ArrowFunctionExpression &&
25
+ ((_d = node.parent) === null || _d === void 0 ? void 0 : _d.type) === typescript_estree_1.AST_NODE_TYPES.VariableDeclarator &&
26
+ node.parent.id.type === typescript_estree_1.AST_NODE_TYPES.Identifier) {
27
+ return node.parent.id.name;
28
+ }
29
+ if (node.type === typescript_estree_1.AST_NODE_TYPES.FunctionExpression &&
30
+ ((_e = node.parent) === null || _e === void 0 ? void 0 : _e.type) === typescript_estree_1.AST_NODE_TYPES.VariableDeclarator &&
31
+ node.parent.id.type === typescript_estree_1.AST_NODE_TYPES.Identifier) {
32
+ return node.parent.id.name;
33
+ }
34
+ return null;
35
+ }
36
+ //# sourceMappingURL=getFunctionName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFunctionName.js","sourceRoot":"","sources":["../../src/utility/getFunctionName.ts"],"names":[],"mappings":";;AAKA,0CAiDC;AAtDD,4EAG8C;AAE9C,SAAgB,eAAe,CAC7B,IAG+B;;IAE/B,IAAI,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,kCAAc,CAAC,cAAc,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAE7B,IACE,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,kCAAc,CAAC,gBAAgB;YACxD,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,kCAAc,CAAC,UAAU,EAC3D,CAAC;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvC,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,kCAAc,CAAC,UAAU,EAAE,CAAC;YACvD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,IAAI,IAAI,IAAI,CAAA,MAAA,IAAI,CAAC,EAAE,0CAAE,IAAI,MAAK,kCAAc,CAAC,UAAU,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;IACtB,CAAC;IAED,IACE,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,kCAAc,CAAC,QAAQ;QAC7C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,kCAAc,CAAC,UAAU,EAClD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED,IACE,IAAI,CAAC,IAAI,KAAK,kCAAc,CAAC,uBAAuB;QACpD,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,kCAAc,CAAC,kBAAkB;QACvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,kCAAc,CAAC,UAAU,EACjD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,IACE,IAAI,CAAC,IAAI,KAAK,kCAAc,CAAC,kBAAkB;QAC/C,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,MAAK,kCAAc,CAAC,kBAAkB;QACvD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,kCAAc,CAAC,UAAU,EACjD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TSESTree } from "@typescript-eslint/typescript-estree";
2
+ import type { TSESLint } from "@typescript-eslint/utils";
3
+ export declare function getType(context: Readonly<TSESLint.RuleContext<string, unknown[]>>, node: TSESTree.Node): string;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getType = getType;
4
+ function getType(context, node) {
5
+ var _a, _b;
6
+ const sourceCode = context.getSourceCode();
7
+ const services = sourceCode.parserServices;
8
+ if (!((_a = services === null || services === void 0 ? void 0 : services.program) === null || _a === void 0 ? void 0 : _a.getTypeChecker)) {
9
+ return;
10
+ }
11
+ const checker = services.program.getTypeChecker();
12
+ try {
13
+ const tsNode = (_b = services.esTreeNodeToTSNodeMap) === null || _b === void 0 ? void 0 : _b.get(node);
14
+ if (!tsNode)
15
+ return;
16
+ const type = checker.getTypeAtLocation(tsNode);
17
+ const typeString = checker.typeToString(type);
18
+ return typeString;
19
+ }
20
+ catch {
21
+ return;
22
+ }
23
+ }
24
+ //# sourceMappingURL=getType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getType.js","sourceRoot":"","sources":["../../src/utility/getType.ts"],"names":[],"mappings":";;AAGA,0BAwBC;AAxBD,SAAgB,OAAO,CACrB,OAA0D,EAC1D,IAAmB;;IAEnB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,cAAc,CAAC;IAE3C,IAAI,CAAC,CAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,0CAAE,cAAc,CAAA,EAAE,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAA,QAAQ,CAAC,qBAAqB,0CAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-nima",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "ESLint plugin for NIMA Labs",
5
5
  "keywords": [
6
6
  "eslint",
@@ -12,7 +12,7 @@
12
12
  "author": "NIMA",
13
13
  "main": "lib/index.js",
14
14
  "files": [
15
- "/lib",
15
+ "/dist",
16
16
  "README.md"
17
17
  ],
18
18
  "type": "commonjs",