eslint-plugin-jsdoc
Version:
JSDoc linting rules for ESLint.
173 lines (153 loc) • 4.74 kB
JavaScript
;
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)(({
context,
jsdoc,
utils
}) => {
const [alwaysNever = 'never', {
count = 1,
noEndLines = false,
tags = {}
} = {}] = context.options;
jsdoc.tags.some((tg, tagIdx) => {
let lastTag;
let reportIndex = null;
tg.source.forEach(({
tokens: {
tag,
name,
type,
description,
end
}
}, idx) => {
var _tags$lastTag$slice, _tags$lastTag$slice2;
// May be text after a line break within a tag description
if (description) {
reportIndex = null;
}
if (lastTag && ((_tags$lastTag$slice = tags[lastTag.slice(1)]) === null || _tags$lastTag$slice === void 0 ? void 0 : _tags$lastTag$slice.lines) === 'always') {
return;
}
if (!tag && !name && !type && !description && !end && (alwaysNever === 'never' || lastTag && ((_tags$lastTag$slice2 = tags[lastTag.slice(1)]) === null || _tags$lastTag$slice2 === void 0 ? void 0 : _tags$lastTag$slice2.lines) === 'never')) {
reportIndex = idx;
return;
}
lastTag = tag;
});
if (reportIndex !== null) {
const fixer = () => {
utils.removeTagItem(tagIdx, reportIndex);
};
utils.reportJSDoc('Expected no lines between tags', {
line: tg.source[0].number + 1
}, fixer);
return true;
}
return false;
});
(noEndLines ? jsdoc.tags.slice(0, -1) : jsdoc.tags).some((tg, tagIdx) => {
const lines = [];
let currentTag;
let tagSourceIdx = 0;
tg.source.forEach(({
number,
tokens: {
tag,
name,
type,
description,
end
}
}, idx) => {
if (description) {
lines.splice(0, lines.length);
tagSourceIdx = idx;
}
if (tag) {
currentTag = tag;
}
if (!tag && !name && !type && !description && !end) {
lines.push({
idx,
number
});
}
});
const currentTg = currentTag && tags[currentTag.slice(1)];
const tagCount = currentTg === null || currentTg === void 0 ? void 0 : currentTg.count;
const defaultAlways = alwaysNever === 'always' && (currentTg === null || currentTg === void 0 ? void 0 : currentTg.lines) !== 'never' && (currentTg === null || currentTg === void 0 ? void 0 : currentTg.lines) !== 'any' && lines.length < count;
let overrideAlways;
let fixCount = count;
if (!defaultAlways) {
fixCount = typeof tagCount === 'number' ? tagCount : count;
overrideAlways = (currentTg === null || currentTg === void 0 ? void 0 : currentTg.lines) === 'always' && lines.length < fixCount;
}
if (defaultAlways || overrideAlways) {
var _lines2;
const fixer = () => {
var _lines;
utils.addLines(tagIdx, ((_lines = lines[lines.length - 1]) === null || _lines === void 0 ? void 0 : _lines.idx) || tagSourceIdx + 1, fixCount - lines.length);
};
const line = ((_lines2 = lines[lines.length - 1]) === null || _lines2 === void 0 ? void 0 : _lines2.number) || tg.source[tagSourceIdx].number;
utils.reportJSDoc(`Expected ${fixCount} line${fixCount === 1 ? '' : 's'} between tags but found ${lines.length}`, {
line
}, fixer);
return true;
}
return false;
});
}, {
iterateAllJsdocs: true,
meta: {
docs: {
description: 'Enforces lines (or no lines) between tags.',
url: 'https://github.com/gajus/eslint-plugin-jsdoc#eslint-plugin-jsdoc-rules-tag-lines'
},
fixable: 'code',
schema: [{
enum: ['always', 'any', 'never'],
type: 'string'
}, {
additionalProperies: false,
properties: {
count: {
type: 'integer'
},
noEndLines: {
type: 'boolean'
},
tags: {
properties: {
patternProperties: {
'.*': {
additionalProperties: false,
properties: {
count: {
type: 'integer'
},
lines: {
enum: ['always', 'never'],
type: 'string'
}
}
}
}
},
type: 'object'
}
},
type: 'object'
}],
type: 'suggestion'
}
});
exports.default = _default;
module.exports = exports.default;
//# sourceMappingURL=tagLines.js.map