noBadBlocks.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc.js"));
  7. var _commentParser = require("comment-parser");
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. // Neither a single nor 3+ asterisks are valid jsdoc per
  10. // https://jsdoc.app/about-getting-started.html#adding-documentation-comments-to-your-code
  11. const commentRegexp = /^\/\*(?!\*)/u;
  12. const extraAsteriskCommentRegexp = /^\/\*{3,}/u;
  13. var _default = exports.default = (0, _iterateJsdoc.default)(({
  14. context,
  15. sourceCode,
  16. allComments,
  17. makeReport
  18. }) => {
  19. const [{
  20. ignore = ['ts-check', 'ts-expect-error', 'ts-ignore', 'ts-nocheck'],
  21. preventAllMultiAsteriskBlocks = false
  22. } = {}] = context.options;
  23. let extraAsterisks = false;
  24. const nonJsdocNodes = /** @type {import('estree').Node[]} */allComments.filter(comment => {
  25. const commentText = sourceCode.getText(comment);
  26. let sliceIndex = 2;
  27. if (!commentRegexp.test(commentText)) {
  28. var _extraAsteriskComment;
  29. const multiline = (_extraAsteriskComment = extraAsteriskCommentRegexp.exec(commentText)) === null || _extraAsteriskComment === void 0 ? void 0 : _extraAsteriskComment[0];
  30. if (!multiline) {
  31. return false;
  32. }
  33. sliceIndex = multiline.length;
  34. extraAsterisks = true;
  35. if (preventAllMultiAsteriskBlocks) {
  36. return true;
  37. }
  38. }
  39. const tags = ((0, _commentParser.parse)(`${commentText.slice(0, 2)}*${commentText.slice(sliceIndex)}`)[0] || {}).tags ?? [];
  40. return tags.length && !tags.some(({
  41. tag
  42. }) => {
  43. return ignore.includes(tag);
  44. });
  45. });
  46. if (!nonJsdocNodes.length) {
  47. return;
  48. }
  49. for (const node of nonJsdocNodes) {
  50. const report = /** @type {import('../iterateJsdoc.js').MakeReport} */makeReport(context, node);
  51. // eslint-disable-next-line no-loop-func
  52. const fix = /** @type {import('eslint').Rule.ReportFixer} */fixer => {
  53. const text = sourceCode.getText(node);
  54. return fixer.replaceText(node, extraAsterisks ? text.replace(extraAsteriskCommentRegexp, '/**') : text.replace('/*', '/**'));
  55. };
  56. report('Expected JSDoc-like comment to begin with two asterisks.', fix);
  57. }
  58. }, {
  59. checkFile: true,
  60. meta: {
  61. docs: {
  62. description: 'This rule checks for multi-line-style comments which fail to meet the criteria of a jsdoc block.',
  63. url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-bad-blocks.md#repos-sticky-header'
  64. },
  65. fixable: 'code',
  66. schema: [{
  67. additionalProperties: false,
  68. properties: {
  69. ignore: {
  70. items: {
  71. type: 'string'
  72. },
  73. type: 'array'
  74. },
  75. preventAllMultiAsteriskBlocks: {
  76. type: 'boolean'
  77. }
  78. },
  79. type: 'object'
  80. }],
  81. type: 'layout'
  82. }
  83. });
  84. module.exports = exports.default;
  85. //# sourceMappingURL=noBadBlocks.js.map