forked from gajus/eslint-plugin-jsdoc
-
Notifications
You must be signed in to change notification settings - Fork 1
/
checkTagNames.js
95 lines (88 loc) · 2.59 KB
/
checkTagNames.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import _ from 'lodash';
import iterateJsdoc from '../iterateJsdoc';
export default iterateJsdoc(({
sourceCode,
jsdoc,
report,
utils,
context,
settings,
jsdocNode
}) => {
if (!jsdoc.tags) {
return;
}
const {definedTags = []} = context.options[0] || {};
let definedPreferredTags = [];
let definedNonPreferredTags = [];
const {tagNamePreference} = settings;
if (Object.keys(tagNamePreference).length) {
definedNonPreferredTags = _.keys(tagNamePreference);
// Replace `_.values` with `Object.values` when we may start requiring Node 7+
definedPreferredTags = _.values(tagNamePreference).map((preferredTag) => {
if (typeof preferredTag === 'string') {
// May become an empty string but will be filtered out below
return preferredTag;
}
if (!preferredTag) {
return undefined;
}
if (typeof preferredTag !== 'object') {
utils.reportSettings(
'Invalid `settings.jsdoc.tagNamePreference`. Values must be falsy, a string, or an object.'
);
}
return preferredTag.replacement;
}).filter((preferredType) => {
return preferredType;
});
}
jsdoc.tags.forEach((jsdocTag) => {
const tagName = jsdocTag.tag;
if (utils.isValidTag(tagName, [...definedTags, ...definedPreferredTags, ...definedNonPreferredTags])) {
let preferredTagName = utils.getPreferredTagName({
allowObjectReturn: true,
defaultMessage: `Blacklisted tag found (\`@${tagName}\`)`,
tagName
});
let message = `Invalid JSDoc tag (preference). Replace "${tagName}" JSDoc tag with "${preferredTagName}".`;
if (!preferredTagName) {
return;
}
if (preferredTagName && typeof preferredTagName === 'object') {
({message, replacement: preferredTagName} = preferredTagName);
}
if (preferredTagName !== tagName) {
report(message, (fixer) => {
const replacement = sourceCode.getText(jsdocNode).replace(
new RegExp(`@${_.escapeRegExp(tagName)}\\b`),
`@${preferredTagName}`
);
return fixer.replaceText(jsdocNode, replacement);
}, jsdocTag);
}
} else {
report(`Invalid JSDoc tag name "${tagName}".`, null, jsdocTag);
}
});
}, {
iterateAllJsdocs: true,
meta: {
fixable: 'code',
schema: [
{
additionalProperties: false,
properties: {
definedTags: {
items: {
type: 'string'
},
type: 'array'
}
},
type: 'object'
}
],
type: 'suggestion'
}
});