eslint-plugin-jsdoc 58.1.1 → 59.0.1

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 +87 -69
  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 +47 -10
  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 +2 -2
  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 +44 -7
  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":"requireExample.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","report","utils","avoidDocs","enableFixer","exemptNoArguments","options","targetTagName","functionExamples","tags","filter","tag","length","isIteratingFunctionOrVariable","hasParams","reportJSDoc","addTag","example","exampleContent","name","getTagDescription","trim","split","Boolean","contextDefaults","meta","docs","description","url","fixable","schema","additionalProperties","properties","checkConstructors","type","checkGetters","checkSetters","contexts","items","anyOf","comment","exemptedBy","module"],"sources":["../../src/rules/requireExample.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n if (utils.avoidDocs()) {\n return;\n }\n\n const {\n enableFixer = true,\n exemptNoArguments = false,\n } = context.options[0] || {};\n\n const targetTagName = 'example';\n\n const functionExamples = jsdoc.tags.filter(({\n tag,\n }) => {\n return tag === targetTagName;\n });\n\n if (!functionExamples.length) {\n if (exemptNoArguments && utils.isIteratingFunctionOrVariable() &&\n !utils.hasParams()\n ) {\n return;\n }\n\n utils.reportJSDoc(`Missing JSDoc @${targetTagName} declaration.`, null, () => {\n if (enableFixer) {\n utils.addTag(targetTagName);\n }\n });\n\n return;\n }\n\n for (const example of functionExamples) {\n const exampleContent = `${example.name} ${utils.getTagDescription(example)}`\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (!exampleContent.length) {\n report(`Missing JSDoc @${targetTagName} description.`, null, example);\n }\n }\n}, {\n contextDefaults: true,\n meta: {\n docs: {\n description: 'Requires that all functions have examples.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-example.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n checkConstructors: {\n default: true,\n type: 'boolean',\n },\n checkGetters: {\n default: false,\n type: 'boolean',\n },\n checkSetters: {\n default: false,\n type: 'boolean',\n },\n contexts: {\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n enableFixer: {\n default: true,\n type: 'boolean',\n },\n exemptedBy: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n exemptNoArguments: {\n default: false,\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":"requireExample.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","report","utils","avoidDocs","enableFixer","exemptNoArguments","options","targetTagName","functionExamples","tags","filter","tag","length","isIteratingFunctionOrVariable","hasParams","reportJSDoc","addTag","example","exampleContent","name","getTagDescription","trim","split","Boolean","contextDefaults","meta","docs","description","url","fixable","schema","additionalProperties","properties","checkConstructors","type","checkGetters","checkSetters","contexts","items","anyOf","comment","exemptedBy","module"],"sources":["../../src/rules/requireExample.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n if (utils.avoidDocs()) {\n return;\n }\n\n const {\n enableFixer = true,\n exemptNoArguments = false,\n } = context.options[0] || {};\n\n const targetTagName = 'example';\n\n const functionExamples = jsdoc.tags.filter(({\n tag,\n }) => {\n return tag === targetTagName;\n });\n\n if (!functionExamples.length) {\n if (exemptNoArguments && utils.isIteratingFunctionOrVariable() &&\n !utils.hasParams()\n ) {\n return;\n }\n\n utils.reportJSDoc(`Missing JSDoc @${targetTagName} declaration.`, null, () => {\n if (enableFixer) {\n utils.addTag(targetTagName);\n }\n });\n\n return;\n }\n\n for (const example of functionExamples) {\n const exampleContent = `${example.name} ${utils.getTagDescription(example)}`\n .trim()\n .split('\\n')\n .filter(Boolean);\n\n if (!exampleContent.length) {\n report(`Missing JSDoc @${targetTagName} description.`, null, example);\n }\n }\n}, {\n contextDefaults: true,\n meta: {\n docs: {\n description: 'Requires that all functions (and potentially other contexts) have examples.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-example.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n checkConstructors: {\n default: true,\n description: `A value indicating whether \\`constructor\\`s should be checked.\nDefaults to \\`true\\`.`,\n type: 'boolean',\n },\n checkGetters: {\n default: false,\n description: 'A value indicating whether getters should be checked. Defaults to `false`.',\n type: 'boolean',\n },\n checkSetters: {\n default: false,\n description: 'A value indicating whether setters should be checked. Defaults to `false`.',\n type: 'boolean',\n },\n contexts: {\n description: `Set this to an array of strings representing the AST context (or an object with\noptional \\`context\\` and \\`comment\\` properties) where you wish the rule to be applied.\n(e.g., \\`ClassDeclaration\\` for ES6 classes).\n\n\\`context\\` defaults to \\`any\\` and \\`comment\\` defaults to no specific comment context.\n\nOverrides the default contexts (\\`ArrowFunctionExpression\\`, \\`FunctionDeclaration\\`,\n\\`FunctionExpression\\`). Set to \\`\"any\"\\` if you want the rule to apply to any\nJSDoc block throughout your files.\n\nSee the [\"AST and Selectors\"](../#advanced-ast-and-selectors)\nsection of our Advanced docs for more on the expected format.`,\n items: {\n anyOf: [\n {\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n comment: {\n type: 'string',\n },\n context: {\n type: 'string',\n },\n },\n type: 'object',\n },\n ],\n },\n type: 'array',\n },\n enableFixer: {\n default: true,\n description: `A boolean on whether to enable the fixer (which adds an empty \\`@example\\` block).\nDefaults to \\`true\\`.`,\n type: 'boolean',\n },\n exemptedBy: {\n description: `Array of tags (e.g., \\`['type']\\`) whose presence on the document\nblock avoids the need for an \\`@example\\`. Defaults to an array with\n\\`inheritdoc\\`. If you set this array, it will overwrite the default,\nso be sure to add back \\`inheritdoc\\` if you wish its presence to cause\nexemption of the rule.`,\n items: {\n type: 'string',\n },\n type: 'array',\n },\n exemptNoArguments: {\n default: false,\n description: `Boolean to indicate that no-argument functions should not be reported for\nmissing \\`@example\\` declarations.`,\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA8C,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,IAAAG,QAAA,GAAAC,OAAA,CAAAF,OAAA,GAE/B,IAAAG,qBAAY,EAAC,CAAC;EAC3BC,OAAO;EACPC,KAAK;EACLC,MAAM;EACNC;AACF,CAAC,KAAK;EACJ,IAAIA,KAAK,CAACC,SAAS,CAAC,CAAC,EAAE;IACrB;EACF;EAEA,MAAM;IACJC,WAAW,GAAG,IAAI;IAClBC,iBAAiB,GAAG;EACtB,CAAC,GAAGN,OAAO,CAACO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;EAE5B,MAAMC,aAAa,GAAG,SAAS;EAE/B,MAAMC,gBAAgB,GAAGR,KAAK,CAACS,IAAI,CAACC,MAAM,CAAC,CAAC;IAC1CC;EACF,CAAC,KAAK;IACJ,OAAOA,GAAG,KAAKJ,aAAa;EAC9B,CAAC,CAAC;EAEF,IAAI,CAACC,gBAAgB,CAACI,MAAM,EAAE;IAC5B,IAAIP,iBAAiB,IAAIH,KAAK,CAACW,6BAA6B,CAAC,CAAC,IAC5D,CAACX,KAAK,CAACY,SAAS,CAAC,CAAC,EAClB;MACA;IACF;IAEAZ,KAAK,CAACa,WAAW,CAAC,kBAAkBR,aAAa,eAAe,EAAE,IAAI,EAAE,MAAM;MAC5E,IAAIH,WAAW,EAAE;QACfF,KAAK,CAACc,MAAM,CAACT,aAAa,CAAC;MAC7B;IACF,CAAC,CAAC;IAEF;EACF;EAEA,KAAK,MAAMU,OAAO,IAAIT,gBAAgB,EAAE;IACtC,MAAMU,cAAc,GAAG,GAAGD,OAAO,CAACE,IAAI,IAAIjB,KAAK,CAACkB,iBAAiB,CAACH,OAAO,CAAC,EAAE,CACzEI,IAAI,CAAC,CAAC,CACNC,KAAK,CAAC,IAAI,CAAC,CACXZ,MAAM,CAACa,OAAO,CAAC;IAElB,IAAI,CAACL,cAAc,CAACN,MAAM,EAAE;MAC1BX,MAAM,CAAC,kBAAkBM,aAAa,eAAe,EAAE,IAAI,EAAEU,OAAO,CAAC;IACvE;EACF;AACF,CAAC,EAAE;EACDO,eAAe,EAAE,IAAI;EACrBC,IAAI,EAAE;IACJC,IAAI,EAAE;MACJC,WAAW,EAAE,6EAA6E;MAC1FC,GAAG,EAAE;IACP,CAAC;IACDC,OAAO,EAAE,MAAM;IACfC,MAAM,EAAE,CACN;MACEC,oBAAoB,EAAE,KAAK;MAC3BC,UAAU,EAAE;QACVC,iBAAiB,EAAE;UACjBtC,OAAO,EAAE,IAAI;UACbgC,WAAW,EAAE;AACzB,sBAAsB;UACVO,IAAI,EAAE;QACR,CAAC;QACDC,YAAY,EAAE;UACZxC,OAAO,EAAE,KAAK;UACdgC,WAAW,EAAE,4EAA4E;UACzFO,IAAI,EAAE;QACR,CAAC;QACDE,YAAY,EAAE;UACZzC,OAAO,EAAE,KAAK;UACdgC,WAAW,EAAE,4EAA4E;UACzFO,IAAI,EAAE;QACR,CAAC;QACDG,QAAQ,EAAE;UACRV,WAAW,EAAE;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8DAA8D;UAClDW,KAAK,EAAE;YACLC,KAAK,EAAE,CACL;cACEL,IAAI,EAAE;YACR,CAAC,EACD;cACEH,oBAAoB,EAAE,KAAK;cAC3BC,UAAU,EAAE;gBACVQ,OAAO,EAAE;kBACPN,IAAI,EAAE;gBACR,CAAC;gBACDnC,OAAO,EAAE;kBACPmC,IAAI,EAAE;gBACR;cACF,CAAC;cACDA,IAAI,EAAE;YACR,CAAC;UAEL,CAAC;UACDA,IAAI,EAAE;QACR,CAAC;QACD9B,WAAW,EAAE;UACXT,OAAO,EAAE,IAAI;UACbgC,WAAW,EAAE;AACzB,sBAAsB;UACVO,IAAI,EAAE;QACR,CAAC;QACDO,UAAU,EAAE;UACVd,WAAW,EAAE;AACzB;AACA;AACA;AACA,uBAAuB;UACXW,KAAK,EAAE;YACLJ,IAAI,EAAE;UACR,CAAC;UACDA,IAAI,EAAE;QACR,CAAC;QACD7B,iBAAiB,EAAE;UACjBV,OAAO,EAAE,KAAK;UACdgC,WAAW,EAAE;AACzB,mCAAmC;UACvBO,IAAI,EAAE;QACR;MACF,CAAC;MACDA,IAAI,EAAE;IACR,CAAC,CACF;IACDA,IAAI,EAAE;EACR;AACF,CAAC,CAAC;AAAAQ,MAAA,CAAA7C,OAAA,GAAAA,OAAA,CAAAF,OAAA","ignoreList":[]}
@@ -98,6 +98,67 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
98
98
  additionalProperties: false,
99
99
  properties: {
100
100
  tags: {
101
+ description: `The keys of this object are tag names, and the values are configuration
102
+ objects indicating what will be checked for these whole-file tags.
103
+
104
+ Each configuration object has 3 potential boolean keys (which default
105
+ to \`false\` when this option is supplied).
106
+
107
+ 1. \`mustExist\` - enforces that all files have a \`@file\`, \`@fileoverview\`, or \`@overview\` tag.
108
+ 2. \`preventDuplicates\` - enforces that duplicate file overview tags within a given file will be reported
109
+ 3. \`initialCommentsOnly\` - reports file overview tags which are not, as per
110
+ [the docs](https://jsdoc.app/tags-file.html), "at the beginning of
111
+ the file"–where beginning of the file is interpreted in this rule
112
+ as being when the overview tag is not preceded by anything other than
113
+ a comment.
114
+
115
+ When no \`tags\` is present, the default is:
116
+
117
+ \`\`\`json
118
+ {
119
+ "file": {
120
+ "initialCommentsOnly": true,
121
+ "mustExist": true,
122
+ "preventDuplicates": true,
123
+ }
124
+ }
125
+ \`\`\`
126
+
127
+ You can add additional tag names and/or override \`file\` if you supply this
128
+ option, e.g., in place of or in addition to \`file\`, giving other potential
129
+ file global tags like \`@license\`, \`@copyright\`, \`@author\`, \`@module\` or
130
+ \`@exports\`, optionally restricting them to a single use or preventing them
131
+ from being preceded by anything besides comments.
132
+
133
+ For example:
134
+
135
+ \`\`\`js
136
+ {
137
+ "license": {
138
+ "mustExist": true,
139
+ "preventDuplicates": true,
140
+ }
141
+ }
142
+ \`\`\`
143
+
144
+ This would require one and only one \`@license\` in the file, though because
145
+ \`initialCommentsOnly\` is absent and defaults to \`false\`, the \`@license\`
146
+ can be anywhere.
147
+
148
+ In the case of \`@license\`, you can use this rule along with the
149
+ \`check-values\` rule (with its \`allowedLicenses\` or \`licensePattern\` options),
150
+ to enforce a license whitelist be present on every JS file.
151
+
152
+ Note that if you choose to use \`preventDuplicates\` with \`license\`, you still
153
+ have a way to allow multiple licenses for the whole page by using the SPDX
154
+ "AND" expression, e.g., \`@license (MIT AND GPL-3.0)\`.
155
+
156
+ Note that the tag names are the main JSDoc tag name, so you should use \`file\`
157
+ in this configuration object regardless of whether you have configured
158
+ \`fileoverview\` instead of \`file\` on \`tagNamePreference\` (i.e., \`fileoverview\`
159
+ will be checked, but you must use \`file\` on the configuration object).
160
+
161
+ `,
101
162
  patternProperties: {
102
163
  '.*': {
103
164
  additionalProperties: false,
@@ -1 +1 @@
1
- {"version":3,"file":"requireFileOverview.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","defaultTags","file","initialCommentsOnly","mustExist","preventDuplicates","setDefaults","state","globalTags","hasDuplicates","hasTag","hasNonCommentBeforeTag","_default","exports","iterateJsdoc","context","jsdocNode","utils","tags","options","tagName","Object","keys","targetTagName","getPreferredTagName","Boolean","hasDuplicate","hasNonComment","range","exit","entries","obj","getPreferredTagNameObject","reportSettings","replacement","iterateAllJsdocs","meta","docs","description","url","schema","additionalProperties","properties","patternProperties","type","nonComment","node","module"],"sources":["../../src/rules/requireFileOverview.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nconst defaultTags = {\n file: {\n initialCommentsOnly: true,\n mustExist: true,\n preventDuplicates: true,\n },\n};\n\n/**\n * @param {import('../iterateJsdoc.js').StateObject} state\n * @returns {void}\n */\nconst setDefaults = (state) => {\n // First iteration\n if (!state.globalTags) {\n state.globalTags = {};\n state.hasDuplicates = {};\n state.hasTag = {};\n state.hasNonCommentBeforeTag = {};\n }\n};\n\nexport default iterateJsdoc(({\n context,\n jsdocNode,\n state,\n utils,\n}) => {\n const {\n tags = defaultTags,\n } = context.options[0] || {};\n\n setDefaults(state);\n\n for (const tagName of Object.keys(tags)) {\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName,\n }));\n\n const hasTag = Boolean(targetTagName && utils.hasTag(targetTagName));\n\n state.hasTag[tagName] = hasTag || state.hasTag[tagName];\n\n const hasDuplicate = state.hasDuplicates[tagName];\n\n if (hasDuplicate === false) {\n // Was marked before, so if a tag now, is a dupe\n state.hasDuplicates[tagName] = hasTag;\n } else if (!hasDuplicate && hasTag) {\n // No dupes set before, but has first tag, so change state\n // from `undefined` to `false` so can detect next time\n state.hasDuplicates[tagName] = false;\n state.hasNonCommentBeforeTag[tagName] = state.hasNonComment &&\n state.hasNonComment < jsdocNode.range[0];\n }\n }\n}, {\n exit ({\n context,\n state,\n utils,\n }) {\n setDefaults(state);\n const {\n tags = defaultTags,\n } = context.options[0] || {};\n\n for (const [\n tagName,\n {\n initialCommentsOnly = false,\n mustExist = false,\n preventDuplicates = false,\n },\n ] of Object.entries(tags)) {\n const obj = utils.getPreferredTagNameObject({\n tagName,\n });\n if (obj && typeof obj === 'object' && 'blocked' in obj) {\n utils.reportSettings(\n `\\`settings.jsdoc.tagNamePreference\\` cannot block @${obj.tagName} ` +\n 'for the `require-file-overview` rule',\n );\n } else {\n const targetTagName = (\n obj && typeof obj === 'object' && obj.replacement\n ) || obj;\n if (mustExist && !state.hasTag[tagName]) {\n utils.reportSettings(`Missing @${targetTagName}`);\n }\n\n if (preventDuplicates && state.hasDuplicates[tagName]) {\n utils.reportSettings(\n `Duplicate @${targetTagName}`,\n );\n }\n\n if (initialCommentsOnly &&\n state.hasNonCommentBeforeTag[tagName]\n ) {\n utils.reportSettings(\n `@${targetTagName} should be at the beginning of the file`,\n );\n }\n }\n }\n },\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Checks that all files have one `@file`, `@fileoverview`, or `@overview` tag at the beginning of the file.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-file-overview.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n tags: {\n patternProperties: {\n '.*': {\n additionalProperties: false,\n properties: {\n initialCommentsOnly: {\n type: 'boolean',\n },\n mustExist: {\n type: 'boolean',\n },\n preventDuplicates: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n },\n type: 'object',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n nonComment ({\n node,\n state,\n }) {\n if (!state.hasNonComment) {\n state.hasNonComment = node.range[0];\n }\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"requireFileOverview.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","defaultTags","file","initialCommentsOnly","mustExist","preventDuplicates","setDefaults","state","globalTags","hasDuplicates","hasTag","hasNonCommentBeforeTag","_default","exports","iterateJsdoc","context","jsdocNode","utils","tags","options","tagName","Object","keys","targetTagName","getPreferredTagName","Boolean","hasDuplicate","hasNonComment","range","exit","entries","obj","getPreferredTagNameObject","reportSettings","replacement","iterateAllJsdocs","meta","docs","description","url","schema","additionalProperties","properties","patternProperties","type","nonComment","node","module"],"sources":["../../src/rules/requireFileOverview.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nconst defaultTags = {\n file: {\n initialCommentsOnly: true,\n mustExist: true,\n preventDuplicates: true,\n },\n};\n\n/**\n * @param {import('../iterateJsdoc.js').StateObject} state\n * @returns {void}\n */\nconst setDefaults = (state) => {\n // First iteration\n if (!state.globalTags) {\n state.globalTags = {};\n state.hasDuplicates = {};\n state.hasTag = {};\n state.hasNonCommentBeforeTag = {};\n }\n};\n\nexport default iterateJsdoc(({\n context,\n jsdocNode,\n state,\n utils,\n}) => {\n const {\n tags = defaultTags,\n } = context.options[0] || {};\n\n setDefaults(state);\n\n for (const tagName of Object.keys(tags)) {\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName,\n }));\n\n const hasTag = Boolean(targetTagName && utils.hasTag(targetTagName));\n\n state.hasTag[tagName] = hasTag || state.hasTag[tagName];\n\n const hasDuplicate = state.hasDuplicates[tagName];\n\n if (hasDuplicate === false) {\n // Was marked before, so if a tag now, is a dupe\n state.hasDuplicates[tagName] = hasTag;\n } else if (!hasDuplicate && hasTag) {\n // No dupes set before, but has first tag, so change state\n // from `undefined` to `false` so can detect next time\n state.hasDuplicates[tagName] = false;\n state.hasNonCommentBeforeTag[tagName] = state.hasNonComment &&\n state.hasNonComment < jsdocNode.range[0];\n }\n }\n}, {\n exit ({\n context,\n state,\n utils,\n }) {\n setDefaults(state);\n const {\n tags = defaultTags,\n } = context.options[0] || {};\n\n for (const [\n tagName,\n {\n initialCommentsOnly = false,\n mustExist = false,\n preventDuplicates = false,\n },\n ] of Object.entries(tags)) {\n const obj = utils.getPreferredTagNameObject({\n tagName,\n });\n if (obj && typeof obj === 'object' && 'blocked' in obj) {\n utils.reportSettings(\n `\\`settings.jsdoc.tagNamePreference\\` cannot block @${obj.tagName} ` +\n 'for the `require-file-overview` rule',\n );\n } else {\n const targetTagName = (\n obj && typeof obj === 'object' && obj.replacement\n ) || obj;\n if (mustExist && !state.hasTag[tagName]) {\n utils.reportSettings(`Missing @${targetTagName}`);\n }\n\n if (preventDuplicates && state.hasDuplicates[tagName]) {\n utils.reportSettings(\n `Duplicate @${targetTagName}`,\n );\n }\n\n if (initialCommentsOnly &&\n state.hasNonCommentBeforeTag[tagName]\n ) {\n utils.reportSettings(\n `@${targetTagName} should be at the beginning of the file`,\n );\n }\n }\n }\n },\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Checks that all files have one `@file`, `@fileoverview`, or `@overview` tag at the beginning of the file.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-file-overview.md#repos-sticky-header',\n },\n schema: [\n {\n additionalProperties: false,\n properties: {\n tags: {\n description: `The keys of this object are tag names, and the values are configuration\nobjects indicating what will be checked for these whole-file tags.\n\nEach configuration object has 3 potential boolean keys (which default\nto \\`false\\` when this option is supplied).\n\n1. \\`mustExist\\` - enforces that all files have a \\`@file\\`, \\`@fileoverview\\`, or \\`@overview\\` tag.\n2. \\`preventDuplicates\\` - enforces that duplicate file overview tags within a given file will be reported\n3. \\`initialCommentsOnly\\` - reports file overview tags which are not, as per\n [the docs](https://jsdoc.app/tags-file.html), \"at the beginning of\n the file\"–where beginning of the file is interpreted in this rule\n as being when the overview tag is not preceded by anything other than\n a comment.\n\nWhen no \\`tags\\` is present, the default is:\n\n\\`\\`\\`json\n{\n \"file\": {\n \"initialCommentsOnly\": true,\n \"mustExist\": true,\n \"preventDuplicates\": true,\n }\n}\n\\`\\`\\`\n\nYou can add additional tag names and/or override \\`file\\` if you supply this\noption, e.g., in place of or in addition to \\`file\\`, giving other potential\nfile global tags like \\`@license\\`, \\`@copyright\\`, \\`@author\\`, \\`@module\\` or\n\\`@exports\\`, optionally restricting them to a single use or preventing them\nfrom being preceded by anything besides comments.\n\nFor example:\n\n\\`\\`\\`js\n{\n \"license\": {\n \"mustExist\": true,\n \"preventDuplicates\": true,\n }\n}\n\\`\\`\\`\n\nThis would require one and only one \\`@license\\` in the file, though because\n\\`initialCommentsOnly\\` is absent and defaults to \\`false\\`, the \\`@license\\`\ncan be anywhere.\n\nIn the case of \\`@license\\`, you can use this rule along with the\n\\`check-values\\` rule (with its \\`allowedLicenses\\` or \\`licensePattern\\` options),\nto enforce a license whitelist be present on every JS file.\n\nNote that if you choose to use \\`preventDuplicates\\` with \\`license\\`, you still\nhave a way to allow multiple licenses for the whole page by using the SPDX\n\"AND\" expression, e.g., \\`@license (MIT AND GPL-3.0)\\`.\n\nNote that the tag names are the main JSDoc tag name, so you should use \\`file\\`\nin this configuration object regardless of whether you have configured\n\\`fileoverview\\` instead of \\`file\\` on \\`tagNamePreference\\` (i.e., \\`fileoverview\\`\nwill be checked, but you must use \\`file\\` on the configuration object).\n\n`,\n patternProperties: {\n '.*': {\n additionalProperties: false,\n properties: {\n initialCommentsOnly: {\n type: 'boolean',\n },\n mustExist: {\n type: 'boolean',\n },\n preventDuplicates: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n },\n type: 'object',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n nonComment ({\n node,\n state,\n }) {\n if (!state.hasNonComment) {\n state.hasNonComment = node.range[0];\n }\n },\n});\n"],"mappings":"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BAAsB,CAACS,OAAO,CAAC,EACvC;UACAH,KAAK,CAACgB,cAAc,CAClB,IAAIV,aAAa,yCACnB,CAAC;QACH;MACF;IACF;EACF,CAAC;EACDY,gBAAgB,EAAE,IAAI;EACtBC,IAAI,EAAE;IACJC,IAAI,EAAE;MACJC,WAAW,EAAE,2GAA2G;MACxHC,GAAG,EAAE;IACP,CAAC;IACDC,MAAM,EAAE,CACN;MACEC,oBAAoB,EAAE,KAAK;MAC3BC,UAAU,EAAE;QACVxB,IAAI,EAAE;UACJoB,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,CAAC;UACWK,iBAAiB,EAAE;YACjB,IAAI,EAAE;cACJF,oBAAoB,EAAE,KAAK;cAC3BC,UAAU,EAAE;gBACVvC,mBAAmB,EAAE;kBACnByC,IAAI,EAAE;gBACR,CAAC;gBACDxC,SAAS,EAAE;kBACTwC,IAAI,EAAE;gBACR,CAAC;gBACDvC,iBAAiB,EAAE;kBACjBuC,IAAI,EAAE;gBACR;cACF,CAAC;cACDA,IAAI,EAAE;YACR;UACF,CAAC;UACDA,IAAI,EAAE;QACR;MACF,CAAC;MACDA,IAAI,EAAE;IACR,CAAC,CACF;IACDA,IAAI,EAAE;EACR,CAAC;EACDC,UAAUA,CAAE;IACVC,IAAI;IACJvC;EACF,CAAC,EAAE;IACD,IAAI,CAACA,KAAK,CAACoB,aAAa,EAAE;MACxBpB,KAAK,CAACoB,aAAa,GAAGmB,IAAI,CAAClB,KAAK,CAAC,CAAC,CAAC;IACrC;EACF;AACF,CAAC,CAAC;AAAAmB,MAAA,CAAAlC,OAAA,GAAAA,OAAA,CAAAb,OAAA","ignoreList":[]}
@@ -115,15 +115,25 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
115
115
  iterateAllJsdocs: true,
116
116
  meta: {
117
117
  docs: {
118
- description: 'Requires a hyphen before the `@param` description.',
118
+ description: 'Requires a hyphen before the `@param` description (and optionally before `@property` descriptions).',
119
119
  url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-hyphen-before-param-description.md#repos-sticky-header'
120
120
  },
121
121
  fixable: 'code',
122
122
  schema: [{
123
+ description: `If the string is \`"always"\` then a problem is raised when there is no hyphen
124
+ before the description. If it is \`"never"\` then a problem is raised when there
125
+ is a hyphen before the description. The default value is \`"always"\`.
126
+
127
+ Even if hyphens are set to "always" appear after the tag name, they will
128
+ actually be forbidden in the event that they are followed immediately by
129
+ the end of a line (this will otherwise cause Visual Studio Code to display
130
+ incorrectly).`,
123
131
  enum: ['always', 'never'],
124
132
  type: 'string'
125
133
  }, {
126
134
  additionalProperties: false,
135
+ description: `The options object may have the following property to indicate behavior for
136
+ other tags besides the \`@param\` tag (or the \`@arg\` tag if so set).`,
127
137
  properties: {
128
138
  tags: {
129
139
  anyOf: [{
@@ -137,7 +147,15 @@ var _default = exports.default = (0, _iterateJsdoc.default)(({
137
147
  }, {
138
148
  enum: ['any'],
139
149
  type: 'string'
140
- }]
150
+ }],
151
+ description: `Object whose keys indicate different tags to check for the
152
+ presence or absence of hyphens; the key value should be "always" or "never",
153
+ indicating how hyphens are to be applied, e.g., \`{property: 'never'}\`
154
+ to ensure \`@property\` never uses hyphens. A key can also be set as \`*\`, e.g.,
155
+ \`'*': 'always'\` to apply hyphen checking to any tag (besides the preferred
156
+ \`@param\` tag which follows the main string option setting and besides any
157
+ other \`tags\` entries).
158
+ `
141
159
  }
142
160
  },
143
161
  type: 'object'
@@ -1 +1 @@
1
- {"version":3,"file":"requireHyphenBeforeParamDescription.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","mainCircumstance","tags","options","tgs","checkHyphens","jsdocTag","targetTagName","circumstance","always","desc","getTagDescription","trim","startsWithHyphen","test","hyphenNewline","lines","tokens","source","description","fixIt","replace","name","reportJSDoc","line","number","postName","forEachPreferredTag","tagEntries","Object","entries","tagName","preferredParamTag","getPreferredTagName","tag","some","tagNme","iterateAllJsdocs","meta","docs","url","fixable","schema","enum","type","additionalProperties","properties","anyOf","patternProperties","module"],"sources":["../../src/rules/requireHyphenBeforeParamDescription.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const [\n mainCircumstance,\n {\n tags = null,\n } = {},\n ] = context.options;\n\n const tgs = /**\n * @type {null|\"any\"|{[key: string]: \"always\"|\"never\"}}\n */ (tags);\n\n /**\n * @param {import('@es-joy/jsdoccomment').JsdocTagWithInline} jsdocTag\n * @param {string} targetTagName\n * @param {\"always\"|\"never\"} [circumstance]\n * @returns {void}\n */\n const checkHyphens = (jsdocTag, targetTagName, circumstance = mainCircumstance) => {\n const always = !circumstance || circumstance === 'always';\n const desc = /** @type {string} */ (utils.getTagDescription(jsdocTag));\n if (!desc.trim()) {\n return;\n }\n\n const startsWithHyphen = (/^\\s*-/v).test(desc);\n const hyphenNewline = (/^\\s*-\\n/v).test(desc);\n\n let lines = 0;\n for (const {\n tokens,\n } of jsdocTag.source) {\n if (tokens.description) {\n break;\n }\n\n lines++;\n }\n\n if (always && !hyphenNewline) {\n if (!startsWithHyphen) {\n let fixIt = true;\n for (const {\n tokens,\n } of jsdocTag.source) {\n if (tokens.description) {\n tokens.description = tokens.description.replace(\n /^(\\s*)/v, '$1- ',\n );\n break;\n }\n\n // Linebreak after name since has no description\n if (tokens.name) {\n fixIt = false;\n break;\n }\n }\n\n if (fixIt) {\n utils.reportJSDoc(\n `There must be a hyphen before @${targetTagName} description.`,\n {\n line: jsdocTag.source[0].number + lines,\n },\n () => {},\n );\n }\n }\n } else if (startsWithHyphen) {\n utils.reportJSDoc(\n always ?\n `There must be no hyphen followed by newline after the @${targetTagName} name.` :\n `There must be no hyphen before @${targetTagName} description.`,\n {\n line: jsdocTag.source[0].number + lines,\n },\n () => {\n for (const {\n tokens,\n } of jsdocTag.source) {\n if (tokens.description) {\n tokens.description = tokens.description.replace(\n /^\\s*-\\s*/v, '',\n );\n if (hyphenNewline) {\n tokens.postName = '';\n }\n\n break;\n }\n }\n },\n true,\n );\n }\n };\n\n utils.forEachPreferredTag('param', checkHyphens);\n if (tgs) {\n const tagEntries = Object.entries(tgs);\n for (const [\n tagName,\n circumstance,\n ] of tagEntries) {\n if (tagName === '*') {\n const preferredParamTag = utils.getPreferredTagName({\n tagName: 'param',\n });\n for (const {\n tag,\n } of jsdoc.tags) {\n if (tag === preferredParamTag || tagEntries.some(([\n tagNme,\n ]) => {\n return tagNme !== '*' && tagNme === tag;\n })) {\n continue;\n }\n\n utils.forEachPreferredTag(tag, (jsdocTag, targetTagName) => {\n checkHyphens(\n jsdocTag,\n targetTagName,\n /** @type {\"always\"|\"never\"} */ (circumstance),\n );\n });\n }\n\n continue;\n }\n\n utils.forEachPreferredTag(tagName, (jsdocTag, targetTagName) => {\n checkHyphens(\n jsdocTag,\n targetTagName,\n /** @type {\"always\"|\"never\"} */ (circumstance),\n );\n });\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Requires a hyphen before the `@param` description.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-hyphen-before-param-description.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n enum: [\n 'always', 'never',\n ],\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n tags: {\n anyOf: [\n {\n patternProperties: {\n '.*': {\n enum: [\n 'always', 'never',\n ],\n type: 'string',\n },\n },\n type: 'object',\n },\n {\n enum: [\n 'any',\n ],\n type: 'string',\n },\n ],\n },\n },\n type: 'object',\n },\n ],\n type: 'layout',\n },\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"requireHyphenBeforeParamDescription.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","_default","exports","iterateJsdoc","context","jsdoc","utils","mainCircumstance","tags","options","tgs","checkHyphens","jsdocTag","targetTagName","circumstance","always","desc","getTagDescription","trim","startsWithHyphen","test","hyphenNewline","lines","tokens","source","description","fixIt","replace","name","reportJSDoc","line","number","postName","forEachPreferredTag","tagEntries","Object","entries","tagName","preferredParamTag","getPreferredTagName","tag","some","tagNme","iterateAllJsdocs","meta","docs","url","fixable","schema","enum","type","additionalProperties","properties","anyOf","patternProperties","module"],"sources":["../../src/rules/requireHyphenBeforeParamDescription.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const [\n mainCircumstance,\n {\n tags = null,\n } = {},\n ] = context.options;\n\n const tgs = /**\n * @type {null|\"any\"|{[key: string]: \"always\"|\"never\"}}\n */ (tags);\n\n /**\n * @param {import('@es-joy/jsdoccomment').JsdocTagWithInline} jsdocTag\n * @param {string} targetTagName\n * @param {\"always\"|\"never\"} [circumstance]\n * @returns {void}\n */\n const checkHyphens = (jsdocTag, targetTagName, circumstance = mainCircumstance) => {\n const always = !circumstance || circumstance === 'always';\n const desc = /** @type {string} */ (utils.getTagDescription(jsdocTag));\n if (!desc.trim()) {\n return;\n }\n\n const startsWithHyphen = (/^\\s*-/v).test(desc);\n const hyphenNewline = (/^\\s*-\\n/v).test(desc);\n\n let lines = 0;\n for (const {\n tokens,\n } of jsdocTag.source) {\n if (tokens.description) {\n break;\n }\n\n lines++;\n }\n\n if (always && !hyphenNewline) {\n if (!startsWithHyphen) {\n let fixIt = true;\n for (const {\n tokens,\n } of jsdocTag.source) {\n if (tokens.description) {\n tokens.description = tokens.description.replace(\n /^(\\s*)/v, '$1- ',\n );\n break;\n }\n\n // Linebreak after name since has no description\n if (tokens.name) {\n fixIt = false;\n break;\n }\n }\n\n if (fixIt) {\n utils.reportJSDoc(\n `There must be a hyphen before @${targetTagName} description.`,\n {\n line: jsdocTag.source[0].number + lines,\n },\n () => {},\n );\n }\n }\n } else if (startsWithHyphen) {\n utils.reportJSDoc(\n always ?\n `There must be no hyphen followed by newline after the @${targetTagName} name.` :\n `There must be no hyphen before @${targetTagName} description.`,\n {\n line: jsdocTag.source[0].number + lines,\n },\n () => {\n for (const {\n tokens,\n } of jsdocTag.source) {\n if (tokens.description) {\n tokens.description = tokens.description.replace(\n /^\\s*-\\s*/v, '',\n );\n if (hyphenNewline) {\n tokens.postName = '';\n }\n\n break;\n }\n }\n },\n true,\n );\n }\n };\n\n utils.forEachPreferredTag('param', checkHyphens);\n if (tgs) {\n const tagEntries = Object.entries(tgs);\n for (const [\n tagName,\n circumstance,\n ] of tagEntries) {\n if (tagName === '*') {\n const preferredParamTag = utils.getPreferredTagName({\n tagName: 'param',\n });\n for (const {\n tag,\n } of jsdoc.tags) {\n if (tag === preferredParamTag || tagEntries.some(([\n tagNme,\n ]) => {\n return tagNme !== '*' && tagNme === tag;\n })) {\n continue;\n }\n\n utils.forEachPreferredTag(tag, (jsdocTag, targetTagName) => {\n checkHyphens(\n jsdocTag,\n targetTagName,\n /** @type {\"always\"|\"never\"} */ (circumstance),\n );\n });\n }\n\n continue;\n }\n\n utils.forEachPreferredTag(tagName, (jsdocTag, targetTagName) => {\n checkHyphens(\n jsdocTag,\n targetTagName,\n /** @type {\"always\"|\"never\"} */ (circumstance),\n );\n });\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Requires a hyphen before the `@param` description (and optionally before `@property` descriptions).',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-hyphen-before-param-description.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n description: `If the string is \\`\"always\"\\` then a problem is raised when there is no hyphen\nbefore the description. If it is \\`\"never\"\\` then a problem is raised when there\nis a hyphen before the description. The default value is \\`\"always\"\\`.\n\nEven if hyphens are set to \"always\" appear after the tag name, they will\nactually be forbidden in the event that they are followed immediately by\nthe end of a line (this will otherwise cause Visual Studio Code to display\nincorrectly).`,\n enum: [\n 'always', 'never',\n ],\n type: 'string',\n },\n {\n additionalProperties: false,\n description: `The options object may have the following property to indicate behavior for\nother tags besides the \\`@param\\` tag (or the \\`@arg\\` tag if so set).`,\n properties: {\n tags: {\n anyOf: [\n {\n patternProperties: {\n '.*': {\n enum: [\n 'always', 'never',\n ],\n type: 'string',\n },\n },\n type: 'object',\n },\n {\n enum: [\n 'any',\n ],\n type: 'string',\n },\n ],\n description: `Object whose keys indicate different tags to check for the\n presence or absence of hyphens; the key value should be \"always\" or \"never\",\n indicating how hyphens are to be applied, e.g., \\`{property: 'never'}\\`\n to ensure \\`@property\\` never uses hyphens. A key can also be set as \\`*\\`, e.g.,\n \\`'*': 'always'\\` to apply hyphen checking to any tag (besides the preferred\n \\`@param\\` tag which follows the main string option setting and besides any\n other \\`tags\\` entries).\n`,\n },\n },\n type: 'object',\n },\n ],\n type: 'layout',\n },\n});\n"],"mappings":"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","ignoreList":[]}
@@ -26,9 +26,13 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
26
26
  /** @type {import('json-schema').JSONSchema4} */
27
27
  const OPTIONS_SCHEMA = {
28
28
  additionalProperties: false,
29
+ description: 'Has the following optional keys.\n',
29
30
  properties: {
30
31
  checkConstructors: {
31
32
  default: true,
33
+ description: `A value indicating whether \`constructor\`s should be checked. Defaults to
34
+ \`true\`. When \`true\`, \`exemptEmptyConstructors\` may still avoid reporting when
35
+ no parameters or return values are found.`,
32
36
  type: 'boolean'
33
37
  },
34
38
  checkGetters: {
@@ -38,7 +42,13 @@ const OPTIONS_SCHEMA = {
38
42
  enum: ['no-setter'],
39
43
  type: 'string'
40
44
  }],
41
- default: true
45
+ default: true,
46
+ description: `A value indicating whether getters should be checked. Besides setting as a
47
+ boolean, this option can be set to the string \`"no-setter"\` to indicate that
48
+ getters should be checked but only when there is no setter. This may be useful
49
+ if one only wishes documentation on one of the two accessors. Defaults to
50
+ \`false\`.
51
+ `
42
52
  },
43
53
  checkSetters: {
44
54
  anyOf: [{
@@ -47,9 +57,29 @@ const OPTIONS_SCHEMA = {
47
57
  enum: ['no-getter'],
48
58
  type: 'string'
49
59
  }],
50
- default: true
60
+ default: true,
61
+ description: `A value indicating whether setters should be checked. Besides setting as a
62
+ boolean, this option can be set to the string \`"no-getter"\` to indicate that
63
+ setters should be checked but only when there is no getter. This may be useful
64
+ if one only wishes documentation on one of the two accessors. Defaults to
65
+ \`false\`.`
51
66
  },
52
67
  contexts: {
68
+ description: `Set this to an array of strings or objects representing the additional AST
69
+ contexts where you wish the rule to be applied (e.g., \`Property\` for
70
+ properties). If specified as an object, it should have a \`context\` property
71
+ and can have an \`inlineCommentBlock\` property which, if set to \`true\`, will
72
+ add an inline \`/** */\` instead of the regular, multi-line, indented jsdoc
73
+ block which will otherwise be added. Defaults to an empty array. Contexts
74
+ may also have their own \`minLineCount\` property which is an integer
75
+ indicating a minimum number of lines expected for a node in order
76
+ for it to require documentation.
77
+
78
+ Note that you may need to disable \`require\` items (e.g., \`MethodDefinition\`)
79
+ if you are specifying a more precise form in \`contexts\` (e.g., \`MethodDefinition:not([accessibility="private"] > FunctionExpression\`).
80
+
81
+ See the ["AST and Selectors"](../#advanced-ast-and-selectors)
82
+ section of our Advanced docs for more on the expected format.`,
53
83
  items: {
54
84
  anyOf: [{
55
85
  type: 'string'
@@ -73,28 +103,62 @@ const OPTIONS_SCHEMA = {
73
103
  },
74
104
  enableFixer: {
75
105
  default: true,
106
+ description: `A boolean on whether to enable the fixer (which adds an empty JSDoc block).
107
+ Defaults to \`true\`.`,
76
108
  type: 'boolean'
77
109
  },
78
110
  exemptEmptyConstructors: {
79
111
  default: false,
112
+ description: `When \`true\`, the rule will not report missing JSDoc blocks above constructors
113
+ with no parameters or return values (this is enabled by default as the class
114
+ name or description should be seen as sufficient to convey intent).
115
+
116
+ Defaults to \`true\`.`,
80
117
  type: 'boolean'
81
118
  },
82
119
  exemptEmptyFunctions: {
83
120
  default: false,
121
+ description: `When \`true\`, the rule will not report missing JSDoc blocks above
122
+ functions/methods with no parameters or return values (intended where
123
+ function/method names are sufficient for themselves as documentation).
124
+
125
+ Defaults to \`false\`.
126
+ `,
84
127
  type: 'boolean'
85
128
  },
86
129
  exemptOverloadedImplementations: {
87
130
  default: false,
131
+ description: `If set to \`true\` will avoid checking an overloaded function's implementation.
132
+
133
+ Defaults to \`false\`.`,
88
134
  type: 'boolean'
89
135
  },
90
136
  fixerMessage: {
91
137
  default: '',
138
+ description: `An optional message to add to the inserted JSDoc block. Defaults to the
139
+ empty string.`,
92
140
  type: 'string'
93
141
  },
94
142
  minLineCount: {
143
+ description: `An integer to indicate a minimum number of lines expected for a node in order
144
+ for it to require documentation. Defaults to \`undefined\`. This option will
145
+ apply to any context; see \`contexts\` for line counts specific to a context.`,
95
146
  type: 'integer'
96
147
  },
97
148
  publicOnly: {
149
+ description: `This option will insist that missing JSDoc blocks are only reported for
150
+ function bodies / class declarations that are exported from the module.
151
+ May be a boolean or object. If set to \`true\`, the defaults below will be
152
+ used. If unset, JSDoc block reporting will not be limited to exports.
153
+
154
+ This object supports the following optional boolean keys (\`false\` unless
155
+ otherwise noted):
156
+
157
+ - \`ancestorsOnly\` - Optimization to only check node ancestors to check if node is exported
158
+ - \`esm\` - ESM exports are checked for JSDoc comments (Defaults to \`true\`)
159
+ - \`cjs\` - CommonJS exports are checked for JSDoc comments (Defaults to \`true\`)
160
+ - \`window\` - Window global exports are checked for JSDoc comments
161
+ `,
98
162
  oneOf: [{
99
163
  default: false,
100
164
  type: 'boolean'
@@ -121,29 +185,37 @@ const OPTIONS_SCHEMA = {
121
185
  require: {
122
186
  additionalProperties: false,
123
187
  default: {},
188
+ description: `An object with the following optional boolean keys which all default to
189
+ \`false\` except for \`FunctionDeclaration\` which defaults to \`true\`.`,
124
190
  properties: {
125
191
  ArrowFunctionExpression: {
126
192
  default: false,
193
+ description: 'Whether to check arrow functions like `() => {}`',
127
194
  type: 'boolean'
128
195
  },
129
196
  ClassDeclaration: {
130
197
  default: false,
198
+ description: 'Whether to check declarations like `class A {}`',
131
199
  type: 'boolean'
132
200
  },
133
201
  ClassExpression: {
134
202
  default: false,
203
+ description: 'Whether to check class expressions like `const myClass = class {}`',
135
204
  type: 'boolean'
136
205
  },
137
206
  FunctionDeclaration: {
138
207
  default: true,
208
+ description: 'Whether to check function declarations like `function a {}`',
139
209
  type: 'boolean'
140
210
  },
141
211
  FunctionExpression: {
142
212
  default: false,
213
+ description: 'Whether to check function expressions like `const a = function {}`',
143
214
  type: 'boolean'
144
215
  },
145
216
  MethodDefinition: {
146
217
  default: false,
218
+ description: 'Whether to check method definitions like `class A { someMethodDefinition () {} }`',
147
219
  type: 'boolean'
148
220
  }
149
221
  },
@@ -151,6 +223,13 @@ const OPTIONS_SCHEMA = {
151
223
  },
152
224
  skipInterveningOverloadedDeclarations: {
153
225
  default: true,
226
+ description: `If \`true\`, will skip above uncommented overloaded functions to check
227
+ for a comment block (e.g., at the top of a set of overloaded functions).
228
+
229
+ If \`false\`, will force each overloaded function to be checked for a
230
+ comment block.
231
+
232
+ Defaults to \`true\`.`,
154
233
  type: 'boolean'
155
234
  }
156
235
  },
@@ -619,7 +698,7 @@ var _default = exports.default = {
619
698
  meta: {
620
699
  docs: {
621
700
  category: 'Stylistic Issues',
622
- description: 'Require JSDoc comments',
701
+ description: 'Checks for presence of JSDoc comments, on functions and potentially other contexts (optionally limited to exports).',
623
702
  recommended: true,
624
703
  url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-jsdoc.md#repos-sticky-header'
625
704
  },