eslint-plugin-ts-data-forge 0.10.4 → 0.10.6

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 (93) hide show
  1. package/dist/rules/ast-utils.d.mts +5 -5
  2. package/dist/rules/ast-utils.d.mts.map +1 -1
  3. package/dist/rules/ast-utils.mjs +3 -3
  4. package/dist/rules/ast-utils.mjs.map +1 -1
  5. package/dist/rules/import-binding.d.mts +38 -0
  6. package/dist/rules/import-binding.d.mts.map +1 -0
  7. package/dist/rules/import-binding.mjs +53 -0
  8. package/dist/rules/import-binding.mjs.map +1 -0
  9. package/dist/rules/mutable-result.mjs +37 -37
  10. package/dist/rules/mutable-result.mjs.map +1 -1
  11. package/dist/rules/no-unnecessary-type-guard.d.mts.map +1 -1
  12. package/dist/rules/no-unnecessary-type-guard.mjs +146 -143
  13. package/dist/rules/no-unnecessary-type-guard.mjs.map +1 -1
  14. package/dist/rules/prefer-arr-generate.d.mts.map +1 -1
  15. package/dist/rules/prefer-arr-generate.mjs +129 -131
  16. package/dist/rules/prefer-arr-generate.mjs.map +1 -1
  17. package/dist/rules/prefer-arr-is-bounded-length-array.d.mts.map +1 -1
  18. package/dist/rules/prefer-arr-is-bounded-length-array.mjs +14 -16
  19. package/dist/rules/prefer-arr-is-bounded-length-array.mjs.map +1 -1
  20. package/dist/rules/prefer-arr-is-fixed-length-array.d.mts.map +1 -1
  21. package/dist/rules/prefer-arr-is-fixed-length-array.mjs +15 -17
  22. package/dist/rules/prefer-arr-is-fixed-length-array.mjs.map +1 -1
  23. package/dist/rules/prefer-arr-is-max-length-array.d.mts.map +1 -1
  24. package/dist/rules/prefer-arr-is-max-length-array.mjs +14 -16
  25. package/dist/rules/prefer-arr-is-max-length-array.mjs.map +1 -1
  26. package/dist/rules/prefer-arr-is-min-length-array.d.mts.map +1 -1
  27. package/dist/rules/prefer-arr-is-min-length-array.mjs +14 -16
  28. package/dist/rules/prefer-arr-is-min-length-array.mjs.map +1 -1
  29. package/dist/rules/prefer-arr-is-non-empty.d.mts.map +1 -1
  30. package/dist/rules/prefer-arr-is-non-empty.mjs +14 -16
  31. package/dist/rules/prefer-arr-is-non-empty.mjs.map +1 -1
  32. package/dist/rules/prefer-arr-scan.d.mts.map +1 -1
  33. package/dist/rules/prefer-arr-scan.mjs +9 -18
  34. package/dist/rules/prefer-arr-scan.mjs.map +1 -1
  35. package/dist/rules/prefer-arr-sum.d.mts.map +1 -1
  36. package/dist/rules/prefer-arr-sum.mjs +16 -21
  37. package/dist/rules/prefer-arr-sum.mjs.map +1 -1
  38. package/dist/rules/prefer-arr-uniq.d.mts.map +1 -1
  39. package/dist/rules/prefer-arr-uniq.mjs +38 -43
  40. package/dist/rules/prefer-arr-uniq.mjs.map +1 -1
  41. package/dist/rules/prefer-as-int.d.mts.map +1 -1
  42. package/dist/rules/prefer-as-int.mjs +19 -26
  43. package/dist/rules/prefer-as-int.mjs.map +1 -1
  44. package/dist/rules/prefer-canonical-array-slicing.d.mts.map +1 -1
  45. package/dist/rules/prefer-canonical-array-slicing.mjs +49 -15
  46. package/dist/rules/prefer-canonical-array-slicing.mjs.map +1 -1
  47. package/dist/rules/prefer-canonical-length-cast.mjs +15 -15
  48. package/dist/rules/prefer-canonical-length-cast.mjs.map +1 -1
  49. package/dist/rules/prefer-obj-over-entries-round-trip.d.mts.map +1 -1
  50. package/dist/rules/prefer-obj-over-entries-round-trip.mjs +100 -99
  51. package/dist/rules/prefer-obj-over-entries-round-trip.mjs.map +1 -1
  52. package/dist/rules/prefer-pipe-map-nullable.d.mts.map +1 -1
  53. package/dist/rules/prefer-pipe-map-nullable.mjs +2 -4
  54. package/dist/rules/prefer-pipe-map-nullable.mjs.map +1 -1
  55. package/dist/rules/prefer-range-for-loop.d.mts.map +1 -1
  56. package/dist/rules/prefer-range-for-loop.mjs +18 -24
  57. package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
  58. package/package.json +5 -5
  59. package/src/rules/ast-utils.mts +11 -11
  60. package/src/rules/import-binding.mts +94 -0
  61. package/src/rules/mutable-result.mts +56 -56
  62. package/src/rules/no-unnecessary-type-guard.mts +199 -203
  63. package/src/rules/no-unnecessary-type-guard.test.mts +62 -2
  64. package/src/rules/prefer-arr-generate.mts +184 -194
  65. package/src/rules/prefer-arr-generate.test.mts +262 -134
  66. package/src/rules/prefer-arr-is-array.test.mts +87 -5
  67. package/src/rules/prefer-arr-is-bounded-length-array.mts +22 -33
  68. package/src/rules/prefer-arr-is-fixed-length-array.mts +24 -36
  69. package/src/rules/prefer-arr-is-fixed-length-array.test.mts +16 -7
  70. package/src/rules/prefer-arr-is-max-length-array.mts +21 -34
  71. package/src/rules/prefer-arr-is-max-length-array.test.mts +16 -7
  72. package/src/rules/prefer-arr-is-min-length-array.mts +21 -34
  73. package/src/rules/prefer-arr-is-min-length-array.test.mts +16 -7
  74. package/src/rules/prefer-arr-is-non-empty.mts +17 -34
  75. package/src/rules/prefer-arr-is-non-empty.test.mts +110 -0
  76. package/src/rules/prefer-arr-scan.mts +11 -36
  77. package/src/rules/prefer-arr-scan.test.mts +55 -0
  78. package/src/rules/prefer-arr-sum.mts +19 -33
  79. package/src/rules/prefer-arr-uniq.mts +49 -60
  80. package/src/rules/prefer-arr-uniq.test.mts +46 -20
  81. package/src/rules/prefer-as-int.mts +27 -52
  82. package/src/rules/prefer-as-int.test.mts +79 -29
  83. package/src/rules/prefer-canonical-array-slicing.mts +86 -24
  84. package/src/rules/prefer-canonical-array-slicing.test.mts +133 -34
  85. package/src/rules/prefer-canonical-length-cast.mts +18 -18
  86. package/src/rules/prefer-is-non-null-object.test.mts +62 -37
  87. package/src/rules/prefer-is-record-and-has-key.test.mts +32 -17
  88. package/src/rules/prefer-num-safe-parse-float.test.mts +45 -21
  89. package/src/rules/prefer-num-safe-parse-int.test.mts +29 -14
  90. package/src/rules/prefer-obj-over-entries-round-trip.mts +152 -170
  91. package/src/rules/prefer-obj-over-entries-round-trip.test.mts +48 -6
  92. package/src/rules/prefer-pipe-map-nullable.mts +6 -8
  93. package/src/rules/prefer-range-for-loop.mts +31 -55
