/**
 * The actual check for are there (un)necessary whitespaces
 */
function checkSpaces(_ref) {
  var string = _ref.string,
      globalIndex = _ref.globalIndex,
      startIndex = _ref.startIndex,
      endIndex = _ref.endIndex,
      node = _ref.node,
      result = _ref.result;

  var symbol = string.substring(startIndex, endIndex + 1);

  var beforeOk = string[startIndex - 1] === " " && !(0, _utils.isWhitespace)(string[startIndex - 2]) || newlineBefore(string, startIndex - 1);
  if (!beforeOk) {
    _stylelint.utils.report({
      ruleName: ruleName,
      result: result,
      node: node,
      message: messages.expectedBefore(symbol),
      index: startIndex + globalIndex
    });
  }

  var afterOk = string[endIndex + 1] === " " && !(0, _utils.isWhitespace)(string[endIndex + 2]) || string[endIndex + 1] === "\n" || string.substr(endIndex + 1, 2) === "\r\n";

  if (!afterOk) {
    _stylelint.utils.report({
      ruleName: ruleName,
      result: result,
      node: node,
      message: messages.expectedAfter(symbol),
      index: endIndex + globalIndex
    });
  }
}
Esempio n. 2
0
          warningCandidates[namespace].forEach(candidate => {
            if (candidate.nested === true) {
              if (exceptIfOnlyOfNs) {
                // If there is only one prop inside a nested prop - warn (reverse "always")
                if (
                  candidate.nested === true &&
                  candidate.node.nodes.length === 1
                ) {
                  utils.report({
                    message: messages.rejected(namespace),
                    node: candidate.node,
                    result,
                    ruleName
                  });
                }
              }
            } else {
              // Don't warn on non-nested namespaced props if there are
              // less than 2 of them, and except: "only-of-namespace" is set
              if (exceptIfOnlyOfNs && !moreThanOneProp) {
                return;
              }

              utils.report({
                message: messages.expected(candidate.node.prop),
                node: candidate.node,
                result,
                ruleName
              });
            }
          });
Esempio n. 3
0
        args.forEach(arg => {
          switch (expectation) {
            case "never": {
              if (!arg.key) {
                return;
              }

              utils.report({
                message: messages.rejected,
                node: decl,
                result,
                ruleName
              });
              break;
            }

            case "always": {
              if (arg.key && isScssVarRegExp.test(arg.key)) {
                return;
              }

              utils.report({
                message: messages.expected,
                node: decl,
                result,
                ruleName
              });
              break;
            }
          }
        });
/**
 * The checker function: whether there is a newline before THAT operator.
 */
function checkNewlineBefore(_ref) {
  var string = _ref.string,
      globalIndex = _ref.globalIndex,
      startIndex = _ref.startIndex,
      endIndex = _ref.endIndex,
      node = _ref.node,
      result = _ref.result;

  var symbol = string.substring(startIndex, endIndex + 1);
  var newLineBefore = false;

  var index = endIndex + 1;
  while (index && (0, _utils.isWhitespace)(string[index])) {
    if (string[index] === "\n") {
      newLineBefore = true;
      break;
    }
    index++;
  }

  if (newLineBefore) {
    _stylelint.utils.report({
      ruleName: ruleName,
      result: result,
      node: node,
      message: messages.rejected(symbol),
      index: endIndex + globalIndex
    });
  }
}
Esempio n. 5
0
    root.walkDecls(decl => {
      // not variable
      if (decl.prop[0] !== "$") {
        return;
      }

      // "ignore" options
      if (
        optionsHaveIgnored(secondaryOptions, "local") &&
        decl.parent.type !== "root"
      ) {
        return;
      }

      if (decl.value.toLowerCase().indexOf("!default") !== -1) {
        return;
      }

      utils.report({
        message: messages.expected(decl.prop),
        node: decl,
        result,
        ruleName
      });
    });
    return function(root, result) {
        var validOptions = stylelint.utils.validateOptions({
            ruleName: ruleName,
            result: result,
            actual: options,
        });

        if (!validOptions) {
            return;
        }

        root.walkDecls(function(statement) {
            if (checkProp(statement.prop, statement.value, options)  && checkPresentVariable(statement.value) && !checkValue(statement.value)) {
                stylelint.utils.report({
                    ruleName: ruleName,
                    result: result,
                    node: statement,
                    message: messages.expectedPresent(statement.prop, checkPresentVariable(statement.value))
                });
            } else if (checkProp(statement.prop, statement.value, options) && !checkValue(statement.value)) {
                stylelint.utils.report({
                    ruleName: ruleName,
                    result: result,
                    node: statement,
                    message: messages.expected(statement.prop)
                });
            }

        });
    };
