noMultiAsterisks.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  8. const middleAsterisksBlockWS = /^([\t ]|\*(?!\*))+/u;
  9. const middleAsterisksNoBlockWS = /^\*+/u;
  10. const endAsterisksSingleLineBlockWS = /\*((?:\*|(?: |\t))*)\*$/u;
  11. const endAsterisksMultipleLineBlockWS = /((?:\*|(?: |\t))*)\*$/u;
  12. const endAsterisksSingleLineNoBlockWS = /\*(\**)\*$/u;
  13. const endAsterisksMultipleLineNoBlockWS = /(\**)\*$/u;
  14. var _default = exports.default = (0, _iterateJsdoc.default)(({
  15. context,
  16. jsdoc,
  17. utils
  18. }) => {
  19. const {
  20. allowWhitespace = false,
  21. preventAtEnd = true,
  22. preventAtMiddleLines = true
  23. } = context.options[0] || {};
  24. const middleAsterisks = allowWhitespace ? middleAsterisksNoBlockWS : middleAsterisksBlockWS;
  25. // eslint-disable-next-line complexity -- Todo
  26. jsdoc.source.some(({
  27. tokens,
  28. number
  29. }) => {
  30. const {
  31. delimiter,
  32. tag,
  33. name,
  34. type,
  35. description,
  36. end,
  37. postDelimiter
  38. } = tokens;
  39. if (preventAtMiddleLines && !end && !tag && !type && !name && (!allowWhitespace && middleAsterisks.test(description) || allowWhitespace && middleAsterisks.test(postDelimiter + description))) {
  40. // console.log('description', JSON.stringify(description));
  41. const fix = () => {
  42. tokens.description = description.replace(middleAsterisks, '');
  43. };
  44. utils.reportJSDoc('Should be no multiple asterisks on middle lines.', {
  45. line: number
  46. }, fix, true);
  47. return true;
  48. }
  49. if (!preventAtEnd || !end) {
  50. return false;
  51. }
  52. const isSingleLineBlock = delimiter === '/**';
  53. const delim = isSingleLineBlock ? '*' : delimiter;
  54. const endAsterisks = allowWhitespace ? isSingleLineBlock ? endAsterisksSingleLineNoBlockWS : endAsterisksMultipleLineNoBlockWS : isSingleLineBlock ? endAsterisksSingleLineBlockWS : endAsterisksMultipleLineBlockWS;
  55. const endingAsterisksAndSpaces = (allowWhitespace ? postDelimiter + description + delim : description + delim).match(endAsterisks);
  56. if (!endingAsterisksAndSpaces || !isSingleLineBlock && endingAsterisksAndSpaces[1] && !endingAsterisksAndSpaces[1].trim()) {
  57. return false;
  58. }
  59. const endFix = () => {
  60. if (!isSingleLineBlock) {
  61. tokens.delimiter = '';
  62. }
  63. tokens.description = (description + delim).replace(endAsterisks, '');
  64. };
  65. utils.reportJSDoc('Should be no multiple asterisks on end lines.', {
  66. line: number
  67. }, endFix, true);
  68. return true;
  69. });
  70. }, {
  71. iterateAllJsdocs: true,
  72. meta: {
  73. docs: {
  74. description: '',
  75. url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/no-multi-asterisks.md#repos-sticky-header'
  76. },
  77. fixable: 'code',
  78. schema: [{
  79. additionalProperties: false,
  80. properties: {
  81. allowWhitespace: {
  82. type: 'boolean'
  83. },
  84. preventAtEnd: {
  85. type: 'boolean'
  86. },
  87. preventAtMiddleLines: {
  88. type: 'boolean'
  89. }
  90. },
  91. type: 'object'
  92. }],
  93. type: 'suggestion'
  94. }
  95. });
  96. module.exports = exports.default;
  97. //# sourceMappingURL=noMultiAsterisks.js.map