@depup/eslint-plugin-jsdoc 62.8.0-depup.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 (430) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +33 -0
  3. package/changes.json +18 -0
  4. package/dist/WarnSettings.cjs +38 -0
  5. package/dist/WarnSettings.cjs.map +1 -0
  6. package/dist/WarnSettings.d.ts +17 -0
  7. package/dist/alignTransform.cjs +402 -0
  8. package/dist/alignTransform.cjs.map +1 -0
  9. package/dist/alignTransform.d.ts +34 -0
  10. package/dist/buildForbidRuleDefinition.cjs +101 -0
  11. package/dist/buildForbidRuleDefinition.cjs.map +1 -0
  12. package/dist/buildForbidRuleDefinition.d.ts +15 -0
  13. package/dist/buildRejectOrPreferRuleDefinition.cjs +352 -0
  14. package/dist/buildRejectOrPreferRuleDefinition.cjs.map +1 -0
  15. package/dist/buildRejectOrPreferRuleDefinition.d.ts +9 -0
  16. package/dist/cjs/WarnSettings.d.ts +16 -0
  17. package/dist/cjs/alignTransform.d.ts +33 -0
  18. package/dist/cjs/buildForbidRuleDefinition.d.ts +14 -0
  19. package/dist/cjs/buildRejectOrPreferRuleDefinition.d.ts +8 -0
  20. package/dist/cjs/defaultTagOrder.d.ts +4 -0
  21. package/dist/cjs/exportParser.d.ts +40 -0
  22. package/dist/cjs/getDefaultTagStructureForMode.d.ts +10 -0
  23. package/dist/cjs/getJsdocProcessorPlugin.d.cts +5 -0
  24. package/dist/cjs/getJsdocProcessorPlugin.d.ts +66 -0
  25. package/dist/cjs/index-cjs.d.ts +23 -0
  26. package/dist/cjs/index.cjs.d.cts +2 -0
  27. package/dist/cjs/iterateJsdoc.d.cts +7 -0
  28. package/dist/cjs/iterateJsdoc.d.ts +495 -0
  29. package/dist/cjs/jsdocUtils.d.ts +493 -0
  30. package/dist/cjs/rules/checkAccess.d.ts +2 -0
  31. package/dist/cjs/rules/checkAlignment.d.ts +2 -0
  32. package/dist/cjs/rules/checkExamples.d.ts +3 -0
  33. package/dist/cjs/rules/checkIndentation.d.ts +2 -0
  34. package/dist/cjs/rules/checkLineAlignment.d.ts +9 -0
  35. package/dist/cjs/rules/checkParamNames.d.ts +2 -0
  36. package/dist/cjs/rules/checkPropertyNames.d.ts +2 -0
  37. package/dist/cjs/rules/checkSyntax.d.ts +2 -0
  38. package/dist/cjs/rules/checkTagNames.d.ts +2 -0
  39. package/dist/cjs/rules/checkTemplateNames.d.ts +2 -0
  40. package/dist/cjs/rules/checkTypes.d.ts +7 -0
  41. package/dist/cjs/rules/checkValues.d.ts +2 -0
  42. package/dist/cjs/rules/convertToJsdocComments.d.ts +266 -0
  43. package/dist/cjs/rules/emptyTags.d.ts +2 -0
  44. package/dist/cjs/rules/escapeInlineTags.d.ts +2 -0
  45. package/dist/cjs/rules/implementsOnClasses.d.ts +2 -0
  46. package/dist/cjs/rules/importsAsDependencies.d.ts +2 -0
  47. package/dist/cjs/rules/informativeDocs.d.ts +2 -0
  48. package/dist/cjs/rules/linesBeforeBlock.d.ts +2 -0
  49. package/dist/cjs/rules/matchDescription.d.ts +2 -0
  50. package/dist/cjs/rules/matchName.d.ts +2 -0
  51. package/dist/cjs/rules/multilineBlocks.d.ts +2 -0
  52. package/dist/cjs/rules/noBadBlocks.d.ts +2 -0
  53. package/dist/cjs/rules/noBlankBlockDescriptions.d.ts +2 -0
  54. package/dist/cjs/rules/noBlankBlocks.d.ts +2 -0
  55. package/dist/cjs/rules/noDefaults.d.ts +2 -0
  56. package/dist/cjs/rules/noMissingSyntax.d.ts +9 -0
  57. package/dist/cjs/rules/noMultiAsterisks.d.ts +2 -0
  58. package/dist/cjs/rules/noRestrictedSyntax.d.ts +2 -0
  59. package/dist/cjs/rules/noTypes.d.ts +2 -0
  60. package/dist/cjs/rules/noUndefinedTypes.d.ts +2 -0
  61. package/dist/cjs/rules/preferImportTag.d.ts +2 -0
  62. package/dist/cjs/rules/requireAsteriskPrefix.d.ts +2 -0
  63. package/dist/cjs/rules/requireDescription.d.ts +2 -0
  64. package/dist/cjs/rules/requireDescriptionCompleteSentence.d.ts +2 -0
  65. package/dist/cjs/rules/requireExample.d.ts +2 -0
  66. package/dist/cjs/rules/requireFileOverview.d.ts +2 -0
  67. package/dist/cjs/rules/requireHyphenBeforeParamDescription.d.ts +2 -0
  68. package/dist/cjs/rules/requireJsdoc.d.ts +24 -0
  69. package/dist/cjs/rules/requireParam.d.ts +3 -0
  70. package/dist/cjs/rules/requireParamDescription.d.ts +2 -0
  71. package/dist/cjs/rules/requireParamName.d.ts +2 -0
  72. package/dist/cjs/rules/requireParamType.d.ts +2 -0
  73. package/dist/cjs/rules/requireProperty.d.ts +2 -0
  74. package/dist/cjs/rules/requirePropertyDescription.d.ts +2 -0
  75. package/dist/cjs/rules/requirePropertyName.d.ts +2 -0
  76. package/dist/cjs/rules/requirePropertyType.d.ts +2 -0
  77. package/dist/cjs/rules/requireRejects.d.ts +2 -0
  78. package/dist/cjs/rules/requireReturns.d.ts +2 -0
  79. package/dist/cjs/rules/requireReturnsCheck.d.ts +2 -0
  80. package/dist/cjs/rules/requireReturnsDescription.d.ts +2 -0
  81. package/dist/cjs/rules/requireReturnsType.d.ts +2 -0
  82. package/dist/cjs/rules/requireTags.d.ts +2 -0
  83. package/dist/cjs/rules/requireTemplate.d.ts +2 -0
  84. package/dist/cjs/rules/requireThrows.d.ts +2 -0
  85. package/dist/cjs/rules/requireYields.d.ts +2 -0
  86. package/dist/cjs/rules/requireYieldsCheck.d.ts +2 -0
  87. package/dist/cjs/rules/sortTags.d.ts +2 -0
  88. package/dist/cjs/rules/tagLines.d.ts +2 -0
  89. package/dist/cjs/rules/textEscaping.d.ts +2 -0
  90. package/dist/cjs/rules/tsMethodSignatureStyle.d.ts +2 -0
  91. package/dist/cjs/rules/tsNoEmptyObjectType.d.ts +2 -0
  92. package/dist/cjs/rules/tsNoUnnecessaryTemplateExpression.d.ts +2 -0
  93. package/dist/cjs/rules/tsPreferFunctionType.d.ts +2 -0
  94. package/dist/cjs/rules/typeFormatting.d.ts +2 -0
  95. package/dist/cjs/rules/validTypes.d.ts +2 -0
  96. package/dist/cjs/tagNames.d.ts +15 -0
  97. package/dist/cjs/utils/hasReturnValue.d.ts +19 -0
  98. package/dist/defaultTagOrder.cjs +46 -0
  99. package/dist/defaultTagOrder.cjs.map +1 -0
  100. package/dist/defaultTagOrder.d.ts +5 -0
  101. package/dist/exportParser.cjs +732 -0
  102. package/dist/exportParser.cjs.map +1 -0
  103. package/dist/exportParser.d.ts +41 -0
  104. package/dist/generateDocs.cjs +342 -0
  105. package/dist/generateDocs.cjs.map +1 -0
  106. package/dist/generateOptions.cjs +62 -0
  107. package/dist/generateOptions.cjs.map +1 -0
  108. package/dist/generateRule.cjs +248 -0
  109. package/dist/generateRule.cjs.map +1 -0
  110. package/dist/generateRuleTypes.cjs +24 -0
  111. package/dist/generateRuleTypes.cjs.map +1 -0
  112. package/dist/getDefaultTagStructureForMode.cjs +289 -0
  113. package/dist/getDefaultTagStructureForMode.cjs.map +1 -0
  114. package/dist/getDefaultTagStructureForMode.d.ts +11 -0
  115. package/dist/getJsdocProcessorPlugin.cjs +587 -0
  116. package/dist/getJsdocProcessorPlugin.cjs.map +1 -0
  117. package/dist/getJsdocProcessorPlugin.cts +5 -0
  118. package/dist/getJsdocProcessorPlugin.d.ts +67 -0
  119. package/dist/index-cjs.cjs +595 -0
  120. package/dist/index-cjs.cjs.map +1 -0
  121. package/dist/index-cjs.d.ts +24 -0
  122. package/dist/index-esm.cjs +162 -0
  123. package/dist/index-esm.cjs.map +1 -0
  124. package/dist/index-esm.d.ts +72 -0
  125. package/dist/index.cjs +743 -0
  126. package/dist/index.cjs.cts +3 -0
  127. package/dist/index.cjs.map +1 -0
  128. package/dist/index.d.ts +93 -0
  129. package/dist/iterateJsdoc.cjs +2150 -0
  130. package/dist/iterateJsdoc.cjs.map +1 -0
  131. package/dist/iterateJsdoc.cts +7 -0
  132. package/dist/iterateJsdoc.d.ts +496 -0
  133. package/dist/jsdocUtils.cjs +1725 -0
  134. package/dist/jsdocUtils.cjs.map +1 -0
  135. package/dist/jsdocUtils.d.ts +494 -0
  136. package/dist/rules/checkAccess.cjs +40 -0
  137. package/dist/rules/checkAccess.cjs.map +1 -0
  138. package/dist/rules/checkAccess.d.ts +3 -0
  139. package/dist/rules/checkAlignment.cjs +78 -0
  140. package/dist/rules/checkAlignment.cjs.map +1 -0
  141. package/dist/rules/checkAlignment.d.ts +3 -0
  142. package/dist/rules/checkExamples.cjs +521 -0
  143. package/dist/rules/checkExamples.cjs.map +1 -0
  144. package/dist/rules/checkExamples.d.ts +4 -0
  145. package/dist/rules/checkIndentation.cjs +170 -0
  146. package/dist/rules/checkIndentation.cjs.map +1 -0
  147. package/dist/rules/checkIndentation.d.ts +3 -0
  148. package/dist/rules/checkLineAlignment.cjs +398 -0
  149. package/dist/rules/checkLineAlignment.cjs.map +1 -0
  150. package/dist/rules/checkLineAlignment.d.ts +10 -0
  151. package/dist/rules/checkParamNames.cjs +407 -0
  152. package/dist/rules/checkParamNames.cjs.map +1 -0
  153. package/dist/rules/checkParamNames.d.ts +3 -0
  154. package/dist/rules/checkPropertyNames.cjs +135 -0
  155. package/dist/rules/checkPropertyNames.cjs.map +1 -0
  156. package/dist/rules/checkPropertyNames.d.ts +3 -0
  157. package/dist/rules/checkSyntax.cjs +38 -0
  158. package/dist/rules/checkSyntax.cjs.map +1 -0
  159. package/dist/rules/checkSyntax.d.ts +3 -0
  160. package/dist/rules/checkTagNames.cjs +312 -0
  161. package/dist/rules/checkTagNames.cjs.map +1 -0
  162. package/dist/rules/checkTagNames.d.ts +3 -0
  163. package/dist/rules/checkTemplateNames.cjs +185 -0
  164. package/dist/rules/checkTemplateNames.cjs.map +1 -0
  165. package/dist/rules/checkTemplateNames.d.ts +3 -0
  166. package/dist/rules/checkTypes.cjs +111 -0
  167. package/dist/rules/checkTypes.cjs.map +1 -0
  168. package/dist/rules/checkTypes.d.ts +8 -0
  169. package/dist/rules/checkValues.cjs +166 -0
  170. package/dist/rules/checkValues.cjs.map +1 -0
  171. package/dist/rules/checkValues.d.ts +3 -0
  172. package/dist/rules/convertToJsdocComments.cjs +356 -0
  173. package/dist/rules/convertToJsdocComments.cjs.map +1 -0
  174. package/dist/rules/convertToJsdocComments.d.ts +267 -0
  175. package/dist/rules/emptyTags.cjs +85 -0
  176. package/dist/rules/emptyTags.cjs.map +1 -0
  177. package/dist/rules/emptyTags.d.ts +3 -0
  178. package/dist/rules/escapeInlineTags.cjs +149 -0
  179. package/dist/rules/escapeInlineTags.cjs.map +1 -0
  180. package/dist/rules/escapeInlineTags.d.ts +3 -0
  181. package/dist/rules/implementsOnClasses.cjs +74 -0
  182. package/dist/rules/implementsOnClasses.cjs.map +1 -0
  183. package/dist/rules/implementsOnClasses.d.ts +3 -0
  184. package/dist/rules/importsAsDependencies.cjs +104 -0
  185. package/dist/rules/importsAsDependencies.cjs.map +1 -0
  186. package/dist/rules/importsAsDependencies.d.ts +3 -0
  187. package/dist/rules/informativeDocs.cjs +187 -0
  188. package/dist/rules/informativeDocs.cjs.map +1 -0
  189. package/dist/rules/informativeDocs.d.ts +3 -0
  190. package/dist/rules/linesBeforeBlock.cjs +120 -0
  191. package/dist/rules/linesBeforeBlock.cjs.map +1 -0
  192. package/dist/rules/linesBeforeBlock.d.ts +3 -0
  193. package/dist/rules/matchDescription.cjs +356 -0
  194. package/dist/rules/matchDescription.cjs.map +1 -0
  195. package/dist/rules/matchDescription.d.ts +3 -0
  196. package/dist/rules/matchName.cjs +160 -0
  197. package/dist/rules/matchName.cjs.map +1 -0
  198. package/dist/rules/matchName.d.ts +3 -0
  199. package/dist/rules/multilineBlocks.cjs +431 -0
  200. package/dist/rules/multilineBlocks.cjs.map +1 -0
  201. package/dist/rules/multilineBlocks.d.ts +3 -0
  202. package/dist/rules/noBadBlocks.cjs +100 -0
  203. package/dist/rules/noBadBlocks.cjs.map +1 -0
  204. package/dist/rules/noBadBlocks.d.ts +3 -0
  205. package/dist/rules/noBlankBlockDescriptions.cjs +63 -0
  206. package/dist/rules/noBlankBlockDescriptions.cjs.map +1 -0
  207. package/dist/rules/noBlankBlockDescriptions.d.ts +3 -0
  208. package/dist/rules/noBlankBlocks.cjs +54 -0
  209. package/dist/rules/noBlankBlocks.cjs.map +1 -0
  210. package/dist/rules/noBlankBlocks.d.ts +3 -0
  211. package/dist/rules/noDefaults.cjs +102 -0
  212. package/dist/rules/noDefaults.cjs.map +1 -0
  213. package/dist/rules/noDefaults.d.ts +3 -0
  214. package/dist/rules/noMissingSyntax.cjs +196 -0
  215. package/dist/rules/noMissingSyntax.cjs.map +1 -0
  216. package/dist/rules/noMissingSyntax.d.ts +10 -0
  217. package/dist/rules/noMultiAsterisks.cjs +126 -0
  218. package/dist/rules/noMultiAsterisks.cjs.map +1 -0
  219. package/dist/rules/noMultiAsterisks.d.ts +3 -0
  220. package/dist/rules/noRestrictedSyntax.cjs +68 -0
  221. package/dist/rules/noRestrictedSyntax.cjs.map +1 -0
  222. package/dist/rules/noRestrictedSyntax.d.ts +3 -0
  223. package/dist/rules/noTypes.cjs +101 -0
  224. package/dist/rules/noTypes.cjs.map +1 -0
  225. package/dist/rules/noTypes.d.ts +3 -0
  226. package/dist/rules/noUndefinedTypes.cjs +588 -0
  227. package/dist/rules/noUndefinedTypes.cjs.map +1 -0
  228. package/dist/rules/noUndefinedTypes.d.ts +3 -0
  229. package/dist/rules/preferImportTag.cjs +362 -0
  230. package/dist/rules/preferImportTag.cjs.map +1 -0
  231. package/dist/rules/preferImportTag.d.ts +3 -0
  232. package/dist/rules/requireAsteriskPrefix.cjs +190 -0
  233. package/dist/rules/requireAsteriskPrefix.cjs.map +1 -0
  234. package/dist/rules/requireAsteriskPrefix.d.ts +3 -0
  235. package/dist/rules/requireDescription.cjs +164 -0
  236. package/dist/rules/requireDescription.cjs.map +1 -0
  237. package/dist/rules/requireDescription.d.ts +3 -0
  238. package/dist/rules/requireDescriptionCompleteSentence.cjs +321 -0
  239. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -0
  240. package/dist/rules/requireDescriptionCompleteSentence.d.ts +3 -0
  241. package/dist/rules/requireExample.cjs +133 -0
  242. package/dist/rules/requireExample.cjs.map +1 -0
  243. package/dist/rules/requireExample.d.ts +3 -0
  244. package/dist/rules/requireFileOverview.cjs +194 -0
  245. package/dist/rules/requireFileOverview.cjs.map +1 -0
  246. package/dist/rules/requireFileOverview.d.ts +3 -0
  247. package/dist/rules/requireHyphenBeforeParamDescription.cjs +166 -0
  248. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -0
  249. package/dist/rules/requireHyphenBeforeParamDescription.d.ts +3 -0
  250. package/dist/rules/requireJsdoc.cjs +722 -0
  251. package/dist/rules/requireJsdoc.cjs.map +1 -0
  252. package/dist/rules/requireJsdoc.d.ts +25 -0
  253. package/dist/rules/requireParam.cjs +772 -0
  254. package/dist/rules/requireParam.cjs.map +1 -0
  255. package/dist/rules/requireParam.d.ts +4 -0
  256. package/dist/rules/requireParamDescription.cjs +105 -0
  257. package/dist/rules/requireParamDescription.cjs.map +1 -0
  258. package/dist/rules/requireParamDescription.d.ts +3 -0
  259. package/dist/rules/requireParamName.cjs +68 -0
  260. package/dist/rules/requireParamName.cjs.map +1 -0
  261. package/dist/rules/requireParamName.d.ts +3 -0
  262. package/dist/rules/requireParamType.cjs +104 -0
  263. package/dist/rules/requireParamType.cjs.map +1 -0
  264. package/dist/rules/requireParamType.d.ts +3 -0
  265. package/dist/rules/requireProperty.cjs +63 -0
  266. package/dist/rules/requireProperty.cjs.map +1 -0
  267. package/dist/rules/requireProperty.d.ts +3 -0
  268. package/dist/rules/requirePropertyDescription.cjs +29 -0
  269. package/dist/rules/requirePropertyDescription.cjs.map +1 -0
  270. package/dist/rules/requirePropertyDescription.d.ts +3 -0
  271. package/dist/rules/requirePropertyName.cjs +29 -0
  272. package/dist/rules/requirePropertyName.cjs.map +1 -0
  273. package/dist/rules/requirePropertyName.d.ts +3 -0
  274. package/dist/rules/requirePropertyType.cjs +29 -0
  275. package/dist/rules/requirePropertyType.cjs.map +1 -0
  276. package/dist/rules/requirePropertyType.d.ts +3 -0
  277. package/dist/rules/requireRejects.cjs +226 -0
  278. package/dist/rules/requireRejects.cjs.map +1 -0
  279. package/dist/rules/requireRejects.d.ts +3 -0
  280. package/dist/rules/requireReturns.cjs +262 -0
  281. package/dist/rules/requireReturns.cjs.map +1 -0
  282. package/dist/rules/requireReturns.d.ts +3 -0
  283. package/dist/rules/requireReturnsCheck.cjs +140 -0
  284. package/dist/rules/requireReturnsCheck.cjs.map +1 -0
  285. package/dist/rules/requireReturnsCheck.d.ts +3 -0
  286. package/dist/rules/requireReturnsDescription.cjs +72 -0
  287. package/dist/rules/requireReturnsDescription.cjs.map +1 -0
  288. package/dist/rules/requireReturnsDescription.d.ts +3 -0
  289. package/dist/rules/requireReturnsType.cjs +68 -0
  290. package/dist/rules/requireReturnsType.cjs.map +1 -0
  291. package/dist/rules/requireReturnsType.d.ts +3 -0
  292. package/dist/rules/requireTags.cjs +74 -0
  293. package/dist/rules/requireTags.cjs.map +1 -0
  294. package/dist/rules/requireTags.d.ts +3 -0
  295. package/dist/rules/requireTemplate.cjs +220 -0
  296. package/dist/rules/requireTemplate.cjs.map +1 -0
  297. package/dist/rules/requireTemplate.d.ts +3 -0
  298. package/dist/rules/requireThrows.cjs +118 -0
  299. package/dist/rules/requireThrows.cjs.map +1 -0
  300. package/dist/rules/requireThrows.d.ts +3 -0
  301. package/dist/rules/requireYields.cjs +224 -0
  302. package/dist/rules/requireYields.cjs.map +1 -0
  303. package/dist/rules/requireYields.d.ts +3 -0
  304. package/dist/rules/requireYieldsCheck.cjs +179 -0
  305. package/dist/rules/requireYieldsCheck.cjs.map +1 -0
  306. package/dist/rules/requireYieldsCheck.d.ts +3 -0
  307. package/dist/rules/sortTags.cjs +656 -0
  308. package/dist/rules/sortTags.cjs.map +1 -0
  309. package/dist/rules/sortTags.d.ts +3 -0
  310. package/dist/rules/tagLines.cjs +374 -0
  311. package/dist/rules/tagLines.cjs.map +1 -0
  312. package/dist/rules/tagLines.d.ts +3 -0
  313. package/dist/rules/textEscaping.cjs +141 -0
  314. package/dist/rules/textEscaping.cjs.map +1 -0
  315. package/dist/rules/textEscaping.d.ts +3 -0
  316. package/dist/rules/tsMethodSignatureStyle.cjs +240 -0
  317. package/dist/rules/tsMethodSignatureStyle.cjs.map +1 -0
  318. package/dist/rules/tsMethodSignatureStyle.d.ts +3 -0
  319. package/dist/rules/tsNoEmptyObjectType.cjs +62 -0
  320. package/dist/rules/tsNoEmptyObjectType.cjs.map +1 -0
  321. package/dist/rules/tsNoEmptyObjectType.d.ts +3 -0
  322. package/dist/rules/tsNoUnnecessaryTemplateExpression.cjs +104 -0
  323. package/dist/rules/tsNoUnnecessaryTemplateExpression.cjs.map +1 -0
  324. package/dist/rules/tsNoUnnecessaryTemplateExpression.d.ts +3 -0
  325. package/dist/rules/tsPreferFunctionType.cjs +110 -0
  326. package/dist/rules/tsPreferFunctionType.cjs.map +1 -0
  327. package/dist/rules/tsPreferFunctionType.d.ts +3 -0
  328. package/dist/rules/typeFormatting.cjs +607 -0
  329. package/dist/rules/typeFormatting.cjs.map +1 -0
  330. package/dist/rules/typeFormatting.d.ts +3 -0
  331. package/dist/rules/validTypes.cjs +328 -0
  332. package/dist/rules/validTypes.cjs.map +1 -0
  333. package/dist/rules/validTypes.d.ts +3 -0
  334. package/dist/rules.d.ts +3203 -0
  335. package/dist/tagNames.cjs +244 -0
  336. package/dist/tagNames.cjs.map +1 -0
  337. package/dist/tagNames.d.ts +16 -0
  338. package/dist/to-valid-identifier.cjs +263 -0
  339. package/dist/utils/hasReturnValue.cjs +495 -0
  340. package/dist/utils/hasReturnValue.cjs.map +1 -0
  341. package/dist/utils/hasReturnValue.d.ts +20 -0
  342. package/package.json +220 -0
  343. package/rollup.config.js +16 -0
  344. package/src/WarnSettings.js +34 -0
  345. package/src/alignTransform.js +444 -0
  346. package/src/buildForbidRuleDefinition.js +106 -0
  347. package/src/buildRejectOrPreferRuleDefinition.js +481 -0
  348. package/src/defaultTagOrder.js +169 -0
  349. package/src/exportParser.js +973 -0
  350. package/src/getDefaultTagStructureForMode.js +968 -0
  351. package/src/getJsdocProcessorPlugin.cts +5 -0
  352. package/src/getJsdocProcessorPlugin.js +692 -0
  353. package/src/index-cjs.js +755 -0
  354. package/src/index-esm.js +196 -0
  355. package/src/index.cjs.cts +3 -0
  356. package/src/index.js +940 -0
  357. package/src/iterateJsdoc.cts +7 -0
  358. package/src/iterateJsdoc.js +2612 -0
  359. package/src/jsdocUtils.js +2158 -0
  360. package/src/rules/checkAccess.js +45 -0
  361. package/src/rules/checkAlignment.js +82 -0
  362. package/src/rules/checkExamples.js +613 -0
  363. package/src/rules/checkIndentation.js +176 -0
  364. package/src/rules/checkLineAlignment.js +453 -0
  365. package/src/rules/checkParamNames.js +541 -0
  366. package/src/rules/checkPropertyNames.js +174 -0
  367. package/src/rules/checkSyntax.js +30 -0
  368. package/src/rules/checkTagNames.js +414 -0
  369. package/src/rules/checkTemplateNames.js +208 -0
  370. package/src/rules/checkTypes.js +130 -0
  371. package/src/rules/checkValues.js +264 -0
  372. package/src/rules/convertToJsdocComments.js +444 -0
  373. package/src/rules/emptyTags.js +106 -0
  374. package/src/rules/escapeInlineTags.js +189 -0
  375. package/src/rules/implementsOnClasses.js +78 -0
  376. package/src/rules/importsAsDependencies.js +132 -0
  377. package/src/rules/informativeDocs.js +228 -0
  378. package/src/rules/linesBeforeBlock.js +144 -0
  379. package/src/rules/matchDescription.js +413 -0
  380. package/src/rules/matchName.js +179 -0
  381. package/src/rules/multilineBlocks.js +562 -0
  382. package/src/rules/noBadBlocks.js +127 -0
  383. package/src/rules/noBlankBlockDescriptions.js +69 -0
  384. package/src/rules/noBlankBlocks.js +55 -0
  385. package/src/rules/noDefaults.js +104 -0
  386. package/src/rules/noMissingSyntax.js +215 -0
  387. package/src/rules/noMultiAsterisks.js +162 -0
  388. package/src/rules/noRestrictedSyntax.js +72 -0
  389. package/src/rules/noTypes.js +108 -0
  390. package/src/rules/noUndefinedTypes.js +797 -0
  391. package/src/rules/preferImportTag.js +521 -0
  392. package/src/rules/requireAsteriskPrefix.js +217 -0
  393. package/src/rules/requireDescription.js +190 -0
  394. package/src/rules/requireDescriptionCompleteSentence.js +376 -0
  395. package/src/rules/requireExample.js +143 -0
  396. package/src/rules/requireFileOverview.js +213 -0
  397. package/src/rules/requireHyphenBeforeParamDescription.js +210 -0
  398. package/src/rules/requireJsdoc.js +897 -0
  399. package/src/rules/requireParam.js +848 -0
  400. package/src/rules/requireParamDescription.js +110 -0
  401. package/src/rules/requireParamName.js +69 -0
  402. package/src/rules/requireParamType.js +109 -0
  403. package/src/rules/requireProperty.js +66 -0
  404. package/src/rules/requirePropertyDescription.js +25 -0
  405. package/src/rules/requirePropertyName.js +25 -0
  406. package/src/rules/requirePropertyType.js +25 -0
  407. package/src/rules/requireRejects.js +246 -0
  408. package/src/rules/requireReturns.js +291 -0
  409. package/src/rules/requireReturnsCheck.js +180 -0
  410. package/src/rules/requireReturnsDescription.js +73 -0
  411. package/src/rules/requireReturnsType.js +65 -0
  412. package/src/rules/requireTags.js +85 -0
  413. package/src/rules/requireTemplate.js +246 -0
  414. package/src/rules/requireThrows.js +128 -0
  415. package/src/rules/requireYields.js +265 -0
  416. package/src/rules/requireYieldsCheck.js +226 -0
  417. package/src/rules/sortTags.js +766 -0
  418. package/src/rules/tagLines.js +486 -0
  419. package/src/rules/textEscaping.js +158 -0
  420. package/src/rules/tsMethodSignatureStyle.js +300 -0
  421. package/src/rules/tsNoEmptyObjectType.js +61 -0
  422. package/src/rules/tsNoUnnecessaryTemplateExpression.js +130 -0
  423. package/src/rules/tsPreferFunctionType.js +127 -0
  424. package/src/rules/typeFormatting.js +690 -0
  425. package/src/rules/validTypes.js +466 -0
  426. package/src/rules.d.ts +3203 -0
  427. package/src/tagNames.js +301 -0
  428. package/src/utils/hasReturnValue.js +572 -0
  429. package/typings/babel__eslint-parser.d.ts +1 -0
  430. package/typings/gitdown.d.ts +16 -0
