eslint-plugin-jsdoc 48.0.0 → 48.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/package.json +1 -1
  2. package/src/WarnSettings.js +34 -0
  3. package/src/alignTransform.js +356 -0
  4. package/src/defaultTagOrder.js +168 -0
  5. package/src/exportParser.js +957 -0
  6. package/src/getDefaultTagStructureForMode.js +969 -0
  7. package/src/index.js +266 -0
  8. package/src/iterateJsdoc.js +2555 -0
  9. package/src/jsdocUtils.js +1693 -0
  10. package/src/rules/checkAccess.js +45 -0
  11. package/src/rules/checkAlignment.js +63 -0
  12. package/src/rules/checkExamples.js +594 -0
  13. package/src/rules/checkIndentation.js +75 -0
  14. package/src/rules/checkLineAlignment.js +364 -0
  15. package/src/rules/checkParamNames.js +404 -0
  16. package/src/rules/checkPropertyNames.js +152 -0
  17. package/src/rules/checkSyntax.js +30 -0
  18. package/src/rules/checkTagNames.js +314 -0
  19. package/src/rules/checkTypes.js +535 -0
  20. package/src/rules/checkValues.js +220 -0
  21. package/src/rules/emptyTags.js +88 -0
  22. package/src/rules/implementsOnClasses.js +64 -0
  23. package/src/rules/importsAsDependencies.js +131 -0
  24. package/src/rules/informativeDocs.js +182 -0
  25. package/src/rules/matchDescription.js +286 -0
  26. package/src/rules/matchName.js +147 -0
  27. package/src/rules/multilineBlocks.js +333 -0
  28. package/src/rules/noBadBlocks.js +109 -0
  29. package/src/rules/noBlankBlockDescriptions.js +69 -0
  30. package/src/rules/noBlankBlocks.js +53 -0
  31. package/src/rules/noDefaults.js +85 -0
  32. package/src/rules/noMissingSyntax.js +195 -0
  33. package/src/rules/noMultiAsterisks.js +134 -0
  34. package/src/rules/noRestrictedSyntax.js +91 -0
  35. package/src/rules/noTypes.js +73 -0
  36. package/src/rules/noUndefinedTypes.js +328 -0
  37. package/src/rules/requireAsteriskPrefix.js +189 -0
  38. package/src/rules/requireDescription.js +161 -0
  39. package/src/rules/requireDescriptionCompleteSentence.js +333 -0
  40. package/src/rules/requireExample.js +118 -0
  41. package/src/rules/requireFileOverview.js +154 -0
  42. package/src/rules/requireHyphenBeforeParamDescription.js +178 -0
  43. package/src/rules/requireJsdoc.js +629 -0
  44. package/src/rules/requireParam.js +592 -0
  45. package/src/rules/requireParamDescription.js +89 -0
  46. package/src/rules/requireParamName.js +55 -0
  47. package/src/rules/requireParamType.js +89 -0
  48. package/src/rules/requireProperty.js +48 -0
  49. package/src/rules/requirePropertyDescription.js +25 -0
  50. package/src/rules/requirePropertyName.js +25 -0
  51. package/src/rules/requirePropertyType.js +25 -0
  52. package/src/rules/requireReturns.js +238 -0
  53. package/src/rules/requireReturnsCheck.js +141 -0
  54. package/src/rules/requireReturnsDescription.js +59 -0
  55. package/src/rules/requireReturnsType.js +51 -0
  56. package/src/rules/requireThrows.js +111 -0
  57. package/src/rules/requireYields.js +216 -0
  58. package/src/rules/requireYieldsCheck.js +208 -0
  59. package/src/rules/sortTags.js +557 -0
  60. package/src/rules/tagLines.js +359 -0
  61. package/src/rules/textEscaping.js +146 -0
  62. package/src/rules/validTypes.js +368 -0
  63. package/src/tagNames.js +234 -0
  64. package/src/utils/hasReturnValue.js +549 -0
