eslint-plugin-ts-data-forge 0.6.1 → 0.7.1

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 (77) hide show
  1. package/README.md +1 -0
  2. package/dist/index.mjs +2 -2
  3. package/dist/index.mjs.map +1 -1
  4. package/dist/plugin.d.mts +2 -0
  5. package/dist/plugin.d.mts.map +1 -1
  6. package/dist/plugin.mjs +45 -41
  7. package/dist/plugin.mjs.map +1 -1
  8. package/dist/rule-types.d.mts +15 -0
  9. package/dist/rule-types.d.mts.map +1 -1
  10. package/dist/rule-types.mjs +6 -2
  11. package/dist/rule-types.mjs.map +1 -1
  12. package/dist/rules/ast-utils.mjs +107 -50
  13. package/dist/rules/ast-utils.mjs.map +1 -1
  14. package/dist/rules/branded-number-types.mjs +41 -37
  15. package/dist/rules/branded-number-types.mjs.map +1 -1
  16. package/dist/rules/constants.mjs +2 -4
  17. package/dist/rules/constants.mjs.map +1 -1
  18. package/dist/rules/import-utils.mjs +80 -56
  19. package/dist/rules/import-utils.mjs.map +1 -1
  20. package/dist/rules/index.mjs +2 -2
  21. package/dist/rules/index.mjs.map +1 -1
  22. package/dist/rules/no-side-effect-import.mjs +46 -34
  23. package/dist/rules/no-side-effect-import.mjs.map +1 -1
  24. package/dist/rules/no-unnecessary-type-guard.mjs +376 -265
  25. package/dist/rules/no-unnecessary-type-guard.mjs.map +1 -1
  26. package/dist/rules/prefer-arr-is-array.mjs +64 -52
  27. package/dist/rules/prefer-arr-is-array.mjs.map +1 -1
  28. package/dist/rules/prefer-arr-is-bounded-length-array.mjs +91 -85
  29. package/dist/rules/prefer-arr-is-bounded-length-array.mjs.map +1 -1
  30. package/dist/rules/prefer-arr-is-fixed-length-array.mjs +92 -83
  31. package/dist/rules/prefer-arr-is-fixed-length-array.mjs.map +1 -1
  32. package/dist/rules/prefer-arr-is-max-length-array.mjs +92 -80
  33. package/dist/rules/prefer-arr-is-max-length-array.mjs.map +1 -1
  34. package/dist/rules/prefer-arr-is-min-length-array.mjs +92 -80
  35. package/dist/rules/prefer-arr-is-min-length-array.mjs.map +1 -1
  36. package/dist/rules/prefer-arr-is-non-empty.mjs +85 -77
  37. package/dist/rules/prefer-arr-is-non-empty.mjs.map +1 -1
  38. package/dist/rules/prefer-arr-scan.d.mts +96 -0
  39. package/dist/rules/prefer-arr-scan.d.mts.map +1 -0
  40. package/dist/rules/prefer-arr-scan.mjs +482 -0
  41. package/dist/rules/prefer-arr-scan.mjs.map +1 -0
  42. package/dist/rules/prefer-arr-sum.mjs +176 -132
  43. package/dist/rules/prefer-arr-sum.mjs.map +1 -1
  44. package/dist/rules/prefer-as-int.mjs +77 -71
  45. package/dist/rules/prefer-as-int.mjs.map +1 -1
  46. package/dist/rules/prefer-canonical-array-slicing.mjs +503 -343
  47. package/dist/rules/prefer-canonical-array-slicing.mjs.map +1 -1
  48. package/dist/rules/prefer-canonical-length-cast.mjs +217 -144
  49. package/dist/rules/prefer-canonical-length-cast.mjs.map +1 -1
  50. package/dist/rules/prefer-canonical-length-guard.mjs +160 -109
  51. package/dist/rules/prefer-canonical-length-guard.mjs.map +1 -1
  52. package/dist/rules/prefer-comparison-over-nullish-guard.mjs +89 -71
  53. package/dist/rules/prefer-comparison-over-nullish-guard.mjs.map +1 -1
  54. package/dist/rules/prefer-is-non-null-object.mjs +91 -72
  55. package/dist/rules/prefer-is-non-null-object.mjs.map +1 -1
  56. package/dist/rules/prefer-is-record-and-has-key.mjs +148 -105
  57. package/dist/rules/prefer-is-record-and-has-key.mjs.map +1 -1
  58. package/dist/rules/prefer-num-safe-parse-float.mjs +101 -77
  59. package/dist/rules/prefer-num-safe-parse-float.mjs.map +1 -1
  60. package/dist/rules/prefer-num-safe-parse-int.mjs +103 -81
  61. package/dist/rules/prefer-num-safe-parse-int.mjs.map +1 -1
  62. package/dist/rules/prefer-obj-over-entries-round-trip.mjs +299 -194
  63. package/dist/rules/prefer-obj-over-entries-round-trip.mjs.map +1 -1
  64. package/dist/rules/prefer-range-for-loop.mjs +121 -99
  65. package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
  66. package/dist/rules/rules.d.mts +1 -0
  67. package/dist/rules/rules.d.mts.map +1 -1
  68. package/dist/rules/rules.mjs +19 -20
  69. package/dist/rules/rules.mjs.map +1 -1
  70. package/dist/types.mjs +2 -2
  71. package/dist/types.mjs.map +1 -1
  72. package/package.json +6 -7
  73. package/src/plugin.mts +1 -0
  74. package/src/rule-types.mts +16 -0
  75. package/src/rules/prefer-arr-scan.mts +693 -0
  76. package/src/rules/prefer-arr-scan.test.mts +295 -0
  77. package/src/rules/rules.mts +2 -0
