eslint-plugin-ts-data-forge 0.6.1 → 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.
- package/README.md +1 -0
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/plugin.d.mts +2 -0
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +45 -41
- package/dist/plugin.mjs.map +1 -1
- package/dist/rule-types.d.mts +15 -0
- package/dist/rule-types.d.mts.map +1 -1
- package/dist/rule-types.mjs +6 -2
- package/dist/rule-types.mjs.map +1 -1
- package/dist/rules/ast-utils.mjs +107 -50
- package/dist/rules/ast-utils.mjs.map +1 -1
- package/dist/rules/branded-number-types.mjs +41 -37
- package/dist/rules/branded-number-types.mjs.map +1 -1
- package/dist/rules/constants.mjs +2 -4
- package/dist/rules/constants.mjs.map +1 -1
- package/dist/rules/import-utils.mjs +80 -56
- package/dist/rules/import-utils.mjs.map +1 -1
- package/dist/rules/index.mjs +2 -2
- package/dist/rules/index.mjs.map +1 -1
- package/dist/rules/no-side-effect-import.mjs +46 -34
- package/dist/rules/no-side-effect-import.mjs.map +1 -1
- package/dist/rules/no-unnecessary-type-guard.mjs +376 -265
- package/dist/rules/no-unnecessary-type-guard.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-array.mjs +64 -52
- package/dist/rules/prefer-arr-is-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-bounded-length-array.mjs +91 -85
- package/dist/rules/prefer-arr-is-bounded-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-fixed-length-array.mjs +92 -83
- package/dist/rules/prefer-arr-is-fixed-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-max-length-array.mjs +92 -80
- package/dist/rules/prefer-arr-is-max-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-min-length-array.mjs +92 -80
- package/dist/rules/prefer-arr-is-min-length-array.mjs.map +1 -1
- package/dist/rules/prefer-arr-is-non-empty.mjs +85 -77
- package/dist/rules/prefer-arr-is-non-empty.mjs.map +1 -1
- package/dist/rules/prefer-arr-scan.d.mts +96 -0
- package/dist/rules/prefer-arr-scan.d.mts.map +1 -0
- package/dist/rules/prefer-arr-scan.mjs +482 -0
- package/dist/rules/prefer-arr-scan.mjs.map +1 -0
- package/dist/rules/prefer-arr-sum.mjs +176 -132
- package/dist/rules/prefer-arr-sum.mjs.map +1 -1
- package/dist/rules/prefer-as-int.mjs +77 -71
- package/dist/rules/prefer-as-int.mjs.map +1 -1
- package/dist/rules/prefer-canonical-array-slicing.mjs +503 -343
- package/dist/rules/prefer-canonical-array-slicing.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-cast.mjs +217 -144
- package/dist/rules/prefer-canonical-length-cast.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-guard.mjs +160 -109
- package/dist/rules/prefer-canonical-length-guard.mjs.map +1 -1
- package/dist/rules/prefer-comparison-over-nullish-guard.mjs +89 -71
- package/dist/rules/prefer-comparison-over-nullish-guard.mjs.map +1 -1
- package/dist/rules/prefer-is-non-null-object.mjs +91 -72
- package/dist/rules/prefer-is-non-null-object.mjs.map +1 -1
- package/dist/rules/prefer-is-record-and-has-key.mjs +148 -105
- package/dist/rules/prefer-is-record-and-has-key.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-float.mjs +101 -77
- package/dist/rules/prefer-num-safe-parse-float.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-int.mjs +103 -81
- package/dist/rules/prefer-num-safe-parse-int.mjs.map +1 -1
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs +299 -194
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs.map +1 -1
- package/dist/rules/prefer-range-for-loop.mjs +121 -99
- package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
- package/dist/rules/rules.d.mts +1 -0
- package/dist/rules/rules.d.mts.map +1 -1
- package/dist/rules/rules.mjs +19 -20
- package/dist/rules/rules.mjs.map +1 -1
- package/dist/types.mjs +2 -2
- package/dist/types.mjs.map +1 -1
- package/package.json +6 -7
- package/src/plugin.mts +1 -0
- package/src/rule-types.mts +16 -0
- package/src/rules/prefer-arr-scan.mts +693 -0
- package/src/rules/prefer-arr-scan.test.mts +295 -0
- package/src/rules/rules.mts +2 -0
|
@@ -1,103 +1,125 @@
|
|
|
1
|
-
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
1
|
+
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
2
2
|
import { Arr } from 'ts-data-forge';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { buildImportFixes, getNamedImports, getTsDataForgeImport, } from './import-utils.mjs';
|
|
4
|
+
export const preferRangeForLoop = {
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'suggestion',
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Replace `for (let i = begin; i < end; ++i)` with `for (const i of range(begin, end))` from ts-data-forge.',
|
|
9
|
+
},
|
|
10
|
+
fixable: 'code',
|
|
11
|
+
schema: [],
|
|
12
|
+
messages: {
|
|
13
|
+
useRangeForLoop: 'Replace with `for (const {{varName}} of range({{begin}}, {{end}}))` from ts-data-forge.',
|
|
14
|
+
},
|
|
10
15
|
},
|
|
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
|
-
|
|
16
|
+
create: (context) => {
|
|
17
|
+
const sourceCode = context.sourceCode;
|
|
18
|
+
const program = sourceCode.ast;
|
|
19
|
+
const tsDataForgeImport = getTsDataForgeImport(program);
|
|
20
|
+
const mut_nodesToFix = [];
|
|
21
|
+
return {
|
|
22
|
+
ForStatement: (node) => {
|
|
23
|
+
|
|
24
|
+
if (node.init?.type !== AST_NODE_TYPES.VariableDeclaration ||
|
|
25
|
+
node.init.kind !== 'let' ||
|
|
26
|
+
!Arr.isFixedLengthTuple(1, node.init.declarations)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const declaration = node.init.declarations[0];
|
|
30
|
+
if (declaration.id.type !== AST_NODE_TYPES.Identifier ||
|
|
31
|
+
declaration.init === null) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const varName = declaration.id.name;
|
|
35
|
+
const beginExpr = declaration.init;
|
|
36
|
+
|
|
37
|
+
if (node.test?.type !== AST_NODE_TYPES.BinaryExpression ||
|
|
38
|
+
node.test.operator !== '<' ||
|
|
39
|
+
node.test.left.type !== AST_NODE_TYPES.Identifier ||
|
|
40
|
+
node.test.left.name !== varName) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const endExpr = node.test.right;
|
|
44
|
+
|
|
45
|
+
if (node.update === null)
|
|
46
|
+
return;
|
|
47
|
+
let mut_step;
|
|
48
|
+
if (node.update.type === AST_NODE_TYPES.UpdateExpression) {
|
|
49
|
+
|
|
50
|
+
if (node.update.operator === '++' &&
|
|
51
|
+
node.update.argument.type === AST_NODE_TYPES.Identifier &&
|
|
52
|
+
node.update.argument.name === varName) {
|
|
53
|
+
mut_step = undefined;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (node.update.type === AST_NODE_TYPES.AssignmentExpression &&
|
|
60
|
+
node.update.operator === '+=' &&
|
|
61
|
+
node.update.left.type === AST_NODE_TYPES.Identifier &&
|
|
62
|
+
node.update.left.name === varName) {
|
|
63
|
+
|
|
64
|
+
const stepValue = node.update.right;
|
|
65
|
+
if (stepValue.type === AST_NODE_TYPES.Literal) {
|
|
66
|
+
const stepNum = stepValue.value;
|
|
67
|
+
|
|
68
|
+
if (typeof stepNum === 'number' && stepNum > 0) {
|
|
69
|
+
mut_step = stepNum === 1 ? undefined : stepNum.toString();
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
|
|
77
|
+
mut_step = sourceCode.getText(stepValue);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const beginText = sourceCode.getText(beginExpr);
|
|
84
|
+
const endText = sourceCode.getText(endExpr);
|
|
85
|
+
mut_nodesToFix.push({
|
|
86
|
+
node,
|
|
87
|
+
varName,
|
|
88
|
+
begin: beginText,
|
|
89
|
+
end: endText,
|
|
90
|
+
step: mut_step,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
'Program:exit': () => {
|
|
94
|
+
const namedImports = getNamedImports(tsDataForgeImport);
|
|
95
|
+
const hasRangeImport = namedImports.includes('range');
|
|
96
|
+
for (const [index, { node, varName, begin, end, step },] of mut_nodesToFix.entries()) {
|
|
97
|
+
context.report({
|
|
98
|
+
node: node.init ?? node,
|
|
99
|
+
messageId: 'useRangeForLoop',
|
|
100
|
+
data: {
|
|
101
|
+
varName,
|
|
102
|
+
begin,
|
|
103
|
+
end,
|
|
104
|
+
},
|
|
105
|
+
fix: (fixer) => {
|
|
106
|
+
const bodyText = sourceCode.getText(node.body);
|
|
107
|
+
const rangeArgs = step === undefined
|
|
108
|
+
? `${begin}, ${end}`
|
|
109
|
+
: `${begin}, ${end}, ${step}`;
|
|
110
|
+
const replacement = `for (const ${varName} of range(${rangeArgs})) ${bodyText}`;
|
|
111
|
+
const importFixes = index === 0 && !hasRangeImport
|
|
112
|
+
? buildImportFixes(fixer, program, tsDataForgeImport, [
|
|
113
|
+
'range',
|
|
114
|
+
])
|
|
115
|
+
: [];
|
|
116
|
+
return [...importFixes, fixer.replaceText(node, replacement)];
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
84
120
|
},
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const replacement = `for (const ${varName} of range(${rangeArgs})) ${bodyText}`;
|
|
89
|
-
const importFixes = index === 0 && !hasRangeImport ? buildImportFixes(fixer, program, tsDataForgeImport, [
|
|
90
|
-
"range"
|
|
91
|
-
]) : [];
|
|
92
|
-
return [...importFixes, fixer.replaceText(node, replacement)];
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
},
|
|
99
|
-
defaultOptions: []
|
|
121
|
+
};
|
|
122
|
+
},
|
|
123
|
+
defaultOptions: [],
|
|
100
124
|
};
|
|
101
|
-
|
|
102
|
-
export { preferRangeForLoop };
|
|
103
|
-
//# sourceMappingURL=prefer-range-for-loop.mjs.map
|
|
125
|
+
//# sourceMappingURL=prefer-range-for-loop.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-range-for-loop.mjs","sources":["../../src/rules/prefer-range-for-loop.mts"],"
|
|
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
|
@@ -3,6 +3,7 @@ export declare const tsDataForgeRules: {
|
|
|
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
5
|
readonly 'prefer-arr-is-array': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrIsArray", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
6
|
+
readonly 'prefer-arr-scan': import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferArrScanAccumulate" | "preferArrScanPrefix", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
6
7
|
readonly 'prefer-arr-sum': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useArrSum" | "useArrSumBy", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
7
8
|
readonly 'prefer-as-int': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useBrandedNumberCastFunction", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
8
9
|
readonly 'prefer-is-non-null-object': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useIsNonNullObject", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
@@ -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":"AAkBA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAiBa,CAAC"}
|
package/dist/rules/rules.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { noSideEffectImport } from './no-side-effect-import.mjs';
|
|
2
2
|
import { noUnnecessaryTypeGuard } from './no-unnecessary-type-guard.mjs';
|
|
3
3
|
import { preferArrIsArray } from './prefer-arr-is-array.mjs';
|
|
4
|
+
import { preferArrScan } from './prefer-arr-scan.mjs';
|
|
4
5
|
import { preferArrSum } from './prefer-arr-sum.mjs';
|
|
5
6
|
import { preferAsInt } from './prefer-as-int.mjs';
|
|
6
7
|
import { preferCanonicalArraySlicing } from './prefer-canonical-array-slicing.mjs';
|
|
@@ -13,24 +14,22 @@ import { preferNumSafeParseFloat } from './prefer-num-safe-parse-float.mjs';
|
|
|
13
14
|
import { preferNumSafeParseInt } from './prefer-num-safe-parse-int.mjs';
|
|
14
15
|
import { preferObjOverEntriesRoundTrip } from './prefer-obj-over-entries-round-trip.mjs';
|
|
15
16
|
import { preferRangeForLoop } from './prefer-range-for-loop.mjs';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
17
|
+
export const tsDataForgeRules = {
|
|
18
|
+
'prefer-canonical-array-slicing': preferCanonicalArraySlicing,
|
|
19
|
+
'prefer-canonical-length-guard': preferCanonicalLengthGuard,
|
|
20
|
+
'prefer-canonical-length-cast': preferCanonicalLengthCast,
|
|
21
|
+
'prefer-arr-is-array': preferArrIsArray,
|
|
22
|
+
'prefer-arr-scan': preferArrScan,
|
|
23
|
+
'prefer-arr-sum': preferArrSum,
|
|
24
|
+
'prefer-as-int': preferAsInt,
|
|
25
|
+
'prefer-is-non-null-object': preferIsNonNullObject,
|
|
26
|
+
'prefer-range-for-loop': preferRangeForLoop,
|
|
27
|
+
'prefer-is-record-and-has-key': preferIsRecordAndHasKey,
|
|
28
|
+
'prefer-num-safe-parse-int': preferNumSafeParseInt,
|
|
29
|
+
'prefer-num-safe-parse-float': preferNumSafeParseFloat,
|
|
30
|
+
'no-side-effect-import': noSideEffectImport,
|
|
31
|
+
'no-unnecessary-type-guard': noUnnecessaryTypeGuard,
|
|
32
|
+
'prefer-comparison-over-nullish-guard': preferComparisonOverNullishGuard,
|
|
33
|
+
'prefer-obj-over-entries-round-trip': preferObjOverEntriesRoundTrip,
|
|
33
34
|
};
|
|
34
|
-
|
|
35
|
-
export { tsDataForgeRules };
|
|
36
|
-
//# sourceMappingURL=rules.mjs.map
|
|
35
|
+
//# sourceMappingURL=rules.mjs.map
|
package/dist/rules/rules.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.mjs","sources":["../../src/rules/rules.mts"],"
|
|
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,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,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;CAC3B,CAAC"}
|
package/dist/types.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
//# sourceMappingURL=types.mjs.map
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=types.mjs.map
|
package/dist/types.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","
|
|
1
|
+
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.mts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-ts-data-forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "ESLint rules that steer code toward ts-data-forge idioms.",
|
|
6
6
|
"keywords": [
|
|
@@ -35,21 +35,20 @@
|
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"@typescript-eslint/utils": "^8.68.0",
|
|
38
|
-
"ts-data-forge": "14.6.
|
|
38
|
+
"ts-data-forge": "14.6.3",
|
|
39
39
|
"ts-type-forge": "~9.2.2"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@typescript-eslint/parser": "8.68.0",
|
|
43
43
|
"@typescript-eslint/rule-tester": "8.68.0",
|
|
44
44
|
"dedent": "1.7.2",
|
|
45
|
-
"eslint-config-typed": "5.
|
|
46
|
-
"eslint-plugin-ts-fortress": "1.
|
|
47
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
45
|
+
"eslint-config-typed": "5.11.2",
|
|
46
|
+
"eslint-plugin-ts-fortress": "1.2.0",
|
|
47
|
+
"eslint-plugin-ts-type-forge": "0.8.1",
|
|
48
48
|
"prettier": "3.9.6",
|
|
49
49
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
50
50
|
"prettier-plugin-packagejson": "3.0.2",
|
|
51
|
-
"
|
|
52
|
-
"ts-repo-utils": "10.5.0"
|
|
51
|
+
"ts-repo-utils": "10.6.0"
|
|
53
52
|
},
|
|
54
53
|
"peerDependencies": {
|
|
55
54
|
"eslint": ">=9.0.0",
|
package/src/plugin.mts
CHANGED
|
@@ -13,6 +13,7 @@ const recommendedRules = {
|
|
|
13
13
|
'ts-data-forge/prefer-canonical-length-cast': 'error',
|
|
14
14
|
'ts-data-forge/prefer-canonical-length-guard': 'error',
|
|
15
15
|
'ts-data-forge/prefer-arr-is-array': 'error',
|
|
16
|
+
'ts-data-forge/prefer-arr-scan': 'error',
|
|
16
17
|
'ts-data-forge/prefer-arr-sum': 'error',
|
|
17
18
|
'ts-data-forge/prefer-as-int': 'error',
|
|
18
19
|
'ts-data-forge/prefer-is-non-null-object': 'error',
|
package/src/rule-types.mts
CHANGED
|
@@ -87,6 +87,21 @@ namespace PreferArrIsArray {
|
|
|
87
87
|
export type RuleEntry = Linter.StringSeverity;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
/**
|
|
91
|
+
* @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
|
|
92
|
+
*
|
|
93
|
+
* ```md
|
|
94
|
+
* | key | value |
|
|
95
|
+
* | :--------- | :--------- |
|
|
96
|
+
* | type | suggestion |
|
|
97
|
+
* | deprecated | false |
|
|
98
|
+
* | fixable | code |
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
namespace PreferArrScan {
|
|
102
|
+
export type RuleEntry = Linter.StringSeverity;
|
|
103
|
+
}
|
|
104
|
+
|
|
90
105
|
/**
|
|
91
106
|
* @description Replace `xs.reduce((a, b) => a + b, 0)` with `Arr.sum(xs)` or `Arr.sumBy(xs, fn)` from ts-data-forge.
|
|
92
107
|
*
|
|
@@ -285,6 +300,7 @@ export type EslintTsDataForgeRules = Readonly<{
|
|
|
285
300
|
'ts-data-forge/prefer-canonical-length-guard': PreferCanonicalLengthGuard.RuleEntry;
|
|
286
301
|
'ts-data-forge/prefer-canonical-length-cast': PreferCanonicalLengthCast.RuleEntry;
|
|
287
302
|
'ts-data-forge/prefer-arr-is-array': PreferArrIsArray.RuleEntry;
|
|
303
|
+
'ts-data-forge/prefer-arr-scan': PreferArrScan.RuleEntry;
|
|
288
304
|
'ts-data-forge/prefer-arr-sum': PreferArrSum.RuleEntry;
|
|
289
305
|
'ts-data-forge/prefer-as-int': PreferAsInt.RuleEntry;
|
|
290
306
|
'ts-data-forge/prefer-is-non-null-object': PreferIsNonNullObject.RuleEntry;
|