requireAsteriskPrefix.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. var _default = exports.default = (0, _iterateJsdoc.default)(({
  9. context,
  10. jsdoc,
  11. utils,
  12. indent
  13. }) => {
  14. const [defaultRequireValue = 'always', {
  15. tags: tagMap = {}
  16. } = {}] = context.options;
  17. const {
  18. source
  19. } = jsdoc;
  20. const always = defaultRequireValue === 'always';
  21. const never = defaultRequireValue === 'never';
  22. /** @type {string} */
  23. let currentTag;
  24. source.some(({
  25. number,
  26. tokens
  27. }) => {
  28. var _tagMap$any2;
  29. const {
  30. delimiter,
  31. tag,
  32. end,
  33. description
  34. } = tokens;
  35. /**
  36. * @returns {void}
  37. */
  38. const neverFix = () => {
  39. tokens.delimiter = '';
  40. tokens.postDelimiter = '';
  41. };
  42. /**
  43. * @param {string} checkValue
  44. * @returns {boolean}
  45. */
  46. const checkNever = checkValue => {
  47. var _tagMap$always, _tagMap$never;
  48. if (delimiter && delimiter !== '/**' && (never && !((_tagMap$always = tagMap.always) !== null && _tagMap$always !== void 0 && _tagMap$always.includes(checkValue)) || (_tagMap$never = tagMap.never) !== null && _tagMap$never !== void 0 && _tagMap$never.includes(checkValue))) {
  49. utils.reportJSDoc('Expected JSDoc line to have no prefix.', {
  50. column: 0,
  51. line: number
  52. }, neverFix);
  53. return true;
  54. }
  55. return false;
  56. };
  57. /**
  58. * @returns {void}
  59. */
  60. const alwaysFix = () => {
  61. if (!tokens.start) {
  62. tokens.start = indent + ' ';
  63. }
  64. tokens.delimiter = '*';
  65. tokens.postDelimiter = tag || description ? ' ' : '';
  66. };
  67. /**
  68. * @param {string} checkValue
  69. * @returns {boolean}
  70. */
  71. const checkAlways = checkValue => {
  72. var _tagMap$never2, _tagMap$always2;
  73. if (!delimiter && (always && !((_tagMap$never2 = tagMap.never) !== null && _tagMap$never2 !== void 0 && _tagMap$never2.includes(checkValue)) || (_tagMap$always2 = tagMap.always) !== null && _tagMap$always2 !== void 0 && _tagMap$always2.includes(checkValue))) {
  74. utils.reportJSDoc('Expected JSDoc line to have the prefix.', {
  75. column: 0,
  76. line: number
  77. }, alwaysFix);
  78. return true;
  79. }
  80. return false;
  81. };
  82. if (tag) {
  83. // Remove at sign
  84. currentTag = tag.slice(1);
  85. }
  86. if (
  87. // If this is the end but has a tag, the delimiter will also be
  88. // populated and will be safely ignored later
  89. end && !tag) {
  90. return false;
  91. }
  92. if (!currentTag) {
  93. var _tagMap$any;
  94. if ((_tagMap$any = tagMap.any) !== null && _tagMap$any !== void 0 && _tagMap$any.includes('*description')) {
  95. return false;
  96. }
  97. if (checkNever('*description')) {
  98. return true;
  99. }
  100. if (checkAlways('*description')) {
  101. return true;
  102. }
  103. return false;
  104. }
  105. if ((_tagMap$any2 = tagMap.any) !== null && _tagMap$any2 !== void 0 && _tagMap$any2.includes(currentTag)) {
  106. return false;
  107. }
  108. if (checkNever(currentTag)) {
  109. return true;
  110. }
  111. if (checkAlways(currentTag)) {
  112. return true;
  113. }
  114. return false;
  115. });
  116. }, {
  117. iterateAllJsdocs: true,
  118. meta: {
  119. docs: {
  120. description: 'Requires that each JSDoc line starts with an `*`.',
  121. url: 'https://github.com/gajus/eslint-plugin-jsdoc/blob/main/docs/rules/require-asterisk-prefix.md#repos-sticky-header'
  122. },
  123. fixable: 'code',
  124. schema: [{
  125. enum: ['always', 'never', 'any'],
  126. type: 'string'
  127. }, {
  128. additionalProperties: false,
  129. properties: {
  130. tags: {
  131. properties: {
  132. always: {
  133. items: {
  134. type: 'string'
  135. },
  136. type: 'array'
  137. },
  138. any: {
  139. items: {
  140. type: 'string'
  141. },
  142. type: 'array'
  143. },
  144. never: {
  145. items: {
  146. type: 'string'
  147. },
  148. type: 'array'
  149. }
  150. },
  151. type: 'object'
  152. }
  153. },
  154. type: 'object'
  155. }],
  156. type: 'layout'
  157. }
  158. });
  159. module.exports = exports.default;
  160. //# sourceMappingURL=requireAsteriskPrefix.js.map