eslint-plugin-jsdoc 52.0.4 → 53.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.
- 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 +1539 -1988
- package/dist/iterateJsdoc.cjs.map +1 -1
- package/dist/iterateJsdoc.d.cts +472 -0
- package/dist/iterateJsdoc.d.cts.map +1 -0
- package/dist/iterateJsdoc.d.ts +359 -349
- package/dist/iterateJsdoc.d.ts.map +1 -1
- package/dist/iterateJsdoc.js +1628 -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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterateJsdoc.js","names":["commentStringify","jsdocUtils","parseComment"],"sources":["../src/iterateJsdoc.js"],"sourcesContent":["import * as jsdocUtils from './jsdocUtils.js';\nimport {\n commentHandler,\n getJSDocComment,\n parseComment,\n} from '@es-joy/jsdoccomment';\nimport {\n stringify as commentStringify,\n util,\n} from 'comment-parser';\nimport esquery from 'esquery';\n\n/**\n * @typedef {number} Integer\n */\n\n/**\n * @typedef {import('@es-joy/jsdoccomment').JsdocBlockWithInline} JsdocBlockWithInline\n */\n\n/**\n * @typedef {{\n * disallowName?: string,\n * allowName?: string,\n * context?: string,\n * comment?: string,\n * tags?: string[],\n * replacement?: string,\n * minimum?: Integer,\n * message?: string,\n * forceRequireReturn?: boolean\n * }} ContextObject\n */\n/**\n * @typedef {string|ContextObject} Context\n */\n\n/**\n * @callback CheckJsdoc\n * @param {{\n * lastIndex?: Integer,\n * isFunctionContext?: boolean,\n * selector?: string,\n * comment?: string\n * }} info\n * @param {null|((jsdoc: import('@es-joy/jsdoccomment').JsdocBlockWithInline) => boolean|undefined)} handler\n * @param {import('eslint').Rule.Node} node\n * @returns {void}\n */\n\n/**\n * @callback ForEachPreferredTag\n * @param {string} tagName\n * @param {(\n * matchingJsdocTag: import('@es-joy/jsdoccomment').JsdocTagWithInline,\n * targetTagName: string\n * ) => void} arrayHandler\n * @param {boolean} [skipReportingBlockedTag]\n * @returns {void}\n */\n\n/**\n * @callback ReportSettings\n * @param {string} message\n * @returns {void}\n */\n\n/**\n * @callback ParseClosureTemplateTag\n * @param {import('comment-parser').Spec} tag\n * @returns {string[]}\n */\n\n/**\n * @callback GetPreferredTagNameObject\n * @param {{\n * tagName: string\n * }} cfg\n * @returns {string|false|{\n * message: string;\n * replacement?: string|undefined\n * }|{\n * blocked: true,\n * tagName: string\n * }}\n */\n\n/**\n * @typedef {{\n * forEachPreferredTag: ForEachPreferredTag,\n * reportSettings: ReportSettings,\n * parseClosureTemplateTag: ParseClosureTemplateTag,\n * getPreferredTagNameObject: GetPreferredTagNameObject,\n * pathDoesNotBeginWith: import('./jsdocUtils.js').PathDoesNotBeginWith\n * }} BasicUtils\n */\n\n/**\n * @callback IsIteratingFunction\n * @returns {boolean}\n */\n\n/**\n * @callback IsVirtualFunction\n * @returns {boolean}\n */\n\n/**\n * @callback Stringify\n * @param {import('comment-parser').Block} tagBlock\n * @param {boolean} [specRewire]\n * @returns {string}\n */\n\n/**\n * @callback ReportJSDoc\n * @param {string} msg\n * @param {null|import('comment-parser').Spec|{line: Integer, column?: Integer}} [tag]\n * @param {(() => void)|null} [handler]\n * @param {boolean} [specRewire]\n * @param {undefined|{\n * [key: string]: string\n * }} [data]\n */\n\n/**\n * @callback GetRegexFromString\n * @param {string} str\n * @param {string} [requiredFlags]\n * @returns {RegExp}\n */\n\n/**\n * @callback GetTagDescription\n * @param {import('comment-parser').Spec} tg\n * @param {boolean} [returnArray]\n * @returns {string[]|string}\n */\n\n/**\n * @callback SetTagDescription\n * @param {import('comment-parser').Spec} tg\n * @param {RegExp} matcher\n * @param {(description: string) => string} setter\n * @returns {Integer}\n */\n\n/**\n * @callback GetDescription\n * @returns {{\n * description: string,\n * descriptions: string[],\n * lastDescriptionLine: Integer\n * }}\n */\n\n/**\n * @callback SetBlockDescription\n * @param {(\n * info: {\n * delimiter: string,\n * postDelimiter: string,\n * start: string\n * },\n * seedTokens: (\n * tokens?: Partial<import('comment-parser').Tokens>\n * ) => import('comment-parser').Tokens,\n * descLines: string[]\n * ) => import('comment-parser').Line[]} setter\n * @returns {void}\n */\n\n/**\n * @callback SetDescriptionLines\n * @param {RegExp} matcher\n * @param {(description: string) => string} setter\n * @returns {Integer}\n */\n\n/**\n * @callback ChangeTag\n * @param {import('comment-parser').Spec} tag\n * @param {...Partial<import('comment-parser').Tokens>} tokens\n * @returns {void}\n */\n\n/**\n * @callback SetTag\n * @param {import('comment-parser').Spec & {\n * line: Integer\n * }} tag\n * @param {Partial<import('comment-parser').Tokens>} [tokens]\n * @returns {void}\n */\n\n/**\n * @callback RemoveTag\n * @param {Integer} tagIndex\n * @param {{\n * removeEmptyBlock?: boolean,\n * tagSourceOffset?: Integer\n * }} [cfg]\n * @returns {void}\n */\n\n/**\n * @callback AddTag\n * @param {string} targetTagName\n * @param {Integer} [number]\n * @param {import('comment-parser').Tokens|{}} [tokens]\n * @returns {void}\n */\n\n/**\n * @callback GetFirstLine\n * @returns {Integer|undefined}\n */\n\n/**\n * @typedef {(\n * tokens?: Partial<import('comment-parser').Tokens> | undefined\n * ) => import('comment-parser').Tokens} SeedTokens\n */\n\n/**\n * Sets tokens to empty string.\n * @callback EmptyTokens\n * @param {import('comment-parser').Tokens} tokens\n * @returns {void}\n */\n\n/**\n * @callback AddLine\n * @param {Integer} sourceIndex\n * @param {Partial<import('comment-parser').Tokens>} tokens\n * @returns {void}\n */\n\n/**\n * @callback AddLines\n * @param {Integer} tagIndex\n * @param {Integer} tagSourceOffset\n * @param {Integer} numLines\n * @returns {void}\n */\n\n/**\n * @callback MakeMultiline\n * @returns {void}\n */\n\n/**\n * @callback GetFunctionParameterNames\n * @param {boolean} [useDefaultObjectProperties]\n * @returns {import('./jsdocUtils.js').ParamNameInfo[]}\n */\n\n/**\n * @callback HasParams\n * @returns {Integer}\n */\n\n/**\n * @callback IsGenerator\n * @returns {boolean}\n */\n\n/**\n * @callback IsConstructor\n * @returns {boolean}\n */\n\n/**\n * @callback GetJsdocTagsDeep\n * @param {string} tagName\n * @returns {false|{\n * idx: Integer,\n * name: string,\n * type: string\n * }[]}\n */\n\n/**\n * @callback GetPreferredTagName\n * @param {{\n * tagName: string,\n * skipReportingBlockedTag?: boolean,\n * allowObjectReturn?: boolean,\n * defaultMessage?: string\n * }} cfg\n * @returns {string|undefined|false|{\n * message: string;\n * replacement?: string|undefined;\n * }|{\n * blocked: true,\n * tagName: string\n * }}\n */\n\n/**\n * @callback IsValidTag\n * @param {string} name\n * @param {string[]} definedTags\n * @returns {boolean}\n */\n\n/**\n * @callback HasATag\n * @param {string[]} names\n * @returns {boolean}\n */\n\n/**\n * @callback HasTag\n * @param {string} name\n * @returns {boolean}\n */\n\n/**\n * @callback ComparePaths\n * @param {string} name\n * @returns {(otherPathName: string) => boolean}\n */\n\n/**\n * @callback DropPathSegmentQuotes\n * @param {string} name\n * @returns {string}\n */\n\n/**\n * @callback AvoidDocs\n * @returns {boolean}\n */\n\n/**\n * @callback TagMightHaveNamePositionTypePosition\n * @param {string} tagName\n * @param {import('./getDefaultTagStructureForMode.js').\n * TagStructure[]} [otherModeMaps]\n * @returns {boolean|{otherMode: true}}\n */\n\n/**\n * @callback TagMustHave\n * @param {string} tagName\n * @param {import('./getDefaultTagStructureForMode.js').\n * TagStructure[]} otherModeMaps\n * @returns {boolean|{\n * otherMode: false\n * }}\n */\n\n/**\n * @callback TagMissingRequiredTypeOrNamepath\n * @param {import('comment-parser').Spec} tag\n * @param {import('./getDefaultTagStructureForMode.js').\n * TagStructure[]} otherModeMaps\n * @returns {boolean|{\n * otherMode: false\n * }}\n */\n\n/**\n * @callback IsNamepathX\n * @param {string} tagName\n * @returns {boolean}\n */\n\n/**\n * @callback GetTagStructureForMode\n * @param {import('./jsdocUtils.js').ParserMode} mde\n * @returns {import('./getDefaultTagStructureForMode.js').TagStructure}\n */\n\n/**\n * @callback MayBeUndefinedTypeTag\n * @param {import('comment-parser').Spec} tag\n * @returns {boolean}\n */\n\n/**\n * @callback HasValueOrExecutorHasNonEmptyResolveValue\n * @param {boolean} anyPromiseAsReturn\n * @param {boolean} [allBranches]\n * @returns {boolean}\n */\n\n/**\n * @callback HasYieldValue\n * @returns {boolean}\n */\n\n/**\n * @callback HasYieldReturnValue\n * @returns {boolean}\n */\n\n/**\n * @callback HasThrowValue\n * @returns {boolean}\n */\n\n/**\n * @callback IsAsync\n * @returns {boolean|undefined}\n */\n\n/**\n * @callback GetTags\n * @param {string} tagName\n * @returns {import('comment-parser').Spec[]}\n */\n\n/**\n * @callback GetPresentTags\n * @param {string[]} tagList\n * @returns {import('@es-joy/jsdoccomment').JsdocTagWithInline[]}\n */\n\n/**\n * @callback FilterTags\n * @param {(tag: import('@es-joy/jsdoccomment').JsdocTagWithInline) => boolean} filter\n * @returns {import('@es-joy/jsdoccomment').JsdocTagWithInline[]}\n */\n\n/**\n * @callback FilterAllTags\n * @param {(tag: (import('comment-parser').Spec|\n * import('@es-joy/jsdoccomment').JsdocInlineTagNoType)) => boolean} filter\n * @returns {(import('comment-parser').Spec|\n * import('@es-joy/jsdoccomment').JsdocInlineTagNoType)[]}\n */\n\n/**\n * @callback GetTagsByType\n * @param {import('comment-parser').Spec[]} tags\n * @returns {{\n * tagsWithNames: import('comment-parser').Spec[],\n * tagsWithoutNames: import('comment-parser').Spec[]\n * }}\n */\n\n/**\n * @callback HasOptionTag\n * @param {string} tagName\n * @returns {boolean}\n */\n\n/**\n * @callback GetClassNode\n * @returns {Node|null}\n */\n\n/**\n * @callback GetClassJsdoc\n * @returns {null|JsdocBlockWithInline}\n */\n\n/**\n * @callback ClassHasTag\n * @param {string} tagName\n * @returns {boolean}\n */\n\n/**\n * @callback FindContext\n * @param {Context[]} contexts\n * @param {string|undefined} comment\n * @returns {{\n * foundContext: Context|undefined,\n * contextStr: string\n * }}\n */\n\n/**\n * @typedef {BasicUtils & {\n * isIteratingFunction: IsIteratingFunction,\n * isIteratingFunctionOrVariable: IsIteratingFunction,\n * isVirtualFunction: IsVirtualFunction,\n * stringify: Stringify,\n * reportJSDoc: ReportJSDoc,\n * getRegexFromString: GetRegexFromString,\n * getTagDescription: GetTagDescription,\n * setTagDescription: SetTagDescription,\n * getDescription: GetDescription,\n * setBlockDescription: SetBlockDescription,\n * setDescriptionLines: SetDescriptionLines,\n * changeTag: ChangeTag,\n * setTag: SetTag,\n * removeTag: RemoveTag,\n * addTag: AddTag,\n * getFirstLine: GetFirstLine,\n * seedTokens: SeedTokens,\n * emptyTokens: EmptyTokens,\n * addLine: AddLine,\n * addLines: AddLines,\n * makeMultiline: MakeMultiline,\n * flattenRoots: import('./jsdocUtils.js').FlattenRoots,\n * getFunctionParameterNames: GetFunctionParameterNames,\n * hasParams: HasParams,\n * isGenerator: IsGenerator,\n * isConstructor: IsConstructor,\n * getJsdocTagsDeep: GetJsdocTagsDeep,\n * getPreferredTagName: GetPreferredTagName,\n * isValidTag: IsValidTag,\n * hasATag: HasATag,\n * hasTag: HasTag,\n * comparePaths: ComparePaths,\n * dropPathSegmentQuotes: DropPathSegmentQuotes,\n * avoidDocs: AvoidDocs,\n * tagMightHaveNamePosition: TagMightHaveNamePositionTypePosition,\n * tagMightHaveTypePosition: TagMightHaveNamePositionTypePosition,\n * tagMustHaveNamePosition: TagMustHave,\n * tagMustHaveTypePosition: TagMustHave,\n * tagMissingRequiredTypeOrNamepath: TagMissingRequiredTypeOrNamepath,\n * isNamepathDefiningTag: IsNamepathX,\n * isNamepathReferencingTag: IsNamepathX,\n * isNamepathOrUrlReferencingTag: IsNamepathX,\n * tagMightHaveNamepath: IsNamepathX,\n * getTagStructureForMode: GetTagStructureForMode,\n * mayBeUndefinedTypeTag: MayBeUndefinedTypeTag,\n * hasValueOrExecutorHasNonEmptyResolveValue: HasValueOrExecutorHasNonEmptyResolveValue,\n * hasYieldValue: HasYieldValue,\n * hasYieldReturnValue: HasYieldReturnValue,\n * hasThrowValue: HasThrowValue,\n * isAsync: IsAsync,\n * getTags: GetTags,\n * getPresentTags: GetPresentTags,\n * filterTags: FilterTags,\n * filterAllTags: FilterAllTags,\n * getTagsByType: GetTagsByType,\n * hasOptionTag: HasOptionTag,\n * getClassNode: GetClassNode,\n * getClassJsdoc: GetClassJsdoc,\n * classHasTag: ClassHasTag,\n * findContext: FindContext\n * }} Utils\n */\n\nconst {\n rewireSpecs,\n seedTokens,\n} = util;\n\n// todo: Change these `any` types once importing types properly.\n\n/**\n * Should use ESLint rule's typing.\n * @typedef {import('eslint').Rule.RuleMetaData} EslintRuleMeta\n */\n\n/**\n * A plain object for tracking state as needed by rules across iterations.\n * @typedef {{\n * globalTags: {},\n * hasDuplicates: {\n * [key: string]: boolean\n * },\n * selectorMap: {\n * [selector: string]: {\n * [comment: string]: Integer\n * }\n * },\n * hasTag: {\n * [key: string]: boolean\n * },\n * hasNonComment: number,\n * hasNonCommentBeforeTag: {\n * [key: string]: boolean|number\n * }\n * }} StateObject\n */\n\n/**\n * The Node AST as supplied by the parser.\n * @typedef {import('eslint').Rule.Node} Node\n */\n\n/*\nconst {\n align as commentAlign,\n flow: commentFlow,\n indent: commentIndent,\n} = transforms;\n*/\n\nconst globalState = new Map();\n/**\n * @param {import('eslint').Rule.RuleContext} context\n * @param {{\n * tagNamePreference?: import('./jsdocUtils.js').TagNamePreference,\n * mode?: import('./jsdocUtils.js').ParserMode\n * }} cfg\n * @returns {BasicUtils}\n */\nconst getBasicUtils = (context, {\n mode,\n tagNamePreference,\n}) => {\n /** @type {BasicUtils} */\n const utils = {};\n\n /** @type {ReportSettings} */\n utils.reportSettings = (message) => {\n context.report({\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message,\n });\n };\n\n /** @type {ParseClosureTemplateTag} */\n utils.parseClosureTemplateTag = (tag) => {\n return jsdocUtils.parseClosureTemplateTag(tag);\n };\n\n utils.pathDoesNotBeginWith = jsdocUtils.pathDoesNotBeginWith;\n\n /** @type {GetPreferredTagNameObject} */\n utils.getPreferredTagNameObject = ({\n tagName,\n }) => {\n const ret = jsdocUtils.getPreferredTagNameSimple(\n tagName,\n /** @type {import('./jsdocUtils.js').ParserMode} */ (mode),\n tagNamePreference,\n context,\n );\n const isObject = ret && typeof ret === 'object';\n if (ret === false || (isObject && !ret.replacement)) {\n return {\n blocked: true,\n tagName,\n };\n }\n\n return ret;\n };\n\n return utils;\n};\n\n/**\n * @callback Report\n * @param {string} message\n * @param {import('eslint').Rule.ReportFixer|null} [fix]\n * @param {null|\n * {line?: Integer, column?: Integer}|\n * import('comment-parser').Spec & {line?: Integer}\n * } [jsdocLoc]\n * @param {undefined|{\n * [key: string]: string\n * }} [data]\n * @returns {void}\n */\n\n/**\n * @param {Node|null} node\n * @param {JsdocBlockWithInline} jsdoc\n * @param {import('eslint').AST.Token} jsdocNode\n * @param {Settings} settings\n * @param {Report} report\n * @param {import('eslint').Rule.RuleContext} context\n * @param {import('eslint').SourceCode} sc\n * @param {boolean|undefined} iteratingAll\n * @param {RuleConfig} ruleConfig\n * @param {string} indent\n * @returns {Utils}\n */\nconst getUtils = (\n node,\n jsdoc,\n jsdocNode,\n settings,\n report,\n context,\n sc,\n iteratingAll,\n ruleConfig,\n indent,\n) => {\n const ancestors = /** @type {import('eslint').Rule.Node[]} */ (node ?\n (sc.getAncestors ?\n (\n sc.getAncestors(node)\n /* c8 ignore next 4 */\n ) :\n (\n context.getAncestors()\n )) :\n []);\n\n /* c8 ignore next -- Fallback to deprecated method */\n const {\n sourceCode = context.getSourceCode(),\n } = context;\n\n const utils = /** @type {Utils} */ (getBasicUtils(context, settings));\n\n const {\n augmentsExtendsReplacesDocs,\n ignoreReplacesDocs,\n implementsReplacesDocs,\n maxLines,\n minLines,\n mode,\n overrideReplacesDocs,\n tagNamePreference,\n } = settings;\n\n const functionTypes = [\n 'ArrowFunctionExpression',\n 'FunctionDeclaration',\n 'FunctionExpression',\n 'MethodDefinition',\n ];\n\n /** @type {IsIteratingFunction} */\n utils.isIteratingFunction = () => {\n return !iteratingAll || functionTypes.includes(String(node?.type));\n };\n\n /** @type {IsIteratingFunction} */\n utils.isIteratingFunctionOrVariable = () => {\n if (utils.isIteratingFunction()) {\n return true;\n }\n\n /** @type {import('estree').VariableDeclarator[]} */\n const declarations = node?.type === 'VariableDeclaration' ?\n node.declarations :\n (node?.type === 'ExportNamedDeclaration' && node.declaration?.type === 'VariableDeclaration' ?\n node.declaration.declarations :\n []);\n\n return declarations.some(({\n init,\n }) => {\n return functionTypes.includes(String(init?.type));\n });\n };\n\n /** @type {IsVirtualFunction} */\n utils.isVirtualFunction = () => {\n return Boolean(iteratingAll) && utils.hasATag([\n 'callback', 'function', 'func', 'method',\n ]);\n };\n\n /** @type {Stringify} */\n utils.stringify = (tagBlock, specRewire) => {\n let block;\n if (specRewire) {\n block = rewireSpecs(tagBlock);\n }\n\n return commentStringify(/** @type {import('comment-parser').Block} */ (\n specRewire ? block : tagBlock));\n };\n\n /** @type {ReportJSDoc} */\n utils.reportJSDoc = (msg, tag, handler, specRewire, data) => {\n report(msg, handler ? /** @type {import('eslint').Rule.ReportFixer} */ (\n fixer,\n ) => {\n handler();\n const replacement = utils.stringify(jsdoc, specRewire);\n\n if (!replacement) {\n const text = sourceCode.getText();\n const lastLineBreakPos = text.slice(\n 0, jsdocNode.range[0],\n ).search(/\\n[ \\t]*$/v);\n if (lastLineBreakPos > -1) {\n return fixer.removeRange([\n lastLineBreakPos, jsdocNode.range[1],\n ]);\n }\n\n return fixer.removeRange(\n (/\\s/v).test(text.charAt(jsdocNode.range[1])) ?\n [\n jsdocNode.range[0], jsdocNode.range[1] + 1,\n ] :\n jsdocNode.range,\n );\n }\n\n return fixer.replaceText(jsdocNode, replacement);\n } : null, tag, data);\n };\n\n /** @type {GetRegexFromString} */\n utils.getRegexFromString = (str, requiredFlags) => {\n return jsdocUtils.getRegexFromString(str, requiredFlags);\n };\n\n /** @type {GetTagDescription} */\n utils.getTagDescription = (tg, returnArray) => {\n return jsdocUtils.getTagDescription(tg, returnArray);\n };\n\n /** @type {SetTagDescription} */\n utils.setTagDescription = (tg, matcher, setter) => {\n let finalIdx = 0;\n tg.source.some(({\n tokens: {\n description,\n },\n }, idx) => {\n if (description && matcher.test(description)) {\n tg.source[idx].tokens.description = setter(description);\n finalIdx = idx;\n return true;\n }\n\n return false;\n });\n\n return finalIdx;\n };\n\n /** @type {GetDescription} */\n utils.getDescription = () => {\n /** @type {string[]} */\n const descriptions = [];\n let lastDescriptionLine = 0;\n let tagsBegun = false;\n jsdoc.source.some(({\n tokens: {\n description,\n end,\n tag,\n },\n }, idx) => {\n if (tag) {\n tagsBegun = true;\n }\n\n if (idx && (tag || end)) {\n lastDescriptionLine = idx - 1;\n if (!tagsBegun && description) {\n descriptions.push(description);\n }\n\n return true;\n }\n\n if (!tagsBegun && (idx || description)) {\n descriptions.push(description || (descriptions.length ? '' : '\\n'));\n }\n\n return false;\n });\n\n return {\n description: descriptions.join('\\n'),\n descriptions,\n lastDescriptionLine,\n };\n };\n\n /** @type {SetBlockDescription} */\n utils.setBlockDescription = (setter) => {\n /** @type {string[]} */\n const descLines = [];\n /**\n * @type {undefined|Integer}\n */\n let startIdx;\n /**\n * @type {undefined|Integer}\n */\n let endIdx;\n\n /**\n * @type {undefined|{\n * delimiter: string,\n * postDelimiter: string,\n * start: string\n * }}\n */\n let info;\n\n jsdoc.source.some(({\n tokens: {\n delimiter,\n description,\n end,\n postDelimiter,\n start,\n tag,\n },\n }, idx) => {\n if (delimiter === '/**') {\n return false;\n }\n\n if (startIdx === undefined) {\n startIdx = idx;\n info = {\n delimiter,\n postDelimiter,\n start,\n };\n }\n\n if (tag || end) {\n endIdx = idx;\n return true;\n }\n\n descLines.push(description);\n return false;\n });\n\n /* c8 ignore else -- Won't be called if missing */\n if (descLines.length) {\n jsdoc.source.splice(\n /** @type {Integer} */ (startIdx),\n /** @type {Integer} */ (endIdx) - /** @type {Integer} */ (startIdx),\n ...setter(\n /**\n * @type {{\n * delimiter: string,\n * postDelimiter: string,\n * start: string\n * }}\n */\n (info),\n seedTokens,\n descLines,\n ),\n );\n }\n };\n\n /** @type {SetDescriptionLines} */\n utils.setDescriptionLines = (matcher, setter) => {\n let finalIdx = 0;\n jsdoc.source.some(({\n tokens: {\n description,\n end,\n tag,\n },\n }, idx) => {\n /* c8 ignore next 3 -- Already checked */\n if (idx && (tag || end)) {\n return true;\n }\n\n if (description && matcher.test(description)) {\n jsdoc.source[idx].tokens.description = setter(description);\n finalIdx = idx;\n return true;\n }\n\n return false;\n });\n\n return finalIdx;\n };\n\n /** @type {ChangeTag} */\n utils.changeTag = (tag, ...tokens) => {\n for (const [\n idx,\n src,\n ] of tag.source.entries()) {\n src.tokens = {\n ...src.tokens,\n ...tokens[idx],\n };\n }\n };\n\n /** @type {SetTag} */\n utils.setTag = (tag, tokens) => {\n tag.source = [\n {\n number: tag.line,\n // Or tag.source[0].number?\n source: '',\n tokens: seedTokens({\n delimiter: '*',\n postDelimiter: ' ',\n start: indent + ' ',\n tag: '@' + tag.tag,\n ...tokens,\n }),\n },\n ];\n };\n\n /** @type {RemoveTag} */\n utils.removeTag = (tagIndex, {\n removeEmptyBlock = false,\n tagSourceOffset = 0,\n } = {}) => {\n const {\n source: tagSource,\n } = jsdoc.tags[tagIndex];\n /** @type {Integer|undefined} */\n let lastIndex;\n const firstNumber = jsdoc.source[0].number;\n tagSource.some(({\n number,\n }, tagIdx) => {\n const sourceIndex = jsdoc.source.findIndex(({\n number: srcNumber,\n }) => {\n return number === srcNumber;\n });\n // c8 ignore else\n if (sourceIndex > -1) {\n let spliceCount = 1;\n tagSource.slice(tagIdx + 1).some(({\n tokens: {\n end: ending,\n tag,\n },\n }) => {\n if (!tag && !ending) {\n spliceCount++;\n\n return false;\n }\n\n return true;\n });\n\n const spliceIdx = sourceIndex + tagSourceOffset;\n\n const {\n delimiter,\n end,\n } = jsdoc.source[spliceIdx].tokens;\n\n if (\n spliceIdx === 0 && jsdoc.tags.length >= 2 ||\n !removeEmptyBlock && (end || delimiter === '/**')\n ) {\n const {\n tokens,\n } = jsdoc.source[spliceIdx];\n for (const item of [\n 'postDelimiter',\n 'tag',\n 'postTag',\n 'type',\n 'postType',\n 'name',\n 'postName',\n 'description',\n ]) {\n tokens[\n /**\n * @type {\"postDelimiter\"|\"tag\"|\"type\"|\"postType\"|\n * \"postTag\"|\"name\"|\"postName\"|\"description\"}\n */ (\n item\n )\n ] = '';\n }\n } else {\n jsdoc.source.splice(spliceIdx, spliceCount - tagSourceOffset + (spliceIdx ? 0 : jsdoc.source.length));\n tagSource.splice(tagIdx + tagSourceOffset, spliceCount - tagSourceOffset + (spliceIdx ? 0 : jsdoc.source.length));\n }\n\n lastIndex = sourceIndex;\n\n return true;\n }\n /* c8 ignore next 2 */\n // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n return false;\n });\n for (const [\n idx,\n src,\n ] of jsdoc.source.slice(lastIndex).entries()) {\n src.number = firstNumber + /** @type {Integer} */ (lastIndex) + idx;\n }\n\n // Todo: Once rewiring of tags may be fixed in comment-parser to reflect\n // missing tags, this step should be added here (so that, e.g.,\n // if accessing `jsdoc.tags`, such as to add a new tag, the\n // correct information will be available)\n };\n\n /** @type {AddTag} */\n utils.addTag = (\n targetTagName,\n number = (jsdoc.tags[jsdoc.tags.length - 1]?.source[0]?.number ?? jsdoc.source.findIndex(({\n tokens: {\n tag,\n },\n }) => {\n return tag;\n }) - 1) + 1,\n tokens = {},\n ) => {\n jsdoc.source.splice(number, 0, {\n number,\n source: '',\n tokens: seedTokens({\n delimiter: '*',\n postDelimiter: ' ',\n start: indent + ' ',\n tag: `@${targetTagName}`,\n ...tokens,\n }),\n });\n for (const src of jsdoc.source.slice(number + 1)) {\n src.number++;\n }\n };\n\n /** @type {GetFirstLine} */\n utils.getFirstLine = () => {\n let firstLine;\n for (const {\n number,\n tokens: {\n tag,\n },\n } of jsdoc.source) {\n if (tag) {\n firstLine = number;\n break;\n }\n }\n\n return firstLine;\n };\n\n /** @type {SeedTokens} */\n utils.seedTokens = seedTokens;\n\n /** @type {EmptyTokens} */\n utils.emptyTokens = (tokens) => {\n for (const prop of [\n 'start',\n 'postDelimiter',\n 'tag',\n 'type',\n 'postType',\n 'postTag',\n 'name',\n 'postName',\n 'description',\n 'end',\n 'lineEnd',\n ]) {\n tokens[\n /**\n * @type {\"start\"|\"postDelimiter\"|\"tag\"|\"type\"|\"postType\"|\n * \"postTag\"|\"name\"|\"postName\"|\"description\"|\"end\"|\"lineEnd\"}\n */ (\n prop\n )\n ] = '';\n }\n };\n\n /** @type {AddLine} */\n utils.addLine = (sourceIndex, tokens) => {\n const number = (jsdoc.source[sourceIndex - 1]?.number || 0) + 1;\n jsdoc.source.splice(sourceIndex, 0, {\n number,\n source: '',\n tokens: seedTokens(tokens),\n });\n\n for (const src of jsdoc.source.slice(number + 1)) {\n src.number++;\n }\n // If necessary, we can rewire the tags (misnamed method)\n // rewireSource(jsdoc);\n };\n\n /** @type {AddLines} */\n utils.addLines = (tagIndex, tagSourceOffset, numLines) => {\n const {\n source: tagSource,\n } = jsdoc.tags[tagIndex];\n /** @type {Integer|undefined} */\n let lastIndex;\n const firstNumber = jsdoc.source[0].number;\n tagSource.some(({\n number,\n }) => {\n const makeLine = () => {\n return {\n number,\n source: '',\n tokens: seedTokens({\n delimiter: '*',\n start: indent + ' ',\n }),\n };\n };\n\n const makeLines = () => {\n return Array.from({\n length: numLines,\n }, makeLine);\n };\n\n const sourceIndex = jsdoc.source.findIndex(({\n number: srcNumber,\n tokens: {\n end,\n },\n }) => {\n return number === srcNumber && !end;\n });\n // c8 ignore else\n if (sourceIndex > -1) {\n const lines = makeLines();\n jsdoc.source.splice(sourceIndex + tagSourceOffset, 0, ...lines);\n\n // tagSource.splice(tagIdx + 1, 0, ...makeLines());\n lastIndex = sourceIndex;\n\n return true;\n }\n /* c8 ignore next 2 */\n // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n return false;\n });\n\n for (const [\n idx,\n src,\n ] of jsdoc.source.slice(lastIndex).entries()) {\n src.number = firstNumber + /** @type {Integer} */ (lastIndex) + idx;\n }\n };\n\n /** @type {MakeMultiline} */\n utils.makeMultiline = () => {\n const {\n source: [\n {\n tokens,\n },\n ],\n } = jsdoc;\n const {\n description,\n lineEnd,\n name,\n postDelimiter,\n tag,\n type,\n } = tokens;\n\n let {\n tokens: {\n postName,\n postTag,\n postType,\n },\n } = jsdoc.source[0];\n\n // Strip trailing leftovers from single line ending\n if (!description) {\n if (postName) {\n postName = '';\n } else if (postType) {\n postType = '';\n } else /* c8 ignore else -- `comment-parser` prevents empty blocks currently per https://github.com/syavorsky/comment-parser/issues/128 */ if (postTag) {\n postTag = '';\n }\n }\n\n utils.emptyTokens(tokens);\n\n utils.addLine(1, {\n delimiter: '*',\n\n // If a description were present, it may have whitespace attached\n // due to being at the end of the single line\n description: description.trimEnd(),\n name,\n postDelimiter,\n postName,\n postTag,\n postType,\n start: indent + ' ',\n tag,\n type,\n });\n utils.addLine(2, {\n end: '*/',\n lineEnd,\n start: indent + ' ',\n });\n };\n\n /**\n * @type {import('./jsdocUtils.js').FlattenRoots}\n */\n utils.flattenRoots = jsdocUtils.flattenRoots;\n\n /** @type {GetFunctionParameterNames} */\n utils.getFunctionParameterNames = (useDefaultObjectProperties) => {\n return jsdocUtils.getFunctionParameterNames(node, useDefaultObjectProperties);\n };\n\n /** @type {HasParams} */\n utils.hasParams = () => {\n return jsdocUtils.hasParams(/** @type {Node} */ (node));\n };\n\n /** @type {IsGenerator} */\n utils.isGenerator = () => {\n return node !== null && Boolean(\n /**\n * @type {import('estree').FunctionDeclaration|\n * import('estree').FunctionExpression}\n */ (node).generator ||\n node.type === 'MethodDefinition' && node.value.generator ||\n [\n 'ExportDefaultDeclaration', 'ExportNamedDeclaration',\n ].includes(node.type) &&\n /** @type {import('estree').FunctionDeclaration} */\n (\n /**\n * @type {import('estree').ExportNamedDeclaration|\n * import('estree').ExportDefaultDeclaration}\n */ (node).declaration\n )?.generator,\n );\n };\n\n /** @type {IsConstructor} */\n utils.isConstructor = () => {\n return jsdocUtils.isConstructor(/** @type {Node} */ (node));\n };\n\n /** @type {GetJsdocTagsDeep} */\n utils.getJsdocTagsDeep = (tagName) => {\n const name = /** @type {string|false} */ (utils.getPreferredTagName({\n tagName,\n }));\n if (!name) {\n return false;\n }\n\n return jsdocUtils.getJsdocTagsDeep(jsdoc, name);\n };\n\n /** @type {GetPreferredTagName} */\n utils.getPreferredTagName = (args) => {\n return jsdocUtils.getPreferredTagName(\n jsdoc, {\n ...args,\n context,\n mode,\n report,\n tagNamePreference,\n },\n );\n };\n\n /** @type {IsValidTag} */\n utils.isValidTag = (name, definedTags) => {\n return jsdocUtils.isValidTag(context, mode, name, definedTags);\n };\n\n /** @type {HasATag} */\n utils.hasATag = (names) => {\n return jsdocUtils.hasATag(jsdoc, names);\n };\n\n /** @type {HasTag} */\n utils.hasTag = (name) => {\n return jsdocUtils.hasTag(jsdoc, name);\n };\n\n /** @type {ComparePaths} */\n utils.comparePaths = (name) => {\n return jsdocUtils.comparePaths(name);\n };\n\n /** @type {DropPathSegmentQuotes} */\n utils.dropPathSegmentQuotes = (name) => {\n return jsdocUtils.dropPathSegmentQuotes(name);\n };\n\n /** @type {AvoidDocs} */\n utils.avoidDocs = () => {\n if (\n ignoreReplacesDocs !== false &&\n (utils.hasTag('ignore') || utils.classHasTag('ignore')) ||\n overrideReplacesDocs !== false &&\n (utils.hasTag('override') || utils.classHasTag('override')) ||\n implementsReplacesDocs !== false &&\n (utils.hasTag('implements') || utils.classHasTag('implements')) ||\n\n augmentsExtendsReplacesDocs &&\n (utils.hasATag([\n 'augments', 'extends',\n ]) ||\n utils.classHasTag('augments') ||\n utils.classHasTag('extends'))) {\n return true;\n }\n\n if (jsdocUtils.exemptSpeciaMethods(\n jsdoc,\n node,\n context,\n /** @type {import('json-schema').JSONSchema4|import('json-schema').JSONSchema4[]} */ (\n ruleConfig.meta.schema\n ),\n )) {\n return true;\n }\n\n const exemptedBy = context.options[0]?.exemptedBy ?? [\n 'inheritDoc',\n ...mode === 'closure' ? [] : [\n 'inheritdoc',\n ],\n ];\n if (exemptedBy.length && utils.getPresentTags(exemptedBy).length) {\n return true;\n }\n\n return false;\n };\n\n for (const method of [\n 'tagMightHaveNamePosition',\n 'tagMightHaveTypePosition',\n ]) {\n /** @type {TagMightHaveNamePositionTypePosition} */\n utils[\n /** @type {\"tagMightHaveNamePosition\"|\"tagMightHaveTypePosition\"} */ (\n method\n )\n ] = (tagName, otherModeMaps) => {\n const result = jsdocUtils[\n /** @type {\"tagMightHaveNamePosition\"|\"tagMightHaveTypePosition\"} */\n (method)\n ](tagName);\n if (result) {\n return true;\n }\n\n if (!otherModeMaps) {\n return false;\n }\n\n const otherResult = otherModeMaps.some((otherModeMap) => {\n return jsdocUtils[\n /** @type {\"tagMightHaveNamePosition\"|\"tagMightHaveTypePosition\"} */\n (method)\n ](tagName, otherModeMap);\n });\n\n return otherResult ? {\n otherMode: true,\n } : false;\n };\n }\n\n /** @type {TagMissingRequiredTypeOrNamepath} */\n utils.tagMissingRequiredTypeOrNamepath = (tagName, otherModeMaps) => {\n const result = jsdocUtils.tagMissingRequiredTypeOrNamepath(tagName);\n if (!result) {\n return false;\n }\n\n const otherResult = otherModeMaps.every((otherModeMap) => {\n return jsdocUtils.tagMissingRequiredTypeOrNamepath(tagName, otherModeMap);\n });\n\n return otherResult ? true : {\n otherMode: false,\n };\n };\n\n for (const method of [\n 'tagMustHaveNamePosition',\n 'tagMustHaveTypePosition',\n ]) {\n /** @type {TagMustHave} */\n utils[\n /** @type {\"tagMustHaveNamePosition\"|\"tagMustHaveTypePosition\"} */\n (method)\n ] = (tagName, otherModeMaps) => {\n const result = jsdocUtils[\n /** @type {\"tagMustHaveNamePosition\"|\"tagMustHaveTypePosition\"} */\n (method)\n ](tagName);\n if (!result) {\n return false;\n }\n\n // if (!otherModeMaps) { return true; }\n\n const otherResult = otherModeMaps.every((otherModeMap) => {\n return jsdocUtils[\n /** @type {\"tagMustHaveNamePosition\"|\"tagMustHaveTypePosition\"} */\n (method)\n ](tagName, otherModeMap);\n });\n\n return otherResult ? true : {\n otherMode: false,\n };\n };\n }\n\n for (const method of [\n 'isNamepathDefiningTag',\n 'isNamepathReferencingTag',\n 'isNamepathOrUrlReferencingTag',\n 'tagMightHaveNamepath',\n ]) {\n /** @type {IsNamepathX} */\n utils[\n /** @type {\"isNamepathDefiningTag\"|\"isNamepathReferencingTag\"|\"isNamepathOrUrlReferencingTag\"|\"tagMightHaveNamepath\"} */ (\n method\n )] = (tagName) => {\n return jsdocUtils[\n /** @type {\"isNamepathDefiningTag\"|\"isNamepathReferencingTag\"|\"isNamepathOrUrlReferencingTag\"|\"tagMightHaveNamepath\"} */\n (method)\n ](tagName);\n };\n }\n\n /** @type {GetTagStructureForMode} */\n utils.getTagStructureForMode = (mde) => {\n return jsdocUtils.getTagStructureForMode(mde, settings.structuredTags);\n };\n\n /** @type {MayBeUndefinedTypeTag} */\n utils.mayBeUndefinedTypeTag = (tag) => {\n return jsdocUtils.mayBeUndefinedTypeTag(tag, settings.mode);\n };\n\n /** @type {HasValueOrExecutorHasNonEmptyResolveValue} */\n utils.hasValueOrExecutorHasNonEmptyResolveValue = (anyPromiseAsReturn, allBranches) => {\n return jsdocUtils.hasValueOrExecutorHasNonEmptyResolveValue(\n /** @type {Node} */ (node), anyPromiseAsReturn, allBranches,\n );\n };\n\n /** @type {HasYieldValue} */\n utils.hasYieldValue = () => {\n if ([\n 'ExportDefaultDeclaration', 'ExportNamedDeclaration',\n ].includes(/** @type {Node} */ (node).type)) {\n return jsdocUtils.hasYieldValue(\n /** @type {import('estree').Declaration|import('estree').Expression} */ (\n /** @type {import('estree').ExportNamedDeclaration|import('estree').ExportDefaultDeclaration} */\n (node).declaration\n ),\n );\n }\n\n return jsdocUtils.hasYieldValue(/** @type {Node} */ (node));\n };\n\n /** @type {HasYieldReturnValue} */\n utils.hasYieldReturnValue = () => {\n return jsdocUtils.hasYieldValue(/** @type {Node} */ (node), true);\n };\n\n /** @type {HasThrowValue} */\n utils.hasThrowValue = () => {\n return jsdocUtils.hasThrowValue(node);\n };\n\n /** @type {IsAsync} */\n utils.isAsync = () => {\n return Boolean(node && 'async' in node && node.async);\n };\n\n /** @type {GetTags} */\n utils.getTags = (tagName) => {\n return jsdocUtils.getTags(jsdoc, tagName);\n };\n\n /** @type {GetPresentTags} */\n utils.getPresentTags = (tagList) => {\n return jsdocUtils.filterTags(jsdoc, (tag) => {\n return tagList.includes(tag.tag);\n });\n };\n\n /** @type {FilterTags} */\n utils.filterTags = (filter) => {\n return jsdocUtils.filterTags(jsdoc, (tag) => {\n return filter(tag);\n });\n };\n\n /** @type {FilterAllTags} */\n utils.filterAllTags = (filter) => {\n const tags = jsdocUtils.getAllTags(jsdoc);\n return tags.filter((tag) => {\n return filter(tag);\n });\n };\n\n /** @type {GetTagsByType} */\n utils.getTagsByType = (tags) => {\n return jsdocUtils.getTagsByType(context, mode, tags);\n };\n\n /** @type {HasOptionTag} */\n utils.hasOptionTag = (tagName) => {\n const {\n tags,\n } = context.options[0] ?? {};\n\n return Boolean(tags && tags.includes(tagName));\n };\n\n /** @type {GetClassNode} */\n utils.getClassNode = () => {\n return [\n ...ancestors, node,\n ].reverse().find((parent) => {\n return parent && [\n 'ClassDeclaration', 'ClassExpression',\n ].includes(parent.type);\n }) ?? null;\n };\n\n /** @type {GetClassJsdoc} */\n utils.getClassJsdoc = () => {\n const classNode = utils.getClassNode();\n\n if (!classNode) {\n return null;\n }\n\n const classJsdocNode = getJSDocComment(sourceCode, classNode, {\n maxLines,\n minLines,\n });\n\n if (classJsdocNode) {\n return parseComment(classJsdocNode, '');\n }\n\n return null;\n };\n\n /** @type {ClassHasTag} */\n utils.classHasTag = (tagName) => {\n const classJsdoc = utils.getClassJsdoc();\n\n return classJsdoc !== null && jsdocUtils.hasTag(classJsdoc, tagName);\n };\n\n /** @type {ForEachPreferredTag} */\n utils.forEachPreferredTag = (tagName, arrayHandler, skipReportingBlockedTag) => {\n return jsdocUtils.forEachPreferredTag(\n jsdoc, tagName, arrayHandler, {\n context,\n mode,\n report,\n skipReportingBlockedTag,\n tagNamePreference,\n },\n );\n };\n\n /** @type {FindContext} */\n utils.findContext = (contexts, comment) => {\n const foundContext = contexts.find((cntxt) => {\n return typeof cntxt === 'string' ?\n esquery.matches(\n /** @type {Node} */ (node),\n esquery.parse(cntxt),\n undefined,\n {\n visitorKeys: sourceCode.visitorKeys,\n },\n ) :\n (!cntxt.context || cntxt.context === 'any' ||\n esquery.matches(\n /** @type {Node} */ (node),\n esquery.parse(cntxt.context),\n undefined,\n {\n visitorKeys: sourceCode.visitorKeys,\n },\n )) && comment === cntxt.comment;\n });\n\n const contextStr = typeof foundContext === 'object' ?\n foundContext.context ?? 'any' :\n String(foundContext);\n\n return {\n contextStr,\n foundContext,\n };\n };\n\n return utils;\n};\n\n/**\n * @typedef {{\n * [key: string]: false|string|{\n * message: string,\n * replacement?: false|string\n * skipRootChecking?: boolean\n * }\n * }} PreferredTypes\n */\n/**\n * @typedef {{\n * [key: string]: {\n * name?: \"text\"|\"namepath-defining\"|\"namepath-referencing\"|false,\n * type?: boolean|string[],\n * required?: (\"name\"|\"type\"|\"typeOrNameRequired\")[]\n * }\n * }} StructuredTags\n */\n/**\n * Settings from ESLint types.\n * @typedef {{\n * maxLines: Integer,\n * minLines: Integer,\n * tagNamePreference: import('./jsdocUtils.js').TagNamePreference,\n * mode: import('./jsdocUtils.js').ParserMode,\n * preferredTypes: PreferredTypes,\n * structuredTags: StructuredTags,\n * [name: string]: any,\n * contexts?: Context[]\n * }} Settings\n */\n\n/**\n * @typedef {{\n * settings?: {\n * jsdoc?: {\n * ignorePrivate: boolean,\n * ignoreInternal: boolean,\n * maxLines: Integer,\n * minLines: Integer,\n * tagNamePreference: import('./jsdocUtils.js').TagNamePreference,\n * preferredTypes: PreferredTypes,\n * structuredTags: StructuredTags,\n * overrideReplacesDocs: boolean,\n * ignoreReplacesDocs: boolean,\n * implementsReplacesDocs: boolean,\n * augmentsExtendsReplacesDocs: boolean,\n * exemptDestructuredRootsFromChecks: boolean,\n * mode: import('./jsdocUtils.js').ParserMode,\n * contexts: Context[],\n * }\n * }\n * }} JSDocSettings\n */\n\n/**\n * @param {import('eslint').Rule.RuleContext & JSDocSettings} context\n * @returns {Settings|false}\n */\nconst getSettings = (context) => {\n /* eslint-disable perfectionist/sort-objects */\n const settings = {\n // All rules\n ignorePrivate: Boolean(context.settings.jsdoc?.ignorePrivate),\n ignoreInternal: Boolean(context.settings.jsdoc?.ignoreInternal),\n maxLines: Number(context.settings.jsdoc?.maxLines ?? 1),\n minLines: Number(context.settings.jsdoc?.minLines ?? 0),\n\n // `check-tag-names` and many returns/param rules\n tagNamePreference: context.settings.jsdoc?.tagNamePreference ?? {},\n\n // `check-types` and `no-undefined-types`\n preferredTypes: context.settings.jsdoc?.preferredTypes ?? {},\n\n // `check-types`, `no-undefined-types`, `valid-types`\n structuredTags: context.settings.jsdoc?.structuredTags ?? {},\n\n // `require-param`, `require-description`, `require-example`,\n // `require-returns`, `require-throw`, `require-yields`\n overrideReplacesDocs: context.settings.jsdoc?.overrideReplacesDocs,\n ignoreReplacesDocs: context.settings.jsdoc?.ignoreReplacesDocs,\n implementsReplacesDocs: context.settings.jsdoc?.implementsReplacesDocs,\n augmentsExtendsReplacesDocs: context.settings.jsdoc?.augmentsExtendsReplacesDocs,\n\n // `require-param-type`, `require-param-description`\n exemptDestructuredRootsFromChecks: context.settings.jsdoc?.exemptDestructuredRootsFromChecks,\n\n // Many rules, e.g., `check-tag-names`\n mode: context.settings.jsdoc?.mode ?? 'typescript',\n\n // Many rules\n contexts: context.settings.jsdoc?.contexts,\n };\n /* eslint-enable perfectionist/sort-objects */\n\n jsdocUtils.setTagStructure(settings.mode);\n try {\n jsdocUtils.overrideTagStructure(settings.structuredTags);\n } catch (error) {\n context.report({\n loc: {\n end: {\n column: 1,\n line: 1,\n },\n start: {\n column: 1,\n line: 1,\n },\n },\n message: /** @type {Error} */ (error).message,\n });\n\n return false;\n }\n\n return settings;\n};\n\n/**\n * Create the report function\n * @callback MakeReport\n * @param {import('eslint').Rule.RuleContext} context\n * @param {import('estree').Node} commentNode\n * @returns {Report}\n */\n\n/** @type {MakeReport} */\nconst makeReport = (context, commentNode) => {\n /** @type {Report} */\n const report = (message, fix = null, jsdocLoc = null, data = undefined) => {\n let loc;\n\n if (jsdocLoc) {\n if (!('line' in jsdocLoc)) {\n jsdocLoc.line = /** @type {import('comment-parser').Spec & {line?: Integer}} */ (\n jsdocLoc\n ).source[0].number;\n }\n\n const lineNumber = /** @type {import('eslint').AST.SourceLocation} */ (\n commentNode.loc\n ).start.line +\n /** @type {Integer} */ (jsdocLoc.line);\n\n loc = {\n end: {\n column: 0,\n line: lineNumber,\n },\n start: {\n column: 0,\n line: lineNumber,\n },\n };\n\n if ('column' in jsdocLoc && typeof jsdocLoc.column === 'number') {\n const colNumber = /** @type {import('eslint').AST.SourceLocation} */ (\n commentNode.loc\n ).start.column + jsdocLoc.column;\n\n loc.end.column = colNumber;\n loc.start.column = colNumber;\n }\n }\n\n context.report({\n data,\n fix,\n loc,\n message,\n node: commentNode,\n });\n };\n\n return report;\n};\n\n/**\n * @typedef {(\n * arg: {\n * context: import('eslint').Rule.RuleContext,\n * sourceCode: import('eslint').SourceCode,\n * indent?: string,\n * info?: {\n * comment?: string|undefined,\n * lastIndex?: Integer|undefined\n * },\n * state?: StateObject,\n * globalState?: Map<string, Map<string, string>>,\n * jsdoc?: JsdocBlockWithInline,\n * jsdocNode?: import('eslint').Rule.Node & {\n * range: [number, number]\n * },\n * node?: Node,\n * allComments?: import('estree').Node[]\n * report?: Report,\n * makeReport?: MakeReport,\n * settings: Settings,\n * utils: BasicUtils,\n * }\n * ) => any } JsdocVisitorBasic\n */\n/**\n * @typedef {(\n * arg: {\n * context: import('eslint').Rule.RuleContext,\n * sourceCode: import('eslint').SourceCode,\n * indent: string,\n * info: {\n * comment?: string|undefined,\n * lastIndex?: Integer|undefined\n * },\n * state: StateObject,\n * globalState: Map<string, Map<string, string>>,\n * jsdoc: JsdocBlockWithInline,\n * jsdocNode: import('eslint').Rule.Node & {\n * range: [number, number]\n * },\n * node: Node|null,\n * allComments?: import('estree').Node[]\n * report: Report,\n * makeReport?: MakeReport,\n * settings: Settings,\n * utils: Utils,\n * }\n * ) => any } JsdocVisitor\n */\n\n/**\n * @param {{\n * comment?: string,\n * lastIndex?: Integer,\n * selector?: string,\n * isFunctionContext?: boolean,\n * }} info\n * @param {string} indent\n * @param {JsdocBlockWithInline} jsdoc\n * @param {RuleConfig} ruleConfig\n * @param {import('eslint').Rule.RuleContext} context\n * @param {import('@es-joy/jsdoccomment').Token} jsdocNode\n * @param {Node|null} node\n * @param {Settings} settings\n * @param {import('eslint').SourceCode} sourceCode\n * @param {JsdocVisitor} iterator\n * @param {StateObject} state\n * @param {boolean} [iteratingAll]\n * @returns {void}\n */\nconst iterate = (\n info,\n indent, jsdoc,\n ruleConfig, context, jsdocNode, node, settings,\n sourceCode, iterator, state, iteratingAll,\n) => {\n const jsdocNde = /** @type {unknown} */ (jsdocNode);\n const report = makeReport(\n context,\n /** @type {import('estree').Node} */\n (jsdocNde),\n );\n\n const utils = getUtils(\n node,\n jsdoc,\n /** @type {import('eslint').AST.Token} */\n (jsdocNode),\n settings,\n report,\n context,\n sourceCode,\n iteratingAll,\n ruleConfig,\n indent,\n );\n\n if (\n !ruleConfig.checkInternal && settings.ignoreInternal &&\n utils.hasTag('internal')\n ) {\n return;\n }\n\n if (\n !ruleConfig.checkPrivate && settings.ignorePrivate &&\n (\n utils.hasTag('private') ||\n jsdocUtils\n .filterTags(jsdoc, ({\n tag,\n }) => {\n return tag === 'access';\n })\n .some(({\n description,\n }) => {\n return description === 'private';\n })\n )\n ) {\n return;\n }\n\n iterator({\n context,\n globalState,\n indent,\n info,\n jsdoc,\n jsdocNode: /**\n * @type {import('eslint').Rule.Node & {\n * range: [number, number];}}\n */ (jsdocNde),\n node,\n report,\n settings,\n sourceCode,\n state,\n utils,\n });\n};\n\n/**\n * @param {string[]} lines\n * @param {import('estree').Comment} jsdocNode\n * @returns {[indent: string, jsdoc: JsdocBlockWithInline]}\n */\nconst getIndentAndJSDoc = function (lines, jsdocNode) {\n const sourceLine = lines[\n /** @type {import('estree').SourceLocation} */\n (jsdocNode.loc).start.line - 1\n ];\n\n let indentChar = sourceLine.charAt(0);\n if (indentChar !== ' ' && indentChar !== '\\t') {\n indentChar = ' ';\n }\n\n const indnt = indentChar.repeat(\n /** @type {import('estree').SourceLocation} */\n (jsdocNode.loc).start.column,\n );\n\n const jsdc = parseComment(jsdocNode, '');\n\n return [\n indnt, jsdc,\n ];\n};\n\n/**\n *\n * @typedef {{node: Node & {\n * range: [number, number]\n * }, state: StateObject}} NonCommentArgs\n */\n\n/**\n * @typedef {object} RuleConfig\n * @property {EslintRuleMeta} meta ESLint rule meta\n * @property {import('./jsdocUtils.js').DefaultContexts} [contextDefaults] Any default contexts\n * @property {true} [contextSelected] Whether to force a `contexts` check\n * @property {true} [iterateAllJsdocs] Whether to iterate all JSDoc blocks by default\n * regardless of context\n * @property {true} [checkPrivate] Whether to check `@private` blocks (normally exempted)\n * @property {true} [checkInternal] Whether to check `@internal` blocks (normally exempted)\n * @property {true} [checkFile] Whether to iterates over all JSDoc blocks regardless of attachment\n * @property {true} [nonGlobalSettings] Whether to avoid relying on settings for global contexts\n * @property {true} [noTracking] Whether to disable the tracking of visited comment nodes (as\n * non-tracked may conduct further actions)\n * @property {true} [matchContext] Whether the rule expects contexts to be based on a match option\n * @property {(args: {\n * context: import('eslint').Rule.RuleContext,\n * state: StateObject,\n * settings: Settings,\n * utils: BasicUtils\n * }) => void} [exit] Handler to be executed upon exiting iteration of program AST\n * @property {(nca: NonCommentArgs) => void} [nonComment] Handler to be executed if rule wishes\n * to be supplied nodes without comments\n */\n\n/**\n * Create an eslint rule that iterates over all JSDocs, regardless of whether\n * they are attached to a function-like node.\n * @param {JsdocVisitor} iterator\n * @param {RuleConfig} ruleConfig The rule's configuration\n * @param {ContextObject[]|null} [contexts] The `contexts` containing relevant `comment` info.\n * @param {boolean} [additiveCommentContexts] If true, will have a separate\n * iteration for each matching comment context. Otherwise, will iterate\n * once if there is a single matching comment context.\n * @returns {import('eslint').Rule.RuleModule}\n */\nconst iterateAllJsdocs = (iterator, ruleConfig, contexts, additiveCommentContexts) => {\n const trackedJsdocs = new Set();\n\n /** @type {import('@es-joy/jsdoccomment').CommentHandler} */\n let handler;\n\n /** @type {Settings|false} */\n let settings;\n\n /**\n * @param {import('eslint').Rule.RuleContext} context\n * @param {Node|null} node\n * @param {import('estree').Comment[]} jsdocNodes\n * @param {StateObject} state\n * @param {boolean} [lastCall]\n * @returns {void}\n */\n const callIterator = (context, node, jsdocNodes, state, lastCall) => {\n /* c8 ignore next -- Fallback to deprecated method */\n const {\n sourceCode = context.getSourceCode(),\n } = context;\n const {\n lines,\n } = sourceCode;\n\n const utils = getBasicUtils(context, /** @type {Settings} */ (settings));\n for (const jsdocNode of jsdocNodes) {\n const jsdocNde = /** @type {unknown} */ (jsdocNode);\n if (!(/^\\/\\*\\*\\s/v).test(sourceCode.getText(\n /** @type {import('estree').Node} */\n (jsdocNde),\n ))) {\n continue;\n }\n\n const [\n indent,\n jsdoc,\n ] = getIndentAndJSDoc(\n lines, jsdocNode,\n );\n\n if (additiveCommentContexts) {\n for (const [\n idx,\n {\n comment,\n },\n ] of /** @type {ContextObject[]} */ (contexts).entries()) {\n if (comment && handler(comment, jsdoc) === false) {\n continue;\n }\n\n iterate(\n {\n comment,\n lastIndex: idx,\n selector: node?.type,\n },\n indent,\n jsdoc,\n ruleConfig,\n context,\n jsdocNode,\n /** @type {Node} */\n (node),\n /** @type {Settings} */\n (settings),\n sourceCode,\n iterator,\n state,\n true,\n );\n }\n\n continue;\n }\n\n let lastComment;\n let lastIndex;\n // eslint-disable-next-line no-loop-func\n if (contexts && contexts.every(({\n comment,\n }, idx) => {\n lastComment = comment;\n lastIndex = idx;\n\n return comment && handler(comment, jsdoc) === false;\n })) {\n continue;\n }\n\n iterate(\n lastComment ? {\n comment: lastComment,\n lastIndex,\n selector: node?.type,\n } : {\n lastIndex,\n selector: node?.type,\n },\n indent,\n jsdoc,\n ruleConfig,\n context,\n jsdocNode,\n node,\n /** @type {Settings} */\n (settings),\n sourceCode,\n iterator,\n state,\n true,\n );\n }\n\n const settngs = /** @type {Settings} */ (settings);\n\n if (lastCall && ruleConfig.exit) {\n ruleConfig.exit({\n context,\n settings: settngs,\n state,\n utils,\n });\n }\n };\n\n return {\n create (context) {\n /* c8 ignore next -- Fallback to deprecated method */\n const {\n sourceCode = context.getSourceCode(),\n } = context;\n settings = getSettings(context);\n if (!settings) {\n return {};\n }\n\n if (contexts) {\n handler = commentHandler(settings);\n }\n\n const state = {};\n\n return {\n /**\n * @param {import('eslint').Rule.Node & {\n * range: [Integer, Integer];\n * }} node\n * @returns {void}\n */\n '*:not(Program)' (node) {\n const commentNode = getJSDocComment(\n sourceCode, node, /** @type {Settings} */ (settings),\n );\n if (!ruleConfig.noTracking && trackedJsdocs.has(commentNode)) {\n return;\n }\n\n if (!commentNode) {\n if (ruleConfig.nonComment) {\n const ste = /** @type {StateObject} */ (state);\n ruleConfig.nonComment({\n node,\n state: ste,\n });\n }\n\n return;\n }\n\n trackedJsdocs.add(commentNode);\n callIterator(context, node, [\n /** @type {import('estree').Comment} */\n (commentNode),\n ], /** @type {StateObject} */ (state));\n },\n 'Program:exit' () {\n const allComments = sourceCode.getAllComments();\n const untrackedJSdoc = allComments.filter((node) => {\n return !trackedJsdocs.has(node);\n });\n\n callIterator(\n context,\n null,\n untrackedJSdoc,\n /** @type {StateObject} */\n (state),\n true,\n );\n },\n };\n },\n meta: ruleConfig.meta,\n };\n};\n\n/**\n * Create an eslint rule that iterates over all JSDocs, regardless of whether\n * they are attached to a function-like node.\n * @param {JsdocVisitorBasic} iterator\n * @param {RuleConfig} ruleConfig\n * @returns {import('eslint').Rule.RuleModule}\n */\nconst checkFile = (iterator, ruleConfig) => {\n return {\n create (context) {\n /* c8 ignore next -- Fallback to deprecated method */\n const {\n sourceCode = context.getSourceCode(),\n } = context;\n const settings = getSettings(context);\n if (!settings) {\n return {};\n }\n\n return {\n 'Program:exit' () {\n const allComms = /** @type {unknown} */ (sourceCode.getAllComments());\n const utils = getBasicUtils(context, settings);\n\n iterator({\n allComments: /** @type {import('estree').Node[]} */ (allComms),\n context,\n makeReport,\n settings,\n sourceCode,\n utils,\n });\n },\n };\n },\n meta: ruleConfig.meta,\n };\n};\n\nexport {\n getSettings,\n // dslint-disable-next-line unicorn/prefer-export-from -- Avoid experimental parser\n\n};\n\n/**\n * @param {JsdocVisitor} iterator\n * @param {RuleConfig} ruleConfig\n * @returns {import('eslint').Rule.RuleModule}\n */\nexport default function iterateJsdoc (iterator, ruleConfig) {\n const metaType = ruleConfig?.meta?.type;\n if (!metaType || ![\n 'layout', 'problem', 'suggestion',\n ].includes(metaType)) {\n throw new TypeError('Rule must include `meta.type` option (with value \"problem\", \"suggestion\", or \"layout\")');\n }\n\n if (typeof iterator !== 'function') {\n throw new TypeError('The iterator argument must be a function.');\n }\n\n if (ruleConfig.checkFile) {\n return checkFile(\n /** @type {JsdocVisitorBasic} */ (iterator),\n ruleConfig,\n );\n }\n\n if (ruleConfig.iterateAllJsdocs) {\n return iterateAllJsdocs(iterator, ruleConfig);\n }\n\n /** @type {import('eslint').Rule.RuleModule} */\n return {\n /**\n * The entrypoint for the JSDoc rule.\n * @param {import('eslint').Rule.RuleContext} context\n * a reference to the context which hold all important information\n * like settings and the sourcecode to check.\n * @returns {import('eslint').Rule.RuleListener}\n * a listener with parser callback function.\n */\n create (context) {\n const settings = getSettings(context);\n if (!settings) {\n return {};\n }\n\n /**\n * @type {Context[]|undefined}\n */\n let contexts;\n if (ruleConfig.contextDefaults || ruleConfig.contextSelected || ruleConfig.matchContext) {\n contexts = ruleConfig.matchContext && context.options[0]?.match ?\n context.options[0].match :\n jsdocUtils.enforcedContexts(context, ruleConfig.contextDefaults, ruleConfig.nonGlobalSettings ? {} : settings);\n\n if (contexts) {\n contexts = contexts.map((obj) => {\n if (typeof obj === 'object' && !obj.context) {\n return {\n ...obj,\n context: 'any',\n };\n }\n\n return obj;\n });\n }\n\n const hasPlainAny = contexts?.includes('any');\n const hasObjectAny = !hasPlainAny && contexts?.find((ctxt) => {\n if (typeof ctxt === 'string') {\n return false;\n }\n\n return ctxt?.context === 'any';\n });\n if (hasPlainAny || hasObjectAny) {\n return iterateAllJsdocs(\n iterator,\n ruleConfig,\n hasObjectAny ? /** @type {ContextObject[]} */ (contexts) : null,\n ruleConfig.matchContext,\n ).create(context);\n }\n }\n\n /* c8 ignore next -- Fallback to deprecated method */\n const {\n sourceCode = context.getSourceCode(),\n } = context;\n const {\n lines,\n } = sourceCode;\n\n /** @type {Partial<StateObject>} */\n const state = {};\n\n /** @type {CheckJsdoc} */\n const checkJsdoc = (info, handler, node) => {\n const jsdocNode = getJSDocComment(sourceCode, node, settings);\n if (!jsdocNode) {\n return;\n }\n\n const [\n indent,\n jsdoc,\n ] = getIndentAndJSDoc(\n lines,\n /** @type {import('estree').Comment} */\n (jsdocNode),\n );\n\n if (\n // Note, `handler` should already be bound in its first argument\n // with these only to be called after the value of\n // `comment`\n handler && handler(jsdoc) === false\n ) {\n return;\n }\n\n iterate(\n info,\n indent,\n jsdoc,\n ruleConfig,\n context,\n jsdocNode,\n node,\n settings,\n sourceCode,\n iterator,\n /** @type {StateObject} */\n (state),\n );\n };\n\n /** @type {import('eslint').Rule.RuleListener} */\n let contextObject = {};\n\n if (contexts && (\n ruleConfig.contextDefaults || ruleConfig.contextSelected || ruleConfig.matchContext\n )) {\n contextObject = jsdocUtils.getContextObject(\n contexts,\n checkJsdoc,\n commentHandler(settings),\n );\n } else {\n for (const prop of [\n 'ArrowFunctionExpression',\n 'FunctionDeclaration',\n 'FunctionExpression',\n 'TSDeclareFunction',\n ]) {\n contextObject[prop] = checkJsdoc.bind(null, {\n selector: prop,\n }, null);\n }\n }\n\n if (typeof ruleConfig.exit === 'function') {\n contextObject['Program:exit'] = () => {\n const ste = /** @type {StateObject} */ (state);\n\n // @ts-expect-error `utils` not needed at this point\n /** @type {Required<RuleConfig>} */ (ruleConfig).exit({\n context,\n settings,\n state: ste,\n });\n };\n }\n\n return contextObject;\n },\n meta: ruleConfig.meta,\n };\n}\n\nexport {\n parseComment,\n} from '@es-joy/jsdoccomment';\n"],"mappings":"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"}
|