blob: 1de28e4c4480d2e728146801b1b897fece45bf8a [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const validateParameterNames = (targetTagName, allowExtraTrailingParamDocs, functionParameterNames, jsdoc, jsdocNode, utils, report) => {
const paramTags = Object.entries(jsdoc.tags).filter(([, tag]) => {
return tag.tag === targetTagName;
});
const paramTagsNonNested = paramTags.filter(([, tag]) => {
return !tag.name.includes('.');
});
let dotted = 0;
return paramTags.some(([, tag], index) => {
let tagsIndex;
const dupeTagInfo = paramTags.find(([tgsIndex, tg], idx) => {
tagsIndex = tgsIndex;
return tg.name === tag.name && idx !== index;
});
if (dupeTagInfo) {
utils.reportJSDoc(`Duplicate @${targetTagName} "${tag.name}"`, dupeTagInfo[1], () => {
jsdoc.tags.splice(tagsIndex, 1);
});
return true;
}
if (tag.name.includes('.')) {
dotted++;
return false;
}
const functionParameterName = functionParameterNames[index - dotted];
if (!functionParameterName) {
if (allowExtraTrailingParamDocs) {
return false;
}
report(`@${targetTagName} "${tag.name}" does not match an existing function parameter.`, null, tag);
return true;
}
if (functionParameterName === '<ObjectPattern>' || functionParameterName === '<ArrayPattern>') {
return false;
}
if (functionParameterName !== tag.name.trim()) {
const expectedNames = functionParameterNames.join(', ');
const actualNames = paramTagsNonNested.map(([, {
name
}]) => {
return name.trim();
}).join(', ');
report(`Expected @${targetTagName} names to be "${expectedNames}". Got "${actualNames}".`, null, tag);
return true;
}
return false;
});
};
const validateParameterNamesDeep = (targetTagName, allowExtraTrailingParamDocs, jsdocParameterNames, jsdoc, report) => {
let lastRealParameter;
return jsdocParameterNames.some(({
name: jsdocParameterName,
idx
}) => {
const isPropertyPath = jsdocParameterName.includes('.');
if (isPropertyPath) {
if (!lastRealParameter) {
report(`@${targetTagName} path declaration ("${jsdocParameterName}") appears before any real parameter.`, null, jsdoc.tags[idx]);
return true;
}
let pathRootNodeName = jsdocParameterName.slice(0, jsdocParameterName.indexOf('.'));
if (pathRootNodeName.endsWith('[]')) {
pathRootNodeName = pathRootNodeName.slice(0, -2);
}
if (pathRootNodeName !== lastRealParameter) {
report(`@${targetTagName} path declaration ("${jsdocParameterName}") root node name ("${pathRootNodeName}") ` + `does not match previous real parameter name ("${lastRealParameter}").`, null, jsdoc.tags[idx]);
return true;
}
} else {
lastRealParameter = jsdocParameterName;
}
return false;
});
};
var _default = (0, _iterateJsdoc.default)(({
context,
jsdoc,
jsdocNode,
report,
utils
}) => {
const _ref = context.options[0] || {},
allowExtraTrailingParamDocs = _ref.allowExtraTrailingParamDocs;
const jsdocParameterNamesDeep = utils.getJsdocTagsDeep('param');
if (!jsdocParameterNamesDeep.length) {
return;
}
const functionParameterNames = utils.getFunctionParameterNames();
const targetTagName = utils.getPreferredTagName({
tagName: 'param'
});
const isError = validateParameterNames(targetTagName, allowExtraTrailingParamDocs, functionParameterNames, jsdoc, jsdocNode, utils, report);
if (isError) {
return;
}
validateParameterNamesDeep(targetTagName, allowExtraTrailingParamDocs, jsdocParameterNamesDeep, jsdoc, report);
}, {
meta: {
fixable: 'code',
schema: [{
additionalProperties: false,
properties: {
allowExtraTrailingParamDocs: {
type: 'boolean'
}
},
type: 'object'
}],
type: 'suggestion'
}
});
exports.default = _default;
module.exports = exports.default;
//# sourceMappingURL=checkParamNames.js.map