Skip to content

Commit 8dbcb6f

Browse files
committed
feat(require-returns): add publicOnly option; fixes #1137
1 parent dfd2a8a commit 8dbcb6f

File tree

6 files changed

+281
-8
lines changed

6 files changed

+281
-8
lines changed

.README/rules/require-returns.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Will also report if multiple `@returns` tags are present.
4444
cases).
4545
- `enableFixer` - Whether to enable the fixer to add a blank `@returns`.
4646
Defaults to `false`.
47+
- `publicOnly` - See docs for `require-jsdoc`.
4748

4849
## Context and settings
4950

@@ -53,7 +54,7 @@ Will also report if multiple `@returns` tags are present.
5354
| Tags | `returns` |
5455
| Aliases | `return` |
5556
|Recommended|true|
56-
| Options |`checkConstructors`, `checkGetters`, `contexts`, `enableFixer`, `exemptedBy`, `forceRequireReturn`, `forceReturnsWithAsync`|
57+
| Options |`checkConstructors`, `checkGetters`, `contexts`, `enableFixer`, `exemptedBy`, `forceRequireReturn`, `forceReturnsWithAsync`, `publicOnly`|
5758
| Settings | `ignoreReplacesDocs`, `overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs` |
5859

5960
## Failing examples

docs/rules/require-returns.md

+63-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ Will also report if multiple `@returns` tags are present.
5252
cases).
5353
- `enableFixer` - Whether to enable the fixer to add a blank `@returns`.
5454
Defaults to `false`.
55+
- `publicOnly` - See docs for `require-jsdoc`.
5556

5657
<a name="user-content-require-returns-context-and-settings"></a>
5758
<a name="require-returns-context-and-settings"></a>
@@ -63,7 +64,7 @@ Will also report if multiple `@returns` tags are present.
6364
| Tags | `returns` |
6465
| Aliases | `return` |
6566
|Recommended|true|
66-
| Options |`checkConstructors`, `checkGetters`, `contexts`, `enableFixer`, `exemptedBy`, `forceRequireReturn`, `forceReturnsWithAsync`|
67+
| Options |`checkConstructors`, `checkGetters`, `contexts`, `enableFixer`, `exemptedBy`, `forceRequireReturn`, `forceReturnsWithAsync`, `publicOnly`|
6768
| Settings | `ignoreReplacesDocs`, `overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs` |
6869

6970
<a name="user-content-require-returns-failing-examples"></a>
@@ -660,6 +661,58 @@ class Test {
660661
}
661662
// "jsdoc/require-returns": ["error"|"warn", {"contexts":["FunctionDeclaration",{"context":"TSEmptyBodyFunctionExpression","forceRequireReturn":true}]}]
662663
// Message: Missing JSDoc @returns declaration.
664+
665+
/**
666+
*
667+
*/
668+
module.exports = function quux (foo) {
669+
670+
return foo;
671+
}
672+
// "jsdoc/require-returns": ["error"|"warn", {"publicOnly":true}]
673+
// Message: Missing JSDoc @returns declaration.
674+
675+
/**
676+
*
677+
*/
678+
const a = function quux (foo) {
679+
680+
return foo;
681+
};
682+
683+
export default a;
684+
// "jsdoc/require-returns": ["error"|"warn", {"publicOnly":true}]
685+
// Message: Missing JSDoc @returns declaration.
686+
687+
/**
688+
*
689+
*/
690+
export default function quux (foo) {
691+
692+
return foo;
693+
};
694+
// "jsdoc/require-returns": ["error"|"warn", {"publicOnly":{"ancestorsOnly":true,"esm":true}}]
695+
// Message: Missing JSDoc @returns declaration.
696+
697+
/**
698+
*
699+
*/
700+
exports.quux = function quux (foo) {
701+
702+
return foo;
703+
};
704+
// "jsdoc/require-returns": ["error"|"warn", {"publicOnly":{"cjs":true}}]
705+
// Message: Missing JSDoc @returns declaration.
706+
707+
/**
708+
*
709+
*/
710+
window.quux = function quux (foo) {
711+
712+
return foo;
713+
};
714+
// "jsdoc/require-returns": ["error"|"warn", {"publicOnly":{"window":true}}]
715+
// Message: Missing JSDoc @returns declaration.
663716
````
664717

665718

@@ -1199,5 +1252,14 @@ class Test {
11991252
abstract Test(): string;
12001253
}
12011254
// "jsdoc/require-returns": ["error"|"warn", {"contexts":["FunctionDeclaration",{"context":"TSEmptyBodyFunctionExpression","forceRequireReturn":true}]}]
1255+
1256+
/**
1257+
*
1258+
*/
1259+
function quux (foo) {
1260+
1261+
return foo;
1262+
}
1263+
// "jsdoc/require-returns": ["error"|"warn", {"publicOnly":true}]
12021264
````
12031265

src/iterateJsdoc.js

