eslint-plugin-jsdoc 52.0.4 → 53.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.
- package/dist/WarnSettings.cjs +18 -35
- package/dist/WarnSettings.cjs.map +1 -1
- package/dist/WarnSettings.js +20 -0
- package/dist/WarnSettings.js.map +1 -0
- package/dist/_virtual/rolldown_runtime.cjs +32 -0
- package/dist/_virtual/rolldown_runtime.js +11 -0
- package/dist/alignTransform.cjs +224 -305
- package/dist/alignTransform.cjs.map +1 -1
- package/dist/alignTransform.js +241 -0
- package/dist/alignTransform.js.map +1 -0
- package/dist/defaultTagOrder.cjs +132 -43
- package/dist/defaultTagOrder.cjs.map +1 -1
- package/dist/defaultTagOrder.js +134 -0
- package/dist/defaultTagOrder.js.map +1 -0
- package/dist/exportParser.cjs +478 -696
- package/dist/exportParser.cjs.map +1 -1
- package/dist/exportParser.js +518 -0
- package/dist/exportParser.js.map +1 -0
- package/dist/getDefaultTagStructureForMode.cjs +184 -288
- package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
- package/dist/getDefaultTagStructureForMode.js +188 -0
- package/dist/getDefaultTagStructureForMode.js.map +1 -0
- package/dist/getJsdocProcessorPlugin.cjs +364 -550
- package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
- package/dist/getJsdocProcessorPlugin.d.cts +70 -0
- package/dist/getJsdocProcessorPlugin.d.cts.map +1 -0
- package/dist/getJsdocProcessorPlugin.d.ts +68 -65
- package/dist/getJsdocProcessorPlugin.d.ts.map +1 -1
- package/dist/getJsdocProcessorPlugin.js +383 -0
- package/dist/getJsdocProcessorPlugin.js.map +1 -0
- package/dist/index.cjs +2 -410
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -17
- package/dist/index.js +3 -0
- package/dist/iterateJsdoc.cjs +1528 -1988
- package/dist/iterateJsdoc.cjs.map +1 -1
- package/dist/iterateJsdoc.d.cts +471 -0
- package/dist/iterateJsdoc.d.cts.map +1 -0
- package/dist/iterateJsdoc.d.ts +358 -349
- package/dist/iterateJsdoc.d.ts.map +1 -1
- package/dist/iterateJsdoc.js +1617 -0
- package/dist/iterateJsdoc.js.map +1 -0
- package/dist/jsdocUtils.cjs +1009 -1376
- package/dist/jsdocUtils.cjs.map +1 -1
- package/dist/jsdocUtils.js +1123 -0
- package/dist/jsdocUtils.js.map +1 -0
- package/dist/plugin.cjs +427 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.js +427 -0
- package/dist/plugin.js.map +1 -0
- package/dist/rules/checkAccess.cjs +29 -36
- package/dist/rules/checkAccess.cjs.map +1 -1
- package/dist/rules/checkAccess.js +33 -0
- package/dist/rules/checkAccess.js.map +1 -0
- package/dist/rules/checkAlignment.cjs +41 -54
- package/dist/rules/checkAlignment.cjs.map +1 -1
- package/dist/rules/checkAlignment.js +47 -0
- package/dist/rules/checkAlignment.js.map +1 -0
- package/dist/rules/checkExamples.cjs +327 -484
- package/dist/rules/checkExamples.cjs.map +1 -1
- package/dist/rules/checkExamples.js +348 -0
- package/dist/rules/checkExamples.js.map +1 -0
- package/dist/rules/checkIndentation.cjs +50 -65
- package/dist/rules/checkIndentation.cjs.map +1 -1
- package/dist/rules/checkIndentation.js +59 -0
- package/dist/rules/checkIndentation.js.map +1 -0
- package/dist/rules/checkLineAlignment.cjs +220 -311
- package/dist/rules/checkLineAlignment.cjs.map +1 -1
- package/dist/rules/checkLineAlignment.js +229 -0
- package/dist/rules/checkLineAlignment.js.map +1 -0
- package/dist/rules/checkParamNames.cjs +227 -335
- package/dist/rules/checkParamNames.cjs.map +1 -1
- package/dist/rules/checkParamNames.js +237 -0
- package/dist/rules/checkParamNames.js.map +1 -0
- package/dist/rules/checkPropertyNames.cjs +78 -106
- package/dist/rules/checkPropertyNames.cjs.map +1 -1
- package/dist/rules/checkPropertyNames.js +88 -0
- package/dist/rules/checkPropertyNames.js.map +1 -0
- package/dist/rules/checkSyntax.cjs +21 -34
- package/dist/rules/checkSyntax.cjs.map +1 -1
- package/dist/rules/checkSyntax.js +25 -0
- package/dist/rules/checkSyntax.js.map +1 -0
- package/dist/rules/checkTagNames.cjs +188 -210
- package/dist/rules/checkTagNames.cjs.map +1 -1
- package/dist/rules/checkTagNames.js +191 -0
- package/dist/rules/checkTagNames.js.map +1 -0
- package/dist/rules/checkTemplateNames.cjs +121 -178
- package/dist/rules/checkTemplateNames.cjs.map +1 -1
- package/dist/rules/checkTemplateNames.js +124 -0
- package/dist/rules/checkTemplateNames.js.map +1 -0
- package/dist/rules/checkTypes.cjs +291 -385
- package/dist/rules/checkTypes.cjs.map +1 -1
- package/dist/rules/checkTypes.js +299 -0
- package/dist/rules/checkTypes.js.map +1 -0
- package/dist/rules/checkValues.cjs +100 -146
- package/dist/rules/checkValues.cjs.map +1 -1
- package/dist/rules/checkValues.js +103 -0
- package/dist/rules/checkValues.js.map +1 -0
- package/dist/rules/convertToJsdocComments.cjs +228 -306
- package/dist/rules/convertToJsdocComments.cjs.map +1 -1
- package/dist/rules/convertToJsdocComments.js +231 -0
- package/dist/rules/convertToJsdocComments.js.map +1 -0
- package/dist/rules/emptyTags.cjs +62 -72
- package/dist/rules/emptyTags.cjs.map +1 -1
- package/dist/rules/emptyTags.js +67 -0
- package/dist/rules/emptyTags.js.map +1 -0
- package/dist/rules/implementsOnClasses.cjs +36 -56
- package/dist/rules/implementsOnClasses.cjs.map +1 -1
- package/dist/rules/implementsOnClasses.js +40 -0
- package/dist/rules/implementsOnClasses.js.map +1 -0
- package/dist/rules/importsAsDependencies.cjs +62 -99
- package/dist/rules/importsAsDependencies.cjs.map +1 -1
- package/dist/rules/importsAsDependencies.js +68 -0
- package/dist/rules/importsAsDependencies.js.map +1 -0
- package/dist/rules/informativeDocs.cjs +105 -142
- package/dist/rules/informativeDocs.cjs.map +1 -1
- package/dist/rules/informativeDocs.js +110 -0
- package/dist/rules/informativeDocs.js.map +1 -0
- package/dist/rules/linesBeforeBlock.cjs +70 -105
- package/dist/rules/linesBeforeBlock.cjs.map +1 -1
- package/dist/rules/linesBeforeBlock.js +75 -0
- package/dist/rules/linesBeforeBlock.js.map +1 -0
- package/dist/rules/matchDescription.cjs +160 -222
- package/dist/rules/matchDescription.cjs.map +1 -1
- package/dist/rules/matchDescription.js +167 -0
- package/dist/rules/matchDescription.js.map +1 -0
- package/dist/rules/matchName.cjs +73 -128
- package/dist/rules/matchName.cjs.map +1 -1
- package/dist/rules/matchName.js +77 -0
- package/dist/rules/matchName.js.map +1 -0
- package/dist/rules/multilineBlocks.cjs +235 -352
- package/dist/rules/multilineBlocks.cjs.map +1 -1
- package/dist/rules/multilineBlocks.js +245 -0
- package/dist/rules/multilineBlocks.js.map +1 -0
- package/dist/rules/noBadBlocks.cjs +63 -86
- package/dist/rules/noBadBlocks.cjs.map +1 -1
- package/dist/rules/noBadBlocks.js +68 -0
- package/dist/rules/noBadBlocks.js.map +1 -0
- package/dist/rules/noBlankBlockDescriptions.cjs +35 -57
- package/dist/rules/noBlankBlockDescriptions.cjs.map +1 -1
- package/dist/rules/noBlankBlockDescriptions.js +41 -0
- package/dist/rules/noBlankBlockDescriptions.js.map +1 -0
- package/dist/rules/noBlankBlocks.cjs +26 -48
- package/dist/rules/noBlankBlocks.cjs.map +1 -1
- package/dist/rules/noBlankBlocks.js +30 -0
- package/dist/rules/noBlankBlocks.js.map +1 -0
- package/dist/rules/noDefaults.cjs +52 -79
- package/dist/rules/noDefaults.cjs.map +1 -1
- package/dist/rules/noDefaults.js +56 -0
- package/dist/rules/noDefaults.js.map +1 -0
- package/dist/rules/noMissingSyntax.cjs +115 -165
- package/dist/rules/noMissingSyntax.cjs.map +1 -1
- package/dist/rules/noMissingSyntax.js +126 -0
- package/dist/rules/noMissingSyntax.js.map +1 -0
- package/dist/rules/noMultiAsterisks.cjs +48 -89
- package/dist/rules/noMultiAsterisks.cjs.map +1 -1
- package/dist/rules/noMultiAsterisks.js +58 -0
- package/dist/rules/noMultiAsterisks.js.map +1 -0
- package/dist/rules/noRestrictedSyntax.cjs +45 -79
- package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
- package/dist/rules/noRestrictedSyntax.js +49 -0
- package/dist/rules/noRestrictedSyntax.js.map +1 -0
- package/dist/rules/noTypes.cjs +59 -80
- package/dist/rules/noTypes.cjs.map +1 -1
- package/dist/rules/noTypes.js +65 -0
- package/dist/rules/noTypes.js.map +1 -0
- package/dist/rules/noUndefinedTypes.cjs +297 -388
- package/dist/rules/noUndefinedTypes.cjs.map +1 -1
- package/dist/rules/noUndefinedTypes.js +303 -0
- package/dist/rules/noUndefinedTypes.js.map +1 -0
- package/dist/rules/requireAsteriskPrefix.cjs +108 -159
- package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
- package/dist/rules/requireAsteriskPrefix.js +112 -0
- package/dist/rules/requireAsteriskPrefix.js.map +1 -0
- package/dist/rules/requireDescription.cjs +89 -129
- package/dist/rules/requireDescription.cjs.map +1 -1
- package/dist/rules/requireDescription.js +95 -0
- package/dist/rules/requireDescription.js.map +1 -0
- package/dist/rules/requireDescriptionCompleteSentence.cjs +201 -262
- package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
- package/dist/rules/requireDescriptionCompleteSentence.js +220 -0
- package/dist/rules/requireDescriptionCompleteSentence.js.map +1 -0
- package/dist/rules/requireExample.cjs +73 -104
- package/dist/rules/requireExample.cjs.map +1 -1
- package/dist/rules/requireExample.js +77 -0
- package/dist/rules/requireExample.js.map +1 -0
- package/dist/rules/requireFileOverview.cjs +75 -129
- package/dist/rules/requireFileOverview.cjs.map +1 -1
- package/dist/rules/requireFileOverview.js +81 -0
- package/dist/rules/requireFileOverview.js.map +1 -0
- package/dist/rules/requireHyphenBeforeParamDescription.cjs +85 -133
- package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
- package/dist/rules/requireHyphenBeforeParamDescription.js +89 -0
- package/dist/rules/requireHyphenBeforeParamDescription.js.map +1 -0
- package/dist/rules/requireJsdoc.cjs +384 -557
- package/dist/rules/requireJsdoc.cjs.map +1 -1
- package/dist/rules/requireJsdoc.js +404 -0
- package/dist/rules/requireJsdoc.js.map +1 -0
- package/dist/rules/requireParam.cjs +336 -526
- package/dist/rules/requireParam.cjs.map +1 -1
- package/dist/rules/requireParam.js +344 -0
- package/dist/rules/requireParam.js.map +1 -0
- package/dist/rules/requireParamDescription.cjs +55 -80
- package/dist/rules/requireParamDescription.cjs.map +1 -1
- package/dist/rules/requireParamDescription.js +59 -0
- package/dist/rules/requireParamDescription.js.map +1 -0
- package/dist/rules/requireParamName.cjs +32 -50
- package/dist/rules/requireParamName.cjs.map +1 -1
- package/dist/rules/requireParamName.js +36 -0
- package/dist/rules/requireParamName.js.map +1 -0
- package/dist/rules/requireParamType.cjs +55 -80
- package/dist/rules/requireParamType.cjs.map +1 -1
- package/dist/rules/requireParamType.js +59 -0
- package/dist/rules/requireParamType.js.map +1 -0
- package/dist/rules/requireProperty.cjs +31 -42
- package/dist/rules/requireProperty.cjs.map +1 -1
- package/dist/rules/requireProperty.js +35 -0
- package/dist/rules/requireProperty.js.map +1 -0
- package/dist/rules/requirePropertyDescription.cjs +17 -25
- package/dist/rules/requirePropertyDescription.cjs.map +1 -1
- package/dist/rules/requirePropertyDescription.js +21 -0
- package/dist/rules/requirePropertyDescription.js.map +1 -0
- package/dist/rules/requirePropertyName.cjs +17 -25
- package/dist/rules/requirePropertyName.cjs.map +1 -1
- package/dist/rules/requirePropertyName.js +21 -0
- package/dist/rules/requirePropertyName.js.map +1 -0
- package/dist/rules/requirePropertyType.cjs +17 -25
- package/dist/rules/requirePropertyType.cjs.map +1 -1
- package/dist/rules/requirePropertyType.js +21 -0
- package/dist/rules/requirePropertyType.js.map +1 -0
- package/dist/rules/requireReturns.cjs +125 -203
- package/dist/rules/requireReturns.cjs.map +1 -1
- package/dist/rules/requireReturns.js +131 -0
- package/dist/rules/requireReturns.js.map +1 -0
- package/dist/rules/requireReturnsCheck.cjs +60 -103
- package/dist/rules/requireReturnsCheck.cjs.map +1 -1
- package/dist/rules/requireReturnsCheck.js +66 -0
- package/dist/rules/requireReturnsCheck.js.map +1 -0
- package/dist/rules/requireReturnsDescription.cjs +39 -54
- package/dist/rules/requireReturnsDescription.cjs.map +1 -1
- package/dist/rules/requireReturnsDescription.js +43 -0
- package/dist/rules/requireReturnsDescription.js.map +1 -0
- package/dist/rules/requireReturnsType.cjs +32 -50
- package/dist/rules/requireReturnsType.cjs.map +1 -1
- package/dist/rules/requireReturnsType.js +36 -0
- package/dist/rules/requireReturnsType.js.map +1 -0
- package/dist/rules/requireTemplate.cjs +119 -178
- package/dist/rules/requireTemplate.cjs.map +1 -1
- package/dist/rules/requireTemplate.js +122 -0
- package/dist/rules/requireTemplate.js.map +1 -0
- package/dist/rules/requireThrows.cjs +61 -95
- package/dist/rules/requireThrows.cjs.map +1 -1
- package/dist/rules/requireThrows.js +67 -0
- package/dist/rules/requireThrows.js.map +1 -0
- package/dist/rules/requireYields.cjs +106 -166
- package/dist/rules/requireYields.cjs.map +1 -1
- package/dist/rules/requireYields.js +115 -0
- package/dist/rules/requireYields.js.map +1 -0
- package/dist/rules/requireYieldsCheck.cjs +96 -152
- package/dist/rules/requireYieldsCheck.cjs.map +1 -1
- package/dist/rules/requireYieldsCheck.js +105 -0
- package/dist/rules/requireYieldsCheck.js.map +1 -0
- package/dist/rules/sortTags.cjs +258 -444
- package/dist/rules/sortTags.cjs.map +1 -1
- package/dist/rules/sortTags.js +262 -0
- package/dist/rules/sortTags.js.map +1 -0
- package/dist/rules/tagLines.cjs +179 -266
- package/dist/rules/tagLines.cjs.map +1 -1
- package/dist/rules/tagLines.js +183 -0
- package/dist/rules/tagLines.js.map +1 -0
- package/dist/rules/textEscaping.cjs +92 -127
- package/dist/rules/textEscaping.cjs.map +1 -1
- package/dist/rules/textEscaping.js +102 -0
- package/dist/rules/textEscaping.js.map +1 -0
- package/dist/rules/validTypes.cjs +252 -265
- package/dist/rules/validTypes.cjs.map +1 -1
- package/dist/rules/validTypes.js +259 -0
- package/dist/rules/validTypes.js.map +1 -0
- package/dist/tagNames.cjs +134 -170
- package/dist/tagNames.cjs.map +1 -1
- package/dist/tagNames.js +144 -0
- package/dist/tagNames.js.map +1 -0
- package/dist/utils/hasReturnValue.cjs +246 -474
- package/dist/utils/hasReturnValue.cjs.map +1 -1
- package/dist/utils/hasReturnValue.js +265 -0
- package/dist/utils/hasReturnValue.js.map +1 -0
- package/package.json +40 -24
- package/dist/generateRule.cjs +0 -242
- package/dist/generateRule.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/src/WarnSettings.js +0 -34
- package/src/alignTransform.js +0 -358
- package/src/defaultTagOrder.js +0 -169
- package/src/exportParser.js +0 -978
- package/src/getDefaultTagStructureForMode.js +0 -969
- package/src/getJsdocProcessorPlugin.js +0 -672
- package/src/index.js +0 -530
- package/src/iterateJsdoc.js +0 -2518
- package/src/jsdocUtils.js +0 -1896
- package/src/rules/checkAccess.js +0 -45
- package/src/rules/checkAlignment.js +0 -63
- package/src/rules/checkExamples.js +0 -589
- package/src/rules/checkIndentation.js +0 -75
- package/src/rules/checkLineAlignment.js +0 -372
- package/src/rules/checkParamNames.js +0 -474
- package/src/rules/checkPropertyNames.js +0 -152
- package/src/rules/checkSyntax.js +0 -30
- package/src/rules/checkTagNames.js +0 -314
- package/src/rules/checkTemplateNames.js +0 -204
- package/src/rules/checkTypes.js +0 -535
- package/src/rules/checkValues.js +0 -248
- package/src/rules/convertToJsdocComments.js +0 -398
- package/src/rules/emptyTags.js +0 -98
- package/src/rules/implementsOnClasses.js +0 -64
- package/src/rules/importsAsDependencies.js +0 -133
- package/src/rules/informativeDocs.js +0 -189
- package/src/rules/linesBeforeBlock.js +0 -134
- package/src/rules/matchDescription.js +0 -286
- package/src/rules/matchName.js +0 -151
- package/src/rules/multilineBlocks.js +0 -493
- package/src/rules/noBadBlocks.js +0 -119
- package/src/rules/noBlankBlockDescriptions.js +0 -69
- package/src/rules/noBlankBlocks.js +0 -53
- package/src/rules/noDefaults.js +0 -85
- package/src/rules/noMissingSyntax.js +0 -195
- package/src/rules/noMultiAsterisks.js +0 -134
- package/src/rules/noRestrictedSyntax.js +0 -91
- package/src/rules/noTypes.js +0 -93
- package/src/rules/noUndefinedTypes.js +0 -543
- package/src/rules/requireAsteriskPrefix.js +0 -190
- package/src/rules/requireDescription.js +0 -161
- package/src/rules/requireDescriptionCompleteSentence.js +0 -335
- package/src/rules/requireExample.js +0 -118
- package/src/rules/requireFileOverview.js +0 -154
- package/src/rules/requireHyphenBeforeParamDescription.js +0 -176
- package/src/rules/requireJsdoc.js +0 -743
- package/src/rules/requireParam.js +0 -602
- package/src/rules/requireParamDescription.js +0 -89
- package/src/rules/requireParamName.js +0 -55
- package/src/rules/requireParamType.js +0 -89
- package/src/rules/requireProperty.js +0 -48
- package/src/rules/requirePropertyDescription.js +0 -25
- package/src/rules/requirePropertyName.js +0 -25
- package/src/rules/requirePropertyType.js +0 -25
- package/src/rules/requireReturns.js +0 -238
- package/src/rules/requireReturnsCheck.js +0 -145
- package/src/rules/requireReturnsDescription.js +0 -59
- package/src/rules/requireReturnsType.js +0 -51
- package/src/rules/requireTemplate.js +0 -201
- package/src/rules/requireThrows.js +0 -111
- package/src/rules/requireYields.js +0 -216
- package/src/rules/requireYieldsCheck.js +0 -208
- package/src/rules/sortTags.js +0 -558
- package/src/rules/tagLines.js +0 -359
- package/src/rules/textEscaping.js +0 -154
- package/src/rules/validTypes.js +0 -401
- package/src/tagNames.js +0 -238
- package/src/utils/hasReturnValue.js +0 -572
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multilineBlocks.cjs","names":["_iterateJsdoc","_interopRequireDefault","require","e","__esModule","default","checkForShortTags","jsdoc","utils","requireSingleLineUnderCount","tags","length","lastLineWithTag","isUnderCountLimit","hasMultiDescOrType","tagLines","source","reduce","acc","tokens","delimiter","description","desc","name","postDelimiter","postName","postTag","postType","start","tag","type","idx","fixer","number","seedTokens","trimEnd","end","reportJSDoc","checkForShortDescriptions","lastLineWithDesc","descLines","_default","exports","iterateJsdoc","context","allowMultipleTags","minimumLengthForMultiline","Number","POSITIVE_INFINITY","multilineTags","noFinalLineText","noMultilineBlocks","noSingleLineBlocks","noZeroLineText","singleLineTags","options","sourceLength","isInvalidSingleLine","tagName","includes","slice","makeMultiline","lineChecks","line","emptyTokens","addLine","finalLine","finalLineTokens","trim","prop","hasATag","filterTags","tg","obj","lineEnd","nme","typ","nameOrDescription","iterateAllJsdocs","meta","docs","url","fixable","schema","additionalProperties","properties","anyOf","enum","items","module"],"sources":["../../src/rules/multilineBlocks.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {number} requireSingleLineUnderCount\n */\nconst checkForShortTags = (jsdoc, utils, requireSingleLineUnderCount) => {\n if (!requireSingleLineUnderCount || !jsdoc.tags.length) {\n return false;\n }\n\n let lastLineWithTag = 0;\n let isUnderCountLimit = false;\n let hasMultiDescOrType = false;\n const tagLines = jsdoc.source.reduce((acc, {\n tokens: {\n delimiter,\n description: desc,\n name,\n postDelimiter,\n postName,\n postTag,\n postType,\n start,\n tag,\n type,\n },\n }, idx) => {\n if (tag.length) {\n lastLineWithTag = idx;\n if (\n start.length + delimiter.length + postDelimiter.length +\n type.length + postType.length + name.length + postName.length +\n tag.length + postTag.length + desc.length <\n requireSingleLineUnderCount\n ) {\n isUnderCountLimit = true;\n }\n\n return acc + 1;\n } else if (desc.length || type.length) {\n hasMultiDescOrType = true;\n return acc;\n }\n\n return acc;\n }, 0);\n // Could be tagLines > 1\n if (!hasMultiDescOrType && isUnderCountLimit && tagLines === 1) {\n const fixer = () => {\n const tokens = jsdoc.source[lastLineWithTag].tokens;\n jsdoc.source = [\n {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '/**',\n description: tokens.description.trimEnd() + ' ',\n end: '*/',\n name: tokens.name,\n postDelimiter: ' ',\n postName: tokens.postName,\n postTag: tokens.postTag,\n postType: tokens.postType,\n start: jsdoc.source[0].tokens.start,\n tag: tokens.tag,\n type: tokens.type,\n }),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Description is too short to be multi-line.',\n null,\n fixer,\n );\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {number} requireSingleLineUnderCount\n */\nconst checkForShortDescriptions = (jsdoc, utils, requireSingleLineUnderCount) => {\n if (!requireSingleLineUnderCount || jsdoc.tags.length) {\n return false;\n }\n\n let lastLineWithDesc = 0;\n let isUnderCountLimit = false;\n const descLines = jsdoc.source.reduce((acc, {\n tokens: {\n delimiter,\n description: desc,\n postDelimiter,\n start,\n },\n }, idx) => {\n if (desc.length) {\n lastLineWithDesc = idx;\n if (\n start.length + delimiter.length + postDelimiter.length + desc.length <\n requireSingleLineUnderCount\n ) {\n isUnderCountLimit = true;\n }\n\n return acc + 1;\n }\n\n return acc;\n }, 0);\n // Could be descLines > 1\n if (isUnderCountLimit && descLines === 1) {\n const fixer = () => {\n const desc = jsdoc.source[lastLineWithDesc].tokens.description;\n jsdoc.source = [\n {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '/**',\n description: desc.trimEnd() + ' ',\n end: '*/',\n postDelimiter: ' ',\n start: jsdoc.source[0].tokens.start,\n }),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Description is too short to be multi-line.',\n null,\n fixer,\n );\n return true;\n }\n\n return false;\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n allowMultipleTags = true,\n minimumLengthForMultiline = Number.POSITIVE_INFINITY,\n multilineTags = [\n '*',\n ],\n noFinalLineText = true,\n noMultilineBlocks = false,\n noSingleLineBlocks = false,\n noZeroLineText = true,\n requireSingleLineUnderCount = null,\n singleLineTags = [\n 'lends', 'type',\n ],\n } = context.options[0] || {};\n\n const {\n source: [\n {\n tokens,\n },\n ],\n } = jsdoc;\n const {\n description,\n tag,\n } = tokens;\n const sourceLength = jsdoc.source.length;\n\n /**\n * @param {string} tagName\n * @returns {boolean}\n */\n const isInvalidSingleLine = (tagName) => {\n return noSingleLineBlocks &&\n (!tagName ||\n !singleLineTags.includes(tagName) && !singleLineTags.includes('*'));\n };\n\n if (sourceLength === 1) {\n if (!isInvalidSingleLine(tag.slice(1))) {\n return;\n }\n\n const fixer = () => {\n utils.makeMultiline();\n };\n\n utils.reportJSDoc(\n 'Single line blocks are not permitted by your configuration.',\n null,\n fixer,\n true,\n );\n\n return;\n }\n\n if (checkForShortDescriptions(jsdoc, utils, requireSingleLineUnderCount)\n ) {\n return;\n }\n\n if (checkForShortTags(jsdoc, utils, requireSingleLineUnderCount)\n ) {\n return;\n }\n\n const lineChecks = () => {\n if (\n noZeroLineText &&\n (tag || description)\n ) {\n const fixer = () => {\n const line = {\n ...tokens,\n };\n utils.emptyTokens(tokens);\n const {\n tokens: {\n delimiter,\n start,\n },\n } = jsdoc.source[1];\n utils.addLine(1, {\n ...line,\n delimiter,\n start,\n });\n };\n\n utils.reportJSDoc(\n 'Should have no text on the \"0th\" line (after the `/**`).',\n null,\n fixer,\n );\n\n return;\n }\n\n const finalLine = jsdoc.source[jsdoc.source.length - 1];\n const finalLineTokens = finalLine.tokens;\n if (\n noFinalLineText &&\n finalLineTokens.description.trim()\n ) {\n const fixer = () => {\n const line = {\n ...finalLineTokens,\n };\n line.description = line.description.trimEnd();\n\n const {\n delimiter,\n } = line;\n\n for (const prop of [\n 'delimiter',\n 'postDelimiter',\n 'tag',\n 'type',\n 'lineEnd',\n 'postType',\n 'postTag',\n 'name',\n 'postName',\n 'description',\n ]) {\n finalLineTokens[\n /**\n * @type {\"delimiter\"|\"postDelimiter\"|\"tag\"|\"type\"|\n * \"lineEnd\"|\"postType\"|\"postTag\"|\"name\"|\n * \"postName\"|\"description\"}\n */ (\n prop\n )\n ] = '';\n }\n\n utils.addLine(jsdoc.source.length - 1, {\n ...line,\n delimiter,\n end: '',\n });\n };\n\n utils.reportJSDoc(\n 'Should have no text on the final line (before the `*/`).',\n null,\n fixer,\n );\n }\n };\n\n if (noMultilineBlocks) {\n if (\n jsdoc.tags.length &&\n (multilineTags.includes('*') || utils.hasATag(multilineTags))\n ) {\n lineChecks();\n\n return;\n }\n\n if (jsdoc.description.length >= minimumLengthForMultiline) {\n lineChecks();\n\n return;\n }\n\n if (\n noSingleLineBlocks &&\n (!jsdoc.tags.length ||\n !utils.filterTags(({\n tag: tg,\n }) => {\n return !isInvalidSingleLine(tg);\n }).length)\n ) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but fixing would result in a single ' +\n 'line block which you have prohibited with `noSingleLineBlocks`.',\n );\n\n return;\n }\n\n if (jsdoc.tags.length > 1) {\n if (!allowMultipleTags) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but the block has multiple tags.',\n );\n\n return;\n }\n } else if (jsdoc.tags.length === 1 && jsdoc.description.trim()) {\n if (!allowMultipleTags) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but the block has a description with a tag.',\n );\n\n return;\n }\n } else {\n const fixer = () => {\n jsdoc.source = [\n {\n number: 1,\n source: '',\n tokens: jsdoc.source.reduce((obj, {\n tokens: {\n description: desc,\n lineEnd,\n name: nme,\n postName,\n postTag,\n postType,\n tag: tg,\n type: typ,\n },\n }) => {\n if (typ) {\n obj.type = typ;\n }\n\n if (tg && typ && nme) {\n obj.postType = postType;\n }\n\n if (nme) {\n obj.name += nme;\n }\n\n if (nme && desc) {\n obj.postName = postName;\n }\n\n obj.description += desc;\n\n const nameOrDescription = obj.description || obj.name;\n if (\n nameOrDescription && nameOrDescription.slice(-1) !== ' '\n ) {\n obj.description += ' ';\n }\n\n obj.lineEnd = lineEnd;\n\n // Already filtered for multiple tags\n obj.tag += tg;\n if (tg) {\n obj.postTag = postTag || ' ';\n }\n\n return obj;\n }, utils.seedTokens({\n delimiter: '/**',\n end: '*/',\n postDelimiter: ' ',\n })),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration.',\n null,\n fixer,\n );\n\n return;\n }\n }\n\n lineChecks();\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Controls how and whether jsdoc blocks can be expressed as single or multiple line blocks.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/multiline-blocks.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowMultipleTags: {\n type: 'boolean',\n },\n minimumLengthForMultiline: {\n type: 'integer',\n },\n multilineTags: {\n anyOf: [\n {\n enum: [\n '*',\n ],\n type: 'string',\n }, {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n ],\n },\n noFinalLineText: {\n type: 'boolean',\n },\n noMultilineBlocks: {\n type: 'boolean',\n },\n noSingleLineBlocks: {\n type: 'boolean',\n },\n noZeroLineText: {\n type: 'boolean',\n },\n requireSingleLineUnderCount: {\n type: 'number',\n },\n singleLineTags: {\n items: {\n type: 'string',\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":"multilineBlocks.cjs","names":["iterateJsdoc"],"sources":["../../src/rules/multilineBlocks.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {number} requireSingleLineUnderCount\n */\nconst checkForShortTags = (jsdoc, utils, requireSingleLineUnderCount) => {\n if (!requireSingleLineUnderCount || !jsdoc.tags.length) {\n return false;\n }\n\n let lastLineWithTag = 0;\n let isUnderCountLimit = false;\n let hasMultiDescOrType = false;\n const tagLines = jsdoc.source.reduce((acc, {\n tokens: {\n delimiter,\n description: desc,\n name,\n postDelimiter,\n postName,\n postTag,\n postType,\n start,\n tag,\n type,\n },\n }, idx) => {\n if (tag.length) {\n lastLineWithTag = idx;\n if (\n start.length + delimiter.length + postDelimiter.length +\n type.length + postType.length + name.length + postName.length +\n tag.length + postTag.length + desc.length <\n requireSingleLineUnderCount\n ) {\n isUnderCountLimit = true;\n }\n\n return acc + 1;\n } else if (desc.length || type.length) {\n hasMultiDescOrType = true;\n return acc;\n }\n\n return acc;\n }, 0);\n // Could be tagLines > 1\n if (!hasMultiDescOrType && isUnderCountLimit && tagLines === 1) {\n const fixer = () => {\n const tokens = jsdoc.source[lastLineWithTag].tokens;\n jsdoc.source = [\n {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '/**',\n description: tokens.description.trimEnd() + ' ',\n end: '*/',\n name: tokens.name,\n postDelimiter: ' ',\n postName: tokens.postName,\n postTag: tokens.postTag,\n postType: tokens.postType,\n start: jsdoc.source[0].tokens.start,\n tag: tokens.tag,\n type: tokens.type,\n }),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Description is too short to be multi-line.',\n null,\n fixer,\n );\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {number} requireSingleLineUnderCount\n */\nconst checkForShortDescriptions = (jsdoc, utils, requireSingleLineUnderCount) => {\n if (!requireSingleLineUnderCount || jsdoc.tags.length) {\n return false;\n }\n\n let lastLineWithDesc = 0;\n let isUnderCountLimit = false;\n const descLines = jsdoc.source.reduce((acc, {\n tokens: {\n delimiter,\n description: desc,\n postDelimiter,\n start,\n },\n }, idx) => {\n if (desc.length) {\n lastLineWithDesc = idx;\n if (\n start.length + delimiter.length + postDelimiter.length + desc.length <\n requireSingleLineUnderCount\n ) {\n isUnderCountLimit = true;\n }\n\n return acc + 1;\n }\n\n return acc;\n }, 0);\n // Could be descLines > 1\n if (isUnderCountLimit && descLines === 1) {\n const fixer = () => {\n const desc = jsdoc.source[lastLineWithDesc].tokens.description;\n jsdoc.source = [\n {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '/**',\n description: desc.trimEnd() + ' ',\n end: '*/',\n postDelimiter: ' ',\n start: jsdoc.source[0].tokens.start,\n }),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Description is too short to be multi-line.',\n null,\n fixer,\n );\n return true;\n }\n\n return false;\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n allowMultipleTags = true,\n minimumLengthForMultiline = Number.POSITIVE_INFINITY,\n multilineTags = [\n '*',\n ],\n noFinalLineText = true,\n noMultilineBlocks = false,\n noSingleLineBlocks = false,\n noZeroLineText = true,\n requireSingleLineUnderCount = null,\n singleLineTags = [\n 'lends', 'type',\n ],\n } = context.options[0] || {};\n\n const {\n source: [\n {\n tokens,\n },\n ],\n } = jsdoc;\n const {\n description,\n tag,\n } = tokens;\n const sourceLength = jsdoc.source.length;\n\n /**\n * @param {string} tagName\n * @returns {boolean}\n */\n const isInvalidSingleLine = (tagName) => {\n return noSingleLineBlocks &&\n (!tagName ||\n !singleLineTags.includes(tagName) && !singleLineTags.includes('*'));\n };\n\n if (sourceLength === 1) {\n if (!isInvalidSingleLine(tag.slice(1))) {\n return;\n }\n\n const fixer = () => {\n utils.makeMultiline();\n };\n\n utils.reportJSDoc(\n 'Single line blocks are not permitted by your configuration.',\n null,\n fixer,\n true,\n );\n\n return;\n }\n\n if (checkForShortDescriptions(jsdoc, utils, requireSingleLineUnderCount)\n ) {\n return;\n }\n\n if (checkForShortTags(jsdoc, utils, requireSingleLineUnderCount)\n ) {\n return;\n }\n\n const lineChecks = () => {\n if (\n noZeroLineText &&\n (tag || description)\n ) {\n const fixer = () => {\n const line = {\n ...tokens,\n };\n utils.emptyTokens(tokens);\n const {\n tokens: {\n delimiter,\n start,\n },\n } = jsdoc.source[1];\n utils.addLine(1, {\n ...line,\n delimiter,\n start,\n });\n };\n\n utils.reportJSDoc(\n 'Should have no text on the \"0th\" line (after the `/**`).',\n null,\n fixer,\n );\n\n return;\n }\n\n const finalLine = jsdoc.source[jsdoc.source.length - 1];\n const finalLineTokens = finalLine.tokens;\n if (\n noFinalLineText &&\n finalLineTokens.description.trim()\n ) {\n const fixer = () => {\n const line = {\n ...finalLineTokens,\n };\n line.description = line.description.trimEnd();\n\n const {\n delimiter,\n } = line;\n\n for (const prop of [\n 'delimiter',\n 'postDelimiter',\n 'tag',\n 'type',\n 'lineEnd',\n 'postType',\n 'postTag',\n 'name',\n 'postName',\n 'description',\n ]) {\n finalLineTokens[\n /**\n * @type {\"delimiter\"|\"postDelimiter\"|\"tag\"|\"type\"|\n * \"lineEnd\"|\"postType\"|\"postTag\"|\"name\"|\n * \"postName\"|\"description\"}\n */ (\n prop\n )\n ] = '';\n }\n\n utils.addLine(jsdoc.source.length - 1, {\n ...line,\n delimiter,\n end: '',\n });\n };\n\n utils.reportJSDoc(\n 'Should have no text on the final line (before the `*/`).',\n null,\n fixer,\n );\n }\n };\n\n if (noMultilineBlocks) {\n if (\n jsdoc.tags.length &&\n (multilineTags.includes('*') || utils.hasATag(multilineTags))\n ) {\n lineChecks();\n\n return;\n }\n\n if (jsdoc.description.length >= minimumLengthForMultiline) {\n lineChecks();\n\n return;\n }\n\n if (\n noSingleLineBlocks &&\n (!jsdoc.tags.length ||\n !utils.filterTags(({\n tag: tg,\n }) => {\n return !isInvalidSingleLine(tg);\n }).length)\n ) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but fixing would result in a single ' +\n 'line block which you have prohibited with `noSingleLineBlocks`.',\n );\n\n return;\n }\n\n if (jsdoc.tags.length > 1) {\n if (!allowMultipleTags) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but the block has multiple tags.',\n );\n\n return;\n }\n } else if (jsdoc.tags.length === 1 && jsdoc.description.trim()) {\n if (!allowMultipleTags) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but the block has a description with a tag.',\n );\n\n return;\n }\n } else {\n const fixer = () => {\n jsdoc.source = [\n {\n number: 1,\n source: '',\n tokens: jsdoc.source.reduce((obj, {\n tokens: {\n description: desc,\n lineEnd,\n name: nme,\n postName,\n postTag,\n postType,\n tag: tg,\n type: typ,\n },\n }) => {\n if (typ) {\n obj.type = typ;\n }\n\n if (tg && typ && nme) {\n obj.postType = postType;\n }\n\n if (nme) {\n obj.name += nme;\n }\n\n if (nme && desc) {\n obj.postName = postName;\n }\n\n obj.description += desc;\n\n const nameOrDescription = obj.description || obj.name;\n if (\n nameOrDescription && nameOrDescription.slice(-1) !== ' '\n ) {\n obj.description += ' ';\n }\n\n obj.lineEnd = lineEnd;\n\n // Already filtered for multiple tags\n obj.tag += tg;\n if (tg) {\n obj.postTag = postTag || ' ';\n }\n\n return obj;\n }, utils.seedTokens({\n delimiter: '/**',\n end: '*/',\n postDelimiter: ' ',\n })),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration.',\n null,\n fixer,\n );\n\n return;\n }\n }\n\n lineChecks();\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Controls how and whether jsdoc blocks can be expressed as single or multiple line blocks.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/multiline-blocks.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowMultipleTags: {\n type: 'boolean',\n },\n minimumLengthForMultiline: {\n type: 'integer',\n },\n multilineTags: {\n anyOf: [\n {\n enum: [\n '*',\n ],\n type: 'string',\n }, {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n ],\n },\n noFinalLineText: {\n type: 'boolean',\n },\n noMultilineBlocks: {\n type: 'boolean',\n },\n noSingleLineBlocks: {\n type: 'boolean',\n },\n noZeroLineText: {\n type: 'boolean',\n },\n requireSingleLineUnderCount: {\n type: 'number',\n },\n singleLineTags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import iterateJsdoc from "../iterateJsdoc.js";
|
|
2
|
+
|
|
3
|
+
//#region src/rules/multilineBlocks.js
|
|
4
|
+
/**
|
|
5
|
+
* @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc
|
|
6
|
+
* @param {import('../iterateJsdoc.js').Utils} utils
|
|
7
|
+
* @param {number} requireSingleLineUnderCount
|
|
8
|
+
*/
|
|
9
|
+
const checkForShortTags = (jsdoc, utils, requireSingleLineUnderCount) => {
|
|
10
|
+
if (!requireSingleLineUnderCount || !jsdoc.tags.length) return false;
|
|
11
|
+
let lastLineWithTag = 0;
|
|
12
|
+
let isUnderCountLimit = false;
|
|
13
|
+
let hasMultiDescOrType = false;
|
|
14
|
+
const tagLines = jsdoc.source.reduce((acc, { tokens: { delimiter, description: desc, name, postDelimiter, postName, postTag, postType, start, tag, type } }, idx) => {
|
|
15
|
+
if (tag.length) {
|
|
16
|
+
lastLineWithTag = idx;
|
|
17
|
+
if (start.length + delimiter.length + postDelimiter.length + type.length + postType.length + name.length + postName.length + tag.length + postTag.length + desc.length < requireSingleLineUnderCount) isUnderCountLimit = true;
|
|
18
|
+
return acc + 1;
|
|
19
|
+
} else if (desc.length || type.length) {
|
|
20
|
+
hasMultiDescOrType = true;
|
|
21
|
+
return acc;
|
|
22
|
+
}
|
|
23
|
+
return acc;
|
|
24
|
+
}, 0);
|
|
25
|
+
if (!hasMultiDescOrType && isUnderCountLimit && tagLines === 1) {
|
|
26
|
+
const fixer = () => {
|
|
27
|
+
const tokens = jsdoc.source[lastLineWithTag].tokens;
|
|
28
|
+
jsdoc.source = [{
|
|
29
|
+
number: 0,
|
|
30
|
+
source: "",
|
|
31
|
+
tokens: utils.seedTokens({
|
|
32
|
+
delimiter: "/**",
|
|
33
|
+
description: tokens.description.trimEnd() + " ",
|
|
34
|
+
end: "*/",
|
|
35
|
+
name: tokens.name,
|
|
36
|
+
postDelimiter: " ",
|
|
37
|
+
postName: tokens.postName,
|
|
38
|
+
postTag: tokens.postTag,
|
|
39
|
+
postType: tokens.postType,
|
|
40
|
+
start: jsdoc.source[0].tokens.start,
|
|
41
|
+
tag: tokens.tag,
|
|
42
|
+
type: tokens.type
|
|
43
|
+
})
|
|
44
|
+
}];
|
|
45
|
+
};
|
|
46
|
+
utils.reportJSDoc("Description is too short to be multi-line.", null, fixer);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc
|
|
53
|
+
* @param {import('../iterateJsdoc.js').Utils} utils
|
|
54
|
+
* @param {number} requireSingleLineUnderCount
|
|
55
|
+
*/
|
|
56
|
+
const checkForShortDescriptions = (jsdoc, utils, requireSingleLineUnderCount) => {
|
|
57
|
+
if (!requireSingleLineUnderCount || jsdoc.tags.length) return false;
|
|
58
|
+
let lastLineWithDesc = 0;
|
|
59
|
+
let isUnderCountLimit = false;
|
|
60
|
+
const descLines = jsdoc.source.reduce((acc, { tokens: { delimiter, description: desc, postDelimiter, start } }, idx) => {
|
|
61
|
+
if (desc.length) {
|
|
62
|
+
lastLineWithDesc = idx;
|
|
63
|
+
if (start.length + delimiter.length + postDelimiter.length + desc.length < requireSingleLineUnderCount) isUnderCountLimit = true;
|
|
64
|
+
return acc + 1;
|
|
65
|
+
}
|
|
66
|
+
return acc;
|
|
67
|
+
}, 0);
|
|
68
|
+
if (isUnderCountLimit && descLines === 1) {
|
|
69
|
+
const fixer = () => {
|
|
70
|
+
const desc = jsdoc.source[lastLineWithDesc].tokens.description;
|
|
71
|
+
jsdoc.source = [{
|
|
72
|
+
number: 0,
|
|
73
|
+
source: "",
|
|
74
|
+
tokens: utils.seedTokens({
|
|
75
|
+
delimiter: "/**",
|
|
76
|
+
description: desc.trimEnd() + " ",
|
|
77
|
+
end: "*/",
|
|
78
|
+
postDelimiter: " ",
|
|
79
|
+
start: jsdoc.source[0].tokens.start
|
|
80
|
+
})
|
|
81
|
+
}];
|
|
82
|
+
};
|
|
83
|
+
utils.reportJSDoc("Description is too short to be multi-line.", null, fixer);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
87
|
+
};
|
|
88
|
+
var multilineBlocks_default = iterateJsdoc(({ context, jsdoc, utils }) => {
|
|
89
|
+
const { allowMultipleTags = true, minimumLengthForMultiline = Number.POSITIVE_INFINITY, multilineTags = ["*"], noFinalLineText = true, noMultilineBlocks = false, noSingleLineBlocks = false, noZeroLineText = true, requireSingleLineUnderCount = null, singleLineTags = ["lends", "type"] } = context.options[0] || {};
|
|
90
|
+
const { source: [{ tokens }] } = jsdoc;
|
|
91
|
+
const { description, tag } = tokens;
|
|
92
|
+
const sourceLength = jsdoc.source.length;
|
|
93
|
+
/**
|
|
94
|
+
* @param {string} tagName
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
const isInvalidSingleLine = (tagName) => {
|
|
98
|
+
return noSingleLineBlocks && (!tagName || !singleLineTags.includes(tagName) && !singleLineTags.includes("*"));
|
|
99
|
+
};
|
|
100
|
+
if (sourceLength === 1) {
|
|
101
|
+
if (!isInvalidSingleLine(tag.slice(1))) return;
|
|
102
|
+
const fixer = () => {
|
|
103
|
+
utils.makeMultiline();
|
|
104
|
+
};
|
|
105
|
+
utils.reportJSDoc("Single line blocks are not permitted by your configuration.", null, fixer, true);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (checkForShortDescriptions(jsdoc, utils, requireSingleLineUnderCount)) return;
|
|
109
|
+
if (checkForShortTags(jsdoc, utils, requireSingleLineUnderCount)) return;
|
|
110
|
+
const lineChecks = () => {
|
|
111
|
+
if (noZeroLineText && (tag || description)) {
|
|
112
|
+
const fixer = () => {
|
|
113
|
+
const line = { ...tokens };
|
|
114
|
+
utils.emptyTokens(tokens);
|
|
115
|
+
const { tokens: { delimiter, start } } = jsdoc.source[1];
|
|
116
|
+
utils.addLine(1, {
|
|
117
|
+
...line,
|
|
118
|
+
delimiter,
|
|
119
|
+
start
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
utils.reportJSDoc("Should have no text on the \"0th\" line (after the `/**`).", null, fixer);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const finalLine = jsdoc.source[jsdoc.source.length - 1];
|
|
126
|
+
const finalLineTokens = finalLine.tokens;
|
|
127
|
+
if (noFinalLineText && finalLineTokens.description.trim()) {
|
|
128
|
+
const fixer = () => {
|
|
129
|
+
const line = { ...finalLineTokens };
|
|
130
|
+
line.description = line.description.trimEnd();
|
|
131
|
+
const { delimiter } = line;
|
|
132
|
+
for (const prop of [
|
|
133
|
+
"delimiter",
|
|
134
|
+
"postDelimiter",
|
|
135
|
+
"tag",
|
|
136
|
+
"type",
|
|
137
|
+
"lineEnd",
|
|
138
|
+
"postType",
|
|
139
|
+
"postTag",
|
|
140
|
+
"name",
|
|
141
|
+
"postName",
|
|
142
|
+
"description"
|
|
143
|
+
]) finalLineTokens[prop] = "";
|
|
144
|
+
utils.addLine(jsdoc.source.length - 1, {
|
|
145
|
+
...line,
|
|
146
|
+
delimiter,
|
|
147
|
+
end: ""
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
utils.reportJSDoc("Should have no text on the final line (before the `*/`).", null, fixer);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
if (noMultilineBlocks) {
|
|
154
|
+
if (jsdoc.tags.length && (multilineTags.includes("*") || utils.hasATag(multilineTags))) {
|
|
155
|
+
lineChecks();
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (jsdoc.description.length >= minimumLengthForMultiline) {
|
|
159
|
+
lineChecks();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (noSingleLineBlocks && (!jsdoc.tags.length || !utils.filterTags(({ tag: tg }) => {
|
|
163
|
+
return !isInvalidSingleLine(tg);
|
|
164
|
+
}).length)) {
|
|
165
|
+
utils.reportJSDoc("Multiline jsdoc blocks are prohibited by your configuration but fixing would result in a single line block which you have prohibited with `noSingleLineBlocks`.");
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (jsdoc.tags.length > 1) {
|
|
169
|
+
if (!allowMultipleTags) {
|
|
170
|
+
utils.reportJSDoc("Multiline jsdoc blocks are prohibited by your configuration but the block has multiple tags.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
} else if (jsdoc.tags.length === 1 && jsdoc.description.trim()) {
|
|
174
|
+
if (!allowMultipleTags) {
|
|
175
|
+
utils.reportJSDoc("Multiline jsdoc blocks are prohibited by your configuration but the block has a description with a tag.");
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
} else {
|
|
179
|
+
const fixer = () => {
|
|
180
|
+
jsdoc.source = [{
|
|
181
|
+
number: 1,
|
|
182
|
+
source: "",
|
|
183
|
+
tokens: jsdoc.source.reduce((obj, { tokens: { description: desc, lineEnd, name: nme, postName, postTag, postType, tag: tg, type: typ } }) => {
|
|
184
|
+
if (typ) obj.type = typ;
|
|
185
|
+
if (tg && typ && nme) obj.postType = postType;
|
|
186
|
+
if (nme) obj.name += nme;
|
|
187
|
+
if (nme && desc) obj.postName = postName;
|
|
188
|
+
obj.description += desc;
|
|
189
|
+
const nameOrDescription = obj.description || obj.name;
|
|
190
|
+
if (nameOrDescription && nameOrDescription.slice(-1) !== " ") obj.description += " ";
|
|
191
|
+
obj.lineEnd = lineEnd;
|
|
192
|
+
obj.tag += tg;
|
|
193
|
+
if (tg) obj.postTag = postTag || " ";
|
|
194
|
+
return obj;
|
|
195
|
+
}, utils.seedTokens({
|
|
196
|
+
delimiter: "/**",
|
|
197
|
+
end: "*/",
|
|
198
|
+
postDelimiter: " "
|
|
199
|
+
}))
|
|
200
|
+
}];
|
|
201
|
+
};
|
|
202
|
+
utils.reportJSDoc("Multiline jsdoc blocks are prohibited by your configuration.", null, fixer);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
lineChecks();
|
|
207
|
+
}, {
|
|
208
|
+
iterateAllJsdocs: true,
|
|
209
|
+
meta: {
|
|
210
|
+
docs: {
|
|
211
|
+
description: "Controls how and whether jsdoc blocks can be expressed as single or multiple line blocks.",
|
|
212
|
+
url: "https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/multiline-blocks.md#repos-sticky-header"
|
|
213
|
+
},
|
|
214
|
+
fixable: "code",
|
|
215
|
+
schema: [{
|
|
216
|
+
additionalProperties: false,
|
|
217
|
+
properties: {
|
|
218
|
+
allowMultipleTags: { type: "boolean" },
|
|
219
|
+
minimumLengthForMultiline: { type: "integer" },
|
|
220
|
+
multilineTags: { anyOf: [{
|
|
221
|
+
enum: ["*"],
|
|
222
|
+
type: "string"
|
|
223
|
+
}, {
|
|
224
|
+
items: { type: "string" },
|
|
225
|
+
type: "array"
|
|
226
|
+
}] },
|
|
227
|
+
noFinalLineText: { type: "boolean" },
|
|
228
|
+
noMultilineBlocks: { type: "boolean" },
|
|
229
|
+
noSingleLineBlocks: { type: "boolean" },
|
|
230
|
+
noZeroLineText: { type: "boolean" },
|
|
231
|
+
requireSingleLineUnderCount: { type: "number" },
|
|
232
|
+
singleLineTags: {
|
|
233
|
+
items: { type: "string" },
|
|
234
|
+
type: "array"
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
type: "object"
|
|
238
|
+
}],
|
|
239
|
+
type: "suggestion"
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
//#endregion
|
|
244
|
+
export { multilineBlocks_default as default };
|
|
245
|
+
//# sourceMappingURL=multilineBlocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multilineBlocks.js","names":[],"sources":["../../src/rules/multilineBlocks.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {number} requireSingleLineUnderCount\n */\nconst checkForShortTags = (jsdoc, utils, requireSingleLineUnderCount) => {\n if (!requireSingleLineUnderCount || !jsdoc.tags.length) {\n return false;\n }\n\n let lastLineWithTag = 0;\n let isUnderCountLimit = false;\n let hasMultiDescOrType = false;\n const tagLines = jsdoc.source.reduce((acc, {\n tokens: {\n delimiter,\n description: desc,\n name,\n postDelimiter,\n postName,\n postTag,\n postType,\n start,\n tag,\n type,\n },\n }, idx) => {\n if (tag.length) {\n lastLineWithTag = idx;\n if (\n start.length + delimiter.length + postDelimiter.length +\n type.length + postType.length + name.length + postName.length +\n tag.length + postTag.length + desc.length <\n requireSingleLineUnderCount\n ) {\n isUnderCountLimit = true;\n }\n\n return acc + 1;\n } else if (desc.length || type.length) {\n hasMultiDescOrType = true;\n return acc;\n }\n\n return acc;\n }, 0);\n // Could be tagLines > 1\n if (!hasMultiDescOrType && isUnderCountLimit && tagLines === 1) {\n const fixer = () => {\n const tokens = jsdoc.source[lastLineWithTag].tokens;\n jsdoc.source = [\n {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '/**',\n description: tokens.description.trimEnd() + ' ',\n end: '*/',\n name: tokens.name,\n postDelimiter: ' ',\n postName: tokens.postName,\n postTag: tokens.postTag,\n postType: tokens.postType,\n start: jsdoc.source[0].tokens.start,\n tag: tokens.tag,\n type: tokens.type,\n }),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Description is too short to be multi-line.',\n null,\n fixer,\n );\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {import('@es-joy/jsdoccomment').JsdocBlockWithInline} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {number} requireSingleLineUnderCount\n */\nconst checkForShortDescriptions = (jsdoc, utils, requireSingleLineUnderCount) => {\n if (!requireSingleLineUnderCount || jsdoc.tags.length) {\n return false;\n }\n\n let lastLineWithDesc = 0;\n let isUnderCountLimit = false;\n const descLines = jsdoc.source.reduce((acc, {\n tokens: {\n delimiter,\n description: desc,\n postDelimiter,\n start,\n },\n }, idx) => {\n if (desc.length) {\n lastLineWithDesc = idx;\n if (\n start.length + delimiter.length + postDelimiter.length + desc.length <\n requireSingleLineUnderCount\n ) {\n isUnderCountLimit = true;\n }\n\n return acc + 1;\n }\n\n return acc;\n }, 0);\n // Could be descLines > 1\n if (isUnderCountLimit && descLines === 1) {\n const fixer = () => {\n const desc = jsdoc.source[lastLineWithDesc].tokens.description;\n jsdoc.source = [\n {\n number: 0,\n source: '',\n tokens: utils.seedTokens({\n delimiter: '/**',\n description: desc.trimEnd() + ' ',\n end: '*/',\n postDelimiter: ' ',\n start: jsdoc.source[0].tokens.start,\n }),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Description is too short to be multi-line.',\n null,\n fixer,\n );\n return true;\n }\n\n return false;\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n utils,\n}) => {\n const {\n allowMultipleTags = true,\n minimumLengthForMultiline = Number.POSITIVE_INFINITY,\n multilineTags = [\n '*',\n ],\n noFinalLineText = true,\n noMultilineBlocks = false,\n noSingleLineBlocks = false,\n noZeroLineText = true,\n requireSingleLineUnderCount = null,\n singleLineTags = [\n 'lends', 'type',\n ],\n } = context.options[0] || {};\n\n const {\n source: [\n {\n tokens,\n },\n ],\n } = jsdoc;\n const {\n description,\n tag,\n } = tokens;\n const sourceLength = jsdoc.source.length;\n\n /**\n * @param {string} tagName\n * @returns {boolean}\n */\n const isInvalidSingleLine = (tagName) => {\n return noSingleLineBlocks &&\n (!tagName ||\n !singleLineTags.includes(tagName) && !singleLineTags.includes('*'));\n };\n\n if (sourceLength === 1) {\n if (!isInvalidSingleLine(tag.slice(1))) {\n return;\n }\n\n const fixer = () => {\n utils.makeMultiline();\n };\n\n utils.reportJSDoc(\n 'Single line blocks are not permitted by your configuration.',\n null,\n fixer,\n true,\n );\n\n return;\n }\n\n if (checkForShortDescriptions(jsdoc, utils, requireSingleLineUnderCount)\n ) {\n return;\n }\n\n if (checkForShortTags(jsdoc, utils, requireSingleLineUnderCount)\n ) {\n return;\n }\n\n const lineChecks = () => {\n if (\n noZeroLineText &&\n (tag || description)\n ) {\n const fixer = () => {\n const line = {\n ...tokens,\n };\n utils.emptyTokens(tokens);\n const {\n tokens: {\n delimiter,\n start,\n },\n } = jsdoc.source[1];\n utils.addLine(1, {\n ...line,\n delimiter,\n start,\n });\n };\n\n utils.reportJSDoc(\n 'Should have no text on the \"0th\" line (after the `/**`).',\n null,\n fixer,\n );\n\n return;\n }\n\n const finalLine = jsdoc.source[jsdoc.source.length - 1];\n const finalLineTokens = finalLine.tokens;\n if (\n noFinalLineText &&\n finalLineTokens.description.trim()\n ) {\n const fixer = () => {\n const line = {\n ...finalLineTokens,\n };\n line.description = line.description.trimEnd();\n\n const {\n delimiter,\n } = line;\n\n for (const prop of [\n 'delimiter',\n 'postDelimiter',\n 'tag',\n 'type',\n 'lineEnd',\n 'postType',\n 'postTag',\n 'name',\n 'postName',\n 'description',\n ]) {\n finalLineTokens[\n /**\n * @type {\"delimiter\"|\"postDelimiter\"|\"tag\"|\"type\"|\n * \"lineEnd\"|\"postType\"|\"postTag\"|\"name\"|\n * \"postName\"|\"description\"}\n */ (\n prop\n )\n ] = '';\n }\n\n utils.addLine(jsdoc.source.length - 1, {\n ...line,\n delimiter,\n end: '',\n });\n };\n\n utils.reportJSDoc(\n 'Should have no text on the final line (before the `*/`).',\n null,\n fixer,\n );\n }\n };\n\n if (noMultilineBlocks) {\n if (\n jsdoc.tags.length &&\n (multilineTags.includes('*') || utils.hasATag(multilineTags))\n ) {\n lineChecks();\n\n return;\n }\n\n if (jsdoc.description.length >= minimumLengthForMultiline) {\n lineChecks();\n\n return;\n }\n\n if (\n noSingleLineBlocks &&\n (!jsdoc.tags.length ||\n !utils.filterTags(({\n tag: tg,\n }) => {\n return !isInvalidSingleLine(tg);\n }).length)\n ) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but fixing would result in a single ' +\n 'line block which you have prohibited with `noSingleLineBlocks`.',\n );\n\n return;\n }\n\n if (jsdoc.tags.length > 1) {\n if (!allowMultipleTags) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but the block has multiple tags.',\n );\n\n return;\n }\n } else if (jsdoc.tags.length === 1 && jsdoc.description.trim()) {\n if (!allowMultipleTags) {\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration but the block has a description with a tag.',\n );\n\n return;\n }\n } else {\n const fixer = () => {\n jsdoc.source = [\n {\n number: 1,\n source: '',\n tokens: jsdoc.source.reduce((obj, {\n tokens: {\n description: desc,\n lineEnd,\n name: nme,\n postName,\n postTag,\n postType,\n tag: tg,\n type: typ,\n },\n }) => {\n if (typ) {\n obj.type = typ;\n }\n\n if (tg && typ && nme) {\n obj.postType = postType;\n }\n\n if (nme) {\n obj.name += nme;\n }\n\n if (nme && desc) {\n obj.postName = postName;\n }\n\n obj.description += desc;\n\n const nameOrDescription = obj.description || obj.name;\n if (\n nameOrDescription && nameOrDescription.slice(-1) !== ' '\n ) {\n obj.description += ' ';\n }\n\n obj.lineEnd = lineEnd;\n\n // Already filtered for multiple tags\n obj.tag += tg;\n if (tg) {\n obj.postTag = postTag || ' ';\n }\n\n return obj;\n }, utils.seedTokens({\n delimiter: '/**',\n end: '*/',\n postDelimiter: ' ',\n })),\n },\n ];\n };\n\n utils.reportJSDoc(\n 'Multiline jsdoc blocks are prohibited by ' +\n 'your configuration.',\n null,\n fixer,\n );\n\n return;\n }\n }\n\n lineChecks();\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Controls how and whether jsdoc blocks can be expressed as single or multiple line blocks.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/multiline-blocks.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowMultipleTags: {\n type: 'boolean',\n },\n minimumLengthForMultiline: {\n type: 'integer',\n },\n multilineTags: {\n anyOf: [\n {\n enum: [\n '*',\n ],\n type: 'string',\n }, {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n ],\n },\n noFinalLineText: {\n type: 'boolean',\n },\n noMultilineBlocks: {\n type: 'boolean',\n },\n noSingleLineBlocks: {\n type: 'boolean',\n },\n noZeroLineText: {\n type: 'boolean',\n },\n requireSingleLineUnderCount: {\n type: 'number',\n },\n singleLineTags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,92 +1,69 @@
|
|
|
1
|
-
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_iterateJsdoc = require('../iterateJsdoc.cjs');
|
|
3
|
+
const comment_parser = require_rolldown_runtime.__toESM(require("comment-parser"));
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.cjs"));
|
|
8
|
-
var _commentParser = require("comment-parser");
|
|
9
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
-
// Neither a single nor 3+ asterisks are valid jsdoc per
|
|
11
|
-
// https://jsdoc.app/about-getting-started.html#adding-documentation-comments-to-your-code
|
|
5
|
+
//#region src/rules/noBadBlocks.js
|
|
12
6
|
const commentRegexp = /^\/\*(?!\*)/v;
|
|
13
7
|
const extraAsteriskCommentRegexp = /^\/\*{3,}/v;
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
if (!nonJsdocNodes.length) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
for (const node of nonJsdocNodes) {
|
|
56
|
-
const report = /** @type {import('../iterateJsdoc.js').MakeReport} */makeReport(context, node);
|
|
57
|
-
|
|
58
|
-
// eslint-disable-next-line no-loop-func
|
|
59
|
-
const fix = /** @type {import('eslint').Rule.ReportFixer} */fixer => {
|
|
60
|
-
const text = sourceCode.getText(node);
|
|
61
|
-
return fixer.replaceText(node, extraAsterisks ? text.replace(extraAsteriskCommentRegexp, '/**') : text.replace('/*', '/**'));
|
|
62
|
-
};
|
|
63
|
-
report('Expected JSDoc-like comment to begin with two asterisks.', fix);
|
|
64
|
-
}
|
|
8
|
+
var noBadBlocks_default = require_iterateJsdoc.default(({ allComments, context, makeReport, sourceCode }) => {
|
|
9
|
+
const [{ ignore = [
|
|
10
|
+
"ts-check",
|
|
11
|
+
"ts-expect-error",
|
|
12
|
+
"ts-ignore",
|
|
13
|
+
"ts-nocheck"
|
|
14
|
+
], preventAllMultiAsteriskBlocks = false } = {}] = context.options;
|
|
15
|
+
let extraAsterisks = false;
|
|
16
|
+
const nonJsdocNodes = allComments.filter((comment) => {
|
|
17
|
+
const commentText = sourceCode.getText(comment);
|
|
18
|
+
const initialText = commentText.replace(commentRegexp, "").trimStart();
|
|
19
|
+
if (["eslint"].some((directive) => {
|
|
20
|
+
return initialText.startsWith(directive);
|
|
21
|
+
})) return false;
|
|
22
|
+
let sliceIndex = 2;
|
|
23
|
+
if (!commentRegexp.test(commentText)) {
|
|
24
|
+
const multiline = extraAsteriskCommentRegexp.exec(commentText)?.[0];
|
|
25
|
+
if (!multiline) return false;
|
|
26
|
+
sliceIndex = multiline.length;
|
|
27
|
+
extraAsterisks = true;
|
|
28
|
+
if (preventAllMultiAsteriskBlocks) return true;
|
|
29
|
+
}
|
|
30
|
+
const tags = ((0, comment_parser.parse)(`${commentText.slice(0, 2)}*${commentText.slice(sliceIndex)}`)[0] || {}).tags ?? [];
|
|
31
|
+
return tags.length && !tags.some(({ tag }) => {
|
|
32
|
+
return ignore.includes(tag);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
if (!nonJsdocNodes.length) return;
|
|
36
|
+
for (const node of nonJsdocNodes) {
|
|
37
|
+
const report = makeReport(context, node);
|
|
38
|
+
const fix = (fixer) => {
|
|
39
|
+
const text = sourceCode.getText(node);
|
|
40
|
+
return fixer.replaceText(node, extraAsterisks ? text.replace(extraAsteriskCommentRegexp, "/**") : text.replace("/*", "/**"));
|
|
41
|
+
};
|
|
42
|
+
report("Expected JSDoc-like comment to begin with two asterisks.", fix);
|
|
43
|
+
}
|
|
65
44
|
}, {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
type: 'object'
|
|
87
|
-
}],
|
|
88
|
-
type: 'layout'
|
|
89
|
-
}
|
|
45
|
+
checkFile: true,
|
|
46
|
+
meta: {
|
|
47
|
+
docs: {
|
|
48
|
+
description: "This rule checks for multi-line-style comments which fail to meet the criteria of a jsdoc block.",
|
|
49
|
+
url: "https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-bad-blocks.md#repos-sticky-header"
|
|
50
|
+
},
|
|
51
|
+
fixable: "code",
|
|
52
|
+
schema: [{
|
|
53
|
+
additionalProperties: false,
|
|
54
|
+
properties: {
|
|
55
|
+
ignore: {
|
|
56
|
+
items: { type: "string" },
|
|
57
|
+
type: "array"
|
|
58
|
+
},
|
|
59
|
+
preventAllMultiAsteriskBlocks: { type: "boolean" }
|
|
60
|
+
},
|
|
61
|
+
type: "object"
|
|
62
|
+
}],
|
|
63
|
+
type: "layout"
|
|
64
|
+
}
|
|
90
65
|
});
|
|
91
|
-
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
68
|
+
exports.default = noBadBlocks_default;
|
|
92
69
|
//# sourceMappingURL=noBadBlocks.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noBadBlocks.cjs","names":["
|
|
1
|
+
{"version":3,"file":"noBadBlocks.cjs","names":["iterateJsdoc"],"sources":["../../src/rules/noBadBlocks.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\nimport {\n parse as commentParser,\n} from 'comment-parser';\n\n// Neither a single nor 3+ asterisks are valid jsdoc per\n// https://jsdoc.app/about-getting-started.html#adding-documentation-comments-to-your-code\nconst commentRegexp = /^\\/\\*(?!\\*)/v;\nconst extraAsteriskCommentRegexp = /^\\/\\*{3,}/v;\n\nexport default iterateJsdoc(({\n allComments,\n context,\n makeReport,\n sourceCode,\n}) => {\n const [\n {\n ignore = [\n 'ts-check',\n 'ts-expect-error',\n 'ts-ignore',\n 'ts-nocheck',\n ],\n preventAllMultiAsteriskBlocks = false,\n } = {},\n ] = context.options;\n\n let extraAsterisks = false;\n const nonJsdocNodes = /** @type {import('estree').Node[]} */ (\n allComments\n ).filter((comment) => {\n const commentText = sourceCode.getText(comment);\n\n const initialText = commentText.replace(commentRegexp, '').trimStart();\n if ([\n 'eslint',\n ].some((directive) => {\n return initialText.startsWith(directive);\n })) {\n return false;\n }\n\n let sliceIndex = 2;\n if (!commentRegexp.test(commentText)) {\n const multiline = extraAsteriskCommentRegexp.exec(commentText)?.[0];\n if (!multiline) {\n return false;\n }\n\n sliceIndex = multiline.length;\n extraAsterisks = true;\n if (preventAllMultiAsteriskBlocks) {\n return true;\n }\n }\n\n const tags = (commentParser(\n `${commentText.slice(0, 2)}*${commentText.slice(sliceIndex)}`,\n )[0] || {}).tags ?? [];\n\n return tags.length && !tags.some(({\n tag,\n }) => {\n return ignore.includes(tag);\n });\n });\n\n if (!nonJsdocNodes.length) {\n return;\n }\n\n for (const node of nonJsdocNodes) {\n const report = /** @type {import('../iterateJsdoc.js').MakeReport} */ (\n makeReport\n )(context, node);\n\n // eslint-disable-next-line no-loop-func\n const fix = /** @type {import('eslint').Rule.ReportFixer} */ (fixer) => {\n const text = sourceCode.getText(node);\n\n return fixer.replaceText(\n node,\n extraAsterisks ?\n text.replace(extraAsteriskCommentRegexp, '/**') :\n text.replace('/*', '/**'),\n );\n };\n\n report('Expected JSDoc-like comment to begin with two asterisks.', fix);\n }\n}, {\n checkFile: true,\n meta: {\n docs: {\n description: 'This rule checks for multi-line-style comments which fail to meet the criteria of a jsdoc block.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-bad-blocks.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n ignore: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n preventAllMultiAsteriskBlocks: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'layout',\n },\n});\n"],"mappings":";;;;;AAOA,MAAM,gBAAgB;AACtB,MAAM,6BAA6B;AAEnC,0BAAeA,6BAAa,CAAC,EAC3B,aACA,SACA,YACA,YACD,KAAK;CACJ,MAAM,CACJ,EACE,SAAS;EACP;EACA;EACA;EACA;CACD,GACD,gCAAgC,OACjC,GAAG,CAAE,EACP,GAAG,QAAQ;CAEZ,IAAI,iBAAiB;CACrB,MAAM,gBACJ,YACA,OAAO,CAAC,YAAY;EACpB,MAAM,cAAc,WAAW,QAAQ,QAAQ;EAE/C,MAAM,cAAc,YAAY,QAAQ,eAAe,GAAG,CAAC,WAAW;AACtE,MAAI,CACF,QACD,EAAC,KAAK,CAAC,cAAc;AACpB,UAAO,YAAY,WAAW,UAAU;EACzC,EAAC,CACA,QAAO;EAGT,IAAI,aAAa;AACjB,MAAI,CAAC,cAAc,KAAK,YAAY,EAAE;GACpC,MAAM,YAAY,2BAA2B,KAAK,YAAY,GAAG;AACjE,OAAI,CAAC,UACH,QAAO;GAGT,aAAa,UAAU;GACvB,iBAAiB;AACjB,OAAI,8BACF,QAAO;EAEV;EAED,MAAM,kCACJ,GAAG,YAAY,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,MAAM,WAAW,EAAE,CAC9D,CAAC,MAAM,CAAE,GAAE,QAAQ,CAAE;AAEtB,SAAO,KAAK,UAAU,CAAC,KAAK,KAAK,CAAC,EAChC,KACD,KAAK;AACJ,UAAO,OAAO,SAAS,IAAI;EAC5B,EAAC;CACH,EAAC;AAEF,KAAI,CAAC,cAAc,OACjB;AAGF,MAAK,MAAM,QAAQ,eAAe;EAChC,MAAM,SACJ,WACA,SAAS,KAAK;EAGhB,MAAM,MAAuD,CAAC,UAAU;GACtE,MAAM,OAAO,WAAW,QAAQ,KAAK;AAErC,UAAO,MAAM,YACX,MACA,iBACE,KAAK,QAAQ,4BAA4B,MAAM,GAC/C,KAAK,QAAQ,MAAM,MAAM,CAC5B;EACF;EAED,OAAO,4DAA4D,IAAI;CACxE;AACF,GAAE;CACD,WAAW;CACX,MAAM;EACJ,MAAM;GACJ,aAAa;GACb,KAAK;EACN;EACD,SAAS;EACT,QAAQ,CACN;GACE,sBAAsB;GACtB,YAAY;IACV,QAAQ;KACN,OAAO,EACL,MAAM,SACP;KACD,MAAM;IACP;IACD,+BAA+B,EAC7B,MAAM,UACP;GACF;GACD,MAAM;EACP,CACF;EACD,MAAM;CACP;AACF,EAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import iterateJsdoc from "../iterateJsdoc.js";
|
|
2
|
+
import { parse } from "comment-parser";
|
|
3
|
+
|
|
4
|
+
//#region src/rules/noBadBlocks.js
|
|
5
|
+
const commentRegexp = /^\/\*(?!\*)/v;
|
|
6
|
+
const extraAsteriskCommentRegexp = /^\/\*{3,}/v;
|
|
7
|
+
var noBadBlocks_default = iterateJsdoc(({ allComments, context, makeReport, sourceCode }) => {
|
|
8
|
+
const [{ ignore = [
|
|
9
|
+
"ts-check",
|
|
10
|
+
"ts-expect-error",
|
|
11
|
+
"ts-ignore",
|
|
12
|
+
"ts-nocheck"
|
|
13
|
+
], preventAllMultiAsteriskBlocks = false } = {}] = context.options;
|
|
14
|
+
let extraAsterisks = false;
|
|
15
|
+
const nonJsdocNodes = allComments.filter((comment) => {
|
|
16
|
+
const commentText = sourceCode.getText(comment);
|
|
17
|
+
const initialText = commentText.replace(commentRegexp, "").trimStart();
|
|
18
|
+
if (["eslint"].some((directive) => {
|
|
19
|
+
return initialText.startsWith(directive);
|
|
20
|
+
})) return false;
|
|
21
|
+
let sliceIndex = 2;
|
|
22
|
+
if (!commentRegexp.test(commentText)) {
|
|
23
|
+
const multiline = extraAsteriskCommentRegexp.exec(commentText)?.[0];
|
|
24
|
+
if (!multiline) return false;
|
|
25
|
+
sliceIndex = multiline.length;
|
|
26
|
+
extraAsterisks = true;
|
|
27
|
+
if (preventAllMultiAsteriskBlocks) return true;
|
|
28
|
+
}
|
|
29
|
+
const tags = (parse(`${commentText.slice(0, 2)}*${commentText.slice(sliceIndex)}`)[0] || {}).tags ?? [];
|
|
30
|
+
return tags.length && !tags.some(({ tag }) => {
|
|
31
|
+
return ignore.includes(tag);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
if (!nonJsdocNodes.length) return;
|
|
35
|
+
for (const node of nonJsdocNodes) {
|
|
36
|
+
const report = makeReport(context, node);
|
|
37
|
+
const fix = (fixer) => {
|
|
38
|
+
const text = sourceCode.getText(node);
|
|
39
|
+
return fixer.replaceText(node, extraAsterisks ? text.replace(extraAsteriskCommentRegexp, "/**") : text.replace("/*", "/**"));
|
|
40
|
+
};
|
|
41
|
+
report("Expected JSDoc-like comment to begin with two asterisks.", fix);
|
|
42
|
+
}
|
|
43
|
+
}, {
|
|
44
|
+
checkFile: true,
|
|
45
|
+
meta: {
|
|
46
|
+
docs: {
|
|
47
|
+
description: "This rule checks for multi-line-style comments which fail to meet the criteria of a jsdoc block.",
|
|
48
|
+
url: "https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-bad-blocks.md#repos-sticky-header"
|
|
49
|
+
},
|
|
50
|
+
fixable: "code",
|
|
51
|
+
schema: [{
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
properties: {
|
|
54
|
+
ignore: {
|
|
55
|
+
items: { type: "string" },
|
|
56
|
+
type: "array"
|
|
57
|
+
},
|
|
58
|
+
preventAllMultiAsteriskBlocks: { type: "boolean" }
|
|
59
|
+
},
|
|
60
|
+
type: "object"
|
|
61
|
+
}],
|
|
62
|
+
type: "layout"
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { noBadBlocks_default as default };
|
|
68
|
+
//# sourceMappingURL=noBadBlocks.js.map
|