UNPKG

stylelint

Version:
72 lines (58 loc) 2.18 kB
"use strict"; 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 + ":\""; } });