index.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports["default"] = rule;
  6. exports.ruleName = exports.meta = exports.messages = void 0;
  7. var _path = _interopRequireDefault(require("path"));
  8. var _stylelint = require("stylelint");
  9. var _utils = require("../../utils");
  10. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
  11. var ruleName = (0, _utils.namespace)("at-import-partial-extension");
  12. exports.ruleName = ruleName;
  13. var messages = _stylelint.utils.ruleMessages(ruleName, {
  14. expected: "Expected @import to have an extension",
  15. rejected: function rejected(ext) {
  16. return "Unexpected extension \".".concat(ext, "\" in @import");
  17. }
  18. });
  19. exports.messages = messages;
  20. var meta = {
  21. url: (0, _utils.ruleUrl)(ruleName)
  22. };
  23. // https://drafts.csswg.org/mediaqueries/#media-types
  24. exports.meta = meta;
  25. var mediaQueryTypes = ["all", "print", "screen", "speech", "tv", "tty", "projection", "handheld", "braille", "embossed", "aural"];
  26. var mediaQueryTypesRE = new RegExp("(".concat(mediaQueryTypes.join("|"), ")$"), "i");
  27. var stripPath = function stripPath(path) {
  28. return path.replace(/^\s*(["'])\s*/, "").replace(/\s*(["'])\s*$/, "");
  29. };
  30. function rule(expectation, _, context) {
  31. return function (root, result) {
  32. var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
  33. actual: expectation,
  34. possible: ["always", "never"]
  35. });
  36. if (!validOptions) {
  37. return;
  38. }
  39. root.walkAtRules("import", function (decl) {
  40. var paths = decl.params.split(/["']\s*,/).filter(function (path) {
  41. return !mediaQueryTypesRE.test(path.trim());
  42. });
  43. // Processing comma-separated lists of import paths
  44. paths.forEach(function (path) {
  45. // Stripping trailing quotes and whitespaces, if any
  46. var pathStripped = stripPath(path);
  47. // Skipping importing CSS: url(), ".css", URI with a protocol
  48. if (pathStripped.slice(0, 4) === "url(" || pathStripped.slice(-4) === ".css" || pathStripped.search("//") !== -1) {
  49. return;
  50. }
  51. var extension = _path["default"].extname(pathStripped).slice(1);
  52. if (!extension && expectation === "always") {
  53. _stylelint.utils.report({
  54. message: messages.expected,
  55. node: decl,
  56. result: result,
  57. ruleName: ruleName
  58. });
  59. return;
  60. }
  61. var isScssPartial = extension === "scss";
  62. if (extension && isScssPartial && expectation === "never") {
  63. if (context.fix) {
  64. var extPattern = new RegExp("\\.".concat(extension, "(['\" ]*)$"), "g");
  65. decl.params = decl.params.replace(extPattern, "$1");
  66. return;
  67. }
  68. _stylelint.utils.report({
  69. message: messages.rejected(extension),
  70. node: decl,
  71. word: extension,
  72. result: result,
  73. ruleName: ruleName
  74. });
  75. }
  76. });
  77. });
  78. };
  79. }
  80. rule.ruleName = ruleName;
  81. rule.messages = messages;
  82. rule.meta = meta;