1 | 'use strict';
|
2 |
|
3 | const _ = require('lodash');
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | module.exports = function (results) {
|
14 |
|
15 | const report = [];
|
16 |
|
17 | results.forEach((result) => {
|
18 |
|
19 | if (!result._postcssResult) {
|
20 | return;
|
21 | }
|
22 |
|
23 |
|
24 | const unused = { source: result.source || '', ranges: [] };
|
25 |
|
26 |
|
27 | const rangeData = _.cloneDeep(result._postcssResult.stylelint.disabledRanges);
|
28 |
|
29 | if (!rangeData) {
|
30 | return;
|
31 | }
|
32 |
|
33 | result.warnings.forEach((warning) => {
|
34 | const rule = warning.rule;
|
35 |
|
36 | const ruleRanges = rangeData[rule];
|
37 |
|
38 | if (ruleRanges) {
|
39 |
|
40 | for (const range of ruleRanges.reverse()) {
|
41 | if (isWarningInRange(warning, range)) {
|
42 | range.used = true;
|
43 |
|
44 | return;
|
45 | }
|
46 | }
|
47 | }
|
48 |
|
49 | for (const range of rangeData.all.reverse()) {
|
50 | if (isWarningInRange(warning, range)) {
|
51 | range.used = true;
|
52 |
|
53 | return;
|
54 | }
|
55 | }
|
56 | });
|
57 |
|
58 | Object.keys(rangeData).forEach((rule) => {
|
59 | rangeData[rule].forEach((range) => {
|
60 |
|
61 | const alreadyMarkedUnused = unused.ranges.find((unusedRange) => {
|
62 | return unusedRange.start === range.start && unusedRange.end === range.end;
|
63 | });
|
64 |
|
65 |
|
66 |
|
67 | if (!range.used && !alreadyMarkedUnused) {
|
68 | unused.ranges.push({
|
69 | start: range.start,
|
70 | end: range.end,
|
71 | unusedRule: rule,
|
72 | });
|
73 | }
|
74 |
|
75 |
|
76 |
|
77 |
|
78 | if (range.used && alreadyMarkedUnused) {
|
79 | _.remove(unused.ranges, alreadyMarkedUnused);
|
80 | }
|
81 | });
|
82 | });
|
83 |
|
84 | unused.ranges = _.sortBy(unused.ranges, ['start', 'end']);
|
85 |
|
86 | report.push(unused);
|
87 | });
|
88 |
|
89 | return report;
|
90 | };
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 | function isWarningInRange(warning, range) {
|
98 | const line = warning.line;
|
99 |
|
100 |
|
101 | return (
|
102 | range.start <= line &&
|
103 | ((range.end !== undefined && range.end >= line) || range.end === undefined)
|
104 | );
|
105 | }
|