Skip to content

Commit 90af18a

Browse files
committed
feat(require-template-description): add rule; fixes #1540
1 parent 91e261d commit 90af18a

File tree

8 files changed

+133
-1
lines changed

8 files changed

+133
-1
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# `require-template-description`
2+
3+
## Options
4+
5+
{"gitdown": "options"}
6+
7+
|||
8+
|---|---|
9+
|Context|everywhere|
10+
|Tags|`template`|
11+
|Recommended|false|
12+
|Settings||
13+
|Options||
14+
15+
## Failing examples
16+
17+
<!-- assertions-failing requireTemplateDescription -->
18+
19+
## Passing examples
20+
21+
<!-- assertions-passing requireTemplateDescription -->

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ non-default-recommended fixer).
483483
|:heavy_check_mark: (Off in TS; On in TS flavor)|| [require-returns-type](./docs/rules/require-returns-type.md#readme) | Requires that `@returns` tag has type value (in curly brackets). |
484484
||| [require-tags](./docs/rules/require-tags.md#readme) | Requires tags be present, optionally for specific contexts |
485485
||| [require-template](./docs/rules/require-template.md#readme) | Requires `@template` tags be present when type parameters are used. |
486+
||| [require-template-description](./docs/rules/require-template-description.md#readme) | Requires a description for `@template` tags |
486487
||| [require-throws](./docs/rules/require-throws.md#readme) | Requires that throw statements are documented with `@throws` tags. |
487488
||| [require-throws-description](./docs/rules/require-throws-description.md#readme) | Requires a description for `@throws` tags |
488489
|:heavy_check_mark:|| [require-throws-type](./docs/rules/require-throws-type.md#readme) | Requires a type for `@throws` tags |
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<a name="user-content-require-template-description"></a>
2+
<a name="require-template-description"></a>
3+
# <code>require-template-description</code>
4+
5+
<a name="user-content-require-template-description-options"></a>
6+
<a name="require-template-description-options"></a>
7+
## Options
8+
9+
10+
11+
|||
12+
|---|---|
13+
|Context|everywhere|
14+
|Tags|`template`|
15+
|Recommended|false|
16+
|Settings||
17+
|Options||
18+
19+
<a name="user-content-require-template-description-failing-examples"></a>
20+
<a name="require-template-description-failing-examples"></a>
21+
## Failing examples
22+
23+
The following patterns are considered problems:
24+
25+
````ts
26+
/**
27+
* @template {SomeType}
28+
*/
29+
// Message: @template should have a description
30+
````
31+
32+
33+
34+
<a name="user-content-require-template-description-passing-examples"></a>
35+
<a name="require-template-description-passing-examples"></a>
36+
## Passing examples
37+
38+
The following patterns are not considered problems:
39+
40+
````ts
41+
/**
42+
* @template {SomeType} Has a description
43+
*/
44+
45+
/**
46+
* @template Has a description
47+
*/
48+
````
49+

src/index-cjs.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,17 @@ index.rules = {
188188
'require-returns-type': requireReturnsType,
189189
'require-tags': requireTags,
190190
'require-template': requireTemplate,
191+
'require-template-description': buildForbidRuleDefinition({
192+
contexts: [
193+
{
194+
comment: 'JsdocBlock:has(JsdocTag[tag=template]:not([description!=""]))',
195+
context: 'any',
196+
message: '@template should have a description',
197+
},
198+
],
199+
description: 'Requires a description for `@template` tags',
200+
url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-template-description.md#repos-sticky-header',
201+
}),
191202
'require-throws': requireThrows,
192203
'require-throws-description': buildForbidRuleDefinition({
193204
contexts: [
@@ -316,6 +327,7 @@ const createRecommendedRuleset = (warnOrError, flatName) => {
316327
'jsdoc/require-returns-type': warnOrError,
317328
'jsdoc/require-tags': 'off',
318329
'jsdoc/require-template': 'off',
330+
'jsdoc/require-template-description': 'off',
319331
'jsdoc/require-throws': 'off',
320332
'jsdoc/require-throws-description': 'off',
321333
'jsdoc/require-throws-type': warnOrError,

src/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,17 @@ index.rules = {
194194
'require-returns-type': requireReturnsType,
195195
'require-tags': requireTags,
196196
'require-template': requireTemplate,
197+
'require-template-description': buildForbidRuleDefinition({
198+
contexts: [
199+
{
200+
comment: 'JsdocBlock:has(JsdocTag[tag=template]:not([description!=""]))',
201+
context: 'any',
202+
message: '@template should have a description',
203+
},
204+
],
205+
description: 'Requires a description for `@template` tags',
206+
url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-template-description.md#repos-sticky-header',
207+
}),
197208
'require-throws': requireThrows,
198209
'require-throws-description': buildForbidRuleDefinition({
199210
contexts: [
@@ -322,6 +333,7 @@ const createRecommendedRuleset = (warnOrError, flatName) => {
322333
'jsdoc/require-returns-type': warnOrError,
323334
'jsdoc/require-tags': 'off',
324335
'jsdoc/require-template': 'off',
336+
'jsdoc/require-template-description': 'off',
325337
'jsdoc/require-throws': 'off',
326338
'jsdoc/require-throws-description': 'off',
327339
'jsdoc/require-throws-type': warnOrError,

src/rules.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,6 +2444,9 @@ export interface Rules {
24442444
}
24452445
];
24462446

2447+
/** Requires a description for `@template` tags */
2448+
"jsdoc/require-template-description": [];
2449+
24472450
/** Requires that throw statements are documented with `@throws` tags. */
24482451
"jsdoc/require-throws":
24492452
| []
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export default /** @type {import('../index.js').TestCases} */ ({
2+
invalid: [
3+
{
4+
code: `
5+
/**
6+
* @template {SomeType}
7+
*/
8+
`,
9+
errors: [
10+
{
11+
line: 2,
12+
message: '@template should have a description',
13+
},
14+
],
15+
},
16+
],
17+
valid: [
18+
{
19+
code: `
20+
/**
21+
* @template {SomeType} Has a description
22+
*/
23+
`,
24+
},
25+
{
26+
code: `
27+
/**
28+
* @template Has a description
29+
*/
30+
`,
31+
},
32+
],
33+
});

test/rules/ruleNames.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,16 @@
5353
"require-returns-check",
5454
"require-returns-description",
5555
"require-returns-type",
56+
"require-tags",
5657
"require-template",
58+
"require-template-description",
5759
"require-throws",
5860
"require-throws-description",
5961
"require-throws-type",
6062
"require-yields",
6163
"require-yields-check",
6264
"require-yields-description",
6365
"require-yields-type",
64-
"require-tags",
6566
"sort-tags",
6667
"tag-lines",
6768
"text-escaping",

0 commit comments

Comments
 (0)