@spiracss/stylelint-plugin 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/README.md +14 -18
  2. package/dist/cjs/helpers.d.ts +109 -35
  3. package/dist/cjs/helpers.d.ts.map +1 -1
  4. package/dist/cjs/helpers.js +257 -171
  5. package/dist/cjs/helpers.js.map +1 -1
  6. package/dist/cjs/index.d.ts.map +1 -1
  7. package/dist/cjs/index.js +4 -0
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/rules/spiracss-class-structure.d.ts.map +1 -1
  10. package/dist/cjs/rules/spiracss-class-structure.js +96 -40
  11. package/dist/cjs/rules/spiracss-class-structure.js.map +1 -1
  12. package/dist/cjs/rules/spiracss-class-structure.messages.d.ts +10 -8
  13. package/dist/cjs/rules/spiracss-class-structure.messages.d.ts.map +1 -1
  14. package/dist/cjs/rules/spiracss-class-structure.messages.js +59 -26
  15. package/dist/cjs/rules/spiracss-class-structure.messages.js.map +1 -1
  16. package/dist/cjs/rules/spiracss-class-structure.options.d.ts.map +1 -1
  17. package/dist/cjs/rules/spiracss-class-structure.options.js +71 -56
  18. package/dist/cjs/rules/spiracss-class-structure.options.js.map +1 -1
  19. package/dist/cjs/rules/spiracss-class-structure.patterns.d.ts +4 -4
  20. package/dist/cjs/rules/spiracss-class-structure.patterns.d.ts.map +1 -1
  21. package/dist/cjs/rules/spiracss-class-structure.patterns.js +24 -27
  22. package/dist/cjs/rules/spiracss-class-structure.patterns.js.map +1 -1
  23. package/dist/cjs/rules/spiracss-class-structure.selectors.d.ts +3 -4
  24. package/dist/cjs/rules/spiracss-class-structure.selectors.d.ts.map +1 -1
  25. package/dist/cjs/rules/spiracss-class-structure.selectors.js +34 -60
  26. package/dist/cjs/rules/spiracss-class-structure.selectors.js.map +1 -1
  27. package/dist/cjs/rules/spiracss-class-structure.types.d.ts +32 -12
  28. package/dist/cjs/rules/spiracss-class-structure.types.d.ts.map +1 -1
  29. package/dist/cjs/rules/spiracss-interaction-properties.d.ts.map +1 -1
  30. package/dist/cjs/rules/spiracss-interaction-properties.js +207 -116
  31. package/dist/cjs/rules/spiracss-interaction-properties.js.map +1 -1
  32. package/dist/cjs/rules/spiracss-interaction-properties.messages.d.ts +4 -3
  33. package/dist/cjs/rules/spiracss-interaction-properties.messages.d.ts.map +1 -1
  34. package/dist/cjs/rules/spiracss-interaction-properties.messages.js +11 -12
  35. package/dist/cjs/rules/spiracss-interaction-properties.messages.js.map +1 -1
  36. package/dist/cjs/rules/spiracss-interaction-properties.options.d.ts.map +1 -1
  37. package/dist/cjs/rules/spiracss-interaction-properties.options.js +12 -14
  38. package/dist/cjs/rules/spiracss-interaction-properties.options.js.map +1 -1
  39. package/dist/cjs/rules/spiracss-interaction-properties.types.d.ts +9 -5
  40. package/dist/cjs/rules/spiracss-interaction-properties.types.d.ts.map +1 -1
  41. package/dist/cjs/rules/spiracss-interaction-scope.d.ts.map +1 -1
  42. package/dist/cjs/rules/spiracss-interaction-scope.js +21 -21
  43. package/dist/cjs/rules/spiracss-interaction-scope.js.map +1 -1
  44. package/dist/cjs/rules/spiracss-interaction-scope.messages.d.ts +4 -3
  45. package/dist/cjs/rules/spiracss-interaction-scope.messages.d.ts.map +1 -1
  46. package/dist/cjs/rules/spiracss-interaction-scope.messages.js +9 -11
  47. package/dist/cjs/rules/spiracss-interaction-scope.messages.js.map +1 -1
  48. package/dist/cjs/rules/spiracss-interaction-scope.options.d.ts.map +1 -1
  49. package/dist/cjs/rules/spiracss-interaction-scope.options.js +35 -41
  50. package/dist/cjs/rules/spiracss-interaction-scope.options.js.map +1 -1
  51. package/dist/cjs/rules/spiracss-interaction-scope.types.d.ts +14 -14
  52. package/dist/cjs/rules/spiracss-interaction-scope.types.d.ts.map +1 -1
  53. package/dist/cjs/rules/spiracss-interaction-scope.utils.d.ts.map +1 -1
  54. package/dist/cjs/rules/spiracss-interaction-scope.utils.js +31 -11
  55. package/dist/cjs/rules/spiracss-interaction-scope.utils.js.map +1 -1
  56. package/dist/cjs/rules/spiracss-keyframes-naming.d.ts.map +1 -1
  57. package/dist/cjs/rules/spiracss-keyframes-naming.js +31 -28
  58. package/dist/cjs/rules/spiracss-keyframes-naming.js.map +1 -1
  59. package/dist/cjs/rules/spiracss-keyframes-naming.messages.d.ts +6 -4
  60. package/dist/cjs/rules/spiracss-keyframes-naming.messages.d.ts.map +1 -1
  61. package/dist/cjs/rules/spiracss-keyframes-naming.messages.js +12 -25
  62. package/dist/cjs/rules/spiracss-keyframes-naming.messages.js.map +1 -1
  63. package/dist/cjs/rules/spiracss-keyframes-naming.options.d.ts.map +1 -1
  64. package/dist/cjs/rules/spiracss-keyframes-naming.options.js +46 -24
  65. package/dist/cjs/rules/spiracss-keyframes-naming.options.js.map +1 -1
  66. package/dist/cjs/rules/spiracss-keyframes-naming.types.d.ts +21 -11
  67. package/dist/cjs/rules/spiracss-keyframes-naming.types.d.ts.map +1 -1
  68. package/dist/cjs/rules/spiracss-page-layer.constants.d.ts +2 -0
  69. package/dist/cjs/rules/spiracss-page-layer.constants.d.ts.map +1 -0
  70. package/dist/cjs/rules/spiracss-page-layer.constants.js +5 -0
  71. package/dist/cjs/rules/spiracss-page-layer.constants.js.map +1 -0
  72. package/dist/cjs/rules/spiracss-page-layer.d.ts +5 -0
  73. package/dist/cjs/rules/spiracss-page-layer.d.ts.map +1 -0
  74. package/dist/cjs/rules/spiracss-page-layer.js +243 -0
  75. package/dist/cjs/rules/spiracss-page-layer.js.map +1 -0
  76. package/dist/cjs/rules/spiracss-page-layer.messages.d.ts +7 -0
  77. package/dist/cjs/rules/spiracss-page-layer.messages.d.ts.map +1 -0
  78. package/dist/cjs/rules/spiracss-page-layer.messages.js +15 -0
  79. package/dist/cjs/rules/spiracss-page-layer.messages.js.map +1 -0
  80. package/dist/cjs/rules/spiracss-page-layer.options.d.ts +4 -0
  81. package/dist/cjs/rules/spiracss-page-layer.options.d.ts.map +1 -0
  82. package/dist/cjs/rules/spiracss-page-layer.options.js +59 -0
  83. package/dist/cjs/rules/spiracss-page-layer.options.js.map +1 -0
  84. package/dist/cjs/rules/spiracss-page-layer.types.d.ts +19 -0
  85. package/dist/cjs/rules/spiracss-page-layer.types.d.ts.map +1 -0
  86. package/dist/cjs/rules/spiracss-page-layer.types.js +3 -0
  87. package/dist/cjs/rules/spiracss-page-layer.types.js.map +1 -0
  88. package/dist/cjs/rules/spiracss-property-placement.constants.d.ts +2 -0
  89. package/dist/cjs/rules/spiracss-property-placement.constants.d.ts.map +1 -0
  90. package/dist/cjs/rules/spiracss-property-placement.constants.js +5 -0
  91. package/dist/cjs/rules/spiracss-property-placement.constants.js.map +1 -0
  92. package/dist/cjs/rules/spiracss-property-placement.d.ts +5 -0
  93. package/dist/cjs/rules/spiracss-property-placement.d.ts.map +1 -0
  94. package/dist/cjs/rules/spiracss-property-placement.js +646 -0
  95. package/dist/cjs/rules/spiracss-property-placement.js.map +1 -0
  96. package/dist/cjs/rules/spiracss-property-placement.messages.d.ts +19 -0
  97. package/dist/cjs/rules/spiracss-property-placement.messages.d.ts.map +1 -0
  98. package/dist/cjs/rules/spiracss-property-placement.messages.js +110 -0
  99. package/dist/cjs/rules/spiracss-property-placement.messages.js.map +1 -0
  100. package/dist/cjs/rules/spiracss-property-placement.options.d.ts +4 -0
  101. package/dist/cjs/rules/spiracss-property-placement.options.d.ts.map +1 -0
  102. package/dist/cjs/rules/spiracss-property-placement.options.js +74 -0
  103. package/dist/cjs/rules/spiracss-property-placement.options.js.map +1 -0
  104. package/dist/cjs/rules/spiracss-property-placement.selectors.d.ts +41 -0
  105. package/dist/cjs/rules/spiracss-property-placement.selectors.d.ts.map +1 -0
  106. package/dist/cjs/rules/spiracss-property-placement.selectors.js +983 -0
  107. package/dist/cjs/rules/spiracss-property-placement.selectors.js.map +1 -0
  108. package/dist/cjs/rules/spiracss-property-placement.types.d.ts +28 -0
  109. package/dist/cjs/rules/spiracss-property-placement.types.d.ts.map +1 -0
  110. package/dist/cjs/rules/spiracss-property-placement.types.js +3 -0
  111. package/dist/cjs/rules/spiracss-property-placement.types.js.map +1 -0
  112. package/dist/cjs/rules/spiracss-property-placement.values.d.ts +19 -0
  113. package/dist/cjs/rules/spiracss-property-placement.values.d.ts.map +1 -0
  114. package/dist/cjs/rules/spiracss-property-placement.values.js +176 -0
  115. package/dist/cjs/rules/spiracss-property-placement.values.js.map +1 -0
  116. package/dist/cjs/rules/spiracss-pseudo-nesting.d.ts.map +1 -1
  117. package/dist/cjs/rules/spiracss-pseudo-nesting.js +18 -18
  118. package/dist/cjs/rules/spiracss-pseudo-nesting.js.map +1 -1
  119. package/dist/cjs/rules/spiracss-pseudo-nesting.messages.d.ts +6 -0
  120. package/dist/cjs/rules/spiracss-pseudo-nesting.messages.d.ts.map +1 -0
  121. package/dist/cjs/rules/spiracss-pseudo-nesting.messages.js +10 -0
  122. package/dist/cjs/rules/spiracss-pseudo-nesting.messages.js.map +1 -0
  123. package/dist/cjs/rules/spiracss-pseudo-nesting.types.d.ts +1 -1
  124. package/dist/cjs/rules/spiracss-pseudo-nesting.types.d.ts.map +1 -1
  125. package/dist/cjs/rules/spiracss-rel-comments.alias.d.ts.map +1 -1
  126. package/dist/cjs/rules/spiracss-rel-comments.alias.js +59 -11
  127. package/dist/cjs/rules/spiracss-rel-comments.alias.js.map +1 -1
  128. package/dist/cjs/rules/spiracss-rel-comments.d.ts.map +1 -1
  129. package/dist/cjs/rules/spiracss-rel-comments.js +68 -38
  130. package/dist/cjs/rules/spiracss-rel-comments.js.map +1 -1
  131. package/dist/cjs/rules/spiracss-rel-comments.messages.d.ts +5 -4
  132. package/dist/cjs/rules/spiracss-rel-comments.messages.d.ts.map +1 -1
  133. package/dist/cjs/rules/spiracss-rel-comments.messages.js +16 -12
  134. package/dist/cjs/rules/spiracss-rel-comments.messages.js.map +1 -1
  135. package/dist/cjs/rules/spiracss-rel-comments.options.d.ts.map +1 -1
  136. package/dist/cjs/rules/spiracss-rel-comments.options.js +62 -34
  137. package/dist/cjs/rules/spiracss-rel-comments.options.js.map +1 -1
  138. package/dist/cjs/rules/spiracss-rel-comments.selectors.d.ts.map +1 -1
  139. package/dist/cjs/rules/spiracss-rel-comments.selectors.js +4 -5
  140. package/dist/cjs/rules/spiracss-rel-comments.selectors.js.map +1 -1
  141. package/dist/cjs/rules/spiracss-rel-comments.types.d.ts +29 -15
  142. package/dist/cjs/rules/spiracss-rel-comments.types.d.ts.map +1 -1
  143. package/dist/cjs/types.d.ts +2 -0
  144. package/dist/cjs/types.d.ts.map +1 -1
  145. package/dist/cjs/utils/cache.d.ts +3 -0
  146. package/dist/cjs/utils/cache.d.ts.map +1 -1
  147. package/dist/cjs/utils/cache.js +30 -6
  148. package/dist/cjs/utils/cache.js.map +1 -1
  149. package/dist/cjs/utils/constants.d.ts +1 -0
  150. package/dist/cjs/utils/constants.d.ts.map +1 -1
  151. package/dist/cjs/utils/constants.js +14 -1
  152. package/dist/cjs/utils/constants.js.map +1 -1
  153. package/dist/cjs/utils/formatting.d.ts +5 -1
  154. package/dist/cjs/utils/formatting.d.ts.map +1 -1
  155. package/dist/cjs/utils/formatting.js +16 -7
  156. package/dist/cjs/utils/formatting.js.map +1 -1
  157. package/dist/cjs/utils/messages.d.ts +25 -0
  158. package/dist/cjs/utils/messages.d.ts.map +1 -0
  159. package/dist/cjs/utils/messages.js +174 -0
  160. package/dist/cjs/utils/messages.js.map +1 -0
  161. package/dist/cjs/utils/naming.d.ts +1 -2
  162. package/dist/cjs/utils/naming.d.ts.map +1 -1
  163. package/dist/cjs/utils/naming.js +1 -9
  164. package/dist/cjs/utils/naming.js.map +1 -1
  165. package/dist/cjs/utils/normalize.d.ts +1 -0
  166. package/dist/cjs/utils/normalize.d.ts.map +1 -1
  167. package/dist/cjs/utils/normalize.js +53 -8
  168. package/dist/cjs/utils/normalize.js.map +1 -1
  169. package/dist/cjs/utils/option-schema.d.ts +11 -8
  170. package/dist/cjs/utils/option-schema.d.ts.map +1 -1
  171. package/dist/cjs/utils/option-schema.js +12 -9
  172. package/dist/cjs/utils/option-schema.js.map +1 -1
  173. package/dist/cjs/utils/options.d.ts +34 -0
  174. package/dist/cjs/utils/options.d.ts.map +1 -0
  175. package/dist/cjs/utils/options.js +41 -0
  176. package/dist/cjs/utils/options.js.map +1 -0
  177. package/dist/cjs/utils/rule-docs.d.ts +2 -0
  178. package/dist/cjs/utils/rule-docs.d.ts.map +1 -0
  179. package/dist/cjs/utils/rule-docs.js +22 -0
  180. package/dist/cjs/utils/rule-docs.js.map +1 -0
  181. package/dist/cjs/utils/section.d.ts.map +1 -1
  182. package/dist/cjs/utils/section.js +32 -39
  183. package/dist/cjs/utils/section.js.map +1 -1
  184. package/dist/cjs/utils/selector-policy.d.ts +16 -0
  185. package/dist/cjs/utils/selector-policy.d.ts.map +1 -0
  186. package/dist/cjs/utils/selector-policy.js +57 -0
  187. package/dist/cjs/utils/selector-policy.js.map +1 -0
  188. package/dist/cjs/utils/selector.d.ts +4 -1
  189. package/dist/cjs/utils/selector.d.ts.map +1 -1
  190. package/dist/cjs/utils/selector.js +62 -37
  191. package/dist/cjs/utils/selector.js.map +1 -1
  192. package/dist/cjs/utils/stylelint.d.ts +0 -1
  193. package/dist/cjs/utils/stylelint.d.ts.map +1 -1
  194. package/dist/cjs/utils/stylelint.js +18 -4
  195. package/dist/cjs/utils/stylelint.js.map +1 -1
  196. package/dist/esm/helpers.d.ts +109 -35
  197. package/dist/esm/helpers.d.ts.map +1 -1
  198. package/dist/esm/helpers.js +257 -171
  199. package/dist/esm/helpers.js.map +1 -1
  200. package/dist/esm/index.d.ts.map +1 -1
  201. package/dist/esm/index.js +4 -0
  202. package/dist/esm/index.js.map +1 -1
  203. package/dist/esm/rules/spiracss-class-structure.d.ts.map +1 -1
  204. package/dist/esm/rules/spiracss-class-structure.js +101 -45
  205. package/dist/esm/rules/spiracss-class-structure.js.map +1 -1
  206. package/dist/esm/rules/spiracss-class-structure.messages.d.ts +10 -8
  207. package/dist/esm/rules/spiracss-class-structure.messages.d.ts.map +1 -1
  208. package/dist/esm/rules/spiracss-class-structure.messages.js +59 -23
  209. package/dist/esm/rules/spiracss-class-structure.messages.js.map +1 -1
  210. package/dist/esm/rules/spiracss-class-structure.options.d.ts.map +1 -1
  211. package/dist/esm/rules/spiracss-class-structure.options.js +73 -58
  212. package/dist/esm/rules/spiracss-class-structure.options.js.map +1 -1
  213. package/dist/esm/rules/spiracss-class-structure.patterns.d.ts +4 -4
  214. package/dist/esm/rules/spiracss-class-structure.patterns.d.ts.map +1 -1
  215. package/dist/esm/rules/spiracss-class-structure.patterns.js +25 -28
  216. package/dist/esm/rules/spiracss-class-structure.patterns.js.map +1 -1
  217. package/dist/esm/rules/spiracss-class-structure.selectors.d.ts +3 -4
  218. package/dist/esm/rules/spiracss-class-structure.selectors.d.ts.map +1 -1
  219. package/dist/esm/rules/spiracss-class-structure.selectors.js +34 -59
  220. package/dist/esm/rules/spiracss-class-structure.selectors.js.map +1 -1
  221. package/dist/esm/rules/spiracss-class-structure.types.d.ts +32 -12
  222. package/dist/esm/rules/spiracss-class-structure.types.d.ts.map +1 -1
  223. package/dist/esm/rules/spiracss-interaction-properties.d.ts.map +1 -1
  224. package/dist/esm/rules/spiracss-interaction-properties.js +203 -112
  225. package/dist/esm/rules/spiracss-interaction-properties.js.map +1 -1
  226. package/dist/esm/rules/spiracss-interaction-properties.messages.d.ts +4 -3
  227. package/dist/esm/rules/spiracss-interaction-properties.messages.d.ts.map +1 -1
  228. package/dist/esm/rules/spiracss-interaction-properties.messages.js +11 -9
  229. package/dist/esm/rules/spiracss-interaction-properties.messages.js.map +1 -1
  230. package/dist/esm/rules/spiracss-interaction-properties.options.d.ts.map +1 -1
  231. package/dist/esm/rules/spiracss-interaction-properties.options.js +13 -15
  232. package/dist/esm/rules/spiracss-interaction-properties.options.js.map +1 -1
  233. package/dist/esm/rules/spiracss-interaction-properties.types.d.ts +9 -5
  234. package/dist/esm/rules/spiracss-interaction-properties.types.d.ts.map +1 -1
  235. package/dist/esm/rules/spiracss-interaction-scope.d.ts.map +1 -1
  236. package/dist/esm/rules/spiracss-interaction-scope.js +22 -22
  237. package/dist/esm/rules/spiracss-interaction-scope.js.map +1 -1
  238. package/dist/esm/rules/spiracss-interaction-scope.messages.d.ts +4 -3
  239. package/dist/esm/rules/spiracss-interaction-scope.messages.d.ts.map +1 -1
  240. package/dist/esm/rules/spiracss-interaction-scope.messages.js +9 -8
  241. package/dist/esm/rules/spiracss-interaction-scope.messages.js.map +1 -1
  242. package/dist/esm/rules/spiracss-interaction-scope.options.d.ts.map +1 -1
  243. package/dist/esm/rules/spiracss-interaction-scope.options.js +37 -43
  244. package/dist/esm/rules/spiracss-interaction-scope.options.js.map +1 -1
  245. package/dist/esm/rules/spiracss-interaction-scope.types.d.ts +14 -14
  246. package/dist/esm/rules/spiracss-interaction-scope.types.d.ts.map +1 -1
  247. package/dist/esm/rules/spiracss-interaction-scope.utils.d.ts.map +1 -1
  248. package/dist/esm/rules/spiracss-interaction-scope.utils.js +31 -11
  249. package/dist/esm/rules/spiracss-interaction-scope.utils.js.map +1 -1
  250. package/dist/esm/rules/spiracss-keyframes-naming.d.ts.map +1 -1
  251. package/dist/esm/rules/spiracss-keyframes-naming.js +32 -29
  252. package/dist/esm/rules/spiracss-keyframes-naming.js.map +1 -1
  253. package/dist/esm/rules/spiracss-keyframes-naming.messages.d.ts +6 -4
  254. package/dist/esm/rules/spiracss-keyframes-naming.messages.d.ts.map +1 -1
  255. package/dist/esm/rules/spiracss-keyframes-naming.messages.js +12 -22
  256. package/dist/esm/rules/spiracss-keyframes-naming.messages.js.map +1 -1
  257. package/dist/esm/rules/spiracss-keyframes-naming.options.d.ts.map +1 -1
  258. package/dist/esm/rules/spiracss-keyframes-naming.options.js +47 -25
  259. package/dist/esm/rules/spiracss-keyframes-naming.options.js.map +1 -1
  260. package/dist/esm/rules/spiracss-keyframes-naming.types.d.ts +21 -11
  261. package/dist/esm/rules/spiracss-keyframes-naming.types.d.ts.map +1 -1
  262. package/dist/esm/rules/spiracss-page-layer.constants.d.ts +2 -0
  263. package/dist/esm/rules/spiracss-page-layer.constants.d.ts.map +1 -0
  264. package/dist/esm/rules/spiracss-page-layer.constants.js +2 -0
  265. package/dist/esm/rules/spiracss-page-layer.constants.js.map +1 -0
  266. package/dist/esm/rules/spiracss-page-layer.d.ts +5 -0
  267. package/dist/esm/rules/spiracss-page-layer.d.ts.map +1 -0
  268. package/dist/esm/rules/spiracss-page-layer.js +237 -0
  269. package/dist/esm/rules/spiracss-page-layer.js.map +1 -0
  270. package/dist/esm/rules/spiracss-page-layer.messages.d.ts +7 -0
  271. package/dist/esm/rules/spiracss-page-layer.messages.d.ts.map +1 -0
  272. package/dist/esm/rules/spiracss-page-layer.messages.js +12 -0
  273. package/dist/esm/rules/spiracss-page-layer.messages.js.map +1 -0
  274. package/dist/esm/rules/spiracss-page-layer.options.d.ts +4 -0
  275. package/dist/esm/rules/spiracss-page-layer.options.d.ts.map +1 -0
  276. package/dist/esm/rules/spiracss-page-layer.options.js +55 -0
  277. package/dist/esm/rules/spiracss-page-layer.options.js.map +1 -0
  278. package/dist/esm/rules/spiracss-page-layer.types.d.ts +19 -0
  279. package/dist/esm/rules/spiracss-page-layer.types.d.ts.map +1 -0
  280. package/dist/esm/rules/spiracss-page-layer.types.js +2 -0
  281. package/dist/esm/rules/spiracss-page-layer.types.js.map +1 -0
  282. package/dist/esm/rules/spiracss-property-placement.constants.d.ts +2 -0
  283. package/dist/esm/rules/spiracss-property-placement.constants.d.ts.map +1 -0
  284. package/dist/esm/rules/spiracss-property-placement.constants.js +2 -0
  285. package/dist/esm/rules/spiracss-property-placement.constants.js.map +1 -0
  286. package/dist/esm/rules/spiracss-property-placement.d.ts +5 -0
  287. package/dist/esm/rules/spiracss-property-placement.d.ts.map +1 -0
  288. package/dist/esm/rules/spiracss-property-placement.js +640 -0
  289. package/dist/esm/rules/spiracss-property-placement.js.map +1 -0
  290. package/dist/esm/rules/spiracss-property-placement.messages.d.ts +19 -0
  291. package/dist/esm/rules/spiracss-property-placement.messages.d.ts.map +1 -0
  292. package/dist/esm/rules/spiracss-property-placement.messages.js +107 -0
  293. package/dist/esm/rules/spiracss-property-placement.messages.js.map +1 -0
  294. package/dist/esm/rules/spiracss-property-placement.options.d.ts +4 -0
  295. package/dist/esm/rules/spiracss-property-placement.options.d.ts.map +1 -0
  296. package/dist/esm/rules/spiracss-property-placement.options.js +70 -0
  297. package/dist/esm/rules/spiracss-property-placement.options.js.map +1 -0
  298. package/dist/esm/rules/spiracss-property-placement.selectors.d.ts +41 -0
  299. package/dist/esm/rules/spiracss-property-placement.selectors.d.ts.map +1 -0
  300. package/dist/esm/rules/spiracss-property-placement.selectors.js +970 -0
  301. package/dist/esm/rules/spiracss-property-placement.selectors.js.map +1 -0
  302. package/dist/esm/rules/spiracss-property-placement.types.d.ts +28 -0
  303. package/dist/esm/rules/spiracss-property-placement.types.d.ts.map +1 -0
  304. package/dist/esm/rules/spiracss-property-placement.types.js +2 -0
  305. package/dist/esm/rules/spiracss-property-placement.types.js.map +1 -0
  306. package/dist/esm/rules/spiracss-property-placement.values.d.ts +19 -0
  307. package/dist/esm/rules/spiracss-property-placement.values.d.ts.map +1 -0
  308. package/dist/esm/rules/spiracss-property-placement.values.js +169 -0
  309. package/dist/esm/rules/spiracss-property-placement.values.js.map +1 -0
  310. package/dist/esm/rules/spiracss-pseudo-nesting.d.ts.map +1 -1
  311. package/dist/esm/rules/spiracss-pseudo-nesting.js +18 -18
  312. package/dist/esm/rules/spiracss-pseudo-nesting.js.map +1 -1
  313. package/dist/esm/rules/spiracss-pseudo-nesting.messages.d.ts +6 -0
  314. package/dist/esm/rules/spiracss-pseudo-nesting.messages.d.ts.map +1 -0
  315. package/dist/esm/rules/spiracss-pseudo-nesting.messages.js +7 -0
  316. package/dist/esm/rules/spiracss-pseudo-nesting.messages.js.map +1 -0
  317. package/dist/esm/rules/spiracss-pseudo-nesting.types.d.ts +1 -1
  318. package/dist/esm/rules/spiracss-pseudo-nesting.types.d.ts.map +1 -1
  319. package/dist/esm/rules/spiracss-rel-comments.alias.d.ts.map +1 -1
  320. package/dist/esm/rules/spiracss-rel-comments.alias.js +59 -11
  321. package/dist/esm/rules/spiracss-rel-comments.alias.js.map +1 -1
  322. package/dist/esm/rules/spiracss-rel-comments.d.ts.map +1 -1
  323. package/dist/esm/rules/spiracss-rel-comments.js +72 -42
  324. package/dist/esm/rules/spiracss-rel-comments.js.map +1 -1
  325. package/dist/esm/rules/spiracss-rel-comments.messages.d.ts +5 -4
  326. package/dist/esm/rules/spiracss-rel-comments.messages.d.ts.map +1 -1
  327. package/dist/esm/rules/spiracss-rel-comments.messages.js +16 -9
  328. package/dist/esm/rules/spiracss-rel-comments.messages.js.map +1 -1
  329. package/dist/esm/rules/spiracss-rel-comments.options.d.ts.map +1 -1
  330. package/dist/esm/rules/spiracss-rel-comments.options.js +64 -36
  331. package/dist/esm/rules/spiracss-rel-comments.options.js.map +1 -1
  332. package/dist/esm/rules/spiracss-rel-comments.selectors.d.ts.map +1 -1
  333. package/dist/esm/rules/spiracss-rel-comments.selectors.js +4 -5
  334. package/dist/esm/rules/spiracss-rel-comments.selectors.js.map +1 -1
  335. package/dist/esm/rules/spiracss-rel-comments.types.d.ts +29 -15
  336. package/dist/esm/rules/spiracss-rel-comments.types.d.ts.map +1 -1
  337. package/dist/esm/types.d.ts +2 -0
  338. package/dist/esm/types.d.ts.map +1 -1
  339. package/dist/esm/utils/cache.d.ts +3 -0
  340. package/dist/esm/utils/cache.d.ts.map +1 -1
  341. package/dist/esm/utils/cache.js +27 -5
  342. package/dist/esm/utils/cache.js.map +1 -1
  343. package/dist/esm/utils/constants.d.ts +1 -0
  344. package/dist/esm/utils/constants.d.ts.map +1 -1
  345. package/dist/esm/utils/constants.js +13 -0
  346. package/dist/esm/utils/constants.js.map +1 -1
  347. package/dist/esm/utils/formatting.d.ts +5 -1
  348. package/dist/esm/utils/formatting.d.ts.map +1 -1
  349. package/dist/esm/utils/formatting.js +14 -6
  350. package/dist/esm/utils/formatting.js.map +1 -1
  351. package/dist/esm/utils/messages.d.ts +25 -0
  352. package/dist/esm/utils/messages.d.ts.map +1 -0
  353. package/dist/esm/utils/messages.js +160 -0
  354. package/dist/esm/utils/messages.js.map +1 -0
  355. package/dist/esm/utils/naming.d.ts +1 -2
  356. package/dist/esm/utils/naming.d.ts.map +1 -1
  357. package/dist/esm/utils/naming.js +2 -10
  358. package/dist/esm/utils/naming.js.map +1 -1
  359. package/dist/esm/utils/normalize.d.ts +1 -0
  360. package/dist/esm/utils/normalize.d.ts.map +1 -1
  361. package/dist/esm/utils/normalize.js +51 -7
  362. package/dist/esm/utils/normalize.js.map +1 -1
  363. package/dist/esm/utils/option-schema.d.ts +11 -8
  364. package/dist/esm/utils/option-schema.d.ts.map +1 -1
  365. package/dist/esm/utils/option-schema.js +12 -9
  366. package/dist/esm/utils/option-schema.js.map +1 -1
  367. package/dist/esm/utils/options.d.ts +34 -0
  368. package/dist/esm/utils/options.d.ts.map +1 -0
  369. package/dist/esm/utils/options.js +36 -0
  370. package/dist/esm/utils/options.js.map +1 -0
  371. package/dist/esm/utils/rule-docs.d.ts +2 -0
  372. package/dist/esm/utils/rule-docs.d.ts.map +1 -0
  373. package/dist/esm/utils/rule-docs.js +18 -0
  374. package/dist/esm/utils/rule-docs.js.map +1 -0
  375. package/dist/esm/utils/section.d.ts.map +1 -1
  376. package/dist/esm/utils/section.js +31 -38
  377. package/dist/esm/utils/section.js.map +1 -1
  378. package/dist/esm/utils/selector-policy.d.ts +16 -0
  379. package/dist/esm/utils/selector-policy.d.ts.map +1 -0
  380. package/dist/esm/utils/selector-policy.js +51 -0
  381. package/dist/esm/utils/selector-policy.js.map +1 -0
  382. package/dist/esm/utils/selector.d.ts +4 -1
  383. package/dist/esm/utils/selector.d.ts.map +1 -1
  384. package/dist/esm/utils/selector.js +59 -36
  385. package/dist/esm/utils/selector.js.map +1 -1
  386. package/dist/esm/utils/stylelint.d.ts +0 -1
  387. package/dist/esm/utils/stylelint.d.ts.map +1 -1
  388. package/dist/esm/utils/stylelint.js +17 -2
  389. package/dist/esm/utils/stylelint.js.map +1 -1
  390. package/package.json +6 -5
