blob: ffd18bfbbfbb174c656888d8ebb3e1bdc627cdfc [file] [log] [blame]
{"version":3,"sources":["../../src/rules/checkParamNames.js"],"names":["validateParameterNames","targetTagName","allowExtraTrailingParamDocs","functionParameterNames","jsdoc","jsdocNode","utils","report","paramTags","Object","entries","tags","filter","tag","paramTagsNonNested","name","includes","dotted","some","index","tagsIndex","dupeTagInfo","find","tgsIndex","tg","idx","reportJSDoc","splice","functionParameterName","trim","expectedNames","join","actualNames","map","validateParameterNamesDeep","jsdocParameterNames","lastRealParameter","jsdocParameterName","isPropertyPath","pathRootNodeName","slice","indexOf","endsWith","context","options","jsdocParameterNamesDeep","getJsdocTagsDeep","length","getFunctionParameterNames","getPreferredTagName","tagName","isError","meta","fixable","schema","additionalProperties","properties","type"],"mappings":"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","sourcesContent":["import iterateJsdoc from '../iterateJsdoc';\n\nconst validateParameterNames = (\n targetTagName : string, allowExtraTrailingParamDocs: boolean,\n functionParameterNames : Array<string>, jsdoc, jsdocNode, utils, report,\n) => {\n const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {\n return tag.tag === targetTagName;\n });\n const paramTagsNonNested = paramTags.filter(([, tag]) => {\n return !tag.name.includes('.');\n });\n\n let dotted = 0;\n\n return paramTags.some(([, tag], index) => {\n let tagsIndex;\n const dupeTagInfo = paramTags.find(([tgsIndex, tg], idx) => {\n tagsIndex = tgsIndex;\n\n return tg.name === tag.name && idx !== index;\n });\n if (dupeTagInfo) {\n utils.reportJSDoc(`Duplicate @${targetTagName} \"${tag.name}\"`, dupeTagInfo[1], () => {\n jsdoc.tags.splice(tagsIndex, 1);\n });\n\n return true;\n }\n if (tag.name.includes('.')) {\n dotted++;\n\n return false;\n }\n\n const functionParameterName = functionParameterNames[index - dotted];\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 (functionParameterName === '<ObjectPattern>' || functionParameterName === '<ArrayPattern>') {\n return false;\n }\n\n if (functionParameterName !== tag.name.trim()) {\n const expectedNames = functionParameterNames.join(', ');\n const actualNames = paramTagsNonNested.map(([, {name}]) => {\n return name.trim();\n }).join(', ');\n\n report(\n `Expected @${targetTagName} names to be \"${expectedNames}\". Got \"${actualNames}\".`,\n null,\n tag,\n );\n\n return true;\n }\n\n return false;\n });\n};\n\nconst validateParameterNamesDeep = (\n targetTagName : string, allowExtraTrailingParamDocs: boolean,\n jsdocParameterNames : Array<string>, jsdoc, report : Function,\n) => {\n let lastRealParameter;\n\n return jsdocParameterNames.some(({name: jsdocParameterName, idx}) => {\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\nexport default iterateJsdoc(({\n context,\n jsdoc,\n jsdocNode,\n report,\n utils,\n}) => {\n const {allowExtraTrailingParamDocs} = context.options[0] || {};\n\n const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');\n if (!jsdocParameterNamesDeep.length) {\n return;\n }\n const functionParameterNames = utils.getFunctionParameterNames();\n const targetTagName = utils.getPreferredTagName({tagName: 'param'});\n const isError = validateParameterNames(\n targetTagName, allowExtraTrailingParamDocs, functionParameterNames,\n jsdoc, jsdocNode, utils, report,\n );\n\n if (isError) {\n return;\n }\n\n validateParameterNamesDeep(\n targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep,\n jsdoc, report,\n );\n}, {\n meta: {\n fixable: 'code',\n schema: [\n {\n additionalProperties: false,\n properties: {\n allowExtraTrailingParamDocs: {\n type: 'boolean',\n },\n },\n type: 'object',\n },\n ],\n type: 'suggestion',\n },\n});\n"],"file":"checkParamNames.js"}