eslint-plugin-ts-data-forge 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -0,0 +1,482 @@
1
+ import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
2
+ import { Arr } from 'ts-data-forge';
3
+ import * as ts from 'typescript';
4
+ import { buildImportFixes, getNamedImports, getTsDataForgeImport, } from './import-utils.mjs';
5
+
6
+ const SLICING_METHODS = new Set(['slice', 'subarray']);
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
97
+ export const preferArrScan = {
98
+ meta: {
99
+ type: 'suggestion',
100
+ docs: {
101
+ description: 'Report an accumulated value rebuilt from scratch for every element — `xs.map((_, i) => f(...xs.slice(0, i + 1)))`, or a `reduce` that spreads its accumulator into a new array — and point at `Arr.scan` from ts-data-forge, which does the same in one pass',
102
+ },
103
+ fixable: 'code',
104
+ schema: [],
105
+ messages: {
106
+ preferArrScanPrefix: 'This rebuilds a prefix of `{{array}}` for every element, so the combining function runs over the whole prefix again each time. `Arr.scan` from ts-data-forge carries the value from one element to the next in a single pass, with the initial value at the head of the result.',
107
+ preferArrScanAccumulate: 'Rebuilding the accumulator array on every step copies it each time. `Arr.scan` from ts-data-forge accumulates in one pass and returns the initial value followed by every intermediate one.',
108
+ },
109
+ },
110
+ create: (context) => {
111
+ const sourceCode = context.sourceCode;
112
+ const program = sourceCode.ast;
113
+ const tsDataForgeImport = getTsDataForgeImport(program);
114
+ const services = sourceCode.parserServices;
115
+ const checker = services?.program?.getTypeChecker();
116
+
117
+
118
+
119
+
120
+
121
+ const isNullish = (
122
+
123
+ node) => {
124
+ const tsNode = services?.esTreeNodeToTSNodeMap?.get(node);
125
+ if (checker === undefined || tsNode === undefined)
126
+ return true;
127
+ const type = checker.getTypeAtLocation(tsNode);
128
+ return (type.isUnion() ? type.types : [type]).some((constituent) => (constituent.flags &
129
+ (ts.TypeFlags.Null |
130
+ ts.TypeFlags.Undefined |
131
+ ts.TypeFlags.Void |
132
+ ts.TypeFlags.Any |
133
+ ts.TypeFlags.Unknown)) !==
134
+ 0);
135
+ };
136
+ const mut_candidates = [];
137
+ const mut_slices = [];
138
+ const mut_accumulations = [];
139
+
140
+
141
+
142
+
143
+
144
+ const scanReplacementFor = (
145
+
146
+ call,
147
+
148
+ callback,
149
+
150
+ initial,
151
+
152
+ accumulation) => {
153
+ if (callback.async || callback.generator)
154
+ return undefined;
155
+
156
+
157
+
158
+ if (callback.params.length < 2 ||
159
+ callback.params.length > 3 ||
160
+ callback.params.some((param) => param.type !== AST_NODE_TYPES.Identifier ||
161
+ param.typeAnnotation !== undefined)) {
162
+ return undefined;
163
+ }
164
+ const { accumulatorParam, accumulatorRef, element } = accumulation;
165
+
166
+ if (initial.type !== AST_NODE_TYPES.ArrayExpression ||
167
+ !Arr.isFixedLengthArray(1, initial.elements)) {
168
+ return undefined;
169
+ }
170
+ const [seed] = initial.elements;
171
+ if (seed === null || seed.type === AST_NODE_TYPES.SpreadElement) {
172
+ return undefined;
173
+ }
174
+ const scope = sourceCode.getScope(callback);
175
+ const accumulator = scope.variables.find((variable) => variable.name === accumulatorParam.name);
176
+ if (accumulator === undefined)
177
+ return undefined;
178
+
179
+
180
+
181
+
182
+
183
+ const carriesNullish = isNullish(seed) || isNullish(element);
184
+ const mut_lastReads = [];
185
+ for (const reference of accumulator.references) {
186
+ const identifier = reference.identifier;
187
+
188
+ if (identifier === accumulatorRef)
189
+ continue;
190
+ if (identifier.type !== AST_NODE_TYPES.Identifier)
191
+ return undefined;
192
+ const lastRead = enclosingLastRead(identifier);
193
+ if (lastRead === undefined)
194
+ return undefined;
195
+ const guard = carriesNullish ? undefined : nullishGuardAround(lastRead);
196
+ mut_lastReads.push({
197
+ range: (guard ?? lastRead).range,
198
+ text: accumulatorParam.name,
199
+ });
200
+ }
201
+
202
+
203
+ if (overlaps(mut_lastReads))
204
+ return undefined;
205
+
206
+
207
+ if (mut_lastReads.length === 0)
208
+ return undefined;
209
+ const parameterText = callback.params
210
+ .map((param) => sourceCode.getText(param))
211
+ .join(', ');
212
+ const elementText = applySplices(sourceCode.getText(element), element.range[0], mut_lastReads);
213
+ const arrayText = sourceCode.getText(
214
+
215
+ call.callee.object);
216
+ return `Arr.scan(${arrayText}, (${parameterText}) => ${elementText}, ${sourceCode.getText(seed)})`;
217
+ };
218
+
219
+
220
+
221
+
222
+
223
+
224
+ const indexReadsOf = (
225
+
226
+ callback) => {
227
+ if (!Arr.isFixedLengthArray(2, callback.params))
228
+ return undefined;
229
+ const [elementParam, indexParam] = callback.params;
230
+ if (elementParam.type !== AST_NODE_TYPES.Identifier ||
231
+ indexParam.type !== AST_NODE_TYPES.Identifier) {
232
+ return undefined;
233
+ }
234
+ const scope = sourceCode.getScope(callback);
235
+ const elementVariable = scope.variables.find((variable) => variable.name === elementParam.name);
236
+ const indexVariable = scope.variables.find((variable) => variable.name === indexParam.name);
237
+ if (elementVariable === undefined || indexVariable === undefined) {
238
+ return undefined;
239
+ }
240
+ if (elementVariable.references.length > 0)
241
+ return undefined;
242
+ return indexVariable.references.map((reference) => reference.identifier);
243
+ };
244
+ return {
245
+ CallExpression: (node) => {
246
+ if (node.callee.type !== AST_NODE_TYPES.MemberExpression ||
247
+ node.callee.computed ||
248
+ node.callee.property.type !== AST_NODE_TYPES.Identifier) {
249
+ return;
250
+ }
251
+ const methodName = node.callee.property.name;
252
+ const arrayText = sourceCode.getText(node.callee.object);
253
+ if (SLICING_METHODS.has(methodName)) {
254
+ mut_slices.push({ call: node, arrayText });
255
+ }
256
+ const [callback, ...rest] = node.arguments;
257
+ if (callback === undefined ||
258
+ (callback.type !== AST_NODE_TYPES.ArrowFunctionExpression &&
259
+ callback.type !== AST_NODE_TYPES.FunctionExpression)) {
260
+ return;
261
+ }
262
+ switch (methodName) {
263
+ case 'map': {
264
+ if (rest.length > 0)
265
+ break;
266
+ const indexReads = indexReadsOf(callback);
267
+ if (indexReads === undefined)
268
+ break;
269
+ mut_candidates.push({
270
+ call: node,
271
+ arrayText,
272
+ body: callback.body,
273
+ indexReads,
274
+ });
275
+ break;
276
+ }
277
+ case 'reduce': {
278
+
279
+
280
+
281
+ if (rest.length !== 1 || !appendsToItsAccumulator(callback))
282
+ break;
283
+ const [initial] = rest;
284
+ const accumulation = accumulationOf(callback);
285
+ mut_accumulations.push({
286
+ call: node,
287
+ replacement: initial === undefined || accumulation === undefined
288
+ ? undefined
289
+ : scanReplacementFor(node, callback, initial, accumulation),
290
+ });
291
+ break;
292
+ }
293
+ default:
294
+ break;
295
+ }
296
+ },
297
+
298
+
299
+
300
+ 'Program:exit': () => {
301
+ const hasArrImport = getNamedImports(tsDataForgeImport).includes('Arr');
302
+
303
+
304
+ const mut_importNeededBy = hasArrImport
305
+ ? undefined
306
+ : mut_accumulations.find((accumulation) => accumulation.replacement !== undefined)?.call;
307
+ for (const accumulation of mut_accumulations) {
308
+ const { call, replacement } = accumulation;
309
+ context.report({
310
+ node: call,
311
+ messageId: 'preferArrScanAccumulate',
312
+ fix: replacement === undefined
313
+ ? undefined
314
+ : (fixer) => [
315
+ ...(call === mut_importNeededBy
316
+ ? buildImportFixes(fixer, program, tsDataForgeImport, [
317
+ 'Arr',
318
+ ])
319
+ : []),
320
+ fixer.replaceText(call, replacement),
321
+ ],
322
+ });
323
+ }
324
+ for (const candidate of mut_candidates) {
325
+ const rebuild = mut_slices.find((slice) => slice.arrayText === candidate.arrayText &&
326
+ encloses(candidate.body, slice.call) &&
327
+ candidate.indexReads.some((read) => slice.call.arguments.some((argument) => encloses(argument, read))));
328
+ if (rebuild === undefined)
329
+ continue;
330
+ context.report({
331
+ node: candidate.call,
332
+ messageId: 'preferArrScanPrefix',
333
+ data: { array: candidate.arrayText },
334
+ });
335
+ }
336
+ },
337
+ };
338
+ },
339
+ defaultOptions: [],
340
+ };
341
+
342
+
343
+
344
+
345
+
346
+ const enclosingLastRead = (
347
+
348
+ identifier) => {
349
+ const member = identifier.parent;
350
+ if (member.type !== AST_NODE_TYPES.MemberExpression ||
351
+ member.object !== identifier ||
352
+ member.computed ||
353
+ member.property.type !== AST_NODE_TYPES.Identifier ||
354
+ member.property.name !== 'at') {
355
+ return undefined;
356
+ }
357
+ const call = member.parent;
358
+ if (call.type !== AST_NODE_TYPES.CallExpression ||
359
+ call.callee !== member ||
360
+ !Arr.isFixedLengthArray(1, call.arguments)) {
361
+ return undefined;
362
+ }
363
+ const [argument] = call.arguments;
364
+
365
+ return argument.type === AST_NODE_TYPES.UnaryExpression &&
366
+ argument.operator === '-' &&
367
+ argument.argument.type === AST_NODE_TYPES.Literal &&
368
+ argument.argument.value === 1
369
+ ? call
370
+ : undefined;
371
+ };
372
+
373
+
374
+
375
+ const nullishGuardAround = (
376
+
377
+ read) => {
378
+ const parent = read.parent;
379
+ return parent.type === AST_NODE_TYPES.LogicalExpression &&
380
+ parent.operator === '??' &&
381
+ parent.left === read
382
+ ? parent
383
+ : undefined;
384
+ };
385
+
386
+ const overlaps = (splices) => splices
387
+ .toSorted((a, b) => a.range[0] - b.range[0])
388
+ .some((splice, index, sorted) => index > 0 && splice.range[0] < (sorted[index - 1]?.range[1] ?? 0));
389
+
390
+
391
+
392
+
393
+ const applySplices = (text, offset, splices) => splices
394
+ .toSorted((a, b) => b.range[0] - a.range[0])
395
+ .reduce((mut_text, splice) => `${mut_text.slice(0, splice.range[0] - offset)}${splice.text}${mut_text.slice(splice.range[1] - offset)}`, text);
396
+
397
+
398
+
399
+
400
+ const encloses = (
401
+
402
+ outer,
403
+
404
+ inner) => outer.range[0] <= inner.range[0] && inner.range[1] <= outer.range[1];
405
+
406
+
407
+
408
+
409
+
410
+
411
+ const appendsToItsAccumulator = (
412
+
413
+ callback) => {
414
+ const [accumulatorParam] = callback.params;
415
+ if (accumulatorParam?.type !== AST_NODE_TYPES.Identifier)
416
+ return false;
417
+ const { body } = callback;
418
+ const spelling = body.type === AST_NODE_TYPES.ArrayExpression
419
+ ? body.elements[0]
420
+ : body.type === AST_NODE_TYPES.CallExpression &&
421
+ body.callee.type === AST_NODE_TYPES.MemberExpression &&
422
+ !body.callee.computed &&
423
+ body.callee.property.type === AST_NODE_TYPES.Identifier &&
424
+ body.callee.property.name === 'toPushed'
425
+ ? body.arguments[0]
426
+ : undefined;
427
+ const target = spelling?.type === AST_NODE_TYPES.SpreadElement
428
+ ? spelling.argument
429
+ : spelling;
430
+ return (target?.type === AST_NODE_TYPES.Identifier &&
431
+ target.name === accumulatorParam.name);
432
+ };
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+ const accumulationOf = (
442
+
443
+ callback) => {
444
+ const [accumulatorParam] = callback.params;
445
+ if (accumulatorParam?.type !== AST_NODE_TYPES.Identifier)
446
+ return undefined;
447
+ const { body } = callback;
448
+
449
+
450
+ if (body.type === AST_NODE_TYPES.ArrayExpression) {
451
+ if (!Arr.isFixedLengthArray(2, body.elements))
452
+ return undefined;
453
+ const [spread, element] = body.elements;
454
+ return element === null ||
455
+ element.type === AST_NODE_TYPES.SpreadElement ||
456
+ spread?.type !== AST_NODE_TYPES.SpreadElement ||
457
+ spread.argument.type !== AST_NODE_TYPES.Identifier ||
458
+ spread.argument.name !== accumulatorParam.name
459
+ ? undefined
460
+ : { accumulatorParam, accumulatorRef: spread.argument, element };
461
+ }
462
+
463
+
464
+ if (body.type === AST_NODE_TYPES.CallExpression) {
465
+ const { callee } = body;
466
+ if (callee.type !== AST_NODE_TYPES.MemberExpression ||
467
+ callee.computed ||
468
+ callee.property.type !== AST_NODE_TYPES.Identifier ||
469
+ callee.property.name !== 'toPushed' ||
470
+ !Arr.isFixedLengthArray(2, body.arguments)) {
471
+ return undefined;
472
+ }
473
+ const [target, element] = body.arguments;
474
+ return element.type === AST_NODE_TYPES.SpreadElement ||
475
+ target.type !== AST_NODE_TYPES.Identifier ||
476
+ target.name !== accumulatorParam.name
477
+ ? undefined
478
+ : { accumulatorParam, accumulatorRef: target, element };
479
+ }
480
+ return undefined;
481
+ };
482
+ //# sourceMappingURL=prefer-arr-scan.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-arr-scan.mjs","sourceRoot":"","sources":["../../src/rules/prefer-arr-scan.mts"],"names":[],"mappings":"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"}