blob: 5af7da659913627109a456bb3ababc5fb3ead1bc [file] [log] [blame]
{"version":3,"sources":["../../src/rules/requireParam.js"],"names":["jsdoc","utils","functionParameterNames","getFunctionParameterNames","jsdocParameterNames","getJsdocTags","avoidDocs","hasTag","preferredTagName","getPreferredTagName","tagName","findExpectedIndex","jsdocTags","indexAtFunctionParams","functionTags","filter","tag","expectedIndex","length","forEach","index","indexOf","missingTags","functionParameterName","functionParameterIdx","includes","find","name","push","fixAll","missings","tags","expectedIdx","splice","fixer","reportJSDoc","meta","fixable","schema","additionalProperties","properties","exemptedBy","items","type"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nexport default iterateJsdoc(({\n jsdoc,\n utils,\n}) => {\n const functionParameterNames = utils.getFunctionParameterNames();\n const jsdocParameterNames = utils.getJsdocTags('param');\n if (!jsdocParameterNames) {\n return;\n }\n\n if (utils.avoidDocs()) {\n return;\n }\n\n // Param type is specified by type in @type\n if (utils.hasTag('type')) {\n return;\n }\n\n const preferredTagName = utils.getPreferredTagName({tagName: 'param'});\n\n const findExpectedIndex = (jsdocTags, indexAtFunctionParams) => {\n const functionTags = jsdocTags.filter(({tag}) => {\n return tag === preferredTagName;\n });\n let expectedIndex = jsdocTags.length;\n jsdocTags.forEach((tag, index) => {\n if (tag.tag === preferredTagName) {\n expectedIndex = index;\n if (functionTags.indexOf(tag) < indexAtFunctionParams) {\n expectedIndex += 1;\n }\n }\n });\n\n return expectedIndex;\n };\n\n const missingTags = [];\n\n functionParameterNames.forEach((functionParameterName, functionParameterIdx) => {\n if (['<ObjectPattern>', '<ArrayPattern>'].includes(functionParameterName)) {\n return;\n }\n\n if (jsdocParameterNames && !jsdocParameterNames.find(({name}) => {\n return name === functionParameterName;\n })) {\n missingTags.push({\n functionParameterIdx,\n functionParameterName,\n });\n }\n });\n\n const fixAll = (missings, tags) => {\n missings.forEach(({functionParameterIdx, functionParameterName}) => {\n const expectedIdx = findExpectedIndex(tags, functionParameterIdx);\n tags.splice(expectedIdx, 0, {\n name: functionParameterName,\n tag: preferredTagName,\n });\n });\n };\n\n missingTags.forEach(({functionParameterName}, index) => {\n // Fix all missing tags the first time.\n const fixer = index > 0 ? null : () => {\n if (!jsdoc.tags) {\n jsdoc.tags = [];\n }\n\n fixAll(missingTags, jsdoc.tags);\n };\n utils.reportJSDoc(`Missing JSDoc @${preferredTagName} \"${functionParameterName}\" declaration.`, null, fixer);\n });\n}, {\n meta: {\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n exemptedBy: {\n items: {\n type: 'string',\n },\n type: 'array',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"requireParam.js"}