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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hasReturnValue.cjs","names":[],"sources":["../../src/utils/hasReturnValue.js"],"sourcesContent":["/**\n * @typedef {import('estree').Node|\n * import('@typescript-eslint/types').TSESTree.Node} ESTreeOrTypeScriptNode\n */\n\n/**\n * Checks if a node is a promise but has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @returns {boolean|undefined|null}\n */\nconst isNewPromiseExpression = (node) => {\n return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' &&\n node.callee.name === 'Promise';\n};\n\n/**\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @returns {boolean}\n */\nconst isVoidPromise = (node) => {\n return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (node)?.typeArguments?.params?.[0]?.type === 'TSVoidKeyword'\n /* c8 ignore next 5 */\n // eslint-disable-next-line @stylistic/operator-linebreak -- c8\n || /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (\n node\n // @ts-expect-error Ok\n )?.typeParameters?.params?.[0]?.type === 'TSVoidKeyword';\n};\n\nconst undefinedKeywords = new Set([\n 'TSNeverKeyword', 'TSUndefinedKeyword', 'TSVoidKeyword',\n]);\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @param {boolean} [throwOnNullReturn]\n * @param {PromiseFilter} [promFilter]\n * @returns {boolean|undefined}\n */\n// eslint-disable-next-line complexity\nconst hasReturnValue = (node, throwOnNullReturn, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n case 'ArrowFunctionExpression':\n case 'FunctionDeclaration':\n case 'FunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(\n node.body,\n ) || !isVoidPromise(node.body)) ||\n hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'BlockStatement': {\n return node.body.some((bodyNode) => {\n return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);\n });\n }\n\n case 'DoWhileStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n\n case 'ForStatement':\n\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'WithStatement': {\n return hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'IfStatement': {\n return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.alternate, throwOnNullReturn, promFilter);\n }\n\n case 'MethodDefinition':\n return hasReturnValue(node.value, throwOnNullReturn, promFilter);\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n if (throwOnNullReturn) {\n throw new Error('Null return');\n }\n\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasReturnValue(nde, throwOnNullReturn, promFilter);\n });\n },\n );\n }\n\n case 'TryStatement': {\n return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);\n }\n\n case 'TSDeclareFunction':\n\n case 'TSFunctionType':\n\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @param {PromiseFilter} promFilter\n * @returns {undefined|boolean|ESTreeOrTypeScriptNode}\n */\n// eslint-disable-next-line complexity\nconst allBrancheshaveReturnValues = (node, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n // case 'MethodDefinition':\n // return allBrancheshaveReturnValues(node.value, promFilter);\n case 'ArrowFunctionExpression':\n case 'FunctionDeclaration':\n case 'FunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||\n allBrancheshaveReturnValues(node.body, promFilter) ||\n /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */\n (node.body).body.some((nde) => {\n return nde.type === 'ReturnStatement';\n });\n }\n\n case 'BlockStatement': {\n const lastBodyNode = node.body.slice(-1)[0];\n return allBrancheshaveReturnValues(lastBodyNode, promFilter);\n }\n\n case 'DoWhileStatement':\n case 'WhileStatement':\n if (\n /**\n * @type {import('@typescript-eslint/types').TSESTree.Literal}\n */\n (node.test).value === true\n ) {\n // If this is an infinite loop, we assume only one branch\n // is needed to provide a return\n return hasReturnValue(node.body, false, promFilter);\n }\n\n // Fallthrough\n case 'ForStatement':\n if (node.test === null) {\n // If this is an infinite loop, we assume only one branch\n // is needed to provide a return\n return hasReturnValue(node.body, false, promFilter);\n }\n\n case 'ForInStatement':\n case 'ForOfStatement':\n\n case 'LabeledStatement':\n\n case 'WithStatement': {\n return allBrancheshaveReturnValues(node.body, promFilter);\n }\n\n case 'IfStatement': {\n return allBrancheshaveReturnValues(node.consequent, promFilter) &&\n allBrancheshaveReturnValues(node.alternate, promFilter);\n }\n\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n case 'SwitchStatement': {\n return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(\n (someCase) => {\n return !someCase.consequent.some((consNode) => {\n return consNode.type === 'BreakStatement' ||\n consNode.type === 'ReturnStatement' && consNode.argument === null;\n });\n },\n );\n }\n\n case 'ThrowStatement': {\n return true;\n }\n\n case 'TryStatement': {\n // If `finally` returns, all return\n return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||\n // Return in `try`/`catch` may still occur despite `finally`\n allBrancheshaveReturnValues(node.block, promFilter) &&\n (!node.handler ||\n allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&\n (!node.finalizer || (() => {\n try {\n hasReturnValue(node.finalizer, true, promFilter);\n } catch (error) {\n if (/** @type {Error} */ (error).message === 'Null return') {\n return false;\n }\n /* c8 ignore next 3 */\n // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n throw error;\n }\n\n // As long as not an explicit empty return, then return true\n return true;\n })());\n }\n\n case 'TSDeclareFunction':\n\n case 'TSFunctionType':\n\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * @callback PromiseFilter\n * @param {ESTreeOrTypeScriptNode|undefined} node\n * @returns {boolean}\n */\n\n/**\n * Avoids further checking child nodes if a nested function shadows the\n * resolver, but otherwise, if name is used (by call or passed in as an\n * argument to another function), will be considered as non-empty.\n *\n * This could check for redeclaration of the resolver, but as such is\n * unlikely, we avoid the performance cost of checking everywhere for\n * (re)declarations or assignments.\n * @param {import('@typescript-eslint/types').TSESTree.Node|null|undefined} node\n * @param {string} resolverName\n * @returns {boolean}\n */\n// eslint-disable-next-line complexity\nconst hasNonEmptyResolverCall = (node, resolverName) => {\n if (!node) {\n return false;\n }\n\n // Arrow function without block\n switch (node.type) {\n case 'ArrayExpression':\n case 'ArrayPattern':\n return node.elements.some((element) => {\n return hasNonEmptyResolverCall(element, resolverName);\n });\n case 'ArrowFunctionExpression':\n case 'FunctionDeclaration':\n case 'FunctionExpression': {\n // Shadowing\n if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n node.params[0]\n )?.name === resolverName) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n case 'AssignmentExpression':\n case 'BinaryExpression':\n case 'LogicalExpression': {\n return hasNonEmptyResolverCall(node.left, resolverName) ||\n hasNonEmptyResolverCall(node.right, resolverName);\n }\n\n case 'AssignmentPattern':\n return hasNonEmptyResolverCall(node.right, resolverName);\n case 'AwaitExpression':\n\n case 'SpreadElement':\n case 'UnaryExpression':\n case 'YieldExpression':\n return hasNonEmptyResolverCall(node.argument, resolverName);\n case 'BlockStatement':\n case 'ClassBody':\n return node.body.some((bodyNode) => {\n return hasNonEmptyResolverCall(bodyNode, resolverName);\n });\n /* c8 ignore next 2 -- In Babel? */\n case 'CallExpression':\n // @ts-expect-error Babel?\n case 'OptionalCallExpression':\n return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n node.callee\n ).name === resolverName && (\n\n // Implicit or explicit undefined\n node.arguments.length > 1 || node.arguments[0] !== undefined\n ) ||\n node.arguments.some((nde) => {\n // Being passed in to another function (which might invoke it)\n return nde.type === 'Identifier' && nde.name === resolverName ||\n\n // Handle nested items\n hasNonEmptyResolverCall(nde, resolverName);\n });\n\n case 'ChainExpression':\n case 'Decorator':\n\n case 'ExpressionStatement':\n return hasNonEmptyResolverCall(node.expression, resolverName);\n\n case 'ClassDeclaration':\n\n case 'ClassExpression':\n return hasNonEmptyResolverCall(node.body, resolverName);\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ClassMethod':\n\n case 'MethodDefinition':\n return node.decorators && node.decorators.some((decorator) => {\n return hasNonEmptyResolverCall(decorator, resolverName);\n }) ||\n node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ClassProperty':\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ObjectProperty':\n case 'Property':\n\n case 'PropertyDefinition':\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n case 'ConditionalExpression':\n\n case 'IfStatement': {\n return hasNonEmptyResolverCall(node.test, resolverName) ||\n hasNonEmptyResolverCall(node.consequent, resolverName) ||\n hasNonEmptyResolverCall(node.alternate, resolverName);\n }\n\n case 'DoWhileStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n\n case 'ForStatement':\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'WithStatement': {\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'Import':\n\n case 'ImportExpression':\n return hasNonEmptyResolverCall(node.source, resolverName);\n // ?.\n /* c8 ignore next 2 -- In Babel? */\n case 'MemberExpression':\n\n // @ts-expect-error Babel?\n case 'OptionalMemberExpression':\n return hasNonEmptyResolverCall(node.object, resolverName) ||\n hasNonEmptyResolverCall(node.property, resolverName);\n case 'ObjectExpression':\n case 'ObjectPattern':\n return node.properties.some((property) => {\n return hasNonEmptyResolverCall(property, resolverName);\n });\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ObjectMethod':\n /* c8 ignore next 6 -- In Babel? */\n // @ts-expect-error\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n // @ts-expect-error\n node.arguments.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n\n case 'ReturnStatement': {\n if (node.argument === null) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.argument, resolverName);\n }\n\n // Comma\n case 'SequenceExpression':\n\n case 'TemplateLiteral':\n return node.expressions.some((subExpression) => {\n return hasNonEmptyResolverCall(subExpression, resolverName);\n });\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n },\n );\n }\n\n case 'TaggedTemplateExpression':\n return hasNonEmptyResolverCall(node.quasi, resolverName);\n\n case 'TryStatement': {\n return hasNonEmptyResolverCall(node.block, resolverName) ||\n hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||\n hasNonEmptyResolverCall(node.finalizer, resolverName);\n }\n\n case 'VariableDeclaration': {\n return node.declarations.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n }\n\n case 'VariableDeclarator': {\n return hasNonEmptyResolverCall(node.id, resolverName) ||\n hasNonEmptyResolverCall(node.init, resolverName);\n }\n\n /*\n // Shouldn't need to parse literals/literal components, etc.\n\n case 'Identifier':\n case 'TemplateElement':\n case 'Super':\n // Exports not relevant in this context\n */\n default:\n return false;\n }\n};\n\n/**\n * Checks if a Promise executor has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode} node\n * @param {boolean} anyPromiseAsReturn\n * @param {boolean} [allBranches]\n * @returns {boolean}\n */\nconst hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {\n const hasReturnMethod = allBranches ?\n /**\n * @param {ESTreeOrTypeScriptNode} nde\n * @param {PromiseFilter} promiseFilter\n * @returns {boolean}\n */\n (nde, promiseFilter) => {\n let hasReturn;\n try {\n hasReturn = hasReturnValue(nde, true, promiseFilter);\n } catch (error) {\n // c8 ignore else\n if (/** @type {Error} */ (error).message === 'Null return') {\n return false;\n }\n /* c8 ignore next 3 */\n // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n throw error;\n }\n\n // `hasReturn` check needed since `throw` treated as valid return by\n // `allBrancheshaveReturnValues`\n return Boolean(hasReturn && allBrancheshaveReturnValues(nde, promiseFilter));\n } :\n /**\n * @param {ESTreeOrTypeScriptNode} nde\n * @param {PromiseFilter} promiseFilter\n * @returns {boolean}\n */\n (nde, promiseFilter) => {\n return Boolean(hasReturnValue(nde, false, promiseFilter));\n };\n\n return hasReturnMethod(node, (prom) => {\n if (anyPromiseAsReturn) {\n return true;\n }\n\n if (isVoidPromise(prom)) {\n return false;\n }\n\n const {\n body,\n params,\n } =\n /**\n * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|\n * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}\n */ (\n /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */ (\n prom\n ).arguments[0]\n ) || {};\n\n if (!params?.length) {\n return false;\n }\n\n const {\n name: resolverName,\n } = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n params[0]\n );\n\n return hasNonEmptyResolverCall(body, resolverName);\n });\n};\n\nexport {\n hasReturnValue,\n hasValueOrExecutorHasNonEmptyResolveValue,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hasReturnValue.cjs","names":["isNewPromiseExpression","node","type","callee","name","isVoidPromise","typeArguments","params","typeParameters","undefinedKeywords","Set","hasReturnValue","throwOnNullReturn","promFilter","expression","body","some","bodyNode","consequent","alternate","value","argument","Error","cases","someCase","nde","block","handler","finalizer","returnType","typeAnnotation","has","exports","allBrancheshaveReturnValues","lastBodyNode","slice","test","every","consNode","error","message","hasNonEmptyResolverCall","resolverName","elements","element","left","right","arguments","length","undefined","decorators","decorator","computed","key","source","object","property","properties","expressions","subExpression","quasi","declarations","id","init","hasValueOrExecutorHasNonEmptyResolveValue","anyPromiseAsReturn","allBranches","hasReturnMethod","promiseFilter","hasReturn","Boolean","prom"],"sources":["../../src/utils/hasReturnValue.js"],"sourcesContent":["/**\n * @typedef {import('estree').Node|\n * import('@typescript-eslint/types').TSESTree.Node} ESTreeOrTypeScriptNode\n */\n\n/**\n * Checks if a node is a promise but has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @returns {boolean|undefined|null}\n */\nconst isNewPromiseExpression = (node) => {\n return node && node.type === 'NewExpression' && node.callee.type === 'Identifier' &&\n node.callee.name === 'Promise';\n};\n\n/**\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @returns {boolean}\n */\nconst isVoidPromise = (node) => {\n return /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (node)?.typeArguments?.params?.[0]?.type === 'TSVoidKeyword'\n /* c8 ignore next 5 */\n // eslint-disable-next-line @stylistic/operator-linebreak -- c8\n || /** @type {import('@typescript-eslint/types').TSESTree.TSTypeReference} */ (\n node\n // @ts-expect-error Ok\n )?.typeParameters?.params?.[0]?.type === 'TSVoidKeyword';\n};\n\nconst undefinedKeywords = new Set([\n 'TSNeverKeyword', 'TSUndefinedKeyword', 'TSVoidKeyword',\n]);\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|undefined|null} node\n * @param {boolean} [throwOnNullReturn]\n * @param {PromiseFilter} [promFilter]\n * @returns {boolean|undefined}\n */\n// eslint-disable-next-line complexity\nconst hasReturnValue = (node, throwOnNullReturn, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n case 'ArrowFunctionExpression':\n case 'FunctionDeclaration':\n case 'FunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(\n node.body,\n ) || !isVoidPromise(node.body)) ||\n hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'BlockStatement': {\n return node.body.some((bodyNode) => {\n return bodyNode.type !== 'FunctionDeclaration' && hasReturnValue(bodyNode, throwOnNullReturn, promFilter);\n });\n }\n\n case 'DoWhileStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n\n case 'ForStatement':\n\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'WithStatement': {\n return hasReturnValue(node.body, throwOnNullReturn, promFilter);\n }\n\n case 'IfStatement': {\n return hasReturnValue(node.consequent, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.alternate, throwOnNullReturn, promFilter);\n }\n\n case 'MethodDefinition':\n return hasReturnValue(node.value, throwOnNullReturn, promFilter);\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n if (throwOnNullReturn) {\n throw new Error('Null return');\n }\n\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasReturnValue(nde, throwOnNullReturn, promFilter);\n });\n },\n );\n }\n\n case 'TryStatement': {\n return hasReturnValue(node.block, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.handler && node.handler.body, throwOnNullReturn, promFilter) ||\n hasReturnValue(node.finalizer, throwOnNullReturn, promFilter);\n }\n\n case 'TSDeclareFunction':\n\n case 'TSFunctionType':\n\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * Checks if a node has a return statement. Void return does not count.\n * @param {ESTreeOrTypeScriptNode|null|undefined} node\n * @param {PromiseFilter} promFilter\n * @returns {undefined|boolean|ESTreeOrTypeScriptNode}\n */\n// eslint-disable-next-line complexity\nconst allBrancheshaveReturnValues = (node, promFilter) => {\n if (!node) {\n return false;\n }\n\n switch (node.type) {\n // case 'MethodDefinition':\n // return allBrancheshaveReturnValues(node.value, promFilter);\n case 'ArrowFunctionExpression':\n case 'FunctionDeclaration':\n case 'FunctionExpression': {\n return 'expression' in node && node.expression && (!isNewPromiseExpression(node.body) || !isVoidPromise(node.body)) ||\n allBrancheshaveReturnValues(node.body, promFilter) ||\n /** @type {import('@typescript-eslint/types').TSESTree.BlockStatement} */\n (node.body).body.some((nde) => {\n return nde.type === 'ReturnStatement';\n });\n }\n\n case 'BlockStatement': {\n const lastBodyNode = node.body.slice(-1)[0];\n return allBrancheshaveReturnValues(lastBodyNode, promFilter);\n }\n\n case 'DoWhileStatement':\n case 'WhileStatement':\n if (\n /**\n * @type {import('@typescript-eslint/types').TSESTree.Literal}\n */\n (node.test).value === true\n ) {\n // If this is an infinite loop, we assume only one branch\n // is needed to provide a return\n return hasReturnValue(node.body, false, promFilter);\n }\n\n // Fallthrough\n case 'ForStatement':\n if (node.test === null) {\n // If this is an infinite loop, we assume only one branch\n // is needed to provide a return\n return hasReturnValue(node.body, false, promFilter);\n }\n\n case 'ForInStatement':\n case 'ForOfStatement':\n\n case 'LabeledStatement':\n\n case 'WithStatement': {\n return allBrancheshaveReturnValues(node.body, promFilter);\n }\n\n case 'IfStatement': {\n return allBrancheshaveReturnValues(node.consequent, promFilter) &&\n allBrancheshaveReturnValues(node.alternate, promFilter);\n }\n\n case 'ReturnStatement': {\n // void return does not count.\n if (node.argument === null) {\n return false;\n }\n\n if (promFilter && isNewPromiseExpression(node.argument)) {\n // Let caller decide how to filter, but this is, at the least,\n // a return of sorts and truthy\n return promFilter(node.argument);\n }\n\n return true;\n }\n\n case 'SwitchStatement': {\n return /** @type {import('@typescript-eslint/types').TSESTree.SwitchStatement} */ (node).cases.every(\n (someCase) => {\n return !someCase.consequent.some((consNode) => {\n return consNode.type === 'BreakStatement' ||\n consNode.type === 'ReturnStatement' && consNode.argument === null;\n });\n },\n );\n }\n\n case 'ThrowStatement': {\n return true;\n }\n\n case 'TryStatement': {\n // If `finally` returns, all return\n return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||\n // Return in `try`/`catch` may still occur despite `finally`\n allBrancheshaveReturnValues(node.block, promFilter) &&\n (!node.handler ||\n allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&\n (!node.finalizer || (() => {\n try {\n hasReturnValue(node.finalizer, true, promFilter);\n } catch (error) {\n if (/** @type {Error} */ (error).message === 'Null return') {\n return false;\n }\n /* c8 ignore next 3 */\n // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n throw error;\n }\n\n // As long as not an explicit empty return, then return true\n return true;\n })());\n }\n\n case 'TSDeclareFunction':\n\n case 'TSFunctionType':\n\n case 'TSMethodSignature': {\n const type = node?.returnType?.typeAnnotation?.type;\n return type && !undefinedKeywords.has(type);\n }\n\n default: {\n return false;\n }\n }\n};\n\n/**\n * @callback PromiseFilter\n * @param {ESTreeOrTypeScriptNode|undefined} node\n * @returns {boolean}\n */\n\n/**\n * Avoids further checking child nodes if a nested function shadows the\n * resolver, but otherwise, if name is used (by call or passed in as an\n * argument to another function), will be considered as non-empty.\n *\n * This could check for redeclaration of the resolver, but as such is\n * unlikely, we avoid the performance cost of checking everywhere for\n * (re)declarations or assignments.\n * @param {import('@typescript-eslint/types').TSESTree.Node|null|undefined} node\n * @param {string} resolverName\n * @returns {boolean}\n */\n// eslint-disable-next-line complexity\nconst hasNonEmptyResolverCall = (node, resolverName) => {\n if (!node) {\n return false;\n }\n\n // Arrow function without block\n switch (node.type) {\n case 'ArrayExpression':\n case 'ArrayPattern':\n return node.elements.some((element) => {\n return hasNonEmptyResolverCall(element, resolverName);\n });\n case 'ArrowFunctionExpression':\n case 'FunctionDeclaration':\n case 'FunctionExpression': {\n // Shadowing\n if (/** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n node.params[0]\n )?.name === resolverName) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n case 'AssignmentExpression':\n case 'BinaryExpression':\n case 'LogicalExpression': {\n return hasNonEmptyResolverCall(node.left, resolverName) ||\n hasNonEmptyResolverCall(node.right, resolverName);\n }\n\n case 'AssignmentPattern':\n return hasNonEmptyResolverCall(node.right, resolverName);\n case 'AwaitExpression':\n\n case 'SpreadElement':\n case 'UnaryExpression':\n case 'YieldExpression':\n return hasNonEmptyResolverCall(node.argument, resolverName);\n case 'BlockStatement':\n case 'ClassBody':\n return node.body.some((bodyNode) => {\n return hasNonEmptyResolverCall(bodyNode, resolverName);\n });\n /* c8 ignore next 2 -- In Babel? */\n case 'CallExpression':\n // @ts-expect-error Babel?\n case 'OptionalCallExpression':\n return /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n node.callee\n ).name === resolverName && (\n\n // Implicit or explicit undefined\n node.arguments.length > 1 || node.arguments[0] !== undefined\n ) ||\n node.arguments.some((nde) => {\n // Being passed in to another function (which might invoke it)\n return nde.type === 'Identifier' && nde.name === resolverName ||\n\n // Handle nested items\n hasNonEmptyResolverCall(nde, resolverName);\n });\n\n case 'ChainExpression':\n case 'Decorator':\n\n case 'ExpressionStatement':\n return hasNonEmptyResolverCall(node.expression, resolverName);\n\n case 'ClassDeclaration':\n\n case 'ClassExpression':\n return hasNonEmptyResolverCall(node.body, resolverName);\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ClassMethod':\n\n case 'MethodDefinition':\n return node.decorators && node.decorators.some((decorator) => {\n return hasNonEmptyResolverCall(decorator, resolverName);\n }) ||\n node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ClassProperty':\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ObjectProperty':\n case 'Property':\n\n case 'PropertyDefinition':\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n hasNonEmptyResolverCall(node.value, resolverName);\n case 'ConditionalExpression':\n\n case 'IfStatement': {\n return hasNonEmptyResolverCall(node.test, resolverName) ||\n hasNonEmptyResolverCall(node.consequent, resolverName) ||\n hasNonEmptyResolverCall(node.alternate, resolverName);\n }\n\n case 'DoWhileStatement':\n case 'ForInStatement':\n case 'ForOfStatement':\n\n case 'ForStatement':\n case 'LabeledStatement':\n case 'WhileStatement':\n case 'WithStatement': {\n return hasNonEmptyResolverCall(node.body, resolverName);\n }\n\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'Import':\n\n case 'ImportExpression':\n return hasNonEmptyResolverCall(node.source, resolverName);\n // ?.\n /* c8 ignore next 2 -- In Babel? */\n case 'MemberExpression':\n\n // @ts-expect-error Babel?\n case 'OptionalMemberExpression':\n return hasNonEmptyResolverCall(node.object, resolverName) ||\n hasNonEmptyResolverCall(node.property, resolverName);\n case 'ObjectExpression':\n case 'ObjectPattern':\n return node.properties.some((property) => {\n return hasNonEmptyResolverCall(property, resolverName);\n });\n /* c8 ignore next 2 -- In Babel? */\n // @ts-expect-error Babel?\n case 'ObjectMethod':\n /* c8 ignore next 6 -- In Babel? */\n // @ts-expect-error\n return node.computed && hasNonEmptyResolverCall(node.key, resolverName) ||\n // @ts-expect-error\n node.arguments.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n\n case 'ReturnStatement': {\n if (node.argument === null) {\n return false;\n }\n\n return hasNonEmptyResolverCall(node.argument, resolverName);\n }\n\n // Comma\n case 'SequenceExpression':\n\n case 'TemplateLiteral':\n return node.expressions.some((subExpression) => {\n return hasNonEmptyResolverCall(subExpression, resolverName);\n });\n\n case 'SwitchStatement': {\n return node.cases.some(\n (someCase) => {\n return someCase.consequent.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n },\n );\n }\n\n case 'TaggedTemplateExpression':\n return hasNonEmptyResolverCall(node.quasi, resolverName);\n\n case 'TryStatement': {\n return hasNonEmptyResolverCall(node.block, resolverName) ||\n hasNonEmptyResolverCall(node.handler && node.handler.body, resolverName) ||\n hasNonEmptyResolverCall(node.finalizer, resolverName);\n }\n\n case 'VariableDeclaration': {\n return node.declarations.some((nde) => {\n return hasNonEmptyResolverCall(nde, resolverName);\n });\n }\n\n case 'VariableDeclarator': {\n return hasNonEmptyResolverCall(node.id, resolverName) ||\n hasNonEmptyResolverCall(node.init, resolverName);\n }\n\n /*\n // Shouldn't need to parse literals/literal components, etc.\n\n case 'Identifier':\n case 'TemplateElement':\n case 'Super':\n // Exports not relevant in this context\n */\n default:\n return false;\n }\n};\n\n/**\n * Checks if a Promise executor has no resolve value or an empty value.\n * An `undefined` resolve does not count.\n * @param {ESTreeOrTypeScriptNode} node\n * @param {boolean} anyPromiseAsReturn\n * @param {boolean} [allBranches]\n * @returns {boolean}\n */\nconst hasValueOrExecutorHasNonEmptyResolveValue = (node, anyPromiseAsReturn, allBranches) => {\n const hasReturnMethod = allBranches ?\n /**\n * @param {ESTreeOrTypeScriptNode} nde\n * @param {PromiseFilter} promiseFilter\n * @returns {boolean}\n */\n (nde, promiseFilter) => {\n let hasReturn;\n try {\n hasReturn = hasReturnValue(nde, true, promiseFilter);\n } catch (error) {\n // c8 ignore else\n if (/** @type {Error} */ (error).message === 'Null return') {\n return false;\n }\n /* c8 ignore next 3 */\n // eslint-disable-next-line @stylistic/padding-line-between-statements -- c8\n throw error;\n }\n\n // `hasReturn` check needed since `throw` treated as valid return by\n // `allBrancheshaveReturnValues`\n return Boolean(hasReturn && allBrancheshaveReturnValues(nde, promiseFilter));\n } :\n /**\n * @param {ESTreeOrTypeScriptNode} nde\n * @param {PromiseFilter} promiseFilter\n * @returns {boolean}\n */\n (nde, promiseFilter) => {\n return Boolean(hasReturnValue(nde, false, promiseFilter));\n };\n\n return hasReturnMethod(node, (prom) => {\n if (anyPromiseAsReturn) {\n return true;\n }\n\n if (isVoidPromise(prom)) {\n return false;\n }\n\n const {\n body,\n params,\n } =\n /**\n * @type {import('@typescript-eslint/types').TSESTree.FunctionExpression|\n * import('@typescript-eslint/types').TSESTree.ArrowFunctionExpression}\n */ (\n /** @type {import('@typescript-eslint/types').TSESTree.NewExpression} */ (\n prom\n ).arguments[0]\n ) || {};\n\n if (!params?.length) {\n return false;\n }\n\n const {\n name: resolverName,\n } = /** @type {import('@typescript-eslint/types').TSESTree.Identifier} */ (\n params[0]\n );\n\n return hasNonEmptyResolverCall(body, resolverName);\n });\n};\n\nexport {\n hasReturnValue,\n hasValueOrExecutorHasNonEmptyResolveValue,\n};\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
},
|
|
19
19
|
"description": "JSDoc linting rules for ESLint.",
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@
|
|
21
|
+
"@babel/cli": "^7.27.2",
|
|
22
22
|
"@babel/core": "^7.27.4",
|
|
23
23
|
"@babel/eslint-parser": "^7.27.5",
|
|
24
|
+
"@babel/node": "^7.27.1",
|
|
24
25
|
"@babel/plugin-syntax-class-properties": "^7.12.13",
|
|
25
26
|
"@babel/plugin-transform-flow-strip-types": "^7.27.1",
|
|
26
27
|
"@babel/preset-env": "^7.27.2",
|
|
@@ -62,12 +63,11 @@
|
|
|
62
63
|
"lodash.defaultsdeep": "^4.6.1",
|
|
63
64
|
"mocha": "^11.7.0",
|
|
64
65
|
"open-editor": "^5.1.0",
|
|
65
|
-
"
|
|
66
|
+
"replace": "^1.2.2",
|
|
67
|
+
"rimraf": "^6.0.1",
|
|
66
68
|
"semantic-release": "^24.2.5",
|
|
67
|
-
"tsdown": "^0.13.4",
|
|
68
69
|
"typescript": "5.8.3",
|
|
69
|
-
"typescript-eslint": "^8.34.1"
|
|
70
|
-
"unplugin-unused": "^0.5.1"
|
|
70
|
+
"typescript-eslint": "^8.34.1"
|
|
71
71
|
},
|
|
72
72
|
"engines": {
|
|
73
73
|
"node": ">=20.11.0"
|
|
@@ -82,42 +82,25 @@
|
|
|
82
82
|
"*.js": "eslint --fix"
|
|
83
83
|
},
|
|
84
84
|
"type": "module",
|
|
85
|
+
"main": "./dist/index.cjs",
|
|
86
|
+
"types": "./dist/index.d.ts",
|
|
85
87
|
"exports": {
|
|
86
88
|
".": {
|
|
87
|
-
"
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
},
|
|
91
|
-
"default": {
|
|
92
|
-
"types": "./dist/index.d.cts",
|
|
93
|
-
"default": "./dist/index.cjs"
|
|
94
|
-
}
|
|
89
|
+
"types": "./dist/index.d.ts",
|
|
90
|
+
"import": "./src/index.js",
|
|
91
|
+
"require": "./dist/index.cjs"
|
|
95
92
|
},
|
|
96
93
|
"./getJsdocProcessorPlugin.js": {
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
},
|
|
101
|
-
"default": {
|
|
102
|
-
"types": "./dist/getJsdocProcessorPlugin.d.cts",
|
|
103
|
-
"default": "./dist/getJsdocProcessorPlugin.cjs"
|
|
104
|
-
}
|
|
94
|
+
"types": "./dist/getJsdocProcessorPlugin.d.ts",
|
|
95
|
+
"import": "./dist/getJsdocProcessorPlugin.cjs",
|
|
96
|
+
"require": "./src/getJsdocProcessorPlugin.js"
|
|
105
97
|
},
|
|
106
98
|
"./iterateJsdoc.js": {
|
|
107
|
-
"
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"default": {
|
|
112
|
-
"types": "./dist/iterateJsdoc.d.cts",
|
|
113
|
-
"default": "./dist/iterateJsdoc.cjs"
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
"./package.json": "./package.json"
|
|
99
|
+
"types": "./dist/iterateJsdoc.d.ts",
|
|
100
|
+
"import": "./dist/iterateJsdoc.cjs",
|
|
101
|
+
"require": "./src/iterateJsdoc.js"
|
|
102
|
+
}
|
|
117
103
|
},
|
|
118
|
-
"files": [
|
|
119
|
-
"dist/"
|
|
120
|
-
],
|
|
121
104
|
"name": "eslint-plugin-jsdoc",
|
|
122
105
|
"mocha": {
|
|
123
106
|
"reporter": "dot",
|
|
@@ -156,11 +139,12 @@
|
|
|
156
139
|
},
|
|
157
140
|
"scripts": {
|
|
158
141
|
"tsc": "tsc",
|
|
159
|
-
"build": "
|
|
160
|
-
"
|
|
161
|
-
"
|
|
162
|
-
"create-
|
|
163
|
-
"create-
|
|
142
|
+
"tsc-build": "tsc -p tsconfig-prod.json",
|
|
143
|
+
"build": "rimraf ./dist && NODE_ENV=production babel ./src --out-file-extension .cjs --out-dir ./dist --copy-files --source-maps --ignore ./src/bin/*.js --no-copy-ignored && replace 'require\\(\"\\.(.*?)\\.[^.]*?\"\\)' 'require(\".$1.cjs\")' 'dist' -r --include=\"*.cjs\" && pnpm tsc-build",
|
|
144
|
+
"check-docs": "babel-node ./src/bin/generateDocs.js --check",
|
|
145
|
+
"create-docs": "pnpm run create-options && babel-node ./src/bin/generateDocs.js",
|
|
146
|
+
"create-rule": "babel-node ./src/bin/generateRule.js",
|
|
147
|
+
"create-options": "node ./src/bin/generateOptions.mjs",
|
|
164
148
|
"install-offline": "pnpm install --prefer-offline --no-audit",
|
|
165
149
|
"lint": "eslint",
|
|
166
150
|
"lint-fix": "eslint --fix",
|
|
@@ -170,5 +154,5 @@
|
|
|
170
154
|
"test-cov": "TIMING=1 c8 --reporter text pnpm run test-no-cov",
|
|
171
155
|
"test-index": "pnpm run test-no-cov test/rules/index.js"
|
|
172
156
|
},
|
|
173
|
-
"version": "
|
|
157
|
+
"version": "54.0.0"
|
|
174
158
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const WarnSettings = function () {
|
|
2
|
+
/** @type {WeakMap<object, Set<string>>} */
|
|
3
|
+
const warnedSettings = new WeakMap();
|
|
4
|
+
|
|
5
|
+
return {
|
|
6
|
+
/**
|
|
7
|
+
* Warn only once for each context and setting
|
|
8
|
+
* @param {{}} context
|
|
9
|
+
* @param {string} setting
|
|
10
|
+
* @returns {boolean}
|
|
11
|
+
*/
|
|
12
|
+
hasBeenWarned (context, setting) {
|
|
13
|
+
return warnedSettings.has(context) && /** @type {Set<string>} */ (
|
|
14
|
+
warnedSettings.get(context)
|
|
15
|
+
).has(setting);
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {{}} context
|
|
20
|
+
* @param {string} setting
|
|
21
|
+
* @returns {void}
|
|
22
|
+
*/
|
|
23
|
+
markSettingAsWarned (context, setting) {
|
|
24
|
+
// c8 ignore else
|
|
25
|
+
if (!warnedSettings.has(context)) {
|
|
26
|
+
warnedSettings.set(context, new Set());
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** @type {Set<string>} */ (warnedSettings.get(context)).add(setting);
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export default WarnSettings;
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform based on https://github.com/syavorsky/comment-parser/blob/master/src/transforms/align.ts
|
|
3
|
+
*
|
|
4
|
+
* It contains some customizations to align based on the tags, and some custom options.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
// `comment-parser/primitives` export
|
|
9
|
+
util,
|
|
10
|
+
} from 'comment-parser';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {{
|
|
14
|
+
* hasNoTypes: boolean,
|
|
15
|
+
* maxNamedTagLength: import('./iterateJsdoc.js').Integer,
|
|
16
|
+
* maxUnnamedTagLength: import('./iterateJsdoc.js').Integer
|
|
17
|
+
* }} TypelessInfo
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const {
|
|
21
|
+
rewireSource,
|
|
22
|
+
} = util;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {{
|
|
26
|
+
* name: import('./iterateJsdoc.js').Integer,
|
|
27
|
+
* start: import('./iterateJsdoc.js').Integer,
|
|
28
|
+
* tag: import('./iterateJsdoc.js').Integer,
|
|
29
|
+
* type: import('./iterateJsdoc.js').Integer
|
|
30
|
+
* }} Width
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/** @type {Width} */
|
|
34
|
+
const zeroWidth = {
|
|
35
|
+
name: 0,
|
|
36
|
+
start: 0,
|
|
37
|
+
tag: 0,
|
|
38
|
+
type: 0,
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @param {string[]} tags
|
|
43
|
+
* @param {import('./iterateJsdoc.js').Integer} index
|
|
44
|
+
* @param {import('comment-parser').Line[]} source
|
|
45
|
+
* @returns {boolean}
|
|
46
|
+
*/
|
|
47
|
+
const shouldAlign = (tags, index, source) => {
|
|
48
|
+
const tag = source[index].tokens.tag.replace('@', '');
|
|
49
|
+
const includesTag = tags.includes(tag);
|
|
50
|
+
|
|
51
|
+
if (includesTag) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (tag !== '') {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
for (let iterator = index; iterator >= 0; iterator--) {
|
|
60
|
+
const previousTag = source[iterator].tokens.tag.replace('@', '');
|
|
61
|
+
|
|
62
|
+
if (previousTag !== '') {
|
|
63
|
+
if (tags.includes(previousTag)) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return true;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @param {string[]} tags
|
|
76
|
+
* @returns {(
|
|
77
|
+
* width: Width,
|
|
78
|
+
* line: {
|
|
79
|
+
* tokens: import('comment-parser').Tokens
|
|
80
|
+
* },
|
|
81
|
+
* index: import('./iterateJsdoc.js').Integer,
|
|
82
|
+
* source: import('comment-parser').Line[]
|
|
83
|
+
* ) => Width}
|
|
84
|
+
*/
|
|
85
|
+
const getWidth = (tags) => {
|
|
86
|
+
return (width, {
|
|
87
|
+
tokens,
|
|
88
|
+
}, index, source) => {
|
|
89
|
+
if (!shouldAlign(tags, index, source)) {
|
|
90
|
+
return width;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
name: Math.max(width.name, tokens.name.length),
|
|
95
|
+
start: tokens.delimiter === '/**' ? tokens.start.length : width.start,
|
|
96
|
+
tag: Math.max(width.tag, tokens.tag.length),
|
|
97
|
+
type: Math.max(width.type, tokens.type.length),
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @param {{
|
|
104
|
+
* description: string;
|
|
105
|
+
* tags: import('comment-parser').Spec[];
|
|
106
|
+
* problems: import('comment-parser').Problem[];
|
|
107
|
+
* }} fields
|
|
108
|
+
* @returns {TypelessInfo}
|
|
109
|
+
*/
|
|
110
|
+
const getTypelessInfo = (fields) => {
|
|
111
|
+
const hasNoTypes = fields.tags.every(({
|
|
112
|
+
type,
|
|
113
|
+
}) => {
|
|
114
|
+
return !type;
|
|
115
|
+
});
|
|
116
|
+
const maxNamedTagLength = Math.max(...fields.tags.map(({
|
|
117
|
+
name,
|
|
118
|
+
tag,
|
|
119
|
+
}) => {
|
|
120
|
+
return name.length === 0 ? -1 : tag.length;
|
|
121
|
+
}).filter((length) => {
|
|
122
|
+
return length !== -1;
|
|
123
|
+
})) + 1;
|
|
124
|
+
const maxUnnamedTagLength = Math.max(...fields.tags.map(({
|
|
125
|
+
name,
|
|
126
|
+
tag,
|
|
127
|
+
}) => {
|
|
128
|
+
return name.length === 0 ? tag.length : -1;
|
|
129
|
+
}).filter((length) => {
|
|
130
|
+
return length !== -1;
|
|
131
|
+
})) + 1;
|
|
132
|
+
return {
|
|
133
|
+
hasNoTypes,
|
|
134
|
+
maxNamedTagLength,
|
|
135
|
+
maxUnnamedTagLength,
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @param {import('./iterateJsdoc.js').Integer} len
|
|
141
|
+
* @returns {string}
|
|
142
|
+
*/
|
|
143
|
+
const space = (len) => {
|
|
144
|
+
return ''.padStart(len, ' ');
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* @param {{
|
|
149
|
+
* customSpacings: import('../src/rules/checkLineAlignment.js').CustomSpacings,
|
|
150
|
+
* tags: string[],
|
|
151
|
+
* indent: string,
|
|
152
|
+
* preserveMainDescriptionPostDelimiter: boolean,
|
|
153
|
+
* wrapIndent: string,
|
|
154
|
+
* disableWrapIndent: boolean,
|
|
155
|
+
* }} cfg
|
|
156
|
+
* @returns {(
|
|
157
|
+
* block: import('comment-parser').Block
|
|
158
|
+
* ) => import('comment-parser').Block}
|
|
159
|
+
*/
|
|
160
|
+
const alignTransform = ({
|
|
161
|
+
customSpacings,
|
|
162
|
+
disableWrapIndent,
|
|
163
|
+
indent,
|
|
164
|
+
preserveMainDescriptionPostDelimiter,
|
|
165
|
+
tags,
|
|
166
|
+
wrapIndent,
|
|
167
|
+
}) => {
|
|
168
|
+
let intoTags = false;
|
|
169
|
+
/** @type {Width} */
|
|
170
|
+
let width;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @param {import('comment-parser').Tokens} tokens
|
|
174
|
+
* @param {TypelessInfo} typelessInfo
|
|
175
|
+
* @returns {import('comment-parser').Tokens}
|
|
176
|
+
*/
|
|
177
|
+
const alignTokens = (tokens, typelessInfo) => {
|
|
178
|
+
const nothingAfter = {
|
|
179
|
+
delim: false,
|
|
180
|
+
name: false,
|
|
181
|
+
tag: false,
|
|
182
|
+
type: false,
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
if (tokens.description === '') {
|
|
186
|
+
nothingAfter.name = true;
|
|
187
|
+
tokens.postName = '';
|
|
188
|
+
|
|
189
|
+
if (tokens.name === '') {
|
|
190
|
+
nothingAfter.type = true;
|
|
191
|
+
tokens.postType = '';
|
|
192
|
+
|
|
193
|
+
if (tokens.type === '') {
|
|
194
|
+
nothingAfter.tag = true;
|
|
195
|
+
tokens.postTag = '';
|
|
196
|
+
|
|
197
|
+
/* c8 ignore next: Never happens because the !intoTags return. But it's here for consistency with the original align transform */
|
|
198
|
+
if (tokens.tag === '') {
|
|
199
|
+
nothingAfter.delim = true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
let untypedNameAdjustment = 0;
|
|
206
|
+
let untypedTypeAdjustment = 0;
|
|
207
|
+
if (typelessInfo.hasNoTypes) {
|
|
208
|
+
nothingAfter.tag = true;
|
|
209
|
+
tokens.postTag = '';
|
|
210
|
+
if (tokens.name === '') {
|
|
211
|
+
untypedNameAdjustment = typelessInfo.maxNamedTagLength - tokens.tag.length;
|
|
212
|
+
} else {
|
|
213
|
+
untypedNameAdjustment = typelessInfo.maxNamedTagLength > typelessInfo.maxUnnamedTagLength ? 0 :
|
|
214
|
+
Math.max(0, typelessInfo.maxUnnamedTagLength - (tokens.tag.length + tokens.name.length + 1));
|
|
215
|
+
untypedTypeAdjustment = typelessInfo.maxNamedTagLength - tokens.tag.length;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Todo: Avoid fixing alignment of blocks with multiline wrapping of type
|
|
220
|
+
if (tokens.tag === '' && tokens.type) {
|
|
221
|
+
return tokens;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const spacings = {
|
|
225
|
+
postDelimiter: customSpacings?.postDelimiter || 1,
|
|
226
|
+
postName: customSpacings?.postName || 1,
|
|
227
|
+
postTag: customSpacings?.postTag || 1,
|
|
228
|
+
postType: customSpacings?.postType || 1,
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
tokens.postDelimiter = nothingAfter.delim ? '' : space(spacings.postDelimiter);
|
|
232
|
+
|
|
233
|
+
if (!nothingAfter.tag) {
|
|
234
|
+
tokens.postTag = space(width.tag - tokens.tag.length + spacings.postTag);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if (!nothingAfter.type) {
|
|
238
|
+
tokens.postType = space(width.type - tokens.type.length + spacings.postType + untypedTypeAdjustment);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (!nothingAfter.name) {
|
|
242
|
+
// If post name is empty for all lines (name width 0), don't add post name spacing.
|
|
243
|
+
tokens.postName = width.name === 0 ? '' : space(width.name - tokens.name.length + spacings.postName + untypedNameAdjustment);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return tokens;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* @param {import('comment-parser').Line} line
|
|
251
|
+
* @param {import('./iterateJsdoc.js').Integer} index
|
|
252
|
+
* @param {import('comment-parser').Line[]} source
|
|
253
|
+
* @param {TypelessInfo} typelessInfo
|
|
254
|
+
* @param {string|false} indentTag
|
|
255
|
+
* @returns {import('comment-parser').Line}
|
|
256
|
+
*/
|
|
257
|
+
const update = (line, index, source, typelessInfo, indentTag) => {
|
|
258
|
+
/** @type {import('comment-parser').Tokens} */
|
|
259
|
+
const tokens = {
|
|
260
|
+
...line.tokens,
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
if (tokens.tag !== '') {
|
|
264
|
+
intoTags = true;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const isEmpty =
|
|
268
|
+
tokens.tag === '' &&
|
|
269
|
+
tokens.name === '' &&
|
|
270
|
+
tokens.type === '' &&
|
|
271
|
+
tokens.description === '';
|
|
272
|
+
|
|
273
|
+
// dangling '*/'
|
|
274
|
+
if (tokens.end === '*/' && isEmpty) {
|
|
275
|
+
tokens.start = indent + ' ';
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
...line,
|
|
279
|
+
tokens,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
switch (tokens.delimiter) {
|
|
284
|
+
case '*':
|
|
285
|
+
tokens.start = indent + ' ';
|
|
286
|
+
break;
|
|
287
|
+
case '/**':
|
|
288
|
+
tokens.start = indent;
|
|
289
|
+
break;
|
|
290
|
+
default:
|
|
291
|
+
tokens.delimiter = '';
|
|
292
|
+
|
|
293
|
+
// compensate delimiter
|
|
294
|
+
tokens.start = indent + ' ';
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (!intoTags) {
|
|
298
|
+
if (tokens.description === '') {
|
|
299
|
+
tokens.postDelimiter = '';
|
|
300
|
+
} else if (!preserveMainDescriptionPostDelimiter) {
|
|
301
|
+
tokens.postDelimiter = ' ';
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return {
|
|
305
|
+
...line,
|
|
306
|
+
tokens,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const postHyphenSpacing = customSpacings?.postHyphen ?? 1;
|
|
311
|
+
const hyphenSpacing = /^\s*-\s+/v;
|
|
312
|
+
tokens.description = tokens.description.replace(
|
|
313
|
+
hyphenSpacing, '-' + ''.padStart(postHyphenSpacing, ' '),
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Not align.
|
|
317
|
+
if (shouldAlign(tags, index, source)) {
|
|
318
|
+
alignTokens(tokens, typelessInfo);
|
|
319
|
+
if (!disableWrapIndent && indentTag) {
|
|
320
|
+
tokens.postDelimiter += wrapIndent;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return {
|
|
325
|
+
...line,
|
|
326
|
+
tokens,
|
|
327
|
+
};
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
return ({
|
|
331
|
+
source,
|
|
332
|
+
...fields
|
|
333
|
+
}) => {
|
|
334
|
+
width = source.reduce(getWidth(tags), {
|
|
335
|
+
...zeroWidth,
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
const typelessInfo = getTypelessInfo(fields);
|
|
339
|
+
|
|
340
|
+
let tagIndentMode = false;
|
|
341
|
+
|
|
342
|
+
return rewireSource({
|
|
343
|
+
...fields,
|
|
344
|
+
source: source.map((line, index) => {
|
|
345
|
+
const indentTag = !disableWrapIndent && tagIndentMode && !line.tokens.tag && line.tokens.description;
|
|
346
|
+
const ret = update(line, index, source, typelessInfo, indentTag);
|
|
347
|
+
|
|
348
|
+
if (!disableWrapIndent && line.tokens.tag) {
|
|
349
|
+
tagIndentMode = true;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return ret;
|
|
353
|
+
}),
|
|
354
|
+
});
|
|
355
|
+
};
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
export default alignTransform;
|