eslint-plugin-jsdoc 50.6.17 → 50.7.0

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 (155) hide show
  1. package/dist/alignTransform.cjs +10 -10
  2. package/dist/alignTransform.cjs.map +1 -1
  3. package/dist/exportParser.cjs +141 -135
  4. package/dist/exportParser.cjs.map +1 -1
  5. package/dist/generateRule.cjs +10 -12
  6. package/dist/generateRule.cjs.map +1 -1
  7. package/dist/getDefaultTagStructureForMode.cjs +73 -73
  8. package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
  9. package/dist/getJsdocProcessorPlugin.cjs +121 -110
  10. package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
  11. package/dist/index.cjs +17 -12
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.ts +4 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/iterateJsdoc.cjs +87 -66
  16. package/dist/iterateJsdoc.cjs.map +1 -1
  17. package/dist/jsdocUtils.cjs +144 -142
  18. package/dist/jsdocUtils.cjs.map +1 -1
  19. package/dist/rules/checkAlignment.cjs +2 -2
  20. package/dist/rules/checkAlignment.cjs.map +1 -1
  21. package/dist/rules/checkExamples.cjs +22 -28
  22. package/dist/rules/checkExamples.cjs.map +1 -1
  23. package/dist/rules/checkIndentation.cjs +2 -2
  24. package/dist/rules/checkIndentation.cjs.map +1 -1
  25. package/dist/rules/checkLineAlignment.cjs +14 -14
  26. package/dist/rules/checkLineAlignment.cjs.map +1 -1
  27. package/dist/rules/checkParamNames.cjs +21 -15
  28. package/dist/rules/checkParamNames.cjs.map +1 -1
  29. package/dist/rules/checkPropertyNames.cjs +2 -2
  30. package/dist/rules/checkPropertyNames.cjs.map +1 -1
  31. package/dist/rules/checkTagNames.cjs +11 -11
  32. package/dist/rules/checkTagNames.cjs.map +1 -1
  33. package/dist/rules/checkTemplateNames.cjs +21 -22
  34. package/dist/rules/checkTemplateNames.cjs.map +1 -1
  35. package/dist/rules/checkTypes.cjs +10 -10
  36. package/dist/rules/checkTypes.cjs.map +1 -1
  37. package/dist/rules/checkValues.cjs +11 -14
  38. package/dist/rules/checkValues.cjs.map +1 -1
  39. package/dist/rules/convertToJsdocComments.cjs +26 -27
  40. package/dist/rules/convertToJsdocComments.cjs.map +1 -1
  41. package/dist/rules/emptyTags.cjs +6 -6
  42. package/dist/rules/emptyTags.cjs.map +1 -1
  43. package/dist/rules/importsAsDependencies.cjs.map +1 -1
  44. package/dist/rules/informativeDocs.cjs +12 -12
  45. package/dist/rules/informativeDocs.cjs.map +1 -1
  46. package/dist/rules/linesBeforeBlock.cjs +12 -12
  47. package/dist/rules/linesBeforeBlock.cjs.map +1 -1
  48. package/dist/rules/matchDescription.cjs +1 -1
  49. package/dist/rules/matchDescription.cjs.map +1 -1
  50. package/dist/rules/matchName.cjs +4 -4
  51. package/dist/rules/matchName.cjs.map +1 -1
  52. package/dist/rules/multilineBlocks.cjs +10 -10
  53. package/dist/rules/multilineBlocks.cjs.map +1 -1
  54. package/dist/rules/noBadBlocks.cjs +3 -3
  55. package/dist/rules/noBadBlocks.cjs.map +1 -1
  56. package/dist/rules/noMultiAsterisks.cjs +6 -6
  57. package/dist/rules/noMultiAsterisks.cjs.map +1 -1
  58. package/dist/rules/noRestrictedSyntax.cjs +2 -2
  59. package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
  60. package/dist/rules/noTypes.cjs.map +1 -1
  61. package/dist/rules/noUndefinedTypes.cjs +17 -20
  62. package/dist/rules/noUndefinedTypes.cjs.map +1 -1
  63. package/dist/rules/requireAsteriskPrefix.cjs +4 -4
  64. package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
  65. package/dist/rules/requireDescription.cjs +2 -2
  66. package/dist/rules/requireDescription.cjs.map +1 -1
  67. package/dist/rules/requireDescriptionCompleteSentence.cjs +8 -8
  68. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
  69. package/dist/rules/requireFileOverview.cjs +6 -6
  70. package/dist/rules/requireFileOverview.cjs.map +1 -1
  71. package/dist/rules/requireHyphenBeforeParamDescription.cjs +1 -4
  72. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
  73. package/dist/rules/requireJsdoc.cjs +19 -19
  74. package/dist/rules/requireJsdoc.cjs.map +1 -1
  75. package/dist/rules/requireParam.cjs +12 -12
  76. package/dist/rules/requireParam.cjs.map +1 -1
  77. package/dist/rules/requireProperty.cjs +1 -1
  78. package/dist/rules/requireProperty.cjs.map +1 -1
  79. package/dist/rules/requireReturns.cjs +3 -3
  80. package/dist/rules/requireReturns.cjs.map +1 -1
  81. package/dist/rules/requireReturnsCheck.cjs +1 -1
  82. package/dist/rules/requireReturnsCheck.cjs.map +1 -1
  83. package/dist/rules/requireReturnsDescription.cjs +1 -1
  84. package/dist/rules/requireReturnsDescription.cjs.map +1 -1
  85. package/dist/rules/requireTemplate.cjs +16 -15
  86. package/dist/rules/requireTemplate.cjs.map +1 -1
  87. package/dist/rules/requireYields.cjs +4 -4
  88. package/dist/rules/requireYields.cjs.map +1 -1
  89. package/dist/rules/requireYieldsCheck.cjs +6 -6
  90. package/dist/rules/requireYieldsCheck.cjs.map +1 -1
  91. package/dist/rules/sortTags.cjs +13 -13
  92. package/dist/rules/sortTags.cjs.map +1 -1
  93. package/dist/rules/tagLines.cjs +11 -11
  94. package/dist/rules/tagLines.cjs.map +1 -1
  95. package/dist/rules/textEscaping.cjs +2 -2
  96. package/dist/rules/textEscaping.cjs.map +1 -1
  97. package/dist/rules/validTypes.cjs +15 -15
  98. package/dist/rules/validTypes.cjs.map +1 -1
  99. package/dist/tagNames.cjs +1 -1
  100. package/dist/tagNames.cjs.map +1 -1
  101. package/dist/utils/hasReturnValue.cjs +176 -176
  102. package/dist/utils/hasReturnValue.cjs.map +1 -1
  103. package/eslint.config.js +36 -32
  104. package/package.json +30 -30
  105. package/pnpm-workspace.yaml +1 -0
  106. package/src/alignTransform.js +15 -15
  107. package/src/exportParser.js +386 -373
  108. package/src/getDefaultTagStructureForMode.js +45 -45
  109. package/src/getJsdocProcessorPlugin.js +175 -128
  110. package/src/index.js +66 -37
  111. package/src/iterateJsdoc.js +61 -28
  112. package/src/jsdocUtils.js +354 -338
  113. package/src/rules/checkAlignment.js +2 -2
  114. package/src/rules/checkExamples.js +16 -20
  115. package/src/rules/checkIndentation.js +2 -2
  116. package/src/rules/checkLineAlignment.js +10 -10
  117. package/src/rules/checkParamNames.js +22 -14
  118. package/src/rules/checkPropertyNames.js +1 -1
  119. package/src/rules/checkTagNames.js +7 -7
  120. package/src/rules/checkTemplateNames.js +52 -38
  121. package/src/rules/checkTypes.js +7 -7
  122. package/src/rules/checkValues.js +16 -17
  123. package/src/rules/convertToJsdocComments.js +47 -37
  124. package/src/rules/emptyTags.js +14 -7
  125. package/src/rules/importsAsDependencies.js +3 -1
  126. package/src/rules/informativeDocs.js +58 -58
  127. package/src/rules/linesBeforeBlock.js +25 -17
  128. package/src/rules/matchDescription.js +1 -1
  129. package/src/rules/matchName.js +2 -2
  130. package/src/rules/multilineBlocks.js +10 -10
  131. package/src/rules/noBadBlocks.js +3 -3
  132. package/src/rules/noMultiAsterisks.js +4 -4
  133. package/src/rules/noRestrictedSyntax.js +1 -1
  134. package/src/rules/noTypes.js +1 -1
  135. package/src/rules/noUndefinedTypes.js +29 -23
  136. package/src/rules/requireAsteriskPrefix.js +3 -3
  137. package/src/rules/requireDescription.js +1 -1
  138. package/src/rules/requireDescriptionCompleteSentence.js +6 -6
  139. package/src/rules/requireFileOverview.js +3 -3
  140. package/src/rules/requireHyphenBeforeParamDescription.js +2 -5
  141. package/src/rules/requireJsdoc.js +14 -14
  142. package/src/rules/requireParam.js +9 -9
  143. package/src/rules/requireProperty.js +1 -1
  144. package/src/rules/requireReturns.js +1 -1
  145. package/src/rules/requireReturnsCheck.js +1 -1
  146. package/src/rules/requireReturnsDescription.js +1 -1
  147. package/src/rules/requireTemplate.js +59 -38
  148. package/src/rules/requireYields.js +3 -3
  149. package/src/rules/requireYieldsCheck.js +1 -1
  150. package/src/rules/sortTags.js +7 -7
  151. package/src/rules/tagLines.js +8 -8
  152. package/src/rules/textEscaping.js +2 -0
  153. package/src/rules/validTypes.js +29 -29
  154. package/src/tagNames.js +2 -2
  155. package/src/utils/hasReturnValue.js +298 -283
