UNPKG

eslint-plugin-jsdoc

Version:
163 lines (139 loc) 3.64 kB
import iterateJsdoc from '../iterateJsdoc.js'; const middleAsterisksBlockWS = /^([\t ]|\*(?!\*))+/v; const middleAsterisksNoBlockWS = /^\*+/v; const endAsterisksSingleLineBlockWS = /\*((?:\*|(?: |\t))*)\*$/v; const endAsterisksMultipleLineBlockWS = /((?:\*|(?: |\t))*)\*$/v; const endAsterisksSingleLineNoBlockWS = /\*(\**)\*$/v; const endAsterisksMultipleLineNoBlockWS = /(\**)\*$/v; export default iterateJsdoc(({ context, jsdoc, utils, }) => { const { allowWhitespace = false, preventAtEnd = true, preventAtMiddleLines = true, } = context.options[0] || {}; const middleAsterisks = allowWhitespace ? middleAsterisksNoBlockWS : middleAsterisksBlockWS; jsdoc.source.some(({ number, tokens, }) => { const { delimiter, description, end, name, postDelimiter, tag, type, } = tokens; if ( preventAtMiddleLines && !end && !tag && !type && !name && ( !allowWhitespace && middleAsterisks.test(description) || allowWhitespace && middleAsterisks.test(postDelimiter + description) ) ) { // console.log('description', JSON.stringify(description)); const fix = () => { tokens.description = description.replace(middleAsterisks, ''); }; utils.reportJSDoc( 'Should be no multiple asterisks on middle lines.', { line: number, }, fix, true, ); return true; } if (!preventAtEnd || !end) { return false; } const isSingleLineBlock = delimiter === '/**'; const delim = isSingleLineBlock ? '*' : delimiter; const endAsterisks = allowWhitespace ? (isSingleLineBlock ? endAsterisksSingleLineNoBlockWS : endAsterisksMultipleLineNoBlockWS) : (isSingleLineBlock ? endAsterisksSingleLineBlockWS : endAsterisksMultipleLineBlockWS); const endingAsterisksAndSpaces = ( allowWhitespace ? postDelimiter + description + delim : description + delim ).match( endAsterisks, ); if ( !endingAsterisksAndSpaces || !isSingleLineBlock && endingAsterisksAndSpaces[1] && !endingAsterisksAndSpaces[1].trim() ) { return false; } const endFix = () => { if (!isSingleLineBlock) { tokens.delimiter = ''; } tokens.description = (description + delim).replace(endAsterisks, ''); }; utils.reportJSDoc( 'Should be no multiple asterisks on end lines.', { line: number, }, endFix, true, ); return true; }); }, { iterateAllJsdocs: true, meta: { docs: { description: 'Prevents use of multiple asterisks at the beginning of lines.', url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-multi-asterisks.md#repos-sticky-header', }, fixable: 'code', schema: [ { additionalProperties: false, properties: { allowWhitespace: { description: `Set to \`true\` if you wish to allow asterisks after a space (as with Markdown): \`\`\`js /** * *bold* text */ \`\`\` Defaults to \`false\`.`, type: 'boolean', }, preventAtEnd: { description: `Prevent the likes of this: \`\`\`js /** * * **/ \`\`\` Defaults to \`true\`.`, type: 'boolean', }, preventAtMiddleLines: { description: `Prevent the likes of this: \`\`\`js /** * ** */ \`\`\` Defaults to \`true\`.`, type: 'boolean', }, }, type: 'object', }, ], type: 'suggestion', }, });