@@ -0,0 +1,178 @@
1
+ import iterateJsdoc from '../iterateJsdoc.js';
2
+
3
+ export default iterateJsdoc(({
4
+ sourceCode,
5
+ utils,
6
+ report,
7
+ context,
8
+ jsdoc,
9
+ jsdocNode,
10
+ }) => {
11
+ const [
12
+ mainCircumstance,
13
+ {
14
+ tags = null,
15
+ } = {},
16
+ ] = context.options;
17
+
18
+ const tgs = /**
19
+ * @type {null|"any"|{[key: string]: "always"|"never"}}
20
+ */ (tags);
21
+
22
+ /**
23
+ * @param {import('@es-joy/jsdoccomment').JsdocTagWithInline} jsdocTag
24
+ * @param {string} targetTagName
25
+ * @param {"always"|"never"} [circumstance]
26
+ * @returns {void}
27
+ */
28
+ const checkHyphens = (jsdocTag, targetTagName, circumstance = mainCircumstance) => {
29
+ const always = !circumstance || circumstance === 'always';
30
+ const desc = /** @type {string} */ (utils.getTagDescription(jsdocTag));
31
+ if (!desc.trim()) {
32
+ return;
33
+ }
34
+
35
+ const startsWithHyphen = (/^\s*-/u).test(desc);
36
+ if (always) {
37
+ if (!startsWithHyphen) {
38
+ report(`There must be a hyphen before @${targetTagName} description.`, (fixer) => {
39
+ const lineIndex = /** @type {import('../iterateJsdoc.js').Integer} */ (
40
+ jsdocTag.line
41
+ );
42
+ const sourceLines = sourceCode.getText(jsdocNode).split('\n');
43
+
44
+ // Get start index of description, accounting for multi-line descriptions
45
+ const description = desc.split('\n')[0];
46
+ const descriptionIndex = sourceLines[lineIndex].lastIndexOf(description);
47
+
48
+ const replacementLine = sourceLines[lineIndex]
49
+ .slice(0, descriptionIndex) + '- ' + description;
50
+ sourceLines.splice(lineIndex, 1, replacementLine);
51
+ const replacement = sourceLines.join('\n');
52
+
53
+ return fixer.replaceText(jsdocNode, replacement);
54
+ }, jsdocTag);
55
+ }
56
+ } else if (startsWithHyphen) {
57
+ let lines = 0;
58
+ for (const {
59
+ tokens,
60
+ } of jsdocTag.source) {
61
+ if (tokens.description) {
62
+ break;
63
+ }
64
+
65
+ lines++;
66
+ }
67
+
68
+ utils.reportJSDoc(
69
+ `There must be no hyphen before @${targetTagName} description.`,
70
+ {
71
+ line: jsdocTag.source[0].number + lines,
72
+ },
73
+ () => {
74
+ for (const {
75
+ tokens,
76
+ } of jsdocTag.source) {
77
+ if (tokens.description) {
78
+ tokens.description = tokens.description.replace(
79
+ /^\s*-\s*/u, '',
80
+ );
81
+ break;
82
+ }
83
+ }
84
+ },
85
+ true,
86
+ );
87
+ }
88
+ };
89
+
90
+ utils.forEachPreferredTag('param', checkHyphens);
91
+ if (tgs) {
92
+ const tagEntries = Object.entries(tgs);
93
+ for (const [
94
+ tagName,
95
+ circumstance,
96
+ ] of tagEntries) {
97
+ if (tagName === '*') {
98
+ const preferredParamTag = utils.getPreferredTagName({
99
+ tagName: 'param',
100
+ });
101
+ for (const {
102
+ tag,
103
+ } of jsdoc.tags) {
104
+ if (tag === preferredParamTag || tagEntries.some(([
105
+ tagNme,
106
+ ]) => {
107
+ return tagNme !== '*' && tagNme === tag;
108
+ })) {
109
+ continue;
110
+ }
111
+
112
+ utils.forEachPreferredTag(tag, (jsdocTag, targetTagName) => {
113
+ checkHyphens(
114
+ jsdocTag,
115
+ targetTagName,
116
+ /** @type {"always"|"never"} */ (circumstance),
117
+ );
118
+ });
119
+ }
120
+
121
+ continue;
122
+ }
123
+
124
+ utils.forEachPreferredTag(tagName, (jsdocTag, targetTagName) => {
125
+ checkHyphens(
126
+ jsdocTag,
127
+ targetTagName,
128
+ /** @type {"always"|"never"} */ (circumstance),
129
+ );
130
+ });
131
+ }
132
+ }
133
+ }, {
134
+ iterateAllJsdocs: true,
135
+ meta: {
136
+ docs: {
137
+ description: 'Requires a hyphen before the `@param` description.',
138
+ url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-hyphen-before-param-description.md#repos-sticky-header',
139
+ },
140
+ fixable: 'code',
141
+ schema: [
142
+ {
143
+ enum: [
144
+ 'always', 'never',
145
+ ],
146
+ type: 'string',
147
+ },
148
+ {
149
+ additionalProperties: false,
150
+ properties: {
151
+ tags: {
152
+ anyOf: [
153
+ {
154
+ patternProperties: {
155
+ '.*': {
156
+ enum: [
157
+ 'always', 'never',
158
+ ],
159
+ type: 'string',
160
+ },
161
+ },
162
+ type: 'object',
163
+ },
164
+ {
165
+ enum: [
166
+ 'any',
167
+ ],
168
+ type: 'string',
169
+ },
170
+ ],
171
+ },
172
+ },
173
+ type: 'object',
174
+ },
175
+ ],
176
+ type: 'layout',
177
+ },
178
+ });