index.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. 'use strict';
  2. const functionArgumentsSearch = require('../../utils/functionArgumentsSearch');
  3. const isStandardSyntaxUrl = require('../../utils/isStandardSyntaxUrl');
  4. const report = require('../../utils/report');
  5. const ruleMessages = require('../../utils/ruleMessages');
  6. const validateOptions = require('../../utils/validateOptions');
  7. const ruleName = 'function-url-no-scheme-relative';
  8. const messages = ruleMessages(ruleName, {
  9. rejected: 'Unexpected scheme-relative url',
  10. });
  11. const meta = {
  12. url: 'https://stylelint.io/user-guide/rules/function-url-no-scheme-relative',
  13. };
  14. /** @type {import('stylelint').Rule} */
  15. const rule = (primary) => {
  16. return (root, result) => {
  17. const validOptions = validateOptions(result, ruleName, { actual: primary });
  18. if (!validOptions) {
  19. return;
  20. }
  21. root.walkDecls((decl) => {
  22. functionArgumentsSearch(decl.toString().toLowerCase(), 'url', (args, index) => {
  23. const url = args.trim().replace(/^['"]+|['"]+$/g, '');
  24. if (!isStandardSyntaxUrl(url) || !url.startsWith('//')) {
  25. return;
  26. }
  27. report({
  28. message: messages.rejected,
  29. node: decl,
  30. index,
  31. endIndex: index + args.length,
  32. result,
  33. ruleName,
  34. });
  35. });
  36. });
  37. };
  38. };
  39. rule.ruleName = ruleName;
  40. rule.messages = messages;
  41. rule.meta = meta;
  42. module.exports = rule;