+15-5
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,9 @@ const getUtils = (
694694
indent,
695695
) => {
696696
const ancestors = /** @type {import('eslint').Rule.Node[]} */ (context.getAncestors());
697-
const sourceCode = context.getSourceCode();
697+
const {
698+
sourceCode,
699+
} = context;
698700

699701
const utils = /** @type {Utils} */ (getBasicUtils(context, settings));
700702

@@ -2147,7 +2149,9 @@ const iterateAllJsdocs = (iterator, ruleConfig, contexts, additiveCommentContext
21472149
* @returns {void}
21482150
*/
21492151
const callIterator = (context, node, jsdocNodes, state, lastCall) => {
2150-
const sourceCode = context.getSourceCode();
2152+
const {
2153+
sourceCode,
2154+
} = context;
21512155
const {
21522156
lines,
21532157
} = sourceCode;
@@ -2258,7 +2262,9 @@ const iterateAllJsdocs = (iterator, ruleConfig, contexts, additiveCommentContext
22582262
return {
22592263
// @ts-expect-error ESLint accepts
22602264
create (context) {
2261-
const sourceCode = context.getSourceCode();
2265+
const {
2266+
sourceCode,
2267+
} = context;
22622268
settings = getSettings(context);
22632269
if (!settings) {
22642270
return {};
@@ -2334,7 +2340,9 @@ const iterateAllJsdocs = (iterator, ruleConfig, contexts, additiveCommentContext
23342340
const checkFile = (iterator, ruleConfig) => {
23352341
return {
23362342
create (context) {
2337-
const sourceCode = context.getSourceCode();
2343+
const {
2344+
sourceCode,
2345+
} = context;
23382346
const settings = getSettings(context);
23392347
if (!settings) {
23402348
return {};
@@ -2451,7 +2459,9 @@ export default function iterateJsdoc (iterator, ruleConfig) {
24512459
}
24522460
}
24532461

2454-
const sourceCode = context.getSourceCode();
2462+
const {
2463+
sourceCode,
2464+
} = context;
24552465
const {
24562466
lines,
24572467
} = sourceCode;

src/rules/requireJsdoc.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,9 @@ const getOptions = (context, settings) => {
288288
/** @type {import('eslint').Rule.RuleModule} */
289289
export default {
290290
create (context) {
291-
const sourceCode = context.getSourceCode();
291+
const {
292+
sourceCode,
293+
} = context;
292294
const settings = getSettings(context);
293295
if (!settings) {
294296
return {};

src/rules/requireReturns.js

+51
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import exportParser from '../exportParser.js';
12
import iterateJsdoc from '../iterateJsdoc.js';
23

34
/**
@@ -38,7 +39,9 @@ export default iterateJsdoc(({
3839
info: {
3940
comment,
4041
},
42+
node,
4143
report,
44+
settings,
4245
utils,
4346
context,
4447
}) => {
@@ -47,6 +50,7 @@ export default iterateJsdoc(({
4750
enableFixer = false,
4851
forceRequireReturn = false,
4952
forceReturnsWithAsync = false,
53+
publicOnly = false,
5054
} = context.options[0] || {};
5155

5256
// A preflight check. We do not need to run a deep check
@@ -92,6 +96,26 @@ export default iterateJsdoc(({
9296
return false;
9397
}
9498

99+
if (publicOnly) {
100+
/** @type {import('./requireJsdoc.js').RequireJsdocOpts} */
101+
const opt = {
102+
ancestorsOnly: Boolean(publicOnly?.ancestorsOnly ?? false),
103+
esm: Boolean(publicOnly?.esm ?? true),
104+
initModuleExports: Boolean(publicOnly?.cjs ?? true),
105+
initWindow: Boolean(publicOnly?.window ?? false),
106+
};
107+
const {
108+
sourceCode,
109+
} = context;
110+
const exported = exportParser.isUncommentedExport(
111+
/** @type {import('eslint').Rule.Node} */ (node), sourceCode, opt, settings,
112+
);
113+
114+
if (!exported) {
115+
return false;
116+
}
117+
}
118+
95119
if ((forceRequireReturn || forceRequireReturnContext) && (
96120
iteratingFunction || utils.isVirtualFunction()
97121
)) {
@@ -177,6 +201,33 @@ export default iterateJsdoc(({
177201
default: false,
178202
type: 'boolean',
179203
},
204+
publicOnly: {
205+
oneOf: [
206+
{
207+
default: false,
208+
type: 'boolean',
209+
},
210+
{
211+
additionalProperties: false,
212+
default: {},
213+
properties: {
214+
ancestorsOnly: {
215+
type: 'boolean',
216+
},
217+
cjs: {
218+
type: 'boolean',
219+
},
220+
esm: {
221+
type: 'boolean',
222+
},
223+
window: {
224+
type: 'boolean',
225+
},
226+
},
227+
type: 'object',
228+
},
229+
],
230+
},
180231
},
181232
type: 'object',
182233
},

0 commit comments

Comments
 (0)