index.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 _stylelint = require("stylelint");
  8. var _utils = require("../../utils");
  9. var ruleName = (0, _utils.namespace)("media-feature-value-dollar-variable");
  10. exports.ruleName = ruleName;
  11. var messages = _stylelint.utils.ruleMessages(ruleName, {
  12. rejected: "Unexpected dollar-variable as a media feature value",
  13. expected: "Expected a dollar-variable (e.g. $var) to be used as a media feature value"
  14. });
  15. exports.messages = messages;
  16. var meta = {
  17. url: (0, _utils.ruleUrl)(ruleName)
  18. };
  19. exports.meta = meta;
  20. function rule(expectation, options) {
  21. return function (root, result) {
  22. var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
  23. actual: expectation,
  24. possible: ["always", "never"]
  25. }, {
  26. actual: options,
  27. possible: {
  28. ignore: ["keywords"]
  29. },
  30. optional: true
  31. });
  32. if (!validOptions) {
  33. return;
  34. }
  35. var valueRegex = /:\s*(\S.+?)(:?\s*)\)/;
  36. // In `(max-width: 10px )` find `: 10px )`.
  37. // Got to go with that (the global search doesn't remember parens' insides)
  38. // and parse it again afterwards to remove trailing junk
  39. var valueRegexGlobal = new RegExp(valueRegex.source, "g");
  40. // `$var-name_sth`
  41. var variableRegex = /^(\w+\.)?\$[\w-]+$/;
  42. // `#{$var-name_sth}`
  43. var interpolationVarRegex = /^#{\s*(\w+\.)?\$\w+\s*}$/;
  44. // `none`, `dark`
  45. var keywordValueRegex = /^[a-z][a-z\d-]*$/;
  46. root.walkAtRules("media", function (atRule) {
  47. var found = atRule.params.match(valueRegexGlobal);
  48. // If there are no values
  49. if (!found || !found.length) {
  50. return;
  51. }
  52. found.forEach(function (found) {
  53. // ... parse `: 10px )` to `10px`
  54. var valueParsed = found.match(valueRegex)[1];
  55. // Just a shorthand to stylelint.utils.report()
  56. function complain(message) {
  57. _stylelint.utils.report({
  58. ruleName: ruleName,
  59. result: result,
  60. node: atRule,
  61. word: valueParsed,
  62. message: message
  63. });
  64. }
  65. // Keyword values, like `none`, should always be fine if keywords are
  66. // ignored.
  67. if (keywordValueRegex.test(valueParsed) && (0, _utils.optionsHaveIgnored)(options, "keywords")) {
  68. return;
  69. }
  70. // A value should be a single variable
  71. // or it should be a single variable inside Sass interpolation
  72. if (expectation === "always" && !(variableRegex.test(valueParsed) || interpolationVarRegex.test(valueParsed))) {
  73. complain(messages.expected);
  74. } else if (expectation === "never" && valueParsed.includes("$")) {
  75. // "Never" means no variables at all (functions allowed)
  76. complain(messages.rejected);
  77. }
  78. });
  79. });
  80. };
  81. }
  82. rule.ruleName = ruleName;
  83. rule.messages = messages;
  84. rule.meta = meta;