index.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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)("partial-no-import");
  12. exports.ruleName = ruleName;
  13. var messages = _stylelint.utils.ruleMessages(ruleName, {
  14. expected: "Unexpected @import in a partial"
  15. });
  16. exports.messages = messages;
  17. var meta = {
  18. url: (0, _utils.ruleUrl)(ruleName)
  19. };
  20. exports.meta = meta;
  21. function rule(on) {
  22. return function (root, result) {
  23. var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
  24. actual: on
  25. });
  26. if (!validOptions) {
  27. return;
  28. }
  29. if (root.source.input.file === undefined || !root.source.input.file) {
  30. result.warn("The 'partial-no-import' rule won't work if linting in a code string without an actual file.");
  31. return;
  32. }
  33. var fileName = _path["default"].basename(root.source.input.file);
  34. var extName = _path["default"].extname(root.source.input.file);
  35. function checkImportForCSS(path, decl) {
  36. // Stripping trailing quotes and whitespaces, if any
  37. var pathStripped = path.replace(/^\s*(["'])\s*/, "").replace(/\s*(["'])\s*$/, "");
  38. // Skipping importing empty import, CSS: url(), ".css", URI with a protocol, media
  39. if (pathStripped.trim() === "" || pathStripped.slice(0, 4) === "url(" || pathStripped.slice(-4) === ".css" || pathStripped.search("//") !== -1 || pathStripped.search(/[\s,)"']\w+$/) !== -1) {
  40. return;
  41. }
  42. _stylelint.utils.report({
  43. message: messages.expected,
  44. node: decl,
  45. index: decl.params.indexOf(path),
  46. result: result,
  47. ruleName: ruleName
  48. });
  49. }
  50. // Usual CSS file
  51. if (extName === ".css") {
  52. return;
  53. }
  54. // Not a partial
  55. if (fileName[0] !== "_") {
  56. return;
  57. }
  58. root.walkAtRules("import", function (mixinCall) {
  59. // Check if @import is treated as CSS import; report only if not
  60. // Processing comma-separated lists of import paths
  61. mixinCall.params.split(/["']\s*,/).forEach(function (path) {
  62. checkImportForCSS(path, mixinCall);
  63. });
  64. });
  65. };
  66. }
  67. rule.ruleName = ruleName;
  68. rule.messages = messages;
  69. rule.meta = meta;