UNPKG

eslint-plugin-jsdoc

Version:
76 lines (68 loc) 2.05 kB
import iterateJsdoc from '../iterateJsdoc.js'; /** * @param {string} str * @param {string[]} excludeTags * @returns {string} */ const maskExcludedContent = (str, excludeTags) => { const regContent = new RegExp(`([ \\t]+\\*)[ \\t]@(?:${excludeTags.join('|')})(?=[ \\n])([\\w|\\W]*?\\n)(?=[ \\t]*\\*(?:[ \\t]*@\\w+\\s|\\/))`, 'gu'); return str.replace(regContent, (_match, margin, code) => { return (margin + '\n').repeat(code.match(/\n/gu).length); }); }; /** * @param {string} str * @returns {string} */ const maskCodeBlocks = (str) => { const regContent = /([ \t]+\*)[ \t]```[^\n]*?([\w|\W]*?\n)(?=[ \t]*\*(?:[ \t]*(?:```|@\w+\s)|\/))/gu; return str.replaceAll(regContent, (_match, margin, code) => { return (margin + '\n').repeat(code.match(/\n/gu).length); }); }; export default iterateJsdoc(({ sourceCode, jsdocNode, report, context, }) => { const options = context.options[0] || {}; const /** @type {{excludeTags: string[]}} */ { excludeTags = [ 'example', ], } = options; const reg = /^(?:\/?\**|[ \t]*)\*[ \t]{2}/gmu; const textWithoutCodeBlocks = maskCodeBlocks(sourceCode.getText(jsdocNode)); const text = excludeTags.length ? maskExcludedContent(textWithoutCodeBlocks, excludeTags) : textWithoutCodeBlocks; if (reg.test(text)) { const lineBreaks = text.slice(0, reg.lastIndex).match(/\n/gu) || []; report('There must be no indentation.', null, { line: lineBreaks.length, }); } }, { iterateAllJsdocs: true, meta: { docs: { description: 'Reports invalid padding inside JSDoc blocks.', url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/check-indentation.md#repos-sticky-header', }, schema: [ { additionalProperties: false, properties: { excludeTags: { items: { pattern: '^\\S+$', type: 'string', }, type: 'array', }, }, type: 'object', }, ], type: 'layout', }, });