@@ -1,40 +1,53 @@
1
- import { DEFAULT_CACHE_SIZES, normalizeCacheSizes } from '../utils/cache.js';
2
- import { normalizeBoolean, normalizeCommentPattern, normalizeKeyList, normalizeSelectorPolicyBase, normalizeString, normalizeStringArray } from '../utils/normalize.js';
1
+ import { DEFAULT_CACHE_SIZES } from '../utils/cache.js';
2
+ import { normalizeBoolean, normalizeKeyList, safeNormalizeSelectorPolicyBase, normalizeString } from '../utils/normalize.js';
3
+ import { normalizeCommonOptions, pickCommonDefaults } from '../utils/options.js';
4
+ import { createDefaultSelectorPolicyBase } from '../utils/selector-policy.js';
3
5
  const defaultValueNaming = {
4
6
  case: 'kebab',
5
7
  maxWords: 2
6
8
  };
9
+ const baseSelectorPolicy = createDefaultSelectorPolicyBase();
7
10
  const defaultSelectorPolicy = {
8
11
  valueNaming: defaultValueNaming,
9
12
  variant: {
10
- mode: 'data',
11
- dataKeys: ['data-variant'],
13
+ ...baseSelectorPolicy.variant,
12
14
  valueNaming: defaultValueNaming
13
15
  },
14
16
  state: {
15
- mode: 'data',
16
- dataKey: 'data-state',
17
- ariaKeys: ['aria-expanded', 'aria-selected', 'aria-disabled'],
17
+ ...baseSelectorPolicy.state,
18
18
  valueNaming: defaultValueNaming
19
19
  }
20
20
  };
