eslint-plugin-jsdoc 58.1.0 → 59.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 (184) hide show
  1. package/README.md +66 -60
  2. package/dist/buildForbidRuleDefinition.cjs +0 -1
  3. package/dist/buildForbidRuleDefinition.cjs.map +1 -1
  4. package/dist/buildRejectOrPreferRuleDefinition.cjs +7 -2
  5. package/dist/buildRejectOrPreferRuleDefinition.cjs.map +1 -1
  6. package/dist/cjs/rules/convertToJsdocComments.d.ts +7 -0
  7. package/dist/generateDocs.cjs +129 -3
  8. package/dist/generateDocs.cjs.map +1 -1
  9. package/dist/generateRule.cjs +3 -1
  10. package/dist/generateRule.cjs.map +1 -1
  11. package/dist/generateRuleTypes.cjs +5 -5
  12. package/dist/generateRuleTypes.cjs.map +1 -1
  13. package/dist/index-cjs.cjs +30 -0
  14. package/dist/index-cjs.cjs.map +1 -1
  15. package/dist/index.cjs +30 -0
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/rules/checkAccess.cjs +1 -1
  18. package/dist/rules/checkAccess.cjs.map +1 -1
  19. package/dist/rules/checkAlignment.cjs +4 -1
  20. package/dist/rules/checkAlignment.cjs.map +1 -1
  21. package/dist/rules/checkExamples.cjs +1 -1
  22. package/dist/rules/checkExamples.cjs.map +1 -1
  23. package/dist/rules/checkIndentation.cjs +19 -0
  24. package/dist/rules/checkIndentation.cjs.map +1 -1
  25. package/dist/rules/checkLineAlignment.cjs +25 -1
  26. package/dist/rules/checkLineAlignment.cjs.map +1 -1
  27. package/dist/rules/checkParamNames.cjs +62 -1
  28. package/dist/rules/checkParamNames.cjs.map +1 -1
  29. package/dist/rules/checkPropertyNames.cjs +6 -0
  30. package/dist/rules/checkPropertyNames.cjs.map +1 -1
  31. package/dist/rules/checkTagNames.cjs +71 -0
  32. package/dist/rules/checkTagNames.cjs.map +1 -1
  33. package/dist/rules/checkTypes.cjs +16 -1
  34. package/dist/rules/checkTypes.cjs.map +1 -1
  35. package/dist/rules/checkValues.cjs +17 -1
  36. package/dist/rules/checkValues.cjs.map +1 -1
  37. package/dist/rules/convertToJsdocComments.cjs +48 -0
  38. package/dist/rules/convertToJsdocComments.cjs.map +1 -1
  39. package/dist/rules/convertToJsdocComments.d.ts +7 -0
  40. package/dist/rules/emptyTags.cjs +10 -1
  41. package/dist/rules/emptyTags.cjs.map +1 -1
  42. package/dist/rules/implementsOnClasses.cjs +15 -1
  43. package/dist/rules/implementsOnClasses.cjs.map +1 -1
  44. package/dist/rules/informativeDocs.cjs +45 -0
  45. package/dist/rules/informativeDocs.cjs.map +1 -1
  46. package/dist/rules/linesBeforeBlock.cjs +14 -0
  47. package/dist/rules/linesBeforeBlock.cjs.map +1 -1
  48. package/dist/rules/matchDescription.cjs +129 -0
  49. package/dist/rules/matchDescription.cjs.map +1 -1
  50. package/dist/rules/matchName.cjs +30 -0
  51. package/dist/rules/matchName.cjs.map +1 -1
  52. package/dist/rules/multilineBlocks.cjs +78 -6
  53. package/dist/rules/multilineBlocks.cjs.map +1 -1
  54. package/dist/rules/noBadBlocks.cjs +11 -2
  55. package/dist/rules/noBadBlocks.cjs.map +1 -1
  56. package/dist/rules/noBlankBlockDescriptions.cjs +1 -1
  57. package/dist/rules/noBlankBlockDescriptions.cjs.map +1 -1
  58. package/dist/rules/noBlankBlocks.cjs +3 -1
  59. package/dist/rules/noBlankBlocks.cjs.map +1 -1
  60. package/dist/rules/noDefaults.cjs +19 -0
  61. package/dist/rules/noDefaults.cjs.map +1 -1
  62. package/dist/rules/noMissingSyntax.cjs +22 -2
  63. package/dist/rules/noMissingSyntax.cjs.map +1 -1
  64. package/dist/rules/noMultiAsterisks.cjs +29 -0
  65. package/dist/rules/noMultiAsterisks.cjs.map +1 -1
  66. package/dist/rules/noRestrictedSyntax.cjs +17 -1
  67. package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
  68. package/dist/rules/noTypes.cjs +17 -1
  69. package/dist/rules/noTypes.cjs.map +1 -1
  70. package/dist/rules/noUndefinedTypes.cjs +11 -1
  71. package/dist/rules/noUndefinedTypes.cjs.map +1 -1
  72. package/dist/rules/requireAsteriskPrefix.cjs +28 -0
  73. package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
  74. package/dist/rules/requireDescription.cjs +30 -1
  75. package/dist/rules/requireDescription.cjs.map +1 -1
  76. package/dist/rules/requireDescriptionCompleteSentence.cjs +27 -0
  77. package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
  78. package/dist/rules/requireExample.cjs +26 -1
  79. package/dist/rules/requireExample.cjs.map +1 -1
  80. package/dist/rules/requireFileOverview.cjs +61 -0
  81. package/dist/rules/requireFileOverview.cjs.map +1 -1
  82. package/dist/rules/requireHyphenBeforeParamDescription.cjs +20 -2
  83. package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
  84. package/dist/rules/requireJsdoc.cjs +82 -3
  85. package/dist/rules/requireJsdoc.cjs.map +1 -1
  86. package/dist/rules/requireParam.cjs +213 -1
  87. package/dist/rules/requireParam.cjs.map +1 -1
  88. package/dist/rules/requireParamDescription.cjs +21 -0
  89. package/dist/rules/requireParamDescription.cjs.map +1 -1
  90. package/dist/rules/requireParamName.cjs +16 -1
  91. package/dist/rules/requireParamName.cjs.map +1 -1
  92. package/dist/rules/requireParamType.cjs +21 -1
  93. package/dist/rules/requireParamType.cjs.map +1 -1
  94. package/dist/rules/requirePropertyName.cjs +1 -1
  95. package/dist/rules/requirePropertyName.cjs.map +1 -1
  96. package/dist/rules/requirePropertyType.cjs +1 -1
  97. package/dist/rules/requirePropertyType.cjs.map +1 -1
  98. package/dist/rules/requireReturns.cjs +54 -1
  99. package/dist/rules/requireReturns.cjs.map +1 -1
  100. package/dist/rules/requireReturnsCheck.cjs +22 -1
  101. package/dist/rules/requireReturnsCheck.cjs.map +1 -1
  102. package/dist/rules/requireReturnsDescription.cjs +15 -1
  103. package/dist/rules/requireReturnsDescription.cjs.map +1 -1
  104. package/dist/rules/requireReturnsType.cjs +15 -1
  105. package/dist/rules/requireReturnsType.cjs.map +1 -1
  106. package/dist/rules/requireTemplate.cjs +17 -1
  107. package/dist/rules/requireTemplate.cjs.map +1 -1
  108. package/dist/rules/requireThrows.cjs +18 -1
  109. package/dist/rules/requireThrows.cjs.map +1 -1
  110. package/dist/rules/requireYields.cjs +50 -1
  111. package/dist/rules/requireYields.cjs.map +1 -1
  112. package/dist/rules/requireYieldsCheck.cjs +25 -7
  113. package/dist/rules/requireYieldsCheck.cjs.map +1 -1
  114. package/dist/rules/sortTags.cjs +200 -1
  115. package/dist/rules/sortTags.cjs.map +1 -1
  116. package/dist/rules/tagLines.cjs +32 -2
  117. package/dist/rules/tagLines.cjs.map +1 -1
  118. package/dist/rules/textEscaping.cjs +5 -1
  119. package/dist/rules/textEscaping.cjs.map +1 -1
  120. package/dist/rules/typeFormatting.cjs +64 -16
  121. package/dist/rules/typeFormatting.cjs.map +1 -1
  122. package/dist/rules/validTypes.cjs +8 -1
  123. package/dist/rules/validTypes.cjs.map +1 -1
  124. package/dist/rules.d.ts +2130 -32
  125. package/package.json +1 -1
  126. package/src/buildForbidRuleDefinition.js +0 -1
  127. package/src/buildRejectOrPreferRuleDefinition.js +12 -2
  128. package/src/index-cjs.js +36 -0
  129. package/src/index.js +36 -0
  130. package/src/rules/checkAccess.js +1 -1
  131. package/src/rules/checkAlignment.js +3 -0
  132. package/src/rules/checkExamples.js +1 -1
  133. package/src/rules/checkIndentation.js +19 -0
  134. package/src/rules/checkLineAlignment.js +24 -0
  135. package/src/rules/checkParamNames.js +62 -1
  136. package/src/rules/checkPropertyNames.js +6 -0
  137. package/src/rules/checkTagNames.js +71 -0
  138. package/src/rules/checkTypes.js +16 -1
  139. package/src/rules/checkValues.js +16 -0
  140. package/src/rules/convertToJsdocComments.js +48 -0
  141. package/src/rules/emptyTags.js +10 -1
  142. package/src/rules/implementsOnClasses.js +15 -1
  143. package/src/rules/informativeDocs.js +45 -0
  144. package/src/rules/linesBeforeBlock.js +14 -0
  145. package/src/rules/matchDescription.js +129 -0
  146. package/src/rules/matchName.js +30 -0
  147. package/src/rules/multilineBlocks.js +77 -5
  148. package/src/rules/noBadBlocks.js +11 -2
  149. package/src/rules/noBlankBlockDescriptions.js +1 -1
  150. package/src/rules/noBlankBlocks.js +2 -0
  151. package/src/rules/noDefaults.js +19 -0
  152. package/src/rules/noMissingSyntax.js +22 -2
  153. package/src/rules/noMultiAsterisks.js +29 -0
  154. package/src/rules/noRestrictedSyntax.js +17 -1
  155. package/src/rules/noTypes.js +17 -1
  156. package/src/rules/noUndefinedTypes.js +11 -1
  157. package/src/rules/requireAsteriskPrefix.js +28 -0
  158. package/src/rules/requireDescription.js +30 -1
  159. package/src/rules/requireDescriptionCompleteSentence.js +27 -0
  160. package/src/rules/requireExample.js +26 -1
  161. package/src/rules/requireFileOverview.js +61 -0
  162. package/src/rules/requireHyphenBeforeParamDescription.js +19 -1
  163. package/src/rules/requireJsdoc.js +80 -1
  164. package/src/rules/requireParam.js +213 -1
  165. package/src/rules/requireParamDescription.js +21 -0
  166. package/src/rules/requireParamName.js +16 -1
  167. package/src/rules/requireParamType.js +21 -1
  168. package/src/rules/requirePropertyName.js +1 -1
  169. package/src/rules/requirePropertyType.js +1 -1
  170. package/src/rules/requireReturns.js +54 -1
  171. package/src/rules/requireReturnsCheck.js +22 -1
  172. package/src/rules/requireReturnsDescription.js +15 -1
  173. package/src/rules/requireReturnsType.js +15 -1
  174. package/src/rules/requireTemplate.js +17 -1
  175. package/src/rules/requireThrows.js +18 -1
  176. package/src/rules/requireYields.js +50 -1
  177. package/src/rules/requireYieldsCheck.js +25 -7
  178. package/src/rules/sortTags.js +200 -1
  179. package/src/rules/tagLines.js +30 -0
  180. package/src/rules/textEscaping.js +5 -1
  181. package/src/rules/typeFormatting.js +57 -19
  182. package/src/rules/validTypes.js +8 -1
  183. package/src/rules.d.ts +2130 -32
  184. package/typings/gitdown.d.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sortTags.cjs","names":["_defaultTagOrder","_interopRequireDefault","require","_iterateJsdoc","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","alphabetizeExtras","linesBetween","reportIntraTagGroupSpacing","reportTagGroupSpacing","tagSequence","defaultTagOrder","options","tagList","flatMap","obj","tags","otherPos","indexOf","endPos","length","ongoingCount","idx","tag","entries","originalIndex","source","originalLine","firstChangedTagLine","firstChangedTagIndex","sortedTags","JSON","parse","stringify","sort","tagNew","tagOld","checkOrSetFirstChanged","newPos","oldPos","preferredNewPos","preferredOldPos","undefined","lastTagsOfGroup","badLastTagsOfGroup","countTagEmptyLines","reduce","acc","tokens","description","end","name","tg","type","empty","Number","innerIdx","currentTag","lastTag","includes","some","tgs","push","ct","fixer","currIdx","newIdx","emptyLine","number","seedTokens","delimiter","start","existingEmptyLines","nextTokens","lineDiff","lines","Array","from","splice","srcIdx","src","reportJSDoc","tagIdx","foundFirstTag","nextIdx","ignore","lastTagOfGroup","firstLine","getFirstLine","fix","itemsToMoveRange","keys","unchangedPriorTagDescriptions","slice","initialOffset","removeTag","changedTags","extraTagCount","changedTag","addTag","addLine","join","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","items","module"],"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}) => {\n const\n /**\n * @type {{\n * linesBetween: import('../iterateJsdoc.js').Integer,\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 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) {\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.',\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 type: 'boolean',\n },\n linesBetween: {\n type: 'integer',\n },\n reportIntraTagGroupSpacing: {\n type: 'boolean',\n },\n reportTagGroupSpacing: {\n type: 'boolean',\n },\n tagSequence: {\n items: {\n additionalProperties: false,\n properties: {\n tags: {\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":"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","ignoreList":[]}
1
+ {"version":3,"file":"sortTags.cjs","names":["_defaultTagOrder","_interopRequireDefault","require","_iterateJsdoc","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","alphabetizeExtras","linesBetween","reportIntraTagGroupSpacing","reportTagGroupSpacing","tagSequence","defaultTagOrder","options","tagList","flatMap","obj","tags","otherPos","indexOf","endPos","length","ongoingCount","idx","tag","entries","originalIndex","source","originalLine","firstChangedTagLine","firstChangedTagIndex","sortedTags","JSON","parse","stringify","sort","tagNew","tagOld","checkOrSetFirstChanged","newPos","oldPos","preferredNewPos","preferredOldPos","undefined","lastTagsOfGroup","badLastTagsOfGroup","countTagEmptyLines","reduce","acc","tokens","description","end","name","tg","type","empty","Number","innerIdx","currentTag","lastTag","includes","some","tgs","push","ct","fixer","currIdx","newIdx","emptyLine","number","seedTokens","delimiter","start","existingEmptyLines","nextTokens","lineDiff","lines","Array","from","splice","srcIdx","src","reportJSDoc","tagIdx","foundFirstTag","nextIdx","ignore","lastTagOfGroup","firstLine","getFirstLine","fix","itemsToMoveRange","keys","unchangedPriorTagDescriptions","slice","initialOffset","removeTag","changedTags","extraTagCount","changedTag","addTag","addLine","join","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","items","module"],"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}) => {\n const\n /**\n * @type {{\n * linesBetween: import('../iterateJsdoc.js').Integer,\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 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) {\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 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`,\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":"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;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,CAAC;UACW6D,KAAK,EAAE;YACLF,oBAAoB,EAAE,KAAK;YAC3BC,UAAU,EAAE;cACV7F,IAAI,EAAE;gBACJiC,WAAW,EAAE,mCAAmC;gBAChD6D,KAAK,EAAE;kBACLzD,IAAI,EAAE;gBACR,CAAC;gBACDA,IAAI,EAAE;cACR;YACF,CAAC;YACDA,IAAI,EAAE;UACR,CAAC;UACDA,IAAI,EAAE;QACR;MACF,CAAC;MACDA,IAAI,EAAE;IACR,CAAC,CACF;IACDA,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAA0D,MAAA,CAAA9G,OAAA,GAAAA,OAAA,CAAAF,OAAA","ignoreList":[]}
@@ -216,15 +216,27 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
216
216
  },
217
217
  fixable: 'code',
218
218
  schema: [{
219
+ description: `Defaults to "never". "any" is only useful with \`tags\` (allowing non-enforcement of lines except
220
+ for particular tags) or with \`startLines\` or \`endLines\`. It is also
221
+ necessary if using the linebreak-setting options of the \`sort-tags\` rule
222
+ so that the two rules won't conflict in both attempting to set lines
223
+ between tags.`,
219
224
  enum: ['always', 'any', 'never'],
220
225
  type: 'string'
221
226
  }, {
222
227
  additionalProperties: false,
223
228
  properties: {
224
229
  applyToEndTag: {
230
+ description: `Set to \`false\` and use with "always" to indicate the normal lines to be
231
+ added after tags should not be added after the final tag.
232
+
233
+ Defaults to \`true\`.`,
225
234
  type: 'boolean'
226
235
  },
227
236
  count: {
237
+ description: `Use with "always" to indicate the number of lines to require be present.
238
+
239
+ Defaults to 1.`,
228
240
  type: 'integer'
229
241
  },
230
242
  endLines: {
@@ -232,16 +244,34 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
232
244
  type: 'integer'
233
245
  }, {
234
246
  type: 'null'
235
- }]
247
+ }],
248
+ description: `If not set to \`null\`, will enforce end lines to the given count on the
249
+ final tag only.
250
+
251
+ Defaults to \`0\`.`
236
252
  },
237
253
  startLines: {
238
254
  anyOf: [{
239
255
  type: 'integer'
240
256
  }, {
241
257
  type: 'null'
242
- }]
258
+ }],
259
+ description: `If not set to \`null\`, will enforce end lines to the given count before the
260
+ first tag only, unless there is only whitespace content, in which case,
261
+ a line count will not be enforced.
262
+
263
+ Defaults to \`0\`.`
243
264
  },
244
265
  tags: {
266
+ description: `Overrides the default behavior depending on specific tags.
267
+
268
+ An object whose keys are tag names and whose values are objects with the
269
+ following keys:
270
+
271
+ 1. \`lines\` - Set to \`always\`, \`never\`, or \`any\` to override.
272
+ 2. \`count\` - Overrides main \`count\` (for "always")
273
+
274
+ Defaults to empty object.`,
245
275
  patternProperties: {
246
276
  '.*': {
247
277
  additionalProperties: false,
@@ -1 +1 @@
1
- {"version":3,"file":"tagLines.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","alwaysNever","applyToEndTag","count","endLines","startLines","tags","options","some","tg","tagIdx","lastTag","lastEmpty","reportIndex","emptyLinesCount","idx","tokens","description","end","name","tag","type","source","entries","includes","slice","lines","empty","length","lineDiff","fixer","removeTag","tagSourceOffset","reportJSDoc","line","number","addLines","currentTag","tagSourceIdx","splice","push","currentTg","tagCount","defaultAlways","overrideAlways","fixCount","lastDescriptionLine","getDescription","test","trailingLines","match","trailingDiff","setBlockDescription","info","seedTokens","descLines","map","desc","postDelimiter","trim","Array","from","iterateAllJsdocs","meta","docs","url","fixable","schema","enum","additionalProperties","properties","anyOf","patternProperties","module"],"sources":["../../src/rules/tagLines.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\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 startLines = 0,\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 (typeof startLines === 'number') {\n if (!jsdoc.tags.length) {\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 trailingLines = description.match(/\\n+$/v)?.[0]?.length;\n const trailingDiff = (trailingLines ?? 0) - startLines;\n if (trailingDiff > 0) {\n utils.reportJSDoc(\n `Expected only ${startLines} line after block description`,\n {\n line: lastDescriptionLine - trailingDiff,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines) => {\n return descLines.slice(0, -trailingDiff).map((desc) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: desc.trim() ? info.postDelimiter : '',\n }),\n };\n });\n });\n },\n );\n } else if (trailingDiff < 0) {\n utils.reportJSDoc(\n `Expected ${startLines} lines after block description`,\n {\n line: lastDescriptionLine,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines) => {\n return [\n ...descLines,\n ...Array.from({\n length: -trailingDiff,\n }, () => {\n return '';\n }),\n ].map((desc) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: desc.trim() ? info.postDelimiter : '',\n }),\n };\n });\n });\n },\n );\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Enforces lines (or no lines) 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 enum: [\n 'always', 'any', 'never',\n ],\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n applyToEndTag: {\n type: 'boolean',\n },\n count: {\n type: 'integer',\n },\n endLines: {\n anyOf: [\n {\n type: 'integer',\n },\n {\n type: 'null',\n },\n ],\n },\n startLines: {\n anyOf: [\n {\n type: 'integer',\n },\n {\n type: 'null',\n },\n ],\n },\n tags: {\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
+ {"version":3,"file":"tagLines.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","alwaysNever","applyToEndTag","count","endLines","startLines","tags","options","some","tg","tagIdx","lastTag","lastEmpty","reportIndex","emptyLinesCount","idx","tokens","description","end","name","tag","type","source","entries","includes","slice","lines","empty","length","lineDiff","fixer","removeTag","tagSourceOffset","reportJSDoc","line","number","addLines","currentTag","tagSourceIdx","splice","push","currentTg","tagCount","defaultAlways","overrideAlways","fixCount","lastDescriptionLine","getDescription","test","trailingLines","match","trailingDiff","setBlockDescription","info","seedTokens","descLines","map","desc","postDelimiter","trim","Array","from","iterateAllJsdocs","meta","docs","url","fixable","schema","enum","additionalProperties","properties","anyOf","patternProperties","module"],"sources":["../../src/rules/tagLines.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\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 startLines = 0,\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 (typeof startLines === 'number') {\n if (!jsdoc.tags.length) {\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 trailingLines = description.match(/\\n+$/v)?.[0]?.length;\n const trailingDiff = (trailingLines ?? 0) - startLines;\n if (trailingDiff > 0) {\n utils.reportJSDoc(\n `Expected only ${startLines} line after block description`,\n {\n line: lastDescriptionLine - trailingDiff,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines) => {\n return descLines.slice(0, -trailingDiff).map((desc) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: desc.trim() ? info.postDelimiter : '',\n }),\n };\n });\n });\n },\n );\n } else if (trailingDiff < 0) {\n utils.reportJSDoc(\n `Expected ${startLines} lines after block description`,\n {\n line: lastDescriptionLine,\n },\n () => {\n utils.setBlockDescription((info, seedTokens, descLines) => {\n return [\n ...descLines,\n ...Array.from({\n length: -trailingDiff,\n }, () => {\n return '';\n }),\n ].map((desc) => {\n return {\n number: 0,\n source: '',\n tokens: seedTokens({\n ...info,\n description: desc,\n postDelimiter: desc.trim() ? info.postDelimiter : '',\n }),\n };\n });\n });\n },\n );\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Enforces lines (or no lines) 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\\` or \\`endLines\\`. 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 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 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":[]}
@@ -120,11 +120,15 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
120
120
  schema: [{
121
121
  additionalProperties: false,
122
122
  properties: {
123
- // Option properties here (or remove the object)
124
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\`.`,
125
127
  type: 'boolean'
126
128
  },
127
129
  escapeMarkdown: {
130
+ description: `This option escapes the first backtick (\`\` \` \`\`) in a paired sequence.
131
+ Defaults to \`false\`.`,
128
132
  type: 'boolean'
129
133
  }
130
134
  },
@@ -1 +1 @@
1
- {"version":3,"file":"textEscaping.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","htmlRegex","markdownRegex","htmlReplacer","desc","replaceAll","RegExp","_","markdownReplacer","backticks","encapsed","bookend","repeat","length","_default","exports","iterateJsdoc","context","jsdoc","utils","escapeHTML","escapeMarkdown","options","report","loc","end","column","line","start","message","descriptions","getDescription","some","test","setDescriptionLines","reportJSDoc","tag","tags","getTagDescription","setTagDescription","source","number","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","module"],"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 // Option properties here (or remove the object)\n escapeHTML: {\n type: 'boolean',\n },\n escapeMarkdown: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"textEscaping.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","htmlRegex","markdownRegex","htmlReplacer","desc","replaceAll","RegExp","_","markdownReplacer","backticks","encapsed","bookend","repeat","length","_default","exports","iterateJsdoc","context","jsdoc","utils","escapeHTML","escapeMarkdown","options","report","loc","end","column","line","start","message","descriptions","getDescription","some","test","setDescriptionLines","reportJSDoc","tag","tags","getTagDescription","setTagDescription","source","number","iterateAllJsdocs","meta","docs","description","url","fixable","schema","additionalProperties","properties","type","module"],"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":[]}
@@ -24,7 +24,7 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
24
24
  objectFieldSeparator = 'comma',
25
25
  objectFieldSeparatorOptionalLinebreak = true,
26
26
  objectFieldSeparatorTrailingPunctuation = false,
27
- propertyQuotes = null,
27
+ // propertyQuotes = null,
28
28
  separatorForSingleObjectField = false,
29
29
  stringQuotes = 'single',
30
30
  typeBracketSpacing = '',
@@ -225,15 +225,22 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
225
225
  }
226
226
  break;
227
227
  }
228
- case 'JsdocTypeProperty':
229
- {
230
- const typeNode = /** @type {import('jsdoc-type-pratt-parser').PropertyResult} */nde;
231
- if ((propertyQuotes || typeof typeNode.value === 'string' && !/\s/v.test(typeNode.value)) && typeNode.meta.quote !== (propertyQuotes ?? undefined)) {
232
- typeNode.meta.quote = propertyQuotes ?? undefined;
233
- errorMessage = `Inconsistent ${propertyQuotes} property quotes usage`;
234
- }
235
- break;
236
- }
228
+
229
+ // Only suitable for namepaths (and would need changes); see https://github.com/gajus/eslint-plugin-jsdoc/issues/1524
230
+ // case 'JsdocTypeProperty': {
231
+ // const typeNode = /** @type {import('jsdoc-type-pratt-parser').PropertyResult} */ (nde);
232
+
233
+ // if ((propertyQuotes ||
234
+ // (typeof typeNode.value === 'string' && !(/\s/v).test(typeNode.value))) &&
235
+ // typeNode.meta.quote !== (propertyQuotes ?? undefined)
236
+ // ) {
237
+ // typeNode.meta.quote = propertyQuotes ?? undefined;
238
+ // errorMessage = `Inconsistent ${propertyQuotes} property quotes usage`;
239
+ // }
240
+
241
+ // break;
242
+ // }
243
+
237
244
  case 'JsdocTypeStringValue':