@@ -0,0 +1,797 @@
1
+ import iterateJsdoc, {
2
+ parseComment,
3
+ } from '../iterateJsdoc.js';
4
+ import {
5
+ getJSDocComment,
6
+ parse as parseType,
7
+ traverse,
8
+ tryParse as tryParseType,
9
+ } from '@es-joy/jsdoccomment';
10
+ import {
11
+ parseImportsExports,
12
+ } from 'parse-imports-exports';
13
+
14
+ const extraTypes = [
15
+ 'null', 'undefined', 'void', 'string', 'boolean', 'object',
16
+ 'function', 'symbol',
17
+ 'number', 'bigint', 'NaN', 'Infinity',
18
+ 'any', '*', 'never', 'unknown', 'const',
19
+ 'this', 'true', 'false',
20
+ 'Array', 'Object', 'RegExp', 'Date', 'Function', 'Intl',
21
+ ];
22
+
23
+ const globalTypes = [
24
+ 'globalThis', 'global', 'window', 'self',
25
+ ];
26
+
27
+ const typescriptGlobals = [
28
+ // https://www.typescriptlang.org/docs/handbook/utility-types.html
29
+ 'Awaited',
30
+ 'Partial',
31
+ 'Required',
32
+ 'Readonly',
33
+ 'Record',
34
+ 'Pick',
35
+ 'Omit',
36
+ 'Exclude',
37
+ 'Extract',
38
+ 'NonNullable',
39
+ 'Parameters',
40
+ 'ConstructorParameters',
41
+ 'ReturnType',
42
+ 'InstanceType',
43
+ 'ThisParameterType',
44
+ 'OmitThisParameter',
45
+ 'ThisType',
46
+ 'Uppercase',
47
+ 'Lowercase',
48
+ 'Capitalize',
49
+ 'Uncapitalize',
50
+ ];
51
+
52
+ /**
53
+ * @param {string|false|undefined} [str]
54
+ * @returns {undefined|string|false}
55
+ */
56
+ const stripPseudoTypes = (str) => {
57
+ return str && str.replace(/(?:\.|<>|\.<>|\[\])$/v, '');
58
+ };
59
+
60
+ export default iterateJsdoc(({
61
+ context,
62
+ node,
63
+ report,
64
+ settings,
65
+ sourceCode,
66
+ state,
67
+ utils,
68
+ }) => {
69
+ /** @type {string[]} */
70
+ const foundTypedefValues = [];
71
+
72
+ const {
73
+ scopeManager,
74
+ } = sourceCode;
75
+
76
+ // When is this ever `null`?
77
+ const globalScope = /** @type {import('eslint').Scope.Scope} */ (
78
+ scopeManager.globalScope
79
+ );
80
+
81
+ const
82
+ /**
83
+ * @type {{
84
+ * checkUsedTypedefs: boolean
85
+ * definedTypes: string[],
86
+ * disableReporting: boolean,
87
+ * markVariablesAsUsed: boolean,
88
+ * }}
89
+ */ {
90
+ checkUsedTypedefs = false,
91
+ definedTypes = [],
92
+ disableReporting = false,
93
+ markVariablesAsUsed = true,
94
+ } = context.options[0] || {};
95
+
96
+ /** @type {(string|undefined)[]} */
97
+ let definedPreferredTypes = [];
98
+ const {
99
+ mode,
100
+ preferredTypes,
101
+ structuredTags,
102
+ } = settings;
103
+ if (Object.keys(preferredTypes).length) {
104
+ definedPreferredTypes = /** @type {string[]} */ (Object.values(preferredTypes).map((preferredType) => {
105
+ if (typeof preferredType === 'string') {
106
+ // May become an empty string but will be filtered out below
107
+ return stripPseudoTypes(preferredType);
108
+ }
109
+
110
+ if (!preferredType) {
111
+ return undefined;
112
+ }
113
+
114
+ if (typeof preferredType !== 'object') {
115
+ utils.reportSettings(
116
+ 'Invalid `settings.jsdoc.preferredTypes`. Values must be falsy, a string, or an object.',
117
+ );
118
+ }
119
+
120
+ return stripPseudoTypes(preferredType.replacement);
121
+ })
122
+ .filter(Boolean));
123
+ }
124
+
125
+ const allComments = sourceCode.getAllComments();
126
+ const comments = allComments
127
+ .filter((comment) => {
128
+ return (/^\*(?!\*)/v).test(comment.value);
129
+ })
130
+ .map((commentNode) => {
131
+ return parseComment(commentNode, '');
132
+ });
133
+
134
+ const globals = allComments
135
+ .filter((comment) => {
136
+ return (/^\s*globals/v).test(comment.value);
137
+ }).flatMap((commentNode) => {
138
+ return commentNode.value.replace(/^\s*globals/v, '').trim().split(/,\s*/v);
139
+ }).concat(Object.keys(context.languageOptions.globals ?? []));
140
+
141
+ const typedefs = comments
142
+ .flatMap((doc) => {
143
+ return doc.tags.filter(({
144
+ tag,
145
+ }) => {
146
+ return utils.isNameOrNamepathDefiningTag(tag) && ![
147
+ 'arg',
148
+ 'argument',
149
+ 'param',
150
+ 'prop',
151
+ 'property',
152
+ ].includes(tag);
153
+ });
154
+ });
155
+
156
+ const typedefDeclarations = typedefs
157
+ .map((tag) => {
158
+ return tag.name;
159
+ });
160
+
161
+ const importTags = settings.mode === 'typescript' ? /** @type {string[]} */ (comments.flatMap((doc) => {
162
+ return doc.tags.filter(({
163
+ tag,
164
+ }) => {
165
+ return tag === 'import';
166
+ });
167
+ }).flatMap((tag) => {
168
+ const {
169
+ description,
170
+ name,
171
+ type,
172
+ } = tag;
173
+ const typePart = type ? `{${type}} ` : '';
174
+ const imprt = 'import ' + (description ?
175
+ `${typePart}${name} ${description}` :
176
+ `${typePart}${name}`);
177
+
178
+ const importsExports = parseImportsExports(imprt.trim());
179
+
180
+ const types = [];
181
+ const namedImports = Object.values(importsExports.namedImports || {})[0]?.[0];
182
+ if (namedImports) {
183
+ if (namedImports.default) {
184
+ types.push(namedImports.default);
185
+ }
186
+
187
+ if (namedImports.names) {
188
+ types.push(...Object.keys(namedImports.names));
189
+ }
190
+ }
191
+
192
+ const namespaceImports = Object.values(importsExports.namespaceImports || {})[0]?.[0];
193
+ if (namespaceImports) {
194
+ if (namespaceImports.namespace) {
195
+ types.push(namespaceImports.namespace);
196
+ }
197
+
198
+ if (namespaceImports.default) {
199
+ types.push(namespaceImports.default);
200
+ }
201
+ }
202
+
203
+ return types;
204
+ }).filter(Boolean)) : [];
205
+
206
+ const ancestorNodes = [];
207
+
208
+ let currentNode = node;
209
+ // No need for Program node?
210
+ while (currentNode?.parent) {
211
+ ancestorNodes.push(currentNode);
212
+ currentNode = currentNode.parent;
213
+ }
214
+
215
+ /**
216
+ * @param {import('eslint').Rule.Node} ancestorNode
217
+ * @returns {import('comment-parser').Spec[]}
218
+ */
219
+ const getTemplateTags = function (ancestorNode) {
220
+ const commentNode = getJSDocComment(sourceCode, ancestorNode, settings);
221
+ if (!commentNode) {
222
+ return [];
223
+ }
224
+
225
+ const jsdc = parseComment(commentNode, '');
226
+
227
+ return jsdc.tags.filter((tag) => {
228
+ return tag.tag === 'template';
229
+ });
230
+ };
231
+
232
+ // `currentScope` may be `null` or `Program`, so in such a case,
233
+ // we look to present tags instead
234
+ const templateTags = ancestorNodes.length ?
235
+ ancestorNodes.flatMap((ancestorNode) => {
236
+ return getTemplateTags(ancestorNode);
237
+ }) :
238
+ // We err on the side of being too aggressive; checking only
239
+ // present tags is not sufficient
240
+ comments.flatMap((doc) => {
241
+ return doc.tags.filter(({
242
+ tag,
243
+ }) => {
244
+ return tag === 'template';
245
+ });
246
+ });
247
+
248
+ const closureGenericTypes = templateTags.flatMap((tag) => {
249
+ return utils.parseClosureTemplateTag(tag);
250
+ });
251
+
252
+ // In modules, including Node, there is a global scope at top with the
253
+ // Program scope inside
254
+ const cjsOrESMScope = globalScope.childScopes[0]?.block?.type === 'Program';
255
+
256
+ /**
257
+ * @param {import("eslint").Scope.Scope | null} scope
258
+ * @returns {Set<string>}
259
+ */
260
+ const getValidRuntimeIdentifiers = (scope) => {
261
+ const result = new Set();
262
+
263
+ let scp = scope;
264
+ while (scp) {
265
+ for (const {
266
+ name,
267
+ } of scp.variables) {
268
+ result.add(name);
269
+ }
270
+
271
+ scp = scp.upper;
272
+ }
273
+
274
+ return result;
275
+ };
276
+
277
+ /**
278
+ * Recursively extracts types from a namespace declaration.
279
+ * @param {string} prefix - The namespace prefix (e.g., "MyNamespace" or "Outer.Inner").
280
+ * @param {import('@typescript-eslint/types').TSESTree.TSModuleDeclaration} moduleDeclaration - The module declaration node.
281
+ * @returns {string[]} Array of fully qualified type names.
282
+ */
283
+ const getNamespaceTypes = (prefix, moduleDeclaration) => {
284
+ /* c8 ignore next 3 -- Guard for ambient modules without body. */
285
+ if (!moduleDeclaration.body || moduleDeclaration.body.type !== 'TSModuleBlock') {
286
+ return [];
287
+ }
288
+
289
+ return moduleDeclaration.body.body.flatMap((item) => {
290
+ /** @type {import('@typescript-eslint/types').TSESTree.ProgramStatement | import('@typescript-eslint/types').TSESTree.NamedExportDeclarations | null} */
291
+ let declaration = item;
292
+
293
+ if (item.type === 'ExportNamedDeclaration' && item.declaration) {
294
+ declaration = item.declaration;
295
+ }
296
+
297
+ if (declaration.type === 'TSTypeAliasDeclaration' || declaration.type === 'ClassDeclaration') {
298
+ /* c8 ignore next 4 -- Guard for anonymous class declarations. */
299
+ if (!declaration.id) {
300
+ return [];
301
+ }
302
+
303
+ return [
304
+ `${prefix}.${declaration.id.name}`,
305
+ ];
306
+ }
307
+
308
+ if (declaration.type === 'TSInterfaceDeclaration') {
309
+ return [
310
+ `${prefix}.${declaration.id.name}`,
311
+ ...declaration.body.body.map((prop) => {
312
+ // Only `TSPropertySignature` and `TSMethodSignature` have 'key'.
313
+ if (prop.type !== 'TSPropertySignature' && prop.type !== 'TSMethodSignature') {
314
+ return '';
315
+ }
316
+
317
+ // Key can be computed or a literal, only handle Identifier.
318
+ if (prop.key.type !== 'Identifier') {
319
+ return '';
320
+ }
321
+
322
+ const propName = prop.key.name;
323
+ /* c8 ignore next -- `propName` is always truthy for Identifiers. */
324
+ return propName ? `${prefix}.${declaration.id.name}.${propName}` : '';
325
+ }).filter(Boolean),
326
+ ];
327
+ }
328
+
329
+ // Handle nested namespaces.
330
+ if (declaration.type === 'TSModuleDeclaration') {
331
+ /* c8 ignore next -- Nested string-literal modules aren't valid TS syntax. */
332
+ const nestedName = declaration.id?.type === 'Identifier' ? declaration.id.name : '';
333
+ /* c8 ignore next 3 -- Guard. */
334
+ if (!nestedName) {
335
+ return [];
336
+ }
337
+
338
+ return [
339
+ `${prefix}.${nestedName}`,
340
+ ...getNamespaceTypes(`${prefix}.${nestedName}`, declaration),
341
+ ];
342
+ }
343
+
344
+ // Fallback for unhandled declaration types (e.g., TSEnumDeclaration, FunctionDeclaration, etc.).
345
+ return [];
346
+ });
347
+ };
348
+
349
+ /**
350
+ * We treat imports differently as we can't introspect their children.
351
+ * @type {string[]}
352
+ */
353
+ const imports = [];
354
+
355
+ /** @type {Set<string>} */
356
+ const closedTypes = new Set();
357
+
358
+ const allDefinedTypes = new Set(globalScope.variables.map(({
359
+ name,
360
+ }) => {
361
+ return name;
362
+ })
363
+
364
+ // If the file is a module, concat the variables from the module scope.
365
+ .concat(
366
+ cjsOrESMScope ?
367
+ globalScope.childScopes.flatMap(({
368
+ variables,
369
+ }) => {
370
+ return variables;
371
+ }).flatMap(({
372
+ identifiers,
373
+ name,
374
+ }) => {
375
+ const globalItem = /** @type {import('estree').Identifier & {parent: import('@typescript-eslint/types').TSESTree.Node}} */ (
376
+ identifiers?.[0]
377
+ )?.parent;
378
+ switch (globalItem?.type) {
379
+ case 'ClassDeclaration':
380
+ closedTypes.add(name);
381
+ return [
382
+ name,
383
+ ...globalItem.body.body.map((item) => {
384
+ const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
385
+ /** @type {import('@typescript-eslint/types').TSESTree.PropertyDefinition} */ (
386
+ item)?.key)?.name;
387
+ /* c8 ignore next 3 -- Guard */
388
+ if (!property) {
389
+ return '';
390
+ }
391
+
392
+ return `${name}.${property}`;
393
+ }).filter(Boolean),
394
+ ];
395
+ case 'ImportDefaultSpecifier':
396
+ case 'ImportNamespaceSpecifier':
397
+ case 'ImportSpecifier':
398
+ imports.push(name);
399
+ break;
400
+ case 'TSInterfaceDeclaration':
401
+ return [
402
+ name,
403
+ ...globalItem.body.body.map((item) => {
404
+ const property = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
405
+ /** @type {import('@typescript-eslint/types').TSESTree.TSPropertySignature} */ (
406
+ item)?.key)?.name;
407
+ /* c8 ignore next 3 -- Guard */
408
+ if (!property) {
409
+ return '';
410
+ }
411
+
412
+ return `${name}.${property}`;
413
+ }).filter(Boolean),
414
+ ];
415
+ case 'TSModuleDeclaration':
416
+ closedTypes.add(name);
417
+ return [
418
+ name,
419
+ ...getNamespaceTypes(name, globalItem),
420
+ ];
421
+ case 'VariableDeclarator':
422
+ if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
423
+ /** @type {import('@typescript-eslint/types').TSESTree.CallExpression} */ (
424
+ globalItem?.init
425
+ )?.callee)?.name === 'require'
426
+ ) {
427
+ imports.push(/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (
428
+ globalItem.id
429
+ ).name);
430
+ break;
431
+ }
432
+
433
+ // Module scope names are also defined
434
+ return [
435
+ name,
436
+ ];
437
+ }
438
+
439
+ return [
440
+ name,
441
+ ];
442
+ /* c8 ignore next */
443
+ }) : [],
444
+ )
445
+ .concat(extraTypes)
446
+ .concat(typedefDeclarations)
447
+ .concat(importTags)
448
+ .concat(definedTypes)
449
+ .concat(/** @type {string[]} */ (definedPreferredTypes))
450
+ .concat((() => {
451
+ // Other methods are not in scope, but we need them, and we grab them here
452
+ if (node?.type === 'MethodDefinition') {
453
+ return /** @type {import('estree').ClassBody} */ (node.parent).body.flatMap((methodOrProp) => {
454
+ if (methodOrProp.type === 'MethodDefinition') {
455
+ // eslint-disable-next-line unicorn/no-lonely-if -- Pattern
456
+ if (methodOrProp.key.type === 'Identifier') {
457
+ return [
458
+ methodOrProp.key.name,
459
+ `${/** @type {import('estree').ClassDeclaration} */ (
460
+ node.parent?.parent
461
+ )?.id?.name}.${methodOrProp.key.name}`,
462
+ ];
463
+ }
464
+ }
465
+
466
+ if (methodOrProp.type === 'PropertyDefinition') {
467
+ // eslint-disable-next-line unicorn/no-lonely-if -- Pattern
468
+ if (methodOrProp.key.type === 'Identifier') {
469
+ return [
470
+ methodOrProp.key.name,
471
+ `${/** @type {import('estree').ClassDeclaration} */ (
472
+ node.parent?.parent
473
+ )?.id?.name}.${methodOrProp.key.name}`,
474
+ ];
475
+ }
476
+ }
477
+ /* c8 ignore next 2 -- Not yet built */
478
+
479
+ return '';
480
+ }).filter(Boolean);
481
+ }
482
+
483
+ return [];
484
+ })())
485
+ .concat((() => {
486
+ // Detect static property assignments like `MyClass.Prop = ...`
487
+ const programBody = /** @type {import('@typescript-eslint/types').TSESTree.Program} */ (
488
+ sourceCode.ast
489
+ ).body;
490
+
491
+ return programBody.flatMap((statement) => {
492
+ if (
493
+ statement.type === 'ExpressionStatement' &&
494
+ statement.expression.type === 'AssignmentExpression' &&
495
+ statement.expression.left.type === 'MemberExpression' &&
496
+ statement.expression.left.object.type === 'Identifier' &&
497
+ statement.expression.left.property.type === 'Identifier' &&
498
+ closedTypes.has(statement.expression.left.object.name)
499
+ ) {
500
+ return [
501
+ `${statement.expression.left.object.name}.${statement.expression.left.property.name}`,
502
+ ];
503
+ }
504
+
505
+ return [];
506
+ });
507
+ })())
508
+ .concat(...getValidRuntimeIdentifiers(node && (
509
+ (sourceCode.getScope &&
510
+ /* c8 ignore next 3 */
511
+ sourceCode.getScope(node)) ||
512
+ // @ts-expect-error ESLint 8
513
+ context.getScope()
514
+ )))
515
+ .concat(
516
+ settings.mode === 'jsdoc' ?
517
+ [] :
518
+ [
519
+ ...settings.mode === 'typescript' ? typescriptGlobals : [],
520
+ ...closureGenericTypes,
521
+ ],
522
+ ));
523
+
524
+ /**
525
+ * @typedef {{
526
+ * parsedType: import('jsdoc-type-pratt-parser').RootResult;
527
+ * tag: import('comment-parser').Spec|import('@es-joy/jsdoccomment').JsdocInlineTagNoType & {
528
+ * line?: import('../iterateJsdoc.js').Integer
529
+ * }
530
+ * }} TypeAndTagInfo
531
+ */
532
+
533
+ /**
534
+ * @param {string} propertyName
535
+ * @returns {(tag: (import('@es-joy/jsdoccomment').JsdocInlineTagNoType & {
536
+ * name?: string,
537
+ * type?: string,
538
+ * line?: import('../iterateJsdoc.js').Integer
539
+ * })|import('comment-parser').Spec & {
540
+ * namepathOrURL?: string
541
+ * }
542
+ * ) => undefined|TypeAndTagInfo}
543
+ */
544
+ const tagToParsedType = (propertyName) => {
545
+ return (tag) => {
546
+ try {
547
+ const potentialType = tag[
548
+ /** @type {"type"|"name"|"namepathOrURL"} */ (propertyName)
549
+ ];
550
+ return {
551
+ parsedType: mode === 'permissive' ?
552
+ tryParseType(/** @type {string} */ (potentialType)) :
553
+ parseType(/** @type {string} */ (potentialType), mode),
554
+ tag,
555
+ };
556
+ } catch {
557
+ return undefined;
558
+ }
559
+ };
560
+ };
561
+
562
+ const typeTags = utils.filterTags(({
563
+ tag,
564
+ }) => {
565
+ return tag !== 'import' && utils.tagMightHaveTypePosition(tag) && (tag !== 'suppress' || settings.mode !== 'closure');
566
+ }).map(tagToParsedType('type'));
567
+
568
+ const namepathReferencingTags = utils.filterTags(({
569
+ tag,
570
+ }) => {
571
+ return utils.isNamepathReferencingTag(tag);
572
+ }).map(tagToParsedType('name'));
573
+
574
+ const namepathOrUrlReferencingTags = utils.filterAllTags(({
575
+ tag,
576
+ }) => {
577
+ return utils.isNamepathOrUrlReferencingTag(tag);
578
+ }).map(tagToParsedType('namepathOrURL'));
579
+
580
+ const definedNamesAndNamepaths = new Set(utils.filterTags(({
581
+ tag,
582
+ }) => {
583
+ return utils.isNameOrNamepathDefiningTag(tag);
584
+ }).map(({
585
+ name,
586
+ }) => {
587
+ return name;
588
+ }));
589
+
590
+ const tagsWithTypes = /** @type {TypeAndTagInfo[]} */ ([
591
+ ...typeTags,
592
+ ...namepathReferencingTags,
593
+ ...namepathOrUrlReferencingTags,
594
+ // Remove types which failed to parse
595
+ ].filter(Boolean));
596
+
597
+ for (const {
598
+ parsedType,
599
+ tag,
600
+ } of tagsWithTypes) {
601
+ // eslint-disable-next-line complexity -- Refactor
602
+ traverse(parsedType, (nde, parentNode) => {
603
+ /**
604
+ * @type {import('jsdoc-type-pratt-parser').NameResult & {
605
+ * _parent?: import('jsdoc-type-pratt-parser').NonRootResult
606
+ * }}
607
+ */
608
+ // eslint-disable-next-line canonical/id-match -- Avoid clashes
609
+ (nde)._parent = parentNode;
610
+ const {
611
+ type,
612
+ value,
613
+ } = /** @type {import('jsdoc-type-pratt-parser').NameResult} */ (nde);
614
+
615
+ let val = value;
616
+
617
+ /** @type {import('jsdoc-type-pratt-parser').NonRootResult|undefined} */
618
+ let currNode = nde;
619
+ do {
620
+ currNode =
621
+ /**
622
+ * @type {import('jsdoc-type-pratt-parser').NameResult & {
623
+ * _parent?: import('jsdoc-type-pratt-parser').NonRootResult
624
+ * }}
625
+ */ (currNode)._parent;
626
+ if (
627
+ // Avoid appending for imports and globals since we don't want to
628
+ // check their properties which may or may not exist
629
+ !imports.includes(val) && !globals.includes(val) &&
630
+ !importTags.includes(val) &&
631
+ !extraTypes.includes(val) &&
632
+ !typedefDeclarations.includes(val) &&
633
+ !globalTypes.includes(val) &&
634
+ currNode && 'right' in currNode &&
635
+ currNode.right?.type === 'JsdocTypeProperty'
636
+ ) {
637
+ val = val + '.' + currNode.right.value;
638
+ }
639
+ } while (currNode?.type === 'JsdocTypeNamePath');
640
+
641
+ if (type === 'JsdocTypeName') {
642
+ const structuredTypes = structuredTags[tag.tag]?.type;
643
+ const rootNamespace = val.split('.')[0];
644
+ const isNamespaceValid = (definedTypes.includes(rootNamespace) || allDefinedTypes.has(rootNamespace)) &&
645
+ !closedTypes.has(rootNamespace);
646
+
647
+ if (!allDefinedTypes.has(val) &&
648
+ !definedNamesAndNamepaths.has(val) &&
649
+ (!Array.isArray(structuredTypes) || !structuredTypes.includes(val)) && !isNamespaceValid
650
+ ) {
651
+ const parent =
652
+ /**
653
+ * @type {import('jsdoc-type-pratt-parser').RootResult & {
654
+ * _parent?: import('jsdoc-type-pratt-parser').NonRootResult
655
+ * }}
656
+ */ (nde)._parent;
657
+ if (parent?.type === 'JsdocTypeTypeParameter') {
658
+ return;
659
+ }
660
+
661
+ if (parent?.type === 'JsdocTypeFunction' &&
662
+ /** @type {import('jsdoc-type-pratt-parser').FunctionResult} */
663
+ (parent)?.typeParameters?.some((typeParam) => {
664
+ return value === typeParam.name.value;
665
+ })
666
+ ) {
667
+ return;
668
+ }
669
+
670
+ if (parent?.type === 'JsdocTypeInfer' && value === parent.element.value) {
671
+ allDefinedTypes.add(value);
672
+ return;
673
+ }
674
+
675
+ if (!disableReporting) {
676
+ report(`The type '${val}' is undefined.`, null, tag);
677
+ }
678
+ } else if (markVariablesAsUsed && !extraTypes.includes(val)) {
679
+ if (sourceCode.markVariableAsUsed) {
680
+ sourceCode.markVariableAsUsed(val);
681
+ /* c8 ignore next 4 */
682
+ } else {
683
+ // @ts-expect-error ESLint 8
684
+ context.markVariableAsUsed(val);
685
+ }
686
+ }
687
+
688
+ if (checkUsedTypedefs && typedefDeclarations.includes(val)) {
689
+ foundTypedefValues.push(val);
690
+ }
691
+ }
692
+ });
693
+ }
694
+
695
+ state.foundTypedefValues = foundTypedefValues;
696
+ }, {
697
+ // We use this method rather than checking at end of handler above because
698
+ // in that case, it is invoked too many times and would thus report errors
699
+ // too many times.
700
+ exit ({
701
+ context,
702
+ state,
703
+ utils,
704
+ }) {
705
+ const {
706
+ checkUsedTypedefs = false,
707
+ } = context.options[0] || {};
708
+
709
+ if (!checkUsedTypedefs) {
710
+ return;
711
+ }
712
+
713
+ const allComments = context.sourceCode.getAllComments();
714
+ const comments = allComments
715
+ .filter((comment) => {
716
+ return (/^\*(?!\*)/v).test(comment.value);
717
+ })
718
+ .map((commentNode) => {
719
+ return {
720
+ doc: parseComment(commentNode, ''),
721
+ loc: commentNode.loc,
722
+ };
723
+ });
724
+ const typedefs = comments
725
+ .flatMap(({
726
+ doc,
727
+ loc,
728
+ }) => {
729
+ const tags = doc.tags.filter(({
730
+ tag,
731
+ }) => {
732
+ return utils.isNameOrNamepathDefiningTag(tag);
733
+ });
734
+ if (!tags.length) {
735
+ return [];
736
+ }
737
+
738
+ return {
739
+ loc,
740
+ tags,
741
+ };
742
+ });
743
+
744
+ for (const typedef of typedefs) {
745
+ if (
746
+ !state.foundTypedefValues.includes(typedef.tags[0].name)
747
+ ) {
748
+ context.report({
749
+ loc: /** @type {import('@eslint/core').SourceLocation} */ (typedef.loc),
750
+ message: 'This typedef was not used within the file',
751
+ });
752
+ }
753
+ }
754
+ },
755
+ iterateAllJsdocs: true,
756
+ meta: {
757
+ docs: {
758
+ description: 'Besides some expected built-in types, prohibits any types not specified as globals or within `@typedef`.',
759
+ url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-undefined-types.md#repos-sticky-header',
760
+ },
761
+ schema: [
762
+ {
763
+ additionalProperties: false,
764
+ properties: {
765
+ checkUsedTypedefs: {
766
+ description: 'Whether to check typedefs for use within the file',
767
+ type: 'boolean',
768
+ },
769
+ definedTypes: {
770
+ description: `This array can be populated to indicate other types which
771
+ are automatically considered as defined (in addition to globals, etc.).
772
+ Defaults to an empty array.`,
773
+ items: {
774
+ type: 'string',
775
+ },
776
+ type: 'array',
777
+ },
778
+ disableReporting: {
779
+ description: `Whether to disable reporting of errors. Defaults to
780
+ \`false\`. This may be set to \`true\` in order to take advantage of only
781
+ marking defined variables as used or checking used typedefs.`,
782
+ type: 'boolean',
783
+ },
784
+ markVariablesAsUsed: {
785
+ description: `Whether to mark variables as used for the purposes
786
+ of the \`no-unused-vars\` rule when they are not found to be undefined.
787
+ Defaults to \`true\`. May be set to \`false\` to enforce a practice of not
788
+ importing types unless used in code.`,
789
+ type: 'boolean',
790
+ },
791
+ },
792
+ type: 'object',
793
+ },
794
+ ],
795
+ type: 'suggestion',
796
+ },
797
+ });