21
21
  const ERROR_PREFIX = '[spiracss]';
22
22
  const defaultOptions = {
23
- // SpiraCSS recommends up to ~4 levels, so default to 4.
24
- allowElementChainDepth: 4,
25
- allowExternalClasses: [],
26
- allowExternalPrefixes: [],
27
- enforceChildCombinator: true,
28
- enforceSingleRootBlock: true,
29
- enforceRootFileName: true,
30
- rootFileCase: 'preserve',
31
- childScssDir: 'scss',
32
- componentsDirs: ['components'],
23
+ element: {
24
+ // SpiraCSS recommends up to ~4 levels, so default to 4.
25
+ depth: 4
26
+ },
27
+ external: {
28
+ classes: [],
29
+ prefixes: []
30
+ },
31
+ child: {
32
+ combinator: true,
33
+ nesting: true
34
+ },
35
+ root: {
36
+ single: true,
37
+ file: true,
38
+ case: 'preserve'
39
+ },
40
+ paths: {
41
+ childDir: 'scss',
42
+ components: ['components']
43
+ },
33
44
  naming: undefined,
34
- sharedCommentPattern: /--shared/i,
35
- interactionCommentPattern: /--interaction/i,
45
+ comments: {
46
+ shared: /--shared/i,
47
+ interaction: /--interaction/i
48
+ },
36
49
  selectorPolicy: defaultSelectorPolicy,
37
- cacheSizes: DEFAULT_CACHE_SIZES
50
+ cache: DEFAULT_CACHE_SIZES
38
51
  };
