Skip to content

Commit

Permalink
feat: require-returns (#138)
Browse files Browse the repository at this point in the history
* [Feature] require-returns #14 #137

* docs: generate docs

* [Feature] require-returns #14 #137

* [Feature] require-returns #14 #137

* [Misprint] remove eslint --fix

* [Docs] Available require-returns

* docs: generate docs

* [Docs] Removed docs generated from README.md

* docs: generate docs

* [Docs] Restore generated docs
  • Loading branch information
ptkdev authored and gajus committed Dec 31, 2018
1 parent 14a9aab commit 5cddd06
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .README/README.md
Expand Up @@ -27,6 +27,7 @@ This table maps the rules between `eslint-plugin-jsdoc` and `jscs-jsdoc`.
| [`require-param-description`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param-description) | [`requireParamDescription`](https://github.com/jscs-dev/jscs-jsdoc#requireparamdescription) |
| [`require-param-name`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param-name) | N/A |
| [`require-param-type`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-param-type) | [`requireParamTypes`](https://github.com/jscs-dev/jscs-jsdoc#requireparamtypes) |
| [`require-returns`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns) | [`requireReturn`](https://github.com/jscs-dev/jscs-jsdoc#requirereturn) |
| [`require-returns-description`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns-description) | [`requireReturnDescription`](https://github.com/jscs-dev/jscs-jsdoc#requirereturndescription) |
| [`require-returns-type`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-returns-type) | [`requireReturnTypes`](https://github.com/jscs-dev/jscs-jsdoc#requirereturntypes) |
| [`valid-types`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-valid-types) | N/A |
Expand Down Expand Up @@ -83,6 +84,7 @@ Finally, enable all of the rules that you would like to use.
"jsdoc/require-param-description": 1,
"jsdoc/require-param-name": 1,
"jsdoc/require-param-type": 1,
"jsdoc/require-returns": 1,
"jsdoc/require-returns-description": 1,
"jsdoc/require-returns-type": 1,
"jsdoc/valid-types": 1
Expand Down
10 changes: 10 additions & 0 deletions .README/rules/require-returns.md
@@ -0,0 +1,10 @@
### `require-returns`

Requires returns are documented.

|||
|---|---|
|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`|
|Tags|`returns`|

<!-- assertions requireParam -->
3 changes: 3 additions & 0 deletions src/index.js
Expand Up @@ -13,6 +13,7 @@ import requireParamName from './rules/requireParamName';
import requireParam from './rules/requireParam';
import requireParamDescription from './rules/requireParamDescription';
import requireParamType from './rules/requireParamType';
import requireReturns from './rules/requireReturns';
import requireReturnsDescription from './rules/requireReturnsDescription';
import requireReturnsType from './rules/requireReturnsType';
import validTypes from './rules/validTypes';
Expand All @@ -35,6 +36,7 @@ export default {
'jsdoc/require-param-description': 'warn',
'jsdoc/require-param-name': 'warn',
'jsdoc/require-param-type': 'warn',
'jsdoc/require-returns': 'warn',
'jsdoc/require-returns-description': 'warn',
'jsdoc/require-returns-type': 'warn',
'jsdoc/valid-types': 'warn'
Expand All @@ -56,6 +58,7 @@ export default {
'require-param-description': requireParamDescription,
'require-param-name': requireParamName,
'require-param-type': requireParamType,
'require-returns': requireReturns,
'require-returns-description': requireReturnsDescription,
'require-returns-type': requireReturnsType,
'valid-types': validTypes
Expand Down
4 changes: 4 additions & 0 deletions src/iterateJsdoc.js
Expand Up @@ -48,6 +48,10 @@ const curryUtils = (
return jsdocUtils.getFunctionParameterNames(functionNode);
};

utils.getFunctionSourceCode = function () {
return sourceCode.getText(functionNode);
};

utils.getJsdocParameterNamesDeep = () => {
return jsdocUtils.getJsdocParameterNamesDeep(jsdoc, utils.getPreferredTagName('param'));
};
Expand Down
24 changes: 24 additions & 0 deletions src/rules/requireReturns.js
@@ -0,0 +1,24 @@
import _ from 'lodash';
import iterateJsdoc from '../iterateJsdoc';

export default iterateJsdoc(({
jsdoc,
report,
utils
}) => {
const targetTagName = utils.getPreferredTagName('returns');

const jsdocTags = _.filter(jsdoc.tags, {
tag: targetTagName
});

const sourcecode = utils.getFunctionSourceCode();

if (JSON.stringify(jsdocTags) === '[]' && sourcecode.indexOf('return') >= 1) {
report('Missing JSDoc @' + targetTagName + ' declaration.');
}

if (JSON.stringify(jsdocTags) !== '[]' && sourcecode.indexOf('return') < 1) {
report('Present JSDoc @' + targetTagName + ' declaration but not available return expression in function.');
}
});
67 changes: 67 additions & 0 deletions test/rules/assertions/requireReturns.js
@@ -0,0 +1,67 @@
export default {
invalid: [
{
code: `
/**
*
*/
function quux (foo) {
return foo;
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @returns declaration.'
}
]
},
{
code: `
/**
*
*/
function quux (foo) {
return foo;
}
`,
errors: [
{
line: 2,
message: 'Missing JSDoc @return declaration.'
}
],
settings: {
jsdoc: {
tagNamePreference: {
returns: 'return'
}
}
}
}
],
valid: [
{
code: `
/**
* @returns Foo.
*/
function quux () {
return foo;
}
`
},
{
code: `
/**
*
*/
function quux () {
}
`
}
]
};
1 change: 1 addition & 0 deletions test/rules/index.js
Expand Up @@ -21,6 +21,7 @@ _.forEach([
'require-param-description',
'require-param-name',
'require-param-type',
'require-returns',
'require-returns-description',
'require-returns-type',
'valid-types'
Expand Down

0 comments on commit 5cddd06

Please sign in to comment.