Skip to content

Commit bb2bf36

Browse files
Eli Skeggsbrettz9
Eli Skeggs
authored andcommitted
feat: add require-asterisk-prefix rule
This rule checks that each line of the jsdoc comment starts with an asterisk. For composability with other rules, this does not check the alignment or indentation of the comment content. fix gajus#199
1 parent 9b85d7e commit bb2bf36

File tree

7 files changed

+223
-56
lines changed

7 files changed

+223
-56
lines changed

.README/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Finally, enable all of the rules that you would like to use.
6363
"jsdoc/no-defaults": 1,
6464
"jsdoc/no-types": 1,
6565
"jsdoc/no-undefined-types": 1, // Recommended
66+
"jsdoc/require-asterisk-prefix": 1,
6667
"jsdoc/require-description": 1,
6768
"jsdoc/require-description-complete-sentence": 1,
6869
"jsdoc/require-example": 1,
@@ -512,6 +513,7 @@ selector).
512513
{"gitdown": "include", "file": "./rules/no-defaults.md"}
513514
{"gitdown": "include", "file": "./rules/no-types.md"}
514515
{"gitdown": "include", "file": "./rules/no-undefined-types.md"}
516+
{"gitdown": "include", "file": "./rules/require-asterisk-prefix.md"}
515517
{"gitdown": "include", "file": "./rules/require-description-complete-sentence.md"}
516518
{"gitdown": "include", "file": "./rules/require-description.md"}
517519
{"gitdown": "include", "file": "./rules/require-example.md"}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
### `require-asterisk-prefix`
2+
3+
Requires that each JSDoc line starts with an `*`.
4+
5+
#### Options
6+
7+
This rule allows one optional string argument. If it is `"always"` then a problem is raised when there is no asterisk prefix on a given jsdoc line. If it is `"never"` then a problem is raised when there is an asterisk present. The default value is `"always"`.
8+
9+
|||
10+
|---|---|
11+
|Context|everywhere|
12+
|Tags|N/a|

README.md

Lines changed: 73 additions & 56 deletions
Large diffs are not rendered by default.

src/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import noBadBlocks from './rules/noBadBlocks';
1717
import noDefaults from './rules/noDefaults';
1818
import noTypes from './rules/noTypes';
1919
import noUndefinedTypes from './rules/noUndefinedTypes';
20+
import requireAsteriskPrefix from './rules/requireAsteriskPrefix';
2021
import requireDescription from './rules/requireDescription';
2122
import requireDescriptionCompleteSentence from './rules/requireDescriptionCompleteSentence';
2223
import requireExample from './rules/requireExample';
@@ -64,6 +65,7 @@ export default {
6465
'jsdoc/no-defaults': 'off',
6566
'jsdoc/no-types': 'off',
6667
'jsdoc/no-undefined-types': 'warn',
68+
'jsdoc/require-asterisk-prefix': 'off',
6769
'jsdoc/require-description': 'off',
6870
'jsdoc/require-description-complete-sentence': 'off',
6971
'jsdoc/require-example': 'off',
@@ -108,6 +110,7 @@ export default {
108110
'no-defaults': noDefaults,
109111
'no-types': noTypes,
110112
'no-undefined-types': noUndefinedTypes,
113+
'require-asterisk-prefix': requireAsteriskPrefix,
111114
'require-description': requireDescription,
112115
'require-description-complete-sentence': requireDescriptionCompleteSentence,
113116
'require-example': requireExample,

src/rules/requireAsteriskPrefix.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import iterateJsdoc from '../iterateJsdoc';
2+
3+
const prefixMatch = /^(\s+)(?:\*( ?))?/u;
4+
const validPrefix = /^\s+\*(?:\/?$| )/u;
5+
6+
export default iterateJsdoc(({
7+
sourceCode,
8+
jsdocNode,
9+
report,
10+
}) => {
11+
const fix = (fixer) => {
12+
const replacement = sourceCode.getText(jsdocNode).split('\n')
13+
.map((line, index) => {
14+
return index && !validPrefix.test(line) ? line.replace(prefixMatch, (_, $1, $2) => {
15+
return `${$1}*${$2 || ' '}`;
16+
}) : line;
17+
})
18+
.join('\n');
19+
20+
return fixer.replaceText(jsdocNode, replacement);
21+
};
22+
23+
sourceCode.getText(jsdocNode).split('\n').some((line, index) => {
24+
const lineNum = parseInt(index, 10);
25+
if (lineNum && !validPrefix.test(line)) {
26+
report('Expected JSDoc block to have the prefix.', fix, {
27+
line: lineNum,
28+
});
29+
30+
return true;
31+
}
32+
33+
return false;
34+
});
35+
}, {
36+
iterateAllJsdocs: true,
37+
meta: {
38+
fixable: 'code',
39+
type: 'layout',
40+
},
41+
});
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
export default {
2+
invalid: [
3+
{
4+
code: `
5+
6+
/**
7+
@param {Number} foo
8+
*/
9+
function quux (foo) {
10+
// with spaces
11+
}
12+
`,
13+
errors: [
14+
{
15+
line: 4,
16+
message: 'Expected JSDoc block to have the prefix.',
17+
},
18+
],
19+
output: `
20+
21+
/**
22+
* @param {Number} foo
23+
*/
24+
function quux (foo) {
25+
// with spaces
26+
}
27+
`,
28+
},
29+
{
30+
code: `
31+
/**
32+
@param {Number} foo
33+
*/function quux (foo) {
34+
// with spaces
35+
}
36+
`,
37+
errors: [
38+
{
39+
line: 3,
40+
message: 'Expected JSDoc block to have the prefix.',
41+
},
42+
],
43+
output: `
44+
/**
45+
* @param {Number} foo
46+
*/function quux (foo) {
47+
// with spaces
48+
}
49+
`,
50+
},
51+
],
52+
valid: [
53+
{
54+
code: `
55+
/**
56+
* Desc
57+
*
58+
* @param {Number} foo
59+
* This is more comment.
60+
*/
61+
function quux (foo) {
62+
63+
}
64+
`,
65+
},
66+
{
67+
code: `
68+
/**
69+
* Desc
70+
*
71+
* @param {{
72+
* foo: Bar,
73+
* bar: Baz
74+
* }} foo
75+
*
76+
*/
77+
function quux (foo) {
78+
79+
}
80+
`,
81+
},
82+
{
83+
code: `
84+
/* <- JSDoc must start with 2 stars.
85+
So this is unchecked.
86+
*/
87+
function quux (foo) {}
88+
`,
89+
},
90+
],
91+
};

test/rules/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const ruleTester = new RuleTester();
2626
'no-defaults',
2727
'no-types',
2828
'no-undefined-types',
29+
'require-asterisk-prefix',
2930
'require-description',
3031
'require-description-complete-sentence',
3132
'require-example',

0 commit comments

Comments
 (0)