eslint-plugin-jsdoc 63.3.3 → 64.0.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 (269) hide show
  1. package/package.json +23 -48
  2. package/src/index.js +3 -6
  3. package/dist/WarnSettings.cjs +0 -38
  4. package/dist/WarnSettings.cjs.map +0 -1
  5. package/dist/alignTransform.cjs +0 -402
  6. package/dist/alignTransform.cjs.map +0 -1
  7. package/dist/buildForbidRuleDefinition.cjs +0 -101
  8. package/dist/buildForbidRuleDefinition.cjs.map +0 -1
  9. package/dist/buildRejectOrPreferRuleDefinition.cjs +0 -352
  10. package/dist/buildRejectOrPreferRuleDefinition.cjs.map +0 -1
  11. package/dist/cjs/WarnSettings.d.ts +0 -16
  12. package/dist/cjs/alignTransform.d.ts +0 -33
  13. package/dist/cjs/buildForbidRuleDefinition.d.ts +0 -14
  14. package/dist/cjs/buildRejectOrPreferRuleDefinition.d.ts +0 -8
  15. package/dist/cjs/defaultTagOrder.d.ts +0 -4
  16. package/dist/cjs/exportParser.d.ts +0 -40
  17. package/dist/cjs/getDefaultTagStructureForMode.d.ts +0 -10
  18. package/dist/cjs/getJsdocProcessorPlugin.d.cts +0 -5
  19. package/dist/cjs/getJsdocProcessorPlugin.d.ts +0 -66
  20. package/dist/cjs/index-cjs.d.ts +0 -26
  21. package/dist/cjs/index.cjs.d.cts +0 -2
  22. package/dist/cjs/iterateJsdoc.d.cts +0 -7
  23. package/dist/cjs/iterateJsdoc.d.ts +0 -495
  24. package/dist/cjs/jsdocUtils.d.ts +0 -500
  25. package/dist/cjs/rules/checkAccess.d.ts +0 -2
  26. package/dist/cjs/rules/checkAlignment.d.ts +0 -2
  27. package/dist/cjs/rules/checkExamples.d.ts +0 -3
  28. package/dist/cjs/rules/checkIndentation.d.ts +0 -2
  29. package/dist/cjs/rules/checkLineAlignment.d.ts +0 -9
  30. package/dist/cjs/rules/checkParamNames.d.ts +0 -2
  31. package/dist/cjs/rules/checkPropertyNames.d.ts +0 -2
  32. package/dist/cjs/rules/checkSyntax.d.ts +0 -2
  33. package/dist/cjs/rules/checkTagNames.d.ts +0 -2
  34. package/dist/cjs/rules/checkTemplateNames.d.ts +0 -2
  35. package/dist/cjs/rules/checkTypes.d.ts +0 -7
  36. package/dist/cjs/rules/checkValues.d.ts +0 -2
  37. package/dist/cjs/rules/convertToJsdocComments.d.ts +0 -266
  38. package/dist/cjs/rules/emptyTags.d.ts +0 -2
  39. package/dist/cjs/rules/escapeInlineTags.d.ts +0 -2
  40. package/dist/cjs/rules/implementsOnClasses.d.ts +0 -2
  41. package/dist/cjs/rules/importsAsDependencies.d.ts +0 -2
  42. package/dist/cjs/rules/informativeDocs.d.ts +0 -2
  43. package/dist/cjs/rules/linesBeforeBlock.d.ts +0 -2
  44. package/dist/cjs/rules/matchDescription.d.ts +0 -2
  45. package/dist/cjs/rules/matchName.d.ts +0 -2
  46. package/dist/cjs/rules/multilineBlocks.d.ts +0 -2
  47. package/dist/cjs/rules/noBadBlocks.d.ts +0 -2
  48. package/dist/cjs/rules/noBlankBlockDescriptions.d.ts +0 -2
  49. package/dist/cjs/rules/noBlankBlocks.d.ts +0 -2
  50. package/dist/cjs/rules/noDefaults.d.ts +0 -2
  51. package/dist/cjs/rules/noMissingSyntax.d.ts +0 -9
  52. package/dist/cjs/rules/noMultiAsterisks.d.ts +0 -2
  53. package/dist/cjs/rules/noRestrictedSyntax.d.ts +0 -2
  54. package/dist/cjs/rules/noTypes.d.ts +0 -2
  55. package/dist/cjs/rules/noUndefinedTypes.d.ts +0 -2
  56. package/dist/cjs/rules/normalizeSeeLinks.d.ts +0 -2
  57. package/dist/cjs/rules/preferImportTag.d.ts +0 -2
  58. package/dist/cjs/rules/requireAsteriskPrefix.d.ts +0 -2
  59. package/dist/cjs/rules/requireDescription.d.ts +0 -2
  60. package/dist/cjs/rules/requireDescriptionCompleteSentence.d.ts +0 -2
  61. package/dist/cjs/rules/requireExample.d.ts +0 -2
  62. package/dist/cjs/rules/requireFileOverview.d.ts +0 -2
  63. package/dist/cjs/rules/requireHyphenBeforeParamDescription.d.ts +0 -2
  64. package/dist/cjs/rules/requireJsdoc.d.ts +0 -24
  65. package/dist/cjs/rules/requireParam.d.ts +0 -3
  66. package/dist/cjs/rules/requireParamDescription.d.ts +0 -2
  67. package/dist/cjs/rules/requireParamName.d.ts +0 -2
  68. package/dist/cjs/rules/requireParamType.d.ts +0 -2
  69. package/dist/cjs/rules/requireProperty.d.ts +0 -2
  70. package/dist/cjs/rules/requirePropertyDescription.d.ts +0 -2
  71. package/dist/cjs/rules/requirePropertyName.d.ts +0 -2
  72. package/dist/cjs/rules/requirePropertyType.d.ts +0 -2
  73. package/dist/cjs/rules/requireRejects.d.ts +0 -2
  74. package/dist/cjs/rules/requireReturns.d.ts +0 -2
  75. package/dist/cjs/rules/requireReturnsCheck.d.ts +0 -2
  76. package/dist/cjs/rules/requireReturnsDescription.d.ts +0 -2
  77. package/dist/cjs/rules/requireReturnsType.d.ts +0 -2
  78. package/dist/cjs/rules/requireTags.d.ts +0 -2
  79. package/dist/cjs/rules/requireTemplate.d.ts +0 -2
  80. package/dist/cjs/rules/requireThrows.d.ts +0 -2
  81. package/dist/cjs/rules/requireYields.d.ts +0 -2
  82. package/dist/cjs/rules/requireYieldsCheck.d.ts +0 -2
  83. package/dist/cjs/rules/sortTags.d.ts +0 -2
  84. package/dist/cjs/rules/tagLines.d.ts +0 -2
  85. package/dist/cjs/rules/textEscaping.d.ts +0 -2
  86. package/dist/cjs/rules/tsMethodSignatureStyle.d.ts +0 -2
  87. package/dist/cjs/rules/tsNoEmptyObjectType.d.ts +0 -2
  88. package/dist/cjs/rules/tsNoUnnecessaryTemplateExpression.d.ts +0 -2
  89. package/dist/cjs/rules/tsPreferFunctionType.d.ts +0 -2
  90. package/dist/cjs/rules/typeFormatting.d.ts +0 -2
  91. package/dist/cjs/rules/validTypes.d.ts +0 -2
  92. package/dist/cjs/tagNames.d.ts +0 -15
  93. package/dist/cjs/utils/hasReturnValue.d.ts +0 -19
  94. package/dist/defaultTagOrder.cjs +0 -46
  95. package/dist/defaultTagOrder.cjs.map +0 -1
  96. package/dist/exportParser.cjs +0 -732
  97. package/dist/exportParser.cjs.map +0 -1
  98. package/dist/generateDocs.cjs +0 -342
  99. package/dist/generateDocs.cjs.map +0 -1
  100. package/dist/generateOptions.cjs +0 -62
  101. package/dist/generateOptions.cjs.map +0 -1
  102. package/dist/generateRule.cjs +0 -248
  103. package/dist/generateRule.cjs.map +0 -1
  104. package/dist/generateRuleTypes.cjs +0 -24
  105. package/dist/generateRuleTypes.cjs.map +0 -1
  106. package/dist/getDefaultTagStructureForMode.cjs +0 -289
  107. package/dist/getDefaultTagStructureForMode.cjs.map +0 -1
  108. package/dist/getJsdocProcessorPlugin.cjs +0 -587
  109. package/dist/getJsdocProcessorPlugin.cjs.map +0 -1
  110. package/dist/getJsdocProcessorPlugin.cts +0 -5
  111. package/dist/index-cjs.cjs +0 -600
  112. package/dist/index-cjs.cjs.map +0 -1
  113. package/dist/index-cjs.d.ts +0 -27
  114. package/dist/index-esm.cjs +0 -162
  115. package/dist/index-esm.cjs.map +0 -1
  116. package/dist/index-esm.d.ts +0 -72
  117. package/dist/index.cjs +0 -748
  118. package/dist/index.cjs.cts +0 -3
  119. package/dist/index.cjs.map +0 -1
  120. package/dist/iterateJsdoc.cjs +0 -2150
  121. package/dist/iterateJsdoc.cjs.map +0 -1
  122. package/dist/iterateJsdoc.cts +0 -7
  123. package/dist/jsdocUtils.cjs +0 -1786
  124. package/dist/jsdocUtils.cjs.map +0 -1
  125. package/dist/rules/checkAccess.cjs +0 -40
  126. package/dist/rules/checkAccess.cjs.map +0 -1
  127. package/dist/rules/checkAlignment.cjs +0 -78
  128. package/dist/rules/checkAlignment.cjs.map +0 -1
  129. package/dist/rules/checkExamples.cjs +0 -521
  130. package/dist/rules/checkExamples.cjs.map +0 -1
  131. package/dist/rules/checkIndentation.cjs +0 -170
  132. package/dist/rules/checkIndentation.cjs.map +0 -1
  133. package/dist/rules/checkLineAlignment.cjs +0 -398
  134. package/dist/rules/checkLineAlignment.cjs.map +0 -1
  135. package/dist/rules/checkParamNames.cjs +0 -407
  136. package/dist/rules/checkParamNames.cjs.map +0 -1
  137. package/dist/rules/checkPropertyNames.cjs +0 -135
  138. package/dist/rules/checkPropertyNames.cjs.map +0 -1
  139. package/dist/rules/checkSyntax.cjs +0 -38
  140. package/dist/rules/checkSyntax.cjs.map +0 -1
  141. package/dist/rules/checkTagNames.cjs +0 -312
  142. package/dist/rules/checkTagNames.cjs.map +0 -1
  143. package/dist/rules/checkTemplateNames.cjs +0 -192
  144. package/dist/rules/checkTemplateNames.cjs.map +0 -1
  145. package/dist/rules/checkTypes.cjs +0 -111
  146. package/dist/rules/checkTypes.cjs.map +0 -1
  147. package/dist/rules/checkValues.cjs +0 -166
  148. package/dist/rules/checkValues.cjs.map +0 -1
  149. package/dist/rules/convertToJsdocComments.cjs +0 -356
  150. package/dist/rules/convertToJsdocComments.cjs.map +0 -1
  151. package/dist/rules/emptyTags.cjs +0 -98
  152. package/dist/rules/emptyTags.cjs.map +0 -1
  153. package/dist/rules/escapeInlineTags.cjs +0 -234
  154. package/dist/rules/escapeInlineTags.cjs.map +0 -1
  155. package/dist/rules/implementsOnClasses.cjs +0 -74
  156. package/dist/rules/implementsOnClasses.cjs.map +0 -1
  157. package/dist/rules/importsAsDependencies.cjs +0 -104
  158. package/dist/rules/importsAsDependencies.cjs.map +0 -1
  159. package/dist/rules/informativeDocs.cjs +0 -187
  160. package/dist/rules/informativeDocs.cjs.map +0 -1
  161. package/dist/rules/linesBeforeBlock.cjs +0 -120
  162. package/dist/rules/linesBeforeBlock.cjs.map +0 -1
  163. package/dist/rules/matchDescription.cjs +0 -356
  164. package/dist/rules/matchDescription.cjs.map +0 -1
  165. package/dist/rules/matchName.cjs +0 -160
  166. package/dist/rules/matchName.cjs.map +0 -1
  167. package/dist/rules/multilineBlocks.cjs +0 -431
  168. package/dist/rules/multilineBlocks.cjs.map +0 -1
  169. package/dist/rules/noBadBlocks.cjs +0 -100
  170. package/dist/rules/noBadBlocks.cjs.map +0 -1
  171. package/dist/rules/noBlankBlockDescriptions.cjs +0 -63
  172. package/dist/rules/noBlankBlockDescriptions.cjs.map +0 -1
  173. package/dist/rules/noBlankBlocks.cjs +0 -54
  174. package/dist/rules/noBlankBlocks.cjs.map +0 -1
  175. package/dist/rules/noDefaults.cjs +0 -102
  176. package/dist/rules/noDefaults.cjs.map +0 -1
  177. package/dist/rules/noMissingSyntax.cjs +0 -196
  178. package/dist/rules/noMissingSyntax.cjs.map +0 -1
  179. package/dist/rules/noMultiAsterisks.cjs +0 -126
  180. package/dist/rules/noMultiAsterisks.cjs.map +0 -1
  181. package/dist/rules/noRestrictedSyntax.cjs +0 -68
  182. package/dist/rules/noRestrictedSyntax.cjs.map +0 -1
  183. package/dist/rules/noTypes.cjs +0 -101
  184. package/dist/rules/noTypes.cjs.map +0 -1
  185. package/dist/rules/noUndefinedTypes.cjs +0 -616
  186. package/dist/rules/noUndefinedTypes.cjs.map +0 -1
  187. package/dist/rules/normalizeSeeLinks.cjs +0 -271
  188. package/dist/rules/normalizeSeeLinks.cjs.map +0 -1
  189. package/dist/rules/preferImportTag.cjs +0 -362
  190. package/dist/rules/preferImportTag.cjs.map +0 -1
  191. package/dist/rules/requireAsteriskPrefix.cjs +0 -190
  192. package/dist/rules/requireAsteriskPrefix.cjs.map +0 -1
  193. package/dist/rules/requireDescription.cjs +0 -164
  194. package/dist/rules/requireDescription.cjs.map +0 -1
  195. package/dist/rules/requireDescriptionCompleteSentence.cjs +0 -321
  196. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +0 -1
  197. package/dist/rules/requireExample.cjs +0 -136
  198. package/dist/rules/requireExample.cjs.map +0 -1
  199. package/dist/rules/requireFileOverview.cjs +0 -194
  200. package/dist/rules/requireFileOverview.cjs.map +0 -1
  201. package/dist/rules/requireHyphenBeforeParamDescription.cjs +0 -166
  202. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +0 -1
  203. package/dist/rules/requireJsdoc.cjs +0 -721
  204. package/dist/rules/requireJsdoc.cjs.map +0 -1
  205. package/dist/rules/requireParam.cjs +0 -772
  206. package/dist/rules/requireParam.cjs.map +0 -1
  207. package/dist/rules/requireParamDescription.cjs +0 -105
  208. package/dist/rules/requireParamDescription.cjs.map +0 -1
  209. package/dist/rules/requireParamName.cjs +0 -68
  210. package/dist/rules/requireParamName.cjs.map +0 -1
  211. package/dist/rules/requireParamType.cjs +0 -104
  212. package/dist/rules/requireParamType.cjs.map +0 -1
  213. package/dist/rules/requireProperty.cjs +0 -63
  214. package/dist/rules/requireProperty.cjs.map +0 -1
  215. package/dist/rules/requirePropertyDescription.cjs +0 -29
  216. package/dist/rules/requirePropertyDescription.cjs.map +0 -1
  217. package/dist/rules/requirePropertyName.cjs +0 -29
  218. package/dist/rules/requirePropertyName.cjs.map +0 -1
  219. package/dist/rules/requirePropertyType.cjs +0 -29
  220. package/dist/rules/requirePropertyType.cjs.map +0 -1
  221. package/dist/rules/requireRejects.cjs +0 -226
  222. package/dist/rules/requireRejects.cjs.map +0 -1
  223. package/dist/rules/requireReturns.cjs +0 -262
  224. package/dist/rules/requireReturns.cjs.map +0 -1
  225. package/dist/rules/requireReturnsCheck.cjs +0 -225
  226. package/dist/rules/requireReturnsCheck.cjs.map +0 -1
  227. package/dist/rules/requireReturnsDescription.cjs +0 -72
  228. package/dist/rules/requireReturnsDescription.cjs.map +0 -1
  229. package/dist/rules/requireReturnsType.cjs +0 -68
  230. package/dist/rules/requireReturnsType.cjs.map +0 -1
  231. package/dist/rules/requireTags.cjs +0 -74
  232. package/dist/rules/requireTags.cjs.map +0 -1
  233. package/dist/rules/requireTemplate.cjs +0 -220
  234. package/dist/rules/requireTemplate.cjs.map +0 -1
  235. package/dist/rules/requireThrows.cjs +0 -118
  236. package/dist/rules/requireThrows.cjs.map +0 -1
  237. package/dist/rules/requireYields.cjs +0 -224
  238. package/dist/rules/requireYields.cjs.map +0 -1
  239. package/dist/rules/requireYieldsCheck.cjs +0 -179
  240. package/dist/rules/requireYieldsCheck.cjs.map +0 -1
  241. package/dist/rules/sortTags.cjs +0 -656
  242. package/dist/rules/sortTags.cjs.map +0 -1
  243. package/dist/rules/tagLines.cjs +0 -374
  244. package/dist/rules/tagLines.cjs.map +0 -1
  245. package/dist/rules/textEscaping.cjs +0 -141
  246. package/dist/rules/textEscaping.cjs.map +0 -1
  247. package/dist/rules/tsMethodSignatureStyle.cjs +0 -240
  248. package/dist/rules/tsMethodSignatureStyle.cjs.map +0 -1
  249. package/dist/rules/tsNoEmptyObjectType.cjs +0 -62
  250. package/dist/rules/tsNoEmptyObjectType.cjs.map +0 -1
  251. package/dist/rules/tsNoUnnecessaryTemplateExpression.cjs +0 -104
  252. package/dist/rules/tsNoUnnecessaryTemplateExpression.cjs.map +0 -1
  253. package/dist/rules/tsPreferFunctionType.cjs +0 -110
  254. package/dist/rules/tsPreferFunctionType.cjs.map +0 -1
  255. package/dist/rules/typeFormatting.cjs +0 -607
  256. package/dist/rules/typeFormatting.cjs.map +0 -1
  257. package/dist/rules/validTypes.cjs +0 -324
  258. package/dist/rules/validTypes.cjs.map +0 -1
  259. package/dist/tagNames.cjs +0 -244
  260. package/dist/tagNames.cjs.map +0 -1
  261. package/dist/to-valid-identifier.cjs +0 -263
  262. package/dist/utils/hasReturnValue.cjs +0 -495
  263. package/dist/utils/hasReturnValue.cjs.map +0 -1
  264. package/rollup.config.js +0 -16
  265. package/src/getJsdocProcessorPlugin.cts +0 -5
  266. package/src/index-cjs.js +0 -760
  267. package/src/index-esm.js +0 -196
  268. package/src/index.cjs.cts +0 -3
  269. package/src/iterateJsdoc.cts +0 -7
