eslint-plugin-jsdoc
Version:
JSDoc linting rules for ESLint.
119 lines (109 loc) • 2.65 kB
JavaScript
import iterateJsdoc from '../iterateJsdoc.js';
export default iterateJsdoc(({
context,
jsdoc,
report,
utils,
}) => {
if (utils.avoidDocs()) {
return;
}
const {
enableFixer = true,
exemptNoArguments = false,
} = context.options[0] || {};
const targetTagName = 'example';
const functionExamples = jsdoc.tags.filter(({
tag,
}) => {
return tag === targetTagName;
});
if (!functionExamples.length) {
if (exemptNoArguments && utils.isIteratingFunction() &&
!utils.hasParams()
) {
return;
}
utils.reportJSDoc(`Missing JSDoc @${targetTagName} declaration.`, null, () => {
if (enableFixer) {
utils.addTag(targetTagName);
}
});
return;
}
for (const example of functionExamples) {
const exampleContent = `${example.name} ${utils.getTagDescription(example)}`
.trim()
.split('\n')
.filter(Boolean);
if (!exampleContent.length) {
report(`Missing JSDoc @${targetTagName} description.`, null, example);
}
}
}, {
contextDefaults: true,
meta: {
docs: {
description: 'Requires that all functions have examples.',
url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-example.md#repos-sticky-header',
},
fixable: 'code',
schema: [
{
additionalProperties: false,
properties: {
checkConstructors: {
default: true,
type: 'boolean',
},
checkGetters: {
default: false,
type: 'boolean',
},
checkSetters: {
default: false,
type: 'boolean',
},
contexts: {
items: {
anyOf: [
{
type: 'string',
},
{
additionalProperties: false,
properties: {
comment: {
type: 'string',
},
context: {
type: 'string',
},
},
type: 'object',
},
],
},
type: 'array',
},
enableFixer: {
default: true,
type: 'boolean',
},
exemptedBy: {
items: {
type: 'string',
},
type: 'array',
},
exemptNoArguments: {
default: false,
type: 'boolean',
},
},
type: 'object',
},
],
type: 'suggestion',
},
});