eslint-plugin-jsdoc 44.2.2 → 44.2.4

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.
Files changed (117) hide show
  1. package/dist/alignTransform.js +86 -4
  2. package/dist/alignTransform.js.map +1 -1
  3. package/dist/exportParser.js +134 -4
  4. package/dist/exportParser.js.map +1 -1
  5. package/dist/getDefaultTagStructureForMode.js +71 -62
  6. package/dist/getDefaultTagStructureForMode.js.map +1 -1
  7. package/dist/index.js +7 -5
  8. package/dist/index.js.map +1 -1
  9. package/dist/iterateJsdoc.js +1081 -111
  10. package/dist/iterateJsdoc.js.map +1 -1
  11. package/dist/jsdocUtils.js +381 -132
  12. package/dist/jsdocUtils.js.map +1 -1
  13. package/dist/rules/checkAlignment.js +6 -0
  14. package/dist/rules/checkAlignment.js.map +1 -1
  15. package/dist/rules/checkExamples.js +70 -6
  16. package/dist/rules/checkExamples.js.map +1 -1
  17. package/dist/rules/checkIndentation.js +11 -1
  18. package/dist/rules/checkIndentation.js.map +1 -1
  19. package/dist/rules/checkLineAlignment.js +69 -5
  20. package/dist/rules/checkLineAlignment.js.map +1 -1
  21. package/dist/rules/checkParamNames.js +12 -7
  22. package/dist/rules/checkParamNames.js.map +1 -1
  23. package/dist/rules/checkPropertyNames.js +13 -7
  24. package/dist/rules/checkPropertyNames.js.map +1 -1
  25. package/dist/rules/checkTagNames.js +45 -5
  26. package/dist/rules/checkTagNames.js.map +1 -1
  27. package/dist/rules/checkTypes.js +97 -36
  28. package/dist/rules/checkTypes.js.map +1 -1
  29. package/dist/rules/checkValues.js +6 -6
  30. package/dist/rules/checkValues.js.map +1 -1
  31. package/dist/rules/emptyTags.js +8 -1
  32. package/dist/rules/emptyTags.js.map +1 -1
  33. package/dist/rules/informativeDocs.js +26 -7
  34. package/dist/rules/informativeDocs.js.map +1 -1
  35. package/dist/rules/matchDescription.js +19 -2
  36. package/dist/rules/matchDescription.js.map +1 -1
  37. package/dist/rules/matchName.js +2 -2
  38. package/dist/rules/matchName.js.map +1 -1
  39. package/dist/rules/multilineBlocks.js +12 -1
  40. package/dist/rules/multilineBlocks.js.map +1 -1
  41. package/dist/rules/noBadBlocks.js +4 -6
  42. package/dist/rules/noBadBlocks.js.map +1 -1
  43. package/dist/rules/noBlankBlockDescriptions.js +2 -0
  44. package/dist/rules/noBlankBlockDescriptions.js.map +1 -1
  45. package/dist/rules/noMissingSyntax.js +58 -15
  46. package/dist/rules/noMissingSyntax.js.map +1 -1
  47. package/dist/rules/noMultiAsterisks.js +1 -6
  48. package/dist/rules/noMultiAsterisks.js.map +1 -1
  49. package/dist/rules/noRestrictedSyntax.js +17 -4
  50. package/dist/rules/noRestrictedSyntax.js.map +1 -1
  51. package/dist/rules/noTypes.js +3 -0
  52. package/dist/rules/noTypes.js.map +1 -1
  53. package/dist/rules/noUndefinedTypes.js +61 -20
  54. package/dist/rules/noUndefinedTypes.js.map +1 -1
  55. package/dist/rules/requireAsteriskPrefix.js +20 -0
  56. package/dist/rules/requireAsteriskPrefix.js.map +1 -1
  57. package/dist/rules/requireDescription.js +6 -2
  58. package/dist/rules/requireDescription.js.map +1 -1
  59. package/dist/rules/requireDescriptionCompleteSentence.js +73 -10
  60. package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -1
  61. package/dist/rules/requireFileOverview.js +9 -4
  62. package/dist/rules/requireFileOverview.js.map +1 -1
  63. package/dist/rules/requireHyphenBeforeParamDescription.js +23 -6
  64. package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -1
  65. package/dist/rules/requireJsdoc.js +148 -30
  66. package/dist/rules/requireJsdoc.js.map +1 -1
  67. package/dist/rules/requireParam.js +46 -2
  68. package/dist/rules/requireParam.js.map +1 -1
  69. package/dist/rules/requireProperty.js +1 -1
  70. package/dist/rules/requireProperty.js.map +1 -1
  71. package/dist/rules/requireReturns.js +2 -2
  72. package/dist/rules/requireReturns.js.map +1 -1
  73. package/dist/rules/requireReturnsCheck.js +9 -2
  74. package/dist/rules/requireReturnsCheck.js.map +1 -1
  75. package/dist/rules/requireThrows.js +2 -2
  76. package/dist/rules/requireThrows.js.map +1 -1
  77. package/dist/rules/requireYields.js +9 -2
  78. package/dist/rules/requireYields.js.map +1 -1
  79. package/dist/rules/requireYieldsCheck.js +19 -5
  80. package/dist/rules/requireYieldsCheck.js.map +1 -1
  81. package/dist/rules/sortTags.js +67 -9
  82. package/dist/rules/sortTags.js.map +1 -1
  83. package/dist/rules/tagLines.js +22 -3
  84. package/dist/rules/tagLines.js.map +1 -1
  85. package/dist/rules/textEscaping.js +16 -2
  86. package/dist/rules/textEscaping.js.map +1 -1
  87. package/dist/rules/validTypes.js +25 -8
  88. package/dist/rules/validTypes.js.map +1 -1
  89. package/dist/tagNames.js +27 -0
  90. package/dist/tagNames.js.map +1 -1
  91. package/dist/utils/hasReturnValue.js +87 -42
  92. package/dist/utils/hasReturnValue.js.map +1 -1
  93. package/docs/rules/check-tag-names.md +15 -0
  94. package/docs/rules/no-missing-syntax.md +6 -0
  95. package/docs/rules/no-undefined-types.md +18 -0
  96. package/docs/rules/require-description-complete-sentence.md +525 -289
  97. package/docs/rules/require-description.md +289 -525
  98. package/docs/rules/require-file-overview.md +7 -0
  99. package/docs/rules/require-jsdoc.md +1 -1
  100. package/docs/rules/require-param-description.md +116 -1694
  101. package/docs/rules/require-param-name.md +58 -133
  102. package/docs/rules/require-param-type.md +119 -55
  103. package/docs/rules/require-param.md +1700 -111
  104. package/docs/rules/require-property-description.md +39 -79
  105. package/docs/rules/require-property-name.md +21 -30
  106. package/docs/rules/require-property-type.md +21 -21
  107. package/docs/rules/require-property.md +82 -33
  108. package/docs/rules/require-returns-check.md +636 -747
  109. package/docs/rules/require-returns-description.md +61 -933
  110. package/docs/rules/require-returns-type.md +42 -79
  111. package/docs/rules/require-returns.md +1081 -61
  112. package/docs/rules/require-yields-check.md +238 -517
  113. package/docs/rules/require-yields.md +517 -238
  114. package/docs/rules/valid-types.md +1 -1
  115. package/docs/settings.md +1 -1
  116. package/package.json +13 -5
  117. package/tsconfig.json +5 -2
