blob: 8281656fcc7871a15a6aa7079e31cb9af056edf0 [file] [log] [blame]
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = _default;
exports.ruleName = exports.messages = void 0;
var _path = _interopRequireDefault(require("path"));
var _stylelint = require("stylelint");
var _utils = require("../../utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var ruleName = (0, _utils.namespace)("at-import-partial-extension");
exports.ruleName = ruleName;
var messages = _stylelint.utils.ruleMessages(ruleName, {
expected: "Expected @import to have an extension",
rejected: function rejected(ext) {
return "Unexpected extension \".".concat(ext, "\" in @import");
}
}); // https://drafts.csswg.org/mediaqueries/#media-types
exports.messages = messages;
var mediaQueryTypes = ["all", "print", "screen", "speech", "tv", "tty", "projection", "handheld", "braille", "embossed", "aural"];
var mediaQueryTypesRE = new RegExp("(".concat(mediaQueryTypes.join("|"), ")$"), "i");
var stripPath = function stripPath(path) {
return path.replace(/^\s*(["'])\s*/, "").replace(/\s*(["'])\s*$/, "");
};
function _default(expectation) {
return function (root, result) {
var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
actual: expectation,
possible: ["always", "never"]
});
if (!validOptions) {
return;
}
root.walkAtRules("import", function (decl) {
var paths = decl.params.split(/["']\s*,/).filter(function (path) {
return !mediaQueryTypesRE.test(path.trim());
}); // Processing comma-separated lists of import paths
paths.forEach(function (path) {
// Stripping trailing quotes and whitespaces, if any
var pathStripped = stripPath(path); // Skipping importing CSS: url(), ".css", URI with a protocol
if (pathStripped.slice(0, 4) === "url(" || pathStripped.slice(-4) === ".css" || pathStripped.search("//") !== -1) {
return;
}
var extension = _path["default"].extname(pathStripped).slice(1);
if (!extension && expectation === "always") {
_stylelint.utils.report({
message: messages.expected,
node: decl,
result: result,
ruleName: ruleName
});
return;
}
if (extension && expectation === "never") {
_stylelint.utils.report({
message: messages.rejected(extension),
node: decl,
word: extension,
result: result,
ruleName: ruleName
});
}
});
});
};
}