@@ -1,84 +1,108 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
1
+ import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
2
2
  import * as ts from 'typescript';
3
- import { getTsDataForgeImport, getNamedImports, buildImportFixes } from './import-utils.mjs';
3
+ import { buildImportFixes, getNamedImports, getTsDataForgeImport, } from './import-utils.mjs';
4
+
5
+
6
+
7
+
8
+
9
+
4
10
 
5
11
  const isStringType = (type) => {
6
- const parts = type.isUnion() ? type.types : [type];
7
- return parts.length > 0 && parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0);
12
+ const parts = type.isUnion() ? type.types : [type];
13
+ return (parts.length > 0 &&
14
+ parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0));
8
15
  };
9
- const preferNumSafeParseFloat = {
10
- meta: {
11
- type: "suggestion",
12
- docs: {
13
- description: "Replace `parseFloat(x)`, `Number.parseFloat(x)`, or `Number(x)` (when x is a string) with `Result.unwrapOkOr(Num.safeParseFloat(x), Number.NaN)` from ts-data-forge."
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+ export const preferNumSafeParseFloat = {
25
+ meta: {
26
+ type: 'suggestion',
27
+ docs: {
28
+ description: 'Replace `parseFloat(x)`, `Number.parseFloat(x)`, or `Number(x)` (when x is a string) with `Result.unwrapOkOr(Num.safeParseFloat(x), Number.NaN)` from ts-data-forge.',
29
+ },
30
+ fixable: 'code',
31
+ schema: [],
32
+ messages: {
33
+ useSafeParseFloat: 'Replace `{{original}}` with `Result.unwrapOkOr(Num.safeParseFloat({{argName}}), Number.NaN)` from ts-data-forge.',
34
+ },
14
35
  },
15
- fixable: "code",
16
- schema: [],
17
- messages: {
18
- useSafeParseFloat: "Replace `{{original}}` with `Result.unwrapOkOr(Num.safeParseFloat({{argName}}), Number.NaN)` from ts-data-forge."
19
- }
20
- },
21
- create: (context) => {
22
- const sourceCode = context.sourceCode;
23
- const program = sourceCode.ast;
24
- const tsDataForgeImport = getTsDataForgeImport(program);
25
- const services = context.sourceCode.parserServices;
26
- const mut_nodesToFix = [];
27
- return {
28
- CallExpression: (node) => {
29
- const { callee } = node;
30
- const isGlobalParseFloat = callee.type === AST_NODE_TYPES.Identifier && callee.name === "parseFloat";
31
- const isNumberParseFloat = callee.type === AST_NODE_TYPES.MemberExpression && !callee.computed && callee.object.type === AST_NODE_TYPES.Identifier && callee.object.name === "Number" && callee.property.type === AST_NODE_TYPES.Identifier && callee.property.name === "parseFloat";
32
- const isNumberCall = callee.type === AST_NODE_TYPES.Identifier && callee.name === "Number";
33
- if (!isGlobalParseFloat && !isNumberParseFloat && !isNumberCall)
34
- return;
35
- const args = node.arguments;
36
- const firstArg = args[0];
37
- if (firstArg === void 0) return;
38
- if (firstArg.type === AST_NODE_TYPES.SpreadElement) return;
39
- if (services?.program == null) return;
40
- const checker = services.program.getTypeChecker();
41
- const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);
42
- if (tsNode === void 0) return;
43
- const argType = checker.getTypeAtLocation(tsNode);
44
- if (!isStringType(argType)) return;
45
- mut_nodesToFix.push({ node, argExpression: firstArg });
46
- },
47
- "Program:exit": () => {
48
- const namedImports = getNamedImports(tsDataForgeImport);
49
- const missingImports = ["Num", "Result"].filter(
50
- (name) => !namedImports.includes(name)
51
- );
52
- for (const [
53
- index,
54
- { node, argExpression }
55
- ] of mut_nodesToFix.entries()) {
56
- const argText = sourceCode.getText(argExpression);
57
- const originalText = sourceCode.getText(node);
58
- context.report({
59
- node,
60
- messageId: "useSafeParseFloat",
61
- data: {
62
- original: originalText,
63
- argName: argText
36
+ create: (context) => {
37
+ const sourceCode = context.sourceCode;
38
+ const program = sourceCode.ast;
39
+ const tsDataForgeImport = getTsDataForgeImport(program);
40
+ const services = context.sourceCode.parserServices;
41
+ const mut_nodesToFix = [];
42
+ return {
43
+ CallExpression: (node) => {
44
+ const { callee } = node;
45
+
46
+ const isGlobalParseFloat = callee.type === AST_NODE_TYPES.Identifier &&
47
+ callee.name === 'parseFloat';
48
+
49
+ const isNumberParseFloat = callee.type === AST_NODE_TYPES.MemberExpression &&
50
+ !callee.computed &&
51
+ callee.object.type === AST_NODE_TYPES.Identifier &&
52
+ callee.object.name === 'Number' &&
53
+ callee.property.type === AST_NODE_TYPES.Identifier &&
54
+ callee.property.name === 'parseFloat';
55
+
56
+ const isNumberCall = callee.type === AST_NODE_TYPES.Identifier &&
57
+ callee.name === 'Number';
58
+ if (!isGlobalParseFloat && !isNumberParseFloat && !isNumberCall)
59
+ return;
60
+ const args = node.arguments;
61
+ const firstArg = args[0];
62
+ if (firstArg === undefined)
63
+ return;
64
+
65
+ if (firstArg.type === AST_NODE_TYPES.SpreadElement)
66
+ return;
67
+
68
+
69
+
70
+ if (services?.program == null)
71
+ return;
72
+ const checker = services.program.getTypeChecker();
73
+ const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);
74
+ if (tsNode === undefined)
75
+ return;
76
+ const argType = checker.getTypeAtLocation(tsNode);
77
+ if (!isStringType(argType))
78
+ return;
79
+ mut_nodesToFix.push({ node, argExpression: firstArg });
64
80
  },
65
- fix: (fixer) => {
66
- const core = `Result.unwrapOkOr(Num.safeParseFloat(${argText}), Number.NaN)`;
67
- const importFixes = index === 0 && missingImports.length > 0 ? buildImportFixes(
68
- fixer,
69
- program,
70
- tsDataForgeImport,
71
- missingImports
72
- ) : [];
73
- return [...importFixes, fixer.replaceText(node, core)];
74
- }
75
- });
76
- }
77
- }
78
- };
79
- },
80
- defaultOptions: []
81
+ 'Program:exit': () => {
82
+ const namedImports = getNamedImports(tsDataForgeImport);
83
+ const missingImports = ['Num', 'Result'].filter((name) => !namedImports.includes(name));
84
+ for (const [index, { node, argExpression },] of mut_nodesToFix.entries()) {
85
+ const argText = sourceCode.getText(argExpression);
86
+ const originalText = sourceCode.getText(node);
87
+ context.report({
88
+ node,
89
+ messageId: 'useSafeParseFloat',
90
+ data: {
91
+ original: originalText,
92
+ argName: argText,
93
+ },
94
+ fix: (fixer) => {
95
+ const core = `Result.unwrapOkOr(Num.safeParseFloat(${argText}), Number.NaN)`;
96
+ const importFixes = index === 0 && missingImports.length > 0
97
+ ? buildImportFixes(fixer, program, tsDataForgeImport, missingImports)
98
+ : [];
99
+ return [...importFixes, fixer.replaceText(node, core)];
100
+ },
101
+ });
102
+ }
103
+ },
104
+ };
105
+ },
106
+ defaultOptions: [],
81
107
  };
82
-
83
- export { preferNumSafeParseFloat };
84
- //# sourceMappingURL=prefer-num-safe-parse-float.mjs.map
108
+ //# sourceMappingURL=prefer-num-safe-parse-float.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefer-num-safe-parse-float.mjs","sources":["../../src/rules/prefer-num-safe-parse-float.mts"],"sourcesContent":["import {\n AST_NODE_TYPES,\n type TSESLint,\n type TSESTree,\n} from '@typescript-eslint/utils';\nimport * as ts from 'typescript';\nimport {\n buildImportFixes,\n getNamedImports,\n getTsDataForgeImport,\n} from './import-utils.mjs';\n\ntype Options = readonly [];\n\ntype MessageIds = 'useSafeParseFloat';\n\n/**\n * Returns `true` when every constituent of `type` is string-like, i.e. the\n * type is assignable to the `string` parameter of `Num.safeParseFloat`. A\n * union such as `string | undefined` is rejected so the autofix never\n * produces a type error.\n */\n// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\nconst isStringType = (type: ts.Type): boolean => {\n const parts = type.isUnion() ? type.types : ([type] as const);\n\n return (\n parts.length > 0 &&\n parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0)\n );\n};\n\n/**\n * Detects `parseFloat(x)`, `Number.parseFloat(x)`, and `Number(x)` (when x\n * is typed as `string`) and replaces them with\n * `Result.unwrapOkOr(Num.safeParseFloat(x), Number.NaN)` (ts-data-forge).\n *\n * `Number(x)` is only flagged when x is purely a string type to avoid false\n * positives for `Number(someBoolean)` or `Number(someNumber)` uses.\n */\nexport const preferNumSafeParseFloat: TSESLint.RuleModule<MessageIds, Options> =\n {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Replace `parseFloat(x)`, `Number.parseFloat(x)`, or `Number(x)` (when x is a string) with `Result.unwrapOkOr(Num.safeParseFloat(x), Number.NaN)` from ts-data-forge.',\n },\n fixable: 'code',\n schema: [],\n messages: {\n useSafeParseFloat:\n 'Replace `{{original}}` with `Result.unwrapOkOr(Num.safeParseFloat({{argName}}), Number.NaN)` from ts-data-forge.',\n },\n },\n\n create: (context) => {\n const sourceCode = context.sourceCode;\n\n const program = sourceCode.ast;\n\n const tsDataForgeImport = getTsDataForgeImport(program);\n\n const services = context.sourceCode.parserServices;\n\n const mut_nodesToFix: {\n node: TSESTree.CallExpression;\n argExpression: TSESTree.Expression;\n }[] = [];\n\n return {\n CallExpression: (node) => {\n const { callee } = node;\n\n // Match `parseFloat(...)` (global function).\n const isGlobalParseFloat =\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === 'parseFloat';\n\n // Match `Number.parseFloat(...)`.\n const isNumberParseFloat =\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === 'Number' &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === 'parseFloat';\n\n // Match `Number(...)` called as a function (not `new Number(...)`).\n const isNumberCall =\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === 'Number';\n\n if (!isGlobalParseFloat && !isNumberParseFloat && !isNumberCall)\n return;\n\n const args = node.arguments;\n\n const firstArg = args[0];\n\n if (firstArg === undefined) return;\n\n // Spread argument (`parseFloat(...rest)`) cannot be rewritten safely.\n if (firstArg.type === AST_NODE_TYPES.SpreadElement) return;\n\n // The argument must be purely `string` so the autofix is type-safe\n // against `Num.safeParseFloat(s: string)`. Without type information,\n // skip.\n if (services?.program == null) return;\n\n const checker = services.program.getTypeChecker();\n\n const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);\n\n if (tsNode === undefined) return;\n\n const argType = checker.getTypeAtLocation(tsNode);\n\n if (!isStringType(argType)) return;\n\n mut_nodesToFix.push({ node, argExpression: firstArg });\n },\n 'Program:exit': () => {\n const namedImports = getNamedImports(tsDataForgeImport);\n\n const missingImports = (['Num', 'Result'] as const).filter(\n (name) => !namedImports.includes(name),\n );\n\n for (const [\n index,\n { node, argExpression },\n ] of mut_nodesToFix.entries()) {\n const argText = sourceCode.getText(argExpression);\n\n const originalText = sourceCode.getText(node);\n\n context.report({\n node,\n messageId: 'useSafeParseFloat',\n data: {\n original: originalText,\n argName: argText,\n },\n fix: (fixer) => {\n const core = `Result.unwrapOkOr(Num.safeParseFloat(${argText}), Number.NaN)`;\n\n const importFixes =\n index === 0 && missingImports.length > 0\n ? buildImportFixes(\n fixer,\n program,\n tsDataForgeImport,\n missingImports,\n )\n : [];\n\n return [...importFixes, fixer.replaceText(node, core)];\n },\n });\n }\n },\n };\n },\n defaultOptions: [],\n } as const;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prefer-num-safe-parse-float.mjs","sourceRoot":"","sources":["../../src/rules/prefer-num-safe-parse-float.mts"],"names":[],"mappings":"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"}
@@ -1,88 +1,110 @@
1
- import { AST_NODE_TYPES } from '@typescript-eslint/utils';
1
+ import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
2
2
  import * as ts from 'typescript';
3
- import { getTsDataForgeImport, getNamedImports, buildImportFixes } from './import-utils.mjs';
3
+ import { buildImportFixes, getNamedImports, getTsDataForgeImport, } from './import-utils.mjs';
4
+
5
+
6
+
7
+
8
+
9
+
4
10
 
5
11
  const isStringType = (type) => {
6
- const parts = type.isUnion() ? type.types : [type];
7
- return parts.length > 0 && parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0);
12
+ const parts = type.isUnion() ? type.types : [type];
13
+ return (parts.length > 0 &&
14
+ parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0));
8
15
  };
