eslint-plugin-jsdoc 52.0.3 → 52.0.4

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 (357) hide show
  1. package/dist/WarnSettings.cjs +35 -18
  2. package/dist/WarnSettings.cjs.map +1 -1
  3. package/dist/alignTransform.cjs +305 -224
  4. package/dist/alignTransform.cjs.map +1 -1
  5. package/dist/defaultTagOrder.cjs +43 -132
  6. package/dist/defaultTagOrder.cjs.map +1 -1
  7. package/dist/exportParser.cjs +696 -478
  8. package/dist/exportParser.cjs.map +1 -1
  9. package/dist/generateRule.cjs +242 -0
  10. package/dist/generateRule.cjs.map +1 -0
  11. package/dist/getDefaultTagStructureForMode.cjs +288 -184
  12. package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
  13. package/dist/getJsdocProcessorPlugin.cjs +550 -364
  14. package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
  15. package/dist/getJsdocProcessorPlugin.d.ts +65 -68
  16. package/dist/getJsdocProcessorPlugin.d.ts.map +1 -1
  17. package/dist/index.cjs +383 -398
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +6 -11
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/iterateJsdoc.cjs +1988 -1528
  22. package/dist/iterateJsdoc.cjs.map +1 -1
  23. package/dist/iterateJsdoc.d.ts +349 -358
  24. package/dist/iterateJsdoc.d.ts.map +1 -1
  25. package/dist/jsdocUtils.cjs +1376 -1009
  26. package/dist/jsdocUtils.cjs.map +1 -1
  27. package/dist/rules/checkAccess.cjs +36 -29
  28. package/dist/rules/checkAccess.cjs.map +1 -1
  29. package/dist/rules/checkAlignment.cjs +54 -41
  30. package/dist/rules/checkAlignment.cjs.map +1 -1
  31. package/dist/rules/checkExamples.cjs +484 -327
  32. package/dist/rules/checkExamples.cjs.map +1 -1
  33. package/dist/rules/checkIndentation.cjs +65 -50
  34. package/dist/rules/checkIndentation.cjs.map +1 -1
  35. package/dist/rules/checkLineAlignment.cjs +311 -220
  36. package/dist/rules/checkLineAlignment.cjs.map +1 -1
  37. package/dist/rules/checkParamNames.cjs +335 -227
  38. package/dist/rules/checkParamNames.cjs.map +1 -1
  39. package/dist/rules/checkPropertyNames.cjs +106 -78
  40. package/dist/rules/checkPropertyNames.cjs.map +1 -1
  41. package/dist/rules/checkSyntax.cjs +34 -21
  42. package/dist/rules/checkSyntax.cjs.map +1 -1
  43. package/dist/rules/checkTagNames.cjs +210 -188
  44. package/dist/rules/checkTagNames.cjs.map +1 -1
  45. package/dist/rules/checkTemplateNames.cjs +178 -121
  46. package/dist/rules/checkTemplateNames.cjs.map +1 -1
  47. package/dist/rules/checkTypes.cjs +385 -291
  48. package/dist/rules/checkTypes.cjs.map +1 -1
  49. package/dist/rules/checkValues.cjs +146 -100
  50. package/dist/rules/checkValues.cjs.map +1 -1
  51. package/dist/rules/convertToJsdocComments.cjs +306 -228
  52. package/dist/rules/convertToJsdocComments.cjs.map +1 -1
  53. package/dist/rules/emptyTags.cjs +72 -62
  54. package/dist/rules/emptyTags.cjs.map +1 -1
  55. package/dist/rules/implementsOnClasses.cjs +56 -36
  56. package/dist/rules/implementsOnClasses.cjs.map +1 -1
  57. package/dist/rules/importsAsDependencies.cjs +99 -62
  58. package/dist/rules/importsAsDependencies.cjs.map +1 -1
  59. package/dist/rules/informativeDocs.cjs +142 -105
  60. package/dist/rules/informativeDocs.cjs.map +1 -1
  61. package/dist/rules/linesBeforeBlock.cjs +105 -70
  62. package/dist/rules/linesBeforeBlock.cjs.map +1 -1
  63. package/dist/rules/matchDescription.cjs +222 -160
  64. package/dist/rules/matchDescription.cjs.map +1 -1
  65. package/dist/rules/matchName.cjs +128 -73
  66. package/dist/rules/matchName.cjs.map +1 -1
  67. package/dist/rules/multilineBlocks.cjs +352 -235
  68. package/dist/rules/multilineBlocks.cjs.map +1 -1
  69. package/dist/rules/noBadBlocks.cjs +86 -63
  70. package/dist/rules/noBadBlocks.cjs.map +1 -1
  71. package/dist/rules/noBlankBlockDescriptions.cjs +57 -35
  72. package/dist/rules/noBlankBlockDescriptions.cjs.map +1 -1
  73. package/dist/rules/noBlankBlocks.cjs +48 -26
  74. package/dist/rules/noBlankBlocks.cjs.map +1 -1
  75. package/dist/rules/noDefaults.cjs +79 -52
  76. package/dist/rules/noDefaults.cjs.map +1 -1
  77. package/dist/rules/noMissingSyntax.cjs +165 -115
  78. package/dist/rules/noMissingSyntax.cjs.map +1 -1
  79. package/dist/rules/noMultiAsterisks.cjs +89 -48
  80. package/dist/rules/noMultiAsterisks.cjs.map +1 -1
  81. package/dist/rules/noRestrictedSyntax.cjs +79 -45
  82. package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
  83. package/dist/rules/noTypes.cjs +80 -59
  84. package/dist/rules/noTypes.cjs.map +1 -1
  85. package/dist/rules/noUndefinedTypes.cjs +388 -297
  86. package/dist/rules/noUndefinedTypes.cjs.map +1 -1
  87. package/dist/rules/requireAsteriskPrefix.cjs +159 -108
  88. package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
  89. package/dist/rules/requireDescription.cjs +129 -89
  90. package/dist/rules/requireDescription.cjs.map +1 -1
  91. package/dist/rules/requireDescriptionCompleteSentence.cjs +262 -201
  92. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
  93. package/dist/rules/requireExample.cjs +104 -73
  94. package/dist/rules/requireExample.cjs.map +1 -1
  95. package/dist/rules/requireFileOverview.cjs +129 -75
  96. package/dist/rules/requireFileOverview.cjs.map +1 -1
  97. package/dist/rules/requireHyphenBeforeParamDescription.cjs +133 -85
  98. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
  99. package/dist/rules/requireJsdoc.cjs +557 -384
  100. package/dist/rules/requireJsdoc.cjs.map +1 -1
  101. package/dist/rules/requireParam.cjs +526 -336
  102. package/dist/rules/requireParam.cjs.map +1 -1
  103. package/dist/rules/requireParamDescription.cjs +80 -55
  104. package/dist/rules/requireParamDescription.cjs.map +1 -1
  105. package/dist/rules/requireParamName.cjs +50 -32
  106. package/dist/rules/requireParamName.cjs.map +1 -1
  107. package/dist/rules/requireParamType.cjs +80 -55
  108. package/dist/rules/requireParamType.cjs.map +1 -1
  109. package/dist/rules/requireProperty.cjs +42 -31
  110. package/dist/rules/requireProperty.cjs.map +1 -1
  111. package/dist/rules/requirePropertyDescription.cjs +25 -17
  112. package/dist/rules/requirePropertyDescription.cjs.map +1 -1
  113. package/dist/rules/requirePropertyName.cjs +25 -17
  114. package/dist/rules/requirePropertyName.cjs.map +1 -1
  115. package/dist/rules/requirePropertyType.cjs +25 -17
  116. package/dist/rules/requirePropertyType.cjs.map +1 -1
  117. package/dist/rules/requireReturns.cjs +203 -125
  118. package/dist/rules/requireReturns.cjs.map +1 -1
  119. package/dist/rules/requireReturnsCheck.cjs +103 -60
  120. package/dist/rules/requireReturnsCheck.cjs.map +1 -1
  121. package/dist/rules/requireReturnsDescription.cjs +54 -39
  122. package/dist/rules/requireReturnsDescription.cjs.map +1 -1
  123. package/dist/rules/requireReturnsType.cjs +50 -32
  124. package/dist/rules/requireReturnsType.cjs.map +1 -1
  125. package/dist/rules/requireTemplate.cjs +178 -119
  126. package/dist/rules/requireTemplate.cjs.map +1 -1
  127. package/dist/rules/requireThrows.cjs +95 -61
  128. package/dist/rules/requireThrows.cjs.map +1 -1
  129. package/dist/rules/requireYields.cjs +166 -106
  130. package/dist/rules/requireYields.cjs.map +1 -1
  131. package/dist/rules/requireYieldsCheck.cjs +152 -96
  132. package/dist/rules/requireYieldsCheck.cjs.map +1 -1
  133. package/dist/rules/sortTags.cjs +444 -258
  134. package/dist/rules/sortTags.cjs.map +1 -1
  135. package/dist/rules/tagLines.cjs +266 -179
  136. package/dist/rules/tagLines.cjs.map +1 -1
  137. package/dist/rules/textEscaping.cjs +127 -92
  138. package/dist/rules/textEscaping.cjs.map +1 -1
  139. package/dist/rules/validTypes.cjs +265 -252
  140. package/dist/rules/validTypes.cjs.map +1 -1
  141. package/dist/tagNames.cjs +170 -134
  142. package/dist/tagNames.cjs.map +1 -1
  143. package/dist/utils/hasReturnValue.cjs +474 -246
  144. package/dist/utils/hasReturnValue.cjs.map +1 -1
  145. package/package.json +24 -40
  146. package/src/WarnSettings.js +34 -0
  147. package/src/alignTransform.js +358 -0
  148. package/src/defaultTagOrder.js +169 -0
  149. package/src/exportParser.js +978 -0
  150. package/src/getDefaultTagStructureForMode.js +969 -0
  151. package/src/getJsdocProcessorPlugin.js +672 -0
  152. package/src/index.js +530 -0
  153. package/src/iterateJsdoc.js +2518 -0
  154. package/src/jsdocUtils.js +1896 -0
  155. package/src/rules/checkAccess.js +45 -0
  156. package/src/rules/checkAlignment.js +63 -0
  157. package/src/rules/checkExamples.js +589 -0
  158. package/src/rules/checkIndentation.js +75 -0
  159. package/src/rules/checkLineAlignment.js +372 -0
  160. package/src/rules/checkParamNames.js +474 -0
  161. package/src/rules/checkPropertyNames.js +152 -0
  162. package/src/rules/checkSyntax.js +30 -0
  163. package/src/rules/checkTagNames.js +314 -0
  164. package/src/rules/checkTemplateNames.js +204 -0
  165. package/src/rules/checkTypes.js +535 -0
  166. package/src/rules/checkValues.js +248 -0
  167. package/src/rules/convertToJsdocComments.js +398 -0
  168. package/src/rules/emptyTags.js +98 -0
  169. package/src/rules/implementsOnClasses.js +64 -0
  170. package/src/rules/importsAsDependencies.js +133 -0
  171. package/src/rules/informativeDocs.js +189 -0
  172. package/src/rules/linesBeforeBlock.js +134 -0
  173. package/src/rules/matchDescription.js +286 -0
  174. package/src/rules/matchName.js +151 -0
  175. package/src/rules/multilineBlocks.js +493 -0
  176. package/src/rules/noBadBlocks.js +119 -0
  177. package/src/rules/noBlankBlockDescriptions.js +69 -0
  178. package/src/rules/noBlankBlocks.js +53 -0
  179. package/src/rules/noDefaults.js +85 -0
  180. package/src/rules/noMissingSyntax.js +195 -0
  181. package/src/rules/noMultiAsterisks.js +134 -0
  182. package/src/rules/noRestrictedSyntax.js +91 -0
  183. package/src/rules/noTypes.js +93 -0
  184. package/src/rules/noUndefinedTypes.js +543 -0
  185. package/src/rules/requireAsteriskPrefix.js +190 -0
  186. package/src/rules/requireDescription.js +161 -0
  187. package/src/rules/requireDescriptionCompleteSentence.js +335 -0
  188. package/src/rules/requireExample.js +118 -0
  189. package/src/rules/requireFileOverview.js +154 -0
  190. package/src/rules/requireHyphenBeforeParamDescription.js +176 -0
  191. package/src/rules/requireJsdoc.js +743 -0
  192. package/src/rules/requireParam.js +602 -0
  193. package/src/rules/requireParamDescription.js +89 -0
  194. package/src/rules/requireParamName.js +55 -0
  195. package/src/rules/requireParamType.js +89 -0
  196. package/src/rules/requireProperty.js +48 -0
  197. package/src/rules/requirePropertyDescription.js +25 -0
  198. package/src/rules/requirePropertyName.js +25 -0
  199. package/src/rules/requirePropertyType.js +25 -0
  200. package/src/rules/requireReturns.js +238 -0
  201. package/src/rules/requireReturnsCheck.js +145 -0
  202. package/src/rules/requireReturnsDescription.js +59 -0
  203. package/src/rules/requireReturnsType.js +51 -0
  204. package/src/rules/requireTemplate.js +201 -0
  205. package/src/rules/requireThrows.js +111 -0
  206. package/src/rules/requireYields.js +216 -0
  207. package/src/rules/requireYieldsCheck.js +208 -0
  208. package/src/rules/sortTags.js +558 -0
  209. package/src/rules/tagLines.js +359 -0
  210. package/src/rules/textEscaping.js +154 -0
  211. package/src/rules/validTypes.js +401 -0
  212. package/src/tagNames.js +238 -0
  213. package/src/utils/hasReturnValue.js +572 -0
  214. package/dist/WarnSettings.js +0 -20
  215. package/dist/WarnSettings.js.map +0 -1
  216. package/dist/_virtual/rolldown_runtime.cjs +0 -32
  217. package/dist/_virtual/rolldown_runtime.js +0 -11
  218. package/dist/alignTransform.js +0 -241
  219. package/dist/alignTransform.js.map +0 -1
  220. package/dist/defaultTagOrder.js +0 -134
  221. package/dist/defaultTagOrder.js.map +0 -1
  222. package/dist/exportParser.js +0 -518
  223. package/dist/exportParser.js.map +0 -1
  224. package/dist/getDefaultTagStructureForMode.js +0 -188
  225. package/dist/getDefaultTagStructureForMode.js.map +0 -1
  226. package/dist/getJsdocProcessorPlugin.d.cts +0 -70
  227. package/dist/getJsdocProcessorPlugin.d.cts.map +0 -1
  228. package/dist/getJsdocProcessorPlugin.js +0 -383
  229. package/dist/getJsdocProcessorPlugin.js.map +0 -1
  230. package/dist/index.d.cts +0 -22
  231. package/dist/index.d.cts.map +0 -1
  232. package/dist/index.js +0 -425
  233. package/dist/index.js.map +0 -1
  234. package/dist/iterateJsdoc.d.cts +0 -471
  235. package/dist/iterateJsdoc.d.cts.map +0 -1
  236. package/dist/iterateJsdoc.js +0 -1617
  237. package/dist/iterateJsdoc.js.map +0 -1
  238. package/dist/jsdocUtils.js +0 -1123
  239. package/dist/jsdocUtils.js.map +0 -1
  240. package/dist/rules/checkAccess.js +0 -33
  241. package/dist/rules/checkAccess.js.map +0 -1
  242. package/dist/rules/checkAlignment.js +0 -47
  243. package/dist/rules/checkAlignment.js.map +0 -1
  244. package/dist/rules/checkExamples.js +0 -348
  245. package/dist/rules/checkExamples.js.map +0 -1
  246. package/dist/rules/checkIndentation.js +0 -59
  247. package/dist/rules/checkIndentation.js.map +0 -1
  248. package/dist/rules/checkLineAlignment.js +0 -229
  249. package/dist/rules/checkLineAlignment.js.map +0 -1
  250. package/dist/rules/checkParamNames.js +0 -237
  251. package/dist/rules/checkParamNames.js.map +0 -1
  252. package/dist/rules/checkPropertyNames.js +0 -88
  253. package/dist/rules/checkPropertyNames.js.map +0 -1
  254. package/dist/rules/checkSyntax.js +0 -25
  255. package/dist/rules/checkSyntax.js.map +0 -1
  256. package/dist/rules/checkTagNames.js +0 -191
  257. package/dist/rules/checkTagNames.js.map +0 -1
  258. package/dist/rules/checkTemplateNames.js +0 -124
  259. package/dist/rules/checkTemplateNames.js.map +0 -1
  260. package/dist/rules/checkTypes.js +0 -299
  261. package/dist/rules/checkTypes.js.map +0 -1
  262. package/dist/rules/checkValues.js +0 -103
  263. package/dist/rules/checkValues.js.map +0 -1
  264. package/dist/rules/convertToJsdocComments.js +0 -231
  265. package/dist/rules/convertToJsdocComments.js.map +0 -1
  266. package/dist/rules/emptyTags.js +0 -67
  267. package/dist/rules/emptyTags.js.map +0 -1
  268. package/dist/rules/implementsOnClasses.js +0 -40
  269. package/dist/rules/implementsOnClasses.js.map +0 -1
  270. package/dist/rules/importsAsDependencies.js +0 -68
  271. package/dist/rules/importsAsDependencies.js.map +0 -1
  272. package/dist/rules/informativeDocs.js +0 -110
  273. package/dist/rules/informativeDocs.js.map +0 -1
  274. package/dist/rules/linesBeforeBlock.js +0 -75
  275. package/dist/rules/linesBeforeBlock.js.map +0 -1
  276. package/dist/rules/matchDescription.js +0 -167
  277. package/dist/rules/matchDescription.js.map +0 -1
  278. package/dist/rules/matchName.js +0 -77
  279. package/dist/rules/matchName.js.map +0 -1
  280. package/dist/rules/multilineBlocks.js +0 -245
  281. package/dist/rules/multilineBlocks.js.map +0 -1
  282. package/dist/rules/noBadBlocks.js +0 -68
  283. package/dist/rules/noBadBlocks.js.map +0 -1
  284. package/dist/rules/noBlankBlockDescriptions.js +0 -41
  285. package/dist/rules/noBlankBlockDescriptions.js.map +0 -1
  286. package/dist/rules/noBlankBlocks.js +0 -30
  287. package/dist/rules/noBlankBlocks.js.map +0 -1
  288. package/dist/rules/noDefaults.js +0 -56
  289. package/dist/rules/noDefaults.js.map +0 -1
  290. package/dist/rules/noMissingSyntax.js +0 -126
  291. package/dist/rules/noMissingSyntax.js.map +0 -1
  292. package/dist/rules/noMultiAsterisks.js +0 -58
  293. package/dist/rules/noMultiAsterisks.js.map +0 -1
  294. package/dist/rules/noRestrictedSyntax.js +0 -49
  295. package/dist/rules/noRestrictedSyntax.js.map +0 -1
  296. package/dist/rules/noTypes.js +0 -65
  297. package/dist/rules/noTypes.js.map +0 -1
  298. package/dist/rules/noUndefinedTypes.js +0 -303
  299. package/dist/rules/noUndefinedTypes.js.map +0 -1
  300. package/dist/rules/requireAsteriskPrefix.js +0 -112
  301. package/dist/rules/requireAsteriskPrefix.js.map +0 -1
  302. package/dist/rules/requireDescription.js +0 -95
  303. package/dist/rules/requireDescription.js.map +0 -1
  304. package/dist/rules/requireDescriptionCompleteSentence.js +0 -220
  305. package/dist/rules/requireDescriptionCompleteSentence.js.map +0 -1
  306. package/dist/rules/requireExample.js +0 -77
  307. package/dist/rules/requireExample.js.map +0 -1
  308. package/dist/rules/requireFileOverview.js +0 -81
  309. package/dist/rules/requireFileOverview.js.map +0 -1
  310. package/dist/rules/requireHyphenBeforeParamDescription.js +0 -89
  311. package/dist/rules/requireHyphenBeforeParamDescription.js.map +0 -1
  312. package/dist/rules/requireJsdoc.js +0 -404
  313. package/dist/rules/requireJsdoc.js.map +0 -1
  314. package/dist/rules/requireParam.js +0 -344
  315. package/dist/rules/requireParam.js.map +0 -1
  316. package/dist/rules/requireParamDescription.js +0 -59
  317. package/dist/rules/requireParamDescription.js.map +0 -1
  318. package/dist/rules/requireParamName.js +0 -36
  319. package/dist/rules/requireParamName.js.map +0 -1
  320. package/dist/rules/requireParamType.js +0 -59
  321. package/dist/rules/requireParamType.js.map +0 -1
  322. package/dist/rules/requireProperty.js +0 -35
  323. package/dist/rules/requireProperty.js.map +0 -1
  324. package/dist/rules/requirePropertyDescription.js +0 -21
  325. package/dist/rules/requirePropertyDescription.js.map +0 -1
  326. package/dist/rules/requirePropertyName.js +0 -21
  327. package/dist/rules/requirePropertyName.js.map +0 -1
  328. package/dist/rules/requirePropertyType.js +0 -21
  329. package/dist/rules/requirePropertyType.js.map +0 -1
  330. package/dist/rules/requireReturns.js +0 -131
  331. package/dist/rules/requireReturns.js.map +0 -1
  332. package/dist/rules/requireReturnsCheck.js +0 -66
  333. package/dist/rules/requireReturnsCheck.js.map +0 -1
  334. package/dist/rules/requireReturnsDescription.js +0 -43
  335. package/dist/rules/requireReturnsDescription.js.map +0 -1
  336. package/dist/rules/requireReturnsType.js +0 -36
  337. package/dist/rules/requireReturnsType.js.map +0 -1
  338. package/dist/rules/requireTemplate.js +0 -122
  339. package/dist/rules/requireTemplate.js.map +0 -1
  340. package/dist/rules/requireThrows.js +0 -67
  341. package/dist/rules/requireThrows.js.map +0 -1
  342. package/dist/rules/requireYields.js +0 -115
  343. package/dist/rules/requireYields.js.map +0 -1
  344. package/dist/rules/requireYieldsCheck.js +0 -105
  345. package/dist/rules/requireYieldsCheck.js.map +0 -1
  346. package/dist/rules/sortTags.js +0 -262
  347. package/dist/rules/sortTags.js.map +0 -1
  348. package/dist/rules/tagLines.js +0 -183
  349. package/dist/rules/tagLines.js.map +0 -1
  350. package/dist/rules/textEscaping.js +0 -102
  351. package/dist/rules/textEscaping.js.map +0 -1
  352. package/dist/rules/validTypes.js +0 -259
  353. package/dist/rules/validTypes.js.map +0 -1
  354. package/dist/tagNames.js +0 -144
  355. package/dist/tagNames.js.map +0 -1
  356. package/dist/utils/hasReturnValue.js +0 -265
  357. package/dist/utils/hasReturnValue.js.map +0 -1
