calcAtRulePatternPriority.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module.exports = function calcAtRulePatternPriority(pattern, node) {
  2. // 0 — it pattern doesn't match
  3. // 1 — pattern without `name` and `hasBlock`
  4. // 10010 — pattern match `hasBlock`
  5. // 10100 — pattern match `name`
  6. // 20110 — pattern match `name` and `hasBlock`
  7. // 21100 — patter match `name` and `parameter`
  8. // 31110 — patter match `name`, `parameter`, and `hasBlock`
  9. let priority = 0;
  10. // match `hasBlock`
  11. if (pattern.hasOwnProperty('hasBlock') && node.hasBlock === pattern.hasBlock) {
  12. priority += 10;
  13. priority += 10000;
  14. }
  15. // match `name`
  16. if (pattern.hasOwnProperty('name') && node.name === pattern.name) {
  17. priority += 100;
  18. priority += 10000;
  19. }
  20. // match `name`
  21. if (pattern.hasOwnProperty('parameter') && pattern.parameter.test(node.parameter)) {
  22. priority += 1100;
  23. priority += 10000;
  24. }
  25. // doesn't have `name` and `hasBlock`
  26. if (
  27. !pattern.hasOwnProperty('hasBlock') &&
  28. !pattern.hasOwnProperty('name') &&
  29. !pattern.hasOwnProperty('paremeter')
  30. ) {
  31. priority = 1;
  32. }
  33. // patter has `name` and `hasBlock`, but it doesn't match both properties
  34. if (pattern.hasOwnProperty('hasBlock') && pattern.hasOwnProperty('name') && priority < 20000) {
  35. priority = 0;
  36. }
  37. // patter has `name` and `parameter`, but it doesn't match both properties
  38. if (pattern.hasOwnProperty('name') && pattern.hasOwnProperty('parameter') && priority < 21100) {
  39. priority = 0;
  40. }
  41. // patter has `name`, `parameter`, and `hasBlock`, but it doesn't match all properties
  42. if (
  43. pattern.hasOwnProperty('name') &&
  44. pattern.hasOwnProperty('parameter') &&
  45. pattern.hasOwnProperty('hasBlock') &&
  46. priority < 30000
  47. ) {
  48. priority = 0;
  49. }
  50. return priority;
  51. };