9
- const preferNumSafeParseInt = {
10
- meta: {
11
- type: "suggestion",
12
- docs: {
13
- description: "Replace `parseInt(x, 10)` with `Result.unwrapOkOr(Num.safeParseInt(x), Number.NaN)` from ts-data-forge."
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+ export const preferNumSafeParseInt = {
25
+ meta: {
26
+ type: 'suggestion',
27
+ docs: {
28
+ description: 'Replace `parseInt(x, 10)` with `Result.unwrapOkOr(Num.safeParseInt(x), Number.NaN)` from ts-data-forge.',
29
+ },
30
+ fixable: 'code',
31
+ schema: [],
32
+ messages: {
33
+ useSafeParseInt: 'Replace `{{original}}` with `Result.unwrapOkOr(Num.safeParseInt({{argName}}), Number.NaN)` from ts-data-forge.',
34
+ },
14
35
  },
15
- fixable: "code",
16
- schema: [],
17
- messages: {
18
- useSafeParseInt: "Replace `{{original}}` with `Result.unwrapOkOr(Num.safeParseInt({{argName}}), Number.NaN)` from ts-data-forge."
19
- }
20
- },
21
- create: (context) => {
22
- const sourceCode = context.sourceCode;
23
- const program = sourceCode.ast;
24
- const tsDataForgeImport = getTsDataForgeImport(program);
25
- const services = context.sourceCode.parserServices;
26
- const mut_nodesToFix = [];
27
- return {
28
- CallExpression: (node) => {
29
- const { callee } = node;
30
- const isGlobalParseInt = callee.type === AST_NODE_TYPES.Identifier && callee.name === "parseInt";
31
- const isNumberParseInt = callee.type === AST_NODE_TYPES.MemberExpression && !callee.computed && callee.object.type === AST_NODE_TYPES.Identifier && callee.object.name === "Number" && callee.property.type === AST_NODE_TYPES.Identifier && callee.property.name === "parseInt";
32
- if (!isGlobalParseInt && !isNumberParseInt) return;
33
- const args = node.arguments;
34
- const firstArg = args[0];
35
- if (firstArg === void 0) return;
36
- if (firstArg.type === AST_NODE_TYPES.SpreadElement) return;
37
- if (args.length >= 2) {
38
- const radix = args[1];
39
- if (radix?.type !== AST_NODE_TYPES.Literal || radix.value !== 10) {
40
- return;
41
- }
42
- }
43
- if (services?.program == null) return;
44
- const checker = services.program.getTypeChecker();
45
- const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);
46
- if (tsNode === void 0) return;
47
- const argType = checker.getTypeAtLocation(tsNode);
48
- if (!isStringType(argType)) return;
49
- mut_nodesToFix.push({ node, argExpression: firstArg });
50
- },
51
- "Program:exit": () => {
52
- const namedImports = getNamedImports(tsDataForgeImport);
53
- const missingImports = ["Num", "Result"].filter(
54
- (name) => !namedImports.includes(name)
55
- );
56
- for (const [
57
- index,
58
- { node, argExpression }
59
- ] of mut_nodesToFix.entries()) {
60
- const argText = sourceCode.getText(argExpression);
61
- const originalText = sourceCode.getText(node);
62
- context.report({
63
- node,
64
- messageId: "useSafeParseInt",
65
- data: {
66
- original: originalText,
67
- argName: argText
36
+ create: (context) => {
37
+ const sourceCode = context.sourceCode;
38
+ const program = sourceCode.ast;
39
+ const tsDataForgeImport = getTsDataForgeImport(program);
40
+ const services = context.sourceCode.parserServices;
41
+ const mut_nodesToFix = [];
42
+ return {
43
+ CallExpression: (node) => {
44
+ const { callee } = node;
45
+
46
+ const isGlobalParseInt = callee.type === AST_NODE_TYPES.Identifier &&
47
+ callee.name === 'parseInt';
48
+ const isNumberParseInt = callee.type === AST_NODE_TYPES.MemberExpression &&
49
+ !callee.computed &&
50
+ callee.object.type === AST_NODE_TYPES.Identifier &&
51
+ callee.object.name === 'Number' &&
52
+ callee.property.type === AST_NODE_TYPES.Identifier &&
53
+ callee.property.name === 'parseInt';
54
+ if (!isGlobalParseInt && !isNumberParseInt)
55
+ return;
56
+ const args = node.arguments;
57
+ const firstArg = args[0];
58
+ if (firstArg === undefined)
59
+ return;
60
+
61
+ if (firstArg.type === AST_NODE_TYPES.SpreadElement)
62
+ return;
63
+
64
+ if (args.length >= 2) {
65
+ const radix = args[1];
66
+ if (radix?.type !== AST_NODE_TYPES.Literal || radix.value !== 10) {
67
+ return;
68
+ }
69
+ }
70
+
71
+
72
+ if (services?.program == null)
73
+ return;
74
+ const checker = services.program.getTypeChecker();
75
+ const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);
76
+ if (tsNode === undefined)
77
+ return;
78
+ const argType = checker.getTypeAtLocation(tsNode);
79
+ if (!isStringType(argType))
80
+ return;
81
+ mut_nodesToFix.push({ node, argExpression: firstArg });
82
+ },
83
+ 'Program:exit': () => {
84
+ const namedImports = getNamedImports(tsDataForgeImport);
85
+ const missingImports = ['Num', 'Result'].filter((name) => !namedImports.includes(name));
86
+ for (const [index, { node, argExpression },] of mut_nodesToFix.entries()) {
87
+ const argText = sourceCode.getText(argExpression);
88
+ const originalText = sourceCode.getText(node);
89
+ context.report({
90
+ node,
91
+ messageId: 'useSafeParseInt',
92
+ data: {
93
+ original: originalText,
94
+ argName: argText,
95
+ },
96
+ fix: (fixer) => {
97
+ const core = `Result.unwrapOkOr(Num.safeParseInt(${argText}), Number.NaN)`;
98
+ const importFixes = index === 0 && missingImports.length > 0
99
+ ? buildImportFixes(fixer, program, tsDataForgeImport, missingImports)
100
+ : [];
101
+ return [...importFixes, fixer.replaceText(node, core)];
102
+ },
103
+ });
104
+ }
68
105
  },
69
- fix: (fixer) => {
70
- const core = `Result.unwrapOkOr(Num.safeParseInt(${argText}), Number.NaN)`;
71
- const importFixes = index === 0 && missingImports.length > 0 ? buildImportFixes(
72
- fixer,
73
- program,
74
- tsDataForgeImport,
75
- missingImports
76
- ) : [];
77
- return [...importFixes, fixer.replaceText(node, core)];
78
- }
79
- });
80
- }
81
- }
82
- };
83
- },
84
- defaultOptions: []
106
+ };
107
+ },
108
+ defaultOptions: [],
85
109
  };
86
-
87
- export { preferNumSafeParseInt };
88
- //# sourceMappingURL=prefer-num-safe-parse-int.mjs.map
110
+ //# sourceMappingURL=prefer-num-safe-parse-int.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"prefer-num-safe-parse-int.mjs","sources":["../../src/rules/prefer-num-safe-parse-int.mts"],"sourcesContent":["import {\n AST_NODE_TYPES,\n type TSESLint,\n type TSESTree,\n} from '@typescript-eslint/utils';\nimport * as ts from 'typescript';\nimport {\n buildImportFixes,\n getNamedImports,\n getTsDataForgeImport,\n} from './import-utils.mjs';\n\ntype Options = readonly [];\n\ntype MessageIds = 'useSafeParseInt';\n\n/**\n * Returns `true` when every constituent of `type` is string-like, i.e. the type\n * is assignable to the `string` parameter of `Num.safeParseInt`. A union such\n * as `string | undefined` is rejected so the autofix never produces a type\n * error.\n */\n// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types\nconst isStringType = (type: ts.Type): boolean => {\n const parts = type.isUnion() ? type.types : ([type] as const);\n\n return (\n parts.length > 0 &&\n parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0)\n );\n};\n\n/**\n * Detects the base-10 forms of `parseInt` / `Number.parseInt` (`parseInt(x)` or\n * `parseInt(x, 10)`) and replaces them with\n * `Result.unwrapOkOr(Num.safeParseInt(x), Number.NaN)` (ts-data-forge).\n *\n * Other radixes (e.g. `parseInt(x, 16)`) are intentionally left untouched, as\n * `Num.safeParseInt` only supports base 10.\n */\nexport const preferNumSafeParseInt: TSESLint.RuleModule<MessageIds, Options> = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Replace `parseInt(x, 10)` with `Result.unwrapOkOr(Num.safeParseInt(x), Number.NaN)` from ts-data-forge.',\n },\n fixable: 'code',\n schema: [],\n messages: {\n useSafeParseInt:\n 'Replace `{{original}}` with `Result.unwrapOkOr(Num.safeParseInt({{argName}}), Number.NaN)` from ts-data-forge.',\n },\n },\n\n create: (context) => {\n const sourceCode = context.sourceCode;\n\n const program = sourceCode.ast;\n\n const tsDataForgeImport = getTsDataForgeImport(program);\n\n const services = context.sourceCode.parserServices;\n\n const mut_nodesToFix: {\n node: TSESTree.CallExpression;\n argExpression: TSESTree.Expression;\n }[] = [];\n\n return {\n CallExpression: (node) => {\n const { callee } = node;\n\n // Match `parseInt(...)` or `Number.parseInt(...)`.\n const isGlobalParseInt =\n callee.type === AST_NODE_TYPES.Identifier &&\n callee.name === 'parseInt';\n\n const isNumberParseInt =\n callee.type === AST_NODE_TYPES.MemberExpression &&\n !callee.computed &&\n callee.object.type === AST_NODE_TYPES.Identifier &&\n callee.object.name === 'Number' &&\n callee.property.type === AST_NODE_TYPES.Identifier &&\n callee.property.name === 'parseInt';\n\n if (!isGlobalParseInt && !isNumberParseInt) return;\n\n const args = node.arguments;\n\n const firstArg = args[0];\n\n if (firstArg === undefined) return;\n\n // Spread argument (`parseInt(...rest)`) cannot be rewritten safely.\n if (firstArg.type === AST_NODE_TYPES.SpreadElement) return;\n\n // Only base 10: accept a missing radix or an explicit literal `10`.\n if (args.length >= 2) {\n const radix = args[1];\n\n if (radix?.type !== AST_NODE_TYPES.Literal || radix.value !== 10) {\n return;\n }\n }\n\n // The argument must be a `string` so the autofix is type-safe against\n // `Num.safeParseInt(s: string)`. Without type information, skip.\n if (services?.program == null) return;\n\n const checker = services.program.getTypeChecker();\n\n const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);\n\n if (tsNode === undefined) return;\n\n const argType = checker.getTypeAtLocation(tsNode);\n\n if (!isStringType(argType)) return;\n\n mut_nodesToFix.push({ node, argExpression: firstArg });\n },\n 'Program:exit': () => {\n const namedImports = getNamedImports(tsDataForgeImport);\n\n const missingImports = (['Num', 'Result'] as const).filter(\n (name) => !namedImports.includes(name),\n );\n\n for (const [\n index,\n { node, argExpression },\n ] of mut_nodesToFix.entries()) {\n const argText = sourceCode.getText(argExpression);\n\n const originalText = sourceCode.getText(node);\n\n context.report({\n node,\n messageId: 'useSafeParseInt',\n data: {\n original: originalText,\n argName: argText,\n },\n fix: (fixer) => {\n const core = `Result.unwrapOkOr(Num.safeParseInt(${argText}), Number.NaN)`;\n\n const importFixes =\n index === 0 && missingImports.length > 0\n ? buildImportFixes(\n fixer,\n program,\n tsDataForgeImport,\n missingImports,\n )\n : [];\n\n return [...importFixes, fixer.replaceText(node, core)];\n },\n });\n }\n },\n };\n },\n defaultOptions: [],\n} as const;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prefer-num-safe-parse-int.mjs","sourceRoot":"","sources":["../../src/rules/prefer-num-safe-parse-int.mts"],"names":[],"mappings":"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"}