index.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. 'use strict';
  2. const eachDeclarationBlock = require('../../utils/eachDeclarationBlock');
  3. const report = require('../../utils/report');
  4. const ruleMessages = require('../../utils/ruleMessages');
  5. const { longhandSubPropertiesOfShorthandProperties } = require('../../reference/properties');
  6. const validateOptions = require('../../utils/validateOptions');
  7. const vendor = require('../../utils/vendor');
  8. const ruleName = 'declaration-block-no-shorthand-property-overrides';
  9. const messages = ruleMessages(ruleName, {
  10. rejected: (shorthand, original) => `Unexpected shorthand "${shorthand}" after "${original}"`,
  11. });
  12. const meta = {
  13. url: 'https://stylelint.io/user-guide/rules/list/declaration-block-no-shorthand-property-overrides',
  14. };
  15. /** @type {import('stylelint').Rule} */
  16. const rule = (primary) => {
  17. return (root, result) => {
  18. const validOptions = validateOptions(result, ruleName, { actual: primary });
  19. if (!validOptions) {
  20. return;
  21. }
  22. eachDeclarationBlock(root, (eachDecl) => {
  23. /** @type {Map<string, string>} */
  24. const declarations = new Map();
  25. eachDecl((decl) => {
  26. const prop = decl.prop;
  27. const unprefixedProp = vendor.unprefixed(prop).toLowerCase();
  28. const prefix = vendor.prefix(prop).toLowerCase();
  29. const overrideables = /** @type {Map<string, Set<string>>} */ (
  30. longhandSubPropertiesOfShorthandProperties
  31. ).get(unprefixedProp);
  32. if (!overrideables) {
  33. declarations.set(prop.toLowerCase(), prop);
  34. return;
  35. }
  36. for (const longhandProp of overrideables) {
  37. const declaration = declarations.get(prefix + longhandProp);
  38. if (!declaration) {
  39. continue;
  40. }
  41. report({
  42. ruleName,
  43. result,
  44. node: decl,
  45. message: messages.rejected(prop, declaration || ''),
  46. word: prop,
  47. });
  48. }
  49. });
  50. });
  51. };
  52. };
  53. rule.ruleName = ruleName;
  54. rule.messages = messages;
  55. rule.meta = meta;
  56. module.exports = rule;