@@ -1,101 +1,213 @@
1
- <a name="user-content-require-returns-type"></a>
2
- <a name="require-returns-type"></a>
3
- # <code>require-returns-type</code>
1
+ <a name="user-content-require-returns"></a>
2
+ <a name="require-returns"></a>
3
+ # <code>require-returns</code>
4
4
 
5
- * [Options](#user-content-require-returns-type-options)
6
- * [`contexts`](#user-content-require-returns-type-options-contexts)
7
- * [Context and settings](#user-content-require-returns-type-context-and-settings)
8
- * [Failing examples](#user-content-require-returns-type-failing-examples)
9
- * [Passing examples](#user-content-require-returns-type-passing-examples)
5
+ * [Options](#user-content-require-returns-options)
6
+ * [Context and settings](#user-content-require-returns-context-and-settings)
7
+ * [Failing examples](#user-content-require-returns-failing-examples)
8
+ * [Passing examples](#user-content-require-returns-passing-examples)
10
9
 
11
10
 
12
- Requires that `@returns` tag has a `type` value (in curly brackets).
11
+ Requires that return statements are documented.
13
12
 
14
- <a name="user-content-require-returns-type-options"></a>
15
- <a name="require-returns-type-options"></a>
16
- ## Options
17
-
18
- <a name="user-content-require-returns-type-options-contexts"></a>
19
- <a name="require-returns-type-options-contexts"></a>
20
- ### <code>contexts</code>
13
+ Will also report if multiple `@returns` tags are present.
21
14
 
22
- Set this to an array of strings representing the AST context (or an object with
23
- `context` and `comment` properties) where you wish the rule to be applied.
24
- Overrides the default contexts (see below). Set to `"any"` if you want
25
- the rule to apply to any jsdoc block throughout your files (as is necessary
26
- for finding function blocks not attached to a function declaration or
27
- expression, i.e., `@callback` or `@function` (or its aliases `@func` or
28
- `@method`) (including those associated with an `@interface`).
15
+ <a name="user-content-require-returns-options"></a>
16
+ <a name="require-returns-options"></a>
17
+ ## Options
29
18
 
30
- See the ["AST and Selectors"](#user-content-eslint-plugin-jsdoc-advanced-ast-and-selectors)
31
- section of our README for more on the expected format.
19
+ - `checkConstructors` - A value indicating whether `constructor`s should
20
+ be checked for `@returns` tags. Defaults to `false`.
21
+ - `checkGetters` - Boolean to determine whether getter methods should
22
+ be checked for `@returns` tags. Defaults to `true`.
23
+ - `exemptedBy` - Array of tags (e.g., `['type']`) whose presence on the
24
+ document block avoids the need for a `@returns`. Defaults to an array
25
+ with `inheritdoc`. If you set this array, it will overwrite the default,
26
+ so be sure to add back `inheritdoc` if you wish its presence to cause
27
+ exemption of the rule.
28
+ - `forceRequireReturn` - Set to `true` to always insist on
29
+ `@returns` documentation regardless of implicit or explicit `return`'s
30
+ in the function. May be desired to flag that a project is aware of an
31
+ `undefined`/`void` return. Defaults to `false`.
32
+ - `forceReturnsWithAsync` - By default `async` functions that do not explicitly
33
+ return a value pass this rule as an `async` function will always return a
34
+ `Promise`, even if the `Promise` resolves to void. You can force all
35
+ `async` functions (including ones with an explicit `Promise` but no
36
+ detected non-`undefined` `resolve` value) to require `@return`
37
+ documentation by setting `forceReturnsWithAsync` to `true` on the options
38
+ object. This may be useful for flagging that there has been consideration
39
+ of return type. Defaults to `false`.
40
+ - `contexts` - Set this to an array of strings representing the AST context
41
+ (or an object with `context` and `comment` properties) where you wish
42
+ the rule to be applied.
43
+ Overrides the default contexts (see below). Set to `"any"` if you want
44
+ the rule to apply to any jsdoc block throughout your files (as is necessary
45
+ for finding function blocks not attached to a function declaration or
46
+ expression, i.e., `@callback` or `@function` (or its aliases `@func` or
47
+ `@method`) (including those associated with an `@interface`). This
48
+ rule will only apply on non-default contexts when there is such a tag
49
+ present and the `forceRequireReturn` option is set or if the
50
+ `forceReturnsWithAsync` option is set with a present `@async` tag
51
+ (since we are not checking against the actual `return` values in these
52
+ cases).
32
53
 
33
- <a name="user-content-require-returns-type-context-and-settings"></a>
34
- <a name="require-returns-type-context-and-settings"></a>
54
+ <a name="user-content-require-returns-context-and-settings"></a>
55
+ <a name="require-returns-context-and-settings"></a>
35
56
  ## Context and settings
36
57
 
37
- |||
38
- |---|---|
39
- |Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled|
40
- |Tags|`returns`|
41
- |Aliases|`return`|
58
+ | | |
59
+ | -------- | ------- |
60
+ | Context | `ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled |
61
+ | Tags | `returns` |
62
+ | Aliases | `return` |
42
63
  |Recommended|true|
43
- |Options|`contexts`|
64
+ | Options | `checkConstructors`, `checkGetters`, `contexts`, `exemptedBy`, `forceRequireReturn`, `forceReturnsWithAsync` |
65
+ | Settings | `ignoreReplacesDocs`, `overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs` |
44
66
 
45
- <a name="user-content-require-returns-type-failing-examples"></a>
46
- <a name="require-returns-type-failing-examples"></a>
67
+ <a name="user-content-require-returns-failing-examples"></a>
68
+ <a name="require-returns-failing-examples"></a>
47
69
  ## Failing examples
48
70
 
49
71
  The following patterns are considered problems:
50
72
 
51
73
  ````js
52
74
  /**
53
- * @returns
75
+ *
54
76
  */
55
- function quux () {
77
+ function quux (foo) {
56
78
 
79
+ return foo;
57
80
  }
58
- // Message: Missing JSDoc @returns type.
81
+ // Message: Missing JSDoc @returns declaration.
59
82
 
60
83
  /**
61
- * @returns Foo.
84
+ *
62
85
  */
63
- function quux () {
86
+ const foo = () => ({
87
+ bar: 'baz'
88
+ })
89
+ // Message: Missing JSDoc @returns declaration.
90
+
91
+ /**
92
+ *
93
+ */
94
+ const foo = bar=>({ bar })
95
+ // Message: Missing JSDoc @returns declaration.
96
+
97
+ /**
98
+ *
99
+ */
100
+ const foo = bar => bar.baz()
101
+ // Message: Missing JSDoc @returns declaration.
102
+
103
+ /**
104
+ *
105
+ */
106
+ function quux (foo) {
64
107
 
108
+ return foo;
65
109
  }
66
- // Message: Missing JSDoc @returns type.
110
+ // Settings: {"jsdoc":{"tagNamePreference":{"returns":"return"}}}
111
+ // Message: Missing JSDoc @return declaration.
67
112
 
68
113
  /**
69
- * @returns Foo.
114
+ *
115
+ */
116
+ async function quux() {
117
+ }
118
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
119
+ // Message: Missing JSDoc @returns declaration.
120
+
121
+ /**
122
+ *
123
+ */
124
+ const quux = async function () {}
125
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
126
+ // Message: Missing JSDoc @returns declaration.
127
+
128
+ /**
129
+ *
130
+ */
131
+ const quux = async () => {}
132
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
133
+ // Message: Missing JSDoc @returns declaration.
134
+
135
+ /**
136
+ *
137
+ */
138
+ async function quux () {}
139
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
140
+ // Message: Missing JSDoc @returns declaration.
141
+
142
+ /**
143
+ *
70
144
  */
71
145
  function quux () {
146
+ }
147
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
148
+ // Message: Missing JSDoc @returns declaration.
72
149
 
150
+ /**
151
+ *
152
+ */
153
+ function quux () {
73
154
  }
74
- // "jsdoc/require-returns-type": ["error"|"warn", {"contexts":["any"]}]
75
- // Message: Missing JSDoc @returns type.
155
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceRequireReturn":true}]
156
+ // Message: Missing JSDoc @returns declaration.
76
157
 
77
158
  /**
78
159
  * @function
79
- * @returns Foo.
80
160
  */
81
- // "jsdoc/require-returns-type": ["error"|"warn", {"contexts":["any"]}]
82
- // Message: Missing JSDoc @returns type.
161
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceRequireReturn":true}]
162
+ // Message: Missing JSDoc @returns declaration.
83
163
 
84
164
  /**
85
165
  * @callback
86
- * @returns Foo.
87
166
  */
88
- // "jsdoc/require-returns-type": ["error"|"warn", {"contexts":["any"]}]
89
- // Message: Missing JSDoc @returns type.
167
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceRequireReturn":true}]
168
+ // Message: Missing JSDoc @returns declaration.
169
+
170
+ const language = {
171
+ /**
172
+ * @param {string} name
173
+ */
174
+ get name() {
175
+ return this._name;
176
+ }
177
+ }
178
+ // Message: Missing JSDoc @returns declaration.
90
179
 
91
180
  /**
92
- * @return Foo.
181
+ *
93
182
  */
94
- function quux () {
183
+ async function quux () {
184
+ }
185
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
186
+ // Message: Missing JSDoc @returns declaration.
187
+
188
+ /**
189
+ * @function
190
+ * @async
191
+ */
192
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceReturnsWithAsync":true}]
193
+ // Message: Missing JSDoc @returns declaration.
95
194
 
195
+ /**
196
+ * @callback
197
+ * @async
198
+ */
199
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceReturnsWithAsync":true}]
200
+ // Message: Missing JSDoc @returns declaration.
201
+
202
+ /**
203
+ * @returns {undefined}
204
+ * @returns {void}
205
+ */
206
+ function quux (foo) {
207
+
208
+ return foo;
96
209
  }
97
- // Settings: {"jsdoc":{"tagNamePreference":{"returns":"return"}}}
98
- // Message: Missing JSDoc @return type.
210
+ // Message: Found more than one @returns declaration.
99
211
 
100
212
  /**
101
213
  * @returns
@@ -105,40 +217,948 @@ function quux () {
105
217
  }
106
218
  // Settings: {"jsdoc":{"tagNamePreference":{"returns":false}}}
107
219
  // Message: Unexpected tag `@returns`
220
+
221
+ /**
222
+ * @param foo
223
+ */
224
+ function quux (foo) {
225
+ return 'bar';
226
+ }
227
+ // "jsdoc/require-returns": ["error"|"warn", {"exemptedBy":["notPresent"]}]
228
+ // Message: Missing JSDoc @returns declaration.
229
+
230
+ /**
231
+ * @param {array} a
232
+ */
233
+ async function foo(a) {
234
+ return;
235
+ }
236
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
237
+ // Message: Missing JSDoc @returns declaration.
238
+
239
+ /**
240
+ * @param {array} a
241
+ */
242
+ async function foo(a) {
243
+ return Promise.all(a);
244
+ }
245
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
246
+ // Message: Missing JSDoc @returns declaration.
247
+
248
+ class foo {
249
+ /** gets bar */
250
+ get bar() {
251
+ return 0;
252
+ }
253
+ }
254
+ // "jsdoc/require-returns": ["error"|"warn", {"checkGetters":true}]
255
+ // Message: Missing JSDoc @returns declaration.
256
+
257
+ class TestClass {
258
+ /**
259
+ *
260
+ */
261
+ constructor() {
262
+ return new Map();
263
+ }
264
+ }
265
+ // "jsdoc/require-returns": ["error"|"warn", {"checkConstructors":true}]
266
+ // Message: Missing JSDoc @returns declaration.
267
+
268
+ class TestClass {
269
+ /**
270
+ *
271
+ */
272
+ get Test() {
273
+ return 0;
274
+ }
275
+ }
276
+ // "jsdoc/require-returns": ["error"|"warn", {"checkGetters":true}]
277
+ // Message: Missing JSDoc @returns declaration.
278
+
279
+ class quux {
280
+ /**
281
+ *
282
+ */
283
+ quux () {
284
+ }
285
+ }
286
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceRequireReturn":true}]
287
+ // Message: Missing JSDoc @returns declaration.
288
+
289
+ /**
290
+ *
291
+ */
292
+ function quux (foo) {
293
+
294
+ return new Promise(function (resolve, reject) {
295
+ resolve(foo);
296
+ });
297
+ }
298
+ // Message: Missing JSDoc @returns declaration.
299
+
300
+ /**
301
+ *
302
+ */
303
+ function quux (foo) {
304
+
305
+ return new Promise(function (resolve, reject) {
306
+ setTimeout(() => {
307
+ resolve(true);
308
+ });
309
+ });
310
+ }
311
+ // Message: Missing JSDoc @returns declaration.
312
+
313
+ /**
314
+ *
315
+ */
316
+ function quux (foo) {
317
+
318
+ return new Promise(function (resolve, reject) {
319
+ foo(resolve);
320
+ });
321
+ }
322
+ // Message: Missing JSDoc @returns declaration.
323
+
324
+ /**
325
+ *
326
+ */
327
+ function quux () {
328
+ return new Promise((resolve, reject) => {
329
+ while(true) {
330
+ resolve(true);
331
+ }
332
+ });
333
+ }
334
+ // Message: Missing JSDoc @returns declaration.
335
+
336
+ /**
337
+ *
338
+ */
339
+ function quux () {
340
+ return new Promise((resolve, reject) => {
341
+ do {
342
+ resolve(true);
343
+ }
344
+ while(true)
345
+ });
346
+ }
347
+ // Message: Missing JSDoc @returns declaration.
348
+
349
+ /**
350
+ *
351
+ */
352
+ function quux () {
353
+ return new Promise((resolve, reject) => {
354
+ if (true) {
355
+ resolve(true);
356
+ }
357
+ return;
358
+ });
359
+ }
360
+ // Message: Missing JSDoc @returns declaration.
361
+
362
+ /**
363
+ *
364
+ */
365
+ function quux () {
366
+ return new Promise((resolve, reject) => {
367
+ if (true) {
368
+ resolve(true);
369
+ }
370
+ });
371
+ }
372
+ // Message: Missing JSDoc @returns declaration.
373
+
374
+ /**
375
+ *
376
+ */
377
+ function quux () {
378
+ var a = {};
379
+ return new Promise((resolve, reject) => {
380
+ with (a) {
381
+ resolve(true);
382
+ }
383
+ });
384
+ }
385
+ // Message: Missing JSDoc @returns declaration.
386
+
387
+ /**
388
+ *
389
+ */
390
+ function quux () {
391
+ var a = {};
392
+ return new Promise((resolve, reject) => {
393
+ try {
394
+ resolve(true);
395
+ } catch (err) {}
396
+ });
397
+ }
398
+ // Message: Missing JSDoc @returns declaration.
399
+
400
+ /**
401
+ *
402
+ */
403
+ function quux () {
404
+ var a = {};
405
+ return new Promise((resolve, reject) => {
406
+ try {
407
+ } catch (err) {
408
+ resolve(true);
409
+ }
410
+ });
411
+ }
412
+ // Message: Missing JSDoc @returns declaration.
413
+
414
+ /**
415
+ *
416
+ */
417
+ function quux () {
418
+ var a = {};
419
+ return new Promise((resolve, reject) => {
420
+ try {
421
+ } catch (err) {
422
+ } finally {
423
+ resolve(true);
424
+ }
425
+ });
426
+ }
427
+ // Message: Missing JSDoc @returns declaration.
428
+
429
+ /**
430
+ *
431
+ */
432
+ function quux () {
433
+ var a = {};
434
+ return new Promise((resolve, reject) => {
435
+ switch (a) {
436
+ case 'abc':
437
+ resolve(true);
438
+ }
439
+ });
440
+ }
441
+ // Message: Missing JSDoc @returns declaration.
442
+
443
+ /**
444
+ *
445
+ */
446
+ function quux () {
447
+ return new Promise((resolve, reject) => {
448
+ if (true) {
449
+ resolve();
450
+ } else {
451
+ resolve(true);
452
+ }
453
+ });
454
+ }
455
+ // Message: Missing JSDoc @returns declaration.
456
+
457
+ /**
458
+ *
459
+ */
460
+ function quux () {
461
+ return new Promise((resolve, reject) => {
462
+ for (let i = 0; i < 5 ; i++) {
463
+ resolve(true);
464
+ }
465
+ });
466
+ }
467
+ // Message: Missing JSDoc @returns declaration.
468
+
469
+ /**
470
+ *
471
+ */
472
+ function quux () {
473
+ return new Promise((resolve, reject) => {
474
+ for (const i of obj) {
475
+ resolve(true);
476
+ }
477
+ });
478
+ }
479
+ // Message: Missing JSDoc @returns declaration.
480
+
481
+ /**
482
+ *
483
+ */
484
+ function quux () {
485
+ return new Promise((resolve, reject) => {
486
+ for (const i in obj) {
487
+ resolve(true);
488
+ }
489
+ });
490
+ }
491
+ // Message: Missing JSDoc @returns declaration.
492
+
493
+ /**
494
+ *
495
+ */
496
+ function quux () {
497
+ return new Promise((resolve, reject) => {
498
+ if (true) {
499
+ return;
500
+ } else {
501
+ resolve(true);
502
+ }
503
+ });
504
+ }
505
+ // Message: Missing JSDoc @returns declaration.
506
+
507
+ /**
508
+ *
509
+ */
510
+ function quux () {
511
+ return new Promise((resolve, reject) => {
512
+ function a () {
513
+ resolve(true);
514
+ }
515
+ a();
516
+ });
517
+ }
518
+ // Message: Missing JSDoc @returns declaration.
519
+
520
+ /**
521
+ *
522
+ */
523
+ function quux () {
524
+ return new Promise();
525
+ }
526
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
527
+ // Message: Missing JSDoc @returns declaration.
528
+
529
+ /**
530
+ *
531
+ */
532
+ async function quux () {
533
+ return new Promise();
534
+ }
535
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
536
+ // Message: Missing JSDoc @returns declaration.
537
+
538
+ /**
539
+ *
540
+ */
541
+ async function quux () {
542
+ return new Promise((resolve, reject) => {});
543
+ }
544
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
545
+ // Message: Missing JSDoc @returns declaration.
546
+
547
+ export class A {
548
+ /**
549
+ * Description.
550
+ */
551
+ public f(): string {
552
+ return "";
553
+ }
554
+ }
555
+
556
+ export interface B {
557
+ /**
558
+ * Description.
559
+ */
560
+ f(): string;
561
+
562
+ /**
563
+ * Description.
564
+ */
565
+ g: () => string;
566
+
567
+ /**
568
+ * Description.
569
+ */
570
+ h(): void;
571
+
572
+ /**
573
+ * Description.
574
+ */
575
+ i: () => void;
576
+ }
577
+
578
+ /**
579
+ * Description.
580
+ */
581
+ export function f(): string {
582
+ return "";
583
+ }
584
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":[":not(BlockStatement) > FunctionDeclaration","MethodDefinition","TSMethodSignature","TSPropertySignature > TSTypeAnnotation > TSFunctionType"]}]
585
+ // Message: Missing JSDoc @returns declaration.
586
+
587
+ /**
588
+ * @param ms time in millis
589
+ */
590
+ export const sleep = (ms: number) =>
591
+ new Promise<string>((res) => setTimeout(res, ms));
592
+ // Message: Missing JSDoc @returns declaration.
593
+
594
+ /**
595
+ * @param ms time in millis
596
+ */
597
+ export const sleep = (ms: number) => {
598
+ return new Promise<string>((res) => setTimeout(res, ms));
599
+ };
600
+ // Message: Missing JSDoc @returns declaration.
601
+
602
+ /**
603
+ * Reads a test fixture.
604
+ */
605
+ export function readFixture(path: string): Promise<Buffer>;
606
+ // Message: Missing JSDoc @returns declaration.
607
+
608
+ /**
609
+ * Reads a test fixture.
610
+ */
611
+ export function readFixture(path: string): void;
612
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
613
+ // Message: Missing JSDoc @returns declaration.
614
+
615
+ /**
616
+ * Reads a test fixture.
617
+ */
618
+ export function readFixture(path: string);
619
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
620
+ // Message: Missing JSDoc @returns declaration.
621
+
622
+ /**
623
+ * @param {array} a
624
+ */
625
+ async function foo(a) {
626
+ return Promise.all(a);
627
+ }
628
+ // Message: Missing JSDoc @returns declaration.
629
+
630
+ /**
631
+ * Description.
632
+ */
633
+ export default async function demo() {
634
+ return true;
635
+ }
636
+ // Message: Missing JSDoc @returns declaration.
108
637
  ````
109
638
 
110
639
 
111
640
 
112
- <a name="user-content-require-returns-type-passing-examples"></a>
113
- <a name="require-returns-type-passing-examples"></a>
641
+ <a name="user-content-require-returns-passing-examples"></a>
642
+ <a name="require-returns-passing-examples"></a>
114
643
  ## Passing examples
115
644
 
116
645
  The following patterns are not considered problems:
117
646
 
118
647
  ````js
119
648
  /**
120
- * @returns {number}
649
+ * @returns Foo.
650
+ */
651
+ function quux () {
652
+
653
+ return foo;
654
+ }
655
+
656
+ /**
657
+ * @returns Foo.
658
+ */
659
+ function quux () {
660
+
661
+ return foo;
662
+ }
663
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"]}]
664
+
665
+ /**
666
+ *
667
+ */
668
+ function quux () {
669
+ }
670
+
671
+ /**
672
+ *
673
+ */
674
+ function quux (bar) {
675
+ bar.filter(baz => {
676
+ return baz.corge();
677
+ })
678
+ }
679
+
680
+ /**
681
+ * @returns Array
682
+ */
683
+ function quux (bar) {
684
+ return bar.filter(baz => {
685
+ return baz.corge();
686
+ })
687
+ }
688
+
689
+ /**
690
+ * @returns Array
691
+ */
692
+ const quux = (bar) => bar.filter(({ corge }) => corge())
693
+
694
+ /**
695
+ * @inheritdoc
696
+ */
697
+ function quux (foo) {
698
+ }
699
+
700
+ /**
701
+ * @override
702
+ */
703
+ function quux (foo) {
704
+ }
705
+
706
+ /**
707
+ * @constructor
708
+ */
709
+ function quux (foo) {
710
+ return true;
711
+ }
712
+
713
+ /**
714
+ * @implements
715
+ */
716
+ function quux (foo) {
717
+ return true;
718
+ }
719
+
720
+ /**
721
+ * @override
722
+ */
723
+ function quux (foo) {
724
+
725
+ return foo;
726
+ }
727
+
728
+ /**
729
+ * @class
730
+ */
731
+ function quux (foo) {
732
+ return true;
733
+ }
734
+
735
+ /**
736
+ * @constructor
737
+ */
738
+ function quux (foo) {
739
+
740
+ }
741
+
742
+ /**
743
+ * @returns {object}
744
+ */
745
+ function quux () {
746
+
747
+ return {a: foo};
748
+ }
749
+
750
+ /**
751
+ * @returns {object}
752
+ */
753
+ const quux = () => ({a: foo});
754
+
755
+ /**
756
+ * @returns {object}
757
+ */
758
+ const quux = () => {
759
+ return {a: foo}
760
+ };
761
+
762
+ /**
763
+ * @returns {void}
764
+ */
765
+ function quux () {
766
+ }
767
+
768
+ /**
769
+ * @returns {void}
770
+ */
771
+ const quux = () => {
772
+
773
+ }
774
+
775
+ /**
776
+ * @returns {undefined}
777
+ */
778
+ function quux () {
779
+ }
780
+
781
+ /**
782
+ * @returns {undefined}
783
+ */
784
+ const quux = () => {
785
+
786
+ }
787
+
788
+ /**
789
+ *
790
+ */
791
+ function quux () {
792
+ }
793
+
794
+ /**
795
+ *
796
+ */
797
+ const quux = () => {
798
+
799
+ }
800
+
801
+ class Foo {
802
+ /**
803
+ *
804
+ */
805
+ constructor () {
806
+ }
807
+ }
808
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
809
+
810
+ const language = {
811
+ /**
812
+ * @param {string} name
813
+ */
814
+ set name(name) {
815
+ this._name = name;
816
+ }
817
+ }
818
+
819
+ /**
820
+ * @returns {void}
121
821
  */
122
822
  function quux () {
823
+ }
824
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
123
825
 
826
+ /**
827
+ * @returns {void}
828
+ */
829
+ function quux () {
830
+ return undefined;
124
831
  }
125
832
 
126
833
  /**
127
- * @returns {number}
834
+ * @returns {void}
128
835
  */
129
836
  function quux () {
837
+ return undefined;
838
+ }
839
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
130
840
 
841
+ /**
842
+ * @returns {void}
843
+ */
844
+ function quux () {
845
+ return;
131
846
  }
132
- // "jsdoc/require-returns-type": ["error"|"warn", {"contexts":["any"]}]
847
+
848
+ /**
849
+ * @returns {void}
850
+ */
851
+ function quux () {
852
+ }
853
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
854
+
855
+ /**
856
+ * @returns {void}
857
+ */
858
+ function quux () {
859
+ return;
860
+ }
861
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
862
+
863
+ /** @type {RequestHandler} */
864
+ function quux (req, res , next) {
865
+ return;
866
+ }
867
+
868
+ /**
869
+ * @returns {Promise}
870
+ */
871
+ async function quux () {
872
+ }
873
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
874
+
875
+ /**
876
+ * @returns {Promise}
877
+ */
878
+ async function quux () {
879
+ }
880
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
881
+
882
+ /**
883
+ *
884
+ */
885
+ async function quux () {}
886
+
887
+ /**
888
+ *
889
+ */
890
+ const quux = async function () {}
891
+
892
+ /**
893
+ *
894
+ */
895
+ const quux = async () => {}
896
+
897
+ /** foo class */
898
+ class foo {
899
+ /** foo constructor */
900
+ constructor () {
901
+ // =>
902
+ this.bar = true;
903
+ }
904
+ }
905
+
906
+ export default foo;
907
+
908
+ /**
909
+ *
910
+ */
911
+ function quux () {
912
+ }
913
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
914
+
915
+ /**
916
+ * @type {MyCallback}
917
+ */
918
+ function quux () {
919
+
920
+ }
921
+ // "jsdoc/require-returns": ["error"|"warn", {"exemptedBy":["type"]}]
922
+
923
+ /**
924
+ * @param {array} a
925
+ */
926
+ async function foo(a) {
927
+ return;
928
+ }
929
+
930
+ /**
931
+ *
932
+ */
933
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"]}]
934
+
935
+ /**
936
+ * @async
937
+ */
938
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"]}]
133
939
 
134
940
  /**
135
941
  * @function
136
- * @returns Foo.
137
942
  */
943
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
138
944
 
139
945
  /**
140
946
  * @callback
141
- * @returns Foo.
142
947
  */
948
+ // "jsdoc/require-returns": ["error"|"warn", {"forceRequireReturn":true}]
949
+
950
+ /**
951
+ * @function
952
+ * @async
953
+ */
954
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
955
+
956
+ /**
957
+ * @callback
958
+ * @async
959
+ */
960
+ // "jsdoc/require-returns": ["error"|"warn", {"forceReturnsWithAsync":true}]
961
+
962
+ /**
963
+ * @function
964
+ */
965
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceReturnsWithAsync":true}]
966
+
967
+ /**
968
+ * @callback
969
+ */
970
+ // "jsdoc/require-returns": ["error"|"warn", {"contexts":["any"],"forceReturnsWithAsync":true}]
971
+
972
+ class foo {
973
+ get bar() {
974
+ return 0;
975
+ }
976
+ }
977
+ // "jsdoc/require-returns": ["error"|"warn", {"checkGetters":false}]
978
+
979
+ class foo {
980
+ /** @returns zero */
981
+ get bar() {
982
+ return 0;
983
+ }
984
+ }
985
+ // "jsdoc/require-returns": ["error"|"warn", {"checkGetters":true}]
986
+
987
+ class foo {
988
+ /** @returns zero */
989
+ get bar() {
990
+ return 0;
991
+ }
992
+ }
993
+ // "jsdoc/require-returns": ["error"|"warn", {"checkGetters":false}]
994
+
995
+ class TestClass {
996
+ /**
997
+ *
998
+ */
999
+ constructor() { }
1000
+ }
1001
+
1002
+ class TestClass {
1003
+ /**
1004
+ * @returns A map.
1005
+ */
1006
+ constructor() {
1007
+ return new Map();
1008
+ }
1009
+ }
1010
+
1011
+ class TestClass {
1012
+ /**
1013
+ *
1014
+ */
1015
+ constructor() { }
1016
+ }
1017
+ // "jsdoc/require-returns": ["error"|"warn", {"checkConstructors":false}]
1018
+
1019
+ class TestClass {
1020
+ /**
1021
+ *
1022
+ */
1023
+ get Test() { }
1024
+ }
1025
+
1026
+ class TestClass {
1027
+ /**
1028
+ * @returns A number.
1029
+ */
1030
+ get Test() {
1031
+ return 0;
1032
+ }
1033
+ }
1034
+
1035
+ class TestClass {
1036
+ /**
1037
+ *
1038
+ */
1039
+ get Test() {
1040
+ return 0;
1041
+ }
1042
+ }
1043
+ // "jsdoc/require-returns": ["error"|"warn", {"checkGetters":false}]
1044
+
1045
+ /**
1046
+ *
1047
+ */
1048
+ function quux (foo) {
1049
+
1050
+ return new Promise(function (resolve, reject) {
1051
+ resolve();
1052
+ });
1053
+ }
1054
+
1055
+ /**
1056
+ *
1057
+ */
1058
+ function quux (foo) {
1059
+
1060
+ return new Promise(function (resolve, reject) {
1061
+ setTimeout(() => {
1062
+ resolve();
1063
+ });
1064
+ });
1065
+ }
1066
+
1067
+ /**
1068
+ *
1069
+ */
1070
+ function quux (foo) {
1071
+
1072
+ return new Promise(function (resolve, reject) {
1073
+ foo();
1074
+ });
1075
+ }
1076
+
1077
+ /**
1078
+ *
1079
+ */
1080
+ function quux (foo) {
1081
+
1082
+ return new Promise(function (resolve, reject) {
1083
+ abc((resolve) => {
1084
+ resolve(true);
1085
+ });
1086
+ });
1087
+ }
1088
+
1089
+ /**
1090
+ *
1091
+ */
1092
+ function quux (foo) {
1093
+
1094
+ return new Promise(function (resolve, reject) {
1095
+ abc(function (resolve) {
1096
+ resolve(true);
1097
+ });
1098
+ });
1099
+ }
1100
+
1101
+ /**
1102
+ *
1103
+ */
1104
+ function quux () {
1105
+ return new Promise((resolve, reject) => {
1106
+ if (true) {
1107
+ resolve();
1108
+ }
1109
+ });
1110
+ return;
1111
+ }
1112
+
1113
+ /**
1114
+ *
1115
+ */
1116
+ function quux () {
1117
+ return new Promise();
1118
+ }
1119
+
1120
+ /**
1121
+ * Description.
1122
+ */
1123
+ async function foo() {
1124
+ return new Promise(resolve => resolve());
1125
+ }
1126
+
1127
+ /**
1128
+ * @param ms time in millis
1129
+ */
1130
+ export const sleep = (ms: number) =>
1131
+ new Promise<void>((res) => setTimeout(res, ms));
1132
+
1133
+ /**
1134
+ * @param ms time in millis
1135
+ */
1136
+ export const sleep = (ms: number) => {
1137
+ return new Promise<void>((res) => setTimeout(res, ms));
1138
+ };
1139
+
1140
+ /**
1141
+ * Reads a test fixture.
1142
+ *
1143
+ * @returns The file contents as buffer.
1144
+ */
1145
+ export function readFixture(path: string): Promise<Buffer>;
1146
+
1147
+ /**
1148
+ * Reads a test fixture.
1149
+ *
1150
+ * @returns {void}.
1151
+ */
1152
+ export function readFixture(path: string): void;
1153
+
1154
+ /**
1155
+ * Reads a test fixture.
1156
+ */
1157
+ export function readFixture(path: string): void;
1158
+
1159
+ /**
1160
+ * Reads a test fixture.
1161
+ */
1162
+ export function readFixture(path: string);
143
1163
  ````
144
1164