--- /dev/null
+/* @flow */
+"use strict";
+
+const _ = require("lodash");
+
+/**
+ * Report a violation.
+ *
+ * This function accounts for `disabledRanges` attached to the result.
+ * That is, if the reported violation is within a disabledRange,
+ * it is ignored. Otherwise, it is attached to the result as a
+ * postcss warning.
+ *
+ * It also accounts for the rule's severity.
+ *
+ * You *must* pass *either* a node or a line number.
+ */
+module.exports = function(
+ violation /*: {
+ ruleName: string,
+ result: Object,
+ message: string,
+ node: Object,
+ index?: number,
+ word?: string,
+ line?: number
+}*/
+) {
+ const ruleName = violation.ruleName;
+ const result = violation.result;
+ const message = violation.message;
+ const line = violation.line;
+ const node = violation.node;
+ const index = violation.index;
+ const word = violation.word;
+
+ result.stylelint = result.stylelint || {};
+
+ // In quiet mode, mere warnings are ignored
+ if (
+ result.stylelint.quiet &&
+ result.stylelint.ruleSeverities[ruleName] !== "error"
+ ) {
+ return;
+ }
+
+ // If a line is not passed, use the node.positionBy method to get the
+ // line number that the complaint pertains to
+ const startLine = line || node.positionBy({ index }).line;
+
+ if (result.stylelint.disabledRanges && !result.stylelint.ignoreDisables) {
+ const ranges =
+ result.stylelint.disabledRanges[ruleName] ||
+ result.stylelint.disabledRanges.all;
+ for (const range of ranges) {
+ if (
+ // If the violation is within a disabledRange,
+ // and that disabledRange's rules include this one,
+ // do not register a warning
+ range.start <= startLine &&
+ (range.end >= startLine || range.end === undefined) &&
+ (!range.rules || range.rules.indexOf(ruleName) !== -1)
+ ) {
+ return;
+ }
+ }
+ }
+
+ const severity = _.get(
+ result.stylelint,
+ ["ruleSeverities", ruleName],
+ "ignore"
+ );
+
+ if (!result.stylelint.stylelintError && severity === "error") {
+ result.stylelint.stylelintError = true;
+ }
+
+ const warningProperties /*: Object*/ = {
+ severity,
+ rule: ruleName
+ };
+ if (node) {
+ warningProperties.node = node;
+ }
+ if (index) {
+ warningProperties.index = index;
+ }
+ if (word) {
+ warningProperties.word = word;
+ }
+
+ const warningMessage = _.get(
+ result.stylelint,
+ ["customMessages", ruleName],
+ message
+ );
+ result.warn(warningMessage, warningProperties);
+};