stylelint
Version:
A mighty, modern CSS linter.
72 lines (58 loc) • 2.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.messages = exports.ruleName = undefined;
exports.default = function (whitelist) {
return function (root, result) {
var validOptions = (0, _utils.validateOptions)(result, ruleName, {
actual: whitelist,
possible: [_lodash.isString]
});
if (!validOptions) {
return;
}
root.walkDecls(function (decl) {
(0, _utils.functionArgumentsSearch)(decl.toString().toLowerCase(), "url", function (args, index) {
var urlString = (0, _lodash.trim)(args, " '\"");
if (!(0, _utils.isStandardSyntaxUrl)(urlString)) {
return;
}
var url = (0, _url.parse)(urlString);
if (url.protocol === null) {
return;
}
var scheme = url.protocol.toLowerCase().slice(0, -1); // strip trailing `:`
// The URL spec does not require a scheme to be followed by `//`, but checking
// for it allows this rule to differentiate <scheme>:<hostname> urls from
// <hostname>:<port> urls. `data:` scheme urls are an exception to this rule.
var slashIndex = url.protocol.length;
var expectedSlashes = urlString.slice(slashIndex, slashIndex + 2);
var isSchemeLessUrl = expectedSlashes !== "//" && scheme !== "data";
if (isSchemeLessUrl) {
return;
}
var whitelistLowerCase = typeof whitelist === "string" ? whitelist.toLowerCase() : whitelist.join("|").toLowerCase().split("|");
if ((0, _utils.containsString)(scheme, whitelistLowerCase)) {
return;
}
(0, _utils.report)({
message: messages.rejected(scheme),
node: decl,
index: index,
result: result,
ruleName: ruleName
});
});
});
};
};
var _utils = require("../../utils");
var _lodash = require("lodash");
var _url = require("url");
var ruleName = exports.ruleName = "function-url-scheme-whitelist";
var messages = exports.messages = (0, _utils.ruleMessages)(ruleName, {
rejected: function rejected(scheme) {
return "Unexpected url scheme \"" + scheme + ":\"";
}
});