blob: 6fcf85df65a6b8b79541e4b6c942b5b7ccb9f6bf [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 }; }
var _default = (0, _iterateJsdoc.default)(({
jsdoc,
utils
}) => {
const functionParameterNames = utils.getFunctionParameterNames();
const jsdocParameterNames = utils.getJsdocTags('param');
if (!jsdocParameterNames) {
return;
}
if (utils.avoidDocs()) {
return;
} // Param type is specified by type in @type
if (utils.hasTag('type')) {
return;
}
const preferredTagName = utils.getPreferredTagName({
tagName: 'param'
});
const findExpectedIndex = (jsdocTags, indexAtFunctionParams) => {
const functionTags = jsdocTags.filter(({
tag
}) => {
return tag === preferredTagName;
});
let expectedIndex = jsdocTags.length;
jsdocTags.forEach((tag, index) => {
if (tag.tag === preferredTagName) {
expectedIndex = index;
if (functionTags.indexOf(tag) < indexAtFunctionParams) {
expectedIndex += 1;
}
}
});
return expectedIndex;
};
const missingTags = [];
functionParameterNames.forEach((functionParameterName, functionParameterIdx) => {
if (['<ObjectPattern>', '<ArrayPattern>'].includes(functionParameterName)) {
return;
}
if (jsdocParameterNames && !jsdocParameterNames.find(({
name
}) => {
return name === functionParameterName;
})) {
missingTags.push({
functionParameterIdx,
functionParameterName
});
}
});
const fixAll = (missings, tags) => {
missings.forEach(({
functionParameterIdx,
functionParameterName
}) => {
const expectedIdx = findExpectedIndex(tags, functionParameterIdx);
tags.splice(expectedIdx, 0, {
name: functionParameterName,
tag: preferredTagName
});
});
};
missingTags.forEach(({
functionParameterName
}, index) => {
// Fix all missing tags the first time.
const fixer = index > 0 ? null : () => {
if (!jsdoc.tags) {
jsdoc.tags = [];
}
fixAll(missingTags, jsdoc.tags);
};
utils.reportJSDoc(`Missing JSDoc @${preferredTagName} "${functionParameterName}" declaration.`, null, fixer);
});
}, {
meta: {
fixable: 'code',
schema: [{
additionalProperties: false,
properties: {
exemptedBy: {
items: {
type: 'string'
},
type: 'array'
}
},
type: 'object'
}],
type: 'suggestion'
}
});
exports.default = _default;
module.exports = exports.default;
//# sourceMappingURL=requireParam.js.map