eslint-plugin-jsdoc 50.6.17 → 50.7.1
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/alignTransform.cjs +10 -10
- package/dist/alignTransform.cjs.map +1 -1
- package/dist/exportParser.cjs +141 -135
- package/dist/exportParser.cjs.map +1 -1
- package/dist/generateRule.cjs +10 -12
- package/dist/generateRule.cjs.map +1 -1
- package/dist/getDefaultTagStructureForMode.cjs +73 -73
- package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
- package/dist/getJsdocProcessorPlugin.cjs +121 -110
- package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
- package/dist/index.cjs +17 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/iterateJsdoc.cjs +87 -66
- package/dist/iterateJsdoc.cjs.map +1 -1
- package/dist/jsdocUtils.cjs +144 -142
- package/dist/jsdocUtils.cjs.map +1 -1
- package/dist/rules/checkAlignment.cjs +2 -2
- package/dist/rules/checkAlignment.cjs.map +1 -1
- package/dist/rules/checkExamples.cjs +22 -28
- package/dist/rules/checkExamples.cjs.map +1 -1
- package/dist/rules/checkIndentation.cjs +2 -2
- package/dist/rules/checkIndentation.cjs.map +1 -1
- package/dist/rules/checkLineAlignment.cjs +14 -14
- package/dist/rules/checkLineAlignment.cjs.map +1 -1
- package/dist/rules/checkParamNames.cjs +21 -15
- package/dist/rules/checkParamNames.cjs.map +1 -1
- package/dist/rules/checkPropertyNames.cjs +2 -2
- package/dist/rules/checkPropertyNames.cjs.map +1 -1
- package/dist/rules/checkTagNames.cjs +11 -11
- package/dist/rules/checkTagNames.cjs.map +1 -1
- package/dist/rules/checkTemplateNames.cjs +21 -22
- package/dist/rules/checkTemplateNames.cjs.map +1 -1
- package/dist/rules/checkTypes.cjs +10 -10
- package/dist/rules/checkTypes.cjs.map +1 -1
- package/dist/rules/checkValues.cjs +11 -14
- package/dist/rules/checkValues.cjs.map +1 -1
- package/dist/rules/convertToJsdocComments.cjs +26 -27
- package/dist/rules/convertToJsdocComments.cjs.map +1 -1
- package/dist/rules/emptyTags.cjs +6 -6
- package/dist/rules/emptyTags.cjs.map +1 -1
- package/dist/rules/importsAsDependencies.cjs.map +1 -1
- package/dist/rules/informativeDocs.cjs +12 -12
- package/dist/rules/informativeDocs.cjs.map +1 -1
- package/dist/rules/linesBeforeBlock.cjs +12 -12
- package/dist/rules/linesBeforeBlock.cjs.map +1 -1
- package/dist/rules/matchDescription.cjs +1 -1
- package/dist/rules/matchDescription.cjs.map +1 -1
- package/dist/rules/matchName.cjs +4 -4
- package/dist/rules/matchName.cjs.map +1 -1
- package/dist/rules/multilineBlocks.cjs +10 -10
- package/dist/rules/multilineBlocks.cjs.map +1 -1
- package/dist/rules/noBadBlocks.cjs +3 -3
- package/dist/rules/noBadBlocks.cjs.map +1 -1
- package/dist/rules/noMultiAsterisks.cjs +6 -6
- package/dist/rules/noMultiAsterisks.cjs.map +1 -1
- package/dist/rules/noRestrictedSyntax.cjs +2 -2
- package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
- package/dist/rules/noTypes.cjs.map +1 -1
- package/dist/rules/noUndefinedTypes.cjs +17 -20
- package/dist/rules/noUndefinedTypes.cjs.map +1 -1
- package/dist/rules/requireAsteriskPrefix.cjs +4 -4
- package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
- package/dist/rules/requireDescription.cjs +2 -2
- package/dist/rules/requireDescription.cjs.map +1 -1
- package/dist/rules/requireDescriptionCompleteSentence.cjs +8 -8
- package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
- package/dist/rules/requireFileOverview.cjs +6 -6
- package/dist/rules/requireFileOverview.cjs.map +1 -1
- package/dist/rules/requireHyphenBeforeParamDescription.cjs +1 -4
- package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
- package/dist/rules/requireJsdoc.cjs +19 -19
- package/dist/rules/requireJsdoc.cjs.map +1 -1
- package/dist/rules/requireParam.cjs +12 -12
- package/dist/rules/requireParam.cjs.map +1 -1
- package/dist/rules/requireProperty.cjs +1 -1
- package/dist/rules/requireProperty.cjs.map +1 -1
- package/dist/rules/requireReturns.cjs +3 -3
- package/dist/rules/requireReturns.cjs.map +1 -1
- package/dist/rules/requireReturnsCheck.cjs +1 -1
- package/dist/rules/requireReturnsCheck.cjs.map +1 -1
- package/dist/rules/requireReturnsDescription.cjs +1 -1
- package/dist/rules/requireReturnsDescription.cjs.map +1 -1
- package/dist/rules/requireTemplate.cjs +16 -15
- package/dist/rules/requireTemplate.cjs.map +1 -1
- package/dist/rules/requireYields.cjs +4 -4
- package/dist/rules/requireYields.cjs.map +1 -1
- package/dist/rules/requireYieldsCheck.cjs +6 -6
- package/dist/rules/requireYieldsCheck.cjs.map +1 -1
- package/dist/rules/sortTags.cjs +13 -13
- package/dist/rules/sortTags.cjs.map +1 -1
- package/dist/rules/tagLines.cjs +11 -11
- package/dist/rules/tagLines.cjs.map +1 -1
- package/dist/rules/textEscaping.cjs +2 -2
- package/dist/rules/textEscaping.cjs.map +1 -1
- package/dist/rules/validTypes.cjs +15 -15
- package/dist/rules/validTypes.cjs.map +1 -1
- package/dist/tagNames.cjs +1 -1
- package/dist/tagNames.cjs.map +1 -1
- package/dist/utils/hasReturnValue.cjs +176 -176
- package/dist/utils/hasReturnValue.cjs.map +1 -1
- package/eslint.config.js +36 -32
- package/package.json +29 -29
- package/pnpm-workspace.yaml +1 -0
- package/src/alignTransform.js +15 -15
- package/src/exportParser.js +386 -373
- package/src/getDefaultTagStructureForMode.js +45 -45
- package/src/getJsdocProcessorPlugin.js +175 -128
- package/src/index.js +66 -37
- package/src/iterateJsdoc.js +61 -28
- package/src/jsdocUtils.js +354 -338
- package/src/rules/checkAlignment.js +2 -2
- package/src/rules/checkExamples.js +16 -20
- package/src/rules/checkIndentation.js +2 -2
- package/src/rules/checkLineAlignment.js +10 -10
- package/src/rules/checkParamNames.js +22 -14
- package/src/rules/checkPropertyNames.js +1 -1
- package/src/rules/checkTagNames.js +7 -7
- package/src/rules/checkTemplateNames.js +52 -38
- package/src/rules/checkTypes.js +7 -7
- package/src/rules/checkValues.js +16 -17
- package/src/rules/convertToJsdocComments.js +47 -37
- package/src/rules/emptyTags.js +14 -7
- package/src/rules/importsAsDependencies.js +3 -1
- package/src/rules/informativeDocs.js +58 -58
- package/src/rules/linesBeforeBlock.js +25 -17
- package/src/rules/matchDescription.js +1 -1
- package/src/rules/matchName.js +2 -2
- package/src/rules/multilineBlocks.js +10 -10
- package/src/rules/noBadBlocks.js +3 -3
- package/src/rules/noMultiAsterisks.js +4 -4
- package/src/rules/noRestrictedSyntax.js +1 -1
- package/src/rules/noTypes.js +1 -1
- package/src/rules/noUndefinedTypes.js +29 -23
- package/src/rules/requireAsteriskPrefix.js +3 -3
- package/src/rules/requireDescription.js +1 -1
- package/src/rules/requireDescriptionCompleteSentence.js +6 -6
- package/src/rules/requireFileOverview.js +3 -3
- package/src/rules/requireHyphenBeforeParamDescription.js +2 -5
- package/src/rules/requireJsdoc.js +14 -14
- package/src/rules/requireParam.js +9 -9
- package/src/rules/requireProperty.js +1 -1
- package/src/rules/requireReturns.js +1 -1
- package/src/rules/requireReturnsCheck.js +1 -1
- package/src/rules/requireReturnsDescription.js +1 -1
- package/src/rules/requireTemplate.js +59 -38
- package/src/rules/requireYields.js +3 -3
- package/src/rules/requireYieldsCheck.js +1 -1
- package/src/rules/sortTags.js +7 -7
- package/src/rules/tagLines.js +8 -8
- package/src/rules/textEscaping.js +2 -0
- package/src/rules/validTypes.js +29 -29
- package/src/tagNames.js +2 -2
- package/src/utils/hasReturnValue.js +298 -283
|
@@ -20,7 +20,8 @@ const isNewPromiseExpression = (node) => {
|
|
|
20
20
|
*/
|
|
21
21
|
const isVoidPromise = (node) => {
|
|
22
22
|
return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (node)?.typeArguments?.params?.[0]?.type === 'TSVoidKeyword'
|
|
23
|
-
/* c8 ignore next
|
|
23
|
+
/* c8 ignore next 5 */
|
|
24
|
+
// eslint-disable-next-line @stylistic/operator-linebreak -- c8
|
|
24
25
|
|| /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (
|
|
25
26
|
node
|
|
26
27
|
// @ts-expect-error Ok
|
|
@@ -28,7 +29,7 @@ const isVoidPromise = (node) => {
|
|
|
28
29
|
};
|
|
29
30
|
|
|
30
31
|
const undefinedKeywords = new Set([
|
|
31
|
-
'
|
|
32
|
+
'TSNeverKeyword', 'TSUndefinedKeyword', 'TSVoidKeyword',
|
|
32
33
|
]);
|
|
33
34
|
|
|
34
35
|
/**
|
|
@@ -45,83 +46,87 @@ const hasReturnValue = (node, throwOnNullReturn, promFilter) => {
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
switch (node.type) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
case 'MethodDefinition':
|
|
56
|
-
return hasReturnValue(node.value, throwOnNullReturn, promFilter);
|
|
57
|
-
case 'FunctionExpression':
|
|
58
|
-
case 'FunctionDeclaration':
|
|
59
|
-
case 'ArrowFunctionExpression': {
|
|
60
|
-
return 'expression' in node && node.expression && (!isNewPromiseExpression(
|
|
61
|
-
node.body,
|
|
62
|
-
) || !isVoidPromise(node.body)) ||
|
|
49
|
+
case 'ArrowFunctionExpression':
|
|
50
|
+
case 'FunctionDeclaration':
|
|
51
|
+
case 'FunctionExpression': {
|
|
52
|
+
return 'expression' in node && node.expression && (!isNewPromiseExpression(
|
|
53
|
+
node.body,
|
|
54
|
+
) || !isVoidPromise(node.body)) ||
|
|
63
55
|
hasReturnValue(node.body, throwOnNullReturn, promFilter);
|
|
64
|
-
|
|
56
|
+
}
|
|
65
57
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
58
|
+
case 'BlockStatement': {
|
|
59
|
+
return node.body.some((bodyNode) => {
|
|
60
|
+
return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
71
63
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
case 'ForStatement':
|
|
76
|
-
case 'ForInStatement':
|
|
77
|
-
case 'ForOfStatement':
|
|
78
|
-
case 'WithStatement': {
|
|
79
|
-
return hasReturnValue(node.body, throwOnNullReturn, promFilter);
|
|
80
|
-
}
|
|
64
|
+
case 'DoWhileStatement':
|
|
65
|
+
case 'ForInStatement':
|
|
66
|
+
case 'ForOfStatement':
|
|
81
67
|
|
|
82
|
-
|
|
83
|
-
return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||
|
|
84
|
-
hasReturnValue(node.alternate, throwOnNullReturn, promFilter);
|
|
85
|
-
}
|
|
68
|
+
case 'ForStatement':
|
|
86
69
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
hasReturnValue(node.
|
|
91
|
-
|
|
70
|
+
case 'LabeledStatement':
|
|
71
|
+
case 'WhileStatement':
|
|
72
|
+
case 'WithStatement': {
|
|
73
|
+
return hasReturnValue(node.body, throwOnNullReturn, promFilter);
|
|
74
|
+
}
|
|
92
75
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
(
|
|
96
|
-
|
|
97
|
-
return hasReturnValue(nde, throwOnNullReturn, promFilter);
|
|
98
|
-
});
|
|
99
|
-
},
|
|
100
|
-
);
|
|
101
|
-
}
|
|
76
|
+
case 'IfStatement': {
|
|
77
|
+
return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||
|
|
78
|
+
hasReturnValue(node.alternate, throwOnNullReturn, promFilter);
|
|
79
|
+
}
|
|
102
80
|
|
|
103
|
-
|
|
81
|
+
case 'MethodDefinition':
|
|
82
|
+
return hasReturnValue(node.value, throwOnNullReturn, promFilter);
|
|
83
|
+
case 'ReturnStatement': {
|
|
104
84
|
// void return does not count.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
85
|
+
if (node.argument === null) {
|
|
86
|
+
if (throwOnNullReturn) {
|
|
87
|
+
throw new Error('Null return');
|
|
88
|
+
}
|
|
109
89
|
|
|
110
|
-
|
|
111
|
-
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
112
92
|
|
|
113
|
-
|
|
93
|
+
if (promFilter && isNewPromiseExpression(node.argument)) {
|
|
114
94
|
// Let caller decide how to filter, but this is, at the least,
|
|
115
95
|
// a return of sorts and truthy
|
|
116
|
-
|
|
96
|
+
return promFilter(node.argument);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return true;
|
|
117
100
|
}
|
|
118
101
|
|
|
119
|
-
|
|
120
|
-
|
|
102
|
+
case 'SwitchStatement': {
|
|
103
|
+
return node.cases.some(
|
|
104
|
+
(someCase) => {
|
|
105
|
+
return someCase.consequent.some((nde) => {
|
|
106
|
+
return hasReturnValue(nde, throwOnNullReturn, promFilter);
|
|
107
|
+
});
|
|
108
|
+
},
|
|
109
|
+
);
|
|
110
|
+
}
|
|
121
111
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
112
|
+
case 'TryStatement': {
|
|
113
|
+
return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||
|
|
114
|
+
hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||
|
|
115
|
+
hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
case 'TSDeclareFunction':
|
|
119
|
+
|
|
120
|
+
case 'TSFunctionType':
|
|
121
|
+
|
|
122
|
+
case 'TSMethodSignature': {
|
|
123
|
+
const type = node?.returnType?.typeAnnotation?.type;
|
|
124
|
+
return type && !undefinedKeywords.has(type);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
default: {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
125
130
|
}
|
|
126
131
|
};
|
|
127
132
|
|
|
@@ -138,66 +143,92 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
138
143
|
}
|
|
139
144
|
|
|
140
145
|
switch (node.type) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
// case 'MethodDefinition':
|
|
149
|
-
// return allBrancheshaveReturnValues(node.value, promFilter);
|
|
150
|
-
case 'FunctionExpression':
|
|
151
|
-
case 'FunctionDeclaration':
|
|
152
|
-
case 'ArrowFunctionExpression': {
|
|
153
|
-
return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||
|
|
146
|
+
// case 'MethodDefinition':
|
|
147
|
+
// return allBrancheshaveReturnValues(node.value, promFilter);
|
|
148
|
+
case 'ArrowFunctionExpression':
|
|
149
|
+
case 'FunctionDeclaration':
|
|
150
|
+
case 'FunctionExpression': {
|
|
151
|
+
return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||
|
|
154
152
|
allBrancheshaveReturnValues(node.body, promFilter) ||
|
|
155
153
|
/** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */
|
|
156
154
|
(node.body).body.some((nde) => {
|
|
157
155
|
return nde.type === 'ReturnStatement';
|
|
158
156
|
});
|
|
159
|
-
|
|
157
|
+
}
|
|
160
158
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
159
|
+
case 'BlockStatement': {
|
|
160
|
+
const lastBodyNode = node.body.slice(-1)[0];
|
|
161
|
+
return allBrancheshaveReturnValues(lastBodyNode, promFilter);
|
|
162
|
+
}
|
|
165
163
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
case 'DoWhileStatement':
|
|
165
|
+
case 'WhileStatement':
|
|
166
|
+
if (
|
|
169
167
|
/**
|
|
170
168
|
* @type {import('@typescript-eslint/types').TSESTree.Literal}
|
|
171
169
|
*/
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
(node.test).value === true
|
|
171
|
+
) {
|
|
174
172
|
// If this is an infinite loop, we assume only one branch
|
|
175
173
|
// is needed to provide a return
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
return hasReturnValue(node.body, false, promFilter);
|
|
175
|
+
}
|
|
178
176
|
|
|
179
177
|
// Fallthrough
|
|
180
|
-
|
|
181
|
-
|
|
178
|
+
case 'ForStatement':
|
|
179
|
+
if (node.test === null) {
|
|
182
180
|
// If this is an infinite loop, we assume only one branch
|
|
183
181
|
// is needed to provide a return
|
|
184
|
-
|
|
182
|
+
return hasReturnValue(node.body, false, promFilter);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
case 'ForInStatement':
|
|
186
|
+
case 'ForOfStatement':
|
|
187
|
+
|
|
188
|
+
case 'LabeledStatement':
|
|
189
|
+
|
|
190
|
+
case 'WithStatement': {
|
|
191
|
+
return allBrancheshaveReturnValues(node.body, promFilter);
|
|
185
192
|
}
|
|
186
|
-
case 'LabeledStatement':
|
|
187
|
-
case 'ForInStatement':
|
|
188
|
-
case 'ForOfStatement':
|
|
189
|
-
case 'WithStatement': {
|
|
190
|
-
return allBrancheshaveReturnValues(node.body, promFilter);
|
|
191
|
-
}
|
|
192
193
|
|
|
193
|
-
|
|
194
|
-
|
|
194
|
+
case 'IfStatement': {
|
|
195
|
+
return allBrancheshaveReturnValues(node.consequent, promFilter) &&
|
|
195
196
|
allBrancheshaveReturnValues(node.alternate, promFilter);
|
|
196
|
-
|
|
197
|
+
}
|
|
197
198
|
|
|
198
|
-
|
|
199
|
+
case 'ReturnStatement': {
|
|
200
|
+
// void return does not count.
|
|
201
|
+
if (node.argument === null) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (promFilter && isNewPromiseExpression(node.argument)) {
|
|
206
|
+
// Let caller decide how to filter, but this is, at the least,
|
|
207
|
+
// a return of sorts and truthy
|
|
208
|
+
return promFilter(node.argument);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
case 'SwitchStatement': {
|
|
215
|
+
return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(
|
|
216
|
+
(someCase) => {
|
|
217
|
+
return !someCase.consequent.some((consNode) => {
|
|
218
|
+
return consNode.type === 'BreakStatement' ||
|
|
219
|
+
consNode.type === 'ReturnStatement' && consNode.argument === null;
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
case 'ThrowStatement': {
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
case 'TryStatement': {
|
|
199
230
|
// If `finally` returns, all return
|
|
200
|
-
|
|
231
|
+
return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||
|
|
201
232
|
// Return in `try`/`catch` may still occur despite `finally`
|
|
202
233
|
allBrancheshaveReturnValues(node.block, promFilter) &&
|
|
203
234
|
(!node.handler ||
|
|
@@ -209,48 +240,28 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
|
|
|
209
240
|
if (/** @type {Error} */ (error).message === 'Null return') {
|
|
210
241
|
return false;
|
|
211
242
|
}
|
|
212
|
-
/* c8 ignore next
|
|
243
|
+
/* c8 ignore next 3 */
|
|
244
|
+
// eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
|
|
213
245
|
throw error;
|
|
214
246
|
}
|
|
215
247
|
|
|
216
248
|
// As long as not an explicit empty return, then return true
|
|
217
249
|
return true;
|
|
218
250
|
})());
|
|
219
|
-
|
|
251
|
+
}
|
|
220
252
|
|
|
221
|
-
|
|
222
|
-
return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(
|
|
223
|
-
(someCase) => {
|
|
224
|
-
return !someCase.consequent.some((consNode) => {
|
|
225
|
-
return consNode.type === 'BreakStatement' ||
|
|
226
|
-
consNode.type === 'ReturnStatement' && consNode.argument === null;
|
|
227
|
-
});
|
|
228
|
-
},
|
|
229
|
-
);
|
|
230
|
-
}
|
|
253
|
+
case 'TSDeclareFunction':
|
|
231
254
|
|
|
232
|
-
|
|
233
|
-
return true;
|
|
234
|
-
}
|
|
255
|
+
case 'TSFunctionType':
|
|
235
256
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
return false;
|
|
257
|
+
case 'TSMethodSignature': {
|
|
258
|
+
const type = node?.returnType?.typeAnnotation?.type;
|
|
259
|
+
return type && !undefinedKeywords.has(type);
|
|
240
260
|
}
|
|
241
261
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
// a return of sorts and truthy
|
|
245
|
-
return promFilter(node.argument);
|
|
262
|
+
default: {
|
|
263
|
+
return false;
|
|
246
264
|
}
|
|
247
|
-
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
default: {
|
|
252
|
-
return false;
|
|
253
|
-
}
|
|
254
265
|
}
|
|
255
266
|
};
|
|
256
267
|
|
|
@@ -280,17 +291,55 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
280
291
|
|
|
281
292
|
// Arrow function without block
|
|
282
293
|
switch (node.type) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
294
|
+
case 'ArrayExpression':
|
|
295
|
+
case 'ArrayPattern':
|
|
296
|
+
return node.elements.some((element) => {
|
|
297
|
+
return hasNonEmptyResolverCall(element, resolverName);
|
|
298
|
+
});
|
|
299
|
+
case 'ArrowFunctionExpression':
|
|
300
|
+
case 'FunctionDeclaration':
|
|
301
|
+
case 'FunctionExpression': {
|
|
302
|
+
// Shadowing
|
|
303
|
+
if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
|
|
304
|
+
node.params[0]
|
|
305
|
+
)?.name === resolverName) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return hasNonEmptyResolverCall(node.body, resolverName);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
case 'AssignmentExpression':
|
|
313
|
+
case 'BinaryExpression':
|
|
314
|
+
case 'LogicalExpression': {
|
|
315
|
+
return hasNonEmptyResolverCall(node.left, resolverName) ||
|
|
316
|
+
hasNonEmptyResolverCall(node.right, resolverName);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
case 'AssignmentPattern':
|
|
320
|
+
return hasNonEmptyResolverCall(node.right, resolverName);
|
|
321
|
+
case 'AwaitExpression':
|
|
322
|
+
|
|
323
|
+
case 'SpreadElement':
|
|
324
|
+
case 'UnaryExpression':
|
|
325
|
+
case 'YieldExpression':
|
|
326
|
+
return hasNonEmptyResolverCall(node.argument, resolverName);
|
|
327
|
+
case 'BlockStatement':
|
|
328
|
+
case 'ClassBody':
|
|
329
|
+
return node.body.some((bodyNode) => {
|
|
330
|
+
return hasNonEmptyResolverCall(bodyNode, resolverName);
|
|
331
|
+
});
|
|
332
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
333
|
+
case 'CallExpression':
|
|
334
|
+
// @ts-expect-error Babel?
|
|
335
|
+
case 'OptionalCallExpression':
|
|
336
|
+
return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
|
|
337
|
+
node.callee
|
|
338
|
+
).name === resolverName && (
|
|
290
339
|
|
|
291
340
|
// Implicit or explicit undefined
|
|
292
|
-
|
|
293
|
-
|
|
341
|
+
node.arguments.length > 1 || node.arguments[0] !== undefined
|
|
342
|
+
) ||
|
|
294
343
|
node.arguments.some((nde) => {
|
|
295
344
|
// Being passed in to another function (which might invoke it)
|
|
296
345
|
return nde.type === 'Identifier' && nde.name === resolverName ||
|
|
@@ -298,170 +347,135 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
298
347
|
// Handle nested items
|
|
299
348
|
hasNonEmptyResolverCall(nde, resolverName);
|
|
300
349
|
});
|
|
301
|
-
case 'ChainExpression':
|
|
302
|
-
case 'Decorator':
|
|
303
|
-
case 'ExpressionStatement':
|
|
304
|
-
return hasNonEmptyResolverCall(node.expression, resolverName);
|
|
305
|
-
case 'ClassBody':
|
|
306
|
-
case 'BlockStatement':
|
|
307
|
-
return node.body.some((bodyNode) => {
|
|
308
|
-
return hasNonEmptyResolverCall(bodyNode, resolverName);
|
|
309
|
-
});
|
|
310
|
-
case 'FunctionExpression':
|
|
311
|
-
case 'FunctionDeclaration':
|
|
312
|
-
case 'ArrowFunctionExpression': {
|
|
313
|
-
// Shadowing
|
|
314
|
-
if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
|
|
315
|
-
node.params[0]
|
|
316
|
-
)?.name === resolverName) {
|
|
317
|
-
return false;
|
|
318
|
-
}
|
|
319
350
|
|
|
320
|
-
|
|
321
|
-
|
|
351
|
+
case 'ChainExpression':
|
|
352
|
+
case 'Decorator':
|
|
322
353
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
case 'DoWhileStatement':
|
|
326
|
-
case 'ForStatement':
|
|
327
|
-
case 'ForInStatement':
|
|
328
|
-
case 'ForOfStatement':
|
|
329
|
-
case 'WithStatement': {
|
|
330
|
-
return hasNonEmptyResolverCall(node.body, resolverName);
|
|
331
|
-
}
|
|
354
|
+
case 'ExpressionStatement':
|
|
355
|
+
return hasNonEmptyResolverCall(node.expression, resolverName);
|
|
332
356
|
|
|
333
|
-
|
|
334
|
-
case 'IfStatement': {
|
|
335
|
-
return hasNonEmptyResolverCall(node.test, resolverName) ||
|
|
336
|
-
hasNonEmptyResolverCall(node.consequent, resolverName) ||
|
|
337
|
-
hasNonEmptyResolverCall(node.alternate, resolverName);
|
|
338
|
-
}
|
|
357
|
+
case 'ClassDeclaration':
|
|
339
358
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
359
|
+
case 'ClassExpression':
|
|
360
|
+
return hasNonEmptyResolverCall(node.body, resolverName);
|
|
361
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
362
|
+
// @ts-expect-error Babel?
|
|
363
|
+
case 'ClassMethod':
|
|
345
364
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
},
|
|
353
|
-
);
|
|
354
|
-
}
|
|
365
|
+
case 'MethodDefinition':
|
|
366
|
+
return node.decorators && node.decorators.some((decorator) => {
|
|
367
|
+
return hasNonEmptyResolverCall(decorator, resolverName);
|
|
368
|
+
}) ||
|
|
369
|
+
node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
|
|
370
|
+
hasNonEmptyResolverCall(node.value, resolverName);
|
|
355
371
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
372
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
373
|
+
// @ts-expect-error Babel?
|
|
374
|
+
case 'ClassProperty':
|
|
375
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
376
|
+
// @ts-expect-error Babel?
|
|
377
|
+
case 'ObjectProperty':
|
|
378
|
+
case 'Property':
|
|
361
379
|
|
|
362
|
-
|
|
363
|
-
|
|
380
|
+
case 'PropertyDefinition':
|
|
381
|
+
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
|
|
382
|
+
hasNonEmptyResolverCall(node.value, resolverName);
|
|
383
|
+
case 'ConditionalExpression':
|
|
364
384
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}
|
|
385
|
+
case 'IfStatement': {
|
|
386
|
+
return hasNonEmptyResolverCall(node.test, resolverName) ||
|
|
387
|
+
hasNonEmptyResolverCall(node.consequent, resolverName) ||
|
|
388
|
+
hasNonEmptyResolverCall(node.alternate, resolverName);
|
|
389
|
+
}
|
|
371
390
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
return node.expressions.some((subExpression) => {
|
|
376
|
-
return hasNonEmptyResolverCall(subExpression, resolverName);
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
case 'ObjectPattern':
|
|
380
|
-
case 'ObjectExpression':
|
|
381
|
-
return node.properties.some((property) => {
|
|
382
|
-
return hasNonEmptyResolverCall(property, resolverName);
|
|
383
|
-
});
|
|
384
|
-
/* c8 ignore next 2 -- In Babel? */
|
|
385
|
-
// @ts-expect-error Babel?
|
|
386
|
-
case 'ClassMethod':
|
|
387
|
-
case 'MethodDefinition':
|
|
388
|
-
return node.decorators && node.decorators.some((decorator) => {
|
|
389
|
-
return hasNonEmptyResolverCall(decorator, resolverName);
|
|
390
|
-
}) ||
|
|
391
|
-
node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
|
|
392
|
-
hasNonEmptyResolverCall(node.value, resolverName);
|
|
391
|
+
case 'DoWhileStatement':
|
|
392
|
+
case 'ForInStatement':
|
|
393
|
+
case 'ForOfStatement':
|
|
393
394
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
hasNonEmptyResolverCall(node.
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
395
|
+
case 'ForStatement':
|
|
396
|
+
case 'LabeledStatement':
|
|
397
|
+
case 'WhileStatement':
|
|
398
|
+
case 'WithStatement': {
|
|
399
|
+
return hasNonEmptyResolverCall(node.body, resolverName);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
403
|
+
// @ts-expect-error Babel?
|
|
404
|
+
case 'Import':
|
|
405
|
+
|
|
406
|
+
case 'ImportExpression':
|
|
407
|
+
return hasNonEmptyResolverCall(node.source, resolverName);
|
|
408
|
+
// ?.
|
|
409
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
410
|
+
case 'MemberExpression':
|
|
411
|
+
|
|
412
|
+
// @ts-expect-error Babel?
|
|
413
|
+
case 'OptionalMemberExpression':
|
|
414
|
+
return hasNonEmptyResolverCall(node.object, resolverName) ||
|
|
415
|
+
hasNonEmptyResolverCall(node.property, resolverName);
|
|
416
|
+
case 'ObjectExpression':
|
|
417
|
+
case 'ObjectPattern':
|
|
418
|
+
return node.properties.some((property) => {
|
|
419
|
+
return hasNonEmptyResolverCall(property, resolverName);
|
|
420
|
+
});
|
|
421
|
+
/* c8 ignore next 2 -- In Babel? */
|
|
422
|
+
// @ts-expect-error Babel?
|
|
423
|
+
case 'ObjectMethod':
|
|
410
424
|
/* c8 ignore next 6 -- In Babel? */
|
|
411
425
|
// @ts-expect-error
|
|
412
|
-
|
|
426
|
+
return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||
|
|
413
427
|
// @ts-expect-error
|
|
414
428
|
node.arguments.some((nde) => {
|
|
415
429
|
return hasNonEmptyResolverCall(nde, resolverName);
|
|
416
430
|
});
|
|
417
431
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
432
|
+
case 'ReturnStatement': {
|
|
433
|
+
if (node.argument === null) {
|
|
434
|
+
return false;
|
|
435
|
+
}
|
|
421
436
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
case 'UnaryExpression':
|
|
425
|
-
case 'YieldExpression':
|
|
426
|
-
return hasNonEmptyResolverCall(node.argument, resolverName);
|
|
437
|
+
return hasNonEmptyResolverCall(node.argument, resolverName);
|
|
438
|
+
}
|
|
427
439
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
return hasNonEmptyResolverCall(nde, resolverName);
|
|
431
|
-
});
|
|
432
|
-
}
|
|
440
|
+
// Comma
|
|
441
|
+
case 'SequenceExpression':
|
|
433
442
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
443
|
+
case 'TemplateLiteral':
|
|
444
|
+
return node.expressions.some((subExpression) => {
|
|
445
|
+
return hasNonEmptyResolverCall(subExpression, resolverName);
|
|
446
|
+
});
|
|
438
447
|
|
|
439
|
-
|
|
440
|
-
|
|
448
|
+
case 'SwitchStatement': {
|
|
449
|
+
return node.cases.some(
|
|
450
|
+
(someCase) => {
|
|
451
|
+
return someCase.consequent.some((nde) => {
|
|
452
|
+
return hasNonEmptyResolverCall(nde, resolverName);
|
|
453
|
+
});
|
|
454
|
+
},
|
|
455
|
+
);
|
|
456
|
+
}
|
|
441
457
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
// @ts-expect-error Babel?
|
|
445
|
-
case 'OptionalMemberExpression':
|
|
446
|
-
case 'MemberExpression':
|
|
447
|
-
return hasNonEmptyResolverCall(node.object, resolverName) ||
|
|
448
|
-
hasNonEmptyResolverCall(node.property, resolverName);
|
|
458
|
+
case 'TaggedTemplateExpression':
|
|
459
|
+
return hasNonEmptyResolverCall(node.quasi, resolverName);
|
|
449
460
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
461
|
+
case 'TryStatement': {
|
|
462
|
+
return hasNonEmptyResolverCall(node.block, resolverName) ||
|
|
463
|
+
hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||
|
|
464
|
+
hasNonEmptyResolverCall(node.finalizer, resolverName);
|
|
465
|
+
}
|
|
455
466
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
467
|
+
case 'VariableDeclaration': {
|
|
468
|
+
return node.declarations.some((nde) => {
|
|
469
|
+
return hasNonEmptyResolverCall(nde, resolverName);
|
|
470
|
+
});
|
|
459
471
|
}
|
|
460
472
|
|
|
461
|
-
|
|
462
|
-
|
|
473
|
+
case 'VariableDeclarator': {
|
|
474
|
+
return hasNonEmptyResolverCall(node.id, resolverName) ||
|
|
475
|
+
hasNonEmptyResolverCall(node.init, resolverName);
|
|
476
|
+
}
|
|
463
477
|
|
|
464
|
-
|
|
478
|
+
/*
|
|
465
479
|
// Shouldn't need to parse literals/literal components, etc.
|
|
466
480
|
|
|
467
481
|
case 'Identifier':
|
|
@@ -469,8 +483,8 @@ const hasNonEmptyResolverCall = (node, resolverName) => {
|
|
|
469
483
|
case 'Super':
|
|
470
484
|
// Exports not relevant in this context
|
|
471
485
|
*/
|
|
472
|
-
|
|
473
|
-
|
|
486
|
+
default:
|
|
487
|
+
return false;
|
|
474
488
|
}
|
|
475
489
|
};
|
|
476
490
|
|
|
@@ -498,7 +512,8 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
|
|
|
498
512
|
if (/** @type {Error} */ (error).message === 'Null return') {
|
|
499
513
|
return false;
|
|
500
514
|
}
|
|
501
|
-
/* c8 ignore next
|
|
515
|
+
/* c8 ignore next 3 */
|
|
516
|
+
// eslint-disable-next-line @stylistic/padding-line-between-statements -- c8
|
|
502
517
|
throw error;
|
|
503
518
|
}
|
|
504
519
|
|
|
@@ -525,8 +540,8 @@ const hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, all
|
|
|
525
540
|
}
|
|
526
541
|
|
|
527
542
|
const {
|
|
528
|
-
params,
|
|
529
543
|
body,
|
|
544
|
+
params,
|
|
530
545
|
} =
|
|
531
546
|
/**
|
|
532
547
|
* @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|
|