@@ -1 +0,0 @@
1
- {"version":3,"file":"sortTags.cjs","names":["iterateJsdoc","defaultTagOrder"],"sources":["../../src/rules/sortTags.js"],"sourcesContent":["import defaultTagOrder from '../defaultTagOrder.js';\nimport iterateJsdoc from '../iterateJsdoc.js';\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n// eslint-disable-next-line complexity -- Temporary\n}) => {\n const\n /**\n * @type {{\n * linesBetween: import('../iterateJsdoc.js').Integer,\n * tagExceptions: Record<string, number>,\n * tagSequence: {\n * tags: string[]\n * }[],\n * alphabetizeExtras: boolean,\n * reportTagGroupSpacing: boolean,\n * reportIntraTagGroupSpacing: boolean,\n * }}\n */ {\n alphabetizeExtras = false,\n linesBetween = 1,\n reportIntraTagGroupSpacing = true,\n reportTagGroupSpacing = true,\n tagExceptions = {},\n tagSequence = defaultTagOrder,\n } = context.options[0] || {};\n\n const tagList = tagSequence.flatMap((obj) => {\n /* typeof obj === 'string' ? obj : */\n return obj.tags;\n });\n\n const otherPos = tagList.indexOf('-other');\n const endPos = otherPos > -1 ? otherPos : tagList.length;\n\n let ongoingCount = 0;\n for (const [\n idx,\n tag,\n ] of\n /**\n * @type {(\n * import('@es-joy/jsdoccomment').JsdocTagWithInline & {\n * originalIndex: import('../iterateJsdoc.js').Integer,\n * originalLine: import('../iterateJsdoc.js').Integer,\n * }\n * )[]}\n */ (jsdoc.tags).entries()) {\n tag.originalIndex = idx;\n ongoingCount += tag.source.length;\n tag.originalLine = ongoingCount;\n }\n\n /** @type {import('../iterateJsdoc.js').Integer|undefined} */\n let firstChangedTagLine;\n /** @type {import('../iterateJsdoc.js').Integer|undefined} */\n let firstChangedTagIndex;\n\n /**\n * @type {(import('comment-parser').Spec & {\n * originalIndex: import('../iterateJsdoc.js').Integer,\n * originalLine: import('../iterateJsdoc.js').Integer,\n * })[]}\n */\n const sortedTags = JSON.parse(JSON.stringify(jsdoc.tags));\n sortedTags.sort(({\n tag: tagNew,\n }, {\n originalIndex,\n originalLine,\n tag: tagOld,\n }) => {\n // Optimize: Just keep relative positions if the same tag name\n if (tagNew === tagOld) {\n return 0;\n }\n\n const checkOrSetFirstChanged = () => {\n if (!firstChangedTagLine || originalLine < firstChangedTagLine) {\n firstChangedTagLine = originalLine;\n firstChangedTagIndex = originalIndex;\n }\n };\n\n const newPos = tagList.indexOf(tagNew);\n const oldPos = tagList.indexOf(tagOld);\n\n const preferredNewPos = newPos === -1 ? endPos : newPos;\n const preferredOldPos = oldPos === -1 ? endPos : oldPos;\n\n if (preferredNewPos < preferredOldPos) {\n checkOrSetFirstChanged();\n return -1;\n }\n\n if (preferredNewPos > preferredOldPos) {\n return 1;\n }\n\n // preferredNewPos === preferredOldPos\n if (\n !alphabetizeExtras ||\n\n // Optimize: If tagNew (or tagOld which is the same) was found in the\n // priority array, it can maintain its relative position—without need\n // of alphabetizing (secondary sorting)\n newPos >= 0\n ) {\n return 0;\n }\n\n if (tagNew < tagOld) {\n checkOrSetFirstChanged();\n return -1;\n }\n\n // tagNew > tagOld\n return 1;\n });\n\n if (firstChangedTagLine === undefined) {\n // Should be ordered by now\n\n /**\n * @type {import('comment-parser').Spec[]}\n */\n const lastTagsOfGroup = [];\n\n /**\n * @type {[\n * import('comment-parser').Spec,\n * import('../iterateJsdoc.js').Integer\n * ][]}\n */\n const badLastTagsOfGroup = [];\n\n /**\n * @param {import('comment-parser').Spec} tag\n */\n const countTagEmptyLines = (tag) => {\n return tag.source.reduce((acc, {\n tokens: {\n description,\n end,\n name,\n tag: tg,\n type,\n },\n }) => {\n const empty = !tg && !type && !name && !description;\n // Reset the count so long as there is content\n return empty ? acc + Number(empty && !end) : 0;\n }, 0);\n };\n\n let idx = 0;\n for (const {\n tags,\n } of tagSequence) {\n let innerIdx;\n /** @type {import('comment-parser').Spec} */\n let currentTag;\n /** @type {import('comment-parser').Spec|undefined} */\n let lastTag;\n do {\n currentTag = jsdoc.tags[idx];\n if (!currentTag) {\n idx++;\n break;\n }\n\n innerIdx = tags.indexOf(currentTag.tag);\n\n if (\n innerIdx === -1 &&\n // eslint-disable-next-line no-loop-func -- Safe\n (!tags.includes('-other') || tagSequence.some(({\n tags: tgs,\n }) => {\n return tgs.includes(currentTag.tag);\n }))\n ) {\n idx++;\n break;\n }\n\n lastTag = currentTag;\n\n idx++;\n } while (true);\n\n idx--;\n\n if (lastTag) {\n lastTagsOfGroup.push(lastTag);\n const ct = countTagEmptyLines(lastTag);\n if (\n ct !== linesBetween &&\n // Use another rule for adding to end (should be of interest outside this rule)\n jsdoc.tags[idx]\n ) {\n badLastTagsOfGroup.push([\n lastTag, ct,\n ]);\n }\n }\n }\n\n if (reportTagGroupSpacing && badLastTagsOfGroup.length) {\n /**\n * @param {import('comment-parser').Spec} tg\n * @returns {() => void}\n */\n const fixer = (tg) => {\n return () => {\n // Due to https://github.com/syavorsky/comment-parser/issues/110 ,\n // we have to modify `jsdoc.source` rather than just modify tags\n // directly\n for (const [\n currIdx,\n {\n tokens,\n },\n ] of jsdoc.source.entries()) {\n if (tokens.tag !== '@' + tg.tag) {\n continue;\n }\n\n // Cannot be `tokens.end`, as dropped off last tag, so safe to\n // go on\n let newIdx = currIdx;\n\n const emptyLine = () => {\n return {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '*',\n start: jsdoc.source[newIdx - 1].tokens.start,\n }),\n };\n };\n\n let existingEmptyLines = 0;\n while (true) {\n const nextTokens = jsdoc.source[++newIdx]?.tokens;\n\n /* c8 ignore next 3 -- Guard */\n if (!nextTokens) {\n return;\n }\n\n // Should be no `nextTokens.end` to worry about since ignored\n // if not followed by tag\n\n if (nextTokens.tag) {\n // Haven't made it to last tag instance yet, so keep looking\n if (nextTokens.tag === tokens.tag) {\n existingEmptyLines = 0;\n continue;\n }\n\n const lineDiff = linesBetween - existingEmptyLines;\n if (lineDiff > 0) {\n const lines = Array.from({\n length: lineDiff,\n }, () => {\n return emptyLine();\n });\n jsdoc.source.splice(newIdx, 0, ...lines);\n } else {\n // lineDiff < 0\n jsdoc.source.splice(\n newIdx + lineDiff,\n -lineDiff,\n );\n }\n\n break;\n }\n\n const empty = !nextTokens.type && !nextTokens.name &&\n !nextTokens.description;\n\n if (empty) {\n existingEmptyLines++;\n } else {\n // Has content again, so reset empty line count\n existingEmptyLines = 0;\n }\n }\n\n break;\n }\n\n for (const [\n srcIdx,\n src,\n ] of jsdoc.source.entries()) {\n src.number = srcIdx;\n }\n };\n };\n\n for (const [\n tg,\n ] of badLastTagsOfGroup) {\n utils.reportJSDoc(\n 'Tag groups do not have the expected whitespace',\n tg,\n fixer(tg),\n );\n }\n\n return;\n }\n\n if (!reportIntraTagGroupSpacing) {\n return;\n }\n\n for (const [\n tagIdx,\n tag,\n ] of jsdoc.tags.entries()) {\n if (!jsdoc.tags[tagIdx + 1] || lastTagsOfGroup.includes(tag)) {\n continue;\n }\n\n const ct = countTagEmptyLines(tag);\n if (ct && (!tagExceptions[tag.tag] || tagExceptions[tag.tag] < ct)) {\n const fixer = () => {\n let foundFirstTag = false;\n\n /** @type {string|undefined} */\n let currentTag;\n\n for (const [\n currIdx,\n {\n tokens: {\n description,\n end,\n name,\n tag: tg,\n type,\n },\n },\n ] of jsdoc.source.entries()) {\n if (tg) {\n foundFirstTag = true;\n currentTag = tg;\n }\n\n if (!foundFirstTag) {\n continue;\n }\n\n if (currentTag && !tg && !type && !name && !description && !end) {\n let nextIdx = currIdx;\n\n let ignore = true;\n // Even if a tag of the same name as the last tags in a group,\n // could still be an earlier tag in that group\n\n // eslint-disable-next-line no-loop-func -- Safe\n if (lastTagsOfGroup.some((lastTagOfGroup) => {\n return currentTag === '@' + lastTagOfGroup.tag;\n })) {\n while (true) {\n const nextTokens = jsdoc.source[++nextIdx]?.tokens;\n if (!nextTokens) {\n break;\n }\n\n if (!nextTokens.tag) {\n continue;\n }\n\n // Followed by the same tag name, so not actually last in group,\n // and of interest\n if (nextTokens.tag === currentTag) {\n ignore = false;\n }\n }\n } else {\n while (true) {\n const nextTokens = jsdoc.source[++nextIdx]?.tokens;\n if (!nextTokens || nextTokens.end) {\n break;\n }\n\n // Not the very last tag, so don't ignore\n if (nextTokens.tag) {\n ignore = false;\n break;\n }\n }\n }\n\n if (!ignore) {\n jsdoc.source.splice(currIdx, 1);\n for (const [\n srcIdx,\n src,\n ] of jsdoc.source.entries()) {\n src.number = srcIdx;\n }\n }\n }\n }\n };\n\n utils.reportJSDoc(\n 'Intra-group tags have unexpected whitespace',\n tag,\n fixer,\n );\n }\n }\n\n return;\n }\n\n const firstLine = utils.getFirstLine();\n\n const fix = () => {\n const itemsToMoveRange = [\n ...Array.from({\n length: jsdoc.tags.length -\n /** @type {import('../iterateJsdoc.js').Integer} */ (\n firstChangedTagIndex\n ),\n }).keys(),\n ];\n\n const unchangedPriorTagDescriptions = jsdoc.tags.slice(\n 0,\n firstChangedTagIndex,\n ).reduce((ct, {\n source,\n }) => {\n return ct + source.length - 1;\n }, 0);\n\n // This offset includes not only the offset from where the first tag\n // must begin, and the additional offset of where the first changed\n // tag begins, but it must also account for prior descriptions\n const initialOffset = /** @type {import('../iterateJsdoc.js').Integer} */ (\n firstLine\n ) + /** @type {import('../iterateJsdoc.js').Integer} */ (firstChangedTagIndex) +\n\n // May be the first tag, so don't try finding a prior one if so\n unchangedPriorTagDescriptions;\n\n // Use `firstChangedTagLine` for line number to begin reporting/splicing\n for (const idx of itemsToMoveRange) {\n utils.removeTag(\n idx +\n /** @type {import('../iterateJsdoc.js').Integer} */ (\n firstChangedTagIndex\n ),\n );\n }\n\n const changedTags = sortedTags.slice(firstChangedTagIndex);\n let extraTagCount = 0;\n\n for (const idx of itemsToMoveRange) {\n const changedTag = changedTags[idx];\n\n utils.addTag(\n changedTag.tag,\n extraTagCount + initialOffset + idx,\n {\n ...changedTag.source[0].tokens,\n\n // `comment-parser` puts the `end` within the `tags` section, so\n // avoid adding another to jsdoc.source\n end: '',\n },\n );\n\n for (const {\n tokens,\n } of changedTag.source.slice(1)) {\n if (!tokens.end) {\n utils.addLine(\n extraTagCount + initialOffset + idx + 1,\n {\n ...tokens,\n end: '',\n },\n );\n extraTagCount++;\n }\n }\n }\n };\n\n utils.reportJSDoc(\n `Tags are not in the prescribed order: ${\n tagList.join(', ') || '(alphabetical)'\n }`,\n jsdoc.tags[/** @type {import('../iterateJsdoc.js').Integer} */ (\n firstChangedTagIndex\n )],\n fix,\n true,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Sorts tags by a specified sequence according to tag name, optionally adding line breaks between tag groups.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/sort-tags.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n alphabetizeExtras: {\n description: `Defaults to \\`false\\`. Alphabetizes any items not within \\`tagSequence\\` after any\nitems within \\`tagSequence\\` (or in place of the special \\`-other\\` pseudo-tag)\nare sorted.\n\nIf you want all your tags alphabetized, you can supply an empty array for\n\\`tagSequence\\` along with setting this option to \\`true\\`.`,\n type: 'boolean',\n },\n linesBetween: {\n description: `Indicates the number of lines to be added between tag groups. Defaults to 1.\nDo not set to 0 or 2+ if you are using \\`tag-lines\\` and \\`\"always\"\\` and do not\nset to 1+ if you are using \\`tag-lines\\` and \\`\"never\"\\`.`,\n type: 'integer',\n },\n reportIntraTagGroupSpacing: {\n description: `Whether to enable reporting and fixing of line breaks within tags of a given\ntag group. Defaults to \\`true\\` which will remove any line breaks at the end of\nsuch tags. Do not use with \\`true\\` if you are using \\`tag-lines\\` and \\`always\\`.`,\n type: 'boolean',\n },\n reportTagGroupSpacing: {\n description: `Whether to enable reporting and fixing of line breaks between tag groups\nas set by \\`linesBetween\\`. Defaults to \\`true\\`. Note that the very last tag\nwill not have spacing applied regardless. For adding line breaks there, you\nmay wish to use the \\`endLines\\` option of the \\`tag-lines\\` rule.`,\n type: 'boolean',\n },\n tagExceptions: {\n description: 'Allows specification by tag of a specific higher maximum number of lines. Keys are tags and values are the maximum number of lines allowed for such tags. Overrides `linesBetween`. Defaults to no special exceptions per tag.',\n patternProperties: {\n '.*': {\n type: 'number',\n },\n },\n type: 'object',\n },\n tagSequence: {\n description: `An array of tag group objects indicating the preferred sequence for sorting tags.\n\nEach item in the array should be an object with a \\`tags\\` property set to an array\nof tag names.\n\nTag names earlier in the list will be arranged first. The relative position of\ntags of the same name will not be changed.\n\nEarlier groups will also be arranged before later groups, but with the added\nfeature that additional line breaks may be added between (or before or after)\nsuch groups (depending on the setting of \\`linesBetween\\`).\n\nTag names not in the list will be grouped together at the end. The pseudo-tag\n\\`-other\\` can be used to place them anywhere else if desired. The tags will be\nplaced in their order of appearance, or alphabetized if \\`alphabetizeExtras\\`\nis enabled, see more below about that option.\n\nDefaults to the array below (noting that it is just a single tag group with\nno lines between groups by default).\n\nPlease note that this order is still experimental, so if you want to retain\na fixed order that doesn't change into the future, supply your own\n\\`tagSequence\\`.\n\n\\`\\`\\`js\n[{tags: [\n // Brief descriptions\n 'summary',\n 'typeSummary',\n\n // Module/file-level\n 'module',\n 'exports',\n 'file',\n 'fileoverview',\n 'overview',\n 'import',\n\n // Identifying (name, type)\n 'typedef',\n 'interface',\n 'record',\n 'template',\n 'name',\n 'kind',\n 'type',\n 'alias',\n 'external',\n 'host',\n 'callback',\n 'func',\n 'function',\n 'method',\n 'class',\n 'constructor',\n\n // Relationships\n 'modifies',\n 'mixes',\n 'mixin',\n 'mixinClass',\n 'mixinFunction',\n 'namespace',\n 'borrows',\n 'constructs',\n 'lends',\n 'implements',\n 'requires',\n\n // Long descriptions\n 'desc',\n 'description',\n 'classdesc',\n 'tutorial',\n 'copyright',\n 'license',\n\n // Simple annotations\n 'const',\n 'constant',\n 'final',\n 'global',\n 'readonly',\n 'abstract',\n 'virtual',\n 'var',\n 'member',\n 'memberof',\n 'memberof!',\n 'inner',\n 'instance',\n 'inheritdoc',\n 'inheritDoc',\n 'override',\n 'hideconstructor',\n\n // Core function/object info\n 'param',\n 'arg',\n 'argument',\n 'prop',\n 'property',\n 'return',\n 'returns',\n\n // Important behavior details\n 'async',\n 'generator',\n 'default',\n 'defaultvalue',\n 'enum',\n 'augments',\n 'extends',\n 'throws',\n 'exception',\n 'yield',\n 'yields',\n 'event',\n 'fires',\n 'emits',\n 'listens',\n 'this',\n\n // Access\n 'static',\n 'private',\n 'protected',\n 'public',\n 'access',\n 'package',\n\n '-other',\n\n // Supplementary descriptions\n 'see',\n 'example',\n\n // METADATA\n\n // Other Closure (undocumented) metadata\n 'closurePrimitive',\n 'customElement',\n 'expose',\n 'hidden',\n 'idGenerator',\n 'meaning',\n 'ngInject',\n 'owner',\n 'wizaction',\n\n // Other Closure (documented) metadata\n 'define',\n 'dict',\n 'export',\n 'externs',\n 'implicitCast',\n 'noalias',\n 'nocollapse',\n 'nocompile',\n 'noinline',\n 'nosideeffects',\n 'polymer',\n 'polymerBehavior',\n 'preserve',\n 'struct',\n 'suppress',\n 'unrestricted',\n\n // @homer0/prettier-plugin-jsdoc metadata\n 'category',\n\n // Non-Closure metadata\n 'ignore',\n 'author',\n 'version',\n 'variation',\n 'since',\n 'deprecated',\n 'todo',\n]}];\n\\`\\`\\``,\n items: {\n additionalProperties: false,\n properties: {\n tags: {\n description: 'See description on `tagSequence`.',\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;AAAA;AACA;AAA8C;AAAA,iCAE/B,IAAAA,qBAAY,EAAC,CAAC;EAC3B,OAAO;EACP,KAAK;EACL;EACF;AACA,CAAC,KAAK;EACJ;EACE;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EAAQ;IACF,iBAAiB,GAAG,KAAK;IACzB,YAAY,GAAG,CAAC;IAChB,0BAA0B,GAAG,IAAI;IACjC,qBAAqB,GAAG,IAAI;IAC5B,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAGC;EAChB,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;EAE9B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAE,GAAG,IAAK;IAC3C;IACA,OAAO,GAAG,CAAC,IAAI;EACjB,CAAC,CAAC;EAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;EAC1C,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM;EAExD,IAAI,YAAY,GAAG,CAAC;EACpB,KAAK,MAAM,CACT,GAAG,EACH,GAAG,CACJ;EACC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EAAS,KAAK,CAAC,IAAI,CAAE,OAAO,CAAC,CAAC,EAAE;IAC5B,GAAG,CAAC,aAAa,GAAG,GAAG;IACvB,YAAY,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM;IACjC,GAAG,CAAC,YAAY,GAAG,YAAY;EACjC;;EAEA;EACA,IAAI,mBAAmB;EACvB;EACA,IAAI,oBAAoB;;EAExB;AACF;AACA;AACA;AACA;AACA;EACE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;EACzD,UAAU,CAAC,IAAI,CAAC,CAAC;IACf,GAAG,EAAE;EACP,CAAC,EAAE;IACD,aAAa;IACb,YAAY;IACZ,GAAG,EAAE;EACP,CAAC,KAAK;IACJ;IACA,IAAI,MAAM,KAAK,MAAM,EAAE;MACrB,OAAO,CAAC;IACV;IAEA,MAAM,sBAAsB,GAAG,MAAM;MACnC,IAAI,CAAC,mBAAmB,IAAI,YAAY,GAAG,mBAAmB,EAAE;QAC9D,mBAAmB,GAAG,YAAY;QAClC,oBAAoB,GAAG,aAAa;MACtC;IACF,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IAEtC,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM;IACvD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM;IAEvD,IAAI,eAAe,GAAG,eAAe,EAAE;MACrC,sBAAsB,CAAC,CAAC;MACxB,OAAO,CAAC,CAAC;IACX;IAEA,IAAI,eAAe,GAAG,eAAe,EAAE;MACrC,OAAO,CAAC;IACV;;IAEA;IACA,IACE,CAAC,iBAAiB;IAElB;IACA;IACA;IACA,MAAM,IAAI,CAAC,EACX;MACA,OAAO,CAAC;IACV;IAEA,IAAI,MAAM,GAAG,MAAM,EAAE;MACnB,sBAAsB,CAAC,CAAC;MACxB,OAAO,CAAC,CAAC;IACX;;IAEA;IACA,OAAO,CAAC;EACV,CAAC,CAAC;EAEF,IAAI,mBAAmB,KAAK,SAAS,EAAE;IACrC;;IAEA;AACJ;AACA;IACI,MAAM,eAAe,GAAG,EAAE;;IAE1B;AACJ;AACA;AACA;AACA;AACA;IACI,MAAM,kBAAkB,GAAG,EAAE;;IAE7B;AACJ;AACA;IACI,MAAM,kBAAkB,GAAI,GAAG,IAAK;MAClC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;QAC7B,MAAM,EAAE;UACN,WAAW;UACX,GAAG;UACH,IAAI;UACJ,GAAG,EAAE,EAAE;UACP;QACF;MACF,CAAC,KAAK;QACJ,MAAM,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW;QACnD;QACA,OAAO,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;MAChD,CAAC,EAAE,CAAC,CAAC;IACP,CAAC;IAED,IAAI,GAAG,GAAG,CAAC;IACX,KAAK,MAAM;MACT;IACF,CAAC,IAAI,WAAW,EAAE;MAChB,IAAI,QAAQ;MACZ;MACA,IAAI,UAAU;MACd;MACA,IAAI,OAAO;MACX,GAAG;QACD,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5B,IAAI,CAAC,UAAU,EAAE;UACf,GAAG,EAAE;UACL;QACF;QAEA,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAEvC,IACE,QAAQ,KAAK,CAAC,CAAC;QACf;QACC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;UAC7C,IAAI,EAAE;QACR,CAAC,KAAK;UACJ,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QACrC,CAAC,CAAC,CAAC,EACH;UACA,GAAG,EAAE;UACL;QACF;QAEA,OAAO,GAAG,UAAU;QAEpB,GAAG,EAAE;MACP,CAAC,QAAQ,IAAI;MAEb,GAAG,EAAE;MAEL,IAAI,OAAO,EAAE;QACX,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC;QACtC,IACE,EAAE,KAAK,YAAY;QACnB;QACA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EACf;UACA,kBAAkB,CAAC,IAAI,CAAC,CACtB,OAAO,EAAE,EAAE,CACZ,CAAC;QACJ;MACF;IACF;IAEA,IAAI,qBAAqB,IAAI,kBAAkB,CAAC,MAAM,EAAE;MACtD;AACN;AACA;AACA;MACM,MAAM,KAAK,GAAI,EAAE,IAAK;QACpB,OAAO,MAAM;UACX;UACA;UACA;UACA,KAAK,MAAM,CACT,OAAO,EACP;YACE;UACF,CAAC,CACF,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YAC3B,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE;cAC/B;YACF;;YAEA;YACA;YACA,IAAI,MAAM,GAAG,OAAO;YAEpB,MAAM,SAAS,GAAG,MAAM;cACtB,OAAO;gBACL,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC;kBACvB,SAAS,EAAE,GAAG;kBACd,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzC,CAAC;cACH,CAAC;YACH,CAAC;YAED,IAAI,kBAAkB,GAAG,CAAC;YAC1B,OAAO,IAAI,EAAE;cACX,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM;;cAEjD;cACA,IAAI,CAAC,UAAU,EAAE;gBACf;cACF;;cAEA;cACA;;cAEA,IAAI,UAAU,CAAC,GAAG,EAAE;gBAClB;gBACA,IAAI,UAAU,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE;kBACjC,kBAAkB,GAAG,CAAC;kBACtB;gBACF;gBAEA,MAAM,QAAQ,GAAG,YAAY,GAAG,kBAAkB;gBAClD,IAAI,QAAQ,GAAG,CAAC,EAAE;kBAChB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;oBACvB,MAAM,EAAE;kBACV,CAAC,EAAE,MAAM;oBACP,OAAO,SAAS,CAAC,CAAC;kBACpB,CAAC,CAAC;kBACF,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;gBAC1C,CAAC,MAAM;kBACL;kBACA,KAAK,CAAC,MAAM,CAAC,MAAM,CACjB,MAAM,GAAG,QAAQ,EACjB,CAAC,QACH,CAAC;gBACH;gBAEA;cACF;cAEA,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAChD,CAAC,UAAU,CAAC,WAAW;cAEzB,IAAI,KAAK,EAAE;gBACT,kBAAkB,EAAE;cACtB,CAAC,MAAM;gBACL;gBACA,kBAAkB,GAAG,CAAC;cACxB;YACF;YAEA;UACF;UAEA,KAAK,MAAM,CACT,MAAM,EACN,GAAG,CACJ,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YAC3B,GAAG,CAAC,MAAM,GAAG,MAAM;UACrB;QACF,CAAC;MACH,CAAC;MAED,KAAK,MAAM,CACT,EAAE,CACH,IAAI,kBAAkB,EAAE;QACvB,KAAK,CAAC,WAAW,CACf,gDAAgD,EAChD,EAAE,EACF,KAAK,CAAC,EAAE,CACV,CAAC;MACH;MAEA;IACF;IAEA,IAAI,CAAC,0BAA0B,EAAE;MAC/B;IACF;IAEA,KAAK,MAAM,CACT,MAAM,EACN,GAAG,CACJ,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE;MACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC5D;MACF;MAEA,MAAM,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC;MAClC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE;QAClE,MAAM,KAAK,GAAG,MAAM;UAClB,IAAI,aAAa,GAAG,KAAK;;UAEzB;UACA,IAAI,UAAU;UAEd,KAAK,MAAM,CACT,OAAO,EACP;YACE,MAAM,EAAE;cACN,WAAW;cACX,GAAG;cACH,IAAI;cACJ,GAAG,EAAE,EAAE;cACP;YACF;UACF,CAAC,CACF,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;YAC3B,IAAI,EAAE,EAAE;cACN,aAAa,GAAG,IAAI;cACpB,UAAU,GAAG,EAAE;YACjB;YAEA,IAAI,CAAC,aAAa,EAAE;cAClB;YACF;YAEA,IAAI,UAAU,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE;cAC/D,IAAI,OAAO,GAAG,OAAO;cAErB,IAAI,MAAM,GAAG,IAAI;cACjB;cACA;;cAEA;cACA,IAAI,eAAe,CAAC,IAAI,CAAE,cAAc,IAAK;gBAC3C,OAAO,UAAU,KAAK,GAAG,GAAG,cAAc,CAAC,GAAG;cAChD,CAAC,CAAC,EAAE;gBACF,OAAO,IAAI,EAAE;kBACX,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM;kBAClD,IAAI,CAAC,UAAU,EAAE;oBACf;kBACF;kBAEA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;oBACnB;kBACF;;kBAEA;kBACA;kBACA,IAAI,UAAU,CAAC,GAAG,KAAK,UAAU,EAAE;oBACjC,MAAM,GAAG,KAAK;kBAChB;gBACF;cACF,CAAC,MAAM;gBACL,OAAO,IAAI,EAAE;kBACX,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM;kBAClD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,GAAG,EAAE;oBACjC;kBACF;;kBAEA;kBACA,IAAI,UAAU,CAAC,GAAG,EAAE;oBAClB,MAAM,GAAG,KAAK;oBACd;kBACF;gBACF;cACF;cAEA,IAAI,CAAC,MAAM,EAAE;gBACX,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/B,KAAK,MAAM,CACT,MAAM,EACN,GAAG,CACJ,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE;kBAC3B,GAAG,CAAC,MAAM,GAAG,MAAM;gBACrB;cACF;YACF;UACF;QACF,CAAC;QAED,KAAK,CAAC,WAAW,CACf,6CAA6C,EAC7C,GAAG,EACH,KACF,CAAC;MACH;IACF;IAEA;EACF;EAEA,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;EAEtC,MAAM,GAAG,GAAG,MAAM;IAChB,MAAM,gBAAgB,GAAG,CACvB,GAAG,KAAK,CAAC,IAAI,CAAC;MACZ,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IACzB;MACE,oBAAoB;IAExB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CACV;IAED,MAAM,6BAA6B,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CACpD,CAAC,EACD,oBACF,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE;MACZ;IACF,CAAC,KAAK;MACJ,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;IAC/B,CAAC,EAAE,CAAC,CAAC;;IAEL;IACA;IACA;IACA,MAAM,aAAa,GAAG,mDACpB,SAAS,IACP,mDAAqD,oBAAoB,CAAC;IAE5E;IACA,6BAA6B;;IAE/B;IACA,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE;MAClC,KAAK,CAAC,SAAS,CACb,GAAG,IACH;MACE,oBAAoB,CAExB,CAAC;IACH;IAEA,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC;IAC1D,IAAI,aAAa,GAAG,CAAC;IAErB,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE;MAClC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC;MAEnC,KAAK,CAAC,MAAM,CACV,UAAU,CAAC,GAAG,EACd,aAAa,GAAG,aAAa,GAAG,GAAG,EACnC;QACE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;QAE9B;QACA;QACA,GAAG,EAAE;MACP,CACF,CAAC;MAED,KAAK,MAAM;QACT;MACF,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;UACf,KAAK,CAAC,OAAO,CACX,aAAa,GAAG,aAAa,GAAG,GAAG,GAAG,CAAC,EACvC;YACE,GAAG,MAAM;YACT,GAAG,EAAE;UACP,CACF,CAAC;UACD,aAAa,EAAE;QACjB;MACF;IACF;EACF,CAAC;EAED,KAAK,CAAC,WAAW,CACf,yCACE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,EACtC,EACF,KAAK,CAAC,IAAI,EAAC;EACT,oBAAoB,EACpB,EACF,GAAG,EACH,IACF,CAAC;AACH,CAAC,EAAE;EACD,gBAAgB,EAAE,IAAI;EACtB,IAAI,EAAE;IACJ,IAAI,EAAE;MACJ,WAAW,EAAE,6GAA6G;MAC1H,GAAG,EAAE;IACP,CAAC;IACD,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,CACN;MACE,oBAAoB,EAAE,KAAK;MAC3B,UAAU,EAAE;QACV,iBAAiB,EAAE;UACjB,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA,4DAA4D;UAChD,IAAI,EAAE;QACR,CAAC;QACD,YAAY,EAAE;UACZ,WAAW,EAAE;AACzB;AACA,0DAA0D;UAC9C,IAAI,EAAE;QACR,CAAC;QACD,0BAA0B,EAAE;UAC1B,WAAW,EAAE;AACzB;AACA,mFAAmF;UACvE,IAAI,EAAE;QACR,CAAC;QACD,qBAAqB,EAAE;UACrB,WAAW,EAAE;AACzB;AACA;AACA,mEAAmE;UACvD,IAAI,EAAE;QACR,CAAC;QACD,aAAa,EAAE;UACb,WAAW,EAAE,gOAAgO;UAC7O,iBAAiB,EAAE;YACjB,IAAI,EAAE;cACJ,IAAI,EAAE;YACR;UACF,CAAC;UACD,IAAI,EAAE;QACR,CAAC;QACD,WAAW,EAAE;UACX,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;UACK,KAAK,EAAE;YACL,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;cACV,IAAI,EAAE;gBACJ,WAAW,EAAE,mCAAmC;gBAChD,KAAK,EAAE;kBACL,IAAI,EAAE;gBACR,CAAC;gBACD,IAAI,EAAE;cACR;YACF,CAAC;YACD,IAAI,EAAE;UACR,CAAC;UACD,IAAI,EAAE;QACR;MACF,CAAC;MACD,IAAI,EAAE;IACR,CAAC,CACF;IACD,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAA","ignoreList":[]}
@@ -1,374 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- /**
10
- * @param {{
11
- * maxBlockLines: null|number,
12
- * startLines: null|number,
13
- * utils: import('../iterateJsdoc.js').Utils
14
- * }} cfg
15
- */
16
- const checkMaxBlockLines = ({
17
- maxBlockLines,
18
- startLines,
19
- utils
20
- }) => {
21
- if (typeof maxBlockLines !== 'number') {
22
- return false;
23
- }
24
- if (typeof startLines === 'number' && maxBlockLines < startLines) {
25
- utils.reportJSDoc('If set to a number, `maxBlockLines` must be greater than or equal to `startLines`.');
26
- return true;
27
- }
28
- const {
29
- description
30
- } = utils.getDescription();
31
- const excessBlockLinesRegex = new RegExp('\n{' + (maxBlockLines + 2) + ',}', 'v');
32
- const excessBlockLinesMatch = description.match(excessBlockLinesRegex);
33
- const excessBlockLines = excessBlockLinesMatch?.[0]?.length ?? 0;
34
- if (excessBlockLinesMatch) {
35
- const excessIndexLine = description.slice(0, excessBlockLinesMatch.index).match(/\n/gv)?.length ?? 0;
36
- utils.reportJSDoc(`Expected a maximum of ${maxBlockLines} line${maxBlockLines === 1 ? '' : 's'} within block description`, {
37
- line: excessIndexLine
38
- }, () => {
39
- utils.setBlockDescription((info, seedTokens, descLines, postDelims) => {
40
- const newPostDelims = [...postDelims.slice(0, excessIndexLine), ...postDelims.slice(excessIndexLine + excessBlockLines - 1 - maxBlockLines)];
41
- return [...descLines.slice(0, excessIndexLine), ...descLines.slice(excessIndexLine + excessBlockLines - 1 - maxBlockLines)].map((desc, idx) => {
42
- return {
43
- number: 0,
44
- source: '',
45
- tokens: seedTokens({
46
- ...info,
47
- description: desc,
48
- postDelimiter: newPostDelims[idx]
49
- })
50
- };
51
- });
52
- });
53
- });
54
- return true;
55
- }
56
- return false;
57
- };
58
- var _default = exports.default = (0, _iterateJsdoc.default)(({
59
- context,
60
- jsdoc,
61
- utils
62
- }) => {
63
- const [alwaysNever = 'never', {
64
- applyToEndTag = true,
65
- count = 1,
66
- endLines = 0,
67
- maxBlockLines = null,
68
- startLines = 0,
69
- startLinesWithNoTags = null,
70
- tags = {}
71
- } = {}] = context.options;
72
- jsdoc.tags.some((tg, tagIdx) => {
73
- let lastTag;
74
-
75
- /**
76
- * @type {null|import('../iterateJsdoc.js').Integer}
77
- */
78
- let lastEmpty = null;
79
-
80
- /**
81
- * @type {null|import('../iterateJsdoc.js').Integer}
82
- */
83
- let reportIndex = null;
84
- let emptyLinesCount = 0;
85
- for (const [idx, {
86
- tokens: {
87
- description,
88
- end,
89
- name,
90
- tag,
91
- type
92
- }
93
- }] of tg.source.entries()) {
94
- // May be text after a line break within a tag description
95
- if (description) {
96
- reportIndex = null;
97
- }
98
- if (lastTag && ['always', 'any'].includes(tags[lastTag.slice(1)]?.lines)) {
99
- continue;
100
- }
101
- const empty = !tag && !name && !type && !description;
102
- if (empty && !end && (alwaysNever === 'never' || lastTag && tags[lastTag.slice(1)]?.lines === 'never')) {
103
- reportIndex = idx;
104
- continue;
105
- }
106
- if (!end) {
107
- if (empty) {
108
- emptyLinesCount++;
109
- } else {
110
- emptyLinesCount = 0;
111
- }
112
- lastEmpty = empty ? idx : null;
113
- }
114
- lastTag = tag;
115
- }
116
- if (typeof endLines === 'number' && lastEmpty !== null && tagIdx === jsdoc.tags.length - 1) {
117
- const lineDiff = endLines - emptyLinesCount;
118
- if (lineDiff < 0) {
119
- const fixer = () => {
120
- utils.removeTag(tagIdx, {
121
- tagSourceOffset: /** @type {import('../iterateJsdoc.js').Integer} */lastEmpty + lineDiff + 1
122
- });
123
- };
124
- utils.reportJSDoc(`Expected ${endLines} trailing lines`, {
125
- line: tg.source[lastEmpty].number + lineDiff + 1
126
- }, fixer);
127
- } else if (lineDiff > 0) {
128
- const fixer = () => {
129
- utils.addLines(tagIdx, /** @type {import('../iterateJsdoc.js').Integer} */lastEmpty, endLines - emptyLinesCount);
130
- };
131
- utils.reportJSDoc(`Expected ${endLines} trailing lines`, {
132
- line: tg.source[lastEmpty].number
133
- }, fixer);
134
- }
135
- return true;
136
- }
137
- if (reportIndex !== null) {
138
- const fixer = () => {
139
- utils.removeTag(tagIdx, {
140
- tagSourceOffset: (/** @type {import('../iterateJsdoc.js').Integer} */
141
- reportIndex)
142
- });
143
- };
144
- utils.reportJSDoc('Expected no lines between tags', {
145
- line: tg.source[0].number + 1
146
- }, fixer);
147
- return true;
148
- }
149
- return false;
150
- });
151
- (applyToEndTag ? jsdoc.tags : jsdoc.tags.slice(0, -1)).some((tg, tagIdx) => {
152
- /**
153
- * @type {{
154
- * idx: import('../iterateJsdoc.js').Integer,
155
- * number: import('../iterateJsdoc.js').Integer
156
- * }[]}
157
- */
158
- const lines = [];
159
- let currentTag;
160
- let tagSourceIdx = 0;
161
- for (const [idx, {
162
- number,
163
- tokens: {
164
- description,
165
- end,
166
- name,
167
- tag,
168
- type
169
- }
170
- }] of tg.source.entries()) {
171
- if (description) {
172
- lines.splice(0);
173
- tagSourceIdx = idx;
174
- }
175
- if (tag) {
176
- currentTag = tag;
177
- }
178
- if (!tag && !name && !type && !description && !end) {
179
- lines.push({
180
- idx,
181
- number
182
- });
183
- }
184
- }
185
- const currentTg = currentTag && tags[currentTag.slice(1)];
186
- const tagCount = currentTg?.count;
187
- const defaultAlways = alwaysNever === 'always' && currentTg?.lines !== 'never' && currentTg?.lines !== 'any' && lines.length < count;
188
- let overrideAlways;
189
- let fixCount = count;
190
- if (!defaultAlways) {
191
- fixCount = typeof tagCount === 'number' ? tagCount : count;
192
- overrideAlways = currentTg?.lines === 'always' && lines.length < fixCount;
193
- }
194
- if (defaultAlways || overrideAlways) {
195
- const fixer = () => {
196
- utils.addLines(tagIdx, lines[lines.length - 1]?.idx || tagSourceIdx + 1, fixCount - lines.length);
197
- };
198
- const line = lines[lines.length - 1]?.number || tg.source[tagSourceIdx].number;
199
- utils.reportJSDoc(`Expected ${fixCount} line${fixCount === 1 ? '' : 's'} between tags but found ${lines.length}`, {
200
- line
201
- }, fixer);
202
- return true;
203
- }
204
- return false;
205
- });
206
- if (checkMaxBlockLines({
207
- maxBlockLines,
208
- startLines,
209
- utils
210
- })) {
211
- return;
212
- }
213
- if (typeof startLines === 'number' || typeof startLinesWithNoTags === 'number') {
214
- const noTags = !jsdoc.tags.length;
215
- if (noTags && startLinesWithNoTags === null) {
216
- return;
217
- }
218
- const {
219
- description,
220
- lastDescriptionLine
221
- } = utils.getDescription();
222
- if (!/\S/v.test(description)) {
223
- return;
224
- }
225
- const startingLines = noTags ? startLinesWithNoTags : startLines;
226
- const trailingLines = description.match(/\n+$/v)?.[0]?.length;
227
- const trailingDiff = (trailingLines ?? 0) - startingLines;
228
- if (trailingDiff > 0) {
229
- utils.reportJSDoc(`Expected only ${startingLines} line${startingLines === 1 ? '' : 's'} after block description`, {
230
- line: lastDescriptionLine - trailingDiff
231
- }, () => {
232
- utils.setBlockDescription((info, seedTokens, descLines, postDelims) => {
233
- return descLines.slice(0, -trailingDiff).map((desc, idx) => {
234
- return {
235
- number: 0,
236
- source: '',
237
- tokens: seedTokens({
238
- ...info,
239
- description: desc,
240
- postDelimiter: postDelims[idx]
241
- })
242
- };
243
- });
244
- });
245
- });
246
- } else if (trailingDiff < 0) {
247
- utils.reportJSDoc(`Expected ${startingLines} lines after block description`, {
248
- line: lastDescriptionLine
249
- }, () => {
250
- utils.setBlockDescription((info, seedTokens, descLines, postDelims) => {
251
- return [...descLines, ...Array.from({
252
- length: -trailingDiff
253
- }, () => {
254
- return '';
255
- })].map((desc, idx) => {
256
- return {
257
- number: 0,
258
- source: '',
259
- tokens: seedTokens({
260
- ...info,
261
- description: desc,
262
- postDelimiter: desc.trim() ? postDelims[idx] : ''
263
- })
264
- };
265
- });
266
- });
267
- });
268
- }
269
- }
270
- }, {
271
- iterateAllJsdocs: true,
272
- meta: {
273
- docs: {
274
- description: 'Enforces lines (or no lines) before, after, or between tags.',
275
- url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/tag-lines.md#repos-sticky-header'
276
- },
277
- fixable: 'code',
278
- schema: [{
279
- description: `Defaults to "never". "any" is only useful with \`tags\` (allowing non-enforcement of lines except
280
- for particular tags) or with \`startLines\`, \`startLinesWithNoTags\` \`endLines\`, or \`maxBlockLines\`. It is also
281
- necessary if using the linebreak-setting options of the \`sort-tags\` rule
282
- so that the two rules won't conflict in both attempting to set lines
283
- between tags.`,
284
- enum: ['always', 'any', 'never'],
285
- type: 'string'
286
- }, {
287
- additionalProperties: false,
288
- properties: {
289
- applyToEndTag: {
290
- description: `Set to \`false\` and use with "always" to indicate the normal lines to be
291
- added after tags should not be added after the final tag.
292
-
293
- Defaults to \`true\`.`,
294
- type: 'boolean'
295
- },
296
- count: {
297
- description: `Use with "always" to indicate the number of lines to require be present.
298
-
299
- Defaults to 1.`,
300
- type: 'integer'
301
- },
302
- endLines: {
303
- anyOf: [{
304
- type: 'integer'
305
- }, {
306
- type: 'null'
307
- }],
308
- description: `If not set to \`null\`, will enforce end lines to the given count on the
309
- final tag only.
310
-
311
- Defaults to \`0\`.`
312
- },
313
- maxBlockLines: {
314
- anyOf: [{
315
- type: 'integer'
316
- }, {
317
- type: 'null'
318
- }],
319
- description: `If not set to \`null\`, will enforce a maximum number of lines to the given count anywhere in the block description.
320
-
321
- Note that if non-\`null\`, \`maxBlockLines\` must be greater than or equal to \`startLines\`.
322
-
323
- Defaults to \`null\`.`
324
- },
325
- startLines: {
326
- anyOf: [{
327
- type: 'integer'
328
- }, {
329
- type: 'null'
330
- }],
331
- description: `If not set to \`null\`, will enforce end lines to the given count before the
332
- first tag only, unless there is only whitespace content, in which case,
333
- a line count will not be enforced.
334
-
335
- Defaults to \`0\`.`
336
- },
337
- startLinesWithNoTags: {
338
- description: 'If set to a number, will enforce a starting lines count when there are no tags. Defaults to `undefined`.',
339
- type: 'number'
340
- },
341
- tags: {
342
- description: `Overrides the default behavior depending on specific tags.
343
-
344
- An object whose keys are tag names and whose values are objects with the
345
- following keys:
346
-
347
- 1. \`lines\` - Set to \`always\`, \`never\`, or \`any\` to override.
348
- 2. \`count\` - Overrides main \`count\` (for "always")
349
-
350
- Defaults to empty object.`,
351
- patternProperties: {
352
- '.*': {
353
- additionalProperties: false,
354
- properties: {
355
- count: {
356
- type: 'integer'
357
- },
358
- lines: {
359
- enum: ['always', 'never', 'any'],
360
- type: 'string'
361
- }
362
- }
363
- }
364
- },
365
- type: 'object'
366
- }
367
- },
368
- type: 'object'
369
- }],
370
- type: 'suggestion'
371
- }
372
- });
373
- module.exports = exports.default;
374
- //# sourceMappingURL=tagLines.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tagLines.cjs","names":["iterateJsdoc"],"sources":["../../src/rules/tagLines.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {{\n * maxBlockLines: null|number,\n * startLines: null|number,\n * utils: import('../iterateJsdoc.js').Utils\n * }} cfg\n */\nconst checkMaxBlockLines = ({\n maxBlockLines,\n startLines,\n utils,\n}) => {\n if (typeof maxBlockLines !== 'number') {\n return false;\n }\n\n if (typeof startLines === 'number' && maxBlockLines < startLines) {\n utils.reportJSDoc(\n 'If set to a number, `maxBlockLines` must be greater than or equal to `startLines`.',\n );\n return true;\n }\n\n const {\n description,\n } = utils.getDescription();\n const excessBlockLinesRegex = new RegExp('\\n{' + (maxBlockLines + 2) + ',}', 'v');\n const excessBlockLinesMatch = description.match(excessBlockLinesRegex);\n const excessBlockLines = excessBlockLinesMatch?.[0]?.length ?? 0;\n if (excessBlockLinesMatch) {\n const excessIndexLine = description.slice(0, excessBlockLinesMatch.index).match(/\\n/gv)?.length ?? 0;\n utils.reportJSDoc(\n `Expected a maximum of ${maxBlockLines} line${maxBlockLines === 1 ? '' : 's'} within block description`,\n {\n line: excessIndexLine,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines, postDelims) => {\n const newPostDelims = [\n ...postDelims.slice(0, excessIndexLine),\n ...postDelims.slice(excessIndexLine + excessBlockLines - 1 - maxBlockLines),\n ];\n return [\n ...descLines.slice(0, excessIndexLine),\n ...descLines.slice(excessIndexLine + excessBlockLines - 1 - maxBlockLines),\n ].map((desc, idx) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: newPostDelims[idx],\n }),\n };\n });\n });\n },\n );\n return true;\n }\n\n return false;\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const [\n alwaysNever = 'never',\n {\n applyToEndTag = true,\n count = 1,\n endLines = 0,\n maxBlockLines = null,\n startLines = 0,\n startLinesWithNoTags = null,\n tags = {},\n } = {},\n ] = context.options;\n\n jsdoc.tags.some((tg, tagIdx) => {\n let lastTag;\n\n /**\n * @type {null|import('../iterateJsdoc.js').Integer}\n */\n let lastEmpty = null;\n\n /**\n * @type {null|import('../iterateJsdoc.js').Integer}\n */\n let reportIndex = null;\n let emptyLinesCount = 0;\n for (const [\n idx,\n {\n tokens: {\n description,\n end,\n name,\n tag,\n type,\n },\n },\n ] of tg.source.entries()) {\n // May be text after a line break within a tag description\n if (description) {\n reportIndex = null;\n }\n\n if (lastTag && [\n 'always', 'any',\n ].includes(tags[lastTag.slice(1)]?.lines)) {\n continue;\n }\n\n const empty = !tag && !name && !type && !description;\n if (\n empty && !end &&\n (alwaysNever === 'never' ||\n lastTag && tags[lastTag.slice(1)]?.lines === 'never'\n )\n ) {\n reportIndex = idx;\n\n continue;\n }\n\n if (!end) {\n if (empty) {\n emptyLinesCount++;\n } else {\n emptyLinesCount = 0;\n }\n\n lastEmpty = empty ? idx : null;\n }\n\n lastTag = tag;\n }\n\n if (\n typeof endLines === 'number' &&\n lastEmpty !== null && tagIdx === jsdoc.tags.length - 1\n ) {\n const lineDiff = endLines - emptyLinesCount;\n\n if (lineDiff < 0) {\n const fixer = () => {\n utils.removeTag(tagIdx, {\n tagSourceOffset: /** @type {import('../iterateJsdoc.js').Integer} */ (\n lastEmpty\n ) + lineDiff + 1,\n });\n };\n\n utils.reportJSDoc(\n `Expected ${endLines} trailing lines`,\n {\n line: tg.source[lastEmpty].number + lineDiff + 1,\n },\n fixer,\n );\n } else if (lineDiff > 0) {\n const fixer = () => {\n utils.addLines(\n tagIdx,\n /** @type {import('../iterateJsdoc.js').Integer} */ (lastEmpty),\n endLines - emptyLinesCount,\n );\n };\n\n utils.reportJSDoc(\n `Expected ${endLines} trailing lines`,\n {\n line: tg.source[lastEmpty].number,\n },\n fixer,\n );\n }\n\n return true;\n }\n\n if (reportIndex !== null) {\n const fixer = () => {\n utils.removeTag(tagIdx, {\n tagSourceOffset: /** @type {import('../iterateJsdoc.js').Integer} */ (\n reportIndex\n ),\n });\n };\n\n utils.reportJSDoc(\n 'Expected no lines between tags',\n {\n line: tg.source[0].number + 1,\n },\n fixer,\n );\n\n return true;\n }\n\n return false;\n });\n\n (applyToEndTag ? jsdoc.tags : jsdoc.tags.slice(0, -1)).some((tg, tagIdx) => {\n /**\n * @type {{\n * idx: import('../iterateJsdoc.js').Integer,\n * number: import('../iterateJsdoc.js').Integer\n * }[]}\n */\n const lines = [];\n\n let currentTag;\n let tagSourceIdx = 0;\n for (const [\n idx,\n {\n number,\n tokens: {\n description,\n end,\n name,\n tag,\n type,\n },\n },\n ] of tg.source.entries()) {\n if (description) {\n lines.splice(0);\n tagSourceIdx = idx;\n }\n\n if (tag) {\n currentTag = tag;\n }\n\n if (!tag && !name && !type && !description && !end) {\n lines.push({\n idx,\n number,\n });\n }\n }\n\n const currentTg = currentTag && tags[currentTag.slice(1)];\n const tagCount = currentTg?.count;\n\n const defaultAlways = alwaysNever === 'always' && currentTg?.lines !== 'never' &&\n currentTg?.lines !== 'any' && lines.length < count;\n\n let overrideAlways;\n let fixCount = count;\n if (!defaultAlways) {\n fixCount = typeof tagCount === 'number' ? tagCount : count;\n overrideAlways = currentTg?.lines === 'always' &&\n lines.length < fixCount;\n }\n\n if (defaultAlways || overrideAlways) {\n const fixer = () => {\n utils.addLines(tagIdx, lines[lines.length - 1]?.idx || tagSourceIdx + 1, fixCount - lines.length);\n };\n\n const line = lines[lines.length - 1]?.number || tg.source[tagSourceIdx].number;\n utils.reportJSDoc(\n `Expected ${fixCount} line${fixCount === 1 ? '' : 's'} between tags but found ${lines.length}`,\n {\n line,\n },\n fixer,\n );\n\n return true;\n }\n\n return false;\n });\n\n if (checkMaxBlockLines({\n maxBlockLines,\n startLines,\n utils,\n })) {\n return;\n }\n\n if (typeof startLines === 'number' || typeof startLinesWithNoTags === 'number') {\n const noTags = !jsdoc.tags.length;\n\n if (noTags && startLinesWithNoTags === null) {\n return;\n }\n\n const {\n description,\n lastDescriptionLine,\n } = utils.getDescription();\n if (!(/\\S/v).test(description)) {\n return;\n }\n\n const startingLines = noTags ? startLinesWithNoTags : startLines;\n\n const trailingLines = description.match(/\\n+$/v)?.[0]?.length;\n const trailingDiff = (trailingLines ?? 0) - startingLines;\n if (trailingDiff > 0) {\n utils.reportJSDoc(\n `Expected only ${startingLines} line${startingLines === 1 ? '' : 's'} after block description`,\n {\n line: lastDescriptionLine - trailingDiff,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines, postDelims) => {\n return descLines.slice(0, -trailingDiff).map((desc, idx) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: postDelims[idx],\n }),\n };\n });\n });\n },\n );\n } else if (trailingDiff < 0) {\n utils.reportJSDoc(\n `Expected ${startingLines} lines after block description`,\n {\n line: lastDescriptionLine,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines, postDelims) => {\n return [\n ...descLines,\n ...Array.from({\n length: -trailingDiff,\n }, () => {\n return '';\n }),\n ].map((desc, idx) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: desc.trim() ? postDelims[idx] : '',\n }),\n };\n });\n });\n },\n );\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Enforces lines (or no lines) before, after, or between tags.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/tag-lines.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n description: `Defaults to \"never\". \"any\" is only useful with \\`tags\\` (allowing non-enforcement of lines except\nfor particular tags) or with \\`startLines\\`, \\`startLinesWithNoTags\\` \\`endLines\\`, or \\`maxBlockLines\\`. It is also\nnecessary if using the linebreak-setting options of the \\`sort-tags\\` rule\nso that the two rules won't conflict in both attempting to set lines\nbetween tags.`,\n enum: [\n 'always', 'any', 'never',\n ],\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n applyToEndTag: {\n description: `Set to \\`false\\` and use with \"always\" to indicate the normal lines to be\nadded after tags should not be added after the final tag.\n\nDefaults to \\`true\\`.`,\n type: 'boolean',\n },\n count: {\n description: `Use with \"always\" to indicate the number of lines to require be present.\n\nDefaults to 1.`,\n type: 'integer',\n },\n endLines: {\n anyOf: [\n {\n type: 'integer',\n },\n {\n type: 'null',\n },\n ],\n description: `If not set to \\`null\\`, will enforce end lines to the given count on the\nfinal tag only.\n\nDefaults to \\`0\\`.`,\n },\n maxBlockLines: {\n anyOf: [\n {\n type: 'integer',\n },\n {\n type: 'null',\n },\n ],\n description: `If not set to \\`null\\`, will enforce a maximum number of lines to the given count anywhere in the block description.\n\nNote that if non-\\`null\\`, \\`maxBlockLines\\` must be greater than or equal to \\`startLines\\`.\n\nDefaults to \\`null\\`.`,\n },\n startLines: {\n anyOf: [\n {\n type: 'integer',\n },\n {\n type: 'null',\n },\n ],\n description: `If not set to \\`null\\`, will enforce end lines to the given count before the\nfirst tag only, unless there is only whitespace content, in which case,\na line count will not be enforced.\n\nDefaults to \\`0\\`.`,\n },\n startLinesWithNoTags: {\n description: 'If set to a number, will enforce a starting lines count when there are no tags. Defaults to `undefined`.',\n type: 'number',\n },\n tags: {\n description: `Overrides the default behavior depending on specific tags.\n\nAn object whose keys are tag names and whose values are objects with the\nfollowing keys:\n\n1. \\`lines\\` - Set to \\`always\\`, \\`never\\`, or \\`any\\` to override.\n2. \\`count\\` - Overrides main \\`count\\` (for \"always\")\n\nDefaults to empty object.`,\n patternProperties: {\n '.*': {\n additionalProperties: false,\n properties: {\n count: {\n type: 'integer',\n },\n lines: {\n enum: [\n 'always', 'never', 'any',\n ],\n type: 'string',\n },\n },\n },\n },\n type: 'object',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,141 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- // We could disallow raw gt, quot, and apos, but allow for parity; but we do
10
- // not allow hex or decimal character references
11
- const htmlRegex = /(<|&(?!(?:amp|lt|gt|quot|apos);))(?=\S)/v;
12
- const markdownRegex = /(?<!\\)(`+)([^`]+)\1(?!`)/v;
13
-
14
- /**
15
- * @param {string} desc
16
- * @returns {string}
17
- */
18
- const htmlReplacer = desc => {
19
- return desc.replaceAll(new RegExp(htmlRegex, 'gv'), _ => {
20
- if (_ === '<') {
21
- return '&lt;';
22
- }
23
- return '&amp;';
24
- });
25
- };
26
-
27
- /**
28
- * @param {string} desc
29
- * @returns {string}
30
- */
31
- const markdownReplacer = desc => {
32
- return desc.replaceAll(new RegExp(markdownRegex, 'gv'), (_, backticks, encapsed) => {
33
- const bookend = '`'.repeat(backticks.length);
34
- return `\\${bookend}${encapsed}${bookend}`;
35
- });
36
- };
37
- var _default = exports.default = (0, _iterateJsdoc.default)(({
38
- context,
39
- jsdoc,
40
- utils
41
- }) => {
42
- const {
43
- escapeHTML,
44
- escapeMarkdown
45
- } = context.options[0] || {};
46
- if (!escapeHTML && !escapeMarkdown) {
47
- context.report({
48
- loc: {
49
- end: {
50
- column: 1,
51
- line: 1
52
- },
53
- start: {
54
- column: 1,
55
- line: 1
56
- }
57
- },
58
- message: 'You must include either `escapeHTML` or `escapeMarkdown`'
59
- });
60
- return;
61
- }
62
- const {
63
- descriptions
64
- } = utils.getDescription();
65
- if (escapeHTML) {
66
- if (descriptions.some(desc => {
67
- return htmlRegex.test(desc);
68
- })) {
69
- const line = utils.setDescriptionLines(htmlRegex, htmlReplacer);
70
- utils.reportJSDoc('You have unescaped HTML characters < or &', {
71
- line
72
- }, () => {}, true);
73
- return;
74
- }
75
- for (const tag of jsdoc.tags) {
76
- if (tag.tag === 'example') {
77
- continue;
78
- }
79
- if (/** @type {string[]} */utils.getTagDescription(tag, true).some(desc => {
80
- return htmlRegex.test(desc);
81
- })) {
82
- const line = utils.setTagDescription(tag, htmlRegex, htmlReplacer) + tag.source[0].number;
83
- utils.reportJSDoc('You have unescaped HTML characters < or & in a tag', {
84
- line
85
- }, () => {}, true);
86
- }
87
- }
88
- return;
89
- }
90
- if (descriptions.some(desc => {
91
- return markdownRegex.test(desc);
92
- })) {
93
- const line = utils.setDescriptionLines(markdownRegex, markdownReplacer);
94
- utils.reportJSDoc('You have unescaped Markdown backtick sequences', {
95
- line
96
- }, () => {}, true);
97
- return;
98
- }
99
- for (const tag of jsdoc.tags) {
100
- if (tag.tag === 'example') {
101
- continue;
102
- }
103
- if (/** @type {string[]} */utils.getTagDescription(tag, true).some(desc => {
104
- return markdownRegex.test(desc);
105
- })) {
106
- const line = utils.setTagDescription(tag, markdownRegex, markdownReplacer) + tag.source[0].number;
107
- utils.reportJSDoc('You have unescaped Markdown backtick sequences in a tag', {
108
- line
109
- }, () => {}, true);
110
- }
111
- }
112
- }, {
113
- iterateAllJsdocs: true,
114
- meta: {
115
- docs: {
116
- description: 'Auto-escape certain characters that are input within block and tag descriptions.',
117
- url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/text-escaping.md#repos-sticky-header'
118
- },
119
- fixable: 'code',
120
- schema: [{
121
- additionalProperties: false,
122
- properties: {
123
- escapeHTML: {
124
- description: `This option escapes all \`<\` and \`&\` characters (except those followed by
125
- whitespace which are treated as literals by Visual Studio Code). Defaults to
126
- \`false\`.`,
127
- type: 'boolean'
128
- },
129
- escapeMarkdown: {
130
- description: `This option escapes the first backtick (\`\` \` \`\`) in a paired sequence.
131
- Defaults to \`false\`.`,
132
- type: 'boolean'
133
- }
134
- },
135
- type: 'object'
136
- }],
137
- type: 'suggestion'
138
- }
139
- });
140
- module.exports = exports.default;
141
- //# sourceMappingURL=textEscaping.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"textEscaping.cjs","names":["iterateJsdoc"],"sources":["../../src/rules/textEscaping.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n// We could disallow raw gt, quot, and apos, but allow for parity; but we do\n// not allow hex or decimal character references\nconst htmlRegex = /(<|&(?!(?:amp|lt|gt|quot|apos);))(?=\\S)/v;\nconst markdownRegex = /(?<!\\\\)(`+)([^`]+)\\1(?!`)/v;\n\n/**\n * @param {string} desc\n * @returns {string}\n */\nconst htmlReplacer = (desc) => {\n return desc.replaceAll(new RegExp(htmlRegex, 'gv'), (_) => {\n if (_ === '<') {\n return '&lt;';\n }\n\n return '&amp;';\n });\n};\n\n/**\n * @param {string} desc\n * @returns {string}\n */\nconst markdownReplacer = (desc) => {\n return desc.replaceAll(new RegExp(markdownRegex, 'gv'), (_, backticks, encapsed) => {\n const bookend = '`'.repeat(backticks.length);\n return `\\\\${bookend}${encapsed}${bookend}`;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n escapeHTML,\n escapeMarkdown,\n } = context.options[0] || {};\n\n if (!escapeHTML && !escapeMarkdown) {\n context.report({\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message: 'You must include either `escapeHTML` or `escapeMarkdown`',\n });\n return;\n }\n\n const {\n descriptions,\n } = utils.getDescription();\n\n if (escapeHTML) {\n if (descriptions.some((desc) => {\n return htmlRegex.test(desc);\n })) {\n const line = utils.setDescriptionLines(htmlRegex, htmlReplacer);\n utils.reportJSDoc('You have unescaped HTML characters < or &', {\n line,\n }, () => {}, true);\n return;\n }\n\n for (const tag of jsdoc.tags) {\n if (tag.tag === 'example') {\n continue;\n }\n\n if (/** @type {string[]} */ (\n utils.getTagDescription(tag, true)\n ).some((desc) => {\n return htmlRegex.test(desc);\n })) {\n const line = utils.setTagDescription(tag, htmlRegex, htmlReplacer) +\n tag.source[0].number;\n utils.reportJSDoc('You have unescaped HTML characters < or & in a tag', {\n line,\n }, () => {}, true);\n }\n }\n\n return;\n }\n\n if (descriptions.some((desc) => {\n return markdownRegex.test(desc);\n })) {\n const line = utils.setDescriptionLines(markdownRegex, markdownReplacer);\n utils.reportJSDoc('You have unescaped Markdown backtick sequences', {\n line,\n }, () => {}, true);\n return;\n }\n\n for (const tag of jsdoc.tags) {\n if (tag.tag === 'example') {\n continue;\n }\n\n if (/** @type {string[]} */ (\n utils.getTagDescription(tag, true)\n ).some((desc) => {\n return markdownRegex.test(desc);\n })) {\n const line = utils.setTagDescription(\n tag, markdownRegex, markdownReplacer,\n ) + tag.source[0].number;\n utils.reportJSDoc(\n 'You have unescaped Markdown backtick sequences in a tag',\n {\n line,\n },\n () => {},\n true,\n );\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Auto-escape certain characters that are input within block and tag descriptions.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/text-escaping.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n escapeHTML: {\n description: `This option escapes all \\`<\\` and \\`&\\` characters (except those followed by\nwhitespace which are treated as literals by Visual Studio Code). Defaults to\n\\`false\\`.`,\n type: 'boolean',\n },\n escapeMarkdown: {\n description: `This option escapes the first backtick (\\`\\` \\` \\`\\`) in a paired sequence.\nDefaults to \\`false\\`.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}