238
245
  {
239
246
  const typeNode = /** @type {import('jsdoc-type-pratt-parser').StringValueResult} */nde;
@@ -291,42 +298,83 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
291
298
  additionalProperties: false,
292
299
  properties: {
293
300
  arrayBrackets: {
294
- enum: ['angle', 'square']
301
+ description: 'Determines how array generics are represented. Set to `angle` for the style `Array<type>` or `square` for the style `type[]`. Defaults to "square".',
302
+ enum: ['angle', 'square'],
303
+ type: 'string'
295
304
  },
296
305
  enableFixer: {
306
+ description: 'Whether to enable the fixer. Defaults to `true`.',
297
307
  type: 'boolean'
298
308
  },
299
309
  genericDot: {
310
+ description: 'Boolean value of whether to use a dot before the angled brackets of a generic (e.g., `SomeType.<AnotherType>`). Defaults to `false`.',
300
311
  type: 'boolean'
301
312
  },
302
313
  objectFieldIndent: {
314
+ description: `A string indicating the whitespace to be added on each line preceding an
315
+ object property-value field. Defaults to the empty string.`,
303
316
  type: 'string'
304
317
  },
305
318
  objectFieldQuote: {
319
+ description: `Whether and how object field properties should be quoted (e.g., \`{"a": string}\`).
320
+ Set to \`single\`, \`double\`, or \`null\`. Defaults to \`null\` (no quotes unless
321
+ required due to special characters within the field). Digits will be kept as is,
322
+ regardless of setting (they can either represent a digit or a string digit).`,
306
323
  enum: ['double', 'single', null]
307
324
  },
308
325
  objectFieldSeparator: {
309
- enum: ['comma', 'comma-and-linebreak', 'linebreak', 'semicolon', 'semicolon-and-linebreak']
326
+ description: `For object properties, specify whether a "semicolon", "comma", "linebreak",
327
+ "semicolon-and-linebreak", or "comma-and-linebreak" should be used after
328
+ each object property-value pair.
329
+
330
+ Defaults to \`"comma"\`.`,
331
+ enum: ['comma', 'comma-and-linebreak', 'linebreak', 'semicolon', 'semicolon-and-linebreak'],
332
+ type: 'string'
310
333
  },
311
334
  objectFieldSeparatorOptionalLinebreak: {
335
+ description: `Whether \`objectFieldSeparator\` set to \`"semicolon-and-linebreak"\` or
336
+ \`"comma-and-linebreak"\` should be allowed to optionally drop the linebreak.
337
+
338
+ Defaults to \`true\`.`,
312
339
  type: 'boolean'
313
340
  },
314
341
  objectFieldSeparatorTrailingPunctuation: {
342
+ description: `If \`separatorForSingleObjectField\` is not in effect (i.e., if it is \`false\`
343
+ or there are multiple property-value object fields present), this property
344
+ will determine whether to add punctuation corresponding to the
345
+ \`objectFieldSeparator\` (e.g., a semicolon) to the final object field.
346
+ Defaults to \`false\`.`,
315
347
  type: 'boolean'
316
348
  },
317
- propertyQuotes: {
318
- enum: ['double', 'single', null]
319
- },
349
+ // propertyQuotes: {
350
+ // description: `Whether and how namepath properties should be quoted (e.g., \`ab."cd"."ef"\`).
351
+ // Set to \`single\`, \`double\`, or \`null\`. Defaults to \`null\` (no quotes unless
352
+ // required due to whitespace within the property).`,
353
+ // enum: [
354
+ // 'double',
355
+ // 'single',
356
+ // null,
357
+ // ],
358
+ // },
320
359
  separatorForSingleObjectField: {
360
+ description: `Whether to apply the \`objectFieldSeparator\` (e.g., a semicolon) when there
361
+ is only one property-value object field present. Defaults to \`false\`.`,
321
362
  type: 'boolean'
322
363
  },
323
364
  stringQuotes: {
324
- enum: ['double', 'single']
365
+ description: `How string literals should be quoted (e.g., \`"abc"\`). Set to \`single\`
366
+ or \`double\`. Defaults to 'single'.`,
367
+ enum: ['double', 'single'],
368
+ type: 'string'
325
369
  },
326
370
  typeBracketSpacing: {
371
+ description: `A string of spaces that will be added immediately after the type's initial
372
+ curly bracket and immediately before its ending curly bracket. Defaults
373
+ to the empty string.`,
327
374
  type: 'string'
328
375
  },
329
376
  unionSpacing: {
377
+ description: 'Determines the spacing to add to unions (`|`). Defaults to a single space (`" "`).',
330
378
  type: 'string'
331
379
  }
332
380
  },