@@ -9,10 +9,10 @@ const trimStart = (string) => {
9
9
  };
10
10
 
11
11
  export default iterateJsdoc(({
12
- sourceCode,
12
+ indent,
13
13
  jsdocNode,
14
14
  report,
15
- indent,
15
+ sourceCode,
16
16
  }) => {
17
17
  // `indent` is whitespace from line 1 (`/**`), so slice and account for "/".
18
18
  const indentLevel = indent.length + 1;
@@ -1,5 +1,3 @@
1
- // Todo: When replace `CLIEngine` with `ESLint` when feature set complete per https://github.com/eslint/eslint/issues/14745
2
- // https://github.com/eslint/eslint/blob/master/docs/user-guide/migrating-to-7.0.0.md#-the-cliengine-class-has-been-deprecated
3
1
  import iterateJsdoc from '../iterateJsdoc.js';
4
2
  import eslint, {
5
3
  ESLint,
@@ -110,10 +108,10 @@ const getLinesCols = (text) => {
110
108
  };
111
109
 
112
110
  export default iterateJsdoc(({
113
- report,
114
- utils,
115
111
  context,
116
112
  globalState,
113
+ report,
114
+ utils,
117
115
  }) => {
118
116
  if (semver.gte(ESLint.version, '8.0.0')) {
119
117
  report(
@@ -143,21 +141,21 @@ export default iterateJsdoc(({
143
141
  rejectExampleCodeRegex = null,
144
142
  } = options;
145
143
  const {
144
+ allowInlineConfig = true,
145
+ baseConfig = {},
146
+ captionRequired = false,
146
147
  checkDefaults = false,
148
+ checkEslintrc = true,
147
149
  checkParams = false,
148
150
  checkProperties = false,
149
- noDefaultExampleRules = false,
150
- checkEslintrc = true,
151
+ configFile,
151
152
  matchingFileName = null,
152
153
  matchingFileNameDefaults = null,
153
154
  matchingFileNameParams = null,
154
155
  matchingFileNameProperties = null,
156
+ noDefaultExampleRules = false,
155
157
  paddedIndent = 0,
156
- baseConfig = {},
157
- configFile,
158
- allowInlineConfig = true,
159
158
  reportUnusedDisableDirectives = true,
160
- captionRequired = false,
161
159
  } = options;
162
160
 
163
161
  // Make this configurable?
@@ -201,18 +199,18 @@ export default iterateJsdoc(({
201
199
  * }} cfg
202
200
  */
203
201
  const checkSource = ({
204
- filename,
202
+ cols = 0,
205
203
  defaultFileName,
206
- rules = expressionRules,
204
+ filename,
207
205
  lines = 0,
208
- cols = 0,
206
+ rules = expressionRules,
209
207
  skipInit,
210
208
  source,
211
- targetTagName,
212
209
  sources = [],
213
210
  tag = {
214
211
  line: 0,
215
212
  },
213
+ targetTagName,
216
214
  }) => {
217
215
  if (!skipInit) {
218
216
  sources.push({
@@ -222,8 +220,6 @@ export default iterateJsdoc(({
222
220
  });
223
221
  }
224
222
 
225
- // Todo: Make fixable
226
-
227
223
  /**
228
224
  * @param {{
229
225
  * nonJSPrefacingCols: import('../iterateJsdoc.js').Integer,
@@ -305,11 +301,11 @@ export default iterateJsdoc(({
305
301
  const codeStartCol = likelyNestedJSDocIndentSpace;
306
302
 
307
303
  for (const {
308
- message,
309
- line,
310
304
  column,
311
- severity,
305
+ line,
306
+ message,
312
307
  ruleId,
308
+ severity,
313
309
  } of messages) {
314
310
  const startLine = codeStartLine + line + zeroBasedLineIndexAdjust;
315
311
  const startCol = codeStartCol + (
@@ -450,9 +446,9 @@ export default iterateJsdoc(({
450
446
  exampleCodeRegex.lastIndex = 0;
451
447
  while ((exampleCode = exampleCodeRegex.exec(source)) !== null) {
452
448
  const {
453
- index,
454
449
  '0': n0,
455
450
  '1': n1,
451
+ index,
456
452
  } = exampleCode;
457
453
 
458
454
  // Count anything preceding user regex match (can affect line numbering)
@@ -26,10 +26,10 @@ const maskCodeBlocks = (str) => {
26
26
  };
27
27
 
28
28
  export default iterateJsdoc(({
29
- sourceCode,
29
+ context,
30
30
  jsdocNode,
31
31
  report,
32
- context,
32
+ sourceCode,
33
33
  }) => {
34
34
  const options = context.options[0] || {};
35
35
  const /** @type {{excludeTags: string[]}} */ {
@@ -174,6 +174,7 @@ const checkNotAlignedPerTag = (utils, tag, customSpacings) => {
174
174
  */
175
175
  const checkAlignment = ({
176
176
  customSpacings,
177
+ disableWrapIndent,
177
178
  indent,
178
179
  jsdoc,
179
180
  jsdocNode,
@@ -182,16 +183,15 @@ const checkAlignment = ({
182
183
  tags,
183
184
  utils,
184
185
  wrapIndent,
185
- disableWrapIndent,
186
186
  }) => {
187
187
  const transform = commentFlow(
188
188
  alignTransform({
189
189
  customSpacings,
190
+ disableWrapIndent,
190
191
  indent,
191
192
  preserveMainDescriptionPostDelimiter,
192
193
  tags,
193
194
  wrapIndent,
194
- disableWrapIndent,
195
195
  }),
196
196
  );
197
197
  const transformedJsdoc = transform(jsdoc);
@@ -217,21 +217,21 @@ const checkAlignment = ({
217
217
  };
218
218
 
219
219
  export default iterateJsdoc(({
220
+ context,
220
221
  indent,
221
222
  jsdoc,
222
223
  jsdocNode,
223
224
  report,
224
- context,
225
225
  utils,
226
226
  }) => {
227
227
  const {
228
+ customSpacings,
229
+ disableWrapIndent = false,
230
+ preserveMainDescriptionPostDelimiter,
228
231
  tags: applicableTags = [
229
232
  'param', 'arg', 'argument', 'property', 'prop', 'returns', 'return',
230
233
  ],
231
- preserveMainDescriptionPostDelimiter,
232
- customSpacings,
233
234
  wrapIndent = '',
234
- disableWrapIndent = false,
235
235
  } = context.options[1] || {};
236
236
 
237
237
  if (context.options[0] === 'always') {
@@ -249,6 +249,7 @@ export default iterateJsdoc(({
249
249
 
250
250
  checkAlignment({
251
251
  customSpacings,
252
+ disableWrapIndent,
252
253
  indent,
253
254
  jsdoc,
254
255
  jsdocNode,
@@ -257,7 +258,6 @@ export default iterateJsdoc(({
257
258
  tags: applicableTags,
258
259
  utils,
259
260
  wrapIndent,
260
- disableWrapIndent,
261
261
  });
262
262
 
263
263
  return;
@@ -347,6 +347,9 @@ export default iterateJsdoc(({
347
347
  },
348
348
  },
349
349
  },
350
+ disableWrapIndent: {
351
+ type: 'boolean',
352
+ },
350
353
  preserveMainDescriptionPostDelimiter: {
351
354
  default: false,
352
355
  type: 'boolean',
@@ -360,9 +363,6 @@ export default iterateJsdoc(({
360
363
  wrapIndent: {
361
364
  type: 'string',
362
365
  },
363
- disableWrapIndent: {
364
- type: 'boolean',
365
- },
366
366
  },
367
367
  type: 'object',
368
368
  },
@@ -87,6 +87,7 @@ const validateParameterNames = (
87
87
 
88
88
  return true;
89
89
  }
90
+
90
91
  if (
91
92
  typeof functionParameterName === 'object' &&
92
93
  'name' in functionParameterName &&
@@ -98,6 +99,7 @@ const validateParameterNames = (
98
99
  thisOffset--;
99
100
  return false;
100
101
  }
102
+
101
103
  report(
102
104
  `Expected @${targetTagName} name to be "${expectedName}". Got "${actualName}".`,
103
105
  null,
@@ -118,10 +120,10 @@ const validateParameterNames = (
118
120
  const [
119
121
  parameterName,
120
122
  {
121
- names: properties,
123
+ annotationParamName,
122
124
  hasPropertyRest,
125
+ names: properties,
123
126
  rests,
124
- annotationParamName,
125
127
  },
126
128
  ] =
127
129
  /**
@@ -191,8 +193,8 @@ const validateParameterNames = (
191
193
  const hasMissing = missingProperties.length;
192
194
  if (hasMissing) {
193
195
  for (const {
194
- tagPlacement,
195
196
  name: missingProperty,
197
+ tagPlacement,
196
198
  } of missingProperties) {
197
199
  report(`Missing @${targetTagName} "${missingProperty}"`, null, tagPlacement);
198
200
  }
@@ -271,8 +273,14 @@ const validateParameterNames = (
271
273
  // When disableMissingParamChecks is true tag names can be omitted.
272
274
  // Report when the tag names do not match the expected names or they are used out of order.
273
275
  if (disableMissingParamChecks) {
274
- const usedExpectedNames = expectedNames.map(a => a?.toString()).filter(expectedName => expectedName && actualNames.includes(expectedName));
275
- const usedInOrder = actualNames.every((actualName, idx) => actualName === usedExpectedNames[idx]);
276
+ const usedExpectedNames = expectedNames.map((a) => {
277
+ return a?.toString();
278
+ }).filter((expectedName) => {
279
+ return expectedName && actualNames.includes(expectedName);
280
+ });
281
+ const usedInOrder = actualNames.every((actualName, idx) => {
282
+ return actualName === usedExpectedNames[idx];
283
+ });
276
284
  if (usedInOrder) {
277
285
  return false;
278
286
  }
@@ -283,9 +291,9 @@ const validateParameterNames = (
283
291
  expectedNames.map((expectedName) => {
284
292
  return typeof expectedName === 'object' &&
285
293
  'name' in expectedName &&
286
- expectedName.restElement
287
- ? '...' + expectedName.name
288
- : expectedName;
294
+ expectedName.restElement ?
295
+ '...' + expectedName.name :
296
+ expectedName;
289
297
  }).join(', ')
290
298
  }". Got "${actualNames.join(', ')}".`,
291
299
  null,
@@ -318,8 +326,8 @@ const validateParameterNamesDeep = (
318
326
  let lastRealParameter;
319
327
 
320
328
  return jsdocParameterNames.some(({
321
- name: jsdocParameterName,
322
329
  idx,
330
+ name: jsdocParameterName,
323
331
  }) => {
324
332
  const isPropertyPath = jsdocParameterName.includes('.');
325
333
 
@@ -356,26 +364,26 @@ const validateParameterNamesDeep = (
356
364
 
357
365
  const allowedNodes = [
358
366
  'ArrowFunctionExpression', 'FunctionDeclaration', 'FunctionExpression', 'TSDeclareFunction',
359
- // Add this to above defaults
360
- 'TSMethodSignature'
367
+ // Add this to above defaults
368
+ 'TSMethodSignature',
361
369
  ];
362
370
 
363
371
  export default iterateJsdoc(({
364
372
  context,
365
373
  jsdoc,
374
+ node,
366
375
  report,
367
376
  utils,
368
- node,
369
377
  }) => {
370
378
  const {
371
379
  allowExtraTrailingParamDocs,
372
380
  checkDestructured = true,
373
381
  checkRestProperty = false,
374
382
  checkTypesPattern = '/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/',
375
- enableFixer = false,
376
- useDefaultObjectProperties = false,
377
383
  disableExtraPropertyReporting = false,
378
384
  disableMissingParamChecks = false,
385
+ enableFixer = false,
386
+ useDefaultObjectProperties = false,
379
387
  } = context.options[0] || {};
380
388
 
381
389
  // Although we might just remove global settings contexts from applying to
@@ -61,8 +61,8 @@ const validatePropertyNamesDeep = (
61
61
  let lastRealProperty;
62
62
 
63
63
  return jsdocPropertyNames.some(({
64
- name: jsdocPropertyName,
65
64
  idx,
65
+ name: jsdocPropertyName,
66
66
  }) => {
67
67
  const isPropertyPath = jsdocPropertyName.includes('.');
68
68
 
@@ -61,14 +61,14 @@ const typedTagsUnnecessaryOutsideDeclare = new Set([
61
61
  ]);
62
62
 
63
63
  export default iterateJsdoc(({
64
- sourceCode,
65
- jsdoc,
66
- report,
67
- utils,
68
64
  context,
65
+ jsdoc,
66
+ jsdocNode,
69
67
  node,
68
+ report,
70
69
  settings,
71
- jsdocNode,
70
+ sourceCode,
71
+ utils,
72
72
  }) => {
73
73
  const
74
74
  /**
@@ -87,8 +87,8 @@ export default iterateJsdoc(({
87
87
  /** @type {(string|undefined)[]} */
88
88
  let definedPreferredTags = [];
89
89
  const {
90
- tagNamePreference,
91
90
  structuredTags,
91
+ tagNamePreference,
92
92
  } = settings;
93
93
  const definedStructuredTags = Object.keys(structuredTags);
94
94
  const definedNonPreferredTags = Object.keys(tagNamePreference);
@@ -146,7 +146,7 @@ export default iterateJsdoc(({
146
146
  }
147
147
 
148
148
  if (context.getFilename().endsWith('.d.ts') && [
149
- 'Program', null, undefined,
149
+ null, 'Program', undefined,
150
150
  ].includes(node?.parent?.type)) {
151
151
  return false;
152
152
  }
@@ -1,19 +1,18 @@
1
+ import iterateJsdoc from '../iterateJsdoc.js';
1
2
  import {
2
3
  parse as parseType,
3
4
  traverse,
4
5
  tryParse as tryParseType,
5
6
  } from '@es-joy/jsdoccomment';
6
- import iterateJsdoc from '../iterateJsdoc.js';
7
7
 
8
8
  export default iterateJsdoc(({
9
- context,
10
- utils,
11
9
  node,
12
- settings,
13
10
  report,
11
+ settings,
12
+ utils,
14
13
  }) => {
15
14
  const {
16
- mode
15
+ mode,
17
16
  } = settings;
18
17
 
19
18
  const templateTags = utils.getTags('template');
@@ -63,11 +62,13 @@ export default iterateJsdoc(({
63
62
 
64
63
  const checkTemplateTags = () => {
65
64
  for (const tag of templateTags) {
66
- const {name} = tag;
67
- const names = name.split(/,\s*/);
68
- for (const name of names) {
69
- if (!usedNames.has(name)) {
70
- report(`@template ${name} not in use`, null, tag);
65
+ const {
66
+ name,
67
+ } = tag;
68
+ const names = name.split(/,\s*/u);
69
+ for (const nme of names) {
70
+ if (!usedNames.has(nme)) {
71
+ report(`@template ${nme} not in use`, null, tag);
71
72
  }
72
73
  }
73
74
  }
@@ -82,10 +83,19 @@ export default iterateJsdoc(({
82
83
  */
83
84
  const checkParameters = (aliasDeclaration, checkParamsAndReturns) => {
84
85
  /* c8 ignore next -- Guard */
85
- const {params} = aliasDeclaration.typeParameters ?? {params: []};
86
- for (const {name: {name}} of params) {
86
+ const {
87
+ params,
88
+ } = aliasDeclaration.typeParameters ?? {
89
+ params: [],
90
+ };
91
+ for (const {
92
+ name: {
93
+ name,
94
+ },
95
+ } of params) {
87
96
  usedNames.add(name);
88
97
  }
98
+
89
99
  if (checkParamsAndReturns) {
90
100
  checkParamsAndReturnsTags();
91
101
  }
@@ -100,28 +110,30 @@ export default iterateJsdoc(({
100
110
  if (!nde) {
101
111
  return;
102
112
  }
113
+
103
114
  switch (nde.type) {
104
- case 'ExportDefaultDeclaration':
105
- case 'ExportNamedDeclaration':
106
- switch (nde.declaration?.type) {
107
- case 'FunctionDeclaration':
108
- checkParameters(nde.declaration, true);
109
- break;
110
- case 'ClassDeclaration':
111
- case 'TSTypeAliasDeclaration':
112
- case 'TSInterfaceDeclaration':
113
- checkParameters(nde.declaration);
114
- break;
115
- }
116
- break;
117
- case 'FunctionDeclaration':
118
- checkParameters(nde, true);
119
- break;
120
- case 'ClassDeclaration':
121
- case 'TSTypeAliasDeclaration':
122
- case 'TSInterfaceDeclaration':
123
- checkParameters(nde);
124
- break;
115
+ case 'ClassDeclaration':
116
+ case 'TSInterfaceDeclaration':
117
+ case 'TSTypeAliasDeclaration':
118
+ checkParameters(nde);
119
+ break;
120
+ case 'ExportDefaultDeclaration':
121
+ case 'ExportNamedDeclaration':
122
+ switch (nde.declaration?.type) {
123
+ case 'ClassDeclaration':
124
+ case 'TSInterfaceDeclaration':
125
+ case 'TSTypeAliasDeclaration':
126
+ checkParameters(nde.declaration);
127
+ break;
128
+ case 'FunctionDeclaration':
129
+ checkParameters(nde.declaration, true);
130
+ break;
131
+ }
132
+
133
+ break;
134
+ case 'FunctionDeclaration':
135
+ checkParameters(nde, true);
136
+ break;
125
137
  }
126
138
  };
127
139
 
@@ -151,11 +163,13 @@ export default iterateJsdoc(({
151
163
  }
152
164
 
153
165
  for (const tag of templateTags) {
154
- const {name} = tag;
155
- const names = name.split(/,\s*/);
156
- for (const name of names) {
157
- if (!usedNames.has(name)) {
158
- report(`@template ${name} not in use`, null, tag);
166
+ const {
167
+ name,
168
+ } = tag;
169
+ const names = name.split(/,\s*/u);
170
+ for (const nme of names) {
171
+ if (!usedNames.has(nme)) {
172
+ report(`@template ${nme} not in use`, null, tag);
159
173
  }
160
174
  }
161
175
  }
@@ -89,12 +89,12 @@ const getMessage = (upperCase) => {
89
89
  };
90
90
 
91
91
  export default iterateJsdoc(({
92
+ context,
92
93
  jsdocNode,
93
- sourceCode,
94
94
  report,
95
- utils,
96
95
  settings,
97
- context,
96
+ sourceCode,
97
+ utils,
98
98
  }) => {
99
99
  const jsdocTagsWithPossibleType = utils.filterTags((tag) => {
100
100
  return Boolean(utils.tagMightHaveTypePosition(tag.tag));
@@ -109,9 +109,9 @@ export default iterateJsdoc(({
109
109
  * }}
110
110
  */
111
111
  {
112
+ mode,
112
113
  preferredTypes: preferredTypesOriginal,
113
114
  structuredTags,
114
- mode,
115
115
  } = settings;
116
116
 
117
117
  const injectObjectPreferredTypes = !('Object' in preferredTypesOriginal ||
@@ -177,9 +177,9 @@ export default iterateJsdoc(({
177
177
  * })[]
178
178
  * }}
179
179
  */ {
180
+ exemptTagContexts = [],
180
181
  noDefaults,
181
182
  unifyParentAndChildTypeChecks,
182
- exemptTagContexts = [],
183
183
  } = context.options[0] || {};
184
184
 
185
185
  /**
@@ -415,8 +415,8 @@ export default iterateJsdoc(({
415
415
  }
416
416
 
417
417
  const {
418
- tag: tagName,
419
418
  name: nameInTag,
419
+ tag: tagName,
420
420
  } = jsdocTag;
421
421
 
422
422
  traverse(typeAst, (node, parentNode, property) => {
@@ -428,7 +428,7 @@ export default iterateJsdoc(({
428
428
  * @type {import('jsdoc-type-pratt-parser').NameResult}
429
429
  */ (node);
430
430
  if (![
431
- 'JsdocTypeName', 'JsdocTypeAny',
431
+ 'JsdocTypeAny', 'JsdocTypeName',
432
432
  ].includes(type)) {
433
433
  return;
434
434
  }
@@ -1,12 +1,9 @@
1
- import { dirname, join } from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
-
1
+ import iterateJsdoc from '../iterateJsdoc.js';
2
+ import {
3
+ parseImportsExports,
4
+ } from 'parse-imports-exports';
4
5
  import semver from 'semver';
5
6
  import spdxExpressionParse from 'spdx-expression-parse';
6
- import {parseImportsExports} from 'parse-imports-exports';
7
- import iterateJsdoc from '../iterateJsdoc.js';
8
-
9
- const __dirname = dirname(fileURLToPath(import.meta.url));
10
7
 
11
8
  const allowedKinds = new Set([
12
9
  'class',
@@ -23,17 +20,17 @@ const allowedKinds = new Set([
23
20
  ]);
24
21
 
25
22
  export default iterateJsdoc(({
26
- utils,
27
- report,
28
23
  context,
24
+ report,
29
25
  settings,
26
+ utils,
30
27
  }) => {
31
28
  const options = context.options[0] || {};
32
29
  const {
33
- allowedLicenses = null,
34
30
  allowedAuthors = null,
35
- numericOnlyVariation = false,
31
+ allowedLicenses = null,
36
32
  licensePattern = '/([^\n\r]*)/gu',
33
+ numericOnlyVariation = false,
37
34
  } = options;
38
35
 
39
36
  utils.forEachPreferredTag('version', (jsdocParameter, targetTagName) => {
@@ -167,18 +164,20 @@ export default iterateJsdoc(({
167
164
  if (settings.mode === 'typescript') {
168
165
  utils.forEachPreferredTag('import', (tag) => {
169
166
  const {
170
- type, name, description
167
+ description,
168
+ name,
169
+ type,
171
170
  } = tag;
172
- const typePart = type ? `{${type}} `: '';
173
- const imprt = 'import ' + (description
174
- ? `${typePart}${name} ${description}`
175
- : `${typePart}${name}`);
171
+ const typePart = type ? `{${type}} ` : '';
172
+ const imprt = 'import ' + (description ?
173
+ `${typePart}${name} ${description}` :
174
+ `${typePart}${name}`);
176
175
 
177
176
  const importsExports = parseImportsExports(imprt.trim());
178
177
 
179
178
  if (importsExports.errors) {
180
179
  report(
181
- `Bad @import tag`,
180
+ 'Bad @import tag',
182
181
  null,
183
182
  tag,
184
183
  );