requireDescriptionCompleteSentence.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _lodash = _interopRequireDefault(require("lodash"));
  7. var _iterateJsdoc = _interopRequireDefault(require("../iterateJsdoc"));
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. var extractParagraphs = function extractParagraphs(text) {
  10. return text.split(/\n\n/);
  11. };
  12. var extractSentences = function extractSentences(text) {
  13. return text // Remove all {} tags.
  14. .replace(/\{[\s\S]*?\}\s*/g, '').split(/[.?!](?:\s+|$)/) // Ignore sentences with only whitespaces.
  15. .filter(function (sentence) {
  16. return !/^\s*$/.test(sentence);
  17. }) // Re-add the dot.
  18. .map(function (sentence) {
  19. return sentence + '.';
  20. });
  21. };
  22. var isNewLinePrecededByAPeriod = function isNewLinePrecededByAPeriod(text) {
  23. var lastLineEndsSentence;
  24. var lines = text.split('\n');
  25. return !_lodash.default.some(lines, function (line) {
  26. if (_lodash.default.isBoolean(lastLineEndsSentence) && !lastLineEndsSentence && /^[A-Z]/.test(line)) {
  27. return true;
  28. }
  29. lastLineEndsSentence = /[.:?!]$/.test(line);
  30. return false;
  31. });
  32. };
  33. var isCapitalized = function isCapitalized(str) {
  34. return str[0] === str[0].toUpperCase();
  35. };
  36. var capitalize = function capitalize(str) {
  37. return str.charAt(0).toUpperCase() + str.slice(1);
  38. };
  39. var validateDescription = function validateDescription(description, report, jsdocNode, sourceCode, tag) {
  40. if (!description) {
  41. return false;
  42. }
  43. var paragraphs = extractParagraphs(description);
  44. return _lodash.default.some(paragraphs, function (paragraph) {
  45. var sentences = extractSentences(paragraph);
  46. var fix = function fix(fixer) {
  47. var text = sourceCode.getText(jsdocNode);
  48. if (!/[.:?!]$/.test(paragraph)) {
  49. var line = _lodash.default.last(paragraph.split('\n'));
  50. text = text.replace(new RegExp(_lodash.default.escapeRegExp(line) + '$', 'm'), line + '.');
  51. }
  52. var _iteratorNormalCompletion = true;
  53. var _didIteratorError = false;
  54. var _iteratorError = undefined;
  55. try {
  56. var _loop = function _loop() {
  57. var sentence = _step.value;
  58. var beginning = sentence.split('\n')[0];
  59. if (tag) {
  60. var reg = new RegExp('(@' + _lodash.default.escapeRegExp(tag) + '.*)' + _lodash.default.escapeRegExp(beginning));
  61. text = text.replace(reg, function ($0, $1) {
  62. return $1 + capitalize(beginning);
  63. });
  64. } else {
  65. text = text.replace(beginning, capitalize(beginning));
  66. }
  67. };
  68. for (var _iterator = sentences.filter(function (sentence_) {
  69. return !isCapitalized(sentence_);
  70. })[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  71. _loop();
  72. }
  73. } catch (err) {
  74. _didIteratorError = true;
  75. _iteratorError = err;
  76. } finally {
  77. try {
  78. if (!_iteratorNormalCompletion && _iterator.return != null) {
  79. _iterator.return();
  80. }
  81. } finally {
  82. if (_didIteratorError) {
  83. throw _iteratorError;
  84. }
  85. }
  86. }
  87. return fixer.replaceText(jsdocNode, text);
  88. };
  89. if (_lodash.default.some(sentences, function (sentence) {
  90. return !isCapitalized(sentence);
  91. })) {
  92. report('Sentence should start with an uppercase character.', fix);
  93. }
  94. if (!/[.!?]$/.test(paragraph)) {
  95. report('Sentence must end with a period.', fix);
  96. return true;
  97. }
  98. if (!isNewLinePrecededByAPeriod(paragraph)) {
  99. report('A line of text is started with an uppercase character, but preceding line does not end the sentence.');
  100. return true;
  101. }
  102. return false;
  103. });
  104. };
  105. var _default = (0, _iterateJsdoc.default)(function (_ref) {
  106. var sourceCode = _ref.sourceCode,
  107. jsdoc = _ref.jsdoc,
  108. report = _ref.report,
  109. jsdocNode = _ref.jsdocNode;
  110. if (validateDescription(jsdoc.description, report, jsdocNode, sourceCode)) {
  111. return;
  112. }
  113. var tags = _lodash.default.filter(jsdoc.tags, function (tag) {
  114. return _lodash.default.includes(['param', 'arg', 'argument', 'returns', 'return'], tag.tag);
  115. });
  116. _lodash.default.some(tags, function (tag) {
  117. var description = _lodash.default.trimStart(tag.description, '- ');
  118. return validateDescription(description, report, jsdocNode, sourceCode, tag.tag);
  119. });
  120. });
  121. exports.default = _default;
  122. module.exports = exports.default;
  123. //# sourceMappingURL=requireDescriptionCompleteSentence.js.map