eslint-plugin-ts-data-forge 0.8.6 → 0.10.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.
- package/README.md +21 -19
- package/dist/plugin.d.mts +4 -0
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +2 -0
- package/dist/plugin.mjs.map +1 -1
- package/dist/rule-types.d.mts +31 -1
- package/dist/rule-types.d.mts.map +1 -1
- package/dist/rule-types.mjs.map +1 -1
- package/dist/rules/ast-utils.d.mts +21 -2
- package/dist/rules/ast-utils.d.mts.map +1 -1
- package/dist/rules/ast-utils.mjs +51 -4
- package/dist/rules/ast-utils.mjs.map +1 -1
- package/dist/rules/constants.d.mts +2 -0
- package/dist/rules/constants.d.mts.map +1 -1
- package/dist/rules/constants.mjs +9 -0
- package/dist/rules/constants.mjs.map +1 -1
- package/dist/rules/mutable-result.d.mts +10 -0
- package/dist/rules/mutable-result.d.mts.map +1 -0
- package/dist/rules/mutable-result.mjs +145 -0
- package/dist/rules/mutable-result.mjs.map +1 -0
- package/dist/rules/prefer-arr-generate.d.mts +57 -0
- package/dist/rules/prefer-arr-generate.d.mts.map +1 -0
- package/dist/rules/prefer-arr-generate.mjs +588 -0
- package/dist/rules/prefer-arr-generate.mjs.map +1 -0
- package/dist/rules/prefer-arr-uniq.d.mts.map +1 -1
- package/dist/rules/prefer-arr-uniq.mjs +2 -149
- package/dist/rules/prefer-arr-uniq.mjs.map +1 -1
- package/dist/rules/prefer-canonical-array-slicing.d.mts.map +1 -1
- package/dist/rules/prefer-canonical-array-slicing.mjs +47 -28
- package/dist/rules/prefer-canonical-array-slicing.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 +110 -40
- 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 +102 -45
- package/dist/rules/prefer-is-record-and-has-key.mjs.map +1 -1
- package/dist/rules/prefer-pipe-map-nullable.d.mts +24 -0
- package/dist/rules/prefer-pipe-map-nullable.d.mts.map +1 -0
- package/dist/rules/prefer-pipe-map-nullable.mjs +266 -0
- package/dist/rules/prefer-pipe-map-nullable.mjs.map +1 -0
- package/dist/rules/prefer-range-for-loop.d.mts.map +1 -1
- package/dist/rules/prefer-range-for-loop.mjs +97 -16
- package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
- package/dist/rules/rules.d.mts +2 -0
- package/dist/rules/rules.d.mts.map +1 -1
- package/dist/rules/rules.mjs +4 -0
- package/dist/rules/rules.mjs.map +1 -1
- package/package.json +11 -11
- package/src/plugin.mts +2 -0
- package/src/rule-types.mts +33 -1
- package/src/rules/ast-utils.mts +72 -5
- package/src/rules/constants.mts +12 -0
- package/src/rules/mutable-result.mts +204 -0
- package/src/rules/prefer-arr-generate.mts +918 -0
- package/src/rules/prefer-arr-generate.test.mts +967 -0
- package/src/rules/prefer-arr-is-bounded-length-array.test.mts +19 -0
- package/src/rules/prefer-arr-is-max-length-array.test.mts +8 -0
- package/src/rules/prefer-arr-is-min-length-array.test.mts +8 -0
- package/src/rules/prefer-arr-uniq.mts +2 -207
- package/src/rules/prefer-canonical-array-slicing.mts +57 -40
- package/src/rules/prefer-canonical-array-slicing.test.mts +55 -0
- package/src/rules/prefer-is-non-null-object.mts +160 -57
- package/src/rules/prefer-is-non-null-object.test.mts +138 -0
- package/src/rules/prefer-is-record-and-has-key.mts +148 -67
- package/src/rules/prefer-is-record-and-has-key.test.mts +118 -23
- package/src/rules/prefer-pipe-map-nullable.mts +391 -0
- package/src/rules/prefer-pipe-map-nullable.test.mts +470 -0
- package/src/rules/prefer-range-for-loop.mts +142 -21
- package/src/rules/prefer-range-for-loop.test.mts +127 -5
- package/src/rules/rules.mts +4 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
2
|
+
import { buildCalleeResolver, getArgumentText, getImportDeclarations, hasForeignBinding, isTypeWrapper, skipTypeWrappers, } from 'eslint-rule-forge';
|
|
3
|
+
import { Arr } from 'ts-data-forge';
|
|
4
|
+
import * as ts from 'typescript';
|
|
5
|
+
import { TS_DATA_FORGE_MODULE } from './constants.mjs';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
export const preferPipeMapNullable = {
|
|
25
|
+
meta: {
|
|
26
|
+
type: 'suggestion',
|
|
27
|
+
docs: {
|
|
28
|
+
description: 'Replace `pipe(x).map(mapNullable(fn))` with `pipe(x).mapNullable(fn)`.',
|
|
29
|
+
},
|
|
30
|
+
fixable: 'code',
|
|
31
|
+
hasSuggestions: true,
|
|
32
|
+
schema: [],
|
|
33
|
+
messages: {
|
|
34
|
+
useMapNullable: 'Replace `.map({{mapNullableName}}(…))` with `.mapNullable(…)`.',
|
|
35
|
+
suggestMapNullable: 'Replace `.map({{mapNullableName}}(…))` with `.mapNullable(…)` (the inferred type may be widened, or a comment or type assertion dropped).',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
create: (context) => {
|
|
39
|
+
const sourceCode = context.sourceCode;
|
|
40
|
+
const program = sourceCode.ast;
|
|
41
|
+
const resolveTsDataForge = buildCalleeResolver(getImportDeclarations(program, TS_DATA_FORGE_MODULE));
|
|
42
|
+
const pipeResolvers = PIPE_MODULES.map((moduleName) => [
|
|
43
|
+
moduleName,
|
|
44
|
+
buildCalleeResolver(getImportDeclarations(program, moduleName)),
|
|
45
|
+
]);
|
|
46
|
+
const services = sourceCode.parserServices;
|
|
47
|
+
const checker = services?.program?.getTypeChecker();
|
|
48
|
+
const esTreeNodeToTSNodeMap = services?.esTreeNodeToTSNodeMap;
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
const calls = (resolve,
|
|
54
|
+
|
|
55
|
+
callee, name, moduleName) => {
|
|
56
|
+
if (resolve(callee)?.canonicalName !== name) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
const unwrapped = skipTypeWrappers(callee);
|
|
60
|
+
|
|
61
|
+
const binding = unwrapped.type === AST_NODE_TYPES.MemberExpression
|
|
62
|
+
? skipTypeWrappers(unwrapped.object)
|
|
63
|
+
: unwrapped;
|
|
64
|
+
return (binding.type === AST_NODE_TYPES.Identifier &&
|
|
65
|
+
!hasForeignBinding(sourceCode, binding, binding.name, moduleName));
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
const isPipe = (
|
|
72
|
+
|
|
73
|
+
wrapped) => {
|
|
74
|
+
const node = skipTypeWrappers(wrapped);
|
|
75
|
+
if (node.type !== AST_NODE_TYPES.CallExpression || node.optional) {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
if (pipeResolvers.some(([moduleName, resolve]) => calls(resolve, node.callee, 'pipe', moduleName))) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const { callee } = node;
|
|
82
|
+
return (callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
83
|
+
!callee.computed &&
|
|
84
|
+
!callee.optional &&
|
|
85
|
+
callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
86
|
+
PIPE_CHAIN_METHODS.has(callee.property.name) &&
|
|
87
|
+
isPipe(callee.object));
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
const keepsResultType = (
|
|
94
|
+
|
|
95
|
+
mapNullableCall,
|
|
96
|
+
|
|
97
|
+
mapFn) => {
|
|
98
|
+
|
|
99
|
+
const fn = skipSatisfies(mapFn);
|
|
100
|
+
if ((fn.type !== AST_NODE_TYPES.ArrowFunctionExpression &&
|
|
101
|
+
fn.type !== AST_NODE_TYPES.FunctionExpression) ||
|
|
102
|
+
fn.returnType !== undefined) {
|
|
103
|
+
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
if (checker === undefined || esTreeNodeToTSNodeMap === undefined) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
const signatures = checker
|
|
114
|
+
.getTypeAtLocation(esTreeNodeToTSNodeMap.get(mapNullableCall))
|
|
115
|
+
.getCallSignatures();
|
|
116
|
+
return (Arr.isFixedLengthTuple(1, signatures) &&
|
|
117
|
+
!hasConstInferredPart(checker, checker.getReturnTypeOfSignature(signatures[0]), 0));
|
|
118
|
+
};
|
|
119
|
+
return {
|
|
120
|
+
CallExpression: (node) => {
|
|
121
|
+
|
|
122
|
+
if (node.optional ||
|
|
123
|
+
node.typeArguments !== undefined ||
|
|
124
|
+
node.callee.type !== AST_NODE_TYPES.MemberExpression ||
|
|
125
|
+
node.callee.computed ||
|
|
126
|
+
node.callee.optional ||
|
|
127
|
+
node.callee.property.type !== AST_NODE_TYPES.Identifier ||
|
|
128
|
+
node.callee.property.name !== 'map' ||
|
|
129
|
+
!Arr.isFixedLengthTuple(1, node.arguments)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const mapNullableCall = node.arguments[0];
|
|
133
|
+
if (mapNullableCall.type !== AST_NODE_TYPES.CallExpression ||
|
|
134
|
+
mapNullableCall.optional ||
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
mapNullableCall.typeArguments !== undefined ||
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
!Arr.isFixedLengthTuple(1, mapNullableCall.arguments)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const mapFn = mapNullableCall.arguments[0];
|
|
144
|
+
if (mapFn.type === AST_NODE_TYPES.SpreadElement ||
|
|
145
|
+
!calls(resolveTsDataForge, mapNullableCall.callee, 'mapNullable', TS_DATA_FORGE_MODULE) ||
|
|
146
|
+
!isPipe(node.callee.object)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const droppedRanges = [
|
|
151
|
+
[mapNullableCall.range[0], mapFn.range[0]],
|
|
152
|
+
[mapFn.range[1], mapNullableCall.range[1]],
|
|
153
|
+
];
|
|
154
|
+
const dropsComment = sourceCode
|
|
155
|
+
.getCommentsInside(mapNullableCall)
|
|
156
|
+
.some((comment) => droppedRanges.some(([start, end]) => start <= comment.range[0] && comment.range[1] <= end));
|
|
157
|
+
const autofixable = !dropsComment &&
|
|
158
|
+
!isTypeWrapper(mapNullableCall.callee) &&
|
|
159
|
+
keepsResultType(mapNullableCall, mapFn);
|
|
160
|
+
const mapProperty = node.callee.property;
|
|
161
|
+
const fix = (fixer) => [
|
|
162
|
+
fixer.replaceText(mapProperty, 'mapNullable'),
|
|
163
|
+
fixer.replaceText(mapNullableCall, getArgumentText(sourceCode, mapFn)),
|
|
164
|
+
];
|
|
165
|
+
const data = {
|
|
166
|
+
mapNullableName: sourceCode.getText(mapNullableCall.callee),
|
|
167
|
+
};
|
|
168
|
+
if (autofixable) {
|
|
169
|
+
context.report({
|
|
170
|
+
node,
|
|
171
|
+
messageId: 'useMapNullable',
|
|
172
|
+
data,
|
|
173
|
+
fix,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
context.report({
|
|
178
|
+
node,
|
|
179
|
+
messageId: 'useMapNullable',
|
|
180
|
+
data,
|
|
181
|
+
suggest: [{ messageId: 'suggestMapNullable', data, fix }],
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
},
|
|
187
|
+
defaultOptions: [],
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
const PIPE_MODULES = [TS_DATA_FORGE_MODULE, 'ts-std-forge'];
|
|
195
|
+
|
|
196
|
+
const PIPE_CHAIN_METHODS = new Set([
|
|
197
|
+
'map',
|
|
198
|
+
'mapNullable',
|
|
199
|
+
'mapOptional',
|
|
200
|
+
]);
|
|
201
|
+
|
|
202
|
+
const literalTypeFlags = ts.TypeFlags.StringLiteral |
|
|
203
|
+
ts.TypeFlags.NumberLiteral |
|
|
204
|
+
ts.TypeFlags.BigIntLiteral |
|
|
205
|
+
ts.TypeFlags.BooleanLiteral |
|
|
206
|
+
ts.TypeFlags.EnumLiteral |
|
|
207
|
+
ts.TypeFlags.TemplateLiteral |
|
|
208
|
+
ts.TypeFlags.UniqueESSymbol;
|
|
209
|
+
|
|
210
|
+
const MAX_DEPTH = 4;
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
const hasConstInferredPart = (
|
|
220
|
+
|
|
221
|
+
checker,
|
|
222
|
+
|
|
223
|
+
type, depth) => {
|
|
224
|
+
if (depth > MAX_DEPTH) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if ((type.flags & ts.TypeFlags.Boolean) !== 0) {
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
if (type.isUnion() || type.isIntersection()) {
|
|
232
|
+
return type.types.some((t) => hasConstInferredPart(checker, t, depth + 1));
|
|
233
|
+
}
|
|
234
|
+
if ((type.flags & literalTypeFlags) !== 0 || checker.isTupleType(type)) {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
if ((type.flags & ts.TypeFlags.Object) === 0) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const { objectFlags } = type;
|
|
242
|
+
|
|
243
|
+
if ((objectFlags & ts.ObjectFlags.Reference) !== 0 &&
|
|
244
|
+
checker
|
|
245
|
+
|
|
246
|
+
.getTypeArguments(type)
|
|
247
|
+
.some((t) => hasConstInferredPart(checker, t, depth + 1))) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
return (
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
(objectFlags &
|
|
254
|
+
(ts.ObjectFlags.ObjectLiteral | ts.ObjectFlags.Anonymous)) !==
|
|
255
|
+
0 &&
|
|
256
|
+
type
|
|
257
|
+
.getProperties()
|
|
258
|
+
.some((property) => hasConstInferredPart(checker, checker.getTypeOfSymbol(property), depth + 1)));
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const skipSatisfies = (
|
|
262
|
+
|
|
263
|
+
node) => node.type === AST_NODE_TYPES.TSSatisfiesExpression
|
|
264
|
+
? skipSatisfies(node.expression)
|
|
265
|
+
: node;
|
|
266
|
+
//# sourceMappingURL=prefer-pipe-map-nullable.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-pipe-map-nullable.mjs","sourceRoot":"","sources":["../../src/rules/prefer-pipe-map-nullable.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-range-for-loop.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-range-for-loop.mts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"prefer-range-for-loop.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-range-for-loop.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAWlC,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,iBAAiB,CAAC;AAEpC,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAqP9D,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
1
|
+
import { AST_NODE_TYPES, ASTUtils, } from '@typescript-eslint/utils';
|
|
2
2
|
import { buildNamedImportFix, getArgumentText, getImportDeclarations, getNamedImports, skipTypeWrappers, } from 'eslint-rule-forge';
|
|
3
3
|
import { Arr } from 'ts-data-forge';
|
|
4
4
|
import { TS_DATA_FORGE_MODULE } from './constants.mjs';
|
|
@@ -18,6 +18,27 @@ export const preferRangeForLoop = {
|
|
|
18
18
|
const sourceCode = context.sourceCode;
|
|
19
19
|
const program = sourceCode.ast;
|
|
20
20
|
const tsDataForgeImports = getImportDeclarations(program, TS_DATA_FORGE_MODULE);
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
const isStableBound = (
|
|
28
|
+
|
|
29
|
+
wrapped) => {
|
|
30
|
+
const node = skipTypeWrappers(wrapped);
|
|
31
|
+
if (node.type === AST_NODE_TYPES.Literal) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (node.type !== AST_NODE_TYPES.Identifier) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
const variable = ASTUtils.findVariable(sourceCode.getScope(node), node.name);
|
|
38
|
+
return (variable !== null &&
|
|
39
|
+
variable.defs.length > 0 &&
|
|
40
|
+
variable.references.every((reference) => !reference.isWrite() || reference.init === true));
|
|
41
|
+
};
|
|
21
42
|
const mut_nodesToFix = [];
|
|
22
43
|
return {
|
|
23
44
|
ForStatement: (node) => {
|
|
@@ -35,6 +56,10 @@ export const preferRangeForLoop = {
|
|
|
35
56
|
const varName = declaration.id.name;
|
|
36
57
|
const beginExpr = declaration.init;
|
|
37
58
|
|
|
59
|
+
if (isNonIntegerNumberLiteral(beginExpr)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
38
63
|
|
|
39
64
|
|
|
40
65
|
if (node.test?.type !== AST_NODE_TYPES.BinaryExpression ||
|
|
@@ -72,21 +97,35 @@ export const preferRangeForLoop = {
|
|
|
72
97
|
if (stepValue.type === AST_NODE_TYPES.Literal) {
|
|
73
98
|
const stepNum = stepValue.value;
|
|
74
99
|
|
|
75
|
-
if (typeof stepNum === 'number' &&
|
|
100
|
+
if (typeof stepNum === 'number' &&
|
|
101
|
+
Number.isSafeInteger(stepNum) &&
|
|
102
|
+
stepNum > 0) {
|
|
76
103
|
mut_step = stepNum === 1 ? undefined : stepNum.toString();
|
|
77
104
|
}
|
|
78
105
|
else {
|
|
79
106
|
return;
|
|
80
107
|
}
|
|
81
108
|
}
|
|
109
|
+
else if (isNegatedLiteral(stepValue)) {
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
82
115
|
else {
|
|
83
116
|
|
|
117
|
+
|
|
118
|
+
|
|
84
119
|
mut_step = getArgumentText(sourceCode, node.update.right);
|
|
85
120
|
}
|
|
86
121
|
}
|
|
87
122
|
else {
|
|
88
123
|
return;
|
|
89
124
|
}
|
|
125
|
+
|
|
126
|
+
if (isAssignedOutsideUpdate(sourceCode, declaration, node.update)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
90
129
|
const beginText = getArgumentText(sourceCode, beginExpr);
|
|
91
130
|
const endText = getArgumentText(sourceCode, endExpr);
|
|
92
131
|
mut_nodesToFix.push({
|
|
@@ -95,12 +134,17 @@ export const preferRangeForLoop = {
|
|
|
95
134
|
begin: beginText,
|
|
96
135
|
end: endText,
|
|
97
136
|
step: mut_step,
|
|
137
|
+
fixable: isStableBound(endExpr) &&
|
|
138
|
+
(node.update.type !== AST_NODE_TYPES.AssignmentExpression ||
|
|
139
|
+
isStableBound(node.update.right)),
|
|
98
140
|
});
|
|
99
141
|
},
|
|
100
142
|
'Program:exit': () => {
|
|
101
143
|
const namedImports = getNamedImports(tsDataForgeImports);
|
|
102
144
|
const hasRangeImport = namedImports.includes('range');
|
|
103
|
-
|
|
145
|
+
const importCarrier = mut_nodesToFix.find(({ fixable }) => fixable);
|
|
146
|
+
for (const entry of mut_nodesToFix) {
|
|
147
|
+
const { node, varName, begin, end, step } = entry;
|
|
104
148
|
context.report({
|
|
105
149
|
node: node.init ?? node,
|
|
106
150
|
messageId: 'useRangeForLoop',
|
|
@@ -109,19 +153,22 @@ export const preferRangeForLoop = {
|
|
|
109
153
|
begin,
|
|
110
154
|
end,
|
|
111
155
|
},
|
|
112
|
-
fix:
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
156
|
+
fix: entry.fixable
|
|
157
|
+
? (fixer) => {
|
|
158
|
+
const bodyText = sourceCode.getText(node.body);
|
|
159
|
+
const rangeArgs = step === undefined
|
|
160
|
+
? `${begin}, ${end}`
|
|
161
|
+
: `${begin}, ${end}, ${step}`;
|
|
162
|
+
const replacement = `for (const ${varName} of range(${rangeArgs})) ${bodyText}`;
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
const importFixes = entry === importCarrier && !hasRangeImport
|
|
167
|
+
? buildNamedImportFix(fixer, program, TS_DATA_FORGE_MODULE, ['range'])
|
|
168
|
+
: [];
|
|
169
|
+
return [...importFixes, fixer.replaceText(node, replacement)];
|
|
170
|
+
}
|
|
171
|
+
: undefined,
|
|
125
172
|
});
|
|
126
173
|
}
|
|
127
174
|
},
|
|
@@ -129,4 +176,38 @@ export const preferRangeForLoop = {
|
|
|
129
176
|
},
|
|
130
177
|
defaultOptions: [],
|
|
131
178
|
};
|
|
179
|
+
const isNegatedLiteral = (
|
|
180
|
+
|
|
181
|
+
node) => node.type === AST_NODE_TYPES.UnaryExpression &&
|
|
182
|
+
node.operator === '-' &&
|
|
183
|
+
skipTypeWrappers(node.argument).type === AST_NODE_TYPES.Literal;
|
|
184
|
+
const isNonIntegerNumberLiteral = (
|
|
185
|
+
|
|
186
|
+
wrapped) => {
|
|
187
|
+
const node = skipTypeWrappers(wrapped);
|
|
188
|
+
return (node.type === AST_NODE_TYPES.Literal &&
|
|
189
|
+
typeof node.value === 'number' &&
|
|
190
|
+
!Number.isSafeInteger(node.value));
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
const isAssignedOutsideUpdate = (
|
|
197
|
+
|
|
198
|
+
sourceCode,
|
|
199
|
+
|
|
200
|
+
declaration,
|
|
201
|
+
|
|
202
|
+
update) => sourceCode
|
|
203
|
+
.getDeclaredVariables(declaration)
|
|
204
|
+
.flatMap((variable) => variable.references)
|
|
205
|
+
.some((reference) => reference.isWrite() &&
|
|
206
|
+
reference.init !== true &&
|
|
207
|
+
!isWithin(reference.identifier, update));
|
|
208
|
+
const isWithin = (
|
|
209
|
+
|
|
210
|
+
node,
|
|
211
|
+
|
|
212
|
+
container) => container.range[0] <= node.range[0] && node.range[1] <= container.range[1];
|
|
132
213
|
//# sourceMappingURL=prefer-range-for-loop.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-range-for-loop.mjs","sourceRoot":"","sources":["../../src/rules/prefer-range-for-loop.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,
|
|
1
|
+
{"version":3,"file":"prefer-range-for-loop.mjs","sourceRoot":"","sources":["../../src/rules/prefer-range-for-loop.mts"],"names":[],"mappings":"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"}
|
package/dist/rules/rules.d.mts
CHANGED
|
@@ -2,6 +2,7 @@ export declare const tsDataForgeRules: {
|
|
|
2
2
|
readonly 'prefer-canonical-array-slicing': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferCanonicalArraySlicing", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
3
3
|
readonly 'prefer-canonical-length-guard': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useCanonicalGuard" | "useIsBoundedLengthArray" | "useIsFixedLengthArray" | "useIsMaxLengthArray" | "useIsMinLengthArray" | "useIsNonEmpty", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
4
4
|
readonly 'prefer-canonical-length-cast': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useCanonicalCast", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
5
|
+
readonly 'prefer-arr-generate': import("@typescript-eslint/utils/ts-eslint").RuleModule<"suggestArrGenerate" | "useArrGenerate", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
5
6
|
readonly 'prefer-arr-is-array': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrIsArray", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
6
7
|
readonly 'prefer-arr-scan': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferArrScanAccumulate" | "preferArrScanPrefix", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
7
8
|
readonly 'prefer-arr-sum': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrSum" | "useArrSumBy", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
@@ -18,5 +19,6 @@ export declare const tsDataForgeRules: {
|
|
|
18
19
|
}> | undefined)?], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
19
20
|
readonly 'prefer-comparison-over-nullish-guard': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferComparison", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
20
21
|
readonly 'prefer-obj-over-entries-round-trip': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useObjFilter" | "useObjFilterMap" | "useObjMap", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
22
|
+
readonly 'prefer-pipe-map-nullable': import("@typescript-eslint/utils/ts-eslint").RuleModule<"suggestMapNullable" | "useMapNullable", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
21
23
|
};
|
|
22
24
|
//# sourceMappingURL=rules.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rules.d.mts","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;CAoBa,CAAC"}
|
package/dist/rules/rules.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { noSideEffectImport } from './no-side-effect-import.mjs';
|
|
2
2
|
import { noUnnecessaryTypeGuard } from './no-unnecessary-type-guard.mjs';
|
|
3
|
+
import { preferArrGenerate } from './prefer-arr-generate.mjs';
|
|
3
4
|
import { preferArrIsArray } from './prefer-arr-is-array.mjs';
|
|
4
5
|
import { preferArrScan } from './prefer-arr-scan.mjs';
|
|
5
6
|
import { preferArrSum } from './prefer-arr-sum.mjs';
|
|
@@ -14,11 +15,13 @@ import { preferIsRecordAndHasKey } from './prefer-is-record-and-has-key.mjs';
|
|
|
14
15
|
import { preferNumSafeParseFloat } from './prefer-num-safe-parse-float.mjs';
|
|
15
16
|
import { preferNumSafeParseInt } from './prefer-num-safe-parse-int.mjs';
|
|
16
17
|
import { preferObjOverEntriesRoundTrip } from './prefer-obj-over-entries-round-trip.mjs';
|
|
18
|
+
import { preferPipeMapNullable } from './prefer-pipe-map-nullable.mjs';
|
|
17
19
|
import { preferRangeForLoop } from './prefer-range-for-loop.mjs';
|
|
18
20
|
export const tsDataForgeRules = {
|
|
19
21
|
'prefer-canonical-array-slicing': preferCanonicalArraySlicing,
|
|
20
22
|
'prefer-canonical-length-guard': preferCanonicalLengthGuard,
|
|
21
23
|
'prefer-canonical-length-cast': preferCanonicalLengthCast,
|
|
24
|
+
'prefer-arr-generate': preferArrGenerate,
|
|
22
25
|
'prefer-arr-is-array': preferArrIsArray,
|
|
23
26
|
'prefer-arr-scan': preferArrScan,
|
|
24
27
|
'prefer-arr-sum': preferArrSum,
|
|
@@ -33,5 +36,6 @@ export const tsDataForgeRules = {
|
|
|
33
36
|
'no-unnecessary-type-guard': noUnnecessaryTypeGuard,
|
|
34
37
|
'prefer-comparison-over-nullish-guard': preferComparisonOverNullishGuard,
|
|
35
38
|
'prefer-obj-over-entries-round-trip': preferObjOverEntriesRoundTrip,
|
|
39
|
+
'prefer-pipe-map-nullable': preferPipeMapNullable,
|
|
36
40
|
};
|
|
37
41
|
//# sourceMappingURL=rules.mjs.map
|
package/dist/rules/rules.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gCAAgC,EAAE,2BAA2B;IAC7D,+BAA+B,EAAE,0BAA0B;IAC3D,8BAA8B,EAAE,yBAAyB;IACzD,qBAAqB,EAAE,gBAAgB;IACvC,iBAAiB,EAAE,aAAa;IAChC,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,aAAa;IAChC,eAAe,EAAE,WAAW;IAC5B,2BAA2B,EAAE,qBAAqB;IAClD,uBAAuB,EAAE,kBAAkB;IAC3C,8BAA8B,EAAE,uBAAuB;IACvD,2BAA2B,EAAE,qBAAqB;IAClD,6BAA6B,EAAE,uBAAuB;IACtD,uBAAuB,EAAE,kBAAkB;IAC3C,2BAA2B,EAAE,sBAAsB;IACnD,sCAAsC,EAAE,gCAAgC;IACxE,oCAAoC,EAAE,6BAA6B;
|
|
1
|
+
{"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../src/rules/rules.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,gCAAgC,EAAE,2BAA2B;IAC7D,+BAA+B,EAAE,0BAA0B;IAC3D,8BAA8B,EAAE,yBAAyB;IACzD,qBAAqB,EAAE,iBAAiB;IACxC,qBAAqB,EAAE,gBAAgB;IACvC,iBAAiB,EAAE,aAAa;IAChC,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,aAAa;IAChC,eAAe,EAAE,WAAW;IAC5B,2BAA2B,EAAE,qBAAqB;IAClD,uBAAuB,EAAE,kBAAkB;IAC3C,8BAA8B,EAAE,uBAAuB;IACvD,2BAA2B,EAAE,qBAAqB;IAClD,6BAA6B,EAAE,uBAAuB;IACtD,uBAAuB,EAAE,kBAAkB;IAC3C,2BAA2B,EAAE,sBAAsB;IACnD,sCAAsC,EAAE,gCAAgC;IACxE,oCAAoC,EAAE,6BAA6B;IACnE,0BAA0B,EAAE,qBAAqB;CACT,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-ts-data-forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "ESLint rules that steer code toward ts-data-forge idioms.",
|
|
6
6
|
"keywords": [
|
|
@@ -35,17 +35,17 @@
|
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@typescript-eslint/utils": "^8.71.1",
|
|
38
|
-
"eslint-rule-forge": "^0.
|
|
39
|
-
"ts-data-forge": "14.
|
|
38
|
+
"eslint-rule-forge": "^0.2.0",
|
|
39
|
+
"ts-data-forge": "14.9.0",
|
|
40
40
|
"ts-type-forge": "~9.2.2"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@typescript-eslint/parser": "8.71.1",
|
|
44
44
|
"@typescript-eslint/rule-tester": "8.71.1",
|
|
45
45
|
"dedent": "1.7.2",
|
|
46
|
-
"eslint-config-typed": "5.
|
|
47
|
-
"eslint-plugin-ts-fortress": "1.3.
|
|
48
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
46
|
+
"eslint-config-typed": "5.19.0",
|
|
47
|
+
"eslint-plugin-ts-fortress": "1.3.5",
|
|
48
|
+
"eslint-plugin-ts-type-forge": "0.8.10",
|
|
49
49
|
"prettier": "3.9.9",
|
|
50
50
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
51
51
|
"prettier-plugin-packagejson": "3.0.2",
|
|
@@ -67,15 +67,15 @@
|
|
|
67
67
|
"build": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts",
|
|
68
68
|
"check:dist:branded-number-types": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-branded-number-types.mts",
|
|
69
69
|
"check:ext": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-ext.mts",
|
|
70
|
-
"check:lint": "oxlint . && eslint .",
|
|
71
|
-
"check:test": "pnpm run z:vitest run",
|
|
72
|
-
"check:test:cov": "pnpm run z:vitest run --coverage",
|
|
73
|
-
"check:types": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
|
|
70
|
+
"check:lint": "node ../../tools/scripts/cmd/assert-deps-built.mts && oxlint . && eslint .",
|
|
71
|
+
"check:test": "node ../../tools/scripts/cmd/assert-deps-built.mts && pnpm run z:vitest run",
|
|
72
|
+
"check:test:cov": "node ../../tools/scripts/cmd/assert-deps-built.mts && pnpm run z:vitest run --coverage",
|
|
73
|
+
"check:types": "node ../../tools/scripts/cmd/assert-deps-built.mts && node ../../node_modules/typescript-native/bin/tsc --noEmit",
|
|
74
74
|
"doc": "pnpm run gen:readme",
|
|
75
75
|
"fix:fmt": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-uncommitted.mts --cwd .",
|
|
76
76
|
"fix:fmt:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-diff-from.mts origin/main --cwd .",
|
|
77
77
|
"fix:fmt:full": "pnpm run z:prettier .",
|
|
78
|
-
"fix:lint": "oxlint . --fix && eslint . --fix",
|
|
78
|
+
"fix:lint": "node ../../tools/scripts/cmd/assert-deps-built.mts && oxlint . --fix && eslint . --fix",
|
|
79
79
|
"fmt": "pnpm run fix:fmt",
|
|
80
80
|
"gen": "run-s gen:rule-types gen:readme",
|
|
81
81
|
"gen:readme": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/embed-examples.mts",
|
package/src/plugin.mts
CHANGED
|
@@ -13,6 +13,7 @@ const recommendedRules = {
|
|
|
13
13
|
'ts-data-forge/prefer-canonical-array-slicing': 'error',
|
|
14
14
|
'ts-data-forge/prefer-canonical-length-cast': 'error',
|
|
15
15
|
'ts-data-forge/prefer-canonical-length-guard': 'error',
|
|
16
|
+
'ts-data-forge/prefer-arr-generate': 'error',
|
|
16
17
|
'ts-data-forge/prefer-arr-is-array': 'error',
|
|
17
18
|
'ts-data-forge/prefer-arr-scan': 'error',
|
|
18
19
|
'ts-data-forge/prefer-arr-sum': 'error',
|
|
@@ -27,6 +28,7 @@ const recommendedRules = {
|
|
|
27
28
|
'ts-data-forge/no-unnecessary-type-guard': 'error',
|
|
28
29
|
'ts-data-forge/prefer-comparison-over-nullish-guard': 'error',
|
|
29
30
|
'ts-data-forge/prefer-obj-over-entries-round-trip': 'error',
|
|
31
|
+
'ts-data-forge/prefer-pipe-map-nullable': 'error',
|
|
30
32
|
} as const satisfies ReadonlyRecord<
|
|
31
33
|
`ts-data-forge/${keyof typeof tsDataForgeRules}`,
|
|
32
34
|
'error'
|