Skip to content

Commit ca1817d

Browse files
jschafgajus
authored andcommitted
feat: add support for additionalTagNames (#23)
* Test all JSDOC 3 tags. * Add support for additional tag names. Fixes #15. * Add documentation for configuring additionalTagNames
1 parent 14f378d commit ca1817d

File tree

6 files changed

+200
-9
lines changed

6 files changed

+200
-9
lines changed

.README/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,24 @@ Use `settings.jsdoc.tagNamePreference` to configure a preferred alias name for a
9898
}
9999
```
100100

101+
102+
### Additional Tag Names
103+
104+
Use `settings.jsdoc.additionalTagNames` to configure additional, allowed JSDoc tags. The format of the configuration is as follows:
105+
106+
```json
107+
{
108+
"rules": {},
109+
"settings": {
110+
"jsdoc": {
111+
"additionalTagNames": {
112+
"customTags": ["define", "extends", "record"]
113+
}
114+
}
115+
}
116+
}
117+
```
118+
101119
## Rules
102120

103121
{"gitdown": "include", "file": "./rules/check-param-names.md"}

src/iterateJsdoc.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import _ from 'lodash';
22
import commentParser from 'comment-parser';
33
import jsdocUtils from './jsdocUtils';
44

5-
const curryUtils = (functionNode, jsdoc, tagNamePreference) => {
5+
const curryUtils = (functionNode, jsdoc, tagNamePreference, additionalTagNames) => {
66
const utils = {};
77

88
utils.getFunctionParameterNames = () => {
@@ -22,7 +22,7 @@ const curryUtils = (functionNode, jsdoc, tagNamePreference) => {
2222
};
2323

2424
utils.isValidTag = (name) => {
25-
return jsdocUtils.isValidTag(name);
25+
return jsdocUtils.isValidTag(name, additionalTagNames);
2626
};
2727

2828
utils.hasTag = (name) => {
@@ -36,6 +36,7 @@ export default (iterator) => {
3636
return (context) => {
3737
const sourceCode = context.getSourceCode();
3838
const tagNamePreference = _.get(context, 'settings.jsdoc.tagNamePreference') || {};
39+
const additionalTagNames = _.get(context, 'settings.jsdoc.additionalTagNames') || {};
3940

4041
const checkJsdoc = (functionNode) => {
4142
const jsdocNode = sourceCode.getJSDocComment(functionNode);
@@ -63,7 +64,7 @@ export default (iterator) => {
6364
context.report(jsdocNode, message);
6465
};
6566

66-
const utils = curryUtils(functionNode, jsdoc, tagNamePreference);
67+
const utils = curryUtils(functionNode, jsdoc, tagNamePreference, additionalTagNames);
6768

6869
iterator({
6970
context,

src/jsdocUtils.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,12 @@ const getPreferredTagName = (name : string, tagPreference : Object = {}) : strin
6666
return _.has(tagPreference, name) ? tagPreference[name] : name;
6767
};
6868

69-
const isValidTag = (name : string) : boolean => {
69+
const isValidTag = (name : string, additionalTagNames : Object) : boolean => {
7070
const validTagNames = _.keys(tagNames).concat(_.flatten(_.values(tagNames)));
71+
const additionalTags = additionalTagNames.customTags || [];
72+
const allTags = validTagNames.concat(additionalTags);
7173

72-
return _.includes(validTagNames, name);
74+
return _.includes(allTags, name);
7375
};
7476

7577
const hasTag = (jsdoc : Object, targetTagName : string) : boolean => {

tests/jsdocUtils.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,22 @@ describe('jsdocUtils', () => {
2727
describe('isValidTag()', () => {
2828
context('tag is invalid', () => {
2929
it('returns false', () => {
30-
expect(jsdocUtils.isValidTag('foo')).to.equal(false);
30+
expect(jsdocUtils.isValidTag('foo', {})).to.equal(false);
3131
});
3232
});
3333
context('tag is valid', () => {
3434
it('returns true', () => {
35-
expect(jsdocUtils.isValidTag('param')).to.equal(true);
35+
expect(jsdocUtils.isValidTag('param', {})).to.equal(true);
3636
});
3737
});
3838
context('tag is valid alias', () => {
3939
it('returns true', () => {
40-
expect(jsdocUtils.isValidTag('arg')).to.equal(true);
40+
expect(jsdocUtils.isValidTag('arg', {})).to.equal(true);
41+
});
42+
});
43+
context('tag is valid and customized', () => {
44+
it('returns true', () => {
45+
expect(jsdocUtils.isValidTag('foobar', {customTags: ['foobar']})).to.equal(true);
4146
});
4247
});
4348
});

tests/rules/assertions/checkTagNames.js

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
/* eslint-disable no-restricted-syntax */
22

3+
import JSDOC_3_TAGS from './jsdoc3Tags';
4+
5+
const ALL_JSDOC_TAGS_COMMENT = '/** \n * @' + JSDOC_3_TAGS.join('\n * @') + '\n */';
6+
37
export default {
48
invalid: [
59
{
@@ -68,7 +72,67 @@ export default {
6872
}
6973
}
7074
}
71-
}
75+
},
76+
{
77+
code: `
78+
/**
79+
* @bar foo
80+
*/
81+
function quux (foo) {
82+
83+
}
84+
`,
85+
errors: [
86+
{
87+
message: 'Invalid JSDoc tag name "bar".'
88+
}
89+
],
90+
},
91+
{
92+
code: `
93+
/**
94+
* @baz @bar foo
95+
*/
96+
function quux (foo) {
97+
98+
}
99+
`,
100+
errors: [
101+
{
102+
message: 'Invalid JSDoc tag name "baz".'
103+
}
104+
],
105+
settings: {
106+
jsdoc: {
107+
additionalTagNames: {
108+
customTags: ['bar']
109+
}
110+
}
111+
}
112+
},
113+
{
114+
code: `
115+
/**
116+
* @bar
117+
* @baz
118+
*/
119+
function quux (foo) {
120+
121+
}
122+
`,
123+
errors: [
124+
{
125+
message: 'Invalid JSDoc tag name "baz".'
126+
}
127+
],
128+
settings: {
129+
jsdoc: {
130+
additionalTagNames: {
131+
customTags: ['bar']
132+
}
133+
}
134+
}
135+
},
72136
],
73137
valid: [
74138
{
@@ -97,6 +161,43 @@ export default {
97161
}
98162
}
99163
}
164+
},
165+
{
166+
code: `
167+
/**
168+
* @bar foo
169+
*/
170+
function quux (foo) {
171+
172+
}
173+
`,
174+
settings: {
175+
jsdoc: {
176+
additionalTagNames: {
177+
customTags: ['bar']
178+
}
179+
}
180+
}
181+
},
182+
{
183+
code: `
184+
/**
185+
* @baz @bar foo
186+
*/
187+
function quux (foo) {
188+
189+
}
190+
`,
191+
settings: {
192+
jsdoc: {
193+
additionalTagNames: {
194+
customTags: ['baz', 'bar']
195+
}
196+
}
197+
}
198+
},
199+
{
200+
code: ALL_JSDOC_TAGS_COMMENT + '\n' + 'function quux (foo) {}',
100201
}
101202
]
102203
};

tests/rules/assertions/jsdoc3Tags.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
export default [
2+
'abstract',
3+
'access',
4+
'alias',
5+
'augments',
6+
'author',
7+
'borrows',
8+
'callback',
9+
'class',
10+
'classdesc',
11+
'constant',
12+
'constructs',
13+
'copyright',
14+
'default',
15+
'deprecated',
16+
'description',
17+
'enum',
18+
'event',
19+
'example',
20+
'exports',
21+
'external',
22+
'file',
23+
'fires',
24+
'function',
25+
'global',
26+
'ignore',
27+
'implements',
28+
'inheritdoc',
29+
'inner',
30+
'instance',
31+
'interface',
32+
'kind',
33+
'lends',
34+
'license',
35+
'listens',
36+
'member',
37+
'memberof',
38+
'mixes',
39+
'mixin',
40+
'module',
41+
'name',
42+
'namespace',
43+
'override',
44+
'param',
45+
'private',
46+
'property',
47+
'protected',
48+
'public',
49+
'readonly',
50+
'requires',
51+
'returns',
52+
'see',
53+
'since',
54+
'static',
55+
'summary',
56+
'this',
57+
'throws',
58+
'todo',
59+
'tutorial',
60+
'type',
61+
'typedef',
62+
'variation',
63+
'version'
64+
];

0 commit comments

Comments
 (0)