eslint-plugin-ts-data-forge 0.8.1 → 0.8.2
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/dist/rules/ast-utils.d.mts.map +1 -1
- package/dist/rules/ast-utils.mjs +24 -24
- package/dist/rules/ast-utils.mjs.map +1 -1
- package/dist/rules/branded-number-types.mjs.map +1 -1
- package/dist/rules/import-utils.d.mts.map +1 -1
- package/dist/rules/import-utils.mjs +4 -2
- package/dist/rules/import-utils.mjs.map +1 -1
- package/dist/rules/no-unnecessary-type-guard.d.mts.map +1 -1
- package/dist/rules/no-unnecessary-type-guard.mjs +37 -23
- package/dist/rules/no-unnecessary-type-guard.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-array.d.mts.map +1 -1
- package/dist/rules/prefer-arr-is-array.mjs +14 -7
- package/dist/rules/prefer-arr-is-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-bounded-length-array.d.mts.map +1 -1
- package/dist/rules/prefer-arr-is-bounded-length-array.mjs +8 -4
- package/dist/rules/prefer-arr-is-bounded-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-fixed-length-array.d.mts.map +1 -1
- package/dist/rules/prefer-arr-is-fixed-length-array.mjs +8 -4
- package/dist/rules/prefer-arr-is-fixed-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-max-length-array.d.mts.map +1 -1
- package/dist/rules/prefer-arr-is-max-length-array.mjs +10 -5
- package/dist/rules/prefer-arr-is-max-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-min-length-array.d.mts.map +1 -1
- package/dist/rules/prefer-arr-is-min-length-array.mjs +10 -5
- package/dist/rules/prefer-arr-is-min-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-non-empty.d.mts.map +1 -1
- package/dist/rules/prefer-arr-is-non-empty.mjs +4 -2
- package/dist/rules/prefer-arr-is-non-empty.mjs.map +1 -1
- package/dist/rules/prefer-arr-scan.d.mts.map +1 -1
- package/dist/rules/prefer-arr-scan.mjs +35 -18
- package/dist/rules/prefer-arr-scan.mjs.map +1 -1
- package/dist/rules/prefer-arr-sum.d.mts.map +1 -1
- package/dist/rules/prefer-arr-sum.mjs +6 -3
- package/dist/rules/prefer-arr-sum.mjs.map +1 -1
- package/dist/rules/prefer-arr-uniq.d.mts.map +1 -1
- package/dist/rules/prefer-arr-uniq.mjs +30 -24
- package/dist/rules/prefer-arr-uniq.mjs.map +1 -1
- package/dist/rules/prefer-as-int.d.mts.map +1 -1
- package/dist/rules/prefer-as-int.mjs +11 -14
- package/dist/rules/prefer-as-int.mjs.map +1 -1
- package/dist/rules/prefer-canonical-array-slicing.d.mts.map +1 -1
- package/dist/rules/prefer-canonical-array-slicing.mjs +32 -16
- package/dist/rules/prefer-canonical-array-slicing.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-cast.d.mts.map +1 -1
- package/dist/rules/prefer-canonical-length-cast.mjs +11 -7
- package/dist/rules/prefer-canonical-length-cast.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-guard.d.mts.map +1 -1
- package/dist/rules/prefer-canonical-length-guard.mjs +8 -4
- package/dist/rules/prefer-canonical-length-guard.mjs.map +1 -1
- package/dist/rules/prefer-comparison-over-nullish-guard.d.mts.map +1 -1
- package/dist/rules/prefer-comparison-over-nullish-guard.mjs +6 -3
- package/dist/rules/prefer-comparison-over-nullish-guard.mjs.map +1 -1
- package/dist/rules/prefer-is-non-null-object.d.mts.map +1 -1
- package/dist/rules/prefer-is-non-null-object.mjs +29 -31
- package/dist/rules/prefer-is-non-null-object.mjs.map +1 -1
- package/dist/rules/prefer-is-record-and-has-key.d.mts.map +1 -1
- package/dist/rules/prefer-is-record-and-has-key.mjs +10 -5
- package/dist/rules/prefer-is-record-and-has-key.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-float.d.mts.map +1 -1
- package/dist/rules/prefer-num-safe-parse-float.mjs +12 -6
- package/dist/rules/prefer-num-safe-parse-float.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-int.d.mts.map +1 -1
- package/dist/rules/prefer-num-safe-parse-int.mjs +12 -6
- package/dist/rules/prefer-num-safe-parse-int.mjs.map +1 -1
- package/dist/rules/prefer-obj-over-entries-round-trip.d.mts.map +1 -1
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs +22 -11
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs.map +1 -1
- package/dist/rules/prefer-range-for-loop.d.mts.map +1 -1
- package/dist/rules/prefer-range-for-loop.mjs +2 -1
- package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
- package/package.json +25 -23
- package/src/rules/ast-utils.mts +38 -26
- package/src/rules/branded-number-types.mts +1 -1
- package/src/rules/import-utils.mts +6 -2
- package/src/rules/no-unnecessary-type-guard.mts +56 -23
- package/src/rules/prefer-arr-is-array.mts +21 -7
- package/src/rules/prefer-arr-is-bounded-length-array.mts +12 -4
- package/src/rules/prefer-arr-is-fixed-length-array.mts +12 -4
- package/src/rules/prefer-arr-is-max-length-array.mts +15 -5
- package/src/rules/prefer-arr-is-min-length-array.mts +15 -5
- package/src/rules/prefer-arr-is-non-empty.mts +6 -2
- package/src/rules/prefer-arr-scan.mts +52 -18
- package/src/rules/prefer-arr-sum.mts +9 -3
- package/src/rules/prefer-arr-uniq.mts +42 -26
- package/src/rules/prefer-as-int.mts +17 -25
- package/src/rules/prefer-canonical-array-slicing.mts +48 -16
- package/src/rules/prefer-canonical-length-cast.mts +15 -7
- package/src/rules/prefer-canonical-length-guard.mts +12 -4
- package/src/rules/prefer-comparison-over-nullish-guard.mts +9 -3
- package/src/rules/prefer-is-non-null-object.mts +35 -31
- package/src/rules/prefer-is-record-and-has-key.mts +15 -5
- package/src/rules/prefer-num-safe-parse-float.mts +17 -6
- package/src/rules/prefer-num-safe-parse-int.mts +18 -6
- package/src/rules/prefer-obj-over-entries-round-trip.mts +33 -11
- package/src/rules/prefer-range-for-loop.mts +3 -1
|
@@ -91,32 +91,43 @@ export const preferNumSafeParseFloat: TSESLint.RuleModule<MessageIds, Options> =
|
|
|
91
91
|
callee.type === AST_NODE_TYPES.Identifier &&
|
|
92
92
|
callee.name === 'Number';
|
|
93
93
|
|
|
94
|
-
if (!isGlobalParseFloat && !isNumberParseFloat && !isNumberCall)
|
|
94
|
+
if (!isGlobalParseFloat && !isNumberParseFloat && !isNumberCall) {
|
|
95
95
|
return;
|
|
96
|
+
}
|
|
96
97
|
|
|
97
98
|
const args = node.arguments;
|
|
98
99
|
|
|
99
100
|
const firstArg = args[0];
|
|
100
101
|
|
|
101
|
-
if (firstArg === undefined)
|
|
102
|
+
if (firstArg === undefined) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
102
105
|
|
|
103
106
|
// Spread argument (`parseFloat(...rest)`) cannot be rewritten safely.
|
|
104
|
-
if (firstArg.type === AST_NODE_TYPES.SpreadElement)
|
|
107
|
+
if (firstArg.type === AST_NODE_TYPES.SpreadElement) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
105
110
|
|
|
106
111
|
// The argument must be purely `string` so the autofix is type-safe
|
|
107
112
|
// against `Num.safeParseFloat(s: string)`. Without type information,
|
|
108
113
|
// skip.
|
|
109
|
-
if (services?.program == null)
|
|
114
|
+
if (services?.program == null) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
110
117
|
|
|
111
118
|
const checker = services.program.getTypeChecker();
|
|
112
119
|
|
|
113
120
|
const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);
|
|
114
121
|
|
|
115
|
-
if (tsNode === undefined)
|
|
122
|
+
if (tsNode === undefined) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
116
125
|
|
|
117
126
|
const argType = checker.getTypeAtLocation(tsNode);
|
|
118
127
|
|
|
119
|
-
if (!isStringType(argType))
|
|
128
|
+
if (!isStringType(argType)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
120
131
|
|
|
121
132
|
mut_nodesToFix.push({ node, argExpression: firstArg });
|
|
122
133
|
},
|
|
@@ -84,16 +84,22 @@ export const preferNumSafeParseInt: TSESLint.RuleModule<MessageIds, Options> = {
|
|
|
84
84
|
callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
85
85
|
callee.property.name === 'parseInt';
|
|
86
86
|
|
|
87
|
-
if (!isGlobalParseInt && !isNumberParseInt)
|
|
87
|
+
if (!isGlobalParseInt && !isNumberParseInt) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
88
90
|
|
|
89
91
|
const args = node.arguments;
|
|
90
92
|
|
|
91
93
|
const firstArg = args[0];
|
|
92
94
|
|
|
93
|
-
if (firstArg === undefined)
|
|
95
|
+
if (firstArg === undefined) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
94
98
|
|
|
95
99
|
// Spread argument (`parseInt(...rest)`) cannot be rewritten safely.
|
|
96
|
-
if (firstArg.type === AST_NODE_TYPES.SpreadElement)
|
|
100
|
+
if (firstArg.type === AST_NODE_TYPES.SpreadElement) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
97
103
|
|
|
98
104
|
// Only base 10: accept a missing radix or an explicit literal `10`.
|
|
99
105
|
if (args.length >= 2) {
|
|
@@ -106,17 +112,23 @@ export const preferNumSafeParseInt: TSESLint.RuleModule<MessageIds, Options> = {
|
|
|
106
112
|
|
|
107
113
|
// The argument must be a `string` so the autofix is type-safe against
|
|
108
114
|
// `Num.safeParseInt(s: string)`. Without type information, skip.
|
|
109
|
-
if (services?.program == null)
|
|
115
|
+
if (services?.program == null) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
110
118
|
|
|
111
119
|
const checker = services.program.getTypeChecker();
|
|
112
120
|
|
|
113
121
|
const tsNode = services.esTreeNodeToTSNodeMap?.get(firstArg);
|
|
114
122
|
|
|
115
|
-
if (tsNode === undefined)
|
|
123
|
+
if (tsNode === undefined) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
116
126
|
|
|
117
127
|
const argType = checker.getTypeAtLocation(tsNode);
|
|
118
128
|
|
|
119
|
-
if (!isStringType(argType))
|
|
129
|
+
if (!isStringType(argType)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
120
132
|
|
|
121
133
|
mut_nodesToFix.push({ node, argExpression: firstArg });
|
|
122
134
|
},
|
|
@@ -159,7 +159,9 @@ export const preferObjOverEntriesRoundTrip: TSESLint.RuleModule<
|
|
|
159
159
|
CallExpression: (node) => {
|
|
160
160
|
const roundTrip = parseEntriesRoundTrip(node);
|
|
161
161
|
|
|
162
|
-
if (roundTrip === undefined)
|
|
162
|
+
if (roundTrip === undefined) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
163
165
|
|
|
164
166
|
mut_roundTrips.push({ node, roundTrip });
|
|
165
167
|
},
|
|
@@ -225,13 +227,19 @@ export const preferObjOverEntriesRoundTrip: TSESLint.RuleModule<
|
|
|
225
227
|
const parseEntriesRoundTrip = (
|
|
226
228
|
node: TSESTree.CallExpression,
|
|
227
229
|
): RoundTrip | undefined => {
|
|
228
|
-
if (!isObjectStaticCall(node, 'fromEntries'))
|
|
230
|
+
if (!isObjectStaticCall(node, 'fromEntries')) {
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
229
233
|
|
|
230
|
-
if (!Arr.isFixedLengthTuple(1, node.arguments))
|
|
234
|
+
if (!Arr.isFixedLengthTuple(1, node.arguments)) {
|
|
235
|
+
return undefined;
|
|
236
|
+
}
|
|
231
237
|
|
|
232
238
|
const [transform] = node.arguments;
|
|
233
239
|
|
|
234
|
-
if (transform.type !== AST_NODE_TYPES.CallExpression)
|
|
240
|
+
if (transform.type !== AST_NODE_TYPES.CallExpression) {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
235
243
|
|
|
236
244
|
const { callee } = transform;
|
|
237
245
|
|
|
@@ -265,11 +273,15 @@ const parseEntriesRoundTrip = (
|
|
|
265
273
|
|
|
266
274
|
const [record] = entriesCall.arguments;
|
|
267
275
|
|
|
268
|
-
if (record.type === AST_NODE_TYPES.SpreadElement)
|
|
276
|
+
if (record.type === AST_NODE_TYPES.SpreadElement) {
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
269
279
|
|
|
270
280
|
// A second argument (`thisArg`) or a callback that also takes the entry index
|
|
271
281
|
// has no counterpart in `Obj`.
|
|
272
|
-
if (!Arr.isFixedLengthTuple(1, transform.arguments))
|
|
282
|
+
if (!Arr.isFixedLengthTuple(1, transform.arguments)) {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
273
285
|
|
|
274
286
|
const [callback] = transform.arguments;
|
|
275
287
|
|
|
@@ -287,11 +299,15 @@ const parseEntriesRoundTrip = (
|
|
|
287
299
|
|
|
288
300
|
const [entryPattern] = callback.params;
|
|
289
301
|
|
|
290
|
-
if (entryPattern.type !== AST_NODE_TYPES.ArrayPattern)
|
|
302
|
+
if (entryPattern.type !== AST_NODE_TYPES.ArrayPattern) {
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
291
305
|
|
|
292
306
|
const entryParams = parseEntryPattern(entryPattern);
|
|
293
307
|
|
|
294
|
-
if (entryParams === undefined)
|
|
308
|
+
if (entryParams === undefined) {
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
295
311
|
|
|
296
312
|
const body = callback.body;
|
|
297
313
|
|
|
@@ -320,7 +336,9 @@ const parseEntriesRoundTrip = (
|
|
|
320
336
|
}
|
|
321
337
|
|
|
322
338
|
case 'flatMap': {
|
|
323
|
-
if (body.type !== AST_NODE_TYPES.ConditionalExpression)
|
|
339
|
+
if (body.type !== AST_NODE_TYPES.ConditionalExpression) {
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
324
342
|
|
|
325
343
|
const onTrue = parseSingletonEntry(body.consequent, entryParams.keyParam);
|
|
326
344
|
|
|
@@ -365,7 +383,9 @@ type EntryParams = Readonly<{
|
|
|
365
383
|
const parseEntryPattern = (
|
|
366
384
|
pattern: TSESTree.ArrayPattern,
|
|
367
385
|
): EntryParams | undefined => {
|
|
368
|
-
if (pattern.elements.length > 2)
|
|
386
|
+
if (pattern.elements.length > 2) {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
369
389
|
|
|
370
390
|
const [keyElement, valueElement] = pattern.elements;
|
|
371
391
|
|
|
@@ -399,7 +419,9 @@ const parseKeptEntry = (
|
|
|
399
419
|
node: TSESTree.Expression,
|
|
400
420
|
keyParam: TSESTree.Identifier | undefined,
|
|
401
421
|
): KeptEntry | undefined => {
|
|
402
|
-
if (keyParam === undefined)
|
|
422
|
+
if (keyParam === undefined) {
|
|
423
|
+
return undefined;
|
|
424
|
+
}
|
|
403
425
|
|
|
404
426
|
const tuple = stripTypeWrappers(node);
|
|
405
427
|
|
|
@@ -81,7 +81,9 @@ export const preferRangeForLoop: TSESLint.RuleModule<MessageIds, Options> = {
|
|
|
81
81
|
const endExpr = node.test.right;
|
|
82
82
|
|
|
83
83
|
// Check update: ++i, i++, i += 1, or i += step
|
|
84
|
-
if (node.update === null)
|
|
84
|
+
if (node.update === null) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
85
87
|
|
|
86
88
|
let mut_step: string | undefined;
|
|
87
89
|
|