@@ -4,15 +4,9 @@ import {
4
4
  type TSESLint,
5
5
  type TSESTree,
6
6
  } from '@typescript-eslint/utils';
7
- import {
8
- buildNamedImportFix,
9
- getArgumentText,
10
- getImportDeclarations,
11
- getNamedImports,
12
- skipTypeWrappers,
13
- } from 'eslint-rule-forge';
7
+ import { getArgumentText, skipTypeWrappers } from 'eslint-rule-forge';
14
8
  import { Arr } from 'ts-data-forge';
15
- import { TS_DATA_FORGE_MODULE } from './constants.mjs';
9
+ import { tsDataForgeValueAt } from './import-binding.mjs';
16
10
 
17
11
  type Options = readonly [];
18
12
 
@@ -37,13 +31,6 @@ export const preferRangeForLoop: TSESLint.RuleModule<MessageIds, Options> = {
37
31
  create: (context) => {
38
32
  const sourceCode = context.sourceCode;
39
33
 
40
- const program = sourceCode.ast;
41
-
42
- const tsDataForgeImports = getImportDeclarations(
43
- program,
44
- TS_DATA_FORGE_MODULE,
45
- );
46
-
47
34
  /**
48
35
  * Whether `node` is the same value on every iteration: a literal, or a
49
36
  * variable that is never reassigned anywhere (not only in the loop, since
@@ -214,15 +201,13 @@ export const preferRangeForLoop: TSESLint.RuleModule<MessageIds, Options> = {
214
201
  });
215
202
  },
216
203
  'Program:exit': () => {
217
- const namedImports = getNamedImports(tsDataForgeImports);
218
-
219
- const hasRangeImport = namedImports.includes('range');
220
-
221
- const importCarrier = mut_nodesToFix.find(({ fixable }) => fixable);
204
+ const rangeAt = tsDataForgeValueAt(sourceCode, 'range');
222
205
 
223
206
  for (const entry of mut_nodesToFix) {
224
207
  const { node, varName, begin, end, step } = entry;
225
208
 
209
+ const range = entry.fixable ? rangeAt(node) : undefined;
210
+
226
211
  context.report({
227
212
  node: node.init ?? node,
228
213
  messageId: 'useRangeForLoop',
@@ -231,33 +216,24 @@ export const preferRangeForLoop: TSESLint.RuleModule<MessageIds, Options> = {
231
216
  begin,
232
217
  end,
233
218
  },
234
- fix: entry.fixable
235
- ? (fixer) => {
236
- const bodyText = sourceCode.getText(node.body);
237
-
238
- const rangeArgs =
239
- step === undefined
240
- ? `${begin}, ${end}`
241
- : `${begin}, ${end}, ${step}`;
242
-
243
- const replacement = `for (const ${varName} of range(${rangeArgs})) ${bodyText}`;
244
-
245
- // The import fix lives on the first fixable report:
246
- // `insertTextBefore(program, …)` produces overlapping ranges
247
- // otherwise.
248
- const importFixes =
249
- entry === importCarrier && !hasRangeImport
250
- ? buildNamedImportFix(
251
- fixer,
252
- program,
253
- TS_DATA_FORGE_MODULE,
254
- ['range'],
255
- )
256
- : [];
257
-
258
- return [...importFixes, fixer.replaceText(node, replacement)];
259
- }
260
- : undefined,
219
+ fix:
220
+ range === undefined
221
+ ? undefined
222
+ : (fixer) => {
223
+ const bodyText = sourceCode.getText(node.body);
224
+
225
+ const rangeArgs =
226
+ step === undefined
227
+ ? `${begin}, ${end}`
228
+ : `${begin}, ${end}, ${step}`;
229
+
230
+ const replacement = `for (const ${varName} of ${range.localName}(${rangeArgs})) ${bodyText}`;
231
+
232
+ return [
233
+ ...range.edits(fixer),
234
+ fixer.replaceText(node, replacement),
235
+ ];
236
+ },
261
237
  });
262
238
  }
263
239
  },
@@ -286,6 +262,14 @@ const isNonIntegerNumberLiteral = (
286
262
  );
287
263
  };
288
264
 
265
+ const isWithin = (
266
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
267
+ node: TSESTree.Node,
268
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
269
+ container: TSESTree.Node,
270
+ ): boolean =>
271
+ container.range[0] <= node.range[0] && node.range[1] <= container.range[1];
272
+
289
273
  /**
290
274
  * Whether the loop variable declared by `declaration` is written anywhere but
291
275
  * its initializer and the loop's `update`.
@@ -307,11 +291,3 @@ const isAssignedOutsideUpdate = (
307
291
  reference.init !== true &&
308
292
  !isWithin(reference.identifier, update),
309
293
  );
310
-
311
- const isWithin = (
312
- // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
313
- node: TSESTree.Node,
314
- // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
315
- container: TSESTree.Node,
316
- ): boolean =>
317
- container.range[0] <= node.range[0] && node.range[1] <= container.range[1];