descriptionlessDisables.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. 'use strict';
  2. /** @typedef {import('stylelint').RangeType} RangeType */
  3. /** @typedef {import('stylelint').DisableReportRange} DisableReportRange */
  4. /** @typedef {import('stylelint').StylelintDisableOptionsReport} StylelintDisableOptionsReport */
  5. /**
  6. * @param {import('stylelint').StylelintResult[]} results
  7. * @returns {StylelintDisableOptionsReport}
  8. */
  9. module.exports = function (results) {
  10. /** @type {StylelintDisableOptionsReport} */
  11. const report = [];
  12. results.forEach((result) => {
  13. // File with `CssSyntaxError` have not `_postcssResult`
  14. if (!result._postcssResult) {
  15. return;
  16. }
  17. const rangeData = result._postcssResult.stylelint.disabledRanges;
  18. /** @type {import('stylelint').StylelintDisableReportEntry} */
  19. const entry = { source: result.source, ranges: [] };
  20. Object.keys(rangeData).forEach((rule) => {
  21. rangeData[rule].forEach((range) => {
  22. if (range.description) return;
  23. // Avoid duplicates from stylelint-disable comments with multiple rules.
  24. const alreadyReported = entry.ranges.find((existing) => {
  25. return existing.start === range.start && existing.end === range.end;
  26. });
  27. if (alreadyReported) return;
  28. entry.ranges.push({
  29. rule,
  30. start: range.start,
  31. end: range.end,
  32. unusedRule: rule,
  33. });
  34. });
  35. });
  36. if (entry.ranges.length > 0) {
  37. report.push(entry);
  38. }
  39. });
  40. return report;
  41. };