eslint-rule-forge 0.4.0 → 0.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/README.md +17 -9
- package/dist/bindings.d.mts +4 -5
- package/dist/bindings.d.mts.map +1 -1
- package/dist/bindings.mjs +0 -1
- package/dist/bindings.mjs.map +1 -1
- package/dist/imports.d.mts +36 -17
- package/dist/imports.d.mts.map +1 -1
- package/dist/imports.mjs +92 -13
- package/dist/imports.mjs.map +1 -1
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/negation.d.mts +8 -9
- package/dist/negation.d.mts.map +1 -1
- package/dist/negation.mjs +18 -18
- package/dist/negation.mjs.map +1 -1
- package/dist/rules/prefer-is-non-null-object.mjs +51 -51
- package/dist/rules/prefer-is-non-null-object.mjs.map +1 -1
- package/dist/rules/prefer-safe-parse.d.mts +10 -7
- package/dist/rules/prefer-safe-parse.d.mts.map +1 -1
- package/dist/rules/prefer-safe-parse.mjs +41 -26
- package/dist/rules/prefer-safe-parse.mjs.map +1 -1
- package/dist/statements.d.mts +12 -0
- package/dist/statements.d.mts.map +1 -0
- package/dist/statements.mjs +39 -0
- package/dist/statements.mjs.map +1 -0
- package/dist/type-wrappers.d.mts +3 -3
- package/package.json +5 -5
- package/src/bindings.mts +4 -5
- package/src/imports.mts +181 -37
- package/src/index.mts +1 -0
- package/src/negation.mts +36 -37
- package/src/rules/prefer-is-non-null-object.mts +70 -70
- package/src/rules/prefer-is-record-and-has-key.mts +5 -5
- package/src/rules/prefer-safe-parse.mts +72 -50
- package/src/statements.mts +57 -0
- package/src/type-wrappers.mts +3 -3
|
@@ -79,40 +79,6 @@ node) => node.parent.type === AST_NODE_TYPES.LogicalExpression &&
|
|
|
79
79
|
|
|
80
80
|
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const findNonNullObjectPairs = (
|
|
85
|
-
|
|
86
|
-
sourceCode,
|
|
87
|
-
|
|
88
|
-
node) => {
|
|
89
|
-
const operands = chainOperands(sourceCode, node);
|
|
90
|
-
const pairsFrom = (index) => {
|
|
91
|
-
const first = operands[index];
|
|
92
|
-
const second = operands[index + 1];
|
|
93
|
-
if (first === undefined || second === undefined) {
|
|
94
|
-
return [];
|
|
95
|
-
}
|
|
96
|
-
const identifierName = pairIdentifierName(first, second) ?? pairIdentifierName(second, first);
|
|
97
|
-
return identifierName === undefined
|
|
98
|
-
? pairsFrom(index + 1)
|
|
99
|
-
: [
|
|
100
|
-
{
|
|
101
|
-
range: [
|
|
102
|
-
getRangeWithParens(sourceCode, first)[0],
|
|
103
|
-
getRangeWithParens(sourceCode, second)[1],
|
|
104
|
-
],
|
|
105
|
-
identifierName,
|
|
106
|
-
},
|
|
107
|
-
...pairsFrom(index + 2),
|
|
108
|
-
];
|
|
109
|
-
};
|
|
110
|
-
return pairsFrom(0);
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
82
|
const chainOperands = (
|
|
117
83
|
|
|
118
84
|
sourceCode,
|
|
@@ -124,22 +90,9 @@ node) => [node.left, node.right].flatMap((operand) => operand.type === AST_NODE_
|
|
|
124
90
|
: [operand]);
|
|
125
91
|
|
|
126
92
|
|
|
93
|
+
const isLiteralOf = (
|
|
127
94
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
const pairIdentifierName = (
|
|
132
|
-
|
|
133
|
-
typeofCheck,
|
|
134
|
-
|
|
135
|
-
nullCheck) => {
|
|
136
|
-
const identifierName = getTypeofObjectIdentifierName(skipTypeWrappers(typeofCheck));
|
|
137
|
-
return identifierName !== undefined &&
|
|
138
|
-
identifierName ===
|
|
139
|
-
getNonNullCheckIdentifierName(skipTypeWrappers(nullCheck))
|
|
140
|
-
? identifierName
|
|
141
|
-
: undefined;
|
|
142
|
-
};
|
|
95
|
+
node, value) => node.type === AST_NODE_TYPES.Literal && node.value === value;
|
|
143
96
|
|
|
144
97
|
const getTypeofObjectIdentifierName = (
|
|
145
98
|
|
|
@@ -185,7 +138,54 @@ node) => {
|
|
|
185
138
|
: undefined;
|
|
186
139
|
return checked?.type === AST_NODE_TYPES.Identifier ? checked.name : undefined;
|
|
187
140
|
};
|
|
188
|
-
const isLiteralOf = (
|
|
189
141
|
|
|
190
|
-
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
const pairIdentifierName = (
|
|
146
|
+
|
|
147
|
+
typeofCheck,
|
|
148
|
+
|
|
149
|
+
nullCheck) => {
|
|
150
|
+
const identifierName = getTypeofObjectIdentifierName(skipTypeWrappers(typeofCheck));
|
|
151
|
+
return identifierName !== undefined &&
|
|
152
|
+
identifierName ===
|
|
153
|
+
getNonNullCheckIdentifierName(skipTypeWrappers(nullCheck))
|
|
154
|
+
? identifierName
|
|
155
|
+
: undefined;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
const findNonNullObjectPairs = (
|
|
164
|
+
|
|
165
|
+
sourceCode,
|
|
166
|
+
|
|
167
|
+
node) => {
|
|
168
|
+
const operands = chainOperands(sourceCode, node);
|
|
169
|
+
const pairsFrom = (index) => {
|
|
170
|
+
const first = operands[index];
|
|
171
|
+
const second = operands[index + 1];
|
|
172
|
+
if (first === undefined || second === undefined) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
const identifierName = pairIdentifierName(first, second) ?? pairIdentifierName(second, first);
|
|
176
|
+
return identifierName === undefined
|
|
177
|
+
? pairsFrom(index + 1)
|
|
178
|
+
: [
|
|
179
|
+
{
|
|
180
|
+
range: [
|
|
181
|
+
getRangeWithParens(sourceCode, first)[0],
|
|
182
|
+
getRangeWithParens(sourceCode, second)[1],
|
|
183
|
+
],
|
|
184
|
+
identifierName,
|
|
185
|
+
},
|
|
186
|
+
...pairsFrom(index + 2),
|
|
187
|
+
];
|
|
188
|
+
};
|
|
189
|
+
return pairsFrom(0);
|
|
190
|
+
};
|
|
191
191
|
//# sourceMappingURL=prefer-is-non-null-object.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-is-non-null-object.mjs","sourceRoot":"","sources":["../../src/rules/prefer-is-non-null-object.mts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prefer-is-non-null-object.mjs","sourceRoot":"","sources":["../../src/rules/prefer-is-non-null-object.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,UAAU,GAIV,EAA0D,EAAE,CAC5D,CAAC;IACC,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE;YACJ,WAAW,EAAE,sIAAsI,UAAU,GAAG;SACjK;QACD,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,kBAAkB,EAAE,iEAAiE,UAAU,GAAG;SACnG;QACD,cAAc,EAAE,EAAE;KACnB;IAED,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEtC,MAAM,cAAc,GACmC,EAAE,CAAC;QAE1D,OAAO;YACL,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC1B,iDAAiD;gBACjD,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC/D,OAAO;gBACT,CAAC;gBAED,cAAc,CAAC,IAAI,CACjB,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACzD,GAAG,IAAI;oBACP,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC,CACJ,CAAC;YACJ,CAAC;YACD,cAAc,EAAE,GAAG,EAAE;gBACnB,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE;oBACvD,iBAAiB;iBAClB,CAAC,CAAC;gBAEH,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;gBAEzC,oEAAoE;gBACpE,qDAAqD;gBACrD,KAAK,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;oBAC9D,MAAM,GAAG,GAAG;wBACV,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC3C,GAAG,EAAE,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qBACjC,CAAC;oBAEX,OAAO,CAAC,MAAM,CAAC;wBACb,GAAG;wBACH,SAAS,EAAE,oBAAoB;wBAC/B,GAAG,EACD,OAAO,KAAK,SAAS;4BACrB,SAAS,KAAK,SAAS;4BACvB,iBAAiB,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC;4BACzD,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gCACT,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gCACvB,KAAK,CAAC,gBAAgB,CACpB,KAAK,EACL,GAAG,SAAS,IAAI,cAAc,GAAG,CAClC;6BACF;qBACR,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAU,CAAC;AAYd;;;GAGG;AACH,MAAM,cAAc,GAAG;AACrB,8EAA8E;AAC9E,UAA+B;AAC/B,8EAA8E;AAC9E,IAAgC,EACvB,EAAE,CACX,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,iBAAiB;IACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI;IAC7B,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAE3C;;;GAGG;AACH,MAAM,aAAa,GAAG;AACpB,8EAA8E;AAC9E,UAA+B;AAC/B,8EAA8E;AAC9E,IAAgC,EACA,EAAE,CAClC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC1C,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,iBAAiB;IACjD,OAAO,CAAC,QAAQ,KAAK,IAAI;IACzB,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC;IACzC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC;IACpC,CAAC,CAAC,CAAC,OAAO,CAAC,CACd,CAAC;AAEJ,8EAA8E;AAC9E,2DAA2D;AAE3D,MAAM,WAAW,GAAG;AAClB,8EAA8E;AAC9E,IAAmB,EACnB,KAAoB,EACX,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;AAE3E,+DAA+D;AAC/D,MAAM,6BAA6B,GAAG;AACpC,8EAA8E;AAC9E,IAAmB,EACC,EAAE;IACtB,IACE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;QAC7C,IAAI,CAAC,QAAQ,KAAK,KAAK,EACvB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC;QAC7C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;YAC3B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAEhB,IACE,UAAU,EAAE,IAAI,KAAK,cAAc,CAAC,eAAe;QACnD,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAChC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEvD,OAAO,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAChD,CAAC,CAAC,QAAQ,CAAC,IAAI;QACf,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,6BAA6B,GAAG;AACpC,8EAA8E;AAC9E,IAAmB,EACC,EAAE;IACtB,IACE,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,gBAAgB;QAC7C,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,EACnD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;QACtC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;YACvB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,OAAO,EAAE,IAAI,KAAK,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAAG;AACzB,8EAA8E;AAC9E,WAAgC;AAChC,8EAA8E;AAC9E,SAA8B,EACV,EAAE;IACtB,MAAM,cAAc,GAAG,6BAA6B,CAClD,gBAAgB,CAAC,WAAW,CAAC,CAC9B,CAAC;IAEF,OAAO,cAAc,KAAK,SAAS;QACjC,cAAc;YACZ,6BAA6B,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG;AAC7B,8EAA8E;AAC9E,UAA+B;AAC/B,8EAA8E;AAC9E,IAAgC,EACF,EAAE;IAChC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,CAAC,KAAa,EAAgC,EAAE;QAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,cAAc,GAClB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEzE,OAAO,cAAc,KAAK,SAAS;YACjC,CAAC,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC;gBACE;oBACE,KAAK,EAAE;wBACL,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;wBACxC,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;qBAC1C;oBACD,cAAc;iBACf;gBACD,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;aACxB,CAAC;IACR,CAAC,CAAC;IAEF,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC"}
|
|
@@ -12,20 +12,23 @@ export type SafeParseRuleConfig = Readonly<{
|
|
|
12
12
|
method: string;
|
|
13
13
|
}>;
|
|
14
14
|
/**
|
|
15
|
-
* Builds a rule that
|
|
16
|
-
* `Number.parseInt` — `parseInt(x)` and `parseInt(x, 10)` —
|
|
17
|
-
* `Result.unwrapOkOr(<namespace>.<method>(x), Number.NaN)
|
|
15
|
+
* Builds a rule that reports the base-10 forms of `parseInt` and
|
|
16
|
+
* `Number.parseInt` — `parseInt(x)` and `parseInt(x, 10)` — and suggests
|
|
17
|
+
* `Result.unwrapOkOr(<namespace>.<method>(x), Number.NaN)` instead. A
|
|
18
|
+
* suggestion, not an autofix: the replacement reads some strings differently.
|
|
18
19
|
*
|
|
19
20
|
* A call that passes another radix is left alone: the replacement takes none,
|
|
20
21
|
* so it would mean something the replacement cannot say.
|
|
21
22
|
*/
|
|
22
|
-
export declare const createPreferSafeParseInt: (config: SafeParseRuleConfig) => TSESLint.RuleModule<'useSafeParseInt', readonly []>;
|
|
23
|
+
export declare const createPreferSafeParseInt: (config: SafeParseRuleConfig) => TSESLint.RuleModule<'useSafeParseInt' | 'replaceWithSafeParse', readonly []>;
|
|
23
24
|
/**
|
|
24
|
-
* Builds a rule that
|
|
25
|
-
* `Number(x)
|
|
25
|
+
* Builds a rule that reports `parseFloat(x)`, `Number.parseFloat(x)` and
|
|
26
|
+
* `Number(x)`, and suggests
|
|
27
|
+
* `Result.unwrapOkOr(<namespace>.<method>(x), Number.NaN)` instead, as a
|
|
28
|
+
* suggestion for the same reason.
|
|
26
29
|
*
|
|
27
30
|
* Like every rewrite here, `Number(x)` is only flagged when `x` is purely a
|
|
28
31
|
* `string`, which leaves `Number(someBoolean)` and `Number(someNumber)` alone.
|
|
29
32
|
*/
|
|
30
|
-
export declare const createPreferSafeParseFloat: (config: SafeParseRuleConfig) => TSESLint.RuleModule<'useSafeParseFloat', readonly []>;
|
|
33
|
+
export declare const createPreferSafeParseFloat: (config: SafeParseRuleConfig) => TSESLint.RuleModule<'useSafeParseFloat' | 'replaceWithSafeParse', readonly []>;
|
|
31
34
|
//# sourceMappingURL=prefer-safe-parse.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-safe-parse.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-safe-parse.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAYlC,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH
|
|
1
|
+
{"version":3,"file":"prefer-safe-parse.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-safe-parse.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAYlC,yEAAyE;AACzE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,WAC3B,mBAAmB,KAC1B,QAAQ,CAAC,UAAU,CACpB,iBAAiB,GAAG,sBAAsB,EAC1C,SAAS,EAAE,CAuBT,CAAC;AAEL;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,WAC7B,mBAAmB,KAC1B,QAAQ,CAAC,UAAU,CACpB,mBAAmB,GAAG,sBAAsB,EAC5C,SAAS,EAAE,CAWT,CAAC"}
|
|
@@ -12,6 +12,7 @@ import { isIdentifierNamed, skipTypeWrappers, typeHoldsAtEveryLayer, } from '../
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
|
|
15
16
|
export const createPreferSafeParseInt = (config) => createSafeParseRule(config, 'useSafeParseInt', {
|
|
16
17
|
messages: { useSafeParseInt: messageText(config) },
|
|
17
18
|
description: `Replace \`parseInt(x)\` or \`Number.parseInt(x, 10)\` with \`Result.unwrapOkOr(${config.namespace}.${config.method}(x), Number.NaN)\` from ${config.moduleName}.`,
|
|
@@ -34,6 +35,8 @@ export const createPreferSafeParseInt = (config) => createSafeParseRule(config,
|
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
|
|
38
|
+
|
|
39
|
+
|
|
37
40
|
export const createPreferSafeParseFloat = (config) => createSafeParseRule(config, 'useSafeParseFloat', {
|
|
38
41
|
messages: { useSafeParseFloat: messageText(config) },
|
|
39
42
|
description: `Replace \`parseFloat(x)\`, \`Number.parseFloat(x)\`, or \`Number(x)\` (when x is a string) with \`Result.unwrapOkOr(${config.namespace}.${config.method}(x), Number.NaN)\` from ${config.moduleName}.`,
|
|
@@ -44,6 +47,16 @@ export const createPreferSafeParseFloat = (config) => createSafeParseRule(config
|
|
|
44
47
|
isGlobalCall(callee, 'Number'),
|
|
45
48
|
});
|
|
46
49
|
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
const isStringType = (type) => {
|
|
56
|
+
const parts = type.isUnion() ? type.types : [type];
|
|
57
|
+
return (parts.length > 0 &&
|
|
58
|
+
parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0));
|
|
59
|
+
};
|
|
47
60
|
const createSafeParseRule = ({ moduleName, namespace, method }, messageId, { messages, description, isTarget, }) => {
|
|
48
61
|
|
|
49
62
|
const requiredImports = [namespace, 'Result'].toSorted();
|
|
@@ -51,14 +64,17 @@ const createSafeParseRule = ({ moduleName, namespace, method }, messageId, { mes
|
|
|
51
64
|
meta: {
|
|
52
65
|
type: 'suggestion',
|
|
53
66
|
docs: { description },
|
|
54
|
-
|
|
67
|
+
hasSuggestions: true,
|
|
55
68
|
schema: [],
|
|
56
|
-
messages
|
|
69
|
+
messages: {
|
|
70
|
+
...messages,
|
|
71
|
+
replaceWithSafeParse: `Replace with \`Result.unwrapOkOr(${namespace}.${method}({{argName}}), Number.NaN)\`.`,
|
|
72
|
+
},
|
|
57
73
|
defaultOptions: [],
|
|
58
74
|
},
|
|
59
75
|
create: (context) => {
|
|
60
76
|
const sourceCode = context.sourceCode;
|
|
61
|
-
const
|
|
77
|
+
const mut_reports = [];
|
|
62
78
|
return {
|
|
63
79
|
CallExpression: (node) => {
|
|
64
80
|
if (!isTarget(skipTypeWrappers(node.callee), node.arguments)) {
|
|
@@ -66,7 +82,6 @@ const createSafeParseRule = ({ moduleName, namespace, method }, messageId, { mes
|
|
|
66
82
|
}
|
|
67
83
|
const firstArg = node.arguments[0];
|
|
68
84
|
|
|
69
|
-
|
|
70
85
|
if (firstArg === undefined ||
|
|
71
86
|
firstArg.type === AST_NODE_TYPES.SpreadElement) {
|
|
72
87
|
return;
|
|
@@ -81,7 +96,7 @@ const createSafeParseRule = ({ moduleName, namespace, method }, messageId, { mes
|
|
|
81
96
|
if (!typeHoldsAtEveryLayer(sourceCode, firstArg, isStringType)) {
|
|
82
97
|
return;
|
|
83
98
|
}
|
|
84
|
-
|
|
99
|
+
mut_reports.push({ node, argExpression: firstArg });
|
|
85
100
|
},
|
|
86
101
|
'Program:exit': () => {
|
|
87
102
|
const binding = bindValueImports(sourceCode, moduleName, requiredImports);
|
|
@@ -90,23 +105,33 @@ const createSafeParseRule = ({ moduleName, namespace, method }, messageId, { mes
|
|
|
90
105
|
const resultName = localNameOf('Result');
|
|
91
106
|
|
|
92
107
|
|
|
93
|
-
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
for (const { node, argExpression } of mut_reports) {
|
|
94
112
|
const argText = getArgumentText(sourceCode, argExpression);
|
|
113
|
+
const data = {
|
|
114
|
+
original: sourceCode.getText(node),
|
|
115
|
+
argName: argText,
|
|
116
|
+
};
|
|
95
117
|
context.report({
|
|
96
118
|
node,
|
|
97
119
|
messageId,
|
|
98
|
-
data
|
|
99
|
-
|
|
100
|
-
argName: argText,
|
|
101
|
-
},
|
|
102
|
-
fix: binding === undefined ||
|
|
120
|
+
data,
|
|
121
|
+
suggest: binding === undefined ||
|
|
103
122
|
namespaceName === undefined ||
|
|
104
123
|
resultName === undefined ||
|
|
105
124
|
[namespaceName, resultName].some((name) => hasForeignBinding(sourceCode, node, name, moduleName))
|
|
106
|
-
?
|
|
107
|
-
:
|
|
108
|
-
|
|
109
|
-
|
|
125
|
+
? []
|
|
126
|
+
: [
|
|
127
|
+
{
|
|
128
|
+
messageId: 'replaceWithSafeParse',
|
|
129
|
+
data,
|
|
130
|
+
fix: (fixer) => [
|
|
131
|
+
...binding.edits(fixer),
|
|
132
|
+
fixer.replaceText(node, `${resultName}.unwrapOkOr(${namespaceName}.${method}(${argText}), Number.NaN)`),
|
|
133
|
+
],
|
|
134
|
+
},
|
|
110
135
|
],
|
|
111
136
|
});
|
|
112
137
|
}
|
|
@@ -115,7 +140,7 @@ const createSafeParseRule = ({ moduleName, namespace, method }, messageId, { mes
|
|
|
115
140
|
},
|
|
116
141
|
};
|
|
117
142
|
};
|
|
118
|
-
const messageText = ({ moduleName, namespace, method, }) => `Replace \`{{original}}\` with \`Result.unwrapOkOr(${namespace}.${method}({{argName}}), Number.NaN)\` from ${moduleName}.`;
|
|
143
|
+
const messageText = ({ moduleName, namespace, method, }) => `Replace \`{{original}}\` with \`Result.unwrapOkOr(${namespace}.${method}({{argName}}), Number.NaN)\` from ${moduleName}. It parses some strings differently from the call it replaces, so check the input before applying it.`;
|
|
119
144
|
|
|
120
145
|
const isGlobalCall = (callee, name) => callee.type === AST_NODE_TYPES.Identifier && callee.name === name;
|
|
121
146
|
|
|
@@ -127,14 +152,4 @@ const isNumberMethod = (callee, name) => callee.type === AST_NODE_TYPES.MemberEx
|
|
|
127
152
|
isIdentifierNamed(callee.object, 'Number') &&
|
|
128
153
|
callee.property.type === AST_NODE_TYPES.Identifier &&
|
|
129
154
|
callee.property.name === name;
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
const isStringType = (type) => {
|
|
136
|
-
const parts = type.isUnion() ? type.types : [type];
|
|
137
|
-
return (parts.length > 0 &&
|
|
138
|
-
parts.every((t) => (t.flags & ts.TypeFlags.StringLike) !== 0));
|
|
139
|
-
};
|
|
140
155
|
//# sourceMappingURL=prefer-safe-parse.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-safe-parse.mjs","sourceRoot":"","sources":["../../src/rules/prefer-safe-parse.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAiB9B
|
|
1
|
+
{"version":3,"file":"prefer-safe-parse.mjs","sourceRoot":"","sources":["../../src/rules/prefer-safe-parse.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type TSESTree } from '@typescript-eslint/utils';
|
|
2
|
+
import type { DeepReadonly } from 'ts-type-forge';
|
|
3
|
+
/**
|
|
4
|
+
* The statement next to `node` (`offset` 1) or before it (-1) in the statement
|
|
5
|
+
* list `node` is one of: the program's, a block's, a class static block's, a
|
|
6
|
+
* namespace's or a `case`'s. What an `export` declares (or, for
|
|
7
|
+
* `export default`, the expression it exports) is read as the `export`
|
|
8
|
+
* statement. `undefined` when there is none, or when `node` is not in a
|
|
9
|
+
* statement list (an arrow function's expression body, a `for` initializer).
|
|
10
|
+
*/
|
|
11
|
+
export declare const siblingOf: (node: DeepReadonly<TSESTree.Node>, offset: 1 | -1) => DeepReadonly<TSESTree.Node> | undefined;
|
|
12
|
+
//# sourceMappingURL=statements.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.d.mts","sourceRoot":"","sources":["../src/statements.mts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,SACd,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,UACzB,CAAC,GAAG,CAAC,CAAC,KACb,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAmBhC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export const siblingOf = (node, offset) => {
|
|
11
|
+
const { parent } = node;
|
|
12
|
+
const statement = (parent?.type === AST_NODE_TYPES.ExportNamedDeclaration ||
|
|
13
|
+
parent?.type === AST_NODE_TYPES.ExportDefaultDeclaration) &&
|
|
14
|
+
parent.declaration === node
|
|
15
|
+
? parent
|
|
16
|
+
: node;
|
|
17
|
+
const list = statementListOf(statement);
|
|
18
|
+
if (list === undefined) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const index = list.indexOf(statement);
|
|
22
|
+
return index === -1 ? undefined : list[index + offset];
|
|
23
|
+
};
|
|
24
|
+
const statementListOf = (node) => {
|
|
25
|
+
const { parent } = node;
|
|
26
|
+
if (parent === undefined) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
if (parent.type === AST_NODE_TYPES.Program ||
|
|
30
|
+
parent.type === AST_NODE_TYPES.BlockStatement ||
|
|
31
|
+
parent.type === AST_NODE_TYPES.StaticBlock ||
|
|
32
|
+
parent.type === AST_NODE_TYPES.TSModuleBlock) {
|
|
33
|
+
return parent.body;
|
|
34
|
+
}
|
|
35
|
+
return parent.type === AST_NODE_TYPES.SwitchCase
|
|
36
|
+
? parent.consequent
|
|
37
|
+
: undefined;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=statements.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.mjs","sourceRoot":"","sources":["../src/statements.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAGzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAiC,EACjC,MAAc,EAC2B,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,MAAM,SAAS,GACb,CAAC,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,sBAAsB;QACrD,MAAM,EAAE,IAAI,KAAK,cAAc,CAAC,wBAAwB,CAAC;QAC3D,MAAM,CAAC,WAAW,KAAK,IAAI;QACzB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,IAAI,CAAC;IAEX,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAExC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,IAAiC,EACmB,EAAE;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IACE,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO;QACtC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,cAAc;QAC7C,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,WAAW;QAC1C,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa,EAC5C,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;QAC9C,CAAC,CAAC,MAAM,CAAC,UAAU;QACnB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC"}
|
package/dist/type-wrappers.d.mts
CHANGED
|
@@ -51,9 +51,9 @@ export declare const isIdentifierNamed: (node: DeepReadonly<TSESTree.Node>, name
|
|
|
51
51
|
* Whether `holds` is true of the type of every layer of type wrappers around
|
|
52
52
|
* `node` (see {@link typeWrapperLayers}), outermost to innermost; `false`
|
|
53
53
|
* without type information. A widening cast (`s as string | number`) is the
|
|
54
|
-
* author saying the value may be more than it is, and is respected; a
|
|
55
|
-
*
|
|
56
|
-
*
|
|
54
|
+
* author saying the value may be more than it is, and is respected; a narrowing
|
|
55
|
+
* one (`s!`, `v as unknown as string`) cannot vouch for what the value's own
|
|
56
|
+
* type does not, and the fix, which keeps the wrapper, has to
|
|
57
57
|
* type-check at every layer too.
|
|
58
58
|
*/
|
|
59
59
|
export declare const typeHoldsAtEveryLayer: (sourceCode: TSESLint.SourceCode, node: TSESTree.Node, holds: (type: ts.Type, typeChecker: ts.TypeChecker) => boolean) => boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-rule-forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Helpers for writing typescript-eslint rules that see through type wrappers and parentheses, and resolve what a file imports.",
|
|
6
6
|
"keywords": [
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
"@typescript-eslint/rule-tester": "8.72.0",
|
|
42
42
|
"dedent": "1.7.2",
|
|
43
43
|
"eslint": "10.13.0",
|
|
44
|
-
"eslint-config-typed": "7.
|
|
45
|
-
"eslint-plugin-ts-fortress": "1.3.
|
|
46
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
44
|
+
"eslint-config-typed": "7.3.0",
|
|
45
|
+
"eslint-plugin-ts-fortress": "1.3.12",
|
|
46
|
+
"eslint-plugin-ts-type-forge": "0.8.17",
|
|
47
47
|
"prettier": "3.9.10",
|
|
48
48
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
49
49
|
"prettier-plugin-packagejson": "3.0.2",
|
|
50
|
-
"ts-data-forge": "14.10.
|
|
50
|
+
"ts-data-forge": "14.10.1",
|
|
51
51
|
"ts-repo-utils": "10.7.1"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
package/src/bindings.mts
CHANGED
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* Whether `name`, read at `node`, resolves to something this file writes down
|
|
12
|
-
*
|
|
11
|
+
* Whether `name`, read at `node`, resolves to something this file writes down —
|
|
12
|
+
* a declaration, a parameter, an import — rather than to a global or a
|
|
13
13
|
* standard-library type of the same name.
|
|
14
14
|
*
|
|
15
15
|
* The scope manager makes an implicit variable for every reference it cannot
|
|
@@ -29,9 +29,8 @@ export const isLocallyBound = (
|
|
|
29
29
|
/**
|
|
30
30
|
* Whether `name`, read at `node`, resolves to a binding that is not an import
|
|
31
31
|
* from `moduleName` — a declaration, a parameter, or an import from another
|
|
32
|
-
* module. A fix that makes code at `node` refer to `moduleName`'s export
|
|
33
|
-
*
|
|
34
|
-
* instead.
|
|
32
|
+
* module. A fix that makes code at `node` refer to `moduleName`'s export `name`
|
|
33
|
+
* has to give up then, because the name would refer to that binding instead.
|
|
35
34
|
*
|
|
36
35
|
* The innermost binding decides: an import from `moduleName` at the top of the
|
|
37
36
|
* file does not help a name a function shadows around `node`.
|