UNPKG

stylelint

Version:
111 lines (89 loc) 3.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.messages = exports.ruleName = undefined; exports.default = function (expectation, options) { return function (root, result) { var validOptions = (0, _utils.validateOptions)(result, ruleName, { actual: expectation, possible: ["always", "never"] }, { actual: options, possible: { except: ["all-nested", "blockless-after-same-name-blockless", "blockless-group", "first-nested"], ignore: ["after-comment", "all-nested", "blockless-after-same-name-blockless", "blockless-group"], ignoreAtRules: [_lodash.isString] }, optional: true }); if (!validOptions) { return; } root.walkAtRules(function (atRule) { // Ignore the first node if (atRule === root.first) { return; } // Return early if at-rule is to be ignored if ((0, _utils.optionsMatches)(options, "ignoreAtRules", atRule.name)) { return; } // Optionally ignore the expectation if the node is blockless if ((0, _utils.optionsMatches)(options, "ignore", "blockless-group") && !(0, _utils.hasBlock)(atRule)) { return; } var isNested = atRule.parent !== root; var previousNode = atRule.prev(); // Optionally ignore the expection if the node is blockless // and following another blockless at-rule with the same name if ((0, _utils.optionsMatches)(options, "ignore", "blockless-after-same-name-blockless") && isBlocklessAfterSameNameBlockless()) { return; } // Optionally ignore the expectation if the node is nested if ((0, _utils.optionsMatches)(options, "ignore", "all-nested") && isNested) { return; } // Optionally ignore the expectation if a comment precedes this node if ((0, _utils.optionsMatches)(options, "ignore", "after-comment") && isAfterComment()) { return; } var hasEmptyLineBefore = (0, _utils.hasEmptyLine)(atRule.raw("before")); var expectEmptyLineBefore = expectation === "always" ? true : false; // Optionally reverse the expectation if any exceptions apply if ((0, _utils.optionsMatches)(options, "except", "all-nested") && isNested || (0, _utils.optionsMatches)(options, "except", "first-nested") && isFirstNested() || (0, _utils.optionsMatches)(options, "except", "blockless-group") && isBlocklessAfterBlockless() || (0, _utils.optionsMatches)(options, "except", "blockless-after-same-name-blockless") && isBlocklessAfterSameNameBlockless()) { expectEmptyLineBefore = !expectEmptyLineBefore; } // Return if the expectation is met if (expectEmptyLineBefore === hasEmptyLineBefore) { return; } var message = expectEmptyLineBefore ? messages.expected : messages.rejected; (0, _utils.report)({ message: message, node: atRule, result: result, ruleName: ruleName }); function isAfterComment() { return previousNode && previousNode.type === "comment"; } function isBlocklessAfterBlockless() { return previousNode && previousNode.type === "atrule" && !(0, _utils.hasBlock)(previousNode) && !(0, _utils.hasBlock)(atRule); } function isBlocklessAfterSameNameBlockless() { return !(0, _utils.hasBlock)(atRule) && previousNode && !(0, _utils.hasBlock)(previousNode) && previousNode.type === "atrule" && previousNode.name == atRule.name; } function isFirstNested() { return isNested && atRule === atRule.parent.first; } }); }; }; var _utils = require("../../utils"); var _lodash = require("lodash"); var ruleName = exports.ruleName = "at-rule-empty-line-before"; var messages = exports.messages = (0, _utils.ruleMessages)(ruleName, { expected: "Expected empty line before at-rule", rejected: "Unexpected empty line before at-rule" });