import { isRegExp, isString } from './utils/validateTypes.mjs'; import { DEFAULT_SEVERITY } from './constants.mjs'; import validateOptions from './utils/validateOptions.mjs'; /** @import {DisablePropertyName, DisableOptions, PostcssResult} from 'stylelint' */ /** * Validates that the stylelint config for `result` has a valid disable field * named `field`, and returns the result in normalized form. * * Returns `[]` if no disables should be reported, and automatically reports * an invalid configuration. * * @param {PostcssResult} result * @param {DisablePropertyName} field * @returns {[boolean, Required] | []} */ export default function validateDisableSettings(result, field) { const stylelintResult = result.stylelint; // Files with linting errors may not have configs associated with them. if (!stylelintResult.config) return []; const rawSettings = stylelintResult.config[field]; /** @type {boolean} */ let enabled; /** @type {DisableOptions} */ let options; if (Array.isArray(rawSettings)) { enabled = rawSettings[0]; options = rawSettings[1] || {}; } else { enabled = rawSettings || false; options = {}; } const validOptions = validateOptions( result, field, { actual: enabled, possible: [true, false], }, { actual: options, possible: { except: [isString, isRegExp], }, }, ); if (!validOptions) return []; // If the check is disabled with no exceptions, there's no reason to run // it at all. if (!enabled && !options.except) return []; return [ enabled, { except: options.except || [], severity: options.severity || stylelintResult.config.defaultSeverity || DEFAULT_SEVERITY, }, ]; }