eslint-plugin-jsdoc 53.0.1 → 54.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 +35 -18
- package/dist/WarnSettings.cjs.map +1 -1
- package/dist/alignTransform.cjs +305 -224
- package/dist/alignTransform.cjs.map +1 -1
- package/dist/defaultTagOrder.cjs +43 -132
- package/dist/defaultTagOrder.cjs.map +1 -1
- package/dist/exportParser.cjs +696 -478
- package/dist/exportParser.cjs.map +1 -1
- package/dist/generateRule.cjs +242 -0
- package/dist/generateRule.cjs.map +1 -0
- package/dist/getDefaultTagStructureForMode.cjs +288 -184
- package/dist/getDefaultTagStructureForMode.cjs.map +1 -1
- package/dist/getJsdocProcessorPlugin.cjs +550 -364
- package/dist/getJsdocProcessorPlugin.cjs.map +1 -1
- package/dist/getJsdocProcessorPlugin.d.ts +65 -68
- package/dist/getJsdocProcessorPlugin.d.ts.map +1 -1
- package/dist/index.cjs +410 -2
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +17 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/iterateJsdoc.cjs +2005 -1539
- package/dist/iterateJsdoc.cjs.map +1 -1
- package/dist/iterateJsdoc.d.ts +350 -359
- package/dist/iterateJsdoc.d.ts.map +1 -1
- package/dist/jsdocUtils.cjs +1376 -1009
- package/dist/jsdocUtils.cjs.map +1 -1
- package/dist/rules/checkAccess.cjs +36 -29
- package/dist/rules/checkAccess.cjs.map +1 -1
- package/dist/rules/checkAlignment.cjs +54 -41
- package/dist/rules/checkAlignment.cjs.map +1 -1
- package/dist/rules/checkExamples.cjs +484 -327
- package/dist/rules/checkExamples.cjs.map +1 -1
- package/dist/rules/checkIndentation.cjs +65 -50
- package/dist/rules/checkIndentation.cjs.map +1 -1
- package/dist/rules/checkLineAlignment.cjs +311 -220
- package/dist/rules/checkLineAlignment.cjs.map +1 -1
- package/dist/rules/checkParamNames.cjs +335 -227
- package/dist/rules/checkParamNames.cjs.map +1 -1
- package/dist/rules/checkPropertyNames.cjs +106 -78
- package/dist/rules/checkPropertyNames.cjs.map +1 -1
- package/dist/rules/checkSyntax.cjs +34 -21
- package/dist/rules/checkSyntax.cjs.map +1 -1
- package/dist/rules/checkTagNames.cjs +210 -188
- package/dist/rules/checkTagNames.cjs.map +1 -1
- package/dist/rules/checkTemplateNames.cjs +178 -121
- package/dist/rules/checkTemplateNames.cjs.map +1 -1
- package/dist/rules/checkTypes.cjs +385 -291
- package/dist/rules/checkTypes.cjs.map +1 -1
- package/dist/rules/checkValues.cjs +146 -100
- package/dist/rules/checkValues.cjs.map +1 -1
- package/dist/rules/convertToJsdocComments.cjs +306 -228
- package/dist/rules/convertToJsdocComments.cjs.map +1 -1
- package/dist/rules/emptyTags.cjs +72 -62
- package/dist/rules/emptyTags.cjs.map +1 -1
- package/dist/rules/implementsOnClasses.cjs +56 -36
- package/dist/rules/implementsOnClasses.cjs.map +1 -1
- package/dist/rules/importsAsDependencies.cjs +99 -62
- package/dist/rules/importsAsDependencies.cjs.map +1 -1
- package/dist/rules/informativeDocs.cjs +142 -105
- package/dist/rules/informativeDocs.cjs.map +1 -1
- package/dist/rules/linesBeforeBlock.cjs +105 -70
- package/dist/rules/linesBeforeBlock.cjs.map +1 -1
- package/dist/rules/matchDescription.cjs +222 -160
- package/dist/rules/matchDescription.cjs.map +1 -1
- package/dist/rules/matchName.cjs +128 -73
- package/dist/rules/matchName.cjs.map +1 -1
- package/dist/rules/multilineBlocks.cjs +352 -235
- package/dist/rules/multilineBlocks.cjs.map +1 -1
- package/dist/rules/noBadBlocks.cjs +86 -63
- package/dist/rules/noBadBlocks.cjs.map +1 -1
- package/dist/rules/noBlankBlockDescriptions.cjs +57 -35
- package/dist/rules/noBlankBlockDescriptions.cjs.map +1 -1
- package/dist/rules/noBlankBlocks.cjs +48 -26
- package/dist/rules/noBlankBlocks.cjs.map +1 -1
- package/dist/rules/noDefaults.cjs +79 -52
- package/dist/rules/noDefaults.cjs.map +1 -1
- package/dist/rules/noMissingSyntax.cjs +165 -115
- package/dist/rules/noMissingSyntax.cjs.map +1 -1
- package/dist/rules/noMultiAsterisks.cjs +89 -48
- package/dist/rules/noMultiAsterisks.cjs.map +1 -1
- package/dist/rules/noRestrictedSyntax.cjs +79 -45
- package/dist/rules/noRestrictedSyntax.cjs.map +1 -1
- package/dist/rules/noTypes.cjs +80 -59
- package/dist/rules/noTypes.cjs.map +1 -1
- package/dist/rules/noUndefinedTypes.cjs +388 -297
- package/dist/rules/noUndefinedTypes.cjs.map +1 -1
- package/dist/rules/requireAsteriskPrefix.cjs +159 -108
- package/dist/rules/requireAsteriskPrefix.cjs.map +1 -1
- package/dist/rules/requireDescription.cjs +129 -89
- package/dist/rules/requireDescription.cjs.map +1 -1
- package/dist/rules/requireDescriptionCompleteSentence.cjs +262 -201
- package/dist/rules/requireDescriptionCompleteSentence.cjs.map +1 -1
- package/dist/rules/requireExample.cjs +104 -73
- package/dist/rules/requireExample.cjs.map +1 -1
- package/dist/rules/requireFileOverview.cjs +129 -75
- package/dist/rules/requireFileOverview.cjs.map +1 -1
- package/dist/rules/requireHyphenBeforeParamDescription.cjs +133 -85
- package/dist/rules/requireHyphenBeforeParamDescription.cjs.map +1 -1
- package/dist/rules/requireJsdoc.cjs +557 -384
- package/dist/rules/requireJsdoc.cjs.map +1 -1
- package/dist/rules/requireParam.cjs +526 -336
- package/dist/rules/requireParam.cjs.map +1 -1
- package/dist/rules/requireParamDescription.cjs +80 -55
- package/dist/rules/requireParamDescription.cjs.map +1 -1
- package/dist/rules/requireParamName.cjs +50 -32
- package/dist/rules/requireParamName.cjs.map +1 -1
- package/dist/rules/requireParamType.cjs +80 -55
- package/dist/rules/requireParamType.cjs.map +1 -1
- package/dist/rules/requireProperty.cjs +42 -31
- package/dist/rules/requireProperty.cjs.map +1 -1
- package/dist/rules/requirePropertyDescription.cjs +25 -17
- package/dist/rules/requirePropertyDescription.cjs.map +1 -1
- package/dist/rules/requirePropertyName.cjs +25 -17
- package/dist/rules/requirePropertyName.cjs.map +1 -1
- package/dist/rules/requirePropertyType.cjs +25 -17
- package/dist/rules/requirePropertyType.cjs.map +1 -1
- package/dist/rules/requireReturns.cjs +203 -125
- package/dist/rules/requireReturns.cjs.map +1 -1
- package/dist/rules/requireReturnsCheck.cjs +103 -60
- package/dist/rules/requireReturnsCheck.cjs.map +1 -1
- package/dist/rules/requireReturnsDescription.cjs +54 -39
- package/dist/rules/requireReturnsDescription.cjs.map +1 -1
- package/dist/rules/requireReturnsType.cjs +50 -32
- package/dist/rules/requireReturnsType.cjs.map +1 -1
- package/dist/rules/requireTemplate.cjs +178 -119
- package/dist/rules/requireTemplate.cjs.map +1 -1
- package/dist/rules/requireThrows.cjs +95 -61
- package/dist/rules/requireThrows.cjs.map +1 -1
- package/dist/rules/requireYields.cjs +166 -106
- package/dist/rules/requireYields.cjs.map +1 -1
- package/dist/rules/requireYieldsCheck.cjs +152 -96
- package/dist/rules/requireYieldsCheck.cjs.map +1 -1
- package/dist/rules/sortTags.cjs +444 -258
- package/dist/rules/sortTags.cjs.map +1 -1
- package/dist/rules/tagLines.cjs +266 -179
- package/dist/rules/tagLines.cjs.map +1 -1
- package/dist/rules/textEscaping.cjs +127 -92
- package/dist/rules/textEscaping.cjs.map +1 -1
- package/dist/rules/validTypes.cjs +265 -252
- package/dist/rules/validTypes.cjs.map +1 -1
- package/dist/tagNames.cjs +170 -134
- package/dist/tagNames.cjs.map +1 -1
- package/dist/utils/hasReturnValue.cjs +474 -246
- package/dist/utils/hasReturnValue.cjs.map +1 -1
- package/package.json +24 -40
- package/src/WarnSettings.js +34 -0
- package/src/alignTransform.js +358 -0
- package/src/defaultTagOrder.js +169 -0
- package/src/exportParser.js +978 -0
- package/src/getDefaultTagStructureForMode.js +969 -0
- package/src/getJsdocProcessorPlugin.js +672 -0
- package/src/index.js +530 -0
- package/src/iterateJsdoc.js +2541 -0
- package/src/jsdocUtils.js +1896 -0
- package/src/rules/checkAccess.js +45 -0
- package/src/rules/checkAlignment.js +63 -0
- package/src/rules/checkExamples.js +589 -0
- package/src/rules/checkIndentation.js +75 -0
- package/src/rules/checkLineAlignment.js +372 -0
- package/src/rules/checkParamNames.js +474 -0
- package/src/rules/checkPropertyNames.js +152 -0
- package/src/rules/checkSyntax.js +30 -0
- package/src/rules/checkTagNames.js +314 -0
- package/src/rules/checkTemplateNames.js +204 -0
- package/src/rules/checkTypes.js +535 -0
- package/src/rules/checkValues.js +248 -0
- package/src/rules/convertToJsdocComments.js +398 -0
- package/src/rules/emptyTags.js +98 -0
- package/src/rules/implementsOnClasses.js +64 -0
- package/src/rules/importsAsDependencies.js +133 -0
- package/src/rules/informativeDocs.js +189 -0
- package/src/rules/linesBeforeBlock.js +134 -0
- package/src/rules/matchDescription.js +286 -0
- package/src/rules/matchName.js +151 -0
- package/src/rules/multilineBlocks.js +493 -0
- package/src/rules/noBadBlocks.js +119 -0
- package/src/rules/noBlankBlockDescriptions.js +69 -0
- package/src/rules/noBlankBlocks.js +53 -0
- package/src/rules/noDefaults.js +85 -0
- package/src/rules/noMissingSyntax.js +195 -0
- package/src/rules/noMultiAsterisks.js +134 -0
- package/src/rules/noRestrictedSyntax.js +91 -0
- package/src/rules/noTypes.js +93 -0
- package/src/rules/noUndefinedTypes.js +543 -0
- package/src/rules/requireAsteriskPrefix.js +190 -0
- package/src/rules/requireDescription.js +161 -0
- package/src/rules/requireDescriptionCompleteSentence.js +335 -0
- package/src/rules/requireExample.js +118 -0
- package/src/rules/requireFileOverview.js +154 -0
- package/src/rules/requireHyphenBeforeParamDescription.js +176 -0
- package/src/rules/requireJsdoc.js +743 -0
- package/src/rules/requireParam.js +602 -0
- package/src/rules/requireParamDescription.js +89 -0
- package/src/rules/requireParamName.js +55 -0
- package/src/rules/requireParamType.js +89 -0
- package/src/rules/requireProperty.js +48 -0
- package/src/rules/requirePropertyDescription.js +25 -0
- package/src/rules/requirePropertyName.js +25 -0
- package/src/rules/requirePropertyType.js +25 -0
- package/src/rules/requireReturns.js +238 -0
- package/src/rules/requireReturnsCheck.js +145 -0
- package/src/rules/requireReturnsDescription.js +59 -0
- package/src/rules/requireReturnsType.js +51 -0
- package/src/rules/requireTemplate.js +201 -0
- package/src/rules/requireThrows.js +111 -0
- package/src/rules/requireYields.js +216 -0
- package/src/rules/requireYieldsCheck.js +208 -0
- package/src/rules/sortTags.js +558 -0
- package/src/rules/tagLines.js +359 -0
- package/src/rules/textEscaping.js +154 -0
- package/src/rules/validTypes.js +401 -0
- package/src/tagNames.js +238 -0
- package/src/utils/hasReturnValue.js +572 -0
- package/dist/WarnSettings.js +0 -20
- package/dist/WarnSettings.js.map +0 -1
- package/dist/_virtual/rolldown_runtime.cjs +0 -32
- package/dist/_virtual/rolldown_runtime.js +0 -11
- package/dist/alignTransform.js +0 -241
- package/dist/alignTransform.js.map +0 -1
- package/dist/defaultTagOrder.js +0 -134
- package/dist/defaultTagOrder.js.map +0 -1
- package/dist/exportParser.js +0 -518
- package/dist/exportParser.js.map +0 -1
- package/dist/getDefaultTagStructureForMode.js +0 -188
- package/dist/getDefaultTagStructureForMode.js.map +0 -1
- package/dist/getJsdocProcessorPlugin.d.cts +0 -70
- package/dist/getJsdocProcessorPlugin.d.cts.map +0 -1
- package/dist/getJsdocProcessorPlugin.js +0 -383
- package/dist/getJsdocProcessorPlugin.js.map +0 -1
- package/dist/index.d.cts +0 -2
- package/dist/index.js +0 -3
- package/dist/iterateJsdoc.d.cts +0 -472
- package/dist/iterateJsdoc.d.cts.map +0 -1
- package/dist/iterateJsdoc.js +0 -1628
- package/dist/iterateJsdoc.js.map +0 -1
- package/dist/jsdocUtils.js +0 -1123
- package/dist/jsdocUtils.js.map +0 -1
- package/dist/plugin.cjs +0 -427
- package/dist/plugin.cjs.map +0 -1
- package/dist/plugin.js +0 -427
- package/dist/plugin.js.map +0 -1
- package/dist/rules/checkAccess.js +0 -33
- package/dist/rules/checkAccess.js.map +0 -1
- package/dist/rules/checkAlignment.js +0 -47
- package/dist/rules/checkAlignment.js.map +0 -1
- package/dist/rules/checkExamples.js +0 -348
- package/dist/rules/checkExamples.js.map +0 -1
- package/dist/rules/checkIndentation.js +0 -59
- package/dist/rules/checkIndentation.js.map +0 -1
- package/dist/rules/checkLineAlignment.js +0 -229
- package/dist/rules/checkLineAlignment.js.map +0 -1
- package/dist/rules/checkParamNames.js +0 -237
- package/dist/rules/checkParamNames.js.map +0 -1
- package/dist/rules/checkPropertyNames.js +0 -88
- package/dist/rules/checkPropertyNames.js.map +0 -1
- package/dist/rules/checkSyntax.js +0 -25
- package/dist/rules/checkSyntax.js.map +0 -1
- package/dist/rules/checkTagNames.js +0 -191
- package/dist/rules/checkTagNames.js.map +0 -1
- package/dist/rules/checkTemplateNames.js +0 -124
- package/dist/rules/checkTemplateNames.js.map +0 -1
- package/dist/rules/checkTypes.js +0 -299
- package/dist/rules/checkTypes.js.map +0 -1
- package/dist/rules/checkValues.js +0 -103
- package/dist/rules/checkValues.js.map +0 -1
- package/dist/rules/convertToJsdocComments.js +0 -231
- package/dist/rules/convertToJsdocComments.js.map +0 -1
- package/dist/rules/emptyTags.js +0 -67
- package/dist/rules/emptyTags.js.map +0 -1
- package/dist/rules/implementsOnClasses.js +0 -40
- package/dist/rules/implementsOnClasses.js.map +0 -1
- package/dist/rules/importsAsDependencies.js +0 -68
- package/dist/rules/importsAsDependencies.js.map +0 -1
- package/dist/rules/informativeDocs.js +0 -110
- package/dist/rules/informativeDocs.js.map +0 -1
- package/dist/rules/linesBeforeBlock.js +0 -75
- package/dist/rules/linesBeforeBlock.js.map +0 -1
- package/dist/rules/matchDescription.js +0 -167
- package/dist/rules/matchDescription.js.map +0 -1
- package/dist/rules/matchName.js +0 -77
- package/dist/rules/matchName.js.map +0 -1
- package/dist/rules/multilineBlocks.js +0 -245
- package/dist/rules/multilineBlocks.js.map +0 -1
- package/dist/rules/noBadBlocks.js +0 -68
- package/dist/rules/noBadBlocks.js.map +0 -1
- package/dist/rules/noBlankBlockDescriptions.js +0 -41
- package/dist/rules/noBlankBlockDescriptions.js.map +0 -1
- package/dist/rules/noBlankBlocks.js +0 -30
- package/dist/rules/noBlankBlocks.js.map +0 -1
- package/dist/rules/noDefaults.js +0 -56
- package/dist/rules/noDefaults.js.map +0 -1
- package/dist/rules/noMissingSyntax.js +0 -126
- package/dist/rules/noMissingSyntax.js.map +0 -1
- package/dist/rules/noMultiAsterisks.js +0 -58
- package/dist/rules/noMultiAsterisks.js.map +0 -1
- package/dist/rules/noRestrictedSyntax.js +0 -49
- package/dist/rules/noRestrictedSyntax.js.map +0 -1
- package/dist/rules/noTypes.js +0 -65
- package/dist/rules/noTypes.js.map +0 -1
- package/dist/rules/noUndefinedTypes.js +0 -303
- package/dist/rules/noUndefinedTypes.js.map +0 -1
- package/dist/rules/requireAsteriskPrefix.js +0 -112
- package/dist/rules/requireAsteriskPrefix.js.map +0 -1
- package/dist/rules/requireDescription.js +0 -95
- package/dist/rules/requireDescription.js.map +0 -1
- package/dist/rules/requireDescriptionCompleteSentence.js +0 -220
- package/dist/rules/requireDescriptionCompleteSentence.js.map +0 -1
- package/dist/rules/requireExample.js +0 -77
- package/dist/rules/requireExample.js.map +0 -1
- package/dist/rules/requireFileOverview.js +0 -81
- package/dist/rules/requireFileOverview.js.map +0 -1
- package/dist/rules/requireHyphenBeforeParamDescription.js +0 -89
- package/dist/rules/requireHyphenBeforeParamDescription.js.map +0 -1
- package/dist/rules/requireJsdoc.js +0 -404
- package/dist/rules/requireJsdoc.js.map +0 -1
- package/dist/rules/requireParam.js +0 -344
- package/dist/rules/requireParam.js.map +0 -1
- package/dist/rules/requireParamDescription.js +0 -59
- package/dist/rules/requireParamDescription.js.map +0 -1
- package/dist/rules/requireParamName.js +0 -36
- package/dist/rules/requireParamName.js.map +0 -1
- package/dist/rules/requireParamType.js +0 -59
- package/dist/rules/requireParamType.js.map +0 -1
- package/dist/rules/requireProperty.js +0 -35
- package/dist/rules/requireProperty.js.map +0 -1
- package/dist/rules/requirePropertyDescription.js +0 -21
- package/dist/rules/requirePropertyDescription.js.map +0 -1
- package/dist/rules/requirePropertyName.js +0 -21
- package/dist/rules/requirePropertyName.js.map +0 -1
- package/dist/rules/requirePropertyType.js +0 -21
- package/dist/rules/requirePropertyType.js.map +0 -1
- package/dist/rules/requireReturns.js +0 -131
- package/dist/rules/requireReturns.js.map +0 -1
- package/dist/rules/requireReturnsCheck.js +0 -66
- package/dist/rules/requireReturnsCheck.js.map +0 -1
- package/dist/rules/requireReturnsDescription.js +0 -43
- package/dist/rules/requireReturnsDescription.js.map +0 -1
- package/dist/rules/requireReturnsType.js +0 -36
- package/dist/rules/requireReturnsType.js.map +0 -1
- package/dist/rules/requireTemplate.js +0 -122
- package/dist/rules/requireTemplate.js.map +0 -1
- package/dist/rules/requireThrows.js +0 -67
- package/dist/rules/requireThrows.js.map +0 -1
- package/dist/rules/requireYields.js +0 -115
- package/dist/rules/requireYields.js.map +0 -1
- package/dist/rules/requireYieldsCheck.js +0 -105
- package/dist/rules/requireYieldsCheck.js.map +0 -1
- package/dist/rules/sortTags.js +0 -262
- package/dist/rules/sortTags.js.map +0 -1
- package/dist/rules/tagLines.js +0 -183
- package/dist/rules/tagLines.js.map +0 -1
- package/dist/rules/textEscaping.js +0 -102
- package/dist/rules/textEscaping.js.map +0 -1
- package/dist/rules/validTypes.js +0 -259
- package/dist/rules/validTypes.js.map +0 -1
- package/dist/tagNames.js +0 -144
- package/dist/tagNames.js.map +0 -1
- package/dist/utils/hasReturnValue.js +0 -265
- package/dist/utils/hasReturnValue.js.map +0 -1
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import iterateJsdoc from "../iterateJsdoc.js";
|
|
2
|
-
import alignTransform_default from "../alignTransform.js";
|
|
3
|
-
import { transforms } from "comment-parser";
|
|
4
|
-
|
|
5
|
-
//#region src/rules/checkLineAlignment.js
|
|
6
|
-
const { flow: commentFlow } = transforms;
|
|
7
|
-
/**
|
|
8
|
-
* @typedef {{
|
|
9
|
-
* postDelimiter: import('../iterateJsdoc.js').Integer,
|
|
10
|
-
* postHyphen: import('../iterateJsdoc.js').Integer,
|
|
11
|
-
* postName: import('../iterateJsdoc.js').Integer,
|
|
12
|
-
* postTag: import('../iterateJsdoc.js').Integer,
|
|
13
|
-
* postType: import('../iterateJsdoc.js').Integer,
|
|
14
|
-
* }} CustomSpacings
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* @param {import('../iterateJsdoc.js').Utils} utils
|
|
18
|
-
* @param {import('comment-parser').Spec & {
|
|
19
|
-
* line: import('../iterateJsdoc.js').Integer
|
|
20
|
-
* }} tag
|
|
21
|
-
* @param {CustomSpacings} customSpacings
|
|
22
|
-
*/
|
|
23
|
-
const checkNotAlignedPerTag = (utils, tag, customSpacings) => {
|
|
24
|
-
/**
|
|
25
|
-
* @typedef {"tag"|"type"|"name"|"description"} ContentProp
|
|
26
|
-
*/
|
|
27
|
-
/** @type {("postDelimiter"|"postTag"|"postType"|"postName")[]} */
|
|
28
|
-
let spacerProps;
|
|
29
|
-
/** @type {ContentProp[]} */
|
|
30
|
-
let contentProps;
|
|
31
|
-
const mightHaveNamepath = utils.tagMightHaveNamepath(tag.tag);
|
|
32
|
-
if (mightHaveNamepath) {
|
|
33
|
-
spacerProps = [
|
|
34
|
-
"postDelimiter",
|
|
35
|
-
"postTag",
|
|
36
|
-
"postType",
|
|
37
|
-
"postName"
|
|
38
|
-
];
|
|
39
|
-
contentProps = [
|
|
40
|
-
"tag",
|
|
41
|
-
"type",
|
|
42
|
-
"name",
|
|
43
|
-
"description"
|
|
44
|
-
];
|
|
45
|
-
} else {
|
|
46
|
-
spacerProps = [
|
|
47
|
-
"postDelimiter",
|
|
48
|
-
"postTag",
|
|
49
|
-
"postType"
|
|
50
|
-
];
|
|
51
|
-
contentProps = [
|
|
52
|
-
"tag",
|
|
53
|
-
"type",
|
|
54
|
-
"description"
|
|
55
|
-
];
|
|
56
|
-
}
|
|
57
|
-
const { tokens } = tag.source[0];
|
|
58
|
-
/**
|
|
59
|
-
* @param {import('../iterateJsdoc.js').Integer} idx
|
|
60
|
-
* @param {(notRet: boolean, contentProp: ContentProp) => void} [callbck]
|
|
61
|
-
*/
|
|
62
|
-
const followedBySpace = (idx, callbck) => {
|
|
63
|
-
const nextIndex = idx + 1;
|
|
64
|
-
return spacerProps.slice(nextIndex).some((spacerProp, innerIdx) => {
|
|
65
|
-
const contentProp = contentProps[nextIndex + innerIdx];
|
|
66
|
-
const spacePropVal = tokens[spacerProp];
|
|
67
|
-
const ret = spacePropVal;
|
|
68
|
-
if (callbck) callbck(!ret, contentProp);
|
|
69
|
-
return ret && (callbck || !contentProp);
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
const postHyphenSpacing = customSpacings?.postHyphen ?? 1;
|
|
73
|
-
const exactHyphenSpacing = new RegExp(`^\\s*-\\s{${postHyphenSpacing},${postHyphenSpacing}}(?!\\s)`, "v");
|
|
74
|
-
const hasNoHyphen = !/^\s*-(?!$)(?=\s)/v.test(tokens.description);
|
|
75
|
-
const hasExactHyphenSpacing = exactHyphenSpacing.test(tokens.description);
|
|
76
|
-
const ok = !spacerProps.some((spacerProp, idx) => {
|
|
77
|
-
const contentProp = contentProps[idx];
|
|
78
|
-
const contentPropVal = tokens[contentProp];
|
|
79
|
-
const spacerPropVal = tokens[spacerProp];
|
|
80
|
-
const spacing = customSpacings?.[spacerProp] || 1;
|
|
81
|
-
return spacerPropVal.length !== spacing && spacerPropVal.length !== 0 || spacerPropVal && !contentPropVal && followedBySpace(idx);
|
|
82
|
-
}) && (hasNoHyphen || hasExactHyphenSpacing);
|
|
83
|
-
if (ok) return;
|
|
84
|
-
const fix = () => {
|
|
85
|
-
for (const [idx, spacerProp] of spacerProps.entries()) {
|
|
86
|
-
const contentProp = contentProps[idx];
|
|
87
|
-
const contentPropVal = tokens[contentProp];
|
|
88
|
-
if (contentPropVal) {
|
|
89
|
-
const spacing = customSpacings?.[spacerProp] || 1;
|
|
90
|
-
tokens[spacerProp] = "".padStart(spacing, " ");
|
|
91
|
-
followedBySpace(idx, (hasSpace, contentPrp) => {
|
|
92
|
-
if (hasSpace) tokens[contentPrp] = "";
|
|
93
|
-
});
|
|
94
|
-
} else tokens[spacerProp] = "";
|
|
95
|
-
}
|
|
96
|
-
if (!hasExactHyphenSpacing) {
|
|
97
|
-
const hyphenSpacing = /^\s*-\s+/v;
|
|
98
|
-
tokens.description = tokens.description.replace(hyphenSpacing, "-" + "".padStart(postHyphenSpacing, " "));
|
|
99
|
-
}
|
|
100
|
-
utils.setTag(tag, tokens);
|
|
101
|
-
};
|
|
102
|
-
utils.reportJSDoc("Expected JSDoc block lines to not be aligned.", tag, fix, true);
|
|
103
|
-
};
|
|
104
|
-
/**
|
|
105
|
-
* @param {object} cfg
|
|
106
|
-
* @param {CustomSpacings} cfg.customSpacings
|
|
107
|
-
* @param {string} cfg.indent
|
|
108
|
-
* @param {import('comment-parser').Block} cfg.jsdoc
|
|
109
|
-
* @param {import('eslint').Rule.Node & {
|
|
110
|
-
* range: [number, number]
|
|
111
|
-
* }} cfg.jsdocNode
|
|
112
|
-
* @param {boolean} cfg.preserveMainDescriptionPostDelimiter
|
|
113
|
-
* @param {import('../iterateJsdoc.js').Report} cfg.report
|
|
114
|
-
* @param {string[]} cfg.tags
|
|
115
|
-
* @param {import('../iterateJsdoc.js').Utils} cfg.utils
|
|
116
|
-
* @param {string} cfg.wrapIndent
|
|
117
|
-
* @param {boolean} cfg.disableWrapIndent
|
|
118
|
-
* @returns {void}
|
|
119
|
-
*/
|
|
120
|
-
const checkAlignment = ({ customSpacings, disableWrapIndent, indent, jsdoc, jsdocNode, preserveMainDescriptionPostDelimiter, report, tags, utils, wrapIndent }) => {
|
|
121
|
-
const transform = commentFlow(alignTransform_default({
|
|
122
|
-
customSpacings,
|
|
123
|
-
disableWrapIndent,
|
|
124
|
-
indent,
|
|
125
|
-
preserveMainDescriptionPostDelimiter,
|
|
126
|
-
tags,
|
|
127
|
-
wrapIndent
|
|
128
|
-
}));
|
|
129
|
-
const transformedJsdoc = transform(jsdoc);
|
|
130
|
-
const comment = "/*" + jsdocNode.value + "*/";
|
|
131
|
-
const formatted = utils.stringify(transformedJsdoc).trimStart();
|
|
132
|
-
if (comment !== formatted) report(
|
|
133
|
-
"Expected JSDoc block lines to be aligned.",
|
|
134
|
-
/** @type {import('eslint').Rule.ReportFixer} */
|
|
135
|
-
(fixer) => {
|
|
136
|
-
return fixer.replaceText(jsdocNode, formatted);
|
|
137
|
-
}
|
|
138
|
-
);
|
|
139
|
-
};
|
|
140
|
-
var checkLineAlignment_default = iterateJsdoc(({ context, indent, jsdoc, jsdocNode, report, utils }) => {
|
|
141
|
-
const { customSpacings, disableWrapIndent = false, preserveMainDescriptionPostDelimiter, tags: applicableTags = [
|
|
142
|
-
"param",
|
|
143
|
-
"arg",
|
|
144
|
-
"argument",
|
|
145
|
-
"property",
|
|
146
|
-
"prop",
|
|
147
|
-
"returns",
|
|
148
|
-
"return",
|
|
149
|
-
"template"
|
|
150
|
-
], wrapIndent = "" } = context.options[1] || {};
|
|
151
|
-
if (context.options[0] === "always") {
|
|
152
|
-
if (!jsdocNode.value.includes("\n")) return;
|
|
153
|
-
checkAlignment({
|
|
154
|
-
customSpacings,
|
|
155
|
-
disableWrapIndent,
|
|
156
|
-
indent,
|
|
157
|
-
jsdoc,
|
|
158
|
-
jsdocNode,
|
|
159
|
-
preserveMainDescriptionPostDelimiter,
|
|
160
|
-
report,
|
|
161
|
-
tags: applicableTags,
|
|
162
|
-
utils,
|
|
163
|
-
wrapIndent
|
|
164
|
-
});
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
const foundTags = utils.getPresentTags(applicableTags);
|
|
168
|
-
if (context.options[0] !== "any") for (const tag of foundTags) checkNotAlignedPerTag(utils, tag, customSpacings);
|
|
169
|
-
for (const tag of foundTags) if (tag.source.length > 1) {
|
|
170
|
-
let idx = 0;
|
|
171
|
-
for (const { tokens } of tag.source.slice(1)) {
|
|
172
|
-
idx++;
|
|
173
|
-
if (!tokens.description || tokens.type || tokens.name) continue;
|
|
174
|
-
if (!disableWrapIndent && tokens.postDelimiter.slice(1) !== wrapIndent) {
|
|
175
|
-
utils.reportJSDoc("Expected wrap indent", { line: tag.source[0].number + idx }, () => {
|
|
176
|
-
tokens.postDelimiter = tokens.postDelimiter.charAt(0) + wrapIndent;
|
|
177
|
-
});
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}, {
|
|
183
|
-
iterateAllJsdocs: true,
|
|
184
|
-
meta: {
|
|
185
|
-
docs: {
|
|
186
|
-
description: "Reports invalid alignment of JSDoc block lines.",
|
|
187
|
-
url: "https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-line-alignment.md#repos-sticky-header"
|
|
188
|
-
},
|
|
189
|
-
fixable: "whitespace",
|
|
190
|
-
schema: [{
|
|
191
|
-
enum: [
|
|
192
|
-
"always",
|
|
193
|
-
"never",
|
|
194
|
-
"any"
|
|
195
|
-
],
|
|
196
|
-
type: "string"
|
|
197
|
-
}, {
|
|
198
|
-
additionalProperties: false,
|
|
199
|
-
properties: {
|
|
200
|
-
customSpacings: {
|
|
201
|
-
additionalProperties: false,
|
|
202
|
-
properties: {
|
|
203
|
-
postDelimiter: { type: "integer" },
|
|
204
|
-
postHyphen: { type: "integer" },
|
|
205
|
-
postName: { type: "integer" },
|
|
206
|
-
postTag: { type: "integer" },
|
|
207
|
-
postType: { type: "integer" }
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
disableWrapIndent: { type: "boolean" },
|
|
211
|
-
preserveMainDescriptionPostDelimiter: {
|
|
212
|
-
default: false,
|
|
213
|
-
type: "boolean"
|
|
214
|
-
},
|
|
215
|
-
tags: {
|
|
216
|
-
items: { type: "string" },
|
|
217
|
-
type: "array"
|
|
218
|
-
},
|
|
219
|
-
wrapIndent: { type: "string" }
|
|
220
|
-
},
|
|
221
|
-
type: "object"
|
|
222
|
-
}],
|
|
223
|
-
type: "layout"
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
//#endregion
|
|
228
|
-
export { checkLineAlignment_default as default };
|
|
229
|
-
//# sourceMappingURL=checkLineAlignment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkLineAlignment.js","names":["alignTransform"],"sources":["../../src/rules/checkLineAlignment.js"],"sourcesContent":["import alignTransform from '../alignTransform.js';\nimport iterateJsdoc from '../iterateJsdoc.js';\nimport {\n transforms,\n} from 'comment-parser';\n\nconst {\n flow: commentFlow,\n} = transforms;\n\n/**\n * @typedef {{\n * postDelimiter: import('../iterateJsdoc.js').Integer,\n * postHyphen: import('../iterateJsdoc.js').Integer,\n * postName: import('../iterateJsdoc.js').Integer,\n * postTag: import('../iterateJsdoc.js').Integer,\n * postType: import('../iterateJsdoc.js').Integer,\n * }} CustomSpacings\n */\n\n/**\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {import('comment-parser').Spec & {\n * line: import('../iterateJsdoc.js').Integer\n * }} tag\n * @param {CustomSpacings} customSpacings\n */\nconst checkNotAlignedPerTag = (utils, tag, customSpacings) => {\n /*\n start +\n delimiter +\n postDelimiter +\n tag +\n postTag +\n type +\n postType +\n name +\n postName +\n description +\n end +\n lineEnd\n */\n\n /**\n * @typedef {\"tag\"|\"type\"|\"name\"|\"description\"} ContentProp\n */\n\n /** @type {(\"postDelimiter\"|\"postTag\"|\"postType\"|\"postName\")[]} */\n let spacerProps;\n /** @type {ContentProp[]} */\n let contentProps;\n const mightHaveNamepath = utils.tagMightHaveNamepath(tag.tag);\n if (mightHaveNamepath) {\n spacerProps = [\n 'postDelimiter', 'postTag', 'postType', 'postName',\n ];\n contentProps = [\n 'tag', 'type', 'name', 'description',\n ];\n } else {\n spacerProps = [\n 'postDelimiter', 'postTag', 'postType',\n ];\n contentProps = [\n 'tag', 'type', 'description',\n ];\n }\n\n const {\n tokens,\n } = tag.source[0];\n\n /**\n * @param {import('../iterateJsdoc.js').Integer} idx\n * @param {(notRet: boolean, contentProp: ContentProp) => void} [callbck]\n */\n const followedBySpace = (idx, callbck) => {\n const nextIndex = idx + 1;\n\n return spacerProps.slice(nextIndex).some((spacerProp, innerIdx) => {\n const contentProp = contentProps[nextIndex + innerIdx];\n\n const spacePropVal = tokens[spacerProp];\n\n const ret = spacePropVal;\n\n if (callbck) {\n callbck(!ret, contentProp);\n }\n\n return ret && (callbck || !contentProp);\n });\n };\n\n const postHyphenSpacing = customSpacings?.postHyphen ?? 1;\n const exactHyphenSpacing = new RegExp(`^\\\\s*-\\\\s{${postHyphenSpacing},${postHyphenSpacing}}(?!\\\\s)`, 'v');\n const hasNoHyphen = !(/^\\s*-(?!$)(?=\\s)/v).test(tokens.description);\n const hasExactHyphenSpacing = exactHyphenSpacing.test(\n tokens.description,\n );\n\n // If checking alignment on multiple lines, need to check other `source`\n // items\n // Go through `post*` spacing properties and exit to indicate problem if\n // extra spacing detected\n const ok = !spacerProps.some((spacerProp, idx) => {\n const contentProp = contentProps[idx];\n const contentPropVal = tokens[contentProp];\n const spacerPropVal = tokens[spacerProp];\n const spacing = customSpacings?.[spacerProp] || 1;\n\n // There will be extra alignment if...\n\n // 1. The spaces don't match the space it should have (1 or custom spacing) OR\n return spacerPropVal.length !== spacing && spacerPropVal.length !== 0 ||\n\n // 2. There is a (single) space, no immediate content, and yet another\n // space is found subsequently (not separated by intervening content)\n spacerPropVal && !contentPropVal && followedBySpace(idx);\n }) && (hasNoHyphen || hasExactHyphenSpacing);\n if (ok) {\n return;\n }\n\n const fix = () => {\n for (const [\n idx,\n spacerProp,\n ] of spacerProps.entries()) {\n const contentProp = contentProps[idx];\n const contentPropVal = tokens[contentProp];\n\n if (contentPropVal) {\n const spacing = customSpacings?.[spacerProp] || 1;\n tokens[spacerProp] = ''.padStart(spacing, ' ');\n followedBySpace(idx, (hasSpace, contentPrp) => {\n if (hasSpace) {\n tokens[contentPrp] = '';\n }\n });\n } else {\n tokens[spacerProp] = '';\n }\n }\n\n if (!hasExactHyphenSpacing) {\n const hyphenSpacing = /^\\s*-\\s+/v;\n tokens.description = tokens.description.replace(\n hyphenSpacing, '-' + ''.padStart(postHyphenSpacing, ' '),\n );\n }\n\n utils.setTag(tag, tokens);\n };\n\n utils.reportJSDoc('Expected JSDoc block lines to not be aligned.', tag, fix, true);\n};\n\n/**\n * @param {object} cfg\n * @param {CustomSpacings} cfg.customSpacings\n * @param {string} cfg.indent\n * @param {import('comment-parser').Block} cfg.jsdoc\n * @param {import('eslint').Rule.Node & {\n * range: [number, number]\n * }} cfg.jsdocNode\n * @param {boolean} cfg.preserveMainDescriptionPostDelimiter\n * @param {import('../iterateJsdoc.js').Report} cfg.report\n * @param {string[]} cfg.tags\n * @param {import('../iterateJsdoc.js').Utils} cfg.utils\n * @param {string} cfg.wrapIndent\n * @param {boolean} cfg.disableWrapIndent\n * @returns {void}\n */\nconst checkAlignment = ({\n customSpacings,\n disableWrapIndent,\n indent,\n jsdoc,\n jsdocNode,\n preserveMainDescriptionPostDelimiter,\n report,\n tags,\n utils,\n wrapIndent,\n}) => {\n const transform = commentFlow(\n alignTransform({\n customSpacings,\n disableWrapIndent,\n indent,\n preserveMainDescriptionPostDelimiter,\n tags,\n wrapIndent,\n }),\n );\n const transformedJsdoc = transform(jsdoc);\n\n const comment = '/*' +\n /**\n * @type {import('eslint').Rule.Node & {\n * range: [number, number], value: string\n * }}\n */ (jsdocNode).value + '*/';\n\n const formatted = utils.stringify(transformedJsdoc)\n .trimStart();\n\n if (comment !== formatted) {\n report(\n 'Expected JSDoc block lines to be aligned.',\n /** @type {import('eslint').Rule.ReportFixer} */ (fixer) => {\n return fixer.replaceText(jsdocNode, formatted);\n },\n );\n }\n};\n\nexport default iterateJsdoc(({\n context,\n indent,\n jsdoc,\n jsdocNode,\n report,\n utils,\n}) => {\n const {\n customSpacings,\n disableWrapIndent = false,\n preserveMainDescriptionPostDelimiter,\n tags: applicableTags = [\n 'param', 'arg', 'argument', 'property', 'prop', 'returns', 'return', 'template',\n ],\n wrapIndent = '',\n } = context.options[1] || {};\n\n if (context.options[0] === 'always') {\n // Skip if it contains only a single line.\n if (!(\n /**\n * @type {import('eslint').Rule.Node & {\n * range: [number, number], value: string\n * }}\n */\n (jsdocNode).value.includes('\\n')\n )) {\n return;\n }\n\n checkAlignment({\n customSpacings,\n disableWrapIndent,\n indent,\n jsdoc,\n jsdocNode,\n preserveMainDescriptionPostDelimiter,\n report,\n tags: applicableTags,\n utils,\n wrapIndent,\n });\n\n return;\n }\n\n const foundTags = utils.getPresentTags(applicableTags);\n if (context.options[0] !== 'any') {\n for (const tag of foundTags) {\n checkNotAlignedPerTag(\n utils,\n /**\n * @type {import('comment-parser').Spec & {\n * line: import('../iterateJsdoc.js').Integer\n * }}\n */\n (tag),\n customSpacings,\n );\n }\n }\n\n for (const tag of foundTags) {\n if (tag.source.length > 1) {\n let idx = 0;\n for (const {\n tokens,\n // Avoid the tag line\n } of tag.source.slice(1)) {\n idx++;\n\n if (\n !tokens.description ||\n // Avoid first lines after multiline type\n tokens.type ||\n tokens.name\n ) {\n continue;\n }\n\n // Don't include a single separating space/tab\n if (!disableWrapIndent && tokens.postDelimiter.slice(1) !== wrapIndent) {\n utils.reportJSDoc('Expected wrap indent', {\n line: tag.source[0].number + idx,\n }, () => {\n tokens.postDelimiter = tokens.postDelimiter.charAt(0) + wrapIndent;\n });\n return;\n }\n }\n }\n }\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Reports invalid alignment of JSDoc block lines.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-line-alignment.md#repos-sticky-header',\n },\n fixable: 'whitespace',\n schema: [\n {\n enum: [\n 'always', 'never', 'any',\n ],\n type: 'string',\n },\n {\n additionalProperties: false,\n properties: {\n customSpacings: {\n additionalProperties: false,\n properties: {\n postDelimiter: {\n type: 'integer',\n },\n postHyphen: {\n type: 'integer',\n },\n postName: {\n type: 'integer',\n },\n postTag: {\n type: 'integer',\n },\n postType: {\n type: 'integer',\n },\n },\n },\n disableWrapIndent: {\n type: 'boolean',\n },\n preserveMainDescriptionPostDelimiter: {\n default: false,\n type: 'boolean',\n },\n tags: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n wrapIndent: {\n type: 'string',\n },\n },\n type: 'object',\n },\n ],\n type: 'layout',\n },\n});\n"],"mappings":";;;;;AAMA,MAAM,EACJ,MAAM,aACP,GAAG;;;;;;;;;;;;;;;;;AAmBJ,MAAM,wBAAwB,CAAC,OAAO,KAAK,mBAAmB;;;;;CAqB5D,IAAI;;CAEJ,IAAI;CACJ,MAAM,oBAAoB,MAAM,qBAAqB,IAAI,IAAI;AAC7D,KAAI,mBAAmB;EACrB,cAAc;GACZ;GAAiB;GAAW;GAAY;EACzC;EACD,eAAe;GACb;GAAO;GAAQ;GAAQ;EACxB;CACF,OAAM;EACL,cAAc;GACZ;GAAiB;GAAW;EAC7B;EACD,eAAe;GACb;GAAO;GAAQ;EAChB;CACF;CAED,MAAM,EACJ,QACD,GAAG,IAAI,OAAO;;;;;CAMf,MAAM,kBAAkB,CAAC,KAAK,YAAY;EACxC,MAAM,YAAY,MAAM;AAExB,SAAO,YAAY,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,aAAa;GACjE,MAAM,cAAc,aAAa,YAAY;GAE7C,MAAM,eAAe,OAAO;GAE5B,MAAM,MAAM;AAEZ,OAAI,SACF,QAAQ,CAAC,KAAK,YAAY;AAG5B,UAAO,QAAQ,WAAW,CAAC;EAC5B,EAAC;CACH;CAED,MAAM,oBAAoB,gBAAgB,cAAc;CACxD,MAAM,qBAAqB,IAAI,OAAO,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,kBAAkB,QAAQ,CAAC,EAAE;CACrG,MAAM,cAAc,CAAE,oBAAqB,KAAK,OAAO,YAAY;CACnE,MAAM,wBAAwB,mBAAmB,KAC/C,OAAO,YACR;CAMD,MAAM,KAAK,CAAC,YAAY,KAAK,CAAC,YAAY,QAAQ;EAChD,MAAM,cAAc,aAAa;EACjC,MAAM,iBAAiB,OAAO;EAC9B,MAAM,gBAAgB,OAAO;EAC7B,MAAM,UAAU,iBAAiB,eAAe;AAKhD,SAAO,cAAc,WAAW,WAAW,cAAc,WAAW,KAIlE,iBAAiB,CAAC,kBAAkB,gBAAgB,IAAI;CAC3D,EAAC,KAAK,eAAe;AACtB,KAAI,GACF;CAGF,MAAM,MAAM,MAAM;AAChB,OAAK,MAAM,CACT,KACA,WACD,IAAI,YAAY,SAAS,EAAE;GAC1B,MAAM,cAAc,aAAa;GACjC,MAAM,iBAAiB,OAAO;AAE9B,OAAI,gBAAgB;IAClB,MAAM,UAAU,iBAAiB,eAAe;IAChD,OAAO,cAAc,GAAG,SAAS,SAAS,IAAI;IAC9C,gBAAgB,KAAK,CAAC,UAAU,eAAe;AAC7C,SAAI,UACF,OAAO,cAAc;IAExB,EAAC;GACH,OACC,OAAO,cAAc;EAExB;AAED,MAAI,CAAC,uBAAuB;GAC1B,MAAM,gBAAgB;GACtB,OAAO,cAAc,OAAO,YAAY,QACtC,eAAe,MAAM,GAAG,SAAS,mBAAmB,IAAI,CACzD;EACF;EAED,MAAM,OAAO,KAAK,OAAO;CAC1B;CAED,MAAM,YAAY,iDAAiD,KAAK,KAAK,KAAK;AACnF;;;;;;;;;;;;;;;;;AAkBD,MAAM,iBAAiB,CAAC,EACtB,gBACA,mBACA,QACA,OACA,WACA,sCACA,QACA,MACA,OACA,YACD,KAAK;CACJ,MAAM,YAAY,YAChBA,uBAAe;EACb;EACA;EACA;EACA;EACA;EACA;CACD,EAAC,CACH;CACD,MAAM,mBAAmB,UAAU,MAAM;CAEzC,MAAM,UAAU,OAKX,UAAW,QAAQ;CAExB,MAAM,YAAY,MAAM,UAAU,iBAAiB,CAChD,WAAW;AAEd,KAAI,YAAY,WACd;EACE;;EACiD,CAAC,UAAU;AAC1D,UAAO,MAAM,YAAY,WAAW,UAAU;EAC/C;EACF;AAEJ;AAED,iCAAe,aAAa,CAAC,EAC3B,SACA,QACA,OACA,WACA,QACA,OACD,KAAK;CACJ,MAAM,EACJ,gBACA,oBAAoB,OACpB,sCACA,MAAM,iBAAiB;EACrB;EAAS;EAAO;EAAY;EAAY;EAAQ;EAAW;EAAU;CACtE,GACD,aAAa,IACd,GAAG,QAAQ,QAAQ,MAAM,CAAE;AAE5B,KAAI,QAAQ,QAAQ,OAAO,UAAU;AAEnC,MAAI,CAMD,UAAW,MAAM,SAAS,KAAK,CAEhC;EAGF,eAAe;GACb;GACA;GACA;GACA;GACA;GACA;GACA;GACA,MAAM;GACN;GACA;EACD,EAAC;AAEF;CACD;CAED,MAAM,YAAY,MAAM,eAAe,eAAe;AACtD,KAAI,QAAQ,QAAQ,OAAO,MACzB,MAAK,MAAM,OAAO,WAChB,sBACE,OAMC,KACD,eACD;AAIL,MAAK,MAAM,OAAO,UAChB,KAAI,IAAI,OAAO,SAAS,GAAG;EACzB,IAAI,MAAM;AACV,OAAK,MAAM,EACT,QAED,IAAI,IAAI,OAAO,MAAM,EAAE,EAAE;GACxB;AAEA,OACE,CAAC,OAAO,eAER,OAAO,QACP,OAAO,KAEP;AAIF,OAAI,CAAC,qBAAqB,OAAO,cAAc,MAAM,EAAE,KAAK,YAAY;IACtE,MAAM,YAAY,wBAAwB,EACxC,MAAM,IAAI,OAAO,GAAG,SAAS,IAC9B,GAAE,MAAM;KACP,OAAO,gBAAgB,OAAO,cAAc,OAAO,EAAE,GAAG;IACzD,EAAC;AACF;GACD;EACF;CACF;AAEJ,GAAE;CACD,kBAAkB;CAClB,MAAM;EACJ,MAAM;GACJ,aAAa;GACb,KAAK;EACN;EACD,SAAS;EACT,QAAQ,CACN;GACE,MAAM;IACJ;IAAU;IAAS;GACpB;GACD,MAAM;EACP,GACD;GACE,sBAAsB;GACtB,YAAY;IACV,gBAAgB;KACd,sBAAsB;KACtB,YAAY;MACV,eAAe,EACb,MAAM,UACP;MACD,YAAY,EACV,MAAM,UACP;MACD,UAAU,EACR,MAAM,UACP;MACD,SAAS,EACP,MAAM,UACP;MACD,UAAU,EACR,MAAM,UACP;KACF;IACF;IACD,mBAAmB,EACjB,MAAM,UACP;IACD,sCAAsC;KACpC,SAAS;KACT,MAAM;IACP;IACD,MAAM;KACJ,OAAO,EACL,MAAM,SACP;KACD,MAAM;IACP;IACD,YAAY,EACV,MAAM,SACP;GACF;GACD,MAAM;EACP,CACF;EACD,MAAM;CACP;AACF,EAAC"}
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import iterateJsdoc from "../iterateJsdoc.js";
|
|
2
|
-
|
|
3
|
-
//#region src/rules/checkParamNames.js
|
|
4
|
-
/**
|
|
5
|
-
* @param {string} targetTagName
|
|
6
|
-
* @param {boolean} allowExtraTrailingParamDocs
|
|
7
|
-
* @param {boolean} checkDestructured
|
|
8
|
-
* @param {boolean} checkRestProperty
|
|
9
|
-
* @param {RegExp} checkTypesRegex
|
|
10
|
-
* @param {boolean} disableExtraPropertyReporting
|
|
11
|
-
* @param {boolean} disableMissingParamChecks
|
|
12
|
-
* @param {boolean} enableFixer
|
|
13
|
-
* @param {import('../jsdocUtils.js').ParamNameInfo[]} functionParameterNames
|
|
14
|
-
* @param {import('comment-parser').Block} jsdoc
|
|
15
|
-
* @param {import('../iterateJsdoc.js').Utils} utils
|
|
16
|
-
* @param {import('../iterateJsdoc.js').Report} report
|
|
17
|
-
* @returns {boolean}
|
|
18
|
-
*/
|
|
19
|
-
const validateParameterNames = (targetTagName, allowExtraTrailingParamDocs, checkDestructured, checkRestProperty, checkTypesRegex, disableExtraPropertyReporting, disableMissingParamChecks, enableFixer, functionParameterNames, jsdoc, utils, report) => {
|
|
20
|
-
const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
|
|
21
|
-
return tag.tag === targetTagName;
|
|
22
|
-
});
|
|
23
|
-
const paramTagsNonNested = paramTags.filter(([, tag]) => {
|
|
24
|
-
return !tag.name.includes(".");
|
|
25
|
-
});
|
|
26
|
-
let dotted = 0;
|
|
27
|
-
let thisOffset = 0;
|
|
28
|
-
return paramTags.some(([, tag], index) => {
|
|
29
|
-
/** @type {import('../iterateJsdoc.js').Integer} */
|
|
30
|
-
let tagsIndex;
|
|
31
|
-
const dupeTagInfo = paramTags.find(([tgsIndex, tg], idx) => {
|
|
32
|
-
tagsIndex = Number(tgsIndex);
|
|
33
|
-
return tg.name === tag.name && idx !== index;
|
|
34
|
-
});
|
|
35
|
-
if (dupeTagInfo) {
|
|
36
|
-
utils.reportJSDoc(`Duplicate @${targetTagName} "${tag.name}"`, dupeTagInfo[1], enableFixer ? () => {
|
|
37
|
-
utils.removeTag(tagsIndex);
|
|
38
|
-
} : null);
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
if (tag.name.includes(".")) {
|
|
42
|
-
dotted++;
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
let functionParameterName = functionParameterNames[index - dotted + thisOffset];
|
|
46
|
-
if (functionParameterName === "this" && tag.name.trim() !== "this") {
|
|
47
|
-
++thisOffset;
|
|
48
|
-
functionParameterName = functionParameterNames[index - dotted + thisOffset];
|
|
49
|
-
}
|
|
50
|
-
if (!functionParameterName) {
|
|
51
|
-
if (allowExtraTrailingParamDocs) return false;
|
|
52
|
-
report(`@${targetTagName} "${tag.name}" does not match an existing function parameter.`, null, tag);
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
if (typeof functionParameterName === "object" && "name" in functionParameterName && Array.isArray(functionParameterName.name)) {
|
|
56
|
-
const actualName = tag.name.trim();
|
|
57
|
-
const expectedName = functionParameterName.name[index];
|
|
58
|
-
if (actualName === expectedName) {
|
|
59
|
-
thisOffset--;
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
report(`Expected @${targetTagName} name to be "${expectedName}". Got "${actualName}".`, null, tag);
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
if (Array.isArray(functionParameterName)) {
|
|
66
|
-
if (!checkDestructured) return false;
|
|
67
|
-
if (tag.type && tag.type.search(checkTypesRegex) === -1) return false;
|
|
68
|
-
const [parameterName, { annotationParamName, hasPropertyRest, names: properties, rests }] = functionParameterName;
|
|
69
|
-
if (annotationParamName !== void 0) {
|
|
70
|
-
const name = tag.name.trim();
|
|
71
|
-
if (name !== annotationParamName) report(`@${targetTagName} "${name}" does not match parameter name "${annotationParamName}"`, null, tag);
|
|
72
|
-
}
|
|
73
|
-
const tagName = parameterName === void 0 ? tag.name.trim() : parameterName;
|
|
74
|
-
const expectedNames = properties.map((name) => {
|
|
75
|
-
return `${tagName}.${name}`;
|
|
76
|
-
});
|
|
77
|
-
const actualNames = paramTags.map(([, paramTag]) => {
|
|
78
|
-
return paramTag.name.trim();
|
|
79
|
-
});
|
|
80
|
-
const actualTypes = paramTags.map(([, paramTag]) => {
|
|
81
|
-
return paramTag.type;
|
|
82
|
-
});
|
|
83
|
-
const missingProperties = [];
|
|
84
|
-
/** @type {string[]} */
|
|
85
|
-
const notCheckingNames = [];
|
|
86
|
-
for (const [idx, name] of expectedNames.entries()) {
|
|
87
|
-
if (notCheckingNames.some((notCheckingName) => {
|
|
88
|
-
return name.startsWith(notCheckingName);
|
|
89
|
-
})) continue;
|
|
90
|
-
const actualNameIdx = actualNames.findIndex((actualName) => {
|
|
91
|
-
return utils.comparePaths(name)(actualName);
|
|
92
|
-
});
|
|
93
|
-
if (actualNameIdx === -1) {
|
|
94
|
-
if (!checkRestProperty && rests[idx]) continue;
|
|
95
|
-
const missingIndex = actualNames.findIndex((actualName) => {
|
|
96
|
-
return utils.pathDoesNotBeginWith(name, actualName);
|
|
97
|
-
});
|
|
98
|
-
const line = tag.source[0].number - 1 + (missingIndex > -1 ? missingIndex : actualNames.length);
|
|
99
|
-
missingProperties.push({
|
|
100
|
-
name,
|
|
101
|
-
tagPlacement: { line: line === 0 ? 1 : line }
|
|
102
|
-
});
|
|
103
|
-
} else if (actualTypes[actualNameIdx].search(checkTypesRegex) === -1 && actualTypes[actualNameIdx] !== "") notCheckingNames.push(name);
|
|
104
|
-
}
|
|
105
|
-
const hasMissing = missingProperties.length;
|
|
106
|
-
if (hasMissing) for (const { name: missingProperty, tagPlacement } of missingProperties) report(`Missing @${targetTagName} "${missingProperty}"`, null, tagPlacement);
|
|
107
|
-
if (!hasPropertyRest || checkRestProperty) {
|
|
108
|
-
/** @type {[string, import('comment-parser').Spec][]} */
|
|
109
|
-
const extraProperties = [];
|
|
110
|
-
for (const [idx, name] of actualNames.entries()) {
|
|
111
|
-
const match = name.startsWith(tag.name.trim() + ".");
|
|
112
|
-
if (match && !expectedNames.some(utils.comparePaths(name)) && !utils.comparePaths(name)(tag.name) && (!disableExtraPropertyReporting || properties.some((prop) => {
|
|
113
|
-
return prop.split(".").length >= name.split(".").length - 1;
|
|
114
|
-
}))) extraProperties.push([name, paramTags[idx][1]]);
|
|
115
|
-
}
|
|
116
|
-
if (extraProperties.length) {
|
|
117
|
-
for (const [extraProperty, tg] of extraProperties) report(`@${targetTagName} "${extraProperty}" does not exist on ${tag.name}`, null, tg);
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return hasMissing;
|
|
122
|
-
}
|
|
123
|
-
let funcParamName;
|
|
124
|
-
if (typeof functionParameterName === "object") {
|
|
125
|
-
const { name } = functionParameterName;
|
|
126
|
-
funcParamName = name;
|
|
127
|
-
} else funcParamName = functionParameterName;
|
|
128
|
-
if (funcParamName !== tag.name.trim()) {
|
|
129
|
-
const actualNames = paramTagsNonNested.map(([, { name }]) => {
|
|
130
|
-
return name.trim();
|
|
131
|
-
});
|
|
132
|
-
const expectedNames = functionParameterNames.map((item, idx) => {
|
|
133
|
-
if (item?.[1]?.names) return actualNames[idx];
|
|
134
|
-
return item;
|
|
135
|
-
}).filter((item) => {
|
|
136
|
-
return item !== "this";
|
|
137
|
-
});
|
|
138
|
-
if (disableMissingParamChecks) {
|
|
139
|
-
const usedExpectedNames = expectedNames.map((a) => {
|
|
140
|
-
return a?.toString();
|
|
141
|
-
}).filter((expectedName) => {
|
|
142
|
-
return expectedName && actualNames.includes(expectedName);
|
|
143
|
-
});
|
|
144
|
-
const usedInOrder = actualNames.every((actualName, idx) => {
|
|
145
|
-
return actualName === usedExpectedNames[idx];
|
|
146
|
-
});
|
|
147
|
-
if (usedInOrder) return false;
|
|
148
|
-
}
|
|
149
|
-
report(`Expected @${targetTagName} names to be "${expectedNames.map((expectedName) => {
|
|
150
|
-
return typeof expectedName === "object" && "name" in expectedName && expectedName.restElement ? "..." + expectedName.name : expectedName;
|
|
151
|
-
}).join(", ")}". Got "${actualNames.join(", ")}".`, null, tag);
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
return false;
|
|
155
|
-
});
|
|
156
|
-
};
|
|
157
|
-
/**
|
|
158
|
-
* @param {string} targetTagName
|
|
159
|
-
* @param {boolean} _allowExtraTrailingParamDocs
|
|
160
|
-
* @param {{
|
|
161
|
-
* name: string,
|
|
162
|
-
* idx: import('../iterateJsdoc.js').Integer
|
|
163
|
-
* }[]} jsdocParameterNames
|
|
164
|
-
* @param {import('comment-parser').Block} jsdoc
|
|
165
|
-
* @param {Function} report
|
|
166
|
-
* @returns {boolean}
|
|
167
|
-
*/
|
|
168
|
-
const validateParameterNamesDeep = (targetTagName, _allowExtraTrailingParamDocs, jsdocParameterNames, jsdoc, report) => {
|
|
169
|
-
/** @type {string} */
|
|
170
|
-
let lastRealParameter;
|
|
171
|
-
return jsdocParameterNames.some(({ idx, name: jsdocParameterName }) => {
|
|
172
|
-
const isPropertyPath = jsdocParameterName.includes(".");
|
|
173
|
-
if (isPropertyPath) {
|
|
174
|
-
if (!lastRealParameter) {
|
|
175
|
-
report(`@${targetTagName} path declaration ("${jsdocParameterName}") appears before any real parameter.`, null, jsdoc.tags[idx]);
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf("."));
|
|
179
|
-
if (pathRootNodeName.endsWith("[]")) pathRootNodeName = pathRootNodeName.slice(0, -2);
|
|
180
|
-
if (pathRootNodeName !== lastRealParameter) {
|
|
181
|
-
report(`@${targetTagName} path declaration ("${jsdocParameterName}") root node name ("${pathRootNodeName}") does not match previous real parameter name ("${lastRealParameter}").`, null, jsdoc.tags[idx]);
|
|
182
|
-
return true;
|
|
183
|
-
}
|
|
184
|
-
} else lastRealParameter = jsdocParameterName;
|
|
185
|
-
return false;
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
const allowedNodes = [
|
|
189
|
-
"ArrowFunctionExpression",
|
|
190
|
-
"FunctionDeclaration",
|
|
191
|
-
"FunctionExpression",
|
|
192
|
-
"TSDeclareFunction",
|
|
193
|
-
"TSMethodSignature"
|
|
194
|
-
];
|
|
195
|
-
var checkParamNames_default = iterateJsdoc(({ context, jsdoc, node, report, utils }) => {
|
|
196
|
-
const { allowExtraTrailingParamDocs, checkDestructured = true, checkRestProperty = false, checkTypesPattern = "/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/", disableExtraPropertyReporting = false, disableMissingParamChecks = false, enableFixer = false, useDefaultObjectProperties = false } = context.options[0] || {};
|
|
197
|
-
if (!allowedNodes.includes(
|
|
198
|
-
/** @type {import('estree').Node} */
|
|
199
|
-
node.type
|
|
200
|
-
)) return;
|
|
201
|
-
const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);
|
|
202
|
-
const jsdocParameterNamesDeep = utils.getJsdocTagsDeep("param");
|
|
203
|
-
if (!jsdocParameterNamesDeep || !jsdocParameterNamesDeep.length) return;
|
|
204
|
-
const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);
|
|
205
|
-
const targetTagName = utils.getPreferredTagName({ tagName: "param" });
|
|
206
|
-
const isError = validateParameterNames(targetTagName, allowExtraTrailingParamDocs, checkDestructured, checkRestProperty, checkTypesRegex, disableExtraPropertyReporting, disableMissingParamChecks, enableFixer, functionParameterNames, jsdoc, utils, report);
|
|
207
|
-
if (isError || !checkDestructured) return;
|
|
208
|
-
validateParameterNamesDeep(targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep, jsdoc, report);
|
|
209
|
-
}, {
|
|
210
|
-
contextDefaults: allowedNodes,
|
|
211
|
-
meta: {
|
|
212
|
-
docs: {
|
|
213
|
-
description: "Ensures that parameter names in JSDoc match those in the function declaration.",
|
|
214
|
-
url: "https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-param-names.md#repos-sticky-header"
|
|
215
|
-
},
|
|
216
|
-
fixable: "code",
|
|
217
|
-
schema: [{
|
|
218
|
-
additionalProperties: false,
|
|
219
|
-
properties: {
|
|
220
|
-
allowExtraTrailingParamDocs: { type: "boolean" },
|
|
221
|
-
checkDestructured: { type: "boolean" },
|
|
222
|
-
checkRestProperty: { type: "boolean" },
|
|
223
|
-
checkTypesPattern: { type: "string" },
|
|
224
|
-
disableExtraPropertyReporting: { type: "boolean" },
|
|
225
|
-
disableMissingParamChecks: { type: "boolean" },
|
|
226
|
-
enableFixer: { type: "boolean" },
|
|
227
|
-
useDefaultObjectProperties: { type: "boolean" }
|
|
228
|
-
},
|
|
229
|
-
type: "object"
|
|
230
|
-
}],
|
|
231
|
-
type: "suggestion"
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
//#endregion
|
|
236
|
-
export { checkParamNames_default as default };
|
|
237
|
-
//# sourceMappingURL=checkParamNames.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkParamNames.js","names":[],"sources":["../../src/rules/checkParamNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} allowExtraTrailingParamDocs\n * @param {boolean} checkDestructured\n * @param {boolean} checkRestProperty\n * @param {RegExp} checkTypesRegex\n * @param {boolean} disableExtraPropertyReporting\n * @param {boolean} disableMissingParamChecks\n * @param {boolean} enableFixer\n * @param {import('../jsdocUtils.js').ParamNameInfo[]} functionParameterNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @param {import('../iterateJsdoc.js').Report} report\n * @returns {boolean}\n */\nconst validateParameterNames = (\n targetTagName,\n allowExtraTrailingParamDocs,\n checkDestructured,\n checkRestProperty,\n checkTypesRegex,\n disableExtraPropertyReporting,\n disableMissingParamChecks,\n enableFixer,\n functionParameterNames, jsdoc, utils, report,\n) => {\n const paramTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n const paramTagsNonNested = paramTags.filter(([\n , tag,\n ]) => {\n return !tag.name.includes('.');\n });\n\n let dotted = 0;\n let thisOffset = 0;\n\n // eslint-disable-next-line complexity\n return paramTags.some(([\n , tag,\n ], index) => {\n /** @type {import('../iterateJsdoc.js').Integer} */\n let tagsIndex;\n const dupeTagInfo = paramTags.find(([\n tgsIndex,\n tg,\n ], idx) => {\n tagsIndex = Number(tgsIndex);\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], enableFixer ? () => {\n utils.removeTag(tagsIndex);\n } : null);\n\n return true;\n }\n\n if (tag.name.includes('.')) {\n dotted++;\n\n return false;\n }\n\n let functionParameterName = functionParameterNames[index - dotted + thisOffset];\n if (functionParameterName === 'this' && tag.name.trim() !== 'this') {\n ++thisOffset;\n functionParameterName = functionParameterNames[index - dotted + thisOffset];\n }\n\n if (!functionParameterName) {\n if (allowExtraTrailingParamDocs) {\n return false;\n }\n\n report(\n `@${targetTagName} \"${tag.name}\" does not match an existing function parameter.`,\n null,\n tag,\n );\n\n return true;\n }\n\n if (\n typeof functionParameterName === 'object' &&\n 'name' in functionParameterName &&\n Array.isArray(functionParameterName.name)\n ) {\n const actualName = tag.name.trim();\n const expectedName = functionParameterName.name[index];\n if (actualName === expectedName) {\n thisOffset--;\n return false;\n }\n\n report(\n `Expected @${targetTagName} name to be \"${expectedName}\". Got \"${actualName}\".`,\n null,\n tag,\n );\n return true;\n }\n\n if (Array.isArray(functionParameterName)) {\n if (!checkDestructured) {\n return false;\n }\n\n if (tag.type && tag.type.search(checkTypesRegex) === -1) {\n return false;\n }\n\n const [\n parameterName,\n {\n annotationParamName,\n hasPropertyRest,\n names: properties,\n rests,\n },\n ] =\n /**\n * @type {[string | undefined, import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string | undefined;\n }]} */ (functionParameterName);\n if (annotationParamName !== undefined) {\n const name = tag.name.trim();\n if (name !== annotationParamName) {\n report(`@${targetTagName} \"${name}\" does not match parameter name \"${annotationParamName}\"`, null, tag);\n }\n }\n\n const tagName = parameterName === undefined ? tag.name.trim() : parameterName;\n const expectedNames = properties.map((name) => {\n return `${tagName}.${name}`;\n });\n const actualNames = paramTags.map(([\n , paramTag,\n ]) => {\n return paramTag.name.trim();\n });\n const actualTypes = paramTags.map(([\n , paramTag,\n ]) => {\n return paramTag.type;\n });\n\n const missingProperties = [];\n\n /** @type {string[]} */\n const notCheckingNames = [];\n\n for (const [\n idx,\n name,\n ] of expectedNames.entries()) {\n if (notCheckingNames.some((notCheckingName) => {\n return name.startsWith(notCheckingName);\n })) {\n continue;\n }\n\n const actualNameIdx = actualNames.findIndex((actualName) => {\n return utils.comparePaths(name)(actualName);\n });\n if (actualNameIdx === -1) {\n if (!checkRestProperty && rests[idx]) {\n continue;\n }\n\n const missingIndex = actualNames.findIndex((actualName) => {\n return utils.pathDoesNotBeginWith(name, actualName);\n });\n const line = tag.source[0].number - 1 + (missingIndex > -1 ? missingIndex : actualNames.length);\n missingProperties.push({\n name,\n tagPlacement: {\n line: line === 0 ? 1 : line,\n },\n });\n } else if (actualTypes[actualNameIdx].search(checkTypesRegex) === -1 && actualTypes[actualNameIdx] !== '') {\n notCheckingNames.push(name);\n }\n }\n\n const hasMissing = missingProperties.length;\n if (hasMissing) {\n for (const {\n name: missingProperty,\n tagPlacement,\n } of missingProperties) {\n report(`Missing @${targetTagName} \"${missingProperty}\"`, null, tagPlacement);\n }\n }\n\n if (!hasPropertyRest || checkRestProperty) {\n /** @type {[string, import('comment-parser').Spec][]} */\n const extraProperties = [];\n for (const [\n idx,\n name,\n ] of actualNames.entries()) {\n const match = name.startsWith(tag.name.trim() + '.');\n if (\n match && !expectedNames.some(\n utils.comparePaths(name),\n ) && !utils.comparePaths(name)(tag.name) &&\n (!disableExtraPropertyReporting || properties.some((prop) => {\n return prop.split('.').length >= name.split('.').length - 1;\n }))\n ) {\n extraProperties.push([\n name, paramTags[idx][1],\n ]);\n }\n }\n\n if (extraProperties.length) {\n for (const [\n extraProperty,\n tg,\n ] of extraProperties) {\n report(`@${targetTagName} \"${extraProperty}\" does not exist on ${tag.name}`, null, tg);\n }\n\n return true;\n }\n }\n\n return hasMissing;\n }\n\n let funcParamName;\n if (typeof functionParameterName === 'object') {\n const {\n name,\n } = functionParameterName;\n funcParamName = name;\n } else {\n funcParamName = functionParameterName;\n }\n\n if (funcParamName !== tag.name.trim()) {\n // Todo: Improve for array or object child items\n const actualNames = paramTagsNonNested.map(([\n , {\n name,\n },\n ]) => {\n return name.trim();\n });\n\n const expectedNames = functionParameterNames.map((item, idx) => {\n if (/**\n * @type {[string|undefined, (import('../jsdocUtils.js').FlattendRootInfo & {\n * annotationParamName?: string,\n })]} */ (item)?.[1]?.names) {\n return actualNames[idx];\n }\n\n return item;\n }).filter((item) => {\n return item !== 'this';\n });\n\n // When disableMissingParamChecks is true tag names can be omitted.\n // Report when the tag names do not match the expected names or they are used out of order.\n if (disableMissingParamChecks) {\n const usedExpectedNames = expectedNames.map((a) => {\n return a?.toString();\n }).filter((expectedName) => {\n return expectedName && actualNames.includes(expectedName);\n });\n const usedInOrder = actualNames.every((actualName, idx) => {\n return actualName === usedExpectedNames[idx];\n });\n if (usedInOrder) {\n return false;\n }\n }\n\n report(\n `Expected @${targetTagName} names to be \"${\n expectedNames.map((expectedName) => {\n return typeof expectedName === 'object' &&\n 'name' in expectedName &&\n expectedName.restElement ?\n '...' + expectedName.name :\n expectedName;\n }).join(', ')\n }\". Got \"${actualNames.join(', ')}\".`,\n null,\n tag,\n );\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {boolean} _allowExtraTrailingParamDocs\n * @param {{\n * name: string,\n * idx: import('../iterateJsdoc.js').Integer\n * }[]} jsdocParameterNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {Function} report\n * @returns {boolean}\n */\nconst validateParameterNamesDeep = (\n targetTagName, _allowExtraTrailingParamDocs,\n jsdocParameterNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealParameter;\n\n return jsdocParameterNames.some(({\n idx,\n name: jsdocParameterName,\n }) => {\n const isPropertyPath = jsdocParameterName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealParameter) {\n report(`@${targetTagName} path declaration (\"${jsdocParameterName}\") appears before any real parameter.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealParameter) {\n report(\n `@${targetTagName} path declaration (\"${jsdocParameterName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real parameter name (\"${lastRealParameter}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealParameter = jsdocParameterName;\n }\n\n return false;\n });\n};\n\nconst allowedNodes = [\n 'ArrowFunctionExpression', 'FunctionDeclaration', 'FunctionExpression', 'TSDeclareFunction',\n // Add this to above defaults\n 'TSMethodSignature',\n];\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n node,\n report,\n utils,\n}) => {\n const {\n allowExtraTrailingParamDocs,\n checkDestructured = true,\n checkRestProperty = false,\n checkTypesPattern = '/^(?:[oO]bject|[aA]rray|PlainObject|Generic(?:Object|Array))$/',\n disableExtraPropertyReporting = false,\n disableMissingParamChecks = false,\n enableFixer = false,\n useDefaultObjectProperties = false,\n } = context.options[0] || {};\n\n // Although we might just remove global settings contexts from applying to\n // this rule (as they can cause problems with `getFunctionParameterNames`\n // checks if they are not functions but say variables), the user may\n // instead wish to narrow contexts in those settings, so this check\n // is still useful\n if (!allowedNodes.includes(/** @type {import('estree').Node} */ (node).type)) {\n return;\n }\n\n const checkTypesRegex = utils.getRegexFromString(checkTypesPattern);\n\n const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');\n if (!jsdocParameterNamesDeep || !jsdocParameterNamesDeep.length) {\n return;\n }\n\n const functionParameterNames = utils.getFunctionParameterNames(useDefaultObjectProperties);\n\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'param',\n }));\n const isError = validateParameterNames(\n targetTagName,\n allowExtraTrailingParamDocs,\n checkDestructured,\n checkRestProperty,\n checkTypesRegex,\n disableExtraPropertyReporting,\n disableMissingParamChecks,\n enableFixer,\n functionParameterNames,\n jsdoc,\n utils,\n report,\n );\n\n if (isError || !checkDestructured) {\n return;\n }\n\n validateParameterNamesDeep(\n targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep, jsdoc, report,\n );\n}, {\n contextDefaults: allowedNodes,\n meta: {\n docs: {\n description: 'Ensures that parameter names in JSDoc match those in the function declaration.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-param-names.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowExtraTrailingParamDocs: {\n type: 'boolean',\n },\n checkDestructured: {\n type: 'boolean',\n },\n checkRestProperty: {\n type: 'boolean',\n },\n checkTypesPattern: {\n type: 'string',\n },\n disableExtraPropertyReporting: {\n type: 'boolean',\n },\n disableMissingParamChecks: {\n type: 'boolean',\n },\n enableFixer: {\n type: 'boolean',\n },\n useDefaultObjectProperties: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import iterateJsdoc from "../iterateJsdoc.js";
|
|
2
|
-
|
|
3
|
-
//#region src/rules/checkPropertyNames.js
|
|
4
|
-
/**
|
|
5
|
-
* @param {string} targetTagName
|
|
6
|
-
* @param {boolean} enableFixer
|
|
7
|
-
* @param {import('comment-parser').Block} jsdoc
|
|
8
|
-
* @param {import('../iterateJsdoc.js').Utils} utils
|
|
9
|
-
* @returns {boolean}
|
|
10
|
-
*/
|
|
11
|
-
const validatePropertyNames = (targetTagName, enableFixer, jsdoc, utils) => {
|
|
12
|
-
const propertyTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
|
|
13
|
-
return tag.tag === targetTagName;
|
|
14
|
-
});
|
|
15
|
-
return propertyTags.some(([, tag], index) => {
|
|
16
|
-
/** @type {import('../iterateJsdoc.js').Integer} */
|
|
17
|
-
let tagsIndex;
|
|
18
|
-
const dupeTagInfo = propertyTags.find(([tgsIndex, tg], idx) => {
|
|
19
|
-
tagsIndex = Number(tgsIndex);
|
|
20
|
-
return tg.name === tag.name && idx !== index;
|
|
21
|
-
});
|
|
22
|
-
if (dupeTagInfo) {
|
|
23
|
-
utils.reportJSDoc(`Duplicate @${targetTagName} "${tag.name}"`, dupeTagInfo[1], enableFixer ? () => {
|
|
24
|
-
utils.removeTag(tagsIndex);
|
|
25
|
-
} : null);
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* @param {string} targetTagName
|
|
33
|
-
* @param {{
|
|
34
|
-
* idx: number;
|
|
35
|
-
* name: string;
|
|
36
|
-
* type: string;
|
|
37
|
-
* }[]} jsdocPropertyNames
|
|
38
|
-
* @param {import('comment-parser').Block} jsdoc
|
|
39
|
-
* @param {Function} report
|
|
40
|
-
*/
|
|
41
|
-
const validatePropertyNamesDeep = (targetTagName, jsdocPropertyNames, jsdoc, report) => {
|
|
42
|
-
/** @type {string} */
|
|
43
|
-
let lastRealProperty;
|
|
44
|
-
return jsdocPropertyNames.some(({ idx, name: jsdocPropertyName }) => {
|
|
45
|
-
const isPropertyPath = jsdocPropertyName.includes(".");
|
|
46
|
-
if (isPropertyPath) {
|
|
47
|
-
if (!lastRealProperty) {
|
|
48
|
-
report(`@${targetTagName} path declaration ("${jsdocPropertyName}") appears before any real property.`, null, jsdoc.tags[idx]);
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf("."));
|
|
52
|
-
if (pathRootNodeName.endsWith("[]")) pathRootNodeName = pathRootNodeName.slice(0, -2);
|
|
53
|
-
if (pathRootNodeName !== lastRealProperty) {
|
|
54
|
-
report(`@${targetTagName} path declaration ("${jsdocPropertyName}") root node name ("${pathRootNodeName}") does not match previous real property name ("${lastRealProperty}").`, null, jsdoc.tags[idx]);
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
} else lastRealProperty = jsdocPropertyName;
|
|
58
|
-
return false;
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
var checkPropertyNames_default = iterateJsdoc(({ context, jsdoc, report, utils }) => {
|
|
62
|
-
const { enableFixer = false } = context.options[0] || {};
|
|
63
|
-
const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep("property");
|
|
64
|
-
if (!jsdocPropertyNamesDeep || !jsdocPropertyNamesDeep.length) return;
|
|
65
|
-
const targetTagName = utils.getPreferredTagName({ tagName: "property" });
|
|
66
|
-
const isError = validatePropertyNames(targetTagName, enableFixer, jsdoc, utils);
|
|
67
|
-
if (isError) return;
|
|
68
|
-
validatePropertyNamesDeep(targetTagName, jsdocPropertyNamesDeep, jsdoc, report);
|
|
69
|
-
}, {
|
|
70
|
-
iterateAllJsdocs: true,
|
|
71
|
-
meta: {
|
|
72
|
-
docs: {
|
|
73
|
-
description: "Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots.",
|
|
74
|
-
url: "https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-property-names.md#repos-sticky-header"
|
|
75
|
-
},
|
|
76
|
-
fixable: "code",
|
|
77
|
-
schema: [{
|
|
78
|
-
additionalProperties: false,
|
|
79
|
-
properties: { enableFixer: { type: "boolean" } },
|
|
80
|
-
type: "object"
|
|
81
|
-
}],
|
|
82
|
-
type: "suggestion"
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
//#endregion
|
|
87
|
-
export { checkPropertyNames_default as default };
|
|
88
|
-
//# sourceMappingURL=checkPropertyNames.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkPropertyNames.js","names":[],"sources":["../../src/rules/checkPropertyNames.js"],"sourcesContent":["import iterateJsdoc from '../iterateJsdoc.js';\n\n/**\n * @param {string} targetTagName\n * @param {boolean} enableFixer\n * @param {import('comment-parser').Block} jsdoc\n * @param {import('../iterateJsdoc.js').Utils} utils\n * @returns {boolean}\n */\nconst validatePropertyNames = (\n targetTagName,\n enableFixer,\n jsdoc, utils,\n) => {\n const propertyTags = Object.entries(jsdoc.tags).filter(([\n , tag,\n ]) => {\n return tag.tag === targetTagName;\n });\n\n return propertyTags.some(([\n , tag,\n ], index) => {\n /** @type {import('../iterateJsdoc.js').Integer} */\n let tagsIndex;\n const dupeTagInfo = propertyTags.find(([\n tgsIndex,\n tg,\n ], idx) => {\n tagsIndex = Number(tgsIndex);\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], enableFixer ? () => {\n utils.removeTag(tagsIndex);\n } : null);\n\n return true;\n }\n\n return false;\n });\n};\n\n/**\n * @param {string} targetTagName\n * @param {{\n * idx: number;\n * name: string;\n * type: string;\n * }[]} jsdocPropertyNames\n * @param {import('comment-parser').Block} jsdoc\n * @param {Function} report\n */\nconst validatePropertyNamesDeep = (\n targetTagName,\n jsdocPropertyNames, jsdoc, report,\n) => {\n /** @type {string} */\n let lastRealProperty;\n\n return jsdocPropertyNames.some(({\n idx,\n name: jsdocPropertyName,\n }) => {\n const isPropertyPath = jsdocPropertyName.includes('.');\n\n if (isPropertyPath) {\n if (!lastRealProperty) {\n report(`@${targetTagName} path declaration (\"${jsdocPropertyName}\") appears before any real property.`, null, jsdoc.tags[idx]);\n\n return true;\n }\n\n let pathRootNodeName = jsdocPropertyName.slice(0, jsdocPropertyName.indexOf('.'));\n\n if (pathRootNodeName.endsWith('[]')) {\n pathRootNodeName = pathRootNodeName.slice(0, -2);\n }\n\n if (pathRootNodeName !== lastRealProperty) {\n report(\n `@${targetTagName} path declaration (\"${jsdocPropertyName}\") root node name (\"${pathRootNodeName}\") ` +\n `does not match previous real property name (\"${lastRealProperty}\").`,\n null,\n jsdoc.tags[idx],\n );\n\n return true;\n }\n } else {\n lastRealProperty = jsdocPropertyName;\n }\n\n return false;\n });\n};\n\nexport default iterateJsdoc(({\n context,\n jsdoc,\n report,\n utils,\n}) => {\n const {\n enableFixer = false,\n } = context.options[0] || {};\n const jsdocPropertyNamesDeep = utils.getJsdocTagsDeep('property');\n if (!jsdocPropertyNamesDeep || !jsdocPropertyNamesDeep.length) {\n return;\n }\n\n const targetTagName = /** @type {string} */ (utils.getPreferredTagName({\n tagName: 'property',\n }));\n const isError = validatePropertyNames(\n targetTagName,\n enableFixer,\n jsdoc,\n utils,\n );\n\n if (isError) {\n return;\n }\n\n validatePropertyNamesDeep(\n targetTagName, jsdocPropertyNamesDeep, jsdoc, report,\n );\n}, {\n iterateAllJsdocs: true,\n meta: {\n docs: {\n description: 'Ensures that property names in JSDoc are not duplicated on the same block and that nested properties have defined roots.',\n url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-property-names.md#repos-sticky-header',\n },\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n enableFixer: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"mappings":";;;;;;;;;;AASA,MAAM,wBAAwB,CAC5B,eACA,aACA,OAAO,UACJ;CACH,MAAM,eAAe,OAAO,QAAQ,MAAM,KAAK,CAAC,OAAO,CAAC,GACpD,IACH,KAAK;AACJ,SAAO,IAAI,QAAQ;CACpB,EAAC;AAEF,QAAO,aAAa,KAAK,CAAC,GACtB,IACH,EAAE,UAAU;;EAEX,IAAI;EACJ,MAAM,cAAc,aAAa,KAAK,CAAC,CACrC,UACA,GACD,EAAE,QAAQ;GACT,YAAY,OAAO,SAAS;AAE5B,UAAO,GAAG,SAAS,IAAI,QAAQ,QAAQ;EACxC,EAAC;AACF,MAAI,aAAa;GACf,MAAM,YAAY,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,IAAI,KAAK,CAAC,CAAC,EAAE,YAAY,IAAI,cAAc,MAAM;IACjG,MAAM,UAAU,UAAU;GAC3B,IAAG,KAAK;AAET,UAAO;EACR;AAED,SAAO;CACR,EAAC;AACH;;;;;;;;;;;AAYD,MAAM,4BAA4B,CAChC,eACA,oBAAoB,OAAO,WACxB;;CAEH,IAAI;AAEJ,QAAO,mBAAmB,KAAK,CAAC,EAC9B,KACA,MAAM,mBACP,KAAK;EACJ,MAAM,iBAAiB,kBAAkB,SAAS,IAAI;AAEtD,MAAI,gBAAgB;AAClB,OAAI,CAAC,kBAAkB;IACrB,OAAO,CAAC,CAAC,EAAE,cAAc,oBAAoB,EAAE,kBAAkB,oCAAoC,CAAC,EAAE,MAAM,MAAM,KAAK,KAAK;AAE9H,WAAO;GACR;GAED,IAAI,mBAAmB,kBAAkB,MAAM,GAAG,kBAAkB,QAAQ,IAAI,CAAC;AAEjF,OAAI,iBAAiB,SAAS,KAAK,EACjC,mBAAmB,iBAAiB,MAAM,GAAG,GAAG;AAGlD,OAAI,qBAAqB,kBAAkB;IACzC,OACE,CAAC,CAAC,EAAE,cAAc,oBAAoB,EAAE,kBAAkB,oBAAoB,EAAE,iBAAiB,gDAAG,EACpD,iBAAiB,GAAG,CAAC,EACrE,MACA,MAAM,KAAK,KACZ;AAED,WAAO;GACR;EACF,OACC,mBAAmB;AAGrB,SAAO;CACR,EAAC;AACH;AAED,iCAAe,aAAa,CAAC,EAC3B,SACA,OACA,QACA,OACD,KAAK;CACJ,MAAM,EACJ,cAAc,OACf,GAAG,QAAQ,QAAQ,MAAM,CAAE;CAC5B,MAAM,yBAAyB,MAAM,iBAAiB,WAAW;AACjE,KAAI,CAAC,0BAA0B,CAAC,uBAAuB,OACrD;CAGF,MAAM,gBAAuC,MAAM,oBAAoB,EACrE,SAAS,WACV,EAAC;CACF,MAAM,UAAU,sBACd,eACA,aACA,OACA,MACD;AAED,KAAI,QACF;CAGF,0BACE,eAAe,wBAAwB,OAAO,OAC/C;AACF,GAAE;CACD,kBAAkB;CAClB,MAAM;EACJ,MAAM;GACJ,aAAa;GACb,KAAK;EACN;EACD,SAAS;EACT,QAAQ,CACN;GACE,sBAAsB;GACtB,YAAY,EACV,aAAa,EACX,MAAM,UACP,EACF;GACD,MAAM;EACP,CACF;EACD,MAAM;CACP;AACF,EAAC"}
|