39
52
  const isWordCase = (value) => value === 'kebab' || value === 'snake' || value === 'camel' || value === 'pascal';
40
53
  const normalizeFileNameCase = (value, fallback) => {
@@ -44,24 +57,30 @@ const normalizeFileNameCase = (value, fallback) => {
44
57
  return value;
45
58
  return fallback;
46
59
  };
47
- const normalizeValueNaming = (raw, fallback, fieldName) => {
60
+ const normalizeValueNaming = (raw, fallback, fieldName, reportInvalid) => {
48
61
  if (!raw || typeof raw !== 'object')
49
62
  return { ...fallback };
50
63
  const value = raw;
51
- if (value.case !== undefined && !isWordCase(value.case)) {
52
- throw new Error(`${ERROR_PREFIX} ${fieldName}.case must be "kebab" | "snake" | "camel" | "pascal".`);
64
+ const normalized = { ...fallback };
65
+ if (value.case !== undefined) {
66
+ if (!isWordCase(value.case)) {
67
+ reportInvalid?.(`${fieldName}.case`, value.case, `${ERROR_PREFIX} ${fieldName}.case must be "kebab" | "snake" | "camel" | "pascal".`);
68
+ }
69
+ else {
70
+ normalized.case = value.case;
71
+ }
53
72
  }
54
73
  if (value.maxWords !== undefined) {
55
74
  if (typeof value.maxWords !== 'number' ||
56
75
  !Number.isInteger(value.maxWords) ||
57
76
  value.maxWords < 1) {
58
- throw new Error(`${ERROR_PREFIX} ${fieldName}.maxWords must be a positive integer.`);
77
+ reportInvalid?.(`${fieldName}.maxWords`, value.maxWords, `${ERROR_PREFIX} ${fieldName}.maxWords must be a positive integer.`);
78
+ }
79
+ else {
80
+ normalized.maxWords = value.maxWords;
59
81
  }
60
82
  }
61
- return {
62
- case: value.case ?? fallback.case,
63
- maxWords: value.maxWords ?? fallback.maxWords
64
- };
83
+ return normalized;
65
84
  };
66
85
  const normalizeSelectorPolicy = (raw, reportInvalid) => {
67
86
  const defaults = {
@@ -75,13 +94,13 @@ const normalizeSelectorPolicy = (raw, reportInvalid) => {
75
94
  ariaKeys: defaultSelectorPolicy.state.ariaKeys
76
95
  }
77
96
  };
78
- const base = normalizeSelectorPolicyBase(raw, defaults, reportInvalid);
97
+ const base = safeNormalizeSelectorPolicyBase(raw, defaults, reportInvalid);
79
98
  const policy = (raw && typeof raw === 'object' ? raw : {});
80
99
  const variant = policy.variant || {};
81
100
  const state = policy.state || {};
82
- const baseValueNaming = normalizeValueNaming(policy.valueNaming, defaultSelectorPolicy.valueNaming, 'selectorPolicy.valueNaming');
83
- const variantValueNaming = normalizeValueNaming(variant.valueNaming, baseValueNaming, 'selectorPolicy.variant.valueNaming');
84
- const stateValueNaming = normalizeValueNaming(state.valueNaming, baseValueNaming, 'selectorPolicy.state.valueNaming');
101
+ const baseValueNaming = normalizeValueNaming(policy.valueNaming, defaultSelectorPolicy.valueNaming, 'selectorPolicy.valueNaming', reportInvalid);
102
+ const variantValueNaming = normalizeValueNaming(variant.valueNaming, baseValueNaming, 'selectorPolicy.variant.valueNaming', reportInvalid);
103
+ const stateValueNaming = normalizeValueNaming(state.valueNaming, baseValueNaming, 'selectorPolicy.state.valueNaming', reportInvalid);
85
104
  return {
86
105
  valueNaming: baseValueNaming,
87
106
  variant: {
@@ -101,34 +120,30 @@ export const normalizeOptions = (raw, reportInvalid) => {
101
120
  if (!raw || typeof raw !== 'object')
102
121
  return { ...defaultOptions };
103
122
  const opt = raw;
123
+ const selectorPolicy = opt.selectorPolicy;
104
124
  const safeNormalizeKeyList = (value, fallback, fieldName) => normalizeKeyList(value, fallback, fieldName, reportInvalid);
105
- const safeNormalizeSelectorPolicy = (value) => {
106
- try {
107
- return normalizeSelectorPolicy(value, reportInvalid);
108
- }
109
- catch (error) {
110
- const detail = error instanceof Error ? error.message : String(error);
111
- reportInvalid?.('selectorPolicy', value, detail);
112
- return { ...defaultOptions.selectorPolicy };
113
- }
114
- };
125
+ const common = normalizeCommonOptions(opt, pickCommonDefaults(defaultOptions), reportInvalid);
115
126
  return {
116
- allowElementChainDepth: typeof opt.allowElementChainDepth === 'number'
117
- ? opt.allowElementChainDepth
118
- : defaultOptions.allowElementChainDepth,
119
- allowExternalClasses: normalizeStringArray(opt.allowExternalClasses, defaultOptions.allowExternalClasses),
120
- allowExternalPrefixes: normalizeStringArray(opt.allowExternalPrefixes, defaultOptions.allowExternalPrefixes),
121
- enforceChildCombinator: normalizeBoolean(opt.enforceChildCombinator, defaultOptions.enforceChildCombinator),
122
- enforceSingleRootBlock: normalizeBoolean(opt.enforceSingleRootBlock, defaultOptions.enforceSingleRootBlock),
123
- enforceRootFileName: normalizeBoolean(opt.enforceRootFileName, defaultOptions.enforceRootFileName),
124
- rootFileCase: normalizeFileNameCase(opt.rootFileCase, defaultOptions.rootFileCase),
125
- childScssDir: normalizeString(opt.childScssDir, defaultOptions.childScssDir),
126
- componentsDirs: safeNormalizeKeyList(opt.componentsDirs, defaultOptions.componentsDirs, 'componentsDirs'),
127
- naming: opt.naming || defaultOptions.naming,
128
- sharedCommentPattern: normalizeCommentPattern(opt.sharedCommentPattern, defaultOptions.sharedCommentPattern, 'sharedCommentPattern', reportInvalid),
129
- interactionCommentPattern: normalizeCommentPattern(opt.interactionCommentPattern, defaultOptions.interactionCommentPattern, 'interactionCommentPattern', reportInvalid),
130
- selectorPolicy: safeNormalizeSelectorPolicy(opt.selectorPolicy),
131
- cacheSizes: normalizeCacheSizes(opt.cacheSizes, reportInvalid)
127
+ element: {
128
+ depth: typeof opt.elementDepth === 'number'
129
+ ? opt.elementDepth
130
+ : defaultOptions.element.depth
131
+ },
132
+ child: {
133
+ combinator: normalizeBoolean(opt.childCombinator, defaultOptions.child.combinator),
134
+ nesting: normalizeBoolean(opt.childNesting, defaultOptions.child.nesting)
135
+ },
136
+ root: {
137
+ single: normalizeBoolean(opt.rootSingle, defaultOptions.root.single),
138
+ file: normalizeBoolean(opt.rootFile, defaultOptions.root.file),
139
+ case: normalizeFileNameCase(opt.rootCase, defaultOptions.root.case)
140
+ },
141
+ paths: {
142
+ childDir: normalizeString(opt.childDir, defaultOptions.paths.childDir),
143
+ components: safeNormalizeKeyList(opt.componentsDirs, defaultOptions.paths.components, 'componentsDirs')
144
+ },
145
+ selectorPolicy: normalizeSelectorPolicy(selectorPolicy, reportInvalid),
146
+ ...common
132
147
  };
133
148
  };
134
149
  //# sourceMappingURL=spiracss-class-structure.options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spiracss-class-structure.options.js","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.options.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spiracss-class-structure.options.js","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.options.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import type { NormalizedCacheSizes } from '../types';
2
2
  import type { InvalidOptionReporter } from '../utils/normalize';
3
- import type { Kind, NormalizedSelectorPolicy, Options, Patterns, SelectorPolicyData } from './spiracss-class-structure.types';
4
- type NamingHintOptions = Pick<Options, 'naming'>;
3
+ import type { ClassifyOptions, Kind, NormalizedSelectorPolicy, Patterns, SelectorPolicyData } from './spiracss-class-structure.types';
4
+ type NamingHintOptions = Pick<ClassifyOptions, 'naming'>;
5
5
  export declare const formatNamingHint: (options: NamingHintOptions) => string;
6
- export declare const buildPatterns: (options: Options, cacheSizes?: NormalizedCacheSizes, reportInvalid?: InvalidOptionReporter) => Patterns;
6
+ export declare const buildPatterns: (options: ClassifyOptions, cacheSizes: NormalizedCacheSizes, reportInvalid?: InvalidOptionReporter) => Patterns;
7
7
  export declare const buildSelectorPolicyData: (policy: NormalizedSelectorPolicy) => SelectorPolicyData;
8
8
  /**
9
9
  * Classifies a class name using SpiraCSS patterns and external class allowances.
@@ -12,6 +12,6 @@ export declare const buildSelectorPolicyData: (policy: NormalizedSelectorPolicy)
12
12
  * @param patterns - Compiled naming patterns for Block/Element/Modifier.
13
13
  * @returns Classification kind for the class name.
14
14
  */
15
- export declare const classify: (name: string, options: Options, patterns: Patterns) => Kind;
15
+ export declare const classify: (name: string, options: ClassifyOptions, patterns: Patterns) => Kind;
16
16
  export {};
17
17
  //# sourceMappingURL=spiracss-class-structure.patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spiracss-class-structure.patterns.d.ts","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAY,MAAM,UAAU,CAAA;AAO9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,KAAK,EACV,IAAI,EACJ,wBAAwB,EACxB,OAAO,EACP,QAAQ,EACR,kBAAkB,EAEnB,MAAM,kCAAkC,CAAA;AAEzC,KAAK,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAgDhD,eAAO,MAAM,gBAAgB,GAAI,SAAS,iBAAiB,KAAG,MAiC7D,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,SAAS,OAAO,EAChB,aAAa,oBAAoB,EACjC,gBAAgB,qBAAqB,KACpC,QAwGF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,QAAQ,wBAAwB,KAC/B,kBAMD,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,SAAS,OAAO,EAAE,UAAU,QAAQ,KAAG,IAS7E,CAAA"}
1
+ {"version":3,"file":"spiracss-class-structure.patterns.d.ts","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.patterns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAY,MAAM,UAAU,CAAA;AAQ9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,KAAK,EACV,eAAe,EACf,IAAI,EACJ,wBAAwB,EACxB,QAAQ,EACR,kBAAkB,EAEnB,MAAM,kCAAkC,CAAA;AAEzC,KAAK,iBAAiB,GAAG,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;AA2CxD,eAAO,MAAM,gBAAgB,GAAI,SAAS,iBAAiB,KAAG,MAkC7D,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,SAAS,eAAe,EACxB,YAAY,oBAAoB,EAChC,gBAAgB,qBAAqB,KACpC,QAwGF,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,QAAQ,wBAAwB,KAC/B,kBAMD,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GACnB,MAAM,MAAM,EACZ,SAAS,eAAe,EACxB,UAAU,QAAQ,KACjB,IASF,CAAA"}
@@ -1,15 +1,11 @@
1
- import { createLruCache, DEFAULT_CACHE_SIZE } from '../utils/cache.js';
1
+ import { createSharedCacheAccessor } from '../utils/cache.js';
2
2
  import { buildBlockPattern, normalizeBlockMaxWords, normalizeCustomPattern } from '../utils/naming.js';
3
+ import { formatCode, formatPattern } from '../utils/messages.js';
3
4
  const serializePattern = (pattern) => pattern ? `${pattern.source}/${pattern.flags}` : '';
4
- const patternsCaches = new Map();
5
- const getPatternsCache = (maxSize) => {
6
- const cached = patternsCaches.get(maxSize);
7
- if (cached)
8
- return cached;
9
- const created = createLruCache(maxSize);
10
- patternsCaches.set(maxSize, created);
11
- return created;
12
- };
5
+ const normalizeWordCase = (value, fallback) => value === 'kebab' || value === 'snake' || value === 'camel' || value === 'pascal'
6
+ ? value
7
+ : fallback;
8
+ const getPatternsCache = createSharedCacheAccessor();
13
9
  const buildValuePattern = (naming) => {
14
10
  const maxWords = naming.maxWords;
15
11
  switch (naming.case) {
@@ -42,36 +38,37 @@ const buildValuePattern = (naming) => {
42
38
  };
43
39
  export const formatNamingHint = (options) => {
44
40
  const naming = options?.naming || {};
45
- const blockCase = naming.blockCase || 'kebab';
46
- const elementCase = naming.elementCase || 'kebab';
47
- const modifierCase = naming.modifierCase || 'kebab';
41
+ const blockCase = normalizeWordCase(naming.blockCase, 'kebab');
42
+ const elementCase = normalizeWordCase(naming.elementCase, 'kebab');
43
+ const modifierCase = normalizeWordCase(naming.modifierCase, 'kebab');
48
44
  const modifierPrefix = naming.modifierPrefix ?? '-';
45
+ const prefixLabel = modifierPrefix === '' ? '(none)' : modifierPrefix;
49
46
  const blockMaxWords = normalizeBlockMaxWords(naming.blockMaxWords);
50
47
  const parts = [
51
- `blockCase=${blockCase}`,
52
- `blockMaxWords=${blockMaxWords}`,
53
- `elementCase=${elementCase}`,
54
- `modifierCase=${modifierCase}`,
55
- `modifierPrefix="${modifierPrefix}"`
48
+ `blockCase=${formatCode(blockCase)}`,
49
+ `blockMaxWords=${formatCode(String(blockMaxWords))}`,
50
+ `elementCase=${formatCode(elementCase)}`,
51
+ `modifierCase=${formatCode(modifierCase)}`,
52
+ `modifierPrefix=${formatCode(prefixLabel)}`
56
53
  ];
57
54
  const customParts = [];
58
55
  const customBlock = normalizeCustomPattern(naming.customPatterns?.block, 'naming.customPatterns.block');
59
56
  const customElement = normalizeCustomPattern(naming.customPatterns?.element, 'naming.customPatterns.element');
60
57
  const customModifier = normalizeCustomPattern(naming.customPatterns?.modifier, 'naming.customPatterns.modifier');
61
58
  if (customBlock)
62
- customParts.push(`block=${customBlock}`);
59
+ customParts.push(`block=${formatPattern(customBlock)}`);
63
60
  if (customElement)
64
- customParts.push(`element=${customElement}`);
61
+ customParts.push(`element=${formatPattern(customElement)}`);
65
62
  if (customModifier)
66
- customParts.push(`modifier=${customModifier}`);
63
+ customParts.push(`modifier=${formatPattern(customModifier)}`);
67
64
  const customHint = customParts.length > 0 ? ` Custom patterns: ${customParts.join(', ')}.` : '';
68
65
  return `Naming: ${parts.join(', ')}.${customHint}`;
69
66
  };
70
67
  export const buildPatterns = (options, cacheSizes, reportInvalid) => {
71
68
  const naming = options.naming || {};
72
- const blockCase = naming.blockCase || 'kebab';
73
- const elementCase = naming.elementCase || 'kebab';
74
- const modifierCase = naming.modifierCase || 'kebab';
69
+ const blockCase = normalizeWordCase(naming.blockCase, 'kebab');
70
+ const elementCase = normalizeWordCase(naming.elementCase, 'kebab');
71
+ const modifierCase = normalizeWordCase(naming.modifierCase, 'kebab');
75
72
  const modifierPrefix = naming.modifierPrefix ?? '-';
76
73
  const blockMaxWords = normalizeBlockMaxWords(naming.blockMaxWords);
77
74
  // Support partial customPatterns overrides (only specified ones replace defaults).
@@ -88,11 +85,11 @@ export const buildPatterns = (options, cacheSizes, reportInvalid) => {
88
85
  serializePattern(customElement),
89
86
  serializePattern(customModifier)
90
87
  ].join('|');
91
- const patternsCache = getPatternsCache(cacheSizes?.patterns ?? DEFAULT_CACHE_SIZE);
88
+ const patternsCache = getPatternsCache(cacheSizes.patterns);
92
89
  const cached = patternsCache.get(cacheKey);
93
90
  if (cached)
94
91
  return cached;
95
- const blockRe = buildBlockPattern(naming, cacheSizes?.naming ?? DEFAULT_CACHE_SIZE, reportInvalid, {
92
+ const blockRe = buildBlockPattern(naming, cacheSizes.naming, reportInvalid, {
96
93
  customBlock,
97
94
  skipCustomPatternValidation: true
98
95
  });
@@ -165,8 +162,8 @@ export const buildSelectorPolicyData = (policy) => ({
165
162
  * @returns Classification kind for the class name.
166
163
  */
167
164
  export const classify = (name, options, patterns) => {
168
- const { allowExternalClasses, allowExternalPrefixes } = options;
169
- if (allowExternalClasses.includes(name) || allowExternalPrefixes.some((p) => name.startsWith(p))) {
165
+ const external = options.external;
166
+ if (external.classes.includes(name) || external.prefixes.some((p) => name.startsWith(p))) {
170
167
  return 'external';
171
168
  }
172
169
  if (patterns.modifierRe.test(name))
@@ -1 +1 @@
1
- {"version":3,"file":"spiracss-class-structure.patterns.js","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.patterns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spiracss-class-structure.patterns.js","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.patterns.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- import type { Node as PostcssNode, Rule } from 'postcss';
2
1
  import type { Selector } from 'postcss-selector-parser';
3
- import type { Kind, Options, Patterns, SelectorPolicyData } from './spiracss-class-structure.types';
4
- export declare const collectRootBlockNames: (selectors: Selector[], options: Options, patterns: Patterns) => string[];
2
+ import type { ClassifyOptions, Kind, Options, Patterns, SelectorPolicyData } from './spiracss-class-structure.types';
3
+ export declare const collectRootBlockNames: (selectors: Selector[], options: ClassifyOptions, patterns: Patterns) => string[];
5
4
  export declare const hasValidSpiraClass: (selectors: Selector[], options: Options, patterns: Patterns) => boolean;
6
5
  export declare const analyzeRootSelector: (sel: Selector, rootBlockName: string, options: Options, patterns: Patterns) => {
7
6
  hasSpiraClass: boolean;
@@ -20,6 +19,7 @@ type ProcessContext = {
20
19
  namingHint: string;
21
20
  isShared: boolean;
22
21
  isInteraction: boolean;
22
+ hasBlockAncestor: boolean;
23
23
  };
24
24
  /**
25
25
  * Analyze a selector in context and emit structure/naming violations.
@@ -29,7 +29,6 @@ type ProcessContext = {
29
29
  */
30
30
  export declare const processSelector: (sel: Selector, ctx: ProcessContext) => Kind | null;
31
31
  export declare const mergeRuleKinds: (kinds: Kind[]) => Kind | null;
32
- export declare const findNearestParentRule: (node: PostcssNode) => Rule | null;
33
32
  export declare const hasSegmentSequence: (segments: string[], sequence: string[]) => boolean;
34
33
  export {};
35
34
  //# sourceMappingURL=spiracss-class-structure.selectors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spiracss-class-structure.selectors.d.ts","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,WAAW,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,KAAK,EAAmC,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAUxF,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAEnG,eAAO,MAAM,qBAAqB,GAChC,WAAW,QAAQ,EAAE,EACrB,SAAS,OAAO,EAChB,UAAU,QAAQ,KACjB,MAAM,EAcR,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,WAAW,QAAQ,EAAE,EACrB,SAAS,OAAO,EAChB,UAAU,QAAQ,KACjB,OAUF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,KAAK,QAAQ,EACb,eAAe,MAAM,EACrB,SAAS,OAAO,EAChB,UAAU,QAAQ,KACjB;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAgDzE,CAAA;AAED,KAAK,cAAc,GAAG;IACpB,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,kBAAkB,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AA2PD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,QAAQ,EAAE,KAAK,cAAc,KAAG,IAAI,GAAG,IA+E3E,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,IAAI,EAAE,KAAG,IAAI,GAAG,IAOrD,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,MAAM,WAAW,KAAG,IAAI,GAAG,IAOhE,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,EAAE,UAAU,MAAM,EAAE,KAAG,OAa3E,CAAA"}
1
+ {"version":3,"file":"spiracss-class-structure.selectors.d.ts","sourceRoot":"","sources":["../../../src/rules/spiracss-class-structure.selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmC,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAYxF,OAAO,KAAK,EACV,eAAe,EACf,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,kBAAkB,EACnB,MAAM,kCAAkC,CAAA;AAIzC,eAAO,MAAM,qBAAqB,GAChC,WAAW,QAAQ,EAAE,EACrB,SAAS,eAAe,EACxB,UAAU,QAAQ,KACjB,MAAM,EAcR,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,WAAW,QAAQ,EAAE,EACrB,SAAS,OAAO,EAChB,UAAU,QAAQ,KACjB,OAUF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,KAAK,QAAQ,EACb,eAAe,MAAM,EACrB,SAAS,OAAO,EAChB,UAAU,QAAQ,KACjB;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAkBzE,CAAA;AAED,KAAK,cAAc,GAAG;IACpB,UAAU,CAAC,EAAE,IAAI,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,kBAAkB,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;CAC1B,CAAA;AAqSD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,QAAQ,EAAE,KAAK,cAAc,KAAG,IAAI,GAAG,IAuF3E,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,IAAI,EAAE,KAAG,IAAI,GAAG,IAOrD,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,EAAE,UAAU,MAAM,EAAE,KAAG,OAa3E,CAAA"}
@@ -1,6 +1,8 @@
1
- import { collectCompoundNodes, collectNestingSiblingClasses, collectSelectorSummary } from '../utils/selector.js';
1
+ import { collectCompoundNodes, collectNestingSiblingClasses, collectSelectorSummary, isInsideNonSameElementPseudo } from '../utils/selector.js';
2
+ import { getLowercasePolicyKeys } from '../utils/selector-policy.js';
2
3
  import { messages } from './spiracss-class-structure.messages.js';
3
4
  import { classify } from './spiracss-class-structure.patterns.js';
5
+ const isClassNode = (node) => node.type === 'class';
4
6
  export const collectRootBlockNames = (selectors, options, patterns) => {
5
7
  const names = new Set();
6
8
  const rootPseudos = new Set([':is', ':where']);
@@ -35,44 +37,14 @@ export const analyzeRootSelector = (sel, rootBlockName, options, patterns) => {
35
37
  let hasRootBlock = false;
36
38
  let hasOtherBlock = false;
37
39
  const sameElementPseudos = new Set([':is', ':where']);
38
- const isContainer = (node) => Boolean(node && 'nodes' in node && Array.isArray(node.nodes));
39
- const hasCombinator = (container) => {
40
- const nodes = container?.nodes;
41
- if (!nodes || nodes.length === 0)
42
- return false;
43
- return nodes.some((node) => {
44
- if (node.type === 'combinator')
45
- return true;
46
- if (isContainer(node))
47
- return hasCombinator(node);
48
- return false;
49
- });
50
- };
51
- const isInsideNonSameElementPseudo = (node) => {
52
- let current = node.parent;
53
- let selectorInPseudo = null;
54
- while (current) {
55
- if (current.type === 'selector')
56
- selectorInPseudo = current;
57
- if (current.type === 'pseudo') {
58
- const pseudo = typeof current.value === 'string' ? current.value.toLowerCase() : '';
59
- if (!sameElementPseudos.has(pseudo))
60
- return true;
61
- if (selectorInPseudo && hasCombinator(selectorInPseudo))
62
- return true;
63
- }
64
- current = current.parent;
65
- }
66
- return false;
67
- };
68
40
  sel.walk((node) => {
69
- if (node.type !== 'class')
41
+ if (!isClassNode(node))
70
42
  return;
71
43
  const name = node.value;
72
44
  const kind = classify(name, options, patterns);
73
45
  if (kind !== 'external')
74
46
  hasSpiraClass = true;
75
- if (isInsideNonSameElementPseudo(node))
47
+ if (isInsideNonSameElementPseudo(node, sameElementPseudos))
76
48
  return;
77
49
  if (name === rootBlockName)
78
50
  hasRootBlock = true;
@@ -83,6 +55,8 @@ export const analyzeRootSelector = (sel, rootBlockName, options, patterns) => {
83
55
  };
84
56
  const MAX_BLOCK_NESTING_DEPTH = 1;
85
57
  const getModifierExample = (options) => {
58
+ if (options.naming?.customPatterns?.modifier)
59
+ return '';
86
60
  const naming = options.naming ?? {};
87
61
  const prefix = naming.modifierPrefix ?? '-';
88
62
  const modifierCase = naming.modifierCase ?? 'kebab';
@@ -91,9 +65,12 @@ const getModifierExample = (options) => {
91
65
  };
92
66
  const reportAttributeViolations = (compounds, ctx) => {
93
67
  const { parentKind, report, options, patterns, policyData } = ctx;
94
- const policy = options.selectorPolicy;
68
+ const selectorPolicy = options.selectorPolicy;
69
+ const variantValueNaming = selectorPolicy.variant.valueNaming;
70
+ const stateValueNaming = selectorPolicy.state.valueNaming;
95
71
  const { reservedVariantKeys, reservedStateKey, reservedAriaKeys, variantValuePattern, stateValuePattern } = policyData;
96
72
  const modifierExample = getModifierExample(options);
73
+ const customModifierPattern = options.naming?.customPatterns?.modifier;
97
74
  compounds.forEach((compound) => {
98
75
  if (compound.attributes.length === 0)
99
76
  return;
@@ -109,27 +86,27 @@ const reportAttributeViolations = (compounds, ctx) => {
109
86
  return;
110
87
  if (name.startsWith('data-')) {
111
88
  if (reservedVariantKeys.has(name)) {
112
- if (policy.variant.mode === 'class') {
113
- report(messages.invalidVariantAttribute(name, modifierExample));
89
+ if (selectorPolicy.variant.mode === 'class') {
90
+ report(messages.invalidVariantAttribute(name, modifierExample, customModifierPattern));
114
91
  return;
115
92
  }
116
93
  if (attrValue && !variantValuePattern.test(attrValue)) {
117
- report(messages.invalidDataValue(name, attrValue));
94
+ report(messages.invalidDataValue(name, attrValue, variantValueNaming.case, variantValueNaming.maxWords));
118
95
  }
119
96
  }
120
97
  else if (name === reservedStateKey) {
121
- if (policy.state.mode !== 'data') {
122
- report(messages.invalidStateAttribute(name, modifierExample));
98
+ if (selectorPolicy.state.mode !== 'data') {
99
+ report(messages.invalidStateAttribute(name, modifierExample, customModifierPattern));
123
100
  return;
124
101
  }
125
102
  if (attrValue && !stateValuePattern.test(attrValue)) {
126
- report(messages.invalidDataValue(name, attrValue));
103
+ report(messages.invalidDataValue(name, attrValue, stateValueNaming.case, stateValueNaming.maxWords));
127
104
  }
128
105
  }
129
106
  }
130
107
  else if (name.startsWith('aria-')) {
131
- if (reservedAriaKeys.has(name) && policy.state.mode !== 'data') {
132
- report(messages.invalidStateAttribute(name, modifierExample));
108
+ if (reservedAriaKeys.has(name) && selectorPolicy.state.mode !== 'data') {
109
+ report(messages.invalidStateAttribute(name, modifierExample, customModifierPattern));
133
110
  }
134
111
  }
135
112
  });
@@ -191,8 +168,8 @@ const reportElementHierarchyViolations = (ctx, kind, baseKind, baseValue, depth)
191
168
  return true;
192
169
  }
193
170
  if (baseKind === 'element') {
194
- if (depth > options.allowElementChainDepth) {
195
- report(messages.elementChainTooDeep(parentLabel, baseValue, depth, options.allowElementChainDepth));
171
+ if (depth > options.element.depth) {
172
+ report(messages.elementChainTooDeep(parentLabel, baseValue, depth, options.element.depth));
196
173
  }
197
174
  return true;
198
175
  }
@@ -211,12 +188,12 @@ const reportBlockCombinatorViolations = (ctx, kind, baseValue, hasNesting, first
211
188
  const { parentKind, parentSelector, options, report, isShared, isInteraction } = ctx;
212
189
  if (parentKind !== 'block' || kind === 'modifier')
213
190
  return;
214
- if (!options.enforceChildCombinator || isShared || isInteraction)
191
+ if (!options.child.combinator || isShared || isInteraction)
215
192
  return;
216
193
  const missingChild = !hasNesting && !firstCombinator;
217
194
  const wrongCombinator = firstCombinator && firstCombinator !== '>';
218
195
  if (missingChild || wrongCombinator) {
219
- report(messages.needChild(baseValue));
196
+ report(messages.needChild(baseValue, options.comments.shared, options.comments.interaction));
220
197
  return;
221
198
  }
222
199
  if (combinatorCount > 1 && parentSelector) {
@@ -267,16 +244,23 @@ export const processSelector = (sel, ctx) => {
267
244
  reportInvalidClassNames(classes, invalidNestingClasses, options, patterns, namingHint, report);
268
245
  const modifierClasses = classes.filter((c) => patterns.modifierRe.test(c.value));
269
246
  const modifierClass = modifierClasses[0];
270
- const modifiersAllowed = !(options.selectorPolicy.variant.mode === 'data' && options.selectorPolicy.state.mode === 'data');
247
+ const modifiersAllowed = !(options.selectorPolicy.variant.mode === 'data' &&
248
+ options.selectorPolicy.state.mode === 'data');
271
249
  if (!modifiersAllowed && modifierClasses.length > 0) {
272
- modifierClasses.forEach(() => {
273
- report(messages.disallowedModifier());
274
- });
250
+ // Display lowercase keys in messages to match actual selector matching behavior.
251
+ const { variantKeys, stateKeys } = getLowercasePolicyKeys(options.selectorPolicy);
252
+ report(messages.disallowedModifier(variantKeys, stateKeys));
275
253
  }
276
254
  // Ignore selectors that are purely external, but still catch SpiraCSS classes
277
255
  // even if the last segment is external.
278
256
  const base = resolveBaseClass(classes, modifierClass, options, patterns);
279
257
  const baseKind = classify(base.value, options, patterns);
258
+ if (options.child.nesting && combinatorCount > 0 && !ctx.hasBlockAncestor) {
259
+ const rootBlocks = collectRootBlockNames([sel], options, patterns);
260
+ if (rootBlocks.length > 0) {
261
+ report(messages.needChildNesting(sel.toString().trim()));
262
+ }
263
+ }
280
264
  // Kind resolution:
281
265
  // 1. If a Modifier exists -> 'modifier'
282
266
  // 2. If hasNesting:
@@ -313,15 +297,6 @@ export const mergeRuleKinds = (kinds) => {
313
297
  return 'invalid';
314
298
  return null;
315
299
  };
316
- export const findNearestParentRule = (node) => {
317
- let current = node.parent;
318
- while (current) {
319
- if (current.type === 'rule')
320
- return current;
321
- current = current.parent;
322
- }
323
- return null;
324
- };
325
300
  export const hasSegmentSequence = (segments, sequence) => {
326
301
  if (sequence.length === 0 || segments.length < sequence.length)
327
302
  return false;