eslint-plugin-ts-data-forge 0.10.5 → 0.10.7
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 +3 -3
- package/dist/plugin.d.mts +2 -2
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +1 -0
- package/dist/plugin.mjs.map +1 -1
- package/dist/rule-types.d.mts +5 -5
- package/dist/rules/ast-utils.d.mts +8 -9
- package/dist/rules/ast-utils.d.mts.map +1 -1
- package/dist/rules/ast-utils.mjs +3 -4
- package/dist/rules/ast-utils.mjs.map +1 -1
- package/dist/rules/import-binding.d.mts +38 -0
- package/dist/rules/import-binding.d.mts.map +1 -0
- package/dist/rules/import-binding.mjs +53 -0
- package/dist/rules/import-binding.mjs.map +1 -0
- package/dist/rules/mutable-result.mjs +37 -37
- package/dist/rules/mutable-result.mjs.map +1 -1
- package/dist/rules/no-unnecessary-type-guard.d.mts.map +1 -1
- package/dist/rules/no-unnecessary-type-guard.mjs +146 -143
- package/dist/rules/no-unnecessary-type-guard.mjs.map +1 -1
- package/dist/rules/prefer-arr-generate.d.mts +2 -2
- package/dist/rules/prefer-arr-generate.d.mts.map +1 -1
- package/dist/rules/prefer-arr-generate.mjs +146 -136
- package/dist/rules/prefer-arr-generate.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 +14 -16
- 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 +15 -17
- 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 +14 -16
- 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 +14 -16
- 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 +14 -16
- 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 +9 -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 +16 -21
- 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 +38 -43
- 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 +19 -26
- 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 +49 -16
- package/dist/rules/prefer-canonical-array-slicing.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-cast.mjs +15 -15
- package/dist/rules/prefer-canonical-length-cast.mjs.map +1 -1
- package/dist/rules/prefer-num-safe-parse-float.d.mts +1 -1
- package/dist/rules/prefer-num-safe-parse-float.d.mts.map +1 -1
- package/dist/rules/prefer-num-safe-parse-int.d.mts +1 -1
- package/dist/rules/prefer-num-safe-parse-int.d.mts.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 +100 -99
- package/dist/rules/prefer-obj-over-entries-round-trip.mjs.map +1 -1
- package/dist/rules/prefer-pipe-map-nullable.d.mts +2 -2
- package/dist/rules/prefer-pipe-map-nullable.d.mts.map +1 -1
- package/dist/rules/prefer-pipe-map-nullable.mjs +2 -4
- package/dist/rules/prefer-pipe-map-nullable.mjs.map +1 -1
- package/dist/rules/prefer-range-for-loop.d.mts.map +1 -1
- package/dist/rules/prefer-range-for-loop.mjs +18 -24
- package/dist/rules/prefer-range-for-loop.mjs.map +1 -1
- package/dist/rules/rules.d.mts +2 -2
- package/package.json +6 -6
- package/src/plugin.mts +4 -3
- package/src/rule-types.mts +5 -5
- package/src/rules/ast-utils.mts +14 -15
- package/src/rules/import-binding.mts +94 -0
- package/src/rules/mutable-result.mts +56 -56
- package/src/rules/no-unnecessary-type-guard.mts +203 -207
- package/src/rules/no-unnecessary-type-guard.test.mts +62 -2
- package/src/rules/prefer-arr-generate.mts +222 -214
- package/src/rules/prefer-arr-generate.test.mts +490 -133
- package/src/rules/prefer-arr-is-bounded-length-array.mts +22 -33
- package/src/rules/prefer-arr-is-fixed-length-array.mts +26 -38
- package/src/rules/prefer-arr-is-fixed-length-array.test.mts +16 -7
- package/src/rules/prefer-arr-is-max-length-array.mts +23 -36
- package/src/rules/prefer-arr-is-max-length-array.test.mts +16 -7
- package/src/rules/prefer-arr-is-min-length-array.mts +23 -36
- package/src/rules/prefer-arr-is-min-length-array.test.mts +16 -7
- package/src/rules/prefer-arr-is-non-empty.mts +17 -34
- package/src/rules/prefer-arr-is-non-empty.test.mts +110 -0
- package/src/rules/prefer-arr-scan.mts +17 -42
- package/src/rules/prefer-arr-scan.test.mts +55 -0
- package/src/rules/prefer-arr-sum.mts +22 -36
- package/src/rules/prefer-arr-uniq.mts +51 -62
- package/src/rules/prefer-arr-uniq.test.mts +46 -20
- package/src/rules/prefer-as-int.mts +27 -52
- package/src/rules/prefer-as-int.test.mts +79 -29
- package/src/rules/prefer-canonical-array-slicing.mts +101 -40
- package/src/rules/prefer-canonical-array-slicing.test.mts +133 -34
- package/src/rules/prefer-canonical-length-cast.mts +29 -29
- package/src/rules/prefer-canonical-length-guard.mts +2 -2
- package/src/rules/prefer-num-safe-parse-float.test.mts +255 -94
- package/src/rules/prefer-num-safe-parse-int.test.mts +212 -76
- package/src/rules/prefer-obj-over-entries-round-trip.mts +152 -170
- package/src/rules/prefer-obj-over-entries-round-trip.test.mts +48 -6
- package/src/rules/prefer-pipe-map-nullable.mts +17 -19
- package/src/rules/prefer-range-for-loop.mts +37 -61
- package/src/rules/prefer-range-for-loop.test.mts +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# eslint-plugin-ts-data-forge
|
|
2
2
|
|
|
3
|
-
ESLint rules that steer TypeScript code toward [`ts-data-forge`](https://www.npmjs.com/package/ts-data-forge) idioms — e.g. preferring `Arr.isNonEmpty(xs)` over `xs.length > 0`, `isRecord(x) && hasKey(x, k)` over `Object.hasOwn(x, k)`, or `Num.safeParseInt` over `parseInt`.
|
|
3
|
+
ESLint rules that steer TypeScript code toward [`ts-data-forge`](https://www.npmjs.com/package/ts-data-forge) idioms — e.g. preferring `Arr.isNonEmpty(xs)` over `xs.length > 0`, `isRecord(x) && hasKey(x, k)` over `Object.hasOwn(x, k)`, or `Num.safeParseInt` over `parseInt`. Most rules are auto-fixable; where the rewrite can change what the code does, the rule suggests it instead.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -80,8 +80,8 @@ export default [
|
|
|
80
80
|
| `prefer-is-non-null-object` | Replace `typeof u === 'object' && u !== null` with `isNonNullObject(u)`. |
|
|
81
81
|
| `prefer-range-for-loop` | Replace C-style `for` loops with `for (const i of range(begin, end))`. |
|
|
82
82
|
| `prefer-is-record-and-has-key` | Replace `Object.hasOwn(obj, key)` / `key in obj` with `isRecord(obj) && hasKey(…)`. |
|
|
83
|
-
| `prefer-num-safe-parse-int` | Replace `parseInt(x, 10)` with `Result.unwrapOkOr(Num.safeParseInt(x), NaN)`.
|
|
84
|
-
| `prefer-num-safe-parse-float` | Replace `parseFloat(x)` / `Number(x)` with `Num.safeParseFloat`-based parsing.
|
|
83
|
+
| `prefer-num-safe-parse-int` | Replace `parseInt(x, 10)` with `Result.unwrapOkOr(Num.safeParseInt(x), Number.NaN)`. Always a suggestion, since some strings parse differently. |
|
|
84
|
+
| `prefer-num-safe-parse-float` | Replace `parseFloat(x)` / `Number(x)` with `Num.safeParseFloat`-based parsing. Always a suggestion, since some strings parse differently. |
|
|
85
85
|
| `no-unnecessary-type-guard` | Flag `ts-data-forge` type-guard calls that do no narrowing (type-aware). |
|
|
86
86
|
| `prefer-comparison-over-nullish-guard` | Prefer direct `=== null` / `!== undefined` over `isNull` / `isNotUndefined` calls. |
|
|
87
87
|
| `prefer-obj-over-entries-round-trip` | Replace an `Object.fromEntries(Object.entries(o).map/filter/flatMap(…))` round trip with `Obj.map` / `Obj.filter` / `Obj.filterMap`. |
|
package/dist/plugin.d.mts
CHANGED
|
@@ -16,8 +16,8 @@ export declare const eslintPluginTsDataForge: {
|
|
|
16
16
|
readonly 'prefer-is-non-null-object': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useIsNonNullObject", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
17
17
|
readonly 'prefer-range-for-loop': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useRangeForLoop", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
18
18
|
readonly 'prefer-is-record-and-has-key': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useHasKey" | "useIsRecordAndHasKey", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
19
|
-
readonly 'prefer-num-safe-parse-int': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useSafeParseInt", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
20
|
-
readonly 'prefer-num-safe-parse-float': import("@typescript-eslint/utils/ts-eslint").RuleModule<"useSafeParseFloat", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
19
|
+
readonly 'prefer-num-safe-parse-int': import("@typescript-eslint/utils/ts-eslint").RuleModule<"replaceWithSafeParse" | "useSafeParseInt", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
20
|
+
readonly 'prefer-num-safe-parse-float': import("@typescript-eslint/utils/ts-eslint").RuleModule<"replaceWithSafeParse" | "useSafeParseFloat", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
21
21
|
readonly 'no-side-effect-import': import("@typescript-eslint/utils/ts-eslint").RuleModule<"removeSideEffectImport", readonly [], unknown, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
22
22
|
readonly 'no-unnecessary-type-guard': import("@typescript-eslint/utils/ts-eslint").RuleModule<"alwaysFalse" | "alwaysTrue" | "replaceTypeGuard", readonly [(Readonly<{
|
|
23
23
|
ignore?: readonly string[];
|
package/dist/plugin.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.d.mts","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAmDlE,eAAO,MAAM,uBAAuB;;iBAEhC,IAAI,EAAE,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;QAInC,oDAAoD;iBACpD,WAAW;2BAtBP,2BAA2B;;yBAQ3B,eAAe,EAAI,YAAY;;;yEAjCW,OAAO;uEACT,OAAO;wEACN,OAAO;8DACjB,OAAO;8DACP,OAAO;0DACX,OAAO;yDACR,OAAO;0DACN,OAAO;wDACT,OAAO;oEACK,OAAO;gEACX,OAAO;uEACA,OAAO;oEACV,OAAO;sEACL,OAAO;gEACb,OAAO;oEACH,OAAO;+EACI,OAAO;6EACT,OAAO;mEACjB,OAAO;;;;CA+BlB,CAAC"}
|
package/dist/plugin.mjs
CHANGED
package/dist/plugin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD
|
|
1
|
+
{"version":3,"file":"plugin.mjs","sourceRoot":"","sources":["../src/plugin.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAAG;IACvB,8CAA8C,EAAE,OAAO;IACvD,4CAA4C,EAAE,OAAO;IACrD,6CAA6C,EAAE,OAAO;IACtD,mCAAmC,EAAE,OAAO;IAC5C,mCAAmC,EAAE,OAAO;IAC5C,+BAA+B,EAAE,OAAO;IACxC,8BAA8B,EAAE,OAAO;IACvC,+BAA+B,EAAE,OAAO;IACxC,6BAA6B,EAAE,OAAO;IACtC,yCAAyC,EAAE,OAAO;IAClD,qCAAqC,EAAE,OAAO;IAC9C,4CAA4C,EAAE,OAAO;IACrD,yCAAyC,EAAE,OAAO;IAClD,2CAA2C,EAAE,OAAO;IACpD,qCAAqC,EAAE,OAAO;IAC9C,yCAAyC,EAAE,OAAO;IAClD,oDAAoD,EAAE,OAAO;IAC7D,kDAAkD,EAAE,OAAO;IAC3D,wCAAwC,EAAE,OAAO;CAIlD,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE;QACP,uEAAuE;QACvE,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,0EAA0E;QAC1E,wDAAwD;QACxD,IAAI,eAAe;YACjB,OAAO,uBAAuB,CAAC;QACjC,CAAC;KACF;IACD,KAAK,EAAE,gBAAgB;CACY,CAAC;AAEtC,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE;QACJ,IAAI,EAAE,6BAA6B;KACpC;IACD,KAAK,EAAE,gBAAgB;IACvB,OAAO,EAAE;QACP,oDAAoD;QACpD,WAAW,EAAE,iBAAiB;KAC/B;CAC8B,CAAC"}
|
package/dist/rule-types.d.mts
CHANGED
|
@@ -3,9 +3,9 @@ import type { Linter } from 'eslint';
|
|
|
3
3
|
import type { tsDataForgeRules } from './rules/index.mjs';
|
|
4
4
|
type SpreadOptionsIfIsArray<T extends readonly [Linter.StringSeverity, unknown]> = T[1] extends readonly unknown[] ? readonly [Linter.StringSeverity, ...T[1]] : T;
|
|
5
5
|
/**
|
|
6
|
-
* Extracts the options tuple type of a rule from its TypeScript
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Extracts the options tuple type of a rule from its TypeScript implementation,
|
|
7
|
+
* so that option types stay in sync with the rule source without converting
|
|
8
|
+
* `meta.schema` (JSON Schema) back into TypeScript types.
|
|
9
9
|
*/
|
|
10
10
|
type RuleOptionsOf<Name extends keyof typeof tsDataForgeRules> = (typeof tsDataForgeRules)[Name] extends TSESLint.RuleModule<infer _MessageIds extends string, infer Options extends readonly unknown[]> ? Options : never;
|
|
11
11
|
/**
|
|
@@ -184,7 +184,7 @@ declare namespace PreferIsRecordAndHasKey {
|
|
|
184
184
|
* | :--------- | :--------- |
|
|
185
185
|
* | type | suggestion |
|
|
186
186
|
* | deprecated | false |
|
|
187
|
-
* | fixable |
|
|
187
|
+
* | fixable | false |
|
|
188
188
|
* ```
|
|
189
189
|
*/
|
|
190
190
|
declare namespace PreferNumSafeParseInt {
|
|
@@ -198,7 +198,7 @@ declare namespace PreferNumSafeParseInt {
|
|
|
198
198
|
* | :--------- | :--------- |
|
|
199
199
|
* | type | suggestion |
|
|
200
200
|
* | deprecated | false |
|
|
201
|
-
* | fixable |
|
|
201
|
+
* | fixable | false |
|
|
202
202
|
* ```
|
|
203
203
|
*/
|
|
204
204
|
declare namespace PreferNumSafeParseFloat {
|
|
@@ -24,19 +24,13 @@ export declare const asLengthAccess: (node: TSESTree.Expression) => TSESTree.Mem
|
|
|
24
24
|
* `xs.length >= 1 && (xs as readonly T[]).length <= 3` bounds one array.
|
|
25
25
|
*/
|
|
26
26
|
export declare const isSameArrayText: (a: TSESTree.Expression, b: TSESTree.Expression, sourceCode: TSESLint.SourceCode) => boolean;
|
|
27
|
-
type LengthComparison = Readonly<{
|
|
28
|
-
array: TSESTree.Expression;
|
|
29
|
-
bound: TSESTree.Expression;
|
|
30
|
-
kind: 'max' | 'min';
|
|
31
|
-
}>;
|
|
32
27
|
/**
|
|
33
28
|
* Parses a `<array>.length <op> <bound>` comparison (in either operand order)
|
|
34
29
|
* into its array expression, integer-literal/`const` `bound`, and whether it is
|
|
35
30
|
* a lower (`min`) or upper (`max`) length bound. Returns `undefined` for
|
|
36
|
-
* anything else. The comparison, the length and the bound are read through
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* as `as number` would only widen the length a guard narrows to.
|
|
31
|
+
* anything else. The comparison, the length and the bound are read through type
|
|
32
|
+
* wrappers; the `bound` returned is the literal or constant underneath, since a
|
|
33
|
+
* wrapper such as `as number` would only widen the length a guard narrows to.
|
|
40
34
|
*
|
|
41
35
|
* - `xs.length >= n` / `n <= xs.length` → `min`
|
|
42
36
|
* - `xs.length <= n` / `n >= xs.length` → `max`
|
|
@@ -52,5 +46,10 @@ export declare const parseLengthComparison: (wrapped: TSESTree.Expression, sourc
|
|
|
52
46
|
* is still the operand.
|
|
53
47
|
*/
|
|
54
48
|
export declare const isPartOfBoundedLengthCheck: (node: TSESTree.BinaryExpression, sourceCode: TSESLint.SourceCode) => boolean;
|
|
49
|
+
type LengthComparison = Readonly<{
|
|
50
|
+
array: TSESTree.Expression;
|
|
51
|
+
bound: TSESTree.Expression;
|
|
52
|
+
kind: 'max' | 'min';
|
|
53
|
+
}>;
|
|
55
54
|
export {};
|
|
56
55
|
//# sourceMappingURL=ast-utils.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.d.mts","sourceRoot":"","sources":["../../src/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ast-utils.d.mts","sourceRoot":"","sources":["../../src/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,aAEzB,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAEzC,QAAQ,CAAC,UAAU,KACxB,OAkBF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,SAC/B,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,cAE3B,QAAQ,CAAC,UAAU,KAC9B,OA0CF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,SAEnB,QAAQ,CAAC,UAAU,KACxB,QAAQ,CAAC,gBAAgB,GAAG,SAS9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,MAEvB,QAAQ,CAAC,UAAU,KAEnB,QAAQ,CAAC,UAAU,cAEV,QAAQ,CAAC,UAAU,KAC9B,OAEsC,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,YAEvB,QAAQ,CAAC,UAAU,cAEhB,QAAQ,CAAC,UAAU,KAC9B,gBAAgB,GAAG,SAuCrB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,SAE/B,QAAQ,CAAC,gBAAgB,cAEnB,QAAQ,CAAC,UAAU,KAC9B,OA8BF,CAAC;AAOF,KAAK,gBAAgB,GAAG,QAAQ,CAAC;IAC/B,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;IAC3B,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;CACrB,CAAC,CAAC"}
|
package/dist/rules/ast-utils.mjs
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ASTUtils, } from '@typescript-eslint/utils';
|
|
2
2
|
import { isTypeWrapper, skipTypeWrappers, typeWrapperLayers, } from 'eslint-rule-forge';
|
|
3
|
-
const isIntegerLiteral = (node) => node.type === AST_NODE_TYPES.Literal &&
|
|
4
|
-
typeof node.value === 'number' &&
|
|
5
|
-
Number.isInteger(node.value);
|
|
6
3
|
|
|
7
4
|
|
|
8
5
|
|
|
@@ -106,7 +103,6 @@ sourceCode) => sourceCode.getText(skipTypeWrappers(a)) ===
|
|
|
106
103
|
|
|
107
104
|
|
|
108
105
|
|
|
109
|
-
|
|
110
106
|
export const parseLengthComparison = (
|
|
111
107
|
|
|
112
108
|
wrapped,
|
|
@@ -169,6 +165,9 @@ sourceCode) => {
|
|
|
169
165
|
return (self.kind !== other.kind &&
|
|
170
166
|
isSameArrayText(self.array, other.array, sourceCode));
|
|
171
167
|
};
|
|
168
|
+
const isIntegerLiteral = (node) => node.type === AST_NODE_TYPES.Literal &&
|
|
169
|
+
typeof node.value === 'number' &&
|
|
170
|
+
Number.isInteger(node.value);
|
|
172
171
|
|
|
173
172
|
const outermostTypeWrapper = (
|
|
174
173
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.mjs","sourceRoot":"","sources":["../../src/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,QAAQ,GAGT,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B
|
|
1
|
+
{"version":3,"file":"ast-utils.mjs","sourceRoot":"","sources":["../../src/rules/ast-utils.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { TSESLint, TSESTree } from '@typescript-eslint/utils';
|
|
2
|
+
import { type ValueImportBinding } from 'eslint-rule-forge';
|
|
3
|
+
/**
|
|
4
|
+
* Binds ts-data-forge's `exportName` as a value once per file (see
|
|
5
|
+
* `bindValueImports`), and gives, for the code at a node, the name a fix writes
|
|
6
|
+
* and the edits that bring it into scope, or `undefined` when no fix can: an
|
|
7
|
+
* import already binds the name to something else, or something other than the
|
|
8
|
+
* import takes it where the code is.
|
|
9
|
+
*
|
|
10
|
+
* Every fix that writes the name makes these edits itself, so that one applied
|
|
11
|
+
* alone (an editor's quick fix) is complete; `--fix` then takes one pass per
|
|
12
|
+
* report that adds the import.
|
|
13
|
+
*/
|
|
14
|
+
export declare const tsDataForgeValueAt: (sourceCode: TSESLint.SourceCode, exportName: string) => ((node: TSESTree.Node) => TsDataForgeValue | undefined);
|
|
15
|
+
/**
|
|
16
|
+
* {@link tsDataForgeValueAt} for a name that varies from report to report (a
|
|
17
|
+
* cast function, a replacement guard): each name is bound once per file,
|
|
18
|
+
* however many reports write it.
|
|
19
|
+
*/
|
|
20
|
+
export declare const tsDataForgeValueAtByName: (sourceCode: TSESLint.SourceCode) => ((exportName: string) => ReturnType<typeof tsDataForgeValueAt>);
|
|
21
|
+
/**
|
|
22
|
+
* {@link tsDataForgeValueAt} for several names one fix writes together: their
|
|
23
|
+
* edits are made as one, so that two names the file does not import go into a
|
|
24
|
+
* single new declaration. `localNames` are the names to write, known before any
|
|
25
|
+
* node is: the export names themselves when they cannot be bound.
|
|
26
|
+
*/
|
|
27
|
+
export declare const tsDataForgeValuesAt: (sourceCode: TSESLint.SourceCode, exportNames: readonly string[]) => Readonly<{
|
|
28
|
+
localNames: readonly string[];
|
|
29
|
+
at: (node: TSESTree.Node) => ValueImportBinding | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
/** What {@link tsDataForgeValueAt} gives for one node. */
|
|
32
|
+
export type TsDataForgeValue = Readonly<{
|
|
33
|
+
/** The name to write. */
|
|
34
|
+
localName: string;
|
|
35
|
+
/** The edits that bind it. */
|
|
36
|
+
edits: ValueImportBinding['edits'];
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=import-binding.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-binding.d.mts","sourceRoot":"","sources":["../../src/rules/import-binding.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,eAEjB,QAAQ,CAAC,UAAU,cACnB,MAAM,KAEjB,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,gBAAgB,GAAG,SAAS,CAYxD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,eAEvB,QAAQ,CAAC,UAAU,KAC9B,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAI9D,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,eAElB,QAAQ,CAAC,UAAU,eAClB,SAAS,MAAM,EAAE,KAC7B,QAAQ,CAAC;IACV,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAE9B,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,kBAAkB,GAAG,SAAS,CAAC;CAC7D,CAiBA,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAElB,8BAA8B;IAC9B,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;CACpC,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { bindValueImports, hasForeignBinding, } from 'eslint-rule-forge';
|
|
2
|
+
import { memoizeFunction } from 'ts-data-forge';
|
|
3
|
+
import { TS_DATA_FORGE_MODULE } from './constants.mjs';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export const tsDataForgeValueAt = (
|
|
16
|
+
|
|
17
|
+
sourceCode, exportName) => {
|
|
18
|
+
const { at } = tsDataForgeValuesAt(sourceCode, [exportName]);
|
|
19
|
+
return (node) => {
|
|
20
|
+
const binding = at(node);
|
|
21
|
+
const localName = binding?.localNames[0];
|
|
22
|
+
return binding === undefined || localName === undefined
|
|
23
|
+
? undefined
|
|
24
|
+
: { localName, edits: binding.edits };
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
export const tsDataForgeValueAtByName = (
|
|
33
|
+
|
|
34
|
+
sourceCode) => memoizeFunction((exportName) => tsDataForgeValueAt(sourceCode, exportName), (exportName) => exportName);
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
export const tsDataForgeValuesAt = (
|
|
42
|
+
|
|
43
|
+
sourceCode, exportNames) => {
|
|
44
|
+
const binding = bindValueImports(sourceCode, TS_DATA_FORGE_MODULE, exportNames);
|
|
45
|
+
return {
|
|
46
|
+
localNames: binding?.localNames ?? exportNames,
|
|
47
|
+
at: (node) => binding === undefined ||
|
|
48
|
+
binding.localNames.some((localName) => hasForeignBinding(sourceCode, node, localName, TS_DATA_FORGE_MODULE))
|
|
49
|
+
? undefined
|
|
50
|
+
: binding,
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=import-binding.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-binding.mjs","sourceRoot":"","sources":["../../src/rules/import-binding.mts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;AAChC,8EAA8E;AAC9E,UAA+B,EAC/B,UAAkB,EAEuC,EAAE;IAC3D,MAAM,EAAE,EAAE,EAAE,GAAG,mBAAmB,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7D,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzB,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAEzC,OAAO,OAAO,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YACrD,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;AACtC,8EAA8E;AAC9E,UAA+B,EACkC,EAAE,CACnE,eAAe,CACb,CAAC,UAAkB,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,EAClE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAC3B,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;AACjC,8EAA8E;AAC9E,UAA+B,EAC/B,WAA8B,EAK7B,EAAE;IACH,MAAM,OAAO,GAAG,gBAAgB,CAC9B,UAAU,EACV,oBAAoB,EACpB,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,WAAW;QAC9C,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CACX,OAAO,KAAK,SAAS;YACrB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACpC,iBAAiB,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,oBAAoB,CAAC,CACrE;YACC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO;KACd,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -48,43 +48,6 @@ node) => {
|
|
|
48
48
|
? outermostTypePreservingWrapper(parent)
|
|
49
49
|
: node;
|
|
50
50
|
};
|
|
51
|
-
const isUsedAsMutable = (
|
|
52
|
-
|
|
53
|
-
checker,
|
|
54
|
-
|
|
55
|
-
getTsNode,
|
|
56
|
-
|
|
57
|
-
node) => {
|
|
58
|
-
const parent = node.parent;
|
|
59
|
-
if (parent?.type === AST_NODE_TYPES.MemberExpression &&
|
|
60
|
-
parent.object === node) {
|
|
61
|
-
|
|
62
|
-
if (!parent.computed &&
|
|
63
|
-
parent.property.type === AST_NODE_TYPES.Identifier &&
|
|
64
|
-
mutatingMethods.has(parent.property.name)) {
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const grandParent = parent.parent;
|
|
69
|
-
return ((grandParent.type === AST_NODE_TYPES.AssignmentExpression &&
|
|
70
|
-
grandParent.left === parent) ||
|
|
71
|
-
grandParent.type === AST_NODE_TYPES.UpdateExpression ||
|
|
72
|
-
(grandParent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
73
|
-
grandParent.operator === 'delete'));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const tsNode = getTsNode(node);
|
|
78
|
-
if (tsNode === undefined) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
if (!ts.isExpression(tsNode)) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
const expectedType = getDeclaredParameterType(checker, tsNode) ??
|
|
85
|
-
checker.getContextualType(tsNode);
|
|
86
|
-
return (expectedType !== undefined && isMutableArrayOnly(checker, expectedType));
|
|
87
|
-
};
|
|
88
51
|
|
|
89
52
|
|
|
90
53
|
|
|
@@ -130,6 +93,43 @@ type) => {
|
|
|
130
93
|
(t.flags & primitiveTypeFlags) !== 0 ||
|
|
131
94
|
(checker.isArrayType(t) && t.getSymbol()?.getName() === 'Array')) && members.some((t) => (t.flags & primitiveTypeFlags) === 0));
|
|
132
95
|
};
|
|
96
|
+
const isUsedAsMutable = (
|
|
97
|
+
|
|
98
|
+
checker,
|
|
99
|
+
|
|
100
|
+
getTsNode,
|
|
101
|
+
|
|
102
|
+
node) => {
|
|
103
|
+
const parent = node.parent;
|
|
104
|
+
if (parent?.type === AST_NODE_TYPES.MemberExpression &&
|
|
105
|
+
parent.object === node) {
|
|
106
|
+
|
|
107
|
+
if (!parent.computed &&
|
|
108
|
+
parent.property.type === AST_NODE_TYPES.Identifier &&
|
|
109
|
+
mutatingMethods.has(parent.property.name)) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const grandParent = parent.parent;
|
|
114
|
+
return ((grandParent.type === AST_NODE_TYPES.AssignmentExpression &&
|
|
115
|
+
grandParent.left === parent) ||
|
|
116
|
+
grandParent.type === AST_NODE_TYPES.UpdateExpression ||
|
|
117
|
+
(grandParent.type === AST_NODE_TYPES.UnaryExpression &&
|
|
118
|
+
grandParent.operator === 'delete'));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
const tsNode = getTsNode(node);
|
|
123
|
+
if (tsNode === undefined) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
if (!ts.isExpression(tsNode)) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const expectedType = getDeclaredParameterType(checker, tsNode) ??
|
|
130
|
+
checker.getContextualType(tsNode);
|
|
131
|
+
return (expectedType !== undefined && isMutableArrayOnly(checker, expectedType));
|
|
132
|
+
};
|
|
133
133
|
|
|
134
134
|
const mutatingMethods = new Set([
|
|
135
135
|
'copyWithin',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutable-result.mjs","sourceRoot":"","sources":["../../src/rules/mutable-result.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;AAChC,8EAA8E;AAC9E,UAA+B;AAC/B,8EAA8E;AAC9E,OAAuB;AACvB,8EAA8E;AAC9E,SAAyD;AACzD,8EAA8E;AAC9E,IAAmB,EACV,EAAE;IACX,MAAM,KAAK,GAAG,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAEnD,IAAI,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IACE,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,kBAAkB;QAClD,MAAM,CAAC,IAAI,KAAK,KAAK;QACrB,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAC5C,MAAM,CAAC,EAAE,CAAC,cAAc,KAAK,SAAS,EACtC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE3D,OAAO,CACL,QAAQ,EAAE,UAAU,CAAC,IAAI,CACvB,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,IAAI,KAAK,IAAI;QACvB,eAAe,CACb,OAAO,EACP,SAAS,EACT,8BAA8B,CAAC,SAAS,CAAC,UAAU,CAAC,CACrD,CACJ,IAAI,KAAK,CACX,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,8BAA8B,GAAG;AACrC,8EAA8E;AAC9E,IAAmB,EACJ,EAAE;IACjB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,mBAAmB;YACjD,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,qBAAqB,CAAC;QACvD,MAAM,CAAC,UAAU,KAAK,IAAI;QAC1B,CAAC,CAAC,8BAA8B,CAAC,MAAM,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"mutable-result.mjs","sourceRoot":"","sources":["../../src/rules/mutable-result.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unnecessary-type-guard.d.mts","sourceRoot":"","sources":["../../src/rules/no-unnecessary-type-guard.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-unnecessary-type-guard.d.mts","sourceRoot":"","sources":["../../src/rules/no-unnecessary-type-guard.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAWlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,+DAA+D;QAC/D,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,kBAAkB,CAAC;AA2FpE,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAmNhE,CAAC"}
|