Esempio n. 7
0
    function checkPathForUnderscore(path, decl) {
      // Stripping trailing quotes and whitespaces, if any
      var pathStripped = path.replace(/^\s*?("|')\s*/, "").replace(/\s*("|')\s*?$/, "");
      var extension = _path2.default.extname(pathStripped).slice(1);

      // If the extension is not empty
      if (!extension) {
        return;
      }

      // Skipping importing CSS: url(), ".css", URI with a protocol, media
      if (pathStripped.slice(0, 4) === "url(" || pathStripped.slice(-4) === ".css" || pathStripped.search("//") !== -1 || pathStripped.search(/(?:\s|[,)"'])\w+$/) !== -1) {
        return;
      }

      if (options && options.ignoreExtensions) {
        // Return if...
        if (options.ignoreExtensions.some(function (ignoredExt) {
          // the extension matches one of the ignored strings or Regexps
          return (0, _lodash.isString)(ignoredExt) && ignoredExt === extension || (0, _lodash.isRegExp)(ignoredExt) && extension.search(ignoredExt) !== -1;
        })) {
          return;
        }
      }

      _stylelint.utils.report({
        message: messages.expected,
        node: decl,
        result: result,
        ruleName: ruleName
      });
    }
Esempio n. 8
0
    function checkPathForUnderscore(path, decl) {
      // Stripping trailing quotes and whitespaces, if any
      const pathStripped = path.replace(/^\s*?("|')\s*/, "").replace(/\s*("|')\s*?$/, "")
      const extension = nodeJsPath.extname(pathStripped).slice(1)
      // Save this separately to be able to pass the original string to report()
      const extensionNormalized = extension.toLowerCase()

      // If the extension is empty
      if (!extension) { return }

      // Skipping importing CSS: url(), ".css", URI with a protocol, media
      if (pathStripped.slice(0, 4) === "url(" ||
        pathStripped.slice(-4) === ".css" ||
        pathStripped.search("//") !== -1 ||
        pathStripped.search(/(?:\s|[,)"'])\w+$/) !== -1
      ) {
        return
      }

      if (whitelist.some(ext => {
        return isString(ext) && extensionNormalized === ext ||
          isRegExp(ext) && extensionNormalized.search(ext) !== -1
      })) { return }

      utils.report({
        message: messages.rejected(extension),
        node: decl,
        word: extension,
        result,
        ruleName,
      })
    }
  return function (root, result) {
    var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
      actual: expectation,
      possible: ["never"]
    });
    if (!validOptions) {
      return;
    }

    root.walkAtRules(function (atrule) {
      if (atrule.name !== "else") {
        return;
      }

      // Don't need to ignore "the first rule in a stylesheet", etc, cases
      // because @else should always go after @if

      if (!(0, _utils.hasEmptyLine)(atrule.raws.before)) {
        return;
      }

      _stylelint.utils.report({
        message: messages.rejected,
        node: atrule,
        result: result,
        ruleName: ruleName
      });
    });
  };
Esempio n. 10
0
    root.walkDecls(decl => {
      const prop = decl.prop;

      if (!isStandardSyntaxProperty(prop)) {
        return;
      }

      if (!isStandardSyntaxDeclaration(decl)) {
        return;
      }

      if (isCustomProperty(prop)) {
        return;
      }

      if (isExportBlock(decl.parent)) {
        return;
      }

      if (optionsMatches(options, "ignoreProperties", prop)) {
        return;
      }

      if (props.indexOf(prop.toLowerCase()) !== -1) {
        return;
      }

      utils.report({
        message: messages.rejected(prop),
        node: decl,
        result,
        ruleName
      });
    });
	cssRoot.walkDecls('box-shadow', ( decl ) => {

		const list = [];

		valueParser(decl.value).walk(( node ) => {
			if ( node.type === 'function' ) {
				return false;
			}
			if ( node.value === 'inset' || node.value === ',' ) {
				list.push(node.value);
			}
		});

		const inputOrder = list.map(( item ) => {
			if ( item === ',' ) {
				return 'normal';
			}
			return item;
		});
		const correctOrder = [].concat(inputOrder).sort();

		if ( !_.isEqual(inputOrder, correctOrder) ) {
			stylelint.utils.report({
				ruleName: ruleName,
				result: result,
				node: decl,
				message: messages.expected
			});
		}


	});
Esempio n. 12
0
    root.walkDecls(decl => {
      const { prop } = decl;

      if (prop[0] !== "$") {
        return;
      }
      // If local or global variables need to be ignored
      if (
        (optionsHaveIgnored(options, "global") &&
          decl.parent.type === "root") ||
        (optionsHaveIgnored(options, "local") && decl.parent.type !== "root")
      ) {
        return;
      }
      if (regexpPattern.test(prop.slice(1))) {
        return;
      }

      utils.report({
        message: messages.expected,
        node: decl,
        result,
        ruleName
      });
    });
Esempio n. 13
0
				resolvedNestedSelector(selector, rule).forEach((resolvedSelector) => {
					let classNames = [];
					try {
						// Remove ampersand from inner sass mixins and parse the class names
						classNames = extractCssClasses(resolvedSelector.replace(/&\s*/ig, ''));
					} catch (e) {
						stylelint.utils.report({
							ruleName,
							result,
							node: rule,
							message: e.message,
						});
					}
					classNames.forEach((className) => {
						if (classNameErrorCache[className] === undefined) {
							classNameErrorCache[className] = getClassNameErrors(className, namespaces, rule);
						}
						if (classNameErrorCache[className]) {
							stylelint.utils.report({
								ruleName,
								result,
								node: rule,
								message: messages.expected(className, classNameErrorCache[className]),
							});
						}
					});
				});
  return function (root, result) {
    var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
      actual: pattern,
      possible: [_lodash.isRegExp, _lodash.isString]
    });
    if (!validOptions) {
      return;
    }

    var regexpPattern = (0, _lodash.isString)(pattern) ? new RegExp(pattern) : pattern;

    root.walkAtRules(function (decl) {
      if (decl.name !== "function") {
        return;
      }

      // Stripping the function of its arguments
      var funcName = decl.params.replace(/(\s*?)\((?:\s|\S)*\)/g, "");
      if (regexpPattern.test(funcName)) {
        return;
      }

      _stylelint.utils.report({
        message: messages.expected,
        node: decl,
        result: result,
        ruleName: ruleName
      });
    });
  };
  (root, result) => {
    const validOptions = stylelint.utils.validateOptions(result, ruleName, { actual });
    const checkForPaddingAuto = (decl) => {
      const property = decl.prop;
      const value = decl.value;

      if (
        // Check for value 'auto'
        value.indexOf('auto') > -1 &&
        // Check if prop is a padding prop
        (property === 'padding' ||
        property === 'padding-top' ||
        property === 'padding-right' ||
        property === 'padding-bottom' ||
        property === 'padding-left')) {
        stylelint.utils.report({
          ruleName: ruleName,
          result: result,
          node: decl,
          message: messages.rejected
        });
      }
    };

    if (!validOptions) {
      return;
    }

    root.walkDecls(checkForPaddingAuto);
  }
Esempio n. 16
0
 root.walkAtRules(rule => {
   if (needsPrefix.atRule(rule.name)) {
     stylelint.utils.report({
       result,
       ruleName,
       message: messages.atRule(rule.name),
       node: rule
     });
   } else if (needsPrefix.mediaFeature(rule.params)) {
     stylelint.utils.report({
       result,
       ruleName,
       message: messages.mediaFeature(rule.name),
       node: rule
     });
   }
 });
        root.walkDecls(function(statement) {
            if (checkProp(statement.prop, statement.value, options)  && checkPresentVariable(statement.value) && !checkValue(statement.value)) {
                stylelint.utils.report({
                    ruleName: ruleName,
                    result: result,
                    node: statement,
                    message: messages.expectedPresent(statement.prop, checkPresentVariable(statement.value))
                });
            } else if (checkProp(statement.prop, statement.value, options) && !checkValue(statement.value)) {
                stylelint.utils.report({
                    ruleName: ruleName,
                    result: result,
                    node: statement,
                    message: messages.expected(statement.prop)
                });
            }

        });
Esempio n. 18
0
 function complain(node, message, index) {
   _stylelint.utils.report({
     result: result,
     ruleName: ruleName,
     node: node,
     message: message,
     index: index
   });
 }
Esempio n. 19
0
 root.walkDecls(decl => {
   if (needsPrefix.property(decl.prop)) {
     stylelint.utils.report({
       result,
       ruleName,
       message: messages.property(decl.prop),
       node: decl,
       index: (decl.raws.before || '').length
     });
   } else if (needsPrefix.value(decl.prop, decl.value)) {
     stylelint.utils.report({
       result,
       ruleName,
       message: messages.value(decl.prop, decl.value),
       node: decl,
       index: (decl.raws.before || '').length
     });
   }
 });
Esempio n. 20
0
 doiuseResult.warnings().forEach(function reportWarning(doiuseWarning) {
   stylelint.utils.report({
     ruleName: ruleName,
     result: result,
     message: messages.rejected(cleanWarningText(doiuseWarning.text)),
     node: doiuseWarning.node,
     line: doiuseWarning.line,
     column: doiuseWarning.column
   })
 })
Esempio n. 21
0
  return function(root, result) {
    const validOptions = utils.validateOptions(
      result,
      ruleName,
      {
        actual
      },
      {
        actual: options,
        possible: {
          ignoreProperties: [isString]
        },
        optional: true
      }
    );

    if (!validOptions) {
      return;
    }

    root.walkDecls(decl => {
      const prop = decl.prop;

      if (!isStandardSyntaxProperty(prop)) {
        return;
      }

      if (!isStandardSyntaxDeclaration(decl)) {
        return;
      }

      if (isCustomProperty(prop)) {
        return;
      }

      if (isExportBlock(decl.parent)) {
        return;
      }

      if (optionsMatches(options, "ignoreProperties", prop)) {
        return;
      }

      if (props.indexOf(prop.toLowerCase()) !== -1) {
        return;
      }

      utils.report({
        message: messages.rejected(prop),
        node: decl,
        result,
        ruleName
      });
    });
  };
Esempio n. 22
0
 selectorTree.walkPseudos(pseudoNode => {
   if (needsPrefix.selector(pseudoNode.value)) {
     stylelint.utils.report({
       result,
       ruleName,
       message: messages.selector(pseudoNode.value),
       node: rule,
       index: (rule.raws.before || '').length + pseudoNode.sourceIndex,
     });
   }
 });
Esempio n. 23
0
    function report(node, value) {
      const { name, prop, type } = node
      const nodeName = isAtRule(type) ? "@" + name : prop

      utils.report({
        ruleName,
        result,
        node,
        message: messages.rejected(nodeName, value),
      })
    }
Esempio n. 24
0
    root.walkRules(rule => {
      if (rule.selector.toLowerCase().indexOf(':root') === -1 || rule.selector.toLowerCase().trim() === ':root') {
        return;
      }

      stylelint.utils.report({
        message: messages.rejected,
        node: rule,
        result,
        ruleName,
      });
    });
Esempio n. 25
0
    stylehacksResult.warnings().forEach((stylehacksWarning) => {
        const message = messages.rejected(stylehacksWarning.identifier, stylehacksWarning.hack);

        stylelint.utils.report({
            ruleName: ruleName,
            result: postcssResult,
            message: message,
            node: stylehacksWarning.node,
            line: stylehacksWarning.line,
            column: stylehacksWarning.column
        });
    });
Esempio n. 26
0
    root.walkAtRules("include", mixinCall => {
      // If is is "No parens in argumentless calls"
      if (value === "never" && mixinCall.params.search(/\(\s*?\)\s*?$/) === -1) { return }
      // If is is "Always use parens"
      if (value === "always" && mixinCall.params.search(/\(/) !== -1) { return }

      utils.report({
        message: messages.expected,
        node: mixinCall,
        result,
        ruleName,
      })
    })
Esempio n. 27
0
    root.walkAtRules("extend", atrule => {
      const isPlaceholder = atrule.params.trim()[0] === "%"
      const isInterpolation = (/^#{.+}/).test(atrule.params.trim())

      if (!isPlaceholder && !isInterpolation) {
        utils.report({
          ruleName,
          result,
          node: atrule,
          message: messages.rejected,
        })
      }
    })
Esempio n. 28
0
					classNames.forEach((className) => {
						if (classNameErrorCache[className] === undefined) {
							classNameErrorCache[className] = getClassNameErrors(className, namespaces, rule);
						}
						if (classNameErrorCache[className]) {
							stylelint.utils.report({
								ruleName,
								result,
								node: rule,
								message: messages.expected(className, classNameErrorCache[className]),
							});
						}
					});
Esempio n. 29
0
 blacklist.forEach(ext => {
   if (isString(ext) && extensionNormalized === ext ||
     isRegExp(ext) && extensionNormalized.search(ext) !== -1
   ) {
     utils.report({
       message: messages.rejected(extension),
       node: decl,
       word: extension,
       result,
       ruleName,
     })
   }
 })
  return function (root, result) {
    var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
      actual: expectation
    });
    if (!validOptions) {
      return;
    }

    calculationOperatorSpaceChecker({
      root: root,
      result: result,
      checker: checkSpaces
    });
  };