index.cjs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // NOTICE: This file is generated by Rollup. To modify it,
  2. // please instead edit the ESM counterpart and rebuild with Rollup (npm run build).
  3. 'use strict';
  4. const valueParser = require('postcss-value-parser');
  5. const regexes = require('../../utils/regexes.cjs');
  6. const validateTypes = require('../../utils/validateTypes.cjs');
  7. const nodeFieldIndices = require('../../utils/nodeFieldIndices.cjs');
  8. const report = require('../../utils/report.cjs');
  9. const ruleMessages = require('../../utils/ruleMessages.cjs');
  10. const validateOptions = require('../../utils/validateOptions.cjs');
  11. const ruleName = 'layer-name-pattern';
  12. const messages = ruleMessages(ruleName, {
  13. expected: (name, pattern) => `Expected "${name}" to match pattern "${pattern}"`,
  14. });
  15. const meta = {
  16. url: 'https://stylelint.io/user-guide/rules/layer-name-pattern',
  17. };
  18. /** @type {import('stylelint').CoreRules[ruleName]} */
  19. const rule = (primary) => {
  20. return (root, result) => {
  21. const validOptions = validateOptions(result, ruleName, {
  22. actual: primary,
  23. possible: [validateTypes.isRegExp, validateTypes.isString],
  24. });
  25. if (!validOptions) return;
  26. const pattern = validateTypes.isString(primary) ? new RegExp(primary) : primary;
  27. root.walkAtRules(regexes.atRuleRegexes.layerName, (atRule) => {
  28. const { params } = atRule;
  29. if (!params) return;
  30. const parsedParams = valueParser(params);
  31. parsedParams.walk((node) => {
  32. check(node.type, node.value, node.sourceIndex, atRule);
  33. });
  34. });
  35. root.walkAtRules(regexes.atRuleRegexes.importName, (atRule) => {
  36. const { params } = atRule;
  37. if (!regexes.functionRegexes.layer.test(params)) return;
  38. const parsedParams = valueParser(atRule.params);
  39. parsedParams.walk((node) => {
  40. if (node.type !== 'function' || node.value.toLowerCase() !== 'layer') return;
  41. for (const child of node.nodes) {
  42. check(child.type, child.value, child.sourceIndex, atRule);
  43. }
  44. });
  45. });
  46. /**
  47. * @param {string} type
  48. * @param {string} value
  49. * @param {number} sourceIndex
  50. * @param {import('postcss').AtRule} atRule
  51. */
  52. function check(type, value, sourceIndex, atRule) {
  53. if (type !== 'word') return;
  54. if (pattern.test(value)) return;
  55. const index = nodeFieldIndices.atRuleParamIndex(atRule) + sourceIndex;
  56. const endIndex = index + value.length;
  57. report({
  58. message: messages.expected,
  59. messageArgs: [value, primary],
  60. node: atRule,
  61. index,
  62. endIndex,
  63. ruleName,
  64. result,
  65. });
  66. }
  67. };
  68. };
  69. rule.ruleName = ruleName;
  70. rule.messages = messages;
  71. rule.meta = meta;
  72. module.exports = rule;