eslint-plugin-ts-fortress 1.3.2 → 1.3.3
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/rules/no-type-only-codec.d.mts.map +1 -1
- package/dist/rules/no-type-only-codec.mjs +3 -2
- package/dist/rules/no-type-only-codec.mjs.map +1 -1
- package/dist/rules/prefer-canonical-length-constrained-type.d.mts.map +1 -1
- package/dist/rules/prefer-canonical-length-constrained-type.mjs +6 -10
- package/dist/rules/prefer-canonical-length-constrained-type.mjs.map +1 -1
- package/dist/rules/prefer-namespace-import.d.mts.map +1 -1
- package/dist/rules/prefer-namespace-import.mjs +3 -3
- package/dist/rules/prefer-namespace-import.mjs.map +1 -1
- package/dist/rules/prefer-schema-over-guard-chain.mjs +1 -1
- package/dist/rules/prefer-schema-over-guard-chain.mjs.map +1 -1
- package/package.json +5 -4
- package/src/rules/no-type-only-codec.mts +5 -2
- package/src/rules/prefer-canonical-length-constrained-type.mts +27 -22
- package/src/rules/prefer-canonical-length-constrained-type.test.mts +31 -3
- package/src/rules/prefer-namespace-import.mts +6 -3
- package/src/rules/prefer-schema-over-guard-chain.mts +1 -1
- package/dist/rules/ast-utils.d.mts +0 -15
- package/dist/rules/ast-utils.d.mts.map +0 -1
- package/dist/rules/ast-utils.mjs +0 -24
- package/dist/rules/ast-utils.mjs.map +0 -1
- package/dist/rules/import-utils.d.mts +0 -47
- package/dist/rules/import-utils.d.mts.map +0 -1
- package/dist/rules/import-utils.mjs +0 -103
- package/dist/rules/import-utils.mjs.map +0 -1
- package/src/rules/ast-utils.mts +0 -35
- package/src/rules/import-utils.mts +0 -174
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-type-only-codec.d.mts","sourceRoot":"","sources":["../../src/rules/no-type-only-codec.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"no-type-only-codec.d.mts","sourceRoot":"","sources":["../../src/rules/no-type-only-codec.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AASlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,eAAe,CAAC;AAKlC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA6F3D,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
2
|
+
import { getImportDeclarations } from 'eslint-rule-forge';
|
|
2
3
|
import * as path from 'node:path';
|
|
3
4
|
import { Arr } from 'ts-data-forge';
|
|
5
|
+
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
4
6
|
import { isExportedValueUsed } from './export-usage.mjs';
|
|
5
|
-
import { getTsFortressImports } from './import-utils.mjs';
|
|
6
7
|
import { packageEntryPoints } from './package-entry-points.mjs';
|
|
7
8
|
|
|
8
9
|
const TYPE_OF = 'TypeOf';
|
|
@@ -57,7 +58,7 @@ export const noTypeOnlyCodec = {
|
|
|
57
58
|
const entryPointOption = context.options[0]?.entryPoints;
|
|
58
59
|
return {
|
|
59
60
|
Program: (program) => {
|
|
60
|
-
const isTypeOf = buildTypeOfMatcher(
|
|
61
|
+
const isTypeOf = buildTypeOfMatcher(getImportDeclarations(program, TS_FORTRESS_MODULE));
|
|
61
62
|
if (isTypeOf === undefined) {
|
|
62
63
|
return;
|
|
63
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-type-only-codec.mjs","sourceRoot":"","sources":["../../src/rules/no-type-only-codec.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"no-type-only-codec.mjs","sourceRoot":"","sources":["../../src/rules/no-type-only-codec.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-canonical-length-constrained-type.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-canonical-length-constrained-type.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"prefer-canonical-length-constrained-type.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-canonical-length-constrained-type.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAsBlC,KAAK,OAAO,GAAG,SAAS,EAAE,CAAC;AAE3B,KAAK,UAAU,GAAG,kBAAkB,CAAC;AAyFrC,eAAO,MAAM,oCAAoC,EAAE,QAAQ,CAAC,UAAU,CACpE,UAAU,EACV,OAAO,CAgJC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, ASTUtils, } from '@typescript-eslint/utils';
|
|
2
|
+
import { buildCalleeResolver, buildNamedImportFix, getImportDeclarations, getImportedLocalName, hasForeignBinding, parenthesesDepth, } from 'eslint-rule-forge';
|
|
2
3
|
import { Arr } from 'ts-data-forge';
|
|
3
|
-
import { ARRAY_FN, BOUNDED_LENGTH_TUPLE_FN, FIXED_LENGTH_TUPLE_FN, MAX_LENGTH_TUPLE_FN, MIN_LENGTH_ARRAY_FN, MIN_LENGTH_TUPLE_FN, NON_EMPTY_ARRAY_FN, STRUCTURAL_PREFIX_CAP, } from './constants.mjs';
|
|
4
|
-
import { buildCalleeResolver, buildImportsFix, getImportedLocalName, getTsFortressImports, hasForeignBinding, } from './import-utils.mjs';
|
|
4
|
+
import { ARRAY_FN, BOUNDED_LENGTH_TUPLE_FN, FIXED_LENGTH_TUPLE_FN, MAX_LENGTH_TUPLE_FN, MIN_LENGTH_ARRAY_FN, MIN_LENGTH_TUPLE_FN, NON_EMPTY_ARRAY_FN, STRUCTURAL_PREFIX_CAP, TS_FORTRESS_MODULE, } from './constants.mjs';
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
@@ -84,7 +84,7 @@ export const preferCanonicalLengthConstrainedType = {
|
|
|
84
84
|
create: (context) => {
|
|
85
85
|
const sourceCode = context.sourceCode;
|
|
86
86
|
const program = sourceCode.ast;
|
|
87
|
-
const tsFortressImports =
|
|
87
|
+
const tsFortressImports = getImportDeclarations(program, TS_FORTRESS_MODULE);
|
|
88
88
|
const resolveCallee = buildCalleeResolver(tsFortressImports);
|
|
89
89
|
const mut_matches = [];
|
|
90
90
|
return {
|
|
@@ -118,7 +118,7 @@ export const preferCanonicalLengthConstrainedType = {
|
|
|
118
118
|
propertyNode: resolved.propertyNode,
|
|
119
119
|
isNamespace: false,
|
|
120
120
|
rewrite,
|
|
121
|
-
localName: hasForeignBinding(sourceCode, node, localName)
|
|
121
|
+
localName: hasForeignBinding(sourceCode, node, localName, TS_FORTRESS_MODULE)
|
|
122
122
|
? undefined
|
|
123
123
|
: localName,
|
|
124
124
|
needsImport: importedLocalName === undefined,
|
|
@@ -145,7 +145,7 @@ export const preferCanonicalLengthConstrainedType = {
|
|
|
145
145
|
},
|
|
146
146
|
fix: (fixer) => [
|
|
147
147
|
...(index === importFixIndex
|
|
148
|
-
?
|
|
148
|
+
? buildNamedImportFix(fixer, program, TS_FORTRESS_MODULE, namesNeedingImport)
|
|
149
149
|
: []),
|
|
150
150
|
fixer.replaceText(propertyNode, localName),
|
|
151
151
|
...dropBoundsFix(fixer, node, rewrite, sourceCode),
|
|
@@ -217,7 +217,7 @@ const dropBoundsFix = (fixer, node, rewrite, sourceCode) => rewrite.bounds.flatM
|
|
|
217
217
|
if (dropped === undefined || rewrite.keep.includes(index)) {
|
|
218
218
|
return [];
|
|
219
219
|
}
|
|
220
|
-
const depth = parenthesesDepth(
|
|
220
|
+
const depth = parenthesesDepth(sourceCode, dropped);
|
|
221
221
|
const first = sourceCode.getFirstToken(dropped);
|
|
222
222
|
const start = first === null || depth === 0
|
|
223
223
|
? first
|
|
@@ -231,10 +231,6 @@ const dropBoundsFix = (fixer, node, rewrite, sourceCode) => rewrite.bounds.flatM
|
|
|
231
231
|
: [fixer.removeRange([start.range[0], end.range[0]])];
|
|
232
232
|
});
|
|
233
233
|
|
|
234
|
-
const parenthesesDepth = (node, sourceCode, depth = 0) => ASTUtils.isParenthesized(depth + 1, node, sourceCode)
|
|
235
|
-
? parenthesesDepth(node, sourceCode, depth + 1)
|
|
236
|
-
: depth;
|
|
237
|
-
|
|
238
234
|
|
|
239
235
|
|
|
240
236
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-canonical-length-constrained-type.mjs","sourceRoot":"","sources":["../../src/rules/prefer-canonical-length-constrained-type.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,QAAQ,GAGT,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EACL,QAAQ,EACR,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"prefer-canonical-length-constrained-type.mjs","sourceRoot":"","sources":["../../src/rules/prefer-canonical-length-constrained-type.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-namespace-import.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-namespace-import.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAKlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,wBAAwB,GAAG,oBAAoB,CAAC;AA0BlE;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"prefer-namespace-import.d.mts","sourceRoot":"","sources":["../../src/rules/prefer-namespace-import.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAKlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,wBAAwB,GAAG,oBAAoB,CAAC;AA0BlE;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CA0GjE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
2
|
+
import { getImportDeclarations, hasForeignBinding } from 'eslint-rule-forge';
|
|
2
3
|
import { Arr } from 'ts-data-forge';
|
|
3
4
|
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
4
|
-
import { getTsFortressImports, hasForeignBinding } from './import-utils.mjs';
|
|
5
5
|
|
|
6
6
|
const DEFAULT_NAMESPACE_NAME = 't';
|
|
7
7
|
|
|
@@ -52,7 +52,7 @@ export const preferNamespaceImport = {
|
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
'Program:exit': () => {
|
|
55
|
-
const declarations =
|
|
55
|
+
const declarations = getImportDeclarations(sourceCode.ast, TS_FORTRESS_MODULE);
|
|
56
56
|
const reported = declarations.filter((declaration) => !isNamespaceOnly(declaration));
|
|
57
57
|
if (!Arr.isNonEmpty(reported)) {
|
|
58
58
|
return;
|
|
@@ -183,7 +183,7 @@ const buildReferenceRewrite = (sourceCode, identifier, namespaceName, memberName
|
|
|
183
183
|
if (identifier.type !== AST_NODE_TYPES.Identifier ||
|
|
184
184
|
|
|
185
185
|
|
|
186
|
-
hasForeignBinding(sourceCode, identifier, namespaceName)) {
|
|
186
|
+
hasForeignBinding(sourceCode, identifier, namespaceName, TS_FORTRESS_MODULE)) {
|
|
187
187
|
return undefined;
|
|
188
188
|
}
|
|
189
189
|
const target = memberName === undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-namespace-import.mjs","sourceRoot":"","sources":["../../src/rules/prefer-namespace-import.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"prefer-namespace-import.mjs","sourceRoot":"","sources":["../../src/rules/prefer-namespace-import.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-schema-over-guard-chain.mjs","sourceRoot":"","sources":["../../src/rules/prefer-schema-over-guard-chain.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"prefer-schema-over-guard-chain.mjs","sourceRoot":"","sources":["../../src/rules/prefer-schema-over-guard-chain.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-ts-fortress",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "ESLint rules that steer schema definitions toward ts-fortress idioms.",
|
|
6
6
|
"keywords": [
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
],
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@typescript-eslint/utils": "8.71.1",
|
|
39
|
+
"eslint-rule-forge": "^0.1.0",
|
|
39
40
|
"ts-data-forge": "~14.7.1",
|
|
40
41
|
"ts-type-forge": "~9.2.2"
|
|
41
42
|
},
|
|
@@ -43,9 +44,9 @@
|
|
|
43
44
|
"@typescript-eslint/parser": "8.71.1",
|
|
44
45
|
"@typescript-eslint/rule-tester": "8.71.1",
|
|
45
46
|
"dedent": "1.7.2",
|
|
46
|
-
"eslint-config-typed": "5.17.
|
|
47
|
-
"eslint-plugin-ts-data-forge": "0.8.
|
|
48
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
47
|
+
"eslint-config-typed": "5.17.4",
|
|
48
|
+
"eslint-plugin-ts-data-forge": "0.8.6",
|
|
49
|
+
"eslint-plugin-ts-type-forge": "0.8.8",
|
|
49
50
|
"prettier": "3.9.9",
|
|
50
51
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
51
52
|
"prettier-plugin-packagejson": "3.0.2",
|
|
@@ -3,11 +3,12 @@ import {
|
|
|
3
3
|
type TSESLint,
|
|
4
4
|
type TSESTree,
|
|
5
5
|
} from '@typescript-eslint/utils';
|
|
6
|
+
import { getImportDeclarations } from 'eslint-rule-forge';
|
|
6
7
|
import * as path from 'node:path';
|
|
7
8
|
import { Arr } from 'ts-data-forge';
|
|
8
9
|
import type { FixedLengthTuple } from 'ts-type-forge';
|
|
10
|
+
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
9
11
|
import { isExportedValueUsed } from './export-usage.mjs';
|
|
10
|
-
import { getTsFortressImports } from './import-utils.mjs';
|
|
11
12
|
import { packageEntryPoints } from './package-entry-points.mjs';
|
|
12
13
|
|
|
13
14
|
type Options = readonly [
|
|
@@ -75,7 +76,9 @@ export const noTypeOnlyCodec: TSESLint.RuleModule<MessageIds, Options> = {
|
|
|
75
76
|
|
|
76
77
|
return {
|
|
77
78
|
Program: (program) => {
|
|
78
|
-
const isTypeOf = buildTypeOfMatcher(
|
|
79
|
+
const isTypeOf = buildTypeOfMatcher(
|
|
80
|
+
getImportDeclarations(program, TS_FORTRESS_MODULE),
|
|
81
|
+
);
|
|
79
82
|
|
|
80
83
|
if (isTypeOf === undefined) {
|
|
81
84
|
return;
|
|
@@ -4,6 +4,14 @@ import {
|
|
|
4
4
|
type TSESLint,
|
|
5
5
|
type TSESTree,
|
|
6
6
|
} from '@typescript-eslint/utils';
|
|
7
|
+
import {
|
|
8
|
+
buildCalleeResolver,
|
|
9
|
+
buildNamedImportFix,
|
|
10
|
+
getImportDeclarations,
|
|
11
|
+
getImportedLocalName,
|
|
12
|
+
hasForeignBinding,
|
|
13
|
+
parenthesesDepth,
|
|
14
|
+
} from 'eslint-rule-forge';
|
|
7
15
|
import { Arr } from 'ts-data-forge';
|
|
8
16
|
import {
|
|
9
17
|
ARRAY_FN,
|
|
@@ -14,14 +22,8 @@ import {
|
|
|
14
22
|
MIN_LENGTH_TUPLE_FN,
|
|
15
23
|
NON_EMPTY_ARRAY_FN,
|
|
16
24
|
STRUCTURAL_PREFIX_CAP,
|
|
25
|
+
TS_FORTRESS_MODULE,
|
|
17
26
|
} from './constants.mjs';
|
|
18
|
-
import {
|
|
19
|
-
buildCalleeResolver,
|
|
20
|
-
buildImportsFix,
|
|
21
|
-
getImportedLocalName,
|
|
22
|
-
getTsFortressImports,
|
|
23
|
-
hasForeignBinding,
|
|
24
|
-
} from './import-utils.mjs';
|
|
25
27
|
|
|
26
28
|
type Options = readonly [];
|
|
27
29
|
|
|
@@ -137,7 +139,10 @@ export const preferCanonicalLengthConstrainedType: TSESLint.RuleModule<
|
|
|
137
139
|
|
|
138
140
|
const program = sourceCode.ast;
|
|
139
141
|
|
|
140
|
-
const tsFortressImports =
|
|
142
|
+
const tsFortressImports = getImportDeclarations(
|
|
143
|
+
program,
|
|
144
|
+
TS_FORTRESS_MODULE,
|
|
145
|
+
);
|
|
141
146
|
|
|
142
147
|
const resolveCallee = buildCalleeResolver(tsFortressImports);
|
|
143
148
|
|
|
@@ -196,7 +201,12 @@ export const preferCanonicalLengthConstrainedType: TSESLint.RuleModule<
|
|
|
196
201
|
propertyNode: resolved.propertyNode,
|
|
197
202
|
isNamespace: false,
|
|
198
203
|
rewrite,
|
|
199
|
-
localName: hasForeignBinding(
|
|
204
|
+
localName: hasForeignBinding(
|
|
205
|
+
sourceCode,
|
|
206
|
+
node,
|
|
207
|
+
localName,
|
|
208
|
+
TS_FORTRESS_MODULE,
|
|
209
|
+
)
|
|
200
210
|
? undefined
|
|
201
211
|
: localName,
|
|
202
212
|
needsImport: importedLocalName === undefined,
|
|
@@ -213,7 +223,7 @@ export const preferCanonicalLengthConstrainedType: TSESLint.RuleModule<
|
|
|
213
223
|
.map((match) => match.rewrite.to),
|
|
214
224
|
);
|
|
215
225
|
|
|
216
|
-
// Every missing import rides on a single report; see `
|
|
226
|
+
// Every missing import rides on a single report; see `buildNamedImportFix`.
|
|
217
227
|
const importFixIndex = reportable.findIndex(
|
|
218
228
|
(match) => match.needsImport,
|
|
219
229
|
);
|
|
@@ -236,7 +246,12 @@ export const preferCanonicalLengthConstrainedType: TSESLint.RuleModule<
|
|
|
236
246
|
},
|
|
237
247
|
fix: (fixer) => [
|
|
238
248
|
...(index === importFixIndex
|
|
239
|
-
?
|
|
249
|
+
? buildNamedImportFix(
|
|
250
|
+
fixer,
|
|
251
|
+
program,
|
|
252
|
+
TS_FORTRESS_MODULE,
|
|
253
|
+
namesNeedingImport,
|
|
254
|
+
)
|
|
240
255
|
: []),
|
|
241
256
|
fixer.replaceText(propertyNode, localName),
|
|
242
257
|
...dropBoundsFix(fixer, node, rewrite, sourceCode),
|
|
@@ -342,7 +357,7 @@ const dropBoundsFix = (
|
|
|
342
357
|
return [];
|
|
343
358
|
}
|
|
344
359
|
|
|
345
|
-
const depth = parenthesesDepth(
|
|
360
|
+
const depth = parenthesesDepth(sourceCode, dropped);
|
|
346
361
|
|
|
347
362
|
const first = sourceCode.getFirstToken(dropped);
|
|
348
363
|
|
|
@@ -362,16 +377,6 @@ const dropBoundsFix = (
|
|
|
362
377
|
: [fixer.removeRange([start.range[0], end.range[0]])];
|
|
363
378
|
});
|
|
364
379
|
|
|
365
|
-
/** How many pairs of parentheses the source puts around `node`. */
|
|
366
|
-
const parenthesesDepth = (
|
|
367
|
-
node: TSESTree.Node,
|
|
368
|
-
sourceCode: TSESLint.SourceCode,
|
|
369
|
-
depth: number = 0,
|
|
370
|
-
): number =>
|
|
371
|
-
ASTUtils.isParenthesized(depth + 1, node, sourceCode)
|
|
372
|
-
? parenthesesDepth(node, sourceCode, depth + 1)
|
|
373
|
-
: depth;
|
|
374
|
-
|
|
375
380
|
/**
|
|
376
381
|
* A non-negative integer literal's value, or `undefined` for anything else —
|
|
377
382
|
* a computed bound cannot be matched against the rewrite table.
|
|
@@ -164,6 +164,36 @@ describe('prefer-canonical-length-constrained-type', () => {
|
|
|
164
164
|
`,
|
|
165
165
|
errors: [{ messageId: 'useCanonicalType' }],
|
|
166
166
|
},
|
|
167
|
+
{
|
|
168
|
+
name: 'reads the namespace object through a type wrapper',
|
|
169
|
+
code: dedent`
|
|
170
|
+
import * as t from 'ts-fortress';
|
|
171
|
+
|
|
172
|
+
const T = (t as typeof t).minLengthArray(1, t.string());
|
|
173
|
+
`,
|
|
174
|
+
output: dedent`
|
|
175
|
+
import * as t from 'ts-fortress';
|
|
176
|
+
|
|
177
|
+
const T = (t as typeof t).nonEmptyArray(t.string());
|
|
178
|
+
`,
|
|
179
|
+
errors: [{ messageId: 'useCanonicalType' }],
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'reads a namespace import from a second declaration',
|
|
183
|
+
code: dedent`
|
|
184
|
+
import type { Type } from 'ts-fortress';
|
|
185
|
+
import * as t from 'ts-fortress';
|
|
186
|
+
|
|
187
|
+
const T = t.minLengthArray(1, t.string());
|
|
188
|
+
`,
|
|
189
|
+
output: dedent`
|
|
190
|
+
import type { Type } from 'ts-fortress';
|
|
191
|
+
import * as t from 'ts-fortress';
|
|
192
|
+
|
|
193
|
+
const T = t.nonEmptyArray(t.string());
|
|
194
|
+
`,
|
|
195
|
+
errors: [{ messageId: 'useCanonicalType' }],
|
|
196
|
+
},
|
|
167
197
|
{
|
|
168
198
|
name: 'keeps a typeName-only options object',
|
|
169
199
|
code: dedent`
|
|
@@ -394,9 +424,7 @@ describe('prefer-canonical-length-constrained-type', () => {
|
|
|
394
424
|
const C = boundedLengthTuple(0, 5, string());
|
|
395
425
|
`,
|
|
396
426
|
output: dedent`
|
|
397
|
-
import { nonEmptyArray } from 'ts-fortress';
|
|
398
|
-
import { fixedLengthTuple } from 'ts-fortress';
|
|
399
|
-
import { maxLengthTuple } from 'ts-fortress';
|
|
427
|
+
import { nonEmptyArray, fixedLengthTuple, maxLengthTuple } from 'ts-fortress';
|
|
400
428
|
import { boundedLengthTuple, minLengthArray, string } from 'ts-fortress';
|
|
401
429
|
|
|
402
430
|
const A = nonEmptyArray(string());
|
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
type TSESLint,
|
|
4
4
|
type TSESTree,
|
|
5
5
|
} from '@typescript-eslint/utils';
|
|
6
|
+
import { getImportDeclarations, hasForeignBinding } from 'eslint-rule-forge';
|
|
6
7
|
import { Arr } from 'ts-data-forge';
|
|
7
8
|
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
8
|
-
import { getTsFortressImports, hasForeignBinding } from './import-utils.mjs';
|
|
9
9
|
|
|
10
10
|
type Options = readonly [
|
|
11
11
|
Readonly<{
|
|
@@ -91,7 +91,10 @@ export const preferNamespaceImport: TSESLint.RuleModule<MessageIds, Options> = {
|
|
|
91
91
|
// has to see every ts-fortress import at once to know whether there is a
|
|
92
92
|
// namespace to merge into, and which declaration becomes it.
|
|
93
93
|
'Program:exit': () => {
|
|
94
|
-
const declarations =
|
|
94
|
+
const declarations = getImportDeclarations(
|
|
95
|
+
sourceCode.ast,
|
|
96
|
+
TS_FORTRESS_MODULE,
|
|
97
|
+
);
|
|
95
98
|
|
|
96
99
|
const reported = declarations.filter(
|
|
97
100
|
(declaration) => !isNamespaceOnly(declaration),
|
|
@@ -299,7 +302,7 @@ const buildReferenceRewrite = (
|
|
|
299
302
|
identifier.type !== AST_NODE_TYPES.Identifier ||
|
|
300
303
|
// The namespace name has to mean the namespace import at every site the fix
|
|
301
304
|
// writes it; a binding of the same name in scope would capture it instead.
|
|
302
|
-
hasForeignBinding(sourceCode, identifier, namespaceName)
|
|
305
|
+
hasForeignBinding(sourceCode, identifier, namespaceName, TS_FORTRESS_MODULE)
|
|
303
306
|
) {
|
|
304
307
|
return undefined;
|
|
305
308
|
}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
type TSESLint,
|
|
4
4
|
type TSESTree,
|
|
5
5
|
} from '@typescript-eslint/utils';
|
|
6
|
-
import { isTypeWrapper, skipTypeWrappers } from '
|
|
6
|
+
import { isTypeWrapper, skipTypeWrappers } from 'eslint-rule-forge';
|
|
7
7
|
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
8
8
|
|
|
9
9
|
type Options = readonly [
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type TSESTree } from '@typescript-eslint/utils';
|
|
2
|
-
/**
|
|
3
|
-
* `node` with every `as`, `satisfies`, `!` and `<T>` around it taken off: the
|
|
4
|
-
* expression whose value it is. Judge syntax on what this returns, so that a
|
|
5
|
-
* wrapper does not hide a pattern (`isString((x as R).a)`), and keep the
|
|
6
|
-
* original node for fix text. See `docs/writing-lint-rules.md` at the
|
|
7
|
-
* repository root.
|
|
8
|
-
*
|
|
9
|
-
* A copy of the helper in `eslint-config-typed`, which this package, published
|
|
10
|
-
* on its own, cannot import.
|
|
11
|
-
*/
|
|
12
|
-
export declare const skipTypeWrappers: (node: TSESTree.Node) => TSESTree.Node;
|
|
13
|
-
export declare const isTypeWrapper: (node: TSESTree.Node) => node is TypeWrapper;
|
|
14
|
-
export type TypeWrapper = TSESTree.TSAsExpression | TSESTree.TSNonNullExpression | TSESTree.TSSatisfiesExpression | TSESTree.TSTypeAssertion;
|
|
15
|
-
//# sourceMappingURL=ast-utils.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.d.mts","sourceRoot":"","sources":["../../src/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzE;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,SAErB,QAAQ,CAAC,IAAI,KAClB,QAAQ,CAAC,IACoD,CAAC;AAEjE,eAAO,MAAM,aAAa,SAElB,QAAQ,CAAC,IAAI,KAClB,IAAI,IAAI,WAA2C,CAAC;AAEvD,MAAM,MAAM,WAAW,GACnB,QAAQ,CAAC,cAAc,GACvB,QAAQ,CAAC,mBAAmB,GAC5B,QAAQ,CAAC,qBAAqB,GAC9B,QAAQ,CAAC,eAAe,CAAC"}
|
package/dist/rules/ast-utils.mjs
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { AST_NODE_TYPES } from '@typescript-eslint/utils';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export const skipTypeWrappers = (
|
|
13
|
-
|
|
14
|
-
node) => isTypeWrapper(node) ? skipTypeWrappers(node.expression) : node;
|
|
15
|
-
export const isTypeWrapper = (
|
|
16
|
-
|
|
17
|
-
node) => TYPE_WRAPPERS.has(node.type);
|
|
18
|
-
const TYPE_WRAPPERS = new Set([
|
|
19
|
-
AST_NODE_TYPES.TSAsExpression,
|
|
20
|
-
AST_NODE_TYPES.TSNonNullExpression,
|
|
21
|
-
AST_NODE_TYPES.TSSatisfiesExpression,
|
|
22
|
-
AST_NODE_TYPES.TSTypeAssertion,
|
|
23
|
-
]);
|
|
24
|
-
//# sourceMappingURL=ast-utils.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ast-utils.mjs","sourceRoot":"","sources":["../../src/rules/ast-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;AAC9B,8EAA8E;AAC9E,IAAmB,EACJ,EAAE,CACjB,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAEjE,MAAM,CAAC,MAAM,aAAa,GAAG;AAC3B,8EAA8E;AAC9E,IAAmB,EACE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAQvD,MAAM,aAAa,GAAgC,IAAI,GAAG,CAAC;IACzD,cAAc,CAAC,cAAc;IAC7B,cAAc,CAAC,mBAAmB;IAClC,cAAc,CAAC,qBAAqB;IACpC,cAAc,CAAC,eAAe;CAC/B,CAAC,CAAC"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { type TSESLint, type TSESTree } from '@typescript-eslint/utils';
|
|
2
|
-
export type ResolvedCallee = Readonly<{
|
|
3
|
-
/** The canonical (imported) ts-fortress name, regardless of local alias. */
|
|
4
|
-
canonicalName: string;
|
|
5
|
-
/** The identifier node to rewrite when replacing the callee name. */
|
|
6
|
-
propertyNode: TSESTree.Node;
|
|
7
|
-
/** Whether the call was made through a namespace import (`t.foo(...)`). */
|
|
8
|
-
isNamespace: boolean;
|
|
9
|
-
}>;
|
|
10
|
-
/** Every `import ... from 'ts-fortress'` declaration in the file. */
|
|
11
|
-
export declare const getTsFortressImports: (program: TSESTree.Program) => readonly TSESTree.ImportDeclaration[];
|
|
12
|
-
/**
|
|
13
|
-
* Returns the in-scope local name a given ts-fortress export is imported as
|
|
14
|
-
* (handling aliases such as `import { nonEmptyArray as nea }` → `'nea'`), or
|
|
15
|
-
* `undefined` when it is not imported. Used so autofixes reference the binding
|
|
16
|
-
* that actually exists rather than the canonical name.
|
|
17
|
-
*/
|
|
18
|
-
export declare const getImportedLocalName: (importDeclarations: readonly TSESTree.ImportDeclaration[], importedName: string) => string | undefined;
|
|
19
|
-
/**
|
|
20
|
-
* Builds a resolver that maps a call expression's callee to the canonical
|
|
21
|
-
* ts-fortress function it refers to. Handles named imports (including aliases)
|
|
22
|
-
* and namespace imports (`import * as t` → `t.foo(...)`) — the latter being the
|
|
23
|
-
* idiomatic way to consume ts-fortress. Returns `undefined` for any callee that
|
|
24
|
-
* does not reference the given ts-fortress imports.
|
|
25
|
-
*/
|
|
26
|
-
export declare const buildCalleeResolver: (importDeclarations: readonly TSESTree.ImportDeclaration[]) => ((callee: TSESTree.Expression) => ResolvedCallee | undefined);
|
|
27
|
-
/**
|
|
28
|
-
* Whether `name` resolves, at `node`, to a binding that is not a ts-fortress
|
|
29
|
-
* import — a local declaration, a parameter, or an import from another module.
|
|
30
|
-
* An autofix that makes a call reference `name` must bail out in that case,
|
|
31
|
-
* because the rewritten call would resolve to the wrong binding.
|
|
32
|
-
*
|
|
33
|
-
* Scope-based rather than a scan of the top-level statements, so a binding that
|
|
34
|
-
* merely shadows the ts-fortress one around the call site is caught too.
|
|
35
|
-
*/
|
|
36
|
-
export declare const hasForeignBinding: (sourceCode: TSESLint.SourceCode, node: TSESTree.Node, name: string) => boolean;
|
|
37
|
-
/**
|
|
38
|
-
* Inserts `import { <name> } from 'ts-fortress';` for each name at the top of
|
|
39
|
-
* the file. Placement is deliberately naive: prettier-plugin-organize-imports
|
|
40
|
-
* (or any equivalent) merges and sorts them afterwards.
|
|
41
|
-
*
|
|
42
|
-
* All names go into a single fix on purpose: ESLint merges the fixes of one
|
|
43
|
-
* report into one edit span, so two reports each inserting at the start of the
|
|
44
|
-
* file would conflict and one of them would be dropped.
|
|
45
|
-
*/
|
|
46
|
-
export declare const buildImportsFix: (fixer: TSESLint.RuleFixer, program: TSESTree.Program, names: readonly string[]) => readonly TSESLint.RuleFix[];
|
|
47
|
-
//# sourceMappingURL=import-utils.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"import-utils.d.mts","sourceRoot":"","sources":["../../src/rules/import-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAMlC,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC;IAC5B,2EAA2E;IAC3E,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC,CAAC;AAEH,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,YACtB,QAAQ,CAAC,OAAO,KACxB,SAAS,QAAQ,CAAC,iBAAiB,EAKnC,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,uBACX,SAAS,QAAQ,CAAC,iBAAiB,EAAE,gBAC3C,MAAM,KACnB,MAAM,GAAG,SASK,CAAC;AAElB;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,uBACV,SAAS,QAAQ,CAAC,iBAAiB,EAAE,KACxD,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,KAAK,cAAc,GAAG,SAAS,CAoD9D,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,eAChB,QAAQ,CAAC,UAAU,QACzB,QAAQ,CAAC,IAAI,QACb,MAAM,KACX,OAgBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,UACnB,QAAQ,CAAC,SAAS,WAChB,QAAQ,CAAC,OAAO,SAClB,SAAS,MAAM,EAAE,KACvB,SAAS,QAAQ,CAAC,OAAO,EAUX,CAAC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { AST_NODE_TYPES, } from '@typescript-eslint/utils';
|
|
2
|
-
import { Arr } from 'ts-data-forge';
|
|
3
|
-
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
4
|
-
|
|
5
|
-
export const getTsFortressImports = (program) => program.body.filter((node) => node.type === AST_NODE_TYPES.ImportDeclaration &&
|
|
6
|
-
node.source.value === TS_FORTRESS_MODULE);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export const getImportedLocalName = (importDeclarations, importedName) => importDeclarations
|
|
14
|
-
.flatMap((declaration) => declaration.specifiers)
|
|
15
|
-
.find((specifier) => specifier.type === AST_NODE_TYPES.ImportSpecifier &&
|
|
16
|
-
(specifier.imported.type === AST_NODE_TYPES.Identifier
|
|
17
|
-
? specifier.imported.name
|
|
18
|
-
: specifier.imported.value) === importedName)?.local.name;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export const buildCalleeResolver = (importDeclarations) => {
|
|
27
|
-
const specifiers = importDeclarations.flatMap((declaration) => declaration.specifiers);
|
|
28
|
-
const namespaceNames = new Set(specifiers
|
|
29
|
-
.filter((specifier) => specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier)
|
|
30
|
-
.map((specifier) => specifier.local.name));
|
|
31
|
-
const localToCanonical = new Map(specifiers.flatMap((specifier) => {
|
|
32
|
-
if (specifier.type !== AST_NODE_TYPES.ImportSpecifier) {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
const importedName = specifier.imported.type === AST_NODE_TYPES.Identifier
|
|
36
|
-
? specifier.imported.name
|
|
37
|
-
: specifier.imported.value;
|
|
38
|
-
return typeof importedName === 'string'
|
|
39
|
-
? [[specifier.local.name, importedName]]
|
|
40
|
-
: [];
|
|
41
|
-
}));
|
|
42
|
-
return (callee) => {
|
|
43
|
-
if (callee.type === AST_NODE_TYPES.Identifier) {
|
|
44
|
-
const canonicalName = localToCanonical.get(callee.name);
|
|
45
|
-
return canonicalName === undefined
|
|
46
|
-
? undefined
|
|
47
|
-
: { canonicalName, propertyNode: callee, isNamespace: false };
|
|
48
|
-
}
|
|
49
|
-
return callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
50
|
-
!callee.computed &&
|
|
51
|
-
callee.object.type === AST_NODE_TYPES.Identifier &&
|
|
52
|
-
namespaceNames.has(callee.object.name) &&
|
|
53
|
-
callee.property.type === AST_NODE_TYPES.Identifier
|
|
54
|
-
? {
|
|
55
|
-
canonicalName: callee.property.name,
|
|
56
|
-
propertyNode: callee.property,
|
|
57
|
-
isNamespace: true,
|
|
58
|
-
}
|
|
59
|
-
: undefined;
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
export const hasForeignBinding = (sourceCode, node, name) => {
|
|
72
|
-
for (let mut_scope = sourceCode.getScope(node); mut_scope !== null; mut_scope = mut_scope.upper) {
|
|
73
|
-
const variable = mut_scope.set.get(name);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (variable !== undefined) {
|
|
77
|
-
return variable.defs.some((def) => !isTsFortressImportDef(def.node));
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return false;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
export const buildImportsFix = (fixer, program, names) => Arr.isEmpty(names)
|
|
92
|
-
? []
|
|
93
|
-
: [
|
|
94
|
-
fixer.insertTextBefore(program, names
|
|
95
|
-
.map((name) => `import { ${name} } from '${TS_FORTRESS_MODULE}';\n`)
|
|
96
|
-
.join('')),
|
|
97
|
-
];
|
|
98
|
-
const isTsFortressImportDef = (node) => (node.type === AST_NODE_TYPES.ImportSpecifier ||
|
|
99
|
-
node.type === AST_NODE_TYPES.ImportDefaultSpecifier ||
|
|
100
|
-
node.type === AST_NODE_TYPES.ImportNamespaceSpecifier) &&
|
|
101
|
-
node.parent.type === AST_NODE_TYPES.ImportDeclaration &&
|
|
102
|
-
node.parent.source.value === TS_FORTRESS_MODULE;
|
|
103
|
-
//# sourceMappingURL=import-utils.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"import-utils.mjs","sourceRoot":"","sources":["../../src/rules/import-utils.mts"],"names":[],"mappings":"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"}
|
package/src/rules/ast-utils.mts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { AST_NODE_TYPES, type TSESTree } from '@typescript-eslint/utils';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* `node` with every `as`, `satisfies`, `!` and `<T>` around it taken off: the
|
|
5
|
-
* expression whose value it is. Judge syntax on what this returns, so that a
|
|
6
|
-
* wrapper does not hide a pattern (`isString((x as R).a)`), and keep the
|
|
7
|
-
* original node for fix text. See `docs/writing-lint-rules.md` at the
|
|
8
|
-
* repository root.
|
|
9
|
-
*
|
|
10
|
-
* A copy of the helper in `eslint-config-typed`, which this package, published
|
|
11
|
-
* on its own, cannot import.
|
|
12
|
-
*/
|
|
13
|
-
export const skipTypeWrappers = (
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
15
|
-
node: TSESTree.Node,
|
|
16
|
-
): TSESTree.Node =>
|
|
17
|
-
isTypeWrapper(node) ? skipTypeWrappers(node.expression) : node;
|
|
18
|
-
|
|
19
|
-
export const isTypeWrapper = (
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
21
|
-
node: TSESTree.Node,
|
|
22
|
-
): node is TypeWrapper => TYPE_WRAPPERS.has(node.type);
|
|
23
|
-
|
|
24
|
-
export type TypeWrapper =
|
|
25
|
-
| TSESTree.TSAsExpression
|
|
26
|
-
| TSESTree.TSNonNullExpression
|
|
27
|
-
| TSESTree.TSSatisfiesExpression
|
|
28
|
-
| TSESTree.TSTypeAssertion;
|
|
29
|
-
|
|
30
|
-
const TYPE_WRAPPERS: ReadonlySet<AST_NODE_TYPES> = new Set([
|
|
31
|
-
AST_NODE_TYPES.TSAsExpression,
|
|
32
|
-
AST_NODE_TYPES.TSNonNullExpression,
|
|
33
|
-
AST_NODE_TYPES.TSSatisfiesExpression,
|
|
34
|
-
AST_NODE_TYPES.TSTypeAssertion,
|
|
35
|
-
]);
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AST_NODE_TYPES,
|
|
3
|
-
type TSESLint,
|
|
4
|
-
type TSESTree,
|
|
5
|
-
} from '@typescript-eslint/utils';
|
|
6
|
-
import { Arr } from 'ts-data-forge';
|
|
7
|
-
import { TS_FORTRESS_MODULE } from './constants.mjs';
|
|
8
|
-
|
|
9
|
-
/* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
|
|
10
|
-
|
|
11
|
-
export type ResolvedCallee = Readonly<{
|
|
12
|
-
/** The canonical (imported) ts-fortress name, regardless of local alias. */
|
|
13
|
-
canonicalName: string;
|
|
14
|
-
/** The identifier node to rewrite when replacing the callee name. */
|
|
15
|
-
propertyNode: TSESTree.Node;
|
|
16
|
-
/** Whether the call was made through a namespace import (`t.foo(...)`). */
|
|
17
|
-
isNamespace: boolean;
|
|
18
|
-
}>;
|
|
19
|
-
|
|
20
|
-
/** Every `import ... from 'ts-fortress'` declaration in the file. */
|
|
21
|
-
export const getTsFortressImports = (
|
|
22
|
-
program: TSESTree.Program,
|
|
23
|
-
): readonly TSESTree.ImportDeclaration[] =>
|
|
24
|
-
program.body.filter(
|
|
25
|
-
(node): node is TSESTree.ImportDeclaration =>
|
|
26
|
-
node.type === AST_NODE_TYPES.ImportDeclaration &&
|
|
27
|
-
node.source.value === TS_FORTRESS_MODULE,
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Returns the in-scope local name a given ts-fortress export is imported as
|
|
32
|
-
* (handling aliases such as `import { nonEmptyArray as nea }` → `'nea'`), or
|
|
33
|
-
* `undefined` when it is not imported. Used so autofixes reference the binding
|
|
34
|
-
* that actually exists rather than the canonical name.
|
|
35
|
-
*/
|
|
36
|
-
export const getImportedLocalName = (
|
|
37
|
-
importDeclarations: readonly TSESTree.ImportDeclaration[],
|
|
38
|
-
importedName: string,
|
|
39
|
-
): string | undefined =>
|
|
40
|
-
importDeclarations
|
|
41
|
-
.flatMap((declaration) => declaration.specifiers)
|
|
42
|
-
.find(
|
|
43
|
-
(specifier) =>
|
|
44
|
-
specifier.type === AST_NODE_TYPES.ImportSpecifier &&
|
|
45
|
-
(specifier.imported.type === AST_NODE_TYPES.Identifier
|
|
46
|
-
? specifier.imported.name
|
|
47
|
-
: specifier.imported.value) === importedName,
|
|
48
|
-
)?.local.name;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Builds a resolver that maps a call expression's callee to the canonical
|
|
52
|
-
* ts-fortress function it refers to. Handles named imports (including aliases)
|
|
53
|
-
* and namespace imports (`import * as t` → `t.foo(...)`) — the latter being the
|
|
54
|
-
* idiomatic way to consume ts-fortress. Returns `undefined` for any callee that
|
|
55
|
-
* does not reference the given ts-fortress imports.
|
|
56
|
-
*/
|
|
57
|
-
export const buildCalleeResolver = (
|
|
58
|
-
importDeclarations: readonly TSESTree.ImportDeclaration[],
|
|
59
|
-
): ((callee: TSESTree.Expression) => ResolvedCallee | undefined) => {
|
|
60
|
-
const specifiers = importDeclarations.flatMap(
|
|
61
|
-
(declaration) => declaration.specifiers,
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
const namespaceNames = new Set(
|
|
65
|
-
specifiers
|
|
66
|
-
.filter(
|
|
67
|
-
(specifier) =>
|
|
68
|
-
specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier,
|
|
69
|
-
)
|
|
70
|
-
.map((specifier) => specifier.local.name),
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
const localToCanonical = new Map<string, string>(
|
|
74
|
-
specifiers.flatMap((specifier) => {
|
|
75
|
-
if (specifier.type !== AST_NODE_TYPES.ImportSpecifier) {
|
|
76
|
-
return [];
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const importedName =
|
|
80
|
-
specifier.imported.type === AST_NODE_TYPES.Identifier
|
|
81
|
-
? specifier.imported.name
|
|
82
|
-
: specifier.imported.value;
|
|
83
|
-
|
|
84
|
-
return typeof importedName === 'string'
|
|
85
|
-
? [[specifier.local.name, importedName] as const]
|
|
86
|
-
: [];
|
|
87
|
-
}),
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
return (callee) => {
|
|
91
|
-
if (callee.type === AST_NODE_TYPES.Identifier) {
|
|
92
|
-
const canonicalName = localToCanonical.get(callee.name);
|
|
93
|
-
|
|
94
|
-
return canonicalName === undefined
|
|
95
|
-
? undefined
|
|
96
|
-
: { canonicalName, propertyNode: callee, isNamespace: false };
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return callee.type === AST_NODE_TYPES.MemberExpression &&
|
|
100
|
-
!callee.computed &&
|
|
101
|
-
callee.object.type === AST_NODE_TYPES.Identifier &&
|
|
102
|
-
namespaceNames.has(callee.object.name) &&
|
|
103
|
-
callee.property.type === AST_NODE_TYPES.Identifier
|
|
104
|
-
? {
|
|
105
|
-
canonicalName: callee.property.name,
|
|
106
|
-
propertyNode: callee.property,
|
|
107
|
-
isNamespace: true,
|
|
108
|
-
}
|
|
109
|
-
: undefined;
|
|
110
|
-
};
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Whether `name` resolves, at `node`, to a binding that is not a ts-fortress
|
|
115
|
-
* import — a local declaration, a parameter, or an import from another module.
|
|
116
|
-
* An autofix that makes a call reference `name` must bail out in that case,
|
|
117
|
-
* because the rewritten call would resolve to the wrong binding.
|
|
118
|
-
*
|
|
119
|
-
* Scope-based rather than a scan of the top-level statements, so a binding that
|
|
120
|
-
* merely shadows the ts-fortress one around the call site is caught too.
|
|
121
|
-
*/
|
|
122
|
-
export const hasForeignBinding = (
|
|
123
|
-
sourceCode: TSESLint.SourceCode,
|
|
124
|
-
node: TSESTree.Node,
|
|
125
|
-
name: string,
|
|
126
|
-
): boolean => {
|
|
127
|
-
for (
|
|
128
|
-
let mut_scope: TSESLint.Scope.Scope | null = sourceCode.getScope(node);
|
|
129
|
-
mut_scope !== null;
|
|
130
|
-
mut_scope = mut_scope.upper
|
|
131
|
-
) {
|
|
132
|
-
const variable = mut_scope.set.get(name);
|
|
133
|
-
|
|
134
|
-
// The innermost binding wins, so the first scope that declares `name`
|
|
135
|
-
// decides — an outer ts-fortress import does not rescue a shadowed name.
|
|
136
|
-
if (variable !== undefined) {
|
|
137
|
-
return variable.defs.some((def) => !isTsFortressImportDef(def.node));
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return false;
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Inserts `import { <name> } from 'ts-fortress';` for each name at the top of
|
|
146
|
-
* the file. Placement is deliberately naive: prettier-plugin-organize-imports
|
|
147
|
-
* (or any equivalent) merges and sorts them afterwards.
|
|
148
|
-
*
|
|
149
|
-
* All names go into a single fix on purpose: ESLint merges the fixes of one
|
|
150
|
-
* report into one edit span, so two reports each inserting at the start of the
|
|
151
|
-
* file would conflict and one of them would be dropped.
|
|
152
|
-
*/
|
|
153
|
-
export const buildImportsFix = (
|
|
154
|
-
fixer: TSESLint.RuleFixer,
|
|
155
|
-
program: TSESTree.Program,
|
|
156
|
-
names: readonly string[],
|
|
157
|
-
): readonly TSESLint.RuleFix[] =>
|
|
158
|
-
Arr.isEmpty(names)
|
|
159
|
-
? ([] as const)
|
|
160
|
-
: ([
|
|
161
|
-
fixer.insertTextBefore(
|
|
162
|
-
program,
|
|
163
|
-
names
|
|
164
|
-
.map((name) => `import { ${name} } from '${TS_FORTRESS_MODULE}';\n`)
|
|
165
|
-
.join(''),
|
|
166
|
-
),
|
|
167
|
-
] as const);
|
|
168
|
-
|
|
169
|
-
const isTsFortressImportDef = (node: TSESTree.Node): boolean =>
|
|
170
|
-
(node.type === AST_NODE_TYPES.ImportSpecifier ||
|
|
171
|
-
node.type === AST_NODE_TYPES.ImportDefaultSpecifier ||
|
|
172
|
-
node.type === AST_NODE_TYPES.ImportNamespaceSpecifier) &&
|
|
173
|
-
node.parent.type === AST_NODE_TYPES.ImportDeclaration &&
|
|
174
|
-
node.parent.source.value === TS_FORTRESS_MODULE;
|