eslint-config-typed 5.4.2 → 5.5.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/dist/plugins/strict-dependencies/rules/strict-dependencies.mjs +1 -1
- package/dist/plugins/strict-dependencies/rules/strict-dependencies.mjs.map +1 -1
- package/dist/plugins/ts-data-forge/rules/ast-utils.d.mts +25 -0
- package/dist/plugins/ts-data-forge/rules/ast-utils.d.mts.map +1 -1
- package/dist/plugins/ts-data-forge/rules/ast-utils.mjs +62 -1
- package/dist/plugins/ts-data-forge/rules/ast-utils.mjs.map +1 -1
- package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.d.mts.map +1 -1
- package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mjs +25 -8
- package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mjs.map +1 -1
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.d.mts +6 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.d.mts.map +1 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.mjs +98 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.mjs.map +1 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-fixed-length-array.d.mts +6 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-fixed-length-array.d.mts.map +1 -0
- package/dist/plugins/ts-data-forge/rules/{prefer-arr-is-array-of-length.mjs → prefer-arr-is-fixed-length-array.mjs} +7 -7
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-fixed-length-array.mjs.map +1 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.d.mts +6 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.d.mts.map +1 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.mjs +98 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.mjs.map +1 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-min-length-array.d.mts +6 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-min-length-array.d.mts.map +1 -0
- package/dist/plugins/ts-data-forge/rules/{prefer-arr-is-array-at-least-length.mjs → prefer-arr-is-min-length-array.mjs} +12 -12
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-min-length-array.mjs.map +1 -0
- package/dist/plugins/ts-data-forge/rules/prefer-arr-sum.mjs +2 -2
- package/dist/plugins/ts-data-forge/rules/prefer-arr-sum.mjs.map +1 -1
- package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.d.mts.map +1 -1
- package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mjs +5 -1
- package/dist/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mjs.map +1 -1
- package/dist/plugins/ts-data-forge/rules/prefer-range-for-loop.mjs +1 -1
- package/dist/plugins/ts-data-forge/rules/prefer-range-for-loop.mjs.map +1 -1
- package/dist/plugins/ts-data-forge/rules/rules.d.mts +4 -2
- package/dist/plugins/ts-data-forge/rules/rules.d.mts.map +1 -1
- package/dist/plugins/ts-data-forge/rules/rules.mjs +8 -4
- package/dist/plugins/ts-data-forge/rules/rules.mjs.map +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-false-over-assert-negation.mjs +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-false-over-assert-negation.mjs.map +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-false-over-expect-false.mjs +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-false-over-expect-false.mjs.map +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-true-over-assert-negated-is-false.mjs +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-true-over-assert-negated-is-false.mjs.map +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-true-over-expect-true.mjs +1 -1
- package/dist/plugins/vitest-coding-style/rules/prefer-assert-is-true-over-expect-true.mjs.map +1 -1
- package/dist/rules/eslint-ts-data-forge-rules.d.mts +4 -2
- package/dist/rules/eslint-ts-data-forge-rules.d.mts.map +1 -1
- package/dist/rules/eslint-ts-data-forge-rules.mjs +4 -2
- package/dist/rules/eslint-ts-data-forge-rules.mjs.map +1 -1
- package/dist/types/rules/eslint-ts-data-forge-rules.d.mts +36 -6
- package/dist/types/rules/eslint-ts-data-forge-rules.d.mts.map +1 -1
- package/package.json +4 -4
- package/src/plugins/strict-dependencies/rules/strict-dependencies.mts +1 -1
- package/src/plugins/ts-data-forge/rules/ast-utils.mts +94 -0
- package/src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts +32 -9
- package/src/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.mts +143 -0
- package/src/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.test.mts +154 -0
- package/src/plugins/ts-data-forge/rules/{prefer-arr-is-array-of-length.mts → prefer-arr-is-fixed-length-array.mts} +7 -7
- package/src/plugins/ts-data-forge/rules/{prefer-arr-is-array-of-length.test.mts → prefer-arr-is-fixed-length-array.test.mts} +29 -29
- package/src/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.mts +141 -0
- package/src/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.test.mts +188 -0
- package/src/plugins/ts-data-forge/rules/{prefer-arr-is-array-at-least-length.mts → prefer-arr-is-min-length-array.mts} +16 -20
- package/src/plugins/ts-data-forge/rules/prefer-arr-is-min-length-array.test.mts +202 -0
- package/src/plugins/ts-data-forge/rules/prefer-arr-sum.mts +2 -2
- package/src/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.mts +8 -1
- package/src/plugins/ts-data-forge/rules/prefer-canonical-array-slicing.test.mts +6 -6
- package/src/plugins/ts-data-forge/rules/prefer-range-for-loop.mts +1 -1
- package/src/plugins/ts-data-forge/rules/rules.mts +8 -4
- package/src/plugins/vitest-coding-style/rules/prefer-assert-is-false-over-assert-negation.mts +1 -1
- package/src/plugins/vitest-coding-style/rules/prefer-assert-is-false-over-expect-false.mts +1 -1
- package/src/plugins/vitest-coding-style/rules/prefer-assert-is-true-over-assert-negated-is-false.mts +1 -1
- package/src/plugins/vitest-coding-style/rules/prefer-assert-is-true-over-expect-true.mts +1 -1
- package/src/rules/eslint-ts-data-forge-rules.mts +4 -2
- package/src/types/rules/eslint-ts-data-forge-rules.mts +38 -6
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.d.mts +0 -6
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.d.mts.map +0 -1
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.mjs.map +0 -1
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-of-length.d.mts +0 -6
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-of-length.d.mts.map +0 -1
- package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-of-length.mjs.map +0 -1
- package/src/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.test.mts +0 -206
|
@@ -63,7 +63,7 @@ const strictDependenciesRule = {
|
|
|
63
63
|
create: (context) => {
|
|
64
64
|
const ruleOptions = context.options;
|
|
65
65
|
const dependencies = ruleOptions[0];
|
|
66
|
-
const options = Arr.
|
|
66
|
+
const options = Arr.isMinLengthTuple(ruleOptions, 2)
|
|
67
67
|
? ruleOptions[1]
|
|
68
68
|
: {};
|
|
69
69
|
const resolveRelativeImport = options.resolveRelativeImport;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strict-dependencies.mjs","sources":["../../../../src/plugins/strict-dependencies/rules/strict-dependencies.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AA+BO,MAAM,sBAAsB,GAG/B;AACF,IAAA,IAAI,EAAE;AACJ,QAAA,IAAI,EAAE,YAAY;AAClB,QAAA,QAAQ,EAAE;AACR,YAAA,4BAA4B,EAC1B,iEAAiE;AACnE,YAAA,kBAAkB,EAChB,uDAAuD;AAC1D,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE;AACL,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,oBAAoB,EAAE,KAAK;AAC3B,oBAAA,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,CAAC;AAC1C,oBAAA,UAAU,EAAE;AACV,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,QAAQ;AACf,yBAAA;AACD,wBAAA,kBAAkB,EAAE;AAClB,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,KAAK,EAAE;AACL,gCAAA,IAAI,EAAE,QAAQ;AACf,6BAAA;AACF,yBAAA;AACD,wBAAA,eAAe,EAAE;AACf,4BAAA,IAAI,EAAE,SAAS;AAChB,yBAAA;AACD,wBAAA,aAAa,EAAE;AACb,4BAAA,IAAI,EAAE,OAAO;AACb,4BAAA,KAAK,EAAE;AACL,gCAAA,IAAI,EAAE,QAAQ;AACf,6BAAA;AACF,yBAAA;AACD,wBAAA,uBAAuB,EAAE;AACvB,4BAAA,IAAI,EAAE,SAAS;AAChB,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,oBAAoB,EAAE,KAAK;AAC3B,gBAAA,UAAU,EAAE;AACV,oBAAA,qBAAqB,EAAE;AACrB,wBAAA,IAAI,EAAE,SAAS;AAChB,qBAAA;AACD,oBAAA,YAAY,EAAE;AACZ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,oBAAoB,EAAE;AACpB,4BAAA,IAAI,EAAE,QAAQ;AACf,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;AACF,SAAA;AACF,KAAA;AAED,IAAA,MAAM,EAAE,CAAC,OAAO,KAAI;AAClB,QAAA,MAAM,WAAW,GAAgB,OAAO,CAAC,OAAO;AAEhD,QAAA,MAAM,YAAY,GAAiB,WAAW,CAAC,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAY,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"strict-dependencies.mjs","sources":["../../../../src/plugins/strict-dependencies/rules/strict-dependencies.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,29 @@
|
|
|
1
1
|
import { type TSESLint, type TSESTree } from '@typescript-eslint/utils';
|
|
2
2
|
import { type DeepReadonly } from 'ts-type-forge';
|
|
3
3
|
export declare const isIntegerLiteralOrConstant: (node: DeepReadonly<TSESTree.Expression>, sourceCode: TSESLint.SourceCode) => boolean;
|
|
4
|
+
export declare const isLengthAccess: (node: DeepReadonly<TSESTree.Expression>) => node is TSESTree.MemberExpression;
|
|
5
|
+
type LengthComparison = Readonly<{
|
|
6
|
+
array: TSESTree.Expression;
|
|
7
|
+
bound: TSESTree.Expression;
|
|
8
|
+
kind: 'max' | 'min';
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Parses a `<array>.length <op> <bound>` comparison (in either operand order)
|
|
12
|
+
* into its array expression, integer-literal/`const` `bound`, and whether it is
|
|
13
|
+
* a lower (`min`) or upper (`max`) length bound. Returns `undefined` for
|
|
14
|
+
* anything else.
|
|
15
|
+
*
|
|
16
|
+
* - `xs.length >= n` / `n <= xs.length` → `min`
|
|
17
|
+
* - `xs.length <= n` / `n >= xs.length` → `max`
|
|
18
|
+
*/
|
|
19
|
+
export declare const parseLengthComparison: (node: TSESTree.Expression, sourceCode: TSESLint.SourceCode) => LengthComparison | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* `true` when `node` is one operand of an `a && b` whose other operand is the
|
|
22
|
+
* complementary length bound (`min` vs `max`) on the same array — i.e. the two
|
|
23
|
+
* together form the `Arr.isBoundedLengthArray` pattern handled by
|
|
24
|
+
* `prefer-arr-is-bounded-length-array`. The single-bound rules skip such
|
|
25
|
+
* operands so the bounded rule rewrites the whole `&&` instead of the parts.
|
|
26
|
+
*/
|
|
27
|
+
export declare const isPartOfBoundedLengthCheck: (node: TSESTree.BinaryExpression, sourceCode: TSESLint.SourceCode) => boolean;
|
|
28
|
+
export {};
|
|
4
29
|
//# sourceMappingURL=ast-utils.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAOlD,eAAO,MAAM,0BAA0B,GACrC,MAAM,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAEvC,YAAY,QAAQ,CAAC,UAAU,KAC9B,OAgCF,CAAC"}
|
|
1
|
+
{"version":3,"file":"ast-utils.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAOlD,eAAO,MAAM,0BAA0B,GACrC,MAAM,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,EAEvC,YAAY,QAAQ,CAAC,UAAU,KAC9B,OAgCF,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,MAAM,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,KACtC,IAAI,IAAI,QAAQ,CAAC,gBAGa,CAAC;AAElC,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;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAEhC,MAAM,QAAQ,CAAC,UAAU,EAEzB,YAAY,QAAQ,CAAC,UAAU,KAC9B,gBAAgB,GAAG,SA2BrB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,GAErC,MAAM,QAAQ,CAAC,gBAAgB,EAE/B,YAAY,QAAQ,CAAC,UAAU,KAC9B,OAwBF,CAAC"}
|
|
@@ -35,6 +35,67 @@ sourceCode) => {
|
|
|
35
35
|
return false;
|
|
36
36
|
return isIntegerLiteral(def.node.init);
|
|
37
37
|
};
|
|
38
|
+
const isLengthAccess = (node) => node.type === AST_NODE_TYPES.MemberExpression &&
|
|
39
|
+
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
40
|
+
node.property.name === 'length';
|
|
41
|
+
/**
|
|
42
|
+
* Parses a `<array>.length <op> <bound>` comparison (in either operand order)
|
|
43
|
+
* into its array expression, integer-literal/`const` `bound`, and whether it is
|
|
44
|
+
* a lower (`min`) or upper (`max`) length bound. Returns `undefined` for
|
|
45
|
+
* anything else.
|
|
46
|
+
*
|
|
47
|
+
* - `xs.length >= n` / `n <= xs.length` → `min`
|
|
48
|
+
* - `xs.length <= n` / `n >= xs.length` → `max`
|
|
49
|
+
*/
|
|
50
|
+
const parseLengthComparison = (
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
52
|
+
node,
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
54
|
+
sourceCode) => {
|
|
55
|
+
if (node.type !== AST_NODE_TYPES.BinaryExpression ||
|
|
56
|
+
(node.operator !== '>=' && node.operator !== '<=')) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const { left, right, operator } = node;
|
|
60
|
+
const lengthOnLeft = isLengthAccess(left);
|
|
61
|
+
const lengthSide = lengthOnLeft ? left : right;
|
|
62
|
+
const boundSide = lengthOnLeft ? right : left;
|
|
63
|
+
if (!isLengthAccess(lengthSide))
|
|
64
|
+
return undefined;
|
|
65
|
+
if (!isIntegerLiteralOrConstant(boundSide, sourceCode))
|
|
66
|
+
return undefined;
|
|
67
|
+
const kind = (lengthOnLeft ? operator === '>=' : operator === '<=')
|
|
68
|
+
? 'min'
|
|
69
|
+
: 'max';
|
|
70
|
+
return { array: lengthSide.object, bound: boundSide, kind };
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* `true` when `node` is one operand of an `a && b` whose other operand is the
|
|
74
|
+
* complementary length bound (`min` vs `max`) on the same array — i.e. the two
|
|
75
|
+
* together form the `Arr.isBoundedLengthArray` pattern handled by
|
|
76
|
+
* `prefer-arr-is-bounded-length-array`. The single-bound rules skip such
|
|
77
|
+
* operands so the bounded rule rewrites the whole `&&` instead of the parts.
|
|
78
|
+
*/
|
|
79
|
+
const isPartOfBoundedLengthCheck = (
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
81
|
+
node,
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
83
|
+
sourceCode) => {
|
|
84
|
+
const { parent } = node;
|
|
85
|
+
if (parent.type !== AST_NODE_TYPES.LogicalExpression ||
|
|
86
|
+
parent.operator !== '&&') {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
const self = parseLengthComparison(node, sourceCode);
|
|
90
|
+
if (self === undefined)
|
|
91
|
+
return false;
|
|
92
|
+
const sibling = parent.left === node ? parent.right : parent.left;
|
|
93
|
+
const other = parseLengthComparison(sibling, sourceCode);
|
|
94
|
+
if (other === undefined)
|
|
95
|
+
return false;
|
|
96
|
+
return (self.kind !== other.kind &&
|
|
97
|
+
sourceCode.getText(self.array) === sourceCode.getText(other.array));
|
|
98
|
+
};
|
|
38
99
|
const isVariableDefinition = (
|
|
39
100
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
40
101
|
def) => def.type === 'Variable';
|
|
@@ -49,5 +110,5 @@ scope, name) => {
|
|
|
49
110
|
return findVariable(scope.upper, name);
|
|
50
111
|
};
|
|
51
112
|
|
|
52
|
-
export { isIntegerLiteralOrConstant };
|
|
113
|
+
export { isIntegerLiteralOrConstant, isLengthAccess, isPartOfBoundedLengthCheck, parseLengthComparison };
|
|
53
114
|
//# sourceMappingURL=ast-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/ast-utils.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAOA,MAAM,gBAAgB,GAAG,CAAC,IAAuC,KAC/D,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;AACpC,IAAA,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;AAC9B,IAAA,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AAEvB,MAAM,0BAA0B,GAAG,CACxC,IAAuC;AACvC;AACA,UAA+B,KACpB;;IAEX,IAAI,gBAAgB,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;;AAGvC,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;AAAE,QAAA,OAAO,KAAK;;IAGzD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAqB,CAAC;IAExD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;IAE/C,IAAI,QAAQ,KAAK,SAAS;AAAE,QAAA,OAAO,KAAK;;AAGxC,IAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAE5C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAE5B,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,KAAK;AAEnC,IAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,KAAK;AAE5C,IAAA,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;AAAE,QAAA,OAAO,KAAK;AAE7C,IAAA,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI;AAAE,QAAA,OAAO,KAAK;;;IAIvC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,KAAK,SAAS;AAAE,QAAA,OAAO,KAAK;IAE1D,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC;AAQA,MAAM,oBAAoB,GAAG;AAC3B;AACA,GAA8B,KAE7B,GAAG,CAAC,IAAe,KAAK,UAAU;AAErC,MAAM,YAAY,GAAG;AACnB;AACA,KAA2B,EAC3B,IAAY,KAC2B;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;IAEpC,IAAI,QAAQ,KAAK,SAAS;AAAE,QAAA,OAAO,QAAQ;AAE3C,IAAA,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,SAAS;IAE1C,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;AACxC,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"ast-utils.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/ast-utils.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unnecessary-type-guard.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAUlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"no-unnecessary-type-guard.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAUlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,kBAAkB,CAAC;AA+FpE,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAoRhE,CAAC"}
|
|
@@ -4,11 +4,17 @@ import { getTsDataForgeImport, buildCalleeResolver, getImportedLocalName, buildI
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Internal marker property attached to every `ts-type-forge` branded type. Its
|
|
7
|
-
* presence (together with the brand key) lets us recognize a
|
|
8
|
-
* without holding a reference to the type itself.
|
|
7
|
+
* presence (together with the `MinLength` brand key) lets us recognize a
|
|
8
|
+
* `NonEmptyString` without holding a reference to the type itself.
|
|
9
9
|
*/
|
|
10
10
|
const BRAND_MARKER_PROPERTY = 'TSTypeForgeInternals--edd2f9ce-7ca5-45b0-9d1a-bd61b9b5d9c3';
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Brand key carried by `MinLengthString<N>` — and therefore by
|
|
13
|
+
* `NonEmptyString = MinLengthString<1>`. Its value is `MinLengthTuple<N, 0>`, a
|
|
14
|
+
* tuple of `0`s with at least `N` elements, so a required first element means
|
|
15
|
+
* `N >= 1` (the string cannot be empty).
|
|
16
|
+
*/
|
|
17
|
+
const MIN_LENGTH_BRAND_KEY = 'MinLength';
|
|
12
18
|
const NULLISH_REPLACEMENTS_EXCLUDE = {
|
|
13
19
|
undefined: 'isNotUndefined',
|
|
14
20
|
null: 'isNotNull',
|
|
@@ -217,7 +223,7 @@ const noUnnecessaryTypeGuard = {
|
|
|
217
223
|
reportConstant(node, canonicalName, false, argument);
|
|
218
224
|
break;
|
|
219
225
|
}
|
|
220
|
-
if (
|
|
226
|
+
if (nonNullishParts.some((p) => !isGuaranteedNonEmptyString(p, checker))) {
|
|
221
227
|
break; // still does real string/empty work
|
|
222
228
|
}
|
|
223
229
|
if (hasNullish) {
|
|
@@ -290,14 +296,25 @@ const ATOM_ORDER = [
|
|
|
290
296
|
const joinAtoms = (atoms) => ATOM_ORDER.filter((atom) => atoms.includes(atom)).join('|');
|
|
291
297
|
/**
|
|
292
298
|
* Returns `true` when the type is guaranteed to be a non-empty string: either a
|
|
293
|
-
* non-empty string literal or a value branded as `NonEmptyString
|
|
299
|
+
* non-empty string literal or a value branded as `NonEmptyString`
|
|
300
|
+
* (`MinLengthString<N>` with `N >= 1`).
|
|
294
301
|
*/
|
|
302
|
+
const isGuaranteedNonEmptyString = (
|
|
303
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
304
|
+
type,
|
|
295
305
|
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
296
|
-
|
|
306
|
+
checker) => {
|
|
297
307
|
if (type.isStringLiteral())
|
|
298
308
|
return type.value !== '';
|
|
299
|
-
|
|
300
|
-
|
|
309
|
+
if (type.getProperty(BRAND_MARKER_PROPERTY) === undefined)
|
|
310
|
+
return false;
|
|
311
|
+
const minLengthSymbol = type.getProperty(MIN_LENGTH_BRAND_KEY);
|
|
312
|
+
if (minLengthSymbol === undefined)
|
|
313
|
+
return false;
|
|
314
|
+
// The `MinLength` brand value is `MinLengthTuple<N, 0>`; it has a required
|
|
315
|
+
// first element (`'0'`) exactly when `N >= 1`, i.e. the string is non-empty.
|
|
316
|
+
// `MinLengthString<0>` brands with a plain array and has no such element.
|
|
317
|
+
return (checker.getTypeOfSymbol(minLengthSymbol).getProperty('0') !== undefined);
|
|
301
318
|
};
|
|
302
319
|
/**
|
|
303
320
|
* Returns `true` when the type can possibly be a non-empty string (a general
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-unnecessary-type-guard.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAqDA;;;;AAIG;AACH,MAAM,qBAAqB,GACzB,4DAA4D;AAE9D,MAAM,
|
|
1
|
+
{"version":3,"file":"no-unnecessary-type-guard.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type Options = readonly [];
|
|
3
|
+
type MessageIds = 'useIsBoundedLengthArray';
|
|
4
|
+
export declare const preferArrIsBoundedLengthArray: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-arr-is-bounded-length-array.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-bounded-length-array.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AAQxE,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,yBAAyB,CAAC;AAE5C,eAAO,MAAM,6BAA6B,EAAE,QAAQ,CAAC,UAAU,CAC7D,UAAU,EACV,OAAO,CAgIC,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { parseLengthComparison } from './ast-utils.mjs';
|
|
2
|
+
import { getTsDataForgeImport, getNamedImports, buildImportFixes } from './import-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const preferArrIsBoundedLengthArray = {
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'suggestion',
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Replace `xs.length >= min && xs.length <= max` with `Arr.isBoundedLengthArray(xs, min, max)` from ts-data-forge.',
|
|
9
|
+
},
|
|
10
|
+
fixable: 'code',
|
|
11
|
+
schema: [],
|
|
12
|
+
messages: {
|
|
13
|
+
useIsBoundedLengthArray: 'Replace `{{original}}` with `Arr.isBoundedLengthArray({{arrayName}}, {{min}}, {{max}})` from ts-data-forge.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
create: (context) => {
|
|
17
|
+
const sourceCode = context.sourceCode;
|
|
18
|
+
const program = sourceCode.ast;
|
|
19
|
+
const tsDataForgeImport = getTsDataForgeImport(program);
|
|
20
|
+
const services = context.sourceCode.parserServices;
|
|
21
|
+
const mut_nodesToFix = [];
|
|
22
|
+
return {
|
|
23
|
+
LogicalExpression: (node) => {
|
|
24
|
+
// Only `a && b` can encode a `min && max` length range.
|
|
25
|
+
if (node.operator !== '&&')
|
|
26
|
+
return;
|
|
27
|
+
const left = parseLengthComparison(node.left, sourceCode);
|
|
28
|
+
const right = parseLengthComparison(node.right, sourceCode);
|
|
29
|
+
if (left === undefined || right === undefined)
|
|
30
|
+
return;
|
|
31
|
+
// Need one lower bound and one upper bound on the same array.
|
|
32
|
+
if (left.kind === right.kind)
|
|
33
|
+
return;
|
|
34
|
+
if (sourceCode.getText(left.array) !== sourceCode.getText(right.array)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const min = left.kind === 'min' ? left : right;
|
|
38
|
+
const max = left.kind === 'min' ? right : left;
|
|
39
|
+
const arrayExpression = min.array;
|
|
40
|
+
// Check if arrayExpression is actually an array type
|
|
41
|
+
if (services?.program !== undefined && services.program !== null) {
|
|
42
|
+
const checker = services.program.getTypeChecker();
|
|
43
|
+
const tsNode = services.esTreeNodeToTSNodeMap?.get(arrayExpression);
|
|
44
|
+
if (tsNode !== undefined) {
|
|
45
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
46
|
+
// Check if it's an array type or tuple type
|
|
47
|
+
const isArrayType = checker.isArrayType(type) || checker.isTupleType(type);
|
|
48
|
+
if (!isArrayType)
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
mut_nodesToFix.push({
|
|
59
|
+
node,
|
|
60
|
+
arrayExpression,
|
|
61
|
+
minExpression: min.bound,
|
|
62
|
+
maxExpression: max.bound,
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
'Program:exit': () => {
|
|
66
|
+
const namedImports = getNamedImports(tsDataForgeImport);
|
|
67
|
+
const hasArrImport = namedImports.includes('Arr');
|
|
68
|
+
for (const [index, { node, arrayExpression, minExpression, maxExpression },] of mut_nodesToFix.entries()) {
|
|
69
|
+
const arrayText = sourceCode.getText(arrayExpression);
|
|
70
|
+
const minText = sourceCode.getText(minExpression);
|
|
71
|
+
const maxText = sourceCode.getText(maxExpression);
|
|
72
|
+
const originalText = sourceCode.getText(node);
|
|
73
|
+
context.report({
|
|
74
|
+
node,
|
|
75
|
+
messageId: 'useIsBoundedLengthArray',
|
|
76
|
+
data: {
|
|
77
|
+
original: originalText,
|
|
78
|
+
arrayName: arrayText,
|
|
79
|
+
min: minText,
|
|
80
|
+
max: maxText,
|
|
81
|
+
},
|
|
82
|
+
fix: (fixer) => {
|
|
83
|
+
const replacement = `Arr.isBoundedLengthArray(${arrayText}, ${minText}, ${maxText})`;
|
|
84
|
+
const importFixes = index === 0 && !hasArrImport
|
|
85
|
+
? buildImportFixes(fixer, program, tsDataForgeImport, ['Arr'])
|
|
86
|
+
: [];
|
|
87
|
+
return [...importFixes, fixer.replaceText(node, replacement)];
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
defaultOptions: [],
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { preferArrIsBoundedLengthArray };
|
|
98
|
+
//# sourceMappingURL=prefer-arr-is-bounded-length-array.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-bounded-length-array.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-bounded-length-array.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type Options = readonly [];
|
|
3
|
+
type MessageIds = 'useIsFixedLengthArray';
|
|
4
|
+
export declare const preferArrIsFixedLengthArray: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-arr-is-fixed-length-array.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-fixed-length-array.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-fixed-length-array.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AASlC,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,uBAAuB,CAAC;AAE1C,eAAO,MAAM,2BAA2B,EAAE,QAAQ,CAAC,UAAU,CAC3D,UAAU,EACV,OAAO,CA0HC,CAAC"}
|
|
@@ -2,16 +2,16 @@ import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
|
2
2
|
import { isIntegerLiteralOrConstant } from './ast-utils.mjs';
|
|
3
3
|
import { getTsDataForgeImport, getNamedImports, buildImportFixes } from './import-utils.mjs';
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const preferArrIsFixedLengthArray = {
|
|
6
6
|
meta: {
|
|
7
7
|
type: 'suggestion',
|
|
8
8
|
docs: {
|
|
9
|
-
description: 'Replace `xs.length === n` with `Arr.
|
|
9
|
+
description: 'Replace `xs.length === n` with `Arr.isFixedLengthArray(xs, n)` from ts-data-forge.',
|
|
10
10
|
},
|
|
11
11
|
fixable: 'code',
|
|
12
12
|
schema: [],
|
|
13
13
|
messages: {
|
|
14
|
-
|
|
14
|
+
useIsFixedLengthArray: 'Replace `{{original}}` with `Arr.isFixedLengthArray({{arrayName}}, {{length}})` from ts-data-forge.',
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
create: (context) => {
|
|
@@ -70,14 +70,14 @@ const preferArrIsArrayOfLength = {
|
|
|
70
70
|
const originalText = sourceCode.getText(node);
|
|
71
71
|
context.report({
|
|
72
72
|
node,
|
|
73
|
-
messageId: '
|
|
73
|
+
messageId: 'useIsFixedLengthArray',
|
|
74
74
|
data: {
|
|
75
75
|
original: originalText,
|
|
76
76
|
arrayName: arrayText,
|
|
77
77
|
length: lengthText,
|
|
78
78
|
},
|
|
79
79
|
fix: (fixer) => {
|
|
80
|
-
const baseCall = `Arr.
|
|
80
|
+
const baseCall = `Arr.isFixedLengthArray(${arrayText}, ${lengthText})`;
|
|
81
81
|
const replacement = isNegated ? `!${baseCall}` : baseCall;
|
|
82
82
|
const importFixes = index === 0 && !hasArrImport
|
|
83
83
|
? buildImportFixes(fixer, program, tsDataForgeImport, ['Arr'])
|
|
@@ -95,5 +95,5 @@ const isLengthAccess = (node) => node.type === AST_NODE_TYPES.MemberExpression &
|
|
|
95
95
|
node.property.type === AST_NODE_TYPES.Identifier &&
|
|
96
96
|
node.property.name === 'length';
|
|
97
97
|
|
|
98
|
-
export {
|
|
99
|
-
//# sourceMappingURL=prefer-arr-is-
|
|
98
|
+
export { preferArrIsFixedLengthArray };
|
|
99
|
+
//# sourceMappingURL=prefer-arr-is-fixed-length-array.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-fixed-length-array.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-fixed-length-array.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type Options = readonly [];
|
|
3
|
+
type MessageIds = 'useIsMaxLengthArray';
|
|
4
|
+
export declare const preferArrIsMaxLengthArray: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-arr-is-max-length-array.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-max-length-array.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AAYxE,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,qBAAqB,CAAC;AAExC,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,UAAU,CACzD,UAAU,EACV,OAAO,CA0HC,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { isPartOfBoundedLengthCheck, isLengthAccess, isIntegerLiteralOrConstant } from './ast-utils.mjs';
|
|
2
|
+
import { getTsDataForgeImport, getNamedImports, buildImportFixes } from './import-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const preferArrIsMaxLengthArray = {
|
|
5
|
+
meta: {
|
|
6
|
+
type: 'suggestion',
|
|
7
|
+
docs: {
|
|
8
|
+
description: 'Replace `xs.length <= n` with `Arr.isMaxLengthArray(xs, n)` from ts-data-forge.',
|
|
9
|
+
},
|
|
10
|
+
fixable: 'code',
|
|
11
|
+
schema: [],
|
|
12
|
+
messages: {
|
|
13
|
+
useIsMaxLengthArray: 'Replace `{{original}}` with `Arr.isMaxLengthArray({{arrayName}}, {{length}})` from ts-data-forge.',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
create: (context) => {
|
|
17
|
+
const sourceCode = context.sourceCode;
|
|
18
|
+
const program = sourceCode.ast;
|
|
19
|
+
const tsDataForgeImport = getTsDataForgeImport(program);
|
|
20
|
+
const services = context.sourceCode.parserServices;
|
|
21
|
+
const mut_nodesToFix = [];
|
|
22
|
+
return {
|
|
23
|
+
BinaryExpression: (node) => {
|
|
24
|
+
// Check for `xs.length <= n` or `n >= xs.length`
|
|
25
|
+
if (node.operator !== '>=' && node.operator !== '<=')
|
|
26
|
+
return;
|
|
27
|
+
// Defer to `prefer-arr-is-bounded-length-array` when this comparison is
|
|
28
|
+
// the upper bound of a `min && max` pair on the same array.
|
|
29
|
+
if (isPartOfBoundedLengthCheck(node, sourceCode))
|
|
30
|
+
return;
|
|
31
|
+
// xs.length <= n or n >= xs.length
|
|
32
|
+
const isLengthOnLeft = node.operator === '<=';
|
|
33
|
+
const lengthSide = node[isLengthOnLeft ? 'left' : 'right'];
|
|
34
|
+
const valueSide = node[isLengthOnLeft ? 'right' : 'left'];
|
|
35
|
+
// Check if lengthSide is accessing .length
|
|
36
|
+
if (!isLengthAccess(lengthSide))
|
|
37
|
+
return;
|
|
38
|
+
// Only match integer literals or const variables initialized with integer literals
|
|
39
|
+
if (!isIntegerLiteralOrConstant(valueSide, sourceCode))
|
|
40
|
+
return;
|
|
41
|
+
// lengthSide is MemberExpression accessing .length
|
|
42
|
+
const arrayExpression = lengthSide.object;
|
|
43
|
+
// Check if arrayExpression is actually an array type
|
|
44
|
+
if (services?.program !== undefined && services.program !== null) {
|
|
45
|
+
const checker = services.program.getTypeChecker();
|
|
46
|
+
const tsNode = services.esTreeNodeToTSNodeMap?.get(arrayExpression);
|
|
47
|
+
if (tsNode !== undefined) {
|
|
48
|
+
const type = checker.getTypeAtLocation(tsNode);
|
|
49
|
+
// Check if it's an array type or tuple type
|
|
50
|
+
const isArrayType = checker.isArrayType(type) || checker.isTupleType(type);
|
|
51
|
+
if (!isArrayType)
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
mut_nodesToFix.push({
|
|
62
|
+
node,
|
|
63
|
+
arrayExpression,
|
|
64
|
+
lengthExpression: valueSide,
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
'Program:exit': () => {
|
|
68
|
+
const namedImports = getNamedImports(tsDataForgeImport);
|
|
69
|
+
const hasArrImport = namedImports.includes('Arr');
|
|
70
|
+
for (const [index, { node, arrayExpression, lengthExpression },] of mut_nodesToFix.entries()) {
|
|
71
|
+
const arrayText = sourceCode.getText(arrayExpression);
|
|
72
|
+
const lengthText = sourceCode.getText(lengthExpression);
|
|
73
|
+
const originalText = sourceCode.getText(node);
|
|
74
|
+
context.report({
|
|
75
|
+
node,
|
|
76
|
+
messageId: 'useIsMaxLengthArray',
|
|
77
|
+
data: {
|
|
78
|
+
original: originalText,
|
|
79
|
+
arrayName: arrayText,
|
|
80
|
+
length: lengthText,
|
|
81
|
+
},
|
|
82
|
+
fix: (fixer) => {
|
|
83
|
+
const replacement = `Arr.isMaxLengthArray(${arrayText}, ${lengthText})`;
|
|
84
|
+
const importFixes = index === 0 && !hasArrImport
|
|
85
|
+
? buildImportFixes(fixer, program, tsDataForgeImport, ['Arr'])
|
|
86
|
+
: [];
|
|
87
|
+
return [...importFixes, fixer.replaceText(node, replacement)];
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
defaultOptions: [],
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { preferArrIsMaxLengthArray };
|
|
98
|
+
//# sourceMappingURL=prefer-arr-is-max-length-array.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-max-length-array.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-max-length-array.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type TSESLint } from '@typescript-eslint/utils';
|
|
2
|
+
type Options = readonly [];
|
|
3
|
+
type MessageIds = 'useIsMinLengthArray';
|
|
4
|
+
export declare const preferArrIsMinLengthArray: TSESLint.RuleModule<MessageIds, Options>;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=prefer-arr-is-min-length-array.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-arr-is-min-length-array.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/prefer-arr-is-min-length-array.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,0BAA0B,CAAC;AAYxE,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,qBAAqB,CAAC;AAExC,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,UAAU,CACzD,UAAU,EACV,OAAO,CA0HC,CAAC"}
|