Skip to content

Commit 1778446

Browse files
ajelcocksgajus
authored andcommitted
feat: add require-description (#91)
* add rule require-description * correct a typo
1 parent b132a6c commit 1778446

File tree

6 files changed

+121
-0
lines changed

6 files changed

+121
-0
lines changed

.README/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ This table maps the rules between `eslint-plugin-jsdoc` and `jscs-jsdoc`.
1818
| [`check-tag-names`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-tag-names) | N/A ~ [`checkAnnotations`](https://github.com/jscs-dev/jscs-jsdoc#checkannotations) |
1919
| [`check-types`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-check-types) | [`checkTypes`](https://github.com/jscs-dev/jscs-jsdoc#checktypes) |
2020
| [`newline-after-description`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-newline-after-description) | [`requireNewlineAfterDescription`](https://github.com/jscs-dev/jscs-jsdoc#requirenewlineafterdescription) and [`disallowNewlineAfterDescription`](https://github.com/jscs-dev/jscs-jsdoc#disallownewlineafterdescription) |
21+
| [`require-description`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-description) | N/A |
2122
| [`require-description-complete-sentence`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-description-complete-sentence) | [`requireDescriptionCompleteSentence`](https://github.com/jscs-dev/jscs-jsdoc#requiredescriptioncompletesentence) |
2223
| [`require-example`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-example) | N/A |
2324
| [`require-hyphen-before-param-description`](https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-require-hyphen-before-param-description) | [`requireHyphenBeforeDescription`](https://github.com/jscs-dev/jscs-jsdoc#requirehyphenbeforedescription) |
@@ -72,6 +73,7 @@ Finally, enable all of the rules that you would like to use.
7273
"jsdoc/check-types": 1,
7374
"jsdoc/newline-after-description": 1,
7475
"jsdoc/no-undefined-types": 1,
76+
"jsdoc/require-description": 1,
7577
"jsdoc/require-description-complete-sentence": 1,
7678
"jsdoc/require-example": 1,
7779
"jsdoc/require-hyphen-before-param-description": 1,
@@ -146,6 +148,7 @@ Use `settings.jsdoc.allowOverrideWithoutParam` to indicate whether the `@overrid
146148
{"gitdown": "include", "file": "./rules/check-types.md"}
147149
{"gitdown": "include", "file": "./rules/newline-after-description.md"}
148150
{"gitdown": "include", "file": "./rules/no-undefined-types.md"}
151+
{"gitdown": "include", "file": "./rules/require-description.md"}
149152
{"gitdown": "include", "file": "./rules/require-description-complete-sentence.md"}
150153
{"gitdown": "include", "file": "./rules/require-example.md"}
151154
{"gitdown": "include", "file": "./rules/require-hyphen-before-param-description.md"}

.README/rules/require-description.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
### `require-description`
2+
3+
Requires that all functions have a description.
4+
5+
* All functions must have a `@description` tag.
6+
* Every description tag must have a non-empty description that explains the purpose of the method.
7+
8+
|||
9+
|---|---|
10+
|Context|`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`|
11+
|Tags|`class`, `example`|
12+
13+
<!-- assertions requireDescription -->

src/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import checkTypes from './rules/checkTypes';
55
import newlineAfterDescription from './rules/newlineAfterDescription';
66
import noUndefinedTypes from './rules/noUndefinedTypes';
77
import requireDescriptionCompleteSentence from './rules/requireDescriptionCompleteSentence';
8+
import requireDescription from './rules/requireDescription';
89
import requireExample from './rules/requireExample';
910
import requireHyphenBeforeParamDescription from './rules/requireHyphenBeforeParamDescription';
1011
import requireParamName from './rules/requireParamName';
@@ -24,6 +25,7 @@ export default {
2425
'jsdoc/check-types': 'warn',
2526
'jsdoc/newline-after-description': 'warn',
2627
'jsdoc/no-undefined-types': 'warn',
28+
'jsdoc/require-description': 'off',
2729
'jsdoc/require-description-complete-sentence': 'off',
2830
'jsdoc/require-example': 'off',
2931
'jsdoc/require-hyphen-before-param-description': 'off',
@@ -43,6 +45,7 @@ export default {
4345
'check-types': checkTypes,
4446
'newline-after-description': newlineAfterDescription,
4547
'no-undefined-types': noUndefinedTypes,
48+
'require-description': requireDescription,
4649
'require-description-complete-sentence': requireDescriptionCompleteSentence,
4750
'require-example': requireExample,
4851
'require-hyphen-before-param-description': requireHyphenBeforeParamDescription,
@@ -60,6 +63,7 @@ export default {
6063
'check-types': 'off',
6164
'newline-after-description': 'off',
6265
'no-undefined-types': 'off',
66+
'require-description': 'off',
6367
'require-description-complete-sentence': 'off',
6468
'require-example': 'off',
6569
'require-hyphen-before-param-description': 'off',

src/rules/requireDescription.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import _ from 'lodash';
2+
import iterateJsdoc from '../iterateJsdoc';
3+
4+
export default iterateJsdoc(({
5+
jsdoc,
6+
report,
7+
utils
8+
}) => {
9+
const targetTagName = utils.getPreferredTagName('description');
10+
11+
const functionExamples = _.filter(jsdoc.tags, {
12+
tag: targetTagName
13+
});
14+
15+
if (_.isEmpty(functionExamples)) {
16+
return report('Missing JSDoc @' + targetTagName + ' declaration.');
17+
}
18+
19+
return _.forEach(functionExamples, (example) => {
20+
const exampleContent = _.compact((example.name + ' ' + example.description).trim().split('\n'));
21+
22+
if (_.isEmpty(exampleContent)) {
23+
report('Missing JSDoc @' + targetTagName + ' description.');
24+
}
25+
});
26+
});
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/* eslint-disable no-restricted-syntax */
2+
3+
export default {
4+
invalid: [
5+
{
6+
code: `
7+
/**
8+
*
9+
*/
10+
function quux () {
11+
12+
}
13+
`,
14+
errors: [
15+
{
16+
message: 'Missing JSDoc @description declaration.'
17+
}
18+
]
19+
},
20+
{
21+
code: `
22+
/**
23+
* @description
24+
*/
25+
function quux () {
26+
27+
}
28+
`,
29+
errors: [
30+
{
31+
message: 'Missing JSDoc @description description.'
32+
}
33+
]
34+
}
35+
],
36+
valid: [
37+
{
38+
code: `
39+
/**
40+
* @description
41+
* // arbitrary description content
42+
*/
43+
function quux () {
44+
45+
}
46+
`
47+
},
48+
{
49+
code: `
50+
/**
51+
* @description
52+
* quux(); // does something useful
53+
*/
54+
function quux () {
55+
56+
}
57+
`
58+
},
59+
{
60+
code: `
61+
/**
62+
* @description <caption>Valid usage</caption>
63+
* quux(); // does something useful
64+
*
65+
* @description <caption>Invalid usage</caption>
66+
* quux('random unwanted arg'); // results in an error
67+
*/
68+
function quux () {
69+
70+
}
71+
`
72+
}
73+
]
74+
};

test/rules/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ _.forEach([
1212
'check-types',
1313
'newline-after-description',
1414
'no-undefined-types',
15+
'require-description',
1516
'require-description-complete-sentence',
1617
'require-example',
1718
'require-hyphen-before-param-description',

0 commit comments

Comments
 (0)