@@ -1,383 +0,0 @@
1
- import { forEachPreferredTag, getPreferredTagName, getRegexFromString, getTagDescription, hasTag } from "./jsdocUtils.js";
2
- import { parseComment } from "@es-joy/jsdoccomment";
3
- import * as espree from "espree";
4
- import { readFileSync } from "node:fs";
5
- import { join } from "node:path";
6
-
7
- //#region src/getJsdocProcessorPlugin.js
8
- /**
9
- * @import {
10
- * Integer,
11
- * JsdocBlockWithInline,
12
- * } from './iterateJsdoc.js';
13
- * @import {
14
- * ESLint,
15
- * Linter,
16
- * } from 'eslint';
17
- */
18
- const { version } = JSON.parse(readFileSync(join(import.meta.dirname, "../package.json")));
19
- const likelyNestedJSDocIndentSpace = 1;
20
- const preTagSpaceLength = 1;
21
- const firstLinePrefixLength = preTagSpaceLength;
22
- const hasCaptionRegex = /^\s*<caption>([\s\S]*?)<\/caption>/v;
23
- /**
24
- * @param {string} str
25
- * @returns {string}
26
- */
27
- const escapeStringRegexp = (str) => {
28
- return str.replaceAll(/[.*+?^$\{\}\(\)\|\[\]\\]/gv, "\\$&");
29
- };
30
- /**
31
- * @param {string} str
32
- * @param {string} ch
33
- * @returns {Integer}
34
- */
35
- const countChars = (str, ch) => {
36
- return (str.match(new RegExp(escapeStringRegexp(ch), "gv")) || []).length;
37
- };
38
- /**
39
- * @param {string} text
40
- * @returns {[
41
- * Integer,
42
- * Integer
43
- * ]}
44
- */
45
- const getLinesCols = (text) => {
46
- const matchLines = countChars(text, "\n");
47
- const colDelta = matchLines ? text.slice(text.lastIndexOf("\n") + 1).length : text.length;
48
- return [matchLines, colDelta];
49
- };
50
- /**
51
- * @typedef {number} Integer
52
- */
53
- /**
54
- * @typedef {object} JsdocProcessorOptions
55
- * @property {boolean} [captionRequired] Require captions for example tags
56
- * @property {Integer} [paddedIndent] See docs
57
- * @property {boolean} [checkDefaults] See docs
58
- * @property {boolean} [checkParams] See docs
59
- * @property {boolean} [checkExamples] See docs
60
- * @property {boolean} [checkProperties] See docs
61
- * @property {string} [matchingFileName] See docs
62
- * @property {string} [matchingFileNameDefaults] See docs
63
- * @property {string} [matchingFileNameParams] See docs
64
- * @property {string} [matchingFileNameProperties] See docs
65
- * @property {string|RegExp} [exampleCodeRegex] See docs
66
- * @property {string|RegExp} [rejectExampleCodeRegex] See docs
67
- * @property {string[]} [allowedLanguagesToProcess] See docs
68
- * @property {"script"|"module"} [sourceType] See docs
69
- * @property {import('eslint').Linter.ESTreeParser|import('eslint').Linter.NonESTreeParser} [parser] See docs
70
- */
71
- /**
72
- * We use a function for the ability of the user to pass in a config, but
73
- * without requiring all users of the plugin to do so.
74
- * @param {JsdocProcessorOptions} [options]
75
- * @returns {ESLint.Plugin}
76
- */
77
- const getJsdocProcessorPlugin = (options = {}) => {
78
- const { allowedLanguagesToProcess = [
79
- "js",
80
- "ts",
81
- "javascript",
82
- "typescript"
83
- ], captionRequired = false, checkDefaults = false, checkExamples = true, checkParams = false, checkProperties = false, exampleCodeRegex = null, matchingFileName = null, matchingFileNameDefaults = null, matchingFileNameParams = null, matchingFileNameProperties = null, paddedIndent = 0, parser = void 0, rejectExampleCodeRegex = null, sourceType = "module" } = options;
84
- /** @type {RegExp} */
85
- let exampleCodeRegExp;
86
- /** @type {RegExp} */
87
- let rejectExampleCodeRegExp;
88
- if (exampleCodeRegex) exampleCodeRegExp = typeof exampleCodeRegex === "string" ? getRegexFromString(exampleCodeRegex) : exampleCodeRegex;
89
- if (rejectExampleCodeRegex) rejectExampleCodeRegExp = typeof rejectExampleCodeRegex === "string" ? getRegexFromString(rejectExampleCodeRegex) : rejectExampleCodeRegex;
90
- /**
91
- * @type {{
92
- * targetTagName: string,
93
- * ext: string,
94
- * codeStartLine: number,
95
- * codeStartCol: number,
96
- * nonJSPrefacingCols: number,
97
- * commentLineCols: [number, number]
98
- * }[]}
99
- */
100
- const otherInfo = [];
101
- /** @type {import('eslint').Linter.LintMessage[]} */
102
- let extraMessages = [];
103
- /**
104
- * @param {JsdocBlockWithInline} jsdoc
105
- * @param {string} jsFileName
106
- * @param {[number, number]} commentLineCols
107
- */
108
- const getTextsAndFileNames = (jsdoc, jsFileName, commentLineCols) => {
109
- /**
110
- * @type {{
111
- * text: string,
112
- * filename: string|null|undefined
113
- * }[]}
114
- */
115
- const textsAndFileNames = [];
116
- /**
117
- * @param {{
118
- * filename: string|null,
119
- * defaultFileName: string|undefined,
120
- * source: string,
121
- * targetTagName: string,
122
- * rules?: import('eslint').Linter.RulesRecord|undefined,
123
- * lines?: Integer,
124
- * cols?: Integer,
125
- * skipInit?: boolean,
126
- * ext: string,
127
- * sources?: {
128
- * nonJSPrefacingCols: Integer,
129
- * nonJSPrefacingLines: Integer,
130
- * string: string,
131
- * }[],
132
- * tag?: import('comment-parser').Spec & {
133
- * line?: Integer,
134
- * }|{
135
- * line: Integer,
136
- * }
137
- * }} cfg
138
- */
139
- const checkSource = ({ cols = 0, defaultFileName, ext, filename, lines = 0, skipInit, source, sources = [], tag = { line: 0 }, targetTagName }) => {
140
- if (!skipInit) sources.push({
141
- nonJSPrefacingCols: cols,
142
- nonJSPrefacingLines: lines,
143
- string: source
144
- });
145
- /**
146
- * @param {{
147
- * nonJSPrefacingCols: Integer,
148
- * nonJSPrefacingLines: Integer,
149
- * string: string
150
- * }} cfg
151
- */
152
- const addSourceInfo = function({ nonJSPrefacingCols, nonJSPrefacingLines, string }) {
153
- const src = paddedIndent ? string.replaceAll(new RegExp(`(^|\n) {${paddedIndent}}(?!$)`, "gv"), "\n") : string;
154
- const file = filename || defaultFileName;
155
- if (!("line" in tag)) tag.line = tag.source[0].number;
156
- const codeStartLine = tag.line + nonJSPrefacingLines;
157
- const codeStartCol = likelyNestedJSDocIndentSpace;
158
- textsAndFileNames.push({
159
- filename: file,
160
- text: src
161
- });
162
- otherInfo.push({
163
- codeStartCol,
164
- codeStartLine,
165
- commentLineCols,
166
- ext,
167
- nonJSPrefacingCols,
168
- targetTagName
169
- });
170
- };
171
- for (const targetSource of sources) addSourceInfo(targetSource);
172
- };
173
- /**
174
- *
175
- * @param {string|null} filename
176
- * @param {string} [ext] Since `eslint-plugin-markdown` v2, and
177
- * ESLint 7, this is the default which other JS-fenced rules will used.
178
- * Formerly "md" was the default.
179
- * @returns {{
180
- * defaultFileName: string|undefined,
181
- * filename: string|null,
182
- * ext: string
183
- * }}
184
- */
185
- const getFilenameInfo = (filename, ext = "md/*.js") => {
186
- let defaultFileName;
187
- if (!filename) if (typeof jsFileName === "string" && jsFileName.includes(".")) defaultFileName = jsFileName.replace(/\.[^.]*$/v, `.${ext}`);
188
- else defaultFileName = `dummy.${ext}`;
189
- return {
190
- defaultFileName,
191
- ext,
192
- filename
193
- };
194
- };
195
- if (checkDefaults) {
196
- const filenameInfo = getFilenameInfo(matchingFileNameDefaults, "jsdoc-defaults");
197
- forEachPreferredTag(jsdoc, "default", (tag, targetTagName) => {
198
- if (!tag.description.trim()) return;
199
- checkSource({
200
- source: `(${getTagDescription(tag)})`,
201
- targetTagName,
202
- ...filenameInfo
203
- });
204
- });
205
- }
206
- if (checkParams) {
207
- const filenameInfo = getFilenameInfo(matchingFileNameParams, "jsdoc-params");
208
- forEachPreferredTag(jsdoc, "param", (tag, targetTagName) => {
209
- if (!tag.default || !tag.default.trim()) return;
210
- checkSource({
211
- source: `(${tag.default})`,
212
- targetTagName,
213
- ...filenameInfo
214
- });
215
- });
216
- }
217
- if (checkProperties) {
218
- const filenameInfo = getFilenameInfo(matchingFileNameProperties, "jsdoc-properties");
219
- forEachPreferredTag(jsdoc, "property", (tag, targetTagName) => {
220
- if (!tag.default || !tag.default.trim()) return;
221
- checkSource({
222
- source: `(${tag.default})`,
223
- targetTagName,
224
- ...filenameInfo
225
- });
226
- });
227
- }
228
- if (!checkExamples) return textsAndFileNames;
229
- const tagName = getPreferredTagName(jsdoc, { tagName: "example" });
230
- if (!hasTag(jsdoc, tagName)) return textsAndFileNames;
231
- const matchingFilenameInfo = getFilenameInfo(matchingFileName);
232
- forEachPreferredTag(jsdoc, "example", (tag, targetTagName) => {
233
- let source = getTagDescription(tag);
234
- const match = source.match(hasCaptionRegex);
235
- if (captionRequired && (!match || !match[1].trim())) {
236
- extraMessages.push({
237
- column: commentLineCols[1] + 1,
238
- line: 1 + commentLineCols[0] + (tag.line ?? tag.source[0].number),
239
- message: `@${targetTagName} error - Caption is expected for examples.`,
240
- ruleId: "jsdoc/example-missing-caption",
241
- severity: 2
242
- });
243
- return;
244
- }
245
- source = source.replace(hasCaptionRegex, "");
246
- const [lines, cols] = match ? getLinesCols(match[0]) : [0, 0];
247
- if (exampleCodeRegex && !exampleCodeRegExp.test(source) || rejectExampleCodeRegex && rejectExampleCodeRegExp.test(source)) return;
248
- if (allowedLanguagesToProcess) {
249
- const matches = /^\s*```(?<language>\S+)([\s\S]*)```\s*$/v.exec(source);
250
- if (matches?.groups && !allowedLanguagesToProcess.includes(matches.groups.language.toLowerCase())) return;
251
- }
252
- const sources = [];
253
- let skipInit = false;
254
- if (exampleCodeRegex) {
255
- let nonJSPrefacingCols = 0;
256
- let nonJSPrefacingLines = 0;
257
- let startingIndex = 0;
258
- let lastStringCount = 0;
259
- let exampleCode;
260
- exampleCodeRegExp.lastIndex = 0;
261
- while ((exampleCode = exampleCodeRegExp.exec(source)) !== null) {
262
- const { "0": n0, "1": n1, index } = exampleCode;
263
- const preMatch = source.slice(startingIndex, index);
264
- const [preMatchLines, colDelta] = getLinesCols(preMatch);
265
- let nonJSPreface;
266
- let nonJSPrefaceLineCount;
267
- if (n1) {
268
- const idx = n0.indexOf(n1);
269
- nonJSPreface = n0.slice(0, idx);
270
- nonJSPrefaceLineCount = countChars(nonJSPreface, "\n");
271
- } else {
272
- nonJSPreface = "";
273
- nonJSPrefaceLineCount = 0;
274
- }
275
- nonJSPrefacingLines += lastStringCount + preMatchLines + nonJSPrefaceLineCount;
276
- if (nonJSPrefaceLineCount) {
277
- const charsInLastLine = nonJSPreface.slice(nonJSPreface.lastIndexOf("\n") + 1).length;
278
- nonJSPrefacingCols += charsInLastLine;
279
- } else nonJSPrefacingCols += colDelta + nonJSPreface.length;
280
- const string = n1 || n0;
281
- sources.push({
282
- nonJSPrefacingCols,
283
- nonJSPrefacingLines,
284
- string
285
- });
286
- startingIndex = exampleCodeRegExp.lastIndex;
287
- lastStringCount = countChars(string, "\n");
288
- if (!exampleCodeRegExp.global) break;
289
- }
290
- skipInit = true;
291
- }
292
- checkSource({
293
- cols,
294
- lines,
295
- skipInit,
296
- source,
297
- sources,
298
- tag,
299
- targetTagName,
300
- ...matchingFilenameInfo
301
- });
302
- });
303
- return textsAndFileNames;
304
- };
305
- return {
306
- meta: {
307
- name: "eslint-plugin-jsdoc/processor",
308
- version
309
- },
310
- processors: { examples: {
311
- meta: {
312
- name: "eslint-plugin-jsdoc/preprocessor",
313
- version
314
- },
315
- postprocess([jsMessages, ...messages], filename) {
316
- for (const [idx, message] of messages.entries()) {
317
- const { codeStartCol, codeStartLine, commentLineCols, nonJSPrefacingCols, targetTagName } = otherInfo[idx];
318
- for (const msg of message) {
319
- const { column, endColumn, endLine, fatal, line, message: messageText, ruleId, severity } = msg;
320
- const [codeCtxLine, codeCtxColumn] = commentLineCols;
321
- const startLine = codeCtxLine + codeStartLine + line;
322
- const startCol = 1 + codeCtxColumn + codeStartCol + (line <= 1 ? nonJSPrefacingCols + firstLinePrefixLength : preTagSpaceLength) + column;
323
- msg.message = "@" + targetTagName + " " + (severity === 2 ? "error" : "warning") + (ruleId ? " (" + ruleId + ")" : "") + ": " + (fatal ? "Fatal: " : "") + messageText;
324
- msg.line = startLine;
325
- msg.column = startCol;
326
- msg.endLine = endLine ? startLine + endLine : startLine;
327
- msg.endColumn = endColumn ? startCol - column + endColumn : startCol;
328
- }
329
- }
330
- const ret = [...jsMessages].concat(...messages, ...extraMessages);
331
- extraMessages = [];
332
- return ret;
333
- },
334
- preprocess(text, filename) {
335
- try {
336
- let ast;
337
- try {
338
- ast = parser ? parser.parseForESLint(text, {
339
- comment: true,
340
- ecmaVersion: "latest",
341
- sourceType
342
- }).ast : espree.parse(text, {
343
- comment: true,
344
- ecmaVersion: "latest",
345
- sourceType
346
- });
347
- } catch {
348
- return [text];
349
- }
350
- /** @type {[number, number][]} */
351
- const commentLineCols = [];
352
- const jsdocComments = ast.comments.filter((comment) => {
353
- return /^\*\s/v.test(comment.value);
354
- }).map((comment) => {
355
- const [start] = comment.range ?? [];
356
- const textToStart = text.slice(0, start);
357
- const [lines, cols] = getLinesCols(textToStart);
358
- commentLineCols.push([lines, cols]);
359
- return parseComment(comment);
360
- });
361
- return [text, ...jsdocComments.flatMap((jsdoc, idx) => {
362
- return getTextsAndFileNames(jsdoc, filename, commentLineCols[idx]);
363
- }).filter(
364
- /**
365
- * @returns {file is Linter.ProcessorFile}
366
- */
367
- (file) => {
368
- return file !== null && file !== void 0;
369
- }
370
- )];
371
- } catch (error) {
372
- console.log("err", filename, error);
373
- }
374
- return [];
375
- },
376
- supportsAutofix: false
377
- } }
378
- };
379
- };
380
-
381
- //#endregion
382
- export { getJsdocProcessorPlugin };
383
- //# sourceMappingURL=getJsdocProcessorPlugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getJsdocProcessorPlugin.js","names":[],"sources":["../src/getJsdocProcessorPlugin.js"],"sourcesContent":["import {\n forEachPreferredTag,\n getPreferredTagName,\n getRegexFromString,\n getTagDescription,\n hasTag,\n} from './jsdocUtils.js';\nimport {\n parseComment,\n} from '@es-joy/jsdoccomment';\nimport * as espree from 'espree';\nimport {\n readFileSync,\n} from 'node:fs';\nimport {\n join,\n} from 'node:path';\n\n/**\n * @import {\n * Integer,\n * JsdocBlockWithInline,\n * } from './iterateJsdoc.js';\n * @import {\n * ESLint,\n * Linter,\n * } from 'eslint';\n */\n\nconst {\n version,\n} = JSON.parse(\n // @ts-expect-error `Buffer` is ok for `JSON.parse`\n readFileSync(join(import.meta.dirname, '../package.json')),\n);\n\n// const zeroBasedLineIndexAdjust = -1;\nconst likelyNestedJSDocIndentSpace = 1;\nconst preTagSpaceLength = 1;\n\n// If a space is present, we should ignore it\nconst firstLinePrefixLength = preTagSpaceLength;\n\nconst hasCaptionRegex = /^\\s*<caption>([\\s\\S]*?)<\\/caption>/v;\n\n/**\n * @param {string} str\n * @returns {string}\n */\nconst escapeStringRegexp = (str) => {\n return str.replaceAll(/[.*+?^$\\{\\}\\(\\)\\|\\[\\]\\\\]/gv, '\\\\$&');\n};\n\n/**\n * @param {string} str\n * @param {string} ch\n * @returns {Integer}\n */\nconst countChars = (str, ch) => {\n return (str.match(new RegExp(escapeStringRegexp(ch), 'gv')) || []).length;\n};\n\n/**\n * @param {string} text\n * @returns {[\n * Integer,\n * Integer\n * ]}\n */\nconst getLinesCols = (text) => {\n const matchLines = countChars(text, '\\n');\n\n const colDelta = matchLines ?\n text.slice(text.lastIndexOf('\\n') + 1).length :\n text.length;\n\n return [\n matchLines, colDelta,\n ];\n};\n\n/**\n * @typedef {number} Integer\n */\n\n/**\n * @typedef {object} JsdocProcessorOptions\n * @property {boolean} [captionRequired] Require captions for example tags\n * @property {Integer} [paddedIndent] See docs\n * @property {boolean} [checkDefaults] See docs\n * @property {boolean} [checkParams] See docs\n * @property {boolean} [checkExamples] See docs\n * @property {boolean} [checkProperties] See docs\n * @property {string} [matchingFileName] See docs\n * @property {string} [matchingFileNameDefaults] See docs\n * @property {string} [matchingFileNameParams] See docs\n * @property {string} [matchingFileNameProperties] See docs\n * @property {string|RegExp} [exampleCodeRegex] See docs\n * @property {string|RegExp} [rejectExampleCodeRegex] See docs\n * @property {string[]} [allowedLanguagesToProcess] See docs\n * @property {\"script\"|\"module\"} [sourceType] See docs\n * @property {import('eslint').Linter.ESTreeParser|import('eslint').Linter.NonESTreeParser} [parser] See docs\n */\n\n/**\n * We use a function for the ability of the user to pass in a config, but\n * without requiring all users of the plugin to do so.\n * @param {JsdocProcessorOptions} [options]\n * @returns {ESLint.Plugin}\n */\nexport const getJsdocProcessorPlugin = (options = {}) => {\n const {\n allowedLanguagesToProcess = [\n 'js', 'ts', 'javascript', 'typescript',\n ],\n captionRequired = false,\n checkDefaults = false,\n checkExamples = true,\n checkParams = false,\n checkProperties = false,\n exampleCodeRegex = null,\n matchingFileName = null,\n matchingFileNameDefaults = null,\n matchingFileNameParams = null,\n matchingFileNameProperties = null,\n paddedIndent = 0,\n parser = undefined,\n rejectExampleCodeRegex = null,\n sourceType = 'module',\n } = options;\n\n /** @type {RegExp} */\n let exampleCodeRegExp;\n /** @type {RegExp} */\n let rejectExampleCodeRegExp;\n\n if (exampleCodeRegex) {\n exampleCodeRegExp = typeof exampleCodeRegex === 'string' ?\n getRegexFromString(exampleCodeRegex) :\n exampleCodeRegex;\n }\n\n if (rejectExampleCodeRegex) {\n rejectExampleCodeRegExp = typeof rejectExampleCodeRegex === 'string' ?\n getRegexFromString(rejectExampleCodeRegex) :\n rejectExampleCodeRegex;\n }\n\n /**\n * @type {{\n * targetTagName: string,\n * ext: string,\n * codeStartLine: number,\n * codeStartCol: number,\n * nonJSPrefacingCols: number,\n * commentLineCols: [number, number]\n * }[]}\n */\n const otherInfo = [];\n\n /** @type {import('eslint').Linter.LintMessage[]} */\n let extraMessages = [];\n\n /**\n * @param {JsdocBlockWithInline} jsdoc\n * @param {string} jsFileName\n * @param {[number, number]} commentLineCols\n */\n const getTextsAndFileNames = (jsdoc, jsFileName, commentLineCols) => {\n /**\n * @type {{\n * text: string,\n * filename: string|null|undefined\n * }[]}\n */\n const textsAndFileNames = [];\n\n /**\n * @param {{\n * filename: string|null,\n * defaultFileName: string|undefined,\n * source: string,\n * targetTagName: string,\n * rules?: import('eslint').Linter.RulesRecord|undefined,\n * lines?: Integer,\n * cols?: Integer,\n * skipInit?: boolean,\n * ext: string,\n * sources?: {\n * nonJSPrefacingCols: Integer,\n * nonJSPrefacingLines: Integer,\n * string: string,\n * }[],\n * tag?: import('comment-parser').Spec & {\n * line?: Integer,\n * }|{\n * line: Integer,\n * }\n * }} cfg\n */\n const checkSource = ({\n cols = 0,\n defaultFileName,\n ext,\n filename,\n lines = 0,\n skipInit,\n source,\n sources = [],\n tag = {\n line: 0,\n },\n targetTagName,\n }) => {\n if (!skipInit) {\n sources.push({\n nonJSPrefacingCols: cols,\n nonJSPrefacingLines: lines,\n string: source,\n });\n }\n\n /**\n * @param {{\n * nonJSPrefacingCols: Integer,\n * nonJSPrefacingLines: Integer,\n * string: string\n * }} cfg\n */\n const addSourceInfo = function ({\n nonJSPrefacingCols,\n nonJSPrefacingLines,\n string,\n }) {\n const src = paddedIndent ?\n string.replaceAll(new RegExp(`(^|\\n) {${paddedIndent}}(?!$)`, 'gv'), '\\n') :\n string;\n\n // Programmatic ESLint API: https://eslint.org/docs/developer-guide/nodejs-api\n const file = filename || defaultFileName;\n\n if (!('line' in tag)) {\n tag.line = tag.source[0].number;\n }\n\n // NOTE: `tag.line` can be 0 if of form `/** @tag ... */`\n const codeStartLine = /**\n * @type {import('comment-parser').Spec & {\n * line: Integer,\n * }}\n */ (tag).line + nonJSPrefacingLines;\n const codeStartCol = likelyNestedJSDocIndentSpace;\n\n textsAndFileNames.push({\n filename: file,\n text: src,\n });\n otherInfo.push({\n codeStartCol,\n codeStartLine,\n commentLineCols,\n ext,\n nonJSPrefacingCols,\n targetTagName,\n });\n };\n\n for (const targetSource of sources) {\n addSourceInfo(targetSource);\n }\n };\n\n /**\n *\n * @param {string|null} filename\n * @param {string} [ext] Since `eslint-plugin-markdown` v2, and\n * ESLint 7, this is the default which other JS-fenced rules will used.\n * Formerly \"md\" was the default.\n * @returns {{\n * defaultFileName: string|undefined,\n * filename: string|null,\n * ext: string\n * }}\n */\n const getFilenameInfo = (filename, ext = 'md/*.js') => {\n let defaultFileName;\n if (!filename) {\n if (typeof jsFileName === 'string' && jsFileName.includes('.')) {\n defaultFileName = jsFileName.replace(/\\.[^.]*$/v, `.${ext}`);\n } else {\n defaultFileName = `dummy.${ext}`;\n }\n }\n\n return {\n defaultFileName,\n ext,\n filename,\n };\n };\n\n if (checkDefaults) {\n const filenameInfo = getFilenameInfo(matchingFileNameDefaults, 'jsdoc-defaults');\n forEachPreferredTag(jsdoc, 'default', (tag, targetTagName) => {\n if (!tag.description.trim()) {\n return;\n }\n\n checkSource({\n source: `(${getTagDescription(tag)})`,\n targetTagName,\n ...filenameInfo,\n });\n });\n }\n\n if (checkParams) {\n const filenameInfo = getFilenameInfo(matchingFileNameParams, 'jsdoc-params');\n forEachPreferredTag(jsdoc, 'param', (tag, targetTagName) => {\n if (!tag.default || !tag.default.trim()) {\n return;\n }\n\n checkSource({\n source: `(${tag.default})`,\n targetTagName,\n ...filenameInfo,\n });\n });\n }\n\n if (checkProperties) {\n const filenameInfo = getFilenameInfo(matchingFileNameProperties, 'jsdoc-properties');\n forEachPreferredTag(jsdoc, 'property', (tag, targetTagName) => {\n if (!tag.default || !tag.default.trim()) {\n return;\n }\n\n checkSource({\n source: `(${tag.default})`,\n targetTagName,\n ...filenameInfo,\n });\n });\n }\n\n if (!checkExamples) {\n return textsAndFileNames;\n }\n\n const tagName = /** @type {string} */ (getPreferredTagName(jsdoc, {\n tagName: 'example',\n }));\n if (!hasTag(jsdoc, tagName)) {\n return textsAndFileNames;\n }\n\n const matchingFilenameInfo = getFilenameInfo(matchingFileName);\n\n forEachPreferredTag(jsdoc, 'example', (tag, targetTagName) => {\n let source = /** @type {string} */ (getTagDescription(tag));\n const match = source.match(hasCaptionRegex);\n\n if (captionRequired && (!match || !match[1].trim())) {\n extraMessages.push({\n column: commentLineCols[1] + 1,\n line: 1 + commentLineCols[0] + (tag.line ?? tag.source[0].number),\n message: `@${targetTagName} error - Caption is expected for examples.`,\n ruleId: 'jsdoc/example-missing-caption',\n severity: 2,\n });\n return;\n }\n\n source = source.replace(hasCaptionRegex, '');\n const [\n lines,\n cols,\n ] = match ? getLinesCols(match[0]) : [\n 0, 0,\n ];\n\n if (exampleCodeRegex && !exampleCodeRegExp.test(source) ||\n rejectExampleCodeRegex && rejectExampleCodeRegExp.test(source)\n ) {\n return;\n }\n\n // If `allowedLanguagesToProcess` is falsy, all languages should be processed.\n if (allowedLanguagesToProcess) {\n const matches = (/^\\s*```(?<language>\\S+)([\\s\\S]*)```\\s*$/v).exec(source);\n if (matches?.groups && !allowedLanguagesToProcess.includes(\n matches.groups.language.toLowerCase(),\n )) {\n return;\n }\n }\n\n const sources = [];\n let skipInit = false;\n if (exampleCodeRegex) {\n let nonJSPrefacingCols = 0;\n let nonJSPrefacingLines = 0;\n\n let startingIndex = 0;\n let lastStringCount = 0;\n\n let exampleCode;\n exampleCodeRegExp.lastIndex = 0;\n while ((exampleCode = exampleCodeRegExp.exec(source)) !== null) {\n const {\n '0': n0,\n '1': n1,\n index,\n } = exampleCode;\n\n // Count anything preceding user regex match (can affect line numbering)\n const preMatch = source.slice(startingIndex, index);\n\n const [\n preMatchLines,\n colDelta,\n ] = getLinesCols(preMatch);\n\n let nonJSPreface;\n let nonJSPrefaceLineCount;\n if (n1) {\n const idx = n0.indexOf(n1);\n nonJSPreface = n0.slice(0, idx);\n nonJSPrefaceLineCount = countChars(nonJSPreface, '\\n');\n } else {\n nonJSPreface = '';\n nonJSPrefaceLineCount = 0;\n }\n\n nonJSPrefacingLines += lastStringCount + preMatchLines + nonJSPrefaceLineCount;\n\n // Ignore `preMatch` delta if newlines here\n if (nonJSPrefaceLineCount) {\n const charsInLastLine = nonJSPreface.slice(nonJSPreface.lastIndexOf('\\n') + 1).length;\n\n nonJSPrefacingCols += charsInLastLine;\n } else {\n nonJSPrefacingCols += colDelta + nonJSPreface.length;\n }\n\n const string = n1 || n0;\n sources.push({\n nonJSPrefacingCols,\n nonJSPrefacingLines,\n string,\n });\n startingIndex = exampleCodeRegExp.lastIndex;\n lastStringCount = countChars(string, '\\n');\n if (!exampleCodeRegExp.global) {\n break;\n }\n }\n\n skipInit = true;\n }\n\n checkSource({\n cols,\n lines,\n skipInit,\n source,\n sources,\n tag,\n targetTagName,\n ...matchingFilenameInfo,\n });\n });\n\n return textsAndFileNames;\n };\n\n // See https://eslint.org/docs/latest/extend/plugins#processors-in-plugins\n // See https://eslint.org/docs/latest/extend/custom-processors\n // From https://github.com/eslint/eslint/issues/14745#issuecomment-869457265\n /*\n {\n \"files\": [\"*.js\", \"*.ts\"],\n \"processor\": \"jsdoc/example\" // a pretended value here\n },\n {\n \"files\": [\n \"*.js/*_jsdoc-example.js\",\n \"*.ts/*_jsdoc-example.js\",\n \"*.js/*_jsdoc-example.ts\"\n ],\n \"rules\": {\n // specific rules for examples in jsdoc only here\n // And other rules for `.js` and `.ts` will also be enabled for them\n }\n }\n */\n return {\n meta: {\n name: 'eslint-plugin-jsdoc/processor',\n version,\n },\n processors: {\n examples: {\n meta: {\n name: 'eslint-plugin-jsdoc/preprocessor',\n version,\n },\n /**\n * @param {import('eslint').Linter.LintMessage[][]} messages\n * @param {string} filename\n */\n postprocess ([\n jsMessages,\n ...messages\n // eslint-disable-next-line no-unused-vars -- Placeholder\n ], filename) {\n for (const [\n idx,\n message,\n ] of messages.entries()) {\n const {\n codeStartCol,\n codeStartLine,\n commentLineCols,\n nonJSPrefacingCols,\n targetTagName,\n } = otherInfo[idx];\n\n for (const msg of message) {\n const {\n column,\n endColumn,\n endLine,\n fatal,\n line,\n message: messageText,\n ruleId,\n severity,\n\n // Todo: Make fixable\n // fix\n // fix: {range: [number, number], text: string}\n // suggestions: {desc: , messageId:, fix: }[],\n } = msg;\n\n const [\n codeCtxLine,\n codeCtxColumn,\n ] = commentLineCols;\n const startLine = codeCtxLine + codeStartLine + line;\n\n // Seems to need one more now\n const startCol = 1 +\n codeCtxColumn + codeStartCol + (\n // This might not work for line 0, but line 0 is unlikely for examples\n line <= 1 ? nonJSPrefacingCols + firstLinePrefixLength : preTagSpaceLength\n ) + column;\n\n msg.message = '@' + targetTagName + ' ' + (severity === 2 ? 'error' : 'warning') +\n (ruleId ? ' (' + ruleId + ')' : '') + ': ' +\n (fatal ? 'Fatal: ' : '') +\n messageText;\n msg.line = startLine;\n msg.column = startCol;\n msg.endLine = endLine ? startLine + endLine : startLine;\n // added `- column` to offset what `endColumn` already seemed to include\n msg.endColumn = endColumn ? startCol - column + endColumn : startCol;\n }\n }\n\n const ret = [\n ...jsMessages,\n ].concat(...messages, ...extraMessages);\n extraMessages = [];\n return ret;\n },\n\n /**\n * @param {string} text\n * @param {string} filename\n * @returns {(string | Linter.ProcessorFile)[]}\n */\n preprocess (text, filename) {\n try {\n let ast;\n\n // May be running a second time so catch and ignore\n try {\n ast = parser ?\n // @ts-expect-error Should be present\n parser.parseForESLint(text, {\n comment: true,\n ecmaVersion: 'latest',\n sourceType,\n }).ast :\n espree.parse(text, {\n comment: true,\n ecmaVersion: 'latest',\n sourceType,\n });\n } catch {\n return [\n text,\n ];\n }\n\n /** @type {[number, number][]} */\n const commentLineCols = [];\n const jsdocComments = /** @type {import('estree').Comment[]} */ (\n /**\n * @type {import('estree').Program & {\n * comments?: import('estree').Comment[]\n * }}\n */\n (ast).comments\n ).filter((comment) => {\n return (/^\\*\\s/v).test(comment.value);\n }).map((comment) => {\n const [\n start,\n /* c8 ignore next -- Unsupporting processors only? */\n ] = comment.range ?? [];\n const textToStart = text.slice(0, start);\n\n const [\n lines,\n cols,\n ] = getLinesCols(textToStart);\n\n // const lines = [...textToStart.matchAll(/\\n/gv)].length\n // const lastLinePos = textToStart.lastIndexOf('\\n');\n // const cols = lastLinePos === -1\n // ? 0\n // : textToStart.slice(lastLinePos).length;\n commentLineCols.push([\n lines, cols,\n ]);\n return parseComment(comment);\n });\n\n return [\n text,\n ...jsdocComments.flatMap((jsdoc, idx) => {\n return getTextsAndFileNames(\n jsdoc,\n filename,\n commentLineCols[idx],\n );\n }).filter(\n /**\n * @returns {file is Linter.ProcessorFile}\n */\n (file) => {\n return file !== null && file !== undefined;\n },\n ),\n ];\n /* c8 ignore next 6 */\n } catch (error) {\n // eslint-disable-next-line no-console -- Debugging\n console.log('err', filename, error);\n }\n\n return [];\n },\n // Todo: Reenable\n supportsAutofix: false,\n },\n },\n };\n};\n"],"mappings":"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"}
package/dist/index.d.cts DELETED
@@ -1,22 +0,0 @@
1
- import * as eslint0 from "eslint";
2
-
3
- //#region src/index.d.ts
4
- type ConfigGroups = "recommended" | "stylistic" | "contents" | "logical" | "requirements";
5
- type ConfigVariants = "" | "-typescript" | "-typescript-flavor";
6
- type ErrorLevelVariants = "" | "-error";
7
- /**
8
- * @typedef {"recommended" | "stylistic" | "contents" | "logical" | "requirements"} ConfigGroups
9
- * @typedef {"" | "-typescript" | "-typescript-flavor"} ConfigVariants
10
- * @typedef {"" | "-error"} ErrorLevelVariants
11
- * @type {import('eslint').ESLint.Plugin & {
12
- * configs: Record<`flat/${ConfigGroups}${ConfigVariants}${ErrorLevelVariants}`,
13
- * import('eslint').Linter.Config>
14
- * }}
15
- */
16
- declare const index: eslint0.ESLint.Plugin & {
17
- configs: Record<`flat/${ConfigGroups}${ConfigVariants}${ErrorLevelVariants}`, eslint0.Linter.Config>;
18
- };
19
- //# sourceMappingURL=index.d.ts.map
20
- //#endregion
21
- export { ConfigGroups, ConfigVariants, ErrorLevelVariants, index as default };
22
- //# sourceMappingURL=index.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.js"],"sourcesContent":[],"mappings":";;;;;;;;AAiE0B;;;;;;;cAM1B,KAJc,EADa,OAAA,CAAA,MAAA,CAAO,MAAA,GACpB;EAAM,OAAA,EAAN,MAAM,CAAA,QAAS,YAAT,GAAwB,cAAxB,GAAyC,kBAAzC,EAAA,EACE,OAAA,CAAA,MAAA,CAAO,MAAA,CADT"}