blob: e96be0bb7a0518bb4ce32cfe88c2445fa299fa2a [file] [log] [blame]
Mathias Bynens79e2cf02020-05-29 16:46:17 +02001'use strict';
2
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +00003const optionsMatches = require('./utils/optionsMatches');
4const validateDisableSettings = require('./validateDisableSettings');
5
Mathias Bynens79e2cf02020-05-29 16:46:17 +02006/** @typedef {import('stylelint').RangeType} RangeType */
Mathias Bynens79e2cf02020-05-29 16:46:17 +02007
8/**
9 * @param {import('stylelint').StylelintResult[]} results
Mathias Bynens79e2cf02020-05-29 16:46:17 +020010 */
Tim van der Lippeefb716a2020-12-01 12:54:04 +000011module.exports = function (results) {
Mathias Bynens79e2cf02020-05-29 16:46:17 +020012 results.forEach((result) => {
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000013 const settings = validateDisableSettings(result._postcssResult, 'reportInvalidScopeDisables');
Mathias Bynens79e2cf02020-05-29 16:46:17 +020014
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000015 if (!settings) return;
Tim van der Lippeefb716a2020-12-01 12:54:04 +000016
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000017 const [enabled, options, stylelintResult] = settings;
Tim van der Lippecc71b282021-02-12 15:51:14 +000018
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000019 const configRules = (stylelintResult.config || {}).rules || {};
Tim van der Lippeefb716a2020-12-01 12:54:04 +000020
21 const usedRules = new Set(Object.keys(configRules));
22
23 usedRules.add('all');
24
Tim van der Lippecc71b282021-02-12 15:51:14 +000025 const rangeData = stylelintResult.disabledRanges;
Mathias Bynens79e2cf02020-05-29 16:46:17 +020026 const disabledRules = Object.keys(rangeData);
27
28 disabledRules.forEach((rule) => {
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000029 if (usedRules.has(rule)) return;
30
31 if (enabled === optionsMatches(options, 'except', rule)) return;
Mathias Bynens79e2cf02020-05-29 16:46:17 +020032
33 rangeData[rule].forEach((range) => {
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000034 if (!range.strictStart && !range.strictEnd) return;
Mathias Bynens79e2cf02020-05-29 16:46:17 +020035
Tim van der Lippeefb716a2020-12-01 12:54:04 +000036 // If the comment doesn't have a location, we can't report a useful error.
37 // In practice we expect all comments to have locations, though.
38 if (!range.comment.source || !range.comment.source.start) return;
39
40 result.warnings.push({
41 text: `Rule "${rule}" isn't enabled`,
42 rule: '--report-invalid-scope-disables',
43 line: range.comment.source.start.line,
44 column: range.comment.source.start.column,
Tim van der Lippe0a9b84d2021-03-24 11:53:15 +000045 severity: options.severity,
Mathias Bynens79e2cf02020-05-29 16:46:17 +020046 });
47 });
48 });
Mathias Bynens79e2cf02020-05-29 16:46:17 +020049 });
Mathias Bynens79e2cf02020-05-29 16:46:17 +020050};